使用OpenCV GUI清理数据集 | 为目标检测模型创建更好的数据集

点击下方卡片,关注“小白玩转Python”公众号

在深度学习中有几件重要的事情,我认为数据是最关键的。如果没有合适的数据,要取得好的结果是非常困难的。即使你用强大的预训练模型和GPU训练模型,你的模型也可能表现不佳。在本文中,我将讨论如何获取数据集、分析数据集并使用简单的OpenCV GUI应用程序对其进行清理。我将使用Python作为编程语言。

c3a998cdb1a050e28e5b59d88cfed08b.png

标记的图像

获取数据的最佳网站

有两种主要方法可以获取数据。第一种方法是生成自己的数据。你可以使用手机相机拍照,或者从互联网上抓取。获取图像后,你需要为它们标记(用于目标检测),这个过程可能需要很长时间。第二种方法更容易,你可以从网站上获取数据,互联网上有许多免费的数据集。

  • Kaggle:https://www.kaggle.com/datasets

  • Roboflow:https://universe.roboflow.com/

在选择数据集之前,我总是检查这两个网站。如果我找不到合适的数据集,我就会使用第一种方法。

如何判断一个数据集是否可以直接使用?

  • 如果你创建了自己的数据集,你可能不需要清理它,因为你自己拍摄了照片并对它们进行了标记。你可以在创建过程中清理它,无需额外的清理步骤。

  • 如果你直接从互联网上下载数据集,你将需要检查它。可能会有无关的图像、错误的标签或低质量的图像。

我通常从随机检查数据集开始。我只是检查图像的质量,并观察对象的分布,我不太关注数据集。如果一切都看起来可以接受,我就训练一个小模型。在评估结果之后,我通常可以理解数据是否需要清理或是否可以用于训练。

  • 如果我决定数据还不准备好使用,我会使用我创建的简单OpenCV GUI对其进行清理。现在我将向你展示如何创建此GUI并用于清理数据集。

清理数据的GUI

这个GUI非常简单易用,而且非常有效。用户可以在一个屏幕上看到标签、边界框和图像本身,决定是否可以将其用于数据集。

  • 如果用户决定图像是合适的,图像和标签将被复制到另一个文件夹中,稍后将用于训练。(按“s”键)

  • 如果用户认为图像不合适,图像和标签将被删除。(按空格键)

实际上,这非常有效,因为你可以看到图像,同时也可以看到标签。使用此GUI,用户可以将不同的数据集合并到一个文件夹中,并为其选择最佳图像。

代码

  • 导入必要的库

import cv2
import os
import shutil
import random
  • 创建图像和标签的文件夹

# Define the path to your folder containing images# folders for all images and labels
image_folder = 'original-images' 
label_folder = 'original-labels'# folders for selected images and labels
saved_images_folder= 'saved-images'
saved_labels_folder = 'saved-labels'
  • 获取图像文件路径并对它们进行随机排序

注意:在目标检测数据集中,每个图像文件都有一个相应的带有相同名称的标签文件。这种命名约定是通用的。例如,如果有一个名为“image23.jpg”的图像文件,则存在一个名为“image23.txt”的文件,其中包含关于标签和边界框的信息。

# Get a list of all image files in the folder
image_files = [f for f in os.listdir(image_folder) if f.endswith(('.jpg', '.png', '.jpeg'))]# Randomly shuffle the list of image files
random.shuffle(image_files)
  • 显示图像、标签和边界框的函数

# Function to display image and handle keypress
def display_image(image_path, label_path):img = cv2.imread(image_path)with open(label_path, 'r') as f:lines = f.readlines()for line in lines:class_id, x_center, y_center, width, height = map(float, line.strip().split())# Convert YOLO format to pixel coordinatesimg_h, img_w, _ = img.shapex_center *= img_wy_center *= img_hwidth *= img_wheight *= img_hx_min = int(x_center - (width / 2))y_min = int(y_center - (height / 2))x_max = int(x_center + (width / 2))y_max = int(y_center + (height / 2))# Draw bounding boxcv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)# Get class name based on class_idclass_names =   ['black-bishop', 'black-king', 'black-knight', 'black-pawn', 'black-queen', 'black-rook', 'white-bishop', 'white-king', 'white-knight', 'white-pawn', 'white-queen', 'white-rook']class_name = class_names[int(class_id)]# Write class namecv2.putText(img, class_name, (x_min, y_min - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)cv2.imshow('Image', img)key = cv2.waitKey(0)return key

主循环

# Main loop to display images and handle selection
for image_file in image_files:image_path = os.path.join(image_folder, image_file)label_path = os.path.join(label_folder, image_file.replace('.jpg', '.txt'))  # Assuming label files have the same name as image files with a .txt extension# Check if the label file existsif os.path.exists(label_path):key = display_image(image_path,label_path)# Press 's' to save the image and its corresponding label file to the selected folderif key == ord('s'):selected_image_path = os.path.join(saved_images_folder, image_file)selected_label_path = os.path.join(saved_labels_folder, image_file.replace('.jpg', '.txt'))shutil.move(image_path, selected_image_path)  # Move the image file to the selected foldershutil.move(label_path, selected_label_path)  # Move the label file to the saved labels folderprint(f"Image '{image_file}' and its corresponding label file saved.")elif key == ord(' '):os.remove(image_path)os.remove(label_path)continue  # Move to the next imageelif key == ord('q'):breakelse:print(f"No label file found for image '{image_file}'.")continue  # Skip to the next imagecv2.destroyAllWindows()

160541a20ba418ce0d9a564d44f678be.png

0ccf0e1117ac2c6d95f4e9b36e7b798e.png
  • 按下“q”后,GUI将关闭。然后用户可以在“saved-images”和“saved-labels”文件夹中找到保存的图像和标签。

·  END  ·

HAPPY LIFE

268d81c1974098550a0907aca22f06ac.png

本文仅供学习交流使用,如有侵权请联系作者删除

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

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

相关文章

Kotlin核心编程知识点-02-面向对象

文章目录 1.类和构造方法1.1.Kotlin 中的类及接口1.1.1.Kotlin 中的类1.1.2.可带有属性和默认方法的接口 1.2.更简洁地构造类的对象1.2.1.构造方法默认参数1.2.2.init 语句块1.2.3.延迟初始化:by lazy 和 lateinit 1.3.主从构造方法 2.不同的访问控制原则2.1.限制修…

Apifox接口报错401,msg:“未授权”

Apifox接口报错401,msg:“未授权” 报错: 原因:Apifox接口好像两小时token就过期了,得重新获取 一、打开登录接口,找到token 二、打开根目录找到token,将登录的token值拷贝过来,点击保存 三…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的,它针对稠密向量数据集的相似搜索而设计,能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片,流式数据插入,动态schema&#xff0c…

JVM运行时内存:虚拟机栈

文章目录 1. 概述2. 栈针3. 栈针内部结构3.1 局部变量表3.2 操作数栈3.3 动态链接3.4 方法返回地址3.5 一些附加信息 运行时内存整体结构如下图所示: 1. 概述 如何理解栈管运行,堆管存储? 角度一:GC;OOM角度二:栈、堆执行效率角…

电子合同怎么盖章的

数字证书盖章:利用个人或企业的数字证书进行盖章。数字证书作为数字身份证明,确保了电子签名和盖章的可信度。通过加密技术,确保合同内容不被篡改,盖章过程完成后,合同具有法律效力。 时间戳盖章:在电子合…

STM32 HAL TM1638读取24个按键

本文分享一下天微电子的另一款数码管按键驱动芯片TM1638的单片机C语言驱动程序。 笔者采用的MCU是STM32单片机,STM32CubeMX Keil5开发,使用了HAL库。 一、TM1638介绍 1、基础信息 TM1638属于一款LED驱动控制专用电路,其特性如下&#xf…

析构函数详解

目录 析构函数概念特性对象的销毁顺序 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️🐿️🐿️ C语言例题 &…

两步将 CentOS 6.0 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文介绍如何将一个 CentOS 6.0 的系统升级并转换迁移到 RHEL 7.9。 本文是《在离线环境中将 CentOS 7.X 原地升级并迁移至 RHEL 7.9》阶进篇。 所有被测软件的验证操作可参见上述前文中对应章节的说明。 准备 CentOS 6.…

语言模型测试系列【8】

语言模型 文心一言星火认知大模型通义千问豆包360智脑百川大模型腾讯混元助手Kimi Chat商量C知道 这次的测试比较有针对性,是在使用钉钉新推出的AI助理功能之后发现的问题,即创建AI助理绑定自己钉钉的知识库进行问答,其中对于表结构的文档学…

【echart】实现echart图的富文本样式

贴源码 let xData [山西,山东,内蒙,甘肃];let averData [2, 3,1, 3];var eicon path://M480.55,252.18L318.88,498.04c-15.95,24.25,1.08,56.57,30.11,57.12l147,2.79L448.5,696.92c-14.74,43.15,39.88,75.83,70.93,42.44l216.73-233.04c21.93-23.58,5.21-61.98-27-61.98H56…

【面试干货】 两个有序数组的合并排序

【面试干货】 两个有序数组的合并排序 1、实现思想2、代码实现 💖The Begin💖点点关注,收藏不迷路💖 1、实现思想 使用两个指针分别指向两个数组的起始位置,然后逐个比较两个指针所指向的元素,将较小的元素…

【IoTDB 线上小课 03】时序数据库 VS 实时数据库,区别是?

好评满满的【IoTDB 视频小课】系列又来了~ 关于 IoTDB,关于物联网,关于时序数据库,关于开源... 你想学习的重点,给我们 3-5 分钟,清晰地讲给你听: 时序数据库 VS 实时数据库 工业数字化转型愈发受到重视的当…

OpenAI 发布 GPT-4o,再次巩固行业地位!

5 月 14 日凌晨 1 点(太平洋时间上午 10 点),OpenAI 发布了其最新的 GPT-4o,再次巩固了其在人工智能领域的领导地位。这次发布不仅仅是一个产品的推出,更是向世界宣告 AI 技术已迈入一个全新的纪元。OpenAI 的 CEO 萨姆…

本机搭建RabbitMQ

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、下载安装包,搭建过程 二、重要概念介绍 三、创建用户 方式一:命令行 方式二:管理后台 3.1 创建用户 3.2 分配权限 3.3 提…

小程序|锁定查询功能如何使用?

学生或家长想要实现自己查询完成后,任何人都无法再次查询,老师应该如何设置?易查分的【锁定查询功能】就可实现,下面教大家如何使用吧。 📌使用教程 🔒锁定查询功能介绍 ✅学生或家长自主锁定:开…

【SQL】SQL常见面试题总结(1)

目录 1、检索数据1.1、从 Customers 表中检索所有的 ID1.2、检索并列出已订购产品的清单1.2、检索所有列 2、排序检索数据2.1、检索顾客名称并且排序2.2、对顾客 ID 和日期排序2.3、按照数量和价格排序2.4、检查 SQL 语句 3、过滤数据3.1、返回固定价格的产品3.2、返回产品并且…

高效协同,智慧绘制:革新型流程图工具全解析

流程图,作为一种直观展示工作过程和系统运作的工具,在现代办公和项目管理中发挥着不可或缺的作用。 其优势在于能够清晰、直观地呈现复杂的过程和关系,帮助人们快速理解并掌握关键信息。同时,流程图也广泛应用于各种场景&#xf…

STM32HAL库-中断篇

中断 中断简介 中断是一种事件处理机制,可以暂停主程序的运行,转而处理特定事件程序。 中断的作用和意义: 实时控制 在确定事件内对响应事件做出相应 故障处理 检测到故障需要第一时间处理 数据传输 如串口通信,不确定数…

独家|暴雨推出基于国产X86芯片的四路服务器

伴随着智慧计算时代的到来和企业数字化转型的深入,人工智能、大数据、虚拟化等创新技术在应用普及的过程中,也在不断地细分和深化,使得企业的业务系统日趋复杂,数据量、数据类型更加庞大,对计算平台的性能要求“水涨船…

CET6级(笔试备考)

CET6笔试 做题技巧 备考注意 感觉考前一个月还是要多刷几套真题啊,刷个10套吧。 参考链接:https://blog.csdn.net/m0_57656758/article/details/130707582