mmdetection安装与训练

一、什么是mmdetection

商汤科技(2018 COCO 目标检测挑战赛冠军)和香港中文大学最近开源了一个基于Pytorch实现的深度学习目标检测工具箱mmdetection,支持Faster-RCNN,Mask-RCNN,Fast-RCNN等主流的目标检测框架,后续会加入Cascade-RCNN以及其他一系列目标检测框架。

二、mmdetection安装

本人安装环境:

系统环境:Ubuntu 20.04.2 LTS
cuda版本:11.7
torch版本:1.8.1
torchvision版本:0.9.1

(一)、安装pytorch

在配置环境之前,建议先安装ANCONDA,具体的安装方法自行百度一下吧,安装完ANCONDA之后,首先创建虚拟环境,指令如下:

conda create -n mmdetection python=3.6    # 创建环境

创建完成之后激活该虚拟环境:

source activate mmdetection 

在安装pytorch之前要先看什么版本的配置满足要求,配置pytorch要求python以及torchvision版本要对应,我们可以从离线网站上看配置要求:http://download.pytorch.org/whl/torch_stable.html

在这里插入图片描述
以上图为例:
cu110代表cuda11.0版本,cp37代表python3.7大版本。linux_x86_64代表在linux系统上的配置
一般cuda的版本都是向下兼容的,所以我们只需要将python 版本以及pytorch,cuda版本对应上即可。
找到好对应的版本之后从pytorch官网官网找到指令:https://pytorch.org/get-started/previous-versions/
在这里插入图片描述
依照我自身的版本,选择conda install pytorch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1 cudatoolkit=10.2 -c pytorch指令即可自行安装。如果网速过慢或者下载失败则给conda换源即可,具体换源方法自行百度。
安装完pytorch之后我们就可以安装mmdetection

(二)、安装mmdetection

第一步使用pip安装openmim,直接运行如下指令:

pip install -U openmim

安装完openmim之后通过mim自动安装对应版本的mmcv-full:

mim install mmcv-full

安装完mmcv-full之后则可以在git仓库拉取源码了:

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

拉取之后切换到mmdetection根目录下:

cd mmdetection

安装附加库:

pip install -v -e .
# 或者
python setup.py develop

安装完成之后可以运行demo进行验证框架的可使用性。
下载配置文件以及权重文件

mim download mmdet --config yolov3_mobilenetv2_320_300e_coco --dest .

下载完成后直接运行demo:

python demo/image_demo.py demo/demo.jpg yolov3_mobilenetv2_320_300e_coco.py yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth --device cpu --out-file result.jpg

运行成功后则会在根目录下生成result.jpg,则环境搭建完成。

三、搭建完mmdetection之后,就可以对自建数据集进行训练了

(一)、voc

1、首先根据规范的VOC数据集导入到项目目录下,如下图所示:

mmdetection
----mmdet
----tools
----configs
----data
--------VOCdevkit
------------VOC2007
--------------- Annotations
---------------- JPEGImages
---------------- ImageSets
------------------------ Main
---------------------------- test.txt
---------------------------- trainval.txt
---------------------------- val.txt
---------------------------- test.txt
先在mmdetection目录下依次创建data、VOCdevkit、VOC2007文件夹,嵌套关系如上,再在VOC2007文件夹下按VOC格式存放自己的数据集(Annotation存放检测框信息、JPEGImages存放要检测的图片,这两个文件夹的名字一定不能修改),ImageSets是放txt文件,可以修改名字,但是初次使用建议规范格式。
2、修改配置文件
mmdet/datasets/voc.py修改类别:
在这里插入图片描述
3、 配置图片格式
mmdet/datasets/xml_style.py修改图片格式:如果图片是jpg则改成jpg,是png格式就改成png
在这里插入图片描述
4、mmdetection/mmdet/core/evaluation/class_names.py修改验证时的类别名称
在这里插入图片描述
只有一个类别的话需要改mmdetection/mmdet/datasets/xml_style.py:
在这里插入图片描述
5、detect/mmdetection/configs/yolox/yolox_s_8x8_300e_coco.py
修改训练参数:类别个数,数据集格式以及路径
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
验证方式修改为voc下的map
在这里插入图片描述
输出日志的间隔
在这里插入图片描述
detect/mmdetection/mmdet/datasets/pipelines/loading.py
如果我们的图像后缀有jpg,JPG,png,bmp……所以在一开始创建数据txt时候就直接存了文件名,在这一步的时候把后面填充的.jpg去掉。
在这里插入图片描述
6、增加训练指标(可选择不修改):
mmdetection/mmdet/core/evaluation/mean_ap.py
在这里插入图片描述
在这里插入图片描述
也可以通过下列指令将VOC转换为COCO格式数据集进行训练:

#数据集转换 在目录下创建data文件夹,在目录C:\AI_Dataset\VOCtest_06-Nov-2007\VOCdevkit下必须存在VOC2007或者VOC2012文件夹
python .\tools\dataset_converters\pascal_voc.py \VOCdevkit --out-dir .\data --out-format coco 

(二)、训练

(1)、单机单卡

python ./tools/train.py ./configs/yolox/yolox_s_8x8_300e_coco.py 

(二)、单机多卡

./tools/dist_train.sh ./configs/yolox/yolox_s_8x8_300e_coco.py 8
# 也可以指定端口号
CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4
CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4

训练后会在mmdetection/work_dirs/yolox_s_8x8_300e_coco/ 下生成训练结果,其中,yolox_s_8x8_300e_coco.py为训练模型的配置文件;20220705_155440.log 终端log文件;20220705_155440.log.json json版本,主要是之后可视化训练过程参数使用。

(三)、恢复训练

若中途中断训练,可接上次训练结果继续训练,或从之前某个epoch的模型直接开始训练:

python ./tools/train.py ./work_dirs/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco.py --auto-resume 
python ./tools/train.py ./work_dirs/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco.py --resume-from ./work_dirs/yolox_s_8x8_300e_coco/epoch_100.pth

(三)、测试

修改:detect/mmdetection/mmdet/models/detectors/base.py
这是在txt文件下定义图片后缀的情况下需要修改
在这里插入图片描述
运行测试脚本,将test.txt中的图像拿来测试效果:image_test.py:

from argparse import ArgumentParser
import os
from mmdet.apis import inference_detector, init_detector 
import cv2

def show_result_pyplot(model, img, result, score_thr=0.3, fig_size=(15, 10)):
    """Visualize the detection results on the image.
    Args:
        model (nn.Module): The loaded detector.
        img (str or np.ndarray): Image filename or loaded image.
        result (tuple[list] or list): The detection result, can be either
            (bbox, segm) or just bbox.
        score_thr (float): The threshold to visualize the bboxes and masks.
        fig_size (tuple): Figure size of the pyplot figure.
    """
    if hasattr(model, 'module'):
        model = model.module
    img = model.show_result(img, result, score_thr=score_thr, show=False)
    return img

def main():
    # config文件
    config_file = '[path]/mmdetection/work_dirs/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco.py'
    # 训练好的模型
    checkpoint_file = '[path]/mmdetection/work_dirs/yolox_s_8x8_300e_coco/epoch_100.pth'

    # model = init_detector(config_file, checkpoint_file)
    model = init_detector(config_file, checkpoint_file, device='cuda:0',)

    # 图片路径
    img_dir = '[path]/data/JPEGImages/'
    # 检测后存放图片路径
    out_dir = '[path]/mmdetection/work_dirs/yolox_s_8x8_300e_coco/images_test_result/'

    if not os.path.exists(out_dir):
        os.mkdir(out_dir)
    
    # 测试集的图片名称txt
    test_path = '[path]/data/ImageSets/Main/test.txt'
    fp = open(test_path, 'r')
    test_list = fp.readlines()
    count = 0
    for test in test_list:
        test = test.replace('\n', '')
        test2=test[:-4]
        name = img_dir + test + '.jpg'
    
        count += 1
        print('model is processing the {}/{} images.'.format(count, len(test_list)))
        result = inference_detector(model, name)
        img = show_result_pyplot(model, name, result)
        cv2.imwrite("{}/{}.jpg".format(out_dir, test2), img)

if __name__ == '__main__':
    main()

(四)、可视化

(1)、可视化训练过程参数:

(1)、训练过程的map
python ./tools/analysis_tools/analyze_logs.py plot_curve ./work_dirs/yolox_s_8x8_300e_coco/20220705_155440.log.json --keys mAP  --out out2.jpg --eval-interval 10

在这里插入图片描述

(2)、训练过程的loss
python ./tools/analysis_tools/analyze_logs.py plot_curve ./work_dirs/yolox_s_8x8_300e_coco/20220705_155440.log.json --keys loss loss_cls loss_obj  --out out1.jpg

在这里插入图片描述

(2)、可视化数据增强处理流程的结果:

python ./tools/misc/browse_dataset.py  --output-dir ./work_dirs/yolox_s_8x8_300e_coco/vis_pipeline/ ./work_dirs/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco.py 

(3)、开启tensorboard实时查看训练参数变化:

mmdetection/configs/base/default_runtime.py
打开下面注释:
在这里插入图片描述

(五)、异常处理

针对标注文件 .xml的没有 标签的情况
AttributeError: ‘NoneType‘ object has no attribute ‘text‘
报错原因:标注文件 .xml的没有的标签。difficlut表明这个待检测目标很难识别,有可能是虽然视觉上很清楚,但是没有上下文的话还是很难确认它属于哪个分类;标为difficult的目标在测试成绩的评估中一般会被忽略,下面举一个例子:
在这里插入图片描述
种解决方法:

1、可以查找.xml标注文件,把没有difficlut标签的补上。
2、若标签数据非常多,所有都添加上difficult的话非常耗时。如果数据没有特别难分的类别,可以忽略这个标签,在代码里把difficlut置为1,具体操作如下:打开mmdet/datasets/xml_style.py,将difficult=int(obj.find(‘difficult’).text)改为如下代码:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端js面试题 (四)

文章目录 ES6新增的proxy手写,proxy访问某对象输出别的数字深度拷贝,为啥无法使用JSON.parse(JSON.stringify(obj))异步编程有哪些,async await来由,本质原理是什么事件队列输出题第一题第二题第三题 粘性布局的原理,以…

Live800:2023年客服团队管理有哪些思路和方法?

在数字化时代,客服团队成为企业与客户之间的重要桥梁。随着技术不断发展,客服团队管理也在不断进化。到了2023年,最新的客服团队管理将会有哪些思路和方法呢? 一、智能化客服系统 随着人工智能技术的不断发展,智能化客…

redis-5.0.8主从集群搭建、不重启修改配置文件

一、环境准备 192.168.5.100 redis-01 192.168.5.101 redis-02 192.168.5.102 redis-03 关闭防火墙、能够通网 二、安装redis [rootlocalhost ~]# wget http://download.redis.io/releases/redis-5.0.8.tar.gz [rootlocalhost ~]# tar xf redis-5.0.8.tar.gz -C /usr/loca…

2023.11.15 hive sql之函数标准,字符串,日期,数学函数

目录 一.函数分类标准 二.查看官方函数,与简单演示 三.3种类型函数演示 四.字符串函数 1.常见字符串函数 2.索引函数 解析函数 五.日期函数 1.获取当前时间 2.获取日期相关 3.周,季度等计算 4.时间戳 六.数学函数 一.函数分类标准 目前hive三大标准 UDF:&#xff08…

十大适合外贸企业邮箱的Gmail替代品推荐

电子邮件仍然是许多人选择的媒介,因为它是交换信息的最可靠和正式的方法。无论是个人还是小型企业,电子邮件仍然是个人和专业用途的重要通信工具。它提供了一种安全、可靠且正式的方法来交换信息和文档以及共享文件。 对于大多数人来说,Googl…

RT-Thread STM32F407 DMA

这里以串口的DMA方式接收为例,串口1进行调试,串口2进行DMA接收 第一步,进入RT-Thread Settings配置DMA 第二步,进入board.h,定义串口及DMA宏 第三步,回到main.c,配置串口及DMA模式 第四步…

uniapp开发ios上线(在win环境下使用三方)

苹果 1、win环境下无法使用苹果os编译器所以使用第三方上传工具,以下示例为 初雪云 (单次收费,一元一次) 初雪云(注册p12证书):https://www.chuxueyun.com/#/pages/AppleCertificate 苹果开发者…

将ECharts图表插入到Word文档中

文章目录 在后端调用JS代码准备ECharts库生成Word文档项目地址库封装本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图片,然后插入到Word文档中? 首先要解决一个问题:总所周知,ECharts是前端的一个图表库…

websocket学习笔记【springboot+websocket聊天室demo】

文章目录 WebSocket是什么?为什么需要WebSocket?WebSocket和Http连接的区别WebSocket的工作原理基本交互过程: Java中的WebSocket支持WebSocket的优势springboot websocket themlef 一个聊天室demopom.xmlWebSocketConfigChatControllerWebController…

数字人,虚拟数字人——你看好数字人领域的发展吗?

你看好数字人领域的发展吗? 目录 一、虚拟人、数字人、虚拟数字人基本概念 1.1、虚拟人(Virtual Person) 1.2、 数字人(Digital Human) 1.3、虚拟数字人(Virtual Digital Human) 1.4、侧重…

Java魔法解密:HashMap底层机制大揭秘

文章目录 一、 源码深度解析1.1 窥探Java集合框架中的设计思想1.2 逐行解读HashMap的源代码1.2.1 类信息1.2.2 常量属性1.2.3 变量属性1.2.4 节点信息1.2.5 构造方法1.2.6 put方法1.2.6.1 putVal方法1.2.6.2 putTreeVal方法1.2.6.3 tieBreakOrder方法1.2.6.4 treeifyBin方法1.2…

菜单栏图标隐藏管理Bartender 5.0.44

Bartender是一款Mac上的菜单栏图标隐藏管理软件,它可以帮助用户轻松整理和管理菜单栏上的图标,使其更加整洁和有序。 以下是Bartender的一些主要特点和功能: 菜单栏图标隐藏:Bartender允许用户将一些不常用的菜单栏图标隐藏起来&a…

Uniapp-小程序自定义导航栏

一、项目背景 制作小程序页面时候发现原生导航栏有一定的高度是没有背景渲染的会出现这种情况 但是我们需要的是 二、原因 小程序的原生导航栏存在。一般可以使用 纯色填充顶部栏 可以直接使用navigationBarBackgroundColor完成 在style中添加 "navigationBarBackgrou…

【跨境电商独立站新手入门手册】

一直想要更新一个独立站的系列合集,用小白也看得懂的方式阐述怎么从0到1搭建并运营一个独立站,并且后续我也会录制成视频。 今天,它来了。 这是《跨境电商独立站新手入门手册》系列的第一篇。 你是否有过这样的经历:当你在网上浏…

AMEYA360分析:蔡司工业CT中的自动缺陷检测

蔡司自动缺陷检测:适用于您的应用领域的AI软件 蔡司自动化缺陷检测机器学习软件将人工智能应用于3D CT和2D X射线系统,树立了新的标杆,可对缺陷或异常(不规则)进行检测、定位与分类,同时通过读取CT扫描和X射线结果对其进行详细分析…

ACM/IEEE Fellow、欧洲科学院院士王义教授将在2023年CCF中国软件大会上作特邀报告...

2023年CCF中国软件大会(CCF ChinaSoft 2023)邀请王义作大会特邀报告。 特邀嘉宾 王义 ACM/IEEE Fellow、欧洲科学院院士 Wang is a chair professor at Uppsala University. He has a Ph.D. in Computer Science from Chalmers. His interests are mainl…

LLMs可以遵循简单的规则吗?

深度学习自然语言处理 原创作者:wkk 由于大型语言模型在现实世界中的责任越来越大,因此如何以可靠的方式指定和约束这些系统的行为很重要。一些开发人员希望为模型设置显式规则,例如“不生成滥用内容”,但这种方式可能会被特殊技术…

Mysql数据备份 —xtrabackup

一 备份介绍 ### 优点: 1. **在线备份:** XtraBackup 支持在线备份,这意味着你可以在 MySQL 服务器运行的同时进行备份,而无需停止数据库服务。这对于生产环境中的数据库是非常关键的,因为可以最小化停机时间。 2. **…

【工具流】WSL2安装

一些废话 最近看到了PKU出品的cs自学指南,想要跟着里面的自学路径学国外的优质课程,无奈大多数pre教程里面都是直接Linux环境下的操作,并且我在CSwiki看到了那个熟悉的上学期学了一点的missing-semester课。 上学期自学missing-semester的时候…

Git 修改历史 commit message

一. 修改最新的 commit log 修改最近一次commit message, 直接使用命令 git commit --amend 就可以完成修改二. 修改历史 commit log 查看日志(按 q 退出) git log --oneline # 查看5步的log。 git log --oneline -5选择要修改的commit 信息 # 要修改的 commit log…