一,代码
我labels文件夹下全是标注好的json文件
import os
import json
folder_path = "/home/zzx/SpongeBob/labels"
size = 1 #这里推荐80
#设置查找范围(即重合率高于size者输出)
#对数据集进行正向排序
list1 = os.listdir(folder_path)
list1.sort(key= lambda x:x[:-5]) #左闭右开的取值规则,将除了后缀'.json'的其他字符按字符串正向排序
#下一行是另一种排序方式,因人而异
#list1.sort(key= lambda x:(x.split("_")[:-1],int(x.split("_")[-1][:-5]))) #我的数据格式为:123_aaa_bbb_1202.json
for file_name in list1:
if file_name.endswith('.json'):
json_file_path = os.path.join(folder_path, file_name)
with open(json_file_path, 'r') as file:
label_data = json.load(file)
mus=len(label_data['shapes']) #判断"shapes"字段的长度,即一个json文件中box的数量
for i in range(mus-1):
for j in range (i+1,mus):
o=0 #存放坐标值的控制变量,就是作为存放坐标值的数组的下标使用
sa=sb=ax=ay=bx=by=box=0
#用于语义分割,防止报错,不过没啥用
enl=len(label_data["shapes"][j]["points"]) #点的数量
if (len(label_data["shapes"][i]["points"])<=enl):
enl=len(label_data["shapes"][i]["points"])
for p in range(enl):
if o==0:
#初始化列表长度
xr1 = [label_data["shapes"][i]["points"][p][0]]*mus*enl
yr1 = [label_data["shapes"][i]["points"][p][1]]*mus*enl
xr2 = [label_data["shapes"][j]["points"][p][0]]*mus*enl
yr2 = [label_data["shapes"][j]["points"][p][1]]*mus*enl
#将box框的坐标归类
xr1[o]=label_data["shapes"][i]["points"][p][0] #放的都是r1的x值
yr1[o]=label_data["shapes"][i]["points"][p][1] #放的都是r1的y值,类推...
xr2[o]=label_data["shapes"][j]["points"][p][0]
yr2[o]=label_data["shapes"][j]["points"][p][1]
o=o+1
ax = max(min(xr1), min(xr2))
ay = max(min(yr1), min(yr2))
bx = min(max(xr1), max(xr2))
by = min(max(yr1), max(yr2))
sr1 = (max(xr1)-min(xr1))*(max(yr1)-min(yr1)) #r1面积
sr2 = (max(xr2)-min(xr2))*(max(yr2)-min(yr2)) #r2面积
box = (bx - ax) * (by - ay) #重合面积
if( (bx - ax) > 0 and (by - ay) > 0 and (box/(sr1+sr2-box))*100 > size):
print(file_name,end=' ')
print(f"{box/(sr1+sr2-box)*100:.2f}",'%')
'''
重合面积公式 = [min( R1_b_x , R2_b_x ) - max( R1_a_x , R2_a_x )] * [min( R1_b_y , R2_b_y) - max( R1_a_y , R2_a_y )] #参数请看下表
'''
二,公式
重合面积公式 = [min( R1_b_x , R2_b_x ) - max( R1_a_x , R2_a_x )] * [min( R1_b_y , R2_b_y) - max( R1_a_y , R2_a_y )] #参数请看下表
重合率(%):box/(R1+R2-box) * 100
三,应用
这里重合率设的是1%,推荐80%及以上.
有啥不懂的可以直接评论,代码写的不咋地请见谅.