【数据集管理】使用 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

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

银行批处理系统设计模块

银行批处理系统是一种关键的后台处理系统,它通常在非高峰时段处理大量交易和数据。这种系统的设计需要考虑高可靠性、安全性、准确性和效率。以下是设计银行批处理系统时可能包含的一些核心模块: 1. **输入模块**: - 负责接收各种来源的数…

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

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

ESP32代码开发入门

ESP-IDF ESP-ADF开发 开发概要 编译环境及SDK搭建 整个开发流程是:下载ESP-IDF, ESP-ADF(按需下载),并安装, 编写hello world工程,编译并烧录到主板验证 可参照ESP32 esp-idf esp-adf环境安装及.a库创建与编译api大部分可以用glibc的接口 做了封装,时间time(NULL), 创建线程p…

端到端图像分类算法开发实战:从 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…

福昕阅读器 (Foxit Reader) 详解:打造极致PDF阅读体验

引言 在日常工作和学习中,PDF文件的使用越来越广泛。一款高效、稳定且功能丰富的PDF阅读器能够大大提升我们的工作效率。福昕阅读器 (Foxit Reader) 作为一款备受欢迎的PDF阅读器,以其轻量、高效和强大的功能,成为了许多用户的首选。本文将详…

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

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

如何在 Ubuntu VPS 实例上安装 Chef 服务器、工作站和客户端

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 随着组织结构的不断增长和管理环境所需的各个独立组件的扩展,管理每个服务器和服务可能变得难以管理。 配置管理解决方…

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

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

vue 中html 转word 遇到的坑记录

1.单选框的展示 <span style="font-family: Wingdings;font-size: 12pt;">{{items.cellValue == i ? "" : "¡" }} </span>2.多选框的展示 <span style=" font-family: 宋体">{{items.selRadio.includes(ind…

测试:MyBatisDemo

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

数据治理新纪元:筛斗数据引领企业信息优化潮流

数据治理新纪元&#xff1a;筛斗数据引领企业信息优化潮流 随着数字化时代的深入发展&#xff0c;数据已成为企业运营和决策的核心驱动力。然而&#xff0c;海量的数据往往伴随着质量参差不齐、格式各异等问题&#xff0c;如何有效地管理和利用这些数据&#xff0c;成为企业面…

等级保护 | 如何完成等保的建设整改

等级保护整改是等保基本建设的一个阶段。为了能成功通过等级测评&#xff0c;企业要根据等级保护建设要求&#xff0c;对信息和信息系统进行网络安全升级&#xff0c;对定级对象当前不满足要求的进行建设整改&#xff0c;包括技术层面的整改&#xff0c;也包括管理方面的整改。…

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

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

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

Response 写验证码&#xff1a; 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…

leetcode167:两数之和|| - 输入有序数组

题目链接&#xff1a;167. 两数之和 II - 输入有序数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> twoSum(vector<int>& numbers, int target) {int left 0, right numbers.size() - 1;while(left < right){if(numbe…

Qt动态监测USB插拔事件

需要引用头文件 #include <windows.h> #include <dbt.h> Qt4用 bool winEvent(MSG *m, long *result); 或 bool winEventFilter(MSG *m, long *result); 例如&#xff1a; bool USBTest::winEvent(MSG *m, long *result) {int msgType m->message;if (m…

postman接囗测试工具详解

Postman 是一种广泛使用的API开发和测试工具,用于发送HTTP请求、测试API接口、自动化测试、生成API文档等。以下是对Postman的详细介绍及其使用指南: 主要功能 发送请求: 支持GET、POST、PUT、DELETE、PATCH等HTTP方法。允许设置请求头、请求体、查询参数、路径变量等。支持…

Java数据结构算法(最长递增序列动态规划)

前言: 最长递增子序列(Longest Increasing Subsequence, LIS)是指在一个给定的序列中,找到一个最长的子序列,使得这个子序列中的元素是单调递增的。子序列不要求在原序列中连续。 实现原理 一种常见的方法是使用动态规划来解决最长递增子序列问题。以下是具体步骤: 定义…