Advertisement

使用Faster RCNN训练自己的数据集

阅读量:

使用Faster RCNN训练自己的数据集经历如下:
代码与环境
使用的是github仓库,基于PyTorch 1.0.0版本运行。
环境配置

  • 操作系统:Ubuntu 16.04
  • Python:3.6 + PyTorch 1.2.0
  • CUDA:10.0版本自动安装
  • 安装依赖:通过PyTorch官网下载并安装PyTorch及torchvision。
    模型编译与问题解决
  • 编译过程中出现ImportError: cannot import name '_mask',解决方案是克隆COCO API并进行编译。
  • 遇到Scipy和Pillow版本冲突问题(scipy==1.5.4与Pillow==8.2.0),通过降级至scipy==1.2.1和Pillow==6.1.0解决问题。
    数据集准备
  • 使用VOC格式的数据集,并修改了pascal_voc.py文件中的类别名称和索引处理。
  • 数据集比例设置为6:2:2(训练:验证:测试)。
    训练过程
  • 设置GPU ID为可用设备(如GPU 1)。
  • 参数设置包括batch size=16, workers=4, epochs=100等。
  • 训练完成后保存模型,并进行批量测试。
    最终成功完成模型训练和测试,并输出结果。

采用Faster-RCNN算法对自身数据集进行训练的过程中遇到诸多挑战和障碍,在尝试过程中不断遭遇技术上的困难与瓶颈,因此决定详细记录整个训练流程。

我们采用的代码版本为 Faster R-CNN (PyTorch),该开源软件基于深度学习框架 PyTorch 开发而成。

1.源码及环境配置

原GitHub发布平台上的PyTorch版本为0.4.0,在查阅多个网络博客后发现该版本存在较多错误难以解决这些问题建议升级至PyTorch 1.0.0及以上版本。
改写说明:对原文进行了词汇替换和句式变换:

  • "采用"替换"使用"

  • "较明显的"替换"较多"

  • "经过分析"替换"查阅"

  • "强烈推荐"替换"建议"
    同时对句子进行了拆分重组以提高表达的丰富性

    • 源码

Pytorch0.4.0版源码:https://github.com/jwyang/faster-rcnn.pytorch.git

该版本的PyTorch源代码库:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0

  • 环境配置

Ubuntu16.04

Python==3.6 + Pytorch==1.2.0

由于CUDA版本向下兼容,所以这里不作特殊说明.

  • 使用Anaconda安装虚拟环境
复制代码
    conda create -n faster-rcnn python=3.6

复制代码
 # CUDA 10.0

    
 conda install pytorch==1.2.0 torchvision==0.4.0

如图所示,此时cudatoolkit=10.0也会自动安装。

  • 安装其他环境依赖
复制代码
    pip install -r requirements.txt

2.预先训练的模型经过训练后生成

  • 新建文件夹

(注:本文将原文件夹重命名为faster-rcnn )在文件夹中新建data文件夹

复制代码
    cd faster-rcnn && mkdir data

data 文件夹中新建pretrained_model 文件夹

复制代码
    mkdir pretrained_model
  • 下载预训练模型VGG16与ResNet-101

预训练模型VGG16:VGG16

预训练深度学习模型ResNet-101:下载链接ResNet-101

将下载好的预训练模型放到pretrained_model 文件夹中

  • 执行编译
复制代码
 cd lib

    
 python setup.py build develop
    
 cd ..

编译完成,如图所示

如果执行编译后,训练自己的数据集仍然报错:

复制代码
    ImportError: cannot import name '_mask'

则是缺少COCO API,需要执行以下指令

复制代码
 cd data

    
  
    
 git clone https://github.com/pdollar/coco.git 
    
  
    
 cd coco/PythonAPI
    
  
    
 make
    
  
    
 cd ../../..

如图所示

可以看到'_mask.o'已经编译成功

  • Scipy降版本

通过调用官方API获取当前列表管理Python依赖项

复制代码
    pip list

可以看到其中 Scipy 与 Pillow 版本分别询问 scipy==1.5.4 和 Pillow==8.2.0。因为 Scipy 版本自身发生了变化, 所以需要将 Scipy 调整为更低版本, 否则会导致训练失败。

复制代码
    ImportError: cannot import name 'imread'

首先卸载以上两个版本

复制代码
 pip uninstall scipy

    
  
    
 pip uninstall pillow

然后安装指定版本即可

复制代码
 pip install scipy == 1.2.1

    
 pip install pillow == 6.1.0

3.数据集准备

本文训练的数据集是VOC格式

  • 新建文件夹
复制代码
    cd data && mkdir VOCdevkit2007

将之前标注得到的数据集放到VOCdevkit2007 文件夹中,并重命名为VOC2007

VOC文件夹格式

复制代码
 ---VOC2007

    
     ------Annotations
    
     ------ImagesSet
    
       -------Main
    
              ----trainval.txt
    
              ----train.txt
    
              ----val.txt
    
              ----test.txt
    
     ------JPEGImages

在当前研究中,训练集、验证集与测试集的比例分配为6:2:2

  • 修改数据集类别

首先进入到文件夹

复制代码
 cd lib/datasets/

    
  
    
 vim pascal_voc.py

将第48行**'self._classes'** 改成自己的类别

复制代码
 # before

    
 self._classes = ('__background__',  # always index 0
    
                      'aeroplane', 'bicycle', 'bird', 'boat',
    
                      'bottle', 'bus', 'car', 'cat', 'chair',
    
                      'cow', 'diningtable', 'dog', 'horse',
    
                      'motorbike', 'person', 'pottedplant',
    
                      'sheep', 'sofa', 'train', 'tvmonitor')
    
  
    
 # after
    
 self._classes = ('__background__',  # always index 0
    
                      'xxx', 'yyy', 'zzz')

为了在训练过程中避免报错(或者确保所有标注均为小写),我们可以将第243行的**'cls'**中的lowercase()函数去除。

复制代码
 # before

    
 cls = self._class_to_ind[obj.find('name').text.lower().strip()]
    
  
    
 # after
    
 cls = self._class_to_ind[obj.find('name').text.strip()]

以上就是我遇到的问题,都解决之后就可以开始训练了

4.训练

训练指令

复制代码
 # train

    
 $ CUDA_VISIBLE_DEVICES=1 python trainval_net.py --dataset pascal_voc --net vgg16 --bs 16 --nw 4 --cuda --epochs 100

参数解释

复制代码
 CUDA_VISIBLE_DEVICES    # GPU ID,即使用哪块GPU进行训练

    
 -dataset    # 数据集类型,就以pascal-voc为例
    
 -net    # 所使用的backbone网络,以vgg16为例
    
 –bs    # 指的batch size,以16为例,显存不够就调小bs
    
 –nw    # 指的是worker number,取决于你的Gpu能力,以4为例,稍微差一些的gpu可以选小一点的值
    
 –cuda    # 指的是使用GPU训练
    
 -epochs    # 此处设为100,估计需要跑很久

训好的model会存到models文件夹中

等待训练完成ing

5.测试

训练完成后,首先进入文件夹

复制代码
 cd model/vgg16/pascal_voc

    
  
    
 # or
    
  
    
 cd model/res101/pascal_voc
    
  
    
 ls
    
  
    
 cd ../../../

查看训练完成之后保存的模型

在文件夹主目录中输入指令进行测试

复制代码
 python test_net.py --dataset pascal_voc --net vgg16 --checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT --cuda

    
  
    
 # 批量测试
    
 $  python test_net.py --dataset pascal_voc --net vgg16 --checksession 1 --checkepoch 50 --checkpoint 460 --cuda

其中,“checksession”、“checkepoch”以及“checkpoint”这三个参数各自代表的意义如下:当选择训练所得模型“faster_rcnn_1_50_460.pth”时,则设置checksession为1、checkepoch为50、checkpoint为460。从中可以看出该模型已成功加载。

输出结果:

参考博客

基于PyTorch平台采用Faster R-CNN算法进行本地数据集(全版本)的训练工作

该版本在执行过程中出现了问题:运行faster-rcnn/pytorch/jwyang版本出现的错误

faster-rcnn.pytorch问题汇总与应对措施

Faster-RCNN训练自己数据集的学习笔记与总结

[Faster-RCNN与ZF联合训练模型](Python实现版)

Faster RCNN CPU模式下进行训练

基于PyTorch平台开发的自定义数据集训练框架

基于PyTorch平台实现Faster R-CNN模型并进行自定义数据集训练

全部评论 (0)

还没有任何评论哟~