我们将在本教程中学习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,然后加载算法。
我们导入类:
import cv2
import numpy as np
加载算法。运行算法需要三个文件:
Weight file:这是训练有素的模型,是检测物体的算法的核心。
Cfg file: 它是配置文件,其中包含算法的所有设置。
Name files: 包含算法可以检测到的对象的名称。
# Load Yolo
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
classes = []
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.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. 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:从0到1的检测置信度。
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()
联系客服