尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

labelImg汉化版exe:Windows目标检测标注工具使用指南

labelImg汉化版exe:Windows目标检测标注工具使用指南 简介labelImg-1.8.6汉化中文版是面向计算机视觉标注入门者与算法工程师的免安装工具包专为Windows x64系统打造解压后双击labelImg.exe即可直接使用无需配置Python环境也无需处理依赖冲突适合目标检测数据集标注、教学演示与快速验证等场景。压缩包共151个文件约38.72MB其中85个dll与30个pyd构成Qt界面与Python运行时依赖23个qm文件提供中文等多语言翻译另有xsl、txt、rng等配置与资源文件整体结构完整、开箱即用。目前已有1694人学习下载说明该汉化打包版本在标注工具选型中具备一定参考价值。对于不熟悉命令行与环境配置的读者这份资源省去了安装PyQt5、lxml等库的繁琐步骤可直接投入矩形框、多边形等标注任务帮助把精力集中在数据准备与模型训练上。1. 拿到 labelImg-1.8.6 汉化中文版 exe 之后先搞清楚它到底省掉了哪几步如果你做过目标检测数据集大概率在某个深夜被 labelImg 的环境折腾过Python 版本不对、PyQt5 装不上、lxml 编译报错、命令行敲进去直接闪退。所以当有人把 labelImg-1.8.6 汉化中文版打包成 windows-x64 的 exe 直接放出来时很多人的第一反应是「终于不用配环境了」。这个判断基本正确但只对了一半。exe 版本真正省掉的是 Python 解释器、PyQt5 运行时和 lxml 依赖这三层安装成本让你在 windows-x64 上双击就能进入标注界面而且菜单和快捷键提示都是中文的。它没有省掉的是标注格式的选择、类别文件的维护、大图加载时的内存占用以及标注数据在团队之间的流转规范。换句话说工具门槛被抹平了但标注工程本身的问题一个都没少。这篇文章面向三类人第一次接触 labelImg 标注工具、想直接用汉化 exe 上手的新手已经用过原版但被环境问题反复折磨、想换稳定分发的熟手以及需要给团队统一标注工具、关心 windows-x64 下 exe 打包方式和兼容边界的负责人。接下来我会按「先跑通、再讲参数、最后说坑」的顺序把这个 exe 版本的实际使用路径拆开讲清楚。2. labelImg 汉化中文版 exe 的启动路径与最小可用配置2.1 为什么 exe 版本能绕开 Python 环境但绕不开工作目录labelImg 原版是一个基于 Python PyQt5 的桌面标注工具正常安装流程是 pip install labelImg 或者从源码跑 python labelImg.py。exe 打包的本质是用 PyInstaller 把 Python 解释器、PyQt5 的 Qt 库、lxml 以及 labelImg 自己的代码全部塞进一个可执行文件里。你双击 exe 的时候它会在临时目录解压出一个完整的运行时然后启动主窗口。这里有一个容易被忽略的点exe 版本虽然不依赖系统 Python但它仍然需要读写工作目录。labelImg 默认会在启动目录下找 predef_classes.txt 和 classes.txt如果你把 exe 放在桌面直接双击classes.txt 就会生成在桌面。更稳妥的做法是单独建一个标注工作目录把 exe 放进去再在里面建 images 和 labels 两个子目录。# 建议的目录结构在 windows-x64 上手动建即可 D:\labeling_workspace\ ├── labelImg.exe # 汉化中文版 exe ├── predef_classes.txt # 预定义类别一行一个 ├── images\ # 待标注图片 └── labels\ # 标注输出predef_classes.txt 的作用是让 labelImg 启动时自动加载类别列表避免每次新建标注都要手动输入类别名。这个文件不是必须的但如果你要标几千张图提前写好能省掉大量重复输入。类别名建议用英文小写加下划线比如 person、traffic_light、helmet不要用中文后面转 YOLO 或 COCO 格式时中文类别名容易在编码环节出问题。2.2 第一次启动必须改的四个设置项汉化版 exe 启动后界面和原版一致只是菜单变成了中文。第一次用的时候不要急着画框先把下面四个设置改掉否则后面返工成本很高。第一个是标注格式。菜单栏「菜单」→「保存格式」里有 PascalVOC、YOLO、CreateML 三个选项。如果你后面要训 YOLO 系列模型直接选 YOLO如果要用 MMDetection 或 Detectron2选 PascalVOC 更稳。这个设置决定了标注文件是 .xml 还是 .txt中途切换会导致已有标注无法直接复用。第二个是自动保存。在「菜单」→「自动保存模式」里打开。labelImg 默认需要手动按 CtrlS 保存当前图片的标注标注量大时很容易漏保存切图之后标注就丢了这个翻车场景我见过不止一次。第三个是「显示类别颜色」和「单次标注模式」。前者打开后不同类别会用不同颜色显示框后者打开后画完一个框会自动弹出类别选择适合单类别密集标注场景。第四个是快捷键习惯。汉化版保留了原版快捷键W 画框、A 上一张、D 下一张、CtrlS 保存、CtrlZ 撤销、Del 删除选中框。建议先在「菜单」→「帮助」里过一遍快捷键说明比鼠标点菜单快很多。# predef_classes.txt 示例 person car bicycle traffic_light这个文件放在 exe 同目录下labelImg 启动时会自动读取。如果没生效检查文件名是否写成了 predef_classes.txt.txtwindows 默认隐藏扩展名这是新手最常踩的坑之一。2.3 用命令行参数控制 exe 启动行为虽然 exe 可以双击启动但它同样支持命令行参数这在批量标注和团队统一配置时很有用。打开 cmd 或 PowerShellcd 到 exe 所在目录然后按下面的方式启动。# 指定图片目录和类别文件启动 labelImg.exe D:\labeling_workspace\images D:\labeling_workspace\predef_classes.txt # 指定输出目录和保存格式 labelImg.exe D:\labeling_workspace\images D:\labeling_workspace\predef_classes.txt D:\labeling_workspace\labels --formatyolo # 加载已有标注继续修改 labelImg.exe D:\labeling_workspace\images D:\labeling_workspace\predef_classes.txt D:\labeling_workspace\labels第一个参数是图片目录第二个是类别文件第三个是标注输出目录。--format 参数可以覆盖界面里的保存格式设置yolo 对应 .txtpascal_voc 对应 .xml。如果你在团队里分发这个 exe可以把启动命令写成一个 .bat 文件所有人双击 bat 就能用统一配置打开避免每个人设置不一致。提示命令行参数里的路径不要带中文和空格windows-x64 下 PyInstaller 打包的 exe 对中文路径的兼容性不稳定容易出现图片加载失败或标注保存到错误位置。3. 标注流程里的参数选择PascalVOC 还是 YOLO什么时候该换3.1 两种标注格式的字段差异与转换代价labelImg 支持的两大主流格式是 PascalVOC 和 YOLO它们在文件结构和坐标表示上有本质区别。PascalVOC 用 .xml每个目标是一个 object 节点包含 name、pose、truncated、difficult 和 bndbox 五个字段bndbox 里是 xmin、ymin、xmax、ymax 四个绝对像素坐标。YOLO 用 .txt每行一个目标格式是 class_id x_center y_center width height全部是相对于图片宽高的归一化值范围 0 到 1。这个差异带来的直接后果是PascalVOC 的标注文件人类可读性更好保留了 truncated 和 difficult 这类难例标记字段适合做数据分析和难例挖掘YOLO 格式更紧凑训练时读取更快但丢失了难例标记信息。如果你标注的数据要同时用于多个框架建议先用 PascalVOC 标再用脚本转 YOLO反过来转会丢字段。# PascalVOC xml 转 YOLO txt 的核心逻辑 import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, classes, output_dir): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化并计算中心点和宽高 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) out_name os.path.splitext(os.path.basename(xml_path))[0] .txt with open(os.path.join(output_dir, out_name), w) as f: f.write(\n.join(lines))这段代码的关键点是归一化时的除法顺序和浮点精度。x_center 和 y_center 必须先算中心点再除以图片尺寸不能先分别归一化 xmin 和 xmax 再取平均虽然数学上等价但浮点误差累积方式不同大批量转换时可能出现个别框偏移一个像素。:.6f 保留六位小数是 YOLO 官方推荐的精度再高没必要再低可能影响小目标训练。classes 列表的顺序必须和训练时的 data.yaml 里 names 顺序完全一致否则类别 ID 会错位模型学出来的类别全是乱的。这个错误在转换脚本里不会报错但训练时 loss 会异常高排查起来很费时间。3.2 标注顺序和类别平衡的实操建议labelImg 的图片列表是按文件名排序的如果你按默认顺序标很容易出现前 500 张全是白天场景、后 500 张全是夜间场景的情况导致标注节奏和注意力分布不均。我一般会先把图片按场景或来源分组重命名时加前缀比如 day_0001.jpg、night_0001.jpg然后在 labelImg 里用「打开目录」分别加载不同组一组一组标。类别平衡是另一个容易被忽视的问题。如果你标的是交通场景person 类可能有 8000 个框traffic_light 只有 200 个框直接拿去训练会导致模型对稀有类别召回率极低。标注阶段能做的是对稀有类别适当放宽标注标准把遮挡严重但可辨认的目标也标上对密集类别不要过度标注比如远处模糊的人可以跳过。这个度需要根据你的模型目标和评估指标来定没有统一标准但至少要在标注前想清楚。注意labelImg 的「验证图片」功能可以检查标注文件是否有越界框或宽高为零的框标完一批后按 CtrlShiftV 跑一遍能提前发现大部分低级错误。3.3 大图和高分辨率图片的加载优化labelImg 加载图片时会把整张图读进内存并渲染到 Qt 的画布上如果你标的是 4K 或 8K 分辨率的遥感图、医学影像单张图可能占几百 MB 内存连续翻几十张就容易卡顿甚至闪退。汉化 exe 版本在这方面的表现和原版一致没有额外优化。实际做法是标注前先把图片缩放到合理尺寸。目标检测训练时输入尺寸通常是 640 或 1280标注时用 1920 宽度的图足够了再大对标注精度没有实质帮助反而拖慢速度。可以用 ffmpeg 或 Python 的 PIL 批量缩放。from PIL import Image import os def resize_images(src_dir, dst_dir, max_width1920): os.makedirs(dst_dir, exist_okTrue) for name in os.listdir(src_dir): if not name.lower().endswith((.jpg, .jpeg, .png)): continue img Image.open(os.path.join(src_dir, name)) if img.width max_width: ratio max_width / img.width new_size (max_width, int(img.height * ratio)) img img.resize(new_size, Image.LANCZOS) img.save(os.path.join(dst_dir, name), quality95)缩放之后标注的坐标是基于缩放后图片的训练时如果输入尺寸和标注尺寸不一致需要在数据加载阶段做同步缩放。YOLO 系列框架会自动处理PascalVOC 转其他格式时要注意在转换脚本里同步调整。4. labelImg 汉化 exe 在 windows-x64 上的避坑与排查4.1 双击 exe 没反应或闪退现象双击 labelImg.exe 后鼠标转圈几秒然后什么都没发生或者弹出一个黑色命令行窗口一闪而过。原因PyInstaller 打包的 exe 在启动时会解压运行时到临时目录如果杀毒软件拦截了临时目录的写入或者系统缺少 VC 运行库就会静默失败。另一个常见原因是 exe 所在路径包含中文或特殊字符导致解压路径解析异常。解决先把 exe 移到纯英文路径下比如 D:\tools\labelImg\。然后检查 windows 事件查看器里的应用程序日志看有没有 labelImg.exe 相关的错误记录。如果是缺 VC 运行库装一个 Visual C Redistributable 2015-2022 x64 版本。杀毒软件误报的话把 exe 所在目录加入白名单。4.2 标注保存后找不到文件现象画完框按了 CtrlS界面提示已保存但在 labels 目录里找不到对应的 .txt 或 .xml 文件。原因labelImg 的保存路径取决于启动时指定的输出目录如果双击启动而没有指定输出目录它会默认保存到图片同目录下。另外如果「保存格式」设置和文件扩展名不匹配比如设了 YOLO 格式但去找 .xml也会以为没保存。解决启动时用命令行明确指定第三个参数为输出目录。保存后在界面右下角的文件列表里看当前图片名旁边有没有出现标注标记。如果还是没有检查「菜单」→「保存格式」当前选中的是什么然后去对应扩展名的文件里找。4.3 中文类别名导致训练报错现象标注时类别名用了中文比如「行人」「车辆」转 YOLO 格式后训练时提示类别索引越界或编码错误。原因YOLO 的 data.yaml 和标注文件默认按 UTF-8 读取但部分训练框架在 windows 下会用 GBK 解码中文类别名在不同编码之间转换时容易出问题。另外类别名里的中文在命令行参数传递时也可能被截断。解决标注阶段就用英文类别名这是最省事的做法。如果已经有中文标注写一个映射脚本把中文类别名批量替换成英文同时更新 predef_classes.txt 和 data.yaml 里的 names 列表。4.4 图片列表加载不全或顺序错乱现象images 目录里有 2000 张图labelImg 只加载了 1800 张或者顺序和文件名排序不一致。原因labelImg 默认只识别 .jpg、.jpeg、.png、.bmp 几种扩展名如果你的图片是 .tif、.webp 或者大写扩展名 .JPG可能被过滤掉。顺序问题通常是因为文件名里有数字和字母混合比如 img1.jpg、img10.jpg、img2.jpg按字符串排序就是 1、10、2 的顺序。解决标注前统一图片格式和扩展名大小写用脚本批量重命名成固定位数编号比如 img_0001.jpg、img_0002.jpg。这样在 labelImg 里的顺序和文件系统顺序一致也方便后续按编号划分训练集和验证集。4.5 标注框坐标越界或宽高为零现象训练时数据加载报错提示 bbox 坐标超出图片范围或者宽高为负数。原因labelImg 画框时如果鼠标拖拽方向是从右下到左上生成的 xmin 可能大于 xmax虽然界面显示正常但保存到文件里就是负宽高。另外如果图片在标注后被替换成了不同尺寸的版本已有标注坐标就会越界。解决标完一批后用校验脚本跑一遍检查所有框的 xmin xmax、ymin ymax、坐标在 [0, 图片宽高] 范围内。发现异常框在 labelImg 里手动修正或者用脚本自动交换 xmin/xmax 和 ymin/ymax。图片替换后必须重新标注或同步缩放标注坐标不能直接复用。# 标注文件校验脚本检查越界和零宽高 import os import xml.etree.ElementTree as ET def validate_voc(xml_dir, img_dir): errors [] for xml_name in os.listdir(xml_dir): if not xml_name.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_name)) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) for obj in root.iter(object): bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) if xmin xmax or ymin ymax: errors.append(f{xml_name}: 零宽高或负宽高) if xmin 0 or ymin 0 or xmax img_w or ymax img_h: errors.append(f{xml_name}: 坐标越界) return errors这个脚本只做检查不做修改跑完把错误列表打印出来逐条去 labelImg 里修。批量标注场景下建议每标完 500 张就跑一次不要等全部标完再查那时候定位问题图片的成本会高很多。5. 从 exe 标注到训练数据集的最后一公里5.1 用 labelImg 的验证模式做标注质量抽检labelImg 有一个很多人没注意到的功能按 CtrlShiftV 可以进入验证模式它会遍历当前目录下所有标注文件把有问题的框用红色高亮显示。这个功能在汉化版里同样可用菜单位置在「菜单」→「验证图片」。验证模式能查出的问题包括坐标越界、宽高为零、类别名不在 predef_classes.txt 里、标注文件与图片不匹配。它查不出的是框的位置是否准确、类别是否标错、漏标。所以验证模式只能做第一道过滤真正的质量抽检还得靠人工看。我的习惯是每标完一批随机抽 5% 的图片用 labelImg 重新打开对照原图检查框的贴合度和类别正确性。如果抽检错误率超过 2%说明标注标准需要重新对齐把有争议的案例拿出来和团队讨论更新标注规范文档。5.2 划分训练集验证集时避免数据泄漏标注完成后下一步是划分 train/val。这里有一个隐蔽的坑如果同一个场景的连续帧被分到了训练集和验证集验证指标会虚高因为模型在训练时见过几乎相同的画面。这个问题在视频抽帧标注的数据集里特别常见。正确的做法是按场景或按视频源划分同一个视频的所有帧要么全在训练集要么全在验证集。如果图片文件名里包含了视频来源信息可以用脚本按前缀分组划分。import os import random from collections import defaultdict def split_by_group(img_dir, val_ratio0.2): groups defaultdict(list) for name in os.listdir(img_dir): # 假设文件名格式为 videoId_frameId.jpg group name.split(_)[0] groups[group].append(name) group_names list(groups.keys()) random.shuffle(group_names) val_count int(len(group_names) * val_ratio) val_groups set(group_names[:val_count]) train_list, val_list [], [] for group, files in groups.items(): if group in val_groups: val_list.extend(files) else: train_list.extend(files) return train_list, val_list这个划分逻辑保证了同一来源的图片不会跨集验证指标更能反映模型在真实新场景下的表现。val_ratio 一般设 0.1 到 0.2数据量少的时候可以设 0.1数据量大的时候 0.2 更稳。5.3 标注文件与图片的路径一致性检查训练框架读取数据时通常要求图片和标注文件同名同目录或者通过路径映射关联。labelImg 保存的标注文件名默认和图片名一致只是扩展名不同。如果你在标注过程中重命名过图片标注文件名不会自动跟着改就会出现图片和标注对不上的情况。写一个一致性检查脚本遍历图片目录和标注目录找出没有对应标注的图片和没有对应图片的标注文件。这个检查在训练前跑一次能避免训练时数据加载器报「找不到标注文件」的错误。import os def check_consistency(img_dir, label_dir, img_ext.jpg, label_ext.txt): imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(img_ext)} labels {os.path.splitext(f)[0] for f in os.listdir(label_dir) if f.endswith(label_ext)} missing_labels imgs - labels missing_imgs labels - imgs print(f缺少标注的图片: {len(missing_labels)} 张) for name in list(missing_labels)[:10]: print(f {name}{img_ext}) print(f缺少图片的标注: {len(missing_imgs)} 个) for name in list(missing_imgs)[:10]: print(f {name}{label_ext})这个脚本输出前 10 个不匹配项作为示例实际处理时根据输出决定是补标还是删除孤立文件。如果 missing_labels 很多说明标注还没完成如果 missing_imgs 很多可能是标注文件命名规则和图片不一致需要批量重命名。5.4 一个提高标注效率的快捷键组合习惯最后说一个我自己的习惯标注时左手放在键盘左侧右手握鼠标。左手拇指按 Ctrl食指按 S中指按 Z无名指按 A 和 D。画完一个框后立刻 CtrlS然后 D 切下一张。这个节奏练熟之后单张图的标注时间能压缩到 10 秒以内。不要用鼠标去点菜单里的保存和下一张那个路径太长一天下来多花的时间很可观。汉化版 exe 的快捷键和原版完全一致所以网上能找到的 labelImg 快捷键教程都适用。如果某个快捷键在你的键盘布局下不顺手可以在「菜单」→「设置」里改但建议不要改太多保持和团队其他人一致方便互相帮忙标注时不用重新适应。希望帮到你。本文还有配套的精品资源点击获取
返回列表