KITTI数据集处理为COCO数据集格式

KITTI作为自动驾驶常用数据集,被广泛的应用于自动驾驶目标检测等过程中。
首先是数据集类别合并,原始的KITTI数据集有九个类别,分别是:

Car
Van
Truck
Pedestrian
Person_sitting
Cyclist
Tram
Misc

而我们在使用过程中,通常会对某些类别进行合并,将Car,Van,Truck,Tram统一划分为Car,将Pedestrian与Person_setting统一设置为Pedestrian,保留Cyclist,去除Misc。

# modify_annotations_txt.py
import glob
import string
txt_list = glob.glob('./Labels/*.txt') # 存储Labels文件夹所有txt文件路径
def show_category(txt_list):category_list= []for item in txt_list:try:with open(item) as tdf:for each_line in tdf:labeldata = each_line.strip().split(' ') # 去掉前后多余的字符并把其分开category_list.append(labeldata[0]) # 只要第一个字段,即类别except IOError as ioerr:print('File error:'+str(ioerr))print(set(category_list)) # 输出集合def merge(line):each_line=''for i in range(len(line)):if i!= (len(line)-1):each_line=each_line+line[i]+' 'else:each_line=each_line+line[i] # 最后一条字段后面不加空格each_line=each_line+'\n'return (each_line)print('before modify categories are:\n')
show_category(txt_list)for item in txt_list:new_txt=[]try:with open(item, 'r') as r_tdf:for each_line in r_tdf:labeldata = each_line.strip().split(' ')if labeldata[0] in ['Truck','Van','Tram']: # 合并汽车类labeldata[0] = labeldata[0].replace(labeldata[0],'Car')if labeldata[0] == 'Person_sitting': # 合并行人类labeldata[0] = labeldata[0].replace(labeldata[0],'Pedestrian')if labeldata[0] == 'DontCare': # 忽略Dontcare类continueif labeldata[0] == 'Misc': # 忽略Misc类continuenew_txt.append(merge(labeldata)) # 重新写入新的txt文件with open(item,'w+') as w_tdf: # w+是打开原文件将内容删除,另写新内容进去for temp in new_txt:w_tdf.write(temp)except IOError as ioerr:print('File error:'+str(ioerr))print('\nafter modify categories are:\n')
show_category(txt_list)

最终生成的数据集格式为txt,标注为YOLO格式。

在这里插入图片描述

一个txt文件对应一张图像,内容如下,分别对应类别,中心点坐标xy,标注框宽高wh。

1 0.6221936274509804 0.6093513513513513 0.08033496732026148 0.4457297297297298

随后对数据集进行划分,总共有7481张图像,按照4:1的比例划分训练集与验证集。代码如下:

import os
import random
import shutil
def mvfile(path,topath):xmllist= os.listdir(path+"/annotations/")xmlpath=path+"/annotations/"imgpath=path+"/images/"xmltopath=topath+"/val_annotations/"if not os.path.exists(xmltopath):os.makedirs(xmltopath)imgtopath = topath + "val_images"if not os.path.exists(imgtopath):os.makedirs(imgtopath)xmls = random.sample(xmllist, 1496)for xml in xmls:with open(topath+"抽取的标签.txt", "a") as f:f.write(xml+"\n")xmlfile=xmlpath+xmlprint(xmlfile)shutil.move(xmlfile,xmltopath)imgfile=imgpath+xml.replace("txt","png")print(imgfile)shutil.move(imgfile,imgtopath)if __name__ == '__main__':path="D:\graduate\datasets\detection\kitti/"mvfile(path,path+"val_images/")

通过上述程序会将验证集图像与标注文件提取出来。

在这里插入图片描述
数据集划分完成后需要将YOLO格式转换为COCO格式(JSON),即需要生成一个类别文件,里面标注的是类别名称,记得要与YOLO的类别编号一致。如下Car在YOLO中标注类别为0,Pedestrian为1,Cyclist为2。

Car
Pedestrian
Cyclist

随后将txt文件转换为COCO的json格式,在生成JSON文件时,需要原标注文件以及图像,因为要读取图像的大小等信息

import os
import json
import cv2
import random
import time
from PIL import Imagecoco_format_save_path='D:\graduate\datasets\detection\kitti\coco_annotations/val/'                      #要生成的标准coco格式标签所在文件夹
yolo_format_classes_path='D:\graduate/figures\images\Tools\Kitti2Coco\kitti.names'     #类别文件,一行一个类
yolo_format_annotation_path='D:\graduate\datasets\detection\kitti\yolo_annotations/val'        #yolo格式标签所在文件夹
img_pathDir='D:\graduate\datasets\detection\kitti/val\images/'                        #图片所在文件夹with open(yolo_format_classes_path,'r') as fr:                               #打开并读取类别文件lines1=fr.readlines()
# print(lines1)
categories=[]                                                                 #存储类别的列表
for j,label in enumerate(lines1):label=label.strip()categories.append({'id':j,'name':label,'supercategory':'None'})         #将类别信息添加到categories中
# print(categories)write_json_context=dict()                                                      #写入.json文件的大字典
write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2023, 'contributor': '', 'date_created': '2021-12-15'}
write_json_context['licenses']=[{'id':1,'name':None,'url':None}]
write_json_context['categories']=categories
write_json_context['images']=[]
write_json_context['annotations']=[]#接下来的代码主要添加'images'和'annotations'的key值
imageFileList=os.listdir(img_pathDir)                                           #遍历该文件夹下的所有文件,并将所有文件名添加到列表中
for i,imageFile in enumerate(imageFileList):imagePath = os.path.join(img_pathDir,imageFile)                             #获取图片的绝对路径image = Image.open(imagePath)                                               #读取图片,然后获取图片的宽和高W, H = image.sizeimg_context={}                                                              #使用一个字典存储该图片信息#img_name=os.path.basename(imagePath)                                       #返回path最后的文件名。如果path以/或\结尾,那么就会返回空值img_context['file_name']=imageFileimg_context['height']=Himg_context['width']=Wimg_context['date_captured']='2023-12-15'img_context['id']=i                                                         #该图片的idimg_context['license']=1img_context['color_url']=''img_context['flickr_url']=''write_json_context['images'].append(img_context)                            #将该图片信息添加到'image'列表中txtFile=imageFile[:6]+'.txt'                                               #获取该图片获取的txt文件with open(os.path.join(yolo_format_annotation_path,txtFile),'r') as fr:lines=fr.readlines()                                                   #读取txt文件的每一行数据,lines2是一个列表,包含了一个图片的所有标注信息for j,line in enumerate(lines):bbox_dict = {}                                                          #将每一个bounding box信息存储在该字典中# line = line.strip().split()# print(line.strip().split(' '))class_id,x,y,w,h=line.strip().split(' ')                                          #获取每一个标注框的详细信息class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h)       #将字符串类型转为可计算的int和float类型xmin=(x-w/2)*W                                                                    #坐标转换ymin=(y-h/2)*Hxmax=(x+w/2)*Wymax=(y+h/2)*Hw=w*Wh=h*Hbbox_dict['id']=i*10000+j                                                         #bounding box的坐标信息bbox_dict['image_id']=ibbox_dict['category_id']=class_id                                              #注意目标类别要加一bbox_dict['iscrowd']=0height,width=abs(ymax-ymin),abs(xmax-xmin)bbox_dict['area']=height*widthbbox_dict['bbox']=[xmin,ymin,w,h]bbox_dict['segmentation']=[[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]]write_json_context['annotations'].append(bbox_dict)                               #将每一个由字典存储的bounding box信息添加到'annotations'列表中name = os.path.join(coco_format_save_path,"train"+ '.json')
with open(name,'w') as fw:                                                                #将字典信息写入.json文件中json.dump(write_json_context,fw,indent=2)

生成的文件如下:

在这里插入图片描述

至此,KITTI数据集转换为COCO格式的数据集。

在运行时报错:

OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\softwares\Anconda\envs\detr\lib\site-packages\torch\lib\cusparse64_11.dll" or one of its dependencies.

这是由于虚拟内存不足导致的,看到有人说修改num_workers=0可以解决问题,但这是一种治标不治本的方法,正确方法是增大虚拟内存:
搜索 查看高级系统设置

在这里插入图片描述

找到虚拟内存

在这里插入图片描述

python安装在哪就修改哪个盘的分页文件大小。

在这里插入图片描述

修改完内存后需要重启电脑才可以,重启后运行成功。

在这里插入图片描述

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

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

相关文章

GO并发编程综合应用

一.GO并发编程综合应用 1.生产者消费者模式 1.1需求分析 ​ 生产者每秒生产一个商品,并通过物流公司取货 ​ 物流公司将商品运输到商铺 ​ 消费者阻塞等待商铺到货,需要消费10次商品 1.2实现原理 1.3代码实现: package mainimport (&q…

SpringCloud微服务 【实用篇】| Docker启示录

目录 一:Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

Python之random模块详解

python的random模块 random模块是python中一个生成随机数的模块。 random不是python解释器内置的模块。 导入random模块的方法是: import random 如果只使用random模块中的单个方法的话,也可以使用 from random import method_name 例如: …

蓝牙协议栈学习笔记

蓝牙协议栈学习笔记 蓝牙简介 蓝牙工作在全球通用的 2.4GHz ISM(即工业、科学、医学)频段,使用 IEEE802.11 协议 蓝牙 4.0 是迄今为止第一个蓝牙综合协议规范,将三种规格集成在一起。其中最重要的变化就是 BLE(Blue…

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码)

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码) 基本概念典型相关分析综合评价模型对应分析因子分析聚类分析 习题10.41. 题目要求2.解题过程3.程序 习题10.51. 题目要求2.解题过程3.程序 习题10.6(1&a…

用Excel绘制柱形图

在需要将数据用柱状图表示的时候,可以用Excel进行绘制。不单绘制柱形图,其他数据图也可以用Excel绘制。 接下来用绘制一个销售表的示例演示。 1.将数据输入Excel 数学书 语文书 英语书 一月 80 94 77 二月 95 86 84 三月 130 93 79 四月 …

实用干货:再见ElementPlus,我有更好的了

大家好,我是大澈! 本文约1200字,整篇阅读大约需要3分钟。 感谢关注微信公众号:“程序员大澈”,免费领取"面试大礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单&#xff…

任务调度系统就该这么设计(万能通用),稳的一批!

今天来扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 核心概念 这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有使用过的小伙伴更加容易接受文章的内容,快速讲一讲Xxl-Job中的概念和使用 如果你已经使用过了&#xf…

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。 步骤 1. 创建一个CSharp…

Java 8特性:Lambda表达式、函数式接口与Stream API的深度探索

一、引言 随着编程范式的不断演变,Java语言也在不断地发展和创新。Java 8的发布,为开发者们带来了诸多全新的特性,其中包括Lambda表达式、函数式接口以及Stream API。这些特性使得Java语言的编程更加简洁、优雅,同时也提高了代码…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

docker部署go gin框架 Windows环境

目录 文章目的是什么 环境介绍 Windows 环境下 docker 部署 go gin 详细步骤 运行容器时因为挂载文件可能会出现的问题 直接部署gin(跳过运行容器时因为挂载文件可能会出现的问题) 文章目的是什么 假设我们学习了 go 语言,在 Windows(本…

6.rk3588获取摄像头和激光雷达数据(用线程根据时间同步)

文件夹结构如下: 如果没有特殊说明,我们将py文件写在该路径里面。 保存数据的路径如下: ---img_lidar_save ---2023-12-13(根据日期自动生成当天保存数据的文件夹) ---camera_data(相机数据文件夹) ---image(保存相加…

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 数据库 文章目录 前言合并区间问题📕现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

jvisualvm手动安装VisualGC插件

前言 笔者近期排查问题需要查看GC的情况,于是用到了jvisualvm这个工具,查阅网上资料发现它有一个名为VisualGC的插件非常好用,于是笔者以此文记录一下VisualGC插件的安装步骤。 安装步骤 下载插件 首先我们要到官网 https://visualvm.gi…

未势能源受邀参加中国氢能100人论坛并发表演讲

12月12日-14日,“2023氢能嘉年华暨中国氢能100人论坛年会”在苏州举办,行业内专家学者、氢能头部企业代表等齐聚现场,聚焦氢能在化工、钢铁、交通等领域发展,共同探讨我国氢能产业初期前进之路。 未势能源液氢总工程师黄欢明受邀…

DevOps搭建(六)-安装Maven详细步骤

1、官网下载 下载地址: Maven – Download Apache Maven 2、上传压缩包到服务器 把下载好的压缩包上传到服务器上。 3、解压压缩包 解压压缩包到安装目录/usr/local/ tar -zxvf apache-maven-3.9.3-bin.tar.gz -C /usr/local/ 切换到/usr/local目录下ls命令看…

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤,现在目前大部分开发板都有配置,且也有说明,在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口,以及硬件配置,可以实现对于光纤的收发功能,由于GTX的速率在500Mbs到10Gbps之间,但通道高速io可配置光纤10G硬件,物理通完成,则…

SpringIOC之Jsr330ScopeMetadataResolver

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

科东软件Intewell操作系统:以“鸿”鹄之志,创未来之“道”

打造自主可控的新型工业操作系统是我国加速新型工业化进程,在新一轮科技革命中实现“换道超车”的重要契机。科东软件期待凭借鸿道Intewell新型工业操作系统的创新与应用,打造100%自主可控的工业网络和工业控制底层技术,为我国新型工业化贡献…