YoloV5训练V3Det数据集实战

摘要

V3Det:一个庞大的词汇视觉检测数据集,在大量真实世界图像上具有精确注释的边界框,其包含13029个类别中的245k个图像(比LVIS大10倍),数据集已经开源!

图片的数量比COCO多一些,类别种类比较多!数据集大小由33G,数据集标注格式和COCO一致!
论文链接:https://arxiv.org/abs/2304.03752

这个数据集最大的特点就是类别多,还有些千奇百怪不可描述的图片!
在这里插入图片描述

下载V3Det的标注文件

官方提供了两种下载方式,见:https://v3det.openxlab.org.cn/download
第一种,点击左侧的链接,将其中的文件都下载下来!
在这里插入图片描述
v3det_2023_v1_train.json和v3det_2023_v1_val.json是数据集!
v3det_image_download.py是下载图片的脚本。
category_name_13204_v3det_2023_v1.txt 是类别!
第二种下载方式如下:
在这里插入图片描述
采用命令行,注册后输入密钥就能下载!下载下来的文件和第一种下载方式的文件一样,都没有图像,只能运行脚本下载图片!

下载图片的脚本

由于总所周知的原因不太好链接,多试几次,总有成功的时候。

import io
import argparse
import concurrent.futures
import json
import os
import time
import urllib.error
import urllib.requestfrom tqdm import tqdmparser = argparse.ArgumentParser()
parser.add_argument("--output_folder", type=str, default="V3Det")
parser.add_argument("--max_retries", type=int, default=3)
parser.add_argument("--max_workers", type=int, default=16)
args = parser.parse_args()
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'}def cache(response):f = io.BytesIO()block_sz = 8192while True:buffer = response.read(block_sz)if not buffer:breakf.write(buffer)return fdef download_image(url, path, timeout):result = {"status": "","url": url,"path": path,}cnt = 0while True:try:response = urllib.request.urlopen(urllib.request.Request(url=url, headers=headers), timeout=timeout)image_path = os.path.join(args.output_folder, path)os.makedirs(os.path.dirname(image_path), exist_ok=True)f = cache(response)with open(image_path, "wb") as fp:fp.write(f.getvalue())result["status"] = "success"except Exception as e:if not isinstance(e, urllib.error.HTTPError):cnt += 1if cnt <= args.max_retries:continueif isinstance(e, urllib.error.HTTPError):result["status"] = "expired"else:result["status"] = "timeout"breakreturn resultdef main():start = time.time()if os.path.exists(args.output_folder) and os.listdir(args.output_folder):try:c = input(f"'{args.output_folder}' already exists and is not an empty directory, continue? (y/n) ")if c.lower() not in ["y", "yes"]:exit(0)except KeyboardInterrupt:exit(0)if not os.path.exists(args.output_folder):os.makedirs(args.output_folder)image_folder_path = os.path.join(args.output_folder, "images")record_path = os.path.join(args.output_folder, "records.json")record = {'success': [], 'expired': [], 'timeout': []}if os.path.isfile(record_path):try:with open(record_path, encoding="utf8") as f:record['success'] = json.load(f)['success']except:passif not os.path.exists(image_folder_path):os.makedirs(image_folder_path)list_url = 'https://raw.githubusercontent.com/V3Det/v3det_resource/main/resource/download_list.txt'response = urllib.request.urlopen(urllib.request.Request(url=list_url, headers=headers), timeout=100)url_list = [url for url in response.read().decode('utf-8').split('\n') if len(url) > 0]image2url = {}for url in url_list:response = urllib.request.urlopen(urllib.request.Request(url=url, headers=headers), timeout=100)image2url.update(eval(response.read().decode('utf-8')))data = []rec_suc = set(record['success'])for image, url in image2url.items():if image not in rec_suc:data.append((url, image))with tqdm(total=len(data)) as pbar:with concurrent.futures.ThreadPoolExecutor(max_workers=args.max_workers) as executor:# Submit up to `chunk_size` tasks at a time to avoid too many pending tasks.chunk_size = min(5000, args.max_workers * 500)for i in range(0, len(data), chunk_size):futures = [executor.submit(download_image, url, path, 10)for url, path in data[i: i + chunk_size]]for future in concurrent.futures.as_completed(futures):r = future.result()record[r["status"]].append(r["path"])pbar.update(1)with open(record_path, "w", encoding="utf8") as f:json.dump(record, f, indent=2)end = time.time()print(f"consuming time {end - start:.1f} sec")print(f"{len(record['success'])} images downloaded.")print(f"{len(record['timeout'])} urls failed due to request timeout.")print(f"{len(record['expired'])} urls failed due to url expiration.")if len(record['success']) == len(image2url):os.remove(record_path)print('All images have been downloaded!')else:print('Please run this file again to download failed image!')if __name__ == "__main__":main()

V3Det转Yolo

V3Det的标注文件和COCO是一致的!

import json
import os
import shutil
from pathlib import Path
import numpy as np
from tqdm import tqdmdef make_folders(path='../out/'):# Create foldersif os.path.exists(path):shutil.rmtree(path)  # delete output folderos.makedirs(path)  # make new output folderos.makedirs(path + os.sep + 'labels')  # make new labels folderos.makedirs(path + os.sep + 'images')  # make new labels folderreturn pathdef convert_coco_json(json_dir='./image_1024/V3Det___V3Det/raw/v3det_2023_v1_val.json',out_dir=None):# fn_images = 'out/images/%s/' % Path(json_file).stem.replace('instances_', '')  # folder nameos.makedirs(out_dir,exist_ok=True)# os.makedirs(fn_images,exist_ok=True)with open(json_dir) as f:data = json.load(f)print(out_dir)# Create image dictimages = {'%g' % x['id']: x for x in data['images']}# Write labels filefor x in tqdm(data['annotations'], desc='Annotations %s' % json_dir):if x['iscrowd']:continueimg = images['%g' % x['image_id']]h, w, f = img['height'], img['width'], img['file_name']file_path='coco/'+out_dir.split('/')[-2]+"/"+f# The Labelbox bounding box format is [top left x, top left y, width, height]box = np.array(x['bbox'], dtype=np.float64)box[:2] += box[2:] / 2  # xy top-left corner to centerbox[[0, 2]] /= w  # normalize xbox[[1, 3]] /= h  # normalize yif (box[2] > 0.) and (box[3] > 0.):  # if w > 0 and h > 0with open(out_dir + Path(f).stem + '.txt', 'a') as file:file.write('%g %.6f %.6f %.6f %.6f\n' % (x['category_id'] - 1, *box))convert_coco_json(json_dir='./image_1024/V3Det___V3Det/raw/v3det_2023_v1_val.json',out_dir='out/labels/val/')
convert_coco_json(json_dir='./image_1024/V3Det___V3Det/raw/v3det_2023_v1_train.json',out_dir='out/labels/train/')

复制图片到指定目录

将图片放到和Label同级的images文件夹

import glob
import os
import shutilimage_paths = glob.glob('V3Det/images/*/*.jpg')dir_imagepath = {}for image_path in image_paths:image_key = image_path.replace('\\', '/').split('/')[-1].split('.')[0]dir_imagepath[image_key] = image_pathos.makedirs('out/images/train',exist_ok=True)
os.makedirs('out/images/val',exist_ok=True)def txt_2_image(txt_dir='out/labels/train/', out_path='out/images/train'):txt_paths = glob.glob(txt_dir + '*.txt')for txt in txt_paths:txt_key = txt.replace('\\', '/').split('/')[-1].split('.')[0]if txt_key in dir_imagepath:image_path = dir_imagepath[txt_key]shutil.copy(image_path, out_path)else:os.remove(txt)txt_2_image(txt_dir='out/labels/train/', out_path='out/images/train')
txt_2_image(txt_dir='out/labels/val/', out_path='out/images/val')

生成类别

找到类别文件,生成YoloV5或V8的类别格式,如下图:
在这里插入图片描述
代码如下:

with open('image_1024/V3Det___V3Det/raw/category_name_13204_v3det_2023_v1.txt','r') as files:list_class=files.readlines()for i, c in enumerate(list_class):print(str(i)+": "+c.replace('\n',''))

将生成的类别复制到YoloV8或者V5的数据集配置文件中!

总结

这个数据集比COCO数据集大一些,种类更加丰富,可以使用这个数据集训练,做预训练权重!

经测验,使用V3Det训练的模型做预训练权重,训练COCO可以提升1MAp!

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

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

相关文章

云计算的大模型之争,亚马逊云科技落后了?

文丨智能相对论 作者丨沈浪 “OpenAI使用了Azure的智能云服务”——在过去的半年&#xff0c;这几乎成为了微软智能云最好的广告词。 正所谓“水涨船高”&#xff0c;凭借OpenAI旗下的ChatGPT在全球范围内爆发&#xff0c;微软趁势拉了一波自家的云计算业务。2023年二季度&a…

嵌入式C语言自我修养《数据存储与指针》学习笔记

目录 一、数据类型和存储 1.大端模式和小端模式 2.有符号数和无符号数 二、数据对齐 1.为什么要数据对齐 2.结构体对齐 3.联合体对齐 三、数据的可移植性 四、 Linux内核中的size_t类型 五、typedef的使用 1. typedef的基本用法 2.使用typedef的优势 3. typedef的作用域 六…

【SQL篇】一、Flink动态表与流的关系以及DDL语法

文章目录 1、启动SQL客户端2、SQL客户端常用配置3、动态表和持续查询4、将流转为动态表5、用SQL持续查询6、动态表转为流7、时间属性8、DDL-数据库相关9、DDL-表相关 1、启动SQL客户端 启动Flink&#xff08;基于yarn-session模式为例&#xff09;&#xff1a; /opt/module/f…

Java_类和对象详解

文章目录 前言简单认识类类定义和使用类的实例化引用的一些注意事项 类和对象的说明及关系this引用为什么要有this引用this应用this特性 构造方法构造特性及应用用this简化用idea编译器快捷创建构造 封装封装的概念访问限定符 封装的扩展-包包的概念导入包中的类自定义包常见的…

Skywalking介绍

一个优秀的项目&#xff0c;除了具有高拓展的架构、高性能的方案、高质量的代码之外&#xff0c;还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多&#xff0c;Skywalking除了提供多维度、多粒度的监控之外&#xff0c;也提供了良好的图形化界面以及性能剖析…

LeetCode 面试题 16.17. 连续数列

文章目录 一、题目二、C# 题解 一、题目 给定一个整数数组&#xff0c;找出总和最大的连续数列&#xff0c;并返回总和。 示例&#xff1a; 输入&#xff1a; [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a; 6 解释&#xff1a; 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。…

DDD学习笔记

1)ddd&#xff1a; 软件复杂性的应对之道。 但是不是说&#xff1a;redis这种不会使用。 开发过程中&#xff0c;一直面临的一种复杂性。 是一种架构思想: 领域之间的组合。 让开发软件具有搭积木的感觉。 领域的核心是边界。 以领域划分为基础。 以通用语言为建设…

持续集成交付CICD:安装Jenkins Slave(从节点)

目录 一、实验 1.安装Jenkins Slave&#xff08;从节点&#xff09; 二、问题 1.salve节点启动jenkins报错 2.终止命令行后jenkins从节点状态不在线 一、实验 1.安装Jenkins Slave&#xff08;从节点&#xff09; &#xff08;1&#xff09;查看jenkins版本 Version 2.…

c语言进阶部分详解(《高质量C-C++编程》经典例题讲解及柔性数组)

上篇文章我介绍了介绍动态内存管理 的相关内容&#xff1a;c语言进阶部分详解&#xff08;详细解析动态内存管理&#xff09;-CSDN博客 各种源码大家可以去我的github主页进行查找&#xff1a;唔姆/比特学习过程2 (gitee.com) 今天便接“上回书所言”&#xff0c;来介绍《高质…

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件&#xff0c;允许将各种二进制文件&#xff08;如PDF、Word文档等&#xff09;以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…

Qt的事件

一、鼠标按下事件 //鼠标按下事件&#xff0c;获取屏幕位置&#xff0c;并显示&#xff0c;移动显示框 void Widget::mousePressEvent(QMouseEvent *event) {if(event->button() ! Qt::LeftButton){return ;}QPoint point event->pos();QPointF winPt event->…

Python学习-shutil模块和OS模块学习

shutil模块 针对文件的拷贝&#xff0c;删除&#xff0c;移动&#xff0c;压缩和解压操作 # 1.copyfileobj只能复制文件内容&#xff0c;无法复制权限#复制文件时&#xff0c;要选择自己有权限的目录执行操作&#xff0c;创建的文件会根据系统umask设定的参数来指定用户权限 s…

首发scitb包,一个为制作统计表格而生的R包

目前&#xff0c;本人写的第3个R包scitb包已经正式在R语言官方CRAN上线&#xff0c;scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")scitb包对我而言是个很重要的R包&#xff0c;我的很多想法需要靠它做平台来实现&a…

项目实战:优化Servlet,把所有围绕Fruit操作的Servlet封装成一个Servlet

1、FruitServlet 这些Servlet都是围绕着Fruit进行的把所有对水果增删改查的Servlet放到一个Servlet里面&#xff0c;让tomcat实例化一个Servlet对象 package com.csdn.fruit.servlet; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import c…

多级缓存之JVM进程缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时&#xff0…

STM32笔记—DMA

目录 一、DMA简介 二、DMA主要特性 三、DMA框图 3.1 DMA处理 3.2 仲裁器 3.3 DMA通道 扩展: 断言&#xff1a; 枚举&#xff1a; 3.4 可编程的数据传输宽度、对齐方式和数据大小端 3.5 DMA请求映像 四、DMA基本结构 4.1 DMA_Init配置 4.2 实现DMAADC扫描模式 实现要求…

PMP考试都是什么题?

PMP考试都是选择题&#xff0c;180道选择题&#xff0c;单选170道&#xff0c;多选10道&#xff0c;告知答案选项数量。 这里分享一下PMP考试中的常见翻译问题&#xff0c;pmp干货可在文末获取。 1、题目中出现的“启动会议”或“启动大会”开工会议&#xff08;kick-off mee…

康耐视深度学习ViDi-ViDi四大工具介绍与主要用途

Cognex ViDi 工具是一系列机器视觉工具&#xff0c;通过深度学习解决各种难以解决的挑战。虽然这些工具共享一个引擎&#xff0c;但它们在图像中寻找的内容不同。更具体地说&#xff0c;在分析单个点、单个区域或完整图像时&#xff0c;每个工具都有不同的侧重点。 Locate&…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互&#xff0c;而前端框架的选择对于实现这些目标至关重要。然而&#xff0c;传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下&#xff0c;我们引入…

基础课18——智能客服系统架构

1.基础设施层 基础设施主要包括以下几点&#xff1a; 1. 硬件设施&#xff1a;包括服务器、存储设备、网络设备等&#xff0c;这是整个系统运行的物理基础。 2. 软件设施&#xff1a;包括操作系统、数据库管理系统、自然语言处理(NLP)工具和机器学习算法等&#xff0c;这些是…