yolo系列值yolov2

https://blog.csdn.net/weixin_41630455/article/details/117408955这里我整理的yolov1的一些知识点。

https://zhuanlan.zhihu.com/p/35325884 在听完老师讲课心里还有疑惑的地方,也参考了这篇文章做了解答。

yolov2相对于yolov1 做了哪些改动呢?其实从设计上简单来说做了两点改动

  1. 多尺度提取特征(与ssd的设计有点类似,不光计算了深层的特征,同时也结合了浅层的特征)
  2. 预测偏移量(借鉴了fasterrcnn的思想,现有一个认为设定的锚点,然后学习到偏移量数值。)

和训练yolov1一样我们先拿一个与训练好的分类模型作为backbone。yolov2作者自己构造了一个darknet19的网络并且对darkenet19进行了训练。darnet19没有全链接层,所以我们可以输入任意大小的图片进行分类处理。以下是具体步骤

  1. 在imagenet上(224*224)训练120个epochs
  2. 在将样本图片resize成为448*448训练10个epoch
  3. 将原来darnet19分类模型后面的global avgpooling和softmax分类头去掉,换成卷积层。并且使用passthrugh的做法将浅层信息concat过来,然后在进行conv,最后用一个1*1的conv将维度调成我们想要的channel数

passthrough是如何实现的。如上图所示,将26*26*256的特征图每2*2个格子作为一组,分别取左上、右上、左下、右下的特征值,得到4个13*13*256的特征图,将这四个特征图进行concat操作得到13*13*1024的特征图和我们深层13*13*1024的特征图进行元素相加(也有解释说是concat,我们先认为是相加好了,反正这两种都是可以训练的)然后在进行1*1的卷积进行降维降低到我们期望的维度。

那么我们降低到多少维呢,这个和我们预备的一个cell所对应的anchor数量以及我们检测的类别数量是相关的。channel数量=num_anchors*(5+num_classes)。里面的num_classes和yolov1一样还是onehot,里面的5是指confidence、tx,ty,tw,th。然后我们预测的边界框的实际位置和大小为:

这里的cx,cy的大小其实就是cell的左上角的坐标。我们一张图有W*H个cell。一个cell作为一个单位量级。这里bx,by使用sigma函数进行了约束保证坐标中心点必然落在这个cell里面,不会落到其他的cell中去。如果我们把单张图片看成尺寸为1*1,也就是yolov1中的归一化。我们如下操作

bx,by,bw,bh就能和我们v1的操作对应上了。最后如果我们想得到预测的结果只要将bx,by,bw,bh的值乘以原图的w,h的值就能够得到实际框的坐标信息了。

yolov2还有一个难点是关于loss函数应该如何构造的。

这里的W,H,指定的是宽方向有一个cell高方向有几个cell。W*H就是总共有几个cell。A是指先验框的数量。

  1. 我们首先看第一行是关于背景的预测loss,我们算下来预测的框和所有groundtruth的最大iou大小小于thresh值的话,我们认为这是背景,括号里面是预测出来为物体的confidence值。进行开方构成背景的损失
  2. 第二项主要是将预测的形状和与设定的先验框的形状形成误差。(我认为这里虽然写了r属于x,y,w,h但是实际上更偏向计算了预测框与对应的anchor框的w,h之间的差距,因为预测框本来就是从anchor出发计算偏移的。将预测框与anchor框的误差变小意义不是很大)。这里做的目的是为了在前12800个iter的计算中让预测框能够接近anchor框的形状大小。据说能够起到加速训练的作用。(yolov1里面是没有这一步的)
  3. 第三大项,也就是计算与对应cell的对应anchor所负责的groundtruth之间的坐标形状误差、置信度误差、类别误差。先说以下匹配规则。对于某个groundtruth我们首先确定中心点落在哪个cell里面,然后我们要确定对应的那个cell是由哪个anchor尺度来负责预测。我们的方法是计算这个cell中的五个anchor与groundtruth的iou值,这一步计算iou的时候是不考虑中心点位置的,我们将中心点挪动到同一位置计算iou(我认为这是为了找到形状最接近的anchor),找到iou最大的那个anchor后,我们就认为这个anchor负责预测这个groundtruth。另外注意在计算confidence误差的时候,这里采用了1*iou的方法,而不是直接想yolov1一样把对应的c设置成1。最后我们把没有匹配到groundtruth以及没有负责背景框损失计算的(就是第一行关于背景预测loss的)全部忽略掉,不记入损失函数计算。下面我插了一个yolov1的损失函数,大家可以对照yolov2的损失函数看下,他们有比较多相似的地方。

另外yolov2和yolov1一样每个loss根据其特性赋予了他们各自的权重。

接下来做个总结:

  1. yolov2在比yolov1加入了batchnorm层。这一点借鉴了goolenet,达到了训练加速的目的
  2. 训练backbone的时候先用224尺寸然后在用448的尺寸进行了训练
  3. 与yolov1相比yolov2借鉴了anchorbox的思想模型得到的参数是偏差值,而不是直接得到位置信息
  4. 训练的时候,前12800步将预测框对应anchor框的差值也记入了误差。我认为这一步实际上是将yolov2模型输出的tx,ty,tw,th尽量接近于0起到加速的作用。12800步后就不能有这一项损失了。如果还有的话我们那就反而起到反作用了
  5. 安装vgg的思路设计了更加符合我们需求的darknet19
  6. 使用了passthrogh方法将浅层和深层进行了concat
  7. 不同的epoche训练图片的大小也进行了多样化。做到了全方位多尺度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值