Home

Awesome

Yet Another Connected Components Labeling Benchmark

release license<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> contributors

<!-- ALL-CONTRIBUTORS-BADGE:END --> <table> <thead> <tr> <th>OS</th> <th>Build</th> <th>Compiler</th> <th>OpenCV</th> <th>CMake</th> <th>GPU</th> <!--<th width="200px">Travis CI</th>--> <th width="200px">GitHub Actions</th> <th width="200px">Jenkins</th> </tr> <thead> <tbody> <!-- <tr> <td align="center">Ubuntu<br/>16.04 LTS</td> <td align="center">x32</td> <td align="center">gcc 5.4.0</td> <td align="center">3.0.0</td> <td align="center">3.13.5</td> <td align="center">None</td> <td align="center"><a href="https://github.com/prittt/YACCLAB/actions"><img src="https://github.com/prittt/YACCLAB/workflows/linux32/badge.svg?branch=master" alt="Build Status"/></a></td> <td align="center">N/A</td> </tr> --> <tr> <td align="center">Ubuntu<br/>18.04 LTS</td> <td align="center">x64</td> <td align="center">gcc 9.3.0</td> <td align="center">4.1.2</td> <td align="center">3.13.5</td> <td align="center">None</td> <td align="center"><a href="https://github.com/prittt/YACCLAB/actions"><img src="https://github.com/prittt/YACCLAB/workflows/linux64/badge.svg?branch=master" alt="Build Status"/></a></td> <td align="center">N/A</td> </tr> <tr> <td align="center">MacOS<br/>(Darwin 19.6.0)</td> <td align="center">x64</td> <td align="center">AppleClang 12.0.0<br/>(Xcode-12)</td> <td align="center">3.1.0</td> <td align="center">3.13.0</td> <td align="center">None</td> <td align="center"><a href="https://github.com/prittt/YACCLAB/actions"><img src="https://github.com/prittt/YACCLAB/workflows/macos/badge.svg?branch=master" alt="Build Status"/></a></td> <td align="center">N/A</td> </tr> <tr> <td align="center">Ubuntu<br/>16.04 LTS</td> <td align="center">x64</td> <td align="center">gcc 5.4.0</td> <td align="center">4.4</td> <td align="center">3.10.3</td> <td align="center">2080Ti, CUDA 9.2</td> <td align="center">N/A</td> <td align="center"><a href="https://jenkins-master-deephealth-unix01.ing.unimore.it/job/YACCLAB/job/master/"><img src="https://jenkins-master-deephealth-unix01.ing.unimore.it/badge/job/YACCLAB/job/master/ubuntu16_gpu_end?" alt="Action Status"/></a></td> </tr> <tr> <td align="center">Ubuntu<br/>20.04.02 LTS</td> <td align="center">x64</td> <td align="center">gcc 9.3.0</td> <td align="center">4.4</td> <td align="center">3.10.3</td> <td align="center">2080Ti, CUDA 11.4</td> <td align="center">N/A</td> <td align="center"><a href="https://jenkins-master-deephealth-unix01.ing.unimore.it/job/YACCLAB/job/master/"><img src="https://jenkins-master-deephealth-unix01.ing.unimore.it/badge/job/YACCLAB/job/master/ubuntu20_gpu_end?" alt="Action Status"/></a></td> </tr> </tbody> </table> <p align="justify">Please include the following references when citing the YACCLAB project/dataset:</p> <p align="justify"> YACCLAB is an open source <i>C++</i> project that enables researchers to test CCL algorithms under extremely variable points of view, running and testing algorithms on a collection of datasets described below. The benchmark performs the following tests which will be described later in this readme: <i>correctness</i>, average run-time (<i>average</i>), average run-time with steps (<i>average_ws</i>), <i>density</i>, <i>size</i>, <i>granularity</i> and memory accesses (<i>memory</i>).

Notice that 8-connectivity is always used in the project.

</p>

Reproducible Research

<p align="justify">This project follows the Reproducible Research paradigms and received the <a href="https://github.com/RLPR">Reproducible Label in Pattern Recognition (RLPR)</a>.</p><img style="float: right;" src="/doc/EPDT/RRLPR.png">

Requirements

<p align="justify"> To correctly install and run YACCLAB following packages, libraries and utilities are needed:

GPU algorithms also require:

Notes for gnuplot:

</p>

Installation (refer to the image below)

Cmake

CMake Configuration Variables

NameMeaningDefault
YACCLAB_DOWNLOAD_DATASETwhether to automatically download the 2D YACCLAB dataset or notOFF
YACCLAB_DOWNLOAD_DATASET_3Dwhether to automatically download the 3D YACCLAB dataset or notOFF
YACCLAB_ENABLE_3Denable/disable the support for 3D algorithmsOFF
YACCLAB_ENABLE_CUDAenable/disable CUDA supportOFF
YACCLAB_ENABLE_EPDT_19Cenable/disable the EPDT_19C 3D algorithm which is based on a heuristic decision tree generated from a 3D mask with 19 conditions (may noticeably increase compilation time), it has no effect when YACCLAB_ENABLE_3D is OFFOFF
YACCLAB_ENABLE_EPDT_22Cenable/disable the EPDT_22C 3D algorithm which is based on a heuristic decision tree generated from a 3D mask with 22 conditions (may noticeably increase compilation time), it has no effect when YACCLAB_ENABLE_3D is OFFOFF
YACCLAB_ENABLE_EPDT_26Cenable/disable the EPDT_26C 3D algorithm which is based on a heuristic decision tree generated from a 3D mask with 26 conditions (may noticeably increase compilation time), it has no effect when YACCLAB_ENABLE_3D is OFFOFF
YACCLAB_FORCE_CONFIG_GENERATIONwhether to force the generation of the default configuration file (config.yaml) or not. When this flag is turned OFF any existing configuration file will not be overwrittenOFF
YACCLAB_INPUT_DATASET_PATHpath to the input dataset folder, where to find test datasets${CMAKE_INSTALL_PREFIX}/input
YACCLAB_OUTPUT_RESULTS_PATHpath to the output folder, where to save output results${CMAKE_INSTALL_PREFIX}/output
OpenCV_DIROpenCV installation path-

How to include a YACCLAB algorithm into your own project?

<p align="justify">If your project requires a Connected Components Labeling algorithm and you are not interested in the whole YACCLAB benchmark you can use the <i>connectedComponent</i> function of the OpenCV library which implements the BBDT and SAUF algorithms since version 3.2., Spaghetti Labeling algorithm and BKE (for GPU only) since version 4.6.</p> <p align="justify">Anyway, when the <i>connectedComponents</i> function is called, a lot of additional code will be executed together with the core function. If your project requires the best performance you can include an algorithm implemented in YACCLAB adding the following files to your project:</p> <ol> <li><i>labeling_algorithms.h</i> and <i>labeling_algorithms.cc</i> which define the base class from which every algorithm derives from;</li> <li><i>yacclab_tensor.h</i>, <i>yacclab_tensor.cc</i> which define input and output data tensors;</li> <li><i>label_solver.h</i> and <i>label_solver.cc</i> which cointain the implementation of labels solving algorithms;</li> <li><i>memory_tester.h</i>, <i>performance_evaluator.h</i>, <i>volume_util.h</i>, <i>volume_util.cc</i>, <i>utilities.h</i>, <i>utilities.cc</i>, <i>system_info.h</i>, <i>system_info.cc</i>, <i>check_labeling.h</i>, <i>check_labeling.cc</i>, <i>file_manager.h</i>, <i>file_manager.cc</i>, <i>stream_demultiplexer.h</i>, <i>config_data.h</i>, <i>register.h</i>, <i>yacclab_test.h</i>, <i>progress_bar.h</i>, <i>cuda_mat3.hpp</i>, <i>cuda_types3.hpp</i>, and <i>cuda_mat3.inl.hpp</i> just to make things work without changing the code;</li> <li><i>headers</i> and <i>sources</i> files of the required algorithm/s. The association between algorithms and headers/sources files is reported in the tables below.</li> </ol>

2D/3D CPU Algorithms

<table> <tr> <th>Algorithm Name</th> <th width="130">Authors</th> <th>Year</th> <th>Acronym</th> <th>Required Files</th> <th>Templated on Labels Solver</th> </tr> <tr> <td align="center">-</td> <td align="center">L. Di Stefano,<br>A. Bulgarelli <a href="#DiStefano">[3]</a></td> <td align="center">1999</td> <td align="center">DiStefano</td> <td align="center"><i>labeling_distefano_1999.h</i></td> <td align="center">❌</td> </tr> <tr> <td align="center">Contour Tracing</td> <td align="center">F. Chang,</br>C.J. Chen,</br>C.J. Lu <a href="#CT">[1]</a></td> <td align="center">1999</td> <td align="center">CT</td> <td align="center"><i>labeling_fchang_2003.h</i></td> <td align="center">❌</td> </tr> <tr> <td align="center">Run-Based Two-Scan</td> <td align="center">L. He,</br>Y. Chao,</br>K. Suzuki <a href="#RBTS">[30]</a></td> <td align="center">2008</td> <td align="center">RBTS</td> <td align="center"><i>labeling_he_2008.h</i></td> <td align="center"> ✔</td> </tr> <tr> <td align="center">Scan Array-based with Union Find</td> <td align="center">K. Wu,</br>E. Otoo,</br>K. Suzuki <a href="#SAUF">[6]</a></td> <td align="center">2009</td> <td align="center">SAUF</td> <td align="center"><i>labeling_wu_2009.h</i>, <i>labeling_wu_2009_tree.inc</i></td> <td align="center"> ✔</td> </tr> <tr> <td align="center">Stripe-Based Labeling Algorithm</td> <td align="center">H.L. Zhao,</br>Y.B. Fan,</br>T.X. Zhang,</br>H.S. Sang <a href="#SBLA">[8]</a></td> <td align="center">2010</td> <td align="center">SBLA</td> <td align="center"><i>labeling_zhao_2010.h</i></td> <td align="center">❌</td> </tr> <tr> <td align="center">Block-Based with Decision Tree</td> <td align="center">C. Grana,</br>D. Borghesani,</br>R. Cucchiara <a href="#BBDT">[4]</a></td> <td align="center">2010</td> <td align="center">BBDT</td> <td align="center"><i>labeling_grana_2010.h</i>, <i>labeling_grana_2010_tree.inc</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Configuration Transition Based</td> <td align="center">L. He,</br>X. Zhao,</br>Y. Chao,</br>K. Suzuki <a href="#CTB">[7]</a></td> <td align="center">2014</td> <td align="center">CTB</td> <td align="center"><i>labeling_he_2014.h</i>, <i>labeling_he_2014_graph.inc</i> <td align="center">✔</td> </tr> <tr> <td align="center">Block-Based with Binary Decision Trees</td> <td align="center">W.Y. Chang,</br>C.C. Chiu,</br>J.H. Yang <a href="#CCIT">[2]</a></td> <td align="center">2015</td> <td align="center">CCIT</td> <td align="center"><i>labeling_wychang_2015.h</i>, <i>labeling_wychang_2015_tree.inc</i>, <i>labeling_wychang_2015_tree_0.inc</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Light Speed Labeling</td> <td align="center">L. Cabaret,</br>L. Lacassagne,</br>D. Etiemble <a href="#LSL_STD">[5]</a></td> <td align="center">2016</td> <td align="center">LSL_STD<a href="#I"><sup>I</sup></a></br>LSL_STDZ<a href="#II"><sup>II</sup></a></br>LSL_RLE<a href="#III"><sup>III</sup></a></td> <td align="center"><i>labeling_lacassagne_2016.h</i>, <i>labeling_lacassagne_2016_code.inc</i></td> <td align="center">✔<a href="#IV"><sup>IV</sup></a></td> </tr> <tr> <td align="center">Pixel Prediction</td> <td align="center">C.Grana,</br>L. Baraldi,</br>F. Bolelli <a href="#PRED">[9]</a></td> <td align="center">2016</td> <td align="center">PRED</td> <td align="center"><i>labeling_grana_2016.h</i>, <i>labeling_grana_2016_forest.inc</i>, <i>labeling_grana_2016_forest_0.inc</i> <td align="center">✔</td> </tr> <tr> <td align="center">Directed Rooted Acyclic Graph</td> <td align="center">F. Bolelli,</br>L. Baraldi,</br>M. Cancilla,</br>C. Grana <a href="#DRAG">[23]</a></td> <td align="center">2018</td> <td align="center">DRAG</td> <td align="center"><i>labeling_bolelli_2018.h</i>, <i>labeling_grana_2018_drag.inc</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Spaghetti Labeling</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>L. Baraldi,</br>C. Grana <a href="#SPAGHETTI">[26]</a></td> <td align="center">2019</td> <td align="center">Spaghetti</td> <td align="center"><i>labeling_bolelli_2019.h</i>, <i>labeling_bolelli_2019_forest.inc</i>, <i>labeling_bolelli_2019_forest_firstline.inc</i>, <i>labeling_bolelli_2019_forest_lastline.inc</i>, <i>labeling_bolelli_2019_forest_singleline.inc</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">PRED++</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#DAG">[33]</a></td> <td align="center">2021</td> <td align="center">PREDpp</td> <td align="center"><i>labeling_PREDpp_2021.h</i>, <i>labeling_PREDpp_2021_center_line_forest_code.inc.h</i>, <i>labeling_PREDpp_2021_first_line_forest_code.inc.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Tagliatelle Labeling</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#DAG">[33]</a></td> <td align="center">2021</td> <td align="center">Tagliatelle</td> <td align="center"><i>labeling_tagliatelle_2021.h</i>, <i>labeling_tagliatelle_2021_center_line_forest_code.inc.h</i>, <i>labeling_tagliatelle_2021_first_line_forest_code.inc.h</i>, <i>labeling_tagliatelle_2021_last_line_forest_code.inc.h</i>, <i>labeling_tagliatelle_2021_single_line_forest_code.inc.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Bit-Run Two Scan</td> <td align="center">W. Lee,</br>F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#BRTS">[32]</a></td> <td align="center">2021</td> <td align="center">BRTS<a href="#VII"><sup>VII</sup></a></td> <td align="center"><i>labeling_lee_2021_brts.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Bit-Merge-Run Scan</td> <td align="center">W. Lee,</br>F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#BRTS">[32]</a></td> <td align="center">2021</td> <td align="center">BMRS<a href="#VII"><sup>VII</sup></a></td> <td align="center"><i>labeling_lee_2021_bmrs.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Null Labeling</td> <td align="center">F. Bolelli,</br>M. Cancilla,</br>L. Baraldi,</br>C. Grana <a href="#YACCLAB_JRTIP">[13]</a></td> <td align="center">-</td> <td align="center">NULL<a href="#V"><sup>V</sup></a></td> <td align="center"><i>labeling_null.h</i></td> <td align="center">❌</td> </tr> <tr style="border-top:5px solid black; !important"> <td align="center">SAUF 3D</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#DAG">[33]</a></td> <td align="center">2021</td> <td align="center">SAUF_3D</td> <td align="center"><i>labeling3D_SAUF_2021.h</i>, <i>labeling3D_SAUF_2021_tree_code.inc.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">SAUF++ 3D</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#DAG">[33]</a></td> <td align="center">2021</td> <td align="center">SAUFpp_3D</td> <td align="center"><i>labeling3D_SAUFpp_2021.h</i>, <i>labeling3D_SAUFpp_2021_tree_code.inc.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">PRED 3D</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#DAG">[33]</a></td> <td align="center">2021</td> <td align="center">PRED_3D</td> <td align="center"><i>labeling3D_PRED_2021.h</i>, <i>labeling3D_PRED_2021_center_line_forest_code.inc.h</i>, <i>labeling3D_PRED_2021_first_line_forest_code.inc.h</i>, <i>labeling3D_PRED_2021_last_line_forest_code.inc.h</i>, <i>labeling3D_PRED_2021_single_line_forest_code.inc.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">PRED++ 3D</td> <td align="center">F. Bolelli,</br>S. Allegretti,</br>C. Grana <a href="#DAG">[33]</a></td> <td align="center">2021</td> <td align="center">PREDpp_3D</td> <td align="center"><i>labeling3D_PREDpp_2021.h</i>, <i>labeling3D_PREDpp_2021_center_line_forest_code.inc.h</i>, <i>labeling3D_PREDpp_2021_first_line_forest_code.inc.h</i>, <i>labeling3D_PREDpp_2021_last_line_forest_code.inc.h</i>, <i>labeling3D_PREDpp_2021_single_line_forest_code.inc.h</i></td> <td align="center">✔</td> </tr> <tr> <td align="center">Entropy Partitioning Decision Tree <a href="https://github.com/prittt/YACCLAB/tree/master/doc/EPDT">RLPR</a></td> <td align="center">M. Söchting,</br>S. Allegretti,</br>F. Bolelli,</br>C. Grana <a href="#EPDT">[31]</a></td> <td align="center">2021</td> <td align="center">EPDT_19c and EPDT_22c<a href="#VI"><sup>VI</sup></a></td> <td align="center"><i>labeling3D_BBDT_2019.h</i>, <i>labeling_bolelli_2019_forest.inc</i>, <i>labeling_bolelli_2019_forest_firstline.inc</i>, <i>labeling_bolelli_2019_forest_lastline.inc</i>, <i>labeling_bolelli_2019_forest_singleline.inc</i></td> <td align="center">✔</td> </tr> </table>

<a name="I"><sup>I</sup></a> standard version. </br> <a name="II"><sup>II</sup></a> with zero-offset optimization. </br> <a name="III"><sup>III</sup></a> with RLE compression. </br> <a name="IV"><sup>IV</sup></a> only on TTA and UF. </br> <a name="V"><sup>V</sup></a> it only copies the pixels from the input image to the output one simply defining a lower bound limit for the execution time of CCL algorithms on a given machine and dataset.</br> <a name="VI"><sup>VI</sup></a> EPDT_19c and EPDT_22c algorithms are based on very big decision trees that translate to many lines of C++ code. They may thus noticeably increase the build time. For this reason, a special flag (YACCLAB_ENABLE_EPDT_ALGOS) to enable/disable such algorithms is provided in the CMake file. By default the flag is OFF.</br> <a name="VII"><sup>VII</sup></a> CCL algorithm for images in bitonal (1 bit per pixel) format. When applied to these algorithms, the <i>average</i> tests also consider the time for 1 byte to 1 bit per pixel conversion. On the other hand, when performing <i>average with steps</i> tests conversion time is ignored.

2D/3D GPU Algorithms

<table> <tr> <th>Algorithm Name</th> <th width="130">Authors</th> <th>Year</th> <th>Acronym</th> <th>Required Files</th> <th>2D/3D</th> </tr> <tr> <td align="center">Union Find</td> <td align="center">V. Oliveira,</br>R. Lotufo <a href="#UF">[18]</a></td> <td align="center">2010</td> <td align="center">UF</td> <td align="center"><i>labeling_oliveira_2010.cu</i></td> <td align="center">2D and 3D</td> </tr> <tr> <td align="center">Optimized</br>Label Equivalence</td> <td align="center">O. Kalentev,</br>A. Rai,</br>S. Kemnitz,</br>R. Schneider <a href="#OLE">[19]</a></td> <td align="center">2011</td> <td align="center">OLE</td> <td align="center"><i>labeling_kalentev_2011.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Block-run-based</td> <td align="center">P. Chen,</br>H.L. Zhao,</br>C. Tao,</br>H.S. Sang <a href="#BRB">[25]</a></td> <td align="center">2011</td> <td align="center">BRB</td> <td align="center"><i>labeling_chen_2011.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Stava</td> <td align="center">O. Stava,</br>B. Benes <a href="#STAVA">[38]</a></td> <td align="center">2011</td> <td align="center">STAVA</td> <td align="center"><i>labeling_stava_2011.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Rasmusson</td> <td align="center">A. Rasmusson,</br>T.S. Sørensen,</br>G. Ziegler <a href="#RASMUSSON">[37]</a></td> <td align="center">2013</td> <td align="center">RASMUSSON</td> <td align="center"><i>labeling_rasmusson_2013.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Accelerated CCL</td> <td align="center">F. N. Paravecino,</br>D. Kaeli <a href="#ACCL">[34]</a></td> <td align="center">2014</td> <td align="center">ACCL</td> <td align="center"><i>labeling_paravecino_2014.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">8-Directional Label Selection</td> <td align="center">Y. Soh,</br>H. Ashraf,</br>Y. Hae,</br>I. Kim <a href="#8DLS">[36]</a></td> <td align="center">2014</td> <td align="center">DLS</td> <td align="center"><i>labeling_soh_2014_8DLS.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Modified 8-Directional Label Selection</td> <td align="center">Y. Soh,</br>H. Ashraf,</br>Y. Hae,</br>I. Kim <a href="#8DLS">[36]</a></td> <td align="center">2014</td> <td align="center">M8DLS</td> <td align="center"><i>labeling_soh_2014_M8DLS.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Line-based Union-Find</td> <td align="center">K. Yonehara,</br>K. Aizawa <a href="#LBUF">[39]</a></td> <td align="center">2015</td> <td align="center">LBUF</td> <td align="center"><i>labeling_yonehara_2015.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Block Equivalence</td> <td align="center">S. Zavalishin,</br>I. Safonov,</br>Y. Bekhtin,</br>I. Kurilin <a href="#BE">[20]</a></td> <td align="center">2016</td> <td align="center">BE</td> <td align="center"><i>labeling_zavalishin_2016.cu</i></td> <td align="center">2D and 3D</td> </tr> <tr> <td align="center">Distanceless</br>Label Propagation</td> <td align="center">L. Cabaret,</br>L. Lacassagne,</br>D. Etiemble <a href="#DLP">[21]</a></td> <td align="center">2017</td> <td align="center">DLP</td> <td align="center"><i>labeling_cabaret_2017.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Komura Equivalence (8-conn)</td> <td align="center">S. Allegretti,</br>F. Bolelli,</br>M. Cancilla,</br>C. Grana <a href="#KE">[22]</a></td> <td align="center">2018</td> <td align="center">KE</td> <td align="center"><i>labeling_allegretti_2018.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Hardware Accelerated</br>4-connected</td> <td align="center">A. Hennequin,</br>L. Lacassagne,</br>L. Cabaret,</br>Q. Meunier <a href="#HA4">[35]</a></td> <td align="center">2018</td> <td align="center">HA4</td> <td align="center"><i>labeling_hennequin_2018_HA4.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Hardware Accelerated</br>8-connected</td> <td align="center">A. Hennequin,</br>L. Lacassagne,</br>L. Cabaret,</br>Q. Meunier <a href="#HA4">[35]</a></td> <td align="center">2018</td> <td align="center">HA8</td> <td align="center"><i>labeling_hennequin_2018_HA8.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">CUDA SAUF</td> <td align="center">S. Allegretti,</br>F. Bolelli,</br>M. Cancilla,</br>C. Grana <a href="#CAIP">[29]</a></td> <td align="center">2019</td> <td align="center">C-SAUF</td> <td align="center"><i>labeling_allegretti_2019_SAUF.cu</i>,</br><i>labeling_wu_2009_tree.inc</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">CUDA BBDT</td> <td align="center">S. Allegretti,</br>F. Bolelli,</br>M. Cancilla,</br>C. Grana <a href="#CAIP">[29]</a></td> <td align="center">2019</td> <td align="center">C-BBDT</td> <td align="center"><i>labeling_allegretti_2019_BBDT.cu</i>, <i>labeling_grana_2010_tree.inc</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">CUDA DRAG</td> <td align="center">S. Allegretti,</br>F. Bolelli,</br>M. Cancilla,</br>C. Grana <a href="#CAIP">[29]</a></td> <td align="center">2019</td> <td align="center">C-DRAG</td> <td align="center"><i>labeling_allegretti_2019_DRAG.cu</i></td> <td align="center">2D</td> </tr> <tr> <td align="center">Block-based Union Find</td> <td align="center">S. Allegretti,</br>F. Bolelli,</br>C. Grana <a href="#BUF_BKE">[24]</a></td> <td align="center">2019</td> <td align="center">BUF</td> <td align="center"><i>labeling_allegretti_2019_BUF.cu</i></td> <td align="center">2D and 3D</td> </tr> <tr> <td align="center">Block-based Komura Equivalence</td> <td align="center">S. Allegretti,</br>F. Bolelli,</br>C. Grana <a href="#BUF_BKE">[24]</a></td> <td align="center">2019</td> <td align="center">BKE</td> <td align="center"><i>labeling_allegretti_2019_BKE.cu</i></td> <td align="center">2D and 3D</td> </tr> </table>

Example of Algorithm Usage Outside the Benchmark

#include "labels_solver.h"
#include "labeling_algorithms.h"
#include "labeling_grana_2010.h" // To include the algorithm code (BBDT in this example)

#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    BBDT<UFPC> BBDT_UFPC; // To create an object of the desired algorithm (BBDT in this example)
                          // templated on the labels solving strategy. See the README for the
                          // complete list of the available labels solvers, available algorithms
                          // (N.B. non all the algorithms are templated on the solver) and their
                          // acronyms.

    BBDT_UFPC.img_ = imread("test_image.png", IMREAD_GRAYSCALE); // To load into the CCL object
                                                                 // the BINARY image to be labeled

    threshold(BBDT_UFPC.img_, BBDT_UFPC.img_, 100, 1, THRESH_BINARY); // Just to be sure that the
                                                                      // loaded image is binary

    BBDT_UFPC.PerformLabeling(); // To perform Connected Components Labeling!

    Mat1i output = BBDT_UFPC.img_labels_; // To get the output labeled image  
    unsigned n_labels = BBDT_UFPC.n_labels_; // To get the number of labels found in the input img

    return EXIT_SUCCESS;
}

<a name="conf"></a>

Configuration File

<p align="justify">A <tt>YAML</tt> configuration file placed in the installation folder lets you specify which kinds of tests should be performed, on which datasets and on which algorithms. Four categories of algorithms are supported: 2D CPU, 2D GPU, 3D CPU and 3D GPU. For each of them, the configuration parameters are reported below. </p>
execute:    true
perform:
  correctness:        false
  average:            true
  average_with_steps: false
  density:            false
  granularity:        false
  memory:             false
  blocksize:          false 
correctness_tests:
  eight_connectivity_standard:  true
  eight_connectivity_steps:     true
  eight_connectivity_memory:    true
  eight_connectivity_blocksize: true      
tests_number:
  average:            10
  average_with_steps: 10
  density:            10
  granularity:        10
algorithms:
  - SAUF_RemSP
  - SAUF_TTA
  - BBDT_RemSP
  - BBDT_UFPC
  - CT
  - labeling_NULL
<!-- - <i>check_datasets:</i> list of datasets on which CCL algorithms should be checked. - <i>average_datasets:</i> list of datasets on which average test should be run. - <i>average_ws_datasets:</i> list of datasets on which <i>average_ws</i> test should be run. - <i>memory_datasets:</i> list of datasets on which memory test should be run. -->
...
average_datasets: ["3dpes", "fingerprints", "hamlet", "medical", "mirflickr", "tobacco800", "xdocs"]
...
blocksize:
  x: [2, 64, 2]
  y: [2, 64, 2]
  z: [2, 64, 2]
<p style=text-align: justify;>Finally, the following configuration parameters are common to all categories.</p>
paths: {input: "<datasets_path>", output: "<output_results_path>"}
write_n_labels: false
color_labels: {average: false, density: false}
save_middle_tests: {average: false, average_with_steps: false, density: false, granularity: false}

How to Extend YACCLAB with New Algorithms

<p align="justify">YACCLAB has been designed with extensibility in mind, so that new resources can be easily integrated into the project. A CCL algorithm is coded with a <tt>.h</tt> header file (placed in the <tt>include</tt> folder), a <tt>.cc</tt> source file (placed in the <tt>src</tt> folder), and optional additional files containing a tree/drag definition (placed in the <tt>include</tt> folder).</p>

The source file should be as follows:

#include "<header_file_name>.h"

REGISTER_LABELING_WITH_EQUIVALENCES_SOLVERS(<algorithm_name>);
// Replace the above line with "REGISTER_LABELING(<algorithm_name>);" if the algorithm
// is not template on the equivalence solver algorithm.

The header file should follows the structure below (see <tt>include/labeling_bolelli_2018.h</tt> to have a complete example):


// [...]

template <typename LabelsSolver> // Remove this line if the algorithm is not template 
                                 // on the equivalence solver algorithm
class <algorithm_name> : public Labeling2D<Connectivity2D::CONN_8> { // the class must extend one of the labeling
                                                     // classes Labeling2D, Labeling3D, .. that
                                                     // are template on the connectivity type
                                                    
public:
    <algorithm_name>() {}

    // This member function should implement the labeling procedure reading data from the
    // input image "img_" (OpenCV Mat1b) and storing labels into the output one "img_labels_"
    // (OpenCV Mat1i)
    void PerformLabeling()
    {
      // [...]

      LabelsSolver::Alloc(UPPER_BOUND_8_CONNECTIVITY); // Memory allocation of the labels solver
      LabelsSolver::Setup(); // Labels solver initialization

      // [...]
      
      LabelsSolver::GetLabel(<label_id>) // To get label value from its index
      LabelsSolver::NewLabel(); // To create a new label

      LabelsSolver::Flatten(); // To flatten the equivalence solver array
    }

    // This member function should implement the with step version of the labeling procedure.
    // This is required to perform tests with steps.
    void PerformLabelingWithSteps()
    {

      double alloc_timing = Alloc(); // Alloc() should be a member function responsible
                                     // for memory allocation of the required data structures

      perf_.start();
      FirstScan(); // FirsScan should be a member function that implements the 
                   // first scan step of the algorithm (if it has one)
      perf_.stop();
      perf_.store(Step(StepType::FIRST_SCAN), perf_.last());

      perf_.start();
      SecondScan(); // SecondScan should be a member function that implements the 
                    // second scan step of the algorithm (if it has one)
      perf_.stop();
      perf_.store(Step(StepType::SECOND_SCAN), perf_.last());

      // If the algorithm does not have a distinct firs and second scan replace the lines
      // above with the following ones:
      // perf_.start();
      // AllScans(); // AllScans() should be a member function which implements the entire
                     // algorithm but the allocation/deallocation 
      // perf_.stop();
      // perf_.store(Step(StepType::ALL_SCANS), perf_.last());

      perf_.start();
      Dealloc(); // Dealloc() should be a member function responsible for memory
                 // deallocation.
      perf_.stop();
      perf_.store(Step(StepType::ALLOC_DEALLOC), perf_.last() + alloc_timing);

      // [...]
    }

    // This member function should implement the labeling procedure using the OpenCV Mat
    // wrapper (MemMat) implemented by YACCLAB 
    void PerformLabelingMem(std::vector<uint64_t>& accesses){
      // [...]
    }

}

When implementing a GPU algorithm only the <tt>.cu</tt> file is required. The file should be placed in the <tt>cuda/src</tt> folder. The general structure of a GPU algorithm is the following:


// [...]

// Kernel definitions:

__global__ void <kernel_name_1>(...)
{
  ...
}

__global__ void <kernel_name_2>(...)
{
  ...
}
                                 
class <algorithm_name> : public GpuLabeling2D<Connectivity2D::CONN_8> { // the class must extend one of the labeling
                                                     // classes GpuLabeling2D, GpuLabeling3D, .. that
                                                     // are template on the connectivity type
                                                    
public:
    <algorithm_name>() {}

    // This member function should implement the labeling procedure reading data from the
    // input image "d_img_" (OpenCV cuda::GpuMat) and storing labels into the output one "d_img_labels_"
    // (OpenCV cuda::GpuMat)
    void PerformLabeling()
    {
      // Create the output image
      d_img_labels_.create(d_img_.size(), CV_32SC1);

      // [...]

      // Call necessary kernels
      <kernel_name_1> <<<...>>> (...);

      <kernel_name_2> <<<...>>> (...);

      // [...]
      
      // Wait for the end of the last kernel
      cudaDeviceSynchronize();
    }

    // This member function should implement the with step version of the labeling procedure.
    // This is required to perform tests with steps.
    void PerformLabelingWithSteps()
    {

      double alloc_timing = Alloc(); // Alloc() should be a member function responsible
                                     // for memory allocation of the required data structures

      perf_.start();
      FirstScan(); // FirsScan should be a member function that implements the 
                   // first scan step of the algorithm (if it has one)
      perf_.stop();
      perf_.store(Step(StepType::FIRST_SCAN), perf_.last());

      perf_.start();
      SecondScan(); // SecondScan should be a member function that implements the 
                    // second scan step of the algorithm (if it has one)
      perf_.stop();
      perf_.store(Step(StepType::SECOND_SCAN), perf_.last());

      // If the algorithm does not have a distinct first and second scan replace the lines
      // above with the following ones:
      // perf_.start();
      // AllScans(); // AllScans() should be a member function which implements the entire
                     // algorithm but the allocation/deallocation 
      // perf_.stop();
      // perf_.store(Step(StepType::ALL_SCANS), perf_.last());

      perf_.start();
      Dealloc(); // Dealloc() should be a member function responsible for memory
                 // deallocation.
      perf_.stop();
      perf_.store(Step(StepType::ALLOC_DEALLOC), perf_.last() + alloc_timing);

      // [...]
    }

    void PerformLabelingBlocksize(int x, int y, int z)
    {
      // Create the output image
      d_img_labels_.create(d_img_.size(), CV_32SC1);

      // [...]

      // Call necessary kernels through a macro that measures times separately
      BLOCKSIZE_KERNEL(<kernel_name_1>, <grid_size>, <block_size>, <dynamic_shared_mem>, <arguments>...);

      BLOCKSIZE_KERNEL(<kernel_name_2>, <grid_size>, <block_size>, <dynamic_shared_mem>, <arguments>...);

      // [...]
    }

}

REGISTER_LABELING(<algorithm_name>);

// Only necessary for blocksize test
REGISTER_KERNELS(<algorithm_name>, <kernel_name_1>, <kernel_name_2>, ...);

<p align="justify">Once an algorithm has been added to YACCLAB, it is ready to be tested and compared to the others. Don't forget to update the configuration file! We look at YACCLAB as a growing effort towards better reproducibility of CCL algorithms, so implementations of new and existing labeling methods are very welcome.</p>

<a name="datasets"></a>

The YACCLAB Dataset

<p align="justify">The YACCLAB dataset includes both synthetic and real images and it is suitable for a wide range of applications, ranging from document processing to surveillance, and features a significant variability in terms of resolution, image density, variance of density, and number of components. All images are provided in 1 bit per pixel PNG format, with 0 (black) being background and 1 (white) being foreground. The dataset will be automatically downloaded by CMake during the installation process as described in the <a href="#inst">installation</a> paragraph.</p>

2D Datasets

<table> <tr> <td align="center"><img src="doc/sample_2D_datasets.png"></td> </tr> <tr> <td >Samples of the YACCLAB 2D (real) datasets. From left to right: 3DPeS, Fingerprints, Medical, MIRflickr, Tobacco800, XDOCS, Hamlet.</td> </tr> </table> <table> <tr> <td align="center"><img src="doc/granularity_2D_datasets.png"></td> </tr> <tr> <td>Samples of the YACCLAB 2D granularity dataset: reported images have a foreground density of 30% and, from left to right, granularities are 1, 2, 4, 6, 8, 12, 14, 16.</td> </tr> </table>

3D Datasets

<table style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;"> <tr> <td align="center"><img src="doc/sample_3D_datasets.png"></td> </tr> <tr> <td>Samples of the YACCLAB 3D datasets. From left to right we have the Hilbert space-filling curve, the OASIS dataset and Mitochondria medical imaging data.</td> </tr> </table> <table style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;"> <tr> <td align="center"><img src="doc/granularity_3D_datasets.png" ></td> </tr> <tr> <td>Samples of the YACCLAB 3D granularity dataset: reported images have a foreground density of 2% and, from left to right, granularities are 4, 8, 16.</td> </tr> </table>

<a name="tests"></a>

Available Tests

<a name="blocksize_test"></a>

Examples of YACCLAB Output Results

<table> <tr> <td align="center"><img src="doc/fingerprints.png"/></td> <td align="center"><img src="doc/xdocs.png"/></td> </tr> <tr> <td align="center">Fingerprints</td> <td align="center">XDOCS</td> </tr> </table>

Contributors

Thanks goes to these wonderful people (emoji key):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tr> <td align="center"><a href="http://www.federicobolelli.it"><img src="https://avatars3.githubusercontent.com/u/6863130?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Federico Bolelli</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/commits?author=prittt" title="Code">💻</a> <a href="#projectManagement-prittt" title="Project Management">📆</a> <a href="#maintenance-prittt" title="Maintenance">🚧</a> <a href="#infra-prittt" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-prittt" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://github.com/stal12"><img src="https://avatars2.githubusercontent.com/u/34423515?v=1?s=100" width="100px;" alt=""/><br /><sub><b>Stefano Allegretti</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/commits?author=stal12" title="Code">💻</a> <a href="#maintenance-stal12" title="Maintenance">🚧</a> <a href="https://github.com/prittt/YACCLAB/issues?q=author%3Astal12" title="Bug reports">🐛</a> <a href="#ideas-stal12" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-stal12" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> <td align="center"><a href="https://github.com/CostantinoGrana"><img src="https://avatars2.githubusercontent.com/u/18437151?v=1?s=100" width="100px;" alt=""/><br /><sub><b>Costantino Grana</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/commits?author=CostantinoGrana" title="Code">💻</a> <a href="#projectManagement-CostantinoGrana" title="Project Management">📆</a> <a href="#ideas-CostantinoGrana" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-CostantinoGrana" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td> <td align="center"><a href="https://michelecancilla.github.io"><img src="https://avatars1.githubusercontent.com/u/22983812?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michele Cancilla</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/commits?author=MicheleCancilla" title="Code">💻</a> <a href="#platform-MicheleCancilla" title="Packaging/porting to new platform">📦</a> <a href="#maintenance-MicheleCancilla" title="Maintenance">🚧</a></td> <td align="center"><a href="http://www.lorenzobaraldi.com"><img src="https://avatars3.githubusercontent.com/u/8173533?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lorenzo Baraldi</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/commits?author=baraldilorenzo" title="Code">💻</a> <a href="#platform-baraldilorenzo" title="Packaging/porting to new platform">📦</a></td> <td align="center"><a href="http://msoechting.de"><img src="https://avatars1.githubusercontent.com/u/6423697?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maximilian Söchting</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/commits?author=msoechting" title="Code">💻</a></td> </tr> <tr> <td align="center"><a href="https://github.com/patrickhwood"><img src="https://avatars.githubusercontent.com/u/2100827?v=4?s=100" width="100px;" alt=""/><br /><sub><b>patrickhwood</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/issues?q=author%3Apatrickhwood" title="Bug reports">🐛</a></td> <td align="center"><a href="https://github.com/fengweichangzi"><img src="https://avatars.githubusercontent.com/u/87119815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>WalnutVision</b></sub></a><br /><a href="https://github.com/prittt/YACCLAB/issues?q=author%3Afengweichangzi" title="Bug reports">🐛</a></td> </tr> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the all-contributors specification. Contributions of any kind welcome.

References

<table style="border:0;"> <tr> <td style="vertical-align: top !important;" align="right"> <a name="CT">[1]</a> </td> <td> <p align="justify">F. Chang, C.-J. Chen, and C.-J. Lu, “A linear-time component-labeling algorithm using contour tracing technique,” Computer Vision and Image Understanding, vol. 93, no. 2, pp. 206–220, 2004.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="CCIT">[2]</a> </td> <td> <p align="justify">W.-Y. Chang, C.-C. Chiu, and J.-H. Yang, “Block-based connected-component labeling algorithm using binary decision trees,” Sensors, vol. 15, no. 9, pp. 23 763–23 787, 2015.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="DiStefano">[3]</a> </td> <td> <p align="justify"> L. Di Stefano and A. Bulgarelli, “A Simple and Efficient Connected Components Labeling Algorithm,” in International Conference on Image Analysis and Processing. IEEE, 1999, pp. 322–327.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="BBDT">[4]</a> </td> <td> <p align="justify">C. Grana, D. Borghesani, and R. Cucchiara, “Optimized Block-based Connected Components Labeling with Decision Trees,” IEEE Transac-tions on Image Processing, vol. 19, no. 6, pp. 1596–1609, 2010.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="LSL_STD">[5]</a> </td> <td> <p align="justify">L. Lacassagne and B. Zavidovique, “Light speed labeling: efficient connected component labeling on risc architectures,” Journal of Real-Time Image Processing, vol. 6, no. 2, pp. 117–135, 2011.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="SAUF">[6]</a> </td> <td> <p align="justify"> K. Wu, E. Otoo, and K. Suzuki, "Optimizing two-pass connected-component labeling algorithms,” Pattern Analysis and Applications," vol. 12, no. 2, pp. 117–135, 2009.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="CTB">[7]</a> </td> <td> <p align="justify">L. He, X. Zhao, Y. Chao, and K. Suzuki, "Configuration-Transition-Based Connected-Component Labeling", IEEE Transactions on Image Processing, vol. 23, no. 2, pp. 943–951, 2014.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="SBLA">[8]</a> </td> <td> <p align="justify">H. Zhao, Y. Fan, T. Zhang, and H. Sang, "Stripe-based connected components labelling," Electronics letters, vol. 46, no. 21, pp. 1434–1436, 2010.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="PRED">[9]</a> </td> <td> <p align="justify">C. Grana, L. Baraldi, and F. Bolelli, "Optimized Connected Components Labeling with Pixel Prediction," in Advanced Concepts for Intelligent Vision Systems, 2016, pp. 431-440.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="MIRFLICKR">[10]</a> </td> <td> <p align="justify">M. J. Huiskes and M. S. Lew, “The MIR Flickr Retrieval Evaluation,” in MIR ’08: Proceedings of the 2008 ACM International Conference on Multimedia Information Retrieval. New York, NY, USA: ACM, 2008.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="TOBACCO1">[11]</a> </td> <td> <p align="justify">G. Agam, S. Argamon, O. Frieder, D. Grossman, and D. Lewis, “The Complex Document Image Processing (CDIP) Test Collection Project,” Illinois Institute of Technology, 2006.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="TOBACCO2">[12]</a> </td> <td> <p align="justify"> D. Lewis, G. Agam, S. Argamon, O. Frieder, D. Grossman, and J. Heard, “Building a test collection for complex document information processing,” in Proceedings of the 29th annual international ACM SIGIR conference on Research and development in information retrieval. ACM, 2006, pp. 665–666.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="YACCLAB_JRTIP">[13]</a> </td> <td> <p align="justify">F. Bolelli, M. Cancilla, L. Baraldi, C. Grana, "Towards Reliable Experiments on the Performance of Connected Components Labeling Algorithms," Journal of Real-Time Image Processing, 2018.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="3DPES">[14]</a> </td> <td> <p align="justify">D. Baltieri, R. Vezzani, and R. Cucchiara, “3DPeS: 3D People Dataset for Surveillance and Forensics,” in Proceedings of the 2011 joint ACM workshop on Human gesture and behavior understanding. ACM, 2011, pp. 59–64.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="MEDICAL">[15]</a> </td> <td> <p align="justify">F. Dong, H. Irshad, E.-Y. Oh, M. F. Lerwill, E. F. Brachtel, N. C. Jones, N. W. Knoblauch, L. Montaser-Kouhsari, N. B. Johnson, L. K. Rao et al., “Computational Pathology to Discriminate Benign from Malignant Intraductal Proliferations of the Breast,” PloS one, vol. 9, no. 12, p. e114885, 2014.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="FINGERPRINTS">[16]</a> </td> <td> <p align="justify">D. Maltoni, D. Maio, A. Jain, and S. Prabhakar, "Handbook of fingerprint recognition", Springer Science & Business Media, 2009.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="YACCLAB">[17]</a> </td> <td> <p align="justify">C.Grana, F.Bolelli, L.Baraldi, and R.Vezzani, "YACCLAB - Yet Another Connected Components Labeling Benchmark," Proceedings of the 23rd International Conference on Pattern Recognition, Cancun, Mexico, 4-8 Dec 2016, 2016.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="UF">[18]</a> </td> <td> <p align="justify">V. Oliveira and R. Lotufo, "A study on connected components labeling algorithms using GPUs," in SIBGRAPI. vol. 3, p. 4, 2010.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="OLE">[19]</a> </td> <td> <p align="justify">O. Kalentev, A. Rai, S. Kemnitz, R. Schneider," Connected component labeling on a 2D grid using CUDA," in Journal of Parallel and Distributed Computing 71(4), 615–620, 2011.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="BE">[20]</a> </td> <td> <p align="justify">S. Zavalishin, I. Safonov, Y. Bekhtin, I. Kurilin, "Block Equivalence Algorithm for Labeling 2D and 3D Images on GPU," in Electronic Imaging 2016(2), 1–7, 2016.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="DLP">[21]</a> </td> <td> <p align="justify">L. Cabaret, L. Lacassagne, D. Etiemble, "Distanceless Label Propagation: an Efficient Direct Connected Component Labeling Algorithm for GPUs," in Seventh International Conference on Image Processing Theory, Tools and Applications, IPTA, 2017.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="KE">[22]</a> </td> <td> <p align="justify">S. Allegretti, F. Bolelli, M. Cancilla, C. Grana, "Optimizing GPU-Based Connected Components Labeling Algorithms," in Third IEEE International Conference on Image Processing, Applications and Systems, IPAS, 2018.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="DRAG">[23]</a> </td> <td> <p align="justify">F. Bolelli, L. Baraldi, M. Cancilla, C. Grana, "Connected Components Labeling on DRAGs," in International Conference on Pattern Recognition, 2018, pp. 121-126.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="BUF_BKE">[24]</a> </td> <td> <p align="justify">S. Allegretti, F. Bolelli, C. Grana, "Optimized Block-Based Algorithms to Label Connected Components on GPUs," in IEEE Transactions on Parallel and Distributed Systems, 2019.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="BRB">[25]</a> </td> <td> <p align="justify"> P. Chen, H. Zhao, C. Tao, H. Sang, "Block-run-based connected component labelling algorithm for gpgpu using shared memory." Electronics Letters, 2011</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="SPAGHETTI">[26]</a> </td> <td> <p align="justify">F. Bolelli, S. Allegretti, L. Baraldi, and C. Grana, "Spaghetti Labeling: Directed Acyclic Graphs for Block-Based Bonnected Components Labeling," IEEE Transactions on Image Processing, vol. 29, no. 1, pp. 1999-2012, 2019.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="OASIS">[27]</a> </td> <td> <p align="justify">D. S. Marcus, A. F. Fotenos, J. G. Csernansky, J. C. Morris, R. L. Buckner, “Open Access Series of Imaging Studies (OASIS): Longitudinal MRI Data in Nondemented and Demented OlderAdults,” J. Cognitive Neurosci., vol. 22, no. 12, pp. 2677–2684, 2010.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="MIT1">[28]</a> </td> <td> <p align="justify">A. Lucchi, Y. Li, and P. Fua, “Learning for Structured Prediction Using Approximate Subgradient Descent with Working Sets,” in Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2013, pp. 1987–1994.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="CAIP">[29]</a> </td> <td> <p align="justify">S. Allegretti, F, Bolelli, M. Cancilla, F. Pollastri, L. Canalini, C. Grana, "How does Connected Components Labeling with Decision Trees perform on GPUs?," In 18th International Conference on Computer Analysis of Images and Patterns, 2019.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="RBTS">[30]</a> </td> <td> <p align="justify"> L. He, Y. Chao, K. Suzuki. "A run-based two-scan labeling algorithm." IEEE Transactions on Image Processing, 2008.</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="EPDT">[31]</a> </td> <td> <p align="justify"> M. Söchting, S. Allegretti, F. Bolelli, C. Grana. "A Heuristic-Based Decision Tree for Connected Components Labeling of 3D Volumes." 25th International Conference on Pattern Recognition, 2021</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="BRTS">[32]</a> </td> <td> <p align="justify"> W. Lee, F. Bolelli, S. Allegretti, C. Grana. "Fast Run-Based Connected Components Labeling for Bitonal Images." 5th International Conference on Imaging, Vision & Pattern Recognition, 2021</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="DAG">[33]</a> </td> <td> <p align="justify"> F. Bolelli, S. Allegretti, C. Grana. "One DAG to Rule Them All." IEEE Transactions on Pattern Analisys and Machine Intelligence, 2021</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="ACCL">[34]</a> </td> <td> <p align="justify"> F. N. Paravecino, D. Kaeli, "Accelerated Connected Component Labeling Using CUDA Framework." International Conference on Computer Vision and Graphics, ICCVG, 2014</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="HA4">[35]</a> </td> <td> <p align="justify"> A. Hennequin, L. Lacassagne, L. Cabaret, Q. Meunier, "A new Direct Connected Component Labeling and Analysis Algorithms for GPUs", DASIP, 2018</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="8DLS">[36]</a> </td> <td> <p align="justify"> Y. So, H. Ashraf, Y. Hae, I. Kim, "Fast Parallel Connected Component Labeling Algorithm Using CUDA Based On 8-Directional Label Selection", International Journal of Latest Research in Science and Technology, 2014</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="RASMUSSON">[37]</a> </td> <td> <p align="justify"> A. Rasmusson, T.S. Sørensen, G. Ziegler, "Connected Components Labeling on the GPU with Generalization to Voronoi Diagrams and Signed Distance Fields", International Symposium on Visual Computing, 2013</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="STAVA">[38]</a> </td> <td> <p align="justify"> O. Stava, B. Benes, "Connected Components Labeling in CUDA", GPU Computing Gems, 2011</p> </td> </tr> <tr> <td style="vertical-align: top !important;" align="right"> <a name="LBUF">[39]</a> </td> <td> <p align="justify"> K. Yonehara, K. Aizawa, "A Line-Based Connected Component Labeling Algorithm Using GPUs", Third International Symposium on Computing and Networking, 2015</p> </td> </tr> </table>