☰
labelImg 1.8.6 汉化版:Windows 免环境配置的 YOLO 标注工具实战指南
2026/9/25 3:16:01 网站建设 项目流程

简介:labelImg-1.8.6汉化中文版是面向Windows x64平台的目标检测标注工具绿色打包版本,适合从事深度学习、计算机视觉数据标注的开发者与初学者使用,无需配置Python环境即可直接运行。压缩包共151个文件,以85个dll动态库、30个pyd扩展模块和23个qm翻译文件为主,另含xsl样式表、txt说明及exe主程序,整体约38.72MB,解压后双击labelImg.exe即可启动,省去环境搭建与依赖安装的繁琐步骤。该版本由作者使用PyInstaller亲自打包,内置Qt界面组件与Python运行时,仅支持Windows x64系统,不适用于Linux和macOS。目前已有1694人学习下载,适合需要快速开展图像标注、制作VOC或YOLO格式数据集、验证检测模型训练流程的用户,可作为开箱即用的中文标注工具直接投入项目使用。

1. 拿到 labelImg-1.8.6 汉化中文版 exe 之后,先搞清楚它到底省掉了哪几步

如果你做过目标检测数据集,大概率在某个深夜被 Python 环境、PyQt5 版本冲突、lxml 编译失败轮番折磨过。labelImg 本身是个很轻的标注工具,但它的安装链路对新手并不友好:要装 Python、要装 PyQt5、要装 lxml,Windows 上还经常卡在 pip 编译环节。所以当有人把 labelImg-1.8.6 汉化中文版打包成 windows-x64 的 exe 直接发出来时,它真正省掉的不是「下载」这一步,而是整条环境配置链路。

这个 exe 版本适合三类人:一是刚入门目标检测、还没建立起 Python 环境管理习惯的新手;二是需要在多台 Windows 机器上快速铺开标注工作的团队;三是只想标几百张图、不想为工具折腾半天的人。它解决的核心问题是「开箱即用」,代价是版本被锁定在 1.8.6,且汉化界面和官方原版在个别菜单措辞上有差异。下面我会把从拿到 exe 到跑通第一份 YOLO 标注的完整路径拆开讲,包括参数怎么设、快捷键怎么记、闪退怎么排查。

2. labelImg 1.8.6 汉化版的核心机制与首次启动配置

2.1 为什么 exe 打包版能绕开 Python 环境

labelImg 官方发布形式是 Python 源码包,运行依赖 PyQt5 做界面、lxml 做 XML 解析。常规安装流程是pip install labelImg然后命令行启动,但这条路径在 Windows 上有两个高频翻车点:一是 PyQt5 的 wheel 和当前 Python 版本不匹配,二是 lxml 在没有预编译 wheel 的情况下会尝试本地编译,需要 Visual C++ Build Tools,很多人卡在这里就放弃了。

exe 打包版(常见做法是用 PyInstaller 把 Python 解释器、PyQt5、lxml 和 labelImg 源码一起冻结成单个可执行文件)把这些依赖全部内嵌。你双击运行时,PyInstaller 引导程序会在临时目录解压出一个完整的运行时环境,然后加载 labelImg 主模块。这意味着目标机器上不需要装 Python,也不需要装任何库。代价是首次启动会比源码版慢几秒,因为要解压;另外单文件 exe 在某些杀毒软件下会被误报,这是 PyInstaller 打包的通病,不是这个版本特有的问题。

汉化部分通常是对 labelImg 的界面字符串做了替换,把菜单、按钮、对话框提示改成中文。需要注意的是,汉化版一般只改界面文案,不改底层逻辑,所以标注生成的 XML 格式和官方版完全一致,这点可以放心。

2.2 首次启动必须确认的三个配置项

exe 拿到手之后,不要急着标图,先把三个配置项确认一遍,否则后面返工很痛苦。

第一个是标注格式。labelImg 支持 Pascal VOC(XML)和 YOLO(TXT)两种。如果你后续要用 YOLOv5/v8 训练,建议直接选 YOLO 格式,省掉一步格式转换。切换方式是在左侧工具栏点格式按钮,或者用快捷键切换。界面下方会显示当前格式。

第二个是自动保存。菜单里有个「自动保存模式」选项,打开后每次画完一个框切到下一张图时会自动写入标注文件。不开的话,你切图时如果忘了按保存,这一张的标注就丢了。我一般建议打开,配合下面的快捷键使用。

第三个是默认标注文件目录。labelImg 默认把标注文件和图片放在同一目录,如果你的图片和标注想分开存,需要在菜单里改「标注文件保存目录」。这个设置不会自动记忆到下次启动,每次打开新项目都要重新设,这是 1.8.6 的一个已知行为。

配置确认完之后,用「打开目录」加载图片文件夹,左侧文件列表出现图片名就说明环境正常。如果列表是空的,检查图片格式是不是 labelImg 支持的(jpg、png、bmp 等),以及路径里有没有中文或特殊字符——虽然汉化版对中文路径的支持比原版好,但个别情况下仍会出问题。

2.3 汉化界面下的快捷键对照与标注流程

汉化版把菜单翻译了,但快捷键没变,这点很重要。很多人看着中文菜单找不到对应操作,其实快捷键和官方文档一致。下面这张表是我实际用下来最高频的几个:

操作快捷键说明
创建矩形框W最常用,画检测框
下一张D切图前确认已保存
上一张A回看修改
保存Ctrl+S未开自动保存时必按
删除选中框Delete选中框后删除
放大/缩小Ctrl+滚轮小目标标注必备
切换标注格式无默认需在菜单里点

标注流程我一般是这样走的:打开目录 → 确认格式为 YOLO → 开启自动保存 → 按 W 画框 → 输入类别名 → 按 D 切下一张。类别名第一次输入后会记住,后续画框直接从下拉选,不用重复打字。如果一张图里有多个类别,画完一个框输入类别后,再按 W 画下一个框,下拉里会列出已用过的类别。

这里有个细节:YOLO 格式下,labelImg 会在图片同目录生成一个classes.txt文件,记录所有类别名。这个文件很关键,训练时类别索引就是按这个文件的行顺序来的。如果你中途改了类别名或增删了类别,classes.txt 会更新,但已经标好的旧文件里的类别索引不会自动改,会导致类别错位。所以类别列表最好在开始标注前就定死。

3. 用 labelImg 汉化版跑通第一份 YOLO 数据集的完整步骤

3.1 目录结构与类别文件的前置准备

在打开 labelImg 之前,先把目录结构规划好。我推荐的布局是这样的:

dataset/ ├── images/ # 存放所有待标注图片 │ ├── 001.jpg │ ├── 002.jpg │ └── ... ├── labels/ # 存放标注生成的 txt(YOLO格式) └── classes.txt # 类别定义文件

为什么要提前建好 labels 目录?因为 labelImg 的「标注文件保存目录」需要指向一个已存在的文件夹,它不会自动创建。classes.txt 可以提前手写,也可以在 labelImg 里标第一个框时自动生成。我习惯提前写好,内容一行一个类别名,比如:

person car dog

这个顺序就是最终的类别索引:person=0,car=1,dog=2。训练时的 data.yaml 里 names 列表必须和这个顺序完全一致,否则模型学出来的类别是错的。这是血泪经验,我见过有人标了几千张图,最后发现 classes.txt 顺序和训练配置对不上,全部返工。

3.2 在 labelImg 里加载目录并设置保存路径

启动 exe 后,按以下步骤操作:

第一步,点菜单「文件」→「打开目录」,选择dataset/images。左侧会出现图片文件列表。

第二步,点左侧工具栏的格式切换按钮,把格式切到 YOLO。界面底部状态栏会显示当前格式,确认一下。

第三步,点菜单「文件」→「改变标注文件保存目录」,选择dataset/labels。这一步不做的话,txt 会生成在 images 目录里,和图片混在一起。

第四步,点菜单「视图」→「自动保存模式」,打勾。

第五步,如果 classes.txt 已经放在 images 目录下,labelImg 启动时会自动读取。如果没有,你画第一个框时输入类别名,它会自动在图片目录生成 classes.txt。但为了保险,我还是建议提前放好。

设置完成后,界面应该是:左侧图片列表,中间图片显示区,右侧类别列表和标注框列表。按 W 开始画框,画完弹出类别输入框,输入或选择类别,框变绿表示已标注。

3.3 标注操作与 YOLO txt 输出格式验证

画框时几个实操要点:框的边角可以拖动调整,选中框后按 Delete 删除,Ctrl+滚轮放大图片后可以更精确地标小目标。如果图片里目标很小,建议先放大再画框,否则框的位置偏差会比较大。

标完几张图后,去dataset/labels目录检查生成的 txt 文件。YOLO 格式每行是:

类别索引 中心x 中心y 宽度 高度

所有坐标都是归一化到 0-1 之间的浮点数。比如:

0 0.5234 0.4120 0.1200 0.2500 1 0.3100 0.6800 0.0800 0.1500

第一列 0 对应 classes.txt 第一行的 person,第二列和第三列是框中心点的归一化坐标,第四列和第五列是框的归一化宽高。如果你打开 txt 发现坐标是大于 1 的整数,说明格式没切到 YOLO,还是 VOC 格式,需要回去重新切换格式并重新标注——VOC 转 YOLO 虽然可以写脚本转,但不如一开始就选对。

验证方法:随便找一张图,用 Python 读一下 txt 和图片尺寸,把归一化坐标还原成像素坐标,画个框看看和原图对不对得上。这个验证脚本很短:

import cv2 img = cv2.imread('dataset/images/001.jpg') h, w = img.shape[:2] with open('dataset/labels/001.txt') as f: for line in f: cls, cx, cy, bw, bh = map(float, line.split()) # 归一化坐标还原为像素坐标 x1 = int((cx - bw / 2) * w) y1 = int((cy - bh / 2) * h) x2 = int((cx + bw / 2) * w) y2 = int((cy + bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite('check.jpg', img)

这段代码的逻辑是:读图片拿宽高,读 txt 每行解析出类别和归一化坐标,把中心点坐标加减半宽半高还原成左上角和右下角像素坐标,然后画框保存。跑完打开 check.jpg,如果框的位置和你在 labelImg 里画的一致,说明标注文件没问题。参数上注意map(float, ...)把字符串转浮点,int()取整时可能有一两个像素误差,正常。

4. labelImg 汉化版在 Windows 上的避坑与闪退排查

4.1 双击 exe 没反应或闪退

现象:双击 exe 后窗口一闪而过,或者任务管理器里看到进程起来又消失。

原因:最常见的是杀毒软件拦截。PyInstaller 打包的单文件 exe 在启动时会释放临时文件,这个行为和一些杀毒软件的启发式检测冲突,会被直接杀掉。其次是 exe 文件下载不完整,压缩包解压时出错。

解决:先把 exe 加到杀毒软件白名单,或者临时关闭实时防护再试。如果还不行,重新解压一次压缩包,确认文件大小和压缩包里显示的一致。另外,exe 所在路径不要有中文和空格,放到D:\tools\labelImg\这种纯英文路径下最稳。

4.2 打开目录后图片列表为空

现象:点了「打开目录」,选了图片文件夹,但左侧列表什么都没有。

原因:一是图片格式不支持,labelImg 默认只认 jpg、jpeg、png、bmp 这几种,webp、tiff 需要额外配置;二是路径里有中文或特殊字符,虽然汉化版对中文支持较好,但个别 Windows 版本下仍会出问题;三是图片文件权限不对,比如从压缩包里直接打开没解压。

解决:确认图片是常见格式,把整个数据集放到纯英文路径下,确保图片文件已经解压到本地磁盘而不是在压缩包预览状态。如果还是不行,试着把图片数量减少到几张,排除是某张损坏图片导致列表加载中断。

4.3 标注文件保存位置不对或找不到

现象:标完图后找不到 txt 文件,或者在 images 目录里发现了 txt。

原因:没有设置「标注文件保存目录」,labelImg 默认保存到图片同目录。另外,这个设置不会跨会话记忆,每次重新打开 exe 都要重新设。

解决:每次启动后第一件事就是设保存目录。如果已经标了一批图发现 txt 在 images 里,可以批量移动过去,但要注意文件名对应关系。移动命令:

# 在 dataset 目录下执行,把 images 里的 txt 移到 labels move images\*.txt labels\

Windows 命令行下用move,PowerShell 下用Move-Item。移动后确认 labels 目录里的 txt 文件名和 images 里的图片文件名一一对应。

4.4 类别索引错位导致训练时类别全错

现象:训练出来的模型把所有类别都识别成同一个,或者类别和实际对不上。

原因:classes.txt 的顺序变了。比如你标到一半加了一个新类别插在最前面,labelImg 更新了 classes.txt,但之前标好的 txt 里类别索引还是旧的,导致同一个索引在不同文件里指向不同类别。

解决:类别列表在标注开始前定死,中途不要增删改顺序。如果必须改,所有已标注的 txt 都要同步更新类别索引,这个工作量很大,不如重新标。预防办法是标注前先写一份 classes.txt,所有人统一用这一份,不要各自生成。

4.5 大图片加载慢或标注卡顿

现象:标注高分辨率图片(比如 4000x3000 以上)时,切换图片明显卡顿,画框时鼠标延迟。

原因:labelImg 会把整张图加载到内存并渲染,图片越大内存占用越高,PyQt5 的渲染在低配机器上会吃力。另外,如果图片目录下文件数量过多(几千张),左侧列表的加载也会拖慢启动。

解决:标注前把图片缩放到合理尺寸,目标检测一般 1280 或 1920 宽度就够了,没必要用原始大图。批量缩放可以用 Python 脚本:

import cv2 import os src_dir = 'dataset/images' dst_dir = 'dataset/images_resized' os.makedirs(dst_dir, exist_ok=True) for name in os.listdir(src_dir): if not name.lower().endswith(('.jpg', '.png', '.jpeg')): continue img = cv2.imread(os.path.join(src_dir, name)) h, w = img.shape[:2] # 按宽度 1280 等比缩放 scale = 1280 / w if scale < 1: img = cv2.resize(img, (1280, int(h * scale))) cv2.imwrite(os.path.join(dst_dir, name), img)

这段代码遍历源目录,对宽度超过 1280 的图片等比缩放到 1280,高度按比例算。缩放后的图片标注坐标仍然是归一化的,所以不影响训练。注意缩放后要重新标注,因为原来的标注文件对应的是原图尺寸——不过 YOLO 格式是归一化的,理论上缩放不改变归一化坐标,但如果你之前标的是 VOC 格式(绝对坐标),缩放后坐标就错了。

5. 从标注到训练:验证数据集可用性的检查脚本与进阶习惯

标完一批图之后,不要直接丢给训练脚本,先做一次数据集完整性检查。我一般会写一个检查脚本,确认图片和标注文件一一对应、坐标范围合法、类别索引不越界。这个习惯帮我省过很多次训练到一半才发现数据有问题的后悔药。

import os img_dir = 'dataset/images' lbl_dir = 'dataset/labels' classes_file = 'dataset/classes.txt' with open(classes_file) as f: classes = [line.strip() for line in f if line.strip()] num_classes = len(classes) print(f'类别数: {num_classes}, 类别列表: {classes}') img_names = {os.path.splitext(n)[0] for n in os.listdir(img_dir) if n.lower().endswith(('.jpg', '.png', '.jpeg'))} lbl_names = {os.path.splitext(n)[0] for n in os.listdir(lbl_dir) if n.lower().endswith('.txt')} missing_lbl = img_names - lbl_names missing_img = lbl_names - img_names print(f'缺标注的图片: {len(missing_lbl)} 张') print(f'缺图片的标注: {len(missing_img)} 个') bad_lines = 0 for name in lbl_names: with open(os.path.join(lbl_dir, name + '.txt')) as f: for i, line in enumerate(f): parts = line.strip().split() if len(parts) != 5: bad_lines += 1 continue cls = int(parts[0]) coords = list(map(float, parts[1:])) if cls >= num_classes or cls < 0: print(f'{name}.txt 第{i+1}行类别索引越界: {cls}') if any(c < 0 or c > 1 for c in coords): print(f'{name}.txt 第{i+1}行坐标越界: {coords}') print(f'格式异常行数: {bad_lines}')

这个脚本做四件事:读 classes.txt 确认类别数;对比图片和标注文件名集合,找出缺失项;逐行检查标注文件,确认每行五个字段、类别索引在合法范围内、坐标在 0 到 1 之间。跑完如果输出都是 0 和空,说明数据集基本干净,可以进入训练流程。

进阶习惯方面,我建议标注阶段就做好版本管理。每标完一批就打包备份一次,标注文件用 git 管理也行,因为 txt 是纯文本,diff 很清晰。另外,如果团队多人标注,classes.txt 一定要统一,最好放在共享目录里,每个人启动 labelImg 前先同步这份文件。类别命名用英文小写加下划线,不要用中文或空格,避免后续训练配置里出编码问题。

最后说一个我自己的教训:早期用 labelImg 标数据时,我总觉得「先标着,格式后面再转」,结果 VOC 和 YOLO 混着标了好几批,最后写转换脚本处理边界情况花的时间比重新标还多。所以现在我的习惯是,打开 labelImg 第一件事就是切格式、设保存目录、确认 classes.txt,三件事做完再动第一张图。这个习惯看起来慢,实际上是最快的路径。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询