打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在OpenCV-Python 中用YOLO 目标检测

       我们将在本教程中学习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,然后加载算法。

们导入类:

  1. import cv2

  2. import numpy as np

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

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

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

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

  1. # Load Yolo

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

  3. classes = []

  4. with open("coco.names", "r") as f:

  5. classes = [line.strip() for line in f.readlines()]

  6. layer_names = net.getLayerNames()

  7. output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

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

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

  1. # Loading image

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

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

  4. height, width, channels = img.shape

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

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

Blob用于提取图片中的特征并调整其大小。 YOLO接受三种尺寸:

  • 320×320  很小,所以精度较低,但速度快

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

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

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

  1. # Detecting objects

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

  3. net.setInput(blob)

  4. outs = net.forward(output_layers)

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

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

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

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

23. # Showing informations on the screen

24. class_ids = []

25. confidences = []

26. boxes = []

27. for out in outs:

28. for detection in out:

29. scores = detection[5:]

30. class_id = np.argmax(scores)

31. confidence = scores[class_id]

32. if confidence > 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:从01的检测置信度。

49. font = cv2.FONT_HERSHEY_PLAIN

50. for i in range(len(boxes)):

51. if i 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()

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenCV多目标跟踪与视频分析
带你完成yolov3深度学习与对象检测:darknet环境的win系统安装
使用OpenCV进行YOLO对象检测
使用opencv-python计算SIFT特征点的示例
OpenCV 常用算法
只需 15 行代码即可进行人脸检测(使用Python 和 OpenCV)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服