十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Labelimg中文版全攻略:从安装配置到踩坑实操指南

Labelimg中文版全攻略:从安装配置到踩坑实操指南 简介目标检测项目的数据准备阶段图像标注工具的选择直接关系到后续训练的效率与数据质量。PascalVOC与YOLO是两种最常见的标注格式分别以XML和归一化txt形式存储目标框信息理解其原理是正确使用标注工具的前提。开源工具Labelimg因轻量、本地化、支持多平台而广受欢迎但原版英文界面与版本兼容问题常让非英语用户受阻尤其是经典float报错困扰着大量初学者。本文从工程实践角度系统梳理Labelimg中文版的获取方式、环境搭建、中文化处理及高频快捷键操作并结合真实踩坑经验讲解标注格式切换、classes.txt顺序维护、数据转换与质量检查等关键环节。无论你选择绿色版还是源码编译掌握这些细节都能让标注流程更顺畅为模型训练提供可靠的数据支撑。 做目标检测的人十有八九最早接触的标注工具就是 Labelimg。它经典、轻量、跨平台一个小工具就能把图片里的目标框出来再导出成 PascalVOC 或 YOLO 格式的数据集。不过很多非英语用户第一次打开原版看到的全是英文菜单很容易在“标注格式”“快捷键”“保存路径”这些事上绕圈子。于是 Labelimg 中文版这个需求常年排在搜索前列甚至比安装教程本身还热。这篇文章我想从一个实际项目的角度把 Labelimg 中文版从下载安装、环境配置、float 报错到日常使用的完整链路讲清楚。不管你是有代码基础想自己编译还是只想用现成的中文绿色版下文的内容都能直接照做。文章也整理了我自己踩过的坑比如为什么老遇到 float 报错、中文标签怎么保存不乱码、YOLO 标注的 class id 为什么突然错位。目标就一个让你在 10 分钟内把标注工具跑起来并且能把后端训练要用的数据格式做对。1. 项目整体认知与方案选型1.1 Labelimg 到底是什么解决什么问题Labelimg 本质上是一个基于 Qt 的图形化标注程序核心功能只有两个画框和打标签。它不会帮你做目标检测也不会训练模型它只负责把“某个物体在图片的哪个位置、叫什么名字”这个信息记录下来。记录结果有两种最常用的格式PascalVOC 的 XML 和 YOLO 的 txt。前者把图片路径、尺寸和每个目标的 bbox 坐标都写在 XML 文件里后者更精简每行记录“类别编号 x_center y_center width height”而且 x、y、w、h 都做了归一化范围在 0 到 1 之间。这两种格式分别对应两类框架的读取习惯后续做训练时基本绕不开。那你可能会问现在那么多自动标注、云标注平台为什么还要用 Labelimg我的看法是Labelimg 的定位恰好是“本地、轻量、可控”。图片数据不传到外部服务适合隐私要求高的项目标注规则简单团队培训成本低输出格式通用无论你用的是 YOLOv5、YOLOv8 还是 Faster R-CNN都能通过格式转换接上。更重要的是它对电脑配置要求极低一台普通办公本就够用不需要显卡参与。相比那些需要联网、按量付费的标注平台本地工具反而更适合中小心智的团队和阶段性的数据准备任务。1.2 为什么一定要“中文版”英文原版差在哪原版 Labelimg 界面默认是英文主要影响不在“看不懂单词”而在操作效率。比如我刚带团队用的时候很多非技术成员会把“PascalVOC”当成一个需要手动勾选的复杂协议把 XML 和 txt 当成两种不同软件的输出反复来问。菜单汉化之后同样的功能一眼就能看懂训练之前的数据检查工作也能让更多人参与进来。界面语言一旦顺了成员自己就能理解“我现在保存的是哪一种格式”不需要每次标注前都来找你确认。不过需要先澄清一件事Labelimg 本身并没有官方发布的“中文正式版”市面上流传的中文版主要分三类。第一类是第三方整合的汉化绿色包下载后直接运行 exe适合不写代码的人第二类是基于官方源码修改翻译文件后自己打包的版本可控性最高第三类是通过 Qt 的翻译机制加载 qm 语言文件原版代码基本不动。我自己更推荐第二类或第三类因为来路不明的 exe 有可能夹带私货而标注数据往往包含场景照片存在数据泄露风险。这一点大家在下载时要留个心眼尽量从可信渠道获取或直接走源码编译。1.3 方案选型绿色版还是源码版根据使用人群不同我一般给出两个选择路径。如果你是学生或非开发者只想快速完成一批标注任务选整合好的中文绿色版最省事下载解压后直接双击 labelImg.exe一般不需要装 Python。缺点是你没法改代码遇到 float 这种报错只能等作者更新或者换一个版本。如果你平时会写点 Python愿意花 10 分钟搭环境那我建议用官方源码自己跑。源码方案的优点很直接报错看得见、可修改、可升级界面字体和快捷键都能自定义后续做数据集工具链时还可以直接调用它的内部函数。这个选择没有对错取决于你愿意花“一次性成本”还是“长期成本”。我在自己的项目里选择源码版因为标注只是整个数据 pipeline 的一环后面还要写不少脚本来做格式转换和质检直接在源码环境里调试会顺畅很多。如果你只是周末给一个 Kaggle 任务标注几百张图绿色版完全够用。但不管选哪条路有两件事必须提前定好标注格式选 VOC 还是 YOLO以及类别文件 classes.txt 的固定顺序。这两点决定了后面所有操作的方向。2. 环境准备与安装过程手记2.1 基于官方源码的安装步骤我习惯用虚拟环境来装避免把系统 Python 环境搞乱。下面这套命令在 Windows 和 Linux 上基本通用macOS 也差不多只是激活虚拟环境的方式略有不同。git clone https://github.com/HumanSignal/labelImg.git cd labelImg python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate pip install pyqt55.15.7 lxml4.9.2 pyrcc5 -o libs/resources.py resources.qrc python labelImg.py这里每一步都别偷懒。用venv是为了隔离依赖否则 python 环境里如果装了其他 PyQt5 版本很可能出现版本冲突。pip install时我把版本号写死是为了避开高版本 PyQt5 与老代码之间的兼容坑这一点在下一节 float 报错里会详细说。pyrcc5是把resources.qrc里定义的图标、样式等资源文件编译成 Python 模块如果跳过这一步程序启动时大概率报缺资源或者界面显示异常。如果你在 Windows 上遇到pyrcc5 不是内部或外部命令先检查虚拟环境里的Scripts目录是否在 PATH 中最简单的方法是直接重新安装 PyQt5-tools再确认Scripts路径。安装完成后在项目根目录执行python labelImg.py能弹出窗口就说明环境正常。首次打开时如果界面字体很小先不用急着改把标注格式和保存目录配置好再干活。2.2 “float 报错”到底怎么回事Labelimg 安装搜索量里“报错 float”常年占据高位几乎每天都有新人遇到。我见过最多的现象是双击启动后瞬间闪退或者在打开某张图片时崩溃控制台报TypeError: float object is not callable偶尔也会是AttributeError: float object has no attribute ...。这个报错看上去很吓人但根因不复杂。Labelimg 源码里有很多地方要处理缩放比例、坐标值这些数据在内存里以 float 类型存在。有些老版本源码在某个位置把 float 变量直接当成函数去调用在旧的 PyQt5 组合下可能歪打正着能跑但换了新高版本后接口行为变了就彻底露馅。所以 float 报错本质上是“代码版本 Python 版本 PyQt5 版本”三者不匹配和你的图片格式、标注操作都没关系。我验证过比较稳的一套组合是pip uninstall -y pyqt5 pyqt5-qt5 pyqt5-sip pip install pyqt55.15.7 pip install lxml4.9.2如果还是报错就换 Python 3.8 环境这是当前兼容性最好的方案conda create -n labelimg python3.8 conda activate labelimg pip install pyqt5 lxml如果你是源码党且不想换环境也可以直接修补源码根据报错堆栈找到对应行把它传进去的参数用round(float(value), 4)包一层再使用。这个方法属于“哪里坏了补哪里”改之前记得备份原文件避免把别的逻辑改坏。需要说明的是float 报错在不同版本、不同系统上现象可能不同。我这里给的是自己项目里验证过的组合如果你用的是其他分支优先看报错堆栈而不是盲猜版本。2.3 中文界面显示异常的处理好不容易把程序跑起来又发现界面还是英文或者中文变成了方块这一节就是来解决这些事的。如果你用的源码版中文显示依赖 Qt 的翻译文件。一个常见做法是在项目里准备zh_CN.qm然后在labelImg.py启动时加载from PyQt5.QtCore import QTranslator translator QTranslator() if translator.load(zh_CN.qm): app.installTranslator(translator)qm文件可以用 Qt 官方的 Linguist 工具把*.ts编译出来。整合版一般已经处理好了不用你操心。如果你遇到的是中文文字变成方框那不是翻译问题而是系统缺中文字体。Windows 通常装微软雅黑就解决Linux 需要安装 Noto Sans CJK 等中文字体包macOS 基本没有这种问题。实在不行可以在代码里显式指定字体from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QFont app QApplication([]) app.setFont(QFont(Microsoft YaHei, 9))还有一个很隐蔽的坑如果你用 Windows 记事本编辑过 classes.txt它可能会保存成带 BOM 的 UTF-8导致 Labelimg 读取第一行类别名时多了一个看不见的字符。解决办法是在编辑器里选择“UTF-8 without BOM”重新保存。3. 中文版核心操作与标注实操3.1 打开软件后的界面认知很多人装好 Labelimg 后第一反应是“这界面怎么这么多按钮”。不用慌我们可以按区域来认。左侧是主操作区包含打开目录、更改保存目录、当前图片文件名、文件名列表以及最重要的标签输入框。中间的大片空白是画布显示当前图片和已经画好的矩形框。右侧是标注列表能看见当前图里所有目标的名称和坐标信息。顶部菜单栏里最常用的是 File、Edit、View、Label、Tools 这几项。有一个特别容易忽略的按钮在左侧文件列表上方PascalVOC和YOLO两种模式的切换。这个是整个标注流程的起点。我见过不少朋友一上来就画框画了几百张才发现存的是 XML但训练框架要的是 YOLO txt又得重新转换甚至返工。所以打开图片目录之前先确认底部或工具区显示的当前格式对不对再开始干活。3.2 一套标准的标注流程标注不是拿到图片就画框那么简单我习惯按下面这套流程走效率高且不容易返工。第一步建好数据集目录结构dataset/ ├── images/ # 原始图片 ├── classes.txt # 类别列表建议固定顺序 └── labels/ # XML 或 txt 输出第二步打开 Labelimg按CtrlU选择images目录。然后检查左侧文件列表是否正常加载图片。如果列表空白先确认图片格式是 jpg、png、bmp 这类常规格式再检查路径是不是太长或带特殊字符。第三步准备好classes.txt。在 Labelimg 里第一次输入标签时它会弹出一个列表里面读到的就是classes.txt的内容。如果还没有这个文件也可以先用“打开类别文件”功能指定或手动创建。所有类别名不要加空格、不要用中文尽量用英文和下划线比如car、person、traffic_light。中文类别名虽然界面能显示但很多框架后续处理会出问题。第四步按W键开始画框。从目标的左上角拖到右下角松开鼠标后会弹窗让你选标签。框不要包太松也不要把目标裁掉一半一般贴着物体轮廓留 1 到 2 像素余量。如果两张图目标位置差不多按CtrlD可以直接把当前框和标签复制到下一张再拖动微调这个操作在连续帧数据里能省一大半时间。第五步一张图画完按CtrlS保存再按D切换到下一张。文件列表里绿色表示已保存没有保存的会显示红色或未标记状态。全部完成后再整体检查一遍别等关软件了才想起某张图没存。3.3 高频快捷键速查表Labelimg 的快捷键设计得挺顺手熟练之后全程可以不用鼠标。我把日常最高频的列成了一张表。快捷键功能CtrlU打开图片目录CtrlR修改默认标注文件保存目录CtrlS保存当前标注W绘制矩形框A / D上一张 / 下一张CtrlD复制当前框和标签到下一张CtrlShiftD复制当前框和标签到上一张Delete删除当前选中的矩形框CtrlE编辑当前框的标签文本CtrlZ撤销上一步空格标记当前图片为已标注这里多提一句CtrlR可能是很多人最容易忽略的快捷键。默认情况下标注文件会生成在图片目录里图片和标签混在一起后期整理非常乱。建议一开始就用CtrlR把输出目录指到dataset/labels让图片和标签分离。3.4 常用配置与提效设置除了快捷键Labelimg 还有几个配置项值得手动开一下。第一个是自动保存模式在 View 菜单里勾选 Auto Save mode只要画完框切到下一张它会自动保存省去反复按 CtrlS。但自动保存模式有时也会在某些文件占用场景下失败关键图片我还是习惯手动保存。第二个是默认保存目录的持久化。在设置里指定一次后项目重启会记住不需要每次打开都重新选。第三个是标签颜色配置View - Edit Labels 可以给每个类别指定不同颜色。在多人协作标注时不同颜色能快速区分不同目标检查视觉质量时特别有用。还要提醒一个我自己踩过的坑图片文件名尽量改成纯数字英文。Labelimg 本身能打开中文文件名但后续转 YOLO 训练时很多工具链对中文路径处理不好轻则路径读取失败重则整个数据集作废。项目刚起步时就把文件名规范好能省掉后面一大串麻烦。4. 常见问题与排查技巧实录4.1 目录和文件相关的问题图片目录打开后一片空白是我被问过最多的问题。多数情况是图片格式不受支持或者文件路径过长、含有特殊字符。可以先试试换一张 jpg 格式的图片看能否加载。另一个常见原因是 Pillow 库版本问题Labelimg 在读取图片时需要用到 Pillow版本太高或太低都可能报Could not load image。如果遇到这个错误直接装一个兼容版本pip install Pillow9.5.0还有一种情况是图片能打开但标签文件没有生成在预期目录。这通常是默认保存目录设置不对。按CtrlR重新指定输出目录再保存一次。如果仍不行检查保存目录路径是否包含中文、空格或是不存在的文件夹。Labelimg 对这类路径处理得不够健壮最好统一使用英文绝对路径比如D:\projects\dataset\labels。4.2 保存和格式相关的问题格式问题里最大的一颗雷是classes.txt 顺序变了。YOLO 模式生成的 txt 文件第一列是类别编号这个编号对应 classes.txt 的行号从 0 开始。假如一开始是person、car、dog后来为了排序把dog提到了第一位那么所有已有 txt 里的2 0.5 0.5 0.3 0.4这行就全部对不上了。改一个类别顺序等于整批标注作废。所以我在项目一开始就花时间把类别清单敲定后续只加不改、不乱排序。另外很多新手会发现明明在界面上看到的是框保存后 txt 里却是0.000000之类的坐标。这个多半是图片尺寸信息没有正确读取或者未选中任何框时误触了保存。检查图片文件是否完整删掉损坏的 txt 后重新标注即可。还有一个小细节Labelimg 在 YOLO 模式下只会输出 txt在 PascalVOC 模式下只会输出 XML两者不会同时生成所以开工前务必确认当前模式。4.3 显示、性能与卡顿问题当你标注超大图比如无人机拍摄的 8000x6000 航拍图Labelimg 的明显问题是缩放和画框都卡。我自己的处理方式是在标注前用脚本统一把最长边压缩到 2000 像素左右。这个尺寸对大多数目标检测任务来说足够标注流畅度却能提升好几倍。如果你必须在原图上标注可以尝试在 View 菜单里降低界面缩放级别但操作流畅度还是有限。另一个性能杀手是单目录图片太多。文件列表一次加载上千张图时切换和滚动都会明显卡顿。我建议按子目录分批处理比如每 500 张一个文件夹标完一批再合并。这不会影响数据质量反而能让标注员有阶段性的节点感和检查机会。还有一类问题特别容易引起恐慌杀毒软件把整合版 exe 直接删了。很多汉化绿色包没有数字签名会被 Windows Defender 报毒或隔离。这不是软件一定有问题但你必须评估来源的可信度。最稳妥的做法是走源码安装从根源上避开这类风险。5. 让标注数据直接接上训练5.1 从 PascalVOC 到 YOLO 的格式转换就算你在 Labelimg 里选了 PascalVOC 模式也不用担心只能喂给老框架。XML 转 YOLO txt 是很成熟的流程我给你一个可以直接改着用的 Python 脚本。这个脚本会读取 XML 里的图片宽高、目标类别和 bbox 坐标然后归一化输出 YOLO 格式。import os import xml.etree.ElementTree as ET classes [person, car, dog] def convert(xml_path, out_dir): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) out_path os.path.join(out_dir, os.path.basename(xml_path).replace(.xml, .txt)) lines [] for obj in root.findall(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) x_center (x1 x2) / 2.0 / img_w y_center (y1 y2) / 2.0 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(out_path, w, encodingutf-8) as f: f.write(\n.join(lines)) xml_dir dataset/labels out_dir dataset/yolo_labels os.makedirs(out_dir, exist_okTrue) for name in os.listdir(xml_dir): if name.endswith(.xml): convert(os.path.join(xml_dir, name), out_dir)注意脚本里的classes顺序必须和训练时一致否则 class id 会错位。如果 XML 中没有正确的size节点这段代码会直接报错你需要改成读取实际图片尺寸的方案否则转换出来的坐标全是错的。5.2 数据集目录怎么组织最稳妥做深度学习训练时数据集组织方式直接决定你后面写 DataLoader 的心情。我习惯用下面这种结构dataset/ ├── classes.txt ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/images 和 labels 严格同名对应比如images/train/001.jpg对应labels/train/001.txt。划分训练集和验证集时用脚本随机分配不要手动拖文件否则很容易出现“图片去了训练集标签还在验证集”的尴尬情况。如果你用的是 YOLO 系列框架它对这种目录结构天然友好稍微改一下 yaml 配置就能直接开始训练。顺便说一句别把标注好的原始数据直接覆盖备份。我见过不少朋友标完一批图原 XML 被转成 txt 后就删了后面想改类别名或者重新导出时才发现源头没了。文件夹里同时保留原始图片和至少一种完整标注格式是可以救命的好习惯。5.3 标注质量的检查方法标注完成不等于数据可用。我在训练前一定会做三件事。第一数量核对统计 images 和 labels 文件数量必须一一对应第二坐标合法性检查写脚本扫描所有 txt确认坐标都在 0 到 1 之间width 和 height 都大于 0第三可视化抽查用 OpenCV 把框画回图上随机抽 10% 的图肉眼看一遍。可视化抽查脚本很短但效果很明显import cv2 img cv2.imread(images/001.jpg) h, w img.shape[:2] with open(labels/001.txt) as f: for line in f: cid, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(check/001.jpg, img)这步看起来多余但真的能拦住很多低级错误。我自己就曾因为类别顺序调整导致一整批 txt 的框全部画到了别的目标上要不是可视化抽查发现训练出来的模型大概率会对不上号。标注阶段多花十分钟检查能省下训练阶段好几天排错时间。我真正把 Labelimg 用顺是在第三个标注项目之后。印象最深的不是某个功能而是“模式”这个概念。很多人一上来就猛画框画完才发现存的是 XML训练框架要 YOLO txt又得满世界找转换工具。因此我的建议是开工前把 classes.txt、标注格式、保存目录这三件事定下来后面能少踩一半的坑。另外如果是团队协作给每个标注员配一份快捷键表比反复口头讲解效率高得多。说实话Labelimg 中文版只是个入口真正值钱的是你对数据格式的理解和标注流程的把控。工具顺手之后把时间留给数据质量那才是目标检测项目最值得投入的地方。本文还有配套的精品资源点击获取
返回列表