1.项目说明
近年来,电瓶车进楼入户发生的火灾事故屡见不鲜,针对该现象推出了相应的电瓶车入室检测模型,旨在从源头减少这一情况的发生。
针对室内摩托车模型可能会发生的误报情况,采用了额外的图像检索方式实现更为精确的识别。
本案例使用了飞桨目标检测套件PaddleDetection中的picodet模型以及图像识别套件PaddleClas中的轻量级通用识别模型。
2.数据集准备
本案例中picodet的模型数据集为VOC格式(使用labelimg制成),包括21903张电梯中的图片,其中训练集17522张,测试集4381张,皆来自日常的电梯场景中,共有14715个摩托车的框,23058个人的框,3750个自行车的框,由于picodet使用的是coco格式,所以需要将VOC格式转换成coco格式。
生成VOC数据集:使用python的labelimg图像标注工具为原始图片生成对应的标注xml文件作为原始的VOC格式数据集,生成的xml文件格式如下图所示,其中每个object代表框出的每一个对象,object中的name表明对象的名字而bndbox中包含框的具体坐标(左上角以及右下角)。
labelimg生成的xml文件如下图所示:
生成VOC数据集:
完成图片标注后,下一步就是生成数据集,将每个图片与其xml对应起来按比例生成对应的训练集以及测试集.%cd /home/aistudio/data/data128282
!unzip -q picodet_motorcycle.zip生成的数据集文件组织结构为:
├── classify_voc.py ├── picodet_motorcycle │ ├── Annotations │ │ ├── 1595214506200933-1604535322-[]-motorcycle.xml │ │ ├── 1595214506200933-1604542813-[]-motorcycle.xml │ │ ├── 1595214506200933-1604559538-[]-motorcycle.xml | ... │ ├── ImageSets │ │ └── Main │ │ ├── test.txt │ │ ├── train.txt │ │ ├── trainval.txt │ │ └── val.txt │ └── JPEGImages │ ├── 1595214506200933-1604535322-[]-motorcycle.jpg │ ├── 1595214506200933-1604542813-[]-motorcycle.jpg │ ├── 1595214506200933-1604559538-[]-motorcycle.jpg │ | ... ├── picodet_motorcycle.zip ├── prepare_voc_data.py ├── test.txt └── trainval.txt
训练集与测试集转换:
使用PaddleDetection自带的转换工具以及教程完成数据集的转换。%cd /home/aistudio/work/code
!python x2coco.py --dataset_type voc --voc_anno_dir
/home/aistudio/data/data128282/ --voc_anno_list
/home/aistudio/data/data128282/trainval.txt --voc_label_list
/home/aistudio/data/data128282/label_list.txt --voc_out_name
voc_train.json
!python x2coco.py --dataset_type voc --voc_anno_dir
/home/aistudio/data/data128282/ --voc_anno_list
/home/aistudio/data/data128282/test.txt --voc_label_list
/home/aistudio/data/data128282/label_list.txt --voc_out_name
voc_test.json
%mv voc_test.json /home/aistudio/data/data128282/
%mv voc_train.json /home/aistudio/data/data128282/3.目标检测模型训练
将数据集划分为训练集以及测试集后,使用picodet_lcnet_1_5x_416_coco.yml文件便可以开始训练(该文件在PaddleDetection-release-2.3/configs/picodet/more_config/ 下有样板只需要稍微修改一下)。
预训练模型选用PicoDet_LCNet 1.5x,训练完成后可以进行评估,训练与评估的命令如下。
picodet_lcnet_1_5x_416_coco.yml 文件的内容如下所示:
使用的预训练模型如图:
#安装依赖库
%cd /home/aistudio/work/code/train/
!pip install pycocotools
!pip install faiss-gpu
!pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple #训练模型,完成后生成在output文件夹下
%cd /home/aistudio/work/code/train/
!python3 train.py -c picodet_lcnet_1_5x_416_coco.yml -o
pretrain_weights=https://paddledet.bj.bcebos.com/models/picodet_lcnet_1_5x_416_coco.pdparams
--eval#评估模型
%cd /home/aistudio/work/code/train/
!python3 eval.py -c picodet_lcnet_1_5x_416_coco.yml#如果需要额外导出serving模型,即导出模型时–export_serving_model=true,那么还需要安装paddle_serving的相关包
!pip install paddle-serving-app0.6.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install paddle-serving-client0.6.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install paddle-serving-server-gpu==0.6.3.post102 -i https://pypi.tuna.tsinghua.edu.cn/simple#导出模型
%cd /home/aistudio/work/code/train/
!python export_model.py --export_serving_model=true -c
picodet_lcnet_1_5x_416_coco.yml
--output_dir=./output_inference/导出后会生成serving_server和serving_client文件夹,使用对应的py文件(文件中完成前置处理以及后置处理功能)以及配置文件完成主体检测模型的部署。
上述内容就是使用coco数据集训练一个picodet模型的完整流程。
部署方式可以如图:
部署的config.yml文件内容如图所示
部署的web_service.py文件内容如图所示
%cd /home/aistudio/work/code/train/output_inference/picodet_lcnet_1_5x_416_coco/
%mv serving_server/ /home/aistudio/work/code/picodet_lcnet_1_5x_416_coco/
%mv serving_client/ /home/aistudio/work/code/picodet_lcnet_1_5x_416_coco/#模型部署
%cd /home/aistudio/work/code/picodet_lcnet_1_5x_416_coco/
!python3 web_service.py#请求测试
%cd /home/aistudio/work/code/picodet_lcnet_1_5x_416_coco/
!python3 pipeline_http_client.py由于本流程只是教程,因此模型训练只使用了极少部分的数据集以及训练轮次,因此请求不会有任何结果,在实际使用过程中需要大量的数据集和训练时间,其模型请求结果如下。
图像检索库生成与部署
在目标检测模型部署完毕后电瓶车入室检测的功能便可投入使用,但为了提高整体的准确度减少误报则还需要一个额外的检索方式。这里采用了PaddleClas下图像识别中的轻量级通用识别模型general_PPLCNet_x2_5_lite_v1.0_infer,首先根据已有图片集生成格式与下图格式相同的txt的文件,随后在PaddleClas的deploy文件夹下输入命令即可用数据集生成相应的索引库,其中IndexProcess.data_file是下图txt文件的名字,IndexProcess.index_dir是生成
索引库的名字,具体可以查看PaddleClas图像识别快速开始的建立新的索引库部分。(注意,确保build_general.yaml中rec_inference_model_dir路径的模型存在)#下载模型并转换为serving模型
%cd /home/aistudio/work/code/
!wget -P models/
https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.tar
%cd models
!tar -xf general_PPLCNet_x2_5_lite_v1.0_infer.tar
!python3 -m paddle_serving_client.convert --dirname
./general_PPLCNet_x2_5_lite_v1.0_infer/ --model_filename
inference.pdmodel --params_filename inference.pdiparams
--serving_server ./general_PPLCNet_x2_5_lite_v1.0_serving/
--serving_client ./general_PPLCNet_x2_5_lite_v1.0_client/
%cp -r ./general_PPLCNet_x2_5_lite_v1.0_serving …/general_PPLCNet_x2_5_lite_v1.0/%cd /home/aistudio/data/data128448/
!unzip -q index_motorcycle.zip #解压数据集%cd /home/aistudio/work/code/
!python make_label.py #数据集分类
!python python/build_gallery.py -c build_gallery/build_general.yaml -o
IndexProcess.data_file="./index_label.txt" -o
IndexProcess.index_dir=“index_result” #生成检索库索引库生成完成后接下来便是的部署,这里我们用到的模型general_PPLCNet_x2_5_lite_v1.0_infer
,使用paddleClas
中的两个文件便可以部署.
但由于我们只使用了其中的图像检索功能,因此需要将recognization_web_service.py的部分代码进行修改,原始文件在飞桨的github上(https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/deploy/paddleserving/recognition/recognition_web_service.py),用于部署图像检索服务的文件在/home/aistudio/work/code/general_PPLCNet_x2_5_lite_v1.0/
文件夹下。
修改后的recognization_web_service.py代码如下:
config_onlyrec.yml的内容如下:
%cd /home/aistudio/work/code/
%mv index_result/ general_PPLCNet_x2_5_lite_v1.0/%cd /home/aistudio/work/code/general_PPLCNet_x2_5_lite_v1.0/
!python recognition_web_service_onlyrec.py #启动服务%cd /home/aistudio/work/code/general_PPLCNet_x2_5_lite_v1.0/
!python pipeline_http_client.py #请求测试由于使用的原图片请求,因此返回的置信度为1.0,在实际使用场景中同样也有着较高的置信度,结果如图所示。
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.