最近在学习目标检测,要用Cascde RCNN训练自己的数据集,因为本地电脑没有GPU,所以就借用Colab云端来进行模型训练,想要记录一下操作过程,以及希望可以给更多电脑没有GPU,但是需要用mmdetection做项目的同种情况的人一些参考。

目录

一、Colab平台准备(要先做到科学上网才能使用Colab)

1、上传自己的数据集

 2、配置使用Colab

 二、在Colab上配置mmdetection环境并训练

1、下载mmdetection

2、配置数据集

 3、安装mmdete所需要的依赖包和环境,因为Colab上面已经配置了pytorch和cuda,所以配置过程很简单

4、进行相关参数的修改

5、开始训练数据集

三、总结

 

一、Colab平台准备(要先做到科学上网才能使用Colab)

1、上传自己的数据集

数据集的制作过程不做多余赘述,可以在CSDN上找到很多参考资料,本文使用的数据集是voc2007数据集,如果是自己本地制作的数据集,就需要先上传到谷歌云盘。

官网链接:https://drive.google.com/drive/my-drive

点击新建,新建文件夹data存放数据集,然后打开data文件,直接将数据集拖拽就可以完成数据集的上传

 2、配置使用Colab

点击新建,新建Colab项目,命名为Mmdetection-master

 

 

 修改配置,点击代码执行程序,点击更改运行时类型,将加速器更改为GPU,这样就可以白嫖GPU了。

 

 输入代码查看显卡配置

!nvcc -V

!gcc --version

!rm -rf /content/sample_data

#查看分配的显卡配置,建议刷到v100

!nvidia-smi

挂载云盘,连接到自己的谷歌云盘

from google.colab import drive

drive.mount('/content/drive')

 点击刷新就会出现自己的云盘文件夹

 二、在Colab上配置mmdetection环境并训练

这里有官网的文档,大家也可以做一个参考https://mmdetection.readthedocs.io/en/stable/get_started.html

1、下载mmdetection

%cd /content

!rm -rf mmdetection

!git clone https://github.com/open-mmlab/mmdetection.git

#新建一个存放数据集的文件夹

!mkdir mmdetection/data

2、配置数据集

#将云盘里的数据集复制到mmdet项目里面

!cp -r /content/drive/MyDrive/data/VOCdevkit -d /content/mmdetection/data/VOCdevkit

#!cp -r 源地址 -d 目标地址

一定要注意数据集的目录是下图的格式

 3、安装mmdete所需要的依赖包和环境,因为Colab上面已经配置了pytorch和cuda,所以配置过程很简单

先切换到mmdetection项目

#切换当前目录

%cd /content/mmdetection

# 成功配置

!pip install -U openmim

!mim install mmcv-full

!pip install -r requirements/build.txt

!python setup.py develop

要注意两段代码的先后过程,如果反了就会在训练的时候出现以下出现错误,如果出现了,建议卸载mmdet,!pip uninstall mmdet,再重新利用第二段代码进行mmdet安装

# AssertionError: The `num_classes` (4) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 20) in RepeatDataset

然后用下面代码测试相关环境是否安装成功

import mmdet

print(mmdet.__version__)

# Check mmcv installation

from mmcv.ops import get_compiling_cuda_version, get_compiler_version

print(get_compiling_cuda_version())

print(get_compiler_version())

4、进行相关参数的修改

这里参考了相关文章https://blog.csdn.net/weixin_45798949/article/details/107976157

这里选用cascade_rcnn方法,也可以选择fasterrcnn方法,修改类似

1.修改:mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py

_base_ = [

'../_base_/models/cascade_rcnn_r50_fpn.py',

'../_base_/datasets/coco_detection.py',

'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'

]

改:

_base_ = [

'../_base_/models/cascade_rcnn_r50_fpn.py',

'../_base_/datasets/voc0712.py',

'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'

]

2.修改:mmdetection/configs/_base_/datasets/voc712.py

找到,并注释掉一句voc2012

data = dict(

samples_per_gpu=2,

workers_per_gpu=2,

train=dict(

type='RepeatDataset',

times=3,

dataset=dict(

type=dataset_type,

ann_file=[

data_root + 'VOC2007/ImageSets/Main/trainval.txt',

#data_root + 'VOC2012/ImageSets/Main/trainval.txt'

], # 把含有VOC2012的路径去掉

img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'],

pipeline=train_pipeline)),

3.修改:mmdetection/configs/_base_/models/cascade_rcnn_r50_fpn.py

num_classes的值,一共三处,分别修改,不然报错。

根据自己的分类的个数,不需要

考虑背景+1,一类就写1

如果想换预训练模型

model = dict(

type='CascadeRCNN',

pretrained='torchvision://resnet50',#可欢resnet101等

4.修改:mmdetection/mmdet/core/evaluation/class_names.py

def voc_classes():

return [

'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',

'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',

'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'

]#对应换成自己标签。

def voc_classes():

return ['lf', ]#我是一类,后面加逗号

5.修改:mmdetection/mmdet/datasets/voc.py

class VOCDataset(XMLDataset):

CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car',

'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',

'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train',

'tvmonitor')

修改同上

修改完成之后重新进行编译

!python setup.py develop

5、开始训练数据集

因为Colab特别容易掉线,所以建议先配置一下Colab网页防止掉线

在任意网页端右键,点击检查,点击Console

 

添加一下代码

function ConnectButton(){

console.log("Connect pushed");

document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click()

}

setInterval(ConnectButton,60000);

然后开始美美训练

!python tools/train.py ./configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py

 训练的结果权重都保存在work_dir目录下面,点击下载就可下载到本地使用了。

还有就是所有相关参数,例如学习率,epoch,backbone都在以下四个文件中,可以进行查找然后修改相关参数

_base_ = [

'../_base_/models/cascade_rcnn_r50_fpn.py',

'../_base_/datasets/voc0712.py',

'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'

]

对于已经训练好了的模型权重可以这样进行测试使用

python demo/image_demo.py demo/img.jpg configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py work_dirs/cascade_rcnn_r50_fpn_1x_coco/epoch_48.pth --device cpu --out-file result1.jpg

#python 图片path configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py 权重path --device cpu --out-file 结果path

更方便的是新建一个py文件进行编译

from mmdet.apis import init_detector, inference_detector

import mmcv

# Specify the path to model config and checkpoint file

config_file = 'configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py'

checkpoint_file = 'work_dirs/cascade_rcnn_r50_fpn_1x_coco/epoch_48.pth'

# build the model from a config file and a checkpoint file

model = init_detector(config_file, checkpoint_file, device='cpu')

# test a single image and show the results

img = 'image/0060_Color.jpg'

# img = mmcv.imread(img) # which will only load it once

result = inference_detector(model, img)

# visualize the results in a new window

# 可视化推理检测的结果

model.show_result(img, result)

# or save the visualization results to image files

# 将推理的结果保存

model.show_result(img, result, out_file='result_new.jpg')

# test a video and show the results

# 测试视频片段的推理结果

# video = mmcv.VideoReader('video.mp4')

# for frame in video:

# result = inference_detector(model, frame)

# model.show_result(frame, result, wait_time=1)

三、总结

本文主要是为了帮助像我一样的没有GPU来炼丹的cv初学者,如果只是简单的项目的话,希望你不要因为本地没有GPU而烦恼,不得不说Cascade RCNN的精确度确实很顶,小目标检测太绝了。

 

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: