博主在做一些目标检测和语义分割训练时,总会遇到标注和图片需要改名,排序,分类的一些情况,现在将一些代码贴出分享,后续也会持续更新。
1.标注和图片改名排序
import os import string path = r''//文件路径 # 获取该目录下所有文件,存入列表中 fileList = os.listdir(path) index = 0//索引号 index_1 = 0//索引号 for i in fileList: i_d = os.path.join(path,i) a = os.path.join(path,i_d)+'\n' suffix = a[-5:]//获取后缀名 suffix_1 = a[-5:]//获取后缀名 if(suffix == ".txt\n"): oldname = i_d newname = path + '/' + 'seg' + '_' + str(index) + '.txt' os.rename(oldname, newname)//重命名 index += 1 if(suffix_1 == ".jpg\n"): oldname_1 = i_d newname_1 = path + '/' + 'seg' + '_' +str(index_1) + '.jpg' os.rename(oldname_1, newname_1)//重命名 index_1 += 1
2.将标注和图片分开
import os import shutil def split(filepath): files = os.listdir(filepath) for fi in files: fi_d = os.path.join(filepath,fi) if os.path.isdir(fi_d): gci(fi_d) else: str = os.path.join(filepath,fi_d)+'\n' #imagepath = os.path.join(filepath,fi_d) #labelpath = os.path.join(filepath,fi_d) suffix = str[-5:] #print(suffix) if(suffix == ".jpg\n"): print(str ,'is a jpg file' + '\n') shutil.move(fi_d,image_path) #img_path = imagepath #image = Image.open(img_path) #image.save(new_path + '/' + fi) #list_txt.writelines(str) else: shutil.move(fi_d,label_path) #print(str,'is not a jpg file' + '\n') # recursion traverse #list_txt = open('list.txt', 'w') #list_txt = open('list.txt', 'w', encoding='utf-8') path = r''//标注和图片路径 image_path = r''//图像路径 label_path = r''//标注路径 print(path) split(path) #list_txt.close()
3.切图,将大图切成小图
'''
将一张图片填充为正方形后切为9张图
'''
from PIL import Image
import os
import shutil
import sys
#遍历图片
def gci(file_path):
files = os.listdir(file_path)
for fi in files:
fi_d = os.path.join(file_path,fi)
if os.path.isdir(fi_d):
gci(fi_d)
else:
str = os.path.join(file_path,fi_d)
suffix = str[-4:]
if(suffix == ".png" or suffix == ".jpg"):
image = Image.open(str)
cut_image(image,fi)
else:
print(str + "is not a jpg file ")
#切图
def cut_image(image,fi):
width, height = image.size
item_width = int(width / 4)
item_height = int(height/4)
box_list = []
# (left, upper, right, lower)
for i in range(0,4):#si重循环,生成16张图片基于原图的位置
for j in range(0,4):
#print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
box = (j*item_width,i*item_height,(j+1)*item_width,(i+1)*item_height)
box_list.append(box)
image_list = [image.crop(box) for box in box_list]
save_images(image_list,fi)
#保存
def save_images(image_list,fi):
index = 1
for image in image_list:
image.save(save_path + '/' + str(index) + '_' + fi)
index += 1
if __name__ == '__main__':
file_path =r""
save_path = r''
image = gci(file_path)
4.将标注后的大图和标签分成图
import cv2
import numpy as np
import os
# def read_label(label_dir):
# flag = 0
# with open(label_dir) as f:
# while(1):
# object = f.readline()
# if not object:
# break
# object = object.split(' ')
#
# tmp = np.zeros([5,1])
# tmp[0,0] = int(object[0])
# tmp[1,0] = float(object[1])
# tmp[2,0] = float(object[2])
# tmp[3,0] = float(object[3])
# tmp[4,0] = float(object[4][0:-1])
# if not flag:
# res = tmp
# flag = 1
# else:
# res = np.concatenate([res,tmp],axis = -1)
# return res
def read_label(label_dir):
res = []
with open(label_dir,'r') as f:
while(1):
object = f.readline()
if not object:
break
object = object.split(' ')
tmp = []
# if int(object[0])!=0:
# continue
tmp.append(int(object[0]))
x = float(object[1])*W
y = float(object[2])*H
w = float(object[3])*W
h = float(object[4])*H
if w*resize_size/min_size<=5 or h*resize_size/min_size<=5:
min_l = min(w,h)
if min_l == w:
ratio = h/w
w = 5*min_size/resize_size
h = w*ratio
else:
ratio = w/h
h = 5*min_size/resize_size
w = h * ratio
tmp.append(max(int(x-w/2),0))
tmp.append(max(int(y-h/2),0))
tmp.append(min(int(x+w/2),W-1))
tmp.append(min(int(y+h/2),H-1))
# tmp.append(int(x-w/2))
# tmp.append(int(y-h/2))
# tmp.append(int(x+w/2))
# tmp.append(int(y+h/2))
res.append(tmp)
res = sorted(res,key=lambda x:(x[1],x[2]))
return res
def in_area(object,start_x,start_y,end_x,end_y):
def cal_iou(box1,box2):
l = max(box1[1],box2[0])
t = max(box1[2],box2[1])
r = min(box1[3],box2[2])
d = min(box1[4],box2[3])
inter = max(0,r-l)*max(0,d-t)
area1 = (box1[3]-box1[1])*(box1[4]-box1[2])
area2 = (box2[2]-box2[0])*(box2[3]-box2[1])
iou = inter/(-inter+area1+area2)
return iou,area1/area2
iou , max_iou = cal_iou(object,[start_x,start_y,end_x,end_y])
if iou>0.1*max_iou:
return True
# if start_x<=object[1]<=end_x or start_y<=object[2]<=end_y and start_x<=object[3]<=end_x and start_y<=object[4]<=end_y:
# return True
return False
def process_img(img,objects):
# left = np.min(objects[1,:] - objects[3,:]/2)*W
# right = np.max(objects[1, :] + objects[3, :] / 2)*W
# top = np.min(objects[2, :] - objects[4, :] / 2)*H
# down = np.max(objects[2, :] + objects[4, :] / 2)*H
# if left>right-min_size:
# left = right-min_size
# if left<0:
# left = 0
# right = left+min_size
#
# if top>down-min_size:
# top = down-min_size
# if top<0:
# top = 0
# right = top+min_size
j = 1
mask = [True]*len(objects)
for t,object in enumerate(objects):
if mask[t]==True:
start_x = max(object[1]-min_size//2,0)
end_x = min(start_x+min_size,W-1)
if end_x == W-1:
start_x = end_x-min_size
start_y = max(object[2]-min_size//2,0)
end_y = min(start_y+min_size, H-1)
if end_y == H-1:
start_y = end_y-min_size
delete_id = []
for i in range(len(objects)):
if in_area(objects[i],start_x,start_y,end_x,end_y):
delete_id.append(i)
cut_pic = img[start_y:end_y,start_x:end_x,:]
save_name = save_dir+img_name[0:-4]+"_"+str(j)
cv2.imwrite(save_name+'.jpg',cut_pic)
# cut_pic = cv2.resize(cut_pic,(608,608))
with open(save_name+'.txt','w+') as f:
for ids in delete_id:
o = objects[ids]
mask[ids] = False
class_id = o[0]
a = (o[1] - start_x)
b = (o[2] - start_y)
c = (o[3] - start_x)
d = (o[4] - start_y)
# cv2.rectangle(cut_pic, (a, b), (c, d), [255, 255, 255], 2)
# cv2.imshow('cut', cut_pic)
# cv2.waitKey(0)
xmin = max((o[1] - start_x) / (min_size),0)
ymin = max((o[2] - start_y) / (min_size),0)
xmax = min((o[3] - start_x) / (min_size),0.999)
ymax = min((o[4] - start_y) / (min_size),0.999)
# print((xmax+xmin)/2)
# print((ymax+ymin)/2)
# print(xmax-xmin)
# print(ymax-ymin)
f.write(str(class_id)+' '+str((xmax+xmin)/2)+' '+str((ymax+ymin)/2)+' '+str(xmax-xmin)+' '+str(ymax-ymin)+'\n')
# cv2.rectangle(cut_pic, (int(((xmax+xmin)/2-(xmax-xmin)/2) * min_size), int(((ymax+ym in)/2-(ymax-ymin)/2) * min_size)),
# (int(((xmax+xmin)/2+(xmax-xmin)/2) * min_size), int(((ymax+ymin)/2+(ymax-ymin)/2) * min_size)), (255, 255, 255), 2)
# cv2.imshow('cut', cut_pic)
# cv2.waitKey(0)
j = j+1
return
min_size = 1000
resize_size = 608
data_dir = r'D:\\Study\\yolov4 3-channel-and-layer-pruning-master\\data\\picture1\\'
save_dir = r'C:\Users\51683\Desktop\cutdata\\'
datas = os.listdir(data_dir)
imgs = [data for data in datas if data.endswith('JPG')]
labels = [data for data in datas if data.endswith('txt')]
for img_name in imgs:
label = img_name.replace('JPG','txt')
if label in labels:
image = cv2.imread(data_dir+img_name)
H, W, _ = np.shape(image)
objects = read_label(data_dir+label)
if not objects:
continue
process_img(image,objects)