์•ˆ๋…•ํ•˜์„ธ์š”. 

 

์ œ๊ฐ€ ํ‰์†Œ์— ์ž์ฃผ ์ฆ๊ฒจ๋ณด๋Š” ๋นตํ˜•์˜ ๊ฐœ๋ฐœ๋„์ƒ๊ตญ์—์„œ ์žฌ๋ฏธ์žˆ๋Š” ๋”ฅ๋Ÿฌ๋‹ ์˜ˆ์ œ๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€์ ธ ์™”์Šต๋‹ˆ๋‹ค.

 

www.youtube.com/watch?v=VxRCku4Bkgg

ํ‰์†Œ์—๋Š” ๋ˆˆ์œผ๋กœ๋งŒ ๋ณด๋‹ค๊ฐ€ ์žฌ๋ฐŒ์–ด ๋ณด์—ฌ์„œ, ์‹ค์ œ๋กœ ์ €๋„ ํ•œ ๋ฒˆ ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€์„ ๋ณด๋‹ˆ, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฐ์ดํ„ฐ ํ”„๋กœ์„ธ์‹ฑ ๋ถ€๋ถ„์—์„œ ํž˜๋“ค์–ด ํ•˜์‹ญ๋‹ˆ๋‹ค.

 

์ €๋„ ๋”ฐ๋ผํ•ด๋ณด์•˜๋”๋‹ˆ, ํ•™์Šต์ด ์ง„๋˜๋ฐฐ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๋ถ€๋ถ„์ด ์ด ๋™์˜์ƒ์˜ ๊ฝƒ์ด๋ž€๊ฑธ ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. 

(์—ญ์‹œ ๋”ฅ๋Ÿฌ๋‹์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌธ์ œ...)

 

 

 

1. ๋ฐ์ดํ„ฐ์…‹ ๋ฐ›๊ธฐ

 

www.kaggle.com/jessicali9530/celeba-dataset

 

CelebFaces Attributes (CelebA) Dataset

Over 200k images of celebrities with 40 binary attribute annotations

www.kaggle.com

1GB Face Dataset

ํ•˜๋‚˜ ์ฃผ์˜์‚ฌํ•ญ !

 

์ปดํ“จํ„ฐ ์šฉ๋Ÿ‰์€ ์ถฉ๋ถ„ํ•˜์‹ ๊ฐ€์š”?

 

์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋ณด๋ฉด, 1G ๋ฐ”์ดํŠธ ์•ฝ๊ฐ„ ๋„˜์Šต๋‹ˆ๋‹ค. 

 

ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด

 

์ง€์˜ฅ์„ ๋ง›๋ณด์‹œ๊ฒŒ ๋ ๊ฒ๋‹ˆ๋‹ค. SSD ๋นต๋นตํ•œ๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์—†์œผ๋ฉด ๋’ค๋กœ ๋Œ์•„๊ฐ€์‹œ๋Š”๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

2. Git์—์„œ ์ฝ”๋“œ ๋ฐ›๊ธฐ

 

github.com/kairess/super_resolution

 

kairess/super_resolution

Super resolution with Subpixel CNN using Keras. Contribute to kairess/super_resolution development by creating an account on GitHub.

github.com

 

download
์˜ค๋Š˜์˜ ์ฃผ์ธ๊ณต

์˜ค๋Š˜์€ 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๊ฐ€ ์™œ ๊ฒฝ๋กœ์ฃ ? ๋ผ๊ณ  ๊ถ๊ธˆํ•ดํ•˜๋Š” ๋ถ„์ด ๊ณ„์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

DataGenerator.py 45์ค„

__data_generation ํ•จ์ˆ˜์—์„œ list_IDS_temp๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

list_IDS_temp๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

DataGenerator.py 34์ค„

list_IDs์—์„œ ๋ฐ›์•„์˜จ๊ฑฐ๋„ค์š”. list_IDs๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์—ญ์ถ”์ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

DataGenerator.py 9์ค„

์•„ํ•˜ DataGenerator์—์„œ ์ƒ์„ฑ์ž์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋‹ˆ๊นŒ ์ฐพ๊ธฐ ์‰ฝ๊ฒ ๋„ค์š”.

 

์•„๋งˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— train.py์—์„œ ์‚ฌ์šฉํ–ˆ์„๊ฒ๋‹ˆ๋‹ค. 

 

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( ๊ฒฝ๋กœ ) ์—์„œ ๋ง‰ํžŒ ๋“ฏ ์‹ถ์Šต๋‹ˆ๋‹ค. !! 

 

 

----------------------------------------------------------------------------------------------------------------------------

 

์ด๊ฑด ์ œ๊ฐ€ ์˜ฌ๋ฆฐ ๋‹ต๊ธ€... 

 

๋„์›€์ด ๋˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค... ๊ธ€์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค์•„์•„... ๋นตํ˜• ๊ฐœ๋ฐœ๋„์ƒ๊ตญ๋‹˜ ํ•ญ์ƒ ์žฌ๋ฐŒ๊ฒŒ ์ž˜ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

728x90
๋ฐ˜์‘ํ˜•
18์ง„์ˆ˜