【数据增强】---- 使用 Pytorch 裁剪图片并保存

概述

最近需要制作一个数据集,由于数据集的数量不够,而这些数据集中的单张照片很大,因此可以通过裁剪的方式进行数据增强,从而获取到更多的数据,扩充数据集。在这个过程中还要将裁剪得到的图片保存下来。


实现方式

  1. 使用 PIL.Image.open() 获取图片;
  2. 将图片Resize(),这个不是必须,本人使用是因为原图像太大了(可能得20482048以上),而我要裁剪的是256256,这样区域太小了,因此用 Resize() 缩小图片,在不丢失重要信息的情况下,让裁剪到的图片所含的区域更大。
  3. 遍历使用 torchvision 中的 transforms.RandomCrop() 对图像进行裁剪(代码中使用了3次for循环)
  4. 将图片以给定格式的命名方式保存,一次裁剪多张的话,路径需要动态获取。

项目结构及代码

项目结构:
在这里插入图片描述
其中,lxh.png就是要裁剪的图片,crop_random.py 是代码。

代码 crop_random.py :

import PIL.Image as Image
import os
from torchvision import transforms as transforms

# pytorch提供的torchvision主要使用PIL的Image类进行处理,所以它数据增强函数大多数都是以PIL作为输入,并且以PIL作为输出。
# 读取图片
def read_PIL(image_path):
    image = Image.open(image_path)
    return image

# 获取读到图片的不带后缀的名称
def get_name(image):
    im_path = image.filename
    im_name = os.path.split(im_path)    # 将路径分解为路径中的文件名+扩展名,获取到的是一个数组格式,最后一个是文件名
    name = os.path.splitext(im_name[len(im_name) - 1])     # 获取不带扩展名的文件名,是数组的最后一个
    return name[0] # arr[0]是不带扩展名的文件名,arr[1]是扩展名

# 将图片Reszie
def resize_img(image):
    Resize = transforms.Resize(512)
    resize_img = Resize(image)
    return resize_img

# 随机裁剪
def random_crop(image):
    RandomCrop = transforms.RandomCrop(size=(256, 256))
    random_image = RandomCrop(image)
    return random_image

##################################################################################################

# 读取图片
image = read_PIL('data/lxh.png')
print(image.size)  # 输出原图像的尺寸
name = get_name(image) # 获取读到图片的不带后缀的名称

# 创建输出目录
outDir = 'data_crop/'
os.makedirs(outDir, exist_ok=True)

resie_img = resize_img(image) # 将图片Resize
print(resie_img.size)  # 输Resie后的图像的尺寸

# 随机裁剪 3 次固定大小并保存
for i in range(3):
    random_cropped_image = random_crop(resie_img)  # 随机裁剪
    random_cropped_image.show()  # 显示裁剪后的图片
    out_name = name + '_crop_' + str(i) + '.png'
    print(out_name)
    random_cropped_image.save(os.path.join(outDir, out_name))  # 按照路径保存图片

输出结果

控制台输出:

(1280, 720)
(910, 512)
lxh_crop_0.png
lxh_crop_1.png
lxh_crop_2.png

项目结构:
在这里插入图片描述
输出了裁剪后的图片,并且文件名根据for循环中的参数,实现了动态变化。


结果对比:

  • 原图像:
    在这里插入图片描述
  • 获取的裁剪后的图像:
    在这里插入图片描述

补充

pytorch 中 transforms 提供5种裁剪方式,如:



对文件夹里的所有图片批量裁剪

此处是后续对于本文的补充,请看补充的博文:

【数据增强】— 使用 Pytorch 批量裁剪文件夹里图片并保存

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好,这是一个比较复杂的项目,需要分好几个步骤来实现。 1. 数据集备 首先需要下载Fruits 360数据集,可以从官网或Kaggle上下载。 然后需要对数据集进行预处理和数据增强,这可以通过使用torchvision.transforms来实现。具体的数据增强方法可以包括:随机水平翻转、随机垂直翻转、随机旋转、随机裁剪、随机缩放等方法。 2. 模型设计 可以使用卷积神经网络(Convolutional Neural Network,CNN)来实现水果图像的识别和分类任务。在模型设计中需要考虑到模型的深度、卷积核大小、池化层大小、激活函数的选择等因素。 同时,为了提高模型的效果,可以使用标准量化和批量归一化来对模型进行优化。标准量化是将输入数据进行标准化处理,使其均值为0,方差为1,这样可以提高模型的稳定性和收敛速度。批量归一化是在每个批次的数据中对每个特征进行归一化处理,可以减少模型的过拟合。 还需要使用权重衰减来对模型进行正则化,防止出现过拟合现象;使用梯度裁剪来解决梯度爆炸的问题;使用Adam优化算法来加速模型的收敛。 3. 模型训练和保存 使用PyTorch中的DataLoader来加载数据集,然后使用定义好的CNN模型进行训练。在训练过程中需要设置好优化器、损失函数、学习率、权重衰减和梯度裁剪等参数。 训练完成后,需要将训练好的模型保存下来,可以使用PyTorch的save函数将模型参数保存到本地。 4. 前后端交互 可以使用Flask框架搭建一个简单的web应用程序,实现前后端交互。在前端页面中,可以上传一张水果的图片,然后将该图片传递给后端进行分类。 在后端中,可以使用保存的模型参数来加载模型,然后将上传的图片进行预处理,然后将预处理后的图片输入到已经训练好的模型中进行分类,最终将分类结果返回给前端页面。 以上就是基于PyTorch的水果图像识别与分类系统的设计和实现的步骤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半岛铁子_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值