python opencv yolo_在OpenCV-Python 中用YOLO 目标检测

本文介绍了如何在OpenCV-Python中应用YOLO进行对象检测。YOLO是一种快速的深度学习算法,适用于Linux、Windows和Mac平台。在教程中,详细阐述了安装过程、YOLO框架的选择以及如何在Opencv中使用YOLO进行图像检测,包括图像预处理、网络前向传播和结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们将在本教程中学习YOLO对象检测。 Yolo是一种深度学习算法,于2016年5月问世,它之所以迅速流行,是因为与以前的深度学习算法相比,它是如此之快。

使用yolo,我们可以以相对较高的速度检测物体。使用GPU,我们每秒可以处理45帧以上的帧,而CPU每秒可以处理大约一帧。

怎样安装YOLO呢?

让我们澄清一些事情。 YOLO是一种深度学习算法,因此它本身不需要任何安装,而我们需要的是在其中运行算法的深度学习框架。

在这里,我将描述与YOLO兼容的3种最常用和最知名的框架,以及每种框架的优缺点:Darknet:这是由YOLO开发人员构建的框架,专门为yolo制作。

优点:速度快,可与GPU或CPU配合使用

缺点:它只能与Linux操作系统一起使用Darkflow:这是Darknet对Tensorflow(另一个深层leanring框架)的改编。

优势:速度快,可以与GPU或CPU配合使用,并且还与Linux,Windows和Mac兼容。

缺点:安装非常复杂,尤其是在Windows上Opencv:opencv还有一个可与YOLO一起使用的深度学习框架。 只要确保您至少具有opencv 3.4.2。

优点:它无需安装opencv即可运行。

缺点:它仅与CPU配合使用,因此您无法以很高的速度实时处理视频。

如何在Opencv中使用YOLO

在本教程中,我们将重点介绍如何在Opencv中使用YOLO。对于初学者来说,这是最好的方法,它可以快速完成算法,而无需进行复杂的安装。

首先,导入库Opencv和numpy,然后加载算法。

我们导入类:importcv2

importnumpyasnp

加载算法。运行算法需要三个文件:

Weight file:这是训练有素的模型,是检测物体的算法的核心。

Cfg file: 它是配置文件,其中包含算法的所有设置。

Name files: 包含算法可以检测到的对象的名称。# Load Yolo

net = cv2.dnn.readNet("yolov3.weights","yolov3.cfg")

classes =[]

withopen("coco.names","r")asf:

classes =[line.strip()forlineinf.readlines()]

layer_names = net.getLayerNames()

output_layers =[layer_names[i[0]-1]foriinnet.getUnconnectedOutLayers()]

colors = np.random.uniform(0,255, size=(len(classes),3))

然后,将图像加载到要执行对象检测的位置,并获得其宽度和高度。# Loading image

img = cv2.imread("room_ser.jpg")

img = cv2.resize(img,None, fx=0.4, fy=0.4)

height, width, channels = img.shape

既然我们已经准备好算法和图像,现在是时候将图像传递到网络并进行检测了。

请记住,我们无法立即使用网络上的完整图片,但首先我们需要将其转换为Blob。

Blob用于提取图片中的特征并调整其大小。 YOLO接受三种尺寸:320×320  很小,所以精度较低,但速度快

609×609 很大,因此精度高、但速度慢

416×416位于中间,两者的折中。

第21行的结果是检测结果。 Outs是一个数组,包含有关所检测对象的所有信息,它们的位置以及对检测的置信度的信息。# Detecting objects

blob = cv2.dnn.blobFromImage(img,0.00392,(416,416),(0,0,0),True, crop=False)

net.setInput(blob)

outs = net.forward(output_layers)

至此,检测完成,我们只需要在屏幕上显示结果即可。

然后,我们遍历outs数组,计算置信度,然后选择置信度阈值。

在第32行,我们将阈值置信度设置为0.5,如果大于此阈值,则认为已正确检测到对象,否则将其跳过。

阈值从0到1。越接近1,则检测的准确性越高;而越接近0,则检测的准确性越低,但检测到的对象数量也越大。

23.# Showing informations on the screen

24.class_ids =[]

25.confidences =[]

26.boxes =[]

27.forout in outs:

28.fordetection in out:

29.scores = detection[5:]

30.class_id = np.argmax(scores)

31.confidence = scores[class_id]

32.ifconfidence >0.5:

33.# Object detected

34.center_x =int(detection[0]* width)

35.center_y =int(detection[1]* height)

36.w =int(detection[2]* width)

37.h =int(detection[3]* height)

38.

39.# Rectangle coordinates

40.x =int(center_x - w /2)

41.y =int(center_y - h /2)

42.

43.boxes.append([x, y, w, h])

44.confidences.append(float(confidence))

45.class_ids.append(class_id)

当我们执行检测时,碰巧我们在同一物体上有更多的BOX,因此我们应该使用另一个函数来消除这种“噪音”。 称为非最大限制。

47.indexes = cv2.dnn.NMSBoxes(boxes, confidences,0.5,0.4)

最后,我们提取所有信息并将其显示在屏幕上。

BOX:包含围绕检测到的对象的矩形的坐标。

Label:它是检测到的对象的名称

Confidence:从0到1的检测置信度。

49.font = cv2.FONT_HERSHEY_PLAIN

50.fori inrange(len(boxes)):

51.ifi in indexes:

52.x, y, w, h = boxes[i]

53.label =str(classes[class_ids[i]])

54.color = colors[i]

55.cv2.rectangle(img,(x, y),(x + w, y + h), color,2)

56.cv2.putText(img, label,(x, y +30), font,3, color,3)

57.

58.

59.cv2.imshow("Image", img)

60.cv2.waitKey(0)

61.cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值