AI队列长度检测:使用YOLO进行视频中的对象检测

到目前为止,在本系列中,我们一直在处理静止图像数据。在本文中,我们将使用YOLO的基本实现来检测和计数视频序列中的人物。

让我们再次从导入所需的库开始。

import cv2
import numpy as np
import time

在这里,我们将使用与上一篇文章中讨论的相同的文件和代码模式。如果您还没有阅读本文,我建议您阅读一下,因为它将清除代码的基础知识。作为参考,我们将在此处加载YOLO模型。

# Load Yolo
net=cv2.dnn.readNet("./yolov3.weights", "./yolov3.cfg")
 
# Classes
classes=[]
with open("coco.names","r") as f:
	classes=[line.strip() for line in f.readlines()]
 
# Define Output Layers	
layer_names=net.getLayerNames()
output_layers=[layer_names[i[0]-1] for i in net.getUnconnectedOutLayers()]

现在,我们将向模型提供一个视频文件,而不是图像。OpenCV提供了一个简单的界面来处理视频文件。我们将创建该VideoCapture对象的实例。它的参数可以是连接的设备的索引或视频文件。我将处理一个视频。

cap = cv2.VideoCapture('./video.mp4')

我们还将输出保存为视频序列。为了保存视频输出,我们将使用Keras中的VideoWriter对象实例。

out_video = cv2.VideoWriter(  'human.avi', cv2.VideoWriter_fourcc(*'MJPG'), 15., (640,480))

现在,我们将从视频序列中捕获帧,使用blob处理它们并进行检测。(查看上一篇文章以获取详细说明。)

frame = cv2.resize(frame, (640, 480))
height,width,channel=frame.shape
 
    	
#detecting objects using blob. (320,320) can be used instead of (608,608)
blob=cv2.dnn.blobFromImage(frame,1/255,(320,320),(0,0,0),True,crop=False)
   	
net.setInput(blob)
 
#Object Detection
outs=net.forward(outputlayers)

让我们获取每个检测到的对象的边界框的坐标,并应用阈值以消除弱检测。当然,我们不要忘记应用非最大抑制。

# # Evaluate class ids, confidence score and bounding boxes for detected objects i.e. humans
class_ids=[]
confidences=[]
boxes=[]
	
for out in outs:
  	for detection in out:
        	scores=detection[5:]
        	class_id=np.argmax(scores)
        	confidence=scores[class_id]
        	if confidence>0.5:
              	# Object Detected
              	center_x=int(detection[0]*width)
              	center_y=int(detection[1]*height)
              	w=int(detection[2]*width)
              	h=int(detection[3]*height)                	
  	            # Rectangle Co-ordinates
          	    x=int(center_x-w/2)
              	y=int(center_y-h/2)
                	
              	boxes.append([x,y,w,h])
              	confidences.append(float(confidence))
              	class_ids.append(class_id)
                	
              	# Non-max Suppression
               	indexes=cv2.dnn.NMSBoxes(boxes,confidences,0.4,0.6)

在检测到的对象上绘制最终边界框,并为每次检测增加计数器。

count = 0
# Draw bounding boxes
	for i in range(len(boxes)):
    	if i in indexes:
        	x,y,w,h=boxes[i]
        	label=str(classes[class_ids[i]])
        	color=COLORS[i]
        	if int(class_ids[i] == 0):
            	count +=1
           	 cv2.rectangle(frame,(x,y),(x+w,y+h),color,2)
            	cv2.putText(frame,label+" "+str(round(confidences[i],3)),(x,y-5),font,1, color, 1)

我们可以在屏幕上绘制帧号和计数器,以便我们知道每个帧中有多少人。

# draw counter
cv2.putText(frame, str(count), (100,200), cv2.FONT_HERSHEY_DUPLEX, 2, (0, 255, 255), 10)

cv2.imshow("Detected_Images",frame)

现在,我们的模型将计算框架中存在的人数。为了更好地估计队列长度,我们可以在处理之前定义我们感兴趣的区域。

# Region of interest
ROI = [(100,100),(1880,100),(100,980),(1880,980)]

然后将框仅聚焦在该区域中,如下所示:

# draw Region Of Interest
cv2.rectangle(frame, ROI[0], ROI[3], (255,255,0), 2)

这是正在处理的最终视频的快照。

尾注

在本系列文章中,我们学习了为计算机视觉问题实现深度神经网络。我们从头开始实现神经网络,使用转移学习,并使用预先训练的模型来检测感兴趣的对象。乍一看,当我们在拥挤的场景中工作时,清晰地看不到感兴趣的对象,似乎最好使用经过定制训练的模型。在这种情况下,经过定制训练的模型可能会更准确,但是准确度是以时间和资源消耗为代价的。某些类似YOLO的最新算法比经过定制训练的模型更有效,并且可以实时实现,同时保持合理的准确性。

我们在本系列中探讨的解决方案并不完美,可以改进,但是您现在应该可以清楚地了解使用深度学习模型进行对象检测意味着什么。我鼓励您尝试我们所经历的解决方案。也许您可以微调参数以获得更好的预测,或者实现ROILOI以获得对队列中人数的更好估计。您也可以尝试进行对象跟踪,只是不要忘记与我们分享您的发现。祝您编码愉快!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值