用Python生成會跳舞的美女

導語

表妹心疼我,為瞭逗我開心,教我用Python制作會跳舞的美女。作為新時代的活雷鋒,在這裡分享給大傢。

在這裡插入圖片描述

開發工具

Python版本:3.6.4

相關模塊:

torch0.4.1模塊;
torchvision0.2.2模塊;
opencv-python模塊;
argparse模塊;
numpy模塊;
以及一些Python自帶的模塊。

環境搭建

安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。

(PS:CUDA環境配置請自行Google教程。)

原理簡介

這裡我們利用VAE的原理來生成會跳舞的小姐姐唄。先簡單介紹一下理論知識,要說VAE,就得先談談自動編碼器,自動編碼器最開始用於數據壓縮,其原理圖十分簡單直觀:

圖片

在模型訓練時,輸入圖片首先通過一個編碼器(現在當然是神經網絡啦)將輸入數據降維到一個code,接著將code輸入到解碼器(當然還是神經網絡啦)生成一個與輸入相同大小的圖片,網絡的優化目標就是使得輸入編碼器的圖片與解碼器輸出的圖片盡可能相似。 當模型訓練完之後,我們就可以拿出這個解碼器,隨機傳入一些code作為它的輸入,來生成一些差不多的圖片。但是這種做法存在一個問題,就是編碼器生成的code包含瞭原圖信息,因此,我們就無法自己構造一些隨機的code來作為解碼器輸入從而生成任意圖片(必須是現有圖片過瞭編碼器之後生成的code作為輸入)。為瞭解決這個問題,VAE就誕生啦~VAE的全稱是:

Variational Autoencoder 即變分自編碼器
說起來,它的原理圖也十分簡單:

圖片

與自編碼器唯一不同就是在訓練過程中對code也進行瞭約束,使得code滿足某種分佈(譬如正態分佈)。這樣的話,模型訓練完之後,我們隻需要隨機生成一個滿足該分佈的code,就可以拿來作為解碼器的輸入,從而生成任意圖片啦~ 一般地,我們用均方損失函數保證原圖和生成圖相似,用KL損失函數來保證code滿足我們所要求的分佈。均方損失大傢肯定知道,KL散度的定義這裡我也不想過多地去介紹,貼下維基百科上定義的公式吧:

圖片

P和Q是在同一個概率空間上定義的離散概率分佈。 同時,為瞭方便計算KL散度,VAE引入瞭一個trick,叫:

reparameterization

以正態分佈為例子,就是現在不直接預測code瞭,而是預測code的均值和方差,有瞭均值向量和方差向量,恢復code是很方便的(用標準正態分佈乘以方差再加個均值就行瞭)。

再回過頭來,我們現在要用VAE來生成會跳舞的小姐姐,無非就是先找到一個訓練數據集,這裡我找瞭個Youtube上的視頻作為數據集:

https://www.youtube.com/watch?v=NdSqAAT28v0

然後根據VAE的原理構造一個編碼和解碼網絡,用兩個損失函數作為約束訓練網絡就行啦。代碼就不一個個貼瞭,寫起來很簡單的,貼上來倒感覺有點麻煩,有需要的直接在公眾號後臺回復“dancenet”即可獲取。簡單說下代碼使用方式吧,模型訓練運行train.py文件即可,命令格式為:

python train.py --videopath xxx.mp4
模型測試運行demo.py文件即可,命令格式為:
python demo.py --mode random/fromtrain --checkpointspath xxx.pth --outputpath xxx.avi
這裡模式的含義是code隨機生成/從訓練集中提取一些圖片的code作為輸入。

效果展示

隨機生成code模式作為輸入:

圖片

數據集中挑選圖片過編碼器獲得code作為輸入:

圖片

好瞭,我的分享到此結束瞭。

總結

到此這篇關於用Python生成會跳舞的美女的文章就介紹到這瞭,更多相關Python美女內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: