目录
► 前言
前一篇博客“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版本以上)
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 作为预训练权重进行训练,如下图所示。
将下载档案移至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训练参数配置
- num_classes:训练模型目标检测类别数量
- decay_steps:每训练decay_steps降低学习率一次
- fine_tune_checkpoint: 载入预训练模型路径
- from_detection_checkpoint: true类别载入加载detection模型参数中FeatureExtractor部分,flase只载入classification模型参数
- num_steps: 20000 总迭代次数
- input_path: 读取tfrecord档案路径
- label_map_path: 读取pbtxt文件路径
- 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手机执行,本篇博客到这裡,期待下一篇博客吧!