Groundtruth8个维度转成4个维度的方法(Python)

VOT2015以后groundtruth从4变为8的原因:
在使用vot数据集时一个令人疑惑的地方是,一般来说groundtruth由四个值(cx,cy,w,h)(矩形中心坐标加矩形长宽)或者(x,y,w,h)(左上角点坐标和长宽)四个数据进行表示即可,但是在vot数据集中每一个groundtruth确有8个数值。此时,四个角点确定的bounding box并不是与坐标轴平行的,是有一定旋转角度的矩形框。
所以如果需要使用轴对齐的bounding box(groundtruth为4个值),就需要对数据进行转化,github项目pysot(位于/pysot-master/utils/bbox.py)提供的代码如下:

def get_axis_aligned_bbox(region):
    # region = np.array([region[0][0][0], region[0][0][1], region[0][1][0], region[0][1][1],
    #                    region[0][2][0], region[0][2][1], region[0][3][0], region[0][3][1]])
    cx = np.mean(region[0::2])
    # print(cx)
    cy = np.mean(region[1::2])
    # print(cy)
    x1 = min(region[0::2])
    # print(x1)
    x2 = max(region[0::2])
    # print(x2)
    y1 = min(region[1::2])
    # print(y1)
    y2 = max(region[1::2])
    # print(y2)
    A1 = np.linalg.norm(region[0:2] - region[2:4]) * np.linalg.norm(region[2:4] - region[4:6])
    A2 = (x2 - x1) * (y2 - y1)
    s = np.sqrt(A1 / A2)
    w = s * (x2 - x1) + 1
    h = s * (y2 - y1) + 1
    return cx, cy, w, h

但是这种方法并不能直接用,于是我自己写了段代码,让他能被实现:

#自己的groundtruth.txt文件的路径
f = open("D:/vot2020/baby/groundtruth.txt",encoding = "utf-8")
regiont=f.read()
regiont=re.sub('[\n]',',',regiont)
b = list(regiont.split(","))
a=[]
t=0
for i in b[:-1]:
#插入数据
    a.append(float(i))
    t=t+1
    if t==8:
        region = np.array(a)
        c=str(get_axis_aligned_bbox(region))[1:-1]
# 将转换的结果储存的位置
        with open('D:/vot2020/baby/test_office.txt', 'a', encoding='utf-8') as file:
            file.write(c+'\n')
        t=0

顺利将:
Groundtruth8个维度转成4个维度的方法(Python)_第1张图片
转换为:
Groundtruth8个维度转成4个维度的方法(Python)_第2张图片

因为这里是一个一个seq里的groundtruth.txt文件发生变化,且txt文件里面保存的数据小数点位数太多,故而我做了以下改进:

import re

import numpy as np

def get_axis_aligned_bbox(region):
    # region = np.array([region[0][0][0], region[0][0][1], region[0][1][0], region[0][1][1],
    #                    region[0][2][0], region[0][2][1], region[0][3][0], region[0][3][1]])
    cx = round(np.mean(region[0::2]),1)
    # print(cx)
    cy = round(np.mean(region[1::2]),1)
    # print(cy)
    x1 = min(region[0::2])
    # print(x1)
    x2 = max(region[0::2])
    # print(x2)
    y1 = min(region[1::2])
    # print(y1)
    y2 = max(region[1::2])
    # print(y2)
    A1 = np.linalg.norm(region[0:2] - region[2:4]) * np.linalg.norm(region[2:4] - region[4:6])
    A2 = (x2 - x1) * (y2 - y1)
    s = np.sqrt(A1 / A2)
    w = round(s * (x2 - x1) + 1,1)
    h = round(s * (y2 - y1) + 1,1)
    return cx, cy,w, h

# seqlist_path='data/rgbt234.txt'
# with open(seqlist_path,'r') as fp:
#     seq_list = fp.read().splitlines()
# for i in seq_list:
#     print(i)
# 自己的groundtruth.txt文件的路径
seqlist_path='D:/vot2020/list.txt'
with open(seqlist_path,'r') as fp:
    seq_list = fp.read().splitlines()
for i in seq_list:
    print(i)
    f = open("D:/vot2020/"+i+"/groundtruth.txt",encoding = "utf-8")
    regiont=f.read()
    regiont=re.sub('[\n]',',',regiont)
    b = list(regiont.split(","))
    a=[]
    t=0
    for m in b[:-1]:
        #插入数据
        a.append(float(m))
        t=t+1
        if t==8:
            region = np.array(a)
            c=str(get_axis_aligned_bbox(region))[1:-1]
# 将转换的结果储存的位置
            with open("D:/vot2020/"+i+"/ground_truth.txt", 'a', encoding='utf-8') as file:
                file.write(c+'\n')
            t=0

这样直接执行一次就可以把所有的groundtruth.txt文件全部进行处理,且数据全改为保留一位小数:
Groundtruth8个维度转成4个维度的方法(Python)_第3张图片

参考CSDN:
1.VOT 数据集 groundtruth 8个维度 转成 4个维度的方法
2.VOT2016数据集groundtruth每行有八个数据的原因

你可能感兴趣的:(python中零星小知识,python,numpy,开发语言)