Sefray / NuitsBlanches_GPU

This repository contains multiple C++/GPU version of a pipeline for object detection. This project has been done for a GPU class at EPITA.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

GPU

Authors

Objectives

The objective of this project is to set up a pipeline to detect objects in multiple images looking for differences with a reference image.

The pipeline computes the following steps:

  • apply a grayscale filter on the input image
  • smooth the greyscaled image using a gaussian kernel
  • compute the difference between the smoothed image and the smoothed image of the greyscaled reference image (the reference image is the same for all the images)
  • compute an opening and then a closing with the output of the previous step
  • binarize the output of the previous step
  • compute the connected components and their bounding box of the binarized image

Build

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

It is possible to build everything with the following command:

make -j

It is also possible to build the executable separately:

make main
make test
make bench

Main

The program can be used as follows:

Usage: ./main [OPTIONS] -- REFENCE_IMAGE_PATH ([IMAGE_PATH]*|DIRECTORY_PATH)

Note that the double dash (--) is mandatory.

The program will then output on standard output a json with the following format:

{
    "image_1": [
        [x1_1, y1_1, w1_1, h1_1],
        ...
        [x1_N, y1_N, w1_N, h1_N]
    ],
    ...
    "image_M": [
        [xM_1, yM_1, wM_1, hM_1],
        ...
        [xM_N, yM_N, wM_N, hM_N]
    ]
}

To know possible options of the program, you can use the --help options:

./main --help
Usage: ./main [OPTIONS] -- REFENCE_IMAGE_PATH ([IMAGE_PATH]*|DIRECTORY_PATH)

        --binary_threshold (value:12)
                Minimum value for a pixel to be considered as a binary pixel
        --folder (value:false)
                Is the path a folder
        -h, --help (value:false)
                show help message
        --kernel_size (value:5)
                Size of the kernel for the gaussian blur
        --kernel_size_closing (value:41)
                Should be odd
        --kernel_size_opening (value:101)
                Should be odd
        --minimum_pixel_percentage (value:1.0)
                Percentage of the space occupied by the object to be considered as a detection
        --mode (value:0)
                0:CPU 1:GPU1 2:GPU2 3:GPU3 4:GPU4 5:GPU5 6:GPU6

Test

Test are only performed on the CPU version of the program.

Tests are done with Google Test and can be executed with the following command:

./test

Bench

Benchmarks are done with Google Benchmark.

Unit

The unit benchmark displays performances of the element of the pipeline (on Nuits Blanches image).

Unit benchmark can be performed as follow:

42sh$ ./bench_unit
----------------------------------------------------------------------------
Benchmark                                  Time             CPU   Iterations
----------------------------------------------------------------------------
BM_Greyscale/real_time                 0.400 ms        0.400 ms        10000
BM_Blur/real_time                       1.57 ms         1.57 ms        10000
BM_Diff/real_time                      0.238 ms        0.238 ms        10000
BM_Closing_Opening/real_time            18.0 ms         18.0 ms           38
BM_Threshold/real_time                 0.171 ms        0.171 ms        10000
BM_Connectic_components/real_time       1.89 ms         1.89 ms          373

Only the computating time is considered.

Full

The full benchmark displays performances of the complete for multiple version.

Full benchmark can be performed as follow:

42sh$ ./bench
-------------------------------------------------------------------------------------------------------------------
Benchmark                                                         Time             CPU   Iterations UserCounters...
-------------------------------------------------------------------------------------------------------------------
BM_Detection_file_nb/nuits_blanches_cpu/real_time              8786 ms         8785 ms             1 items_per_second=0.113823/s
BM_Detection_file_nb/nuits_blanches_gpu_one/real_time          1663 ms          666 ms             1 items_per_second=0.601193/s
[...]
BM_Detection_file_nb/nuits_blanches_gpu_seven/real_time         61.4 ms         56.4 ms           11 items_per_second=16.282/s
BM_Detection_folder_nb/nuits_blanches_gpu_one/real_time       31876 ms        31370 ms             1 items_per_second=2.5411/s
[...]
BM_Detection_folder_nb/nuits_blanches_gpu_seven/real_time       1926 ms         1918 ms            1 items_per_second=42.0527/s

The data loading is not considered.


Video maker

A video maker is also available to make a video of the detection of objects in the images.

./main [OPTIONS] -- REFENCE_IMAGE_PATH ([IMAGE_PATH]*|DIRECTORY_PATH) | python video_maker.py [-o output.avi] [-f FPS]

Parameters used for gifs

Nuits Blanches

--binary_threshold=10 --high_pick_threshold=20 --kernel_size_opening=41 --kernel_size_closing=21 --minimum_pixel_percentage=0.5

Scia Premium

--binary_threshold=40 --high_pick_threshold=40 --kernel_size_opening=21 --kernel_size_closing=15 --minimum_pixel_percentage=5

Aled

--binary_threshold=20 --high_pick_threshold=40 --kernel_size_opening=21 --kernel_size_closing=15 --minimum_pixel_percentage=1

About

This repository contains multiple C++/GPU version of a pipeline for object detection. This project has been done for a GPU class at EPITA.

License:MIT License


Languages

Language:C++ 50.7%Language:Cuda 45.5%Language:CMake 2.1%Language:Nix 0.9%Language:Python 0.9%