Python深度學習5 :Tensorflow 1.15 MobileNet-SSD 口罩辨識模型訓練

前言

前一篇博文「Python深度學習4:MNIST手寫數字識別模型」介紹一些基本模型訓練方式。疫情已經兩年多了,許多地方都可以看到AI標記用戶是否佩戴口罩,因此我們就來介紹一下如何訓練口罩辨識模型,本篇使用MobileNet-SSD (Single Shot MultiBox Detector, SSD)演算法,能在手機或樹莓派上運行順暢,本篇博文使用現成資料集,進行模型訓練教學。

 

► TensorFlow GPU環境建置

 本篇博文採用TensorFlow1.15版本作為模型訓練框架進行深度學習,搭配Nvidia Geforce GTX 3080顯示卡提升訓練速度。TensorFlow GPU訓練環境建置需具備以下基礎配置。

  • Ubuntu 18.04 LTS
  • Nvidia GPU顯卡 (Cuda 架構需5版本以上)  Cuda版本查詢
  • Nvidia GPU顯卡驅動

Cuda cudnn安裝

Cuda為Nvidia所推出GPU平行運算框架,透過Cuda架構使進行複雜的計算問題。Cudnn為基於Cuda的深度學習GPU加速函式庫。首先下載需要版本的CUDA版本,本流程顯卡為Geforce GTX 3080使用Cuda 11.1作為後續應用。


Cuda安裝(如下圖所示)

Cuda下載位置 https://developer.nvidia.com/cuda-toolkit-archive




進入下載Cuda所存放的資料夾,使用Terminal執行腳本

$ sudo sh ./cuda_11.1.0_455.23.05_linux.run

 添加環境變數,Terminal bashrc,檔案最後添加以下內容,紅字部分對應所安裝cuda版本進行改動,根據顯卡需求採用cuda11.1作為範例

$ sudo gedit ~/.bashrc​
export PATH=/usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH
$ source ~/.bashrc

重啟系統,Terminal輸入nvcc -V出現以下資訊即安裝成功

$ reboot
$ nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2020 NVIDIA Corporation

Built on Tue_Sep_15_19:10:02_PDT_2020

Cuda compilation tools, release 11.1, V11.1.74

Build cuda_11.1.TC455_06.29069683_0

Cudnn 安裝(如下圖所示)

Cudnn下載位置 https://developer.nvidia.com/rdp/cudnn-archive



下載cuDNN Library for Linux (x86_64),並解壓縮。

$ tar -xzf cudnn-11.1-linux-x64-v7.6.5.32.tgz

 

進入 cuda 資料夾

$ cd cuda

 

將檔案複製到 /usr/local/cuda

$ sudo cp lib64/lib* /usr/local/cuda/lib64/
$ sudo cp include/cudnn.h /usr/local/cuda/include/
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

 

TensorFlow 環境配置

使用tensorflow object detection api 的方式進行模型訓練,並使用Mobilenet-SSD 作為預訓練權重。

相關內容網址可以參考以下連結

https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/tensorflow-1.14/

 

訓練環境建置:

  • Ubuntu 18.04 LTS
  • Anaconda 4.11.0
  • Python 3.6.13
  • TensorFlow-gpu 1.15.4
  • OpenCV 4.5.4

TensorFlow訓練環境建置

Anaconda於下方連結進行下載,下載版本如下圖所示。

https://www.anaconda.com/products/individual



執行Anaconda安裝腳本,本文安裝位置為 /usr/local/anaconda3

$./Anaconda3-2021.11-Linux-x86_64.sh

 

通過conda 指令建立python3.6虛擬環境與啟動虛擬環境

$ conda create --name py36 python=3.6
$ conda activate py3.6

 

並於虛擬環境下進行套件安裝

$ conda install opencv-python
$ pip install nvidia-pyindex
$ pip install nvidia-tensorflow

 

透過以下網址至tensorflow提供的object detection api網址

https://github.com/tensorflow/models/tree/master


本篇採用tensorflow objection detection api v1.13.0版本作為後續訓練應用。透過下方示意圖切換版本至v 1.13.0後進行下載。

$ git clone https://github.com/tensorflow/models.git

 或是直接採用下方連結v1.13.0版本,進行下載

https://github.com/tensorflow/models/tree/v1.13.0

 


Tensorflow object detection api使用protobuf來進行模型配置與訓練參數,所以需要安裝protobuf

$ sudo apt install protobuf-compiler


並將models和Tensorflow slim 加入python環境變數

$ gedut ~/.bashrc
export PYTHONPATH=$PYTHONPATH: tfmodels/models/research:tfmodels/models/research/slim
$ source ~/.bashrc

 

進入剛剛所下載的資料夾進行檔案安裝 

$ cd tfmodels/models/research
$ sudo python3 setup.py build
$ sudo python3 setup.py install



Mobilenet-SSD 訓練資料建置

進入以下路徑,並新增ssd_model資料夾

$ cd tfmodels/models/research/object_detection
$ mkdir ssd_model

 
使用口罩資料集進行訓練,內部使用格式為PASCAL VOC。

口罩資料集下載連結:

https://www.kaggle.com/andrewmvd/face-mask-detection,

將下載的資料集存放至ssd_model資料夾內並解壓縮,將Rename.py、CreateImageSets.py與xml_to_tfrecord.py放置於ssd_model資料夾。

$ unzip archive.zip

 

執行Rename.py此程式會將xml與圖片副檔名png改動為jpg,再執行CreateImageSets.py產生數據集VOC2007格式(Annotations、JPEGImages、ImageSets)。

修改xml_to_tfrecord.py內的VOC_LABELS參數,執行xml_to_tfrecord.py程式會把xml檔為tfrecord格式,之後用於訓練,如下圖所示。

VOC_LABELS



dataset_dir/output_dir

dataset_dir = "/models/research/object_detection/ssd_model/Mask_dataset/"
output_dir = "/models/research/object_detection/ssd_model/Mask_dataset/"
$ python xml_to_tfrecord.py

 

並於ssd_model 建立label_map.pbtxt新增訓練資料類別,如下圖所示

$ gedit label_map.pbtxt

item {
id: 1
name: 'with_mask'
}


item {
id: 2
name: 'without_mask'
}


item {
id: 3
name: 'mask_weared_incorrect'
}

 

Mobilenet-SSD模型訓練

於下方連結,下載Mobilenet SSD 作為預訓練權重進行訓練,如下圖所示。

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md



將下載檔案移至ssd_model資料夾,並解壓縮 

$ mv ssd_mobilenet_v1_coco_11_06_2017.tar.gz tfmodels/models/research/object_detection/ssd_model
$ cd tfmodels/models/research/object_detection/ssd_model
$ tar xvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz

 

修改ssd_mobilenet_v1_coco.config訓練參數配置

  1. num_classes:訓練模型目標檢測類別數量
  2. decay_steps:每訓練decay_steps降低學習率一次
  3. fine_tune_checkpoint: 載入預訓練模型路徑
  4. from_detection_checkpoint: true類別載入加載detection模型參數中FeatureExtractor部分,flase只載入classification模型參數
  5. num_steps: 20000 總迭代次數
  6. input_path: 讀取tfrecord檔案路徑
  7. label_map_path: 讀取pbtxt文件路徑
  8. num_examples:驗證集的資料數目

修改ssd_mobilenet_v1_coco.config文件後即可模型訓練,移動路徑至object_detection資料夾進行模型訓練,執行model_main.py進行訓練

$ cd tfmodels/models/research/object_detection
$ python model_main.py --model_dir=training --pipeline_config_path=./ssd_model/ssd_mobilenet_v1_coco.config --num_train_steps=60000 --num_eval_steps=20 –alsologtostderr


訓練模型產生於object_detection/train資料夾下,如下圖所示。


凍結Mobilenet-SSD訓練模型

移動至object_detection資料夾,執行export_inference_graph.py進行模型凍結,將.pb模型參數和網路結構進行固化,指令如下:

$ cd tfmodels/models/research/object_detection
$ python export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path ./ssd_model/ssd_mobilenet_v1_coco.config \
--trained_checkpoint_prefix ./training/model.ckpt-60000 \
--output_directory ./ssd_model/ssd_mobilenet_v1_coco_11_06_2017/model/

 

所產生的凍結模型(frozen_inference_graph.pb),如下圖所示。


驗證結果



小結

透過以上範例講解,能夠建立一個口罩辨識模型,凍結完成的frozen_inference_graph.pb模型,還可以轉換為TensorFlow Lite 模型,下一篇會介紹轉換tflite模型後使用Android手機執行,本篇博文到這裡,期待下一篇博文吧!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論