0


【数据增强】图像与标签同时进行增强(含完整代码)

一、数据增强的原因:

  1. 防止过拟合: 在训练集样本较少的情况下,模型容易记住训练数据而不是学习到数据的泛化特征。通过数据增强,可以增加训练样本的多样性,从而减轻过拟合现象。
  2. 提高模型鲁棒性: 数据增强可以生成不同的图像变体(如旋转、翻转、缩放、添加噪声等),使模型能够适应多种场景和条件。这种策略增强了模型在新数据上的稳定性和适应性。
  3. 增加数据多样性: 在某些应用场景下,获取标注数据非常困难且成本高昂。数据增强可以在不增加实际收集数据的情况下,创造更多样化的训练样本,从而提高模型的学习效果。
  4. 改善模型的泛化能力: 通过在训练数据中引入变化,模型可以学习到更通用的特征,而不是针对特定样本的特定特征。这有助于提升模型在未见数据上的表现。
  5. 模拟现实世界的变化: 在现实应用中,数据可能受到不同的相机角度、光照条件、背景杂乱等影响。数据增强可以用于模拟这些变化,从而让模型在多样化的环境中保持良好性能。
  6. 提高小样本学习的效果: 在一些类别样本稀少的情况下,数据增强可以生成合成样本,从而帮助模型训练并提高那些小类别的识别率。
  7. 节省时间和成本: 手动标注数据是一项耗时且昂贵的工作,而通过数据增强,我们可以在同等成本上获取更多的有效训练数据。

二、常用数据增强方法:

  1. 常用的数据增强方法包括图像旋转(旋转不同角度)、平移(在水平和垂直方向上移动)、缩放(放大或缩小图像)、裁剪(随机选择图像的子区域)、翻转(水平或垂直翻转图像)、颜色变换(调整对比度、亮度、饱和度等)、添加噪声(例如高斯噪声或椒盐噪声)、镜像(左右或上下镜像)以及混合(如MixupCutMix,通过将不同图像混合生成新样本)等。
  2. 目前很多数据增强的方法都是只对原图进行增强,然而增强之后的图片还需要重新标注,依然非常费事费力,所有本文给出一种图像与标签同时进行增强的方法,大家只要按照我的代码进行图像增强即可,可直接用于训练!
  3. 本文主要给出翻转、调节亮度、对比度的数据增强方法,这些方法比较常见应该也够用。大家可以自行增加别的数据增强的方式,比如增强噪声等等。

三、代码解释:

1.图片翻转:

  1. # 翻转
  2. def flip_image(image, json_data, flip_code):
  3. flipped = cv2.flip(image, flip_code) # flip_code: 0 = 垂直翻转, 1 = 水平翻转, -1 = 同时翻转
  4. json_data['imageHeight'] = flipped.shape[0]
  5. json_data['imageWidth'] = flipped.shape[1]
  6. json_data['imageData'] = image_to_base64(flipped)
  7. return flipped, json_data

2.图片调节亮度:

  1. # 调节亮度
  2. def adjust_brightness(image, json_data, alpha, beta):
  3. brightened = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) # 调整亮度和对比度
  4. json_data['imageHeight'] = brightened.shape[0]
  5. json_data['imageWidth'] = brightened.shape[1]
  6. json_data['imageData'] = image_to_base64(brightened)
  7. return brightened, json_data

3.图片调节对比度:

  1. # 调节对比度
  2. def adjust_contrast(image, json_data, alpha):
  3. contrasted = cv2.convertScaleAbs(image, alpha=alpha, beta=0) # 调整对比度
  4. json_data['imageHeight'] = contrasted.shape[0]
  5. json_data['imageWidth'] = contrasted.shape[1]
  6. json_data['imageData'] = image_to_base64(contrasted)
  7. return contrasted, json_data

四、完整代码:

  1. import cv2
  2. import json
  3. import numpy as np
  4. import os
  5. import base64
  6. # 读取json文件
  7. def ReadJson(jsonfile):
  8. with open(jsonfile, encoding='utf-8') as f:
  9. jsonData = json.load(f)
  10. return jsonData
  11. # 保存json
  12. def WriteJson(filePath, data):
  13. write_json = open(filePath, 'w')
  14. write_json.write(json.dumps(data, indent=2))
  15. write_json.close()
  16. # 转base64
  17. def image_to_base64(image_np):
  18. image = cv2.imencode('.jpg', image_np)[1]
  19. image_code = str(base64.b64encode(image))[2:-1]
  20. return image_code
  21. # 翻转
  22. def flip_image(image, json_data, flip_code):
  23. flipped = cv2.flip(image, flip_code) # flip_code: 0 = 垂直翻转, 1 = 水平翻转, -1 = 同时翻转
  24. json_data['imageHeight'] = flipped.shape[0]
  25. json_data['imageWidth'] = flipped.shape[1]
  26. json_data['imageData'] = image_to_base64(flipped)
  27. return flipped, json_data
  28. # 调节亮度
  29. def adjust_brightness(image, json_data, alpha, beta):
  30. brightened = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) # 调整亮度和对比度
  31. json_data['imageHeight'] = brightened.shape[0]
  32. json_data['imageWidth'] = brightened.shape[1]
  33. json_data['imageData'] = image_to_base64(brightened)
  34. return brightened, json_data
  35. # 调节对比度
  36. def adjust_contrast(image, json_data, alpha):
  37. contrasted = cv2.convertScaleAbs(image, alpha=alpha, beta=0) # 调整对比度
  38. json_data['imageHeight'] = contrasted.shape[0]
  39. json_data['imageWidth'] = contrasted.shape[1]
  40. json_data['imageData'] = image_to_base64(contrasted)
  41. return contrasted, json_data
  42. if __name__ == '__main__':
  43. images_path = 'E:\\Mask_RCNN-master\\Mask_RCNN-master\\catdata\\pic\\'
  44. json_path = 'E:\\Mask_RCNN-master\\Mask_RCNN-master\\catdata\\json\\'
  45. result_dir = './result/'
  46. if not os.path.exists(result_dir):
  47. os.makedirs(result_dir)
  48. file_list = os.listdir(images_path)
  49. for img_name in file_list:
  50. SrcImg = cv2.imread(images_path + img_name) # 读取图片
  51. JsonData = ReadJson(json_path + img_name[:-3] + 'json') # 读取对应的json文件
  52. # 翻转
  53. img_flipped, json_flipped = flip_image(SrcImg, JsonData.copy(), 1)
  54. cv2.imwrite(result_dir + img_name[:-4] + '_flipped.jpg', img_flipped)
  55. WriteJson(result_dir + img_name[:-4] + '_flipped.json', json_flipped)
  56. # 调节亮度
  57. img_brightness, json_brightness = adjust_brightness(SrcImg, JsonData.copy(), alpha=1, beta=50)
  58. cv2.imwrite(result_dir + img_name[:-4] + '_brightened.jpg', img_brightness)
  59. WriteJson(result_dir + img_name[:-4] + '_brightened.json', json_brightness)
  60. # 调节对比度
  61. img_contrast, json_contrast = adjust_contrast(SrcImg, JsonData.copy(), alpha=2.0)
  62. cv2.imwrite(result_dir + img_name[:-4] + '_contrasted.jpg', img_contrast)
  63. WriteJson(result_dir + img_name[:-4] + '_contrasted.json', json_contrast)
  64. print(img_name, "is processed!")
  1. 其中,images_pathjson_path需要修改为你自己的图片路径和json文件路径,result_dir为保存的结果路径。


本文转载自: https://blog.csdn.net/weixin_58938079/article/details/140827402
版权归原作者 Andycasper 所有, 如有侵权,请联系我们删除。

“【数据增强】图像与标签同时进行增强(含完整代码)”的评论:

还没有评论