【译】YOLO: 实时对象检测系统

浏览: 638 发布日期: 2017-08-05 分类: c

原标题: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显示出它检测到的对象、信心以及花了多少时间。因为我们没有把DarknetOpenCV一起编译,所以不能直接显示图像结果。但是我们把图像结果保存在了predictions.png文件里。你可以打开这个文件看到检测之后的结果。因为我们现在是在CPU上运行Darknet,所以它会花费6到12秒的时间才能处理一幅图像。如果我们用GPU版本的话,所需时间会短得多。

我在这里提供了其它几幅图像,如果你感兴趣可以逐一尝试一下。试试data/eagle.jpg, data/dog.jpg, data/person.jpgdata/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没什么意思,无法直接看到结果。下面我们让它来直接处理摄像头的输入!

要运行这个示例,你需要把DarknetCUDAOpenCV集成编译,然后运行以下命令:

./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视频就是这么处理的:

返回顶部