Learning Memory-guided Normality for Anomaly Detection 代碼決議
目錄 :
- 整體結構
- 訓練(train)部分分析
- 評估(evaluate)部分分析
- 模型(model)部分分析
- 代碼環境配置及運行
1.整體結構
1.1 代碼檔案及作用
根目錄下包含 :
- Evaluate.py 評估代碼
- Train.py 模型訓練代碼
- utils.py 負責數值運算:包含均方根差,峰值信噪比,學習率以及評估最后的準確率等.
model檔案夾下包含:
- final_future_prediction_with_spatial_sumonly_weight_ranking_top1.py 包含編碼器(encoder),譯碼器(decoder)及卷積自動編碼器(convAE)模塊.
- memory_final_spatial_sumonly_weight_ranking_top1.py 包含記憶(memory)模塊.
- utils.py 資料集(dataset)類模塊.
- Memory.py
- Reconstruction.py
上述4,5實作和作用與1,2基本一致,在訓練中通過method引數來區別呼叫:pred對應1,2 , recon對應4,5.(下文省略recon)
1.2 代碼結構
1.2.1 訓練(Train)部分
Train呼叫的代碼檔案:

1.2.2 評估(Evaluate)部分
Evaluate呼叫的代碼檔案:

2.訓練(train)部分分析
2.1 訓練流程

在訓練開始之前還存在以下步驟:
- 載入資料集
- 模型設定
- 建立日志檔案
訓練結束后,會在工程目錄下生成exp檔案夾,其中包含模型檔案及日志檔案.
2.2 代碼分析
2.2.1 啟動引數

- 此處對訓練(train)模塊代碼的啟動,引數說明見圖中help
2.2.2 資料集載入

- 此處呼叫的DataLoader為model檔案夾下的DataLoader類,該類用于載入資料集,并將資料集分劃成mini-batch的形式,每個batch中含5個視頻幀.其中ToTensor將(H,W,C)的視頻幀轉化為(C,H,W)的張量.
2.2.3 模型設定

-
模型選擇分為兩類:pred與recon;啟動時通過輸入不同的引數來選擇相應的模型.
-
model.encoder.parameters為torch基類torch.nn.Module的函式,其主要作用是作為nn.Module的可訓練引數使用.
-
torch.optim.Adam:既Adam優化演算法.對梯度的一階矩估計和二階矩估計進行綜合考慮,計算出更新步長.
-
CosineAnnealingLR:即余弦退火學習率,讓學習率隨epoch的變化圖類似于cos,更新策略:

其中,new表示學習率,initial表示初始學習率,eta表示最小學習率,T表示cos周期的1/2.
2.2.4 訓練模塊主體部分


- 訓練模塊的步驟見2.1節的訓練流程及圖中注釋.
3.評估(evaluate)部分分析
3.1 評估流程

3.2 代碼分析
與訓練部分代碼類似,分為以下幾部分:
3.2.1 啟動引數

3.2.2 載入資料集

3.2.3 載入已訓練的模型

3.2.4 初始化

此處對記錄資料的陣列和變數進行初始化(標簽長度,視頻編號,峰值信噪比,特征距離).
3.2.5 評估模塊主體部分



評估模塊的步驟見3.1節的評估流程及圖中注釋.
4.模型(model)部分分析
該部分由卷積自動編碼器(convAE)和記憶模塊(Memory)兩部分組成,其中卷積自動編碼器呼叫了編碼器(encoder),解碼器(decoder)及記憶模塊(Memory).下面將自上而下分別介紹卷積自動編碼器和記憶模塊兩個部分.
4.1 卷積自動編碼器(convAE)部分
4.1.1 編碼器(encoder)
編碼器的實作為類,繼承了神經網路模塊基類(torch.nn.Module).其中只定義了初始化函式(init)以及向前傳播函式(forward):

其中__init__的實作為:


在__init__中實作了Basic及Basic_函式,二者都對影像進行了卷積,歸一化和激活操作,但細節略有不同.在每次呼叫Basic或Basic_函式之后,再對影像進行最大池化(MaxPool2d)操作.
forward的實作為:

forward僅呼叫了__init__中的引數,對傳入的影像進行了重復的卷積和池化操作,再分別回傳.
4.1.2 解碼器(decoder)
與編碼器類似,解碼器同樣繼承了torch.nn.Module.也定義了初始化函式和前向傳播函式:

其中__init__的實作為:


與編碼器不同,解碼器的初始化函式包含了Basic,Gen及Upsample函式.其中Basic與Gen類似,對影像進行卷積,歸一化和激活函式.在每次呼叫Basic函式后,進行上采樣(Upsample)操作.其中上采樣(Unsample)函式對影像進行反置卷積操作.
forward的實作為:

forward通過呼叫__init__函式重復著卷積,上采樣,拼接張量的操作.在最后呼叫Gen操作.
4.1.3 卷積自動編碼器(convAE)
同樣的,卷積自動編碼器(convAE)也繼承與torch.nn.Module,定義了__init__和forward函式.
其中__init__與forward的實作為:

可見__init__和forward都呼叫了編碼器和解碼器對應的函式,除此之外還對記憶模塊(Memory)進行了呼叫.需要注意的是,在forward中針對訓練(train)和評估(evaluate)兩個不同狀態回傳的值也不同.
4.2 記憶模塊(Memory)部分
Memory實作如下:

其中,Memory分為read和update兩個階段,下面分別介紹各模塊.
4.2.1 read
read實作如下:

該操作主要計算了對于每個查詢(query)和記憶項(Memory item)的匹配概率(公式1),以及計算對每個記憶項和匹配概率的特征(公式2)(此時匹配概率作為加權平均值).
其中get_score用于計算匹配概率,后續操作計算基于匹配概率的特征.論文中給出公式如下:


get_score實作如下:

4.2.2 update
update實作如下:

該操作與read同樣呼叫get_score計算了匹配概率,不同的是,read計算的是垂直方向上的概率,而update計算的是水平方向上的概率.接著update在集合U中使用相關概率來計算加權平均值,再與最初的記憶項相加.最后根據集合U來更新記憶項(公式3).論文中給出公式如下:


get_update_query用于獲取包含查詢的索引的集合(集合U),即公式5:

4.2.3 forward
forward實作如下:

forward為前向傳播函式,在訓練模式通過下計算了特征分離性損失(Feature separateness loss,公式10)以及特征緊湊性損失(Feature compactness loss,公式12).再通過read和update的呼叫對記憶模塊進行更新(訓練和評估時).其中gather_loss的實作如下:


可見在訓練時,gather_loss創建了一個三元損失標準,其作用是為了鼓勵查詢記憶項中最相似的item,從而減小相同正常行為類的差異,增大不同行為的差異.論文中給出公式如下:

其中p:


其中n:

5.代碼環境配置及運行
專案地址:https://github.com/cvlab-yonsei/MNAD
其中README介紹了該專案使用的環境版本及使用的訓練集(USCD Ped2 , CUHK Avenue , ShanghaiTech).
除了上述的專案檔案,我們還需要下載資料集以及預訓練模型.
以上檔案都準備完畢后,在Pycharm中新建工程,并安裝缺失的各種庫(numpy,torch等).
需要注意的是,在安裝cv2的時候可能會提示失敗,此時可以安裝opencv-python替代cv2,其使用方法完全一樣.
接著我們需要將訓練集以及預訓練模型放在工程目錄下,并在Train.py和Evaluate.py中修改啟動引數:
Train.py:

Evaluate.py:

其中dataset_type需要指定資料集的型別(ped2,avenue,shanghai),在dataset_path中給出訓練集的路徑;model_dir和m_items_dir同樣需要給出預訓練模型的路徑.
下面就可以進行運行測驗了.如果想使用cpu進行測驗,可以按以下步驟修改代碼:
- 在代碼的開頭加上:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - 將所有的.cuda()修改成.to(device);其中torch.load需要在模型路徑后再添加一個引數:map_location = torch.device(device).
以上修改將使代碼在運行時檢測cuda,若不存在則使用cpu運算.
可能出現的問題:
在model/utils.py下的DataLoader類中,定義了__getitem__如下:

其中可能產生路徑錯誤.如報錯,可修改為:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354483.html
標籤:AI
