曾幾何時,小學的我們上機課時最喜歡擺弄的就是 word 的藝術字,丑陋的效果並不能阻擋我們在每個角落塞進七彩的字體.......

“七彩”的藝術字
但是時代不同了,我們現在已經有了各種先進的 PS 軟件,我們已經可以做出這樣的藝術字:

各種PS藝術字
我想看到這里,很多人都覺得做一個設計師是多么的不容易,我感覺也是,那么我們能夠更進一步,從而解放設計師的雙手嗎?(我用雙手,成就你的夢想。--LOL blind monk)即我們可以用深度學習的方法設計藝術字,自動生成更加有意思的文字嗎?
答案毫無疑問,必須的必。
我們實際上已經有了 CNN(卷積神經網絡)以及基於其的風格遷移,我們只需要做的是用一張漢字作為原始輸入,用一張對應的圖片作為風格,遷移上去即可。
聽上去真是簡單呢,事不宜遲,我這就打開了 Github,下一個模型開跑,結果如下:

花(風格圖片)

花(遷移的圖片)
看到結果,不禁讓人感到震撼,CNN 網絡學會了從圖片里面剝離出“葉子”和“花朵”兩種語義,並且將原始的圖片中的背景和漢字部分分開,分別進行繪制。最后的效果就是花海中的文字,而文字恰好由葉子構成,唯美的畫面就像大自然的鬼斧神工,處處透露着宇宙的和諧……不行我編不下去了……
最后的結果並不如人意,花顏色太奇怪,葉子黑得蔫了吧唧的,我們還是得深入研究才行。
打開代碼,我們發現代碼中使用了 Keras 提供訓練好的的 VGG19 模型,使用其中的幾層卷積層作為風格損失,還使用最后一層卷積層作為內容損失,結果並不怎么樣。
於是,我們分別實驗了六層卷積層,分別標記為 A-F 層,這些作為風格損失的情況:

VGG19的A-F層卷積層

六層分別作為風格損失的情況
從這些圖片可以看到,卷積網絡確實實在逐層抽象,開始時,層A的卷積核還在尋找顏色,后來,BC 開始尋找由顏色和線條構成的抽象的“花”“葉”的形狀,D、E、F則是逐漸走向識別物體的形狀輪廓,摒棄色彩。從某種意義上,我們補充了 CNN 的可解釋性問題。
這啟發我們要結合色彩與輪廓,形狀與顏色並重地解決問題,於是經過調節 LOSS 函數,測試了各種層的結果如下:

用多層的組合作為風格損失的結果,最后我們選擇了ABC層作為最終結果
進一步地,我們還可以提升效果。加入隨機擾動,加入圖片增強:

加入隨機擾動,平滑效果,以及一系列圖片增強的效果
怎么樣?效果相當漂亮吧?感興趣的可以去我的Github上下載代碼
我們已經添加了一些生成圖片的接口,方便大家使用,此外還提供幾十張風格圖片供您探索,如果覺得有意思的話,請別忘了點一下 Star。
還在等什么?趕緊放開你的想象力!盡情地創造吧!
下面是我們提供的一系列 sytle 圖片的例子,供您欣賞!










項目細節
使用方法很簡單,只需要輸入:
python.exe neural_style_transfer.py 風格圖片所在目錄 輸出文件夾 --chars 花 # 要生成的文字,支持一次輸入多個文字 --pictrue_size 300 # 生成圖片大小 --background_color (0,0,0) # 文字圖片中背景的顏色 --text_color (255,255,255) # 文字圖片中文字的顏色 --iter 50 # 迭代次數,一般50代左右就行 --smooth_times 20 # 文字圖片是否進行模糊化處理 --noise True # 文字圖片是否加入隨機噪聲 --image_enhance True # 生成圖片是否進行增強,包括色度,亮度,銳度增強 --font_name 宋體 # 文字字體,支持宋體,楷體,黑體,仿宋,等線 --reverse_color False # True-黑紙白字,False-白紙黑字,默認白紙黑字
一些說明
神經網絡基於 Keras 官方的風格遷移的例子,經過一定的調整 loss 函數和調參后得到最適合於藝術風格字體的代碼。調整包括:
1. 加入生成文字圖片的方法,以及提供一系列圖片生成相關接口,便於您第一時間修改結果;
2. 修改了 loss 函數,經過大量實驗,確定使用 Keras 提供的 VGG19 網絡的'block1_conv1','block2_conv1','block3_conv1'三層作為風格損失,去除內容損失;
3. 加入一些圖片的增強方法,使得結果更加色彩豐富;
4. 在 style 文件夾下提供了一系列圖片供您探索;
5.如果出現h5py的錯誤,那么請更新安裝即可,即為:pip install --upgrade h5py
項目運行的命令截圖:

項目開始

運行中

運行結果

