神经网络训练预处理:图片resize和归一化

1. 读取原图像数据,和尺寸

import cv2
from matplotlib import pyplot as plt
from PIL import Image
import numpy as np


#原始图片大小为[H,W]-->[317,227]
image_path = "./images/smoke.jpg"

#opencv 读取图片,图片格式默认是BGR图片
img_cv = cv2.imread(image_path)
#读取的图片的尺寸信息
img_cv.shape

图片的尺寸大小为:

(317, 227, 3)

显示图像,cv默认按照BGR通道读取。 按照那种通道读取无所谓,重要的是要保证训练和推理的方式保持一致

#opencv imread读取的数据格式数array数组
plt.imshow(img_cv)

在这里插入图片描述

2. 定义resize函数,支持直接缩放和定比例缩放

#imag: 图像array数组,(H,W,C)格式
#resize_uniform:表示是否进行等比例缩放
#return:resize之后的图像array数组,和resize的scale值
def resize(img,size=448, resize_uniform = True, boder_color=[0,0,0]):
    H,W,C = img.shape
    if resize_uniform:
        scale_h = size/max(H,W)
        scale_w = scale_h
        dst_h = int(H*scale_h)
        dst_w = int(W*scale_h)
        img_resize = cv2.resize(img, (dst_w, dst_h), interpolation=cv2.INTER_AREA)
        #因为缩放的是图片的额最大的方向,所以填充颜色是在小的图片方向上
        boder_size = max(abs(dst_h-H),abs(dst_w-W))
        #copyMakeBorder(img, top,bootom,left,right)
        img_resize = cv2.copyMakeBorder(img_resize,0, 0, int(boder_size/2), int(boder_size/2) ,cv2.BORDER_CONSTANT,value=boder_color)
    else:
        img_resize = cv2.resize(img, (size, size), interpolation=cv2.INTER_AREA)
        scale_h = size/H
        scale_w = size/W
    return img_resize,scale_h,scale_w

2.1 直接缩放

img_resize,scale_h,scale_w = resize(img_cv)
scale_h,scale_w

缩放因子:
(1.413249211356467, 1.413249211356467)

显示效果:

plt.imshow(img_resize)

在这里插入图片描述

2.2 定比例缩放

img_resize,scale_h,scale_w = resize(img_cv, resize_uniform = False)

显示效果:

plt.imshow(img_resize)

在这里插入图片描述

等比例缩放,默认会在端的边界方向上填充黑色。

3 图像归一化

可以直接对像素进行归一化(plt可以显示归一化后的图像)

plt.imshow(img_cv/255)

在这里插入图片描述

更多是是计算整个训练接的mean和std,然后通过(x-mean)/std,计算[-1, 1]的归一化值,pytorch中的实现方式如下

import torchvision.transforms as transforms
transfrom = transforms.Compose([
            transforms.ToTensor(), # height * width * channel -> channel * height * width
            transforms.Normalize(mean=(0.5,0.5,0.5),std=(0.5,0.5,0.5))
        ])

原数据:

img_cv

array([[[ 14,  19,  22],
        [  5,  10,  13],
        [  7,  12,  13],
        ...,
        [245, 248, 252],
        [249, 252, 255],
        [252, 253, 255]],

       [[  7,  12,  15],
        [ 10,  15,  18],
        [  8,  13,  14],
        ...,
        [166, 169, 173],
        [223, 226, 230],
        [243, 244, 248]],

       [[ 12,  17,  20],
        [ 16,  21,  24],
        [ 10,  15,  18],
        ...,
        [101, 106, 109],
        [133, 138, 141],
        [220, 223, 227]],

       ...,

       [[  7,  12,  13],
        [  9,  14,  13],
        [ 14,  17,  15],
        ...,
        [ 18,  19,  29],
        [ 18,  19,  29],
        [ 19,  16,  25]],

       [[  8,  13,  14],
        [  6,  11,  10],
        [ 19,  21,  21],
        ...,
        [ 18,  20,  30],
        [ 19,  21,  29],
        [  9,   6,  15]],

       [[ 15,  20,  21],
        [  5,  10,   9],
        [ 18,  20,  20],
        ...,
        [ 18,  20,  30],
        [ 19,  21,  29],
        [ 19,  16,  25]]], dtype=uint8)

归一化后的数据

train_data = transfrom(img_cv)
tensor([[[-0.8902, -0.9608, -0.9451,  ...,  0.9216,  0.9529,  0.9765],
         [-0.9451, -0.9216, -0.9373,  ...,  0.3020,  0.7490,  0.9059],
         [-0.9059, -0.8745, -0.9216,  ..., -0.2078,  0.0431,  0.7255],
         ...,
         [-0.9451, -0.9294, -0.8902,  ..., -0.8588, -0.8588, -0.8510],
         [-0.9373, -0.9529, -0.8510,  ..., -0.8588, -0.8510, -0.9294],
         [-0.8824, -0.9608, -0.8588,  ..., -0.8588, -0.8510, -0.8510]],

        [[-0.8510, -0.9216, -0.9059,  ...,  0.9451,  0.9765,  0.9843],
         [-0.9059, -0.8824, -0.8980,  ...,  0.3255,  0.7725,  0.9137],
         [-0.8667, -0.8353, -0.8824,  ..., -0.1686,  0.0824,  0.7490],
         ...,
         [-0.9059, -0.8902, -0.8667,  ..., -0.8510, -0.8510, -0.8745],
         [-0.8980, -0.9137, -0.8353,  ..., -0.8431, -0.8353, -0.9529],
         [-0.8431, -0.9216, -0.8431,  ..., -0.8431, -0.8353, -0.8745]],

        [[-0.8275, -0.8980, -0.8980,  ...,  0.9765,  1.0000,  1.0000],
         [-0.8824, -0.8588, -0.8902,  ...,  0.3569,  0.8039,  0.9451],
         [-0.8431, -0.8118, -0.8588,  ..., -0.1451,  0.1059,  0.7804],
         ...,
         [-0.8980, -0.8980, -0.8824,  ..., -0.7725, -0.7725, -0.8039],
         [-0.8902, -0.9216, -0.8353,  ..., -0.7647, -0.7725, -0.8824],
         [-0.8353, -0.9294, -0.8431,  ..., -0.7647, -0.7725, -0.8039]]])
train_data.shape
torch.Size([3, 317, 227])
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值