管道巡检软体机器人 YOLOv8 模型部署全流程(PT→ONNX→昇腾OM)
项目背景:本项目针对搭载摄像头的管道内部巡检软体机器人开发,实现管道内部缺陷、障碍物、异物的实时AI检测,完成从PC端训练到边缘端部署的完整链路。
开源仓库:AtomGit 公开仓库
适配设备:香橙派AIPro(搭载昇腾310B4芯片)
核心链路:训练权重.pt→ 通用中间模型.onnx→ 边缘推理模型.om一站式转换+验证
目录
- 一、项目简介
- 二、应用场景
- 三、环境依赖准备
- 四、本地PT模型验证推理
- 五、PT一键转ONNX+验证推理
- 六、香橙派ATC转为OM模型
- 七、机器人端推理开发说明
- 八、常见问题排查
- 九、开源声明与协议
一、项目简介
管道广泛应用于市政工程、石油化工、给排水等领域,长期运行易出现破损、堵塞、异物堆积、裂纹等问题,人工巡检难度大、风险高。
本项目依托自带摄像装置的管道内部巡检软体机器人,搭载香橙派AIPro边缘计算设备,利用YOLOv8目标检测算法,实现管道内部的实时图像采集、缺陷自动识别、异物目标检测。
整套方案分为三步:
- PC端采集管道图像数据集,训练YOLOv8模型,生成best.pt权重文件
- 将.pt模型转为通用ONNX格式,完成模型校验与精度对齐
- 在香橙派AIPro上,通过昇腾ATC工具编译为硬件适配的.om模型,实现机器人端离线推理
本文提供全套可直接运行的代码、完整操作步骤,无需复杂修改,即可落地到管道巡检软体机器人设备上。
二、应用场景
- 适用设备:带视觉摄像头的管道内部巡检软体机器人
- 检测目标:管道裂纹、破损、堵塞物、异物、腐蚀点、淤泥堆积等
- 运行环境:狭小密闭管道、地下管网、工业管道等复杂场景
- 优势:边缘端离线推理、低功耗、实时检测、适配机器人移动作业
三、环境依赖准备
3.1 本地PC训练&转换环境
用于模型训练、PT权重验证、ONNX格式转换,配备常规电脑即可
pipinstallultralytics onnx onnxruntime opencv-python numpy onnx-simplifier3.2 机器人端设备环境(香橙派AIPro)
- 核心芯片:Ascend310B4
- 搭载设备:管道巡检软体机器人主控
- 预装软件:Ascend CANN开发套件、ATC模型转换工具、AscendCL运行环境
- 外设:机器人搭载的高清管道摄像头
四、本地PT模型验证推理
在模型格式转换前,先对PC端训练好的.pt权重进行推理校验,确认模型能正常识别管道内部目标,保证权重无损坏、精度达标。
# pt_infer.py# 管道巡检机器人 YOLOv8 权重验证代码fromultralyticsimportYOLOimportnumpyasnp# 路径配置(替换为你的模型和测试图片路径)model_path="D:/suanfa1/yolov8/runs/detect/train3/weights/best.pt"# 测试图建议选用管道内部实拍图,贴合机器人采集画面image_path="D:/suanfa1/yolov8/dataset/test/images/4560_jpg.rf.8c932b6c93142dddbdbb2669fa475a62.jpg"defload_and_infer():# 加载YOLOv8模型try:model=YOLO(model_path)print(f"✅ 成功加载管道巡检模型:{model_path}")exceptExceptionase:print(f"❌ 模型加载失败:{e}")return# 对管道内部图片进行推理print(f"\n📊 正在推理管道巡检图片:{image_path}")results=model(image_path,conf=0.25,save=False)# 打印检测结果print(f"\n🔥 推理完成,共识别到{len(results)}组目标\n")fori,outinenumerate(results):print("="*60)print(f" 输出{i}: ")print("="*60)print("\n【完整输出信息】")print(out)# 解析管道缺陷/异物检测结果print("\n【解析后关键检测信息】")ifout.boxesisnotNone:boxes=out.boxesprint(f"管道内检测目标总数:{len(boxes)}")forbox_idx,boxinenumerate(boxes):# 提取目标坐标、置信度、类别xyxy=box.xyxy[0].cpu().numpy()conf=box.conf[0].cpu().numpy()cls_id=int(box.cls[0].cpu().numpy())cls_name=model.names[cls_id]print(f"\n 目标{box_idx+1}:")print(f" 边界框:{np.round(xyxy,2)}")print(f" 置信度:{conf:.4f}")# 类别对应管道裂纹、堵塞物、异物等自定义标签print(f" 检测类别:{cls_name}(ID:{cls_id})")print("\n"+"-"*60)if__name__=="__main__":load_and_infer()运行结果:能正常识别管道内部缺陷、障碍物,输出坐标和类别,即可进入下一步格式转换。
五、PT一键转ONNX+验证推理
本脚本集成三大功能:PT模型转ONNX + 模型合法性校验 + ONNX Runtime推理,推理结果与原生PT格式完全对齐,贴合机器人部署需求,避免精度丢失。
# pt2onnx.py# 管道巡检机器人 模型格式转换专用代码fromultralyticsimportYOLOimportonnximportonnxruntimeasortimportnumpyasnpimportcv2importos# 路径配置(替换为你的本地路径)model_path="D:/suanfa1/yolov8/runs/detect/train3/weights/best.pt"onnx_output_path=os.path.splitext(model_path)[0]+".onnx"# 测试图采用管道内部实拍图image_path="D:/suanfa1/yolov8/dataset/test/images/4560_jpg.rf.8c932b6c93142dddbdbb2669fa475a62.jpg"# 模型参数(与训练、机器人推理保持一致)imgsz=640conf_threshold=0.25iou_threshold=0.45# 修改为你的管道检测类别总数(如裂纹、堵塞、异物等)num_classes=4defconvert_pt_to_onnx():print("="*80)print("管道巡检模型:PT 正在转为 ONNX 格式")print("="*80)try:model=YOLO(model_path)print("✅ PT模型加载成功")exceptExceptionase:print(f"❌ 加载失败:{e}")returnFalse# 昇腾平台兼容配置model.export(format="onnx",imgsz=imgsz,opset=12,simplify=True,save=True,batch=1,conf=conf_threshold,iou=iou_threshold)# 校验ONNX模型是否生成ifos.path.exists(onnx_output_path):size_mb=os.path.getsize(onnx_output_path)/(1024*102)print(f"🎉 ONNX生成成功:{onnx_output_path}大小:{size_mb:.2f}MB")returnTruereturnFalsedefvalidate_onnx_model():print("\n"+"="*80+"\n校验ONNX模型合法性(适配昇腾芯片)\n"+"="*80)try:onnx_model=onnx.load(onnx_output_path)onnx.checker.check_model(onnx_model)print("✅ ONNX结构合法,可用于昇腾转换")returnTrueexceptExceptionase:print(f"❌ 校验失败:{e}")returnFalse# 图像预处理(与机器人摄像头采集逻辑一致)defpreprocess_image(image_path,target_size=640):img=cv2.imread(image_path)orig_h,orig_w=img.shape[:2]scale=min(target_size/orig_w,target_size/orig_h)new_w,new_h=int(orig_w*scale),int(orig_h*scale)img_resized=cv2.resize(img,(new_w,new_h))# 黑边填充,保持图像比例不变canvas=np.zeros((target_size,target_size,3),np.uint8)ox,oy=(target_size-new_w)//2,(target_size-new_h)//2canvas[oy:oy+new_h,ox:ox+new_w]=img_resized# 格式转换img_rgb=cv2.cvtColor(canvas,cv2.COLOR_BGR2RGB)tensor=img_rgb.transpose(2,0,1).astype(np.float32)/255.0tensor=np.expand_dims(tensor,axis=0)returnimg,tensor,orig_w,orig_h,scale,ox,oy# 后处理解析(还原管道目标坐标)defpostprocess_output(outputs,orig_w,orig_h,scale,ox,oy,conf_thres,iou_thres):output=outputs[0][0].transpose(1,0)cxcywh=output[:,:4]cls_scores=output[:,4:]confs=np.max(cls_scores,axis=1,keepdims=True)cls_ids=np.argmax(cls_scores,axis=1,keepdims=True)# 过滤低置信度目标mask=confs>conf_thres mask=mask.squeeze()cxcywh,confs,cls_ids=cxcywh[mask],confs[mask],cls_ids[mask]iflen(cxcywh)==0:returnnp.array([]),np.array([]),np.array([])# 坐标转换cx=np.clip(cxcywh[:,0],0.01,0.99)*imgsz cy=np.clip(cxcywh[:,1],0.01,0.99)*imgsz w=np.clip(cxcywh[:,2],0.01,0.99)*imgsz h=np.clip(cxcywh[:,3],0.01,0.99)*imgsz x1,y1=cx-w/2,cy-h/2x2,y2=cx+w/2,cy-h/2boxes=np.stack([x1,y1,x2,y2],axis=1)# 映射回原图尺寸boxes[:,[0,2]]=(boxes[:,[0,2]]-ox)/scale boxes[:,[1,3]]=(boxes[:,[1,3]]-oy)/scale boxes=np.clip(boxes,0,[orig_w,orig_h,orig_w,orig_h])# 非极大值抑制,去重框idx=cv2.dnn.NMSBoxes(boxes.tolist(),confs[:,0].tolist(),conf_thres,iou_thres)iflen(idx)==0:returnnp.array([]),np.array([]),np.array([])idx=idx.flatten()returnboxes[idx],confs[idx],cls_ids[idx]# ONNX推理definfer_onnx_model():print("\n"+"="*80+"\nONNX 模型推理(模拟机器人端运行)\n"+"="*80)_,tensor,orig_w,orig_h,scale,ox,oy=preprocess_image(image_path)sess=ort.InferenceSession(onnx_output_path,providers=["CPUExecutionProvider"])in_name=sess.get_inputs()[0].name# 测速importtime t0=time.time()outs=sess.run(None,{in_name:tensor})t_cost=(time.time()-t0)*1000# 解析结果boxes,confs,cls_ids=postprocess_output(outs,orig_w,orig_h,scale,ox,oy,conf_threshold,iou_threshold)model=YOLO(model_path)print(f"推理耗时:{t_cost:.2f}ms 管道内检测目标数量:{len(boxes)}")fori,(b,c,cls)inenumerate(zip(boxes,confs,cls_ids)):cid=cls.item()cname=model.names[cid]print(f"\n目标{i+1}坐标:{np.round(b,2)}置信度:{c[0]:.4f}类别:{cname}")if__name__=="__main__":ifconvert_pt_to_onnx()andvalidate_onnx_model():infer_onnx_model()关键参数说明(适配管道机器人)
- imgsz=640:与训练、机器人摄像头采集尺寸严格对齐,保证识别精度
- opset=12:昇腾310B4兼容性最优,避免转换报错
- simplify=True:精简模型算子,降低设备功耗,适合机器人长时间作业
六、香橙派ATC转为OM模型
ONNX模型无法直接在香橙派AIPro上运行,需通过昇腾ATC工具编译为.om离线模型,部署到管道巡检软体机器人。
6.1 上传ONNX模型
将生成的best.onnx文件,上传至香橙派指定路径(可自定义):
/home/HwHiAiUser/suanfa/guiguigui/haigui_change/6.2 执行ATC转换命令
登录香橙派终端,进入CANN环境,执行以下命令:
atc\--model=/home/HwHiAiUser/suanfa/guiguigui/haigui_change/best.onnx\--framework=5\--output=/home/HwHiAiUser/suanfa/guiguigui/haigui_change/best\--soc_version=Ascend310B46.3 转换结果
命令执行完毕后,对应目录会生成best.om文件,即为管道巡检机器人专用推理模型。
七、机器人端推理开发说明
将.om模型部署到软体机器人后,按照以下流程开发推理程序,实现管道内部实时检测:
- 初始化:启动香橙派,加载AscendCL环境,载入.om模型
- 图像采集:调用机器人搭载的摄像头,实时采集管道内部画面
- 图像预处理:复用本文代码中的预处理逻辑,保证格式对齐
- 模型推理:调用OM模型,完成缺陷、异物识别
- 结果解析:解析目标坐标、类别,标记管道问题点
- 后续动作:存储检测数据、回传结果、控制机器人避障
- 资源释放:推理结束,释放模型与设备资源
整套推理流程轻量化,适合管道内移动作业、低功耗长时间运行。
八、常见问题排查
| 问题现象 | 原因与解决方案 |
|---|---|
| PT转ONNX失败 | 更新ultralytics库,开启simplify参数,opset固定为12 |
| ONNX校验不通过 | 固定batch=1,去除动态轴,用onnx-simplifier手动优化 |
| ATC转换OM报错 | 核对soc_version为Ascend310B4,降低opset版本,检查模型路径 |
| 机器人端识别不准 | 预处理逻辑与PC端不一致,补全填充、缩放步骤;用管道实拍图训练模型 |
| 推理速度慢 | 开启模型精简,降低输入分辨率,关闭冗余后处理 |
九、开源声明与协议
开源说明
本项目全套代码、文档已开源至AtomGit平台,完全免费,专为管道内部巡检软体机器人场景定制。
- 包含:PT权重验证代码、PT转ONNX代码、ATC转换命令、部署教程
- 适用:个人学习、毕业设计、工程项目二次开发
- 欢迎Star、Fork,提交Issue交流优化,共同完善管道巡检AI方案
