全网最细 | 教你如何在 docker 容器下使用 mmdetection 训练自己的数据集

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 全网最细 | 教你如何在 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 远程登录服务器就行了。


下载含 mmdetection 的 docker 镜像


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


$ docker search mmdetection


结果显示如下图所示:


image.png

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


$ docker pull vistart/mmdetection


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


$ docker images


image.gif

可以看到 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,读者可自行修改。


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


image.gif

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


补充:


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


退出容器:


# exit


查看现有容器:


$ docker ps -a


image.gif


可以看到,名为 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 random
trainval_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 目录下生成下面三个文件:


image.png

打开文件可以看到,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’,…这些。改完后如图:


image.png


5. 修改 voc.py 文件


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


image.png

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


6. 修改配置文件


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


image.pngimage.gif

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


6.1 修改 num_classes 变量


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


image.pngimage.gif

6.2 修改 data_settings 


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


6.jpgimage.gif

6.3 调整学习率


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

image.png

image.gif

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


  • 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。


image.png

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


image.png

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


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。


然后,训练就开始了:


image.png

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


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


image.png

训练完成之后,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


计算结果如下:


image.png

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


9. 总结


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


相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
3天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
3天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
12 0
|
3天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
3天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
3天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
3天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
3天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境
|
3天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
3天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
14 0