环境搭建
由于3080现在还买不到,暂时用Amazon EC2来训练模型,以至于怎么搭建P2实例环境,这里参考这两篇帖子,说的很详细,不过有几点注意一下
https://zhuanlan.zhihu.com/p/25066187
https://zhuanlan.zhihu.com/p/33176260
实例类型
创建ubuntu16的深度学习的基础实例,只安装了显卡驱动和python
生成密钥
如果你要用ssh连接,就生成pem的文件,之后用xshell来远程登陆
登陆
使用pem登陆,默认用户名是ubuntu
添加用户
首先允许root登陆,参考这篇帖子允许root登陆,说的很详细。
然后添加一个自己的用户 https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/managing-users.html#create-user-account
安装 Anaconda3
安装 anaconda
为了不搞乱环境,这里我们使用conda虚拟环境,很方便
操作虚拟环境命令
# 创建虚拟环境:
conda create -n env3.6 python=3.6
# 激活虚拟环境:
source activate env3.6
#退出虚拟环境:
source deactivate
# 查看所有虚拟环境:
conda info -e
# 删除虚拟环境:
conda remove -n your_env_name(虚拟环境名称) --all
安装tensorflow2
在虚拟环境中进行安装
# 国外服务器
pip install tensorflow
# 国内服务器
pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorflow 或者 -i https://pypi.tuna.tsinghua.edu.cn/simple
更改protoc版本
在接下来搭建环境的时候会出现Expected “required”, “optional”, or “repeated”.的错误,为了避免,我们先解决这个问题,我们把protoc提高到3.3
安装protoc
# 下载
wget wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip
# 解压
unzip protoc-3.3.0-linux-x86_64.zip
# 替换
sudo cp bin/protoc /usr/bin/protoc
# 查看版本号
protoc --version
安装opencv
如果是国内主机执行如下命令
pip install --index https://pypi.tuna.tsinghua.edu.cn/simple opencv-python==3.4.2.16
pip install --index https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python==3.4.2.16
如果是亚马逊的服务器执行一下命令
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
安装tensorflow目标检测
这里我们先使用tensorflow的目标检测框架来做一下实验,在这个框架里面支持的都是比较老的目标检测算法,比如rcnn,ssd等,没有支持yolo,retinanet网络,在检测小目标的时候yolov3以上版本和retinanet要好的多。之后的人间检测我们会retinanet和yolo分别实现,之后我们可以参考tensorflow目标检测框架里面的数据打包,和训练的一些代码
以后的操纵都是在我们之前创建的虚拟环境中做的
# 克隆项目到本地
git clone https://github.com/tensorflow/models.git
cd models/research
# Compile protos.
protoc object_detection/protos/*.proto --python_out=.
# Install TensorFlow Object Detection API.
cp object_detection/packages/tf2/setup.py .
python -m pip install --use-feature=2020-resolver .
# Test the installation.
python object_detection/builders/model_builder_tf2_test.py
如果出现如下内容就表明环境搭建成功
Ran 20 tests in 58.297s
简单了解一下目标检测的框架
- 1.数据打包工具:/models/research/object_detection/dataset_tools 下的文件为将voc数据打包成可训练数据,我们可以根据其中的 create_pascal_tf_record.py 来修改成我们需要的
- 2.label map 文件:/models/research/object_detection/data 下的文件为各种label map的文件,我们用到face_label_map.pbtxt
- 3.训练网络结构文件:/models/research/object_detection/model_main.py 为训练数据时候搭建网络结构的文件,这个文件不用修改
- 4.网络配置文件:/models/research/object_detection/samples/configs/ssd_resnet50_v1_fpn_shared_box_predictor_640x640_coco14_sync.config 为网络的配置文件,我们根据 进行修改
- 5.搭建网络文件:/models/research/object_detection/model_lib.py 搭建具体的网络
- 6.网络核心代码://models/research/object_detection/builders/model_builder.py 搭建网络的核心代码 build函数,这里需要注意,tf1和tf2支持的模型是不一样的,这里我们用的模型是ssd_resnet50_v1_fpn_keras,这个在修改4网络配置文件的时候用到
- 7.生成pb文件:/models/research/object_detection/export_inference_grapy.h
- 8.测试模型:
训练前的准备
将widerface数据生成voc数据代码
我的数据集和目录/home/wxf/work/dataset/widerface
目录结构如下
代码如下
代码地址generate_voc.py
数据打包
在/models/research/object_detection/dataset_tools目录下创建
create_face_tf_record.py
命令格式
# 数据打包命令
# train
python object_detection/dataset_tools/create_face_tf_record.py \
--data_dir=/home/wxf/work/dataset \
--year=widerface \
--set=train \
--output_path=/home/wxf/work/dataset/widerface/TF_data/train.record
# val
python object_detection/dataset_tools/create_face_tf_record.py \
--data_dir=/home/wxf/work/dataset \
--year=widerface \
--set=val \
--output_path=/home/wxf/work/dataset/widerface/TF_data/val.record
配置文件修改
下载预训练模型
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md
中的下面的与训练模型
SSD ResNet50 V1 FPN 640x640 (RetinaNet50)
/home/wxf/work/face_identify/models/research/object_detection/configs/tf2/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8-face.config
我们在/home/wxf/work/face_identify/models/research/object_detection/configs/tf2/目录下参考ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.config 创建ssd_resnet50_v1_fpn_640x640_coco17_tpu-8-face.config
根据注释修改自己的参数
训练命令 注意:tf2要用model_main_tf2.py
在/home/wxf/work/dataset/widerface/ 下创建resnet50v1-fpn目录
# 训练命令
python object_detection/model_main_tf2.py \
--pipeline_config_path=/home/wxf/work/face_identify/models/research/object_detection/configs/tf2/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8-face.config \
--model_dir=/home/wxf/work/dataset/widerface/resnet50v1-fpn \
--num_train_steps=1000 \
--alsologtostder
# evaluation
python object_detection/model_main_tf2.py \
--pipeline_config_path=/home/wxf/work/face_identify/models/research/object_detection/configs/tf2/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8-face.config \
--model_dir=/home/wxf/work/dataset/widerface/resnet50v1-fpn \
--checkpoint_dir=/home/wxf/work/dataset/widerface/resnet50v1-fpn \
--alsologtostderr
python object_detection/exporter_main_v2.py \
--input_type=image_tensor \
--pipeline_config_path=/home/wxf/work/face_identify/models/research/object_detection/configs/tf2/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8-face.config \
--trained_checkpoint_dir=/home/wxf/work/dataset/widerface/resnet50v1-fpn/ \
--output_directory=/home/wxf/work/dataset/widerface/resnet50v1-fpn/pb
# 生成pb文件
python object_detection/exporter_main_v2.py \
--input_type=image_tensor \
--pipeline_config_path=/home/wxf/work/face_identify/models/research/object_detection/configs/tf2/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8-face.config \
--trained_checkpoint_dir=/home/wxf/work/dataset/widerface/resnet50v1-fpn/ \
--output_directory=/home/wxf/work/dataset/widerface/resnet50v1-fpn/pb