【目标检测】(13) 先验框解码,调整预测框,附TensorFlow完整代码
各位同学好,今天和大家分享一下如何使用 TensorFlow 对 YOLOV3 和 YOLOV4 网络的输出特征进行解码,微调每个先验框的坐标和宽高,使其逼近真实标签框。
YOLOV3 和 YOLOV4 调整先验框的方法类似,代码通用。阅读本篇文章之前,建议先看以下文章
YOLOV2中的先验框:https://blog.csdn.net/dgvv4/article/details/123772756
YOLOV3特征提取网络:https://blog.csdn.net/dgvv4/article/details/121997986
YOLOV4特征提取网络:https://blog.csdn.net/dgvv4/article/details/123818580
1. 生成先验框
网络的三个有效输出特征层分别输出 52*52,26*26,13*13 的特征图。13*13的输出特征负责预测大尺度物体,26*26负责预测中等大小的物体,52*52负责预测小尺度物体。YOLOV3 有9个先验框,最大的三个先验框分配给了13*13的特征图,中等大小的三个先验框分配给了26*26的特征图,最小的三个先验框分配给了52*52的特征图。
如下图,以13*13的特征图为例。物体的中心点落在了红色网格中,那么就需要由这个红色网格生成的三个先验框中的一个去预测这个物体,由三个先验框中与物体真实框的 iou 最大的先验框去预测这个物体。
然而网络输出三种尺度 13*13、26*26、52*52 的特征图,物体的中心点肯定会落在三种尺度的网格中,那么该物体是由哪一种尺度的网格生成的先验框去预测的呢。是由9个先验框中,与真实标签框 iou 最大的那个先验框所在尺度的网格来预测。
2. 模型输出结果
网络的输入特征图的shape是 [416, 416, 3],经过一系列卷积层,输出三个尺度的特征结果,它们的shape分别是 [52, 52, (3*(5+num_classes))],[26, 26, (3*(5+num_classes))],[13, 13, (3*(5+num_classes))],。
其中通道数 3*(5+num_classes) 可以理解为:每个网格生成 3 个预测框,每个预测框包含了预测框相较于先验框的偏移量,坐标偏移量(tx, ty),宽高偏移量(tw, th),预测框中是否包含目标物体 c,预测框内的物体属于每个类别的条件概率num_classes,在VOC数据集中num_classes=20。其中 (tx, ty) 是负无穷到正无穷的任何数,(tw, th) 是归一化后的宽高。
3. 微调先验框
以某个网格的先验框的调整为例,如下图所示,虚线框代表:和物体的真实标签框 iou 值最大的那个先验框,该先验框的宽高为(pw, ph);蓝色框代表微调先验框后生成的预测框。
(cx,cy)是先验框中心点所在的网格的左上坐标(归一化后的坐标),由于坐标偏移量 (tx,ty) 可以是从负无穷到正无穷的任何数,为了防止坐标调整偏移过大,给偏移量添加sigmoid函数。将坐标偏移量限制在0-1之间,将预测框的中心点限制在它所在的网格内。高宽偏移量 (tw, th) 是归一化后的宽高调整值。最终预测框的宽高 (bw, bh)
4. 代码展示
从网络的输出特征中提取出预测框的中心点坐标,预测框的宽高,预测框的置信度,框内物体属于每个类别的条件概率。
import tensorflow as tf#(一)解码网络的输出层的信息
def anchors_decode(feats, anchors, num_classes):'''feats是某一个特征层的输出结果, 如shape=[b, 13, 13, 3*(5+num_classes)]anchors代表每个特征层, 每个网格的三个先验框[3,2]num_classes代表分类类别的数量'''# 计算每个网格几个先验框=3num_anchors = len(anchors)# 获得图像网格的宽和高的shape=[h,w]=[13,13]grid_shape = feats.shape[1:3]#(1)获得网格中每个网格点的坐标信息# 获得网格点的x坐标信息[1]==>[1,13,1,1]grid_x = tf.reshape(range(0, grid_shape[1]), shape=[1,-1,1,1])# 在y维度上扩张,将前面的数据进行复制然后直接接在原数据后面# [1,13,1,1]==>[13,13,3,1]grid_x = tf.tile(grid_x, [grid_shape[0], 1, num_anchors, 1])# 获得网格点的y坐标信息,方法同上[13]==>[13,1,1,1]grid_y = tf.reshape(range(0, grid_shape[0]), shape=[-1,1,1,1])# 维度扩张[13,1,1,1]==>[13,13,3,1]grid_y = tf.tile(grid_y, [1, grid_shape[1], num_anchors, 1])# 在通道维度上合并[13,13,3,2],每个网格的坐标信息, 横纵坐标都是0-12,grid = tf.concat([grid_x, grid_y], axis=-1)# 转换成tf.float32类型grid = tf.cast(grid, tf.float32)#(2)调整先验框的信息,13*13个网格,每个网格有3个先验框,每个先验框有(x,y)坐标# [3,2]==>[1,1,3,2]anchors_tensor = tf.reshape(anchors, shape=[1,1,num_anchors,2])# [1,1,3,2]==>[13,13,3,2]anchors_tensor = tf.tile(anchors_tensor, [grid_shape[0], grid_shape[1], 1, 1])# 转换成float32类型anchors_tensor = tf.cast(anchors_tensor, tf.float32)#(3)调整网络输出特征图的结果# [b, 13, 13, 3*(5+num_classes)] = [b, 13, 13, 3, (5+num_classes)]'''代表13*13个网格, 每个网格有3个先验框, 每个先验框有(5+num_classes)项信息其中, 5代表: 中心点坐标(x,y), 宽高(w,h), 置信度cnum_classes: 检测框属于某个类别的条件概率, VOC数据集中等于20'''feats = tf.reshape(feats, shape=[-1, grid_shape[0], grid_shape[1], num_anchors, 5+num_classes])#(4)调整先验框中心坐标及宽高# 对预测框中心点坐标归一化处理,只能在所处的网格中调整anchor_xy = tf.nn.sigmoid(feats[..., :2])box_xy = anchor_xy + grid # 每个网格的预测框坐标# 网格的预测框宽高默认是归一化之后的,对宽高取指数anchors_wh = tf.exp(feats[..., 2:4])box_wh = anchors_wh * anchors_tensor # 预测框的宽高# 获得预测框的置信度和每个类别的条件概率box_conf = tf.nn.sigmoid(feats[..., 4:5])box_prob = tf.nn.sigmoid(feats[..., 5:])# 返回预测框信息return box_xy, box_wh, box_conf, box_prob
随机生成一个13*13特征层的输出特征图,并给每个网格设置三种长宽比的先验框,来验证三个先验框微调的效果。
#(二)验证
if __name__ == '__main__':feat = tf.random.normal([4,13,13,75], mean=0, stddev=0.5) # 构建输出特征图anchors = tf.constant([[142, 110],[192, 243],[459, 401]]) # 每个网格的先验框坐标# 返回调整后的预测框信息box_xy, box_wh, box_conf, box_prob = anchors_decode(feat, anchors, 20)'''某个网格调整后的预测框宽高[[ 80.93765 , 106.666855],[ 119.06944 , 248.29587 ],[ 413.01917 , 339.91293 ]]'''
以某一个网格为例,将结果可视化出来。左图是最初的先验框,三个先验框的中心点在一起,右图是调整后的预测框,红色点是每个调整后的预测框的中心点。
【目标检测】(13) 先验框解码,调整预测框,附TensorFlow完整代码相关推荐
- 【目标检测】(9) 改进PANet特征提取金字塔,附Tensorflow完整代码
各位同学好,今天和大家分享一下如何使用 注意力机制 和 深度可分离卷积 优化 YOLOV4 的 PANet 特征金字塔.看本篇博客之前,建议大家先看以下几篇: YOLOV4主干网络:https://b ...
- 【目标检测】(10) Mosaic 数据增强方法,附Python完整代码
各位同学好,今天和大家分享一下目标检测算法中常用的图像数据增强方法 Mosaic.先放张图看效果.将四张图片缩放后裁剪拼接在一起,并调整检测框的坐标位置,处理位于图像边缘的检测框.文末有完整代码 1. ...
- 【数值预测案例】(6) LSTM、GRU 时间序列股票数据预测,附TensorFlow完整代码
大家好,今天和各位分享一下如何使用循环神经网络 LSTM 和 GRU 完成对股票数据的预测.GRU 是在 LSTM 基础上的简化,将 LSTM 内部的三个闸门简化成两个,往往 GRU 的计算效果会优于 ...
- 【数值预测案例】(7) CNN-LSTM 混合神经网络气温预测,附TensorFlow完整代码
大家好,今天和各位分享一下如何使用 Tensorflow 构建 CNN卷积神经网络和 LSTM 循环神经网络相结合的混合神经网络模型,完成对多特征的时间序列预测. 本文预测模型的主要结构由 CNN 和 ...
- 【数值预测案例】(5) LSTM 时间序列气温数据预测,附TensorFlow完整代码
大家好,今天和各位分享一下如何使用循环神经网络 LSTM 完成有多个特征的气温预测.上一节中我介绍了 LSTM 的单个特征的预测,感兴趣的可以看一下:https://blog.csdn.net/dgv ...
- 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集
各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...
- 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集
各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...
- 【目标检测】(15) YOLOV4 损失函数,附TensorFlow完整代码
大家好,今天和各位分享一下 YOLOV4 的损失函数的构建方法,YOLOV4和损失函数的组成和YOLOV3类似,只是YOLOV4使用了CIOU损失作为目标边界框的定位损失.强烈建议大家在阅读本文之前, ...
- 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集
各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...
- 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集
各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...
最新文章
- Windows XP 源代码泄露,微软终于回应了~
- tensorflow之过拟合问题实战
- 如何在android的XML和java代码中引用字符串常量
- pythonpil模块安装_centos 安装python PIL模块
- oracle之单行函数之多表查询值之课后练习
- WinCE Boot方式及 Bootloader架构概述
- 分布式锁和mysql事物扣库存_浅谈库存扣减和锁
- SAP License:SAP ECC6安装系列三:关于SAP你也许想知道的一些事
- jboss7.1.0配置数据库(mysql)
- jquery自定义动画animate方法
- 微信小程序图片上传uploadfile失败
- 通过TCP/IP实现PC(客户端)远程控制开发板(服务器)上LED灯的实验
- ectouch——wap端商城の数据表字典
- 存档修改 html,制作可以修改.rpgsave存档的网页
- 如何选择频谱监测的天线?
- android 创建前台服务,Android前台服务保活
- 贪心算法题目 推销员
- 最佳搜索引擎蜘蛛工具
- 【jvm】jvm 参数设置查看与设置
- Ublox F9p接收机在Windows 的相关配置