UOMOP

Pixel value "Normalization" 본문

Ai/DL

Pixel value "Normalization"

Happy PinGu 2022. 2. 10. 16:41
Normalization

일반적으로 CNN입력 값으로 Pixel값 변환을 위해 0~1 사이의 값으로 변환하거나, 채널별 z score변환(평균0, 표준편차1)적용
feature_center가 True이면 R, G, B 각 픽셀 값에서 개별 채널들의 평균 픽셀 값을 빼서 평균을 0으로 함.
feature_std_normalization을 Ture이면 R, G, B 각 픽셀 값에서 개별 채널들의 표준편차 값으로 나눔.
rescale=255.0 각 픽셀 값을 0~1 사이의 값으로 만들기 위해서 보통 255.0으로 나눔.

feature_center을 통해서 각 채널의 평균을 구하고 feature_std_normalization을 통해서 각 채널의 표준편차를 구한다. 이후, 각 채널의 픽셀 값들에 {(x - 채널의 평균)/(채널의 표준편차)}를 적용시켜 값을 정규화시킨다. 이것이 z score변환이다
위 방법을 사용하거나 rescale을 사용하여 각 픽셀 값에 나눠주어 0~1 사이의 값으로 만든다
import numpy as np
import pandas as pd
import os
import cv2
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
%matplotlib inline


def show_image(image) :
    plt.figure(figsize = (8,8))
    plt.imshow(image)
    plt.axis("off")
    
    
def show_aug_image_batch(image, data_generator, how_many) : 
    
    image_4 = np.expand_dims(image, axis=0)
    
    data_generator.fit(image_4)
    change = data_generator.flow(image_4)
    
    fig, axs = plt.subplots(figsize = (22, 8), nrows=1, ncols=how_many)
    
    for i in range(how_many) :
        
        image_4 = next(change)
        image_3 = np.squeeze(image_4)
        image_3 = image_3.astype("int")
            
        axs[i].imshow(image_3)
        axs[i].axis("off")
        

!wget https://www.sciencenews.org/wp-content/uploads/2020/03/033120_HT_covid-cat_feat-1028x579.jpg


cat_3dim_BGR = cv2.imread("033120_HT_covid-cat_feat-1028x579.jpg")

image = cv2.cvtColor(cat_3dim_BGR, cv2.COLOR_BGR2RGB)

plt.imshow(cat_3dim)
plt.title("original")
plt.axis("off")

1. image의 channel별로 확인해보기

fig, axs = plt.subplots(figsize=(22, 6), nrows=1, ncols=4)

axs[0].imshow(image)
axs[0].set_title("original")
axs[1].imshow(image[:, :, 0])
axs[1].set_title("R")
axs[2].imshow(image[:, :, 1])
axs[2].set_title("G")
axs[3].imshow(image[:, :, 2])
axs[3].set_title("B")

2. 손수 z score 계산해보기

r_mean = np.mean(image[:, :, 0])
g_mean = np.mean(image[:, :, 1])
b_mean = np.mean(image[:, :, 2])

r_std = np.std(image[:, :, 0])
g_std = np.std(image[:, :, 1])
b_std = np.std(image[:, :, 2])

print("RGB순으로의 평균     : {:.4f}, {:.4f}, {:.4f}".format(r_mean, g_mean, b_mean))
print("RGB순으로의 표준편차 : {:.4f},  {:.4f},  {:.4f}".format(r_std, g_std, b_std))

# z 변환식을 각 채널별로 적용시켜보도록 한다.

r_zscore = (image[:, :, 0] - r_mean)/(r_std)
g_zscore = (image[:, :, 1] - g_mean)/(g_std)
b_zscore = (image[:, :, 2] - b_mean)/(b_std)

3. ImageDataGenerator로 z score 계산해보기

data_generator = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True)

image_4dims = np.expand_dims(image, axis=0)

data_generator.fit(image_4dims)

print("RGB순으로의 평균     : {}".format(np.squeeze(data_generator.mean)))
print("RGB순으로의 표준편차 : {}\n\n".format(np.squeeze(data_generator.std)))

data_gen_iter = data_generator.flow(image_4dims)
aug_image_4dims = next(data_gen_iter)

aug_image = np.squeeze(aug_image_4dims)

4. rescale로 정규화시키기

data_generator = ImageDataGenerator(rescale=1/255.0)

cat_4dim = np.expand_dims(cat_3dim, axis=0)

data_generator.fit(cat_4dim)

data_gen_iter = data_generator.flow(cat_4dim)
aug_image_4dims = next(data_gen_iter)

aug_image = np.squeeze(aug_image_4dims)

print(aug_image)


 

 

 

 

 

'Ai > DL' 카테고리의 다른 글

My model vs VGG16  (0) 2022.02.14
Performance Comparison according to Data Augmentation  (0) 2022.02.13
Data Augmentation(픽셀 기반)  (0) 2022.02.10
Data Augmentation(공간 기반)  (0) 2022.02.10
Data Augmentation(데이터 증강) 기본  (0) 2022.02.10
Comments