对Ayoosh Kathuria的YOLOv3实现进行翻译和总结,原文链接如下:
https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/
*首先翻译遵循不删不改的原则有一说一,对容易起到歧义的中文采取保留英文的方式。其中对原文没有删减但是略有扩充,其中某些阐释是我一句话的总结,如有错误请大家在留言区指出扶正。
这是从头开始构建YOLO v3检测器的教程,详细说明了如何从配置文件创建网络体系结构、加载权重和设计输入/输出。
目标检测(object detection)是一个因近年来深度学习的发展而受益颇多的领域,近年来,人们开发了多种目标检测算法,其中包括YOLO、SSD、Mask-RCNN和RetinaNet。
在过去的几个月里,我(Ayoosh Kathuria)一直在一个实验室致力于改进目标检测。从这次经历中得到的最大收获就是认识到学习目标检测的最佳方法是自己从头开始实现算法。这正是我们在本教程中要做的。
我们将会使用PyTorch并基于YOLO v3来实现一个目标检测器,这是一种速度更快的目标检测算法。
本教程的代码在Python 3.5和PyTorch 0.4上运行。在这个Github repo中可以完整地找到它。
本教程分为5个部分:
Part 1 (This one): Understanding How YOLO works
Part 2 : Creating the layers of the network architecture
Part 3 : Implementing the forward pass of the network
Part 4 : Objectness score thresholding and Non-maximum suppression
Part 5 : Designing the input and the output pipelines
YOLO源于Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015.它是一种利用深度卷积神经网络学习到的特征来检测物体的目标检测器。在我们开始构建代码之前,我们必须了解YOLO是如何工作的。
如有兴趣可以参考Andrew Ng的公开课,在CNN中他对YOLO有了初步的讲解,本人也是因吴恩达老师才了解到YOLO。
一句话介绍FCN就是不含全连接层的CNN,也就是说直接在像素层面对卷积层进行操作,不再对其参数进行一维展开。
YOLO只使用卷积层,使其成为完全卷积网络(FCN)。它有75个卷积层,有跳远连接和上采样层。不使用任何形式的池化层,使用步长为2的卷积层来对特征映射进行降采样(downsampling说白了就是因为(n-f)/s + 1因为步长s是2所以缩小了图像,因为使用了若干个downsampling原图像就会缩小2的n次方倍,所以最后对应了一个upsampling把缩小的图片通过卷积扩大为原来的大小)。这有助于防止通常因为使用池化层造成的低层面特征的丢失(很好理解,不管是最大池化还是平均池化都会把filter大小内的多个特征丢弃只剩1个)。
因为基于FCN的思想,YOLO对输入图像的大小是恒定不变的(上一段说了先数个downsampling然后一个upsampling,说白了就是先依次缩小数倍最后再扩大回去)。然而,在实际应用中,我们可能希望保持恒定的输入大小来应付不同的问题。(输入标准化,用过深度学习框架的都知道)
其中一个大问题是,如果我们想成批处理我们的图像(成批的图像可以由GPU并行处理,从而提高速度),我们需要有固定高度和宽度的图像。这需要将多个图像连接成一个大批量(将多个PyTorch张量连接成一个张量)。这句话不知道意思的可以去了解一下pytorch在处理图像时用的torchvision是怎么加载图像划分baby batch的,先导知识是关于mini batch梯度下降法加速训练的理论。
网络通过使用步长stride的方式来对图片进行降采样,例如,如果网络的步幅是32,那么大小为416x416的输入图像将产生大小为13x13的输出。(说白了就是卷积(n-f)/ s + 1)
Generally, stride of any layer in the network is equal to the factor by which the output of the layer is smaller than the input image to the network.
直译过来就是网络中任何层的步幅等于该层的输出且小于输入图像的大小。这一句先做保留,因为根据我对神经网络的经验有些CNN的stride是2的次方,有些是人为指定的步长,还有一些是从经典网络迁移过来的卷积层步长参数,所以步长到底多少在我看来是不一定的。
下面来对输出进行解释。
典型地来说,对于所有目标检测器都存在这种情况,通过卷积层学习到的特征会被传递进入分类器/回归器来预测一种检测,包括bounding box的坐标,类标等等。
How to implement a YOLO (v3) object detector from scratch in PyTorch: Part 1翻译与总结
原文:https://www.cnblogs.com/NWNU-LHY/p/12120957.html