python:YOLO格式数据集图片和标注信息查看器
作者:CSDN @ _养乐多_
本文将介绍如何实现一个可视化图片和标签信息的查看器,代码使用python实现。点击下一张和上一张可以切换图片。

文章目录
- 一、脚本界面
- 二、完整代码
一、脚本界面
界面如下图所示,

二、完整代码
使用代码时,需要修改 class_id_to_name 还有 YOLO 格式的图片(images)文件夹路径和标签(labels)文件夹路径。
from PIL import Image, ImageDraw, ImageFont, ImageTk
import tkinter as tk
from tkinter import ttk
import os# 创建类别 ID 到中文名称的映射
class_id_to_name = {0: "飞机",1: "船只",2: "储油罐",3: "棒球场",4: "网球场",5: "篮球场",6: "跑道场地",7: "港口",8: "桥梁",9: "车辆"
}def get_image_size(image_path):# 打开图片文件with Image.open(image_path) as img:# 获取图片的宽度和高度width, height = img.sizereturn width, heightdef read_yolo_labels(label_file, img_width, img_height):with open(label_file, 'r') as file:lines = file.readlines()boxes = []for line in lines:parts = line.strip().split()class_id = int(parts[0])x_center = float(parts[1])y_center = float(parts[2])width = float(parts[3])height = float(parts[4])# 将 YOLO 格式转换为像素坐标x_center_px = int(x_center * img_width)y_center_px = int(y_center * img_height)width_px = int(width * img_width)height_px = int(height * img_height)# 计算矩形框的左上角和右下角点x1 = int(x_center_px - width_px / 2)y1 = int(y_center_px - height_px / 2)x2 = int(x_center_px + width_px / 2)y2 = int(y_center_px + height_px / 2)boxes.append((x1, y1, x2, y2, class_id))return boxesdef draw_boxes_on_image(image_path, boxes):# 使用 PIL 加载图片img = Image.open(image_path)draw = ImageDraw.Draw(img)# 定义颜色和线宽box_color = "yellow" # 选择一个亮色line_width = 5 # 设置较粗的线宽# 使用支持中文字符的系统字体try:# 尝试使用支持中文的常见系统字体font = ImageFont.truetype("msyh.ttc", size=24) # 微软雅黑except IOError:# 回退到默认字体font = ImageFont.load_default()for (x1, y1, x2, y2, class_id) in boxes:# 绘制矩形框draw.rectangle([x1, y1, x2, y2], outline=box_color, width=line_width)# 从 class_id 获取类别名称class_name = class_id_to_name.get(class_id, "未知")text = class_nametext_width, text_height = 50, 40 # 设定文本框的宽度和高度text_x = x1text_y = y1 - text_height - 5# 绘制带背景矩形的文本draw.rectangle([text_x, text_y, text_x + text_width, text_y + text_height], fill=box_color)draw.text((text_x, text_y), text, fill="black", font=font)return imgdef display_image_with_boxes(image_file, label_file):# 获取图片尺寸img_width, img_height = get_image_size(image_file)# 读取 YOLO 标签boxes = read_yolo_labels(label_file, img_width, img_height)# 在图片上绘制矩形框img_with_boxes = draw_boxes_on_image(image_file, boxes)return img_with_boxesclass ImageViewer:def __init__(self, root, image_files, label_files):self.root = rootself.image_files = image_filesself.label_files = label_filesself.current_index = 0# 设置固定的查看器大小self.viewer_width = 800self.viewer_height = 600# 初始化界面self.init_ui()def init_ui(self):self.canvas = tk.Canvas(self.root, width=self.viewer_width, height=self.viewer_height)self.canvas.pack()self.prev_button = ttk.Button(self.root, text="上一张", command=self.prev_image)self.prev_button.pack(side=tk.LEFT)self.next_button = ttk.Button(self.root, text="下一张", command=self.next_image)self.next_button.pack(side=tk.RIGHT)self.update_image()def update_image(self):image_file = self.image_files[self.current_index]label_file = self.label_files[self.current_index]img_with_boxes = display_image_with_boxes(image_file, label_file)# 将图片转换为 Tkinter 可用格式img_with_boxes = img_with_boxes.convert("RGB")img_tk = ImageTk.PhotoImage(img_with_boxes)# 计算缩放比例img_width, img_height = img_with_boxes.sizescale = min(self.viewer_width / img_width, self.viewer_height / img_height)new_width = int(img_width * scale)new_height = int(img_height * scale)# 缩放图片img_resized = img_with_boxes.resize((new_width, new_height), Image.Resampling.LANCZOS)img_tk_resized = ImageTk.PhotoImage(img_resized)# 清除画布上的内容self.canvas.delete("all")# 在画布上显示图片self.canvas.create_image(self.viewer_width / 2, self.viewer_height / 2, image=img_tk_resized)# 保持对图像的引用self.canvas.image = img_tk_resizeddef prev_image(self):if self.current_index > 0:self.current_index -= 1self.update_image()def next_image(self):if self.current_index < len(self.image_files) - 1:self.current_index += 1self.update_image()if __name__ == "__main__":# 图片和标签文件的路径image_folder = 'E:\\DataSet\\positive'label_folder = 'E:\\DataSet\\yolo_labels'# 获取所有图片和标签文件image_files = sorted([os.path.join(image_folder, f) for f in os.listdir(image_folder) if f.endswith('.jpg')])label_files = sorted([os.path.join(label_folder, f) for f in os.listdir(label_folder) if f.endswith('.txt')])# 创建 Tkinter 窗口root = tk.Tk()root.title("图片标注查看器")# 启动图像查看器viewer = ImageViewer(root, image_files, label_files)root.mainloop()
相关文章:
python:YOLO格式数据集图片和标注信息查看器
作者:CSDN _养乐多_ 本文将介绍如何实现一个可视化图片和标签信息的查看器,代码使用python实现。点击下一张和上一张可以切换图片。 文章目录 一、脚本界面二、完整代码 一、脚本界面 界面如下图所示, 二、完整代码 使用代码时࿰…...
AGI思考探究的意义、价值与乐趣 Ⅴ
搞清楚模型对知识或模式的学习与迁移对于泛化意味什么,或者说两者间的本质?相信大家对泛化性作为大语言模型LLM的突出能力已经非常了解了 - 这也是当前LLM体现出令人惊叹的通用与涌现能力的基础前提,这里不再过多赘述,但仍希望大家…...
c++: mangle命名规则
其实可用根据binutils/c++filt的源代码看。找到mangle的命名规则, 但是从网上找到了一个总结,但是github有时候上不去,摘录再次。 https://github.com/gchatelet/gcc_cpp_mangling_documentation https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling 举例: _ZN8…...
系统化学习 H264视频编码(05)码流数据及相关概念解读
说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…...
【VMware】如何演示使用U盘在VMware虚拟机上安装Windows11
一、前置准备 在开始使用U盘演示在VMware虚拟机上装Windows11前,我们需要做以下前置的准备: 已制作好的Windows引导盘;WMware软件 如何制作Windows引导盘? 推荐参考: 【建议收藏】2024年最新Windows系统重装教程&…...
HanLP和Jieba区别
HanLP和Jieba都是中文分词工具,但它们在多个方面存在区别。以下是对两者区别的详细分析: 一、开发背景与语言支持 HanLP:由大连理工大学自然语言处理与社会人文计算实验室开发,是一个开源的自然语言处理工具包。它主要使用Java语…...
荒原之梦考研:考研二战会很难吗?
考研二战是不是很难,其实很大程度上取决于我们自己,我们能否认清自己的优势,能否指定和执行合理的计划,有没有强大的心理支撑等,都是决定考研二战能否成功,或者能否比较轻松的成功的关键。 在本文中&#…...
【Git企业级开发实战指南①】Git安装、基本操作!
目录 一、Git是什么?1.1特点1.2功能1.3基本概念 二、Git安装2.1Ubuntu下安装2.2Centos下安装Git 三、Git基本操作3.1创建git本地仓库3.2配置Git3.3 工作区&暂存区&版本库3.4 实操案例3.4.1添加文件 3.5 修改文件3.6版本回退3.7查看历史操作日志3.7撤销修改3…...
Leetcode 3239. Minimum Number of Flips to Make Binary Grid Palindromic I
Leetcode 3239. Minimum Number of Flips to Make Binary Grid Palindromic I 1. 解题思路2. 代码实现 题目链接:3239. Minimum Number of Flips to Make Binary Grid Palindromic I 1. 解题思路 这一题思路上的话就是分别考察一下把所有行都变成回文所需要的fli…...
C++面试基础算法的简要介绍
C是一种广泛使用的编程语言,尤其在算法和数据结构的实现中占据重要地位。以下是对C基础算法的一些介绍,涵盖了排序、查找、搜索算法以及基本的遍历算法等方面。 排序算法 快速排序(Quick Sort) 快速排序是一种分而治之的排序算法…...
【Linux网络编程】套接字Socket(UDP)
网络编程基础概念: ip地址和端口号 ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个…...
jvm方法返回相关指令ireturn,areturn,return等分析
正文 看图: 做的事情如下: 1:弹出当前的方法栈帧 2:获取上一个方法 3:从当前方法的操作数栈中获取执行结果,并推送到上一个方法的操作数栈中对应的伪代码: Override public void execute(Frame frame) {Thread thread frame.thread();Frame curren…...
宝塔部署springboot vue ruoyi前后端分离项目,分离lib、resources
1、“文件”中创建好相关项目目录,并将项目相关文件传到对应目录 例如:项目名称/ #项目总目录 api/ #存放jar项目的Java项目文件 manage/ #vue管理后端界面 …...
Python 基础教程:List(列表)的使用
《Python 基础教程:List(列表)的使用》 在 Python 中,列表是最基本的数据结构之一,它是一种有序的、可变的数据集合,可以包含任意类型的元素,包括数字、字符串、其他列表等。 1. 列表的创建 …...
kubebuilder常用标签
kubebuilder 标签是用于注解 Kubernetes CRD(Custom Resource Definition) 的标签,主要用于在 Operator SDK 和 Kubebuilder 框架中生成代码、验证规则以及自定义 CRD 的生成。以下是常用的 kubebuilder 标签: 1. 字段验证标签 …...
ChatTTS文本转语音本地部署结合内网穿透实现远程使用生成AI音频
文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目,并且我们还可以结合Cpolar内网穿透工具创建公网地址,随时随…...
基于微信小程序的高校大学生信息服务平台设计与实现
基于微信小程序的高校大学生信息服务平台设计与实现 Design and Implementation of a College Student Information Service Platform based on WeChat Mini Program 完整下载链接:基于微信小程序的高校大学生信息服务平台设计与实现 文章目录 基于微信小程序的高校大学生信息…...
YOLOV8替换Lion优化器
YOLOV8替换Lion优化器 1 优化器介绍博客 参考bilibili讲解视频 论文地址:https://arxiv.org/abs/2302.06675 代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py """PyTorch implementation of the Lion …...
uniapp页面里面的登录注册模板
<!-- 账号密码登录页 --> <template><view class"page"><view class"uni-content"><view class"login-logo"><image :src"logo"></image></view><text class"title title-bo…...
C++新手入门学习教程(完整版)
以下教程覆盖了 C 学习的各个方面,适合初学者循序渐进地学习。学习过程中,建议初学者多做练习和项目,以加深对理论知识的理解。希望这个教程能为你提供一个清晰的学习路径。 目录 第一章:C 简介 1.1 C 的历史与演变 1.2 C 的特…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
