4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
热卖商品
新闻详情
YOLO前向传播图解_mr_hua-CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-25
* 下面三层主循环的顺序 与最后一层输出的存储方式有关。外层循环遍历所有行 中层循环遍历所有列 这两层循环合在一起就是按行遍历 * region_layer输出中的每个网格 内层循环l.n表示的是每个grid cell中预测的box数目。首先要明白这一点 region_layer层的l.w,l.h * 就是指最后图片划分的网格 grid cell 数 也就是说最后一层输出的图片被划分成了l.w*l.h个网格 每个网格中预测l.n个矩形框 * box 每个矩形框就是一个潜在的物体 每个矩形框中包含了矩形框定位信息x,y,w,h 含有物体的自信度信息c 以及属于各类的概率 * 最终该网格挑出概率最大的作为该网格中含有的物体 当然最终还需要检测 如果其概率没有超过一定阈值 那么判定该网格中不含物体。 * 搞清楚这点之后 理解下面三层循环就容易一些了 外面两层循环是在遍历每一个网格 内层循环则遍历每个网格中预测的所有box。 * 除了这三层主循环之后 里面还有一个循环 循环次数固定为30次 这个循环是遍历一张训练图片中30个真实的矩形框 30是指定的一张训练 * 图片中最多能够拥有的真实矩形框个数 。知道了每一层在遍历什么 那么这整个4层循环合起来是用来干什么的呢 与紧跟着这4层循环之后 * 还有一个固定30次的循环在功能上有什么区别呢 此处这四层循环目的在于 for (j 0; j l.h; j) { for (i 0; i l.w; i) { for (n 0; n l.n; n) { /// 根据i,j,n计算该矩形框的索引 实际是矩形框中存储的x参数在l.output中的索引 矩形框中包含多个参数 x是其存储的首个参数 /// 所以也可以说是获取该矩形框的首地址。更为详细的注释 参考entry_index()的注释。 int box_index entry_index(l, b, n*l.w*l.h j*l.w i, 0); /// 根据矩形框的索引 获取矩形框的定位信息 box pred get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); /// 最高IoU 赋初值0 float best_iou 0; /// 为什么这里总是看到30 查看layer.h中关于max_boxes变量的注释就知道了 每张图片最多能够有30真实个框; /// 还要说明的一点是 此处所说最多处理30个矩形框 是指真实值中 一张图片含有的最大真实物体标签数 /// 也即真实的物体矩形框个数最大为30,并不是模型预测限制最多就30个 如上注释 一个图片如果分成7*7个网格 /// 每个网格预测两个矩形框 那就有98个了 所以不是指模型只能预测30个。模型你可以尽管预测多的矩形框 /// 只是我默认一张图片中最多就打了30个物体的标签 所以之后会有滤除过程。滤除过程有两层 首先第一层就是 /// 下面的for循环了 for(t 0; t 30; t){ /// 通过移位来获取每一个真实矩形框的信息 net.truth存储了网络吞入的所有图片的真实矩形框信息 一次吞入一个batch的训练图片 /// net.truth作为这一个大数组的首地址 l.truths参数是每一张图片含有的真实值参数个数 可参考layer.h中的truths参数中的注释 /// b是batch中已经处理完图片的图片的张数 5是每个真实矩形框需要5个参数值 也即每条矩形框真值有5个参数 t是本张图片已经处理 /// 过的矩形框的个数 每张图片最多处理30张图片 明白了上面的参数之后对于下面的移位获取对应矩形框真实值的代码就不难了。 box truth float_to_box(net.truth t*5 b*l.truths, 1); /// 这个if语句是用来判断一下是否有读到真实矩形框值 每个矩形框有5个参数,float_to_box只读取其中的4个定位参数 /// 只要验证x的值不为0,那肯定是4个参数值都读取到了 要么全部读取到了 要么一个也没有 另外 因为程序中写死了每张图片处理30个矩形框 /// 那么有些图片没有这么多矩形框 就会出现没有读到的情况。 if(!truth.x) break; /// 获取完真实标签矩形定位坐标后 与模型检测出的矩形框求IoU 具体参考box_iou()函数注释 float iou box_iou(pred, truth); /// 找出最大的IoU值 if (iou best_iou) { best_iou iou; /// 获取当前遍历矩形框含有物体的自信度信息c 该矩形框中的确存在物体的概率 在l.output中的索引值 int obj_index entry_index(l, b, n*l.w*l.h j*l.w i, 4); /// 叠加每个预测矩形框的自信度c 也即每个矩形框中含有物体的概率 // 有目标的概率 avg_anyobj l.output[obj_index]; //这里为tc输入的敏感度图计算,也是(标签-输出) l.delta[obj_index] l.noobject_scale * (0 - l.output[obj_index]); /// 上面30次循环使得本矩形框已经与训练图片中所有30个 30个只是最大值 可能没有这么多 真实矩形标签进行了对比 只要在这30个中 /// 找到一个真实矩形标签与该预测矩形框的iou大于指定的阈值 则判定该 if (best_iou l.thresh) { l.delta[obj_index] 0; // net.seen 已训练样本的个数,希望其具有稳定性,因为真实情况,不是每个grid cell都有标注, // 标注的,后面会重新计算delta,感觉像对所有的cell的delta初始化 if(*(net.seen) 12800){ box truth {0}; // 当前cell为中心对应的第n个anchor的box truth.x (i .5)/l.w;// cell的中点 // 对应tx 0.5 truth.y (j .5)/l.h;//ty 0.5 truth.w l.biases[2*n]/l.w;//相对于feature map的大小 // tw 0 truth.h l.biases[2*n 1]/l.h;//th 0 delta_region_box(truth, l.output, l.biases, n, box_index, i, j, l.w, l.h, l.delta, .01, l.w*l.h); for(t 0; t 30; t){ box truth float_to_box(net.truth t*5 b*l.truths, 1); if(!truth.x) break; float best_iou 0; int best_n 0; // 强制转化为最后的feature map的索引 i (truth.x * l.w); j (truth.y * l.h); //printf( %d %f %d %f\\n , i, truth.x*l.w, j, truth.y*l.h); box truth_shift truth; truth_shift.x 0; truth_shift.y 0; //printf( index %d %d\\n ,i, j); for(n 0; n l.n; n){ int box_index entry_index(l, b, n*l.w*l.h j*l.w i, 0); box pred get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); if(l.bias_match){ pred.w l.biases[2*n]/l.w; pred.h l.biases[2*n 1]/l.h; //printf( pred: (%f, %f) %f x %f\\n , pred.x, pred.y, pred.w, pred.h); pred.x 0; pred.y 0; float iou box_iou(pred, truth_shift); if (iou best_iou){ best_iou iou; // 最优iou对应的anchor索引 然后使用该anchor预测的predict box计算与真实box的误差 best_n //printf( %d %f (%f, %f) %f x %f\\n , best_n, best_iou, truth.x, truth.y, truth.w, truth.h); // 对应predict预测的confidence int box_index entry_index(l, b, best_n*l.w*l.h j*l.w i, 0); // 对所有标签,同个cell里,预测boc和标签的iou的最大值,这个函数也是计算(标签-输出)作为敏感度图 float iou delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); // 注意这里的关于box的损失权重 if(l.coords 4){// 不执行 int mask_index entry_index(l, b, best_n*l.w*l.h j*l.w i, 4); delta_region_mask(net.truth t*(l.coords 1) b*l.truths 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); if(iou .5) recall 1;// 如果iou 0.5, 认为找到该目标 召回数 1 avg_iou iou; //l.delta[best_index 4] iou - l.output[best_index 4]; int obj_index entry_index(l, b, best_n*l.w*l.h j*l.w i, 4); avg_obj l.output[obj_index]; //有目标时的损失,部分覆盖之前的无目标损失 l.delta[obj_index] l.object_scale * (1 - l.output[obj_index]); if (l.rescore) {//定义了rescore表示同时对confidence score进行回归 l.delta[obj_index] l.object_scale * (iou - l.output[obj_index]); if(l.background){//不执行 l.delta[obj_index] l.object_scale * (0 - l.output[obj_index]); int class net.truth[t*5 b*l.truths 4];// 真实类别 /// 参考layer.h中关于map的注释 将coco数据集的物体类别编号 变换至在联合9k数据集中的物体类别编号 /// 如果l.map不为NULL 说明使用了yolo9000检测模型 其他模型不用这个参数 没有联合多个数据集训练 /// 目前只有yolo9000.cfg中设置了map文件所在路径。 if (l.map) class l.map[class];//不执行 int class_index entry_index(l, b, best_n*l.w*l.h j*l.w i, 5);//预测的class向量首地址 delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, avg_cat); count; class_count; //printf( \\n *(l.cost) pow(mag_array(l.delta, l.outputs * l.batch), 2); printf( Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\\n , avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count);}

注:
1.这里的entry_index()主要是计算某个矩形框中某个参数在l.output中的索引

int entry_index(layer l, int batch, int location, int entry) int n location / (l.w*l.h); int loc location % (l.w*l.h); return batch*l.outputs n*l.w*l.h*(l.coords l.classes 1) entry*l.w*l.h loc;}

举个例子来说明l.output数据格式:
有输入和参数如图:
\"这里写图片描述\"

则数据分布如图:
注意这里预测框0尾部和预测框首部是接在一起的
\"这里写图片描述\"

反向传播分析见博客yolo反向传播源码分析

主要参考:
论文 - YOLO v3
yolo详细中文注释

本文链接: http://yoloes.immuno-online.com/view-751102.html

发布于 : 2021-03-25 阅读(0)
公司介绍
品牌分类
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616
官网:http://