9. 附录 2

release包中的examples下有calibraton相关的demo程序,目录如下:

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
|       |--- mtcnn_demo
|       |--- auto_calib
|        `-- view_demo
|

9.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

图 9.1 resnet18转化int8umodel成功结果

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

$ test_fp32_demo

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

../_images/ch3_002.png

图 9.2 resnet18 fp32umodel精度结果

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

$ test_int8_demo

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

../_images/ch3_003.png

图 9.3 resnet18 int8umodel精度结果

9.2. 示例2:create_lmdb_demo

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

$ cd <release dir>/examples/calibration/create_lmdb_demo
$ python3 convert_imageset.py \
   --imageset_rootfolder=./images \
   --imageset_lmdbfolder=./images \
   --resize_height=256 \
   --resize_width=256 \
   --shuffle=True \
   --bgr2rgb=False \
   --gray=False

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

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

生成LMDB数据成功

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

9.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

图 9.4 squeezenet fp32umodel运行成功结果

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

../_images/ch3_007.png

图 9.5 squeezenet fp32umodel检测效果

c)转换成int8umodel

$ convert_squeezenet_to_int8
../_images/ch3_008.png

图 9.6 squeezenet int8umodel转化成功输出

d)用int8网络检测图片

$ detect_squeezenet_int8

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

../_images/ch3_009.png

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

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

../_images/ch3_010.png

图 9.8 squeezenet int8umodel检测效果

9.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

图 9.9 ssd vgg300 fp32umodel运行成功输出

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

../_images/ch3_012.png

图 9.10 ssd vgg300 fp32umodel检测效果

  1. 用int8网络检测图片

python3 ssd_vgg300_int8_test.py

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

../_images/ch3_013.png

图 9.11 ssd vgg300转化int8umodel成功输出

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

../_images/ch3_014.png

图 9.12 ssd vgg300 int8umodel检测效果

9.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

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

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

../_images/ch3_016.png

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

9.6. 示例6:tf_to_fp32umodel_demo

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

运行命令:

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

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

../_images/ch3_017.png

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

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

../_images/ch3_018.png

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

9.7. 示例7:pt_to_fp32umodel_demo

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

运行命令:

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

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

9.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 节内容。

9.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 节内容。

9.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 节内容。

9.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。 更详细的转化流程和细节请参考 paddle-to-umodel 节内容。

9.12. 示例11:mtcnn_demo

该用例以mtcnn为例,描述如何量化级联网络:包括为级联网络准备lmdb数据集,量化各网 络,运行demo程序。

  1. 建立环境

$ cd <release dir>/examples/calibration/mtcnn_demo
$ source mtcnn_demo.sh
  1. 编译代码

$ mtcnn_build
  1. 生成各网络的lmdb数据集

$ dump_fddb_lmdb

运行完毕后,会在当前目录下生成pnet,rnet,onet的lmdb数据集,如 mtcnn数据集 所示。

../_images/ch3_019.png

图 9.17 mtcnn数据集

  1. 量化各网络

量化pnet,在./model 目录下生成pnet量化后的模型:

$ convert_mtcnn_demo_pnet_to_int8_pb

量化rnet,在./model 目录下生成rnet量化后的模型:

$ convert_mtcnn_demo_rnet_to_int8_pb

量化onet,在./model 目录下生成onet量化后的模型:

$ convert_mtcnn_demo_onet_to_int8_pb
  1. 运行fp32网络的demo

$ run_demo_float
  1. 运行int8网络的demo

$ run_demo_int8

9.13. 示例12:auto_cali

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

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

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