目标检测数据处理所用到的脚本
最近在做项目时,需要对数据集进行一系列的处理,包括视频抽帧、对图片的重命名、划分训练集测试集、复制标注文件到别的文件下,图像增强之平移等等,用到了一些脚本,现在整理发布一下,一是记录下来,二是看有无需要的,自取。(小白一枚,有待进步)
"""
rename.py
此脚本用于批量替换更改文件夹下文件名
主要参考了os.path模块 https://www.runoob.com/python3/python3-os-path.html
"""
import os.path
path = r'C:\Users\LJL\Desktop\test1'
for root, dirs,files in os.walk(path):#os.walk() 遍历目录下所有的文件名
# root是当前正在遍历的这个文件夹本身的路径;dirs是文件夹中所有子文件夹的名字;files是该文件夹下所有的文件的名字(不含子目录)
i = 0
j = 0
k = 0
for filename in files:
if filename.split('.')[-1] == 'xml':#split方法对字符串进行分割,[-1]从后向前数第一个
i += 1
newName = 'dfdc_zbs_hxqgj_' + '20210719_'+str(i).zfill(6)+'.xml'#zfill(x)返回指定长度的字符串,原字符串右对齐,前面填充0
os.rename(root +'/'+filename,root+'/'+newName) #两个参数一前一后是原文件名,目标文件名
print("重命名【%s】为【%s】成功"%(filename, newName))
elif filename.split('.')[-1] == 'jpg':
i += 1
newName = 'xxx' + 'xxx'+str(i).zfill(6)+'.jpg'
os.rename(root + '/' + filename, root + '/' + newName)
print("重命名【%s】为【%s】成功"%(filename, newName))
elif filename.split('.')[-1] == 'txt':
i += 1
newName = 'xxx_' + 'xxx_'+str(i).zfill(6)+'.txt'
os.rename(root + '/' + filename, root + '/' + newName)
print("重命名【%s】为【%s】成功"%(filename, newName))
else:
print(None)
"""
笔记:
常用的用于遍历文件夹、文件的语句有
for root, dirs,files in os.walk(path):#os.walk() 遍历目录下所有的文件名
for filename in files:
for pathAndFilename in glob.iglob(os.path.join(image_dir, "*.jpg")):#遍历目录下所有的jpg文件
title, ext = os.path.splitext(os.path.basename(pathAndFilename))
if not os.path.exists(save_path):#新建文件夹
os.makedirs(save_path)
"""
"""
rename1.py
此脚本用于批量替换更改文件夹下文件名中某个地方,
主要参考了os.path模块 https://www.runoob.com/python3/python3-os-path.html
"""
import os
path = r'C:\Users\LJL\Desktop\test1'
for root, dirs, files in os.walk(path):
for filename in files:
# title, text = os.path.splitext(os.path.basename(filename))#os.path.basename(filename)返回文件名
#os.path.splitext()分割路径中的文件名与拓展名
title, text = os.path.splitext(filename)
# title = title.replace(" ", "_")
# title = title.replace(",", "_")
# title = title.replace(".", "")
title = title.replace('xxx_', 'ccc')
new_filename = os.path.join(root, title + text)
print(new_filename)
filename = os.path.join(root, filename)
os.rename(filename, new_filename)
"""
video_process.py
此脚本使用opencv对视频进行抽帧,保存为图片
注意:路径里不要有中文
"""
import cv2
import os.path
file_path= r'C:\Users\LJL\Desktop\test2' #文件路径
save_path = os.path.join(file_path,'pict1')#把两个参数合成一个文件名 文件保存路径
if not os.path.exists(save_path):
os.makedirs(save_path)
for root,dirs,files in os.walk(file_path):
for filename in files:
videopath = os.path.join(file_path, filename)
vc = cv2.VideoCapture(videopath)
c = 1
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
a = 1
timeF = 10 # 视频帧计数间隔频率 130约等于5秒,50约等于2秒
video_to_picture_path = os.path.join(save_path, filename.split('.')[0])# 视频文件夹的命名
if not os.path.exists(video_to_picture_path): # 创建每一个视频存储图片对应的文件夹
os.makedirs(video_to_picture_path)
while rval: # 循环读取视频帧
rval, frame =vc.read()
if c % timeF == 0: # 每隔timeF帧进行存储操作
save_path = os.path.join(video_to_picture_path, filename.split('.')[0])
try:
cv2.imwrite(save_path + '_' + str(a).zfill(6) + '.jpg', frame)
print(save_path+ '_' + str(a).zfill(6) + '.jpg')
except cv2.error:
pass
a = a + 1
c = c + 1
cv2.waitKey(1)
vc.release()
cv2.destroyAllWindows()
"""
picture_process.py
此脚本用于从以文件夹中按照百分比抽取一定比例的jpg文件以及对应的xml文件
把数据集按比例分成训练集,测试集
"""
import glob
import os
import shutil
import random
file_path = r'C:\Users\LJL\Desktop\test1'
save_path = os.path.join(file_path,'select')
if not os.path.exists(save_path):
os.makedirs(save_path)
filenames = []
for pathAndFilename in glob.iglob(os.path.join(file_path, '*.jpg')):#遍历所有的jpg文件
filenames.append(pathAndFilename)
test_ratio = 0.2
filenum = len(filenames)
num_test = int(filenum * test_ratio)
sample_train = random.sample(filenames, num_test)
for name in sample_train:
shutil.move(os.path.join(file_path,name), save_path)
shutil.move(os.path.join(file_path,name).replace('.jpg', '.xml'), save_path)
"""
picture_enhancement_move_xml.py
此脚本用于数据增强,上下左右移动一定像素值,xml文件坐标随着移动
"""
import glob
import os
import cv2
import numpy as np
import random
import xml.etree.ElementTree as ET
origin_path = r''
after_move_path = r''
if not os.path.exists(after_move_path):
os.makedirs(after_move_path)
move_step = [-15,-30,-50,-70,15,20,40,60]
for pathAndFilename in glob.iglob(os.path.join(origin_path, "*.jpg")):#遍历所有的jpg文件
title, ext = os.path.splitext(os.path.basename(pathAndFilename))#分离文件名和拓展名
new_jpg_ext = ext.replace('.jpg', '_move.jpg')
move_step_num = random.choice(move_step)#从列表中随机返回一个数
img = cv2.imdecode(np.fromfile(pathAndFilename, dtype=np.uint8), -1)
cols = img.shape[0]
rows = img.sahpe[1]
num = random.randint(1,2)
if num == 1:
M = np.float32([[1, 0, move_step_num], [0, 1, 0]]) # 1 0: x 0 1: y; 如需修改移动像素只需在第三位修改 (-15为左移15)
dst = cv2.warpAffine(img, M, (rows, cols))
cv2.imencode('.jpg', dst)[1].tofile(after_move_path + os.sep + title + new_jpg_ext) # 保存图片
xml_path = pathAndFilename.replace(".jpg", ".xml")
tree = ET.parse(xml_path)
root = tree.getroot()
sz = root.find('size')
width = float(sz.find('width').text)
height = float(sz.find('height').text)
filename = root.find('filename').text
for child in root.findall('object'): # 找到图片中的所有框
flag = 0
sub = child.find('bndbox') # 找到框的标注值并进行读
new_xmin = str(float(sub.find('xmin').text) + float(move_step_num))
new_xmax = str(float(sub.find('xmax').text) + float(move_step_num))
sub.find('xmin').text = new_xmin
sub.find('xmax').text = new_xmax
print(sub.find('xmin').text)
print(sub.find('xmin').text)
tree.write(after_move_path+os.sep+title+'_move.xml')
elif move_step_num == 2:
M = np.float32([[1, 0, 0], [0, 1, move_step_num]]) # 1 0: x 0 1: y; 如需修改移动像素只需在第三位修改 (-15为左移15)
dst = cv2.warpAffine(img, M, (rows, cols))
cv2.imencode('.jpg', dst)[1].tofile(after_move_path + os.sep + title + new_jpg_ext) # 保存图片
xmlpath = pathAndFilename.replace(".jpg", ".xml")
tree = ET.parse(xmlpath)
root = tree.getroot()
sz = root.find('size')
width = float(sz.find('width').text)
height = float(sz.find('height').text)
filename = root.find('filename').text
for child in root.findall('object'): # 找到图片中的所有框
flag = 0
sub = child.find('bndbox') # 找到框的标注值并进行读
new_xmin = str(float(sub.find('ymin').text) + float(move_step_num))
new_xmax = str(float(sub.find('ymax').text) + float(move_step_num))
sub.find('ymin').text = new_xmin
sub.find('ymax').text = new_xmax
tree.write(after_move_path + os.sep + title + '_move.xml')
应该是第一篇CSDN ,希望越来越熟练,多多积累。