DAMO-YOLO训练KITTI数据集

news2024/11/24 22:45:28

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格式转VOC,就是需要读取逐个的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 json


def 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_file

        dst_file = os.path.join(dstfolder, src_fname)
        shutil.copyfile(srcfile, dst_file)  # 复制文件
        print("copy %s -> %s" % (srcfile, dst_file))
        return dst_file


class 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 = None
        self.annotations = None
        self.category = categories
        self.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.cocoJasonDict


if __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']  # 车的类型,最终会归一成car
    personName = ['Pedestrian', 'Person_sitting']  # 人员类型,最终归一为Pedestrian
    dontCare = ['Misc', 'DontCare']  # 杂物,归一为DontCare

    temId = 0
    for idName in className:
        tempCate = cate_.copy()
        tempCate['id'] = temId
        temId += 1
        tempCate['name'] = idName

        cate_list.append(tempCate)

    # print(cate_list)
    # 创建coco json 的类 实例
    js = cocoJsaon(cate_list)

    image_lsit = []
    annoation_list = []

    # 打开 train。txt
    with open(Imageset, 'r') as f:
        lines = f.readlines()
        # print(f'imageset lines:{lines}')

    img_id = 0
    bbox_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'] = fname
        image_temp['height'] = height
        image_temp['width'] = width
        image_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]))/2
                y = (float(temp[7]) + float(temp[5]))/2
               
                iscrowd = int(temp[2])
                # 判断是否遮挡
                if iscrowd != 0:
                    iscrowd = 1
                # 计算面积
                area = w * h
                # 复制annotation 的字典
                temp_an['area'] = area
                temp_an = an.copy()
                temp_an['image_id'] = img_id
                temp_an['bbox'] = [x, y, w, h]
                temp_an['iscrowd'] = iscrowd
                temp_an['category_id'] = classid
                temp_an['id'] = bbox_id
                bbox_id += 1  # 这个是 这个annotations 的id 因为一个图像可能对应多个 目标的id
                annoation_list.append(temp_an)
        # 图像的id
        img_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 os


class 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'
        },
    }

    @staticmethod
    def get(name):
        if 'coco' in name:
            data_dir = DatasetCatalog.DATA_DIR
            attrs = 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.coloradmin.cn/o/1044012.html

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

相关文章

基于springboot的小说阅读网站设计与实现【附源码】

基于以下技术实现:springbootmybatisplusjsoupmysql 媛麻:可代xie lun文,ding制作网站 在这里插入图片描述

图像处理与计算机视觉--第四章-图像滤波与增强-第二部分

目录 1.图像噪声化处理与卷积平滑 2.图像傅里叶快速变换处理 3.图像腐蚀和膨胀处理 4 图像灰度调整处理 5.图像抖动处理算法 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急,不然往往事倍功半! 2.静下心来,理解每一个…

前后端分离的计算机毕设之基于springboot+vue的课程设计选题管理系统(内含源码+文档+教程)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

vue_Delete `␍`eslint(prettier/prettier)

Delete ␍eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码,在执行pre-commit时,出现如下错误: Delete ␍eslint(prettier/prettier)问题根源 罪魁祸首是git的一个配置属性:core.autocrlf 由于…

Kafka数据可靠性保证

1.生产者发送数据到Topic partition的可靠性保证 为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到)&#xff0c…

构建卓越语言模型应用的利器:LangChain | 开源日报 No.39

langchain-ai/langchain Stars: 61.3k License: MIT LangChain 是一个用于通过组合性构建 LLMs 应用程序的库。 LLMs 和 Prompts:包括 prompt 管理、prompt 优化、所有 LLM 的通用接口以及与 LLMs 一起使用的常见工具。Chains:超越单个 LLM 调用&…

nodejs+vue大学食堂订餐系统elementui

可以查看会员信息,录入新的会员信息,对会员的信息进行管理。 网站管理模块对整个网站中的信息进行管理,可以查看会员留在留言栏中的信息,设置网站中的参数等。用户管理模块主要实现用户添加、用户修改、用户删除等功能。 近年来&…

C++与数据结构面经(重中之重)

多线程 互斥锁 原子变量 自旋锁 C11新特性 智能指针 首先智能指针是一个类,超过类的作用域会进行析构,所以不用担心内存泄漏。Unique_ptr(独占指针):规定一个智能指针独占一块内存资源。当两个智能指针同时指向一块内存,编译报错。 不允…

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好,复试分数90.24,电科学硕分数线84、信通83、专硕电子与信息74. 面试流程: 1:5min ppt的介绍。其中前2min用英语简要介绍基本信息,后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…

ThrowableError in Arr.php line 380

欢迎关注我的公众号:夜说猫,每周新闻点评~ 前言 今天重装了宝塔之后重装php,遇到了一个问题,如下 ThrowableError in Arr.php line 380 Parse error: syntax error, unexpected 提示我语法错误。 报错原因 主要是thinkphp5.1…

【新版】系统架构设计师 - 软件架构的演化与维护

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 软件架构的演化与维护考点摘要软件架构演化和定义面向对象软件架构演化对象演化消息演化复合片段演化约束演化 软件架构演化方式静态演化动态演化 软件架构演化原则软件架构演化评估方法大型网站架…

JVM对象创建与内存分配机制

对象的创建 对象创建的主要流程: ​ 1.类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应…

如何在Python中捕获异常

1. 写在前面 本文主要介绍 Python 捕获异常的各种技术。首先,回顾 Python 的异常处理机制,然后深入研究并学习如何识别捕获的异常内容,以及忽略异常。 公众号: 滑翔的纸飞机 2. Python 异常处理机制 Python 代码在运行的过程中&…

5-1.(OOP)初步分析MCV架构模式

组成:模型(model)、视图(view)、控制器(controller) view:界面、显示数据 model:数据管理、负责在数据库中存取数据以及数据合法性验证 controller:负责转…

uni-app:顶部标题栏的部分相关设置(标题更改, 加载效果)

一、标题更改 效果 方法一:在pages.json中进行修改 {"path": "pages/index/index","style": {"navigationBarTitleText": "自定义标题"} }, 方法二:在页面直接进行修改 onLoad() {// 设置页面的标…

Spring Boot 如何配置 CORS 支持

Spring Boot 如何配置 CORS 支持 跨域资源共享(CORS)是一种重要的网络安全策略,用于限制浏览器在不同域之间的HTTP请求。Spring Boot提供了简单而强大的方法来配置CORS支持,以确保您的应用程序能够与其他域的资源进行安全交互。本…

某高校的毕设

最近通过某个平台接的单子,最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面:推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…

电商项目高级篇-02 elasticsearch-下

电商项目高级篇-02 elasticsearch-下 4.2、QueryDSL返回指定字段 4.2、QueryDSL 返回指定字段 返回单个字段 GET bank/_search {"query": {"match_all": {}}, "sort": [{"balance": {"order": "desc"}}], &quo…

IoTDB 在国际数据库性能测试排行榜中位居第一?测试环境复现与流程详解第一弹!...

最近我们得知,Apache IoTDB 多项性能表现位居 benchANT 时序数据库排行榜(Time Series: DevOps)性能排行第一名!(榜单地址:https://benchANT.com/ranking/database-ranking) benchANT 位于德国&…

计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…