使用更大分辨率

YOLO-V2-更大的分辨率,V1时用的是224*224,测试时使用448*448,测试的时候用的分辨率一般比较大,因为训练的时候使用224*224,测试的时候使448*448可能导致模型水土不服,所以V2训练时额外又进行了10次448*448的微调,使用高分辨率分类器后,YOLO2的map提升了四个百分点

YOLOV2-网络结构

新的网络结构DarkNet(借鉴了VGG和RESNET网络的思想),实际输入为416*416,没有FC层,所有的层都是卷积操作,这里第一点好处全连接层容易过拟合,第二点全连接层训练比较慢。做了5次降采样操作(13*13)做maxpool后结果都变成了原来的1/2。做五次降采样结果就是原来大小除32(2的五次方)。输入的数据一定要能被32整除,整除后的数我们一般希望是个奇数。注意这里最终输出的是13*13的大小,而yolov1最好输出的7*7,这里的网格大小比yolov1大也就能捕捉到更多的东西。所有的卷积大小只有两种,一种是3*3,一种是1*1,这种网络结构是借鉴了vgg的思想,vgg的网络中当我们用比较小的卷积核做卷积的时候,一方面使我们参数比较省,一方面使我们感受野比较大,这样训练出的模型比较好。darknet又叫darknet19,这里就是说这里又19个卷积层。中间还有1*1的卷积核,这里只改变了网络的特征图个数,而没有改变其他大小。一般来说darknet越深map值也会越高但是速度也会越慢。

将yolov10 pt模型转为Opencv可用模型_深度学习

聚类提取先验框

v1中也有先验框,比如在7*7的格子里,每个格子有两种先验框,然后基于这两种先验框去做微调做回归,这是在v1里。两种先验框比较少,faster-rcnn有9种先验框,faster-rcnn有一种问题,在不同的大小中做不同的比例,比如h和w的比例有1:1的,还有1:2的还有1:3 的。再稍微大小的分辨率P2里面框会更大点,但是比例不变,再更大点的分辨率P3,框还会更大但是比例还是不变。P1,P2,P3三种分辨率有九种大小不一但是比例都一样的框,这些比例不一定符合实际。yolov2中用聚类提先验框,比如在在一个真实数据集当中有很多数据, 先把所有的真实框标注在数据中假设有一百万个,然后把这些框做一个聚类,这里想提取出更适合的比例,假设这里K取5,这里会聚成五堆,每个堆都会有一个中心点,可以表示这堆大概的长宽是多少。这里就拿这五堆的长宽比当作我的先验框,这样会更符合实际值。

K-means聚类中的距离

d(box,centroids)=1-IOU(box,centroids)

正常的距离就是欧式距离,但是在先验框提取当中之间用欧式距离不太合适,在真实框中有的比较大有的比较小,如果都拿欧式距离来判断,那么比较大的框产生的欧式距离也会比较大,比较小的框欧式距离也会比较小,这样不公平。这里用IOU作为度量,我想算每个点到中心距离,中心有个长和宽的大小,点是样本数据,这里算这个到中心距离的IOU,离得越近IOU越大,d越小接近0,离得越远IOU越小,d越大接近1。

下面这张图x是K的个数,y轴是平均的IOU值,分类越多越精确。当K等于5是一个折中值。

将yolov10 pt模型转为Opencv可用模型_偏移量_02

YOLO-V2-Anchor Box

提了先验框之后有点小问题,加了先验框map值没有什么变化,候选框多了但是不一定候选框都能做的好。recall表示查全率,recall高表示之前没有检测到的点现在检测到了,下图查全率提升了七个点。

将yolov10 pt模型转为Opencv可用模型_卷积_03

YOLO-V2-Directed Location Prediction

拿到先验框之后我们需要预测真实物体的大小,真实物体大小的框一般与预测框不一样,所以需要调整

若中心点(xp,yp);宽和高为(wp,hp),则:x = xp + wp * tx y = yp + hp * ty x,y就是假设偏移量后的结果。tx = -1,则框在x轴反向左移动wp;tx = 1,则框在x轴方向向右移动wp。这里会出现一个问题,在模型一开始训练的时候,所有的参数都是随机初始化的。模型不稳定,这样会导致收敛问题。比如一开始的时候偏移量过大会导致预测的框超出边界。yolov2中没有直接使用偏移量,而是选择相对grid cell的偏移量

下图所示,Pw,Ph是我当前的一个先验框,tx, ty, tw, th 是我的一个预测值。这里的tx, ty是相当于当前中心点左上方点的一个偏移量,这个偏移量是在0和1之间的,也就是说不管怎么偏移它都是在当前这个格子里不会出去。加上Cx, Cy是因为要加上它相对于网格的位置值,也就是相对于整个大的网格的坐标。

tw和th取e的次幂是因为,在预测的时候取了对数,所以这里要还原回去。

例如
(tx, ty, tw, th) = (0.2, 0.1, 0.2, 0.32) 
anchor框为pw = 3.19275,ph=4.00944

在特征图的位置:

bx = 0.2 + 1 = 1.2
by = 0.1 + 1 = 1.1
bw = 3.19275 * pow(e, 0.2)
bh = 4.00944 * pow(e, 0.32)

在原位置:

bx = 1.2 * 32 = 38.4
by = 1.1 * 32 = 35.2
bw = 3.89963 * 32 = 124.78
bh = 5.52151 * 32 = 176.68

乘32是因为特征图是按照原图等比例缩放的结果,这里也要等比例还原回去

将yolov10 pt模型转为Opencv可用模型_卷积核_04

感受野的作用

随着一层层卷积,感受野会越来越大,越大的感受野越能考虑全局,看到的东西越多。

如果堆叠3个3 * 3的卷积层,并且保持滑动窗口步长为1.其感受野就是7 * 7的,这跟使用一个7 * 7的卷积核结果是一样的,那么为什么非要堆叠3个小卷积核呢?

假设输入大小都是h*w*c,并且都使用c个卷积核(得到c个特征图),可以来计算一下其各自所需参数;

1个7*7卷积核所需参数:C*(7*7*C) = 49C*C 3个3*3卷积核所需要参数:3*C*(3*3*C) = 27C*C

很明显,堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随之增多,还不会增大权重参数个数,这就是VGG网络的基本出发点**,用越小的卷积核来完成提取特征的操作。**

特征融合改进

最后一层感受野太大,小目标可能会丢失,需要融合之前的特征
越大的感受野适合捕捉比较大的物体,但是实际当中还有小物体,如果只考虑最后一层特征图就会导致小物体丢失

过程如下,可以把前面的特征图拆分成和后面特征图大小相同然后和后面的特征相加

将yolov10 pt模型转为Opencv可用模型_卷积核_05

YOLO-V2-Multi-Scale

每经过一次迭代之后改变输入大小,让这个网络有一个适应能力,可以在小分辨的图片中和大分辨率的图片中都能检测到,最小的图像尺寸为320*320,最大的图像尺寸为608*608,都是32的倍数。

总结

总结如下所示

将yolov10 pt模型转为Opencv可用模型_偏移量_06