专栏算法工具链推断图片的时候结果不准确

推断图片的时候结果不准确

已解决
wangning2020-12-23
276
9

我模型训练的时候输入图片格式是:bgr格式,并且向像素值都除了255,做了归一化。

在工具链里面的mapper做 inference.sh的时候一个目标也输不出来,我看了一下置信度都是0.000及的级别,请问这是什么原因呢?

---------------------------------------------------------------------------------------------------------------------------------------------------------

我在工具链里的配置

def data_transformer(input_shape=(672, 672)):
transformers = [
PadResizeTransformer(input_shape),

TransposeTransformer((2, 0, 1)),

ScaleTransformer(1 / 255),
]
return transformers

************************************************************************************************

def load_image(image_file, input_shape):
transformers = data_transformer()
transformers.append(ColorConvertTransformer('BGR', 'YUV444'))
origin_image, process_image = DetectionLoader(
transformers, image_file, imread_mode='opencv')
return origin_image, process_image

************************************************************************************************

yolov3配置文件

model_parameters:
# Caffe浮点网络数据模型文件
onnx_model: './yolov3_wn.onnx'
# Caffe网络描述文件
prototxt: './yolov3_wn.onnx'
# 指定模型转换过程中是否输出各层的中间结果,如果为True,则输出所有层的中间输出结果,
layer_out_dump: False
# 用于设置上板模型输出的layout, 支持NHWC和NCHW, 输入None则使用模型默认格式
output_layout: NHWC
# 日志文件的输出控制参数,
# debug输出模型转换的详细信息
# info只输出关键信息
# warn输出警告和错误级别以上的信息
log_level: 'debug'
# 模型转换输出的结果的存放目录
working_dir: 'model_output'
# 模型转换输出的用于上板执行的模型文件的名称前缀
output_model_file_prefix: 'yolov3'


# 模型输入相关参数, 若输入多个节点, 则应使用';'进行分隔, 使用默认缺省设置则写None
input_parameters:
# (可不填) 模型输入的节点名称, 此名称应与模型文件中的名称一致, 否则会报错, 不填则会使用模型文件中的节点名称
input_name: 'data'
# 网络实际执行时,输入给网络的数据格式,包括 nv12/rgbp/bgrp/yuv444_128/gray/featuremap,
# 如果输入的数据为yuv444_128, 模型训练用的是rgbp,则hb_mapper将自动插入YUV到RGBP(NCHW)转化操作
input_type_rt: 'yuv444_128'
# 网络训练时输入的数据格式,可选的值为rgbp/bgrp/gray/featuremap/yuv444_128
input_type_train: 'bgrp'
# 网络输入的预处理方法,主要有以下几种:
# no_preprocess 不做任何操作
# mean_file 减去从通道均值文件(mean_file)得到的均值
# data_scale 对图像像素乘以data_scale系数
# mean_file_and_scale 减去通道均值后再乘以scale系数
norm_type: 'data_scale'
# (可不填) 模型网络的输入大小, 以'x'分隔, 不填则会使用模型文件中的网络输入大小
input_shape: '1x3x672x672'
# 图像减去的均值存放文件, 文件内存放的如果是通道均值,均值之间必须用空格分隔
mean_file: 'meanfile.txt'
# 图像预处理缩放比例,该数值应为浮点数
scale_value: 1.0


calibration_parameters:
# 模型量化的参考图像的存放目录,图片格式支持Jpeg、Bmp等格式,输入的图片
# 应该是使用的典型场景,一般是从测试集中选择20~50张图片,另外输入
# 的图片要覆盖典型场景,不要是偏僻场景,如过曝光、饱和、模糊、纯黑、纯白等图片
# 若有多个输入节点, 则应使用';'进行分隔
cal_data_dir: './calibration_data_rgbp'
# 如果输入的图片文件尺寸和模型训练的尺寸不一致时,并且preprocess_on为true,
# 则将采用默认预处理方法(opencv resize),
# 将输入图片缩放或者裁减到指定尺寸,否则,需要用户提前把图片处理为训练时的尺寸
preprocess_on: False
# 模型量化的算法类型,支持kl、max,通常采用KL即可满足要求
calibration_type: 'max'
# 模型的量化校准方法设置为promoter,mapper会根据calibration的数据对模型进行微调从而提高精度,
# promoter_level的级别,可选的参数为-1到2,建议按照0到2的顺序实验,满足精度即可停止实验
# -1: 不进行promoter
# 0:表示对模型进行轻微调节,精度提高比较小
# 1:表示相对0对模型调节幅度稍大,精度提高也比较多
# 2:表示调节比较激进,可能造成精度的大幅提高也可能造成精度下降
promoter_level: -1


# 编译器相关参数
compiler_parameters:
# 编译策略,支持bandwidth和latency两种优化模式;
# bandwidth以优化ddr的访问带宽为目标;
# latency以优化推理时间为目标
compile_mode: 'latency'
# 设置debug为True将打开编译器的debug模式,能够输出性能仿真的相关信息,如帧率、DDR带宽占用等
debug: False
# 编译模型指定核数,不指定默认编译单核模型, 若编译双核模型,将下边注释打开即可
# core_num: 2
# 设置每个fuction call最大执行时间,单位为us
# max_time_per_fc: 500
# 优化等级可选范围为O0~O3
# O0不做任何优化, 编译速度最快,优化程度最低,
# O1-O3随着优化等级提高,预期编译后的模型的执行速度会更快,但是所需编译时间也会变长。
# 推荐用O2做最快验证
optimize_level: 'O2'
算法工具链
评论1
0/1000
  • 芯链情报局
    Lv.4

    ColorConvertTransformer 的输入数据应该是 0-255 的 BGR 数据

    你这里可以把 scale 放到 yaml 里去配置,预处理删掉

    mean 对应做一下放大,即 0-1 的 mean 换算成 0-255 的 mean

    2020-12-23
    0
    8
    • wangning回复芯链情报局:

      我的mean直接就是0,因为我训练的时候没用均值。

      ---------------------------------------------------------------------

      def data_transformer(input_shape=(672, 672)):
      transformers = [
      PadResizeTransformer(input_shape),

      TransposeTransformer((2, 0, 1)),
      # ChannelSwapTransformer((2, 1, 0)),
      # ScaleTransformer(1 / 255),
      ]
      return transformers

      *****************************************************************

      norm_type: 'data_scale'
      # (可不填) 模型网络的输入大小, 以'x'分隔, 不填则会使用模型文件中的网络输入大小
      input_shape: '1x3x672x672'
      # 图像减去的均值存放文件, 文件内存放的如果是通道均值,均值之间必须用空格分隔
      mean_file: 'meanfile.txt'
      # 图像预处理缩放比例,该数值应为浮点数
      scale_value: 0.00392

      您看这样对吗?

      2020-12-23
      0
    • wangning回复wangning:

      您好,上方法是可以的!图片检测对了 ,但是会有误检。

      我见yaml里面有输入类型是yuv,还有inference.py里面也有 bgr 转 yuv的代码。

      如果我想让输入图片完全按照我训练网络时的格式,是不是可以这么改?

      ------------------------------------------------------------------------------------------------------

      yaml文件里:

      input_name: 'data'
      # 网络实际执行时,输入给网络的数据格式,包括 nv12/rgbp/bgrp/yuv444_128/gray/featuremap,
      # 如果输入的数据为yuv444_128, 模型训练用的是rgbp,则hb_mapper将自动插入YUV到RGBP(NCHW)转化操作
      input_type_rt: 'bgrp'
      # 网络训练时输入的数据格式,可选的值为rgbp/bgrp/gray/featuremap/yuv444_128
      input_type_train: 'bgrp'
      # 网络输入的预处理方法,主要有以下几种:

      ***************************************************************************************************

      mapper里的inference.py 文件

      请问这样改对吗?如果不对 ,还有哪里需要改呢?

      2020-12-23
      0
    • 芯链情报局回复wangning:
      其实如果你是在 mapper 里面基于 python 代码去做推理的话,完全可以不用改示例代码,就按照
      input_type_rt: 'yuv444_128'
      input_type_train: 'bgrp'

      来配置,直接就能跑通了

      2020-12-23
      1
    • 芯链情报局回复wangning:
      如果你一定需要配置 bgrp 的话,可以参考我的这篇帖子《如何基于工具链示例代码实现浮点模型推理》,去可视化看以下 onnx 模型到底需要什么养的输入。

      你图中 onnx_forward 前向接口里红色框出的 sess.run 其实调用的是 python3.6/site-packages/x3_tc_ui/hb_quanti_onnxruntime.py 里的 HB_QuantiONNXRuntime 类,可以看其中的 run 函数,配置 input_name 究竟会有哪些操作。(我在那篇帖子上写的 input_name: "float" 其实就是根据浮点模型情况,不走 input_info[name].astype(np.uint8) - 128).astype(np.int8) 这一行代码)

      希望以上说明能够帮到你

      2020-12-23
      1
    • wangning回复芯链情报局:

      这是 用的你们转换后的yolov3_quantized_model.onnx 推理的

      下面是我用自己原来的onnx推理的

      问题1: 为什么你们转换之后的模型会有这么多误检,而且置信度都很高(我测了几张图片,都有误检,但是目测都是比较简单的图片)

      ------------------------------------------------------------------------------------------------------------------------------------------------------------------

      问题2:

      可以详细解释一下这几个模型的区别吗?那个bin文件是基于哪一个模型转的?

      2020-12-23
      2
    • 芯链情报局回复wangning:
      问题1:
      我们的 yolov3 提供的是 COCO 上的开源模型,并不是自己训练的。
      模型精度基于不同的校准方法会有差异,之前测试精度最好的应该是 max_percentile,在 COCO 上的量化指标为 [IoU=0.50:0.95]=0.340(浮 0.337)

      =============================

      问题2:

      可以参考工具链文档 《5.1.2. 模型转换的内在步骤》,里面有比较详细的描述

      2020-12-23
      0
    • wangning回复芯链情报局:

      谢谢,我还问一下 bgr与bgrp有什么不一样?只是单纯的两种图片格式吗?

      2020-12-23
      0
    • 芯链情报局回复wangning:

      bgr 和 bgrp 其实是两种数据排布格式,p 是 plane 的意思,即 bbbgggrrr 这样的

      这里简单理解的话,就是 bgr 是 HWC,bgrp 是 CHW

      2020-12-24
      0