docker与mmdetection

这里不再介绍 mmdetection 的安装和配置,使用 mmdetection 较简单的方法是使用已安装 mmdetection 的 docker 容器。这样直接省去了安装 mmdetection 的过程,让重心放在模型训练上!

如果你对 docker 和 mmdetection 还不是很熟悉,请自行搜索一下,本文就不再赘述了。

这里附上 mmdetection 的 GitHub 地址:

https://github.com/open-mmlab/mmdetection

0. 前期准备

首先默认你的电脑已经做好了下面这些前期准备工作:

  • Ubuntu 16.04 或以上

  • GPU 安装

  • cuda 安装

  • cudnn 安装

  • docker 安装

  • nvidia-docker

当然,如果你连接的是公司或学校的服务器,且服务器已经做了上面几点准备,那你只需要一个 Xshell 远程登录服务器就行了。

1. 下载含 mmdetection 的 docker 镜像

首先,我们需要找到一个已经配置好 mmdetection 环境的 docker 镜像。可以在 dockerhub 上用 “mmdetection” 作为关键词进行搜索,也可以在 terminal 里直接使用命令 docker search 进行搜索:

$ docker search mmdetection

结果显示如下图所示:

这里,我们选择排第一的 vistart/mmdetection 镜像,下载 docker 镜像的方法也很简单,使用 docker pull 从镜像仓库中拉取指定镜像:

$ docker pull vistart/mmdetection

如果网络没问题,下载会在几分钟之内完成。下载完成之后,我们就可以查看 vistart/mmdetection 镜像是否已经放在本地镜像里了:

$ docker images

可以看到 vistart/mmdetection 镜像已经成功下载了。

2. 新建含 mmdetection 的容器

包含 mmdetection 的镜像已经下载好了,下一步就是新建一个 docker 容器以供使用了:

$ docker run --runtime=nvidia --name mm_prj -i -t vistart/mmdetection /bin/bash

对上面的命令解释一下:–runtime=nvidia 很关键,能使新建的 docker 容器能使用宿主机器的 GPU,不加这个参数则默认使用 CPU;–name mm_prj 是对新建的 docker 容器进行命名,该名称为 mm_prj,读者可自行修改。

新建容器之后的界面如下:

至此,名为 mm_prj 容器已经打开了。可以看到,该目录中已经包含了 mmdetection 目录,表示该 docker 镜像已经安装好了 mmdetection。

补充:

另外,补充一些退出容器、进入容器的操作。

退出容器:

# exit

查看现有容器:

$ docker ps -a

可以看到,名为 mm_prj 的 docker 容器已经在容器列表了。

打开容器:

$ docker start mm_prj
$ docker exec -i -t mm_prj /bin/bash

3. 导入自己的 VOC 数据

这一步,我们需要把自己的数据打包成 Pascal VOC 格式。其目录结构如下:

VOCdevkit--VOC2007----Annotations----ImageSets------Main----JEPGImages

简单介绍一下,其中 Annotations 存放的是 .xml 文件,JEPFImages 存放的是 .jpg 图片。

按照此格式放置好自己的训练数据之后,需要切分训练数据和测试数据。在 VOCdevkit 目录下新建一个 test.py 文件。test.py 内容为:

import os
import randomtrainval_percent = 0.8
train_percent = 0.8
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

上面的代码划分数据集,trainval 占 80%,作为训练集;test 占 20%,作为测试集。

运行 test.py,将会在 VOCdevkit/ImageSets/Main 目录下生成下面三个文件:

打开文件可以看到,trainval.txt 包含训练时所有的样本索引,test.txt 包含测试时所有的样本索引。

自己的 VOC 数据制作完毕之后,从宿主机(Ubuntu)复制到 /mmdetection/data/ 目录下:

$ docker cp VOCdevkit mm_prj:/mmdetection/data/

4. 修改 class_names.py 文件

打开 /mmdetection/mmdet/core/evaluation/class_names.py 文件,修改 voc_classes 为将要训练的数据集的类别名称。如果不改的话,最后测试的结果的名称还会是’aeroplane’, ‘bicycle’, ‘bird’, ‘boat’,…这些。改完后如图:

5. 修改 voc.py 文件

打开 mmdetection/mmdet/datasets/voc.py 文件,修改 VOCDataset 的 CLASSES 为将要训练的数据集的类别名称。

如果只有一个类,要加上一个逗号,否则将会报错。

6. 修改配置文件

mmdetection 中提供了很多目标检测模型可供使用。例如,进入 /mmdetection/config/ 目录,就会看到很多模型:

根据我们选择使用的模型,修改相应的配置文件。本文我们使用的是FasterRCNN 模型,修改的是 faster_rcnn_r50_fpn_1x.py 文件。

6.1 修改 num_classes 变量

打开 faster_rcnn_r50_fpn_1x.py,将 num_classes 变量改为:类别数 + 1(例如我有 20 类,因此改为 21):

6.2 修改 data_settings

因为 faster_rcnn_r50_fpn_1x.py 默认使用的是 coco 数据集格式,我们要对其修改成相应的 VOC 数据格式。修改后的内容如下图所示:

6.3 调整学习率

本文使用单 gpu 训练,修改 img_per_gpu = 2,workers_per_gpu = 0。

对学习率的调整,一般遵循下面的习惯:

  • 8 gpus、imgs_per_gpu = 2:lr = 0.02;

  • 2 gpus、imgs_per_gpu = 2 或 4 gpus、imgs_per_gpu = 1:lr = 0.005;

  • 4 gpus、imgs_per_gpu = 2:lr = 0.01

这里,我们只使用单 gpu,且 img_per_gpu = 2,则设置 lr = 0.00125。

这里说一下 epoch 的选择,默认 total_epoch = 12,learning_policy 中,step = [8,11]。total_peoch 可以自行修改,若 total_epoch = 50,则 learning_policy 中,step 也相应修改,例如 step = [38,48]。

至此,配置文件已修改完毕。

7. 模型训练

模型训练非常简单,只需一行命令:

python3 ./tools/train.py ./configs/faster_rcnn_r50_fpn_1x.py

注意执行上面的命令是在 /mmdetection 目录下。

如果有多个 gpu,例如 0, 1 号 gpu 都可用,则可以全部用起来训练,命令如下:

CUDA_VISIBLE_DEVICES=0,1 python3 ./tools/train.py ./configs/faster_rcnn_r50_fpn_1x.py --gpus 2

上面的 –gpus 2 表示使用的 gpu 个数为 2。如果使用多块 gpu,注意修改学习率 lr。

然后,训练就开始了:

从打印出的信息中,可以看到当前的 epoch 和 loss 值。

每个 epoch 会生成一个模型,并自动保存在 /mmdetection/work_dirs/faster_rcnn_r50_fpn_1x/ 目录下。

训练完成之后,latest.pth 即 epoch_12.pth 就是最终的模型。

8. 模型测试,计算 mAP

下面我们将使用训练好的模型对测试集进行验证,并计算 mAP。

8.1 生成 pkl 文件

首先,生成 pkl 文件:

python3 ./tools/test.py ./configs/faster_rcnn_r50_fpn_1x.py ./work_dirs/faster_rcnn_r50_fpn_1x/latest.pth --out=result.pkl

8.2 计算测试集

mAP 对测试集计算 mAP,只需一行命令:

python3 ./tools/voc_eval.py result.pkl ./configs/faster_rcnn_r50_fpn_1x.py

计算结果如下:

图中可以看到,最后计算的 mAP = 0.978。(本文中的目标检测场景比较简单,目标清晰明确,故 mAP 很高)

9. 总结

好了,以上就是教你如何一步一步在 docker 容器中使用 mmdetection 来训练自己的数据集并测试。建议大家使用自己的数据集尝试跑一下,看下效果~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正斜杠( / )和反斜杠( \ )的区别

反斜杠“\”是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点。所以除了程序设计领域外,任何地方都不应该使用反斜杠。 如何区分正反斜杠 英语:"/" 英文是forward slash, “\" 是backward slash形象些比喻的话,…

MMDetectionV2 + Colab

MMDetectionV2 Colab 超详细教程及踩坑实录 文章目录 前言一、环境配置二、准备自己的数据集 Aug.14更新三:修改config文件 3.1 文件结构3.2 (本地)修改config文件 3.2.1 (本地)构造自己模型的权重文件3.2.2 &#x…

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读! OpenStack Stein版本引入了新的多云编排功能,以及帮助实现边缘计算用例的增强功能。 OpenStack由一系列相互关联的项目组成,这些项目可以以不同的组合方式组合在…

SQL作业:综合练习(二)的返评

一:作业题目:综合练习(二) 二:题目要求: 1、创建数据库CPXS,保存于E盘根目录下以自己学号姓第一个字母(阿拉伯数字大写字母)方式创建的文件夹中,初始大小5MB&…

paddlepaddle-VisualDL2.0对项目进行可视化调参

如果需要更好的阅读体验,可以在ai studio上fork该项目:使用VisualDL2.0对项目进行可视化调参 调参是深度学习必须要做的事情。数据和模型处理好后,需要进行模型训练,这个时候就需要进行调参了。一种好的参数配置,可以…

第一、二次实训作业

1.编写程序: 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果。 package 判断奇偶; public class liux { public static void main(String[] args){ int x5; if(x%20){ System.out.println("这…

推荐一款作图工具

以前看到别人的时序图觉得好好看,然后就想这都是用的什么工具画出来的呢?然后看到了一个师兄用的这个工具,真的挺好用的。这是是试用版的界面。类图我觉着看起来效果都挺不错的。转载于:https://www.cnblogs.com/tuhooo/p/8874410.html

【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

cf的比赛越来越有难度了……至少我做起来是这样。 先看看题目吧:点我。 这次比赛是北京时间21:35开始的,算是比较良心。 【A】奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航,它们又是否会破灭呢&#…

PaddleDetection支持的数据格式

PaddleDetection支持的数据格式 目前#PaddleDetection支持43种数据格式:coco voc widerface。在这里我们主要说明一下如何使用自定义COCO进行目标检测、实例分割;如何使用自定义VOC数据集进行目标检测。在PaddleDetection新的版本中,我们将数…

[dts]Device Tree机制【转】

转自:https://www.cnblogs.com/aaronLinux/p/5496559.html 转自:http://blog.csdn.net/machiner1/article/details/47805069 ------------------Based on linux 3.10.24 source code 参考/documentation/devicetree/Booting-without-of.txt文档 目录 1.…

AntiSamy测试

AntiSamy为owasp针对xss提供的处理库,可以配置xml策略来决定过滤的内容,比如标签、属性、css等,自定义策略给开发人员使用成本比较高,AntiSamy也提供了几个内置的策略,其安全级别也不同,过滤的内容也不一样…

SoJpt Boot 2.2-3.8 发布,Spring Boot 使用 Jfinal 特性极速开发

开发四年只会写业务代码,分布式高并发都不会还做程序员? 在Spring Boot框架下使用Jfinal特性极速开发,可以在Spring Boot中向使用Jfinal一样使用Enjoy、Aop、Controller等一系列方法(如: getFile(), renderFile....),以及ActiveRecord SoJpt Boot&…

3轴机器人各关节运动学建立,python编程,非常容易理解

分类:机器人学 一、问题描述 如右图所示的三自由度机械臂,关节1和关节2相互垂直,关节2和关节3相互平行。如图所示,所有关节均处于初始状态。 要求: (1) 定义并标注出各关节的正方向; (2) 定义机器人基坐标系&#x…

Win 10 源码一览:0.5T 代码、400 万文件、50 万文件夹

Windows 操作系统本身是不开源的,但是近日微软内核工程师 Axel Rietschin 发表了一篇博客,带大家一窥了 Windows 10 内核的魅力。 Axel 介绍,Windows 10 与 Windows 8.x、7、Vista、XP、2000 和 NT 的代码库是相同的,其中每一代都…

JDK+Tomcat搭建JSP运行环境--JSP基础

一、搭建JSP运行环境之前需要了解的基本知识 配置JSP运行环境之前,我们需要了解JSP的运行机制。只有了解JSP运行机制后,我们才能知道为什么要搭建JSP运行环境?如何去搭建JSP运行环境?为什么要配置Tomcat、JDK? JSP(Java Sever Page)即Java服…

Docker容器的自动化监控实现

本文由 网易云 发布。 近年来容器技术不断成熟并得到应用。Docker作为容器技术的一个代表,目前也在快速发展中,基于 Docker的各种应用也正在普及,与此同时 Docker对传统的运维体系也带来了冲击。我们在建设运维平台的过程中,也需…

人工智能实战小程序之语音_前端开发

1. 人工智能实战小程序之准备工作 2. 人工智能实战小程序之语音_前端开发 今天这部分主要讲小程序前端功能的开发由于我偏后端,css是我的弱项,可能很多人和我一样开发小程序不知道如何下手,希望本篇文章对你有帮助我的学习路线是:…

当TFS/VSTS遇上Power BI

引言众所周知,要对TFS进行深入的图表分析,往往需要依赖于SQL Server Analysis Service和SQL Server Reporting Service。虽然随着TFS对敏捷项目的支持,内置了诸如累积流图、燃尽图等快捷图表;并且在最新的版本中还可以在仪表盘和查…

HashMap深度解析:一文让你彻底了解HashMap

写在前面HashMap是Map族中最为常用的一种,也是 Java Collection Framework 的重要成员。本文首先给出了 HashMap 的实质并概述了其与 Map、HashSet 的关系,紧接着给出了 HashMap 在 JDK 中的定义,并结合源码分析了其四种构造方式。最后&#…

python_线程、进程和协程

线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1 #!/usr/bin/env python2 #codingutf-83 __author__ yinjia4 5 6 import threading,time7 8 def show(arg):9 time.sleep(2) 10 print(线程: str(arg)) 11 12 for i in range(…