
1. 数据标注从原始图像到标注文件第一次做语义分割项目时最让我头疼的就是数据标注环节。当时为了标注500张医疗影像整整花了两周时间。现在回想起来如果能掌握正确的工具和方法效率至少能提升3倍。Labelme是我最推荐的标注工具它比VGG Image Annotator更轻量比LabelImg更适合语义分割任务。安装只需要一行命令pip install labelme启动后点击Open Dir加载图像文件夹使用Create Polygon工具沿着目标边缘逐点标注。比如标注肺部CT影像时我会先放大到像素级精度然后用10-20个点勾勒器官轮廓。标注过程中有三个实用技巧按空格键快速切换下一张图像使用CtrlZ撤销错误标注对同类目标使用相同标签命名如lung_left, lung_right完成标注后会生成与图像同名的JSON文件里面包含所有多边形坐标和标签信息。建议在项目初期先标注20-30张样本快速验证标注规范是否合理。我曾经遇到过标注一周后才发现标签命名规则有问题的情况那滋味简直酸爽。2. 批量转换JSON到VOC格式拿到上百个JSON标注文件后手动转换显然不现实。原始文章提到的labelme_json_to_dataset确实只能处理单个文件我们需要改造它的批量处理能力。我在实际项目中优化过的脚本是这样的import os import json from PIL import Image import numpy as np def convert(json_dir, output_dir): os.makedirs(output_dir, exist_okTrue) # 创建VOC标准文件夹结构 for subdir in [JPEGImages, SegmentationClass]: os.makedirs(f{output_dir}/{subdir}, exist_okTrue) for json_file in os.listdir(json_dir): if not json_file.endswith(.json): continue with open(f{json_dir}/{json_file}) as f: data json.load(f) # 解析图像数据 image Image.open(f{json_dir}/{data[imagePath]}) image.save(f{output_dir}/JPEGImages/{data[imagePath]}) # 生成语义标签图 label_map np.zeros(image.size[::-1], dtypenp.uint8) for shape in data[shapes]: points [(int(x),int(y)) for x,y in shape[points]] cv2.fillPoly(label_map, [np.array(points)], label_to_id[shape[label]]) Image.fromarray(label_map).save( f{output_dir}/SegmentationClass/{data[imagePath].replace(.jpg,.png)})这个脚本直接生成VOC标准格式原始图像存放在JPEGImages分割标签图存放在SegmentationClass标签图使用单通道PNG格式不同类别用不同像素值表示3. 数据集划分与组织VOC格式要求严格的文件结构我的项目通常这样组织VOCdevkit/ └── VOC2024/ ├── Annotations/ # 目标检测用的XML语义分割不需要 ├── ImageSets/ │ └── Segmentation/ # 划分好的训练/验证/测试集名单 ├── JPEGImages/ # 所有原始图像 └── SegmentationClass/ # 所有标签图像用sklearn划分数据集时有个坑要注意医疗影像相邻切片具有连续性不能简单随机划分。我的解决方案是# 按病例ID分组后再划分 case_ids list(set([name.split(_)[0] for name in images])) train_ids, test_ids train_test_split(case_ids, test_size0.3) train_set [img for img in images if img.split(_)[0] in train_ids] test_set [img for img in images if img.split(_)[0] in test_ids]4. 实战中的常见问题排查第一次生成的数据集在训练时可能会遇到这些问题问题1标签图显示全黑原因标签像素值过小如1,2,3肉眼难以分辨解决用np.unique()检查实际像素值范围问题2模型输出全是同一类别原因类别极度不均衡如背景占比90%解决在数据加载器中加入类别权重class_weights 1. / torch.tensor(class_counts)问题3验证集指标异常波动原因数据划分时存在数据泄露解决检查是否有重复图像或同一病例出现在不同集合记得在完成数据集构建后用这个命令验证基本完整性find VOCdevkit/VOC2024 -type f | wc -l统计文件数量应该满足JPEGImages和SegmentationClass的数量相同ImageSets中的样本数之和等于总样本数。这些细节看似简单却能让你的模型训练少走很多弯路。