当前位置:   article > 正文

yolov5-deepsort代码精读(三)_from models.experimental import attempt_load

from models.experimental import attempt_load

利用pycharm阅读代码,进行Debug

objdetector.py 注释

  1. import torch
  2. import numpy as np
  3. from models.experimental import attempt_load
  4. from utils.general import non_max_suppression, scale_coords
  5. from utils.datasets import letterbox
  6. from utils.torch_utils import select_device
  7. import objtracker
  8. # 要检测的类别,这里只检测人,车(小车、巴士、卡车)
  9. OBJ_LIST = ['person', 'car', 'bus', 'truck']
  10. # yolov5模型
  11. DETECTOR_PATH = 'weights/yolov5m.pt'
  12. class baseDet(object):
  13. def __init__(self):
  14. self.img_size = 640
  15. self.threshold = 0.3
  16. self.stride = 1
  17. def build_config(self):
  18. # 帧数统计变量初始化
  19. self.frameCounter = 0
  20. def feedCap(self, im, func_status):
  21. # 初始化dict,用于返回结果, 在这里初始化了键list_of_ids, 但后面没用到
  22. retDict = {
  23. 'frame': None,
  24. 'list_of_ids': None,
  25. 'obj_bboxes': []
  26. }
  27. # 帧数统计
  28. self.frameCounter += 1
  29. # feed to 检测器+deepsort, 注意第一个参数self《=》det. 返回带绘制检测+deepsort结果的im,和检测+deepsort结果信息:[(x1, y1, x2, y2, '', track_id),...,(...)]
  30. im, obj_bboxes = objtracker.update(self, im)
  31. retDict['frame'] = im
  32. retDict['obj_bboxes'] = obj_bboxes
  33. return retDict
  34. def init_model(self):
  35. raise EOFError("Undefined model type.")
  36. def preprocess(self):
  37. raise EOFError("Undefined model type.")
  38. def detect(self):
  39. raise EOFError("Undefined model type.")
  40. # 定义类Detector,继承自baseDet
  41. class Detector(baseDet):
  42. # 构造函数
  43. def __init__(self):
  44. # 调用父类构造函数初始化继承自父类的属性,具体是父类构造函数中定义的属性
  45. super(Detector, self).__init__()
  46. # 调用init_model方法
  47. self.init_model()
  48. # 调用父类方法
  49. self.build_config()
  50. def init_model(self):
  51. # 权重文件 yolov5s.pt
  52. self.weights = DETECTOR_PATH
  53. # 选择使用gpu or cpu,我这里会使用cpu
  54. self.device = '0' if torch.cuda.is_available() else 'cpu'
  55. # yolov5中提供的select_device方法直接复用
  56. self.device = select_device(self.device)
  57. # 加载权重文件
  58. model = attempt_load(self.weights, map_location=self.device)
  59. # 将model transfer to device, 推理阶段使用model.eval() 训练阶段使用model.train()
  60. model.to(self.device).eval()
  61. # GPU支持半精度
  62. #model.half()
  63. # 使用cpu时不支持.half,改为.float(), 这里比较奇怪,我明明有gpu但选择的cpu,后面再细究
  64. model.float()
  65. self.m = model
  66. # 模型能够检测的所有类别标签。yolov5中提供的方法直接复用
  67. self.names = model.module.names if hasattr(
  68. model, 'module') else model.names
  69. def preprocess(self, img):
  70. # 对原图进行拷贝
  71. img0 = img.copy()
  72. # yolov5图像预处理之lettexbox, [1080,1920,3]->[384,640,3]
  73. img = letterbox(img, new_shape=self.img_size)[0]
  74. # [384,640,3] -> [3,384,640]
  75. img = img[:, :, ::-1].transpose(2, 0, 1)
  76. # 在内存上使用连续的内存存储图像
  77. img = np.ascontiguousarray(img)
  78. # 由numpy array创建torch Tensor; transfer to device
  79. img = torch.from_numpy(img).to(self.device)
  80. #img = img.half() # 半精度
  81. img = img.float()
  82. img /= 255.0 # 图像归一化
  83. # [3,384,640] -> [1,3,384,640]
  84. if img.ndimension() == 3:
  85. img = img.unsqueeze(0)
  86. # 返回原图像img0和预处理之后的图像img
  87. return img0, img
  88. def detect(self, im):
  89. # 图像预处理,返回原图im0,预处理之后的图像img
  90. im0, img = self.preprocess(im)
  91. # feed to yolov5 进行检测,调用yolo.py Class Model中的forward方法。返回检测结果
  92. pred = self.m(img, augment=False)[0]
  93. pred = pred.float()
  94. # NMS
  95. pred = non_max_suppression(pred, self.threshold, 0.4)
  96. # 初始化返回结果
  97. pred_boxes = []
  98. # yolov5检测结果解析,yolov5源码方法复用
  99. for det in pred:
  100. if det is not None and len(det):
  101. # 调整检测框坐标。检测框是基于预处理后640x640的图像的,调整为基于原图的检测框
  102. det[:, :4] = scale_coords(
  103. img.shape[2:], det[:, :4], im0.shape).round()
  104. for *x, conf, cls_id in det:
  105. lbl = self.names[int(cls_id)]
  106. # 筛选出要检测的类别,过滤掉其它类别
  107. if not lbl in OBJ_LIST:
  108. continue
  109. x1, y1 = int(x[0]), int(x[1])
  110. x2, y2 = int(x[2]), int(x[3])
  111. # 检测框坐标(左上右下),类别标签,置信度
  112. pred_boxes.append(
  113. (x1, y1, x2, y2, lbl, conf))
  114. # 返回原图,检测结果 pred_boxes:[(...),(,,,), ... ,(...)]
  115. return im, pred_boxes

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/167684
推荐阅读
相关标签
  

闽ICP备14008679号