yolov3相关模块的解析与实现(二)

接上一篇

三、上采样函数

作用:用于将特征图扩展到想要的尺寸大小,和其他特征叠加到一起使用。
上采样的方法为近邻差值法

上采样函数的实现

# 定义上采样函数
def _upsample(inputs, out_shape):''':param inputs:  输入  类型tensor  形状 [batch, height_in, width_in, channels].:param out_shape: 调整后的tensor的形状 类型tensor out_shape = [batch, new_height, new_width,channels]:return: 返回一个 调整大小后的tensor'''# 由于上采样的填充方式不同,tf.image.resize_bilinear会对结果影响很大# 以近邻插值法来修改输入tensor(图片)的大小inputs = tf.image.resize_nearest_neighbor(inputs, (out_shape[1], out_shape[2]))# 返回一个和形参inputs一样的新的tensor。实际是为了将tensor利用tf.identity()来转化为op。因为只有op才会受操作域约束inputs = tf.identity(inputs, name='upsampled')return inputs

四、Yolo前向传播函数

1、yolo前向传播的网络结构

2、yolo前向传播的网络结构的实现

# 定义yolo函数
def yolo_v3(inputs, num_classes, is_training=False, data_format='NHWC', reuse=False):''':param inputs: 输入  类型tensor  形状 [batch, height_in, width_in, channels].:param num_classes: 分类个数 类型int:param is_training:是否是训练状态 类型bool:param data_format: 数据格式:param reuse: 变量是否重用:return:'''# 判断data_format 是否等于'NHWC' 是则继续执行  否则报错assert data_format == 'NHWC'img_size = inputs.get_shape().as_list()[1:3]  # 获得输入图片大小inputs = inputs / 255  # 输入图片归一化# 用字典定义批量归一化参数batch_norm_params = {'decay': _BATCH_NORM_DECAY,'epsilon': _BATCH_NORM_EPSILON,'scale': True,'is_training': is_training,'fused': None,}# 定义yolo网络.# 定义超参数管理作用域 在此作用域下 指定的op操作函数的形参默认赋值# 即:在arg_scope中定义一个或多个操作的许多默认参数,这些参数将会在这些操作中传递下去。with slim.arg_scope([slim.conv2d, slim.batch_norm], data_format=data_format, reuse=reuse):with slim.arg_scope([slim.conv2d], normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params,biases_initializer=None, activation_fn=lambda x: tf.nn.leaky_relu(x, alpha=_LEAKY_RELU)):# 定义名称为darknet-53的变量作用域,darknet53函数返回三个尺度的特征图with tf.variable_scope('darknet-53'):route_1, route_2, inputs = darknet53(inputs)# 定义名称为yolo-v3的变量作用域with tf.variable_scope('yolo-v3'):# ===============================================================================尺寸为13*13的特征图的处理# 13*13的特征图经过_yolo_block块处理,得到两个特征图 一个inputs 一个routeroute, inputs = _yolo_block(inputs, 512)  # (-1, 13, 13, 1024)# 使用候选框参数来辅助识别# inputs再通过yolo检测快,获得基于13*13的特征图的预测值detect_1 = _detection_layer(inputs, num_classes, _ANCHORS[6:9], img_size, data_format)# 将基于13*13的特征图的预测值转化成一个opdetect_1 = tf.identity(detect_1, name='detect_1')# 再将route进行卷积操作,目的是修改通道数,然后让后将route变成和尺度26*26的特征图一样大小的特征图并和darknet53输出的尺度为26*26的特征图组合到了一起inputs = slim.conv2d(route, 256, 1, stride=1, padding='SAME')  # 正常卷积upsample_size = route_2.get_shape().as_list()inputs = _upsample(inputs, upsample_size)inputs = tf.concat([inputs, route_2], axis=3)# ================================================================================尺寸为26*26的特征图的处理# 将组合的特征图输入_yolo_block块处理,得到两个特征图 一个inputs 一个routeroute, inputs = _yolo_block(inputs, 256)  # (-1, 26, 26, 512)# inputs再通过yolo检测快,获得基于26*26的特征图的预测值detect_2 = _detection_layer(inputs, num_classes, _ANCHORS[3:6], img_size, data_format)# 将基于darknet53输出的尺度为26*26的特征图和darknet53输出的_yolo_block块处理53*53的特征图经过下采样组合的特征图得到的预测值转化成一个opdetect_2 = tf.identity(detect_2, name='detect_2')# 再将route进行卷积操作,目的是修改通道数,然后将route变成和尺度13*13的特征图一样大小的特征图并和darknet53输出的尺度为13*13的特征图组合到了一起inputs = slim.conv2d(route, 128, 1, stride=1, padding='SAME')  # 正常卷积upsample_size = route_1.get_shape().as_list()inputs = _upsample(inputs, upsample_size)inputs = tf.concat([inputs, route_1], axis=3)# ================================================================================尺寸为52*52的特征图的处理# inputs再通过yolo检测快,获得基于52*52的特征图的预测值_, inputs = _yolo_block(inputs, 128)  # (-1, 52, 52, 256)detect_3 = _detection_layer(inputs, num_classes, _ANCHORS[0:3], img_size, data_format)detect_3 = tf.identity(detect_3, name='detect_3')# 将三个尺度的特征图的预测值组合到一起detections = tf.concat([detect_1, detect_2, detect_3], axis=1)detections = tf.identity(detections, name='detections')return detections  # 返回了3个尺度。每个尺度里又包含3个结果(-1, 10647( 507 +2028 + 8112), 5+c)

经过以上 yolo的前向传播就结束了,后面就是非极大值抑制函数的实现以及预测结果的显示。

yolov3前向传播(二)-- yolov3相关模块的解析与实现(二)相关推荐

  1. yolov3前向传播(一)-- darknet53网络解析与实现

    一.darknet53网络解析与实现 一.darknet53网络结构组成部分 darknet53网络是由 darknet块 下采样卷积块组成的 1.darknet块 1.1 darknet块网络结构 ...

  2. yolov3前向传播(二)-- yolov3相关模块的解析与实现(一)

    yolov3检测块的解析与实现 在yolo v3模型中,检测部分的模型是由yolo检测块.yolo检测层以及上采样函数组成. yolo检测块负责进一步提取特征: 检测层负责将最终特征转化为bbox a ...

  3. yolov3前向传播(三)-- 坐标转换,iou计算,权重加载,图片显示

    坐标转换,iou计算,权重加载,图片显示 一.坐标转换 1.分析 2.实现 # =====================================坐标值转化函数================ ...

  4. 省二计算机相关内容,什么是计算机省二考试 以及考试范围

    什么是计算机省二考试 以及考试范围 答案:2  信息版本:手机版 解决时间 2018-12-06 03:51 已解决 2018-12-05 06:01 什么是计算机省二考试 以及考试范围 最佳答案 2 ...

  5. 高达82 fps的实时文本检测,华科AAAI2020提出可微分二值化模块

    点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家分享一篇近几天公布的关于实时场景文本检测的论文Real-time Scene Text Detection with Differentiab ...

  6. 前向传播和反向传播_深度学习的地基模块:模型、参数、非线性、前向传播、反向偏微分

    头条ID:钱多多先森,关注更多AI.CV.数码.个人理财领域知识,关注我,一起成长 在深度学习中,数据.模型.参数.非线性.前向传播预测.反向偏微分参数更新等等,都是该领域的基础内容.究竟他们最基础的 ...

  7. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

    linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. (二十四) 手推BP神经网络的前向传播和反向传播

    手推BP神经网络的前向传播和反向传播 一.基本术语 1.监督学习与非监督学习 Supervised Learning有监督式学习: 输入的数据被称为训练数据,一个模型需要通过一个训练过程,在这个过程中 ...

  9. 自上而下解读ncnn系列(1):加载param模型和bin文件前向传播

    由于这段时间着手实现tensorflow到ncnn的转换,开发过程中对ncnn框架有了一定的认识,特此分享. 关于tensorflow2ncnn的具体细节和步骤,可以参考我的github: https ...

最新文章

  1. valgrind 使用 kcachegrind 查看函数运行时间
  2. 【OpenCV 4开发详解】图像极坐标变换
  3. 投影参数_投影仪参数怎么看?没搞懂之前千万不要买
  4. 我就改了一行代码,为什么就全超时了?
  5. new、delelte和malloc、free的关系
  6. BXUG第11期活动
  7. 带有JWT示例的​​Spring Oauth2
  8. OpenStack精华问答 | NOVA计算服务
  9. 华为招聘公关总监:接触近10位路透资深记者 年薪高达20万美元
  10. mysql----索引
  11. VGG-16网络结构解析
  12. Eclipse添加代码自动补全+对齐功能
  13. 保研一年来的心路历程
  14. 2021-03-22 什么是SFP端口
  15. 5个实力超群的手机APP,有这几个足够用了(系统类、阅读类)
  16. Mybatis一发入魂
  17. 研究生导师的“难言之隐”
  18. 通用串行总线USB接口——USB2.0通信协议总结(USB通信机制、描述符、数据包类型、传输类型)
  19. pytorch将pt模型转onnx模型
  20. bind()方法实现

热门文章

  1. smooth_l1_loss(y_true, y_pred)
  2. extend Thread 和 implements Runnable
  3. CentOS7 上以 RPM 包方式安装 Oracle 18c 单实例
  4. Spring Cloud之服务治理(注册发现)
  5. Hive 使用问题集锦
  6. 对于employees表中,给出奇数行的first_name
  7. 文件的操作,如何做文件上传
  8. VisualSVN https 钩子失效 关闭服务器信任
  9. Unity Editor Toolbar 编辑器扩展
  10. 语音特征参数MFCC的提取过程