DAMO-YOLO训练KITTI数据集

1.KITTI数据集准备

DAMO-YOLO支持COCO格式的数据集,在训练KITTI之前,需要将KITTI的标注转换为KITTI格式。KITTI是采取逐个文件标注的方式确定的,即一张图片对应一个label文件。下面是KITTI 3D目标检测训练集的第一个标注文件:000000.txt

Pedestrian 0.00 0 -0.20 712.40 143.00 810.73 307.92 1.89 0.48 1.20 1.84 1.47 8.41 0.01

就不一一解释了,引用一下KITTI 3D目标检测数据集解析(完整版)_kitti数据集结构-CSDN博客的表格,可以看一下该文章的详细解释

在这里插入图片描述

COCO格式就不再详细解释了,可以看一下这篇文章COCO数据集(目标检测任务json文件内容总结,总结一下COCO格式需要一个大的json文件,里面包含了每个图片的路径及注释,bbox由中心坐标和宽高的形式给出。

因此,KITTI格式转COCO,就是需要读取逐个的txt文件,进行坐标换算后写入json,代码如下,基于TXT 转成COCO jason格式的标注_D_galaxy的博客-CSDN博客修改:

import cv2
from math import *
import numpy as np
import os, random, shutil
import glob as gb
from time import sleep
import copy
import jsondef copyFile2Folder(srcfile, dstfolder):'''复制文件到指定文件夹,名字和以前相同Args:srcfile: '/home/wsd/***/yolov5/data/PCB_DATASET/labels/Spur/04_spur_06.txt'  文件的绝对路径dstfile: '/home/wsd/***/yolov5/data/PCB_DATASET/train/labels'  文件夹Returns:'''if not os.path.isfile(srcfile):print("%s not exist!" % (srcfile))else:src_fpath, src_fname = os.path.split(srcfile)  # 分离文件名和路径if not os.path.exists(dstfolder):os.makedirs(dstfolder)  # 创建路径dst_filedst_file = os.path.join(dstfolder, src_fname)shutil.copyfile(srcfile, dst_file)  # 复制文件print("copy %s -> %s" % (srcfile, dst_file))return dst_fileclass cocoJsaon(object):'''coco 的json 的文件格式类'''def __init__(self, categories):self.info = {'description': 'PCB DATASET','url': 'DLH','version': '1.0','year': 2021,'contributor': 'DLHgroup','date_created': '2021-01-12 16:11:52.357475'}self.license = {"url": "none","id": 1,"name": "Attribution-NonCommercial-ShareAlike License"}self.images = Noneself.annotations = Noneself.category = categoriesself.cocoJasonDict = {"info": self.info, "images": self.images, "annotations": self.annotations,"licenses": self.license, 'categories': self.category}def getDict(self):'''Returns: 返回 格式的字典化'''self.cocoJasonDict = {"info": self.info, "images": self.images, "annotations": self.annotations,"licenses": self.license, 'categories': self.category}return self.cocoJasonDictif __name__ == '__main__':# 文件原本:'''root: /home/dlh/opt/***/PCB_DATASET------------------->labels/  # 原本的所有目标检测框的   *.txt------------------->images/   #  *.jpg  所有的图片------------------->ImageSets/  # train.txt  和  val.txt------------------->annotations  /  存放 labels 下所有对应的train.json最终:root: /home/dlh/opt/***/PCB_DATASET/PCB   ------------------->images/   #  *.jpg  所有的图片------------------->annotations  /  instances_train_set_name.json   # 存放 labels 下所有对应的train.json/  instances_val_set_name.json     # 存放 labels val.json'''# 写入的train 还是Val wrtie_str = 'train'train_path = '/home/wistful/Datasets/KITTI/training/'# 存放 train.txt  和  val.txt  的绝对地址    (修改)Imageset = '/home/wistful/Datasets/KITTI/ImageSets/' + wrtie_str + '.txt'# 存放 即将所有的原本图片  保存到 该地址  临时       (修改)tarset = '/home/wistful/Datasets/KITTI/training/image_2/' + wrtie_str + '_set_name'# 下面是更改 json 文件 的tempDir = Imageset.replace('txt', 'json')tempDir = tempDir.replace('ImageSets', 'annotations')jsonFile = tempDir.replace(wrtie_str, 'instances_' + wrtie_str + '_set_name')jasonDir, _ = os.path.split(jsonFile)# 告诉你 最新的Jason 文件保存到了那里print(f'jsonFile saved {jsonFile}')# 检查目标文件夹是否存在if not os.path.exists(tarset):os.makedirs(tarset)if not os.path.exists(jasonDir):os.makedirs(jasonDir)# images 段 的字典模板images = {"license": 3,"file_name": "COCO_val2014_000000391895.jpg","coco_url": "","height": 360, "width": 640, "date_captured": "2013-11-14 11:18:45","id": 0}# annotation 段 的字典模板an = {"segmentation": [],"iscrowd": 0,"keypoints": 0,"area": 10.0,"image_id": 0, "bbox": [], "category_id": 0,"id": 0}# categories 段 的字典模板cate_ = {'id': 0,'name': 'a',}# 用来保存目标类的  字典cate_list = []# 你的目标类有几个  (修改)className = ['Pedestrian', 'Car', 'Cyclist', 'DontCare']carName = ['Car', 'Van', 'Truck', 'Tram']  # 车的类型,最终会归一成carpersonName = ['Pedestrian', 'Person_sitting']  # 人员类型,最终归一为PedestriandontCare = ['Misc', 'DontCare']  # 杂物,归一为DontCaretemId = 0for idName in className:tempCate = cate_.copy()tempCate['id'] = temIdtemId += 1tempCate['name'] = idNamecate_list.append(tempCate)# print(cate_list)# 创建coco json 的类 实例js = cocoJsaon(cate_list)image_lsit = []annoation_list = []# 打开 train。txtwith open(Imageset, 'r') as f:lines = f.readlines()# print(f'imageset lines:{lines}')img_id = 0bbox_id = 0# 按值去打开图片for path in lines:# 我的train.txt 是按照绝对路径保存的,各位需要的根据自己的实际情况来修改这里的代码# 去出  \n 之类的空格path = path.lstrip().rstrip()# 得到图像文件路径img_path = train_path + 'image_2/' + path + '.png'# print(f'path:{path}')# 打开图片image = cv2.imread(img_path)# 将这个图片副知道新的文件夹  (以实际情况  修改)copyFile2Folder(img_path, tarset)# 得到宽高(height, width) = image.shape[:2]# (height, width) = 375, 1242# 得到文件名子_, fname = os.path.split(img_path)# print(f'_ and name:{_, fname}')# 图像对应的txt 文件路径txtPath = train_path + 'label_2/' + path + '.txt'# print(f'txtPath:{txtPath}')# 复制images 的字典的复制image_temp = images.copy()image_temp['file_name'] = fnameimage_temp['height'] = heightimage_temp['width'] = widthimage_temp['id'] = img_id# 将其放入到集合中image_lsit.append(image_temp)# 打开图片的对应的txt 目标文件的txt# print(f'txt path:{txtPath}')with open(txtPath, 'r') as re:txtlines = re.readlines()for txtline in txtlines:# 去出  \n 之类的空格temp = txtline.rstrip().lstrip().split(' ')# print(f'temp:{temp}')# 分别的到 目标的类 中心值 xy  和  该检测框的宽高if temp[0] in carName:classid = className.index('Car')elif temp[0] in personName:classid = className.index('Pedestrian')elif temp[0] in dontCare:classid = className.index('DontCare')else:classid = className.index('Cyclist')# classid = className.index(temp[0])  # 获取id# 计算宽高及中心w = float(temp[6]) - float(temp[4])h = float(temp[7]) - float(temp[5])x = (float(temp[6]) + float(temp[4]))/2y = (float(temp[7]) + float(temp[5]))/2iscrowd = int(temp[2])# 判断是否遮挡if iscrowd != 0:iscrowd = 1# 计算面积area = w * h# 复制annotation 的字典temp_an['area'] = areatemp_an = an.copy()temp_an['image_id'] = img_idtemp_an['bbox'] = [x, y, w, h]temp_an['iscrowd'] = iscrowdtemp_an['category_id'] = classidtemp_an['id'] = bbox_idbbox_id += 1  # 这个是 这个annotations 的id 因为一个图像可能对应多个 目标的idannoation_list.append(temp_an)# 图像的idimg_id += 1# print(js.getDict())# print('***********************************************************************\n\n')# 将json 的实例 中images  赋值js.images = image_lsit# 将json 的实例 annotations  赋值js.annotations = annoation_list# 写入文件json_str = json.dumps(js.getDict())with open(jsonFile, 'w+') as ww:ww.write(json_str)print('finished')

上述代码,只需更改主函数开头的wrtie_strtrain_path就行了,代码不难理解

2.修改DAMO-YOLO的配置文件

  • 修改damo/config/paths_catalog.py,将coco_2017_traincoco_2017_val的相关路径修改一下
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# Copyright (C) Alibaba Group Holding Limited. All rights reserved.
"""Centralized catalog of paths."""
import osclass DatasetCatalog(object):DATA_DIR = 'datasets'DATASETS = {'coco_2017_train': {'img_dir': '/home/wistful/Datasets/KITTI/training/image_2','ann_file': '/home/wistful/Datasets/KITTI/annotations/instances_train_set_name.json' # 第一步生成的json文件},'coco_2017_val': {'img_dir': '/home/wistful/Datasets/KITTI/training/image_2','ann_file': '/home/wistful/Datasets/KITTI/annotations/instances_val_set_name.json'},'coco_2017_test_dev': {'img_dir': '/home/wistful/Datasets/KITTI/training/image_2','ann_file': '/home/wistful/Datasets/KITTI/annotations/instances_val_set_name.json'},}@staticmethoddef get(name):if 'coco' in name:data_dir = DatasetCatalog.DATA_DIRattrs = DatasetCatalog.DATASETS[name]args = dict(root=os.path.join(data_dir, attrs['img_dir']),ann_file=os.path.join(data_dir, attrs['ann_file']),)return dict(factory='COCODataset',args=args,)else:raise RuntimeError('Only support coco format now!')return None
  • 修改配置文件中的ZeroHeadself.dataset.class_names

在这里插入图片描述

  • 导入预训练权重及修改训练轮数,GitHub官方仓库里有,就不介绍了

3.训练

python -m torch.distributed.launch --nproc_per_node=2 tools/train.py -f configs/damoyolo_tinynasL20_T.py

2指的是gpu个数,-f 后面是配置文件

在这里插入图片描述

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

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

相关文章

JavaScript位运算的妙用

位运算的妙用: 奇偶数, 色值换算,换值, 编码等 位运算的基础知识: 操作数是32位整数自动转化为整数在二进制下进行运算 一.按位与& 判断奇偶数: 奇数: num & 1 1偶数: num & 1 0 基本知识: 用法:操作数1 & 操作数2规则:有 0 则为…

机柜PDU产品采购与安装指南——TOWE精选

机柜PDU指的是Power Distribution Unit,即电源分配单元。它是一种电子设备,通常用于为数据中心、服务器机房等设施中的计算机和其他设备提供电力,是各行业数据中心“标配”构成部分,以确保服务器等用电设备的安全和稳定运行。 数据…

查看Linux系统信息的常用命令

文章目录 1. 机器配置查看2. 常用分析工具3. 常用指令解读3.1 lscpu 4. 定位僵尸进程5. 参考 1. 机器配置查看 # 总核数物理CPU个数x每颗物理CPU的核数 # 总逻辑CPU数物理CPU个数x每颗物理CPU的核数x超线程数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| w…

[Linux]多线程编程

[Linux]多线程编程 文章目录 [Linux]多线程编程pthread_create函数pthread_join函数pthread_exit函数pthread_cancel函数pthread_self函数pthread_detach函数理解线程库和线程id Linux操作系统下,并没有真正意义上的线程,而是由进程中的轻量级进程&#…

在多台服务器上运行相同命令(二)、clush

介绍安装配置互信认证参数含义基本使用节点组拷贝文件 介绍 Clush(Cluster Shell)是一个用于管理和执行集群操作的工具,它允许你在多台远程主机上同时执行命令,以便批量管理服务器。Clush 提供了一种简单而强大的方式来管理大规模…

“押宝高手”乐视视频再出手,看中商业传奇剧《大盛魁》

作为最早开始版权采购的长视频平台,乐视视频一向擅长“押宝”优质内容。从《甄嬛传》到《白鹿原》等,乐视拿下了众多经典古装剧、年代剧的版权。 9月,乐视视频再次出手拿下的历史传奇剧《大盛魁》开始热播。该剧由王新民导演执导&#xff0c…

全渠道客服体验:Rocket.Chat 的无缝互动 | 开源日报 No.41

RocketChat/Rocket.Chat Stars: 36.9k License: NOASSERTION Rocket.Chat 是一个完全可定制的开源通信平台,适用于具有高标准数据保护要求的组织。我们是团队沟通场景下的最终免费开源解决方案,可以实现同事之间、公司之间或客户之间的实时对话。提高生…

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下, iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…

TS中class类的基本使用

想要创建对象,必须要先定义类,所谓的类可以理解为对象的模型,程序中可以根据类创建所指定类型的对象。 一、使用class关键字定义类 class 类名 { } // 使用class关键字来定义一个类 class Person{}// 使用new关键字创建一个对象 const per …

Pikachu靶场——SSRF 服务端请求伪造

文章目录 1 SSRF 服务端请求伪造1.1 SSRF(curl)1.1.1 漏洞防御 1.2 SSRF(file_get_content)1.2.1 漏洞防御1.2.3 SSRF 防御 1 SSRF 服务端请求伪造 SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&a…

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Qwen-VL:多功能视觉语言模型,能理解、能定位、能阅读等

Overview 总览摘要1 引言2 方法2.1 模型结构2.2 输入输出 3 训练3.1 预训练3.2 多任务预训练3.3 监督finetune 4 评测4.1 图像文本描述和视觉问答4.2 面向文本的视觉问答4.3 指代表达理解4.4 视觉语言任务中的小样本学习4.4 现实用户行为下的指令遵循 5 相关工作6 总结与展望附…

【boost网络库从青铜到王者】第七篇:asio网络编程中的异步echo服务器,以应答为主

文章目录 1、简介2、echo模式应答异步服务器2.1、Session会话类2.2、Server类为服务器接收连接的管理类 3、客户端4、隐患5、总结 1、简介 前文已经介绍了异步操作的api,今天写一个简单的异步echo服务器,以应答为主。 2、echo模式应答异步服务器 2.1、…

小样本学习

一、基础知识 小样本学习(few shot learning)旨在使用先验知识(prior knowledge)基于有限数量的样本推广(generaling)到新任务(new task)。这些先验(prior knowledge&am…

初识C语言——详细入门(系统性学习day4)

目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 (1)关键字 (2&#xf…

Blender导出FBX给UE5

最近在学习UE5的资源导入,总结如下: 建模使用Blender,UE5版本是5.3 1.纯静态模型导入UE5 Blender FBX导出设置保持默认即可, UE5把导入设置里Miscellaneous下Force Front XAxis和Convert Scene Unit勾选即可 2.带骨骼动画的模型…

字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2strlen函数 3.strcpy函数…

csdn未经允许将我的文章设置成vip收费

以前在csdn写了一些笔记,后来不用csdn了,想着留下这些笔记或多或少能帮助其他初学者,就没管它。结果csdn把文章设置成收费了,这个收费不是我本人弄的,是csdn弄的!我现在只能把这些文章删除掉了。

Docker初识

什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到…

Tungsten Fabric数据量过大问题处理初探

开源SDN系统Tungsten Fabric面临数据产生过多问题。 经排查,产生数据多出自analytics组件的Cassandra数据库()。很多分析数据会存储至Cassandra库,并持久化处理。 没有特殊调整的话,目录在 /var/lib/docker/volumes/analytics_database_an…