Bootstrap

猫狗分类识别【建立模型】③数据增强

一、数据增强的说明

在人工智能模型分类识别中,数据增强是一种关键技术,它通过对原始数据进行修改或添加来创建新的、更多样化的训练数据集:

一、数据增强的基本原理

数据增强的基本原理是通过对原始数据进行各种变换,以产生与原始数据不同但仍保持原有标签信息的新数据。这些变换可以应用于图像、文本、音频等多种类型的数据。

二、数据增强在图像分类识别中的应用

  1. 图像变换操作:在图像分类任务中,数据增强可以通过对图像进行平移、旋转、缩放、翻转等操作,生成不同视角下的图像。这些操作有助于模型学习并适应图像在不同姿态和背景下的变化,从而提高分类的准确性。

  2. 增加模型鲁棒性:通过对图像进行加噪、遮挡等处理,可以模拟现实世界中可能出现的各种复杂情况。这样训练出的模型在面对实际应用中的噪声和遮挡等问题时,会具有更强的鲁棒性。

  3. 扩充训练数据集:数据增强可以显著增加训练样本的数量,从而有助于模型学习到更多的特征和模式。这不仅可以提高模型的泛化能力,还有助于避免过拟合问题。

三、数据增强的优势

  1. 提高泛化能力:通过增加训练数据的多样性,数据增强可以帮助模型更好地学习并适应各种场景下的数据变化,从而提高其泛化能力。

  2. 降低过拟合风险:过拟合是机器学习模型中的一个常见问题,表现为模型在训练数据上表现良好但在测试数据上表现不佳。数据增强通过增加训练数据的数量和多样性,有助于降低过拟合的风险。

  3. 减少数据标注成本:在某些情况下,获取大量标注数据可能非常昂贵且耗时。数据增强技术可以在一定程度上减少对额外标注数据的依赖,从而降低数据标注的成本。

四、数据增强的挑战与注意事项

虽然数据增强带来了诸多优势,但在实际应用中也需要注意以下几点:

  1. 合理选择增强方法:不同的数据增强方法适用于不同的场景和任务。在选择增强方法时,需要根据具体需求和数据特点进行权衡和选择。

  2. 控制增强程度:过度的数据增强可能导致模型学习到不真实的特征或模式,从而影响其在实际应用中的性能。因此,需要合理控制数据增强的程度和范围。

  3. 验证增强效果:在应用数据增强技术后,需要通过交叉验证等方法来评估其对模型性能的影响。这有助于及时调整增强策略并优化模型性能。

二、常用的数据增强技术

个人比较喜欢用的图像数据增强技术有图像旋转、图像翻转...

1.图像旋转实现

①原图

②右旋转15°

③实现过程

实现原理及注意事项:

要对整个文件夹的图像进行右旋转15°,你可以使用Python的图像处理库PIL(Python Imaging Library,也称为Pillow):

步骤

  1. 安装Pillow库:如果你还没有安装Pillow库,你需要先安装它。你可以使用pip来安装:
    pip install Pillow
  2. 导入必要的库:导入Pillow库中的Image模块,以及os模块来遍历文件夹。
  3. 设置文件夹路径:指定包含要旋转的图像的文件夹路径。
  4. 遍历文件夹:使用os模块遍历指定文件夹中的所有图像文件。
  5. 打开和旋转图像:对于每个图像文件,使用Pillow库打开它,然后使用rotate()方法进行旋转。
  6. 保存旋转后的图像:将旋转后的图像保存到一个新的文件或覆盖原始文件。
  7. 处理完所有图像:继续这个过程,直到文件夹中的所有图像都被处理。
 

注意

  • 请将folder_pathoutput_folder替换为你自己的文件夹路径。
  • 这个脚本会遍历指定文件夹中的所有.jpg.png文件。如果你有其他类型的图像文件,可以在if语句中添加相应的文件扩展名。
  • rotate()方法中的-15表示顺时针旋转15°(因为Pillow默认是逆时针旋转,所以使用负值)。resample=Image.BICUBIC指定了重采样方法,以获得更好的图像质量。expand=True允许图像在旋转过程中扩展,以适应旋转后可能增大的尺寸。

实现源码:

from PIL import Image  
import os  
  
# 设置图像文件夹的路径  
folder_path = 'imgs1/'  # 替换为你的图像文件夹路径  
output_folder = 'imgs1/'  # 替换为你想要保存旋转后图像的文件夹路径  
rotated_suffix = '_rotated'  # 旋转后图像文件名的后缀  
  
# 确保输出文件夹存在  
if not os.path.exists(output_folder):  
    os.makedirs(output_folder)  
  
# 遍历文件夹中的所有图像文件  
for filename in os.listdir(folder_path):  
    if filename.endswith('.jpg') or filename.endswith('.png'):  # 根据需要添加其他图像格式  
        # 分离文件名和扩展名  
        base_name, ext = os.path.splitext(filename)  
          
        # 构建完整的文件路径  
        image_path = os.path.join(folder_path, filename)  
        output_filename = f"{base_name}{rotated_suffix}{ext}"  # 添加后缀到文件名  
        output_path = os.path.join(output_folder, output_filename)  
          
        # 打开图像  
        image = Image.open(image_path)  
          
        # 旋转图像15°(顺时针)  
        rotated_image = image.rotate(-15, resample=Image.BICUBIC, expand=True)  
          
        # 保存旋转后的图像,文件名带有特定后缀  
        rotated_image.save(output_path)  
  
print("所有图像已成功旋转并以新文件名保存。")

旋转后的图像文件夹:

 2.图像翻转

①原图

②水平翻转

③垂直翻转

③水平翻转实现过程

实现原理及注意事项:

对整个文件夹的图像进行水平翻转。

实现过程

  1. 安装Pillow库:如果还未安装Pillow库,请先进行安装。可以使用pip命令来安装:pip install Pillow

  2. 确定输入输出路径:设置包含待翻转图像的文件夹路径(输入路径)和保存翻转后图像的文件夹路径(输出路径)。

  3. 遍历文件夹:使用os模块来遍历输入文件夹中的所有图像文件。

  4. 加载和翻转图像:对于每个图像文件,使用Pillow库中的Image类来加载图像,并使用transpose()方法进行翻转。

  5. 保存翻转后的图像:将翻转后的图像保存到一个新的文件中,文件名可以保持不变或添加特定后缀以示区分。

  6. 处理所有图像:重复上述步骤,直到文件夹中的所有图像都被处理。

注意事项

在代码中:

  • input_folder 是包含原始图像的文件夹。
  • output_folder 是保存翻转后图像的文件夹。
  • os.listdir(input_folder) 用于列出输入文件夹中的所有文件。
  • Image.open(input_path) 用于打开图像文件。
  • image.transpose(Image.FLIP_LEFT_RIGHT) 用于水平翻转图像。如果想要垂直翻转,请使用 Image.FLIP_TOP_BOTTOM
  • flipped_image.save(output_path) 用于保存翻转后的图像到输出文件夹。

请确保替换 input_folderoutput_folder 变量的值为你的实际文件夹路径,并根据需要修改图像文件类型的检查条件。运行此代码后,所有选定的图像文件将被翻转并保存到输出文件夹中。

 实现源码:

from PIL import Image
import os

# 设置图像文件夹的路径和输出文件夹路径  
input_folder = 'imgs1/'  # 替换为你的图像文件夹路径  
output_folder = 'imgs1/'  # 替换为你想要保存翻转后图像的文件夹路径  
flipped_suffix = '_flipped'  # 翻转后图像文件名的后缀  

# 确保输出文件夹存在  
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历文件夹中的所有图像文件  
for filename in os.listdir(input_folder):
    if filename.endswith(('.jpg', '.png')):  # 根据需要可以添加其他图像格式  
        # 分离文件名和扩展名  
        base_name, ext = os.path.splitext(filename)

        # 构建完整的文件路径  
        image_path = os.path.join(input_folder, filename)
        output_filename = f"{base_name}{flipped_suffix}{ext}"  # 添加后缀到文件名  
        output_path = os.path.join(output_folder, output_filename)

        # 打开图像  
        image = Image.open(image_path)

        # 进行翻转操作,这里以水平翻转为例  
        flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)

        # 保存翻转后的图像,文件名带有特定后缀  
        flipped_image.save(output_path)

print("所有图像已成功翻转并以新文件名保存。")

翻转后的图像文件夹:

 未完...

;