UOMOP
Pixel value "Normalization" 본문
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