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网络的精度。
转换成int8umodel
$ cd <release dir>/examples/calibration/classify_demo $ source classify_demo.sh $ convert_to_int8_demo
运行完毕,结果如 resnet18转化int8umodel成功结果 所示。
测试原始的float32网络精度
$ test_fp32_demo
运行完毕,结果如 resnet18 fp32umodel精度结果 所示。
测试转换生成的int8网络的精度
$ test_int8_demo
运行完毕,结果如 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网络对图片的检测结果。
建立环境
$ cd <release dir>/examples/calibration/face_demo $ source face_demo.sh
用float32网络检测图片
$ detect_squeezenet_fp32
运行完毕,结果如 squeezenet fp32umodel运行成功结果 所示。
同时在examples/calibration/face_demo生成检测之后的图片detection.png,如 squeezenet fp32umodel检测效果: (如在docker内运行,看不到detection.png,请刷新目录)
c)转换成int8umodel
$ convert_squeezenet_to_int8
d)用int8网络检测图片
$ detect_squeezenet_int8
运行完毕,结果如 squeezenet int8umodel检测运行成功输出
同时在examples/calibration/face_demo生成检测之后的图片detection_int8.png,如 squeezenet int8umodel检测效果 所示。
11.4. 示例4:object_detection_python_demo¶
该用例以ssd_vgg300为例,描述python接口的使用方法,以方便用fp32umodel或者int8umodel建立框架程序,用于精度测试或者用于应用程序。
用float32网络检测图片
$ cd <release dir>/examples/calibration/object_detection_python_demo $ python3 ssd_vgg300_fp32_test.py
运行完毕,结果如 ssd vgg300 fp32umodel运行成功输出 所示。
同时在examples/calibration/object_detection_python_demo生成检测之后的图片 person_fp32_detected.jpg,如 ssd vgg300 fp32umodel检测效果 所示。
用int8网络检测图片
python3 ssd_vgg300_int8_test.py
运行完毕,结果如 ssd vgg300转化int8umodel成功输出 所示。
同时在examples/calibration/object_detection_python_demo生成检测之后的图片 person_int8_detected.jpg,如 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成功结果 所示。
在当前文件夹下,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt:
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成功结果 所示。
在当前文件夹下,生成dummy_lmdb随机量化数据目录,新生成compilation文件夹,存放新生成的*.fp32umodel 与*.prototxt:
注意:此例中首先生成了随机量化数据作为转换数据源参数,此数据仅为示例,不能用于后续量化此网络
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编译模型并进行调优