本案例基于PaddleX实现对传统机械式指针表计的检测与自动读数功能,开放表计数据和预训练模型,并提供在windows系统的服务器端以及linux系统的jetson嵌入式设备上的部署指南。
表计读数共分为三个步骤完成:
本案例开放了表计测试图片,用于体验表计读数的预测推理全流程。还开放了表计检测数据集、指针和刻度分割数据集,用户可以使用这些数据集重新训练模型。
| 表计测试图片 | 表计检测数据集 | 指针和刻度分割数据集 |
|---|---|---|
| meter_test | meter_det | meter_seg |
本案例开放了预先训练好的检测模型和语义分割模型,可以使用这些模型快速体验表计读数全流程,也可以直接将这些模型部署在服务器端或jetson嵌入式设备上进行推理预测。
| 表计检测模型 | 指针和刻度分割模型 |
|---|---|
| meter_det_inference_model | meter_seg_inference_model |
可以使用本案例提供的预训练模型快速体验表计读数的自动预测全流程。如果不需要预训练模型,可以跳转至小节模型训练 重新训练模型。
安装的相关问题参考PaddleX安装
step 1. 下载PaddleX源码:
git clone https://github.com/PaddlePaddle/PaddleX
step 2. 预测执行文件位于PaddleX/examples/meter_reader/,进入该目录:
cd PaddleX/examples/meter_reader/
预测执行文件为reader_infer.py,其主要参数说明如下:
| 参数 | 说明 |
|---|---|
| detector_dir | 表计检测模型路径 |
| segmenter_dir | 指针和刻度分割模型路径 |
| image | 待预测的图片路径 |
| image_dir | 存储待预测图片的文件夹路径 |
| save_dir | 保存可视化结果的路径, 默认值为"output" |
| score_threshold | 检测模型输出结果中,预测得分低于该阈值的框将被滤除,默认值为0.5 |
| seg_batch_size | 分割的批量大小,默认为2 |
| use_camera | 是否使用摄像头采集图片,默认为False |
| camera_id | 摄像头设备ID,默认值为0 |
| use_erode | 是否使用图像腐蚀对分割预测图进行细分,默认为False |
| erode_kernel | 图像腐蚀操作时的卷积核大小,默认值为4 |
step 3. 预测
若要使用GPU,则指定GPU卡号(以0号卡为例):
export CUDA_VISIBLE_DEVICES=0
若不使用GPU,则将CUDA_VISIBLE_DEVICES指定为空:
export CUDA_VISIBLE_DEVICES=
预测单张图片
python3 reader_infer.py --detector_dir /path/to/det_inference_model --segmenter_dir /path/to/seg_inference_model --image /path/to/meter_test/20190822_168.jpg --save_dir ./output --use_erode
预测多张图片
python3 reader_infer.py --detector_dir /path/to/det_inference_model --segmenter_dir /path/to/seg_inference_model --image_dir /path/to/meter_test --save_dir ./output --use_erode
开启摄像头预测
python3 reader_infer.py --detector_dir /path/to/det_inference_model --segmenter_dir /path/to/seg_inference_model --save_dir ./output --use_erode --use_camera
step 1. 下载PaddleX源码:
git clone https://github.com/PaddlePaddle/PaddleX
step 2. 将PaddleX\examples\meter_reader\deploy\cpp下的meter_reader文件夹和CMakeList.txt拷贝至PaddleX\deploy\cpp目录下,拷贝之前可以将PaddleX\deploy\cpp下原本的CMakeList.txt做好备份。
step 3. 按照Windows平台部署中的Step2至Step4完成C++预测代码的编译。
step 4. 编译成功后,可执行文件在out\build\x64-Release目录下,打开cmd,并切换到该目录:
cd PaddleX\deploy\cpp\out\build\x64-Release
预测程序为paddle_inference\meter_reader.exe,其主要命令参数说明如下:
| 参数 | 说明 | | ---- | ---- | | det_model_dir | 表计检测模型路径 | | seg_model_dir | 指针和刻度分割模型路径| | image | 待预测的图片路径 | | image_list | 按行存储图片路径的.txt文件 | | use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| | gpu_id | GPU 设备ID, 默认值为0 | | save_dir | 保存可视化结果的路径, 默认值为"output"| | seg_batch_size | 分割的批量大小,默认为2 | | thread_num | 分割预测的线程数,默认为cpu处理器个数 | | use_camera | 是否使用摄像头采集图片,支持值为0或1(默认值为0) | | camera_id | 摄像头设备ID,默认值为0 | | use_erode | 是否使用图像腐蚀对分割预测图进行去噪,支持值为0或1(默认值为1) | | erode_kernel | 图像腐蚀操作时的卷积核大小,默认值为4 | | score_threshold | 检测模型输出结果中,预测得分低于该阈值的框将被滤除,默认值为0.5|
step 5. 推理预测:
用于部署推理的模型应为inference格式,本案例提供的预训练模型均为inference格式,如若是重新训练的模型,需参考部署模型导出将模型导出为inference格式。
使用未加密的模型对单张图片做预测
.\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --image=\path\to\meter_test\20190822_168.jpg --use_gpu=1 --use_erode=1 --save_dir=output
使用未加密的模型对图像列表做预测 图像列表image_list.txt内容的格式如下,因绝对路径不同,暂未提供该文件,用户可根据实际情况自行生成:
\path\to\images\1.jpg
\path\to\images\2.jpg
...
\path\to\images\n.jpg
.\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --image_list=\path\to\meter_test\image_list.txt --use_gpu=1 --use_erode=1 --save_dir=output
使用未加密的模型开启摄像头做预测
.\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --use_camera=1 --use_gpu=1 --use_erode=1 --save_dir=output
使用加密后的模型对单张图片做预测
如果未对模型进行加密,请参考加密PaddleX模型对模型进行加密。例如加密后的检测模型所在目录为\path\to\encrypted_det_inference_model,密钥为yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0=;加密后的分割模型所在目录为\path\to\encrypted_seg_inference_model,密钥为DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=
.\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\encrypted_det_inference_model --seg_model_dir=\path\to\encrypted_seg_inference_model --image=\path\to\test.jpg --use_gpu=1 --use_erode=1 --save_dir=output --det_key yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0= --seg_key DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=
step 1. 下载PaddleX源码:
git clone https://github.com/PaddlePaddle/PaddleX
step 2. 将PaddleX/examples/meter_reader/deploy/cpp下的meter_reader文件夹和CMakeList.txt拷贝至PaddleX/deploy/cpp目录下,拷贝之前可以将PaddleX/deploy/cpp下原本的CMakeList.txt做好备份。
step 3. 按照Nvidia Jetson开发板部署中的Step2至Step3完成C++预测代码的编译。
step 4. 编译成功后,可执行程为build/meter_reader/meter_reader,其主要命令参数说明如下:
| 参数 | 说明 | | ---- | ---- | | det_model_dir | 表计检测模型路径 | | seg_model_dir | 指针和刻度分割模型路径| | image | 待预测的图片路径 | | image_list | 按行存储图片路径的.txt文件 | | use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| | gpu_id | GPU 设备ID, 默认值为0 | | save_dir | 保存可视化结果的路径, 默认值为"output"| | seg_batch_size | 分割的批量大小,默认为2 | | thread_num | 分割预测的线程数,默认为cpu处理器个数 | | use_camera | 是否使用摄像头采集图片,支持值为0或1(默认值为0) | | camera_id | 摄像头设备ID,默认值为0 | | use_erode | 是否使用图像腐蚀对分割预测图进行细分,支持值为0或1(默认值为1) | | erode_kernel | 图像腐蚀操作时的卷积核大小,默认值为4 | | score_threshold | 检测模型输出结果中,预测得分低于该阈值的框将被滤除,默认值为0.5|
step 5. 推理预测:
用于部署推理的模型应为inference格式,本案例提供的预训练模型均为inference格式,如若是重新训练的模型,需参考部署模型导出将模型导出为inference格式。
使用未加密的模型对单张图片做预测
./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --image=/path/to/meter_test/20190822_168.jpg --use_gpu=1 --use_erode=1 --save_dir=output
使用未加密的模型对图像列表做预测 图像列表image_list.txt内容的格式如下,因绝对路径不同,暂未提供该文件,用户可根据实际情况自行生成:
\path\to\images\1.jpg
\path\to\images\2.jpg
...
\path\to\images\n.jpg
./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --image_list=/path/to/image_list.txt --use_gpu=1 --use_erode=1 --save_dir=output
使用未加密的模型开启摄像头做预测
./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --use_camera=1 --use_gpu=1 --use_erode=1 --save_dir=output
安装的相关问题参考PaddleX安装
表盘检测的训练
python3 /path/to/PaddleX/examples/meter_reader/train_detection.py
指针和刻度分割的训练
python3 /path/to/PaddleX/examples/meter_reader/train_segmentation.py
运行以上脚本可以训练本案例的检测模型和分割模型。如果不需要本案例的数据和模型参数,可更换数据,选择合适的模型并调整训练参数。