# [Anomalib](https://github.com/openvinotoolkit/anomalib) 評測文
<img src= https://i.imgur.com/TyREAwv.png) width="350" height="100" align="middle" />
## AI與瑕疵檢測結合可應用之場域
工業場域中,對於不同大小、不同形狀及不同材質的工業部件需要進行瑕疵檢測(AD)。傳統工業中,透過大量人力進行檢驗,此方法容易消耗大量人力與時間,且受檢驗人員經驗影響,檢測結果會下降。因此許多工廠導入了AI檢測模型,透過電腦視覺(CV)來協助人員進行檢測,主要透過攝像頭拍攝部件外觀,後由人員進行檢測,確認部件是否含有瑕疵,並將以此為資料集,訓練AI檢測模型。然而此方法在實際場域中受到資料量的限制,無法精準的對影像進行分析。為了提高AD模型應用在實際場域中的泛用性,許多研究開始提出不同的演算法來對瑕疵進行分析。而 openvino 彙整了一個深度學習資料庫 - [Anomalib],包含了目前檢測精準度較高的AD模型。
## 多框架開發
Anomalib 可使用 「Pytorch」、「Openvino」進行模型訓練與異常檢測,本文將以PaDiM模型為例,介紹如何使用Openvino框架進行異常檢測模型訓練的過程。
## 異常檢測模型實作
本文使用的硬體設備有兩種,分別為 個人筆電 Windows10,處理器為 i7-8750H 及 工業電腦 (待補規格)
### 環境建置
本文所使用的開發工具為 [Anaconda](https://www.anaconda.com/products/distribution)
建立虛擬環境後,即可進行模型的下載,步驟如下:
- 下載並安裝 Anomalib 專案與套件
```
git clone https://github.com/openvinotoolkit/anomalib.git # download Anomalib Github
cd anomalib
pip install -e . # download package
```
### 安裝 [Openvino](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html)
> 若執行系統為 Windows 時,當Openvino有指定版本時,如:```pip install openvino-dev==2022.3.0```,執行推論前需執行 ```setupvars.bat```。
> ```setupvars.bat``` 預設路徑:C:\Program Files (x86)\Intel\openvino_2022\。
```
pip install openvino-dev # download package for for developing applications
```
### 下載 [MVTec](https://www.mydrive.ch/shares/38536/3830184030e49fe74747669442f0f282/download/420938113-1629952094)
本文將使用 MVTec AD 資料集進行工業部件瑕疵檢測
```
anomalib
└─datasets
└─MVTec
```
### 模型訓練
自訂 config.yaml 檔內容
```
anomalib
└─anomalib
└─models
└─padim
```
> 根據檢測的模型,不同模型參數位置會有所差異,更換模型時需要特別注意。
> 5L ```
category: bottle ```,修改檢測類別,詳細類別如下:
>
> category list : bottle, cable, capsule, carpet, grid,
> hazelnut, leather, metal_nut, pill, screw,
> tile, toothbrush, transistor, wood, zipper
>
> 7L ```train_batch_size: 32```
> 8L ```eval_batch_size: 32```
> 以上兩種參數需根據 GPU 性能進行調整,以 RTX 2060 為例,將參數值設為 2
> 66L ```export_mode: "openvino"```,修改模型輸出格式
> 77L ```check_val_every_n_epoch: 1```,設定訓練幾次後,儲存權重檔(.ckpt)。
> 94L ```max_epoch: 1```,設定訓練次數為 n+1
設定完成後,即可開始進行訓練
```
python tools/train.py --config anomalib/models/{model_name}/config.yaml
```
以模型 "PaDiM" 為例
```
python tools/train.py --config anomalib/models/padim/config.yaml
```
完成訓練後,模型將會自動輸出各類別結果影像與權重
需確認輸出的檔案是否含有IR檔,以進行推論 (inference)

```
anomalib
└─results
└─padim
└─mvtec
└─bottle
└─run
└─openvino
└─meta_data.json
model.bin
model.mapping
model.onnx
model.xml
```
### 進行推論 (Openvino)
```
python tools/inference/openvino_inference.py --config anomalib/models/{model_name}/config.yaml --weights results/{model_name}/mvtec/{category_name}/run/openvino/model.bin --meta_data results/{model_name}/mvtec/{category_name}/run/openvino/meta_data.json --input datasets/MVTec/{category_name}/test/{image_path} --output {output_path}
```
以類別 "bottle" 中的 "broken_large" 影像為例
```
python tools/inference/openvino_inference.py --config anomalib/models/padim/config.yaml --weights results/padim/mvtec/bottle/run/openvino/model.bin --meta_data results/padim/mvtec/bottle/run/openvino/meta_data.json --input datasets/MVTec/bottle/test/broken_large --output results/padim/openvino
```
> --input 可使用單張影像或資料夾
> --output 輸出類別 "bottle",關於 "broken_large" 問題的測試結果
```
anomalib
└─results
└─padim
└─openvino
└─broken_large
```
### 使用不同框架進行模型推論比較
<img src= https://i.imgur.com/ngf3BiZ.png) width="470" height="300" align="middle" />
</p>
<img src= https://i.imgur.com/MOoBy7v.png) width="470" height="300" align="middle" />
</p>
結論:在先前的教學文中,和各位簡單介紹了如何使用 anomalib 中的模型進行訓練與推論,本文以此為基礎,介紹 PaDiM 等6種模型如何利用 openvino 來進行推論,在簡單操作的同時亦能提昇推論的效率。藉由以上圖表可知,在不同硬體設備下,使用openvino框架進行推論時,可有效提升大多數模型的推論速度。