admin管理员组文章数量:1576375
本博客适用于使用自己收集的图片数据集,并且使用 labelImg 进行标注,标注格式为yolo_txt 格式的情况
文章目录
- 1. 统一图片命名
- 2. 创建文件夹,划分数据
- 重命名版
- 不重命名版
- 3. LabelImg 标注
- 常用标注快捷键
- 标注问题处理
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文件夹中的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/Hu_helloworld/article/details/103300328
https://blog.csdn/weixin_42436762/article/details/128089122
版权声明:本文标题:YOLO5中的labelImg处理的准备工作和收尾 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727799241a1130631.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论