YOLOv5量化调优

news2025/7/18 9:41:09

目录

一、背景

二、模型调优

2.1 基准选取

2.1.1 官方精度数据

2.1.2 fp32bmodel的精度

2.1.3 int8bmodel精度数据

2.2 多图量化

2.3 预处理对齐&lmdb

2.4  网络图优化

2.4.1 per_channel优化

2.4.2 accuracy_opt优化

2.4.3 conv_group优化

2.4.4 总结

2.5 混合精度

2.6 阈值优化

2.6.1 PERCENT9999

2.6.2 SYMKL

2.6.3 JSD

2.6.4 ADMM

2.6.5 ACIQ

2.6.6 MAX

2.6.7 总结

三、总结

四、相关链接


一、背景

BM1684X平台,移植YOLOv5s时,int8量化效果很差,单图测试如下:

原量化脚本采用auto_cali,脚本大致内容如下:

Bash
python3 -m ufw.cali.cali_model \
 --net_name $dst_model_prefix \
 --model ${src_model_file} \
 --cali_image_path ${image_src_dir} \
 --cali_image_preprocess 'resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True' \
 --input_shapes "[${batch_size},3,${img_height},${img_width}]" \
 --cali_iterations=1 \

注:模型基于官方yolov5s_v6.1

二、模型调优

2.1 基准选取

为了量化调优效果,这里需要测试fp32bmodel,如果官方有给出原始模型mAP数据,也可以直接使用,这里为了校验一下fp32bmodel,顺便一起做了。

mAP数据需要借助pycocotools工具包,采用coco2017 val数据集,通过编码实现模型推理、比对结果等逻辑。

2.1.1 官方精度数据

官方yolov5s_6.1数据如下,与fp32bmodel一致:

2.1.2 fp32bmodel的精度

实测性能数据如下:

Bash
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.373
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.567
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.403
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.214
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.423
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.489
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.311
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.520
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.584
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.409
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.646
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.733

2.1.3 int8bmodel精度数据

未优化之前,int8量化模型的精度数据如下,对比官方数据,mAP@0.5降低了9.4个百分点

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.290
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.474
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.317
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.159
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.337
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.389
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.269
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.470
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.533
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.343
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.596
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.681

2.2 多图量化

分析原脚本,可以看到,量化迭代图片张数太少,根据大多数模型量化经验,此处图片张数一般选用200张左右,过少不利于统计出数据分布,过多可能会引起过拟合。

实现尝试50、100、200,脚本如下,实测单图效果一般,val验证集测试精度有所提高。

Bash
python3 -m ufw.cali.cali_model \
    --net_name $dst_model_prefix \
    --model ${src_model_file} \
    --cali_image_path ${image_src_dir} \
    --cali_image_preprocess 'resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True' \
    --input_shapes "[${batch_size},3,${img_height},${img_width}]" \
    --cali_iterations=200 \
    --outdir ${int8model_dir} \
    --target ${platform}

采用200张图片量化后,精度数据如下,对比【2.1.3】mAP@0.5提升了1.4个百分点:

Bash
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.301
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.488
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.330
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.169
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.361
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.413
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.470
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.533
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.344
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.597
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.691

能够得出的结论是多图确实可以涨点,后续均采用200张进行。

2.3 预处理对齐&lmdb

分析官方源码,可以看到官方预处理采用letterbox方式,量化脚本采用直接缩放到640*640尺寸,预处理方式存在一定差异。

为了提升量化时效率,图片预处理在制作lmdb数据时一并做掉,数据集制作可以参考官方教程,需要自行写脚本实现,部分代码如下:

Python
部分代码
lmdb = LMDB_Dataset(args.imageset_lmdbfolder)
for image_path in image_list:
    print('reading image {}'.format(image_path))
    cv_img = read_image(image_path, args.image_size)        
    lmdb.put(cv_img)
lmdb.close()
    
#制作的数据集:data.mdb

此时需要调整量化脚本,采用lmdb数据集,而不用在量化过程中进行图片前处理操作,部分脚本如下:

Bash
python3 -m ufw.cali.cali_model \
    --net_name $dst_model_prefix \
    --model ${src_model_file} \
    --cali_lmdb ${lmdb_src_dir}\
    --input_shapes "[${batch_size},3,${img_height},${img_width}]" \
    --cali_iterations=200 \
    --outdir ${int8model_dir} \
    --target ${platform} \
    --convert_bmodel_cmd_opt="-opt=1"

精度数据如下所示,可以看到精度相对于【2.2】反而会有些下降,mAP@0.5降低了1.5个百分点(原因不详):

Shell
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.283
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.463
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.306
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.133
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.330
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.398
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.264
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.451
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.509
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.305
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.569
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.679

结论:引入letterbox会降低精度,后续仍然采用【2.2】方式。

2.4  网络图优化

结合芯片平台特性,可以针对模型网络中某些node进行量化,比如depthwise conv、BN+bias等,如下图所示,下面从模型优化角度进行组合尝试。

网络优化操作

2.4.1 per_channel优化

首先尝试使用按输入channel量化,此功能默认是关闭的,需要通过-per_channel进行开启,开启后,convolution计算时,会按照每个通道进行量化统计,脚本主要代码如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-per_channel=true"

精度数据如下所示,对比【2.3】没有变化,说明此优化未能提升精度。

Shell
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.301
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.488
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.330
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.169
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.361
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.413
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.470
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.533
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.344
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.597
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.691

结论:该优化无效,后续不引入。

2.4.2 accuracy_opt优化

该优化会将网络中depthwise卷积采用浮点进行推理,以提高精度。该选项默认是关闭的,需要通过-accuracy_opt进行开启,主要脚本代码如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-accuracy_opt=true"

精度数据如下所示,对比【2.3】没有变化,说明此优化未生效。

Shell
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.301
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.488
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.330
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.169
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.361
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.413
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.470
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.533
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.344
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.597
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.691

结论:该优化无效,后续不引入。

2.4.3 conv_group优化

该优化后将conv的输出channel,按照输出幅值进行分组,然后拆分成不同的组分别进行量化,默认是关闭的,需要通过-conv_group开启,主要脚本代码如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-conv_group=true"

精度数据如下所示,对比【2.3】没有变化,说明此优化未生效。

Bash
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.301
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.488
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.330
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.169
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.361
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.413
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.470
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.533
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.344
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.597
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.691

结论:该优化无效,后续不引入。

2.4.4 总结

通过【2.4】章节的实验,可以确认目前的图优化对YOLOv5不生效。为了防止工具链存在问题,可以通过比较auto_cali环节calibration_use_pb输出,与手动分布执行calibration_use_pb的日志输出,并比较了两者int8umodel和deploy_int8_unique_top.prototxt,均一致,

注:

  1. 当前最新版本工具链会将三种优化合并,实际只生效一种
  1. 为了快速验证,建议将opt配置为1auto_cali默认是2
  1. 可以采用分步量化,可以提高量化调优效率

2.5 混合精度

168X芯片内部集成了浮点计算单元,可以高效地利用浮点进行计算。根据芯片的这个特点,可以采用混合精度的方式来运行网络,允许部分层用定点进行计算,部分层用浮点进行计算。通过允许部分层用浮点进行计算,可以有效地提高网络的整体量化精度。

目前,量化工具对外提供了多种混合精度方式,比如:fpfwd_inputs(输入到某层)、fpfwd_outputs(某层到输出),可以通过如下命令查看:

Bash
calibration_use_pb --help

YOLOv5 head包含回归和分类,在量化时,数据分布不易于统计,一般可以设置成fp32,这里将最后一层卷积到输出全部设置为fp32,即浮点计算,脚本主要代码如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18"

注:

  1. 可以通过prototxt文件查看convname

精度数据如下所示,对比【2.3】mAP略微提升,说明此优化有提升精度效果,可以加入。

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.310
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.491
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.338
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.179
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.371
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.423
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.278
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.478
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.539
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.605
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.699

结论:该混合精度策略生效,后续引入精度量化中。

2.6 阈值优化

阈值的选取对于网络量化效果有很大的影响,不同的阈值量化方法对于网络可能会有不同效果,理论上每个layer都能采用不同量化策略,最终逼近原生模型效果。

默认采用KL量化方法,可以采用如下命令查看支持的量化方法:

Shell

t@8fd9d950d190:/workspace/code/sophon-examples/simple/YOLOv5/scripts# calibration_use_pb --help
...
-th_method (method to calculate
      threshold.Options:KL(default),SYMKL,JSD,ADMM,ACIQ,PERCENT9999,MAX)
      type: string default: "KL"
...

注:这里给出几种量化策略的介绍,感兴趣的可以看一看

2.6.1 PERCENT9999

通过th_method配置,主要脚本如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=PERCENT9999"

 精度数据如下所示,对比【2.5】没有变化,说明此优化未生效。

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.310
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.491
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.338
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.179
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.371
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.423
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.278
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.478
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.539
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.605
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.699

结论:此优化不生效,后续不引入。

2.6.2 SYMKL

通过th_method配置,主要脚本如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=SYMKL"

 精度数据如下所示,对比【2.5】精度有所下降,说明此优化未达效果。

Python
Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.300
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.476
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.327
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.170
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.363
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.417
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.275
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.475
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.536
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.339
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.603
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.700

结论:此优化属于负优化,后续不引入。

2.6.3 JSD

通过th_method配置,主要脚本如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=JSD"

 精度数据如下所示,对比【2.5】精度有所下降(比【2.6.2稍微好一点】),说明此优化未达效果。

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.306
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.486
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.333
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.171
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.368
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.420
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.277
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.477
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.538
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.343
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.607
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.696

结论:此优化属于负优化,后续不引入。

2.6.4 ADMM

通过th_method配置,主要脚本如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=ADMM"

 精度数据如下所示,对比【2.5】mAP@0.5提升5.9个百分点,说明此优化效果较为明显。

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.550
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.387
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.205
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.408
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.465
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.299
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.508
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.572
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.389
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.636
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.724

 

结论:此优化有效,后续可以考虑引入。

2.6.5 ACIQ

通过th_method配置,主要脚本如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=ACIQ"

 精度数据如下所示,对比【2.5】mAP@0.5提升3个百分点,说明此优化效果较为明显。

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.330
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.521
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.352
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.190
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.373
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.436
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.285
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.485
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.550
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.379
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.604
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.703

结论:此优化有效,后续可以考虑引入。

2.6.6 MAX

通过th_method配置,主要脚本如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=MAX"

 精度数据如下所示,对比【2.5】mAP@0.5提升5.3个百分点,说明此优化效果较为明显。

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.346
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.544
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.373
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.191
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.391
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.453
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.292
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.495
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.562
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.376
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.623
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.703

结论:此优化有效,后续可以考虑引入。

2.6.7 总结

这里采用全局量化策略,相互之间互斥,基于此,可以选出效果最好的量化策略,也即【2.6.4】中的ADMM。

注:如果有更加高精度的要求,还可以按照layer尝试采用不同量化策略

三、总结

基于以上调优实验,最终采用【2.2】+【2.5】+【2.6.4】优化组合,部分代码如下:

Bash
python3 -m ufw.cali.cali_model  \
    --net_name=$dst_model_prefix  \
    --model=${src_model_file}  \
    --cali_image_path=${image_src_dir}  \
    --cali_iterations=200   \
    --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
    --input_shapes="[${batch_size},3,${img_height},${img_width}]"  \
    --outdir=${int8model_dir}   \
    --target=${platform}   \
    --convert_bmodel_cmd_opt="-opt=1"   \
    --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=ADMM"

调优后精度如下所示:

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.550

对比优化前精度,精度提升了7.6个百分点(mAP@0.5):

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.290
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.474

对比官方/fp32bmodel(两者一致),精度仅降低1.7个百分点(mAP@0.5):

Python
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.373
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.567

四、相关链接

样例开源仓库:https://github.com/sophon-ai-algo/examples

BM1684 BMNNSDK文档:https://developer.sophgo.com/site/index/document/6/all.html

编译工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/index.html

量化工具用户开发手册:https://doc.sophgo.com/docs/2.7.0/docs_latest_release/calibration-tools/html/index.html

算能量化工具介绍及使用说明:https://www.bilibili.com/video/BV1DA4y1S75p?spm_id_from=333.999.0

官网视频教程:https://developer.sophgo.com/site/index/course/all/all.html

官网文档中心:https://developer.sophgo.com/site/index/document/all/all.html

官网下载中心:https://developer.sophgo.com/site/index/material/all/all.html

官网论坛:https://developer.sophgo.com/forum/view/43.html
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python中使用xlrd、xlwt操作excel表格详解

最近遇到一个情景&#xff0c;就是定期生成并发送服务器使用情况报表&#xff0c;按照不同维度统计&#xff0c;涉及python对excel的操作&#xff0c;上网搜罗了一番&#xff0c;大多大同小异&#xff0c;而且不太能满足需求&#xff0c;不过经过一番对源码的"研究"&…

移动电源出口美国和欧盟需要做什么?

手机的普遍使用也带动了充电宝的发展&#xff0c;现在是智能的时代&#xff0c;手机现在是我们每个人永远不会忘记带的东西&#xff0c;当然耗电量也是很大的。所以充电宝在这时就有很大的用处了。移动电源是一种集供电和充电功能于一体的便携式充电器&#xff0c;一般由锂离子…

杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

目录 一、简介 关于杰理芯片的key文件&#xff0c;实际上 杰理芯片特有的一种机制&#xff0c;而这种机制就是存在于杰理芯片特有的架构&#xff0c;也是杰理公司延续将近10年的特点&#xff0c;估计以后也会是这种机制。具体为什么&#xff0c;请听我娓娓道来&#xff0c;这里…

测试大咖漫谈如何搞定软件质量?

关于质量保障&#xff0c;好像已经说过太多&#xff0c;但这里还是抽象的唠叨几句。 多年的软件测试和质量保障工作让我越来越清晰的认识到&#xff1a;质量绝对不是一个环节&#xff0c;一个工种可以搞定的。比如&#xff1a; 从对语言的误用&#xff0c;到对第三方组件的误用…

第4关: 网页排序——PageRank算法

要求&#xff1a;编写实现网页数据集PageRank算法的程序&#xff0c;对网页数据集进行处理得到网页权重排序。 ####相关知识 ######PageRank算法原理 1.基本思想&#xff1a; 如果网页T存在一个指向网页A的连接&#xff0c;则表明T的所有者认为A比较重要&#xff0c;从而把T的一…

【Shell】入门Shell(基本变量、环境变量、特殊变量)

Shell脚本一、Shell脚本的执行方式1.脚本格式要求2. 编写第一个Shell脚本3.Shell脚本的常用执行方式二、Shell的变量1.Shell变量介绍2. Shell变量的定义a. 基本语法b. 快速入门(三案例)2. Shell变量的定义a. 定义变量的规则b. 将命令的返回值赋给变量三、Shell多行注释1. 用 :&…

成本优化之使用P2P的方案的需要了解的本地SDK的背后的原理

文章目录一. P2P的SDK到底做了什么二. P2P原理1. 同流分享思路2. 目前方案三. 使用P2P后产生的问题1. 有概率出现loading转菊花2. 首次打开速度明显慢于正常的通道1-2秒参考文章一. P2P的SDK到底做了什么 P2P的SDK在我们App启动后其实是开启了一个服务&#xff0c;固定端口去监…

刷题日记【第十一篇】-笔试必刷题【小易的升级之路+找出字符串中第一个只出现一次的字符+微信红包+计算字符串的编辑距离】

1.计算字符串的编辑距离【动态规划编程题】 import java.util.Scanner; import java.io.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String args[]) throws Exception{BufferedReader reader new BufferedReader(n…

【RuoYi-Vue-Plus】扩展笔记 07 - CentOS 7 集成 Prometheus + Grafana 监控初体验

文章目录前言参考目录官方文档博客参考相关书目操作步骤1、Prometheus1.1、安装 Prometheus1.2、配置 Prometheus1.3、访问控制台2、Grafana2.1、安装 Grafana2.2、访问控制台3、Grafana 大屏配置3.1、添加 Prometheus 数据源3.2、导入 dashboards 仪表板3.3、配置 node_export…

你安全吗?丨沉默的“复仇”到底是什么东西?

作者&#xff1a;黑蛋 在电视剧《你安全吗&#xff1f;》第七集中&#xff0c;因为周游的死缠烂打&#xff0c;秦淮第一次提起了他和陈默以前的事情&#xff0c;也给出了之前虎迫公司开除陈默的原因&#xff1a;陈默妈妈被诈骗团伙骗掉所有积蓄&#xff0c;又因为此事走神出了…

【附源码】计算机毕业设计JAVA计算机专业在线学习评估软件-演示录像-

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

Java抽象类

什么是抽象类&#xff1f; 如果一个类不能够表示一个准确的对象&#xff0c;则使用abstract修饰&#xff0c;表示为抽象类&#xff0c;抽象类就是为了被继承。抽象类使用abstract修饰 abstract class Animal {abstract public void eat(); }抽象类不能被实例化 public static …

第四节.常用Linux命令—文件内容查询

第四节.常用Linux命令—文件内容查询 1.查看目录内容&#xff1a;cat,more,grep 序号命令作用01cat 文件名查看文件内容&#xff0c;more创建文件&#xff0c;合并文件&#xff0c;追加文件内容等02more 文件名分屏显示文本内容03grep 搜索文本文件名搜索文本文件内容(模式查找…

快速入门Servlet

前导 1、web概述 1.1、Web与JavaWeb的概念 Web&#xff1a;全球广域网 &#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站 JavaWeb&#xff1a;是用Java技术来解决相关web互联网领域的技术栈 1.2、JavaWeb技术栈 了解JavaWeb技术栈之前&#xf…

面试官:说说React-SSR的原理

前言 所谓同构&#xff0c;简而言之就是&#xff0c;第一次访问后台服务时&#xff0c;后台直接把前端要显示的界面全部返回&#xff0c;而不是像 SPA 项目只渲染一个 <div id"root"></div> 剩下的都是靠 JavaScript 脚本去加载。这样一来可以大大减少首…

SpringMVC之通过最简单的方法实现多文件上传(提供一种模板,可以在这种方法的基础上进行各种的改良)

上一篇博客主要介绍的SpringMVC中单文件进行上传的两种方法单文件上传的两种方法 单文件上传的方法我们解决了&#xff0c;那如何如何实现多文件进行上传输出呢&#xff1f; 这篇文章主要实现的方法就是通过数组的方法来实现多文件的上传 注意本篇文章的大部分内容与上一篇文章…

2022年11月华南师范大学计算机信息管理-专科-计算机信息管理课程实验(一)

《 计算机信息管理课程实验&#xff08;一&#xff09; 》课程试卷 试卷提交说明&#xff1a; 提交对应于三个题目的三个文档&#xff0c;请把三个文档放到一个文件夹&#xff0c;文档命名规则为题目号&#xff0c;文件夹命名为&#xff1a;“序号姓名课程名”。 此试卷总分…

Ubuntu18.04使用turblebot3

一、安装和测试 1、下载资源包 mkdir -p ~/turtlebot3_ws/src/ cd ~/turtlebot3_ws/src/ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone https://github.com/ROBOTIS-GIT/t…

Mac系统每次更改vscode中的文件都提示权限不足

开发过程中遇到一个问题 当我在vscode修改文件 保存的时候vscode 右下角弹出 Failed to save index.jsx: Insufficient permissions. Select Retry as Sudo to retry as superuser.翻译成中文的意思就是 文件无法保存, 无权限, 请用超级管理员身份进行修改 其实我很纳闷 我已…

怎么查找Linux服务器是否有后门账户

在Linux系统里植入账户后门是一个极其简单高效的管理权限维持办法。hack在获得目标系统权限的情况下&#xff0c;利用建立一个操作系统账户当做持久化的聚集点&#xff0c;如此一来随时都可以利用工具链接到目标操作系统&#xff0c;实现对目标服务器进行长期操控的目的。依据获…