翻译: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 数据集上的表现

ModelTrainTestmAPFLOPSFPSCfgWeights
SSD300COCO trainvaltest-dev41.2-46link
SSD500COCO trainvaltest-dev46.5-19link
YOLOv2 608x608COCO trainvaltest-dev48.162.94 Bn40cfgweights
Tiny YOLOCOCO trainvaltest-dev23.75.41 Bn244cfgweights
SSD321COCO trainvaltest-dev45.4-16link
DSSD321COCO trainvaltest-dev46.1-12link
R-FCNCOCO trainvaltest-dev51.9-12link
SSD513COCO trainvaltest-dev50.4-8link
DSSD513COCO trainvaltest-dev53.3-6link
FPN FRCNCOCO trainvaltest-dev59.1-6link
Retinanet-50-500COCO trainvaltest-dev50.9-14link
Retinanet-101-500COCO trainvaltest-dev53.1-11link
Retinanet-101-800 COCO trainvaltest-dev57.5-5link
YOLOv3-320COCO trainvaltest-dev51.538.97 Bn45cfgweights
YOLOv3-416COCO trainvaltest-dev55.365.86 Bn35cfgweights
YOLOv3-608COCO trainvaltest-dev57.9140.69 Bn20cfgweights
YOLOv3-tinyCOCO trainvaltest-dev33.15.56 Bn220cfgweights
YOLOv3-sppCOCO trainvaltest-dev60.6141.45 Bn20cfgweights

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卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习-OpenCV与YOLO之间的关系

物体检测实战:使用 OpenCV 进行 YOLO 对象检测

经典论文解读YOLOv3 目标检测

目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

在 JETSON TX2 上部署 YoloV3

opencv进阶-YOLOV3-tiny模型-实时物体检测