本仓库主要包含了针对目标检测数据集的增强手段和源码:图像的旋转,镜像,裁剪,亮度/对比度的变换等采取的实验数据格式为VOC的格式,标签存储在xml文件中.代码中涉及一些对.xml文件的基本操作
没有想到,这个古老的创库还有人star,为了不误导大家。这里有必要进行说明:这种增强方式属于离线数据增强,图片数量会成倍增加,这是属于效率很低的一种方式,即占磁盘空间,又耗费训练时间.大可不必,真正在训练中使用的时候是完全可以利用现成的api的,比如pytorh自带的transforms库里面就实现了很多的增强:
data_transforms = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(0.5),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
比如上面代码中的transforms.RandomHorizontalFlip(0.5)就是每一次对一个batch进行处理时,以0.5的概率进行水平翻转,当你的训练epoch>>1的时候,必然会保证到原图和翻转图都在训练中出现,所以这是一种巧妙和高效的实现.当然代码的底层实现,和本创库的几个实现函数基本是一致的。但实际使用还是建议使用在线随机增广。注意的就是,对于目标检测而言,图片的几何变换必然导致标注的变换,这个并不是pytorch自带的,需要自己进行实现,原理还是如本创库.不过大多数有点东西的仓库(SSD,YOLO等)都实现了各种数据增强,建议阅读。本创库的代码不建议使用,但是可以用来理解目标检测中图片的变换以及其相应的标注的变换规则!
这里推荐一下我另一个更优实际价值的目标检测仓库: 目标检测数据集制作:VOC,COCO,YOLO等常用数据集格式的制作和互相转换脚本 效率神器!欢迎star!
对图像的旋转可以调用cv2的库函数,但是对标签的操作需要搞清楚一个点绕着另一个点旋转后的坐标与原坐标的对应关系,计算公式见代码!
由于图像的旋转会使得一部分信息损失,而且不是很容易的判断旋转后的图像是否还包含我们的完整目标。 因此可以尝试把原图像先安装长短边的长度填充为一个正方形,这样可以确保填充后的图像在旋转过程中,原图中的目标信息不会丢失。 然后可以旋转作一个裁剪(根据目标的标签坐标,只要避开旋转后的标签坐标就能很好的裁剪出图像),当然也可以不裁剪,但是这样会降低模型 训练的效率
该部分代码还应该有对图像的颜色变换,下次更新!对亮度和对比度的调节利用的是像素的简单线性变换。
该部分代码主要是对图像进行水平,竖直,对角的镜像变换 对图像的操作cv2.flip();对标签的变化其实就是利用原图的长宽来减去原像素,三种情况有所不同,但很好理解,只是有些细节需要注意,见代码! 注:对原图的对角镜像其实等价于对原图旋转180°