neural style風格遷移模型實戰

2021-08-25 17:03:43 字數 3669 閱讀 5243

有沒有想過,利用機器學習來畫畫,今天,我將手把手帶大家進入深度學習模型neural style的**實戰當中。

這裡,我選擇了將梵谷的畫風和我們的東北大學的工學館相結合,讓工學館融入了 梵谷的星空效果圖,在經過100次的迭代後得到了帶有星空效果的。

另外我們可以嘗試與其他風格結合:

我們可以用這個專案為我們自己的學校做明信片,即使你不會畫畫,也可以製作一些自己風格的等等。

那麼現在我們開始吧。

該專案基於tensorflow框架,這裡我強烈推薦gpu版本,這裡的深度學習模型不像其他的模型,有訓練出來的檔案,而是直接梯度下降進行轉化,cpu的轉化比較慢,因此這裡推薦gpu的tensorflow,依賴cuda和cudnn,cuda依賴7.5版本以上,cudnn選擇對應cuda版本。然後開啟命令列,輸入以下命令:

pip install tensorflow-gpu
如果你安裝過cpu版本的tensorflow,那麼也不用擔心,你只需要在anaconda裡面新搭建乙個環境,這裡不做詳細的解釋,如果大家有疑問可以直接在網路上搜尋具體的安裝方法,如果有問題也可以聯絡我。

當然不一定非得是gpu版本,cpu版本也可以,只是轉換的速度問題。

pip install opencv-python
好了,那麼環境的搭建基本結束,我們開始實戰吧。

在我們的專案**中,我們發現neural_style.py這個檔案,即專門用於轉化風格。

看著應該很讓人眼花繚亂吧,那麼我們進入實戰來了解吧,專案裡面有一些和風格圖,而預設的輸入路徑是image_input,預設的輸出路徑是image_output,預設的風格儲存位址是styles,大家如果把放在相應的位置即可直接執行,如果想放在其他位置則需要更改內容映像的相對或絕對目錄路徑:--content_img_dir。

那麼我們先來實戰一波,這裡我在image_input裡放上來了一張自己的,我起名school.jpg,在styles裡有一張星空的,大家自行選擇,如果放在固定資料夾那就不需要更改映像路徑,也就是content_img_dir這個引數。

定位到專案資料夾,開啟cmd,輸入以下命令:

gpu版本:

python neural_style.py --content_img school.jpg --style_imgs starry-night.jpg --max_size 620 --max_iterations 100 --original_colors --verbose
cpu版本:

python neural_style.py --content_img school.jpg --style_imgs starry-night.jpg --max_size 620 --max_iterations 100 --original_colors --device /cpu:0 --verbose
大家注意到了這兩行**的區別就在於多了乙個--device引數,就是確認使用cpu還是gpu,預設是gpu,如果使用gpu可以不填這個引數,如果是cpu需要填寫。

下面解釋一下常用的引數:--content_img是選擇需要轉換風格的,把放在image_input這個資料夾裡,content_img的引數就是這個資料夾裡的名字,記得加上檔案的字尾。--style_imgs的引數選擇是放在styles資料夾裡面的檔名。--max_size是你選擇需要轉化的最大畫素長度,我不建議使用過大的,大家轉化時可以盡可能縮小大小,windows自帶的**編輯器可以更改,大家檢視畫素大小也很簡單,右鍵->屬性->詳細資訊即可看到的長寬各多少畫素,建議長盡量不要超過1000,不然效能一般的電腦可能會卡住。--max_iterations這個引數是迭代次數,次數過小可能有欠擬合,沒有風格的風格;但是過大有過擬合現象,即原有的失去自己的特徵,建議100-1000,根據自己來定。因為好壞在於個人審美,因此大家可以多匯出幾張選擇自己覺得最適合的。最後的--verbose引數是在命令列是否反饋資料,如果沒有就是命令列沒有任何顯示,建議還是加上。我這裡直接迭代100次,下面是匯出的。

我們發現,這張雖然有了梵谷的畫作星空的油畫特徵,可是顏色卻是自己本來的顏色,那麼如何匯出和風格差不多的顏色呢,這裡就要簡單說明一下上述命令中的--original_colors,這個命令加上後就會讓輸入色彩保留自己的特徵,如果大家想要風格的色彩特徵的話可以直接刪除這個--original_colors,然後再次轉換得出以下:

這是一樣的迭代次數,只是色彩參照不一樣,大家根據自己喜好選取。

這裡需要介紹另乙個引數:--style_imgs_weights,就是權重。比如,我想要有兩種風格的,兩種風格更側重哪個風格,這就是權重。比如我要給一張蒙娜麗莎和中國水墨畫的風格,假設蒙娜麗莎的是mnls.jpg,中國水墨畫的叫china.jpg。那麼我們可以這樣使用:

python neural_style.py --content_img school.jpg --style_imgs mnls.jpg china.jpg --max_size 620 --max_iterations 200 --verbose --style_imgs_weights 0.5 0.5
我對--style_imgs這個引數選擇兩張,名字用空格隔開即可,在--style_imgs_weights這個引數,假如說我希望兩種風格影響一樣,即五五分,那麼我的這個引數在--style_imgs_weights後面直接輸入0.5 0.5,要注意的是權重的引數總和需要為1。

下面一張是蒙娜麗莎風格的:

這張是中國水墨畫風格的:

如下是兩種風格1:1的組合:

1.注意迭代的次數,放止過擬合與欠擬合的現象。

2.好看的一定要選對風格,否則就算擬合的再好,風格不適合也不好看的。

3.選擇的和風格物體大小也會影響輸出。

4.多風格注意風格之間的權重關係。

終歸這是別人的乙個成果,我們只是呼叫了別人的成果,有興趣的建議理解該演算法並且嘗試研究超越該演算法。

風格遷移網路

快速風格遷移的網路結構包含兩個部分。乙個是生成網路 transformation network 乙個是損失網路 loss network 生成網路是將輸入影象進行風格遷移後輸出,損失網路用以計算生成影象的內容損失和風格損失。對於生成網路,本質上是乙個卷積神經網路,但不採用池化層,取而代之的是用步幅...

快速風格遷移網路

快速風格遷移的網路結構包含兩個部分。乙個是 生成網路 image transform net 乙個是 損失網路 loss network 生成網路輸入層接收乙個輸入,最終輸出層輸出也是一張 即風格轉換後的結果 模型總體分為兩個階段,訓練階段和執行階段。模型如圖所示。其中左側是生成網路,右側為損失網路...

風格遷移學習 GramMatrix

向量的點乘,對兩個向量執行內積運算,就是對這兩個向量對應位一一相乘之後求和的操作,內積的結果是乙個標量。內積判斷向量a和向量b之間的夾角和方向關係 a b 0 方向基本相同,夾角在0 到90 之間 a b 0 正交,相互垂直 a b 0 方向基本相反,夾角在90 到180 之間 gram矩陣是兩兩向...