乐趣区

关于人工智能:飞桨助力动车3C车载智能识别为动车组运行保驾护航

我的项目背景

动车组车载接触网运行状态检测安装(3C)是指在经营动车组上装置的车载接触网运行状态检测安装。其随动车组运行,全天候等速在线检测监测接触网、弓网匹配运行状态,检测监测接触网⼏何参数、红外图像、可见光图像等后果,并将后果用于领导接触网培修。

受到接触网张力、机械触动、天气、设施运行寿命等因素影响,接触网经营过程中易呈现典型缺点,如有鸟害、接触网吊弦断裂、接触网吊弦脱落、接触网吊弦松弛、异物缠绕等,尽管该类缺点在短时间内不能间接造成重大病害后果,但积攒后可能引发接触网塌网等重大事故,从而造成列车停运。同时列车运行过程中,因为受到接触网参数扭转、异物等因素影响,可造成击打、击毁受电弓的重大事故,应用惯例办法很难短时间定位事变详情。该类事变的监测虽不能预防以后事变产生,但捕获事变后,能对后续列车的运行提供精确的经营领导,大幅度降低事变影响面及经济损失。

本我的项目基于 3C 可见光图像,钻研如何落地一套车载实时智能识别系统,可能监控 接触网检测、受电弓监测 中的局部高危缺点。

为了观测并捕获接触网部件缺失、松脱、异物及受电弓异样等影响行车安全事件的状况,3C 设施须要具备全天候、凋谢环境、实时性的运行特点,因而须要边云一体化的车地协同计划,以解决户外场景简单、数据量宏大、实时剖析的艰难。但因 车载硬件资源无限 车载设施功率限定 等因素,均不利于车载实时剖析。因而本我的项目通过⼈⼯智能伎俩,依靠无限车载运算资源进一步在放弃检测指标的根底上压迫计算工夫、减少检测内容,实现边采集图像数据,边实时剖析图像缺点的边缘智能感知性能,补救了 3C 数据分析量大、剖析及时性有余问题,使得接触网相干重要缺点可能在经营车运行过程中被及时发现与上报,为供电检测的智能化提供无效伎俩。

我的项目介绍

接触网检测

数据筹备及预处理:数据类别: 蕴含鸟害、吊弦断、吊弦脱、异物四类。数据数量: 共计约 1 万张图像。数据划分: 采纳分层采样宰割数据集,每个类别在训练集、验证集、测试集中的比例尽可能靠近 6:2:2。预处理注意事项: 1. 数据集指标较细,而户外环境经常出现逆光状况,因而对数据加强中的亮度调节要把握尺度;2. 针对局部图像 resize 后失真导致指标对象歧义的缺点,须要放弃图像的原始比例;3. 若服务器产生 CPU 瓶颈,能够在 reader.yml 中应用 DecodeCache 代替 Decode,以开释局部 CPU 压力。

模型训练及评估

针对车载边缘检测场景,本我的项目选用了基于飞桨指标检测套件 PaddleDetection 的 PP-PicoDet 系列模型进行试验。

1. 调整超参数后,执行命令进行多卡训练,同时开启 VisualDL 及训练时评估。

1.    export CUDA_VISIBLE_DEVICES=0,1,2,3
2.    python -m paddle.distributed.launch --gpus 0,1,2,3  tools/train.py
3.    -c /xsw/train/model/C3/picodet/picodet_s_416.yml
4.    --use_vdl=true
5.    --vdl_log_dir=/xsw/train/model/C3/picodet/vdl_dir_picodet_s_416/scalar
6.    --eval

2. 观测 VisualDL 训练状态。

1.    visualdl --logdir \10.2.3.25\shareXSW\train\model\C3\picodet\vdl_dir_picodet_s_416\scalar --port=8041

3. 基于最佳模型,计算验证集、测试集单类 AP。

1.    python tools/eval.py -c /xsw/train/model/C3/picodet/picodet_s_416.yml
2.    -o weights=/xsw/train/model/C3/picodet/output/picodet_s_416/picodet_s_416/best_model
3.    --classwise

4. 验证集评估后果,如下表所示。

5. 测试集评估后果如下表所示。

模型部署

因既有设施还需承担数据采集、几何参数测量计算等工作,可利用 CPU 资源无限。依据经济因素、运维因素及功率限定的考量,咱们利用了闲暇的集成显卡,采纳基于 OpenVINO 的部署形式。该形式具备较低的推理时长及较低的 CPU 占用,为残余业务留出空间。

模型导出可参照:PaddleDetection

模型导出为 ONNX 格局教程:https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/deploy/EXPORT_ONNX_MODEL.md

  1. 导出飞桨部署模型:
1.    python tools/export_model.py -c /xsw/train/model/C3/picodet/picodet_s_416.yml
2.    -o weights=/xsw/train/model/C3/picodet/output/picodet_s_416/picodet_s_416/best_model.params
3.    TestReader.inputs_def.image_shape=[3,416,416]
4.    --output_dir /xsw/train/model/C3/picodet/inference_model

2. 导出 PaddleDetection 模型为 ONNX:

1paddle2onnx --model_dir /xsw/train/model/C3/picodet/inference_model/picodet_s_416
2--model_filename model.pdmodel
3--params_filename model.pdiparams
4--opset_version 11
5--save_file /xsw/train/model/C3/picodet/picodet_s_416.onnx
  1. 基于 OpencvDNN 模块应用 ONNX 模型:这里须要阐明,OpenCV 的 DNN 模块针对集成显卡推理具备基于 OpenCV 和基于 IntelNGRAPH 的两种后端,相应的应用办法不同可能造成巨幅的推理时长变动。

1)基于 OpenCV 后端 该模块可间接读取 ONNX 模型,但网络中的 OperationsSets 反对无限,更多 OperationsSets 须要自定义。

既有 OperationsSets 反对参考:Thesupportedlayershttps://github.com/opencv/opencv/wiki/Deep-Learning-in-OpenCV 自定义 Operations Sets 参考: tutorial_dnn_custom_layershttps://docs.opencv.org/4.x/dc/db1/tutorial_dnn_custom_layers.html

2)基于 IntelNGRAPH 后端 该模块可间接读取 ONNX 模型及 IR 模型。a、读取 ONNX 模型将在线通过 NGRAPH 优化后运行,反对 OperationsSets 绝对较多,应用简便;b、读取 IR 模型是最佳的形式,经试验其能最大化缩小推理时长,但其须要优先装置 OpenVINO,并利用其将 ONNX 模型优化为 IR 模型,但因集成显卡驱动因素影响其尽量实用于 Intel 四代 CPU 之后的硬件设施;

既有 OperationsSets 反对参考:AvailableOperationsSetshttps://docs.openvino.ai/latest/openvino_docs_ops_opset7.html#doxid-openvino-docs-ops-opset7

IR 模型转换参考: ConvertaPaddlePaddleModeltoONNXandOpenVINOIRhttps://docs.openvino.ai/latest/notebooks/103-paddle-onnx-to-openvino-classification-with-output.html2. 数据后处理参考:PicoDetPostProcesshttps://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/cpp/src/picodet_postprocess.cc3. 推理工夫如下表所示。GPU:Intel HD Graphics 530CPU:Intel(R) Core(TM) i7-6700 CPU @3.40GHz 3.41GHzVPU:Movidius MyriadX

我的项目选用 picodet_lcnet_416 模型,指标较原有自定义模型晋升 2%,推理速度减速 53%,为进⼀步业务算法施行提供了可能性。

受电弓监测

针对车载边缘检测场景,本我的项目选用了 基于 PaddleDetection 的 keypoint 模型 试验。

数据筹备及预处理

数据类别: 外部数据集设计蕴含 10 个受电弓关键点;数据数量:共计约 2 千张图像;

数据划分: 采纳分层采样宰割数据集,使得每个类别训练集: 验证集尽可能靠近 8:2。

模型训练及评估

不同于通用的行人姿势检测,本我的项目姿势检测为受电弓,数据集指标对象将产生迁徙。基于关键点的自定义数据集训练,因指标关键点数量和关键点含意的变动,须要批改几处内容:

1. 因关键点数量及指标对象的变动,须要批改局部源码及配置:

1.    # *.yml 训练配置,仅列举因指标对象和关键点数量变动的要害参数
2.    num_joints: &num_joints 10
3.    train_height: &train_height 288
4.    train_width: &train_width 384
5.    #输入热⼒图尺⼨(宽,高)6.    hmsize: &hmsize [96, 72]
7.    #左右关键点经图像翻转时对应关系
8.    flip_perm: &flip_perm [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]

2. 以后 PaddleDetection 中的要害的检测评估指标是基于 coco OKS 的,其 OKS 中的 kpt_oks_sigmas 参数来源于 coco 关键点数据集。因自定义关键点数据集的关键点数量、标注内容变动,须要批改相应的 kpt_oks_sigmas 适配自定义数据集。(kpt_oks_sigmas 含意为每个关键点各自的数据集标准差,COCO 上是对同⼀个指标的 5000 次不同标注产生的标准差。其值越大,阐明在整个数据集中对这个点的标注一致性越差; 值越小,阐明整个数据集中对这个点的标注一致性越好。如 coco 数据集中:{鼻子:0.026,眼睛:0.025,耳朵:0.035,肩膀:0.079,手肘:0.072,手段:0.062,臀部:0.107,膝盖:0.087,脚踝:0.089})

 1#ppdet/metrics/metrics.py
 2COCO_SIGMAS = ...
 3#ppdet/modeling/keypoint_utils.py def oks_iou(...):
 4...
 5sigmas = ...
 6...
 7
 8# 库中 pycocotools 的 cocoeval.py class Params:
 9...
10def setKpParams(self):
11...
12self.kpt_oks_sigmas = ...
13...

3. 如果心愿可视化关键点骨架后果,也须要批改相应源码:

1.    #ppdet/utils/visualizer.py
2.    EDGES= ...
  1. 调整超参数后,执行训练并开启 visualDL 及训练时评估。
 1# 训练
 2python tools/train.py -c /xsw/train/model/C3_BowPt/hrnet/dark_hrnet.yml
 3--use_vdl=true
 4--vdl_log_dir=/xsw/train/model/C3_BowPt/hrnet/vdl_dir_hrnet_dark_hrnet/scalar
 5--eval
 6
 7# 观测
 8visualdl --logdir  \10.2.3.25\shareXSW\train\model\C3_BowPt\hrnet\vdl_dir_hrnet_dark_hrnet\scalar  --port
 9=8041
10
11# 评估
12python tools/eval.py -c /xsw/train/model/C3_BowPt/hrnet/dark_hrnet.yml
13-o Global.checkpoints=/xsw/train/model/C3_BowPt/hrnet/output/dark_hrnet_w32/best_model.pdparams

5. 应用模型推理未标注数据测试。

1.    python tools/infer.py -c /xsw/train/model/C3_BowPt/hrnet/dark_hrnet.yml
2.    -o weights=/xsw/train/model/C3_BowPt/hrnet/output/dark_hrnet/best_model.pdparams
3.    --infer_dir=/xsw/train/data/C3_BowPt_cut/poc/val/images
4.    --draw_threshold=0.2
5.    --save_txt=True
6.    --output_dir=/xsw/train/model/C3_BowPt/hrnet/output/infer_dark_hrnet

6. 验证集评估后果。

模型部署

1. 导出飞桨部署模型。

1.    python tools/export_model.py -c /xsw/train/model/C3_BowPt/hrnet/dark_hrnet.yml
2.    -o weights=/xsw/train/model/C3_BowPt/hrnet/output/dark_hrnet/best_model.pdparams
3.    --output_dir /xsw/train/model/C3_BowPt/hrnet/inference_model

2. 导出 PaddleDetection 模型为 ONNX。

1.    paddle2onnx --model_dir /xsw/train/model/C3_BowPt/hrnet/inference_model/dark_hrnet
2.    --model_filename model.pdmodel
3.    --params_filename model.pdiparams
4.    --opset_version 11
5.    --save_file /xsw/train/model/C3_BowPt/hrnet/dark_hrnet.onnx
  1. 推理工夫如下表所示。GPU:IntelHDGraphics530CPU:Intel(R)Core(TM)i7-6700CPU@3.40GHz3.41GHz

我的项目成果

接触网检测后果可视化

鸟害

吊弦脱

吊弦断

异物

受电弓监测后果可视化

总体成果

截止目前新版算法已扩大部署动车 30 辆、机车 16 辆,单月累积巡线超过 170 万 KM,检出上述类型缺点超过 3000 个。

欢送关注 PaddleDetection:https://github.com/PaddlePaddle

退出移动版