pytorch yolov3 知乎学习总结 03节
https://zhuanlan.zhihu.com/p/36984201
今天还是半摸鱼状态完成了知乎的yolov3第三小节内容,该节内容主要实现了网络的前向传播功能
不过必须得提一嘴,我做到现在才发现这个教程只有预测过程,没有训练内容,后期还是得通过bubble 那个教程弥补一下训练的操作
突破如下
- 昨天卡在了检测框bbox attr方面,今天算是搞懂了一些。首先使用了 5+80 个类,5里面包含了x,y,w,h,p_c(均为bbox的相关属性),使用了一个函数,将其转为如下的形式:这样转换的好处是向量化操作(可以理解为将二维图片拍成了一维,实际上是[batch, bbox_attr*num_anchors, grid_size**2] 变 [batch, units, classes])
batch_size为批数量(几个图片的意思),bbox_attrs边界框的属性个数(5+类别总数),num_anchors(锚的数量),grid_size(卷积采样后的单元数量,yolo有三个尺寸,在其上面进行预测)
不过这个anchors不知道谁起的名字,我一直理解为锚点(检测框对应的那个网格交界点xy位置),写到代码后面才发现,这实际是个比例数值,对应着高度和宽度的比例,非常迷惑
上面这个乘法*就说明了这个比例的操作
正如吴恩达老师所说加快运算,省去了不必要的for循环开销;当然各个属性也通过sigmoid函数进行了变换,所以值都集中在[0, 1]之间,这一点也引出了后面的网格偏移问题
-
网格偏移:这个也花了我好久去理解,太难了,参考文章:https://zhuanlan.zhihu.com/p/106769205, https://www.cnblogs.com/miaozhijuan/p/12501479.html
通过这两个图进行理解,因为预测的点位于网格的交界处,值为0~1,计算所代表的偏移量也是基于这个网格交点,而yolov3网络通过左上角的点对其右下角的网格进行预测,比如yolov3就分割了13*13, 52*52共三种size,这也就解释了中心点实际代表的含义位于网格的中心,而非网格线上,需要利用+xy_offset进行偏移处理
-
再就是加载权重文件,权重文件应该就是模型训练好的参数(回头需要验证一下——确实是训练好的参数,属于yolo特供),文章说只有conv和标准批处理有weights,对于weights感觉是卷积核的参数?详细也没有去探索
明天继续探索第四节的代码内容