ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深度学习在训练时对图片随机剪裁(random crop)

2020-12-05 11:02:26  阅读:1537  来源: 互联网

标签:ratio image random crop 随机 剪裁 图片


文章目录

为何要采取random crop?

在训练学习器时对图片进行随机裁减,背后的一个直觉就是可以进行数据增广(data augmentation),防止学习器陷入过拟合。假设类别 C C C的主要特征为 F F F,采集得到的图片包含背景噪声 B B B,即现在 C C C表示为 ( F , B ) (F, B) (F,B),我们本来期望学习关系 f ∗ : F → C f^*: F \to C f∗:F→C,结果现在可能学习成关系 f ^ : ( F , B ) → C \hat{f} : (F, B) \to C f^​:(F,B)→C,从而陷入过拟合。对图片进行随机裁减,类别 C C C的目标物一般处于图片正中间, F F F很大概率不会被裁减到,而 B B B则相反,这相当于在训练时对二者进行了权重分配,考虑极端情形(即权重分配只有0或1):
X c ( 1 ) = ( 1 ⋅ F , 0 ⋅ B ) , X c ( 2 ) = ( 1 ⋅ F , 1 ⋅ B ) , X c ( 3 ) = ( 1 ⋅ F , 0 ⋅ B ) , … X_c^{(1)} = (1 \cdot F, 0 \cdot B), X_c^{(2)} = (1 \cdot F, 1 \cdot B), X_c^{(3)} = (1 \cdot F, 0 \cdot B), \dots Xc(1)​=(1⋅F,0⋅B),Xc(2)​=(1⋅F,1⋅B),Xc(3)​=(1⋅F,0⋅B),…
此时, F F F的信息增益较大,学习器更有可能倾向于学习关系 f ∗ : F → C f^*: F \to C f∗:F→C而忽略掉 B B B。

更多信息推荐阅读:深度学习训练中为什么要将图片随机剪裁(random crop)

对图片进行随机裁减和缩放

对图片随机0.6~1.0比率大小的区域进行裁剪

def random_crop(image):
    min_ratio = 0.6
    max_ratio = 1

    w, h = image.size

    ratio = random.random()

    scale = min_ratio + ratio * (max_ratio - min_ratio)

    new_h = int(h * scale)
    new_w = int(w * scale)

    y = np.random.randint(0, h - new_h)
    x = np.random.randint(0, w - new_w)

    image = image.crop((x, y, x + new_w, y + new_h))

    return image

def resize(image):
    conf = configparser.ConfigParser()
    conf.read('./config.txt')

    receptive_field_size = eval(conf.get('net', 'receptive_field_size'))

    image = image.resize((receptive_field_size, receptive_field_size))

    return image

调用代码

from PIL.Image import open as imread
import random
import matplotlib.pyplot as plt

def data_handle(image_path):
    res = None
    # res = resize(image)
    res = resize(random_crop(image))

    plt.imshow(res)
    plt.show()

    return res

if __name__ == '__main__':
	data_handle('./demo.jpg')

更多信息推荐阅读:【图像处理】python图片随机缩放(resize)和随机裁剪(crop)的三种方式

有些图片有4个颜色通道

有些采集来的图片具有4个颜色通道,即RGBA,最后1个是透明度,我们要把它转换成3颜色通道,代码如下

from PIL import Image

img = Image.open('./demo.png')
img = img.convert("RGB") # 将一个rgba四通道转化为rgb三通道

更多信息推荐阅读:图片格式转换:4通道转换为3通道;批量改图片为.jpg格式

图像转换成torch.Tensor对象

图片读取出来是 H × W × C H \times W \times C H×W×C格式,其中 C C C是特征通道个数,numpy和TensorFlow都可以正常处理,但PyTorch需要 C × H × W C \times H \times W C×H×W格式,我们需要转换一下:

image = imread(image_path).convert('RGB')
image = util.resize(util.random_crop(image))
image = np.transpose(np.array(image), (2, 0, 1))

更多信息推荐阅读:pytorch学习(五)—图像的加载/读取方式

Reference

深度学习训练中为什么要将图片随机剪裁(random crop)
【图像处理】python图片随机缩放(resize)和随机裁剪(crop)的三种方式
图片格式转换:4通道转换为3通道;批量改图片为.jpg格式
pytorch学习(五)—图像的加载/读取方式

标签:ratio,image,random,crop,随机,剪裁,图片
来源: https://blog.csdn.net/u014134327/article/details/110677326

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有