【数据集管理】使用 Fiftyone 管理数据集,大型数据集也不在话下!

【数据集管理】使用 Fiftyone 管理数据集,大型数据集也不在话下!

  • 1. Fiftyone 安装
  • 2. 数据集的加载与导出
    • 2.1 本地数据集操作
      • 2.1.1 创建 session
      • 2.1.2 加载数据集
        • 2.1.2.1 加载 YOLO 格式的数据集
        • 2.1.2.2 加载本地数据库中的数据集
        • 2.1.2.3 同时加载数据集 train 和 val
      • 2.1.3 数据集导出
        • 2.1.3.1 YOLO 格式数据集导出
        • 2.1.3.2 Fiftyone 格式数据集导出
      • 2.1.4 查看及删除本地数据集
    • 2.2 远程操作数据集
  • 3. 对数据进行打标签操作
    • 3.1 图像打标签(单个/批量)
      • 3.1.1 session 中单个打标签
      • 3.1.2 使用脚本给已知路径的数据批量打标签
    • 3.2 图像删除标签(单个/多个)
    • 3.3 匹配标签数据筛选
  • 4. 踩坑记录
    • 4.1 浏览器页面白屏-已解决

链接: Fiftyone 官网

1. Fiftyone 安装

# 要求 python 版本 ≥3.7,≤3.10
# 直接使用 pip 指令安装即可# TODO 网页版安装指令
pip install fiftyone
# TODO 桌面版安装指令
pip install fiftyone-desktop

2. 数据集的加载与导出

Fiftyone 工作流程是打开一个 Python Shell 并加载一个 Datasets,通过 Sessions 进行交互。

2.1 本地数据集操作

2.1.1 创建 session

import fiftyone as fo# 使用桌面版 APP
# session = fo.launch_app(desktop=True)  
# session.wait()                         # 保持 APP 登录状态,直到手动退出# 使用网页版
session = fo.launch_app(port=5151)		# 默认端口为 5151  

创建成功的 session 展示
在这里插入图片描述

2.1.2 加载数据集

2.1.2.1 加载 YOLO 格式的数据集

使用 fo.Dataset.from_dir() 加载本地文件夹中的数据集

import fiftyone as foname = 'my_test'
dataset_dir = r"D:\fiftyone\test"
dataset_type = fo.types.YOLOv5Dataset   # * 加载YOLO格式的数据集
# dataset_type=fo.types.FiftyOneDataset # * 加载FiftyOne格式的数据集dataset = fo.Dataset.from_dir(dataset_dir = dataset_dir,dataset_type = dataset_type,name = name,
)dataset.persistent = True             			# * 持久化保存数据集,防止关闭session后数据集删除  
session = fo.launch_app(dataset, port=5151) 	# * 默认端口为5151
2.1.2.2 加载本地数据库中的数据集

使用 fo.load_dataset(name) 加载本地数据库中数据集(通过 Fiftyone 保存在本地的数据集)

import fiftyone as foname = 'SmokeFire_test'
dataset = fo.load_dataset(name)
session.dataset = dataset
2.1.2.3 同时加载数据集 train 和 val

使用dataset = fo.Dataset(name)加载空数据集后使用dataset.add_dir()追加多个子数据集

import fiftyone as foname = 'Person_car_hard_ver002'
dataset_dir = r"/media/gll/fiftyone/XingRenHeCheLiangJianCe_detection_hard_samples_20240531_802_ver002"
dataset_type = fo.types.YOLOv5Dataset   # * 加载YOLO格式的数据集splits = ["train", "val"]dataset = fo.Dataset(name)
for split in splits:dataset.add_dir(dataset_dir = dataset_dir , dataset_type = fo.types.YOLOv5Dataset, split = split,tags = split)dataset.persistent = True              # * 持久化保存数据集,防止关闭session后数据集删除  
session = fo.launch_app(dataset, remote=True)

数据集加载成功展示
在这里插入图片描述

2.1.3 数据集导出

2.1.3.1 YOLO 格式数据集导出

使用YOLO格式导出指定名称数据集到指定路径下

import fiftyone as fo
dataset = fo.load_dataset("my_test")export_dir = r"D:\fiftyone\my_test_export_yolo"
export_format = fo.types.YOLOv5Dataset
dataset.export(export_dir=export_dir, dataset_type=export_format)

但上述导出方式不会保存如 Sample tags 等的元数据信息,若需全部保存,则需使用 Fiftyone 格式导出。

2.1.3.2 Fiftyone 格式数据集导出
import fiftyone as fo
dataset = fo.load_dataset("SmokeFire_val_test")export_dir = r"D:\fiftyone\SmokeFire_val_test_export_fiftyone"
export_format = fo.types.FiftyOneDataset
dataset.export(export_dir=export_dir, dataset_type=export_format)

导出数据集格式如下:
在这里插入图片描述

2.1.4 查看及删除本地数据集

# 查看本地数据库数据集
print(fo.list_datasets())# 删除指定名称数据集
fo.delete_dataset(dataset_name)

2.2 远程操作数据集

若要在远程服务器上使用 fiftyone 进行数据集管理,则需要远程连接数据集。在登录 session 界面时使用remote=True实现远程控制

import fiftyone as foname = 'Person_ver001'
dataset_dir = "/media/gll/fiftyone/ver001"
dataset_type = fo.types.YOLOv5Dataset   # * 加载YOLO格式的数据集dataset = fo.Dataset.from_dir(dataset_dir = dataset_dir,dataset_type = dataset_type,name = name,
)dataset.persistent = True              # * 持久化保存数据集,防止关闭session后数据集删除  
session = fo.launch_app(dataset, remote=True)

上述代码执行后,数据集成功加载结果展示如下:
在这里插入图片描述
但此时还不能通过 session 直接访问数据集,还需要在本地终端中运行指令ssh -N -L 5151:127.0.0.1:5151 username@hostname,使用 ssh 实现远程连接
在这里插入图片描述
连接成功后在浏览器打开默认端口localhost:5151,即可以看到已经成功加载的远程数据集。

3. 对数据进行打标签操作

3.1 图像打标签(单个/批量)

3.1.1 session 中单个打标签

  • 选中图像后批量添加标签,在 Samples 下新建或选择已有 tags 并应用即可为选定图像打上标签。
    在这里插入图片描述

3.1.2 使用脚本给已知路径的数据批量打标签

下述示例代码假设图像名称存储在指定 txt 文件中

import fiftyone as fo
import os# 1. 读取txt文件,获取图像名称列表
def read_image_names_from_txt(txt_file_path):with open(txt_file_path, 'r') as file:image_names = [line.strip() for line in file.readlines()]return image_names# 2. 加载Fiftyone格式的本地数据库
def load_fiftyone_dataset(dataset_name):return fo.load_dataset(dataset_name)# 3. 匹配图像名称并添加tags
def match_and_tag_images(txt_file_path, dataset_name, tags):image_names = read_image_names_from_txt(txt_file_path)dataset = load_fiftyone_dataset(dataset_name)matched_samples = []for sample in dataset:if sample.filepath.split(os.sep)[-1] in image_names:sample.tags.extend(tags)sample.save()matched_samples.append(sample.filepath.split(os.sep)[-1] )return matched_samplestxt_file_path = r"E:\project\0_Tools\fiftyone\SmokeFire_val.txt"
dataset_name = "fiftyone_test"
tags_to_add = ["test_tags"]matched_and_tagged_images = match_and_tag_images(txt_file_path, dataset_name, tags_to_add)
# print(f"Matched and tagged images: {[sample for sample in matched_and_tagged_images]}")
print(f"Number of matched and tagged images: {len(matched_and_tagged_images)}")
  • 未打标签前展示 在这里插入图片描述
  • 打标签后展示
    在这里插入图片描述

3.2 图像删除标签(单个/多个)

import fiftyone as fo# 1. 加载本地数据库
def load_dataset(dataset_name):return fo.load_dataset(dataset_name)# 2. 筛选图像并移除tags
def remove_tags(dataset_name, tags_to_del):dataset = load_dataset(dataset_name)view = dataset.match_tags(tags_to_del)print(f"Number of samples: {len(view)}")for sample in view:# print(sample.filepath, sample.tags)for tag in tags_to_del:if tag in sample.tags:sample.tags.remove(tag)sample.save()# 打印筛选结果以验证view_after = dataset.match_tags(tags_to_del)print(f"Filtered samples: {len(view_after)}")for sample in view_after:print(sample.filepath, sample.tags)dataset_name = "fiftyone_test"        
tags_to_del = ["test_tags", "test_tags1"]
remove_tags(dataset_name, tags_to_del)

3.3 匹配标签数据筛选

在界面中选择多个 tags标签查看时,筛选结果为所选 tags 的并集,故需使用下述代码筛选符合 tags 匹配的交集数据。

# 加载数据库
dataset = fo.load_dataset("SmokeFire_val_test")# 筛选tag为"场景-开源P图", "季节-春天", "时间-下午"的图像
view = dataset.match_tags(["场景-开源P图", "季节-春天", "时间-下午"], all=True) # all 为选择匹配图像的交集# 或者获取满足条件的图像的样本
matching_samples = list(view)
matching_samples_paths = [s.filepath for s in matching_samples]with open("matching_samples_paths.txt", "w") as f:for path in matching_samples_paths:f.write(path + "\n")print('nums --> ', len(matching_samples_paths))
  • 筛选示例如下
    在这里插入图片描述
    在这里插入图片描述

4. 踩坑记录

4.1 浏览器页面白屏-已解决

  • 问题分析:通过查看浏览器 ‘检查’ 项,发现 MIME 类型不匹配
    在这里插入图片描述
  • 解决方案:https://github.com/voxel51/fiftyone/issues/2010
    在这里插入图片描述
    按上述方法修改后重启,并未解决
  • 修改计算机\HKEY_CLASSES_ROOT.jsContent Typetext/javascript
    在这里插入图片描述
  • HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.js 中添加Content Typetext/javascript
    在这里插入图片描述
    修改后可以在浏览器中正常显示加载 session
    在这里插入图片描述

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

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

相关文章

2024《汽车出海全产业数据安全合规发展白皮书》下载

随着中国制造向中国智造目标的迈进,中国汽车正以前所未有的速度和质量,在全球市场上开疆拓土。不过,在中国汽车加快出海步伐的过程中,数据安全合规风险管理成为车企不容忽视的课题。 6月25日,在中国(上海&…

从万里长城防御体系看软件安全体系建设@安全历史03

长城,是中华民族的一张重要名片,是中华民族坚韧不屈、自强不息的精神象征,被联合国教科文组织列入世界文化遗产名录。那么在古代,长城是如何以其复杂的防御体系,一次次抵御外族入侵,而这些防御体系又能给软…

上海高考志愿填报小程序开发的主要功能

6月毕业季,高考学子刚经历了激烈的高考角逐,又迎来了志愿填报的大关。面对影响一生的高考志愿,如何填报显得尤为重要,面对广大学子的填报需求,上海高考志愿填报小程序为高考学子带来了福音。 一. 上海高考…

端到端图像分类算法开发实战:从 Arm 虚拟硬件到 Grove Vision AI Module V2 物理硬件

端到端图像分类算法开发实战:从 Arm 虚拟硬件到 Grove Vision AI Module V2 物理硬件 文章目录 1. 写在前面2. 产品简介2.1 Arm 虚拟硬件镜像产品简介2.2 Grove - Vision AI V2 产品简介 3. 实验前准备4. 实验步骤4.1 模型训练4.2 Arm 虚拟硬件镜像上的部署测试4.2…

OpenAI 开启买买买模式:接连收购 Rockset 与 Multi,科技巨头创新布局

引言 最近,OpenAI 在科技领域引起了广泛关注,通过接连收购两家初创公司 Rockset 和 Multi,开启了所谓的“买买买模式”。这一战略举措不仅展现了 OpenAI 对于技术发展的深远布局,也预示着未来更多创新产品的推出。本文将详细探讨…

Linux通用系统高危漏洞(CVE-2024-1086)修复案例

一、漏洞描述 2024年3月28日, Linux kernel权限提升漏洞(CVE-2024-1086)的PoC/EXP在互联网上公开,该漏洞的CVSS评分为7.8,目前漏洞细节已经公开披露,美国网络安全与基础设施安全局(CISA&#x…

测试:MyBatisDemo

MyBatis Demo 先创建一个 Maven 项目,名称为 MyBatis01。 之后创建并连接 MySQL 数据库,然后执行 sql 脚本: CREATE DATABASE mybatis;USE mybatis;DROP TABLE IF EXISTS user;CREATE TABLE user ( id int(20) NOT NULL, name varchar(30)…

ABB机器人控制柜各模块指示灯状态说明

ABB机器人控制柜各模块指示灯状态说明 主计算机模块位于控制柜的正前方,负责机器人的各种运算处理,安全模块主要负责安全相关的信号处理,驱动单元模块用于接收上位机指令,驱动机器人运动,轴计算机模块用于接收主计算机的运动指令和串

入门JavaWeb之 Response 验证码和重定向

Response 写验证码: package com.demo.response;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse…

浏览器页面打不开(网络连接正常的情况下)

目录 一、代理被打开 二、DNS被篡改 三、网络配置出现问题 四、浏览器配置问题 一、代理被打开 1. 右击Wifi图标 2.点击“打开网络和internet设置” 3. 点击代理,把该窗口所有的东西都关闭,尤其是代理服务器 二、DNS被篡改 如果第一个方法不行&am…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件,它允许用户控制测试计划中的某些操作仅执行一次,无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能

Demo效果 Entry Component struct StickyNestedScroll {State message: string Hello WorldState arr: number[] []scroller new Scroller()StyleslistCard() {.backgroundColor(Color.White).height(72).width("100%").borderRadius(12)}build() {Scroll(this.sc…

医药研发项目管理系统:适合CRO/CDMO企业使用的项目管理系统有哪些?

近日,北京民康百草医药科技有限公司(以下简称“民康百草”)与北京瑞杰智能科技有限公司(以下简称“瑞杰科技”)宣布达成战略合作,双方将共同打造一套符合民康百草企业特色的研发项目管理系统。该系统将基于…

postGreSQL关系数据库介绍

什么是postGreSQL关系数据库? PostgreSQL 是一个强大的、开源的对象关系型数据库管理系统(ORDBMS)。它基于POSTQUEL查询语言的继承,提供了对SQL标准的广泛支持,并扩展了许多高级功能,如事务处理、多版本并…

使用 Webmin 中模块注意事项

一、 Docker中Webmin忘记密码解决方法 Webmin忘记Web登陆时候的密码,无法登陆,可以通过changepass.pl 文件修改密码来进行解决。但在 Docker 中这一方法很难,因为不知道changepass.pl 在那里? 我是通过如下方法来解决的&#xff…

JAVA医院绩效考核系统源码:优化绩效考核的必要性 系统技术架构:java+springboot、mybaits +avue +MySQL

JAVA医院绩效考核系统源码:优化绩效考核的必要性 系统技术架构:javaspringboot、mybaits avue MySQL 医院绩效考核系统,建立以医院发展目标为导向,以医务人员劳动价值、工作量为评价基础,统筹效率、质量、成本的绩效管…

mysql窗口函数选择每个窗口的第一条数据

需求 假设我们有一个名为sales的表,我们想要按product分组,并为每个产品选择销售额最高的那一天 sales表 首先给每个产品按照销售量进行排名 SELECT product,sale_date,sales_amount,ROW_NUMBER() OVER (PARTITION BY product ORDER BY sales_amount …

AI在落地企业应用时的“数据幻觉”缘何这么难解决一谈LORA微调与数据质量处理之争

开篇 近年来,随着人工智能技术的飞速发展,越来越多的企业开始将AI落地应用于业务中。然而,不可忽视的是,企业在落地LLM RAG系统时,常常面临一个令人头痛的问题——数据幻觉。 就像透过雾霭的眼睛,看到了一片迷人的景…

火山引擎ByteHouse:新一代云数仓必不可少的五大核心能力

从数据库领域的发展历程来看,分析型数据库已有 40 多年的发展历史,与数据库基本同时代。从OLTP 和 OLAP 的分支来看,分析型数据库支持了海量数据规模下的聚合性分析。尤其是随着移动互联网甚至 AI 等领域的发展,用户画像行为分析的…

NGINX配置web文件服务

一、需求描述 系统需要提供文件(pdf、图片)等上传后支持预览功能。 二、实现方式 2.1 文件权限配置 chmod arwx -R public/chmod 是更改文件权限的命令。-R 是递归选项,表示更改目录及其所有子目录和文件的权限。arwx 是权限设置&#xf…