您当前的位置: 首页 >  深度学习

庄小焱

暂无认证

  • 3浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

深度学习项目实战——基于PaddlePaddle昆虫识别项目

庄小焱 发布时间:2021-02-08 18:43:19 ,浏览量:3

摘要

本文主要介绍的是的有关于的百度飞桨的目标的检测的算法的实战案例。通过使用的百度飞桨来实现的对自己目标进行识别的。后面本人将继续深入原理来对的目标的检测的原理和算法和系统的来实现讲解。基于飞桨(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.4PP-YOLO依赖1.8.4v0.5>= 1.8.4大部分模型>=1.8.4即可运行,Cascade R-CNN系列模型与SOLOv2依赖2.0.0.rc版本
# install paddlepaddle
python -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:
运行需要COCO-API,安装方式如下:

# 安装pycocotools
pip 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未安装,请安装Cython
pip install Cython

# 由于原版cocoapi不支持windows,采用第三方实现版本,该版本仅支持Python3
pip 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.480s
OK (skipped=2)
预训练模型预测
使用预训练模型预测图像,快速体验模型预测效果:

# use_gpu参数设置是否使用GPU
python 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 os

file_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 sys
import os.path as osp
import logging
import argparse

# add python path of PadleDetection to sys.path
parent_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_list
logging.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: FasterRCNN
max_iters: 10200
use_gpu: true
snapshot_iter: 10000
log_iter: 20
save_dir: output
pretrain_weights: pre_model_data/ResNet50_cos_pretrained.tar
metric: VOC
weights: output/faster_rcnn_r50_fpn_1x_new/model_final
num_classes: 7

FasterRCNN:
  backbone: ResNet
  fpn: FPN
  rpn_head: FPNRPNHead
  roi_extractor: FPNRoIAlign
  bbox_head: BBoxHead
  bbox_assigner: BBoxAssigner

ResNet:
  norm_type: bn
  norm_decay: 0.
  depth: 50
  feature_maps: [2, 3, 4, 5]
  freeze_at: 2

FPN:
  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: 1000

FPNRoIAlign:
  canconical_level: 4
  canonical_size: 224
  min_level: 2
  max_level: 5
  box_resolution: 7
  sampling_ratio: 2

BBoxAssigner:
  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.5

BBoxHead:
  head: TwoFCHead
  nms:
    keep_top_k: 100
    nms_threshold: 0.5
    score_threshold: 0.05

TwoFCHead:
  mlp_dim: 1024

LearningRate:
  base_lr: 0.0025
  schedulers:
  - !PiecewiseDecay
    gamma: 0.1
    milestones: [6800, 9000]
  - !LinearWarmup
    start_factor: 0.1
    steps: 1000

OptimizerBuilder:
  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: false

EvalReader:
  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: 2

TestReader:
  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: 2

EvalReader:
  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: false

TestReader:
  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.0025
schedulers:
- !PiecewiseDecay
  gamma: 0.1
  milestones: [6800, 9000]
模型的训练命令和指标
  • 为了使模型更快的收敛,我们使用在COCO数据集上训好的模型进行迁移学习,并且增加--eval参数,表示边训练边测试:

export CUDA_VISIBLE_DEVICES=0
python -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)模型的优化和迭代与更新

模型优化的教程模型压缩教程 — PaddleDetection 0.1 文档

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

模型压缩教程()
  • 压缩benchmark
    • 测试环境
    • 剪裁模型库
    • 蒸馏模型库
    • 量化模型库
  • 模型蒸馏
    • 模型蒸馏教程
  • 模型量化
    • 模型量化压缩教程
  • 神经网络搜索
    • 神经网络搜索(NAS)教程
  • 模型剪枝
    • 卷积层通道剪裁教程
    • 卷积层敏感度分析教程
参考博文:

欢迎使用 PaddleDetection! — PaddleDetection 0.1 文档

出现的问题

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

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

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0443s