在使用yolov系列的过程中可能面对数据集不足,模型鲁棒性差等等情况,面对如此可以选择数据增强的方式对图像经行修改,但是仅仅使用yolov自带的数据增强对图片经行改动有时并不能很好的满足我们的需求,即使去寻找图片增强的工具也会发现很多工具只能修改图片不能修改标签,即使可以修改标签但对txt的标签并不友好,需要我们将xml的标签转换为txt的,因此作者利用torch自带的图片增强库,开发了一款适用于yolov的图像增强的小工具,既可以增强图片又可以对标签经行修改。
如果只想使用工具,博主已经将工具打包成exe文件形式,单击本文绑定的资源,下载即用即可
1.工具可以增强的功能
工具可以实现水平/垂直翻转;角度旋转,随机裁剪以及HSV调整,这些功能可以单独使用也可以叠加使用
演示示例:
2.代码解解释
2.1 实现模块
2.1.1图像旋转
# 水平翻转
if self.selected_options[0]: # 如果用户选择了水平翻转
transforms_list.append(transforms.RandomHorizontalFlip(p1)) # 随机水平翻转图像
# 垂直翻转
if self.selected_options[1]: # 如果用户选择了垂直翻转
transforms_list.append(transforms.RandomVerticalFlip(p2)) # 随机垂直翻转图像
水平翻转 和 垂直翻转 是将图像进行左右或上下翻转。翻转后的图像的内容在空间 上发生了镜像变化,相应的边界框坐标也需要调整。
2.1.2旋转
# 旋转
if self.selected_options[2]: # 如果用户选择了旋转
transforms_list.append(transforms.RandomRotation(self.rotation_degree, resample=False, expand=False, center=None))
# 随机旋转图像,旋转角度由 self.rotation_degree 控制
随机旋转图像一定的角度。旋转后的图像内容发生旋转,相应的边界框中心点需要根据旋转角度进行重新计算。
2.1.3随机裁剪
# 随机裁剪
if self.selected_options[3]: # 如果用户选择了随机裁剪
transforms_list.append(transforms.RandomResizedCrop(size=(512, 512), scale=self.crop_scale))
# 随机裁剪图像,裁剪比例由 self.crop_scale 控制,并将裁剪后的图像调整为指定尺寸
2.1.4HSV颜色空间调整
# HSV调整
if self.selected_options[4]: # 如果用户选择了HSV调整
img = self.adjust_hsv(img) # 调用 adjust_hsv 方法,对图像进行色调、饱和度和亮度调整
def adjust_hsv(self, image):
"""调整图像的HSV属性"""
hue_factor = random.uniform(*self.hue_factor) # 随机生成色调调整因子
saturation_factor = random.uniform(*self.saturation_factor) # 随机生成饱和度调整因子
brightness_factor = random.uniform(*self.brightness_factor) # 随机生成亮度调整因子
image = transforms.functional.adjust_hue(image, hue_factor) # 调整图像色调
image = transforms.functional.adjust_saturation(image, saturation_factor) # 调整图像饱和度
image = transforms.functional.adjust_brightness(image, brightness_factor) # 调整图像亮度
return image # 返回调整后的图像
包括色调、饱和度和亮度的调整。这些操作主要改变图像的颜色属性,使得模型能够适应不同光照和颜色条件下的图像。
2.1.5边界框调整
def adjust_bbox(self, bbox, params, img_size):
"""根据增强操作调整边界框"""
x_center, y_center, width, height = bbox # 提取边界框的中心坐标和宽高
for param in params: # 遍历所有应用的增强操作参数
if isinstance(param, transforms.RandomHorizontalFlip):
if param.p > 0.5:
x_center = 1.0 - x_center # 如果进行了水平翻转,则调整x中心坐标
if isinstance(param, transforms.RandomVerticalFlip):
if param.p > 0.5:
y_center = 1.0 - y_center # 如果进行了垂直翻转,则调整y中心坐标
if isinstance(param, transforms.RandomRotation):
angle = param.get_params(param.degrees)
if angle != 0:
cx, cy = img_size[0] / 2, img_size[1] / 2 # 图像中心点坐标
# 旋转边界框的中心坐标
x_center_new = (x_center - 0.5) * np.cos(np.radians(angle)) - (y_center - 0.5) * np.sin(np.radians(angle)) + 0.5
y_center_new = (x_center - 0.5) * np.sin(np.radians(angle)) + (y_center - 0.5) * np.cos(np.radians(angle)) + 0.5
x_center, y_center = x_center_new, y_center_new # 更新中心坐标
return [x_center, y_center, width, height] # 返回调整后的边界框参数
在对图像进行几何变换(如翻转、旋转等)后,需要相应地调整图像中目标物体的边界框,使其与变换后的图像内容匹配。这一步确保增强后的标签数据仍然准确有效。
2.2调参
2.2.1 旋转角度
默认设置: 10度