目标检测常用标注工具-LabelImg的使用
目前我们的很多教程都是围绕目标检测展开的,一般情况下我都提供了我标注好的数据集,但是有的小伙伴需要根据自己的数据集来进行标注,这个时候掌握其中一种标注工具的使用显得至关重要。其中在计算机视觉的任务中,常用的标注工具有两类,一类是labelimg,主要是用于目标检测类数据的标注,一类是labelme,常用于分割任务的标注。考虑到平时大家的任务以检测为主,所以本期我们主要讲的是标注软件labelimg的使用。
安装labelimg
labelimg的安装非常简单,只需要执行对应的pip指令即可。
请保证你在安装之前已经安装好了miniconda和pycharm,如果这里还没有完成,请看这期视频:【2024毕设系列】Anaconda和Pycharm如何使用_哔哩哔哩_bilibili
首先我们需要创建一个对应的用于这个标注功能的虚拟环境,请执行下面两个指令完成虚拟环境的创建和激活。
conda create -n labelimg_env python==3.8.5
conda activate labelimg_env
激活环境之后请在命令行中安装对应的labelimg软件。
pip install labelimg
之后再命令行中输入labelimg
即可启动标注软件,如下图所示。
准备你的图像数据集
一个完整的目标检测的数据集由图像和标签构成,所以在开始之前。你需要先准备好你的图像数据集,这里的图像数据集可以是你从视频中进行截取的,或者是你从你的课题组或者是你从你的项目中获取的。总之,你会有一堆的图像放在一个文件夹下。
注意,你存放图像的路径最好只包含英文,中文可能导致后续你读取图像的时候出现乱码,为了能够让你的图像不出现乱码的问题,我这里写了一段脚本,你可以将你的图像进行事先的重命名,保证你的图像路径不会出现错误。
# -*-coding:utf-8 -*-
"""
#-------------------------------
# @Author : 肆十二
# @QQ : 3045834499 可定制毕设
#-------------------------------
# @File : step2_get_names.py
# @Description: 文件描述
# @Software : PyCharm
# @Time : 2024/2/14 13:20
#-------------------------------
"""
import os
import os.path as osp
import numpy as np
import cv2
def cv_imread_chinese(file_path):
cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
return cv_img
def folder_rename(src_folder_path, target_folder_path):
os.makedirs(target_folder_path, exist_ok=True)
file_names = os.listdir(src_folder_path)
for i, file_name in enumerate(file_names):
print("{}:{}".format(i, file_name))
src_name= osp.join(src_folder_path, file_name)
src_img = cv_imread_chinese(src_name)
target_path = osp.join(target_folder_path, "yolo_data_{}.jpg".format(i))
cv2.imwrite( target_path,src_img )
# os.rename(src_name, target_name)
if __name__ == '__main__':
# 脚本应该生成在一个新的目录下,防止出错
folder_rename("test_data/中文路径", "test_data/english_path")
有了图像数据集之后,我们就可以开始进行标注了, 这里我放了一段黑神话悟空中的图像数据集,一会我们将会使用这个图像数据集来完成标注的任务。
使用labelimg
在目标检测的领域中,一般情况下你将会接触到三个格式的数据,分别是txt格式的yolo数据,xml格式的voc数据集以及json格式的coco数据,他们在目标检测数据的表示上面各有不同。一般情况下,为了训练方便,大家选择常用的coco数据,但是为了灵活性考虑的话, 可能是标注为voc格式数据更好,因为yolo格式中的数据label的id是固定的,这将会导致后面增加类别或者减少类别的时候会出现问题。下面是一个典型的标注区域,在标注之前请你先进行一下自动保存的设置,这样的话就不用反复的进行保存的确认了。
下面有一些常用的快捷键,使用这些快捷键可以帮助你快速进行标注。
快捷键 | 功能 |
---|---|
Ctrl + u | Load all of the images from a directory |
Ctrl + r | Change the default annotation target dir |
Ctrl + s | Save |
Ctrl + d | Copy the current label and rect box |
Ctrl + Shift + d | Delete the current image |
Space | Flag the current image as verified |
w | Create a rect box |
d | Next image |
a | Previous image |
del | Delete the selected rect box |
Ctrl++ | Zoom in |
Ctrl– | Zoom out |
↑→↓← | Keyboard arrows to move selected rect box |
使用yolo的格式进行标注
如果使用yolo格式进行标注,你可以提前定义好标签然后进行加载。
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
YOLO(You Only Look Once)是一种广泛用于目标检测的算法,YOLO的训练数据格式对于构建自定义数据集非常重要。YOLO的标签文件通常是 .txt
格式,并且每个图像文件都对应一个同名的标签文件。这些标签文件中存储了图像中物体的类别和位置信息。
YOLO数据格式说明:
-
图像文件:
- 图像文件通常是
.jpg
、.png
或其他常见的图像格式。 - 图像的尺寸和分辨率可以根据数据集调整,但在训练前图像通常会被缩放到固定尺寸(例如 YOLOv3 的默认输入是 416x416)。
- 图像文件通常是
-
标签文件:
-
标签文件是纯文本文件,扩展名为
.txt
。 -
每个图像文件有一个对应的
.txt
文件,文件名与图像文件名相同(但扩展名不同)。 -
标签文件中每一行代表一个目标,每一行包含以下五个值:
<object-class> <x_center> <y_center> <width> <height>
- object-class: 物体的类别ID,从 0 开始。假设数据集中有 3 类物体,类别编号会是 0、1、2 等。
- x_center: 物体边界框中心点的 x 坐标,相对于图像的宽度进行归一化,范围为 0 到 1 之间(例如:0.5 表示在图像的正中间)。
- y_center: 物体边界框中心点的 y 坐标,相对于图像的高度进行归一化,范围为 0 到 1 之间。
- width: 边界框的宽度,相对于图像的宽度进行归一化,范围为 0 到 1 之间。
- height: 边界框的高度,相对于图像的高度进行归一化,范围为 0 到 1 之间。
-
具体例子:
假设有一个图像文件 dog.jpg
,其对应的标签文件 dog.txt
内容如下:
0 0.5 0.5 0.4 0.6
1 0.3 0.3 0.2 0.3
- 第一行:物体类别为 0(假设是狗),其边界框中心位于图像的正中间 (0.5, 0.5),宽度为图像的 40%(0.4),高度为图像的 60%(0.6)。
- 第二行:物体类别为 1(假设是猫),其边界框中心位于 (0.3, 0.3),宽度为图像的 20%(0.2),高度为图像的 30%(0.3)。
YOLO格式的注意事项:
- 所有的坐标和尺寸都需要归一化为相对于图像宽度和高度的值。即
(x_center, y_center, width, height)
都是 0 到 1 之间的小数。 - 物体类别ID是从 0 开始的整数。
- 如果一张图片中有多个物体,标签文件中每个物体都占据一行。
类别文件:
通常,YOLO会有一个额外的类别文件,通常是 classes.names
或 obj.names
,该文件列出所有的类别名称,每行一个类别。例如:
dog
cat
car
这个文件的顺序和标签文件中的 object-class
对应。
使用voc的格式进行标注
Pascal VOC(Visual Object Classes)是目标检测领域非常流行的数据集格式,尤其在早期目标检测研究中被广泛使用。Pascal VOC 数据集格式与 YOLO 格式不同,VOC 使用 XML 文件来标注目标检测数据。这些 XML 文件基于 PASCAL VOC Challenge 的标准,且结构化信息较为丰富,便于扩展。
VOC数据格式说明
每个图像对应一个 XML 标注文件,格式为 Pascal VOC 定义的 XML 文件。文件结构描述了图像中物体的类别、位置(使用未归一化的像素坐标)、难度等信息。
Pascal VOC数据结构
-
图像文件:
- 图像文件通常为
.jpg
或.png
格式,存储在JPEGImages
文件夹中。
- 图像文件通常为
-
标签文件:
- 标签文件是 XML 格式的,通常存储在
Annotations
文件夹中,每个图像文件对应一个 XML 标签文件,文件名与图像名相同。
- 标签文件是 XML 格式的,通常存储在
主要的 XML 标签说明
下面是一个 Pascal VOC 的标签文件的例子 2007_000027.xml
:
<annotation>
<folder>VOC2007</folder>
<filename>2007_000027.jpg</filename>
<size>
<width>486</width>
<height>500</height>
<depth>3</depth>
</size>
<object>
<name>dog</name>
<pose>Left</pose>
<truncated>1</truncated>