Calculate distances for a pair of instances in the same frame or the same instance across frames#
import pandas as pd
import numpy as np
from google.colab import data_table
!pip install gradio
import gradio as gr
data_table.enable_dataframe_formatter()
CSV_FILE = '/content/mask_rcnn_tracking_results_with_segmenation.csv'
df = pd.read_csv(CSV_FILE)
df.head()
Calculate the distance of a pair of instances in a given frame#
def paired_distance(frame_number,
this_instance='Female_98',
other_instance='Male_109'):
df_dis = df[df["frame_number"]==frame_number][['cx','cy','instance_name']]
df_this = df_dis[df_dis.instance_name == this_instance]
df_other = df_dis[df_dis.instance_name == other_instance]
try:
dist = np.linalg.norm(df_this[['cx','cy']].values-df_other[['cx','cy']].values)
except:
dist = None
return dist
paired_distance(0,'Female_98','Male_109')
instance_names = list(df.instance_name.unique())
iface = gr.Interface(paired_distance,
[
gr.inputs.Number(),
gr.inputs.Dropdown(instance_names),
gr.inputs.Dropdown(instance_names),
],
[
gr.outputs.Label(label="Paired Distance"),
]
)
iface.launch()
Calculate the distance of the instance from the previous frame to the current frame#
def instance_distance_between_frame(frame_number,
instance_name='Female_86'):
if frame_number < 1:
return 0
previous_frame_number = frame_number - 1
df_dis = df[df["frame_number"]==frame_number][['cx','cy','instance_name']]
df_dis_prev = df[df["frame_number"]==previous_frame_number][['cx','cy','instance_name']]
df_dis = df_dis[df_dis.instance_name == instance_name]
df_dis_prev = df_dis_prev[df_dis_prev.instance_name == instance_name]
try:
dist = np.linalg.norm(df_dis[['cx','cy']].values-df_dis_prev[['cx','cy']].values)
except:
dist = None
return dist
df['dist_from_previous_frame_female_86'] = df.frame_number.apply(instance_distance_between_frame,instance_name='Female_86')
df['dist_from_previous_frame_female_86'].describe()
The total distance traveled for instance female_86 in in pixels#
df['dist_from_previous_frame_female_86'].sum()
df['dist_from_previous_frame_male_109']= df.frame_number.apply(instance_distance_between_frame, instance_name='Male_109')
df['dist_from_previous_frame_male_109'].sum()
df['dist_from_previous_frame_female_98']= df.frame_number.apply(instance_distance_between_frame, instance_name='Female_98')
df['dist_from_previous_frame_female_98'].sum()
import plotly.express as px
import plotly.graph_objects as go
fig = px.line(x=df.frame_number, y=df.dist_from_previous_frame_female_86, labels={'x':'frame_number', 'y':'dist from previous frame female_86'})
fig.show()
Distance between two instances e.g. female_98 and male_109 in pixels#
df['dist_frog__female_98_male_109'] = df.frame_number.apply(paired_distance)
fig = px.line(x=df.frame_number, y=df.dist_frog__female_98_male_109, labels={'x':'frame_number', 'y':'distance between frog male in tank 2 to frog female in tank 2'})
fig.show()