背景

之前做了一个视觉识别的检测算法,有粉丝留言说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 后界面如下:

  1. 点击左上角 Open Dir → 选择你存放所有图片的文件夹(比如叫 images/train
  2. 点击 PascalVOC 或 YOLO 格式按钮(先选 PascalVOC 更直观)
  3. 按快捷键 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() 改法处理即可

今天的分享就到这里了,等遇到其他问题接着收集,有相关问题可以和博主交流,竭尽所能去处理

更多推荐