論文完整復現流程之異常檢測的未來幀預測

  • 2019 年 10 月 6 日
  • 筆記

論文完整復現流程之異常檢測的未來幀預測

0.導語

本次研究論文題目為:Future Frame Prediction for Anomaly Detection — A New Baseline

本片文章主要分為兩大塊來詳細闡述這篇論文,分別是:論文閱讀核心點論文復現流程及細節

1.論文閱讀

1.1 論文框架

本篇論文為GAN進行異常檢測的一篇文章。在這篇論文中核心為下面的pipeline

pipeline指出:

(1)使用修改過的U-Net作為生成器,並使用訓練好的Flowne2提取光流。

(2)判別器採用 Image-to-image translation with conditional adversarial networks中的判別器。

1.2 訓練

對抗訓練

生成對抗網路(GAN)包含一個生成器G與判別器D,而G學習去生成(由D很難去分類)的幀(圖片),而D目標則是去判別由G生成的幀(圖片),這稱為對抗訓練。

訓練D(判別器)

判別器D基於CGAN構建的影像轉換模型中的局部判別器Patch Discriminator。該方案先將生成圖片分成N*N的小塊,然後對每一塊使用二分類判別器進行真假的判別。通過這一修改,不僅降低了判別器的參數量,加快模型的運行速度,也使其適應任意尺寸的輸入。同時促使判別器D更加關注高頻局部資訊,激勵生成器生成細節更清晰的影像。

其損失函數如下。其中,i,j 是圖片塊的索引,D(x)ϵ[0,1]:

訓練G(生成器)

生成器G使用U-Net模型,設計一個具有相同輸入輸出同解析度的幀預測模型,該模型使用類似自編碼器的對稱結構,通過在同樣解析度大小的淺層和深層之間添加短路連接(Shortcut)。解決傳統自編碼器結構的梯度消失和重構時細節丟失的問題,使用該結構可以生成更加清晰的影像。

(1)U-Net模型

(2)強度損失:預測幀(生成圖片)與真實幀(原圖片)的L2距離。

(3)梯度損失:邊緣形狀的約束,使得生成影像更加銳化,其中,i、j 表示二維影片幀中的像素位置。加入該損失後,使得生成圖片中每個像素點與相鄰像素點的差值與原圖片更一致,對於中色彩轉換邊界有更大影響。

(4)光流損失:預測幀與真實幀與前一幀的光流之間的L1距離。

(5)均方誤差損失:生成出來的幀希望全部都被判別器判定為1。在訓練G時固定D的權重。其中i, j 是圖片塊的索引,D(x)ϵ[0,1]。

1.3 目標函數

生成器G

生成網路的目標函數是:強度損失,梯度損失,光流損失,均方誤差損失,最後對抗損失為按比例求和:

判別器D

對抗網路的目標函數是:僅有對抗損失:

具體的訓練參數設置,可以看原文。

1.4 測試

使用峰值信噪比(PSNR)評估預測幀的品質(計算預測幀和真實幀的像素級相似度),越接近正常,分數越高。越低的PSNR越可能有異常:

最後,將每個測試影片中所有幀的PSNR歸一化到[0,1]的範圍內,計算正則分數:

1.5 實驗結果

在數據集CUHK Avenue , UCSD Pedestrian, ShanghaiTech上,該方法均超過baseline。

2.論文復現

復現直接使用論文官方的github數據集與程式碼。復現流程及思路如下:

數據集

本次實驗訓練step非常大,8w步,當然也可以自己設置,如果電腦是數字1000以下GPU,就不要跑了,會卡死。

實驗中有三個數據集,而在這次復現中僅使用了ped2數據集做訓練與測試。復現的具體流程在官網github上有詳細流程,下面重點來看復現結果與程式碼分析。

復現結果

訓練step對應的異常事件圖:

訓練過程中的loss:

模型選擇後,測試數據上的AUC精度對比:

對比上述AUC得出95.4%!

程式碼分析

該篇論文的程式碼寫的非常優雅!非常值得學習!

論文復現程式碼中使用了如下深度學習技術:

  • PatchBatch
  • U-Net
  • CGAN
  • Pix to Pix
  • Flownet2-tf

flownet2文件夾下的程式碼源自:

https://github.com/sampepose/flownet2-tf

pix2pix.py源自:

https://github.com/tensorflow/models/blob/master/research/slim/nets/pix2pix.py

數據集與運行

(1)對影片做幀提取(ffmpeg提取),提取方式:

ffmpeg -i 01.avi frames/frames_%05d.jpg

-i 後是輸入文件名,最後是輸出結果,以frame_為前綴,以五位數字為編號(不夠前邊用0補齊),圖片格式為jpg。

(2)伺服器後台運行

當使用nohup與&將訓練放在後台後,使用tail -f追蹤數據時,不顯示輸出結果,原因在於數據數據未能及時寫入log中,此時需要python運行加-u參數即可實現。

最後,繼續去琢磨程式碼,改程式碼,深入改寫。。。