批量比较两个txt文件的内容

Posted stt-ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量比较两个txt文件的内容相关的知识,希望对你有一定的参考价值。

为了方便测试人员的测试,我们把检测到的数据保存在txt文件中,然后批量比较得出错误和遗漏的数据

txt 文件格式为下图所示,第一个值为类别,后四个为左上右下角坐标

技术图片

‘‘‘
@author: Shang Tongtong
@license: (C) Copyright 2019-present, SeetaTech, Co.,Ltd.
@contact: tongtong.shang@seetatech.com
@file: txt_test.py
@time: 19-7-19 上午10:49
@desc: 测试两张图片txt文件的类别是否一致以及框的iou
‘‘‘

import os
import numpy as np

def get_op(txt_path):     #把txt文件内容放到数组
    f = open(txt_path)
    boxes = []

    for linesp in f.readlines():
        boxes.append(linesp.split(\\n)[0])

    return boxes

def compute_iou(groud_truth, detect):
    """
    computing IoU
    :param groud_truth: (y0, x0, y1, x1), which reflects
            (top, left, bottom, right)
    :param detect: (y0, x0, y1, x1)
    :return: scala value of IoU
    """
    # computing area of each rectangles
    S_groud_truth = (groud_truth[2] - groud_truth[0]) * (groud_truth[3] - groud_truth[1])
    S_detect = (detect[2] - detect[0]) * (detect[3] - detect[1])

    # computing the sum_area
    sum_area = S_groud_truth + S_detect

    # find the each edge of intersect rectangle
    left_line = max(groud_truth[1], detect[1])
    right_line = min(groud_truth[3], detect[3])
    top_line = max(groud_truth[0], detect[0])
    bottom_line = min(groud_truth[2], detect[2])

    # judge if there is an intersect
    if left_line >= right_line or top_line >= bottom_line:
        return 0
    else:
        intersect = (right_line - left_line) * (bottom_line - top_line)
        return intersect / (sum_area - intersect)

def compare(gt_txt, de_txt):
    fn = 0
    fp = 0
    gt_count = len(open(gt_txt).readlines())   #txt文件的行数
    de_count = len(open(de_txt).readlines())
    if de_count < gt_count:
        fn += 1
        print(   +omit!!!!!!)

    for i in range(de_count):
        all_iou = []
        for j in range(gt_count):
            de_box = (get_op(de_txt)[i]).split()[1:5]
            de_box = list(map(int, de_box))     #数组中的字符串转为整型
            gt_box = (get_op(gt_txt)[j]).split()[1:5]
            gt_box = list(map(int, gt_box))
            iou = compute_iou(gt_box, de_box)
            all_iou.append(iou)
            j += 1
        num = np.argmax(np.max(all_iou))    #获得数组中最大值的下标
        de_name = (get_op(de_txt)[i]).split()[0]
        gt_name = (get_op(gt_txt)[i]).split()[num]
        #if (get_op(de_txt)[i])[0] != (get_op(gt_txt)[i])[num]:
        if de_name != gt_name:
            fp += 1
            print(     +error!!!!!!!! + gt_name +    is incorrectly  predicted   + de_name)
        i += 1
    return fn, fp


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

if __name__ == __main__:

    g_truth = r/home/stt/桌面/s/txt/
    detect = r/home/stt/桌面/s/txt2/
    fn = 0
    fp = 0

    gt_list = walk_dir(g_truth)
    for gt in gt_list:
        gt_txt = os.path.join(g_truth, gt)
        de_txt = os.path.join(detect, gt)
        print( is being detected.format(gt))
        a = compare(gt_txt, de_txt)
        fn += a[0]
        fp += a[1]
    print(The sum of fn is ,and the sum of fp is .format(fn, fp))

 

以上是关于批量比较两个txt文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

请教LINUX两个文件内容比较的写法

比较两个文件夹的批处理?

java生成批量txt文件

在UNIX shell编程里如何比较两个文件哪个修改的时间晚些!急谢谢!

Linux命令比较文件内容

如何在 TXT文档内容的 每一行批量加前缀