darknet测试时找出哪张图片fn

浩哥写的代码只能看出哪张图片有检测错误,和漏的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,操作更方便哦

 

根据索引划分文件见下篇

 
posted @ 2019-08-02 19:09  pjc的乖宝宝  阅读(315)  评论(0编辑  收藏  举报