Graph Error Test Cases (Non-Dividing)

To facilitate testing, we have provided a suite of canonical examples that cover the basic, simple scenarios that can occur in segmentation and tracking. Here we describe them and show visualizations of each case.

Metrics should test all the graph and division error cases that are possible with the matchers that the metric supports. For example, if the metric requires a one-to-one matching, it is not necessary to test the two-to-one or one-to-two cases.

plot_matched([ex_graphs.empty_gt()], "Empty Ground Truth")
../_images/dc7d833e2e06a6d1ab62faccf7e2187b143e15bd9679772ae70df165832b81ea.png
plot_matched([ex_graphs.empty_pred()], "Empty Prediction")
../_images/50feac6f9864b5aca8414f6b5beb7bab11ce08f8147ee6a765b2ff84fb8533e2.png
plot_matched([ex_graphs.good_matched()], "Good Matching")
../_images/6b9ff199dd737f66675c162732c2d2386cb2fdcdf87caadd0962fd51319811ba.png
plot_matched([ex_graphs.fn_node_matched(t) for t in [0, 1, 2]], "False Negative Node")
../_images/9b9da34cbb99fa828f04cbd7cf2fdd1dcbe521ed8457e17b6c3645906523f16a.png
plot_matched([ex_graphs.fn_edge_matched(t) for t in [0, 1]], "False Negative Edge")
../_images/bcbb7ac81a37b67128714a78f080580bfda5fc00382c5c13d4cf12531981c7f8.png
plot_matched([ex_graphs.fp_node_matched(t) for t in [0, 1, 2]], "False Positive Node")
../_images/974d935fc2fec2b419ae393bee468367b676c721dffd09d5b588e6736e154878.png
plot_matched([ex_graphs.fp_edge_matched(t) for t in [0, 1]], "False Positive Edge")
../_images/cb42dfce1140b61b4943df751cbe497beb4174b2017a964335256f950423c468.png
plot_matched([ex_graphs.crossover_edge()], "Crossover False Positive")
../_images/c3cc143840520120e8e83660f4d9b64f29c4e30f33b15d73c77fc0a8913e3ebf.png
plot_matched(
    [ex_graphs.node_two_to_one(t) for t in [0, 1, 2]],
    "Two GT nodes to one pred node",
)
../_images/e4da2281bbe46c03b789e844ee71abff173e5f72fdc2836fb2a873b5cf53a550.png
plot_matched(
    [ex_graphs.edge_two_to_one(t) for t in [0, 1]], "Two GT edges to one pred edge"
)
../_images/7fd34b68baba89c034a479f475b4b8749f2e910cb9c5ae70627900bce97a109c.png
plot_matched(
    [ex_graphs.node_one_to_two(t) for t in [0, 1, 2]],
    "One GT node to two pred nodes",
)
../_images/befeac49ad429d06eb0220ea5e89741b4231ff3904c007b8964cb9f660df55ca.png
plot_matched(
    [ex_graphs.edge_one_to_two(t) for t in [0, 1]], "One GT edge to 2 pred edges"
)
../_images/936c722083ab970093901b5cf9d9df154d024f803a0d5ca32558218f285f492e.png
plot_matched(
    [ex_graphs.gap_close_two_to_one()], "Two GT edges to one pred skip edge"
)
../_images/213ba8c5bf839234051b6f0cdcffaff634fad132e2b5259fa88e722450ab0400.png
plot_matched(
    [
        ex_graphs.gap_close_gt_gap(),
        ex_graphs.gap_close_pred_gap(),
        ex_graphs.gap_close_matched_gap(),
        ex_graphs.gap_close_offset(),
    ],
    "Skip edge cases",
)
../_images/cdec982c0b7234312058543252f364dc6478d40aef420454c8d48b0185440a59.png
plot_matched(
    [ex_graphs.all_basic_errors()],
    "All basic errors",
    figsize=(6, 2)
)
../_images/d63cc7b3b1079bcfbe3d2a246930c3a465b1847f1c91f8b2346eb446340ac2ed.png