翻译:YOLOv3版本3 YOLO:实时物体检测 CNN卷积神经网络
Posted 架构师易筋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译:YOLOv3版本3 YOLO:实时物体检测 CNN卷积神经网络相关的知识,希望对你有一定的参考价值。
You only look once (YOLO) 是最先进的实时对象检测系统。在 Pascal Titan X 上,它以 30 FPS 的速度处理图像,并且在 COCO test-dev 上的 mAP 为 57.9%。
视频链接:http://www.youtube.com/watch?v=MPU2HistivI
1. 与其他探测器的比较
YOLOv3 非常快速和准确。在以 0.5 IOU 测量的 mAP 中,YOLOv3 与 Focal Loss 相当,但快了大约 4 倍。此外,只需更改模型的大小,您就可以轻松地在速度和准确性之间进行权衡,无需重新训练!
1.1 COCO 数据集上的表现
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 |
2. 这个怎么运作
先前的检测系统重新利用分类器或定位器来执行检测。他们将模型应用于多个位置和比例的图像。图像的高分区域被认为是检测。
我们使用完全不同的方法。我们将单个神经网络应用于完整图像。该网络将图像划分为多个区域并预测每个区域的边界框和概率。这些边界框由预测概率加权。
与基于分类器的系统相比,我们的模型有几个优点。它在测试时查看整个图像,因此它的预测是根据图像中的全局上下文提供的。它还使用单个网络评估进行预测,这与R-CNN等系统不同,后者需要数千张图像。这使它非常快,比 R-CNN 快 1000 倍以上,比Fast R-CNN 快100 倍。有关完整系统的更多详细信息,请参阅我们的论文。
2.1 第 3 版有哪些新功能?
YOLOv3 使用了一些技巧来改进训练和提高性能,包括:多尺度预测、更好的主干分类器等。完整的细节在我们的论文中!
3. 使用预训练模型进行检测
这篇文章将指导您使用预先训练的模型通过 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%
暗网打印出它检测到的物体、它的置信度以及找到它们所需的时间。我们没有编译暗网,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/yolov3.cfg yolov3.weights data/dog.jpg
如果您只想在一张图像上运行检测,则不需要知道这一点,但了解您是否想执行其他操作(例如在网络摄像头上运行)(稍后您将看到)很有用。
3.1 多个图像
您可以将其留空以连续尝试多个图像,而不是在命令行上提供图像。相反,当配置和权重加载完成时,您会看到一个提示:
./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让它预测该图像的框。
完成后,它会提示您提供更多路径以尝试不同的图像。完成后Ctrl-C用于退出程序。
3.2 更改检测阈值
默认情况下,YOLO 仅显示检测到的置信度为 0.25 或更高的对象。您可以通过将-thresh 标志传递给yolo命令来更改此设置。例如,要显示所有检测,您可以将阈值设置为 0:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0
其中产生:
![][全部]
所以这显然不是非常有用,但您可以将其设置为不同的值来控制模型阈值的内容。
3.3 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
4. 网络摄像头的实时检测
如果看不到结果,在测试数据上运行 YOLO 并不是很有趣。让我们在网络摄像头的输入上运行它,而不是在一堆图像上运行它!
要运行此演示,您需要使用 CUDA 和 OpenCV编译Darknet。然后运行命令:
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
YOLO 将显示当前的 FPS 和预测的类别以及在其上绘制边界框的图像。
您将需要一个连接到 OpenCV 可以连接的计算机的网络摄像头,否则它将无法工作。如果您连接了多个网络摄像头并想选择使用哪个,您可以传递标志-c 来选择(OpenCV0默认使用网络摄像头)。
如果 OpenCV 可以读取视频,您也可以在视频文件上运行它:
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>
这就是我们制作上面的 YouTube 视频的方式。
5. 在 VOC 上训练 YOLO
如果您想使用不同的训练机制、超参数或数据集,您可以从头开始训练 YOLO。以下是如何让它在 Pascal VOC 数据集上工作。
5.1 获取 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 训练数据的子目录。
5.2 为 VOC 生成标签
现在我们需要生成暗网使用的标签文件。Darknet 想要.txt为每个图像创建一个文件,图像中的每个地面实况对象都有一行,如下所示:
<object-class> <x> <y> <width> <height>
其中x、y、width和height是相对于图像的宽度和高度的。为了生成这些文件,我们将voc_label.py在 Darknet 的scripts/目录中运行脚本。让我们再下载一次,因为我们很懒。
wget https://pjreddie.com/media/files/voc_label.py
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 年的 trainval 和 2012 年的 trainval 都设置在一个大列表中。这就是我们为数据设置所做的一切!
5.3 修改 Pascal 数据的配置
现在转到您的暗网目录。我们必须更改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
您应该替换为放置 VOC 数据的目录。
5.4 下载预训练的卷积权重
对于训练,我们使用在 Imagenet 上预训练的卷积权重。我们使用来自darknet53模型的权重。您可以在此处 (76 MB)下载卷积层的权重。
wget https://pjreddie.com/media/files/darknet53.conv.74
5.5 训练模型
现在我们可以训练了!运行命令:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
6. 在 COCO 上训练 YOLO
如果您想使用不同的训练机制、超参数或数据集,您可以从头开始训练 YOLO。以下是如何让它在COCO 数据集上工作。
6.1 获取 COCO 数据
要训练 YOLO,您将需要所有 COCO 数据和标签。该脚本scripts/get_coco_dataset.sh将为您执行此操作。弄清楚你想把 COCO 数据放在哪里并下载它,例如:
cp scripts/get_coco_dataset.sh data
cd data
bash get_coco_dataset.sh
现在您应该拥有为 Darknet 生成的所有数据和标签。
6.2 修改 COCO 的 cfg
现在转到您的暗网目录。我们必须更改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
您应该替换为放置 COCO 数据的目录。
您还应该修改模型 cfg 以进行训练而不是测试。cfg/yolo.cfg应该是这样的:
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
....
6.3 训练模型
现在我们可以训练了!运行命令:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74
如果要使用多个 gpu 运行:
./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
7. Open Images 数据集上的 YOLOv3
wget https://pjreddie.com/media/files/yolov3-openimages.weights
./darknet detector test cfg/openimages.data cfg/yolov3-openimages.cfg yolov3-openimages.weights
8. 旧的 YOLO 网站发生了什么?
如果您使用的是 YOLO 版本 2,您仍然可以在此处找到该站点:https : //pjreddie.com/darknet/yolov2/
9. 引用
如果您在工作中使用 YOLOv3,请引用我们的论文!
@article{yolov3,
title={YOLOv3: An Incremental Improvement},
author={Redmon, Joseph and Farhadi, Ali},
journal = {arXiv},
year={2018}
}
参考
https://pjreddie.com/darknet/yolo/
以上是关于翻译:YOLOv3版本3 YOLO:实时物体检测 CNN卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章
目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)