0


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

一、数据增强的原因:

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

二、常用数据增强方法:

     常用的数据增强方法包括图像旋转(旋转不同角度)、平移(在水平和垂直方向上移动)、缩放(放大或缩小图像)、裁剪(随机选择图像的子区域)、翻转(水平或垂直翻转图像)、颜色变换(调整对比度、亮度、饱和度等)、添加噪声(例如高斯噪声或椒盐噪声)、镜像(左右或上下镜像)以及混合(如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 所有, 如有侵权,请联系我们删除。

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

还没有评论