从零开始在kitti数据集上训练yolov5

news2024/11/18 22:50:31

0.准备工作

0.1 在kitti官网下载kitti数据集

KITTI官网:https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=2d
只需要下载图片和标签
在这里插入图片描述
解压后应该有一个training和和testing文件夹,training文件夹下应该有一个image_2文件夹和一个label_2文件夹,分别对应训练集的图片和标签,图片和标签的名称是一一对应的,因此我们拿这部分图片和标签进行训练。

0.2 clone yolov5代码

Github官网:https://github.com/ultralytics/yolov5

git clone https://github.com/ultralytics/yolov5.git
conda create -n yolov5 python=3.8 -y
conda activate yolov5
cd yolov5
pip install -r requirements.txt

1.转换kitti数据集标签格式

在这里插入图片描述

1.1 kitti数据集标签

首先看kitti数据集的标签,每一行有15个属性:他们的含义如下:

  • [0] 目标类比别(type),共有8种类别,分别是CarVanTruckPedestrianPerson_sittingCyclistTramMiscDontCare。DontCare表示某些区域是有目标的,但是由于一些原因没有做标注,比如距离激光雷达过远。但实际算法可能会检测到该目标,但没有标注,这样会被当作false positive (FP)。这是不合理的。用DontCare标注后,评估时将会自动忽略这个区域的预测结果,相当于没有检测到目标,这样就不会增加FP的数量了。此外,在 2D 与 3D Detection Benchmark 中只针对 Car、Pedestrain、Cyclist 这三类。
  • [1] 截断程度(truncated),表示处于边缘目标的截断程度,取值范围为0~1,0表示没有截断,取值越大表示截断程度越大。处于边缘的目标可能只有部分出现在视野当中,这种情况被称为截断。
  • [2] 遮挡程度(occlude),取值为(0,1,2,3)。0表示完全可见,1表示小部分遮挡,2表示大部分遮挡,3表示未知(遮挡过大)。
  • [3] 观测角度(alpha),取值范围为(-pi, pi)。是在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴,此时物体方向与相机x轴的夹角。这相当于将物体中心旋转到正前方后,计算其与车身方向的夹角。
  • [4-7] 二维检测框(bbox),目标二维矩形框坐标,分别对应left、top、right、bottom,即左上(xy)和右下的坐标(xy)。
  • [8-10] 三维物体的尺寸(dimensions),分别对应高度、宽度、长度,以米为单位。
  • [11-13] 中心坐标(location),三维物体底部中心在相机坐标系下的位置坐标(x,y,z),单位为米。
  • [14] 旋转角(rotation_y),取值范围为(-pi, pi)。表示车体朝向,绕相机坐标系y轴的弧度值,即物体前进方向与相机坐标系x轴的夹角。rolation_y与alpha的关系为alpha=rotation_y - theta,theta为物体中心与车体前进方向上的夹角。alpha的效果是从正前方看目标行驶方向与车身方向的夹角,如果物体不在正前方,那么旋转物体或者坐标系使得能从正前方看到目标,旋转的角度为theta。

参考链接:https://blog.csdn.net/u011489887/article/details/126316851

我们需要的是目标类别和2d检测框。

1.2 yolo需要的标签(coco数据集格式)

在这里插入图片描述
包含5个属性

  • [0] 目标类别索引(因此一会还需要一个类别和索引对应表)
  • [1-2] 中心点坐标,x_center,y_center
  • [3-4] 检测框宽、高,width,height

需要注意的是:这里的方框坐标和宽高需要归一化,即需要除以图像的宽高,如图所示
在这里插入图片描述

1.3 转换代码

import glob
import random
import cv2
from tqdm import tqdm

dic = {'Car': 0, 'Van': 1, 'Truck': 2, 'Tram': 3, 'Pedestrian': 4, 'Person_sitting': 4, 'Cyclist': 5, 'Misc': 6}

def changeformat():
    
    img_path = 'PATH/TO/KITTI/training/image_2/*.png'      # 修改为自己的 KITTI数据集图像位置
    label_path = 'PATH/TO/KITTI/training/label_2/'         # 修改为自己的 KITTI数据集标签位置
    filename_list = glob.glob(img_path)
    save_path = 'PATH/TO/NEW/LABELS/'                      # 修改为自己的 标签另存的位置

    for img_name in tqdm(filename_list, desc='Processing'):

        image_name = img_name[-10: -4]   # 000000 图片的名字

        label_file = label_path + image_name + '.txt'     # 根据图像名称查找对应标签
        savelabel_path = save_path + image_name + '.txt'  # 标签另存的文件
        
        with open(label_file, 'r') as f:
            labels = f.readlines()
        
        img = cv2.imread(img_name)
        h, w, c = img.shape
        dw = 1.0 / w
        dh = 1.0 / h        # 方便一会归一化
        
        for label in labels:
            label = label.split(' ')
            
            classname = label[0]
            if classname not in dic: continue  # 我忽略了kitti数据集中的misc和dontcare
            
            x1, y1, x2, y2 = label[4: 8]
            x1 = eval(x1)
            y1 = eval(y1)
            x2 = eval(x2)
            y2 = eval(y2)
            # 归一化处理
            bx = (x1 + x2) / 2.0 * dw
            by = (y1 + y2) / 2.0 * dh
            bw = (x2 - x1) * dw
            bh = (y2 - y1) * dh
            
            # 这里定义数据保存的精度
            bx = round(bx, 6)
            by = round(by, 6)
            bw = round(bw, 6) 
            bh = round(bh, 6)
    
    print('Done convert!')

2.划分数据集,准备训练

2.1 划分训练集和验证集

training文件夹共有7480张图片,按照训练集:验证集=8:2的比例进行划分。
代码如下:

def splitdataset():

	import random
    random.seed(1234)
    
    label_path = 'PATH/TO/NEW/LABELS/'       # 这里修改为上一步保存的新标签的位置
    filename_list = glob.glob(label_path)
    num_file = len(filename_list)
    
    val = 0.2      # 验证集的比例
    
    try:
        val_file = open('PATH/TO/KITTI/val.txt', 'w', encoding='utf-8')    # 包含验证集的txt文件,修改为自己想要保存的位置
        train_file = open('PATH/TO/KITTI/train.txt', 'w', encoding='utf-8')  # 包含训练集的txt文件,修改为自己想要保存的位置
        
        for i in range(num_file):
            if random.random() < val:
                val_file.write(f'PATH/TO/KITTI/images/{i:06}.png\n')   # 修改为kitti数据集图片的位置,即txt文件里存的是图片的位置
            else:
                train_file.write(f'PATH/TO/KITTI/images/{i:06}.png\n')         
    finally:
        val_file.close()
        train_file.close()

2.2 准备配置文件

--datasets
  |--images          # 7480 images
  |--labels          # 7480 labels
  |--train.txt
  |--val.txt
  |--kitti.yaml
  |--yolov5s.yaml

修改coco.yaml文件为kitti.yaml

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# COCO 2017 dataset http://cocodataset.org by Microsoft
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
path: PATH/TO/KITTI/datasets     # 修改为包含图片和标签的父文件夹
train: train.txt # train images (relative to 'path') 
val: val.txt # val images (relative to 'path') 

nc: 7      # 修改为类别数量
# Classes
names:
  0: car
  1: van
  2: truck
  3: tram
  4: pedestrian
  5: cyclist
  6: misc

修改yolov5s.yaml文件,这里根据选用的模型修改对应的文件,只需要修改类别数即可。
在这里插入图片描述

3.clone代码,开始训练

根据选用的模型大小,在github下载对应的预训练权重。
然后开始训练,train.py的相关参数设置可以参考这篇文章https://blog.csdn.net/m0_56175815/article/details/131125861,以及官方网站https://docs.ultralytics.com/zh/yolov5/tutorials/tips_for_best_training_results/

主要需要设置的参数包括:cfg(上一步的kitti.yaml),data(上一步修改的yolov5.yaml),batch-size(-1表示自动计算batch,推荐使用),weights(预训练权重)
其余的是一些调参的超参数:epochs(训练周期),cos-lr(是否使用模拟余弦退火调整学习率),label-smoothing(标签平滑设置,一般取小于0.1的数)

python train.py --weights PATH/TO/pretrained_weight/yolov5s.pt \
--cfg PATH/TO/yolov5s.yaml \
--data PATH/TO/kitti.yaml \
--epochs 300 \
--batch-size -1 \
--name kitti \
--cos-lr \
--label-smoothing 0.05

训练完成后的结果如下:
在这里插入图片描述

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

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

相关文章

(vue)适合后台管理系统开发的前端框架

(vue)适合后台管理系统开发的前端框架 1、D2admin 开源地址&#xff1a;https://github.com/d2-projects/d2-admin 文档地址&#xff1a;https://d2.pub/zh/doc/d2-admin/ 效果预览&#xff1a;https://d2.pub/d2-admin/preview/#/index 开源协议&#xff1a;MIT 2、vue-el…

通过Apple Configurator 2导出iOS ipa包

通过Apple Configurator 2导出iOS ipa包 安装Apple Configurator 2 从Mac AppStore安装Apple Configurator 2 下载ipa 准备工作&#xff1a; 1、 电脑已经安装了Apple Configurator 2 2、 手机已经安装了目标软件 3、 Apple 账号已经下载过目标软件 打开后连接设备&#xf…

Node.js安装及环境配置详细教程

一、下载Node.js安装包 官网下载链接[点击跳转] 建议下载LTS版本&#xff08;本教程不适用于苹果电脑&#xff09; 二 、安装Node.js 2.1 下载好安装包后双击打开安装包&#xff0c;然后点击Next 2.2 勾选同意许可后点击Next 2.3 点击Change选择好安装路径后点击Next&#…

基于springboot实现在线考试系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线考试系统演示 摘要 时代在变化&#xff0c;科技技术以无法预测的速度在达到新的高度&#xff0c;并且被应用于社会生活的各个领域&#xff0c;随着生活的加快&#xff0c;也使很多潜在的点逐渐突显出来&#xff0c;社会对于人才的要总是非常迫切的&…

Claude 3 模型发布,压力来到OpenAI这边了~

Anthropic 发布了 Claude 3 系列&#xff0c;包含了三款模型 各具特色&#xff0c;旨在为用户提供更智能、更快速、更高效的选择&#xff0c;可以说是是迄今为止最快、最强大的人工模型&#xff01; Anthropic 一度是 OpenAI 最强力的竞争对手&#xff01; 随着 Claude3 的发…

优优嗨聚集团:美团代运营服务,商家增长的新引擎

在当今数字化时代&#xff0c;线上平台已成为商家拓展业务、提升品牌影响力的重要渠道。美团作为国内领先的本地生活服务平台&#xff0c;拥有庞大的用户群体和丰富的商业资源。然而&#xff0c;对于许多商家而言&#xff0c;如何在美团平台上进行有效运营&#xff0c;实现业务…

java核心面试题汇总

文章目录 1. Java1.1. TCP三次握手/四次挥手1.2 HashMap底层原理1.3 Java常见IO模型1.4 线程与线程池工作原理1.5 讲一讲ThreadLocal、Synchronized、volatile底层原理1.6 了解AQS底层原理吗 2. MySQL2.1 MySQL索引为何不采用红黑树&#xff0c;而选择B树2.2 MySQL索引为何不采…

【中国电信】光猫 PT632 使用超管权限修改 IP 地址租期时间

背景 由于光猫默认设置的动态 IP 租期是 24 小时&#xff0c;所以每天都会断网一次&#xff0c;严重影响用网体验&#xff0c;所以打算通过修改动态 IP 租期为 一周&#xff08;最长就一周&#xff0c;没有永久的选项&#xff09;来改善。 需求 一台电脑&#xff08;已开启 …

Git保姆级使用教程

一、版本控制 1.1 团队开发问题 企业项目一般以团队形式实施开发&#xff0c;那团队开发中会出现哪些问题呢&#xff1f; 小明负责的模块就要完成了&#xff0c;就在即将Release之前的一瞬间&#xff0c;电脑突然蓝屏&#xff0c;硬盘光荣牺牲&#xff01;几个月来的努力付之…

【OBS】obs-websocket实战技巧,让你更快的了解OBS

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 修改OBS-web源码2️⃣ 常用api汇总获取输入源类型列表获取输入源列表获取属性列表打开输入源属性设置框获取设置输入源静音状态获取特殊输入源设置&#xff08;全局音频设备&#xff09;打开输入源属性设置框 &#x1f6ec; 文章小…

vue3 ts setup 组合式API 使用教程

vue3中新增了组合式API&#xff0c;本文讲解组合式API setup 的使用 关于setup 的出现和 vue3 js setup 的使用&#xff0c;笔者已经在2022年的文章中说明&#xff0c;这里不再赘述&#xff0c;需要的朋友可以阅读&#xff1a;《vue3 setup 使用教程》 官网文档&#xff1a;h…

MobaXterm无法上传整个文件夹,只能上传的单个文件

问题描述&#xff1a; 本来想使用MobaXterm上传.vscode文件夹上传到服务器&#xff0c;但是选择文件夹打开后只能选择文件夹下面的子文件无法上传整个文件。 解决方案&#xff1a; 1、简单暴力 2、压缩后解压

8个优秀的CSS实践,开发web应用

HTML面试题部分 1.H5的新特性有哪些 2.Label的作用是什么&#xff1f;是怎么用的&#xff1f; 3.HTML5的form如何关闭自动完成功能 4.dom如何实现浏览器内多个标签页之间的通信? 5.实现不使用 border 画出1px高的线&#xff0c;在不同浏览器的标准模式与怪异模式下都 能保持一…

STM32FreeRTOS-事件组1(STM32Cube高效开发教程)

文章目录 一、事件组的原理和功能1、事件组与队列信号量特点2、事件组存储结构3、事件组运行原理 二、事件组部分函数1、xEventGroupCreate()创建事件组函数2、xEventGroupSetBits&#xff08;&#xff09;事件组置位函数3、xEventGroupSetBitsFromISR&#xff08;&#xff09;…

PCM会重塑汽车OTA格局吗(2)

目录 1.概述 2. PCM技术视角下的OTA 3.小结 1.概述 上一篇文章&#xff0c;我们着重讲解了OTA的概述内容&#xff0c;和意法半导体推出的跨域融合MCU的四大特征&#xff0c;其中就包含了OTA技术。 他们针对OTA做了比较创新的设计&#xff0c;在总的可用memory容量不变情况…

【go语言开发】yaml文件配置和解析

本文主要介绍使用第三方库来对yaml文件配置和解析。首先安装yaml依赖库&#xff1b;然后yaml文件中配置各项值&#xff0c;并给出demo参考&#xff1b;最后解析yaml文件&#xff0c;由于yaml文件的配置在全局中可能需要&#xff0c;可定义全局变量Config&#xff0c;便于调用 文…

【基于HTML5的网页设计及应用】——float实现页面布局

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Nodejs 第五十章(lua的基本使用)

lua基本使用 全局变量局部变量 全局变量是在全局作用域中定义的变量&#xff0c;可以在脚本的任何地方访问。全局变量在定义时不需要使用关键字&#xff0c;直接赋值即可。 xiaoman xmzsprint(xiaoman)局部变量是在特定作用域内定义的变量&#xff0c;只能在其所属的作用域…

MySQL从入门到实战

MySQL从入门到实战 1.连接数据库 在操作数据库之前&#xff0c;需要连接它&#xff0c;输入命令&#xff1a;mysql -u用户名 -p密码。 2.创建数据库 创建完数据库之后我们可以通过show databases;命令查看MySQL中已存在的数据库。[请注意&#xff1a;数据库名区分大小写。] 3…

什么是聚簇索引与非聚集索引和区别?

什么是聚簇索引与非聚集索引和区别? 按物理存储分类:InnoDB的存储方式是聚集索引&#xff0c;MVISAM的存储方式是非聚集索引 test innodb.frm 测试 innodb.ibd Frame表结构 数据表索引数据 test myisam.frm ---->Frame表结构test myisam.MYD_---数据表数据test_myisam.MYl-…