一,简介
它可以将标签框对应的图片扣下来并分类放入文件夹
二,代码
from PIL import Image
from tqdm import tqdm
import os
import json
import cv2
image_path = "/home/zzx/SpongeBob/images" #存放图片文件夹
json_path = "/home/zzx/SpongeBob/labels" #存放json的文件夹
label_class = "/home/zzx/SpongeBob/class/" #用于存放标签分类,注意字符串最后面的 ‘/’
#提取两文件夹内容至列表,使用特殊方式使两列表顺序相同
list1 = os.listdir(image_path)
for json_name in os.listdir(json_path):
new_name = json_name.split(".")[0]
os.rename(os.path.join(json_path, json_name), os.path.join(json_path, new_name + '.jpg'))#根据图片后缀更改,这里要注意所有图片都必须是同一种后缀
list2 = os.listdir(json_path)
for json_name in os.listdir(json_path):
new_name = json_name.split(".")[0]
os.rename(os.path.join(json_path, json_name), os.path.join(json_path, new_name + '.json'))
u=0
'''
//循环变量简介
im : 原始图像信息
im1 : 截取后图像信息
json_data : json文件信息
o : 控制先创建x[],y[],然后依次写入值
x[] : 存放多边形的所有x轴坐标
y[] : 存放多边形的所有y轴坐标
r : 控制在执行crop操作时才能进行保存
'''
a = len(list1)
pbar = tqdm(total = a ) #进度条
for image_name , json_name in zip(list1,list2):#同时便利对应图片与json
pbar.update(1)
new_name = json_name.split(".")[0]
json_name = new_name + '.json'
im = Image.open(os.path.join(image_path,image_name))
with open(os.path.join(json_path,json_name), 'r') as file:
json_data = json.load(file)
mus=len(json_data["shapes"])#判断"shapes"字段的长度(多少个标签框)
u=u+mus
for i in range(mus):#遍历每一个标签框
o=0
label=json_data["shapes"][i]["label"]#拷贝标签类并进行分类
enl=len(json_data["shapes"][i]["points"]) #判断多少个坐标点
for p in range(enl):
if o==0:
x = [json_data["shapes"][i]["points"][p][0]]*mus*enl
y = [json_data["shapes"][i]["points"][p][1]]*mus*enl
x[o]=json_data["shapes"][i]["points"][p][0]
y[o]=json_data["shapes"][i]["points"][p][1]
o=o+1
#设置截取box框的面积范围
if (max(x) - min(x)) * (max(y) - min(y))<= 9999999:
im1 = im.crop((min(x), min(y), max(x), max(y)))
r=0
else:
r=1
if r==0:
#分类保存
if os.path.exists(label_class + label)==0:
os.mkdir(label_class + label)
im1.save(label_class + label + '/' + image_name.split(".")[0] + '_'+ str(i+1) + '.' + image_name.split(".")[1])
tqdm.write(str(u))#输出所有标签总数
'''
//全局变量简介
list1[] : 存放图片文件
list2[] : 存放json文件
u : 计算总标签数
a : 进度条长度
'''
三,应用
这是我的数据集中的其中一章
运行 (这里总共有24个标签,8个图片)
结果
这样就可以看到哪些标签错啦,在某些场合下还是比较实用滴
命名结构分析:例1_5.jpg,其中的 '1' 表示所在的图片名,'_5'表示第5个标签(顺序是按json文件中来的)