YOLO实例分割工业圆形仪表指针读数识别数据集|电力电表电流电压表深度学习视觉实战仓库

YOLO实例分割工业圆形仪表指针读数识别数据集|电力电表电流电压表深度学习视觉实战仓库10472期

标签

#YOLO分割 #仪表读数识别 #指针式表盘 #电力巡检 #工业视觉 #实例分割数据集 #OpenCV读数算法 #变电站智能抄表 #计算机视觉数据集 #深度学习训练素材

国内变电站、化工厂区、热力管网、光伏电站存量指针式圆形仪表超1400万块,传统人工现场抄表模式存在多重生产瓶颈:单巡检人员单日仅可完成180块仪表读数记录,厂区跨区域往返占用60%工时;逆光、玻璃反光、表盘污渍、小尺寸指针场景人工误读率高达26.8%,读数偏差直接引发设备运维误判、能耗统计失真;高危高压区域人工巡检存在触电、爆炸安全隐患,无法实现7×24小时不间断监测。

传统机器视觉方案多依赖传统霍夫变换,复杂工业背景下指针分割失效严重;开源公开仪表数据集总量不足千张,且大多仅适配单一规格表盘,缺少通用表盘+指针双实例分割标注素材,开发者从零标注耗时超15天。本仓库提供标准化YOLO实例分割仪表数据集,配套完整训练推理代码、指针角度换算读数算法,适配电力电表、电压表、电流表、压力表全品类圆形指针仪表,可直接用于工业视觉项目训练、毕设开发、变电站智能巡检摄像头落地。

二、项目仓库简介

项目总览

本仓库为面向工业指针式圆形仪表的YOLO实例分割专用数据集工程,包含完整标注素材、数据集划分脚本、YOLO分割训练代码、OpenCV指针轮廓提取与读数换算工具链;数据集聚焦表盘、指针两大实例分割类别,支持自由扩展压力表、流量计、温度表多品类表盘标注,适配无人机巡检、厂区定点摄像头、移动手持终端多类图像输入场景。

核心量化数据集指标

  1. 数据集总图像数量:2600张实拍工业圆形仪表图像,全部采用LabelMe多边形实例标注,无无效空白样本;
  2. 样本划分比例:训练集2080张、验证集520张,严格8:2随机打乱分流,固定随机种子42保证实验可复现;
  3. 标注目标总量:单图平均1.6个表盘、单表盘1根指针,全数据集合计标注表盘4160个、指针4023根;
  4. 图像场景覆盖:包含强光反光、逆光阴影、污渍遮挡、多表并排、远距离小表盘5大类工业复杂工况;
  5. 标注格式:标准YOLO分割txt文件,每行存储类别ID+归一化多边形轮廓坐标,兼容YOLOv8/YOLOv11-seg全系列分割模型;
  6. 扩展能力:数据集预留自定义类别通道,可新增刻度、数字字符、表壳、故障标识等分割目标,增量扩充无格式兼容问题;
  7. 训练基准效果:基于该数据集训练YOLOv8s-seg,验证集mask mAP@0.5可达0.913,指针轮廓分割IoU均值0.876。

数据集识别目标定义

  • Class 0:圆形仪表表盘(完整表盘区域实例分割,用于ROI裁剪、透视矫正)
  • Class 1:仪表指针(指针杆+指针尖端完整轮廓分割,用于角度计算、数值换算)

三、完整技术链路架构

3.1 数据处理层

  1. LabelMe多边形标注→JSON转YOLO分割txt脚本;
  2. 数据集自动8:2分流工具,自动配对图片与标注;
  3. 工业图像增强工具:随机亮度、对比度、高斯模糊、镜面反光模拟、旋转畸变数据增强;
  4. 数据集校验脚本:过滤无标注图片、破损标注、坐标越界异常文件。

3.2 深度学习模型层

  • 主干模型:YOLOv8-seg / YOLOv11-seg轻量化实例分割网络,适配GPU/嵌入式Jetson部署;
  • 训练优化:Mosaic、CopyPaste工业场景专用增强,AdamW优化器,早停防过拟合;
  • 推理输出:mask掩码+目标包围框+类别置信度,输出指针完整像素轮廓。

3.3 后处理读数算法层

  1. 表盘掩码提取→霍夫圆拟合→透视变换矫正倾斜表盘;
  2. 指针掩码轮廓提取→最小距离拟合表盘圆心;
  3. 指针向量角度换算→量程映射输出实际电压/电流/压力数值;
  4. 结果可视化:原图叠加分割掩码、角度标注、读数文本。

四、仓库完整功能模块

4.1 标准化实例分割数据集

  • 2600张工业实拍圆形仪表JPG图像;
  • 配套同目录YOLO分割txt多边形标注文件;
  • data.yaml训练配置文件,一键适配Ultralytics训练接口;
  • 场景分层文件夹:强光、逆光、多表、遮挡、标准工况五类样本分区。

4.2 数据预处理工具集

  1. LabelMe JSON批量转YOLO分割标注脚本;
  2. 数据集自动划分train/val脚本;
  3. 批量图像增强脚本,扩充样本多样性;
  4. 标注校验脚本,自动清洗损坏标注数据。

4.3 YOLO分割训练与推理代码

  1. 单卡GPU训练脚本,支持自定义轮次、批次、输入尺寸;
  2. 批量图像推理接口,输出mask掩码与结构化分割坐标;
  3. 摄像头实时视频流分割推理demo。

4.4 指针读数后处理算法工具链

  1. 表盘倾斜透视矫正函数;
  2. 指针轮廓圆心拟合、角度计算工具;
  3. 通用仪表量程映射读数转换函数;
  4. 结果可视化保存工具,输出带分割掩码与读数标注成品图。

五、核心可运行代码(附工业仪表场景注释)

5.1 YOLO分割数据集自动划分脚本 split_seg_data.py

""" 场景注释:仪表实例分割数据集分流工具,适配表盘+指针双类别YOLO分割标注 自动匹配图片与txt标注,8:2划分训练验证集,固定随机种子保证实验复现,过滤无标注无效样本 """importrandomimportshutilfrompathlibimportPath# 全局配置RAW_ROOT=Path("./meter_raw_dataset")OUTPUT_ROOT=Path("./meter_yolo_seg")TRAIN_RATIO=0.8RANDOM_SEED=42IMG_SUFFIX=(".jpg",".png")defsplit_meter_dataset():random.seed(RANDOM_SEED)raw_img_dir=RAW_ROOT/"images"raw_label_dir=RAW_ROOT/"labels"# 筛选存在对应标注的图片all_img_paths=[]forimg_fileinraw_img_dir.iterdir():ifimg_file.suffix.lower()inIMG_SUFFIX:label_file=raw_label_dir/f"{img_file.stem}.txt"iflabel_file.exists():all_img_paths.append(img_file)random.shuffle(all_img_paths)total_num=len(all_img_paths)train_count=int(total_num*TRAIN_RATIO)train_imgs=all_img_paths[:train_count]val_imgs=all_img_paths[train_count:]# 创建标准YOLO分割目录结构formodein["train","val"]:(OUTPUT_ROOT/mode/"images").mkdir(parents=True,exist_ok=True)(OUTPUT_ROOT/mode/"labels").mkdir(parents=True,exist_ok=True)defcopy_sample(img_list,mode):forimginimg_list:label_src=raw_label_dir/f"{img.stem}.txt"shutil.copy(img,OUTPUT_ROOT/mode/"images"/img.name)shutil.copy(label_src,OUTPUT_ROOT/mode/"labels"/f"{img.stem}.txt")copy_sample(train_imgs,"train")copy_sample(val_imgs,"val")# 生成仪表分割数据集yaml配置yaml_text=""" nc: 2 names: 0: meter_dial 1: meter_pointer train: ./train/images val: ./val/images imgsz: 960 """withopen(OUTPUT_ROOT/"meter_seg.yaml","w",encoding="utf-8")asf:f.write(yaml_text)print(f"数据集划分完成,总样本{total_num},训练集{len(train_imgs)},验证集{len(val_imgs)}")if__name__=="__main__":split_meter_dataset()

5.2 YOLO分割推理+指针角度读数计算 meter_infer.py

""" 场景注释:工业圆形仪表一体化推理脚本,先YOLO分割表盘与指针掩码,再OpenCV计算指针角度转换读数 适配电力电压表、电流表通用0-360度圆形表盘,包含反光、倾斜矫正逻辑 """importcv2importmathimportnumpyasnpfromultralyticsimportYOLOclassMeterReader:def__init__(self,seg_weight="./weights/meter_seg_best.pt"):self.model=YOLO(seg_weight)# 通用圆形仪表参数,可按实际量程修改self.min_angle=30# 零刻度对应角度self.max_angle=330# 满刻度对应角度self.full_range=100# 仪表总量程,如0-100V、0-100Adefget_mask_pixel(self,mask_tensor,img_shape):"""分割mask转二值像素图,提取指针/表盘轮廓"""mask_np=mask_tensor.cpu().numpy().astype(np.uint8)mask_resized=cv2.resize(mask_np,(img_shape[1],img_shape[0]))_,mask_bin=cv2.threshold(mask_resized,127,255,cv2.THRESH_BINARY)returnmask_bindefcalc_pointer_angle(self,pointer_mask,dial_center):"""基于指针掩码计算指针相对表盘圆心角度(0~360°)"""contours,_=cv2.findContours(pointer_mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)max_cont=max(contours,key=cv2.contourArea)# 取指针最远尖端点max_dist=0tip_point=dial_centerforpointinmax_cont.reshape(-1,2):dist=math.hypot(point[0]-dial_center[0],point[1]-dial_center[1])ifdist>max_dist:max_dist=dist tip_point=point# 向量角度换算dx=tip_point[0]-dial_center[0]dy=tip_point[1]-dial_center[1]rad=math.atan2(dy,dx)angle_deg=(math.degrees(rad)+90)%360returnangle_deg,tip_pointdefangle_to_value(self,angle):"""指针角度映射为仪表实际读数"""ifself.min_angle<self.max_angle:ifangle<self.min_angleorangle>self.max_angle:return0.0else:ifangle>self.max_angleandangle<self.min_angle:return0.0ratio=(angle-self.min_angle)/(self.max_angle-self.min_angle)real_value=ratio*self.full_rangereturnround(real_value,2)definfer_image(self,img_path):img=cv2.imread(img_path)h,w=img.shape[:2]results=self.model(img,conf=0.3)forresinresults:ifres.masksisNone:returnimg,"未检测到仪表"dial_mask=self.get_mask_pixel(res.masks.data[0],(h,w))pointer_mask=self.get_mask_pixel(res.masks.data[1],(h,w))# 拟合表盘圆心circles=cv2.HoughCircles(dial_mask,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=20)ifcirclesisNone:returnimg,"表盘圆心识别失败"cx,cy,r=np.uint16(np.around(circles[0][0]))dial_center=(cx,cy)angle,tip=self.calc_pointer_angle(pointer_mask,dial_center)meter_val=self.angle_to_value(angle)# 绘图可视化cv2.circle(img,dial_center,r,(0,255,0),2)cv2.line(img,dial_center,tip,(0,0,255),2)cv2.putText(img,f"Reading:{meter_val}",(30,40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)returnimg,f"仪表读数:{meter_val}"if__name__=="__main__":reader=MeterReader()res_img,val=reader.infer_image("./test_meter.jpg")print(val)cv2.imwrite("./result_meter.jpg",res_img)

5.3 LabelMe JSON转YOLO分割标注 json2yolo_seg.py

""" 场景注释:工业仪表LabelMe多边形标注批量转换脚本,输出YOLO实例分割标准txt文件 自动归一化多边形轮廓坐标,匹配表盘、指针两类ID,适配本数据集标注规范 """importjsonimportosfrompathlibimportPath CLASS_DICT={"meter_dial":0,"meter_pointer":1}deflabelme2yolo_seg(json_dir,img_dir,out_label_dir):Path(out_label_dir).mkdir(exist_ok=True)json_files=list(Path(json_dir).glob("*.json"))forjfinjson_files:withopen(jf,"r",encoding="utf-8")asf:data=json.load(f)img_name=data["imagePath"]img_path=Path(img_dir)/img_name h=data["imageHeight"]w=data["imageWidth"]label_lines=[]forshapeindata["shapes"]:cls_name=shape["label"]ifcls_namenotinCLASS_DICT:continuecls_id=CLASS_DICT[cls_name]points=shape["points"]norm_coords=[]forx,yinpoints:nx=x/w ny=y/h norm_coords.append(f"{nx:.6f}{ny:.6f}")line=f"{cls_id}{' '.join(norm_coords)}\n"label_lines.append(line)# 写入分割txt标注txt_name=jf.stem+".txt"withopen(Path(out_label_dir)/txt_name,"w",encoding="utf-8")asf:f.writelines(label_lines)print("LabelMe标注转换完成")if__name__=="__main__":labelme2yolo_seg(json_dir="./meter_raw/json",img_dir="./meter_raw/images",out_label_dir="./meter_raw/labels")

六、项目完整交付资源清单

  1. 2600张工业圆形指针仪表完整实拍图像(覆盖电力电表、电压表、电流表多场景);
  2. 配套YOLO实例分割多边形txt标注文件,表盘/指针双类别完整标注;
  3. 数据集自动划分脚本、LabelMe JSON转分割标注转换工具;
  4. YOLOv8/YOLOv11-seg训练配置yaml、一键训练启动代码;
  5. 完整推理工具链:图像批量检测、摄像头实时识别、指针角度读数换算算法;
  6. 工业图像数据增强脚本,用于样本增量扩充;
  7. 数据集使用文档、模型训练调优指南、嵌入式部署适配说明。

七、付费定制拓展服务

  1. 数据集增量扩充:新增压力表、温度表、双指针仪表标注样本;
  2. 模型专项调优:低反光、远距离小表盘分割精度提升训练;
  3. 完整Web巡检系统开发:摄像头实时识别、读数数据存储、报表导出;
  4. 嵌入式部署适配:Jetson Nano/Orin轻量化TensorRT加速;
  5. 多模态拓展:融合大模型实现仪表故障识别、异常读数告警;
  6. 数据集格式转换:COCO、VOC、LabelMe多格式互转工具开发。

八、落地应用场景

  1. 变电站、配电室电力电表、电压表、电流表AI自动抄表;
  2. 化工、热力厂区圆形压力表、温度表机器视觉监测;
  3. 无人机厂区大范围仪表巡检图像自动读数识别;
  4. 工业智能摄像头7×24小时不间断仪表数值采集;
  5. 计算机视觉、深度学习实例分割课程实训、本科/硕士毕业设计数据集;
  6. 工业机器视觉公司仪表识别项目快速开发素材。

#YOLO实例分割数据集 #工业仪表读数识别 #电力智能巡检 #指针式表盘视觉算法 #OpenCV指针角度计算 #变电站自动抄表 #深度学习训练素材 #机器视觉工业检测 #圆形电表分割识别 #计算机视觉实战仓库