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…

使用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…

Vue+OpenLayers 创建地图并显示鼠标所在经纬度

1、效果 2、创建地图 本文用的是高德地图 页面 <div class"map" id"map"></div><div id"mouse-position" class"position_coordinate"></div>初始化地图 var gaodeLayer new TileLayer({title: "高德地…

Perl语言用多线程爬取商品信息并做可视化处理

首先&#xff0c;我们需要使用Perl的LWP::UserAgent模块来发送HTTP请求。然后&#xff0c;我们可以使用HTML::TreeBuilder模块来解析HTML文档。在这个例子中&#xff0c;我们将使用BeautifulSoup模块来解析HTML文档。 #!/usr/bin/perl use strict; use warnings; use LWP::User…

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前&#xff0c;结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等&#xff0c;在研发全流程中&#xff0c;已经沉淀了对应的质量保障的实践经验&#xff0c;并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…

Maven 从入门到精通

目录 一. 前言 二. Maven 下载与安装 2.1. 下载 2.2. 安装 三. Maven 核心概念 3.1. POM 3.2. 约定的目录结构 3.3. 坐标 3.4. 依赖管理 3.4.1. 直接依赖和间接依赖 3.4.2. 依赖的排除 3.4.3. 统一的版本管理 3.4.4. 依赖范围 3.5. 仓库 3.6. 生命周期/插件/目标…

vue3怎么获取el-form的元素节点

在元素中使用ref设置名称 在ts中通过从element-plus引入formInstance,设置formRef同名名称字段来获取el-form节点

HackTheBox-Starting Point--Tier 1---Funnel

文章目录 一 题目二 实验过程三 利用SSH隧道3.1 本地端口转发 一 题目 Tags FTP、PostgreSQL、Reconnaissance、Tunneling、Password Spraying、Port Forwarding、Anonymous/Guest Access、Clear Text Credentials译文&#xff1a;FTP、PostgreSQL、侦察、隧道技术、密码喷洒…