一.简介
** 这片文章是使用数值查重误判率较高,而另一篇文章使用比例查重规避了很多缺点。
背景:
算法自动标注后的人为修改标签框;
数据标完后の突发奇想,写完试了一下还真的查出了10-30章重合比较严重的框(总章数为3千);
离谱的是真有百分百重合的box出现;
作用: 以json文件为引查找重合box并输出json文件名,几对重合则输出几遍文件名.
要点: 可以查找那种人们疏忽或难以发现的重合(例如100%重合并且正确的标签框在上层时);
ps:当然也可以查找50%重合率的,这要看你设置的查找范围.
缺点:
1.查找误判率较高;
2.适用于图像大小相近的数据集;
3.标框时点的顺序要对应,就比如说所有矩形的左上角是你点的第一个点,右下角是第二个;
4.box超小时,误判率较大(详细请看实例4);
二.代码
import os
import json
#查找重合box///
folder_path = "/home/Spongebob/Documents/labels" #指定json文件夹路径
size = 3 #设置查找范围 单位:像素
#我也不知道这个值代表啥,反正每对框都以下面这种形式计算
#注意不是两个框中心点的距离哦
#对数据集进行正向排序
list1 = os.listdir(folder_path)
list1.sort(key= lambda x:int(x[:-5])) #左闭右开的取值规则,将除了后缀'.json'的其他字符按数字正向排序
#遍历文件夹中的所有文件
for file_name in list1:
if file_name.endswith('.json'): #确保文件是JSON文件
json_file_path = os.path.join(folder_path, file_name)
#读取json文件
with open(json_file_path, 'r') as file:
label_data = json.load(file)
k=[None]*500 #设置存储空间
mus=len(label_data['shapes']) #判断"shapes"字段的长度,即一个json文件中box的数量
for i in range(mus-1):
for j in range (i+1,mus):
o=0 #存放差值的控制变量,就是作为存放差值的数组的下标使用
zhi=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): #遍历一个box中的所有点
for q in range(2): #每个点有两个坐标
k[o]=label_data["shapes"][i]["points"][p][q]-label_data["shapes"][j]["points"][p][q]
o=o+1
#以下为了缩小值,以便设置取值范围
for q in range(enl):
zhi+=abs(k[q]) #坐标轴的距离差所以这里要取绝对值,因此查找范围size不能是负数
if((zhi/enl)<size):
print(file_name)
三.应用
1.百分百重合:
2.包含试重合(这时我将查找范围调为30):
查找范围与图像的大小有关
3.多个重合输出多次(查找范围依然是30):
4.超小box(此时我将范围调至5)
放大后(可以注意到并没有重合):
但依旧被查了出来(2.json没了,这是因为超出了所给的范围值)
5.CV式语义分割类标签框