在篇博文中,我们将学习如何使用YOLO对象检测器来检测图像和视频流中的目标,其中用到了深度学习、OpenCV和Python。目标检测,不仅要确定图像中目标类别,而且还要确定给定目标在图像中的驻留位置。首先简单讨论一下YOLO对象检测器,包括目标检测器如何流程:
(1)将YOLO对象检测器应用于图像(2)将YOLO应用于视频流。
并在后面,讨论一下YOLO对象检测器的一些缺点,包括个人的一些技巧和建议。
1、YOLO对象检测器介绍
关于深度学习的目标检测,你会遇到三种主要的对象检测器:(1)R-CNN及包括原来的R-CNN,快速R-CNN,和更快R-CNN;(2)单发探测器(ssd);(3)YOLO。R- cnn是最早的基于深度学习的对象检测器之一,是两级检测器。
标准R-CNN非常慢,不是一个完整的端到端对象检测器。Girshick等人在2015年发表了第二篇论文,题为Fast R-CNN。Fast -CNN算法对原始的R-CNN进行了很大的改进,即提高了准确率,减少了向前传递所需的时间;但该模型仍然依赖于外部区域提议算法。直到Girshick等人2015年发表的后续论文《Faster R-CNN》:基于区域提议网络RPN的现实目标检测,R-CNNs成为一个真正的端到端深度学习目标检测器,通过去除选择性搜索要求,而不再依赖于区域提议网络(RPN),该区域提议网络RPN是完全卷积的,(2)可以预测对象边界框和“对象”得分(即,量化图像某区域包含图像的可能性的分数),再把RPN的输出传递到R-CNN组件进行最终分类和标记。虽然R-CNN非常准确,但R-CNN网络家族问题在于它们的速度——它们非常慢,在GPU上只能获得5帧/秒。为提高基于深度学习对象检测器的速度,Single Shot detector (ssd)和YOLO都使用One-Stage检测器策略。
One-Stage检测器策略将目标检测视为一个回归问题,取给定的输入图像,同时学习边界盒坐标和相应的类标签概率。一般来说,One-Stage检测器比Two-Stage检测器精度低,但速度快得多。YOLO是一个很好的例子。首先由Redmon等人在2015年提出《You Only Look Once: Unified, Real-Time Object Detection》,介绍YOLO能够在GPU上获得45 帧/秒的检测速度,其中的另一个版本“Fast YOLO”声称在GPU上可以达到155 帧/秒。YOLO同样经历了许多不同的迭代,包括YOLO9000(即YOLOv2),能够检测超过9000个物体探测器。Redmon和Farhadi通过对目标检测和分类进行联合训练,能够实现如此大量的目标检测。采用联合训练的方法,在ImageNet分类数据集和COCO检测数据集上同时对YOLO9000进行训练,在COCO数据集上,YOLO9000达到了16%的平均精度(mAP)。COCO数据集由80个标签组成,其中包括:人、自行车、汽车、卡车、飞机、停车标志等,下面介绍如何使用YOLOv3进行目标检测。
2、项目结构
项目包括4个目录和两个Python文件,目录:YOLOV3对象检测器预先训练(在COCO数据集上)模型文件。images/:这个文件夹包含四个图像,将对它们进行对象检测,以进行测试和评估。Video/:实时处理的视频。output/:输出YOLO处理过的视频和带有边界框和类名的标注annotation可放在这个文件夹中。
文件夹存在两个Python脚本:yolo.py和yolo video.py。第一个用于图像,然后第二个脚本中应用到视频中。
3、对图像进行检测
在YOLO对象检测器应用于图像,在你的项目中新建yolo.py文件并插入以下代码:
# import the necessary packages
import numpy as np
import argparse
import time
import cv2
import os
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to input image")
ap.add_argument("-y", "--yolo", required=True,
help="base path to YOLO directory")
ap.add_argument("-c", "--confidence", type=float, default=0.5,
help="minimum probability to filter weak detections")
ap.add_argument("-t", "--threshold", type=float, default=0.3,
help="threshold when applying non-maxima suppression")
args = vars(ap.parse_args())
# load the COCO class labels our YOLO model was trained on
labelsPath = os.path.sep.join([args["yolo"], "coco.names"])
LABELS = open(labelsPath).read().strip().split(