摘要:本文详细介绍如何利用深度学习中的
Y
O
L
O
及
S
O
R
T
算法实现车辆、行人等多目标的实时检测和跟踪,并利用
P
y
Q
t
5
设计了清新简约的系统UI界面,在界面中既可选择自己的视频、图片文件进行检测跟踪,也可以通过电脑自带的摄像头进行实时处理,可选择训练好的
Y
O
L
O
v
3
/
v
4
等模型参数。该系统界面优美、检测精度高,功能强大,设计有多目标实时检测、跟踪、计数功能,可自由选择感兴趣的跟踪目标。博文提供了完整的
P
y
t
h
o
n
程序代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。本博文目录如下:
# 从配置和参数文件中载入模型print("[INFO] 正在载入模型...")
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
ln = net.getLayerNames()
ln =[ln[i[0]-1]for i in net.getUnconnectedOutLayers()]
# 试运行,获取总的画面帧数try:
prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \
else cv2.CAP_PROP_FRAME_COUNT
total =int(vs.get(prop))print("[INFO] 视频总帧数:{}".format(total))# 若读取失败,报错退出except:print("[INFO] could not determine # of frames in video")print("[INFO] no approx. completion time can be provided")
total =-1
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, frame = vs.read()
vw = frame.shape[1]
vh = frame.shape[0]print("[INFO] 视频尺寸:{} * {}".format(vw, vh))
output_video = cv2.VideoWriter(video_path.replace(".mp4","-det.avi"), fourcc,20.0,(vw, vh))# 处理后的视频对象
boxes =[]# 用于检测框坐标
confidences =[]# 用于存放置信度值
classIDs =[]# 用于识别的类别序号# 逐层遍历网络获取输出for output in layerOutputs:# loop over each of the detectionsfor detection in output:# extract the class ID and confidence (i.e., probability)# of the current object detection
scores = detection[5:]
classID = np.argmax(scores)
confidence = scores[classID]# 过滤低置信度值的检测结果if confidence > filter_confidence:
box = detection[0:4]* np.array([W, H, W, H])(centerX, centerY, width, height)= box.astype("int")# 转换标记框
x =int(centerX -(width /2))
y =int(centerY -(height /2))# 更新标记框、置信度值、类别列表
boxes.
append([x, y,int(width),int(height)])
confidences.append(float(confidence))
classIDs.append(classID)
dets =[]iflen(idxs)>0:# 遍历索引得到检测结果for i in idxs.flatten():(x, y)=(boxes[i][0], boxes[i][1])(w, h)=(boxes[i][2], boxes[i][3])
dets.append([x, y, x + w, y + h, confidences[i], classIDs[i]])
np.set_printoptions(formatter={'float':lambda x:"{0:0.3f}".format(x)})
dets = np.asarray(dets)
对于目标跟踪部分,在权衡几种算法后,我决定选择
SORT (Simple Online and Realtime Tracking, SORT)
算法,它易于实现、运行速度快。该算法其实来源于Alex Bewley等人在2017年发表的一篇论文:Bewley A, Ge Z, Ott L, et al. Simple online and realtime tracking[C]//2016 IEEE international conference on image processing (ICIP). IEEE, 2016: 3464-3468.,该论文提出使用卡尔曼滤波器来预测先前识别出的物体的轨迹,并将它们与新的检测结果相匹配。论文作者给出了SORT算法的Python实现,网址为:
https://github.com/abewley/sort
,博主目标跟踪的这部分代码引用自该实现,在其基础上我作了改写以适合使用。