[設計師的AI自學之路] 圖片線稿提取

[設計師的AI自學之路] 圖片線稿提取

來自專欄 人工智慧+設計 修鍊指南

工業設計研究生,入坑人工智慧半年有餘,致力於用人工智慧來減輕設計師們的工作負擔。寫文章記錄分享下日常研究。


題圖是我用GAN做的一個汽車線稿自動上色程序,左邊是輸入的線稿,右邊是程序自己畫出來的效果圖。目前試玩版發布在 47.106.155.146上,以下是網站素顏截圖:

選擇一張本地汽車手繪線稿圖,JPG的比較穩妥,其他的可能會報錯

右邊就是上色效果了,目前側視圖上色效果還行,其他角度的不太穩定

實在沒精力做界面和交互設計了,精力都花在優化演算法和製作數據集上,愧對學了6年設計,有人願意合作開發,強烈歡迎。

不過本期重點不是這個,因為整個項目坑有點多,大大小小都有,我先一個一個填,填得差不多了再寫篇綜合整理,爭取讓更多的設計師明白人工智慧可以為設計做什麼。我盡量用設計師們能看懂的語言,來介紹下其中一小塊內容:如何獲取線稿

線稿的來源大致有以下幾種方法:

  1. 用常規圖像處理中的邊緣提取 難度☆☆☆
  2. 利用神經網路的的邊緣提取 難度☆☆☆☆
  3. 利用PS相關濾鏡、動作做邊緣提取 難度☆
  4. 利用三維模型導出線稿 難度☆☆☆☆☆☆
  5. 直接網上搜現成的線稿 難度☆ 心煩指數☆☆☆☆☆☆☆☆☆

常規圖像處理中的邊緣提取做法

原理來自圖片邊緣處像素值變化比較劇烈,那麼可以用某種濾波器(可以理解為某種判斷條件)去檢測這些變化劇烈的區域,從而獲得邊緣所在位置。不同的濾波器(不同的判斷條件)提取出來的效果會有略微的不同。比較好用的有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顯得力不從心。

主要有以下幾種方式:

  1. 查找邊緣
  2. 照亮邊緣
  3. 最小值
  4. 高反差保留
  5. 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:可以在本機搭起來自娛自樂

Arthurzhangsheng/car_renderer?

github.com圖標

找合作開發小夥伴

以及顯卡贊助商(滑稽)

我的個人公眾號:人工智慧與設計


推薦閱讀:

本田十年前這款可愛的小車,也許代表了未來城市車輛的方向?
不同氣缸排列形式造就不同發動機性能,要玩車必須知道
空調出風口由圓變方,MINI還能不能可愛了?
「高光」密集爆發的日內瓦車展
汽車設計盤點——Jan&Feb 18

TAG:汽車設計 | 人工智慧 | 生成對抗網路GAN |