本文将介绍如何使用RetinaFace训练模型进行使用
代码下载就去github官方https://github.com/biubug6/Pytorch_Retinaface
-- 环境搭建
打开Anaconda Prompt 执行下面代码:
1.创建环境:
conda create -n retinaface python=3.7
2.切换到创建的RetinaFace环境下
conda activate retinaface
-- 下载依赖
pip install -r requirements.txt
1.环境依赖
- torch==1.9.0+cu111
- tensorflow-gpu==2.4.0
- torchvision==0.10.0+cu111
- yacs==0.1.8
- PyYAML==5.4.1
- numpy==1.19.5
- tensorboardX==2.4
- tqdm==4.62.3
- Pillow==8.3.2
- onnx==1.10.1
- onnx-simplifier==0.3.6
- onnxoptimizer==0.2.6
- onnxruntime==1.9.0
- opencv-contrib-python==4.5.1.48
- opencv-python==4.5.2.54
- pandas==1.3.0
- Pillow==8.3.1
- pycuda==2021.1
- scikit-learn==0.24.2
- scipy==1.7.0
- tensorrt==7.2.2.3
2.下载torch
pip install torch==1.8.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
这里下载torch如果太慢的话可以自行去加源https://developer.aliyun.com/packageSearch?word=torch
接下来是要去下载数据集,我们这里使用官方的数据WIDERFACEhttp://shuoyang1213.me/WIDERFACE/WiderFace_Results.html
这里还需要下载注释https://pan.baidu.com/s/1Laby0EctfuJGgGMgRRgykA
数据集结构:
./data/widerface/
train/
images/
label.txt
val/
images/
wider_val.txt
将数据集放在制定的目录下之后开始我们去下载预训练模型这是官网提供的https://pan.baidu.com/s/12h97Fy1RYuqMMIV-RpzdPg#list/path=%2F提取码fstq
在TensorRT下载适合版本的包,本项目中适用版本为7.2.2.3https://developer.nvidia.com/nvidia-tensorrt-download
```bash
sudo chmod 777 TensorRT-7.2.2.3.Ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz
sudo tar -zxvf TensorRT-7.2.2.3.Ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz
cd TensorRT-7.2.2.3
cd python
pip install tensorrt-7.2.2.3-cp38-none-linux_x86_64.whl # 根据自身python选择对应的离线安装包
cd ..
cd graphsurgeon
pip install graphsurgeon-0.4.5-py2.py3-none-any.whl
cd ..
cd uff
pip install uff-0.6.9-py2.py3-none-any.whl
sudo vim ~/.bashrc
# 将如下两条命追加到~/.bashrc中,根据自身实际更换TensorRT安装包的路径
export TENSORRT_ROOT=/hy-tmp/TensorRT-7.2.2.3
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/hy-tmp/TensorRT-7.2.2.3/lib
source ~/.bashrc
# Retinaface
目前仅支持WiderFace数据集格式的数据集,待后续有时间再进行适配各种格式的数据集。
1.1模型训练
目前RetinaFace支持的backbone如下:
- <input checked="" disabled="" type="checkbox"> mobilenet-v1
- <input disabled="" type="checkbox"> inception-resnetv1
- <input checked="" disabled="" type="checkbox"> resnet
- <input disabled="" type="checkbox"> ...
```
训练:
python ./tools/train/train.py --network resnet18 --num_workers 8 --batch_size 32 --save_folder ./weights/resnet18/batch_size=32
如果想批量训练多个模型,根据开发设置多个不同的模型配置文件。然后将命令写入trian_retinaface.sh文件中,然后如下命令进行批量训练:
bash train_retinaface.sh
1.2模型评估:
RetinaFace的模型评估主要包括精度和FPS两项指标,运行如下命令进行评估RetinaFace:
##生成.txt文件:
python test_widerface.py --trained_model weight_file --network mobile0.25 或 resnet50
##在评估之前:
python3 setup.py build_ext --inplace
##评估,这里要写自己预测的模型和groud truth 的路径:
python3 evaluation.py -p <your prediction dir> -g <groud truth dir>
#不同的Retinaface的模型性能评估如下:
| Model | easy | medium | hard |
| Resnet50 | 94.68 % | 93.20% | 82.56% |
| Resnet18 | 94.00 % | 91.24% | 78.05% |
1.3模型部署
##Pytorch --> TensorRT
首先将Pytorch模型转成ONNX模型,以batchsize=1的Retinaface模型进行举例,这里是我自己的路径,大家可以看着改一下自己的模型路径:
python ./convert_to_onnx.py --trained_model /hy-tmp/RetinaFace/Pytorch_Retinaface-master/model_data/model_weight/resnet50.pth --network resnet50 --output_onnx /hy-tmp/RetinaFace/Pytorch_Retinaface-master/model_data/model_weight/resnet50/batch_size=1/resnet50.onnx --batch_size 1
###若想批量生成不同batchsize的onnx模型,根据自身开发需求讲不同的命令写入convert_to_onnx.sh 文件后,进行批量转换:
bash convert_to_onnx.sh
接着将转换好的ONNX模型换成为TensorRT模型,以batchsize=1,fp=32的RetinaFace模型进行举例,这里的路径照着自己的路径改:
python ./onnx2tensorrt.py --onnx_model_path ./model_data/model_weight/resnet18/batch_size=1/resnet18.onnx --tensorrt_model_path ./model_data/model_weight/retinaface/tensorrt/resnet18_batchsize=1_fp32.trt --mode fp32 --batchsize 1 --channel 3 --height 640 --width 640
与ONNX模型转换类似,根据自身开发需要将不同的转换命令写入onnx2tensorrt.sh文件后,进行批量转换:
bash onnx2tensorrt.sh
接着测试转换TensorRT模型的性能,以Resnet18,batchsize=1,fp=32为例,这里同样需要改成自己的路径:
python ./eval_retinaface_tensorrt.py --tensorrt_model_path ./model_data/model_weight/retinaface/tensorrt/resnet18_batchsize=1_fp32.trt --dataset_dir ./model_data/data/widerface/train/images --pairs_txt_path ./model_data/data/widerface/train/label.txt --result_txt_path ./tools/deploy/tensorRT/python/results/resnet18/batchsize=1_fp32.txt
##批量测试
bash eval_retinaface_tensorrt.sh
接下来进行性能评估:
###Resnet50
转换成TensorRT模型后,Resnet50在RTX3090上的性能对比表如下:
| batchsize | 输入分辨率 |模型计算精度|模型体积(M) |FPS|
|:--------:|:--------:|:--------:| :------------|:-------------:|
|1 |640*640 |FP16 | 54.26 | 329.49 |
|1 |640*640 |FP32 | 106.45 | 142.34 |
|2 |640*640 |FP16 | 54.22 | 331.05 |
|2 |640*640 |FP32 | 106.44 | 143.40 |
|4 |640*640 |FP16 | 54.21 | 317.03 |
|4 |640*640 |FP32 | 106.46 | 139.59 |
|8 |640*640 |FP16 | 54.19 | 331.14 |
|8 |640*640 |FP32 | 106.45 | 139.74 |
|16 |640*640 |FP16 | 54.36 | 275.40 |
|16 |640*640 |FP32 | 106.46 | 138.52 |
|32 |640*640 |FP16 | 54.19 | 159.11 |
|32 |640*640 |FP32 | 106.45 | 138.93 |
|64 |640*640 |FP16 | 54.28 | 319.81 |
|64 |640*640 |FP32 | 106.46 | 72.89 |
|128 |640*640 |FP16 | 54.52 | 323.56 |
|128 |640*640 |FP32 | 106.45 | 138.81 |
###Resnet18
转换成TensorRT模型后,Resnet18在RTX3090上的性能对比表如下:
| batchsize | 输入分辨率 |模型计算精度|模型体积(M) |FPS|
|:--------:|:--------:|:--------:| :------------|:-------------:|
|1 |640*640 |FP16 | 29.05 | 482.41 |
|1 |640*640 |FP32 | 55.72 | 235.63 |
|2 |640*640 |FP16 | 29.11 | 451.06 |
|2 |640*640 |FP32 | 55.72 | 234.44 |
|4 |640*640 |FP16 | 28.99 | 482.57 |
|4 |640*640 |FP32 | 55.73 | 234.72 |
|8 |640*640 |FP16 | 28.95 | 455.68 |
|8 |640*640 |FP32 | 55.73 | 228.64 |
|16 |640*640 |FP16 | 29.06 | 455.47 |
|16 |640*640 |FP32 | 55.73 | 229.65 |
|32 |640*640 |FP16 | 29.00 | 461.96 |
|32 |640*640 |FP32 | 55.74 | 234.30 |
|64 |640*640 |FP16 | 28.99 | 467.48 |
|64 |640*640 |FP32 | 55.73 | 227.31 |
|128 |640*640 |FP16 | 29.03 | 485.27 |
|128 |640*640 |FP32 | 55.73 | 235.36 |
本人是深度学习小白,如果有问题还恳请大神们多多指正!!!
版权归原作者 韩韩的饲养员 所有, 如有侵权,请联系我们删除。