目标检测-追踪实现框架代码详解

监测追踪框架梳理

最近在做一些目标检测+追踪联合实现的工作,在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函数返回根据阈值确定的物体类别及定位,并为每个物体创建追踪器,postprocessintermediate_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以上
OTB数据测试

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值