YOLO_V3 原理以及训练说明

  • yolo_v3目标检测原理
  • Darknet 训练测试说明

 

  1. yolo_v3

  主要从三个方面来说明,网络的输入、结构、输出。

  (1)网络输入:原论文中提到的大小320*320,416*416,608*608。这个大小必须是32的整数倍数,yolo_v3有5次下采样,每次采样步长为2,所以网络的最大步幅(步幅指层的输入大小除以输出)为2^5=32。

  (2)网络结构:作者首先训练了一个darknet-53,训练这个主要是为了主要有两个目的:a.这个网路结构能在ImageNet有好的分类结果,从而说明这个网路能学习到好的特征(设计新的网络结构,这个相当于调参,具体参数怎么调,就是炼丹了),b.为后续检测模型做初始化。作者在ImageNet上实验发现这个darknet-53,的确很强,相对于ResNet-152和ResNet-101,darknet-53不仅在分类精度上差不多,计算速度还比ResNet-152和ResNet-101强多了,网络层数也比他们少。

                     图一  darknet-53网络结构

 

                   图二  darknet-53的性能测试

Darknet-53采用了ResNet这种跳层连接方式,性能完全比ResNet-152和ResNet-101这两种深层网络好,这里作者并没有给出原因,可能的原因:a.网络的基本单元的差异,b.网络层数越少,参数少。需要的计算量少。

             图三  两种结构基本单元比较

Yolo_v3网路就是使用了darknet-53的前面的52层(没有全连接层),直接拿过来,yolo_v3这个网络是一个全卷积网络,大量使用残差的跳层连接。之前的工作中,采样一般都是使用size为2*2,步长(stride)为2的max-pooling或者average-pooling进行降采样。但在这个网络结构中,使用的是步长为2的卷积来进行降采样。同时,网络中使用了上采样、route操作,还在一个网络结构中进行3次检测(有点盗用SSD的思想)

 使用残差的结构的好处:(1)深度模型一个关键的点就是能否正常收敛,残差这种结构能保证网络结构在很深的情况下,仍能收敛,模型能训练下去。(2)网络越深,表达的特征越好,分类+检测的效果都会提升。(3)残差中的1*1卷积,使用network in network的想法,大量的减少了每次卷积的channel,一方面减少了参数量(参数量越大,保存的模型越大),另一方面在一定程度上减少了计算量

网路中作者进行了三次检测,分别是在32倍降采样,16倍降采样,8倍降采样时进行检测,这样在多尺度的feature map上检测跟SSD有点像。在网络中使用up-sample(上采样)的原因:网络越深的特征表达效果越好,比如在进行16倍降采样检测,如果直接使用第四次下采样的特征来检测,这样就使用了浅层特征,这样效果一般并不好。如果想使用32倍降采样后的特征,但深层特征的大小太小,因此yolo_v3使用了步长为2的up-sample(上采样),把32倍降采样得到的feature map的大小提升一倍,也就成了16倍降采样。同理8倍采样也是对16倍降采样的特征进行步长为2的上采样,这样就可以使用深层特征进行detection。

 Yolo_v3通过上采样的方式很好的使16倍降采样和8倍降采样使用深层特征,但进行4次下采样和3次下采样得到的浅层feature map大小是一样的。Yolo_v3想把这些浅层特征也利用起来,就有了route层。把16倍降采样得到的feature map和四次下采样得到的层拼接在一起,在channel那个维度进行拼接。这样拼接的好处:让网络同时学习深层和浅层特征,表达效果更好。8倍降采样同样也是这样的操作,把三次下采样的feature map拼接在一起。

(箭头没画好,箭头从up-sample指向detection,代表把feature map的大小上升一倍)

(3)网络输出:

a.首先先确定网络输出特征层的大小。比如输入为320*320时,则输出为320/32=10,因此输出为10*10大小的特征层(feature map),此时有10*10=100个cell;同理当输入为416*416时输出的特征层为13*13大小的特征层,13*13=169个cell;输入为608*608时,输出的feature map大小为19*19,cell有19*19=361个。进行每进行一次up-sample时,输出特征层扩大一倍。

b. Anchor box的确定。这个先验框不同于之前Faster-Rcnn和SSD那样人工设定,在yolo_v2和yolo_v3中,都采用了对图像中的object采用k-means聚类。在yolo_v3中作者是这样描述的:We still use k-means clustering to determine our bounding box priors. We just sort of chose 9 clusters and 3 scales arbitrarily and then divide up the clusters evenly across scales. On the COCO dataset the 9 clusters were:(10,13); (16,30); (33,23); (30,61); (62,45); (59,119); (116 ,90); (156 ,198); (373 ,326). 这个地方,作者有一个地方没有说清楚,这个框的大小是在什么输入大小的图像下确定的,比如你在608*608作为输入图像中object的大小和在320*320大小图像中的object大小肯定不同,对这两种输入聚类的结果肯定不同。但查看作者提供的yolo_v3网络配置文件,这个聚类结果应该是在416*416大小的图像下聚类得到的结果

                                图四  Yolo_v3部分网络配置文件

c. feature map中的每一个cell都会预测3个边界框(bounding box) ,每个bounding 
box都会预测三个东西:(1)每个框的位置(4个值,中心坐标tx和ty,,框的高度bh和宽度bw),(2)一个objectness prediction ,(3)N个类别,coco数据集80类,voc20类。因此对于coco数据集,在网络输入为416*416时,网络的输出大小为13*13(3*(4+1+80))=43095

                           图五   bounding box

对于上图的几点说明:

中心坐标(tx和ty)

Yolo_v3使用 sigmoid 函数进行中心坐标预测。这使得输出值在 0 和 1 之间。正常

情况下,YOLO 不会预测边界框中心的确切坐标。它预测的是:与预测目标的网格单元左上角相关的偏移;并且使用feature map中的cell大小进行归一化。

当输入图像为416*416,如果中心的预测是 (0.4, 0.7),则第二个cell在 13 x 13 特征图上的相对坐标是 (1.4, 1.7),具体的位置x坐标还需要1.4乘以cell的宽,y坐标为1.7乘以cell的高。

Bounding box的宽度bw和高度bh

Yolo_v3得出的预测 bw 和bh 使用图像的高和宽进行归一化,框的预测 bx 和 by 是 (0.3, 0.8),那么 13 x 13 特征图的实际宽和高是 (13 x 0.3, 13 x 0.8)。

d. 三次检测,每次对应的感受野不同,32倍降采样的感受野最大,适合检测大的

目标,所以在输入为416*416时,每个cell的三个anchor box为(116 ,90); (156 ,198); (373 ,326)。16倍适合一般大小的物体,anchor box为(30,61); (62,45); (59,119)。8倍的感受野最小,适合检测小目标,因此anchor box为(10,13); (16,30); (33,23)。所以当输入为416*416时,实际总共有(52*52+26*26+13*13)*3=10647个proposal box。

                                              图六 打印出10647个proposal box

  • 51
    点赞
  • 389
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
### 回答1: yolo v3 pytorch版源码解读是指对yolo v3算法在pytorch框架下的实现进行解析和说明。该算法是一种目标检测算法,可以在图像中检测出物体的位置和类别。在pytorch框架下,该算法的实现主要包括网络结构的搭建、数据预处理、训练和测试等步骤。通过对源码的解读,可以深入理解yolo v3算法的原理和实现细节,从而更好地应用该算法解决实际问题。 ### 回答2: YOLO (You Only Look Once)是一种基于卷积神经网络的目标检测算法,具有实时性和高准确率等优点。而YOLO v3则是YOLO系列最新版本,其采用了一系列改进措施来提升检测性能,如采用多尺度特征图、SPP结构和残差连接等。此外,由于PyTorch成为了深度学习领域流行的开源框架,因此许多研究者也将YOLO v3的代码移植到了PyTorch实现。 YOLO v3 PyTorch版源码在实现上比较复杂,需要结合相关论文和理论知识进行理解。其主要包括以下几个部分: 1.网络结构:YOLO v3采用了Darknet-53作为特征提取层,并将输入图像分别缩放到三个尺度,然后对不同尺度的特征图进行检测。 2.特征图处理:在进行检测前,需要对特征图进行处理,主要包括三个方面。第一,对于不同尺度的特征图需要分别调整每个锚点框的大小和形状。第二,为了提高检测质量,需要引入SPP结构(Spatial Pyramid Pooling),该结构能够获取不同大小的感受野。第三,引入残差连接(Residual Connection),可以在网络中学习更加精细的特征。 3.检测流程:YOLO v3采用的是Multi-scale Training的训练方式,即在多个不同尺度下分别训练,并且将在不同尺度下的检测结果进行融合。对于每个尺度分别计算每个位置预测框的置信度、类别得分和框的坐标信息。然后通过非极大抑制算法,去除重复检测的框,并提取概率最高的框作为最终检测结果。 总的来说,YOLO v3 PyTorch版源码实现较为复杂,需要对目标检测算法、卷积神经网络、图像处理等技术领域有深入的理解。对于初学者来说,可以先从代码的框架结构入手,逐步了解各个模块的作用和实现细节。而要深入理解YOLO v3原理和算法,还需要结合相关论文和多方面的参考资料进行学习。 ### 回答3: YOLOv3是目前最快的目标检测算法之一,它采用了纯卷积的方式实现,并且其结果也非常准确。在目标检测中,YOLOv3是一个非常重要的算法,因此了解其源码非常有必要。下面将就yolo v3 pytorch版源码解读做一些简要分析。 首先,需要了解的是,YOLOv3主要分为三个部分:输入预处理、特征提取和后处理。输入预处理是将原图像扩展为模型输入的固定尺寸。在特征提取阶段,YOLOv3采用的是多尺度特征融合的方法,通过不同的尺度获得不同的特征图。在后处理阶段,YOLOv3对特征图进行预测,通过置信度评分、NMS和筛选等操作输出最终的检测结果。 其次,需要注意的是,YOLOv3使用的是Darknet53作为基础网络,该网络由很多卷积层、max-pooling层、residual层等组成。在网络最后一层,将会有三个不同大小的盒子来检测不同大小的目标,每个盒子会预测3个不同的类别,总共预测9个类别。对于每个目标,预测将会包括坐标、置信度、类别等信息。在训练过程中,对于每个目标,YOLOv3会使用交叉熵损失函数来计算误差,然后进行反向传播。 最后,需要提到的是,YOLOv3源码的实现非常复杂,需要熟悉深度学习、神经网络等相关领域才能理解。同时,在实际使用中,需要根据自己的需求进行修改和优化,以达到最佳检测效果。当然,在理解源码的过程中,最重要的还是深入理解YOLOv3的算法原理和各个模块之间的关系,这样才能更好地掌握该算法及其实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值