YOLO-V2 输入和输出数据的编码和解码

Yolo v2是怎么处理数据的呢?输入数据是什么样子,输入数据怎么编码,输出数据是什么样子,输出数据怎么解码,网上很多帖子都是讲解yolo的原理,但是这些只能通过代码来理解,这里做一下总结
根据参考yolov2 keras 实现,作者是用的低版本的tensorflow,然后我用的版本是tensorflow2.2,因此对代码做了轻微的改动

输入数据格式

相比较yolov1,yolov2的输入标签有些复杂,主要是加入了anchor boxes的原因,yolov2在每一个单元格中添加了5个anchor box,那么每一个单元格就可以表示5个目标,这就解决了目标重叠的场景,yolov2的坐标表示还跟v1一样,使用相对单元格坐标,在这里插入图片描述
如上图,bx和by是目标中心点相对与13*13的单元格的相对坐标,单元格索引(Cx)+偏移量sigmoid(tx), bw和bh也是相对与单元格的相对值,这里pw和ph不是像素值,也是相对值,因为v2的输入图片是416*416,32倍下采样,因此anchors的尺寸范围就是[0, 13],这个在v3里面改成了真实的像素值。
因此对于单个box的数据格式就是[tx, ty, tw, th],tx, ty我们可以暂时理解为单元格内的偏移值, tw, th为相对于13*13的宽高

输入数据编码

那么怎么将一张图片得到输入编码呢,首先我们假设原始图片尺寸为(500, 600),500表示有500行像素表示高度,600表示有600列像素表示宽度

  1. 首先根据标注软件得到目标方框的左上角坐标(x1, y1)和右下角坐标(x2, y2),我们举例子为(50, 100), (250, 300)
  2. 计算中心点坐标和宽高值,计算后是真实像素值
    x_c = (x1+x2)/2 = (50+250)/2 = 150;
    y_c=(y1+y2)/2 = (100+300)/2=200;
    w = x2-x1 = 250-50 = 200
    h = y2-y1 = 300-100 = 200
  3. 计算中心点坐标和宽高相对于原图尺寸的相对值
    x_c = x_c / 600 = 150/600 = 0.25
    y_c= y_c / 500 = 200/500 = 0.4
    w = w / 600 = 200/600 = 0.33
    h = h / 500 = 200/500 = 0.4
  4. 求中心点相对于单元格索引 和偏移量
    [x_c, y_c, w, h] * [13, 13, 13, 13] --> [0.25, 0.4, 0.33, 0.4] * [13, 13, 13, 13] = [3.25, 5.2, 4.29, 5.2]
    i = 3 # 3.25取整数 单元格x索引
    j = 5 # 5.2取整数 单元格y索引
    x = 0.25 # 3.25取小数
    y = 0.2 # 5.2取小数
  5. 求相对于单元格的w和h anchor表示在5个anchors中和我们标注的box的iou最接近的anchor,这里我们假设取第五个,log的原因就是在计算模型输出的时候要对w和h进行一个指数运算,除以anchor是因为我们在计算输出的时候要乘以anchors
    w = log(w/anchors.w) = log(3.25/9.77052) = -0.478
    h = log(h/anchors.h) = log(5.2/9.16828) = -0.246

这样一个box的计算就完成了 输入数据就是(0.25, 0.2, -0.478, -0.246)

输出数据格式

yolov2的输出是一个13*13*125的一个张量

xywhcP(class)

其中x,y表示中心点偏移,y是, w,h是相对宽高,c是置信度,P(class)是20个分类概率,然后这个表格重复5次就是125
在这里插入图片描述

输出数据解码

有了训练的时候的训练标签,模型就会根据这个标签来评定模型训练的预测结果,那么模型的输出是什么样子的呢,其实就是上面的那个长方体,我们就拿出一个单元格中的一个anchor来说明怎么将预测解码为实际的box,yolov2论文里面给出的计算公式如下图,我们训练的模型预测的就是(tx, ty, tw, th),其中sigmoid(tx), 和sigmoid(ty),bw和bh就是相对于13*13的目标长宽。我觉得这部分看代码更清晰一些,我将代码加上注释上传到github
码云
在这里插入图片描述

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值