原标题:YOLO: Real-Time Object Detection
英文原文:https://pjreddie.com/darknet/...强烈推荐(TED视频):https://www.ted.com/talks/jos...
You only look once (YOLO)是目前最先进的实时对象检测系统。在一台Titan X
上它能实时处理40-90帧每秒的图像,并且准确率高达78.6%
(VOC 2007
)和48.1%
(COCO test-dev
)。
Model Train Test mAP FLOPS FPS Cfg Weights
Old YOLO VOC 2007+2012 2007 63.4 40.19 Bn 45 link
SSD300 VOC 2007+2012 2007 74.3 - 46 link
SSD500 VOC 2007+2012 2007 76.8 - 19 link
YOLOv2 VOC 2007+2012 2007 76.8 34.90 Bn 67 cfg weights
YOLOv2 544x544 VOC 2007+2012 2007 78.6 59.68 Bn 40 cfg weights
Tiny YOLO VOC 2007+2012 2007 57.1 6.97 Bn 207 cfg weights
SSD300 COCO trainval test-dev 41.2 - 46 link
SSD500 COCO trainval test-dev 46.5 - 19 link
YOLOv2 608x608 COCO trainval test-dev 48.1 62.94 Bn 40 cfg weights
Tiny YOLO COCO trainval - - 7.07 Bn 200 cfg weights
工作原理
以前的检测系统通过重复利用分类器和定位器来实现目标识别。它们把模型套在图像的不同位置和大小区域,通过图像各区域的最高分值来判定结果。
我们使用了完全不同的方法。我们通过把一个单独的神经网络放在整个图像上来进行识别。这个网络把图像分成区域并对边框和各区域的可能性进行预测。这些边框通过预测到的可能性进行加权。
我们的模型相比于基于分类器的系统有几个优势。它在测试时观察整个图像,所以它的预测是基于整个图像上下文的。并且它通过一个单一网络进行预测,不像那些R-CNN
系统需要对一幅图像运用上千的网络。这一特点使我们的系统超级快,速度是R-CNN
的上千倍,一百倍快于快速R-CNN
。想对全系统有更深入了解,可以阅读我们的论文。
使用预先训练好的模型进行预测
下面带你使用预先训练好的模型通过YOLO
系统进行对象检测。如果你还没有安装Darknet
的话,你可以通过以下命令安装:
git clone https://github.com/pjreddie/darknet
cd darknet
make
就是这么简单!
cfg/
子目录下已经预置好了YOLO
的配置文件。你还需要下载预先训练好的权重文件(258 MB
):
wget https://pjreddie.com/media/files/yolo.weights
然后就可以开始运行检测器了!
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
你会看到类似下面这样的输出:
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
.......
29 conv 425 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 425
30 detection
Loading weights from yolo.weights...Done!
data/dog.jpg: Predicted in 0.016287 seconds.
car: 54%
bicycle: 51%
dog: 56%
Darknet
显示出它检测到的对象、信心以及花了多少时间。因为我们没有把Darknet
和OpenCV
一起编译,所以不能直接显示图像结果。但是我们把图像结果保存在了predictions.png
文件里。你可以打开这个文件看到检测之后的结果。因为我们现在是在CPU
上运行Darknet
,所以它会花费6到12秒的时间才能处理一幅图像。如果我们用GPU
版本的话,所需时间会短得多。
我在这里提供了其它几幅图像,如果你感兴趣可以逐一尝试一下。试试data/eagle.jpg
, data/dog.jpg
, data/person.jpg
和data/horses.jpg
吧!
上面那个命令里的detect
是一个更通用命令的精简版,它等价于下面这个命令:
./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg
如果你只是想在一幅图像上进行检测的话,你不需要了解这些。但如果你想在摄像头上进行检测的话,这个命令还是非常有用的。后面我们会讲如何在摄像头上进行实时检测。
多幅图像
除了在命令行提供文件名进行一幅图像检测以外,你也可以不输入文件名,这样就可以进行多幅图像检测了。配置和权重文件加载完成后,系统会提示你输入文件名:
./darknet detect cfg/yolo.cfg yolo.weights
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
.......
29 conv 425 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 425
30 detection
Loading weights from yolo.weights ...Done!
Enter Image Path:
在这里输入图像文件名如data/horses.jpg
就可以对这幅图像进行检测。
检测完成后系统会提示你输入其它图像的文件名。全部检测完成后按下Ctrl-C
来退出。
修改检测阈值
缺省情况下,YOLO
只显示信心大于.25
的对象。你可以通过附加-thresh <val>
参数来修改这一设定。比如,你可以把阈值修改为0
来显示所有检测到的对象:
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0
结果如下:
这样的结果似乎没什么用,不过你可以通过修改为不同数值来控制模型检测的结果。
Tiny YOLO
Tiny YOLO
是基于Darknet
参考网络的非常快速但准确率不如常规YOLO
的模型。用法如下:
wget https://pjreddie.com/media/files/tiny-yolo-voc.weights
./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights data/dog.jpg
这个,呵呵,不完美(把白马识别成绵羊了,把黑狗识别成奶牛了),但确实很快。在GPU
版本上,它能处理超过200
帧每秒的图像。
摄像头实时检测
在测试数据上运行YOLO
没什么意思,无法直接看到结果。下面我们让它来直接处理摄像头的输入!
要运行这个示例,你需要把Darknet
和CUDA
和OpenCV
集成编译,然后运行以下命令:
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
YOLO
显示当前帧率并在它检测到的对象上加上方框。
你必须在电脑上安装好摄像头连接到OpenCV
,否则没法工作。如果你有多个摄像头,可以通过-c <num>
来指定其中之一(OpenCV
缺省使用0
号摄像头)。
你也可以让它对一段视频进行处理:
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights <video file>
下面这段Youtube
视频就是这么处理的:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。