ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LabelImg中文版设置教程:界面汉化、标注参数与避坑指南

LabelImg中文版设置教程:界面汉化、标注参数与避坑指南 简介这是一份面向目标检测初学者与算法工程师的 LabelImg 中文汉化版工具包通过替换字体与语言资源文件将原本全英文的标注界面改为中文降低上手门槛适合使用 Faster R-CNN、YOLO、SSD 等框架、需要制作 PASCAL VOC 格式数据集的用户。压缩包共 89 个文件约 515KB包含 21 个 py 源码与 19 个 pyc 编译文件覆盖主程序、画布、标签对话框、YOLO 与 VOC 读写等核心模块另有 37 个 png 图标、6 个 svg 矢量图、1 个 ico 与 1 个 icns 应用图标以及 qrc、properties、txt 等资源与说明文件目录结构完整解压即可运行。目前已有 5316 人学习下载说明该汉化版本在中文社区中具有较高认可度。借助它读者可省去逐条翻译菜单与提示的时间直接完成图像目标框选、类别标注与 XML 导出快速构建符合 PASCAL VOC 规范的数据集为后续模型训练打好数据基础。1. Labelimg中文版标注界面全是英文怎么把它变成顺手的中文工具第一次打开 LabelImg 的人十个里有八个会愣一下左边一列按钮全是英文Open Dir、Change Save Dir、Create RectBox、Next Image菜单栏还挂着View、File、Format。你要做的是给几百张图拉框、选类别、存 XML结果光认按钮就耗掉半天。LabelImg 本身是 Python Qt 写的开源标注工具官方发布的是英文界面所谓「Labelimg中文版」并不是某个官方分支而是社区通过翻译文件、改源码或换语言包让它显示中文的一套做法。它解决的就是标注效率问题——框选、切图、改标签、导出 YOLO 或 VOC 格式全程中文提示新手不用边查词典边干活。适合做目标检测数据集的人学生做课设、算法工程师整理自有数据、外包标注团队统一工具链。下面按「先搞清它是什么 → 怎么装出中文 → 参数怎么调 → 坑在哪」的顺序讲透。2. Labelimg中文版的三种落地路径源码翻译、语言包、打包版2.1 先分清 LabelImg 的版本差异别装错源头LabelImg 目前流通的主要有两支一支是原作者的labelImg基于 Python PyQt5另一支是社区维护的labelImg分支两者目录结构接近但依赖写法有差别。中文版能不能成第一步取决于你装的是哪一支。常见做法是从源码跑因为只有源码你才能改resources/strings里的翻译或者替换.qm语言文件。如果你直接下的是别人打包好的 exe那中文基本是打包者预先塞进去的你改不了只能换一个包。判断方法很简单进到项目根目录看有没有libs文件夹和labelImg.py。有libs/stringBundle.py这类文件说明字符串是集中管理的翻译好做如果字符串散落在各个 py 文件里硬编码那就得逐个改工作量大但也不是不能干。我一般建议先跑源码版确认能启动、能标注再动中文的事否则出了问题你分不清是环境问题还是翻译问题。依赖上PyQt5 是核心lxml用于写 XMLPyYAML读预定义类别。Python 版本建议 3.8 到 3.10太新的 3.12 有时 PyQt5 轮子对不上会卡在安装阶段。这些版本号不是死的你装的时候以能import PyQt5成功为准。2.2 用语言包把界面切成中文的最小步骤社区里流传的中文方案本质是替换 Qt 的翻译文件。Qt 程序的多语言靠.ts源文件和编译后的.qm文件程序启动时用QTranslator加载。LabelImg 如果预留了翻译加载逻辑你只要把中文.qm放进指定目录再在启动时指定语言就行。下面是我常用的操作顺序先克隆源码再处理# 1. 拿到源码用你手头能访问的仓库地址这里只写通用流程 git clone labelImg 源码地址 cd labelImg # 2. 建虚拟环境隔离依赖避免污染系统 Python python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 3. 装依赖PyQt5 是界面核心lxml 负责写 XML pip install pyqt5 lxml pyyaml # 4. 先跑一次英文版确认环境没问题 python labelImg.py能正常弹出窗口说明环境通了。接着处理中文在项目里找resources或i18n目录看有没有labelImg_zh_CN.qm。如果没有就得自己生成——用 Qt 的lrelease把.ts编译成.qm。.ts是 XML 格式的翻译源你可以用 Qt Linguist 打开逐条翻译也可以直接文本编辑。翻译完执行# 把 .ts 编译成程序能加载的 .qm lrelease resources/labelImg_zh_CN.ts然后在labelImg.py启动处加翻译加载逻辑大致是这样# 在 QApplication 创建之后、主窗口显示之前插入 from PyQt5.QtCore import QTranslator, QLocale translator QTranslator() # 加载中文翻译文件路径按你实际存放位置改 translator.load(resources/labelImg_zh_CN.qm) app.installTranslator(translator)逻辑说明QTranslator是 Qt 的翻译器对象load把.qm读进内存installTranslator把它挂到应用上之后所有用tr()包裹的字符串都会走翻译表。参数上.qm路径写错是最常见的失败原因程序不会报错只是界面依旧英文所以加载后最好打印一下translator.load的返回值返回True才算成功。如果你的源码里字符串没用tr()包裹那翻译文件再全也没用这种情况只能改源码把Open Dir这类字面量换成self.tr(Open Dir)。2.3 直接改源码做中文适合字符串没走翻译机制的情况有些分支的 LabelImg 字符串是硬编码的没有tr()这时候语言包路线走不通只能改源码。做法是全局搜索界面文案逐个替换成中文。别手动一个个改用脚本批量替换更稳# batch_translate.py # 把常见界面词批量替换成中文替换前先备份原文件 import os # 映射表英文原文 - 中文 mapping { Open Dir: 打开目录, Change Save Dir: 更改保存目录, Next Image: 下一张, Prev Image: 上一张, Create RectBox: 创建矩形框, Save: 保存, } target labelImg.py # 按实际文件名改 with open(target, r, encodingutf-8) as f: content f.read() for en, zh in mapping.items(): content content.replace(en, zh) with open(target, w, encodingutf-8) as f: f.write(content) print(替换完成建议先 git diff 看改动)逻辑说明读入整个文件按映射表做字符串替换再写回。参数上要注意两点一是替换的键必须带引号否则会误伤变量名二是改之前一定git commit或复制备份因为这种替换不可逆改错了很难回退。替换完启动程序如果某个按钮还是英文说明它的字符串格式和映射表不一致比如用了单引号或 f-string需要单独处理。这个办法土但对硬编码项目最直接。3. 标注参数怎么设预定义类别、保存格式与快捷键3.1 用 predefined_classes.txt 固定类别避免手滑打错标签标注最怕的不是慢是标签不一致——同一类东西一会儿写person一会儿写Person一会儿写人最后训练时模型把它们当三类。LabelImg 支持预定义类别文件把类别写进predefined_classes.txt标注时直接下拉选杜绝手输错误。文件放在data目录下一行一个类别person car dog traffic_light启动时如果没自动加载可以在界面里点Open选中这个文件或者改源码让它默认读。参数上类别名建议全小写、用下划线连接别用空格和中文因为后续转 YOLO 格式时类别名会进classes.txt中文在某些训练脚本里会出编码问题。这一步看着小但它是数据集质量的地基我见过太多人标完几百张才发现标签有大小写混用返工重标血泪经验。3.2 VOC 与 YOLO 格式的切换以及保存目录的坑LabelImg 默认存 Pascal VOC 的 XML一张图一个 XML里面记着图片尺寸、每个框的坐标和类别。如果你要训 YOLO得在菜单里切到 YOLO 格式它会生成同名的.txt每行是类别索引 中心x 中心y 宽 高且坐标是归一化到 0 到 1 的。切换入口在左侧工具栏的格式按钮点一下在PascalVOC和YOLO之间轮换。这里有个高频翻车点Change Save Dir设的目录如果和图片目录不同程序会把标注文件存到另一个地方你回头找标注时以为丢了。我的习惯是图片和标注放同一父目录下的images和labels两个子目录标注时把保存目录指到labels。另外 YOLO 格式下类别索引是按classes.txt里的顺序来的你中途改了类别顺序旧标注的索引就对不上了所以类别表定下来就别乱动。3.3 快捷键与自动保存把标注速度提上来LabelImg 的效率全在快捷键上。W创建框A上一张D下一张CtrlS保存CtrlR改保存目录。默认不会自动保存切图前必须手动存否则框白拉了。可以在View菜单里勾选Auto Save mode切图时自动落盘这个开关强烈建议打开能省掉大量「忘了保存」的后悔药时刻。批量标注时我一般先把图片按类别分文件夹一个文件夹一个类别标的时候类别固定减少下拉切换。框的精度上LabelImg 支持拖动调整框的边和角放大图片Ctrl滚轮再微调比在缩略图上拉准得多。这些操作不涉及代码但直接决定你一天能标多少张。4. 避坑与排查中文版最常见的五类翻车4.1 界面还是英文翻译文件没生效现象按步骤放了.qm、加了加载代码启动后界面依旧全英文。原因通常有三个.qm路径不对程序找不到文件源码里的字符串没用tr()包裹翻译表里根本没有对应条目或者installTranslator调用时机太早在QApplication创建之前就执行了。解决先确认translator.load()返回True再检查字符串是否走tr()最后确认加载代码放在app QApplication(...)之后。三者逐一排除基本能定位。4.2 装 PyQt5 报错卡在 wheel 编译现象pip install pyqt5卡住或报编译错误尤其在较新的 Python 上。原因是 PyQt5 的预编译轮子对 Python 版本有窗口期太新或太旧的版本可能没有对应 wheelpip 就尝试从源码编译而源码编译需要 Qt 开发库。解决换 Python 3.8 到 3.10 之间的版本或者用pip install pyqt55.15.9指定有轮子的版本。别硬扛编译换版本是最省事的。4.3 标注文件存到了别处以为数据丢了现象标完一批图去图片目录找 XML 找不到。原因是Change Save Dir之前设过别的目录程序一直往那儿存。解决标注前先确认保存目录或者干脆把保存目录设成图片目录本身。已经标丢的去之前设过的目录里翻文件一般还在只是位置不对。4.4 YOLO 格式下类别索引错乱现象转成 YOLO 格式后训练时类别全对不上。原因是classes.txt的顺序变了而旧标注的索引是按老顺序写的。解决类别表一旦确定就冻结新增类别只能往后追加不能插队或删改顺序。已经乱了的用脚本按新类别表重新映射索引别手动改。4.5 中文路径导致图片读不进来现象图片放在带中文的文件夹里Open Dir后列表空白或报错。原因是部分版本的 LabelImg 对非 ASCII 路径处理不完善。解决把图片和标注都放到纯英文、无空格的路径下比如D:/dataset/images。这是最省心的规避方式别跟编码问题较劲。5. 把中文版用顺手的进阶技巧批量校验与格式转换标注做完不等于能用还得校验。我一般写个小脚本检查每个 XML 或 txt 是否和图片一一对应、框坐标是否越界、类别是否在预定义表里。下面这段检查 VOC XML 的脚本跑一遍能揪出大部分脏数据# check_voc.py # 校验 VOC 标注图片与 XML 是否配对、坐标是否越界 import os import xml.etree.ElementTree as ET img_dir dataset/images xml_dir dataset/labels valid_classes {person, car, dog} # 与 predefined_classes.txt 保持一致 for xml_name in os.listdir(xml_dir): if not xml_name.endswith(.xml): continue xml_path os.path.join(xml_dir, xml_name) img_path os.path.join(img_dir, xml_name.replace(.xml, .jpg)) if not os.path.exists(img_path): print(f缺图片: {xml_name}) continue tree ET.parse(xml_path) root tree.getroot() size root.find(size) w, h int(size.find(width).text), int(size.find(height).text) for obj in root.findall(object): name obj.find(name).text if name not in valid_classes: print(f非法类别 {name} in {xml_name}) bnd obj.find(bndbox) xmin, ymin int(bnd.find(xmin).text), int(bnd.find(ymin).text) xmax, ymax int(bnd.find(xmax).text), int(bnd.find(ymax).text) if xmin 0 or ymin 0 or xmax w or ymax h: print(f坐标越界 in {xml_name}: {xmin},{ymin},{xmax},{ymax}) print(校验结束)逻辑说明遍历标注目录先查图片是否存在再解析 XML检查类别合法性和坐标边界。参数上valid_classes必须和标注时用的类别表一致否则会误报。这个脚本不依赖 LabelImg纯标准库放哪都能跑。跑完把报错的行修掉数据集才算干净。另一个技巧是格式转换。VOC 转 YOLO 的脚本网上一堆但坑在坐标归一化和类别索引映射。转换时务必用同一份classes.txt生成索引别一边转一边改类别。转完抽几张图用可视化脚本画框确认肉眼过一遍比信脚本强。我自己就吃过亏转换脚本里w和h写反框全歪了训练 loss 死活不降查了两天才发现是标注格式的问题。所以转完一定可视化验证这是最便宜的后悔药。中文版 LabelImg 说到底就是个提效工具界面语言只是入口真正决定成败的是类别表是否统一、保存目录是否清晰、格式转换是否校验。我现在的习惯是任何数据集动手前先定类别表标注时开自动保存标完必跑校验脚本转格式后必可视化抽查。这套流程走下来返工率能压到很低。希望帮到你。本文还有配套的精品资源点击获取
返回列表