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 cv2def 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.moduleimg = model.show_result(img, result, score_thr=score_thr, show=False)return imgdef 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)# 测试集的图片名称txttest_path = '[path]/data/ImageSets/Main/test.txt'fp = open(test_path, 'r')test_list = fp.readlines()count = 0for test in test_list:test = test.replace('\n', '')test2=test[:-4]name = img_dir + test + '.jpg'count += 1print('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)改为如下代码:
在这里插入图片描述

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

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

相关文章

Linux 图形界面配置RAID

目录 RAID 1 配置 RAID 5配置 , RAID 配置起来要比 LVM 方便,因为它不像 LVM 那样分了物理卷、卷组和逻辑卷三层,而且每层都需要配置。我们在图形安装界面中配置 RAID 1和 RAID 5,先来看看 RAID 1 的配置方法。 RAID 1 配置 配置 RAID 1…

OpenGL的学习之路-3

前面1、2介绍的都是glut编程 下面就进行opengl正是部分啦。 1.绘制点 #include <iostream> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h>void myMainWinDraw();int main(int argc,char** argv) {glutInit(&argc,argv);glutIni…

基于谐波参数空间的卷积神经网络自动三维牙齿分割

论文连接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1524070320300151 机构&#xff1a; a英国卡迪夫大学计算机科学与信息学院 b中国科学院大学北京 c中国科学院计算技术研究所北京 d深圳大数据研究院&#xff0c;深圳518172 代码链接&#x…

Window MongoDB安装

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

保姆级vue-pdf的使用过程

第一步 引入vue-pdf npm install --save vue-pdf 第二步 按照需求我们慢慢进行 01.给你一个pdf文件的url&#xff0c;需要在页面渲染 代码 <template><div><pdfref"pdf":src"url"></pdf></div> </template> <…

灰度图处理方法

做深度学习项目图像处理的时候常常涉及到灰度图处理&#xff0c;这里对自己处理灰度图的方式做一个记录&#xff0c;后续有更新的话会在此更新 一&#xff0c;多维数组可视化 将多维数组可视化为灰度图 img_gray Image.fromarray(img, modeL) # 实现array到image的转换,m…

深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

使用 Electron 来替代本地调试线上代理的场景

Cookie Samesite 问题 https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure?hlzh-cnhttps://www.chromium.org/updates/same-site/https://github.com/GoogleChromeLabs/samesite-exampleshttps://releases.electronjs.org/releases/s…

PieCloudDB Database 自研内存管理器 ASanAlloc:为产品质量保驾护航

内存管理是计算机科学中至关重要的一部分&#xff0c;它涉及到操作系统、硬件和软件应用之间的动态交互。有效的内存管理可以确保系统的稳定性和安全性&#xff0c;提高系统运行效率&#xff0c;帮助我们最大限度地利用有效的内存资源&#xff0c;合理分配和回收内存&#xff0…

【SQLite】的使用及指令| 编程操作(增删改查)

一、SQLite 使用和指令集 SQLite 的基本使用SQL 命令 二、常见的 SQL 数据类型 三、SQLite的命令用法 四、SQLite的编程操作 五、sqlite3_open函数 六、sqlite3_close函数 七、sqlite3_errcode函数 八、SQLite C Interface 九、sqlite3_exec函数 十、callback回调函数 十一、…

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Python小白之PyCharm仍然显示“No module named ‘xlwings‘”

Python小白之“没有名称为xlwings‘的模块”-CSDN博客文章浏览阅读8次。cmd 打开命令行&#xff0c;输入python出现>>>的提示格&#xff0c;输入import xlwings 回车&#xff0c;正常报错&#xff1a;No module named xlwings。输入python 回车后&#xff0c;再输入im…

宏观角度认识递归之求根节点到叶节点数字之和

LCR 049. 求根节点到叶节点数字之和 - 力扣&#xff08;LeetCode&#xff09; 理解题意分析子问题&#xff1a;给一个头节点&#xff0c;要返回该头结点左右子树的根结点到叶节点数字和。此处还需注意&#xff1a;在获取根结点到叶节点数字和的时候&#xff0c;要传递一个参数&…

openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

文章目录 openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库121.1 连接密态数据库121.2 调用isValid方法刷新缓存示例121.3 执行密态等值查询相关的创建密钥语句121.4 执行密态等值查询相关的创建加密表的语句121.5 执行加密表的预编译SQL语…

ACM练习——第三天

今天继续练习C和ACM模式 在写题之前先了解一些新的知识 1.#include <algorithm> #include <algorithm> 是 C 标准库中的头文件之一&#xff0c;其中包含了一系列用于处理各种容器&#xff08;如数组、向量、列表等&#xff09;和其他数据结构的算法。这个头文件提供…

【Liunx】DHCP服务

【Liunx】DHCP服务 DHCP概述A.安装dhcpB.查看配置文件C.修改配置文件 DHCP概述 DHCP(Dynamic Host Configuration Protocol)i动态主机配置协议 DHCP是由Internet工作任务小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议。 口使用DHCP服务的…

使用PHP编写采集药品官方数据的程序

目录 一、引言 二、程序设计和实现 1、确定采集目标 2、使用PHP的cURL库进行数据采集 3、解析JSON数据 4、数据处理和存储 5、数据验证和清理 6、数据输出和可视化 7、数据分析和挖掘 三、注意事项 1、合法性原则 2、准确性原则 3、完整性原则 4、隐私保护原则 …

【避雷帖!】安美酷便携屏(安美特)

强烈建议别购买京东安美酷便携屏&#xff0c;太脆弱了&#xff0c;一碰就坏&#xff0c;客服态度不行&#xff0c;容易闪屏等等缺点。而且价格偏贵&#xff0c;淘宝上两百块的屏幕足够用了&#xff0c;没必要花六百多块钱&#xff0c;如果就是买来打游戏的话&#xff0c;也用不…

Adobe 2023 全家桶最终版,一键安装,永久免费,赶紧收藏!(win/mac)

文件名称 Adobe 2023 全家桶最终版 支持系统 windows、mac 获取方式 文章底部 分享形式 百度网盘 小励花了一天的时间给大家整理上传了这份最终版全家桶&#xff0c;全部一键安装即可&#xff0c;无需激活&#xff0c;安装以后即可永久使用&#xff0c;觉得给力的小伙伴…

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而&#xff0c;对于许多传统企业而言&#xff0c;如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…