# Figure for Dev plot
fig1 = plt.figure(figsize=(8, 6))
# Figure for Eval plot
fig2 = plt.figure(figsize=(8, 6))
for name, baseline in baselines.items():
# Load the score files and fill in the angle associated to each camera
dev_scores = load_scores(baseline, 'P', 'dev')
eval_scores = load_scores(baseline, 'P', 'eval')
dev_scores['angle'] = dev_scores['probe_camera'].map(camera_to_angle)
eval_scores['angle'] = eval_scores['probe_camera'].map(camera_to_angle)
angles = []
dev_hters = []
eval_hters = []
# Run the analysis per view angle
for (angle, dev_df), (_, eval_df) in zip(dev_scores.groupby('angle'), eval_scores.groupby('angle')):
# Separate impostors from genuines
dev_impostors, dev_genuines = split(dev_df)
eval_impostors, eval_genuines = split(eval_df)
# Compute the min. HTER threshold on the Dev set
threshold = bob.measure.min_hter_threshold(dev_impostors['score'], dev_genuines['score'])
# Compute the HTER for the Dev and Eval set at this particular threshold
dev_far, dev_frr = bob.measure.farfrr(dev_impostors['score'], dev_genuines['score'], threshold)
eval_far, eval_frr = bob.measure.farfrr(eval_impostors['score'], eval_genuines['score'], threshold)
angles.append(angle)
dev_hters.append(1/2 * (dev_far + dev_frr))
eval_hters.append(1/2 * (eval_far + eval_frr))
# Update plots
plt.figure(1)
plt.plot(angles, dev_hters, label=name, marker='x')
plt.figure(2)
plt.plot(angles, eval_hters, label=name, marker='x')
# Plot finalization
plt.figure(1)
plt.title('Dev. min. HTER')
plt.xlabel('Angle')
plt.ylabel('Min HTER')
plt.legend()
plt.grid()
plt.figure(2)
plt.title('Eval. HTER @Dev min. HTER')
plt.xlabel('Angle')
plt.ylabel('HTER')
plt.legend()
plt.grid()