0. 背景
在高速公路监控视频场景下,图像分辨率大都是1920 * 1080或者2560 * 1440,远处的物体(车辆和行人等)都比较小。考虑需要对图像进行拆分,然后把拆分后的数据统一送入模型中,推理的结果然后再做nms,恢复到原始图片数据中。
这个过程中牵涉到两个方面的内容,一个是多batch推理,一个是nms。
1. 多batch
例如使用1920*1080分辨率的图片数据,把该分辨率的数据分为4份。
如果只是平均分车4份,当一个物体(比如车辆)正好处于图片中心时,则可能被拆分到4个区域,这样当后续这4个区域分别得到检测框后,无法对同一个拆分的物体进行完美覆盖。所以在拆分图片是,可用适当的大一些。
1.1 平均拆分
1.2 建议拆分
例如:1920*1080分辨率的图片,进行拆分
h1 = int(1080 * 7 / 16)
h2 = int(1080 * 9 / 16)
w1 = int(1920 * 7 / 16)
w2 = int(1920 * 9 / 16)
img0 = frame[0:h_2, 0:w_2].copy()
img1 = frame[0:h_2, w_1:w].copy()
img2 = frame[h_1:h, 0:w_2].copy()
img3 = frame[h_1:h, w_1:w].copy()
2. yolov8中多batch推理的方式
因为刚使用yolov8不久,推理过程中的数据加载逻辑重新梳理了一下,做个记录
1)推理调用入口
results = model(source=frame, save=False, conf=conf, iou=nms, save_txt=False,
show=False)
2)model定义
model = YOLO(MODEL)
3)YOLO类 (ultralytics/models/yolo/model.py)
from ultralytics import YOLO
class YOLO(Model):
4) Model基类
class Model(nn.Module):
(4.1)super().__init__()
self._load(model, task)
(4.2)def __call__(self, source=None, stream=False, **kwargs):
"""Calls the 'predict' function with given arguments to perform object detection."""
return self.predict(source, stream, **kw