title : 目标检测③基于深度学习的检测算法(续)
目标检测实验报告
检测所用软硬件+云服务器:
硬件:macOS或者windows电脑
软件:pycharm+生成的测试集
云服务器:滴滴云(https://www.didiyun.com/activity.html)输入博主的大师码:8996 ,只需⑨折,便不用体验搭环境的痛苦,安心训练自己的模型
相比于之前的网络架构,Yolov3有两点提升:
1)残差结构
神经网络训练的过程就是调整参数的过程,可以调整的参数越多,意味着调整的自由度越大,从而逼近效果越好。因此层次越深,可以表示的特征抽象程度越高,可以做出很多只有人类才能做到的需要高度抽象理解能力的事情,在某些特定任务上“效果越好”。
然而随着网络深度增加,准确度增加,神经网络会产生梯度消失/梯度爆炸的问题。
梯度消失/梯度爆炸指本质上因为梯度反向传播中的连乘效应,造成网络权值更新不稳定,从而使此深层网络的学习几乎等价于只有后几层的浅层网络的学习了,造成网络退化问题。
Darknet的残差结构(在resnet论文提出的概念)解决了这个问题
在上图的残差网络结构图中,通过 “shortcut connections (捷径连接)” 的方式,直接把输入 x 传到输出作为初始结果,输出结果为 H(x)=F(x)+x,当 F(x)=0 时,那么 H(x)=x,也就是上面所提到的恒等映射。于是,残差结构相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X) 和 x 的差值,也就是所谓的残差 F(x) = H(x)-x,因此,后面的训练目标就是要将残差结果逼近于 0,使到随着网络加深,准确率不下降。
resnet论文:https://arxiv.org/pdf/1512.03385v1.pdf
《Deep Residual Learning》——何恺明2016cvpr
feature map 通过 Residual 残差模块前后其 shape 不变。并且,在输入的参数中,要保证 input_channel = filter_num2,否则相加的操作会因为 shape 不同而无法进行。
2)多尺度预测
同时,yolov3也在多尺度预测上做出改进(类似于FPN)
多尺度预测实现了从基础网络输出多个不同尺度作为输入,解决图像中待检测物体大小不同的问题。
利用网络对物体进行检测时,浅层网络分辨率高,学到的是图片的细节特征,深层网络,分辨率低,学到的更多的是语义特征,如报告2、3、2提到。
因此我们选择利用图像的各个尺度进行训练和测试。可以通过缩放图片提取多组特征图预测,但是想必这样及其消耗时间——因此直接使用卷积网络中产生的各层特征图分别进行预测
《Feature Pyramid Networks for Object Detection》——2017CVPR
如上页图Darknet53,以scale2为例,从尺度1中的倒数第二层的卷积层上采样(× 2),再与最后一个 16 × 16 大小的特征图相加,再次通过多个卷积后输出box信息,相比尺度1变大两倍。
上采样的作用是在后面 YOLOv3 网络中进行相加操作时保证两个 feature map 的宽和高相同,其具体操作为:将输入的 feature map 的宽高都乘 2,得到新的 feature map。如下图代码
可以看到,route_1,route_2,input_data三个不同尺度的输出到后续网络
3.2.2输出定义
先来看yolov3的整体结构,随后具体介绍yolov3输出各个维度定义
在结构中,我们设置用的数据集类别为80种。
下图中左半部分虚线框内即为Darknet-53网络机构,可以看到该网络结构的输入为 416×416×3,之后通过一个3×3的卷积层来扩增通道数。接下来通过堆叠一系列Residual Block来构建网络,其具体个数为[1, 2, 8, 8, 4],最终主干网络输出大小为13×13、26×26、52×52三个大小的特征图,目的是可以检测到图像中更小的物体。特征图分割越密集,则每一个特征点相对于原图中的区域越小,从而可以监测到更小的物体。这部分即是上一节提到的“多分类预测”
网络结构的右半部分包括将主干网络Darknet-53的输出进行生成特征金字塔。具体做法为首先将13×13×1024的特征层进行上采样变为26×26×256,再与26×26×512的特征层进行堆叠,其结果为26×26×768大小的特征;同理,大小为52×52×256的特征层与下一层网络堆叠后的结果为52×52×384。
对于这三个堆叠后的结果,分别再进行5次卷积操作,最后接上一个3×3的卷积和1×1的卷积,用于输出预测结果,三个层对应的输出结果大小分别为13×13×255、26×26×255、52×52×255。
这里结合下图我们可以看到,前两个维度很明显代表了图像被分网格的行/列数,255是我们根据不同类型的数据集,在yolov3中得到的通道数channel
这里的每个输出的通道数都是 3x(80+5),这是因为 YOLOv3 设定的是每个网格单元预测3个检测框,而且每个检测框需要有 (x, y, w, h, confidence) 五个基本参数,然后还要有80个类别的概率。
其中255 = (4+1+80)×3,4表示一个边界框对应的调整参数x, y, w, h,1表示置信度,比如我们用COCO数据集,80表示COCO数据集分为80个类,3表示特征图上的每一个点对应有3个anchor。
代码中的predict_transform函数获取了前级的输入,并进行处理。
在class darknet()的yolo模块代码后部分,对于每个yolo层的输出先用predict_transform()变成每行为一个anchor对应的预测值的形式(不看batch_size这个维度,x剩下的维度可以看成一个二维tensor),这样3个yolo层的预测值按照每个方框对应的行的维度进行连接。得到了这张图处所有anchor的预测值,使后面的NMS等操作可以一次完成
这是由北工大模式识别二组共同创作!!!
转载请注明出处,谢谢!!
下一章(续2)会简单理解一下我最近研究损失函数所遇到的问题
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:模式识别课程:目标检测③基于深度学习的检测算法(续1) - Python技术站