labelimg(目标检测标注工具)的安装、使用教程和问题解决
背景
之前做了一个视觉识别的检测算法,有粉丝留言说Labelimg这个工具怎么用,从哪儿弄的,今天就把这个工具做个总结,过程中遇到的问题和注意点一并说一下。
一、什么是labelimg
labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是ImageNet使用的格式。此外,它还支持 COCO数据集格式。
1.安装
这是一个免费开源的图形化标注软件,像 Photoshop 一样简单!
安装方法(Windows 最简单):
方法1:直接下载免安装版(推荐新手)
👉 下载地址:https://tzutalin.github.io/labelimg/
点击 “Download” → 选 Windows & Python 3 + Qt5
→ 下载 zip 包解压后双击运行 labelImg.exe
方法2:命令行安装(稍专业)
在cmd输入以下命令
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
然后等待其自动帮你安装labelimg以及lxml和pyqt5
2.使用
结束后,在cmd中输入labelimg,启动命令
labelimg
等一会会就会出现labelimg页面
注意:如果上面输入labelimg后,cmd中提示
不是内部或外部命令,也不是可运行的程序或批处理文件。
你可以试试使用everything搜索labelimg.exe。该软件一般在你python目录下的scripts目录中
3.开始标注
打开 LabelImg
后界面如下:
- 点击左上角
Open Dir
→ 选择你存放所有图片的文件夹(比如叫images/train
) - 点击
PascalVOC
或YOLO
格式按钮(先选PascalVOC
更直观) - 按快捷键
W
开始画框
步骤 | 操作 |
---|---|
1️⃣ | 打开一张图,看到连接器位置 |
2️⃣ | 按 W 键 → 鼠标拖动 → 把整个连接器外露部分框起来(尽量紧贴边缘) |
3️⃣ | 弹出对话框输入类别名:<br>✅ 输入 hege 表示“合格”<br>❌ 输入 buhege 表示“不合格” |
4️⃣ | 点击 Save → 自动生成一个 .xml 文件 |
使用说明:
1) 打开LabelImg后,为了让操作更加方便,先设:
Auto Save mode:切换到下一张图片的时候,会自动保存标签;
2) 点击Change Save Dir,设置存储位置
3) 点击切换标注格式的按钮,转换成YOLO格式,也可以用PascalVOC
4) 点击Open Dir打开图片文件夹,之后开始标注。
常用操作快捷键:
一般使用W和D ,这里大家可以去试试,用上快捷键后,标注速度肯定会得到提升
- A:切换到上一张图片
- D:切换到下一张图片
- W:调出标注十字架
- del :删除标注框框
- Ctrl+u:选择标注的图片文件夹
- Ctrl+r:选择标注好的label标签存在的文件夹
- Ctrl+s:保存
标注结果展示
1.VOC
这种的要转换,转换请看第4步
2. YOLO
生成文件如下
4.转换
转换为 YOLO 要的格式(.txt 文件)
得到了一堆 .xml
文件(来自 LabelImg),但 YOLO 模型需要的是 .txt
文件,内容是这种:
<class_id> <x_center> <y_center> <width> <height>
这五个数字到底是什么意思?
假设你的图片大小是 640×480 像素,你画了一个框:
- 左上角坐标:(100, 200)
- 右下角坐标:(200, 300)
那么这个框的信息是:
参数 | 计算方式 | 数值 |
---|---|---|
中心点 x | (100 + 200)/2 = 150 | 150 |
中心点 y | (200 + 300)/2 = 250 | 250 |
宽度 w | 200 - 100 = 100 | 100 |
高度 h | 300 - 200 = 100 | 100 |
再做“归一化”(除以图片宽高):
参数 | 归一化公式 | 结果(保留4位小数) |
---|---|---|
x_center | 150 / 640 ≈ 0.2344 | 0.2344 |
y_center | 250 / 480 ≈ 0.5208 | 0.5208 |
width | 100 / 640 ≈ 0.1562 | 0.1562 |
height | 100 / 480 ≈ 0.2083 | 0.2083 |
最后加上类别 ID:
- 假设
hege
→ class_id = 0 buhege
→ class_id = 1
所以最终的一行就是:
0 0.2344 0.5208 0.1562 0.2083
这就是一条标准的 YOLO 标注!
https://blog.csdn.net/r502818330/article/details/146043528
完成后可进行后续的yolo训练方面的操作。
labelimg.exe的存放位置
使用everything软件查找labelimg,在目标检测上面,在标注图片上面,了解一些labelimg及其使用还是很有必要的
https://www.cnblogs.com/Dongmy/p/18741639
https://blog.csdn.net/knighthood2001/article/details/125883343
yolov8/yolo11的视觉识别算法使用和详解可以参考博主的这篇文章:
基于yolov8/yolo11的视觉识别算法使用和详解
二、遇到的问题和解决方法
1.TypeError: arguments did not match any overloaded call:
我一开始下载labeling后,每次画框都会闪退,控制台报错类似这种错误:
TypeError: arguments did not match any overloaded call:drawLine(self, l: QLineF): argument 1 has unexpected type 'float'drawLine(self, line: QLine): argument 1 has unexpected type 'float'drawLine(self, x1: int, y1: int, x2: int, y2: int): argument 1 has unexpected type 'float'drawLine(self, p1: QPoint, p2: QPoint): argument 1 has unexpected type 'float'drawLine(self, p1: Union[QPointF, QPoint], p2: Union[QPointF, QPoint]): argument 1 has unexpected type 'float'
后来经过网上搜索发现,这个版本可能有问题,问题的具体是在 paintEvent
方法中调用 drawLine
函数时传入了浮点数参数,而 drawLine
函数期望的是整数类型
这表明 drawLine
方法的所有重载版本都期望整数类型的坐标值,但实际传入的是浮点数。通常情况下,这是由于坐标值没有被正确地转换为整数导致的。
解决方案
要解决这个问题,你需要修改 canvas.py
文件中的相关代码,确保在调用 drawLine
方法之前将所有浮点数坐标值转换为整数。以下是具体的步骤:
修改 canvas.py
文件
找到 canvas.py
文件中的第 530 行,该行代码是这样的:
if self.drawing() and not self.prev_point.isNull() and not self.out_of_pixmap(self.prev_point):p.setPen(QColor(0, 0, 0))p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())p.drawLine(0, self.prev_point.y(), self.pixmap.width(), self.prev_point.y())
修改为:
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))
p.drawLine(0, int(self.prev_point.y()), int(self.pixmap.width()), int(self.prev_point.y()))
完成上述修改后,保存 canvas.py
文件,并重新启动 LabelImg。如果一切正常,你应该不会再遇到之前的错误。
注:这里面类似的报错挺多的,但是改法都大同小异参考这个int() 改法处理即可
今天的分享就到这里了,等遇到其他问题接着收集,有相关问题可以和博主交流,竭尽所能去处理