èšäºã ãã¥ãŒã©ã«ãããã¯ãŒã¯ã«ããçœé»åçã®è²ä»ããã®ç¿»èš³ãå°ãåãŸã§ãAmir Avniã¯ãã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŠ
ã/ r / Colorizationãã©ã³ããRedditã«ãããŒãªã³ã°ããŸããã 誰ãããã¥ãŒã©ã«ãããã¯ãŒã¯ã®å質ã«é©ããŸããã æå€§1ãæã®æäœæ¥ãæ°ç§ã§å®äºããŸãã
Amirã®ç»ååŠçããã»ã¹ãåçŸããŠææžåããŸãããã æåã«ãããã€ãã®ææãšå€±æïŒäžçªäž-ææ°ããŒãžã§ã³ïŒãèŠãŠãã ããã
Unsplashããæ®åœ±ãããªãªãžãã«ã®çœé»åç ã
çŸåšãçœé»åçã¯éåžžãPhotoshopã§æåã§ãã€ã³ããããŸãã ãã®ãããªãèŠãŠããã®ãããªäœæ¥ã®èšå€§ãªè€éããçè§£ããŠãã ããã
1ã€ã®ç»åãè²ä»ãããã®ã«1ãæãããå ŽåããããŸãã ç§ãã¡ã¯ãã®æä»£ã«ããã®ãŒãå€ãã®æŽå²çãªè³æãç ç©¶ããªããã°ãªããŸããã æå€§20å±€ã®ãã³ã¯ãç·ãéã®åœ±ãé¡ã ãã«éããããé©åãªé°åœ±ãåŸãããŸãã
ãã®èšäºã¯åå¿è
åãã§ãã ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®æ·±å±€åŠç¿ã®çšèªã«æ
£ããŠããªãå Žåã¯ã以åã®èšäºïŒ
1ã2 ïŒãèªãã§ãAndrey Karpaty
ã«ããè¬çŸ©ã
èŠãããšãã§ããŸãã
ãã®èšäºã§ã¯ãç»åã3段éã§çè²ããããã®ç¬èªã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ãæ§ç¯ããæ¹æ³ãåŠç¿ããŸãã
æåã®éšåã§ã¯ãåºæ¬çãªããžãã¯ãæ±ããŸãã 40è¡ã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ãã¬ãŒã ã¯ãŒã¯ãæ§ç¯ããŸããããããã¯ã«ã©ãŒãªã³ã°ãããã®ãã¢ã«ãã¡çãã«ãªããŸãã ãã®ã³ãŒãã«ã¯ã»ãšãã©è¬ããããŸãã;æ§æã«æ
£ããã®ã«åœ¹ç«ã¡ãŸãã
次ã®ã¹ãããã§ã¯ãäžè¬åãã¥ãŒã©ã«ãããã¯ãŒã¯ïŒãããŒã¿çãïŒãäœæããŸãã 圌女ã¯ãã§ã«åœŒå¥³ã«éŠŽæã¿ã®ãªãç»åãè²ä»ãããããšãã§ããŸãã
ãæçµãããŒãžã§ã³ã§ã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ãšåé¡åšãçµã¿åãããŸãã ãããè¡ãã«ã¯ã120äžæã®ç»åã§ãã¬ãŒãã³ã°ããã
Inception Resnet V2ã䜿çšããŸãã ãããŠããã¥ãŒã©ã«ãããã¯ãŒã¯ã«
Unsplashã§ç»åãè²ä»ãããæ¹æ³ãæããŸãã
åŸ
ã¡ãããªãå Žåã¯ããããã®ã¢ã«ãã¡çã
å«ãJupyterããŒãããã¯ã
ã芧ãã ãã ã
FloydHubãš
GitHubã«ã¯3ã€ã®ããŒãžã§ã³ããããFloydHubãµãŒãã¹ã®ã¯ã©ãŠããããªã«ãŒãã§è¡ããã
ãã¹ãŠã®å®éšã§äœ¿çšãããã³ãŒãã確èªã§ããŸãã
åºæ¬çãªããžãã¯
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãç»åã®ã¬ã³ããªã³ã°ãæ€èšããããžã¿ã«ã«ã©ãŒã®çè«ãšãã¥ãŒã©ã«ãããã¯ãŒã¯ã®åºæ¬ããžãã¯ã«ã€ããŠèª¬æããŸãã
çœé»ç»åã¯ããã¯ã»ã«ã®ã°ãªãããšããŠè¡šãããšãã§ããŸãã åãã¯ã»ã«ã«ã¯ãé»ããçœãŸã§ã0ãã255ã®ç¯å²ã®èŒåºŠå€ããããŸãã
ã«ã©ãŒç»åã¯ãèµ€ãç·ãéã®3ã€ã®ã¬ã€ã€ãŒã§æ§æãããŠããŸãã 3ã€ã®ãã£ãã«ã§ãçœãèæ¯ã«ç·ã®èã®ããç»åãåºããããšããŸãã èã¯ç·ã®ã¬ã€ã€ãŒã§ã®ã¿è¡šç€ºããããšæããããããŸããã ããããã芧ã®ããã«ãã¬ã€ã€ãŒã¯è²ã ãã§ãªãèŒåºŠã決å®ããããã3ã€ã®ã¬ã€ã€ãŒãã¹ãŠã«ãããŸãã

ããšãã°ãçœãååŸããã«ã¯ããã¹ãŠã®è²ã®åçãªååžãååŸããå¿
èŠããããŸãã åãéã®èµ€ãšéã远å ãããšãç·ãæãããªããŸãã ã€ãŸãã3ã€ã®ã¬ã€ã€ãŒã䜿çšããã«ã©ãŒç»åã§ã¯ãè²ãšã³ã³ãã©ã¹ãããšã³ã³ãŒããããŸãã

çœé»ç»åã®å Žåãšåæ§ã«ãã«ã©ãŒç»åã®åã¬ã€ã€ãŒã®ãã¯ã»ã«ã«ã¯0ã255ã®å€ãå«ãŸããŸãããŒãã¯ããã®ã¬ã€ã€ãŒã§ãã®ãã¯ã»ã«ã«è²ããªãããšãæå³ããŸãã 3ã€ã®ãã£ãã«ãã¹ãŠã«ãŒããããå Žåãçµæã¯ç»åã®é»ããã¯ã»ã«ã«ãªããŸãã
ãåãã®ãšããããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯å
¥åå€ãšåºåå€ã®é¢ä¿ã確ç«ããŸãã ãã®å Žåããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãçœé»ç»åãšã«ã©ãŒç»åã®éã®æ¥ç¶æ©èœãèŠã€ããå¿
èŠããããŸãã ã€ãŸããçœé»ã°ãªããã®å€ãš3è²ã®ã°ãªããã®å€ãæ¯èŒã§ããããããã£ãæ¢ããŠããŸãã
fïŒïŒã¯ãã¥ãŒã©ã«ãããã¯ãŒã¯ã[BïŒW]ã¯å
¥åããŒã¿ã[R]ã[G]ã[B]ã¯åºåããŒã¿ã§ããã¢ã«ãã¡ç
æåã«ã女æ§ã®é¡ãçè²ãããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ç°¡åãªããŒãžã§ã³ãäœæããŸãã æ°ããæ©èœã远å ãããšãã¢ãã«ã®åºæ¬çãªæ§æã«æ
£ããããšãã§ããŸãã
40è¡ã®ã³ãŒãã®å Žåãå·Šã®ç»åïŒçœé»ïŒããããã¥ãŒã©ã«ãããã¯ãŒã¯ã«ãã£ãŠäœæãããäžå€®ã®ç»åã«ç§»åããŸãã å³ã®åçã¯ãçœé»ãäœæããå
ã®åçã§ãã ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯1ã€ã®ç»åã§ãã¬ãŒãã³ã°ããã³ãã¹ããããŸãããããã«ã€ããŠã¯ããŒã¿ã»ã¯ã·ã§ã³ã§èª¬æããŸãã

è²ç©ºé
ãŸããã«ã©ãŒãã£ã³ãã«ãRGBããLabã«å€æŽããã¢ã«ãŽãªãºã ã䜿çšããŸãã
Lã¯æåºŠãæå³ãã
aãš
bã¯ããããç·ããèµ€ãéããé»è²ã®ç¯å²ã®è²ã®äœçœ®ã決å®ãããã«ã«ã座æšã§ãã
ã芧ã®ãšãããLabã¹ããŒã¹ã®ç»åã«ã¯ã°ã¬ãŒã¹ã±ãŒã«ã®1ã€ã®ã¬ã€ã€ãŒãå«ãŸããŠããã3ã€ã®ã«ã©ãŒã¬ã€ã€ãŒã¯2ã€ã«ãŸãšããããŠããŸãã ãããã£ãŠãæçµã€ã¡ãŒãžã§ã¯å
ã®çœé»ããŒãžã§ã³ã䜿çšã§ããŸãã ããã«2ã€ã®ãã£ãã«ãèšç®ããå¿
èŠããããŸãã

ç§åŠçäºå®ïŒç®ã®ç¶²èå容äœã®94ïŒ
ãæããã®æ±ºå®ã«é¢äžããŠããŸãã ãŸããè²ãèªèããå容äœã¯ããã6ïŒ
ã§ãã ãããã£ãŠãããªãã«ãšã£ãŠã¯ãçœé»ç»åã¯ã«ã©ãŒã¬ã€ã€ãŒãããã¯ããã«ã¯ã£ãããšèŠããŸãã ããããæçµããŒãžã§ã³ã§ãã®ç»åã䜿çšãããã1ã€ã®çç±ã§ãã
ã°ã¬ãŒã¹ã±ãŒã«ããã«ã©ãŒãž
å
¥åãšããŠãã°ã¬ãŒã¹ã±ãŒã«ãæã€ã¬ã€ã€ãŒãååŸããããã«åºã¥ããŠLabã«ã©ãŒã¹ããŒã¹ã§ã«ã©ãŒã¬ã€ã€ãŒaããã³bãçæããŸãã æçµç»åã®Lã¬ã€ã€ãŒãšããŠäœ¿çšããŸãã

1ã€ã®ã¬ã€ã€ãŒãã2ã€ã®ã¬ã€ã€ãŒãååŸããã«ã¯ãç³ã¿èŸŒã¿ãã£ã«ã¿ãŒã䜿çšããŸãã ãããã¯ã3Dã¡ã¬ãã§éãšèµ€ã®ã¡ã¬ããšããŠè¡šãããšãã§ããŸãã ãã£ã«ã¿ãŒã¯ãåçã«è¡šç€ºããããã®ã決å®ããŸãã ç§ãã¡ã®ç®ãå¿
èŠãªæ
å ±ãæœåºã§ããããã«ãç»åã®äžéšã«äžç·ãåŒããé ãããšãã§ããŸãã ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãã£ã«ã¿ãŒã䜿çšããŠãæ°ããç»åãäœæããããè€æ°ã®ãã£ã«ã¿ãŒã1ã€ã®ç»åã«çµã¿åããããããããšãã§ããŸãã
ç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ã¯ãåãã£ã«ã¿ãŒã¯èªåçã«èª¿æŽãããç®çã®åºåãååŸãããããªããŸãã æ°çŸã®ãã£ã«ã¿ãŒã远å ãããããããŸãšããŠã¬ã€ã€ãŒaããã³bãååŸããŸãã
ã³ãŒãã®ä»çµã¿ã®è©³çްã«å
¥ãåã«ããããå®è¡ããŸãããã
FloydHubã«ã³ãŒãããããã€ãã
FloydHubã䜿çšããããšããªãå Žåã§ãã
ã€ã³ã¹ããŒã«ãéå§ããŠã
5åéã®ãããªãã¥ãŒããªã¢ã«ãŸãã¯è©³çްãª
æé ãã芧ãã ããã FloydHubã¯ãã¯ã©ãŠãã°ã©ãã£ãã¯ã¹ã«ãŒããæ·±ãã¢ãã«åããããã®æè¯ãã€æãç°¡åãªæ¹æ³ã§ãã
ã¢ã«ãã¡ç
FloydHubãã€ã³ã¹ããŒã«ããããæ¬¡ã®ã³ãã³ããå
¥åããŸãã
git clone https://github.com/emilwallner/Coloring-greyscale-images-in-Keras
次ã«ããã©ã«ããŒãéããFloydHubãåæåããŸãã
cd Coloring-greyscale-images-in-Keras/floydhub
floyd init colornet
FloydHub Webããã«ããã©ãŠã¶ãŒã§éããŸãã colornetãšããæ°ããFloydHubãããžã§ã¯ããäœæããããã«æ±ããããŸãã äœæããããã¿ãŒããã«ã«æ»ããåãåæåã³ãã³ããçºè¡ããŸãã
floyd init colornet
ã¿ã¹ã¯ãå®è¡ããŸãã
floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard
ããã€ãã®èª¬æïŒ
- ãã®ã³ãã³ãã䜿çšããŠãFloydHubã«ãããªãã¯ããŒã¿ã»ãããããŠã³ãããŸããã
--dataemilwallner/datasets/colornet/2:data
FloydHubã§ã¯ã ãããä»ã®å€ãã®ãããªãã¯ããŒã¿ã»ããã衚瀺ããŠäœ¿çšã§ããŸãã - --tensorboardã§
--tensorboard
æå¹ã«ãã - ã³ãã³ãã䜿çšããŠJupyter Notebookã¢ãŒãã§ã¿ã¹ã¯ãèµ·åããŸãã
--mode jupyter
ãããªã«ãŒããã¿ã¹ã¯ã«æ¥ç¶ã§ããå Žåã¯ã
âgpu
ãã©ã°ã远å ããŸãã çŽ50åéããªããŸãã
Jupyter Notebookã«ç§»åããŸãã FloydHub Webãµã€ãã®[ãžã§ã]ã¿ãã§ãJupyter Notebookãªã³ã¯ãã¯ãªãã¯ããŠãã¡ã€ã«ãèŠã€ããŸãã
floydhub/Alpha version/working_floyd_pink_light_full.ipynb
ãã¡ã€ã«ãéãããã¹ãŠã®ã»ã«ã§Shift + EnterãæŒããŸãã
ãšããã¯å€ãåŸã
ã«å¢ãããŠããã¥ãŒã©ã«ãããã¯ãŒã¯ãã©ã®ããã«åŠç¿ããŠããããçè§£ããŸãã
model.fit(x=X, y=Y, batch_size=1, epochs=1)
ãšããã¯= 1ããå§ããŠã10ã100ã500ã1000ãããã³3000ã«å¢ãããŸãããã®å€ã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ãç»åã§ãã¬ãŒãã³ã°ãããåæ°ã瀺ããŸãã ãã¥ãŒã©ã«ãããã¯ãŒã¯ããã¬ãŒãã³ã°ãããšããã«ãã¡ã€ã³ãã©ã«ããŒã«img_result.pngãã¡ã€ã«ãèŠã€ãããŸãã
# Get images
image = img_to_array(load_img('woman.png'))
image = np.array(image, dtype=float)
# Import map images into the lab colorspace
X = rgb2lab(1.0/255*image)[:,:,0]
Y = rgb2lab(1.0/255*image)[:,:,1:]
Y = Y / 128
X = X.reshape(1, 400, 400, 1)
Y = Y.reshape(1, 400, 400, 2)
model = Sequential()
model.add(InputLayer(input_shape=(None, None, 1)))
# Building the neural network
model = Sequential()
model.add(InputLayer(input_shape=(None, None, 1)))
model.add(Conv2D(8, (3, 3), activation='relu', padding='same', strides=2))
model.add(Conv2D(8, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(16, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(16, (3, 3), activation='relu', padding='same', strides=2))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', strides=2))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(16, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(2, (3, 3), activation='tanh', padding='same'))
# Finish model
model.compile(optimizer='rmsprop',loss='mse')
#Train the neural network
model.fit(x=X, y=Y, batch_size=1, epochs=3000)
print(model.evaluate(X, Y, batch_size=1))
# Output colorizations
output = model.predict(X)
output = output * 128
canvas = np.zeros((400, 400, 3))
canvas[:,:,0] = X[0][:,:,0]
canvas[:,:,1:] = output[0]
imsave("img_result.png", lab2rgb(canvas))
imsave("img_gray_scale.png", rgb2gray(lab2rgb(canvas)))
ãã®ãããã¯ãŒã¯ãå®è¡ããFloydHubã³ãã³ãïŒ
floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard
æè¡çãªèª¬æ
å
¥ãå£ã«ãçœé»ã®ç»åã衚ãã°ãªãããããããšãæãåºããŠãã ããã åºåã«ã¯ãè²ã®å€ãæã€2ã€ã®ã°ãªããããããŸãã å
¥åå€ãšåºåå€ã®éã§ããªã³ã¯ãã£ã«ã¿ãŒãäœæããŸããã ç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ããããŸãã
ãããã¯ãŒã¯ããã¬ãŒãã³ã°ããããã«ãã«ã©ãŒç»åã䜿çšãããŸãã RGBããLabã«å€æããŸããã çœé»ã¬ã€ã€ãŒãå
¥åã«éãããåºåã«ãã2ã€ã®ã«ã©ãŒã¬ã€ã€ãŒãçæãããŸãã
1ã€ã®ç¯å²ã§ãèšç®ãããå€ãå®éã®å€ãšæ¯èŒïŒãããïŒããããã«ãã£ãŠäºãã«æ¯èŒããŸãã ç¯å²ã®å¢çã¯-1ã1ã§ããèšç®å€ãæ¯èŒããã«ã¯ãtanhã¢ã¯ãã£ããŒã·ã§ã³é¢æ°ïŒåæ²ç·ã¿ã³ãžã§ã³ã·ã£ã«ïŒã䜿çšããŸãã å€ã«
é©çšãããšã颿°ã¯-1ã1ã®ç¯å²ã®å€ãè¿ããŸãã
å®éã®è²ã®å€ã¯ã-128ã128ã§ããã©ãã¹ããŒã¹ã§ã¯ããããããã©ã«ãã®ç¯å²ã§ãã åå€ã128ã§é€ç®ãããšããããã¯ãã¹ãŠâ1ã1ã®ç¯å²ã«ãªããŸãããã®ãæ£èŠåãã«ãããèšç®ã®èª€å·®ãæ¯èŒã§ããŸãã
çµæã®èª€å·®ãèšç®ããåŸããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãã£ã«ã¿ãŒãæŽæ°ããŠã次ã®å埩ã®çµæã調æŽããŸãã ãšã©ãŒãæå°ã«ãªããŸã§ãæé å
šäœãåšæçã«ç¹°ãè¿ãããŸãã
ãã®ã³ãŒãã®æ§æãèŠãŠã¿ãŸãããã
X = rgb2lab(1.0/255*image)[:,:,0]
Y = rgb2lab(1.0/255*image)[:,:,1:]
1.0 / 255ã¯ã24ãããRGBè²ç©ºéã䜿çšããããšãæå³ããŸãã ã€ãŸããåã«ã©ãŒãã£ãã«ã«å¯ŸããŠã0ã255ã®ç¯å²ã®å€ã䜿çšããŸããããã«ããã1670äžè²ãåŸãããŸãã
ãããã人éã®ç®ã¯200ã1000äžè²ããèªèã§ããªããããããåºãè²ç©ºéã䜿çšããŠãæå³ããããŸããã
Y = Y / 128
ã©ãã®è²ç©ºéã¯ç°ãªãç¯å²ã䜿çšããŸãã ã«ã©ãŒã¹ãã¯ãã«
abã¯-128ã128ã®ç¯å²ã§å€åããŸããåºåã¬ã€ã€ãŒã®ãã¹ãŠã®å€ã128ã§é€ç®ãããšã-1ã1ã®ç¯å²ã«åãŸãããããã®å€ããã¥ãŒã©ã«ãããã¯ãŒã¯ã§èšç®ãããå€ãšæ¯èŒã§ããŸãã
rgb2lab()
颿°ã䜿çšããŠè²ç©ºéã倿ããåŸã
[ïŒãïŒã0]ã䜿çšããŠçœé»ã¬ã€ã€ãŒ
ãéžæ
ããŸãã ããã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ãžã®å
¥åã§ãã [ïŒãïŒã1ïŒ]ã¯ãèµ€ç·ãšéé»è²ã®2ã€ã®ã«ã©ãŒã¬ã€ã€ãŒãéžæããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ããã¬ãŒãã³ã°ããåŸãæåŸã®èšç®ãå®è¡ãããããç»åã«å€æããŸãã
output = model.predict(X)
output = output * 128
ããã§ã¯ãçœé»ç»åããã£ãŒãããèšç·Žããããã¥ãŒã©ã«ãããã¯ãŒã¯ãä»ããŠãããé§åããŸãã -1ãã1ãŸã§ã®ãã¹ãŠã®åºåå€ãååŸãã128ã§ä¹ç®ããŸãããããã£ãŠãLabã·ã¹ãã ã§æ£ããè²ãååŸããŸãã
canvas = np.zeros((400, 400, 3))
canvas[:,:,0] = X[0][:,:,0]
canvas[:,:,1:] = output[0]
é»ã®RGBãã£ã³ãã¹ãäœæãã3ã€ã®ã¬ã€ã€ãŒãã¹ãŠããŒãã§åããŸãã æ¬¡ã«ããã¹ãç»åããçœé»ã¬ã€ã€ãŒãã³ããŒãã2ã€ã®ã«ã©ãŒã¬ã€ã€ãŒã远å ããŸãã çµæã®ãã¯ã»ã«å€ã®é
åã¯ç»åã«å€æãããŸãã
ã¢ã«ãã¡çã«åãçµãã§ãããšãã«åŠãã ããš
- ç ç©¶è«æãèªãã®ã¯å€§å€ã§ãã ããããèšäºã®äž»èŠãªèŠå®ãèŠçŽãã䟡å€ããããããããç ç©¶ããã®ã容æã«ãªããŸããã ãŸãããã®èšäºã«ããã€ãã®è©³çްãå«ããã®ã«åœ¹ç«ã¡ãŸããã
- ããªãã¯å°ããå§ããå¿
èŠããããŸãã ãããã¯ãŒã¯ã§èŠã€ãã£ãå®è£
ã®ã»ãšãã©ã¯ã2ã1äžè¡ã®ã³ãŒãã§æ§æãããŠããŸããã ããã«ãããåºæ¬çãªããžãã¯ãçè§£ããããšãéåžžã«é£ãããªããŸãã ããããæå
ã«åçŽåãããåºæ¬ããŒãžã§ã³ãããå Žåã¯ãå®è£
ãšç ç©¶è«æã®äž¡æ¹ãèªãæ¹ãç°¡åã§ãã
- ä»ã®äººã®ãããžã§ã¯ããçè§£ããã®ãæ ããªãã§ãã ãã ã ã³ãŒãã®å
容ã倿ããã«ã¯ãGithubã§å€æ°ã®ç»åã«ã©ãŒãªã³ã°ãããžã§ã¯ããæ€èšããå¿
èŠããããŸããã
- ãã¹ãŠãæå³ãããšããã«æ©èœãããšã¯éããŸãã ã ããããæåã¯ããããã¯ãŒã¯ã§äœæã§ããã®ã¯èµ€ãšé»è²ã®ã¿ã§ãã åããŠãæçµçãªã¢ã¯ãã£ããŒã·ã§ã³ã«Reluã®ã¢ã¯ãã£ããŒã·ã§ã³æ©èœã䜿çšããŸããã ããããããã¯æ£ã®å€ã®ã¿ãçæãããããéãšç·ã®ã¹ãã¯ãã«ã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã Yè»žã«æ²¿ã£ãŠå€ã倿ããtanhã¢ã¯ãã£ããŒã·ã§ã³æ©èœã远å ããããšã«ããããã®æ¬ ç¹ã解決ããããšãã§ããŸããã
- çè§£>ã¹ããŒã ã ç§ãã¡ãèŠãå®è£
ã®å€ãã¯ããã«å®è¡ãããŸããããããããæäœããããšã¯å°é£ã§ããã ãã®ãããå®è¡ã§ã¯ãªããæ°ããæ©èœã远å ããé床ã«ã€ããŠã³ãŒããæé©åããããšã«ããŸããã
ããŒã¿ç
圌女ãèšç·ŽãããŠããªãç»åãè²ä»ãããã¢ã«ãã¡çãæäŸãããã®ããŒãžã§ã³ã®äž»ãªæ¬ ç¹ãäœã§ããããããã«çè§£ããŠãã ããã 圌女ã¯ãããåŠçã§ããŸããã å®éããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯æ
å ±ãèšæ¶ããŠããŸããã 圌女ã¯ããªãã¿ã®ãªãç»åã«è²ãä»ããæ¹æ³ãåŠã³ãŸããã§ããã ãããŠãããŒã¿çã§ä¿®æ£ããŸã-ãã¥ãŒã©ã«ãããã¯ãŒã¯ã«äžè¬åãæããŸãã
以äžã¯ãããŒã¿çãã©ã®ããã«ãã¹ãç»åãçè²ãããã瀺ããŠããŸãã
Imagenetã䜿çšãã代ããã«ãFloydHubäžã«ãããåªããç»åã
å«ããããªãã¯ããŒã¿ã»ãããäœæããŸã
ã ã ãããã¯ãããã®åçå®¶ã®åçãã¬ã€ã¢ãŠããããŠãã
Unsplashãã
ååŸãããŸãã ããŒã¿ã»ããã«ã¯9500ã®ãã¬ãŒãã³ã°ç»åãš500ã®ãã¹ãç»åããããŸãã
æ©èœãã€ã©ã€ã¿ãŒ
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãçœé»ç»åãšã«ã©ãŒããŒãžã§ã³ãæ¥ç¶ããç¹æ§ãæ¢ããŠããŸãã
çœé»ã®åçãè²ä»ãããå¿
èŠããããšæ³åããŠãã ããããã ããç»é¢äžã§äžåºŠã«è¡šç€ºã§ããã®ã¯9ãã¯ã»ã«ã ãã§ãã åç»åãå·Šããå³ãäžããäžã«è¡šç€ºããŠãåãã¯ã»ã«ã®è²ãèšç®ã§ããŸãã

ãããã®9ã€ã®ãã¯ã»ã«ã女æ§ã®éŒ»åã®ç«¯ã«çœ®ããŸãã ãçè§£ã®ãšãããããã§é©åãªè²ãéžæããããšã¯ã»ãšãã©äžå¯èœã§ãããããåé¡ã®è§£æ±ºçãæ®µéçã«åå²ããå¿
èŠããããŸãã
ãŸããåçŽãªç¹åŸŽçãªæ§é ãæ¢ããŠããŸãïŒæãã®ç·ãé»ããã¯ã»ã«ã®ã¿ãªã©ã 9ãã¯ã»ã«ã®åæ£æ¹åœ¢ã§ãåãæ§é ãæ¢ããããã«å¯Ÿå¿ããªããã®ããã¹ãŠåé€ããŸãã ãã®çµæã64åã®ãããã£ã«ã¿ãŒãã64åã®æ°ããç»åãäœæããŸããã
åæ®µéã§åŠçãããç»åãã£ã«ã¿ãŒã®æ°ãããäžåºŠç»åãèŠããšããã§ã«ç¹å®ããåãå°ããªç¹°ãè¿ãæ§é ãèŠã€ãããŸãã ç»åãããããåæããã«ã¯ããµã€ãºãååã«æžãããŸãã
3段éã§ãµã€ãºãçž®å°ããŸããåç»åãã¹ãã£ã³ããå¿
èŠããã3x3ãã£ã«ã¿ãŒããŸã ãããŸãã ããããåçŽãªãã£ã«ã¿ãŒãæ°ãã9ãã¯ã»ã«ã®æ£æ¹åœ¢ã«é©çšãããšãããè€éãªæ§é ãæ€åºã§ããŸãã ããšãã°ãååãå°ããªç¹ããŸãã¯ç·ã ç¹°ãè¿ããŸãããç»åã«åãç¹°ãè¿ãæ§é ããããŸãã ä»åã¯ããã£ã«ã¿ãŒã§åŠçããã128ã®æ°ããç»åãçæããŸãã
ããã€ãã®æé ãå®è¡ãããšããã£ã«ã¿ãŒã«ãã£ãŠåŠçãããç»åã¯æ¬¡ã®ããã«ãªããŸãã

ç¹°ãè¿ãã«ã¯ããšããžãªã©ã®åçŽãªããããã£ãæ¢ãããšããå§ããŸãã åŠçãããšãã¬ã€ã€ãŒã¯æ§é ã«ãããã«è€éãªæ©èœã«çµåãããæçµçã«ã¯é¡ãåŸãããŸãã 詳现ã«ã€ããŠã¯ããã®ãããªã§èª¬æããŠããŸãã
説æãããŠããããã»ã¹ã¯ãã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã¢ã«ãŽãªãºã ã«éåžžã«äŒŒãŠããŸãã ããã§ã¯ãããã€ãã®åŠçãããç»åãçµã¿åãããŠç»åå
šäœã®å
容ãçè§£ãããããããç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŸãã
ããããã£ã®æœåºããè²ãž
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯è©Šè¡é¯èª€ã®ååã«åºã¥ããŠåäœããŸãã ãŸãã圌女ã¯ã©ã³ãã ã«åãã¯ã»ã«ã«è²ãå²ãåœãŠãŸãã æ¬¡ã«ããã¯ã»ã«ããšã«ãšã©ãŒãèšç®ãããã£ã«ã¿ãŒã調æŽããŠã次ã®è©Šè¡ã§çµæãæ¹åããããšããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãæå€§ã®ãšã©ãŒå€ãæã€çµæããéå§ããŠããã£ã«ã¿ãŒã調æŽããŸãã ãã®å Žåããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãè²ãä»ãããã©ãããããã³ç»åå
ã®ããŸããŸãªãªããžã§ã¯ããã©ã®ããã«é
眮ããããæ±ºå®ããŸãã æåã«ã圌女ã¯ãã¹ãŠã®ãªããžã§ã¯ããè¶è²ã§ãã€ã³ãããŸãã ãã®è²ã¯ä»ã®ãã¹ãŠã®è²ã«æã䌌ãŠããããã䜿çšãããšãšã©ãŒãæå°ã«ãªããŸãã
ãã¬ãŒãã³ã°ããŒã¿ã®åäžæ§ã«ããããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ããŸããŸãªãªããžã§ã¯ãéã®éããçè§£ããããšããŠããŸãã 圌女ã¯ãŸã ããæ£ç¢ºãªè²åããèšç®ããããšã¯ã§ããŸããããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãã«ããŒãžã§ã³ãäœæãããšãã«ããã«å¯ŸåŠããŸãã
ããŒã¿ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
# Get images
X = []
for filename in os.listdir('../Train/'):
X.append(img_to_array(load_img('../Train/'+filename)))
X = np.array(X, dtype=float)
# Set up training and test data
split = int(0.95*len(X))
Xtrain = X[:split]
Xtrain = 1.0/255*Xtrain
#Design the neural network
model = Sequential()
model.add(InputLayer(input_shape=(256, 256, 1)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', strides=2))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same', strides=2))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same', strides=2))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(2, (3, 3), activation='tanh', padding='same'))
model.add(UpSampling2D((2, 2)))
# Finish model
model.compile(optimizer='rmsprop', loss='mse')
# Image transformer
datagen = ImageDataGenerator(
shear_range=0.2,
zoom_range=0.2,
rotation_range=20,
horizontal_flip=True)
# Generate training data
batch_size = 50
def image_a_b_gen(batch_size):
for batch in datagen.flow(Xtrain, batch_size=batch_size):
lab_batch = rgb2lab(batch)
X_batch = lab_batch[:,:,:,0]
Y_batch = lab_batch[:,:,:,1:] / 128
yield (X_batch.reshape(X_batch.shape+(1,)), Y_batch)
# Train model
TensorBoard(log_dir='/output')
model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=10000, epochs=1)
# Test images
Xtest = rgb2lab(1.0/255*X[split:])[:,:,:,0]
Xtest = Xtest.reshape(Xtest.shape+(1,))
Ytest = rgb2lab(1.0/255*X[split:])[:,:,:,1:]
Ytest = Ytest / 128
print model.evaluate(Xtest, Ytest, batch_size=batch_size)
# Load black and white images
color_me = []
for filename in os.listdir('../Test/'):
color_me.append(img_to_array(load_img('../Test/'+filename)))
color_me = np.array(color_me, dtype=float)
color_me = rgb2lab(1.0/255*color_me)[:,:,:,0]
color_me = color_me.reshape(color_me.shape+(1,))
# Test model
output = model.predict(color_me)
output = output * 128
# Output colorizations
for i in range(len(output)):
cur = np.zeros((256, 256, 3))
cur[:,:,0] = color_me[i][:,:,0]
cur[:,:,1:] = output[i]
imsave("result/img_"+str(i)+".png", lab2rgb(cur))
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®ããŒã¿çãèµ·åããFloydHubã³ãã³ãïŒ
floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard
æè¡çãªèª¬æ
ç»åãåŠçããä»ã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ãšã¯ç°ãªãããã¯ã»ã«ã®äœçœ®ãéèŠã§ãã ã«ã©ãŒãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ã¯ãç»åãµã€ãºãŸãã¯ã¢ã¹ãã¯ãæ¯ã¯å€æŽãããŸããã ãŸããä»ã®ã¿ã€ãã®ãããã¯ãŒã¯ã§ã¯ãæçµããŒãžã§ã³ã«è¿ã¥ãã«ã€ããŠç»åãããã¿ãŸãã
åé¡ãããã¯ãŒã¯ã§äœ¿çšãããæå€§æ©èœãåããããŒãªã³ã°å±€ã¯ãæ
å ±ã®å¯åºŠãé«ããŸãããåæã«ç»åãæªããŸãã ç»åã¬ã€ã¢ãŠãã§ã¯ãªããæ
å ±ã®ã¿ãè©äŸ¡ããŸãã ãŸããã«ã©ãŒãããã§ã¯ãå¹
ãšé«ããååã«æžããããã«ãã¹ããã2ïŒ2ã®ã¹ãã©ã€ãïŒã䜿çšããŸãã æ
å ±ã®å¯åºŠãå¢å ããŠããŸãããç»åã¯æªãã§ããŸããã

ãŸãããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãç»åã®ã¢ã¹ãã¯ãæ¯ãã¢ãããµã³ããªã³ã°ããã³ç¶æããä»ã®ã¬ã€ã€ãŒãšã¯ç°ãªããŸãã åé¡ãããã¯ãŒã¯ã¯æçµåé¡ã®ã¿ã察象ãšããããããã¥ãŒã©ã«ãããã¯ãŒã¯ãééããç»åã®ãµã€ãºãšå質ãåŸã
ã«äœäžããŸãã
ã«ã©ãŒãªã³ã°ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãç»åã®ã¢ã¹ãã¯ãæ¯ã倿ŽããŸããã ãããè¡ãã«ã¯ãäžã®å³ã®ããã«ã
*padding='same'*
ãã©ã¡ãŒã¿ãŒã䜿çšããŠçœããã£ãŒã«ãã远å ããŸãã ããããªããšãåç³ã¿èŸŒã¿ã¬ã€ã€ãŒãç»åãããªãã³ã°ããŸãã
ç»åã®ãµã€ãºã2åã«ããããã«ãã«ã©ãŒãªã³ã°ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ã¢ãããµã³ããªã³ã°
ã¬ã€ã€ãŒã䜿çšããŸãã
for filename in os.listdir('/Color_300/Train/'):
X.append(img_to_array(load_img('/Color_300/Test'+filename)))
ãã®
for-loop
æåã«ãã£ã¬ã¯ããªå
ã®ãã¹ãŠã®ãã¡ã€ã«ã®ååãèšç®ãããã£ã¬ã¯ããªãééããŠãã¹ãŠã®ç»åããã¯ã»ã«ã®é
åã«å€æããæåŸã«ãããã巚倧ãªãã¯ãã«ã«çµåããŸãã
datagen = ImageDataGenerator(
shear_range=0.2,
zoom_range=0.2,
rotation_range=20,
horizontal_flip=True)
ImageDataGeneratorã䜿çšããŠãã€ã¡ãŒãžãžã§ãã¬ãŒã¿ãŒãæå¹ã«ã§ããŸãã ãã®åŸãåç»åã¯åã®ç»åãšã¯ç°ãªãããããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãã¬ãŒãã³ã°ãé«éåãããŸãã
shear_range
ã¯ãç»åãå·ŠãŸãã¯å³ã«åŸãã
shear_range
ãŸãããŸãããºãŒã ã€ã³ãå転ããŸãã¯æ°Žå¹³æ¹åã«å転ããããšãã§ããŸãã
batch_size = 50
def image_a_b_gen(batch_size):
for batch in datagen.flow(Xtrain, batch_size=batch_size):
lab_batch = rgb2lab(batch)
X_batch = lab_batch[:,:,:,0]
Y_batch = lab_batch[:,:,:,1:] / 128
yield (X_batch.reshape(X_batch.shape+(1,)), Y_batch)
ãããã®èšå®ãXtrainãã©ã«ããŒå
ã®ç»åã«é©çšããæ°ããç»åãçæããŸãã æ¬¡ã«ã
X_batch
çœé»ã¬ã€ã€ãŒãš2è²ã®ã¬ã€ã€ãŒã®2è²ãæœåºããŸãã
model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=1, epochs=1000)
ãããªã«ãŒãã匷åã§ããã°ããã»ã©ãããå€ãã®åçãåæã«åŠçã§ããŸãã ããšãã°ã説æããã·ã¹ãã ã¯50ã100åã®ç»åãåŠçã§ããŸãã steps_per_epochãã©ã¡ãŒã¿ãŒã®å€ã¯ããã¬ãŒãã³ã°ã€ã¡ãŒãžã®æ°ãããããµã€ãºã§é€ç®ããããšã«ãã£ãŠååŸãããŸãã
ããšãã°ã100æã®åçããããã·ãªãŒãºãµã€ãºã50ã®å Žåãæéå
ã«2ã€ã®ã¹ããŒãžããããŸãã æéã®æ°ã«ãã£ãŠããã¹ãŠã®ç»åã§ãã¥ãŒã©ã«ãããã¯ãŒã¯ããã¬ãŒãã³ã°ããåæ°ãæ±ºãŸããŸãã 1äžæã®åçãš21ã®æéãããå ŽåãTesla K80ã°ã©ãã£ãã¯ã«ãŒãã§ã¯çŽ11æéããããŸãã
åŠãã ããš
- æåã«ãå°ããªã·ãªãŒãºã§ããã«å®éšãè¡ããæ¬¡ã«å€§èŠæš¡ãªå®è¡ã«é²ãããšãã§ããŸã ã 20ã30åã®å®éšã®åŸã§ããšã©ãŒãçºçããŸããã äœããå®è¡ãããŠããå Žåããããæ©èœããŠãããšããæå³ã§ã¯ãããŸããã éåžžããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãã°ã¯ãåŸæ¥ã®ããã°ã©ãã³ã°ãšã©ãŒãããç®ç«ã¡ãŸããã ããšãã°ãæãå¥åŠãªãã°ã®1ã€ã¯Adam hiccupã§ããã
- ããŒã¿ã»ããã倿§ã§ããã»ã©ãç»åã®è¶è²ãå€ããªããŸã ã ããŒã¿ã»ããã«éåžžã«é¡äŒŒããç»åãããå Žåããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãããè€éãªã¢ãŒããã¯ãã£ã䜿çšããªããŠãããªãããŸãæ©èœããŸãã ãããããã®ãããªãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ããã«äžè¬åãããŸãã
- ãã©ãŒã ããã©ãŒã ãããäžåºŠãã©ãŒã ã ç»åã®ãµã€ãºã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®äœæ¥å
šäœã«ããã£ãŠæ£ç¢ºã§ãäºãã«æ¯äŸããŠããå¿
èŠããããŸãã æåã«ã300ãã¯ã»ã«ã®ç»åã䜿çšããæ¬¡ã«ãããååãã€ãŸã150ã75ã35.5ãã¯ã»ã«ã«æ°åçž®å°ããŸããã åŸè
ã®ããŒãžã§ã³ã§ã¯ã2ãã¯ã»ã«ã4ãã¯ã»ã«ã8ãã¯ã»ã«ã16ãã¯ã»ã«ã32ãã¯ã»ã«ã64ãã¯ã»ã«ã256ãã¯ã»ã«ãªã©ã䜿çšããæ¹ãè¯ããšããçµè«ã«éãããŸã§ãæŸèæã®æã眮ãæããå¿
èŠããã£ããããååã®ãã¯ã»ã«ã倱ãããŸããã
- ããŒã¿ã»ããã®äœæ ïŒaïŒ.DS_Storeãã¡ã€ã«ãç¡å¹ã«ããŸããããããªããšã倢äžã«ãªããŸãã bïŒçºæã衚çŸããŠãã ããã ãã¡ã€ã«ãããŠã³ããŒãããããã«ãChromeã®ã³ã³ãœãŒã«ã¹ã¯ãªãããšæ¡åŒµæ©èœã䜿çšããŸããã cïŒ ã¯ãªãŒãã³ã°çšã®ã¹ã¯ãªãããåŠçããã³ç·šæãããœãŒã¹ãã¡ã€ã«ã®ã³ããŒãäœæããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãã«ããŒãžã§ã³
ã«ã©ãŒãªã³ã°ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®æçµããŒãžã§ã³ã«ã¯ã4ã€ã®ã³ã³ããŒãã³ããå«ãŸããŠããŸãã 以åã®ãããã¯ãŒã¯ããšã³ã³ãŒããŒãšãã³ãŒããŒã«åå²ãããããã®éã«ãã¥ãŒãžã§ã³ã¬ã€ã€ãŒãé
眮ããŸããã ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®åé¡ã«æ
£ããŠããªãå Žåã¯ã
http ïŒ
//cs231n.imtqy.com/classification/ã®ã¬ã€ããèªãããšããå§ãããŸãã
å
¥åããŒã¿ã¯ããšã³ã³ãŒããŒãšæã匷åãªææ°ã®åé¡åšã§ãã
Inception ResNet v2ãåæã«ééããŸãã ããã¯120äžæã®ç»åã§èšç·Žããããã¥ãŒã©ã«ãããã¯ãŒã¯ã§ãã åé¡ã¬ã€ã€ãŒãæœåºãããšã³ã³ãŒããŒã®åºåãšçµåããŸãã

ãã詳现ãªèŠèŠç説æïŒ
https :
//github.com/baldassarreFe/deep-koalarizationåé¡åšããã«ã©ãŒãªã³ã°ãããã¯ãŒã¯ã«ãã¬ãŒãã³ã°ã転éãããšãåçã«ç€ºãããŠããå
容ãçè§£ã§ããããããªããžã§ã¯ãã®è¡šçŸãã«ã©ãŒãªã³ã°ã¹ããŒã ãšæ¯èŒã§ããŸãã
ããã«ããã€ãã®ãã¹ãç»åããããŸããããããã¯ãŒã¯ã®ãã¬ãŒãã³ã°ã«ã¯20æã®åçãã䜿çšãããŠããŸããã
ã»ãšãã©ã®åçã¯æ²ãã£ãŠæãããŠããŸãã ãããã倧ããªãã¹ãã»ããïŒ2500åã®ç»åïŒã®ãããã§ãããã€ãã®ãŸãšããªãã®ããããŸãã ãã倧ããªãµã³ãã«ã§ãããã¯ãŒã¯ããã¬ãŒãã³ã°ãããšãããå®å®ããçµæãåŸãããŸãããããã§ãåçã®å€§éšåã¯è¶è²ã«ãªã£ãŠããŸãã 以äžã«ã
å®éšãšãã¹ãç»åã®å®å
šãªãªã¹ãã瀺ããŸãã
ããŸããŸãªç ç©¶ããã®æãäžè¬çãªã¢ãŒããã¯ãã£ïŒ
- ãããã¯ãŒã¯ã«ãã³ãïŒ ãªã³ã¯ ïŒãäžããããã«ãç»åã«å°ããªè²ã®ããããæåã§è¿œå ããŸãã
- åæ§ã®ç»åãèŠã€ããŠãããããè²ã転éããŸãïŒè©³çްã¯ãã¡ããšãã¡ã ïŒã
- æ®å·®ãšã³ã³ãŒããŒå±€ãšããŒãžåé¡å±€ïŒ ãªã³ã¯ ïŒã
- åé¡ãããã¯ãŒã¯ã®ãã€ããŒã«ã©ã ãçµã¿åãããŸãïŒè©³çްã¯ãã¡ããšãã¡ã ïŒã
- ãšã³ã³ãŒããŒãšãã³ãŒããŒã®æçµçãªåé¡ãçµã¿åãããŸã ïŒè©³çްã¯ãã¡ããšãã¡ã ïŒã
è²ç©ºé ïŒã©ããYUVãHSVãããã³LUVïŒè©³çްã¯
ãã¡ããš
ãã¡ã ïŒ
æå€± ïŒæšæºèª€å·®ãåé¡ãå éåé¡ïŒ
åç
§ ïŒã
æè¯ã®çµæãåŸãããããããããŒãžã¬ã€ã€ãŒãïŒãªã¹ãã®5çªç®ïŒãæã€ã¢ãŒããã¯ãã£ãéžæããŸããã ãŸãã
Kerasã§çè§£ãããããåçŸãããããªã£ãŠããŸãã ããã¯æåŒ·ã®ã¢ãŒããã¯ãã£ã§ã¯ãããŸããããæåã¯ååã§ãããã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®æ§é ã¯
ã Federico BaldasarreãšåœŒã®ååã®ç ç©¶ããåçšãããŠãããKerasãšé£æºããããã«ãªã£ãŠããŸãã æ³šïŒãã®ã³ãŒãã¯Kerasã·ãŒã±ã³ã·ã£ã«ã¢ãã«ã®ä»£ããã«æ©èœAPIã䜿çšããŸãã [
ããã¥ã¡ã³ã ]
# Get images
X = []
for filename in os.listdir('/data/images/Train/'):
X.append(img_to_array(load_img('/data/images/Train/'+filename)))
X = np.array(X, dtype=float)
Xtrain = 1.0/255*X
#Load weights
inception = InceptionResNetV2(weights=None, include_top=True)
inception.load_weights('/data/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5')
inception.graph = tf.get_default_graph()
embed_input = Input(shape=(1000,))
#Encoder
encoder_input = Input(shape=(256, 256, 1,))
encoder_output = Conv2D(64, (3,3), activation='relu', padding='same', strides=2)(encoder_input)
encoder_output = Conv2D(128, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(128, (3,3), activation='relu', padding='same', strides=2)(encoder_output)
encoder_output = Conv2D(256, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(256, (3,3), activation='relu', padding='same', strides=2)(encoder_output)
encoder_output = Conv2D(512, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(512, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(256, (3,3), activation='relu', padding='same')(encoder_output)
#Fusion
fusion_output = RepeatVector(32 * 32)(embed_input)
fusion_output = Reshape(([32, 32, 1000]))(fusion_output)
fusion_output = concatenate([encoder_output, fusion_output], axis=3)
fusion_output = Conv2D(256, (1, 1), activation='relu', padding='same')(fusion_output)
#Decoder
decoder_output = Conv2D(128, (3,3), activation='relu', padding='same')(fusion_output)
decoder_output = UpSampling2D((2, 2))(decoder_output)
decoder_output = Conv2D(64, (3,3), activation='relu', padding='same')(decoder_output)
decoder_output = UpSampling2D((2, 2))(decoder_output)
decoder_output = Conv2D(32, (3,3), activation='relu', padding='same')(decoder_output)
decoder_output = Conv2D(16, (3,3), activation='relu', padding='same')(decoder_output)
decoder_output = Conv2D(2, (3, 3), activation='tanh', padding='same')(decoder_output)
decoder_output = UpSampling2D((2, 2))(decoder_output)
model = Model(inputs=[encoder_input, embed_input], outputs=decoder_output)
#Create embedding
def create_inception_embedding(grayscaled_rgb):
grayscaled_rgb_resized = []
for i in grayscaled_rgb:
i = resize(i, (299, 299, 3), mode='constant')
grayscaled_rgb_resized.append(i)
grayscaled_rgb_resized = np.array(grayscaled_rgb_resized)
grayscaled_rgb_resized = preprocess_input(grayscaled_rgb_resized)
with inception.graph.as_default():
embed = inception.predict(grayscaled_rgb_resized)
return embed
# Image transformer
datagen = ImageDataGenerator(
shear_range=0.4,
zoom_range=0.4,
rotation_range=40,
horizontal_flip=True)
#Generate training data
batch_size = 20
def image_a_b_gen(batch_size):
for batch in datagen.flow(Xtrain, batch_size=batch_size):
grayscaled_rgb = gray2rgb(rgb2gray(batch))
embed = create_inception_embedding(grayscaled_rgb)
lab_batch = rgb2lab(batch)
X_batch = lab_batch[:,:,:,0]
X_batch = X_batch.reshape(X_batch.shape+(1,))
Y_batch = lab_batch[:,:,:,1:] / 128
yield ([X_batch, create_inception_embedding(grayscaled_rgb)], Y_batch)
#Train model
tensorboard = TensorBoard(log_dir="/output")
model.compile(optimizer='adam', loss='mse')
model.fit_generator(image_a_b_gen(batch_size), callbacks=[tensorboard], epochs=1000, steps_per_epoch=20)
#Make a prediction on the unseen images
color_me = []
for filename in os.listdir('../Test/'):
color_me.append(img_to_array(load_img('../Test/'+filename)))
color_me = np.array(color_me, dtype=float)
color_me = 1.0/255*color_me
color_me = gray2rgb(rgb2gray(color_me))
color_me_embed = create_inception_embedding(color_me)
color_me = rgb2lab(color_me)[:,:,:,0]
color_me = color_me.reshape(color_me.shape+(1,))
# Test model
output = model.predict([color_me, color_me_embed])
output = output * 128
# Output colorizations
for i in range(len(output)):
cur = np.zeros((256, 256, 3))
cur[:,:,0] = color_me[i][:,:,0]
cur[:,:,1:] = output[i]
imsave("result/img_"+str(i)+".png", lab2rgb(cur))
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãã«ããŒãžã§ã³ãå®è¡ããFloydHubã³ãã³ãïŒ
floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard
æè¡çãªèª¬æ
Kerasæ©èœAPI㯠ãè€æ°ã®ã¢ãã«ãé£çµãŸãã¯çµåããã®ã«æé©ã§ãã
æåã«ã
Inception ResNet v2ãã¥ãŒã©ã«ãããã¯ãŒã¯ãããŠã³ããŒããããŠã§ã€ããããŒãããŸãã 2ã€ã®ã¢ãã«ãåæã«äœ¿çšãããããã©ã¡ããæ±ºå®ããå¿
èŠããããŸãã ããã¯ã
Tensorflow ãKerasããã¯ãšã³ãã§è¡ãããŸãã
inception = InceptionResNetV2(weights=None, include_top=True)
inception.load_weights('/data/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5')
inception.graph = tf.get_default_graph()
è£æ£ãããç»åããã·ãªãŒãºïŒãããïŒãäœæããŸãããã ããããb / wã«å€æããInception ResNetã¢ãã«ã§å®è¡ããŸãã
grayscaled_rgb = gray2rgb(rgb2gray(batch))
embed = create_inception_embedding(grayscaled_rgb)
æåã«ãåçããµã€ãºå€æŽããŠã¢ãã«ããã£ãŒãããå¿
èŠããããŸãã æ¬¡ã«ãããªããã»ããµã䜿çšããŠããã¯ã»ã«ãšå€ã®è²ãç®çã®åœ¢åŒã«ããŸãã æåŸã«ãInceptionãããã¯ãŒã¯ãä»ããŠç»åãé§åããã¢ãã«ã®æçµå±€ãæœåºããŸãã
def create_inception_embedding(grayscaled_rgb):
grayscaled_rgb_resized = []
for i in grayscaled_rgb:
i = resize(i, (299, 299, 3), mode='constant')
grayscaled_rgb_resized.append(i)
grayscaled_rgb_resized = np.array(grayscaled_rgb_resized)
grayscaled_rgb_resized = preprocess_input(grayscaled_rgb_resized)
with inception.graph.as_default():
embed = inception.predict(grayscaled_rgb_resized)
return embed
ãžã§ãã¬ãŒã¿ãŒã«æ»ããŸãããã åã·ãªãŒãºã«ã€ããŠã以äžã«èª¬æãã圢åŒã®20åã®ç»åãçæããŸãã Tesla K80 GPUã«ã¯çŽ1æéããããŸããã ãã®ã¢ãã«ã䜿çšãããšããã®ãããªã«ãŒãã¯ã¡ã¢ãªã®åé¡ãªãã«äžåºŠââã«æå€§50åã®ç»åãçæã§ããŸãã
yield ([X_batch, create_inception_embedding(grayscaled_rgb)], Y_batch)
ããã¯ãã«ã©ãŒãããã¢ãã«ã®åœ¢åŒãšäžèŽããŸãã
model = Model(inputs=[encoder_input, embed_input], outputs=decoder_output)
encoder_inputis
Encoderã¢ãã«ã«æž¡ããããã®åºåã¯
embed_inputin
ããŒãžã¬ã€ã€ãŒã«
embed_inputin
ãŸãã ããŒãžåºåã¯Decoderã¢ãã«ã®å
¥åã«éãããDecoderã¢ãã«ã¯æçµããŒã¿ã§ãã
decoder_output
ãè¿ããŸãã
fusion_output = RepeatVector(32 * 32)(embed_input)
fusion_output = Reshape(([32, 32, 1000]))(fusion_output)
fusion_output = concatenate([fusion_output, encoder_output], axis=3)
fusion_output = Conv2D(256, (1, 1), activation='relu')(fusion_output)
ããŒãžã¬ã€ã€ãŒã§ã¯ãæåã«1000ã«ããŽãªã®ã¬ã€ã€ãŒïŒ1000ã«ããŽãªãŒã¬ã€ã€ãŒïŒã«1024ïŒ32 * 32ïŒãæããŸãã ãããã£ãŠãInceptionã¢ãã«ããæçµå±€ã®1024è¡ãååŸããŸãã 32 x 32ã°ãªããã¯ã2次å
ãã3次å
ã®è¡šçŸã«å€æããã1000åã®ã«ããŽãªãŒïŒã«ããŽãªãŒã®æ±ïŒããããŸãã ãã®åŸãåã¯ãšã³ã³ãŒãã¢ãã«ã®åºåã«ãªã³ã¯ãããŸãã 254åã®ãã£ã«ã¿ãŒãš1x1ã³ã¢ãå«ãç³ã¿èŸŒã¿ãããã¯ãŒã¯ãããŒãžã¬ã€ã€ãŒã®æçµçµæã«é©çšããŸãã
åŠãã ããš
- ç ç©¶çšèªã¯åšå§çã§ããã Kerasã§ãå䜵ã¢ãã«ããå®è£
ããæ¹æ³ãæ¢ãããã«3æ¥éãè²»ãããŸããã ãšãŠãè€éã«èãããã®ã§ãåçŽã«ãã®ã¿ã¹ã¯ãåŒãåããããããŸããã§ãããäœæ¥ãä¿é²ããã¢ããã€ã¹ãèŠã€ããããšããŸããã
- ãããã«é¢ãã質å ã Keras Slackãã£ã³ãã«ã«ã¯ã³ã¡ã³ãã1ã€ããããŸããã§ãããStackOverflowã§ã¯ã質åãåé€ãããŸããã ããããç°¡åãªçããæ¢ããŠåé¡ãå
¬ã«åæãå§ãããšãããã®åé¡ã解決ããæ¹æ³ãæããã«ãªããŸããã
- ã¡ãŒãªã³ã°ãªã¹ã ã ããªãã¯ãã©ãŒã©ã ã§ç¡èŠããããããããŸããããããªãã人ã
ã«çŽæ¥é£çµ¡ããã°ã圌ãã¯ããææã«ãªããŸãã Skypeã®ç ç©¶è
ãšè²ç©ºéãæ±ãããšã«ã€ããŠã®è°è«ã«å±ãŸãããŸããïŒ
- ããŒãžã®åé¡ã解決ããã®ãå°é£ã ã£ããããæåã«ãã¹ãŠã®ã³ã³ããŒãã³ããèšè¿°ããæ¬¡ã«ããããäºãã«çµã¿åãããããšã«ããŸãããããã«ããã€ãã®ããŒãžã¬ã€ã€ãŒåå²å®éšããããŸãã
- äžéšã®ã³ã³ããŒãã³ããåäœããããã«æãããå Žåãããã«ã€ããŠç¢ºå®æ§ã¯ãããŸããã§ãããåºæ¬çãªããžãã¯ãå®å
šã«æã£ãŠããããšã¯ç¥ã£ãŠããŸããããæ©èœãããšã¯ä¿¡ããŠããŸããã§ãããã¬ã¢ã³ãã£ãŒãšé·ãæ£æ©ã®åŸãç§ãã¡ã¯å§ããããšã«ããŸãããã¢ãã«ã®æåã®è¡ã«ãšã©ãŒã衚瀺ãããŸããããããã4æ¥åŸãæ°çŸã®ãã°ãšGoogleãžã®æ°åã®ãªã¯ãšã¹ãã«ãããã¢ãã«ã®åäœäžã«åæãããŠããããšããã¯1/22ããç»å ŽããŸããã
次ã¯äœã§ãã
â . , . , . :
- .
- .
- , .
- (amplifier) RGB. , , .
- .
- . , . «».
- FloydHub.- - woman.jpg ( 400x400 ).
- - Test, FloydHub-. Notebook Test, . 256x256 . , -.