yolov3项目完整的代码_tensorflow版本YunYang1994
关于损失函数的理解可以先参考:这篇博客
但是一直有一种没有搞懂一个问题,yolov3输出三个分支13;26;52;每一个分支都会有自己格式的格子,那么到底哪个anchor负责哪个目标呢?也就是哪个分支网格anchor负责去检测哪个目标?
根据代码我的理解是:假设一个图中有一个目标(比较容易理解),这个被分割成三种格子的形式,分割成 13 ∗ 13 13*13 13∗13; 26 ∗ 26 26*26 26∗26; 52 ∗ 52 52*52 52∗52。
-
这个目标中心坐标下采样8倍,(416/8=52),会落在 52 ∗ 52 52*52 52∗52 这个分支的所有格子中的某一个格子,落在的格子会产生3个anchor,3个anchor和目标(已经下采样8倍的目标框)分别计算iou,得到三个iou,凡是iou大于阈值0.3的,就记为正样本,就会将label[0]中这个iou大于0.3的anchor的相应位置 赋上真实框的值。
-
这个目标中心坐标下采样16倍,(416/16=26),会落在 26 ∗ 26 26*26 26∗26 这个分支的所有格子中的某一个格子,落在的格子会产生3个anchor,3个anchor和目标(已经下采样16倍的目标框)分别计算iou,得到三个iou,凡是iou大于阈值0.3的,就记为正样本,就会将label[1]中这个iou大于0.3的anchor的相应位置 赋上真实框的值。
-
这个目标中心坐标下采样32倍,(416/32=13),会落在 13 ∗ 13 13*13 13∗13 这个分支的所有格子中的某一个格子,落在的格子会产生3个anchor,3个anchor和目标(已经下采样32倍的目标框)分别计算iou,得到三个iou,凡是iou大于阈值0.3的,就记为正样本,就会将label[2]中这个iou大于0.3的anchor的相应位置 赋上真实框的值。
-
如果目标所有的anchor,9个anchor,iou全部小于阈值0.3,那么选择9个anchor中和下采样后的目标框iou最大的,作为正样本,将目标真实值赋值给相应的anchor的位置。
总的来说!!!
就是将目标先进行三种下采样,分别和目标落在的网格产生的 9个anchor分别计算iou,大于阈值0.3的记为正样本。如果9个iou全部小于0.3,那么和目标iou最大的记为正样本。对于正样本,我们在label上 相对应的anchor位置上,赋上真实目标的值。
代码简单理解:
for bbox in bboxes:
一张图上可能有多个目标,这个循环表示一个目标一个目标处理:
bbox传来的是xmin,ymin,xmax,ymax(416*416),先转变为bbox_xywh:x,y,w,h
将416图上的目标,进行三种(8,16,32)下采样得到:bbox_xywh_scaled
for i in range(3):三种下采样,一种一种处理
i=0:52*52:找到目标中心下采样以后,落在哪个格子上,
这个格子有3个anchor,计算3个anchor和下采样以后的目标框的iou记为iou_scale。
iou_scale大于阈值0.3的记为正样本,将label[0]中正样本对应的anchor位置赋值真实目标的坐标bbox_xywh。
并将iou