标签:pre 数据 items 元素 diff 种类 port class sans
浩哥写的代码只能看出哪张图片有检测错误,和漏的sku个数,然后需要写出哪张图片有漏检的代码。
通过处理两个txt文件夹内容就可。思想和代码如下
在数据归一化时会生成labels文件夹里面为每张图片的txt文件,内容为类别,sku坐标 e.g 7 0.3606770833333333 0.41481481481481486 0.2046875 0.362962962962963
darknet测试之后会生成resutls文件里面有每个类别对应的txt文件,内容为图片索引、置信度、sku坐标 e.g 000005 0.000097 984.295166 523.123413 1312.009277 856.477417
1.先处理labels文件,里面所有数据图片的txt,使用split_items_account_to_index.py脚本把测试集的图片txt文件分出来,
2.然后遍历文件得到所有图片种类别数,生成一个字典,键为图片索引名,值为此图片包含sku的类别列表 e.g {‘00005‘:[‘7‘, ‘7‘, ‘7‘]....}
3.再处理results文件,首先生成一个字典,键为所有测试图片的索引,值都是空列表,然后遍历results文件夹离得类别txt,如果置信度大于0.5时就把图片索引加到字典对应图片的列表中
4.两个字典进行对比,键相同的如果值列表内容也想同,那说明没有漏标,labels的列表中的内容是字符串,要转为整型,但是列表差集会把相同元素合并,这点无法满足我们的需求
所以使用两个for循环来进行比较,如果相同元素就把ground truth里的相同数值删除,循环时ground truth要放在内循环,因为外层for循环是按索引往下进行的
import os thresh = 0.5 #置信度 def walk_dir(*paths): x_list = [] for path in paths: for (root, dirs, files) in os.walk(path): files = sorted(files) for item in files: x_list.append(item) return x_list def walk_dir_list(*paths): x_list = [] for path in paths: for (root, dirs, files) in os.walk(path): files = sorted(files) for item in files: x_list.append(item.split(‘.‘)[0]) return x_list def makelist(pic): #制作一个字典,键为图片名索引,值为空列表 dict = {} for i, list_val in enumerate(pic): #print(i) dict[pic[i]] = [] #print(dict) return dict def results2list(i, txt, dic): #遍历results文件夹,把需要的数值填到空字典中 #print(dic) f = open(txt) for line in f.readlines(): a = [] a.append(line) if( float(a[0].split()[1]) > thresh ): dic[a[0].split()[0]].append(i) #a[0].split()[0].append(i) #print(dic) return dic def make_label_list(labels_dir): #遍历labels文件夹,文件名为字典键,值为列表,列表中为每张图片包含的满足置信度的类别id labels = walk_dir(labels_dir) dict = {} for lal in labels: l_txt = os.path.join(labels_dir, lal) f = open(l_txt) cls = [] for line in f.readlines(): name = lal.split(‘.‘)[0] cls.append(line.split()[0]) dict[name] = cls #print(dict) return dict def comparelist(classname, red, gt, de): #比较两个字典,从而找到漏的图片 results = walk_dir(red) for listname in results: diff = [] pic_num = listname.split(‘.‘)[0] print(‘detect ‘ + pic_num) gt1 = list(map(int, gt[pic_num])) de1 =de[pic_num] #print(gt1) #print(de[pic_num]) #diff = list(set(list(map(int, gt[pic_num])))-set(de[pic_num])) #print(‘omit‘ + diff) for i1 in de1: for i2 in gt1: if(i1 == i2): gt1.remove(i1) break if (gt1): for num in gt1: claname = classname[num] clan = claname.split(‘.‘)[0].split(‘_‘)[-1] print(‘------------------------------------‘) print(clan + ‘ omit!!!!!!!!!!!!!!!!!!‘) print(‘------------------------------------‘) if __name__ == ‘__main__‘: results_dir = r‘/home/stt/data/sp_test/results/‘ labels_dir = r‘/home/stt/data/sp_test/testlabels/‘ results = walk_dir(results_dir) pic = walk_dir_list(labels_dir) resdic = makelist(pic) #print(resdic) labelsdict = make_label_list(labels_dir) #print(labelsdict) i = 0 for txt in results: r_txt = os.path.join(results_dir, txt) x = results2list(i, r_txt, resdic) i += 1 #print(x) comparelist(results, labels_dir, labelsdict, x)
复现需要的文件如下链接: https://pan.baidu.com/s/1_owo4Dd7hlgWMMriYX3MFA 提取码: yqme 复制这段内容后打开百度网盘手机App,操作更方便哦
根据索引划分文件见下篇
标签:pre 数据 items 元素 diff 种类 port class sans
原文地址:https://www.cnblogs.com/stt-ac/p/11290703.html