YOLO5中的labelImg处理的准备工作和收尾

该文章介绍了如何对图片数据集进行统一命名,使用rename.py脚本批量修改为000001.jpg格式。接着,文章讲解了如何创建文件夹并按照一定比例(60%训练,20%验证,20%测试)划分数据集,提供了split_and_rename.py和split.py两个脚本。此外,还分享了LabelImg工具的常用标注快捷键以及如何处理标注过程中遇到的问题,如删除多余的TXT文件。
摘要由CSDN通过智能技术生成

本博客适用于使用自己收集的图片数据集,并且使用 labelImg 进行标注,标注格式为yolo_txt 格式的情况

在这里插入图片描述

1. 统一图片命名

杂乱的图片命名并不是一个数据分析师该有的习惯。以下通过raname.py能够帮助我们进行批量修改数据集中图片的名字。
名字的格式为:000001.jpg, 其中数字个数为所有图片数对应的位数,用0填补空缺位置。
rename.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

class ImageRename():
    def __init__(self):
        self.path = 'D:\\dog_picture\\YOLO_dog_mask\\JPEGImages'

    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)
        # 设置文件名范围
        max_num = len(str(total_num))
        name_format = '0>{}s'.format(max_num)
        i = 1
        for item in filelist:
            if item.endswith('.jpg'):
                # abspath 比如桌面有文件的快捷方式,abs就是快捷方式的路径,
                # realpath real就是快捷方式对应文件的路径,在def盘之类的
                # format(str(i), '0>6s') 表示将int转换为字符串后,用0填补6个位中的空缺位置
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(
                    self.path), format(str(i), name_format) + '.jpg')
                os.rename(src, dst)
                print('converting %s to %s ...' % (src, dst))
                i = i + 1
        print('total %d to rename & converted %d jpgs' % (total_num, i))

if __name__ == '__main__':
    newname = ImageRename()
    newname.rename()

参考博客

2. 创建文件夹,划分数据

YOLO进行训练的data文件夹格式
YOLOV5数据集文件格式

重命名版

在YOLOv5文件夹中的data目录下创建mydata文件夹(名字可以自定义),目录结构如下,
把一个文件夹下的所有图片按比例划分为三个数据集,且重命名。
split_and_rename.py

# -*- coding:utf-8 -*-
# 将一个文件夹下图片按比例分在三个文件夹下
import os
import random
import shutil
from shutil import copy2

datadir_normal = "D:\\dog_picture\\YOLO_dog_mask\\JPEGImages"

all_data = os.listdir(datadir_normal)  # (图片文件夹)
num_all_data = len(all_data)
print("num_all_data: " + str(num_all_data))
index_list = list(range(num_all_data))

random.shuffle(index_list)
num = 0
# 将训练集放在这个文件夹下
trainDir = 'images/train/'

if not os.path.exists(trainDir):
    os.mkdir(trainDir)
# 将验证集放在这个文件夹下
validDir = 'images/val/'
if not os.path.exists(validDir):
    os.mkdir(validDir)
# 将测试集放在这个文件夹下
testDir = 'images/test/'
if not os.path.exists(testDir):
    os.mkdir(testDir)

train_index = 0
val_index = 0
test_index = 0

for i in index_list:
    fileName = os.path.join(datadir_normal, all_data[i])
    if num < num_all_data * 0.6:
        train_dst = os.path.join(os.path.abspath(
            trainDir), '' + str(train_index) + '.jpg')
        train_index = train_index + 1

        copy2(fileName, train_dst)

        # os.rename(trainDir, train_dst)
    elif num >= num_all_data * 0.6 and num < num_all_data * 0.8:
        # print(str(fileName))
        val_dst = os.path.join(os.path.abspath(
            validDir), '' + str(val_index) + '.jpg')
        val_index = val_index + 1
        copy2(fileName, val_dst)

    else:
        test_dst = os.path.join(os.path.abspath(
            testDir), '' + str(test_index) + '.jpg')
        test_index = test_index + 1
        copy2(fileName, test_dst)

    num += 1

参考博客

不重命名版

鉴于不同项目和个人分析习惯,下面的代码只进行数据集划分而不重命名
-----------------------------------split.py---------------------------------

# -*- coding:utf-8 -*-
# 将一个文件夹下图片按比例分在三个文件夹下
import os
import random
import shutil
from shutil import copy2

datadir_normal = "D:\\dog_picture\\YOLO_dog_mask\\JPEGImages"

all_data = os.listdir(datadir_normal)  # (图片文件夹)
num_all_data = len(all_data)
print("num_all_data: " + str(num_all_data))
index_list = list(range(num_all_data))

random.shuffle(index_list)
num = 0
# 将训练集放在这个文件夹下
trainDir = 'images/train/'

if not os.path.exists(trainDir):
    os.mkdir(trainDir)
# 将验证集放在这个文件夹下
validDir = 'images/val/'
if not os.path.exists(validDir):
    os.mkdir(validDir)
# 将测试集放在这个文件夹下
testDir = 'images/test/'
if not os.path.exists(testDir):
    os.mkdir(testDir)

train_index = 0
val_index = 0
test_index = 0

for i in index_list:
    fileName = os.path.join(datadir_normal, all_data[i])
    if num < num_all_data * 0.6:
        train_dst = os.path.join(os.path.abspath(
            trainDir), all_data[i])
        train_index = train_index + 1

        copy2(fileName, train_dst)

        # os.rename(trainDir, train_dst)
    elif num >= num_all_data * 0.6 and num < num_all_data * 0.8:
        # print(str(fileName))
        val_dst = os.path.join(os.path.abspath(
            validDir), all_data[i])
        val_index = val_index + 1
        copy2(fileName, val_dst)

    else:
        test_dst = os.path.join(os.path.abspath(
            testDir), all_data[i])
        test_index = test_index + 1
        copy2(fileName, test_dst)

    num += 1

3. LabelImg 标注

常用标注快捷键

快捷键:
A: 切换到上一张图片
D:切换到下一张图片
W:调出标注十字架
del :删除标注框框
Ctrl+u:选择标注的图片文件夹
Ctrl+r:选择标注好的label标签存在的文件夹
Ctrl + Shift + D: 删除当前图片
每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式。

标注问题处理

如果筛选了图片再进行标注,那么对图片要进行两次审核,效率低下。可以在标注过程中对图片进行筛选。通过LabelImg的Ctrl + Shift + D 删除当前图片,在image文件夹下的对应图片会被删除,但是有时会出现 labels文件夹下仍然生成对应的yolo_txt文件。
通过 delet_excessive_txt.py 能够剔除多余的txt文件。

import os

datadir_normal = "D:\\dog_picture\\yolo_mini_dog_mask\\train1"
labeldir_normal = 'D:\\dog_picture\\yolo_mini_dog_mask\\train'
all_data_jpg = os.listdir(datadir_normal)  # (图片文件夹)
all_labels_txt = os.listdir(labeldir_normal)  # (label文件夹)
# 去除扩展名
all_data = [data.split('.')[0] for data in all_data_jpg]
all_labels = [label.split('.')[0] for label in all_labels_txt]

num_all_data = len(all_data)
num_all_labels = len(all_labels)
print("总共有jpg文件{}个".format(num_all_data))
print("总共有txt文件{}个".format(num_all_labels))
print('\n')
print("****************开始删除多余txt***************")
'''
if num_all_data > num_all_labels:
    print("数据仍未标注完成,请先标注所有的图片,或者移除不必要的图片")
    os._exit(0)
'''
txt_excessive_num = 0
for label in all_labels:
    if label not in all_data:
        txt_excessive_num += 1
        os.remove(path=os.path.join(labeldir_normal, label + '.txt'))
        print('已删除{}.txt'.format(label))

jpg_excessive_num = 0
for jpg in all_data:
    if jpg not in all_labels:
        jpg_excessive_num += 1
        os.remove(path=os.path.join(datadir_normal, jpg + '.jpg'))
        print('已删除{}.jpg'.format(jpg))

print("****************删除多余txt完毕***************")
print('\n')
print("总共删除{}个多余txt文件".format(txt_excessive_num))
print("总共删除{}个多余txt文件".format(jpg_excessive_num))

https://blog.csdn.net/Hu_helloworld/article/details/103300328
https://blog.csdn.net/weixin_42436762/article/details/128089122

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值