Yolov2 训练时anchor是如何使用的?build_target
0.简略描述
- 1.将真值检测框变换到特征图尺度上
- 2.计算以特征图每个网格中心为中心点时所有锚框与真值检测框的交并比
- 3.取与真值检测框交并比最大的锚框的id,及真值检测框中心所在cell的id,有此,可将真值检测框与预测结果对应起来
- 4.计算位置回归损失,置信度损失,分类损失
1,网络的输出
图1
yolov2 网络对于检测框位置大小的输出是:
对于1个batch网络的输出的shape
为[batch_size, H*W*num_anchors, 5+num_classes]
, 其中:
- num_anchors:指1个点处的anchor数量
- H,W分别是卷积得到的feature map的高宽
- 5 + num_classes,分别指 txt_xtx、tyt_yty、tωt_\omegatω、tht_hth及检测框的评分
score
2.输出的处理
拿到网络的输出后,使用图1
中的公式计算得到σ(tx),σ(ty),etω,eth\sigma(t_x),\sigma(t_y),e^{t_\omega},e^{t_h}σ(tx),σ(ty),etω,eth,再分别得到feature_map尺度上的所有cx,cyc_x,c_ycx,cy,根据不同anchors
计算得每个预测点对应的检测框如下图:
裁切去超出的部分:
其中,pa11、pa21、pa31
即在2x2
的feature_map
上的中心点落在cell1
时对应的预测框,在本例中feature_map
的H、W
都为2
,每个cell
上分别有不同尺度的anchor
3个,由此可得1张图像上的检测框共有HxWxnum_anchors
个。
3.端到端训练loss的计算
同#1
,#2
中所讲,网络输出的shape
为[batch_size,H*W*num_anchors, 5+num_classes]
,输出的内容是tx,ty,tω,th,score,class_scoret_x,t_y,t_\omega,t_h,score,class\_scoretx,ty,tω,th,score,class_score, yolov2
的loss
函数有3
部分构成:
loss=losscoordination+lossconfidence+lossclassificationloss = loss_{coordination}+loss_{confidence}+loss_{classification}loss=losscoordination+lossconfidence+lossclassification
代码示例:
box_loss = 1 / b * cfg.coord_scale * F.mse_loss(delta_pred_batch * box_mask, box_target * box_mask, reduction='sum') / 2.0
iou_loss = 1 / b * F.mse_loss(conf_pred_batch * iou_mask, iou_target * iou_mask, reduction='sum') / 2.0
class_loss = 1 / b * cfg.class_scale * F.cross_entropy(class_score_batch_keep, class_target_keep, reduction='sum')
这里比较关键的一点,网络的输出是H*W*num_anchors
个预测结果,且预测的tx,ty,tω,tht_x,t_y,t_\omega,t_htx,ty,tω,th还只是预测框相对于anchor
锚框的的偏移量。检测训练数据中,标签文件是ground truth box
的中心点和宽高归一化后的坐标,且ground truth box(gt box)
的数量远小于预测数H*W*num_anchors
,如何将gtbox
与预测的结果对应起来呢?如上图,如何确定是cell1
中的pa11
负责预测图中的小人呢?这里有个anchor assignment
的过程,在yolo
源码中有一个函数build_target
正是处理gt box
与预测结果之间的对应。
其映射过程如下,首先将gt box
和anchor
都乘上[W,H]
变换到feature map
尺度上,计算可得gt box
与H*W*num_anchors
个anchor
锚框之间的IOU
,计算gt_box
与anchors
之间的IOU
时分别取特征图每个cell
的中心,得
overlaps = box_ious(all_anchors_xxyy, gt_boxes).view(-1, num_anchors, num_obj)
然后确定gt box
中心落在feature map
哪个cell
中,根据cxc_xcx,cyc_ycy可求得:
cell_idx_x, cell_idx_y = torch.floor(gt_box_xywh[:2])
据此求得gt box
的中心在哪个cell
,结合上面已求出的IOU
得到每个gt box
与该cell
中每个anchor
的IOU
,其最大者即负责预测当前gt_box
cell_id = cell_idx_x*W+cell_idx_y
overlaps_in_cell = overlaps[cell_id, :, t]
argmax_anchor_idx = torch.argmax(overlaps_in_cell)
上图中,gt_box
时检测小人的检测框,其中心落在cell1
中,且计算可知其与anchor
锚框ta11
的IOU
最大,故cell1
中的ta11
负责预测gt_box
。
找到gt box
对应的cell
和anchor
后可根据图1
反向计算得真值偏移量用以计算loss
,在shape
为[batch_size, H*W*num_anchors,5+num_class]
的预测中除cell_id,argmax_anchor_idx
对应的预测框外,其他对预测结果无用,边框回归和分类评估时都直接忽略(使用mask=0抑制),计算confidence
将其目标计为0
。
参考:
1.https://github.com/tztztztztz/yolov2.pytorch.git
Yolov2 训练时anchor是如何使用的?build_target相关推荐
- yolov2训练_一文看懂YOLO v2
我的CSDN博客:https://blog.csdn.net/litt1e 我的公众号:工科宅生活 概述 新的YOLO版本论文全名叫"YOLO9000: Better, Faster, St ...
- yolov2训练_YOLOv2 : YOLO9000:Better,Faster,Stronger解读
YOLOv2:YOLO9000:Better,Faster,Stronger解读,入门小白,若博文有不妥之处,望加以指点,笔者一定及时修正. ① 论文翻译 摘要 (emmmmmm......没啥重要的 ...
- EfficientDet训练数据集anchor设定教程101
EfficientDet训练数据集anchor设定教程101 本文由小肉包老师原创,转载请注明出处,来自腾讯.阿里等一线AI算法工程师组成的QQ交流群欢迎你的加入: 1037662480 上一篇文章我 ...
- 理解YOLOv2训练过程中输出参数含义
转载自https://blog.csdn.net/dcrmg/article/details/78565440 原英文地址: https://timebutt.github.io/static/und ...
- 深度学习——训练时碰到的超参数
深度学习--训练时碰到的超参数 文章目录 深度学习--训练时碰到的超参数 一.前言 二.一些常见的超参数 学习率(Learning rate) 迭代次数(iteration) batchsize e ...
- Dataset之图片数据增强:基于TF实现图片数据增强(原始的训练图片reshaped_image→数据增强→distorted_image(训练时直接使用))
Dataset之图片数据增强:基于TF实现图片数据增强(原始的训练图片reshaped_image→数据增强→distorted_image(训练时直接使用)) 目录 数据增强步骤 数据增强实现代码 ...
- tensorflow tf.train.Saver.restore() (用于下次训练时恢复模型)
# 保存当前的Session到文件目录tf.train.Saver().save(sess, 'net/my_net.ckpt') # 然后在下次训练时恢复模型: tf.train.Saver().r ...
- yolo配置文件以及训练时各参数的定义
引用文章:關於yolo配置文件以及训练时各参数的含义
- tensorflow 显存 训练_【他山之石】训练时显存优化技术——OP合并与gradient checkpoint...
作者:bindog 地址:http://bindog.github.io/ 01 背景 前几天看到知乎上的文章FLOPs与模型推理速度[1],文中提到一个比较耗时又占显存的pointwise操作x * ...
最新文章
- python turtle库画七彩蟒蛇_Python实现七彩蟒蛇绘制实例代码
- boost::hana::values用法的测试程序
- ASP.NET中高级程序员 面试题
- C和汇编混合编程--------函数调用后ebp、esp值问题
- 【干货】一张蓝图九大行动领域,实现AI赋能的企业转型-IBM.pdf(附下载链接)...
- 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
- 如何使用以太网将 Mac 接入互联网?
- 关于代码家(干货集中营)共享知识点汇总系列——休息娱乐
- c语言中立方和乘法怎么表示什么区别,C语言程式设计中的平方立方怎么表示
- Json与List、Map、entity的互相转化
- (三)Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
- 爱上python系列------python上下文管理器(二):对suppress进行装饰器重新实现
- 2019/9/6工学结合周记
- 玩转Kubernetes—尝试以不同方式初始化集群
- Android 安装自身更新APK时,包解析错误或无法访问文件的可能原因
- DFC开发平台的设计理念
- 如何优雅的面对一坨翔~~感悟编程代码
- 使用Frida进行IOS的抓包
- “no cuda-capable device is detected”问题解决方法
- WPF中使用Data Annotations验证Model
热门文章
- fail树(bzoj 3172: [Tjoi2013]单词)
- bzoj 1630 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(有重复元素的组合数)
- bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机(最小生成树)
- HDU 5978 2016ICPC大连 H: To begin or not to begin
- [Python / PyTorch] debug backward()
- [Python] 字典 items()方法:同时对字典的键和值进行遍历
- 安装自带python3.6的Anaconda3,并安装tensorflow,导入Pycharm中使用
- 使用TASM时报错extra characters on line的解决办法
- cad计算机制图论文,机械制图论文范文
- 代理对象之spring注解事务控制或shiro注解权限控制的理解