Learning to Paint:一個繪畫 AI

Learning to Paint:一个绘画 AI

Demo: YouTubegit

Arxiv: 1903.04411github

Github: hzwer/LearningToPaint算法

畫家能夠用寥寥數筆創造出迷人的畫做,咱們試圖研究如何讓機器掌握這樣的能力。經過結合神經網絡筆畫渲染器和基於模型的深度強化學習,咱們的 AI 能夠用筆畫描繪紋理豐富的天然圖像。 AI 用數百個筆畫就能夠實現視覺效果很好的圖畫,對於每一個筆畫,直接肯定筆畫的位置和顏色等。 AI 的訓練過程不須要人類繪畫的經驗或者筆畫軌跡數據。網絡

以人臉 (CelebA) 爲例,須要一張 GPU,10 小時訓練筆畫渲染器,40 小時訓練 AI,其間 AI 畫了數百萬張圖片來學習。框架

下面是咱們的 AI 畫不一樣類型的圖片的效果,咱們的 AI 最終學會了先畫出大體輪廓,再填充細節的策略。函數

泛化的效果也不錯,見題圖學習

若是再把圖片放大分塊修一下細節,視覺效果會更好動畫

介紹

小時候學素描,我以爲老師的水平很是高,由於他們能把靜物和人都畫的很是像。後來,我在網上看到一些畫家的做品,好比丟勒(德國畫家),早期的畢加索,才明白了一點什麼叫作大師的素描。他們的畫很是乾淨,線條表現力極強,用很是少的筆畫數,很是簡單的調子,構建出生動的形象。這是通常繪畫愛好者花多少時間也難以模仿的,須要對事物結構的深入理解,對畫筆的控制能力和對筆畫相互關係的極強把握。設計

計算機中,一張圖片由 n x n 個像素點組成,每一個點由 RGB 三個值肯定顏色。從這個意義上來講,讓計算機臨摹一張畫,最簡單的方法就是逐個像素填充。而人在畫畫的時候,是用筆畫去構建一張圖片的。如何讓計算機像人同樣繪畫?這是我在接觸深度學習不久後就十分感興趣的問題。3d

從強化學習的角度看,咱們須要設計一個 AI,給它一個畫布和目標圖。AI 的每一步在畫布上畫一個筆畫,當它畫的筆畫使畫布和目標圖更像時,咱們就給它獎勵,驅動它學習。咱們能夠設定一個筆畫上限,讓 AI 在給定的筆畫數後終止。

AI 繪畫的流程

任務的困難

  1. 每個筆畫的動做空間很大,AI 要決策一個筆畫的位置,形狀,顏色,透明度,而每項參數都有很是多選擇。若是咱們強行將動做離散化,會損失控制的精度,同時還會面臨組合爆炸的問題(每項參數選擇數乘法原理)。通常的強化學習方法要求 AI 經過大量嘗試來對環境進行建模,這是很是困難和耗時的。有興趣的朋友能夠了解一下 Deepmind 的 SPIRAL,使用了大量算力去解這個問題。
  2. 若是咱們真的將 AI 接入一個繪畫軟件,筆畫渲染是一個很耗時的操做,數據的獲取會比較昂貴。
  3. 想要完成紋理豐富的天然圖像繪畫,須要的筆畫數不少,這須要 AI 有比較強的計劃能力。AI 須要考慮如何組合筆畫,筆畫的覆蓋關係等。

算法

咱們的基準算法是深度肯定策略梯度 (DDPG) 算法,簡單來講,DDPG 運用了演員-評論家(Actor - Critic) 框架,是一種是策略梯度算法和值函數方法的混合算法,其中策略網絡被稱爲 Actor,而價值網絡被稱爲 Critic。在畫畫這個任務中,Actor 每次畫一個筆畫,而 Critic 來爲 Actor 的這個筆畫作一個評價,Actor 的目標是獲得更好的評價,Critic 的目標是評價得更準確。DDPG 的優勢是可以在連續的動做空間上做決策,也就是說,咱們能夠設計一個 k 維向量 (x_1, x_2, ..., x_k) ,其中每一維在 0 到 1 之間,來控制筆畫的不一樣屬性,好比 (x_1, x_2) 控制筆畫起點座標, (x_3, x_4) 控制筆畫終點座標等。並且 DDPG 還能離線訓練,即 AI 對環境的探索信息能夠存儲在一個緩衝區中,訓練從其中採樣,一個信息能夠重複使用。

爲了解決環境探索建模困難的問題,咱們預訓練了一個神經網絡筆畫渲染器,能夠快速地根據筆畫的參數給出渲染在畫布上的筆畫,支持在 GPU上並行。

DDPG 和 Model-based DDPG 的不一樣結構

神經網絡筆畫渲染器還能夠接入到強化學習的框架中來輔助 AI 的訓練。咱們將 DDPG 改形成了一個基於模型 (Model-based) 的方法,顯著提升了 AI 的訓練速度和表現(以下圖)。

DDPG 和 Model-based DDPG 對比

訓練技巧

  1. 動做束 (Action Bundle)。Actor 一次決策多個筆畫,一方面,實驗證實 Actor 有這樣的能力,而且能顯式地讓 Actor 學習了筆畫的組合;另外一方面,減小網絡的推斷次數能夠加速,步數減小還能加快 Critic 網絡的收斂。實驗證實,讓 Actor 一次出 5 個筆畫比較合適,一次出太多筆畫會提升對 Actor 能力的要求。下圖是 200 筆畫人臉的訓練曲線,分別一次出 1, 2, 5, 8 個筆畫,縱座標是 AI 結束繪畫時畫布和目標圖的 L2 距離。
不一樣動做束設置的訓練曲線

2. Wasserstein 生成對抗損失函數 (WGAN Loss)。咱們須要度量畫布和目標圖的類似度以給出獎勵函數,咱們發現 WGAN Loss 是一種比歐幾里得距離更好的度量,使得最後畫出來的圖細節更豐富。

3. 網絡結構設計。Actor 和 Critic 是輸入縮小版本的 ResNet-18。Batch Normalization (BN) 能夠加快 Actor 訓練,而在 Critic 上效果不明顯。Critic 使用帶 TReLu 激活函數的 Weight Normalization (WN with TReLu)。渲染器用 Sub-pixel 來代替反捲積顯著消除棋盤效應。GAN 的判別器網絡用了相似 PatchGAN 的結構,加上 WN with TReLu。咱們的方法對於超參數也不太敏感,基本都使用了跟別人論文相似的超參數。具體細節見 paper。

效果

咱們使用在幾個數據集上作了實驗,包括手寫數字 (MNIST),街景門牌 (SVHN),名人人臉 (CelebA),天然場景圖像 (ImageNet) ,限制的筆畫數分別是 5, 40, 200, 400。

咱們對比了用不一樣的筆畫數畫人臉的結果,從 100 個筆畫到 1000 個筆畫,筆畫數越多,細節的恢復越好。

不一樣筆畫數畫人臉的訓練曲線

比較有趣的是,咱們還能夠設計不一樣形狀的筆畫來獲得十分有趣的結果,好比限制 AI 只能畫圓,或者只能畫三角形等。

用不一樣的筆畫來畫人臉
不一樣數據集的訓練曲線

相關工做

有一個相似的任務叫 stroke-based rendering,大多數解法是每一個筆畫基於貪心選擇,或者使用大量的搜索等,最後效果也很棒,參見 Aaron Hertzmann 的一些文章,圖形學方向也有很多工做研究了筆畫的設計,動畫生成等。

與咱們相似的工做有 SPIRAL,這也是咱們文中對比的。BMVC 2018 的 Doodle - SDQ 用 DQN 來畫簡筆畫 ,ICLR 2019 的 StrokeNet 提出了相似的筆畫渲染器。還有早一些的 Sketch-RNN 系列工做。用神經網絡建模繪畫的方法有點像 NIPS 2018 的 World Models,David Ha 還發推宣傳了咱們的 AI。

總結

用深度強化學習的方法作了一個看起來效果還不錯的 AI,僅須要修改最大筆畫數,就能夠適於不一樣到數據集,之後仗着它街頭賣藝,但願你們可以喜歡。咱們儘可能讓這套方法看起來簡潔乾淨,但不免還有許多缺點,歡迎你們提建議。

具體算法細節能夠看咱們的 Arxiv,其中還有另一些對比實驗,和形式化的定義推導等。

相關文章
相關標籤/搜索