Skip to content

Commit ce033c9

Browse files
Port G-API demos to API2.0 - background_subtraction_demo/cpp_gapi
1 parent 2378e96 commit ce033c9

File tree

6 files changed

+48
-53
lines changed

6 files changed

+48
-53
lines changed

.github/workflows/cpp_gapi-demos.yml

+13-11
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,25 @@ jobs:
2929
path: ${{ github.workspace }}/cache
3030
key: unused
3131
restore-keys: ubuntu20_2023.2.0.13089.cfd42bd2cb0-
32-
- if: ${{ !steps.cache.outputs.cache-hit }}
33-
uses: actions/checkout@v3
34-
with:
35-
repository: opencv/opencv
36-
path: cache/opencv
37-
- if: ${{ !steps.cache.outputs.cache-hit }}
38-
name: Compile OpenCV
32+
- name: Clone and checkout OpenCV
33+
run: |
34+
cd cache
35+
mkdir opencv-with-fix
36+
cd opencv-with-fix
37+
git clone https://github.com/DariaMityagina/opencv.git
38+
cd opencv
39+
git checkout icv/dm/govbackend-partial-shape-support
40+
- name: Compile OpenCV
3941
run: |
40-
rm -rf cache/opencv/.git/ # Minimize cache
41-
mkdir cache/opencv/build
42-
cd cache/opencv/build
42+
cd cache
43+
mkdir opencv-with-fix/opencv/build
44+
cd opencv-with-fix/opencv/build
4345
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_INF_ENGINE=y -DOpenVINO_DIR=$GITHUB_WORKSPACE/ov/runtime/cmake/ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_LINKER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_C_LINKER_LAUNCHER=ccache -DBUILD_TESTS=y -DVIDEOIO_ENABLE_PLUGINS=y -DBUILD_PERF_TESTS=n -DBUILD_EXAMPLES=n -DBUILD_opencv_apps=y -DWITH_OPENCL=n -DWITH_OPENCLAMDBLAS=n -DWITH_GSTREAMER=n -DWITH_V4L=ON -DWITH_LIBV4L=ON -DWITH_OPENCLAMDFFT=n -DWITH_VA=n -DWITH_VA_INTEL=n -DWITH_PROTOBUF=n -DBUILD_PROTOBUF=n -DBUILD_JAVA=n -DBUILD_opencv_java_bindings_generator=n -DBUILD_opencv_python2=n -DBUILD_opencv_python3=n -DWITH_IMGCODEC_HDR=y -DWITH_IMGCODEC_SUNRASTER=y -DWITH_IMGCODEC_PXM=y -DWITH_IMGCODEC_PFM=y -DWITH_PNG=y -DWITH_TIFF=n -DWITH_WEBP=n -DWITH_OPENJPEG=n -DWITH_JASPER=n -DWITH_OPENEXR=n -DBUILD_opencv_dnn=n -DBUILD_opencv_features2d=n -DBUILD_opencv_flann=n -DWITH_TBB=n -DBUILD_INFO_SKIP_EXTRA_MODULES=n -DBUILD_JASPER=n -DBUILD_PNG=n -DBUILD_OPENEXR=n -DBUILD_WEBP=n -DBUILD_ZLIB=n -DWITH_CUDA=n -DWITH_EIGEN=n -DWITH_GPHOTO2=n -DOPENCV_GAPI_GSTREAMER=n -DWITH_LAPACK=n -DWITH_MATLAB=n -DWITH_MFX=n -DWITH_QUIRC=n -DWITH_VTK=n -DINSTALL_PDB=n -DINSTALL_TESTS=n -DINSTALL_C_EXAMPLES=n -DINSTALL_PYTHON_EXAMPLES=n -DOPENCV_GENERATE_SETUPVARS=n -DWITH_1394=n -DWITH_FFMPEG=y -DWITH_GTK_2_X=y -DBUILD_JPEG=y -DWITH_IPP=y -DWITH_AVIF=n -DENABLE_CONFIG_VERIFICATION=y -DBUILD_LIST=core,gapi,highgui,imgcodecs,imgproc,videoio,video ..
4446
cmake --build . -j $((`nproc`*2+2))
4547
- name: build_demos.sh
4648
run: |
4749
source ov/setupvars.sh
48-
OpenCV_DIR=$GITHUB_WORKSPACE/cache/opencv/build CMAKE_CXX_COMPILER_LAUNCHER=ccache CMAKE_CXX_LINKER_LAUNCHER=ccache ./demos/build_demos.sh --build_dir=build # TODO: add CMAKE_CXX_FLAGS=-Werror after background_subtraction_demo/cpp_gapi is updated to ov2.0
50+
OpenCV_DIR=$GITHUB_WORKSPACE/cache/opencv-with-fix/opencv/build CMAKE_CXX_COMPILER_LAUNCHER=ccache CMAKE_CXX_LINKER_LAUNCHER=ccache ./demos/build_demos.sh --build_dir=build # TODO: add CMAKE_CXX_FLAGS=-Werror after background_subtraction_demo/cpp_gapi is updated to ov2.0
4951
- uses: actions/setup-python@v4
5052
with:
5153
python-version: 3.11

demos/background_subtraction_demo/cpp_gapi/CMakeLists.txt

-5
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@ if (NOT TARGET utils_gapi)
77
return()
88
endif()
99

10-
if(OpenVINO_VERSION_MAJOR VERSION_GREATER_EQUAL 2024)
11-
message(WARNING "background_subtraction_demo_gapi skipped. G-API is not compatible with OpenVINO 2024.0.")
12-
return()
13-
endif()
14-
1510
file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
1611
file(GLOB_RECURSE HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
1712

demos/background_subtraction_demo/cpp_gapi/include/custom_kernels.hpp

+5-9
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@
77
#include <string>
88
#include <vector>
99

10-
#include <cpp/ie_cnn_network.h>
11-
#include <ie_allocator.hpp>
12-
#include <ie_common.h>
13-
#include <ie_input_info.hpp>
10+
#include <openvino/openvino.hpp>
11+
1412
#include <opencv2/core.hpp>
1513
#include <opencv2/gapi/gkernel.hpp>
1614
#include <opencv2/gapi/gmat.hpp>
1715

18-
namespace IE = InferenceEngine;
19-
2016
namespace custom {
2117
// clang-format off
2218
G_API_OP(GTensorToImg, <cv::GMat(cv::GMat)>, "custom.tensorToImg") {
@@ -49,10 +45,10 @@ class NNBGReplacer {
4945
}
5046

5147
protected:
52-
IE::CNNNetwork m_cnn_network;
48+
std::shared_ptr<const ov::Model> model;
5349
std::string m_tag;
54-
IE::InputsDataMap m_inputs;
55-
IE::OutputsDataMap m_outputs;
50+
std::vector<ov::Output<const ov::Node>> m_inputs;
51+
std::vector<ov::Output<const ov::Node>> m_outputs;
5652
};
5753

5854
class MaskRCNNBGReplacer : public NNBGReplacer {

demos/background_subtraction_demo/cpp_gapi/main.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include <opencv2/gapi/gstreaming.hpp>
2828
#include <opencv2/gapi/imgproc.hpp>
2929
#include <opencv2/gapi/infer.hpp>
30-
#include <opencv2/gapi/infer/ie.hpp>
30+
#include <opencv2/gapi/infer/ov.hpp>
3131
#include <opencv2/gapi/own/assert.hpp>
3232
#include <opencv2/gapi/streaming/source.hpp>
3333
#include <opencv2/gapi/util/optional.hpp>
@@ -147,13 +147,13 @@ int main(int argc, char* argv[]) {
147147
auto config = ConfigFactory::getUserConfig(FLAGS_d, FLAGS_nireq, FLAGS_nstreams, FLAGS_nthreads);
148148
// clang-format off
149149
const auto net =
150-
cv::gapi::ie::Params<cv::gapi::Generic>{
150+
cv::gapi::ov::Params<cv::gapi::Generic>{
151151
model->getName(),
152152
FLAGS_m, // path to topology IR
153153
fileNameNoExt(FLAGS_m) + ".bin", // path to weights
154154
FLAGS_d // device specifier
155155
}.cfgNumRequests(config.maxAsyncRequests)
156-
.pluginConfig(config.getLegacyConfig());
156+
.cfgPluginConfig(config.getLegacyConfig());
157157
// clang-format on
158158

159159
slog::info << "The background matting model " << FLAGS_m << " is loaded to " << FLAGS_d << " device."
@@ -241,6 +241,8 @@ int main(int argc, char* argv[]) {
241241
} else {
242242
presenter.handleKey(key);
243243
}
244+
} else {
245+
cv::imwrite("./background-substr-out.jpg", output);
244246
}
245247
}
246248
slog::info << "Metrics report:" << slog::endl;

demos/background_subtraction_demo/cpp_gapi/src/custom_kernels.cpp

+11-14
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010
#include <stdexcept>
1111
#include <utility>
1212

13-
#include <ie_core.hpp>
14-
#include <ie_data.h>
15-
#include <ie_layouts.h>
1613
#include <opencv2/gapi/core.hpp>
1714
#include <opencv2/gapi/cpu/gcpukernel.hpp>
1815
#include <opencv2/gapi/gscalar.hpp>
@@ -137,26 +134,26 @@ GAPI_OCV_KERNEL(OCVCalculateMaskRCNNBGMask, custom::GCalculateMaskRCNNBGMask) {
137134
// clang-format on
138135

139136
custom::NNBGReplacer::NNBGReplacer(const std::string& model_path) {
140-
IE::Core core;
141-
m_cnn_network = core.ReadNetwork(model_path);
142-
m_tag = m_cnn_network.getName();
143-
m_inputs = m_cnn_network.getInputsInfo();
144-
m_outputs = m_cnn_network.getOutputsInfo();
137+
ov::Core core;
138+
model = core.read_model(model_path);
139+
m_tag = model->get_name();
140+
m_inputs = model->inputs();
141+
m_outputs = model->outputs();
145142
}
146143

147144
custom::MaskRCNNBGReplacer::MaskRCNNBGReplacer(const std::string& model_path) : custom::NNBGReplacer(model_path) {
148145
for (const auto& p : m_outputs) {
149-
const auto& layer_name = p.first;
146+
const auto& layer_name = p.get_any_name();
150147
if (layer_name.rfind("TopK") != std::string::npos) {
151148
continue;
152149
}
153150

154151
if (m_inputs.size() != 1) {
155152
throw std::logic_error("Supported only single input MaskRCNN models!");
156153
}
157-
m_input_name = m_inputs.begin()->first;
154+
m_input_name = m_inputs[0].get_any_name();
158155

159-
const auto dims_size = p.second->getTensorDesc().getDims().size();
156+
const auto dims_size = p.get_partial_shape().size();
160157
if (dims_size == 1) {
161158
m_labels_name = layer_name;
162159
} else if (dims_size == 2) {
@@ -177,7 +174,7 @@ cv::GMat custom::MaskRCNNBGReplacer::replace(cv::GFrame in, cv::GMat bgr, const
177174
auto boxes = outputs.at(m_boxes_name);
178175
auto masks = outputs.at(m_masks_name);
179176

180-
const auto& dims = m_inputs.at(m_input_name)->getTensorDesc().getDims();
177+
const auto& dims = model->input(m_input_name).get_partial_shape().get_max_shape();
181178
GAPI_Assert(dims.size() == 4u);
182179
auto mask = custom::GCalculateMaskRCNNBGMask::on(in_size, cv::Size(dims[3], dims[2]), labels, boxes, masks);
183180
auto mask3ch = cv::gapi::medianBlur(cv::gapi::merge3(mask, mask, mask), 11);
@@ -188,12 +185,12 @@ custom::BGMattingReplacer::BGMattingReplacer(const std::string& model_path) : NN
188185
if (m_inputs.size() != 1) {
189186
throw std::logic_error("Supported only single input background matting models!");
190187
}
191-
m_input_name = m_inputs.begin()->first;
188+
m_input_name = m_inputs[0].get_any_name();
192189

193190
if (m_outputs.size() != 1) {
194191
throw std::logic_error("Supported only single output background matting models!");
195192
}
196-
m_output_name = m_outputs.begin()->first;
193+
m_output_name = m_outputs[0].get_any_name();
197194
}
198195

199196
cv::GMat custom::BGMattingReplacer::replace(cv::GFrame in, cv::GMat bgr, const cv::Size& in_size, cv::GMat background) {

demos/tests/cases.py

+14-11
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,18 @@ def single_option_cases(key, *args):
170170

171171

172172
DEMOS = [
173-
# CppDemo(name='background_subtraction_demo', device_keys=['-d'], implementation='cpp_gapi', test_cases=combine_cases(
174-
# TestCase(options={'--no_show': None, '-at': 'maskrcnn',
175-
# **MONITORS,
176-
# '-i': DataPatternArg('coco128-subset-480x640x3'),
177-
# }),
178-
# single_option_cases('-m',
179-
# ModelArg('instance-segmentation-person-0007'),
180-
# ModelArg('instance-segmentation-security-0091')),
181-
# )),
173+
CppDemo(name='background_subtraction_demo', device_keys=['-d'], implementation='cpp_gapi', test_cases=combine_cases(
174+
TestCase(options={'--no_show': None, '-at': 'maskrcnn',
175+
**MONITORS,
176+
}),
177+
single_option_cases('-m',
178+
ModelArg('instance-segmentation-person-0007'),
179+
ModelArg('instance-segmentation-security-0091')),
180+
single_option_cases(
181+
'-i',
182+
DataPatternArg('coco128-every-480x640x3'),
183+
str('video.mp4')),
184+
)),
182185

183186
CppDemo('classification_benchmark_demo', 'cpp_gapi', test_cases=combine_cases(
184187
single_option_cases(
@@ -251,8 +254,8 @@ def single_option_cases(key, *args):
251254
ModelArg('face-detection-retail-0004')),
252255
single_option_cases(
253256
'-i',
254-
str('video.mp4'),
255-
DataPatternArg('coco128-every-480x640x3')),
257+
DataPatternArg('coco128-every-480x640x3'),
258+
str('video.mp4')),
256259
)),
257260

258261
# TODO: https://github.com/DariaMityagina is to fix the demo

0 commit comments

Comments
 (0)