没有合适的资源?快使用搜索试试~ 我知道了~
【AlexeyAB DarkNet框架解析】九,YOLOV3损失函数代码详解(yolo_layer.c)
5星 · 超过95%的资源 11 下载量 82 浏览量
2021-01-20
11:53:45
上传
评论
收藏 190KB PDF 举报
温馨提示
试读
9页
前言 前面已经讲完了YOLOV1/V2的损失函数代码解析,今天为大家带来YOLOv3的损失函数解析。YOLOV3的损失函数在YOLOV2的基础上,用多个独立的逻辑回归损失代替了YOLOV2里面的softmax损失,然后去掉了对Anchor在前12800次训练轮次中的回归损失,也即是YOLOV2损失函数的第二项。另外新增了一个ignore_thresh参数来忽略一些和GT box的IOU大于ignore_thresh的预测框的objectness损失。除了以上细节,其它部分和YOLOV2的处理类似。 AlexeyAB的一些更新 除了上面提到的相对于YOLOV2一些基础改动,AlexeyAB大神在
资源详情
资源评论
资源推荐
【【AlexeyAB DarkNet框架解析】九,框架解析】九,YOLOV3损失函数代码详解损失函数代码详解
(yolo_layer.c)
前言前言
前面已经讲完了YOLOV1/V2的损失函数代码解析,今天为大家带来YOLOv3的损失函数解析。YOLOV3的损失函数在YOLOV2的基础上,用多个
独立的逻辑回归损失代替了YOLOV2里面的softmax损失,然后去掉了对Anchor在前12800次训练轮次中的回归损失,也即是YOLOV2损失函数的
第二项。另外新增了一个ignore_thresh参数来忽略一些和GT box的IOU大于ignore_thresh的预测框的objectness损失。除了以上细节,其它部分和
YOLOV2的处理类似。
AlexeyAB的一些更新的一些更新
除了上面提到的相对于YOLOV2一些基础改动,AlexeyAB大神在目标框回归过程中新增了IOU/GIOU/DIOU/CIOU Loss,并且在分类过程中新增了
Focal Loss,方便大家在自己的数据集上进行试验,预祝涨点。
代码解析步骤代码解析步骤
[yolo]层层
YOLOV3使用[yolo] 层来计算损失函数以及预测分类和边界框回归,前面经过 darknet-53 的基础网络提取特征,又经过一些特征融合,就得到了3
个不同尺度的 yolo 层,分别预测大、中、小物体。主要代码在/src/yolo_layer.c。cfg文件的配置如下:
[yolo] mask = 0,1,2 #该层预测哪个规模的框,0,1,2表示预测小物体
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=80
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
make_yolo_layer 完成完成 yolo 层初始化操作层初始化操作
// 构造YOLOV3的yolo层
// batch 一个batch中包含图片的张数
// w 输入图片的宽度
// h 输入图片的高度
// n 一个cell预测多少个bbox
// total total Anchor bbox的数目
// mask 使用的是0,1,2 还是
// classes 网络需要识别的物体类别数
layer make_yolo_layer(int batch, int w, int h, int n, int total, int *mask, int classes, int max_boxes)
{
int i;
layer l = { (LAYER_TYPE)0 };
l.type = YOLO; //层类别
l.n = n; //一个cell预测多少个bbox
l.total = total; //anchors的数目,为9
l.batch = batch;// 一个batch包含图片的张数
l.h = h; // 输入图片的宽度
l.w = w; // 输入图片的高度
l.c = n*(classes + 4 + 1); // 输入图片的通道数, 3*(20 + 5)
l.out_w = l.w;// 输出图片的宽度
l.out_h = l.h;// 输出图片的高度
l.out_c = l.c;// 输出图片的通道数
l.classes = classes;//目标类别数
l.cost = (float*)xcalloc(1, sizeof(float)); //yolo层总的损失
l.biases = (float*)xcalloc(total * 2, sizeof(float)); //存储bbox的Anchor box的[w,h] if(mask) l.mask = mask; //yolov3有mask传入
else{
l.mask = (int*)xcalloc(n, sizeof(int));
for(i = 0; i < n; ++i){
l.mask[i] = i;
}
}
//存储bbox的Anchor box的[w,h]的更新值
l.bias_updates = (float*)xcalloc(n * 2, sizeof(float));
// 一张训练图片经过yolo层后得到的输出元素个数(等于网格数*每个网格预测的矩形框数*每个矩形框的参数个数)
l.outputs = h*w*n*(classes + 4 + 1);
//一张训练图片输入到yolo层的元素个数(注意是一张图片,对于yolo_layer,输入和输出的元素个数相等)
l.inputs = l.outputs;
//每张图片含有的真实矩形框参数的个数(max_boxes表示一张图片中最多有max_boxes个ground truth矩形框,每个真实矩形框有
//5个参数,包括x,y,w,h四个定位参数,以及物体类别),注意max_boxes是darknet程序内写死的,实际上每张图片可能
//并没有max_boxes个真实矩形框,也能没有这么多参数,但为了保持一致性,还是会留着这么大的存储空间,只是其中的
//值为空而已.
l.max_boxes = max_boxes;
// GT: max_boxes*(4+1) 存储max_boxes个bbox的信息,这里是假设图片中GT bbox的数量是
//小于max_boxes的,这里是写死的;此处与yolov1是不同的
l.truths = l.max_boxes*(4 + 1); // 90*(4 + 1);
// yolo层误差项(包含整个batch的)
l.delta = (float*)xcalloc(batch * l.outputs, sizeof(float));
//yolo层所有输出(包含整个batch的)
//yolo的输出维度是l.out_w*l.out_h,等于输出的维度,输出的通道数为l.out_c,也即是输入的通道数,具体为:n*(classes+coords+1)
//YOLO检测模型将图片分成S*S个网格,每个网格又预测B个矩形框,最后输出的就是这些网格中包含的所有矩形框的信息
weixin_38641561
- 粉丝: 5
- 资源: 943
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论6