labelImag安装与使用及构造数据集

在做目标检测任务时,需要进行标注,选择了LabelImg作为标注工具,下面是安装及使用过程。
我们使用Anconda的虚拟环境进行安装,激活环境后,执行:

pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述
安装结束后,输入labelimg即可。
在这里插入图片描述
然后我们还需要设置一下点击View显示如下图,然后把如下的几个选项勾上:

  • Auto Save mode:当你切换到下一张图片时,就会自动把上一张标注的图片标签自动保存下来,这样就不用每标注一样图片都按Ctrl+S保存一下了
  • Display Labels:标注好图片之后,会把框和标签都显示出来
  • Advanced Mode:这样标注的十字架就会一直悬浮在窗口,不用每次标完一个目标,再按一次W快捷键,调出标注的十字架。

然后我们就可以进行标注了,博主标注格式为VOC,首先需要创建好对应的文件。

  • JPEGImage 目录:存储的图片
  • Annotation 目录:用于存放标注图片的标签文件
  • predefined_classes.txt 文件:定义自己要标注的所有类别

然后我们需要定义好自己想要标注的类别,博主初步定义如下:

bus person car sign light

其中sign包含路牌,交通标识等,light指的是信号灯。
我们先将数据集统一重命名

import os
# 图片存放的路径
path = r"E:/KITTI/jiamusi/VOC/JPEGImage/"
# 遍历更改文件名
num = 1
for file in os.listdir(path):
   os.rename(os.path.join(path,file),os.path.join(path,str(num))+".jpg")
    num = num + 1

对于子文件夹内的图片信息,可以将其提取并重命名。,如下图:
内含图像,我们要将其内图像按序提取并重命名。
在这里插入图片描述
提取为下列格式:
在这里插入图片描述
代码实现如下:

import os
from shutil import copy

path = "E:/KITTI/jiamusi/video2jpg"  # 原文件夹
out = "E:/KITTI/jiamusi/video2jpg/VOC/JPEGImage"  # 保存的文件夹地址

# 获取文件列表
allfilelist = os.listdir(path)  # 获取子文件夹名
index = 1
for file in allfilelist:
    filepath = os.path.join(path, file)
    img_names = os.listdir(filepath)  # 获取子文件夹中的文件名
    # 循环读取文件,批操作文件名重命名

    for item in img_names:
        if item.endswith('.jpg'):  # 根据自己的文件格式修改
            src_path = os.path.join(os.path.abspath(filepath), item)
            dst_path = os.path.join(os.path.abspath(out), '' + str(index) + '.jpg')
            copy(src_path, dst_path)
            index = index + 1

完成后labelimg打开 Open Dir 进行标注,w 快捷键进行标注:
在这里插入图片描述
标注完成:
在这里插入图片描述
Ctrl+S保存生成的标注文件

<annotation>
	<folder>JPEGImage</folder>
	<filename>1.jpg</filename>
	<path>E:\KITTI\jiamusi\VOC\JPEGImage\1.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>6960</width>
		<height>4640</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>person</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>3106</xmin>
			<ymin>2119</ymin>
			<xmax>3364</xmax>
			<ymax>2907</ymax>
		</bndbox>
	</object>
	<object>
		<name>person</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>3359</xmin>
			<ymin>2225</ymin>
			<xmax>3617</xmax>
			<ymax>2878</ymax>
		</bndbox>
	</object>
	<object>
		<name>car</name>
		<pose>Unspecified</pose>
		<truncated>1</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>5894</xmin>
			<ymin>2307</ymin>
			<xmax>6960</xmax>
			<ymax>3519</ymax>
		</bndbox>
	</object>
	<object>
		<name>car</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>6023</xmin>
			<ymin>2155</ymin>
			<xmax>6700</xmax>
			<ymax>2513</ymax>
		</bndbox>
	</object>
	<object>
		<name>car</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>3641</xmin>
			<ymin>2296</ymin>
			<xmax>3829</xmax>
			<ymax>2419</ymax>
		</bndbox>
	</object>
</annotation>

至此便标注完成了。
在这里插入图片描述
在上面中我们将自己的数据集完成了标注,那么接下来便是使用自己的数据集进行训练了。
我们看一下数据集标注的效果。分为3种,xml为voc格式,txt为yolo格式,json为coco格式。
在这里插入图片描述
这里的文件放置比较杂乱,我们将其分一下:

#将指定文件复制到某个文件夹中
def copyfile():
    import os
    import shutil
    data_path = 'E:/KITTI/jiamusi/VOC/Annotation/'
    for root, dirs, files in os.walk(data_path):
        for file in files:
            if file.endswith("xml"):
                old_file_path = os.path.join(root, file)
                # print(old_file_path)
                new_path = 'E:/KITTI/jiamusi/VOC/COCO_Annotation/'
                if not os.path.exists(new_path):  # 创建新文件夹
                    os.makedirs(new_path)
                new_file_path = new_path + '/' + file
                print(new_file_path)
                shutil.copyfile(old_file_path, new_file_path)  # 复制文件
    print('finished!')

这里我们可以判断下是否有标注遗漏的:

def serach():
    import fnmatch
    import os
    data_path = 'E:/KITTI/jiamusi/VOC/VOC_Annotation/'
    file_path = 'E:/KITTI/jiamusi/VOC/JPEGImage/'
    data_list = []
    file_list = []
    for root, dirs, files in os.walk(data_path):
        for file in files:
            data_list.append(os.path.splitext(file)[0])
    for root, dirs, files in os.walk(file_path):
        for file in files:
            file_list.append(os.path.splitext(file)[0])
    diff = set(data_list).difference(set(file_list))  # 差集,在a中但不在b中的元素
    for name in diff:
        print("no file", name + "in data")
    diff2 = set(file_list).difference(set(data_list))  # 差集,在b中但不在a中的元素
    for name in diff2:
        print("no data", name + "in file")

完成后便可以开始数据集处理了。
我们首先使用voc格式进行实验。
详情可用参考我的博客:
YOLOV7调试记录

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭祥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值