本文共 11733 字,大约阅读时间需要 39 分钟。
本文主要介绍的是的有关于的百度飞桨的目标的检测的算法的实战案例。通过使用的百度飞桨来实现的对自己目标进行识别的。后面本人将继续深入原理来对的目标的检测的原理和算法和系统的来实现讲解。基于飞桨(PaddlePaddle)最大的优点就是的不需要想TensorFlow的版本一样复杂。配置简单。其次是的这个系统的的运行的操作也是简单的。同时兼容window10和Ubuntu系统。本文就昆虫的识别来认识一下飞桨(PaddlePaddle)的相关的操作。并同时将可以借鉴这样的一个思想。来完成的其他目标的识别和跟踪检测。
如果需要 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
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
安装Python依赖库:Python依赖库在requirements.txt中给出,可通过如下命令安装:pip install -r requirements.txt
您可以通过以下命令克隆PaddleDetection:cdgit 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
文件夹下生成一个画有预测结果的同名图像。结果如下图:
首先要制作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/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 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)
由于昆虫比较小,属于小物体检测范畴,我们选择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_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]。
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
模型部署:
python -u tools/export_model.py -c configs/faster_rcnn_r50_fpn_1x.yml \ --output_dir=./inference_model
python deploy/python/infer.py --model_dir=./inference_model/faster_rcnn_r50_fpn_1x \ --image_file=path/to/dataset/2572.jpeg \ --use_gpu=True
同时,视频流的试试检测的代码后期我将补充好。官方没有给出相关的代码
模型优化的教程
同时后期个人将介绍模型的压缩的相关的知识。
是个问题是在模型的训练的时候 配置的在的--eval参数的时候出现的问题呢。
解决的方法是:因为在faster-rcnn训练的时候,在数据集合中的使用默认把背景当做一个类别。这样的是的需要在的原来的类别的基础上+1
转载地址:http://vqch.baihongyu.com/