json文件中查找重合标签框(使用比例查重)

一,代码

我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%及以上.

有啥不懂的可以直接评论,代码写的不咋地请见谅.

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值