detectron2环境搭建及自定义coco数据集(voc转coco)训练

detectron2建议ubuntu进行环境搭建,Windows大概率报错

一 环境搭建

创建虚拟环境

conda create -n detectron2 python=3.8 -y
conda activate detectron2

后面下载源代码建议存到git中再git clone

git clone https://github.com/facebookresearch/detectron2.git
python -m pip install -e detectron2

二 数据集构建

首先有两个文件夹,一个为图像,一个为标注完的voc的xml文件夹
在这里插入图片描述
在这里插入图片描述
后先划分数据集,创建以下格式

-- imageSets---Main----test.txt----train.txt----trainval.txt----val.txt

运行以下代码进行划分

import os
import random
def main():trainval_percent = 0.2train_percent = 0.8xmlfilepath = 'D:\\lunwen\\data\\data\\xml' # xml文件位置txtsavepath = r'D:\\lunwen\\data\\data\\image'  # 图像位置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)
## 以下为对应的txt文件进行修改ftrainval = open('D:\\lunwen\\data\data\\ImageSets\\Main\\trainval.txt', 'w')ftest = open('D:\\lunwen\\data\data\\ImageSets\\Main\\test.txt', 'w')ftrain = open('D:\\lunwen\\data\data\\ImageSets\\Main\\train.txt', 'w')fval = open('D:\\lunwen\\data\data\\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:ftest.write(name)else:fval.write(name)else:ftrain.write(name)ftrainval.close()ftrain.close()fval.close()ftest.close()if __name__=='__main__':main();

划分完后对应的txt文件都有数据,后面将进行文件提取,提取出对应的训练/测试数据集及其xml文件

源目录下创建以下文件夹

-train_JPEGImages
-train_annotations
-val_JPEGImages
-val_annotations
import os
import shutilclass CopyXml():def __init__(self):# 你的xml格式的annotation的路径self.xmlpath = r'D:\lunwen\data\data\xml'self.jpgpath = r'D:\lunwen\data\data\image'# 你训练集/测试集xml和jpg存放的路径self.newxmlpath = r'D:\lunwen\data\data\val_annotations'self.newjpgpath = r'D:\lunwen\data\data\val_JPEGImages'def startcopy(self):filelist = os.listdir(self.xmlpath)  # file list in this directory# print(len(filelist))test_list = loadFileList()# print(len(test_list))for f in filelist:xmldir = os.path.join(self.xmlpath, f)(shotname, extension) = os.path.splitext(f)jpgdir = os.path.join(self.jpgpath, shotname+'.jpg')if str(shotname) in test_list:# print('success')shutil.copyfile(str(xmldir), os.path.join(self.newxmlpath, f))shutil.copyfile(str(jpgdir), os.path.join(self.newjpgpath, shotname+'.jpg'))# load the list of train/test file list
def loadFileList():filelist = []## 选取你上一步弄好的txt文件进行提取f = open("D:\\lunwen\\data\\data\\ImageSets\\Main\\val.txt", "r")# f = open("VOC2007/ImageSets/Main/train.txt", "r")lines = f.readlines()for line in lines:# 去掉文件中每行的结尾字符line = line.strip('\r\n')  # to remove the '\n' for test.txt, '\r\n' for tainval.txtline = str(line)filelist.append(line)f.close()# print(filelist)return filelistif __name__ == '__main__':demo = CopyXml()demo.startcopy()

成功后对应文件夹下将会有对应txt下的图片及xml
后面便是voc转coco格式了,代码如下

# coding:utf-8
import sys
import os
import json
import xml.etree.ElementTree as ETSTART_BOUNDING_BOX_ID = 1
# 注意下面的dict存储的是实际检测的类别,需要根据自己的实际数据进行修改
# 这里以自己的数据集person和hat两个类别为例,如果是VOC数据集那就是20个类别
# 注意类别名称和xml文件中的标注名称一致
PRE_DEFINE_CATEGORIES = {"Normal": 0, "No_wear": 1,"Playing_phone":2,"Smoking":3,"Sleeping":4,"Playing_phone_smoking":5,"No_wear_playing_phone":6,"No_wear_smoking":7,"No_wear_sleeping":8,"No_wear_playing_phone_smoking":9}# 注意按照自己的数据集名称修改编号和名称
def get(root, name):vars = root.findall(name)return varsdef get_and_check(root, name, length):vars = root.findall(name)if len(vars) == 0:raise NotImplementedError('Can not find %s in %s.' % (name, root.tag))if length > 0 and len(vars) != length:raise NotImplementedError('The size of %s is supposed to be %d, but is %d.' % (name, length, len(vars)))if length == 1:vars = vars[0]return varsdef get_filename_as_int(filename):try:filename = os.path.splitext(filename)[0]return (filename)except:raise NotImplementedError('Filename %s is supposed to be an integer.' % (filename))def convert(xml_dir, json_file):xmlFiles = os.listdir(xml_dir)json_dict = {"images": [], "type": "instances", "annotations": [],"categories": []}categories = PRE_DEFINE_CATEGORIESbnd_id = START_BOUNDING_BOX_IDnum = 0for line in xmlFiles:#         print("Processing %s"%(line))num += 1if num % 50 == 0:print("processing ", num, "; file ", line)xml_f = os.path.join(xml_dir, line)tree = ET.parse(xml_f)root = tree.getroot()# The filename must be a numberfilename = line[:-4]image_id = get_filename_as_int(filename)size = get_and_check(root, 'size', 1)width = int(get_and_check(size, 'width', 1).text)height = int(get_and_check(size, 'height', 1).text)# image = {'file_name': filename, 'height': height, 'width': width,#          'id':image_id}image = {'file_name': (filename + '.jpg'), 'height': height, 'width': width,'id': image_id}json_dict['images'].append(image)# Cruuently we do not support segmentation#  segmented = get_and_check(root, 'segmented', 1).text#  assert segmented == '0'for obj in get(root, 'object'):category = get_and_check(obj, 'name', 1).textif category not in categories:new_id = len(categories)categories[category] = new_idcategory_id = categories[category]bndbox = get_and_check(obj, 'bndbox', 1)xmin = int(get_and_check(bndbox, 'xmin', 1).text) - 1ymin = int(get_and_check(bndbox, 'ymin', 1).text) - 1xmax = int(get_and_check(bndbox, 'xmax', 1).text)ymax = int(get_and_check(bndbox, 'ymax', 1).text)assert (xmax > xmin)assert (ymax > ymin)o_width = abs(xmax - xmin)o_height = abs(ymax - ymin)ann = {'area': o_width * o_height, 'iscrowd': 0, 'image_id':image_id, 'bbox': [xmin, ymin, o_width, o_height],'category_id': category_id, 'id': bnd_id, 'ignore': 0,'segmentation': []}json_dict['annotations'].append(ann)bnd_id = bnd_id + 1for cate, cid in categories.items():cat = {'supercategory': 'none', 'id': cid, 'name': cate}json_dict['categories'].append(cat)json_fp = open(json_file, 'w')json_str = json.dumps(json_dict)json_fp.write(json_str)json_fp.close()if __name__ == '__main__':folder_list = ["train_annotations"]# 注意更改base_dir为本地实际图像和标注文件路径base_dir = "D:\\lunwen\\data\\data\\"# 修改为自己的路径for i in range(1):folderName = folder_list[i]xml_dir = base_dir + folderNamejson_dir = base_dir + folderName + "/instances_" + folderName + ".json"print("deal: ", folderName)print("xml dir: ", xml_dir)print("json file: ", json_dir)convert(xml_dir, json_dir)

最后生成
在这里插入图片描述

在detectron2下datasets中创建coco文件夹,将对应数据放入

coco----train2017 ####手动创建----val2017 ####手动创建----annotations ####手动创建--------instances_train2017.json ####脚本生成--------instances_val2017.json ####脚本生成

三 模型训练

因为pytorch训练自己的数据集,涉及到数据集的注册,元数据集注册和加载,过程比较麻烦,这里我参考官方样本,写了一个脚本trainsample.py放置于model_train文件夹下。

import os
import cv2
import logging
from collections import OrderedDictimport detectron2.utils.comm as comm
from detectron2.utils.visualizer import Visualizer
from detectron2.checkpoint import DetectionCheckpointer
from detectron2.config import get_cfg
from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.data.datasets.coco import load_coco_json
from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, launch
from detectron2.evaluation import COCOEvaluator, verify_results
from detectron2.modeling import GeneralizedRCNNWithTTA# 数据集路径
DATASET_ROOT = './datasets/coco'
ANN_ROOT = os.path.join(DATASET_ROOT, 'annotations')TRAIN_PATH = os.path.join(DATASET_ROOT, 'train2017')
VAL_PATH = os.path.join(DATASET_ROOT, 'val2017')TRAIN_JSON = os.path.join(ANN_ROOT, 'instances_train2017.json')
# VAL_JSON = os.path.join(ANN_ROOT, 'val.json')
VAL_JSON = os.path.join(ANN_ROOT, 'instances_val2017.json')CLASS_NAMES = ['Normal','No_wear','Playing_phone','Smoking','Sleeping','Playing_phone_smoking','No_wear_playing_phone','No_wear_smoking','No_wear_sleeping','No_wear_playing_phone_smoking']
# 数据集类别元数据
DATASET_CATEGORIES = [# {"name": "background", "id": 0, "isthing": 1, "color": [220, 20, 60]},{"name": "Normal", "id": 0, "isthing": 1, "color": [255, 0, 0]},  # 红色{"name": "No_wear", "id": 1, "isthing": 1, "color": [0, 255, 0]},  # 绿色{"name": "Playing_phone", "id": 2, "isthing": 1, "color": [0, 0, 255]},  # 蓝色{"name": "Smoking", "id": 3, "isthing": 1, "color": [255, 255, 0]},  # 黄色{"name": "Sleeping", "id": 4, "isthing": 1, "color": [255, 0, 255]},  # 紫色{"name": "Playing_phone_smoking", "id": 5, "isthing": 1, "color": [0, 255, 255]},  # 青色{"name": "No_wear_playing_phone", "id": 6, "isthing": 1, "color": [128, 0, 128]},  # 深紫色{"name": "No_wear_smoking", "id": 7, "isthing": 1, "color": [128, 128, 0]},  # 深黄色{"name": "No_wear_sleeping", "id": 8, "isthing": 1, "color": [0, 128, 128]},  # 深青色{"name": "No_wear_playing_phone_smoking", "id": 9, "isthing": 1, "color": [128, 128, 128]}
]# 数据集的子集
PREDEFINED_SPLITS_DATASET = {"train_2019": (TRAIN_PATH, TRAIN_JSON),"val_2019": (VAL_PATH, VAL_JSON),
}def register_dataset():"""purpose: register all splits of dataset with PREDEFINED_SPLITS_DATASET"""for key, (image_root, json_file) in PREDEFINED_SPLITS_DATASET.items():register_dataset_instances(name=key,metadate=get_dataset_instances_meta(),json_file=json_file,image_root=image_root)def get_dataset_instances_meta():"""purpose: get metadata of dataset from DATASET_CATEGORIESreturn: dict[metadata]"""thing_ids = [k["id"] for k in DATASET_CATEGORIES if k["isthing"] == 1]thing_colors = [k["color"] for k in DATASET_CATEGORIES if k["isthing"] == 1]# assert len(thing_ids) == 2, len(thing_ids)thing_dataset_id_to_contiguous_id = {k: i for i, k in enumerate(thing_ids)}thing_classes = [k["name"] for k in DATASET_CATEGORIES if k["isthing"] == 1]ret = {"thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id,"thing_classes": thing_classes,"thing_colors": thing_colors,}return retdef register_dataset_instances(name, metadate, json_file, image_root):"""purpose: register dataset to DatasetCatalog,register metadata to MetadataCatalog and set attribute"""DatasetCatalog.register(name, lambda: load_coco_json(json_file, image_root, name))MetadataCatalog.get(name).set(json_file=json_file,image_root=image_root,evaluator_type="coco",**metadate)# 注册数据集和元数据
def plain_register_dataset():DatasetCatalog.register("train_2019", lambda: load_coco_json(TRAIN_JSON, TRAIN_PATH, "train_2019"))MetadataCatalog.get("train_2019").set(thing_classes=CLASS_NAMES,json_file=TRAIN_JSON,image_root=TRAIN_PATH)DatasetCatalog.register("val_2019", lambda: load_coco_json(VAL_JSON, VAL_PATH, "val_2019"))MetadataCatalog.get("val_2019").set(thing_classes=CLASS_NAMES,json_file=VAL_JSON,image_root=VAL_PATH)# 查看数据集标注
def checkout_dataset_annotation(name="train_2019"):dataset_dicts = load_coco_json(TRAIN_JSON, TRAIN_PATH, name)for d in dataset_dicts:img = cv2.imread(d["file_name"])visualizer = Visualizer(img[:, :, ::-1], metadata=MetadataCatalog.get(name), scale=1.5)vis = visualizer.draw_dataset_dict(d)cv2.imshow('show', vis.get_image()[:, :, ::-1])cv2.waitKey(0)register_dataset()checkout_dataset_annotation()

slowfast源码中采取的模型架构为
在这里插入图片描述
在config中找到对应的yaml文件,并在trainsample.py进行设定

后运行

$ python3 model_train/trainsample.py

四 问题

1.缺少cv2模块

pip install opencv-python

2.PIL中缺少模块

`LINEAR` is deprecated and will be removed in Pillow 10 (2023-07-01). Use BILINEAR or Resampling.BILINEAR instead. 

版本更新

pip install pillow==9.5.0

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

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

相关文章

Python中的del用法

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题。 python的del不同于C的fre…

大厂真题:【位运算】米哈游2023秋招-相加异或

题目描述与示例 题目描述 对于一个数组c,定义f(c)为c数组所有元素的总和。 现在给定两个长度为n的数组a, b,请你恰好删除一个数组a的元素或者一个数组b的元素,使得f(a)异或f(b)最大。 输入描述 第一行输入一个整数n。 第二行输入n个整数…

Davinci报警汇总

问题号模块软件影响90220LDCOMCfgcheck不过,需要解决53006RTECfg不需要管40316Mode Declaration GroupsDev不需要管40333Application Port InterfacedDev不需要管40334Application Port InterfacedDev不需要管40339Application Port InterfacedDev不需要管40041Appl…

使用Drupal管理小型项目?试试Docker快速部署Drupal结合内网穿透实现远程访问

🎬 鸽芷咕:个人主页 🔥个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal…

SUSE 12双网卡绑定

原创作者:运维工程师 谢晋 SUSE 12双网卡绑定 客户环境及需求网卡绑定 客户环境及需求 客户一台物理机安装了SUSE 12的操作系统,需要将ETH5和ETH7双网卡聚合为一块虚拟网卡,以保证一块网卡故障不会影响系统正常运行。 网卡绑定 输入命令c…

HBase学习笔记(1)—— 知识点总结

目录 HBase概述 HBase 基本架构 HBase安装部署启动 HBase Shell HBase数据读写流程 HBase 优化 HBase概述 HBase是以 hdfs 为数据存储的,一种分布式、非关系型的、可扩展的 NoSQL 数据库 关系型数据库和非关系型数据库的区别: 关系型数据库和非关…

windows系统自动更新中断电导致系统无法开启

windows系统自动更新中断电导致系统无法开启 现象原因解决进入bios拆机更新系统重新安装内存条 现象 前一天晚上电脑出现合上之后风扇继续转的现象,拔掉电源后,第二天开不了机。现象为按压电源键,电源键和充电指示灯亮一次后熄灭&#xff0c…

每天一点python——day65

#每天一点Python——65 #字符串的内容对齐操作类似于word中左对齐、右对齐、居中对齐如图 #例: s1hello,python print(s1.center(20,*))#设置宽度20,填充图是*s1有12个字符,这个字符串的宽度设置为20, 20-128 因为center是居中对齐…

后端面试问题(学习版)

JAVA相关 JAVA语言概述 1. 一个".java"源文件中是否可以包含多个类?有什么限制? 可以。 一个源文件可以声明多个类,但是最多只能有一个类使用public进行声明 且要求声明public的类的类名与源文件相同。 2. Java的优势&#xff…

MySQL进阶_1.逻辑架构和SQL执行流程

文章目录 第一节、逻辑架构剖析1.1、服务器处理客户端请求1.2、Connectors1.3、第1层:连接层1.4、第2层:服务层1.5、 第3层:引擎层1.6、 存储层1.7、小结 第二节、SQL执行流程2.1、查询缓存2.2、解析器2.3、优化器2.4、执行器 第三节、数据库…

安装dubbo-admin报错node版本和test错误

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :dubbo-admin安装 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台&#xff0…

【Linux】进程的基本概念和进程控制

TOC 目录 一.冯诺依曼体系结构 二. 操作系统(Operator System) 概念 设计OS的目的 定位 总结 系统调用和库函数概念 进程 基本概念 描述进程-PCB task_struct-PCB的一种 task_ struct内容分类 组织进程 查看进程 通过系统调用获取进程标识符 进程状态 D--深度…

【笔记】原型和原型链(持续完善)

概念 原型:函数都具有 prototype 属性,称之为原型,也称之为原型对象 1.1 原型可以放一些属性和方法,共享给实例对象使用(也就是原生方法)。 1.2 原型可以做继承原型链:对象都有 __proto__ 属性…

Qt 4.8.6 的下载与安装

Qt 4.8.6 的下载与安装 Qt 4.8.6 的下载与安装下载并解压 MinGW 4.8.2Qt4.8.6 库的安装Qt Creator 3.3.0 的安装配置 Qt Creator测试 Qt 4.8.6 的下载与安装 学习《Qt Creator快速入门》(第3版),书里面要用 Qt:phonon,这个组件要…

CentOS7 安装Jenkins 2.414.3 详细教程

目录 1、前提条件硬件软件-java11安装 2、安装jenkins3、启动jenkins配置用户和用户组配置JAVA_HOME 4、配置Jenkins一直处于启动状态5、测试Jenkins是否可以访问以及配置6、访问Jenkins系统 1、前提条件 硬件 内存 4G ; 硬盘 20G 软件-java11安装 上传文件jdk-11.0.21_lin…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析》(2)

《Linux操作系统原理分析》(2) 2 Linux概述2.1 Linux发展史2.2 Linux与GNC 2.3 Linux性能2.4 Linux 技术特点 2 Linux概述 2.1 Linux发展史 年份事件1991年22岁的荷兰大学生 Linus B.Torvalds 在 PC 机上开发出简单的操作系统内核程序。1994 年 3 月Li…

Excel表格密码保护,避免他人编辑

最简单的办法解密和去除Excel表格密码是通过密码帝官网完成。具体步骤如下:第一步,在百度搜索【密码帝官网】,找到官网后第二步,点击“立即开始”进入用户中心,然后上传需要解密的Excel文件。无论是在手机还是电脑上都…

JavaScript中普通函数箭头函数容易混淆的this指向

[[toc]] 普通函数this指向什么? 普通函数的this指向哪里? this指向调用它的对象函数定义无法确定,只有函数执行时才能确定普通函数有哪些? 没有调用者的函数对象内函数使用apply// 没有调用者的函数: this(非严格)指向全局window function test(){console.log(this=,this…

常见的深度相机厂商

文章目录 OAK奥比中光图漾科技 OAK 官网地址:https://www.oakchina.cn/ OAK相机是3D视觉人工智能开发套件,它内置了深度相机(双目/结构光/ TOF)、4T算力2.5W功耗的AI处理芯片、IMU惯性导航芯片于一体。支持实时120FPS深度图像输…