工業設計研究生,
入坑人工智慧半年有餘
,致力於用人工智慧來減輕設計師們的工作負擔。寫文章記錄分享下日常研究。
題圖是我用GAN做的一個汽車線稿自動上色程式,左邊是輸入的線稿,右邊是程式自己畫出來的效果圖。目前試玩版釋出在 47。106。155。146上,以下是網站素顏截圖:
選擇一張本地汽車手繪線稿圖,JPG的比較穩妥,其他的可能會報錯
右邊就是上色效果了,目前側檢視上色效果還行,其他角度的不太穩定
實在沒精力做介面和互動設計了,精力都花在最佳化演算法和製作資料集上,愧對學了6年設計,有人願意合作開發,強烈歡迎。
不過本期重點不是這個,因為整個專案坑有點多,大大小小都有,我先一個一個填,填得差不多了再寫篇綜合整理,爭取讓更多的設計師明白人工智慧可以為設計做什麼。我儘量用設計師們能看懂的語言,來介紹下其中一小塊內容:
如何獲取線稿
線稿的來源大致有以下幾種方法:
用常規影象處理中的邊緣提取 難度☆☆☆
利用神經網路的的邊緣提取 難度☆☆☆☆
利用PS相關濾鏡、動作做邊緣提取 難度☆
利用三維模型匯出線稿 難度☆☆☆☆☆☆
直接網上搜現成的線稿 難度☆ 心煩指數☆☆☆☆☆☆☆☆☆
常規影象處理中的邊緣提取做法
原理來自圖片邊緣處畫素值變化比較劇烈,那麼可以用某種濾波器(可以理解為某種判斷條件)去檢測這些變化劇烈的區域,從而獲得邊緣所在位置。不同的濾波器(不同的判斷條件)提取出來的效果會有略微的不同。比較好用的有canny演算法。
換作設計師熟悉的方法,那就是PS的濾鏡,有的是查詢邊緣濾鏡,有的是高反差保留濾鏡,有的是最小值濾鏡,都能做到提取邊緣的效果,但效果又有些許不同。
下面是我用python 和opencv庫做的一個簡單的canny演算法提取線稿
import
cv2
def
CannyThreshold
(
lowThreshold
):
#先上個畫素3的高斯模糊,過濾掉小噪點
detected_edges_B
=
cv2
。
GaussianBlur
(
grayB
,(
3
,
3
),
0
)
detected_edges_G
=
cv2
。
GaussianBlur
(
grayG
,(
3
,
3
),
0
)
detected_edges_R
=
cv2
。
GaussianBlur
(
grayR
,(
3
,
3
),
0
)
#呼叫opencv自帶的canny演算法
detected_edges_B
=
cv2
。
Canny
(
detected_edges_B
,
lowThreshold
,
lowThreshold
*
ratio
,
apertureSize
=
kernel_size
)
detected_edges_G
=
cv2
。
Canny
(
detected_edges_G
,
lowThreshold
,
lowThreshold
*
ratio
,
apertureSize
=
kernel_size
)
detected_edges_R
=
cv2
。
Canny
(
detected_edges_R
,
lowThreshold
,
lowThreshold
*
ratio
,
apertureSize
=
kernel_size
)
#預設生成的是黑底白線的線稿,我先把生成的3張線稿融合到一塊
dst
=
cv2
。
bitwise_or
(
detected_edges_B
,
detected_edges_G
)
dst
=
cv2
。
bitwise_or
(
dst
,
detected_edges_R
)
#黑白反轉,使得背景為白色
dst
=
255
-
dst
cv2
。
imshow
(
‘canny demo’
,
dst
)
lowThreshold
=
0
#canny演算法中的一個閾值引數
max_lowThreshold
=
300
#canny演算法中的另一個閾值引數
ratio
=
3
kernel_size
=
3
#canny演算法中的一個引數,這個預設選3就行
img
=
cv2
。
imread
(
‘test/shoes (1)。jpg’
)
#輸入測試圖片的路徑
‘’‘
傳統方式是gray = cv2。cvtColor(img,cv2。COLOR_BGR2GRAY)
直接把圖片轉成灰度圖,這會導致對明度接近,但顏色不同的區域邊界檢測效果不好
我對這裡三通道分別做邊緣檢測,使得不同顏色相同明度的區域也能被分割出來
對於直接轉灰度圖的影象,test/redblue。jpg在滑塊閾值3時就檢測不出交界線
三通道分別做邊緣檢測,test/redblue。jpg在滑塊閾值94時依然能檢測出交界線
’‘’
grayB
=
img
[:,:,
0
]
grayG
=
img
[:,:,
1
]
grayR
=
img
[:,:,
2
]
cv2
。
namedWindow
(
‘canny demo’
)
cv2
。
createTrackbar
(
‘Min threshold’
,
‘canny demo’
,
lowThreshold
,
max_lowThreshold
,
CannyThreshold
)
CannyThreshold
(
0
)
# initialization
if
cv2
。
waitKey
(
0
)
==
27
:
#按q關閉顯示介面
cv2
。
destroyAllWindows
()
不同閾值的提取效果不同
不同閾值的提取效果不同
利用神經網路來提取邊緣
神經網路是個好東西——魯迅
這幾年大火的深度神經網路最大的應用之一就是影象識別,例如如何評價 Kaiming He 最新的 Mask R-CNN? 但物體識別更多的是在識別外輪廓,內部的邊緣線就直接忽略了。
在提取輪廓線方面效果較好的還有HED演算法,github地址在這裡:傳送門
原作者是老caffe框架寫的,我還沒試過caffe,試了用tensorflow版本的程式碼,搞了快一禮拜,還是沒跑起來,裝環境真的是大坑啊,作業系統、python版本、tensorflow版本、CUDA版本,cudnn版本,以及各種相關支援包版本,實在是心累,等下次心情平靜後再從頭試試。
HED邊緣提取效果
利用photoshop來提取邊緣
PS提取線稿的方法有很多,作為以前吃飯的工具,再熟悉不過了。用PS提取線稿優點是很直觀不用寫程式碼,可以順勢做點圖片操作,增強明暗對比之類的。缺點是處理速度有點慢,儘管有自帶的批處理工具,但相比於用python+opencv庫,速度實在有點慢,處理幾千張圖片,用python需要30秒,用PS批處理就要半小時了。對於動則10W+圖片的深度學習資料集,PS顯得力不從心。
主要有以下幾種方式:
查詢邊緣
照亮邊緣
最小值
高反差保留
photoshop 2018cc 19。1。1版一鍵摳圖黑科技
前4種方法網上有很多教程了,PS提取線稿傳送門
第5種方法是今年新版本PS推出的黑科技
具體在 選擇-主體
然後自動識別當前圖片的主體,並形成選區,如上圖所示。
背後的原理肯定和深度學習有一腿
從三維模型中匯出線稿
原理很簡單,搞來一批三維模型,寫個指令碼,用三維軟體匯出一堆角度不同的線稿和渲染稿。
我試過從產品模型中匯出線稿和效果圖來,但實操發現存在這些困難
模型類別有要求。基於工程引數類建模軟體(如proe,SW,CATIA)的模型和nurbs型別(如Alias,rhino)的模型,是可以匯出線稿的,但這類模型網上主要以橫平豎直的工程器械為主,缺乏產品外觀類模型。而基於網格建模的模型很多,品類也豐富,但似乎沒法匯出接近手繪的線稿,這方面我不是很懂,我用的一直是rhino,歡迎3DMAX大佬指點下能否從mesh模型匯出線稿。
會匯出許多並實際看不見的結構線,例如倒圓角處,就算模型做到G2連續,也依然會匯出兩條分面線。
有渲染軟體能渲染出二次元風格的圖,常見於動畫製作,聽說漫畫上色有人試過這方法,但效果不佳,原因不明。
三維模型不如圖片好處理,牽扯到建模軟體的指令碼,渲染的指令碼,一個人精力有限,沒深入挖掘下去。歡迎這方面大佬提供些指導意見。
直接網上搜現成的線稿
這個看似搞笑的方法,卻是做汽車線稿上色的重要方法之一。
原因很簡單,無論用傳統影象處理方法,還是基於神經網路的高大上方法,還是PS自帶的方法,都無法100%還原設計師手稿。以汽車設計為例,汽車設計的線稿線條變化豐富,重要的結構線粗,次要的結構線細,層次分明,還有一些習慣畫法,如翼子板上的高光,會透過排幾根線條來表示。而用上述所有方法,暫時都做不到還原出手繪真實畫法。若拿著機器提取的線稿給神經網路訓練,神經網路學會的是怎麼給這些提取的線稿上色,如果實際使用者輸入的線稿和提取的線稿差異過大,神經網路就蒙了,不認識了。
那麼怎麼搜這些現成呢?具體情況具體分析——列寧
對於漫畫線稿上色,直接用演算法提取出來的線稿和實際線稿差異不大,直接能用了。推薦一下大佬做的漫畫上色專案,實在太強了,我就是去年看了大佬做的才入坑人工智慧
對於汽車線稿上色,我用小工具在pinterest蒐集了幾萬張汽車設計手繪圖,上色不上色的都有,從中人工挑選出能用的約2000張線稿。同時也在netcarshow手動儲存了2010年之後各主機廠的官方優質效果圖。也用前面提取線稿的方法提取了一批假線稿來增強資料集。
這篇就先寫到這裡吧
差點忘了這個汽車上色的github:可以在本機搭起來自娛自樂
找合作開發小夥伴
以及顯示卡贊助商(滑稽)
我的個人公眾號:人工智慧與設計