์๋ ํ์ธ์.
์ ๊ฐ ํ์์ ์์ฃผ ์ฆ๊ฒจ๋ณด๋ ๋นตํ์ ๊ฐ๋ฐ๋์๊ตญ์์ ์ฌ๋ฏธ์๋ ๋ฅ๋ฌ๋ ์์ ๊ฐ ์์ด์ ๊ฐ์ ธ ์์ต๋๋ค.
www.youtube.com/watch?v=VxRCku4Bkgg
ํ์์๋ ๋์ผ๋ก๋ง ๋ณด๋ค๊ฐ ์ฌ๋ฐ์ด ๋ณด์ฌ์, ์ค์ ๋ก ์ ๋ ํ ๋ฒ ํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
๋๊ธ์ ๋ณด๋, ๋ง์ ์ฌ๋๋ค์ด ๋ฐ์ดํฐ ํ๋ก์ธ์ฑ ๋ถ๋ถ์์ ํ๋ค์ด ํ์ญ๋๋ค.
์ ๋ ๋ฐ๋ผํด๋ณด์๋๋, ํ์ต์ด ์ง๋๋ฐฐ๊ธฐ๊ฐ ์๋๋ผ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ถ๋ถ์ด ์ด ๋์์์ ๊ฝ์ด๋๊ฑธ ์๊ฒ ๋์ต๋๋ค.
(์ญ์ ๋ฅ๋ฌ๋์ ๋ฐ์ดํฐ๊ฐ ๋ฌธ์ ...)
1. ๋ฐ์ดํฐ์ ๋ฐ๊ธฐ
www.kaggle.com/jessicali9530/celeba-dataset
ํ๋ ์ฃผ์์ฌํญ !
์ปดํจํฐ ์ฉ๋์ ์ถฉ๋ถํ์ ๊ฐ์?
์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ณด๋ฉด, 1G ๋ฐ์ดํธ ์ฝ๊ฐ ๋์ต๋๋ค.
ํ์ง๋ง, ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ฉด
์ง์ฅ์ ๋ง๋ณด์๊ฒ ๋ ๊ฒ๋๋ค. SSD ๋นต๋นตํ๊ฑฐ๋ ์๋ฒ๊ฐ ์์ผ๋ฉด ๋ค๋ก ๋์๊ฐ์๋๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
2. Git์์ ์ฝ๋ ๋ฐ๊ธฐ
github.com/kairess/super_resolution
์ค๋์ preprocess.ipynb ์ ์ฒ๋ฆฌ ๋ถ๋ถ์ ๋ด๋ณด๊ฒ ์ต๋๋ค.
์ต์ ์ฌํญ์ ๋๋ค.
์ ๋ Pycharm์ผ๋ก ์ฝ๋ฉ์ ํ ์์ ์ด๊ธฐ ๋๋ฌธ์ .ipynb๋ฅผ .py๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
jupyter nbconvert --to scripy preprocess.ipynb ( ํด๋น ๊ฒฝ๋ก์์ )
3. ๊ฒฝ๋ก/๋๋ ํ ๋ฆฌ ์ค๋นํ๊ธฐ
๋นต๋นตํ SSD๋ฅผ ์ค๋นํฉ๋๋ค.
์ ๋ E ๋๋ผ์ด๋ธ์ ์ค๋นํ๊ฒ ์ต๋๋ค.
E ๋๋ผ์ด๋ธ(์์ ์ ๋๋ผ์ด๋ธ)์ dataset ํด๋๋ฅผ ํ๋ ๋ง๋ญ๋๋ค.
1. E:\dataset
์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๊ฐ ๋๊ฒ ์ต๋๋ค.
dataset ํด๋์ ์ด๋ ๊ฒ ํด๋๋ฅผ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
2. E:\dataset\img
์ฐ์ img ํด๋๋ ํ์ต์ ์ํฌ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ์์ต๋๋ค. ์๊น kaggle์์ ๋ฐ์ img_align_celeba๋ฅผ ์ฎ๊ฒจ์ ์ด๋ฆ๋ง ๋ฐ๊ฟ์ค ๊ฒ์ ๋๋ค. ๊ทธ๋๋ก ์ฌ์ฉํ์ ๋ ์๊ด์์ต๋๋ค. ์ ๋ ๊ฐ๋จํ๊ฒ ์ข์์ img๋ก ๋ฐ๊ฟจ์ต๋๋ค.
์ด img ํด๋์ ์๋ ์ฌ์ง๋ค์ ํ์ตํ ๋ฐ์ดํฐ์ ๋๋ค. ๊ฐ๋จํ X_data๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
X_data๋ Train์ฉ, Validation์ฉ, Test์ฉ์ผ๋ก ๋๋ฉ๋๋ค.
3. E:\dataset\list_eval_partion.csv
์ด๋ฏธ์ง์ ๊ฐ๊ฐ ๋ผ๋ฒจ๋ง ํ ๊ฒ์ csvํ์ผ๋ก ์ ์ฅ๋์์ต๋๋ค. ๋ค๋ฅธ csv ํ์ผ์ ๊ทธ๋ฅ ํด์งํต์ ๋์ ธ ์ค๋๋ค.
partition : 1 => train (162770์ฅ)
partition : 2 => val (19867์ฅ)
partition : 3 => test (19962์ฅ)
4. E:\dataset\x_train
์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด train, validation, test ์ฉ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋๋๊ธฐ ๋๋ฌธ์
์ ์ด๋ฆ ๊ทธ๋๋ก ํด๋๋ฅผ ๋ง๋ค์ด ์ฃผ์ด์ผ ํฉ๋๋ค.
x_train
x_val
x_test
y_train
y_val
y_test
์ด ํด๋ ์์๋ ํ์ตํ๊ธฐ ์ข๊ฒ๋ numpy(.npy) ๋ก ์ ์ฒ๋ฆฌ๋์ด ์ ์ฅ๋ ์์ ์ ๋๋ค.
๊ตณ์ด ๋ชฐ๋ผ๋ ๋์ง๋ง, TMI๋ก scipy๋, matplotlib ๋ฑ ์ฌ๋ฌ ๊ณผํ, ์ํ, ๋ฅ๋ฌ๋์์ numpy๋ฅผ ์ ๊ณตํ๋ ์ด์ ๋
numpy๊ฐ C์ฝ๋๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ํ์ด์ฌ ๋ด์ฅ list๋ณด๋ค ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
ํ์ด์ฌ ๊ฐ๋ฐํ ์ฌ๋์ด C ๊ฐ๋ฐ์์์ผ๋...
4. ์ฝ๋
import os, cv2
import numpy as np
from skimage.transform import pyramid_reduce
# ๊ฒฝ๋ก
base_path = r'E:\dataset' # E:\dataset
img_path = os.path.join(base_path, 'img') # E:\dataset\img
eval_list = np.loadtxt(os.path.join(base_path, 'list_eval_partition.csv'), dtype=str, delimiter=',', skiprows=1)
print(eval_list[0])
# ์ด๋ฏธ์ง ํ์ธ
img_sample = cv2.imread(os.path.join(img_path, eval_list[0][0]))
print(os.path.join(img_path, eval_list[0][0]))
h, w, _ = img_sample.shape
# ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ
crop_sample = img_sample[int((h-w)/2):int(-(h-w)/2), :]
resized_sample = pyramid_reduce(crop_sample, downscale=4)
pad = int((crop_sample.shape[0] - resized_sample.shape[0]) / 2)
padded_sample = cv2.copyMakeBorder(resized_sample, top=pad, bottom=pad, left=pad, right=pad, borderType=cv2.BORDER_CONSTANT, value=(0,0,0))
print(crop_sample.shape, padded_sample.shape)
# main
downscale = 4
n_train = 162770
n_val = 19867
n_test = 19962
for i, e in enumerate(eval_list):
filename, ext = os.path.splitext(e[0])
img_path = os.path.join(img_path, e[0])
img = cv2.imread(img_path)
h, w, _ = img.shape
crop = img[int((h-w)/2):int(-(h-w)/2), :]
crop = cv2.resize(crop, dsize=(176, 176))
resized = pyramid_reduce(crop, downscale=downscale)
norm = cv2.normalize(crop.astype(np.float64), None, 0, 1, cv2.NORM_MINMAX)
if int(e[1]) == 0:
np.save(os.path.join(base_path, 'x_train', filename + '.npy'), resized)
np.save(os.path.join(base_path, 'y_train', filename + '.npy'), norm)
elif int(e[1]) == 1:
np.save(os.path.join(base_path, 'x_val', filename + '.npy'), resized)
np.save(os.path.join(base_path, 'y_val', filename + '.npy'), norm)
elif int(e[1]) == 2:
np.save(os.path.join(base_path, 'x_test', filename + '.npy'), resized)
np.save(os.path.join(base_path, 'y_test', filename + '.npy'), norm)
5. ์ค๋ฅ
์๋ง ์ ํ๋ธ๋ฅผ ๋ณด๊ณ ๋ฐ๋ผํ์๋ ๋ถ๋ค ์ค์ ๋๋ถ๋ถ์ด ๊ฒฝ๋ก ๋ฌธ์ ์ ๋๋ค.
----------------------------------------------------------------------------------------------------------------------------
๋ํ์ ์ผ๋ก ์ด ๋ถ์ด ๊ฒฝ๋ก ๋ฌธ์ ๋ก ๋งํ์ ๊ฒ๋๋ค.
Git์์ ์ฝ๋๋ฅผ ๋ฐ์ผ์ค ๋ DataGenerator.py ๋ ๊ฐ์ด ๋ฐ์ผ์ญ๋๋ค.
DataGenerator๋ x_train ๋ฑ ์ ์ฒ๋ฆฌํ .npy ํ์ผ์ ๋ถ๋ฌ์์ Batch๋ก ๋ฌถ๊ณ shuffle ํ์ฌ ๋ฐ์ดํฐ์ ์ ๋ง๋๋ ์ฝ๋์ ๋๋ค.
ํ์ง๋ง ์๋ฌ๋ฌธ์ ๋ณด๊ฒ ๋๋ฉด, splited = ID.split('/') ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ID.split('/')๋ ๋ถ๋ฌ์จ ๊ฒฝ๋ก๋ฅผ '/' ๊ธฐ์ค์ผ๋ก ๋๋๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด
'E:/dataset/img' ๊ฐ ์์ต๋๋ค.
'E:/dataset/img'.split('/')์ ํ๊ฒ ๋๋ฉด ["E:", "dataset", "img"]๋ก ๋๋ฉ๋๋ค.
๋์น ๋น ๋ฅด์ ๋ถ์ด ์์๊น์??
์ ์ฝ๋์์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ r'E:\dataset' ์ ๋๋ค.
r'E:\dataset'.split('/")๋ ์ด๋ป๊ฒ ๋ ๊น์?
๊ฒฐ๊ณผ๋ ["r'E:\dataset'.split('/")"] ์ ๋๋ค. ์ฐ๋ฆฌ๋ค์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ ๋๊ฒฝ๋ก๋ก ํ์ํ์ต๋๋ค.
"\"๋ "/" ์๋๋๋ค!!!!! ์ฐ๋ฆฌ๋ DataGenerator.py์ ๋ค์ด๊ฐ์ splited = ID.split('/')๋ฅผ
splited = ID.split('\')๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
ID๊ฐ ์ ๊ฒฝ๋ก์ฃ ? ๋ผ๊ณ ๊ถ๊ธํดํ๋ ๋ถ์ด ๊ณ์ค ์๋ ์์ต๋๋ค.
__data_generation ํจ์์์ list_IDS_temp๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
list_IDS_temp๊ฐ ๋ฌด์์ธ์ง ํ์ธํ๊ฒ ์ต๋๋ค.
list_IDs์์ ๋ฐ์์จ๊ฑฐ๋ค์. list_IDs๊ฐ ๋ฌด์์ธ์ง ์ญ์ถ์ ํด๋ณด๊ฒ ์ต๋๋ค.
์ํ DataGenerator์์ ์์ฑ์์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ๋งจ ์ฒ์ ํ๋ผ๋ฏธํฐ๋๊น ์ฐพ๊ธฐ ์ฝ๊ฒ ๋ค์.
์๋ง ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ train.py์์ ์ฌ์ฉํ์๊ฒ๋๋ค.
๋ค. import ํ ๊ฒ์ ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค.
x_train_list = list_IDs ๋ผ๋ ๊ฒ์ ์ญ์ถ์ ํด ์ ์ ์๊ฒ ๋์์ต๋๋ค.
์ ๋๊ธ ๋ถ์ ์ค๋ฅ์ ์์ธ์ ๊ฒฝ๋ก ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ ๋๋ก ํ์ธํ ์ ์์ต๋๋ค.
----------------------------------------------------------------------------------------------------------------------------
'NoneType' object has no attribute 'shape'
shape๋ผ๋ ์์ฑ์ด ์๋ค๋ผ๋ ์ค๋ฅ์ ๋๋ค.
์๋ง shape๋ฅผ ์ด ๊ฑธ๋ก ๋ณด์ NoneType ์๋ฆฌ์๋ Numpy๊ฐ ๋ค์ด๊ฐ ์ ์๋ค๋๊ฑธ ์ถ์ธกํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ NoneType ์ด๋ผ๋ ๊ฒ์ ํด๋น ๊ฒฝ๋ก์ .npy๋ฅผ ๋ถ๋ฌ ์์ง๋ง ๊ฒฝ๋ก๊ฐ ์๋ชป๋์ด ์๋ฌด ๊ฒ๋ ๋ถ๋ฌ์ค์ง ๋ชปํ์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
----------------------------------------------------------------------------------------------------------------------------
์ด๊ฒ๋ ๊ฒฝ๋ก ๋ฌธ์ ์ ๋๋ค.
์๋ฌ๋ฌธ์ ๋์์๋ค์.
No such file or directory ํ์ผ์ด๋ ํด๋๋ฅผ ์ฐพ์ ์ ์๋ค...!
์๋ง ๊ฒฝ๋ก๋ฅผ ํ์ธํด๋ณด๋ ์ฒซ ๋ฒ์งธ ์ค๋ฅ์ ๋น์ทํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒฝ๋ก๊ตฌ๋ถ์ด "\\"์ผ๋ก ๋์๋๋ฐ split์ "/" ์ด๋ ์ ๋๋ก ๋ถ๋ฆฌ๊ฐ ๋์ง ์์์๊ฒ๋๋ค.
np.load( ๊ฒฝ๋ก ) ์์ ๋งํ ๋ฏ ์ถ์ต๋๋ค. !!
----------------------------------------------------------------------------------------------------------------------------
์ด๊ฑด ์ ๊ฐ ์ฌ๋ฆฐ ๋ต๊ธ...
๋์์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค... ๊ธ์ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค์์... ๋นตํ ๊ฐ๋ฐ๋์๊ตญ๋ ํญ์ ์ฌ๋ฐ๊ฒ ์ ๋ณด๊ณ ์์ต๋๋ค!