# VOC数据增强 **Repository Path**: dgwcode/voc-data-augmentation ## Basic Information - **Project Name**: VOC数据增强 - **Description**: data-augmentation - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-06-12 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简介 训练机器学习模型的时候,实际上实在调整它的参数,使得可以跟一个特定的输入符合。优化的目标是 chase that sweet spot where our model’s loss is low。**当前最好的神经网络拥有的参数量是上百万的量级。** 因此,有这么多的参数,就需要a proportional amount of examples 来学习这些参数。此外,通过数据增广提升数据集中的相关数据,能防止网络学习到不相关的特征,更多的学到更数据有关的性能,显著的提升整体的性能。 ## 目的 ​ 将Txt标注信息准换为Xml 进行数据增强 ## 环境 ```xml pip install imgaug ``` ### QuickStart 1. ​ 配置TxtToXml.py ```xml ann_path = "./data/labels/" #yolov3标注.txt文件夹 img_path = "./data/images/" #图片文件夹 xml_path = "./voc2020/Annotations/" # .xml文件存放地址 ``` 上述执行完毕后,需要在VOC2020中文件将源数据data/images 复制到voc2020/images中 2. 配置 RenameData.py ``` 数据增强主程序使用的数据格式均为数字: 使用此程序改名 ``` ``` img_path = '../voc2020/images' xml_path = '../voc2020/Annotations' ``` 3. 配置 Augmentation.py ```python if __name__ == "__main__": # 源数据 IMG_DIR = "./voc2020/images" XML_DIR = "./voc2020/Annotations" AUG_XML_DIR = "./output/Annotations" # 存储增强后的XML文件夹路径 mkdir(AUG_XML_DIR) AUG_IMG_DIR = "./output/JPEGImages" # 存储增强后的影像文件夹路径 mkdir(AUG_IMG_DIR) AUGLOOP = 2 # 每张影像增强的数量 ``` 4. 配置 makeData.py ```xml # 源数据 IMG_DIR = "../voc2020/images/" XML_DIR = "../voc2020/Annotations/" # 待比较目标路径 AUG_XML_DIR = "../output/Annotations/" # 存储增强后的XML文件夹路径 AUG_IMG_DIR = "../output/JPEGImages/" # 存储增强后的影像文件夹路径 # 存储差异化的图片文件 到缓存temp Src_XML_DIR = "../temp/srcxml/" Src_IMG_DIR = "../temp/srcimg/" ``` 5. 配置MakeAugment.py ``` # 路径配置 注意路径末尾必须加/ XML_DIR = "../temp/srcxml/" IMG_DIR = "../temp/srcimg/" DST_XML_DIR = "../temp/dstxml/" DST_IMG_DIR = "../temp/dstimg/" # 增强后数据目标路径 AUG_XML_DIR = "../output/Annotations/" # 存储增强后的XML文件夹路径 AUG_IMG_DIR = "../output/JPEGImages/" # 存储增强后的影像文件夹路径 ``` 6. 配置clean.py 清理零时缓存 7. 生成yolo标签 1. 运行yolo文件夹下脚本 ```python python makelabel-1.py for filename in filenames: #im_path = './data/JPEGImages/' + filename # 生成labels 选择下面这个 im_path = './output/JPEGImages/' + filename print(im_path) f.write(im_path + '\n') python makelabel-2.py ``` 8. python voc_label.py ​ ## 使用方式 1. data目录下准备你的 lables 与image 格式数据文件: xml格式如下 ```xml 0 0.564453125 0.552734375 0.03125 0.03515625 ``` 2. 转换Txt为Xml ``` # 配置以下路径 ann_path = "./data/labels/" #yolov3标注.txt文件夹 img_path = "./data/images/" #图片文件夹 xml_path = "./voc2020/Annotations/" # .xml文件存放地址 ``` ```python #执行 python TxtToXml.py ``` 生成的xml路径:./voc2020/Annotations/ ## 数据增强 #### 数据准备 输入数据为两个文件夹一个是需要增强的影像数据(JPEGImages),一个是对应的xml文件(Annotations)。**注意:影像文件名需和xml文件名相对应!** #### 设置文件路径 ``` IMG_DIR = "../create-pascal-voc-dataset/examples/VOC2007/JPEGImages" XML_DIR = "../create-pascal-voc-dataset/examples/VOC2007/Annotations" AUG_XML_DIR = "./Annotations" # 存储增强后的XML文件夹路径 try: shutil.rmtree(AUG_XML_DIR) except FileNotFoundError as e: a = 1 mkdir(AUG_XML_DIR) AUG_IMG_DIR = "./JPEGImages" # 存储增强后的影像文件夹路径 try: shutil.rmtree(AUG_IMG_DIR) except FileNotFoundError as e: a = 1 mkdir(AUG_IMG_DIR) ``` #### 设置增强次数 ``` AUGLOOP = 10 # 每张影像增强的数量 ``` #### 设置增强参数 通过修改Sequential函数参数进行设置,具体设置参考[imgaug使用文档](https://imgaug.readthedocs.io/en/latest/index.html) ``` seq = iaa.Sequential([ iaa.Flipud(0.5), # v翻转 iaa.Fliplr(0.5), # 镜像 iaa.Multiply((1.2, 1.5)), # 改变明亮度 iaa.GaussianBlur(sigma=(0, 3.0)), # 高斯噪声 iaa.Affine( translate_px={"x": 15, "y": 15}, scale=(0.8, 0.95), rotate=(-30, 30) ) # translate by 40/60px on x/y axis, and scale to 50-70%, affects BBs ]) ``` ##### 常用参数: ``` Superpixels:生成随机数量的超像素区域,对原图进行替换,直观效果是原图部分区域变得模糊 各种blur:模糊,对应几种滤波操作 sharp:字面意思,锐化 emboss:压印浮凸字体(或图案); 凹凸印 EdgeDetect:边缘检测 DirectedEdgeDetect:边缘检测,只检测某些方向的,直观来看和上面的比检测出来的数目会少很多 DropOut:随机丢弃像素 CoarseDropout:随机丢弃某位置某通道像素 Invert:有一定几率将batch中的图片像素取反(或者特定通道取反) Add:像素值成比例增加/减小(特指亮度) AddToHueAndSaturation:增加色相、饱和度 Multiply:每个像素随机乘一个数(各不相图),造成局部变亮、局部变暗 ContrastNormalization:调整对比度,0.5表示和128的差值部分会处以2降低对比度 FrequencyNoiseAlpha:参数需要两个增强函数,本函数会混合两个增强函数增强后的结果 Grayscale:灰度图和原图的混合(1意味着全灰度) ``` ## 其他脚本 1. ​ makelabel-1 为解决图片生成列表问题 2. ​ RenameData 数据增强主程序使用的数据格式均为数字: 使用此程序改名 3. ​ **makeData** 数据增强只有正样本 使用程序将负样本进行合并,最后执行