mmdetection实战,训练自己的数据集

1 库安装

        pip install timm==1.0.7 thop efficientnet_pytorch==0.7.1 einops grad-cam==1.4.8 dill==0.3.6 albumentations==1.4.11 pytorch_wavelets==1.3.0 tidecv PyWavelets -i https://pypi.tuna.tsinghua.edu.cn/simplepip install -U openmim -i https://pypi.tuna.tsinghua.edu.cn/simplemim install mmengine -i https://pypi.tuna.tsinghua.edu.cn/simplemim install "mmcv==2.1.0" -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install YOLO
pip install ultralytics

*需要注意mmcv库的兼容性。

2 源码下载

GitHub - open-mmlab/mmdetection at v3.0.0

3 数据集准备

我是yolo数据集转coco

使用时需要修改类别和路径。

import json
import os
import shutilimport cv2# info ,license,categories 结构初始化;
# 在train.json,val.json,test.json里面信息是一致的;# info,license暂时用不到
info = {"year": 2024,"version": '1.0',"date_created": 2024 - 6 - 9
}licenses = {"id": 1,"name": "null","url": "null",
}# 自己的标签类别,跟yolo的数据集类别要对应好;
categories = [{"id": 0,"name": 'L',"supercategory": 'lines',},{"id": 1,"name": 'R',"supercategory": 'lines',},{"id": 2,"name": 'I',"supercategory": 'lines',},{"id": 3,"name": 'M',"supercategory": 'lines',},{"id": 4,"name": 'A',"supercategory": 'lines',}]# 初始化train,test、valid 数据字典
# info licenses categories 在train和test里面都是一致的;
train_data = {'info': info, 'licenses': licenses, 'categories': categories, 'images': [], 'annotations': []}
test_data = {'info': info, 'licenses': licenses, 'categories': categories, 'images': [], 'annotations': []}
valid_data = {'info': info, 'licenses': licenses, 'categories': categories, 'images': [], 'annotations': []}# image_path 对应yolov8的图像路径,比如images/train;
# label_path 对应yolov8的label路径,比如labels/train 跟images要对应;
def yolo_covert_coco_format(image_path, label_path):images = []annotations = []for index, img_file in enumerate(os.listdir(image_path)):if img_file.endswith('.jpg'):image_info = {}img = cv2.imread(os.path.join(image_path, img_file))height, width, channel = img.shapeimage_info['id'] = indeximage_info['file_name'] = img_fileimage_info['width'], image_info['height'] = width, heightelse:continueif image_info != {}:images.append(image_info)# 处理label信息-------label_file = os.path.join(label_path, img_file.replace('.jpg', '.txt'))with open(label_file, 'r') as f:for idx, line in enumerate(f.readlines()):info_annotation = {}class_num, xs, ys, ws, hs = line.strip().split(' ')class_id, xc, yc, w, h = int(class_num), float(xs), float(ys), float(ws), float(hs)xmin = (xc - w / 2) * widthymin = (yc - h / 2) * heightxmax = (xc + w / 2) * widthymax = (yc + h / 2) * heightbbox_w = int(width * w)bbox_h = int(height * h)img_copy = img[int(ymin):int(ymax), int(xmin):int(xmax)].copy()info_annotation["category_id"] = class_id  # 类别的idinfo_annotation['bbox'] = [xmin, ymin, bbox_w, bbox_h]  ## bbox的坐标info_annotation['area'] = bbox_h * bbox_w  ###areainfo_annotation['image_id'] = index  # bbox的idinfo_annotation['id'] = index * 100 + idx  # bbox的id# cv2.imwrite(f"./temp/{info_annotation['id']}.jpg", img_copy)info_annotation['segmentation'] = [[xmin, ymin, xmax, ymin, xmax, ymax, xmin, ymax]]  # 四个点的坐标info_annotation['iscrowd'] = 0  # 单例annotations.append(info_annotation)return images, annotations# key == train,test,val
# 对应要生成的json文件,比如instances_train.json,instances_test.json,instances_val.json
# 只是为了不重复写代码。。。。。
def gen_json_file(yolov8_data_path, coco_format_path, key):# json pathjson_path = os.path.join(coco_format_path, f'annotations/instances_{key}.json')dst_path = os.path.join(coco_format_path, f'{key}')if not os.path.exists(os.path.dirname(json_path)):os.makedirs(os.path.dirname(json_path), exist_ok=True)data_path = os.path.join(yolov8_data_path, f'images/{key}')label_path = os.path.join(yolov8_data_path, f'labels/{key}')images, anns = yolo_covert_coco_format(data_path, label_path)if key == 'train':train_data['images'] = imagestrain_data['annotations'] = annswith open(json_path, 'w') as f:json.dump(train_data, f, indent=2)# shutil.copy(data_path,'')elif key == 'test':test_data['images'] = imagestest_data['annotations'] = annswith open(json_path, 'w') as f:json.dump(test_data, f, indent=2)elif key == 'val':valid_data['images'] = imagesvalid_data['annotations'] = annswith open(json_path, 'w') as f:json.dump(valid_data, f, indent=2)else:print(f'key is {key}')print(f'generate {key} json success!')returnif __name__ == '__main__':yolov8_data_path = r''coco_format_path = r''gen_json_file(yolov8_data_path, coco_format_path, key='train')gen_json_file(yolov8_data_path, coco_format_path, key='val')gen_json_file(yolov8_data_path, coco_format_path, key='test')

coco标签可视化工具,可以用于检查数据集是否有问题


import matplotlib.pyplot as plt
import matplotlib.patches as patches
from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import os
# 定义COCO数据集的路径
dataDir = r''
dataType = 'train2017'
annFile = f'{dataDir}/annotations/instances_{dataType}.json'# 初始化COCO API
coco = COCO(annFile)# 获取一张图片的ID
imgIds = coco.getImgIds()
img = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])[0]# 加载并显示图片
I = io.imread(f'{dataDir}/{dataType}/{img["file_name"]}')
plt.imshow(I)
plt.axis('off')# 获取图片中的标注
annIds = coco.getAnnIds(imgIds=img['id'], iscrowd=None)
anns = coco.loadAnns(annIds)# 显示标注和类别标签
for ann in anns:bbox = ann['bbox']category_id = ann['category_id']category_name = coco.loadCats(category_id)[0]['name']  # 获取类别名称# 画出边框rect = patches.Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], linewidth=2, edgecolor='r', facecolor='none')plt.gca().add_patch(rect)# 在边框上方显示类别名称plt.text(bbox[0], bbox[1] - 10, category_name, color='yellow', fontsize=12, weight='bold', backgroundcolor='black')# 确保输出目录存在output_path = f'./{img["file_name"]}_annotated.jpg'
plt.savefig(output_path, bbox_inches='tight', pad_inches=0.1)
plt.show()

4 代码修改

命令行进入代码文件夹,然后输入指令

pip install -v -e.

根据你想要跑什么模型,以faster rcnn为例。

你需要修改faster-rcnn_r50_fpn_1x.py ,classes_name.py ,coco.py, coco_detection.py 和shedule_1x.py中的数据集参数和训练参数。例如类别名,类别数,数据集路径,epoches和batch等。

这些文件的路径

mmdetection-3.0.0/configs/_base_/schedules/schedule_1x.py
mmdetection-3.0.0/configs/_base_/datasets/coco_detection.py
mmdetection-3.0.0/configs/_base_/models/faster-rcnn_r50_fpn.py
mmdetection-3.0.0/mmdet/datasets/coco.py

5 运行

python tools/train.py  configs/_base_/models/faster-rcnn_r50_fpn.py

或 

python tools/train.py work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py

后续若需要修改参数可以直接在faster-rcnn_r50_fpn_1x_coco.py中修改。

6 测试

python tools/test.py work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_20.pth --show-dir out

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

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

相关文章

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…

C语言:预编译过程的剖析

目录 一.预定义符号和#define定义常量 二.#define定义宏 三.宏和函数的对比 四、#和##运算符 五、条件编译 在之前,我们已经介绍了.c文件在运行的过程图解,大的方面要经过两个方面。 一、翻译环境 1.预处理(预编译) 2.编译 3…

【网络安全】Cookie与ID未强绑定导致账户接管

未经许可,不得转载。 文章目录 前言正文前言 DigiLocker 是一项在线服务,旨在为公民提供一个安全的数字平台,用于存储和访问重要的文档,如 Aadhaar 卡、PAN 卡和成绩单等。DigiLocker 通过多因素身份验证(MFA)来保护用户账户安全,通常包括 6 位数的安全 PIN 和一次性密…

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度,以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接: https://automaticaddison.com/how-to-s…

Redis --- 第二讲 --- 特性和安装

一、背景知识 Redis特性: Redis是一个在内存中存储数据的中间件,用于作为数据库,作为缓存,在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据,通过一系列的数据结构。MySQL主要是通…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索:docker search 比如:docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像,如果有就是官方镜像,如果没有就是第三方的。 下载:docker pull 比如&#xff1a…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

【优选算法】(第八篇)

目录 串联所有单词的⼦串(hard) 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串(hard) 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串(hard) 题目解析 1.题目链接:. - 力扣&#…

Redis:list类型

Redis:list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构,Redis也做出了相应的支持。 如图&#xff…

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面,输入固定的起手式提示词。 第1步,开启 ControlNet,将需要扩充的图片加载进来: 控制类型选择「Inpaint」,预处理器选择「inpaint_onlylama」,缩放模式选择「缩放后填充空白」&#xff1…

基于SpringBoot+Vue的网约车管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

(Django)初步使用

前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架,适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档,使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…

Leetcode—763. 划分字母区间【中等】

2024每日刷题&#xff08;175&#xff09; Leetcode—763. 划分字母区间 C实现代码 class Solution { public:vector<int> partitionLabels(string s) {int rightmost[26];int l 0;int r 0;for(int i 0; i < s.length(); i) {rightmost[s[i] - a] i;}vector<…

[C语言]第十一节 函数递归一基础知识到高级技巧的全景探索

目录 11.1. 递归是什么&#xff1f; 11.1.1 递归的思想&#xff1a; 11.2 递归的限制条件 举例1&#xff1a;求n的阶乘 画图推演 举例2&#xff1a;顺序打印⼀个整数的每⼀位 画图推演 11.3. 递归与迭代 举例3&#xff1a;求第n个斐波那契数 11.1. 递归是什么&#xff…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

【Java数据结构】栈 (Stack)

【本节目标】 1. 栈的概念及使用 2. 相关 OJ 题 一、概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last…

【2024】前端学习笔记11-网页布局-弹性布局flex

学习笔记 网页布局弹性布局&#xff1a;flex案例&#xff1a;flex布局案例 网页布局 在页面布局中&#xff0c;display属性用于设置一个元素的显示方式。它可以指定元素是作为块级元素、内联元素还是充当表格元素显示。 display的常见属性值&#xff1a; block&#xff1a;将…

k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载

目录 1 MetailLB 搭建 1.1 MetalLB 的作用和原理 1.2 MetalLB功能 1.3 部署 MetalLB 1.3.1 创建deployment控制器和创建一个服务 1.3.2 下载MealLB清单文件 1.3.3 使用 docker 对镜像进行拉取 1.3.4 将镜像上传至私人仓库 1.3.5 将官方仓库地址修改为本地私人地址 1.3.6 运行清…

ensp回顾--聚合链路技术简介与详细案例(构建基于交换机到交换机的聚合链路)

文章目录 什么是聚合链路&#xff1f;聚合链路的工作原理聚合链路的优势使用场景 案例ensp版本图例pc的ip地址具体步骤连通性测试 在现代网络中&#xff0c;聚合链路&#xff08;Link Aggregation&#xff09;是一种常见的技术&#xff0c;用于提高网络连接的带宽和可靠性。本文…

RNN经典案例——构建人名分类器

RNN经典案例——人名分类器 一、数据处理1.1 去掉语言中的重音标记1.2 读取数据1.3 构建人名类别与人名对应关系字典1.4 将人名转换为对应的onehot张量 二、构建RNN模型2.1 构建传统RNN模型2.2 构建LSTM模型2.3 构建GRU模型 三、构建训练函数并进行训练3.1 从输出结果中获得指定…