pytorch和python的区别 pytorch和yolo_pytorch和python的区别


简介

2018年12月6日,DeNA开源了PyTorch实现YOLOv3对象检测器 。我们的实现重新生成了原始实现的训练性能,这比复制测试阶段要困难得多。

为什么这么重要?

当您希望训练最先进的检测器时,您需要使用最大化检测器性能的训练系统。如果实施的训练性能比本文中报告的准确性低几个百分点,那么它就不再是最先进的。虽然有许多库可以复制对象检测器的推理,但是很难找到一个库可以复制训练。

为何选择PyTorch?

在PyTorch中重新实现YOLO(最初用C语言编写)是有意义的,因为该框架具有灵活性和性能的优点。PyTorch正迅速受到欢迎,最近发布的1.0版本支持从研究到生产的无缝迁移。

在本文中,我想分享我对YOLOv3的了解 - 尤其是如何训练具有重现精度的检测器。

YOLO对象检测器

YOLO(You Only ‘Look’ Once)是最先进的检测器之一,能够对图像中的多个物体进行定位和分类(图1)。YOLO之所以受欢迎,是因为它比two-stage检测器(如速度更快的R-CNN)要快。two-stage检测器首先提出目标区域,然后研究目标定位和分类的区域,YOLO将这two-stage结合成一个神经网络。简单的架构使得可以执行实时检测。网络的详细信息将在第1部分中显示。


pytorch和python的区别 pytorch和yolo_数据集_02

图1使用PyTorch_YOLOv3的对象检测结果


训练检测器比测试它更复杂。我们必须同时训练多个任务-对象定位,分类和'对象性'(置信度)。如果没有正确地应用任务的损失函数,则检测器的精度将显着低于报告的平均精度。

我已经分析了官方实现情况,并找出了定量复制必须满足的条件。我们在PyTorch中的重新实现已经成功实现了它,并且训练期间的COCO验证精度与YOLOv3(darknet)的原始实现相当,如图2所示。


pytorch和python的区别 pytorch和yolo_pytorch和python的区别_03

图2训练过程中darknet与PyTorch_YOLOv3验证平均精度对比


YOLO层的网络架构和通道元素

这里,我将展示YOLOv3网络架构的结构以及用于多尺度物体检测的YOLO层(检测层)的通道元素,用于多尺度物体检测。

  1. 网络架构


pytorch和python的区别 pytorch和yolo_pytorch 训练_04

图3 YOLOv3网络架构示意图


YOLOv3由称为darknet53的主干网络、上采样网络和称为YOLO层的检测层组成。

  • 主干网络:darknet53

主干网络从输入图像中提取特征图。网络主要采用残差块作为基本组件。每个残差块由一个3×3和1×1卷积层搭配一个快捷方式连接。卷积层的总数是53,这就是为什么这个网络被称为darknet53。最终特征图的尺寸具有比输入图像小1/32的空间分辨率。

  • 上采样网络和YOLO层

三个YOLO层负责检测不同尺度的物体从图3右侧金字塔形状的“上采样网络”中分离出来。网络的细节如图4所示。

在第一个YOLO层,网格分辨率是输入图像的1/32,可以检测到大对象。最终的YOLO层的分辨率为1/8,并且该层能够检测小物体。如图4所示,在YOLO层之间有多个卷积层和一个上采样层。每层都有卷积,批量归一化和leaky ReLU激活的子层。有快捷连接将darknet53的中间层连接到上采样层之后的层。

YOLOv3采用三层YOLO层。其优点主要在于,与只使用一个YOLO层而不进行上采样相比,检测器能够捕获较小的对象。


pytorch和python的区别 pytorch和yolo_pytorch和python的区别_05

图4上采样网络和YOLO层。矩形代表特征图。


2. YOLO层的通道元素

每个YOLO层的维度为(f_h,f_w,ch),其中f_h,f_w和ch分别是特征图的高度,宽度和通道数。

每个YOLO层中的通道数是N_anchor×(N_class +5),其中N_anchor是Anchors的数量,N_class是对象类的数量。图5显示了所有YOLO通道元素的映射。默认情况下,YOLOv3使用3个Anchors和80个类。因此,一个YOLO层中的通道数是3×(80 + 5)。

使用实际纵横比在图5中描绘了九个Anchors。Anchors框是依赖于数据集的参考边界框,其使用k-means聚类预先确定。Anchors的大小有很大的变化 - 最大Anchors是(373,326)像素,最小的是(10,13)像素。与目标对象的边框类似的Anchors的优点是比其他Anchors更精确地调整到目标。


pytorch和python的区别 pytorch和yolo_卷积_06

图5 YOLO通道元素的Role map


那么,每个通道元素如何工作?

  • x,y,w,h通道

在三个YOLO层,feature maps的粗分辨率分别是输入图像的32倍、16倍和8倍。每个特征网格都有表示检测到的边界框的坐标的信息。

图6描绘了anchor框和ground-truth框之间的关系。anchor框的中心被定义在网格方框的左上角。训练x,y通道的值xy,,这样ground-truth框可以从角落里推断出网格框内的相对位置:(σ(x),σ(y)),其中σ是sigmoid函数,其输出值范围从0到1-w,h通道值w,h用于调整框宽度和高度。如图6(右),训练w,使得anchor宽度w_a与ground truth框宽度w_GT的比值是exp(w)。


pytorch和python的区别 pytorch和yolo_卷积_07

图6边界框定位。绿色框是一个anchor框,红色框是一个 ground truth。


  • obj通道

obj通道的值表示“object”,表示对象属于网格的可能性。例如,如果obj值为0.98,那么对象很可能存在。obj值用于过滤低似然的推断对象。

  • cls通道

cls值用于对象分类。类通道的数量对应于数据集的类数量 - 对于COCO数据集为80。对通道进行训练,使得与ground truth类对应的类通道的值为1,其余为0。在推断时,您可以对通道值进行argmax处理,以选择通道索引。

摘要:

  • YOLOv3在三个YOLO层检测不同大小的对象
  • 每个YOLO层都有不同分辨率的网格和三个具有不同形状的anchors
  • 一个网格的每个anchor都具有以下信息:框中心位置,框大小,对象似然性和类概率