11. 附录 2

量化相关示例都存放于github项目https://github.com/sophon-ai-algo/中的examples/calibration目录,请自行前往选择正确的分支下载。包含的示例如下:

examples
|--- calibration
|    `-- examples
|       |--- classify_demo
|       |--- create_lmdb_demo
|       |--- face_demo
|       |--- object_detection_python_demo
|       |--- caffemodel_to_fp32umodel_demo
|       |--- tf_to_fp32umodel_demo
|       |--- pt_to_fp32umodel_demo
|       |--- mx_to_fp32umodel_demo
|       |--- dn_to_fp32umodel_demo
|       |--- on_to_fp32umodel_demo
|       |--- pp_to_fp32umodel_demo
|       |--- auto_cali_demo
|       |--- yolov5s_demo
|              |--- view_demo

11.1. 示例1:classify_demo

该用例将caffe框架下的resnet18网络转换成int8umodel,并测试float32原始网络的精度、测试转换后的int8网络的精度。

  1. 转换成int8umodel

$ cd <release dir>/examples/calibration/classify_demo
$ source classify_demo.sh
$ convert_to_int8_demo

运行完毕,结果如 resnet18转化int8umodel成功结果 所示。

../_images/ch3_001.png

图 11.1 resnet18转化int8umodel成功结果

  1. 测试原始的float32网络精度

$ test_fp32_demo

运行完毕,结果如 resnet18 fp32umodel精度结果 所示。

../_images/ch3_002.png

图 11.2 resnet18 fp32umodel精度结果

  1. 测试转换生成的int8网络的精度

$ test_int8_demo

运行完毕,结果如 resnet18 int8umodel精度结果 所示。

../_images/ch3_003.png

图 11.3 resnet18 int8umodel精度结果

11.2. 示例2:create_lmdb_demo

该用例将jpg图片转换成lmdb数据集,使用示例的代码可以将指定目录下的图片转换后存入lmdb中,用户可以修改此示例代码添加自己的前处理操作。

$ cd <release dir>/examples/calibration/yolov5s_demo/create_lmdb_demo
$ bash download_coco128.sh
$ python3 convert_imageset.py \
   --imageset_rootfolder=./coco128/images/train2017 \
   --imageset_lmdbfolder=./lmdb \
   --resize_height=640 \
   --resize_width=640 \
   --shuffle=True \
   --bgr2rgb=False \
   --gray=False

运行完毕,结果如下所示。

original shape: (323, 481, 3)
read image resized dimensions: (640, 640, 3)
<class 'numpy.ndarray'>
cv_imge after resize (640, 640, 3)
save lmdb once
/sdk/examples/create_lmdb_demo/images/cat_gray.jpg
original shape: (360, 480, 3)
read image resized dimensions: (640, 640, 3)
<class 'numpy.ndarray'>
cv_imge after resize (640, 640, 3)
save lmdb once
/sdk/examples/create_lmdb_demo/images/cat.jpg
original shape: (360, 480, 3)
read image resized dimensions: (640, 640, 3)
<class 'numpy.ndarray'>
cv_imge after resize (640, 640, 3)
save lmdb once
/sdk/examples/create_lmdb_demo/images/cat gray.jpg
original shape: (360, 480, 3)
read image resized dimensions: (640, 640, 3)
<class 'numpy.ndarray'>
cv_imge after resize (640, 640, 3)
save lmdb once

生成LMDB数据成功

同时,在examples/calibration/yolov5s_demo/create_lmdb_demo/lmdb下会生成data.lmdb文件。

11.3. 示例3:face_demo

该用例将caffe框架下的人脸检测网络squeezenet转换成int8umodel,并测试float32原始网络, int8网络对图片的检测结果。

  1. 建立环境

$ cd <release dir>/examples/calibration/face_demo
$ source face_demo.sh
  1. 用float32网络检测图片

$ detect_squeezenet_fp32

运行完毕,结果如 squeezenet fp32umodel运行成功结果 所示。

../_images/ch3_006.png

图 11.4 squeezenet fp32umodel运行成功结果

同时在examples/calibration/face_demo生成检测之后的图片detection.png,如 squeezenet fp32umodel检测效果: (如在docker内运行,看不到detection.png,请刷新目录)

../_images/ch3_007.png

图 11.5 squeezenet fp32umodel检测效果

c)转换成int8umodel

$ convert_squeezenet_to_int8
../_images/ch3_008.png

图 11.6 squeezenet int8umodel转化成功输出

d)用int8网络检测图片

$ detect_squeezenet_int8

运行完毕,结果如 squeezenet int8umodel检测运行成功输出

../_images/ch3_009.png

图 11.7 squeezenet int8umodel检测运行成功输出

同时在examples/calibration/face_demo生成检测之后的图片detection_int8.png,如 squeezenet int8umodel检测效果 所示。

../_images/ch3_010.png

图 11.8 squeezenet int8umodel检测效果

11.4. 示例4:object_detection_python_demo

该用例以ssd_vgg300为例,描述python接口的使用方法,以方便用fp32umodel或者int8umodel建立框架程序,用于精度测试或者用于应用程序。

  1. 用float32网络检测图片

$ cd <release dir>/examples/calibration/object_detection_python_demo
$ python3 ssd_vgg300_fp32_test.py

运行完毕,结果如 ssd vgg300 fp32umodel运行成功输出 所示。

../_images/ch3_011.png

图 11.9 ssd vgg300 fp32umodel运行成功输出

同时在examples/calibration/object_detection_python_demo生成检测之后的图片 person_fp32_detected.jpg,如 ssd vgg300 fp32umodel检测效果 所示。

../_images/ch3_012.png

图 11.10 ssd vgg300 fp32umodel检测效果

  1. 用int8网络检测图片

python3 ssd_vgg300_int8_test.py

运行完毕,结果如 ssd vgg300转化int8umodel成功输出 所示。

../_images/ch3_013.png

图 11.11 ssd vgg300转化int8umodel成功输出

同时在examples/calibration/object_detection_python_demo生成检测之后的图片 person_int8_detected.jpg,如 ssd vgg300 int8umodel检测效果 所示。

../_images/ch3_014.png

图 11.12 ssd vgg300 int8umodel检测效果

11.5. 示例5:caffemodel_to_fp32umodel_demo

该用例程序以resnet50为例,描述如何将caffe框架下的模型文件(*.caffemodel, *prototxt)转换成fp32umodel。

运行命令

$ cd <release dir>/examples/calibration/caffemodel_to_fp32umodel_demo
$ python3 resnet50_to_umodel.py

运行结果如 Caffe模型转化fp32umodel成功结果 所示。

../_images/ch3_015.png

图 11.13 Caffe模型转化fp32umodel成功结果

在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt:

../_images/ch3_016.png

图 11.14 Caffe模型转化fp32umodel成功输出

11.6. 示例6:tf_to_fp32umodel_demo

该用例程序以resnet50_v2为例,描述如何将tensorflow框架下的模型文件(*.pb)转换成 fp32umodel。

运行命令:

$ cd <release dir>/examples/calibration/tf_to_fp32umodel_demo
$ python3 create_dummy_quant_lmdb.py
$ python3 resnet50_v2_to_umodel.py

运行结果如 Tensorflow模型转化fp32umodel成功结果 所示。

../_images/ch3_017.png

图 11.15 Tensorflow模型转化fp32umodel成功结果

在当前文件夹下,生成dummy_lmdb随机量化数据目录,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt:

注意:此例中首先生成了随机量化数据作为转换数据源参数,此数据仅为示例,不能用于后续量化此网络

../_images/ch3_018.png

图 11.16 Tensorflow模型转化fp32umodel成功输出

11.7. 示例7:pt_to_fp32umodel_demo

该用例程序以yolov5s为例,描述如何将pytorch框架下的模型文件(*.pt)转换成 fp32umodel。

运行命令:

$ cd <release dir>/examples/calibration/pt_to_fp32umodel_demo
$ python3 yolov5s_to_umodel.py

在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt。 更详细的转化流程和细节请参考 Pytorch框架下的网络模型生成fp32umodel 节内容。

11.8. 示例8:mx_to_fp32umodel_demo

该用例程序以mobilenet0.25为例,描述如何将mxnet框架下的模型文件(*.json, *.params)转换成 fp32umodel。

运行命令:

$ cd <release dir>/examples/calibration/mx_to_fp32umodel_demo
$ python3 mobilenet0.25_to_umodel.py

在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt。 更详细的转化流程和细节请参考 Mxnet框架下的网络模型生成fp32umodel 节内容。

11.9. 示例9:dn_to_fp32umodel_demo

该用例程序以yolov3为例,描述如何将darknet框架下的模型文件(*.cfg, *.weights)转换成 fp32umodel。

运行命令:

$ cd <release dir>/examples/calibration/dn_to_fp32umodel_demo
$ get_model.sh # download model
$ python3 yolov3_to_umodel.py

在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt。 更详细的转化流程和细节请参考 Darknet框架下的网络模型生成fp32umodel 节内容。

11.10. 示例10:on_to_fp32umodel_demo

该用例程序以postnet为例,描述如何将onnx模型文件(*.onnx)转换成fp32umodel。

运行命令:

$ cd <release dir>/examples/calibration/on_to_fp32umodel_demo
$ python3 postnet_to_umodel.py

在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt。 更详细的转化流程和细节请参考 ONNX网络模型生成fp32umodel 节内容。

11.11. 示例11:pp_to_fp32umodel_demo

该用例程序以PaddleOCR文字识别网络为例,描述如何将PaddlePaddle模型文件(*.pdiparams)转换成fp32umodel。

运行命令:

$ cd <release dir>/examples/calibration/pp_to_fp32umodel_demo
$ python3 ppocr_rec_to_umodel.py

在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt。 更详细的转化流程和细节请参考 PaddlePaddle网络模型生成fp32umodel 节内容。

11.12. 示例11:auto_cali_demo

这个目录下的自动量化工具是处于beta阶段的一键式自动量化工作,整个量化、自动调试及 精度测试流程,优先推荐客户使用,它具有如下优势: 1) 一键式完成从原始框架模型到bm1684芯片 bmodel的转换。 2) 方便用户对int8模型的精度进行大批量的验证,形成质量优化提升闭环流程。 3) 可自动进行量化策略搜索,找到满足精度要求的最佳量化策略。 4) 方便用户将bm1684的量化流程整合到自有训练流程。

以下示例使用图片来校准和测试

以下示例使用lmdb文件来校准和测试,并通过postprocess_and_calc_score_class参数配置不同类型模型的后处理和精度计算

$ python3 -m ufw.cali.cali_model \
             --net_name yolov5s  \
             --model ./yolov5s_jit.pt \
             --cali_lmdb='yolov5s_lmdb_data/' \
             --input_shapes='[1,3,640,640]' \
             --postprocess_and_calc_score_class feature_similarity #当前支持分类模型的topx_accuracy_for_classify、目标检测模型的detect_accuracy,若设置None,表示不进行任何后处理和精度计算;

以下示例对多输入的paddlepaddle模型进行量化:

$ python3 -m dfn --url https://disk.sophgo.vip/sharing/OzFNMbTvT  #若dfn未安装,执行pip3 install dfn安装
$ tar xzvf models.tar.gz
$ python3 -m ufw.cali.cali_model \
             --net_name 'ppmodel_demo' \
             --model ./models/model.pdmodel \
             --cali_image_path ../../create_lmdb_demo/coco128/images/train2017/ \
             --cali_image_preprocess='image_shape|resize_h=640,resize_w=640;scale=0.0039215;\
             mean_value=0.485:0.456:0.406,div=0.229:0.224:0.225,bgr2rgb=True|image_scale_factor' \
             --input_shapes '[1,2];[1,3,640,640];[1,2]' \
             --output_name 'matrix_nms_0.tmp_0,matrix_nms_0.tmp_2' \
             --input_descs '[0,fp32,640,640];[2,fp32,1,1]' \
             --input_name 'im_shape,image,scale_factor' \
             --postprocess_and_calc_score_class feature_similarity \
             --feature_compare_layer_list 'use_the_conv_at_the_end' \ #对各输出分支的倒数第1个conv的输出进行cos比较
             --test_iterations 5 \
             --cali_iterations 10 \
             --fp32_layer_list 'conv2d_210.tmp_0' \ #将转换得到的ppmodel_demo_bmpaddle_test_fp32.prototxt文件中层名为model/mish/mul这层设置为fp32计算
             --layer_param_list 'conv2d_203.tmp_0:per_channel_flag=true' \ #设置该层的per_channel使能
             --convert_bmodel_cmd_opt '-max_n=4 -v=4 -enable_profile=true' \ #量化为batch4的int8模型,将该命令内容作为bmentu命令的一部分,更多参数见bmnetu --help

11.13. 示例12:yolov5s_demo

详细的例子可参考 示例——YOLOv5s量化

11.14. 示例13:view_demo

详细的例子可参考 使用auto-cali编译模型并进行调优