可随意转载

前言

对于Java工程师来说我们只需要了解本系列教程前面讲到的各种概念,不需要去精通它。我们可以使用PaddleHub在线做可行性验证,还可以通过各种飞桨套件快速训练出针对自己业务的模型。本例我们将介绍使用PaddleDetection工具来完成目标检测任务:识别图片中可乐瓶是百事还是可口。

准备数据集

为了做目标检测,我们需要自定义需要检测的图片数据集,比如:做桃子品相目标检测就要准备桃子的数据集;做可乐瓶目标检测,就需要分别准备百事可乐和可口可乐的瓶子照片。

首先,我们要知道目标检测模型常用的几种数据集,比如VOC、ImageNet、COCO。其中:VOC格式数据集包含JPEGImages、Annotations、ImageSets几个基本部分,有了这几个基本部分,我们就可以把它用到目标检测模型上了。

本教程直接用了网友整理好的可乐瓶VOC数据集。如果想自己尝试标注数据、组织voc数据集,可以如下操作:

1.使用LabelImg软件(不支持Mac)标注手机拍摄的图片:

2. 得到LabelImg软件返回的Annotation,它是一个xml格式的文件:

创建voc数据目录并创建3个子文件夹:Annotations、ImageSets、JPEGImages。把xml文件放入Annotation文件夹,把图片放入JPEGImages文件夹,在ImageSets下创建一个Main文件夹,并且在Main文件夹下建立label_list.txt,里面存入标注的标签。label_list.txt的内容为:

PepsiCola
CocaCola

划分好训练集、测试集和验证集,放到ImageSets/Main中,分别取名test.txt, train.txt, val.txt

根据上面三个划分好的集合做一下简单映射,生成类似三个映射文件test.txt, train.txt, val.txt直接放到voc目录下,内容形如:

./JPEGImages/11600.jpg ./Annotations/11600.xml
./JPEGImages/11601.jpg ./Annotations/11601.xml
./JPEGImages/11602.jpg ./Annotations/11602.xml
./JPEGImages/11603.jpg ./Annotations/11603.xml

最终voc目录如图:

安装PaddleDetection工具

在AIStudio上安装PaddleDetection工具,它自带了十几种常用的目标检测算法。

# 获取源码
!git clone https://github.com/PaddlePaddle/PaddleDetection.git
# 安装python依赖
%cd ~/PaddleDetection/
!pip install -r requirements.txt
# 验证安装是否成功
!python ppdet/modeling/tests/test_architectures.py

配置PaddleDetection工具

PaddleDetection/configs/ssd/ssd_mobilenet_v1_voc.yml文件,修改第4行的max_iters为200,因为识别可乐瓶任务很简单,模型相当快就收敛了(mAP);修改第12行的num_classes,3代表两种可乐标签加一个背景。参见:label_list.txt

PaddleDetection/ppdet/data/source/voc.py文件,修改191行的pascalvoc_label()函数内的label_map,修改如下:

labels_map = {
        'PepsiCola': 1,
        'CocaCola': 2
    }

从预训练模型开始训练

配置AIStudio环境

%env PYTHONPATH=/home/aistudio/PaddleDetection

验证环境是否OK

!export PYTHONPATH=`pwd`:$PYTHONPATH
!python ppdet/modeling/tests/test_architectures.py

开始训练

#开始训练
%cd /home/aistudio/PaddleDetection/
!python -u tools/train.py -c configs/ssd/ssd_mobilenet_v1_voc.yml --use_vdl=True --eval

其中使用了飞桨的预训练模型ssd_mobilenet_v1_voc, 它的意思是采用了ssd算法,用了mobilenet_v1作为骨干网络,使用了voc原始数据集做的训练。引入了上述预训练模型,免除了程序开发者去深入了解深度学习的大量工作。

env: PYTHONPATH=/home/aistudio/PaddleDetection
/home/aistudio/PaddleDetection
2020-09-17 12:28:30,226-INFO: If regularizer of a Parameter has been set by 'fluid.ParamAttr' or 'fluid.WeightNormParamAttr' already. The Regularization[L2Decay, regularization_coeff=0.000050] in Optimizer will not take effect, and it will only be applied to other Parameters!
2020-09-17 12:28:30,915-INFO: places would be ommited when DataLoader is not iterable
W0917 12:28:30.948632   105 device_context.cc:252] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0
W0917 12:28:30.954051   105 device_context.cc:260] device: 0, cuDNN Version: 7.6.
2020-09-17 12:28:34,048-INFO: Downloading ssd_mobilenet_v1_coco_pretrained.tar from https://paddlemodels.bj.bcebos.com/object_detection/ssd_mobilenet_v1_coco_pretrained.tar
100%|██████████████████████████████████| 21490/21490 [00:00<00:00, 50111.63KB/s]
2020-09-17 12:28:34,627-INFO: Decompressing /home/aistudio/.cache/paddle/weights/ssd_mobilenet_v1_coco_pretrained.tar...
2020-09-17 12:28:34,674-WARNING: /home/aistudio/.cache/paddle/weights/ssd_mobilenet_v1_coco_pretrained.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]
2020-09-17 12:28:40,280-INFO: places would be ommited when DataLoader is not iterable
2020-09-17 12:28:50,201-INFO: iter: 0, lr: 0.001000, 'loss': '30.804838', time: 0.053, eta: 0:07:04
2020-09-17 12:29:12,697-INFO: iter: 20, lr: 0.001000, 'loss': '5.446088', time: 0.200, eta: 0:26:32
2020-09-17 12:29:38,998-INFO: iter: 40, lr: 0.001000, 'loss': '4.533237', time: 0.140, eta: 0:18:36
2020-09-17 12:30:08,996-INFO: iter: 60, lr: 0.001000, 'loss': '3.748823', time: 5.162, eta: 11:23:06
2020-09-17 12:30:33,242-INFO: iter: 80, lr: 0.001000, 'loss': '3.071537', time: 0.100, eta: 0:13:14

日志可以看到训练时下载了预训练模型。经过几分钟的GPU训练,我们就可以得到基于上述自定义可乐瓶数据的目标检测模型了。速度非常非常快!

导出为推理模型

#转化为预测模型
!python -u tools/export_model.py -c configs/ssd/ssd_mobilenet_v1_voc.yml --output_dir=./inference_model_final

导出后的infer模型如下图:

分别是:模型文件__model__、参数文件__params__、还有一个配置文件。

可视化模型

__model__文件中保存了本例的神经网络结构,如图:

本例中的神经网络模型结构

opt优化

模型想要部署到移动设备上,还需要进行优化。我们先从这个网址下载opt模型自动优化工具。将opt可执行文件上传到/home/aistudio/PaddleDetection/inference_model_final/ssd_mobilenet_v1_voc目录下,执行下面命令:

#进入预测模型文件夹
%cd /home/aistudio/PaddleDetection/inference_model_final/ssd_mobilenet_v1_voc
!chmod +x opt
#使用opt进行模型转化,将__model__和__params__转化为model.nb
!./opt --model_file=__model__ --param_file=__params__ --optimize_out_type=naive_buffer --valid_targets=arm --optimize_out=./cola_opt
!ls

–model_file指定了模型文件;–param_file指定了参数文件;–optimize_out_type指定了优化后的模型类型; –valid_targets制定了优化平台; –optimize_out指定了输出文件名。最终得到目标模型文件:cola_opt.nb。

也可以下载对应操作系统版本的opt工具,在本机生成优化模型(无需安装其他软件)。注意opt的版本号。

另外,亲测在mac上编译opt工具会失败。建议直接下载opt优化或者在AiStudio上直接优化。

示例源代码

源码地址

因为文件数超过1000个,AIStudio无法公开。