這是我最近在 Twitter 和 vimeo 上發布的網路攝影機 pix2pix 演示的源代碼和預訓練模型。它使用深度學習,或引入一些流行語:深度卷積條件生成對抗網路自動編碼器。
影片1
影片2
這個特定儲存庫中的程式碼實際上與 pix2pix、GAN 甚至深度學習無關。它只是載入任何預先訓練的張量流模型(只要它符合一些約束),為其提供經過處理的網路攝影機輸入,並顯示模型的輸出。剛好我訓練和使用的模型是pix2pix(詳情如下)。
即步驟可以概括為:
我從維基媒體上的谷歌藝術計畫中收集了來自世界各地的藝術收藏品。很多圖像都是富有的白人的經典肖像,所以我只使用了大約 150 個集合,試圖保持數據盡可能在地理和文化上多樣化(我使用的完整列表在這裡)。但數據仍然非常以歐洲為中心,因為單一歐洲博物館可能有數百或數千個掃描,但阿拉伯博物館只有 8 個掃描。
我下載了 300px 版本的圖像,並運行了批次:
我還運行了一個批次過程來從圖像中獲取多種裁剪(而不是不均勻地調整大小),但我還沒有接受過這方面的培訓。我不再使用精明的邊緣檢測,而是開始研究 Xie 和 Tu 提出的更好的「整體嵌套邊緣檢測」(又名 HED)(如原始 pix2pix 論文所使用),但還沒有對此進行培訓。
這是由 preprocess.py 腳本完成的(抱歉沒有命令列參數,編輯腳本以更改路徑和設置,應該是不言自明的)。
可以在此處查看訓練資料的小樣本(包括訓練模型的預測)。最右列是原始影像,最左列是預處理版本。這兩個圖像作為「對」輸入到 pix2pix 網路中進行訓練。中間的列是模型在僅給定最左邊的列的情況下學習產生的列。 (圖像顯示了每次訓練迭代 - 即左側的數字,從 20,000 到 58,000,因此在頁面上越往下,它逐漸變得越好)。
我還訓練了一個無條件 GAN(即在相同訓練資料上的正常 DCGAN。其輸出示例如下所示。(這會產生類似於訓練資料的“完全隨機”圖像)。
訓練和架構是 Isola 等人(又稱 pix2pix)的「使用條件對抗網路的圖像到圖像轉換」。我使用 @affinelayer (Christopher Hesse) 的 TensorFlow 端口進行了訓練,這也是最近病毒式傳播的“sketch-to-cat”演示的動力。他還寫了一篇關於 pix2pix 如何運作的很好的教學。非常感謝作者(以及他們所依賴的每個人)將他們的程式碼開源!
我只對 tensorflow-pix2pix 訓練程式碼做了一個極其微小的更改,那就是使用人類可讀的名稱將tf.Identity添加到生成器的輸入和輸出中,以便我可以輕鬆地提供和獲取張量。因此,如果您想在此應用程式中使用自己的模型,則需要執行相同的操作。 (或記下輸入/輸出張量名稱,並相應地修改 json,更多內容請見下文)。
您可以從「發布」標籤下載我的預訓練模型。
這個特定應用程式的作用是載入預訓練模型,對網路攝影機輸入進行即時預處理,並將其提供給模型。我使用 opencv 用老式的基本電腦視覺進行預處理。它確實非常簡單和基本。您可以看到下面的 GUI(GUI 使用 pyqtgraph)。
不同的場景需要不同的設定。
例如,對於“真人表演”,我發現canny可以提供更好的(恕我直言)結果,這就是我在頂部第一個影片中使用的。閾值(canny_t1、canny_t2)取決於場景、細節量和所需的外觀。
如果影像中有很多雜訊,您可能需要添加一點pre_blur或pre_median 。或與它們一起玩以獲得“藝術效果”。例如,在第一個影片中,在 1:05-1:40 左右,我添加了大量中位數(值在 30-50 左右)。
對於繪製場景(例如第二個影片),我發現自適應閾值比 canny 提供更有趣的結果(即停用 canny 並啟用自適應閾值),儘管您可能不同意。
對於完全靜態的輸入(即,如果凍結捕獲,禁用相機更新),輸出可能會閃爍非常少量,因為模型對同一輸入做出不同的預測 - 儘管這通常非常微妙。然而,對於即時攝影機饋送,輸入中的雜訊可能會在輸出中產生大量閃爍,特別是由於精明或自適應閾值對雜訊的高度敏感性,因此一些時間模糊可以有所幫助。
Accum_w1和Accum_w2用於在進入模型之前對輸入進行時間模糊:new_image = old_image * w1 + new_image * w2(因此理想情況下它們應該加起來為 1 - 或接近)。
Prediction.pre_time_lerp和post_time_lerp也進行時間平滑: new_image = old_image * xxx_lerp + new_image * (1 - xxx_lerp) pre_time_lerp 是進入模型之前, post_time_lerp 是離開模型之後。
任何時間模糊為零都會停用它們。這些的價值取決於您的品味。對於上面的兩個視頻,我將所有pre_model 模糊(即Accum_w1、accum_w2 和pre_time_lerp)設為零,並使用不同的post_time_lerp 設定進行播放,範圍從0.0(非常閃爍和閃爍)到0.9(非常慢、褪色和「夢幻」) )。通常 0.5-0.8 左右是我最喜歡的範圍。
如果您想使用其他模型,則需要設定一個類似於以下檔案的 JSON 檔案。這裡的動機是,我的app/models 資料夾中實際上有一堆JSON,我可以動態掃描和重新加載它們,並且模型資料儲存在其他磁碟上的其他位置,並且應用程式可以在運行時和規模上載入和在模型之間交換自動輸入/輸出等。
{
"name" : "gart_canny_256", # name of the model (for GUI)
"ckpt_path" : "./models/gart_canny_256", # path to saved model (meta + checkpoints). Loads latest if points to a folder, otherwise loads specific checkpoint
"input" : { # info for input tensor
"shape" : [256, 256, 3], # expected shape (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # expected range of values
"opname" : "generator/generator_inputs" # name of tensor (':0' is appended in code)
},
"output" : { # info for output tensor
"shape" : [256, 256, 3], # shape that is output (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # value range that is output
"opname" : "generator/generator_outputs" # name of tensor (':0' is appended in code)
}
}
僅在 Ubuntu 16.04 上測試,但應該適用於其他平台。
我使用 Anaconda python 發行版,它幾乎包含了您需要的所有內容,那麼它(希望)就像這樣簡單:
從 https://www.continuum.io/downloads 下載並安裝 anaconda
安裝tensorflow https://www.tensorflow.org/install/(如果你有anaconda,這通常非常簡單,因為包含了大多數依賴項)
安裝opencv和pyqtgraph
conda安裝-c menpo opencv3 conda安裝pyqtgraph
再次無限感謝