LabelImg介绍
LabelImg是目标检测数据标注工具,可以标注两种格式:
- VOC标签格式,标注的标签存储在xml文件
- YOLO标签格式,标注的标签存储在txt文件中
LabelImg官网:
labelImg的GitHub链接:https://github.com/HumanSignal/labelImg
LabelImg安装
在Anaconda创建的虚拟环境中使用pip安装LabelImg。
1、打开 Anaconda Prompt
2、创建一个虚拟环境
conda create -n use_labelimg python=3.6
3、激活虚拟环境
conda activate use_labelimg
4、使用pip安装LabelImg(有挂代理/梯子记得关掉)
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
5、执行以下命令打开LabelImg
labelimg
LabelImg界面
标注常用的快捷键
W
:调出标注的十字架,开始标注A
:切换到上一张图片D
:切换到下一张图片Ctrl+S
:保存标注好的标签del
:删除标注的矩形框Ctrl+鼠标滚轮
:按住Ctrl,然后滚动鼠标滚轮,可以调整标注图片的显示大小Ctrl+u
:选择要标注图片的文件夹Ctrl+r
:选择标注好的label标签存放的文件夹↑→↓←
:移动标注的矩形框的位置
标注前的一些设置
点击View
显示如下图,然后把如下的几个选项勾上:
Auto Save mode
:当你切换到下一张图片时,就会自动把上一张标注的图片标签自动保存下来,这样就不用每标注一样图片都按Ctrl+S
保存一下了Display Labels
:标注好图片之后,会把框和标签都显示出来Advanced Mode
:这样标注的十字架
就会一直悬浮在窗口,不用每次标完一个目标,再按一次W
快捷键,调出标注的十字架。
案例演示
1、假设在我的 green_plate文件夹 中已经存放了所要进行标注的车牌图片
2、在 LabelImg界面 通过 Open Dir
导入 green_plate文件夹
3、在 LabelImg界面 通过 Change Save Dir
选择 存放标注好图片的文件夹路径
4、在 LabelImg界面 点击 View
进行标注前的一些设置
5、设置标注的文件格式为YOLO
6、按W
键调出标注的十字架,开始标注
可通过
Ctrl+鼠标滚轮
调整标注图片的显示大小,方便对目标进行标注
7、对一张图片标注完成后,按D
键切换到下一张图片继续标注
8、如果需要对一个标注好的矩形框进行删除,可以按以下图片中的操作进行
9、重复以上步骤直至所有的图片标注完成
10、在存放标注好图片的文件夹中查看标注好的文件
检查YOLO标签中的标注信息是否正确
通过读取图像文件和相应的标签文件来绘制边界框,并在窗口中显示带有边界框的图像。
如果边界框的位置和大小与预期相符,那么可以认为YOLO格式的标签是正确的。
"""
文件名: CheckYOLOLabels.py
功能描述: 检查YOLO标签中的标注信息是否正确
"""
import os
import cv2
import matplotlib.pyplot as plt
import numpy as np
def listPathAllfiles(dirname):
"""
遍历指定目录下的所有文件并返回一个包含这些文件路径的列表。
"""
result = []
for maindir, subdir, file_name_list in os.walk(dirname):
for filename in file_name_list:
apath = os.path.join(maindir, filename)
result.append(apath)
return result
if __name__ == '__main__':
# YOLO图片文件的保存路径
imagespath = "DeepLearningProjects\\green_plate"
# YOLO标签文件的保存路径
labelspath = "DeepLearningProjects\\process_green_plate"
# 获取所有标签文件的路径
labelsFiles = listPathAllfiles(labelspath)
# 逆序遍历标签文件,因为通常最新的文件在最后
for lbf in labelsFiles[::-1]:
# 读取标签文件的每一行,并将其分割成一个列表
labels = open(lbf, "r").readlines()
labels = list(map(lambda x: x.strip().split(" "), labels))
# 构造对应的图片文件名
imgfileName = os.path.join(imagespath, os.path.basename(lbf)[:-4] + ".jpg") # .jpg
# 从文件中读取图片,cv2.imdecode函数可以将字节流解码为图像
img = cv2.imdecode(np.fromfile(imgfileName, dtype=np.uint8), 1)
# 遍历每个标签
for lbs in labels:
# 将标签字符串转换为浮点数,并去掉类别索引
lb = list(map(float, lbs))[1:]
# 根据标签计算边界框的左上角和右下角坐标
x1 = int((lb[0] - lb[2] / 2) * img.shape[1])
y1 = int((lb[1] - lb[3] / 2) * img.shape[0])
x2 = int((lb[0] + lb[2] / 2) * img.shape[1])
y2 = int((lb[1] + lb[3] / 2) * img.shape[0])
# 在图像上绘制边界框
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 5)
# 调整图像大小,使其最大边长为600像素
ratio = 600 / min(img.shape[0:2])
img = cv2.resize(img, dsize=(int(img.shape[1] * ratio), int(img.shape[0] * ratio)))
# 显示带有边界框的图像
cv2.imshow("Image", img)
# 等待用户按键,按任意键继续
cv2.waitKey()
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()