我们将在本教程中学习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()