#!/usr/bin/env python # coding: utf-8 # In[1]: import pandas as pd from aggme.aggregation import IntervalAggregation from aggme.utils import AnnotationData, Visualizer from aggme.utils.processing import abc_intervals_to_template # # Loading data # In[2]: data = AnnotationData(markup_type='interval') # In[3]: df = pd.read_csv("./input_files/intervals_data.csv") df.head(3) # # Check and visualize the data # In[4]: data.load_markups(df, abc_intervals_to_template) group = data.groups[0] group # In[5]: vis_group = Visualizer(group) vis_group.draw(group) # # Aggregate # In[6]: aggregator = IntervalAggregation() # Total results of aggregation: # - Every failed step sends markup group to next method in this order `['hard', 'drop', 'soft']`, # - To make drop logic work, you shold have more than 3 markups on image and possibly a lower threshold/confidence value, # - Every markup, that failed all the methods goes to `['fail']`. # In[7]: data.load_markups(df, abc_intervals_to_template) results = aggregator.get_aggregation_results(data, threshold=0.7, confidence=0.8) # In[8]: results.keys() # In[9]: len(results['hard']), len(results['drop']), len(results['soft']), len(results['fail']) # In[10]: results # # Visualise results # Green color at the top of image shows that annotators are __correct__. Red color will be showing otherwise. # In[11]: # Example 0.1 # Overlap: 3 # Number of classes: 1 # Method: HARD # Result: GOOD method, group = aggregator.get_group_by_name(results, 'case_000_ov3_cl1') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[12]: # Example 0.2 # Overlap: 3 # Number of classes: 2 # Method: HARD # Result: GOOD method, group = aggregator.get_group_by_name(results, 'case_000_ov3_cl2') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[13]: # Example 1 # Overlap: 3 # Number of classes: 1 # Method: HARD # Result: BAD # # We had 3 markups on image, but user_3 added bad interval and the hard-method do not work. # We requested additional markup and hard-method worked. method, group = aggregator.get_group_by_name(results, 'case_001_ov3_cl1_bad_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) method, group = aggregator.get_group_by_name(results, 'case_001_ov4_cl1_bad_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[14]: # Example 2 # Overlap: 3 # Number of classes: 1 # Method: HARD # Result: BAD # # We had 3 markups on image, but user_3 added bad intervals and the hard-method do not work. # We requested additional markup and hard-method worked. method, group = aggregator.get_group_by_name(results, 'case_002_ov3_cl1_bad_intervals') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) method, group = aggregator.get_group_by_name(results, 'case_002_ov4_cl1_bad_intervals') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[15]: # Example 3 # Overlap: 3 # Number of classes: 1 # Method: SOFT # Result: GOOD # # We had 3 markups on image, but user_3 added extra interval and the hard-method do not work, but soft-method worked. # We requested additional markup and hard-method worked after dropping one error markup. method, group = aggregator.get_group_by_name(results, 'case_003_ov3_cl1_add_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) method, group = aggregator.get_group_by_name(results, 'case_003_ov4_cl1_add_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[16]: # Example 4 # Overlap: 3 # Number of classes: 1 # Method: SOFT # Result: GOOD # # We had 3 markups on image, but user_3 added extra small interval and the hard-method do not work, but soft-method worked. # We requested additional markup and hard-method worked after dropping one error markup. method, group = aggregator.get_group_by_name(results, 'case_004_ov3_cl1_add_small_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) method, group = aggregator.get_group_by_name(results, 'case_004_ov4_cl1_add_small_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[17]: # Example 5 # Overlap: 3 # Number of classes: 1 # Method: HARD # Result: BAD # # We had 3 markups on image, but user_3 added empty markup and the hard-method do not work. # We requested additional markup and hard-method worked. method, group = aggregator.get_group_by_name(results, 'case_005_ov3_cl1_rm_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) method, group = aggregator.get_group_by_name(results, 'case_005_ov4_cl1_rm_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[18]: # Example 6 # Overlap: 3 # Number of classes: 1 # Method: HARD # Result: GOOD # # We had 3 markups on image, but user_3 added other interval and the hard-method worked. # We requested additional markup and hard-method worked again. method, group = aggregator.get_group_by_name(results, 'case_006_ov3_cl1_other_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) method, group = aggregator.get_group_by_name(results, 'case_006_ov4_cl1_other_interval') original_group, result_group, accepted, rejected = group vis = Visualizer(original_group) vis.draw( data = original_group, result = result_group, accepted = accepted, rejected = rejected ) # In[ ]: