图像和目标框随机旋转:数据增强方法
图像和目标框随机旋转:数据增强方法
数据增强是一种通过对原始数据进行变换来增加训练数据数量的方法,可以有效提高模型的泛化能力。其中,随机旋转图像和目标框是一种常用的数据增强方法。
本文将介绍一种简单的图像和目标框随机旋转方法,并提供示例代码。该代码使用Python和OpenCV库实现,能够对图像和目标框进行相同的角度旋转。
代码示例
import cv2
import numpy as np
# 读取图片和txt文件
img = cv2.imread('image.jpg')
with open('annotation.txt', 'r') as f:
lines = f.readlines()
# 随机生成旋转角度
angle = np.random.randint(-180, 180)
# 获取图片中心点坐标
height, width = img.shape[:2]
center = (width // 2, height // 2)
# 生成旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 将图片进行旋转
rotated_img = cv2.warpAffine(img, M, (width, height))
# 将txt注释进行旋转
rotated_lines = []
for line in lines:
# 解析每行txt注释
x1, y1, x2, y2, x3, y3, x4, y4, classname, difficult = line.strip().split()
pts = np.array([(int(x1), int(y1)), (int(x2), int(y2)), (int(x3), int(y3)), (int(x4), int(y4))])
# 将框四个点进行旋转
rotated_pts = cv2.transform(np.array([pts]), M)[0]
# 将旋转后的坐标转为int类型
rotated_pts = rotated_pts.astype(np.int32)
# 将旋转后的txt注释保存到列表中
rotated_lines.append(' '.join([str(p) for p in rotated_pts.reshape(-1)]) + ' ' + classname + ' ' + difficult + '\n')
# 保存旋转后的图片和txt注释
cv2.imwrite('rotated_image.jpg', rotated_img)
with open('rotated_annotation.txt', 'w') as f:
f.writelines(rotated_lines)
代码解析
- 读取图片和txt文件: 使用
cv2.imread()读取图像文件,使用open()读取包含目标框信息的txt文件。 - 随机生成旋转角度: 使用
np.random.randint()生成一个随机角度,范围为-180到180度。 - 获取图片中心点坐标: 使用
img.shape[:2]获取图像的高度和宽度,然后计算中心点坐标。 - 生成旋转矩阵: 使用
cv2.getRotationMatrix2D()生成一个旋转矩阵,参数分别为旋转中心点坐标、旋转角度和缩放比例。 - 将图片进行旋转: 使用
cv2.warpAffine()将图像进行旋转,参数分别为原始图像、旋转矩阵和输出图像大小。 - 将txt注释进行旋转: 遍历每行txt注释,解析目标框的坐标信息,然后使用
cv2.transform()将坐标点进行旋转,并将旋转后的坐标保存到新的列表中。 - 保存旋转后的图片和txt注释: 使用
cv2.imwrite()保存旋转后的图像,使用open()和f.writelines()保存旋转后的目标框信息到新的txt文件中。
注意事项
- 图片进行旋转后,目标框的位置也会发生变化,因此需要将目标框的四个点进行旋转,并重新计算旋转后的坐标。
- 旋转后的目标框坐标需要转为整数类型,以便后续保存到txt文件中。
总结
本文介绍了一种简单的数据增强方法,通过随机旋转图像和目标框,可以提高模型的泛化能力。该方法简单易懂,代码示例清晰易懂,方便用户理解和使用。
希望本文对读者有所帮助。
原文地址: https://www.cveoy.top/t/topic/mLLT 著作权归作者所有。请勿转载和采集!