作者 | 牟牟
前言
為了讓大家更好地學習 Pipcook 和機器學習,我們準備了實戰系列教程,會分别從前端元件識别、圖檔風格遷移、AI 作詩以及部落格自動分類,這幾個具體示例來講解如何在我們日常開發中使用 Pipcook,如果需要了解 Pipcook 1.0,請閱讀文章
AI ❤️ JavaScript, Pipcook 1.0。
背景
圖檔風格轉換在一些相機 App 或者照片編輯 App 中有比較多的應用,可以對圖檔進行各種轉換。Pipcook 已經支援圖檔風格遷移模型,可以實作很多有趣的圖檔風格轉換,比如将馬變成斑馬:

或者蘋果和橘子的圖檔互轉:
或者照片和各種風格藝術畫之間的互相轉換(每種類型需要進行一次模型訓練):
是不是很有趣,讓我們瞧瞧如何在 Pipcook 上實作這個功能吧!
Pipeline
首先定義一個 pipeline 配置檔案
cycle-gan.json
,内容如下:
{
"plugins": {
"dataCollect": {
"package": "@pipcook/plugins-image-classification-data-collect",
"params": {
"url": "https://ai-sample.oss-cn-hangzhou.aliyuncs.com/apple2orange.zip"
}
},
"dataAccess": {
"package": "@pipcook/plugins-pascalvoc-data-access"
},
"modelDefine": {
"package": "@pipcook/plugins-tensorflow-cycle-gan-model-define"
},
"modelTrain": {
"package": "@pipcook/plugins-image-generation-tensorflow-model-train",
"params": {
"niter": 50000
}
},
"modelEvaluate": {
"package": "@pipcook/plugins-image-generation-model-evaluate"
}
}
}
我們使用了以下插件來完成我們的 pipeline:
- @pipcook/plugins-image-classification-data-collect 這個插件用于下載下傳圖檔分類的資料集,我們需要提供 url 參數,插件會下載下傳并解壓資料集。
- @pipcook/plugins-pascalvoc-data-access 下載下傳好了資料集後,需要将資料集轉換為 pascal voc 格式才能被風格轉換模型識别,是以我們采用此插件。
- @pipcook/plugins-tensorflow-cycle-gan-model-define 基于 TensorFlow 實作的 CycleGAN 模型定義插件。
- @pipcook/plugins-image-generation-tensorflow-model-train 使用這個插件開始模型訓練,主要的參數為 niter 訓練的周期,調整該參數将會影響訓練時長和模型預測效果,在我們的例子中,設定到 50000 可以基本滿足。
- @pipcook/plugins-image-generation-model-evaluate 此插件在訓練結束後對模型效果的評估,最終給出的是測試圖檔生成目标圖示的各項 loss 值。
需要注意的是,CycleGAN 模型訓練需要比較多的計算資源,建議使用 GPU 伺服器進行訓練。
訓練
準備好 pipeline 配置檔案後,在 shell 中執行:
$ pipcook run cycle-gan.json --verbose
start loading plugin @pipcook/plugins-image-classification-data-collect
downloading dataset ...
unzip and collecting data...
create annotation file...
start loading plugin @pipcook/plugins-pascalvoc-data-access
create a result "b1192e00-20ff-4872-adbc-6f7d408ea0fc" for plugin "@pipcook/[email protected]"
start loading plugin @pipcook/plugins-cycle-gan-model-define
create a result "6dda48eb-52da-425e-a95f-748fb8180954" for plugin "@pipcook/[email protected]"
start loading plugin @pipcook/plugins-image-generate-tensorflow-model-train
Model: "dis_B"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 128, 128, 3)] 0
_________________________________________________________________
conv2d_18 (Conv2D) (None, 64, 64, 64) 3136
_________________________________________________________________
leaky_re_lu (LeakyReLU) (None, 64, 64, 64) 0
_________________________________________________________________
conv2d_19 (Conv2D) (None, 32, 32, 128) 131200
_________________________________________________________________
instance_normalization2d_17 (None, 32, 32, 128) 64
_________________________________________________________________
leaky_re_lu_1 (LeakyReLU) (None, 32, 32, 128) 0
_________________________________________________________________
conv2d_20 (Conv2D) (None, 16, 16, 256) 524544
_________________________________________________________________
instance_normalization2d_18 (None, 16, 16, 256) 32
_________________________________________________________________
leaky_re_lu_2 (LeakyReLU) (None, 16, 16, 256) 0
_________________________________________________________________
conv2d_21 (Conv2D) (None, 16, 16, 512) 2097664
_________________________________________________________________
instance_normalization2d_19 (None, 16, 16, 512) 32
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU) (None, 16, 16, 512) 0
_________________________________________________________________
conv2d_22 (Conv2D) (None, 16, 16, 1) 8193
=================================================================
Total params: 2,764,865
Trainable params: 2,764,865
Non-trainable params: 0
_________________________________________________________________
Model: "dis_A"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) [(None, 128, 128, 3)] 0
_________________________________________________________________
conv2d_41 (Conv2D) (None, 64, 64, 64) 3136
_________________________________________________________________
leaky_re_lu_4 (LeakyReLU) (None, 64, 64, 64) 0
_________________________________________________________________
conv2d_42 (Conv2D) (None, 32, 32, 128) 131200
_________________________________________________________________
instance_normalization2d_37 (None, 32, 32, 128) 64
_________________________________________________________________
leaky_re_lu_5 (LeakyReLU) (None, 32, 32, 128) 0
_________________________________________________________________
conv2d_43 (Conv2D) (None, 16, 16, 256) 524544
_________________________________________________________________
instance_normalization2d_38 (None, 16, 16, 256) 32
_________________________________________________________________
leaky_re_lu_6 (LeakyReLU) (None, 16, 16, 256) 0
_________________________________________________________________
conv2d_44 (Conv2D) (None, 16, 16, 512) 2097664
_________________________________________________________________
instance_normalization2d_39 (None, 16, 16, 512) 32
_________________________________________________________________
leaky_re_lu_7 (LeakyReLU) (None, 16, 16, 512) 0
_________________________________________________________________
conv2d_45 (Conv2D) (None, 16, 16, 1) 8193
=================================================================
Total params: 2,764,865
Trainable params: 2,764,865
Non-trainable params: 0
_________________________________________________________________
create a result "b15b7472-d430-4289-9216-a7e2f9ee852c" for plugin "@pipcook/[email protected]"
start loading plugin @pipcook/plugins-cycle-gan-model-evaluat
訓練預計持續時間12小時,訓練完成後,将在目前目錄生成output檔案夾,裡面就是我們訓練好的模型了。我們可以使用 npm 對它進行安裝:
$ cd output && npm install
風格轉換
此時,模型已經準備就緒,我們找一張蘋果的圖檔和一張橘子的圖檔:
const predict = require('./output');
const fs = require('fs');
function saveToFile (base64Data, file) {
var dataBuffer = new Buffer(base64Data, 'base64');
fs.writeFile(file, dataBuffer, function(err) {
if (err) {
console.log('儲存檔案失敗', err.message);
} else {
console.log('儲存檔案成功:', file);
}
});
}
(async () => {
const orange_from_apple = await predict({ path: '/path/to/apple.jpg', predictType: 'a2b' });
saveToFile(orange_from_apple, '/path/to/save/orange_from_apple.jpg'); // 生成的橘子圖檔
const apple_from_orange = await predict({ path: '/path/to/orange.jpg', predictType: 'b2a' });
saveToFile(apple_from_orange, '/path/to/save/apple_from_orange.jpg'); // 生成的蘋果圖檔
})();
儲存為 apple2orage.js, 然後運作:
$ node ./apple2orange.js
儲存檔案成功: /path/to/save/orange_from_apple.jpg
儲存檔案成功: /path/to/save/apple_from_orange.jpg
轉換之後的圖檔:
将代碼包裝一下,一個可以提供蘋果和橘子互轉的圖檔風格轉換服務就完成啦!
資料集
圖檔風格轉換的資料集目錄結構如圖:
其中
train
為訓練資料集,用于模型訓練,
test
為測試資料集,用于模型訓練結束後驗證模型準确性。
測試資料集和訓練資料集包含 A,B 兩個檔案夾,這兩個檔案夾内的資料不需要配對,也就是說,A 和 B 檔案夾内是無關聯的圖檔,在我們這個例子中,我們隻需要在 A 檔案夾内放入任意蘋果的圖檔,B 檔案夾内放入任意橘子的圖檔,就可以進行模型訓練了。這對我們收集資料來說非常友好,比如你可以将人臉部照片放入 A 檔案夾, 二次元的臉部照片放入 B 檔案夾,不需要任何标注,就可以完成照片二次元互相轉換模型資料集的整理。
進階
了解了 Pipcook 風格轉換的實作後,是不是有上手試一試的沖動呢?同學們可以嘗試下面的訓練集,也可以自己整理訓練資料完成想要的風格變換模型。
總結
讀者到這裡已經學會如識使用 Pipcook 實作圖檔風格遷移,下一篇文章,我們将使用 Pipcook 來看看如何通過文本創作類模型來創作中文詩歌。
🎉Pipcook 1.0 系列專題 🎉
AI (愛) JavaScript , Pipcook 1.0 正式釋出 Pipcook 團隊有話說 使用Pipcook對圖檔中的前端元件進行分類,餅圖、折線圖還是柱狀圖? 設計稿生成代碼核心技術揭秘:擷取圖檔中前端元件的位置資訊👉使用 Node.js 将圖檔中的蘋果變成橘子
未完待續...
❤️歡迎大家關注 Alibaba F2E 微信公衆号前端智能化技術分享周(6.29-7.3)❤️