YOLO:实时目标检测
你只看一次(YOLO)是一个最先进的实时物体检测系统。在Pascal Titan X上,它以30 FPS的速度处理图像,在COCO test-dev上的mAP为57.9%。
与其他探测器的比较
YOLOv3非常快速准确。 在mAP测量为.5 IOU时,YOLOv3与Focal Loss相当,但速度提高约4倍。 此外,您只需更改模型的大小即可轻松在速度和准确度之间进行权衡,无需再培训!
Performance on the COCO Dataset
Model | Train | Test | mAP | FLOPS | FPS | 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 | test-dev | 23.7 | 5.41 Bn | 244 | cfg | weights |
SSD321 | COCO trainval | test-dev | 45.4 | - | 16 | link | |
DSSD321 | COCO trainval | test-dev | 46.1 | - | 12 | link | |
R-FCN | COCO trainval | test-dev | 51.9 | - | 12 | link | |
SSD513 | COCO trainval | test-dev | 50.4 | - | 8 | link | |
DSSD513 | COCO trainval | test-dev | 53.3 | - | 6 | link | |
FPN FRCN | COCO trainval | test-dev | 59.1 | - | 6 | link | |
Retinanet-50-500 | COCO trainval | test-dev | 50.9 | - | 14 | link | |
Retinanet-101-500 | COCO trainval | test-dev | 53.1 | - | 11 | link | |
Retinanet-101-800 | COCO trainval | test-dev | 57.5 | - | 5 | link | |
YOLOv3-320 | COCO trainval | test-dev | 51.5 | 38.97 Bn | 45 | cfg | weights |
YOLOv3-416 | COCO trainval | test-dev | 55.3 | 65.86 Bn | 35 | cfg | weights |
YOLOv3-608 | COCO trainval | test-dev | 57.9 | 140.69 Bn | 20 | cfg | weights |
YOLOv3-tiny | COCO trainval | test-dev | 33.1 | 5.56 Bn | 220 | cfg | weights |
YOLOv3-spp | COCO trainval | test-dev | 60.6 | 141.45 Bn | 20 | cfg | weights |
它是如何运作的
先前的检测系统重新利用分类器或定位器来执行检测。 他们将模型应用于多个位置和比例的图像。 图像的高评分区域被认为是检测。
我们使用完全不同的方法。 我们将单个神经网络应用于完整图像。 该网络将图像划分为区域并预测每个区域的边界框和概率。 这些边界框由预测的概率加权。
与基于分类器的系统相比,我们的模型具有多个优势。 它在测试时查看整个图像,因此其预测由图像中的全局上下文提供信息。 它还使用单一网络评估进行预测,而不像R-CNN这样的系统需要数千个单个图像。 这使得它非常快,比R-CNN快1000倍以上,比Fast R-CNN快100倍。 有关完整系统的更多详细信息,请参阅我们的论文。
What’s New in Version 3?
YOLOv3使用一些技巧来改进培训并提高性能,包括:多尺度预测,更好的骨干分类器等。 完整的细节在我们的论文中!
使用预先训练的模型进行检测
本文将指导您通过使用预先训练的模型来使用YOLO系统检测物体。 如果您尚未安装Darknet,则应首先执行此操作:
git clone https://github.com/pjreddie/darknet
cd darknet
make
cfg/子目录中已经有了YOLO的配置文件。你必须在这里下载预先训练好的权重文件(237 MB)。或者运行这个:
wget https://pjreddie.com/media/files/yolov3.weights
然后运行检测器
./darknet detect cfg/yolov3.cfg yolov3.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 0.299 BFLOPs
1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs
.......
105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs
106 detection
truth_thresh: Using default '1.000000'
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.029329 seconds.
dog: 99%
truck: 93%
bicycle: 99%
Darknet打印出它检测到的对象,及其置信度以及找到它们需要的时间。 我们没有使用OpenCV
编译Darknet,因此无法直接显示检测结果。 然而,Darknet将检测结果保存在predictions.png
中。 您可以打开它以查看检测到的对象。 由于我们只在CPU上使用Darknet,因此每张图像大约需要6-12秒。 如果我们使用GPU版本,它会快得多。
Darknet已经包含了一些示例图像,以便在需要的情况下进行尝试。 尝试 data/eagle.jpg
, data/dog.jpg
, data/person.jpg
, 或者data/horses.jpg
!
detect
命令是该命令更通用版本的简写。它相当于命令:
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
如果您只想在一张图像上运行检测,则无需知道这一点,但是如果您想在网络摄像头上运行检测(稍后将会看到)等其他操作,知道这一点是非常有用的。
Multiple Images
您可以不在命令行上提供图像,而是将其留空以尝试连续多个图像的检测。当配置和权重加载完成时,您会看到一个提示:
./darknet detect cfg/yolov3.cfg yolov3.weights
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BFLOPs
1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs
.......
104 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BFLOPs
105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs
106 detection
Loading weights from yolov3.weights...Done!
Enter Image Path:
输入类似data/horses.jpg
的图像路径,让Darknet为该图像预测边框。
一旦完成,它将提示您尝试检测更多不同的图像。完成后使用Ctrl-C可以退出程序。
改变检测阈值
默认情况下,YOLO仅显示检测到的置信度为.25或更高的对象。 您可以通过将-thresh 标志传递给yolo命令来更改此设置。 例如,要显示所有检测,您可以将阈值设置为0:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0
Tiny YOLOv3
我们也有一个非常小的模型,适用于受约束的环境,yolov3-tiny。要使用该模型,首先下载权重文件:
wget https://pjreddie.com/media/files/yolov3-tiny.weights
然后运行带有配置文件和权重的检测器
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
网络摄像头上的实时检测
要运行此演示,您需要使用CUDA和OpenCV编译Darknet。 然后运行命令:
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
YOLO将显示当前的FPS和预测类,以及在其上绘制带有边界框的图像。
如果您连接了多个摄像头并想要选择使用哪个摄像头,则可以通过标志-c <num >
来选择(OpenCV默认使用网络摄像头0)。
如果OpenCV可以读取视频,您也可以在视频文件上运行它:
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>
Training YOLO on VOC
如果您想要使用不同的训练机制,超参数或数据集,您可以从头开始训练YOLO。 以下是如何使其在Pascal VOC数据集上运行。
获取Pascal VOC数据
要训练YOLO,您将需要2007年至2012年的所有VOC数据。您可以在此处找到数据的链接。 要获取所有数据,请创建一个目录以存储它,并从该目录运行:
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
现在将有一个VOCdevkit/
子目录,其中包含所有VOC训练数据。
Generate Labels for VOC
现在我们需要生成Darknet使用的标签文件。 Darknet希望每个图像都对应一个.txt文件,其中包含图像中每个地面真实物体的一行,如下所示:
<object-class> <x> <y> <width> <height>
其中x,y,width和height相对于图像的宽度和高度。 为了生成这些文件,我们将在Darknet的sripts/
目录中运行voc_label.py
脚本。
cd ~/darknet/scripts/
python voc_label.py
几分钟后,此脚本将生成所有必需的文件。 通常在VOCdevkit/VOC2007/labels/
和VOCdevkit/VOC2012/labels/
中生成大量的标签文件。 在您的目录中,您应该看到:
ls #执行
2007_test.txt VOCdevkit
2007_train.txt voc_label.py
2007_val.txt VOCtest_06-Nov-2007.tar
2012_train.txt VOCtrainval_06-Nov-2007.tar
2012_val.txt VOCtrainval_11-May-2012.tar
文本文件如2007_train.txt
列出了该年的图像文件和图像集。Darknet需要一个文本文件,其中包含您想要训练的所有图像。在这个例子中,让我们用除了2007测试集之外的所有东西来训练,这样我们就可以测试我们的模型。运行:
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
现在,我们把2007年和2012年的训练集(training set
)放在一个大列表中。这就是我们所要做的数据设置!
为Pascal数据修改Cfg
现在转到你的暗网目录。我们必须更改cfg/voc.data
配置文件以指向您的数据:
1 classes= 20
2 train = <path-to-voc>/train.txt
3 valid = <path-to-voc>2007_test.txt
4 names = data/voc.names
5 backup = backup
您应该将<path-to-voc>
替换为放置VOC数据的目录。
下载预训练卷积权重
对于训练,我们使用在Imagenet上预训练的卷积权重。 我们使用darknet53
模型中的权重。 您可以在此处(76 MB)下载卷积图层的权重。
wget https://pjreddie.com/media/files/darknet53.conv.74
训练模型
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
在COCO上训练YOLO
如果您想要使用不同的训练方案,超参数或数据集,您可以从头开始训练YOLO。 以下是如何使用COCO数据集。
获取COCO数据
要训练YOLO,您需要所有COCO数据和标签。 脚本scripts/get_coco_dataset.sh
将为您执行此操作。 找出您想要放置COCO数据并下载它的位置,例如:
cp scripts/get_coco_dataset.sh data
cd data
bash get_coco_dataset.sh
现在您应该为Darknet生成所有数据和标签。
修改COCO的cfg
现在转到Darknet目录。 我们必须更改cfg/coco.data
配置文件以指向您的数据:
1 classes= 80
2 train = <path-to-coco>/trainvalno5k.txt
3 valid = <path-to-coco>/5k.txt
4 names = data/coco.names
5 backup = backup
您应该将<path-to-voc>
替换为放置VOC数据的目录。
您还应该修改您的模型cfg以进行培训而不是测试。 cfg/yolo.cfg
应如下所示:
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
....
训练模型
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74
如果你想使用多个gpus运行:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1,2,3
如果要从检查点停止并重新启动训练:
./darknet detector train cfg/coco.data cfg/yolov3.cfg backup/yolov3.backup -gpus 0,1,2,3
YOLOv3 on the Open Images dataset
wget https://pjreddie.com/media/files/yolov3-openimages.weights
./darknet detector test cfg/openimages.data cfg/yolov3-openimages.cfg yolov3-openimages.weights
老YOLO网站发生了什么?
如果您使用的是YOLO版本2,您仍然可以在此处找到该网站:https://pjreddie.com/darknet/yolov2/
引用
@article{yolov3,
title={YOLOv3: An Incremental Improvement},
author={Redmon, Joseph and Farhadi, Ali},
journal = {arXiv},
year={2018}
}