【道友避坑】CUB数据集转yolov5格式

news2025/2/14 3:10:11

写在前面:最近我拿到一个CUB_200_2011鸟类训练模型,但是我想将他转为yolov的格式进行应用。看了些其他博主博客后,发现跳跃性有些强。再此记录转换过程,希望各位道友修得此法后,能有所收获!

一、获取数据集

官网下载:Perona Lab - CUB-200-2011Perona Lab -- CUB-200-2011https://www.vision.caltech.edu/datasets/cub_200_2011/百度网盘:

鸟类训练模型icon-default.png?t=N4P3https://pan.baidu.com/s/1ASDDX7h_SYBRJXPp2aZKqA?pwd=1234

二、数据集目录结构

创建存放转换结果的目录,结构如下:

  1. 在yolov5-master同级目录下创建datasets目录
  2. 进入datasets目录,创建birds目录,用来存放转后的数据集
  3. 进入birds目录,创建images和lables目录
  4. 在images和lables目录下,分别创建train和vla目录,如下所示:

下图是CUB_200_211鸟类数据集目录结构,放置的路径如上图中步骤所示。

 三、数据集转换

 梳理:我们想得到什么?

(1)上面分类好的yolov5数据集

(2)birds.yaml 数据配置文件

1. 在yolov5-master项目下创建datasetshub2yolo.py文件,如下图:

 2. 执行文件代码

  • labpath和imapath建议写绝对路径,相对路径容易报错
  • 代码最后几行是调用方法,如果你多次执行的话,会累加,数据会重复。所以你想再次执行,最好把原来的数据删除。
import shutil
import cv2

path = '../CUB_200_2011'
labpath = 'D:/python/yolov5/datasets/birds/lables'
imapath = 'D:/python/yolov5/datasets/birds/images'


def get_yaml():
    # get birds.yaml
    with open(path + '/classes.txt', 'r') as fo, open('birds.yaml', "a") as fi:  # r只读,w写,a追加写
        for num, line in enumerate(fo):  # enumerate为枚举,num为从0开始的序号,line为每一行的信息
            s = '  ' + str(num) + ': ' + line.split(" ")[-1]  # 以空格分隔,去掉末尾的换行
            fi.write(s)  # 追加写入目标文件


def get_alllab():
    dataall = {}  # 字典用于存放txt中的各种信息
    with open(path + '/images.txt', 'r') as imagesall, open(path + '/image_class_labels.txt', 'r') as classall, \
            open(path + '/train_test_split.txt', 'r') as splitall, open(path + '/bounding_boxes.txt', 'r') as boxall:
        for num, line in enumerate(imagesall):  # 值用列表存储,方便后续添加元素,-1去掉末尾的/n
            s = line.split(" ")
            dataall[s[0]] = [s[1][:-1]]
        for num, line in enumerate(classall):
            s = line.split(" ")
            dataall[s[0]].append(s[1][:-1])
        for num, line in enumerate(splitall):
            s = line.split(" ")
            dataall[s[0]].append(s[1][:-1])
        for num, line in enumerate(boxall):
            s = line.split(" ")
            dataall[s[0]].extend([s[1], s[2], s[3], s[4][:-1]])
    print('dataall have got...')
    for item in dataall:
        na = item.rjust(12, '0')  # item为字典的键,左侧扩充0,改为所需名字格式(未看到明确要求)
        image = cv2.imread(path + '/images/' + dataall[item][0])  # 读取图片,使用shape获取图片宽高
        # 这两行代码为验证boundingbox信息,手动画框,图片存储至test文件夹,左上角和右下角坐标,image.shape[1] 宽度  image.shape[0] 高度
        # cv2.rectangle(image, (int(float(dataall[item][3])), int(float(dataall[item][4]))), (int(float(dataall[item][3]))+\
        #             int(float(dataall[item][5])),int(float(dataall[item][4]))+int(float(dataall[item][6]))), (0, 0, 255), 3)
        # cv2.imwrite(imapath+'/test2017/' + na + '.jpg', image)  # 带小数的str需先转为float才能转为int
        x = (float(dataall[item][3]) + float(dataall[item][5]) / 2) / image.shape[1]
        y = (float(dataall[item][4]) + float(dataall[item][6]) / 2) / image.shape[0]
        w = float(dataall[item][5]) / image.shape[1]
        h = float(dataall[item][6]) / image.shape[0]
        s = str(int(dataall[item][1]) - 1) + ' ' + str('%.6f' % x) + ' ' + str('%.6f' % y) + \
            ' ' + str('%.6f' % w) + ' ' + str('%.6f' % h)  # 将cub的boundingbox转换为yolov5格式

        if dataall[item][2] == '1':  # 划分训练集验证集,shutil.copy(a,b)为复制图片,a为原路径,b为目标路径(带名字则自动重命名)
            with open(labpath + '/train/{}.txt'.format(na), 'w') as lab:
                lab.write(s)  # 写入文件 已存在就覆盖,没有就生成
            shutil.copy(path + '/images/' + dataall[item][0], imapath + '/train/' + na + '.jpg')

        elif dataall[item][2] == '0':
            with open(labpath + '/val/{}.txt'.format(na), 'w') as lab:
                lab.write(s)
            shutil.copy(path + '/images/' + dataall[item][0], imapath + '/val/' + na + '.jpg')


if __name__ == "__main__":
    get_yaml()
    get_alllab()

3. 转换后的结果展示

(1)birds.yaml

(2)数据集部分展示

 4. 数据精细化处理

将转换后的birds.yaml文件拷贝到data目录下。参考coco128.yaml文件,将birds.yaml文件的上面配置替换了,可以参考我下面的配置。

 

 至此,数据集的CUB数据集转换成yolov5格式的工作完毕,至于训练部分,我如果有时间就开一个yolov系列专栏慢慢更新把~希望道友能顺利通过本篇博客!!

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

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

相关文章

PCA算法

文章目录 1. 数据降维2. PCA原理2.1 基变换2.2 方差2.3 协方差2.4 协方差矩阵2.5 协方差矩阵对角化 3. PCA算法流程4. PCA算法的特点5. PCA算法的Python应用6. 源码仓库地址 1. 数据降维 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测&#xff0…

免费AI编程工具- AWS CodeWhisperer安装(IDEA)

一、介绍 CodeWhispere介绍:可以根据IDE中的注释或者现有的一些提示、代码,来生成代码段或者建议。支持多种编程语言,可以和常用的IDE进行无缝集成。和GitHub Copilot和Cursor不同,个人使用是完全免费的,没有门槛。 …

极致呈现系列之:Echarts柱状图的创意设计与数字美学的完美平衡

先看下最终效果 目录 数字之美:Echarts柱状图的基础应用形色俱佳:Echarts柱状图的样式美化与创意设计独具匠心:Echarts柱状图的柱体形状自定义动感十足:Echarts柱状图的交互动画实现数字排序的艺术:Echarts柱状图的数…

《机器学习公式推导与代码实现》-chapter7决策树

《机器学习公式推导与代码实现》学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅。 决策树 决策树(decision tree)基于特征对数据实例按照条件不断进行划分,最终达到分类或回归的目的。 本章作…

React中几种编写弹窗的方式

方式一:按钮与弹窗封装成一个组件 将按钮和弹窗封装成一个组件,可以大大提高 React 代码的可重用性、可维护性和可扩展性。以下是示例代码: import React, { useState } from "react"; import { Button, Modal } from "antd";const …

django中的请求和响应

目录 请求和响应定义请求请求的样子案例常见的请求方法 django中的请求HttpRequest 常见属性 django的响应响应的内容content响应的状态码响应类型content-type常见的响应对象 请求和响应定义 请求 请求的样子案例 常见的请求方法 HTTP(超文本传输协议&#xff09…

中国市场成为高阶智驾战略高地,博世/安波福包揽四项大奖

高工智能汽车研究院监测数据显示,2022年度中国市场(不含进出口)乘用车前装标配搭载辅助驾驶(L0-L2)交付1001.22万辆,首次突破千万辆规模,同时,前装搭载率也首次突破50%大关。 此外&a…

【数据分享】1901-2021年1km分辨率逐月总降水栅格数据(全国/分省/免费获取)

气象指标在日常研究中非常常用,之前我们给大家分享过来源于国家青藏高原科学数据中心提供的1901-2021年1km分辨率逐月平均气温栅格数据和1901-2021年1km分辨率的逐月最高气温栅格数据(可查看之前的文章获悉详情)! 本次我们继续分…

建造者模式(八)

不管怎么样,都要继续充满着希望 上一章简单介绍了原型模式(七), 如果没有看过, 请观看上一章 一. 建造者模式 引用 菜鸟教程里面的建造者模式介绍: https://www.runoob.com/design-pattern/builder-pattern.html 建造者模式(Builder Pattern&#xff…

企业自动化解决方案 - RPA

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 什么是RPA? RPA指的是机器人流…

手势识别系统Python,基于卷积神经网络算法

一、介绍 手势识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,…

Elasticsearch:数据摄取中的使用指南

数据摄取是利用 Elasticsearch 的全部潜力进行高效搜索和分析的关键步骤。 在本文中,我们将探讨几个常用的基本实践,以确保将无缝且有效的数据摄取到 Elasticsearch 中。 通过遵循这些指南,你可以优化数据摄取流程,并在你的部署中…

还在为618电商推送方案烦恼?我们帮你做好了!

618是每年重要的电商大促活动,热度高流量大,是电商App吸引新用户,提高用户转化率(购买率)的最好时机。对电商App运营来说,消息推送是不可忽略的流量来源之一,适当的消息推送可以召回用户,提高用户复购率。如…

Tigers Global Logistics EDI 需求及SaaS解决方案

Tigers Global Logistics 是一家国际物流公司,总部位于香港,成立于1998年。该公司提供全球物流服务,包括仓储、运输、海关通关、电商物流等。Tigers Global Logistics 在全球范围内拥有超过70个仓库和物流中心,并在美国、欧洲、亚…

Spring MVC入门笔记

Spring MVC基础知识 1. 创建web应用 新建Maven项目 点击File -> Project Structure -> Facets -> 号 -> Web 修改文件描述符路径为硬盘:\项目名\src\main\存储页面的文件夹(如:webapp)\WEB-INF\web.xml 修改Web页面路径为硬盘…

领域建模之数据模型设计方法论

本文通过实际业务需求场景建模案例,为读者提供一种业务模型向数据模型设计的方法论,用于指导实际开发中如何进行业务模型向数据模型转化抽象,并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章,读者可以收获到业务模型…

打造高效采购系统,提升企业采购效率

随着市场竞争的日益激烈,企业采购效率的重要性越来越凸显。采购系统作为企业采购的核心环节,是提升采购效率的关键。因此,打造高效采购系统是企业发展的必要条件。本文将围绕打造高效采购系统,提升企业采购效率展开讨论。 一、采购…

JavaWeb小项目——【源码】使用Vue+axios+Servlet+Lombok+JDBC+MySQL技术栈实现云笔记管理系统案例的开发

目录 引出小项目要求固定的东西1.pom.xml文件配置 web.xml文件配置2.util里面JDBC的DBUtils 字符串工具StringUtils3.entity里面的PageInfo分页实体类ResData响应标准格式4.filter里面的编码CharacterEncodingFilter和权限LoginAuthorFilter5.前端固定的js包和bootstrap包 小…

深入剖析mmap原理 - 从三个关键问题说起

作者:招财二师兄 链接:https://www.jianshu.com/p/eece39beee20 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 对于mmap,您是否能从原理上解析以下三个问题: 1&#…

CentOS阿里镜像源

阿里CentOS镜像源位置:http://mirrors.aliyun.com/centos/?spma2c6h.25603864.0.0.50d03715CS95s4 CentOS下载最小位置: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.5e38f5advNCSXC 如图: