数据集扩充增广(分割标签同步) 适用于yolov5到v12的分割数据集和obb数据集,支持同步更新标签(txt) 使用labelme标注的多边形数据集,支持同步更新 (1)
数据集扩充增广(分割标签同步)
适用于yolov5到v12的分割数据集和obb数据集,支持同步更新标签(txt)
使用labelme标注的多边形数据集,支持同步更新标签(json)
小工具,Windows10以上系统可以直接打开使用,无需安装,无需配置环境
翻转、旋转、缩放、拉伸、剪裁、平移、亮度、对比度、饱和度、噪声等多种增广方式,可以组合和自定义方式
可选择增广倍数,生成的图像和标签自定义重命名不会覆盖原数据
可视化增强图像和标签,方便查看是否增强有误
带有手把手教程视频!提供学习参考代码(不含界面)
分割/OBB 数据集增强工具完整说明
下面是这套分割/OBB 数据集扩充工具的功能介绍、使用说明和完整实现代码。
一、工具核心功能表
| 项目 | 详情 |
|---|---|
| 适用场景 | YOLOv5~v12 分割/OBB 数据集、Labelme 多边形标注数据集 |
| 支持标签格式 | YOLO-seg TXT、YOLO-obb TXT、Labelme JSON |
| 系统要求 | Windows 10+,免安装、免配置,直接双击运行 |
| 增强方式 | 翻转、旋转、缩放、拉伸、剪裁、平移、亮度、对比度、饱和度、噪声、模糊等 |
| 自定义增强 | 支持imgaug序列语法,可自由组合、修改增强操作 |
| 标签同步 | 自动更新分割/OBB/多边形标签,保证与增强后图像对应 |
| 输出控制 | 可设置增强倍数、自定义前缀、自动重命名,不覆盖原数据 |
| 辅助功能 | 生成增强预览图,可直观检查标签是否同步正确 |
| 交付内容 | 可执行文件.exe、使用教程视频、增强序列参考文档、Python 学习代码 |
二、项目结构
dataset_augment/ ├── points增强工具.exe # Windows 可执行文件 ├── 教程.mp4 # 手把手使用教程 ├── 必读.txt # 常用增强操作说明 ├── 增强序列参考.pdf # imgaug 增强语法参考 ├── src/ # 源代码(学习参考) │ ├── main.py # PyQt5 主界面 │ ├── augmentor.py # 图像与标签增强核心逻辑 │ └── utils.py # 文件读写与格式转换工具 ├── seg/ # 分割数据集示例 └── obb/ # OBB 数据集示例三、核心代码实现(Python 学习参考版)
1. 增强核心模块augmentor.py
importosimportcv2importjsonimportimgaugasiafromimgaugimportaugmentersasiaafromimgaug.augmentablesimportPolygon,PolygonsOnImage,BoundingBox,BoundingBoxesOnImageclassDatasetAugmentor:def__init__(self,img_dir,label_dir,out_dir,label_format="yolo-seg"):self.img_dir=img_dir self.label_dir=label_dir self.out_dir=out_dir self.label_format=label_format os.makedirs(os.path.join(out_dir,"images"),exist_ok=True)os.makedirs(os.path.join(out_dir,"labels"),exist_ok=True)defload_yolo_seg(self,label_path,img_shape):h,w=img_shape[:2]polygons=[]withopen(label_path,"r")asf:forlineinf:parts=line.strip().split()cls_id=int(parts[0])coords=list(map(float,parts[1:]))points=[(coords[i]*w,coords[i+1]*h)foriinrange(0,len(coords),2)]polygons.append((cls_id,Polygon(points)))returnpolygonsdefsave_yolo_seg(self,polygons,save_path,img_shape):h,w=img_shape[:2]lines=[]forcls_id,polyinpolygons:coords=[]for(x,y)inpoly.exterior:coords.append(f"{x/w:.6f}{y/h:.6f}")lines.append(f"{cls_id}{' '.join(coords)}")withopen(save_path,"w")asf:f.write("\n".join(lines))defaugment_image(self,img_path,label_path,aug_seq,prefix="aug",times=1):img=cv2.imread(img_path)img_h,img_w=img.shape[:2]polygons=self.load_yolo_seg(label_path,img.shape)foriinrange(times):aug_img=img.copy()aug_polygons=[]polys=PolygonsOnImage([pfor_,pinpolygons],shape=img.shape)aug_img,aug_polys=aug_seq(image=aug_img,polygons=polys)for(cls_id,_),pinzip(polygons,aug_polys.polygons):aug_polygons.append((cls_id,p))img_name=f"{prefix}_{i}_{os.path.basename(img_path)}"label_name=f"{prefix}_{i}_{os.path.splitext(os.path.basename(label_path))[0]}.txt"cv2.imwrite(os.path.join(self.out_dir,"images",img_name),aug_img)self.save_yolo_seg(aug_polygons,os.path.join(self.out_dir,"labels",label_name),img.shape)2. 主界面main.py(PyQt5)
importsysfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLineEdit,QComboBox,QSpinBox,QTextEdit,QFileDialog)fromaugmentorimportDatasetAugmentorimportimgaugasiafromimgaugimportaugmentersasiaaclassAugmentTool(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("分割数据集增强工具")self.setGeometry(100,100,800,600)self.init_ui()definit_ui(self):central=QWidget()self.setCentralWidget(central)layout=QVBoxLayout(central)# 路径选择self.img_dir_edit=QLineEdit()self.label_dir_edit=QLineEdit()self.out_dir_edit=QLineEdit()layout.addWidget(self.create_path_layout("图像文件夹:",self.img_dir_edit))layout.addWidget(self.create_path_layout("标签文件夹:",self.label_dir_edit))layout.addWidget(self.create_path_layout("输出文件夹:",self.out_dir_edit))# 参数设置self.format_combo=QComboBox()self.format_combo.addItems(["YOLO-seg TXT","Labelme JSON","YOLO-obb TXT"])layout.addWidget(self.format_combo)self.times_spin=QSpinBox()self.times_spin.setValue(1)layout.addWidget(self.times_spin)self.prefix_edit=QLineEdit("aug")layout.addWidget(self.prefix_edit)# 增强序列self.aug_seq_edit=QTextEdit()self.aug_seq_edit.setPlainText(""" iaa.Sequential([ iaa.OneOf([ iaa.Fliplr(p=1.0), iaa.Affine(rotate=(-45, 45)), ]), iaa.OneOf([ iaa.GaussianBlur(sigma=(0, 4.0)), iaa.GammaContrast(gamma=0.5), iaa.AdditiveGaussianNoise(scale=40.0), ]) ]) """)layout.addWidget(self.aug_seq_edit)self.start_btn=QPushButton("开始处理")self.start_btn.clicked.connect(self.start_augment)layout.addWidget(self.start_btn)defcreate_path_layout(self,label,edit):layout=QHBoxLayout()layout.addWidget(edit)browse_btn=QPushButton("浏览")browse_btn.clicked.connect(lambda:self.browse_path(edit))layout.addWidget(browse_btn)returnlayoutdefbrowse_path(self,edit):path=QFileDialog.getExistingDirectory()edit.setText(path)defstart_augment(self):img_dir=self.img_dir_edit.text()label_dir=self.label_dir_edit.text()out_dir=self.out_dir_edit.text()label_format=self.format_combo.currentText()times=self.times_spin.value()prefix=self.prefix_edit.text()aug_seq_code=self.aug_seq_edit.toPlainText()# 执行增强序列aug_seq=eval(aug_seq_code,{"iaa":ia,"iaa":iaa})augmentor=DatasetAugmentor(img_dir,label_dir,out_dir,label_format)forimg_nameinos.listdir(img_dir):ifimg_name.endswith(('.jpg','.png')):img_path=os.path.join(img_dir,img_name)label_name=os.path.splitext(img_name)[0]+".txt"iflabel_format=="Labelme JSON":label_name=os.path.splitext(img_name)[0]+".json"label_path=os.path.join(label_dir,label_name)ifos.path.exists(label_path):augmentor.augment_image(img_path,label_path,aug_seq,prefix,times)if__name__=="__main__":app=QApplication(sys.argv)win=AugmentTool()win.show()sys.exit(app.exec_())四、使用说明
- 准备数据:将图像和标签按对应格式整理好(YOLO-seg/OBB TXT 或 Labelme JSON)。
- 设置路径:在工具中选择图像文件夹、标签文件夹和输出文件夹。
- 配置参数:
- 选择标签格式
- 设置增强次数(每张图片生成多少张增强结果)
- 输入输出前缀(避免覆盖原数据)
- 自定义增强序列:根据需要修改
imgaug序列,支持翻转、旋转、模糊、噪声、对比度等操作。 - 开始处理:点击“开始处理”,工具会自动生成增强后的图像和同步更新的标签文件,并可生成预览检查效果。
五、常用增强操作参考(来自必读.txt)
# 单增操作示例iaa.Identity()# 原图iaa.GammaContrast((0.85,1.15))# 对比度调整iaa.MultiplyBrightness((0.5,1.5))# 亮度调整iaa.Rotate((-10,10))# 随机旋转iaa.AdditiveGaussianNoise(scale=(0,20))# 高斯噪声iaa.GaussianBlur(sigma=2.0)# 高斯模糊iaa.MultiplySaturation((0.5,1.5))# 饱和度调整iaa.Crop(px=(0,16))# 随机裁剪iaa.Affine(translate_px={"x":(-20,20),"y":(-20,20)})# 平移