汛期闯入seg数据集
一、数据集核心信息表
| 总结维度 | 具体内容 |
|---|---|
| 类别 | 共4类,分别为DiaoYuSan、ShuiBianDiaoYu、YouYongNiShui、water |
| 数量 | 图像总数1533张 |
| 图像分辨率 | 未在提供的信息中明确说明 |
| 格式 | 未在提供的信息中明确说明 |
二、数据集应用领域
- 汛期安全监测场景:可用于识别汛期水域及周边的特定目标,比如监测是否存在ShuiBianDiaoYu(水边钓鱼)、YouYongNiShui(游泳溺水)等可能引发安全事故的行为,以及DiaoYuSan(钓鱼伞)这类与人员活动相关的物体,辅助安全管理工作。
- 水利场景分析:能针对数据集中的water(水体)类别进行识别与分割,帮助相关人员掌握汛期水体范围、分布状态,为汛情监测、水域动态变化追踪提供数据支持。
- 计算机视觉模型训练:作为实例分割类型的数据集,可用于训练实例分割算法模型,提升模型在汛期复杂场景下对特定目标的识别精度,为相关技术研发提供数据基础。
三、数据集价值
- 提升汛期安全管理效率:通过提供可用于识别危险行为和相关物体的数据,帮助工作人员快速定位汛期安全隐患,减少人工排查的工作量,提高安全防控的及时性和准确性。
- 支撑水利工作决策:基于对水体及周边目标的识别数据,为水利部门分析汛情、制定防汛措施、评估水域变化影响等提供客观数据参考,助力科学决策。
- 推动相关技术落地:填补了汛期场景下实例分割数据资源的部分缺口,为计算机视觉技术在防汛、水利等领域的实际应用提供数据支撑,促进技术与行业需求的结合。
基于你提供的“汛期闯入”实例分割数据集(含水域(water)、水边钓鱼(ShuiBianDiaoYu)等标注类别),以下为完整的数据集适配方案与训练代码,采用主流的YOLOv8-seg框架(兼顾精度与速度,支持实例分割任务),并针对数据集特性做了细节优化。
一、数据集预处理(关键步骤)
首先需将 Roboflow 导出的标注格式(如你提供的 JSON 中的多边形标注)转换为 YOLOv8-seg 支持的YOLO 格式(图像 + 对应标签文件),步骤如下:
1. 数据集结构整理
最终数据集需符合以下目录结构(便于 YOLO 框架读取):
flood_segmentation/ # 数据集根目录 ├─ images/ # 图像文件夹 │ ├─ train/ # 训练集图像(1496张,来自网页的Train:1496) │ │ ├─ w1920_h0_i244_jpg.jpg │ │ └─ ... │ └─ val/ # 验证集图像(37张,来自网页的Valid:37) │ └─ ... └─ labels/ # 标签文件夹(与图像目录一一对应) ├─ train/ # 训练集标签 │ ├─ w1920_h0_i244_jpg.txt # 对应图像的YOLO格式标签 │ └─ ... └─ val/ # 验证集标签 └─ ...2. 标注格式转换(JSON → YOLO)
网页中提供的标注为多边形(polygon)坐标(如water类的 points 数组),需转换为 YOLO-seg 格式:
- YOLO-seg 标签格式:
[类别ID] [x1/y_width, y1/h_height, x2/y_width, y2/h_height, ...]
(注:坐标需归一化到 0-1 之间,x/y 为像素坐标,width/height 为图像宽高)
转换代码示例(Python):
importjsonimportosfromPILimportImage# 1. 类别映射(需与后续训练配置一致)class_mapping={"water":0,# 水域类,ID=0"ShuiBianDiaoYu":1# 水边钓鱼类,ID=1}# 2. 读取Roboflow导出的JSON标注(网页中"Raw Data"的source数据)json_path="roboflow_annotations.json"# 你的JSON文件路径withopen(json_path,"r",encoding="utf-8")asf:data=json.load(f)# 3. 遍历每个图像的标注,生成YOLO标签forimg_infoindata:# 若JSON为单图像,直接处理img_info=dataimg_name=img_info["name"]# 图像名:如"w1920_h0_i244_jpg"img_path=os.path.join("flood_segmentation/images/train",f"{img_name}.jpg")# 图像路径img=Image.open(img_path)img_w,img_h=img.size# 图像宽高(1920x1080,来自网页)# 生成标签文件路径label_dir="flood_segmentation/labels/train"os.makedirs(label_dir,exist_ok=True)label_path=os.path.join(label_dir,f"{img_name}.txt")# 提取每个类别的多边形标注annotations=img_info["annotations"]withopen(label_path,"w",encoding="utf-8")aslabel_f:forcls_name,cls_annoinannotations.items():if"converted"notincls_anno:continueconverted=json.loads(cls_anno["converted"])forboxinconverted["boxes"]:cls_label=box["label"]ifcls_labelnotinclass_mapping:continuecls_id=class_mapping[cls_label]# 提取多边形坐标并归一化points=box["points"]# 格式:[[x1,y1], [x2,y2], ...]normalized_points=[]for(x,y)inpoints:norm_x=x/img_w# x归一化norm_y=y/img_h# y归一化normalized_points.extend([str(norm_x),str(norm_y)])# 写入标签文件(类别ID + 归一化坐标)label_line=f"{cls_id}"+" ".join(normalized_points)+"\n"label_f.write(label_line)print("标注格式转换完成!")二、YOLOv8-seg 训练代码
采用 Ultralytics 库的 YOLOv8-seg 模型,该库封装了训练、验证、推理全流程,且支持自动加载数据集、计算指标(mAP、IoU 等)。
1. 环境安装
# 安装依赖库pipinstallultralytics pillow numpy matplotlib opencv-python2. 训练配置文件(yaml)
创建flood_data.yaml文件,指定数据集路径、类别数及类别名(需与上述class_mapping一致):
# flood_data.yamlpath:./flood_segmentation# 数据集根目录(相对/绝对路径均可)train:images/train# 训练集图像路径(相对于path)val:images/val# 验证集图像路径(相对于path)# 类别配置nc:2# 类别数:2类(water + ShuiBianDiaoYu)names:["water",# 0: 水域"ShuiBianDiaoYu"# 1: 水边钓鱼]3. 完整训练代码
fromultralyticsimportYOLOimportos# ---------------------- 1. 基础配置 ----------------------# 模型选择:yolov8n-seg(轻量版,适合快速验证)/ yolov8s-seg(平衡版)/ yolov8l-seg(高精度版)model_name="yolov8s-seg.pt"# 配置文件路径yaml_path="flood_data.yaml"# 训练输出目录output_dir="flood_train_results"os.makedirs(output_dir,exist_ok=True)# ---------------------- 2. 加载预训练模型 ----------------------# 加载YOLOv8-seg预训练模型(自动下载权重)model=YOLO(model_name)# ---------------------- 3. 训练参数配置 ----------------------# 核心参数说明:# - epochs: 训练轮次(建议20-50,根据数据集大小调整)# - batch: 批次大小(根据GPU显存调整,如8/16/32,显存不足设为4)# - imgsz: 输入图像尺寸(建议640/1280,与原始图像1920x1080兼容)# - lr0: 初始学习率(默认0.01,小数据集可减小至0.001)# - device: 训练设备(0=GPU,-1=CPU,多GPU设为[0,1])# - save: 是否保存模型(默认True)# - val: 训练中是否验证(默认True,建议开启)train_args={"data":yaml_path,"epochs":30,"batch":8,"imgsz":1280,"lr0":0.001,"device":0,"save":True,"val":True,"project":output_dir,"name":"exp1",# 实验名,结果会保存在 output_dir/exp1"verbose":True,# 打印训练日志"optimizer":"Adam",# 优化器(Adam比SGD更稳定,适合小数据集)"patience":5,# 早停机制:5轮无val改进则停止训练"augment":True,# 开启数据增强(提升泛化能力)"segment":True# 明确指定为分割任务(YOLOv8支持检测/分割/分类,需显式开启)}# ---------------------- 4. 启动训练 ----------------------print("开始训练YOLOv8-seg模型...")results=model.train(**train_args)# ---------------------- 5. 训练后验证 ----------------------# 验证模型在验证集上的性能(输出mAP50、mAP50-95、IoU等指标)print("\n开始验证模型...")val_results=model.val(data=yaml_path,imgsz=1280,batch=8)print(f"验证集mAP50:{val_results.box.map50:.3f}")# 检测框mAP50print(f"验证集分割mAP50:{val_results.seg.map50:.3f}")# 分割掩码mAP50# ---------------------- 6. 模型推理示例 ----------------------# 用训练好的模型预测新图像print("\n开始推理示例...")# 加载最佳模型(训练中保存的best.pt,在 output_dir/exp1/weights/ 下)best_model=YOLO(os.path.join(output_dir,"exp1","weights","best.pt"))# 推理一张示例图像infer_img_path="flood_segmentation/images/val/example.jpg"# 验证集示例图像infer_results=best_model(infer_img_path,save=True,imgsz=1280)# save=True保存推理结果# 打印推理结果(类别、置信度、坐标)forresultininfer_results:boxes=result.boxes# 检测框结果masks=result.masks# 分割掩码结果forbox,maskinzip(boxes,masks):cls_id=int(box.cls[0])cls_name=best_model.names[cls_id]conf=float(box.conf[0])print(f"检测到:{cls_name}(置信度:{conf:.3f})")三、关键优化与注意事项
数据增强适配
由于数据集为“汛期”场景(可能存在雨天、水面反光、目标遮挡等),训练时开启augment=True后,YOLOv8 会自动应用:- 亮度/对比度/饱和度调整(适应不同光照)
- 水平翻转(目标无方向性,如水域、钓鱼者)
- 缩放/裁剪(适应不同目标大小)
若需更针对性增强,可在train_args中添加augment=Albumentations(需额外安装albumentations库)。
类别不平衡处理
从网页标注看,water类(1个标注)可能比ShuiBianDiaoYu类(3个标注)更少,可在训练中添加类别权重:
在flood_data.yaml中添加class_weights: [1.5, 1.0](增大water类的损失权重),或在train_args中添加class_weights=[1.5, 1.0]。GPU显存不足解决方案
若训练时显存不足(如使用12GB显存GPU):- 减小
batch(如从8改为4) - 降低
imgsz(如从1280改为640) - 启用半精度训练:在
train_args中添加amp=True(YOLOv8默认开启,可减少显存占用50%)。
- 减小
模型部署参考
训练完成的best.pt模型可直接用于部署:- 本地推理:用上述
model.infer()代码 - 实时视频推理:将
infer_img_path改为视频路径(如0表示摄像头) - 部署到服务器:用 Ultralytics 提供的
export功能导出为 ONNX/TensorRT 格式(加速推理),命令如下:best_model.export(format="onnx",imgsz=1280)# 导出为ONNX格式
- 本地推理:用上述
四、训练结果解读
训练完成后,在output_dir/exp1目录下会生成以下关键文件:
weights/best.pt:验证集性能最佳的模型权重(核心文件)results.csv:训练日志(含每轮的损失、mAP等指标)confusion_matrix.png:混淆矩阵(查看类别预测准确性)val_batch0_pred.jpg:验证集预测可视化(对比真实标注与预测结果)
重点关注分割掩码mAP50(目标:≥0.7 为可用模型,≥0.85 为优秀模型),若mAP较低,可增加训练轮次(如epochs=50)或补充更多标注数据(网页中测试集为0,建议划分部分训练集为测试集,如train:1400, val:37, test:59)。