R-CNN:使用自己的数据训练 Faster R-CNN 的 VGG-16 模型

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 学习 Faster R-CNN 模型,为了了解其中网络的结构,利用 PascalVOC 数据集,来扩展网络的类别(原来有 20 类)。过程分为:数据准备 ==> 相关文件修改 ==> 训练网络 ==> 测试

最近在学习 Faster R-CNN 模型,为了了解其中网络的结构,利用 PascalVOC 数据集,来扩展网络的类别(原来有 20 类)。过程分为:数据准备 ==> 相关文件修改 ==> 训练网络 ==> 测试


一、数据准备

(一)下载数据集:

官网数据集镜像:https://pjreddie.com/projects/pascal-voc-dataset-mirror/
Pascal VOC 数据集中有训练时需要的图片、对应的标注文件(xml)和指定正负样本的文本文件(txt),分别放在 VOC2007 或 VOC2012 目录中的 JPEGImage、Annotations 和 ImageSets 的 Main 目录中。

(二)数据标注:

本次训练的目的是在原有 20 类的基础上,扩展 3 类,分别是 cup、window、glasses
标注工具使用 LabelImage :github下载地址

需要安全 PyQt 和其他相关依赖项才能运行。

下载完后运行 LabelImage.py 文件即可,界面如下:

「Open Dir」 指定文件的路径;「Change Save Dir」 指定保存的 xlm 文件路径。
默认常用快捷键为:「w」 为画框,「a」 为上一张图片,「d」 为下一张图片,「ctrl + s」 为保存 xml 文件。

如果想要修改快捷键,可以打开 LabelImage.py 文件,在以下代码中(大概在213到276行)修改:

...
        openNextImg = action('&Next Image', self.openNextImg,    //里面有快捷键的功能和快捷键
                             'd', 'next', u'Open Next')          //第三个参数('d')就是快捷键,可以修改

        openPrevImg = action('&Prev Image', self.openPrevImg,
                             'a', 'prev', u'Open Prev')

        verify = action('&Verify Image', self.verifyImg,
                        'space', 'verify', u'Verify Image')

        save = action('&Save', self.saveFile,
                      'ctrl+s'', 'save', u'Save labels to file', enabled=False)
...

每画完一个框后,会让你选择所属类别:

如果想要修改预选类别,可以在 $LabelImage_ROOT/data 里面的 predefined_classes.txt 里修改。

数据标注完后,需要生成四个 txt 文件,分别为 class_train.txt、class_trainval.txt、class_val.txt、class_test.txt。

内容格式为下:

2008_000008 -1
2008_000015 -1
2008_000019 -1
2008_000023 -1
2008_000028 -1
2008_000033  1
2008_000036 -1
2008_000037  1
2008_000041 -1
2008_000045 -1
2008_000053 -1
2008_000060 -1
...

(三)数据存放地址:

数据准备完后,
jpg 文件放在 \py-faster-rcnn\data\VOCdevkit2007\VOC2007\JPEGImage\ 里面
xml 文件放在 \py-faster-rcnn\data\VOCdevkit2007\VOC2007\Annotations\ 里面
txt 文件放在 \py-faster-rcnn\data\VOCdevkit2007\VOC2007\ImageSets\Main\ 里面
注意 txt 里面每一个类别都有对应的 train、val、trainval、test 文件,按照原来的数据格式去做,需要自己生成。

二、训练网络

在训练开始之前,需要修改一些网络文件和下载 ImageNet 预训练模型。

(一)修改相关配置文件

1. cd $FRCN_ROOT/lib/datasets,修改 pascal_voc .py,添加自己的类

        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', 'cup', 'window', 'glasses')

2. cd $FRCN_ROOT/lib/datasets,修改 imdb.py
boxes[:, 2] = widths[i] - oldx1 -1 后面添加三行,如下:

...
    boxes[:, 2] = widths[i] - oldx1 -1
    for b in range(len(boxes)):
        if boxes[b][2] < boxes[b][0]:
            boxes[b][0] = 0 
...

3. 修改 train.prototxttest.prototxt
把所有的 21 替换为 24,这个数为 类别数 + 背景 = 23 + 1,按自己的类别数来改。然后把所有的 84 替换为 96,这个数为 (类别数 + 背景)× 4 = 96 ,也是按照自己的类别改。

4. 修改所有的 .pt 文件
如上,把所有的 21 替换为 24,把所有的 84 替换为 96

(二)下载 ImageNet 模型

训练的时候需要使用 ImageNet 的预训练模型,所以需要准备:
cd $FRCN_ROOT 运行脚本文件:
./data/scripts/fetch_imagenet_models.sh
有可能需要翻墙才能下载或者下载速度慢。可以网上找网友下载。

(三)清除缓存

删除缓存文件:

$FRCN_ROOT/data/VOCdevkit2007/annotations_cache/annots.pkl
$FRCN_ROOT/data/cache 下的 pkl 文件
如果不清除缓存可能会报错。

(四)开始训练

检查所有准备步骤没错后,就可以开始训练了。
命令如下:

cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [dataset]

第一个参数指定训练用的 GPU,第二个指定训练什么网络,这里使用 VGG16,第三个是指定数据集,这里为 pascal_voc

例如:

./experiments/scripts/faster_rcnn_end2end.sh 0 VGG16 pascal_voc

训练每次迭代大约为 0.2s ,迭代 70000 次,每 10000 次会生成一次 snapshot ,大概需要训练快 4 个小时训练完的网络保存在:

$FRCN_ROOT/output/faster_rcnn_end2end/voc_2007_trainval

(五)训练中遇到的问题

训练中还是会遇到各种各样的报错,我把我自己的遇到的问题汇总了以下,参考训练和测试 Faster R-CNN 模型中遇到的问题

三、测试网络

网络训练完成后如果有 test 集会自动开始测试,最后输出所有类的 Average Precision (AP) 及 mean AP:

除了训练 VGG16 模型,我还再训练多一个 ResNet-50,在训练 ResNet-50 的时候我修改生成的 anchors 的尺度,增加了两个小的 anchors,提高了检测的精度,两个网络的 AP 做一个对比。

可以发现,残差网络所有类别的 AP 都有提高,有一部分类有明显提高:


上:VGG16 网络的 mAP;下:ResNet-50 网络的 mAP

由于官方给的文件里面没有 ResNet 网络训练的文件,可以参考 使用自己的数据训练 Faster R-CNN 的 ResNet-50 模型

目录
相关文章
|
13天前
|
机器学习/深度学习 编解码 算法
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
21 0
|
2月前
|
机器学习/深度学习
ACM MM24:复旦提出首个基于扩散模型的视频非限制性对抗攻击框架,主流CNN和ViT架构都防不住它
【9月更文挑战第23天】复旦大学研究团队提出了ReToMe-VA,一种基于扩散模型的视频非限制性对抗攻击框架,通过时间步长对抗性潜在优化(TALO)与递归令牌合并(ReToMe)策略,实现了高转移性且难以察觉的对抗性视频生成。TALO优化去噪步骤扰动,提升空间难以察觉性及计算效率;ReToMe则确保时间一致性,增强帧间交互。实验表明,ReToMe-VA在攻击转移性上超越现有方法,但面临计算成本高、实时应用受限及隐私安全等挑战。[论文链接](http://arxiv.org/abs/2408.05479)
61 3
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
3月前
|
机器学习/深度学习
CNN模型验证和CNN模型保存
【8月更文挑战第10天】CNN模型验证和CNN模型保存。
63 27
|
3月前
|
机器学习/深度学习
加载CNN保存模型
【8月更文挑战第10天】加载CNN保存模型。
42 12
|
19天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第7天】本文将深入探讨卷积神经网络(CNN)的基本原理,以及它如何在图像识别领域中大放异彩。我们将从CNN的核心组件出发,逐步解析其工作原理,并通过一个实际的代码示例,展示如何利用Python和深度学习框架实现一个简单的图像分类模型。文章旨在为初学者提供一个清晰的入门路径,同时为有经验的开发者提供一些深入理解的视角。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其应用
【9月更文挑战第24天】本文将深入探讨深度学习中的一种重要模型——卷积神经网络(CNN)。我们将通过简单的代码示例,了解CNN的工作原理和应用场景。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
80 1
|
5天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
12天前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
42 1
|
8天前
|
机器学习/深度学习 人工智能 自动驾驶
深入理解深度学习中的卷积神经网络(CNN)
【10月更文挑战第18天】深入理解深度学习中的卷积神经网络(CNN)
19 0