前言
本文使用fasterrcnn、SSD做目标检测,检测人,使用deepsort跟踪人。
本次实验只是做一个实现,后续可以根据效果深究。
一、fasterrcnn、SSD的目标检测
本次的fasterrcnn以及SSD的检测模型使用chainer默认的模型库,因此如果想提高检测成功率,修改此模型算法即可,具体的这里不做展开
二、DeepSort原理
基于深度学习的多目标跟踪算法的几种改进方向,其中有一种便是将深度表观特征应用到多目标跟踪问题中,deep-sort多目标跟踪算法便是这类算法中较为常用的一个。deep-sort 是在 sort 目标跟踪的基础上引入了表观特征提取网络,该网络是在行人重识别数据集上离线训练得到的,在目标跟踪过程中提取目标的表观特征进行最近邻匹配,这样可以有效的改善遮挡情况下的目标追踪效果。
1.引入库
这里我们封装了一个SORTMultiObjectTracking多目标跟踪的类
import sys
sys.path.append('.')
import numpy as np
import time,chainer,cv2
from nets.faster_rcnn.faster_rcnn_vgg import FasterRCNNVGG16
from nets.ssd.ssd_vgg16 import SSD300, SSD512
from nets.sort_multi_object_tracking import SORTMultiObjectTracking
2.读入数据
class SORTMultiObjectTracking(object):
def __init__(self, dectector, detector_label_names, tracking_label_names=None):
self.bbox_tracker = SORTMultiBboxTracker()
self.detector = dectector
self.detector_label_names = detector_label_names
self.tracking_label_names = tracking_label_names
def predict(self, img):
if len(img) > 1:
raise ValueError
bboxes, labels, scores = self.detector.predict(img)
bbox, label, score = bboxes[0], labels[0], scores[0]
bbox = chainer.cuda.to_cpu(bbox)
label = chainer.cuda.to_cpu(label)
score = chainer.cuda.to_cpu(score)
det_bbox = []
det_label = []
det_score = []
for bb, lbl, sc in zip(bbox, label, score):
if self.detector_label_names[lbl] in self.tracking_label_names and sc>0.4:
det_bbox.append(bb[None])
det_label.append(lbl)
det_score.append(sc)
if len(det_bbox) > 0:
det_bbox = np.concatenate(det_bbox)
else:
det_bbox = np.array(det_bbox).reshape((0, 4))
det_label = np.array(det_label)
det_score = np.array(det_score)
trk_indices, trk_bbox, trk_inst_id = self.bbox_tracker.update(det_bbox)
trk_label = det_label[trk_indices]
trk_score = det_score[trk_indices]
return trk_bbox[None], trk_label[None], trk_score[None], trk_inst_id[None]
这里把目标检测器dectector放进多目标跟踪器中,使用self.bbox_tracker.update获得目标的id和位置
3.效果如图
chainer-目标跟踪视频
总结
目标检测检测人+deepsort跟踪人,可以跟踪的不是人,只需要修改跟踪目标即可。
源码:chainer-目标跟踪-DeepSort