使用機器學習來進行卡通上色
監督式機器學習的一個大問題是需要大量的歸類數據,特別是如果你沒有這些數據時——即使這是一個充斥著大數據的世界,我們大多數人依然沒有大數據——這就真的是一個大問題了。
儘管少數公司可以訪問某些類型的大量歸類數據,但對於大多數的組織和應用來說,創造足夠的正確類型的歸類數據,花費還是太高了,以至於近乎不可能。在某些時候,這個領域還是一個沒有太多數據的領域(比如說,當我們診斷一種稀有的疾病,或者判斷一個數據是否匹配我們已知的那一點點樣本時)。其他時候,通過 Amazon Turkers 或者暑假工這些人工方式來給我們需要的數據做分類,這樣做的花費太高了。對於一部電影長度的視頻,因為要對每一幀做分類,所以成本上漲得很快,即使是一幀一美分。
大數據需求的一個大問題
我們團隊目前打算解決一個問題是:我們能不能在沒有手繪的數百或者數千訓練數據的情況下,訓練出一個模型,來自動化地為黑白像素圖片提供簡單的配色方案。
在這個實驗中(我們稱這個實驗為龍畫),面對深度學習龐大的對分類數據的需求,我們使用以下這種方法:
- 對小數據集的快速增長使用基於規則的的策略。
- 借用 tensorflow 圖像轉換的模型,Pix2Pix 框架,從而在訓練數據非常有限的情況下實現自動化卡通渲染。
我曾見過 Pix2Pix 框架,在一篇論文(由 Isola 等人撰寫的「Image-to-Image Translation with Conditional Adversarial Networks」)中描述的機器學習圖像轉換模型,假設 A 是風景圖 B 的灰度版,在對 AB 對進行訓練後,再給風景圖片進行上色。我的問題和這是類似的,唯一的問題就是訓練數據。
我需要的訓練數據非常有限,因為我不想為了訓練這個模型,一輩子畫畫和上色來為它提供彩色圖片,深度學習模型需要成千上萬(或者成百上千)的訓練數據。
基於 Pix2Pix 的案例,我們需要至少 400 到 1000 個黑白、彩色成對的數據。你問我願意畫多少?可能就只有 30 個。我畫了一小部分卡通花和卡通龍,然後去確認我是否可以把他們放進數據集中。
80% 的解決方案:按組件上色
![Characters colored by component rules](/data/attachment/album/201806/14/111734h74gpphxl1h4h7g7.png "Characters colored by component rules")
按組件規則對黑白像素進行上色
當面對訓練數據的短缺時,要問的第一個問題就是,是否有一個好的非機器學習的方法來解決我們的問題,如果沒有一個完整的解決方案,那是否有一個部分的解決方案,這個部分解決方案對我們是否有好處?我們真的需要機器學習的方法來為花和龍上色嗎?或者我們能為上色指定幾何規則嗎?
![How to color by components](/data/attachment/album/201806/14/111734gx7dng3nsn78z34s.png "How to color by components")
如何按組件進行上色
現在有一種非機器學習的方法來解決我的問題。我可以告訴一個孩子,我想怎麼給我的畫上色:把花的中心畫成橙色,把花瓣畫成黃色,把龍的身體畫成橙色,把龍的尖刺畫成黃色。
開始的時候,這似乎沒有什麼幫助,因為我們的電腦不知道什麼是中心,什麼是花瓣,什麼是身體,什麼是尖刺。但事實證明,我們可以依據連接組件來定義花和龍的部分,然後得到一個幾何解決方案為我們 80% 的畫來上色,雖然 80% 還不夠,我們可以使用戰略性違規轉換、參數和機器學習來引導基於部分規則的解決方案達到 100%。
連接的組件使用的是 Windows 畫圖(或者類似的應用)上的色,例如,當我們對一個二進位黑白圖像上色時,如果你單擊一個白色像素,這個白色像素會在不穿過黑色的情況下變成一種新的顏色。在一個規則相同的卡通龍或者花的素描中,最大的白色組件就是背景,下一個最大的組件就是身體(加上手臂和腿)或者花的中心,其餘的部分就是尖刺和花瓣,除了龍眼睛,它可以通過和背景的距離來做區分。
使用戰略規則和 Pix2Pix 來達到 100%
我的一部分素描不符合規則,一條粗心畫下的線可能會留下一個缺口,一條後肢可能會上成尖刺的顏色,一個小的,居中的雛菊會交換花瓣和中心的上色規則。
對於那 20% 我們不能用幾何規則進行上色的部分,我們需要其他的方法來對它進行處理,我們轉向 Pix2Pix 模型,它至少需要 400 到 1000 個素描/彩色對作為數據集(在 Pix2Pix 論文里的最小的數據集),裡面包括違反規則的例子。
所以,對於每個違反規則的例子,我們最後都會通過手工的方式進行上色(比如後肢)或者選取一些符合規則的素描 / 彩色對來打破規則。我們在 A 中刪除一些線,或者我們多轉換一些,居中的花朵 A 和 B 使用相同的函數 (f) 來創造新的一對,f(A) 和 f(B),一個小而居中的花朵,這可以加入到數據集。
使用高斯濾波器和同胚增大到最大
在計算機視覺中使用幾何轉換增強數據集是很常見的做法。例如循環,平移,和縮放。
但是如果我們需要把向日葵轉換為雛菊或者把龍的鼻子變成球型和尖刺型呢?
或者如果說我們只需要大量增加數據量而不管過擬合?那我們需要比我們一開始使用的數據集大 10 到 30 倍的數據集。
![Sunflower turned into a daisy with r -> r cubed](/data/attachment/album/201806/14/111735t6ssdzjut6t88dot.png "Sunflower turned into a daisy with r -> r cubed")
向日葵通過 r -> r 立方體方式變成一個雛菊
![Gaussian filter augmentations](/data/attachment/album/201806/14/111735u7xxg8ekxh8mkf2z.png "Gaussian filter augmentations")
高斯濾波器增強
單位盤的某些同胚可以形成很好的雛菊(比如 r -> r 立方體,高斯濾波器可以改變龍的鼻子。這兩者對於數據集的快速增長是非常有用的,並且產生的大量數據都是我們需要的。但是他們也會開始用一種不能仿射轉換的方式來改變畫的風格。
之前我們考慮的是如何自動化地設計一個簡單的上色方案,上述內容激發了一個在這之外的問題:什麼東西定義了藝術家的風格,不管是外部的觀察者還是藝術家自己?他們什麼時候確定了自己的的繪畫風格呢?他們不可能沒有自己畫畫的演算法?工具、助手和合作者之間的區別是什麼?
我們可以走多遠?
我們畫畫的投入可以有多低?保持在一個主題之內並且風格可以辨認出為某個藝術家的作品,在這個範圍內我們可以創造出多少的變化和複雜性?我們需要做什麼才能完成一個有無限的長頸鹿、龍、花的遊行畫卷?如果我們有了這樣一幅,我們可以用它來做什麼?
這些都是我們會繼續在後面的工作中進行探索的問題。
但是現在,規則、增強和 Pix2Pix 模型起作用了。我們可以很好地為花上色了,給龍上色也不錯。
![Results: flowers colored by model trained on flowers](/data/attachment/album/201806/14/111736i6zwc03hwccdd0zo.png "Results: flowers colored by model trained on flowers")
結果:通過花這方面的模型訓練來給花上色。
![Results: dragons trained on model trained on dragons](/data/attachment/album/201806/14/111736yqo9zo4cqnkr2orj.png "Results: dragons trained on model trained on dragons")
結果:龍的模型訓練的訓練結果。
想了解更多,參與 Gretchen Greene's talk, DragonPaint – bootstrapping small data to color cartoons, 在 PyCon Cleveland 2018.
via: https://opensource.com/article/18/4/dragonpaint-bootstrapping
作者:K. Gretchen Greene 選題:lujun9972 譯者:hopefully2333 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive