网站首页 > 技术文章 正文
摘要
本文主要介绍的是的有关于的百度飞桨的目标的检测的算法的实战案例。通过使用的百度飞桨来实现的对自己目标进行识别的。后面本人将继续深入原理来对的目标的检测的原理和算法和系统的来实现讲解。基于飞桨(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 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 <path/to/clone/PaddleDetection>
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文件夹下生成一个画有预测结果的同名图像。结果如下图:
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/VOC2007或VOCdevkit/VOC2012文件夹,该文件夹中需有Annotations,JPEGImages和ImageSets/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.txt和test.txt文件:create_file.py
- 模仿VOC数据集目录结构,新建VOCdevkit文件夹并进入其中,然后继续新建VOC2007文件夹并进入其中,之后新建Annotations、JPEGImages和ImageSets文件夹,最后进入ImageSets文件夹中新建Main文件夹,至此完成VOC数据集目录结构的建立。
- 将该数据集中的train/annotations/xmls与val/annotations/xmls下的所有xml标注文件拷贝到VOCdevkit/VOC2007/Annotations中,将该数据集中的train/images/与val/images/下的所有图片拷贝到VOCdevkit/VOC2007/JPEGImages中,将第一步生成的trainval.txt和test.txt文件移动到VOCdevkit/VOC2007/ImageSets/Main中。
- 最后在数据集根目录下输出最终的trainval.txt和test.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_iters。milestones(学习率变化界限)也是同理。原配置文件中总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目录中:
预测的结果如图所示:
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)教程
- 模型剪枝
- 卷积层通道剪裁教程
- 卷积层敏感度分析教程
出现的问题
是个问题是在模型的训练的时候 配置的在的--eval参数的时候出现的问题呢。
解决的方法是:因为在faster-rcnn训练的时候,在数据集合中的使用默认把背景当做一个类别。这样的是的需要在的原来的类别的基础上+1
猜你喜欢
- 2024-12-05 探索实例分割的奥秘:从YOLOv8到Mask RCNN的深度学习之旅
- 2024-12-05 PaddleDetection v2.6发布:目标小?数据缺?PP新员逐一应对!
- 2024-12-05 基于YOLO系列算法的图像检测
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)