一、数据增强的原因:
- 防止过拟合: 在训练集样本较少的情况下,模型容易记住训练数据而不是学习到数据的泛化特征。通过数据增强,可以增加训练样本的多样性,从而减轻过拟合现象。
- 提高模型鲁棒性: 数据增强可以生成不同的图像变体(如旋转、翻转、缩放、添加噪声等),使模型能够适应多种场景和条件。这种策略增强了模型在新数据上的稳定性和适应性。
- 增加数据多样性: 在某些应用场景下,获取标注数据非常困难且成本高昂。数据增强可以在不增加实际收集数据的情况下,创造更多样化的训练样本,从而提高模型的学习效果。
- 改善模型的泛化能力: 通过在训练数据中引入变化,模型可以学习到更通用的特征,而不是针对特定样本的特定特征。这有助于提升模型在未见数据上的表现。
- 模拟现实世界的变化: 在现实应用中,数据可能受到不同的相机角度、光照条件、背景杂乱等影响。数据增强可以用于模拟这些变化,从而让模型在多样化的环境中保持良好性能。
- 提高小样本学习的效果: 在一些类别样本稀少的情况下,数据增强可以生成合成样本,从而帮助模型训练并提高那些小类别的识别率。
- 节省时间和成本: 手动标注数据是一项耗时且昂贵的工作,而通过数据增强,我们可以在同等成本上获取更多的有效训练数据。
二、常用数据增强方法:
常用的数据增强方法包括图像旋转(旋转不同角度)、平移(在水平和垂直方向上移动)、缩放(放大或缩小图像)、裁剪(随机选择图像的子区域)、翻转(水平或垂直翻转图像)、颜色变换(调整对比度、亮度、饱和度等)、添加噪声(例如高斯噪声或椒盐噪声)、镜像(左右或上下镜像)以及混合(如Mixup和CutMix,通过将不同图像混合生成新样本)等。
目前很多数据增强的方法都是只对原图进行增强,然而增强之后的图片还需要重新标注,依然非常费事费力,所有本文给出一种图像与标签同时进行增强的方法,大家只要按照我的代码进行图像增强即可,可直接用于训练!
本文主要给出翻转、调节亮度、对比度的数据增强方法,这些方法比较常见应该也够用。大家可以自行增加别的数据增强的方式,比如增强噪声等等。
三、代码解释:
1.图片翻转:
# 翻转
def flip_image(image, json_data, flip_code):
flipped = cv2.flip(image, flip_code) # flip_code: 0 = 垂直翻转, 1 = 水平翻转, -1 = 同时翻转
json_data['imageHeight'] = flipped.shape[0]
json_data['imageWidth'] = flipped.shape[1]
json_data['imageData'] = image_to_base64(flipped)
return flipped, json_data
2.图片调节亮度:
# 调节亮度
def adjust_brightness(image, json_data, alpha, beta):
brightened = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) # 调整亮度和对比度
json_data['imageHeight'] = brightened.shape[0]
json_data['imageWidth'] = brightened.shape[1]
json_data['imageData'] = image_to_base64(brightened)
return brightened, json_data
3.图片调节对比度:
# 调节对比度
def adjust_contrast(image, json_data, alpha):
contrasted = cv2.convertScaleAbs(image, alpha=alpha, beta=0) # 调整对比度
json_data['imageHeight'] = contrasted.shape[0]
json_data['imageWidth'] = contrasted.shape[1]
json_data['imageData'] = image_to_base64(contrasted)
return contrasted, json_data
四、完整代码:
import cv2
import json
import numpy as np
import os
import base64
# 读取json文件
def ReadJson(jsonfile):
with open(jsonfile, encoding='utf-8') as f:
jsonData = json.load(f)
return jsonData
# 保存json
def WriteJson(filePath, data):
write_json = open(filePath, 'w')
write_json.write(json.dumps(data, indent=2))
write_json.close()
# 转base64
def image_to_base64(image_np):
image = cv2.imencode('.jpg', image_np)[1]
image_code = str(base64.b64encode(image))[2:-1]
return image_code
# 翻转
def flip_image(image, json_data, flip_code):
flipped = cv2.flip(image, flip_code) # flip_code: 0 = 垂直翻转, 1 = 水平翻转, -1 = 同时翻转
json_data['imageHeight'] = flipped.shape[0]
json_data['imageWidth'] = flipped.shape[1]
json_data['imageData'] = image_to_base64(flipped)
return flipped, json_data
# 调节亮度
def adjust_brightness(image, json_data, alpha, beta):
brightened = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) # 调整亮度和对比度
json_data['imageHeight'] = brightened.shape[0]
json_data['imageWidth'] = brightened.shape[1]
json_data['imageData'] = image_to_base64(brightened)
return brightened, json_data
# 调节对比度
def adjust_contrast(image, json_data, alpha):
contrasted = cv2.convertScaleAbs(image, alpha=alpha, beta=0) # 调整对比度
json_data['imageHeight'] = contrasted.shape[0]
json_data['imageWidth'] = contrasted.shape[1]
json_data['imageData'] = image_to_base64(contrasted)
return contrasted, json_data
if __name__ == '__main__':
images_path = 'E:\\Mask_RCNN-master\\Mask_RCNN-master\\catdata\\pic\\'
json_path = 'E:\\Mask_RCNN-master\\Mask_RCNN-master\\catdata\\json\\'
result_dir = './result/'
if not os.path.exists(result_dir):
os.makedirs(result_dir)
file_list = os.listdir(images_path)
for img_name in file_list:
SrcImg = cv2.imread(images_path + img_name) # 读取图片
JsonData = ReadJson(json_path + img_name[:-3] + 'json') # 读取对应的json文件
# 翻转
img_flipped, json_flipped = flip_image(SrcImg, JsonData.copy(), 1)
cv2.imwrite(result_dir + img_name[:-4] + '_flipped.jpg', img_flipped)
WriteJson(result_dir + img_name[:-4] + '_flipped.json', json_flipped)
# 调节亮度
img_brightness, json_brightness = adjust_brightness(SrcImg, JsonData.copy(), alpha=1, beta=50)
cv2.imwrite(result_dir + img_name[:-4] + '_brightened.jpg', img_brightness)
WriteJson(result_dir + img_name[:-4] + '_brightened.json', json_brightness)
# 调节对比度
img_contrast, json_contrast = adjust_contrast(SrcImg, JsonData.copy(), alpha=2.0)
cv2.imwrite(result_dir + img_name[:-4] + '_contrasted.jpg', img_contrast)
WriteJson(result_dir + img_name[:-4] + '_contrasted.json', json_contrast)
print(img_name, "is processed!")
其中,images_path和json_path需要修改为你自己的图片路径和json文件路径,result_dir为保存的结果路径。
本文转载自: https://blog.csdn.net/weixin_58938079/article/details/140827402
版权归原作者 Andycasper 所有, 如有侵权,请联系我们删除。
版权归原作者 Andycasper 所有, 如有侵权,请联系我们删除。