|
import pandas as pd |
|
import numpy as np |
|
import os |
|
import csv |
|
import math |
|
|
|
def sub_consist_attr(model,high=15,low=1): |
|
|
|
color_indices = [1, 2, 3, 4, 5, 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,57,58,59,63,65,68,70,71,73,75,76,77,78,79,80,81,83,98,99] |
|
color_indices += list(range(101, 161)) |
|
shape_indices = [64,22,23,24,25,26,27,28,29,30,31,32,33,34,35,72,74,84,85,86,87,92,94,95,100] + [161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175] |
|
texture_indices = [36,37,38,39,40,41,42,43,44,45,46,47,48,60,61,62,69,82,88,89,90,91,93,96,97] + list(range(176, 191)) |
|
human_indices = [49,50,51,52,53,54,55,56,66,67] + list(range(191, 201)) |
|
|
|
|
|
interval = high - low |
|
score = [] |
|
df = pd.read_csv(model) |
|
total_videos = df.shape[0] - 1 |
|
|
|
color = [] |
|
for i in color_indices: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
color.append((s-low)/interval) |
|
|
|
shape = [] |
|
for i in shape_indices: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
shape.append((s-low)/interval) |
|
texture = [] |
|
for i in texture_indices: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
texture.append((s-low)/interval) |
|
|
|
|
|
color_score = "{:.4f}".format(sum(color)/len(color)) |
|
shape_score = "{:.4f}".format(sum(shape)/len(shape)) |
|
texture_score = "{:.4f}".format(sum(texture)/len(texture)) |
|
|
|
print(model) |
|
print(len(color),len(shape),len(texture)) |
|
print(color_score, shape_score, texture_score) |
|
|
|
return color_score, shape_score, texture_score |
|
|
|
|
|
|
|
|
|
def sub_action(model,high=10,low=1): |
|
|
|
common_ind = list(range(1, 23)) + list(range(46, 101)) + list(range(101,184)) |
|
uncommon_ind = list(range(23, 46)) + list(range(184,201)) |
|
|
|
|
|
interval = high - low |
|
score = [] |
|
df = pd.read_csv(model) |
|
total_videos = df.shape[0] - 1 |
|
|
|
common = [] |
|
for i in common_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
common.append((s-low)/interval) |
|
|
|
uncommon = [] |
|
for i in uncommon_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
uncommon.append((s-low)/interval) |
|
|
|
|
|
common_score = "{:.4f}".format(sum(common)/len(common)) |
|
uncommon_score = "{:.4f}".format(sum(uncommon)/len(uncommon)) |
|
|
|
print(model) |
|
print(len(common),len(uncommon)) |
|
print(common_score,uncommon_score) |
|
|
|
return common_score,uncommon_score |
|
|
|
|
|
def sub_interaction(model,high=10,low=1): |
|
|
|
physical_ind = list(range(1, 50)) + list(range(101, 152)) |
|
social_ind = list(range(50, 101)) + list(range(152,201)) |
|
|
|
interval = high - low |
|
score = [] |
|
df = pd.read_csv(model) |
|
total_videos = df.shape[0] - 1 |
|
|
|
physical = [] |
|
for i in physical_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
physical.append((s-low)/interval) |
|
|
|
social = [] |
|
for i in social_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
social.append((s-low)/interval) |
|
|
|
|
|
|
|
physical_score = "{:.4f}".format(sum(physical)/len(physical)) |
|
social_score = "{:.4f}".format(sum(social)/len(social)) |
|
|
|
|
|
print(model) |
|
print(len(physical),len(social)) |
|
print(physical_score, social_score) |
|
|
|
return physical_score, social_score |
|
|
|
|
|
|
|
def sub_spatial(model): |
|
|
|
|
|
left_ind = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 88, 89, 90, 91, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 181, 182, 183, 184] |
|
right_ind = [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 92, 93, 94, 95, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 185, 186, 187, 188] |
|
above_ind = [29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 189, 190, 191] |
|
below_ind = [96, 97, 98, 99, 100, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 126, 192, 193, 194] |
|
front_ind = [58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 195, 196, 197] |
|
behind_ind = [72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 198, 199, 200] |
|
|
|
|
|
record = {} |
|
df = pd.read_csv(model) |
|
total_videos = df.shape[0] - 1 |
|
|
|
scores = df.iloc[:, -1].tolist() |
|
scores = scores[:200] |
|
|
|
left = [] |
|
for i in left_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
left.append(s) |
|
right = [] |
|
for i in right_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
right.append(s) |
|
|
|
above = [] |
|
for i in above_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
above.append(s) |
|
below = [] |
|
for i in below_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
below.append(s) |
|
|
|
front = [] |
|
for i in front_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
front.append(s) |
|
behind = [] |
|
for i in behind_ind: |
|
for j in range(total_videos): |
|
if df.iloc[j, 0][:4] == f"{i:04d}": |
|
s = float(df.iloc[j, -1]) |
|
behind.append(s) |
|
|
|
|
|
all_spatial = [left,right,above,below,front,behind] |
|
|
|
for i,left in enumerate(all_spatial): |
|
count_ge_0_4 = 0 |
|
count_gt_0_4 = 0 |
|
count_eq_0_4 = 0 |
|
|
|
|
|
scores_gt_0_4 = [] |
|
for s in left: |
|
if round(s,4) >= 0.4: |
|
count_ge_0_4 += 1 |
|
if round(s,4) > 0.4: |
|
count_gt_0_4 += 1 |
|
scores_gt_0_4.append(s) |
|
if round(s,4) == 0.4: |
|
count_eq_0_4 += 1 |
|
|
|
ge_percent = count_ge_0_4 / len(left) |
|
gt_percent = count_gt_0_4 / count_ge_0_4 |
|
gt_avg = sum(scores_gt_0_4) / len(scores_gt_0_4) |
|
eq_percent = count_eq_0_4 / count_ge_0_4 |
|
record[f"#{i+1}"] = [ge_percent,gt_percent,gt_avg,eq_percent,count_ge_0_4,count_gt_0_4,scores_gt_0_4,count_eq_0_4] |
|
|
|
|
|
left_count_ge_0_4 = record["#1"][4] |
|
left_count_gt_0_4 = record["#1"][5] |
|
left_scores_gt_0_4 = record["#1"][6] |
|
|
|
right_count_ge_0_4 = record["#2"][4] |
|
right_count_gt_0_4 = record["#2"][5] |
|
right_scores_gt_0_4 = record["#2"][6] |
|
|
|
left_right_ge_percent = (left_count_ge_0_4+right_count_ge_0_4) / (len(left)+len(right)) |
|
left_right_gt_percent = (left_count_gt_0_4+right_count_gt_0_4)/(left_count_ge_0_4+right_count_ge_0_4) |
|
left_right_gt_avg = (sum(left_scores_gt_0_4)+sum(right_scores_gt_0_4)) / (left_count_gt_0_4+right_count_gt_0_4) |
|
|
|
record["left_right"] = [round(left_right_ge_percent,4),round(left_right_gt_percent,4),round(left_right_gt_avg,4)] |
|
|
|
|
|
|
|
above_count_ge_0_4 = record["#3"][4] |
|
above_count_gt_0_4 = record["#3"][5] |
|
above_scores_gt_0_4 = record["#3"][6] |
|
|
|
below_count_ge_0_4 = record["#4"][4] |
|
below_count_gt_0_4 = record["#4"][5] |
|
below_scores_gt_0_4 = record["#4"][6] |
|
|
|
_2d_ge_percent = (left_count_ge_0_4 + right_count_ge_0_4 + above_count_ge_0_4 + below_count_ge_0_4) / (len(left)+len(right)+len(above)+len(below)) |
|
_2d_gt_percent = (left_count_gt_0_4 + right_count_gt_0_4 + above_count_gt_0_4 + below_count_gt_0_4)/(left_count_ge_0_4 + right_count_ge_0_4 + above_count_ge_0_4 + below_count_ge_0_4) |
|
_2d_gt_avg = (sum(left_scores_gt_0_4) + sum(right_scores_gt_0_4) + sum(above_scores_gt_0_4) + sum(below_scores_gt_0_4)) / (left_count_gt_0_4 + right_count_gt_0_4 + above_count_gt_0_4 + below_count_gt_0_4) |
|
|
|
record["2d"] = [f"{_2d_ge_percent:.0%}",f"{_2d_gt_percent:.0%}",round(_2d_gt_avg,4)] |
|
|
|
|
|
front_count_ge_0_4 = record["#5"][4] |
|
front_count_gt_0_4 = record["#5"][5] |
|
front_scores_gt_0_4 = record["#5"][6] |
|
|
|
behind_count_ge_0_4 = record["#6"][4] |
|
behind_count_gt_0_4 = record["#6"][5] |
|
behind_scores_gt_0_4 = record["#6"][6] |
|
|
|
|
|
_3d_ge_percent = (front_count_ge_0_4+behind_count_ge_0_4) / (len(front)+len(behind)) |
|
_3d_gt_percent = (front_count_gt_0_4+behind_count_gt_0_4)/(front_count_ge_0_4+behind_count_ge_0_4) |
|
_3d_gt_avg = (sum(front_scores_gt_0_4)+sum(behind_scores_gt_0_4)) / (front_count_gt_0_4+behind_count_gt_0_4) |
|
|
|
|
|
record["3d"] = [round(_3d_ge_percent,4),round(_3d_gt_percent,4),round(_3d_gt_avg,4)] |
|
|
|
|
|
print(model) |
|
print(len(left),len(right),len(above),len(below)) |
|
print(record["2d"]) |
|
coexist = record["2d"][0] |
|
acc = record["2d"][1] |
|
acc_score = record["2d"][2] |
|
|
|
return coexist, acc, acc_score |
|
|
|
|
|
|
|
|
|
def object_score(obj1_net_left,left_thresh,obj1_net_up,up_thresh,d_1): |
|
|
|
correct_direction = False |
|
|
|
W = 856 |
|
H = 480 |
|
|
|
score_tmp = 0 |
|
obj1_net_left = float(obj1_net_left)*100/W |
|
obj1_net_up = float(obj1_net_up)*100/H |
|
net_distance = math.sqrt(obj1_net_left**2+obj1_net_up**2) |
|
|
|
if d_1 == "left": |
|
if obj1_net_left>left_thresh: |
|
correct_direction = True |
|
|
|
elif d_1 == "right": |
|
if obj1_net_left<-left_thresh: |
|
correct_direction = True |
|
|
|
elif d_1 == "up": |
|
if obj1_net_up>up_thresh: |
|
correct_direction = True |
|
|
|
elif d_1 == "down": |
|
if obj1_net_up<-up_thresh: |
|
correct_direction = True |
|
|
|
else: |
|
print("direction not in [left, right, up, down]") |
|
|
|
return correct_direction,net_distance |
|
|
|
|
|
|
|
def sub_motion(model): |
|
|
|
|
|
left_thresh = 5 |
|
up_thresh = 5 |
|
|
|
distance = [] |
|
direction = [] |
|
|
|
with open(model, 'r') as file1: |
|
reader1 = csv.reader(file1) |
|
lines = list(reader1) |
|
vid_num = (len(lines)-1)//2 |
|
for i in range(vid_num): |
|
id = lines[i*2+1][0] |
|
d_1 = lines[i*2+1][3] |
|
d_2 = lines[i*2+2][5] |
|
obj1 = lines[i*2+1][2] |
|
obj2 = lines[i*2+2][4] |
|
obj1_net_left = lines[i*2+1][6] |
|
obj1_net_up = lines[i*2+1][7] |
|
obj2_net_left = lines[i*2+2][6] |
|
obj2_net_up = lines[i*2+2][7] |
|
correct_direction = False |
|
score_tmp = 0 |
|
|
|
if d_1!="" and d_2=="": |
|
if obj1_net_left != "": |
|
correct_direction,net_distance = object_score(obj1_net_left,left_thresh,obj1_net_up,up_thresh,d_1) |
|
distance.append(net_distance) |
|
direction.append(correct_direction) |
|
|
|
motion_level = sum(distance)/len(distance) |
|
acc = sum(direction)/len(direction) |
|
|
|
print(model) |
|
print(len(distance)) |
|
print(len(direction)) |
|
print(round(motion_level,2), f"{acc:.0%}",) |
|
|
|
|
|
return round(motion_level,2), f"{acc:.0%}" |
|
|
|
|
|
def read_score(model): |
|
with open(model, 'r') as file: |
|
reader = csv.reader(file) |
|
lines = list(reader) |
|
|
|
if lines[-1][0]=="score: " or lines[-1][0]=="Score: ": |
|
score = float(lines[-1][-1]) |
|
else: |
|
return "No score found" |
|
return round(score,4) |
|
|