PTT推薦

[創作] 訓練了一個根據草稿畫一個固定角色的模型

看板C_Chat標題[創作] 訓練了一個根據草稿畫一個固定角色的模型作者
kirimaru73
(霧丸)
時間推噓30 推:30 噓:0 →:32

前言:這並不是那個現在幾乎每天都有新話題的AI根據關鍵字自動繪圖。
一來那種研究已經有很多人做了,我手上的資源也不可能把它做好。
二來我對AI無法通靈的問題也不是很滿意。我還是寧願主動給予較明確的資訊。

我的目標是給予一張低解析度的黑白草稿圖片(非黑即白,沒有中間灰階值),
輸出一張較高解析度,且與特定主題相符的彩色圖片。
目前的版本中,草稿圖片的解析度為64x64,遠低於一般描繪草稿的尺寸。
輸出彩色圖片的解析度則為256x256,老實說這有點太小了。
但受限於手上的資源與花費時間,目前只能達到這個尺寸。

至於「特定主題」的限制,則與這個問題本身的難度有關。
即使是給予「二次元人物大頭照」這麼明確的設定,也有各種不同的配色。
無論AI再怎麼厲害,也絕不可能在無額外資訊的情況下通靈出你想要的配色。
當然已經存在許多額外輸入顏色的應用範例,但終究還是要提供額外資訊。
一種只需要給草稿,不需要額外資訊的應用方法,就是請AI畫某個特定角色。
而這種吃力不討好的研究,當然就要選自己最喜歡的角色了:
https://dic.pixiv.net/a/%E6%98%9F%E7%86%8A%E5%8B%87%E5%84%80

示範影片:
https://www.youtube.com/watch?v=_3o_YFQoWDo

在目前的成果中,可以看到AI確實認得髮色、瞳色、以及那根明顯的角。
而在許多可見的問題中,最嚴重的就是那有如核廢料般的背景。
這其實是可想而知的結果,在下面的細節中會特別解釋。
而它其實也有解決方法,但目前的版本還無法處理,應該會是下一個研究主題。

訓練出這麼一個只能畫特定角色的模型有什麼用?老實說,沒什麼用。
現在都2202年了,一個只能畫一顆頭的玩具最多就只是個玩具。
雖然還是好像有點東西出來,但筆觸方面仍舊不太自然,顏色變化也單調。
與處理訓練資料所花的時間相比(準備草稿非常耗時,後續細節部分有說明),
這個種程度的結果相當相當成比例,直接去練繪圖似乎還比較好。
所以我才在一開始就選定這個角色,至少這樣我就絕對不會後悔。


以下是一些與人工智慧研究直接相關的細節,沒興趣的讀者們可以忽略。



訓練資料

訓練AI需要收集大量的資料,而我總共收集了2400張圖片。
雖然這個角色的人氣很低,不過在Pixiv上也有接近兩萬張圖片。
(其他繪圖網站當然也有不少,但還是Pixiv數量最多。)

由於主題是臉部特寫,所以我需要排除以下的圖片:
1. 有一隻眼睛完全被擋住的側臉(這會產生過大的變化度,使AI訓練困難)
2. 一隻或兩隻眼睛閉上(比1.簡單一點,但還是有影響,先排除)
3. 臉部被太過誇張的裝飾或前景遮擋
4. 臉部被角色自己的CP貼上來遮擋
5. 畫風過於特殊,與一般的二次元繪圖相去太遠
6. 上車圖(我不希望未來哪一天時在展示資料時突然就手滑了)
7. 主推繪師所產出的大量圖片(資料重複性太高對訓練不妥,我只會從中挑幾張)

過濾完後的可用圖片只剩下2400張(當然每一兩天會有新的,不過緩不濟急)。
以AI繪圖的主題來說,這個量其實根本不夠,不過更多的我也生不出來。

要標示原始圖片的臉部區域,並獲得旋轉與裁切後的內容並不困難。
如果你要玩的是GAN或Diffusion Model,那你已經可以拿去用了。
不過我的主題是給予對應的草稿,將這些圖片做為輸出的標準答案。
由於AI無法通靈出沒有給的資訊,例如圖片環境的明暗,以及作者習慣的配色。
因此我以臉部附近的顏色分布為參考,將所有圖片的明暗與顏色調整至一致。
(實作上我只是分別調整RGB三色頻道的平均值與標準差而已。)

接下來的重點是準備這些圖片的輸入草稿,而這就是另一個惡夢的開始。


草稿輸入

我將每張圖片的臉部旋轉至水平方向,以產生2400張256x256的臉部特寫。
對於每一張圖片,我需要給予一張對應的64x64草稿,像這樣:
https://i.imgur.com/qQEvoHP.png


右邊是256x256的圖片,左邊是64x64的草稿放大成256x256的尺寸。
很明顯地,草稿絕對不可能表達出所有的完整的細節,一定要做大幅度的簡化。
當然如果是256x256的草稿就可以描繪更多細節,但這與我一開始的目標不符。
雖然我願意給AI輸入資料,但還是希望它能用非常精簡的內容產生複雜結果。

怎樣的內容該用怎樣的草稿代表?這完全沒有標準答案。
我只能用自己的一套標準,並盡量從頭到尾保持一致。
例如,背景的內容與角色本身無關,所以無論細節為何都保持空白。
角色臉部以下自然延伸的脖子、肩膀部分會提供對應的草稿。
但如果是舉起的手腳或不相干的背景,則只標示出邊界,以外則保持空白。

雖然草稿只有64x64,但如果是逐個像素慢慢點,點個幾張就要出人命了。
所以我用了一個簡單的邊緣偵測演算法來產生一個作為起始的自動草稿:
https://i.imgur.com/JAsJMNK.png


當然這種自動草稿的可靠性還是很差,每一張圖都有許多地方需要手動修改。

而來源不同的圖片有各種不同的畫風,有時候會出現差異明顯較大者:
https://i.imgur.com/rYM7MDd.png

這種畫風與線稿上色明顯不同,在訓練時有引發混亂的風險。
然而,在訓練資料缺乏的狀況下,我還是有使用這類型的資料。
(當然更極端的案例,例如水墨畫風格,則還是捨棄不用。)

另一個比較嚴重的問題是位於圖片邊界的臉部:
https://i.imgur.com/EAJ8mnH.png

如果想像頭型畫出完整的草稿,則AI會看到正常的草稿以及缺乏部分內容的圖片。
(圖片外的區域我以隨機顏色填補,所以才會出現亮綠色,這似乎不是好做法)
所以我只把草稿畫在有效區域內,外部區域以及圖片邊界上都不標示,
然後祈禱AI至少能在有效區域內學到有用的東西(AI訓練師常有的信仰)。
在現實上,這個邊界問題,以及圖片中不固定的背景內容,
就是造成了範例影片中背景顏色有如核廢料一般的原因。

一種可能的解決辦法是在標示草稿時,也額外標示一個背景與無效區域。
然後在訓練時要求AI把該區域填成白色,這樣至少可以得到一致的結果。
更進一步的策略是,在AI訓練小有成果後,
把這些有邊界問題的圖片之草稿畫成完整的樣子,然後請AI重新畫一張。
這樣或許可以在本人還沒有原作者繪圖功力的前提下補出完整的頭型。
不過這個做法目前還在想像階段,無法保證能得到堪用的結果。


Augmentation(資料增補)

用圖片進行AI訓練時不可能只使用固定內容的一份訓練資料,
必須對其進行小幅隨機變化,使AI能看到較有多樣性的內容。
最簡單的做法就是圖片的縮放與旋轉,很遺憾地,這非常不適用於本主題。

一張256x256彩色圖片的對應輸入資料為64x64黑白草稿圖。
每一個草稿的黑色像素都對應到圖片中4x4的區域。
如果將圖片進行例如1.10倍的放大,或5度的旋轉,
則草稿也要作相同的轉換,使得絕大部分的像素移動到非整數座標的位置上。

這時候有兩種策略:
(1) 用Bilinear Interpolation讓草稿變成有灰階漸層的內容
由於本應用希望輸入的是非黑即白的草稿(如範例影片),這樣作並不適合。
(2) 用Nearest Neighbor Interpolation讓草稿保持非黑即白狀態
可想而知草稿會變得破破爛爛,結果應該很不堪用
不過從後面提到的其他資料增補方法看來,或許可以考慮這樣做。

總之,目前的資料增補方式排除了圖片的縮放與旋轉。
當然也不能就這樣什麼都不做,至少平移還是可以做的。
草稿圖每移動一像素,原始圖片就要移動四個像素,否則會有同樣的問題。
因此我在裁剪臉部圖片時,將256x256的範圍往上下左右各放大八格。
所產生的272x272圖片就可以供草稿圖片上下左右隨機平移最多兩格。
下圖為一範例,上半部是原本位置,下半部隨機平移:
https://i.imgur.com/nO2x2iR.png


草稿圖片平移產生的空隙目前就先留白,但其實有另一種更好的處理方法。
如果在標示圖片時,就已經根據272x272的範圍標好68x68的草稿,
那麼只要是在限定的範圍內隨機平移,都可以得到完整的64x64草稿。
不過我在做到一半時才想到這點,所以目前只有用留白的簡單方法。

另外,對於草稿本身也需要做一點隨機變化。
當你使用一隻滑鼠當畫筆,假裝這種東西叫做繪圖板時,
畫出的線段一定會破破爛爛,或是在曲線上有不自然的轉折。
收集資料時產生的草稿圖片都經過仔細修補,實際上不可能一口氣畫成。
所以在訓練時,必須在草稿圖片上隨機增加像素或移除像素。
以模擬實際畫草稿時斷斷續續的結果,或是曲線上如同階梯一般不自然的連接。
同時還加上另一種更激進的做法,擦除草稿內隨機數量與位置的小塊區域。
下圖為一範例,上半部是原本的完整草稿,下半部是擾動後的結果:
https://i.imgur.com/YJk0SNb.png


擾動後的殘破草稿,在訓練時仍然對應到內容完整的彩色圖片。
這當然是期望AI能在輸入尚未完成時,就產生接近完整的結果。
實際看到的結果當然沒有這麼理想,但也有大致的趨勢。
例如眼睛的草稿還沒有畫完時,會出現一團顏色偏黑帶紅(瞳色)的物體。

一般來說,對於輸出圖片的內容也需要進行位置以外的隨機調整。
常見作法有亮度(整體或三色頻道分開)隨機變化,或將整張圖片模糊/清晰化。
在本應用中,這個做法並不太合理,它會使同一張草稿對應到不同的輸出圖片。
這在訓練上除了使AI混亂外沒有好處,因此我沒有採用這種做法。

最後,最簡單也不用擔心技術上問題的做法,是隨機將圖片左右翻轉。
只要將草稿圖片也跟著左右翻轉,就能輕鬆滿足對應關係。
然而這其實有與研究「主題」高度相關的限制:
以這個角色來說,沒有任何因素會阻礙左右翻轉的策略。
但如果是像凱留這種挑染固定挑在左邊的角色,翻轉後就會發生問題:
https://i.imgur.com/AFgxajC.png


要讓AI同時學會「只有一條挑染,但可能出現在左邊或右邊」其實並非難事。
但一個挑染在相反方向的角色還有靈魂嗎?這種哲學問題就會產生許多爭議了。


模型架構

輸入一張圖片,輸出一張圖片,這怎麼看都是U-net。
所以我使用的模型也跟教科書上隨處可見的U-net完全一樣,沒什麼新奇的。
唯一的小變化是原本Concatenate的地方,我用1x1 Convolution+Add取代。
因為實際測起來沒什麼差別,我就選比較省計算量的版本了。
(Concatenate下一次的Convolution複雜度會變大,比替代的做法還耗時)
至於什麼Resnet block, Bottleneck的小變化也都試過,
但是並沒有在訓練/測試速度都已經變得更慢的情況下得到更好的結果。

前面提供的範例圖片中,輸入的草稿圖片都是白底黑線。
但在圖片資料處理中,黑色代表的數字是0.0,白色則是1.0。
白底黑線的圖片中絕大多數都是非零的值,有筆畫的地方才是0。
黑白顛倒後的黑底白線圖片則絕大多數都是0,有筆畫的地方才有非零的值。
後者觀感上明顯比較合理(數學上我不敢肯定),
所以草稿圖片會進行黑白顛倒,以黑底白線的內容做為模型的輸入。

令我比較好奇的是,一般即使是輸入單頻道圖片,也會有不同的灰階值。
而這個應用的輸入格式比較特殊,只有0.0和1.0兩種數值。
比起一般U-net接上的3x3 Convolution,是否需要一些特殊的前端Layer,
才能讓模型更有效率地從這個內容相對比較單調的輸入抽取資訊。
不過這邊能搞怪的地方我也稍微玩過,目前還沒發現什麼值得一提的做法。

--

※ PTT 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.240.129.77 (臺灣)
PTT 網址
kirimaru73:轉錄至看板 Touhou

10/02 12:32

shadowblade10/02 12:34先推個

gino071710/02 12:39這東西很有色色的潛力

terry1236910/02 12:40先推

BITMajo10/02 12:41如果目標是畫一個特定的角色,我覺得這種作法恐怕是

BITMajo10/02 12:41事倍功半,相對的直接建造3D模型算圖快多了

bnn10/02 12:41工程人就是這樣把一個個小範圍特殊問題解掉 最後包成一大包

bnn10/02 12:42反正這不可能是一個人的工作 分散到每個training多人平行處理

bnn10/02 12:43越多玩家平行各自處理自己的性癖方面的training 最後反饋回去

bnn10/02 12:43就能朝聖杯更進一步 然後人類就滅亡了(X

medama10/02 12:45

BITMajo10/02 12:47這篇的重點應該是... 原PO喜歡星熊勇儀!

我可以很自豪地說,光是喜歡就不會來做這種事情 那2400張草稿花了我超過半年的時間

longlongint10/02 12:48先不管有沒有用 總之想問碩論畢業了沒

BITMajo10/02 12:50看示範影片,感覺最後成果能出來,一大部分是靠原PO本身

BITMajo10/02 12:51具有的繪畫能力,如果草稿技術太差或許還是會炸掉

BITMajo10/02 12:52AI最麻煩的部分似乎就在人機溝通,用語言溝通雖然不完美

BITMajo10/02 12:52但也是目前最可行的辦法了,如果要用圖片溝通,就要另外

BITMajo10/02 12:53再花很多心思去開發了

SunnyBrian10/02 12:53看不懂,可是要先推

miyazakisun210/02 13:00推創作

smart0eddie10/02 13:04姆咪

Vulpix10/02 13:05想問這能玩換姿勢嗎?

Vulpix10/02 13:08https://bit.ly/3SReHV5

Vulpix10/02 13:09需要草稿這件事對畫畫廢柴來說還是太難了。

先決條件是有沒有可能給全身圖的草稿,產生全身圖的內容 (這個我個人要做絕對不可能,我會點到手爛掉) 如果具備這種能力的話,理論上就可以玩拼圖了

tim01234510/02 13:10感覺像補色軟體? 判斷那是啥~上相對應顏色~

liupoyip10/02 13:15突然想到,如果限制範圍在’大頭照’,那頭髮、臉、五官

liupoyip10/02 13:15,可能會出現在圖片中固定的區域。那訓練時把圖片加入一

liupoyip10/02 13:15些位置的token會不會比較好呢?想到這邊我自己也想試試w

應該不需要,我眼睛刻成那樣,筆電訓練十分鐘(不誇飾)模型就抓到位置了 後面連日連夜的時間都只是花在細節上

npc77610/02 13:19勇儀叫冷門 那些湊不出幾百張圖的不就是屍體了

東方這個隨便都能把熱門手遊角色按在下水道的圖量,一直都讓我很難客觀評論 到底為什麼人氣投票怒得72名的角色可以有一萬九千張圖呢

tim01234510/02 13:20用程式跑就好~網路抓合適的圖~把取邊緣~然後手動改動~

MeiHS10/02 13:22多長一根角的多美代

BITMajo10/02 13:23搞不好直接把角差到一般AI畫的圖上比較快

BITMajo10/02 13:24既然是專門畫勇儀的話,那草稿不是應該不用特別把角畫好

BITMajo10/02 13:24AI也能補正嗎?

我試過

https://i.imgur.com/9J5xwLY.png

結果是AI說你懶的畫角那我直接給你一坨果醬就好

tim01234510/02 13:27不過做一做就是另一套程式~測試來這個軟體

※ 編輯: kirimaru73 (123.240.129.77 臺灣), 10/02/2022 13:30:04

misaka012010/02 13:30不知道加attention 會不會提升xd

BITMajo10/02 13:32XDDD角變成猥褻物了

BITMajo10/02 13:33正經來說,就是這個AI目前一定要用線搞才能知道要怎麼畫

BITMajo10/02 13:34但你沒畫角,AI卻知道那邊該有個紅色的角,其實算成功了

這是Supervised Learning(有固定輸入輸出搭配)的特性,訓練時給什麼他就只會什麼 我的草稿都有正經地把角框好,但偶爾會被隨機擦掉一部分 所以AI沒有看過整隻角故意不畫,其他都刻好好的輸入 如果一開始就故意省略所有草稿中的角,那其實是可以學習到自行畫出清晰的角的 (不過這樣是無端為自己的研究主題增加難度,所以一開始不會考慮)

misaka012010/02 13:37話說Loss是mseㄇ,還是有其他奇奇怪怪的loss

MSE,包含背景,所以有核廢料問題 接下來如果要繼續改進的話,我會要求背景必須是白色 (然後我需要手動標註2400張圖的背景,何年何月啊) 有想過要不要給原圖中變化大的區域較大的loss,但還沒有實作過

smart0eddie10/02 13:47Reference-Based Sketch Image Colorization using A

smart0eddie10/02 13:47Augmented-Self Reference and Dense Semantic Corre

smart0eddie10/02 13:47Correspondence

smart0eddie10/02 13:48以前有看到webtoon 想幹類似的事

liupoyip10/02 13:49題外話,如果應用在畫肢體的話,感覺實用的泛用性高了

liupoyip10/02 13:49些。不考慮立體感的話,肢體的色彩複雜度應該低很多XD

misaka012010/02 13:50上面這篇cvpr的感覺滿厲害的

Vulpix10/02 13:51頭的話,先換臉方向和表情就好了啦。

Vulpix10/02 13:53手動拼圖是我自己的樂趣。

converse020110/02 14:07哇 這個

sansiaman10/02 14:29可以應用到動畫產業吧

線稿+用文字指示風格與配色是比較有可能的應用實例 不過這種研究需要的資料量應該是一個角色幾千張圖片的好幾百倍

showwhale10/02 14:36星熊可愛 原po愛很深捏 佩服

tim91028210/02 14:56可以找畫師進行合作看看,一方面也可以有專業的意見來

tim91028210/02 14:56改善

namirei10/02 15:17

jkkkj12310/02 15:17有機會開發出一顆球加十字線加指定光源就出圖的等級嗎

這種模型會至少有一半偏向AI繪圖那一塊,然後也一定做的出來 (因為這最多就只是個conditional GAN而已) 但是根據現在可以想像的技術(未來不敢說),應該會有兩種結果: 1. 同樣的臉部十字與光影組合產生的圖片都是相同的 2. 同樣的臉部十字與光影組合產生的圖片都是隨機的(但還是符合要求) 不管是哪種,直接用在創作上都會有些問題 如果又增加文字敘述作為額外要求,那就又是一種混合的應用了

※ 編輯: kirimaru73 (123.240.129.77 臺灣), 10/02/2022 15:27:50

AlianF10/02 15:46幫老婆上色指日可待

jkkkj12310/02 16:31原來如此 聽起來值得期待

dces610710/02 17:25我只是看到東方就進來了

bitcch10/02 18:03https://tinyurl.com/3y6vauxd

bitcch10/02 18:04感覺這篇的做法有點類似 應該可以參考一下

kirimaru7310/02 18:11感謝告知,或許可以參考一下Layer

kirimaru7310/02 18:11我自己一直沒試出什麼變化