监测追踪框架梳理
最近在做一些目标检测+追踪联合实现的工作,在GitHub上找到了这个工作,在这里做一个代码详解。
连接在此Real_time_Object_detection_and_tracking
这个项目用YOLOv2+KCF实现目标检测与追踪。
目标检测实现
该项目在obeject_detection.py中创建object_detector类,输入参数有两个def __init__(self, model, cfg)
训练好的网络模型与模型说明文件,object_detector类中函数predict函数读取模型并对当前图像进行目标检测out = self.net.forward()
输出目标检测,根据不同模型输出结构不同,以yolo为例输出
# Network produces output blob with a shape NxC where N is a number of
# detected objects and C is a number of classes + 4 where the first 4
# numbers are [center_x, center_y, width, height]
输出结构是一个N*C的多维数组,N个物体,C为物体的位置
目标追踪实现
在已经获得目标类别,位置的情况下,该项目追踪方式利用opencv中tracker方法,为目标进行追踪器创建
cv.TrackerKCF_create()
cv.Tracker.init(img,bbox)
cv.Tracker.update(img)
如此返回每个物体的bbox
检测-追踪具体实现
初始化检测器方法,数据读入,数据显示窗口,以predictor作为检测器object_detector的方法
predictor = object_detector(args.model, args.config)
stream = cv.VideoCapture(args.input if args.input else 0)
window_name = "Tracking in progress"
cv.namedWindow(window_name, cv.WINDOW_NORMAL)
cv.setWindowProperty(window_name, cv.WND_PROP_AUTOSIZE, cv.WINDOW_AUTOSIZE)
cv.moveWindow(window_name,10,10
利用检测训练模型得到检测结果并为每个目标建立追踪器
predictions = predictor.predict(frame)
intermediate_detections(stream, predictor, threshold, classes)
objects_detected = postprocess(frame, predictions, threshold, classes, predictor.framework)
>postprocess(frame, out, threshold, classes, framework):
>return objects_detected
return stream, objects_detected, objects_list, trackers_dict
stream, objects_detected, objects_list, trackers_dict = intermediate_detections(stream, predictor, args.thr, classes)
predictions获取当前图像的检测结果
postprocess函数输入图像,检测结果,阈值,当前模型可识别类别,模型框架。返回一个字典object_detected表示物体的类别ID以及位置objects_detected[label_with_num] = [(int(left),int(top),int(width),int(height)),confidence]
intermediate_detections函数返回根据阈值确定的物体类别及定位,并为每个物体创建追踪器,postprocess在intermediate_detections函数中执行
利用追踪器对每个物体进行追踪,如果追踪失败,将失败的物体推到列表最前,利用监测器再次检测
if len(objects_detected) > 0:
del_items = []
for obj,tracker in trackers_dict.items():
ok, bbox = tracker.update(frame)
if ok:
objects_detected[obj][0] = bbox
else:
print('Failed to track ', obj)
del_items.append(obj)
for item in del_items:
trackers_dict.pop(item)
objects_detected.pop(item)
实例测试
用OTB数据集的视频测试了一下,速度在70FPS以上