一、目标
完成基于YOLO的目标检测(车辆、行人等),进行去重处理,绘制边框及置信度,分配不同的颜色成功完成对车辆行人等的检测
二、主要监测点
- 目标检测:使用YOLO算法对图像或视频中的车辆和行人进行检测,并确定其位置、大小和类别。
- 导入所必须的模块,进行初始化,推理:读取网络模型、图像预处理、设置网络、运算
- 获取置信度较高的边框、获取候选框的位置、大小
- 绘制边框、给每个分类随机分配一个颜色、绘制边框及置信度、分
三、实施条件
操作系统:Windows 编程环境:Anaconda 开发工具:Jupyter Notebook,Pycharm 第三方模块:matplotlib、keras等 |
四、实施步骤
1.导入模块
import cv2
import numpy as np
import matplotlib.pyplot as plt
2、初始化,推理
#初始化、推理
image=cv2.imread("road.image")
plt.imshow(image[:,:,::-1])
plt.show()
#初始化、推理
classes=open('coco.names','rt').read().strip().split("\n")
#步骤1:读取网络模型
net=cv2.dnn.readNetFromDarknet("yolov3.cfg","yolov3.weights")
#步骤2:图像预处理
blob=cv2.dnn.blobFromImage(image,1.0/255.0,(416,416),(0,0,0),True,crop=False)
#步骤3:设置网络
net.setInput(blob)
#步骤4:运算
outInfo=net.getUnconnectedOutLayersNames()
outs=net.forward(outInfo)
结果
3.获取置信度较高的边框,置信度较高的边框相关的三个值:resultIDS、boxes、confidences
resultIDS=[] #置信度较高的边框对应的分类在classes中的ID值
boxes=[] #置信度较高的边框集合
confidences=[] #置信度较高的边框的置信度
(H,W)=image.shape[:2] #原始图像image的宽、高(辅助图像内各各边框的位置、大小)
for out in outs: #各个输出层(共三个层,逐层处理)
for candidate in out: #每个层中,包含几百个可能的候选框,逐个处理
scores=candidate[5:] #先把第5-84个值筛选出来
classID=np.argmax(scores) #找到其中最大值对应的索引(位置)
confidence=scores[classID] #找到最大的置信度值(概率值)
#下面开始对置信度大于0.5,小于该值的直接忽略(不做任何处理)
if confidence>0.5:
#获取候选框的位置、大小
#需要注意,位置、大小都是相对原始图像image的百分比形式
#因此,位置、大小都是相对condidata乘以image的宽度、高度获取
box=candidate[0:4]*np.array([W,H,W,H])
(conterX,centerY,width,height)=box.astype("int")
x=int(conterX-(width/2))
y=int(centerY-(height/2))
boxes.append([x,y,int(width),int(height)])
confidences.append(float(confidence))
resultIDS.append(classID)
4.非极大值抑制,将众多重合的边框保留一个最关键的(去重处理)
indexes=cv2.dnn.NMSBoxes(boxes,confidences,0.5,0.4)
#绘制边框
#给每个分类随机分配一个颜色
classesCOLORS=np.random.randint(0,255,size=(len(classes),3),dtype="uint8")
#绘制边框及置信度、分类
for i in range(len(boxes)):
if i in indexes:
x,y,w,h=boxes[i]
color=[int(c) for c in classesCOLORS[resultIDS[i]]] #边框颜色
cv2.rectangle(image,(x,y),(x+w,y+h),color,2)
result="{}:{:.0f}%".format(classes[resultIDS[i]],confidences[i]*100)
cv2.putText(image,result,(x,y+35),cv2.FONT_HERSHEY_SIMPLEX,1,color,2)
plt.imshow(image[:,:,::-1])
plt.show()
结果:
五、总结
基于YOLO(You Only Look Once)的目标检测技术是一种高效、实时的计算机视觉方法,它能够在单个前向传播中同时预测图像中多个目标的边界框、置信度以及类别概率,特别适用于车辆、行人等复杂场景下的快速检测。YOLO通过其独特的网络结构和算法设计,不仅保持了高检测精度,还显著提升了处理速度,使得在自动驾驶、智能监控、视频分析等领域具有广泛的应用前景