博客
关于我
深度学习——基于飞桨(PaddlePaddle)目标识别自己数据项目(2)
阅读量:390 次
发布时间:2019-03-04

本文共 11733 字,大约阅读时间需要 39 分钟。

摘要

本文主要介绍的是的有关于的百度飞桨的目标的检测的算法的实战案例。通过使用的百度飞桨来实现的对自己目标进行识别的。后面本人将继续深入原理来对的目标的检测的原理和算法和系统的来实现讲解。基于飞桨(PaddlePaddle)最大的优点就是的不需要想TensorFlow的版本一样复杂。配置简单。其次是的这个系统的的运行的操作也是简单的。同时兼容window10和Ubuntu系统。本文就昆虫的识别来认识一下飞桨(PaddlePaddle)的相关的操作。并同时将可以借鉴这样的一个思想。来完成的其他目标的识别和跟踪检测。

1 飞桨(Paddle)的环境安装

安装PaddlePaddle——GPU

环境需求:

  • OS 64位操作系统
  • Python2 >= 2.7.15 or Python 3(3.5.1+/3.6/3.7),64位版本
  • pip/pip3(9.0.1+),64位版本操作系统是
  • CUDA >= 9.0
  • cuDNN >= 7.6

如果需要 GPU 多卡训练,请先安装NCCL(Windows暂不支持nccl)。

PaddleDetection 依赖 PaddlePaddle 版本关系:

PaddleDetection版本 PaddlePaddle版本 备注
v0.3 >=1.7 --
v0.4 >= 1.8.4 PP-YOLO依赖1.8.4
v0.5 >= 1.8.4 大部分模型>=1.8.4即可运行,Cascade R-CNN系列模型与SOLOv2依赖2.0.0.rc版本
# install paddlepaddlepython -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple# 如果您的机器安装的是CUDA9,请运行以下命令安装python -m pip install paddlepaddle-gpu==1.8.4.post97 -i https://mirror.baidu.com/pypi/simple如果您的机器安装的是CUDA10,请运行以下命令安装python -m pip install paddlepaddle-gpu==1.8.4.post107 -i https://mirror.baidu.com/pypi/simple如果您的机器是CPU,请运行以下命令安装python -m pip install paddlepaddle==1.8.4 -i https://mirror.baidu.com/pypi/simple

请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。

# 在您的Python解释器中确认PaddlePaddle安装成功>>> import paddle.fluid as fluid>>> fluid.install_check.run_check()# 确认PaddlePaddle版本python -c "import paddle; print(paddle.__version__)"

其他依赖安装

:

运行需要COCO-API,安装方式如下:# 安装pycocotoolspip install pycocotools

windows用户安装COCO-API方式:

1 注意如果是的winodw下安装时候是出现的安装错误 是应为缺少安装的 .Windows下没有c/c++代码编译环境

解决办法:下载visualcppbuildtools_full.exe来安装 安装成功以后就会在开始菜单里找到visual C++ 2015 x64 Native Build Tools Command 如果暂时找不到就重启一下。

2.没有cython:解决办法:用anaconda下载就可以了

3.没有git: 解决办法:下载并按照指定步骤安装就可以

# 若Cython未安装,请安装Cythonpip install Cython# 由于原版cocoapi不支持windows,采用第三方实现版本,该版本仅支持Python3pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

 

2 飞桨(Paddle)代码的下载

克隆PaddleDetection库:

安装Python依赖库:Python依赖库在requirements.txt中给出,可通过如下命令安装:pip install -r requirements.txt
您可以通过以下命令克隆PaddleDetection:cd 
git clone https://github.com/PaddlePaddle/PaddleDetection.git
确认测试通过:python ppdet/modeling/tests/test_architectures.py测试通过后会提示如下信息:..........----------------------------------------------------------------------Ran 12 tests in 2.480sOK (skipped=2)

预训练模型预测

使用预训练模型预测图像,快速体验模型预测效果:# use_gpu参数设置是否使用GPUpython tools/infer.py -c configs/ppyolo/ppyolo.yml -o use_gpu=true weights=https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams --infer_img=demo/000000014439.jpg

会在output文件夹下生成一个画有预测结果的同名图像。结果如下图:

../_images/000000014439.jpg

 

3  飞桨(Paddle)下数据集的制作

准备数据

首先要制作voc格式的数据集

import osfile_train = open('trainval.txt', 'w')file_test = open('test.txt', 'w')for xml_name in ##这里的路径填写绝对路径os.listdir(r'D:\computercode\python\PaddleDetection\dataset\insect\Annotations\train'):    file_train.write(xml_name[:-4] + '\n')for xml_name in os.listdir(r'D:\computercode\python\PaddleDetection\dataset\insect\Annotations\val'):    file_test.write(xml_name[:-4] + '\n')file_train.close()file_test.close()

VOC数据集所必须的文件内容如下所示,数据集根目录需有VOCdevkit/VOC2007VOCdevkit/VOC2012文件夹,该文件夹中需有Annotations,JPEGImagesImageSets/Main三个子目录,Annotations存放图片标注的xml文件,JPEGImages存放数据集图片,ImageSets/Main存放训练trainval.txt和测试test.txt列表。

├──VOC2007(或VOC2012)│   ├── Annotations│       ├── xxx.xml│   ├── JPEGImages│       ├── xxx.jpg│   ├── ImageSets│       ├── Main│           ├── trainval.txt│           ├── test.txt

由于该数据集中缺少已标注图片名列表文件trainval.txt和test.txt,所以需要进行生成,利用如下python脚本,在数据集根目录下执行,便可生成trainval.txttest.txt文件:create_file.py

  • 模仿VOC数据集目录结构,新建VOCdevkit文件夹并进入其中,然后继续新建VOC2007文件夹并进入其中,之后新建AnnotationsJPEGImagesImageSets文件夹,最后进入ImageSets文件夹中新建Main文件夹,至此完成VOC数据集目录结构的建立。

  • 将该数据集中的train/annotations/xmlsval/annotations/xmls下的所有xml标注文件拷贝到VOCdevkit/VOC2007/Annotations中,将该数据集中的train/images/val/images/下的所有图片拷贝到VOCdevkit/VOC2007/JPEGImages中,将第一步生成的trainval.txttest.txt文件移动到VOCdevkit/VOC2007/ImageSets/Main中。

  • 最后在数据集根目录下输出最终的trainval.txttest.txt文件:

python dataset/voc/create_list.py -d path/to/dataset

 create_list.py代码如下:

# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##     http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.import sysimport os.path as ospimport loggingimport argparse# add python path of PadleDetection to sys.pathparent_path = osp.abspath(osp.join(__file__, *(['..'] * 3)))if parent_path not in sys.path:    sys.path.append(parent_path)from ppdet.utils.download import create_voc_listlogging.basicConfig(level=logging.INFO)def main(config):    voc_path = config.dataset_dir    create_voc_list(voc_path)if __name__ == '__main__':    parser = argparse.ArgumentParser()    default_voc_path = osp.split(osp.realpath(sys.argv[0]))[0]    parser.add_argument(        "-d",        "--dataset_dir",        default=default_voc_path,        type=str,        help="VOC dataset directory, default is current directory.")    config = parser.parse_args()    main(config)

 

4  飞桨(Paddle)模型选择与可视化训练

选择模型并修改配置文件

由于昆虫比较小,属于小物体检测范畴,我们选择Faster-Rcnn系列模型。如果是其他的类型的物体,需要结合识别的情况俩进行的网络模型的选择与判断。

然后基于configs/faster_rcnn_r50_fpn_1x.yml文件进行修改:

/faster_rcnn_r50_fpn_1x.yml文件如下

architecture: FasterRCNNmax_iters: 10200use_gpu: truesnapshot_iter: 10000log_iter: 20save_dir: outputpretrain_weights: pre_model_data/ResNet50_cos_pretrained.tarmetric: VOCweights: output/faster_rcnn_r50_fpn_1x_new/model_finalnum_classes: 7FasterRCNN:  backbone: ResNet  fpn: FPN  rpn_head: FPNRPNHead  roi_extractor: FPNRoIAlign  bbox_head: BBoxHead  bbox_assigner: BBoxAssignerResNet:  norm_type: bn  norm_decay: 0.  depth: 50  feature_maps: [2, 3, 4, 5]  freeze_at: 2FPN:  min_level: 2  max_level: 6  num_chan: 256  spatial_scale: [0.03125, 0.0625, 0.125, 0.25]FPNRPNHead:  anchor_generator:    anchor_sizes: [32, 64, 128, 256, 512]    aspect_ratios: [0.5, 1.0, 2.0]    variance: [1.0, 1.0, 1.0, 1.0]  anchor_start_size: 32  min_level: 2  max_level: 6  num_chan: 256  rpn_target_assign:    rpn_batch_size_per_im: 256    rpn_fg_fraction: 0.5    rpn_positive_overlap: 0.7    rpn_negative_overlap: 0.3    rpn_straddle_thresh: 0.0  train_proposal:    min_size: 0.0    nms_thresh: 0.7    pre_nms_top_n: 2000    post_nms_top_n: 2000  test_proposal:    min_size: 0.0    nms_thresh: 0.7    pre_nms_top_n: 1000    post_nms_top_n: 1000FPNRoIAlign:  canconical_level: 4  canonical_size: 224  min_level: 2  max_level: 5  box_resolution: 7  sampling_ratio: 2BBoxAssigner:  batch_size_per_im: 512  bbox_reg_weights: [0.1, 0.1, 0.2, 0.2]  bg_thresh_lo: 0.0  bg_thresh_hi: 0.5  fg_fraction: 0.25  fg_thresh: 0.5BBoxHead:  head: TwoFCHead  nms:    keep_top_k: 100    nms_threshold: 0.5    score_threshold: 0.05TwoFCHead:  mlp_dim: 1024LearningRate:  base_lr: 0.0025  schedulers:  - !PiecewiseDecay    gamma: 0.1    milestones: [6800, 9000]  - !LinearWarmup    start_factor: 0.1    steps: 1000OptimizerBuilder:  optimizer:    momentum: 0.9    type: Momentum  regularizer:    factor: 0.0001    type: L2_READER_: 'faster_fpn_reader_new.yml'

 _READER_: 'faster_fpn_reader_new.yml'文件

注意修改的地方,一定要不能修改原来的格式。

TrainReader:  inputs_def:    fields: ['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_crowd']  dataset:    !VOCDataSet    dataset_dir: dataset/voc    anno_path: trainval.txt    use_default_label: false  sample_transforms:  - !DecodeImage    to_rgb: true  - !RandomFlipImage    prob: 0.5  - !NormalizeImage    is_channel_first: false    is_scale: true    mean: [0.485,0.456,0.406]    std: [0.229, 0.224,0.225]  - !ResizeImage    target_size: 800    max_size: 1333    interp: 1    use_cv2: true  - !Permute    to_bgr: false    channel_first: true  batch_transforms:  - !PadBatch    pad_to_stride: 32    use_padded_im_info: false  batch_size: 2  shuffle: true  worker_num: 2  use_process: falseEvalReader:  inputs_def:    fields: ['image', 'im_info', 'im_id',  'im_shape', 'gt_bbox', 'gt_class', 'is_difficult']  dataset:    !VOCDataSet    dataset_dir: dataset/voc    anno_path: test.txt    use_default_label: false  sample_transforms:  - !DecodeImage    to_rgb: true    with_mixup: false  - !NormalizeImage    is_channel_first: false    is_scale: true    mean: [0.485,0.456,0.406]    std: [0.229, 0.224,0.225]  - !ResizeImage    interp: 1    max_size: 1333    target_size: 800    use_cv2: true  - !Permute    channel_first: true    to_bgr: false  batch_transforms:  - !PadBatch    pad_to_stride: 32    use_padded_im_info: true  batch_size: 1  shuffle: false  drop_empty: false  worker_num: 2TestReader:  inputs_def:    # set image_shape if needed    fields: ['image', 'im_info', 'im_id', 'im_shape']  dataset:    !ImageFolder    anno_path: dataset/roadsign_voc/label_list.txt    use_default_label: false  sample_transforms:  - !DecodeImage    to_rgb: true    with_mixup: false  - !NormalizeImage    is_channel_first: false    is_scale: true    mean: [0.485,0.456,0.406]    std: [0.229, 0.224,0.225]  - !ResizeImage    interp: 1    max_size: 1333    target_size: 800    use_cv2: true  - !Permute    channel_first: true    to_bgr: false  batch_transforms:  - !PadBatch    pad_to_stride: 32    use_padded_im_info: true  batch_size: 1  shuffle: false
  • 修改Reader模块:为了方便模型评估需要将metric改为VOC;Reader部分已经在faster_fpn_reader.yml中定义完成,此处将要修改的内容覆写即可,如下yaml配置所示:

...metric: VOC..._READER_: 'faster_fpn_reader.yml'TrainReader:  dataset:    !VOCDataSet    dataset_dir: path/to/dataset    anno_path: trainval.txt    use_default_label: false  batch_size: 2EvalReader:  inputs_def:    fields: ['image', 'im_info', 'im_id',  'im_shape', 'gt_bbox', 'gt_class', 'is_difficult']  dataset:    !VOCDataSet    dataset_dir: path/to/dataset    anno_path: test.txt    use_default_label: falseTestReader:  dataset:    !ImageFolder    anno_path: path/to/dataset/label_list.txt    use_default_label: false
  • 修改训练轮数与学习率等参数:

根据训练集数量与总batch_size大小计算epoch数,然后将epoch数换算得到训练总轮数max_itersmilestones(学习率变化界限)也是同理。原配置文件中总batch_size=2*8=16(8卡训练),训练集数量约为12万张,max_iters=90000,所以epoch数=16x90000/120000=12。在AI识虫数据集中,训练集数量约为1700,在单卡GPU上训练,max_iters=12x1700/2=10200。同理计算milestones为: [6800, 9000]。

  • 学习率与GPU数量呈线性变换关系,如果GPU数量减半,那么学习率也将减半。由于PaddleDetection中的faster_rcnn_r50_fpn模型是在8卡GPU环境下训练得到的,所以我们要将学习率除以8:
max_iters: 10200...LearningRate:base_lr: 0.0025schedulers:- !PiecewiseDecay  gamma: 0.1  milestones: [6800, 9000]

模型的训练命令和指标

  • 为了使模型更快的收敛,我们使用在COCO数据集上训好的模型进行迁移学习,并且增加--eval参数,表示边训练边测试:

export CUDA_VISIBLE_DEVICES=0python -u tools/train.py -c configs/faster_rcnn_r50_fpn_1x.yml \              -o pretrain_weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_1x.tar \              finetune_exclude_pretrained_params=['cls_score','bbox_pred'] \              --eval
  • 在P40机器上单卡训练40分钟左右就可完成训练,最终的mAP(0.50, 11point)=71.60,如果想让模型收敛的更好,可以继续增大max_iters,训练2x、3x等模型,但并不是意味着训练轮数越多效果越好,要防止过拟合的出现。

模型的测试

训完之后,可以任意挑选一张测试集图片进行测试,输出的结果图片会默认保存在output目录中:

python -u tools/infer.py -c configs/faster_rcnn_r50_fpn_1x.yml \              --infer_img=path/to/dataset/2572.jpeg

 

5  飞桨(Paddle)模型保存预测与系统部署

模型部署:

  • 首先需要先将模型导出成可预测模型:
python -u tools/export_model.py -c configs/faster_rcnn_r50_fpn_1x.yml \              --output_dir=./inference_model
  • 然后我们使用python端进行预测:
python deploy/python/infer.py --model_dir=./inference_model/faster_rcnn_r50_fpn_1x \              --image_file=path/to/dataset/2572.jpeg \              --use_gpu=True

同时,视频流的试试检测的代码后期我将补充好。官方没有给出相关的代码

 

6飞桨(Paddle)模型的优化和迭代与更新

模型优化的教程

同时后期个人将介绍模型的压缩的相关的知识。

模型压缩教程()

参考博文:

出现的问题

是个问题是在模型的训练的时候 配置的在的--eval参数的时候出现的问题呢。

解决的方法是:因为在faster-rcnn训练的时候,在数据集合中的使用默认把背景当做一个类别。这样的是的需要在的原来的类别的基础上+1

转载地址:http://vqch.baihongyu.com/

你可能感兴趣的文章
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>
mysql 协议的退出命令包及解析
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>
MySQL 命令和内置函数
查看>>
MySQL 和 PostgreSQL,我到底选择哪个?
查看>>
mysql 四种存储引擎
查看>>
MySQL 在并发场景下的问题及解决思路
查看>>
MySQL 在控制台插入数据时,中文乱码问题的解决
查看>>
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>
MySQL 处理插入重主键唯一键重复值办法
查看>>
MySQL 备份 Xtrabackup
查看>>
mysql 复杂查询_mysql中复杂查询
查看>>
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>