1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920 |
- // This file is part of OpenCV project.
- // It is subject to the license terms in the LICENSE file found in the top-level directory
- // of this distribution and at http://opencv.org/license.html.
- //
- // Copyright (C) 2019-2021 Intel Corporation
- #include "../test_precomp.hpp"
- #ifdef HAVE_INF_ENGINE
- #include <stdexcept>
- #include <mutex>
- #include <condition_variable>
- #include <inference_engine.hpp>
- #include <ade/util/iota_range.hpp>
- #include <opencv2/gapi/infer/ie.hpp>
- #include <opencv2/gapi/streaming/cap.hpp>
- #include "backends/ie/util.hpp"
- #include "backends/ie/giebackend/giewrapper.hpp"
- #ifdef HAVE_NGRAPH
- #if defined(__clang__) // clang or MSVC clang
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wunused-parameter"
- #elif defined(_MSC_VER)
- #pragma warning(push)
- #pragma warning(disable : 4100)
- # if _MSC_VER < 1910
- # pragma warning(disable:4268) // Disable warnings of ngraph. OpenVINO recommends to use MSVS 2019.
- # pragma warning(disable:4800)
- # endif
- #elif defined(__GNUC__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- #include <ngraph/ngraph.hpp>
- #endif
- namespace opencv_test
- {
- namespace {
- class TestMediaBGR final: public cv::MediaFrame::IAdapter {
- cv::Mat m_mat;
- using Cb = cv::MediaFrame::View::Callback;
- Cb m_cb;
- public:
- explicit TestMediaBGR(cv::Mat m, Cb cb = [](){})
- : m_mat(m), m_cb(cb) {
- }
- cv::GFrameDesc meta() const override {
- return cv::GFrameDesc{cv::MediaFormat::BGR, cv::Size(m_mat.cols, m_mat.rows)};
- }
- cv::MediaFrame::View access(cv::MediaFrame::Access) override {
- cv::MediaFrame::View::Ptrs pp = { m_mat.ptr(), nullptr, nullptr, nullptr };
- cv::MediaFrame::View::Strides ss = { m_mat.step, 0u, 0u, 0u };
- return cv::MediaFrame::View(std::move(pp), std::move(ss), Cb{m_cb});
- }
- cv::util::any blobParams() const override {
- return std::make_pair<InferenceEngine::TensorDesc,
- InferenceEngine::ParamMap>({IE::Precision::U8,
- {1, 3, 300, 300},
- IE::Layout::NCHW},
- {{"HELLO", 42},
- {"COLOR_FORMAT",
- InferenceEngine::ColorFormat::NV12}});
- }
- };
- class TestMediaNV12 final: public cv::MediaFrame::IAdapter {
- cv::Mat m_y;
- cv::Mat m_uv;
- public:
- TestMediaNV12(cv::Mat y, cv::Mat uv) : m_y(y), m_uv(uv) {
- }
- cv::GFrameDesc meta() const override {
- return cv::GFrameDesc{cv::MediaFormat::NV12, cv::Size(m_y.cols, m_y.rows)};
- }
- cv::MediaFrame::View access(cv::MediaFrame::Access) override {
- cv::MediaFrame::View::Ptrs pp = {
- m_y.ptr(), m_uv.ptr(), nullptr, nullptr
- };
- cv::MediaFrame::View::Strides ss = {
- m_y.step, m_uv.step, 0u, 0u
- };
- return cv::MediaFrame::View(std::move(pp), std::move(ss));
- }
- };
- // FIXME: taken from DNN module
- static void initDLDTDataPath()
- {
- #ifndef WINRT
- static bool initialized = false;
- if (!initialized)
- {
- const char* omzDataPath = getenv("OPENCV_OPEN_MODEL_ZOO_DATA_PATH");
- if (omzDataPath)
- cvtest::addDataSearchPath(omzDataPath);
- const char* dnnDataPath = getenv("OPENCV_DNN_TEST_DATA_PATH");
- if (dnnDataPath) {
- // Add the dnnDataPath itself - G-API is using some images there directly
- cvtest::addDataSearchPath(dnnDataPath);
- cvtest::addDataSearchPath(dnnDataPath + std::string("/omz_intel_models"));
- }
- initialized = true;
- }
- #endif // WINRT
- }
- #if INF_ENGINE_RELEASE >= 2020010000
- static const std::string SUBDIR = "intel/age-gender-recognition-retail-0013/FP32/";
- #else
- static const std::string SUBDIR = "Retail/object_attributes/age_gender/dldt/";
- #endif
- // FIXME: taken from the DNN module
- void normAssert(cv::InputArray ref, cv::InputArray test,
- const char *comment /*= ""*/,
- double l1 = 0.00001, double lInf = 0.0001)
- {
- double normL1 = cvtest::norm(ref, test, cv::NORM_L1) / ref.getMat().total();
- EXPECT_LE(normL1, l1) << comment;
- double normInf = cvtest::norm(ref, test, cv::NORM_INF);
- EXPECT_LE(normInf, lInf) << comment;
- }
- namespace IE = InferenceEngine;
- void setNetParameters(IE::CNNNetwork& net, bool is_nv12 = false) {
- auto ii = net.getInputsInfo().at("data");
- ii->setPrecision(IE::Precision::U8);
- ii->getPreProcess().setResizeAlgorithm(IE::RESIZE_BILINEAR);
- if (is_nv12) {
- ii->getPreProcess().setColorFormat(IE::ColorFormat::NV12);
- }
- }
- bool checkDeviceIsAvailable(const std::string& device) {
- const static auto available_devices = [&](){
- auto devices = cv::gimpl::ie::wrap::getCore().GetAvailableDevices();
- return std::unordered_set<std::string>{devices.begin(), devices.end()};
- }();
- return available_devices.find(device) != available_devices.end();
- }
- void skipIfDeviceNotAvailable(const std::string& device) {
- if (!checkDeviceIsAvailable(device)) {
- throw SkipTestException("Device: " + device + " isn't available!");
- }
- }
- void compileBlob(const cv::gapi::ie::detail::ParamDesc& params,
- const std::string& output,
- const IE::Precision& ip) {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- for (auto&& ii : net.getInputsInfo()) {
- ii.second->setPrecision(ip);
- }
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- std::ofstream out_file{output, std::ios::out | std::ios::binary};
- GAPI_Assert(out_file.is_open());
- this_network.Export(out_file);
- }
- std::string compileAgeGenderBlob(const std::string& device) {
- const static std::string blob_path = [&](){
- cv::gapi::ie::detail::ParamDesc params;
- const std::string model_name = "age-gender-recognition-retail-0013";
- const std::string output = model_name + ".blob";
- params.model_path = findDataFile(SUBDIR + model_name + ".xml");
- params.weights_path = findDataFile(SUBDIR + model_name + ".bin");
- params.device_id = device;
- compileBlob(params, output, IE::Precision::U8);
- return output;
- }();
- return blob_path;
- }
- } // anonymous namespace
- // TODO: Probably DNN/IE part can be further parametrized with a template
- // NOTE: here ".." is used to leave the default "gapi/" search scope
- TEST(TestAgeGenderIE, InferBasicTensor)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- cv::Mat gapi_age, gapi_gender;
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto &iedims = net.getInputsInfo().begin()->second->getTensorDesc().getDims();
- auto cvdims = cv::gapi::ie::util::to_ocv(iedims);
- in_mat.create(cvdims, CV_32F);
- cv::randu(in_mat, -1, 1);
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(TestAgeGenderIE, InferBasicImage)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // FIXME: Ideally it should be an image from disk
- // cv::Mat in_mat = cv::imread(findDataFile("grace_hopper_227.png"));
- cv::Mat in_mat(cv::Size(320, 240), CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- struct InferWithReshape: public ::testing::Test {
- cv::gapi::ie::detail::ParamDesc params;
- cv::Mat m_in_mat;
- std::vector<cv::Rect> m_roi_list;
- std::vector<size_t> reshape_dims;
- std::vector<cv::Mat> m_out_ie_ages;
- std::vector<cv::Mat> m_out_ie_genders;
- std::vector<cv::Mat> m_out_gapi_ages;
- std::vector<cv::Mat> m_out_gapi_genders;
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- InferenceEngine::CNNNetwork net;
- InferenceEngine::Core plugin;
- InferWithReshape() {
- // FIXME: it must be cv::imread(findDataFile("../dnn/grace_hopper_227.png", false));
- m_in_mat = cv::Mat(cv::Size(320, 240), CV_8UC3);
- cv::randu(m_in_mat, 0, 255);
- m_out_gapi_ages.resize(1);
- m_out_gapi_genders.resize(1);
- // both ROIs point to the same face, with a slightly changed geometry
- m_roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- // New dimensions for "data" input
- reshape_dims = {1, 3, 70, 70};
- initDLDTDataPath();
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- plugin = cv::gimpl::ie::wrap::getPlugin(params);
- net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- net.reshape({{"data", reshape_dims}});
- }
- void inferROIs(IE::Blob::Ptr blob) {
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- for (auto &&rc : m_roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- infer_request.SetBlob("data", IE::make_shared_blob(blob, ie_rc));
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- m_out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- m_out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- }
- void infer(cv::Mat& in, const bool with_roi = false) {
- if (!with_roi) {
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in));
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- m_out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- m_out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- } else {
- auto frame_blob = cv::gapi::ie::util::to_ie(in);
- inferROIs(frame_blob);
- }
- }
- void validate() {
- // Validate with IE itself (avoid DNN module dependency here)
- GAPI_Assert(!m_out_gapi_ages.empty());
- ASSERT_EQ(m_out_gapi_genders.size(), m_out_gapi_ages.size());
- ASSERT_EQ(m_out_gapi_ages.size(), m_out_ie_ages.size());
- ASSERT_EQ(m_out_gapi_genders.size(), m_out_ie_genders.size());
- const size_t size = m_out_gapi_ages.size();
- for (size_t i = 0; i < size; ++i) {
- normAssert(m_out_ie_ages [i], m_out_gapi_ages [i], "Test age output");
- normAssert(m_out_ie_genders[i], m_out_gapi_genders[i], "Test gender output");
- }
- }
- }; // InferWithReshape
- struct InferWithReshapeNV12: public InferWithReshape {
- cv::Mat m_in_uv;
- cv::Mat m_in_y;
- void SetUp() {
- cv::Size sz{320, 240};
- m_in_y = cv::Mat{sz, CV_8UC1};
- cv::randu(m_in_y, 0, 255);
- m_in_uv = cv::Mat{sz / 2, CV_8UC2};
- cv::randu(m_in_uv, 0, 255);
- setNetParameters(net, true);
- net.reshape({{"data", reshape_dims}});
- auto frame_blob = cv::gapi::ie::util::to_ie(m_in_y, m_in_uv);
- inferROIs(frame_blob);
- }
- };
- struct ROIList: public ::testing::Test {
- cv::gapi::ie::detail::ParamDesc params;
- cv::Mat m_in_mat;
- std::vector<cv::Rect> m_roi_list;
- std::vector<cv::Mat> m_out_ie_ages;
- std::vector<cv::Mat> m_out_ie_genders;
- std::vector<cv::Mat> m_out_gapi_ages;
- std::vector<cv::Mat> m_out_gapi_genders;
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- void SetUp() {
- initDLDTDataPath();
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // FIXME: it must be cv::imread(findDataFile("../dnn/grace_hopper_227.png", false));
- m_in_mat = cv::Mat(cv::Size(320, 240), CV_8UC3);
- cv::randu(m_in_mat, 0, 255);
- // both ROIs point to the same face, with a slightly changed geometry
- m_roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- // Load & run IE network
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- auto frame_blob = cv::gapi::ie::util::to_ie(m_in_mat);
- for (auto &&rc : m_roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- infer_request.SetBlob("data", IE::make_shared_blob(frame_blob, ie_rc));
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- m_out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- m_out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- } // namespace IE = ..
- } // ROIList()
- void validate() {
- // Validate with IE itself (avoid DNN module dependency here)
- ASSERT_EQ(2u, m_out_ie_ages.size());
- ASSERT_EQ(2u, m_out_ie_genders.size());
- ASSERT_EQ(2u, m_out_gapi_ages.size());
- ASSERT_EQ(2u, m_out_gapi_genders.size());
- normAssert(m_out_ie_ages [0], m_out_gapi_ages [0], "0: Test age output");
- normAssert(m_out_ie_genders[0], m_out_gapi_genders[0], "0: Test gender output");
- normAssert(m_out_ie_ages [1], m_out_gapi_ages [1], "1: Test age output");
- normAssert(m_out_ie_genders[1], m_out_gapi_genders[1], "1: Test gender output");
- }
- }; // ROIList
- struct ROIListNV12: public ::testing::Test {
- cv::gapi::ie::detail::ParamDesc params;
- cv::Mat m_in_uv;
- cv::Mat m_in_y;
- std::vector<cv::Rect> m_roi_list;
- std::vector<cv::Mat> m_out_ie_ages;
- std::vector<cv::Mat> m_out_ie_genders;
- std::vector<cv::Mat> m_out_gapi_ages;
- std::vector<cv::Mat> m_out_gapi_genders;
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- void SetUp() {
- initDLDTDataPath();
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Size sz{320, 240};
- m_in_y = cv::Mat{sz, CV_8UC1};
- cv::randu(m_in_y, 0, 255);
- m_in_uv = cv::Mat{sz / 2, CV_8UC2};
- cv::randu(m_in_uv, 0, 255);
- // both ROIs point to the same face, with a slightly changed geometry
- m_roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- // Load & run IE network
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net, true);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- auto frame_blob = cv::gapi::ie::util::to_ie(m_in_y, m_in_uv);
- for (auto &&rc : m_roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- infer_request.SetBlob("data", IE::make_shared_blob(frame_blob, ie_rc));
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- m_out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- m_out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- } // namespace IE = ..
- } // ROIList()
- void validate() {
- // Validate with IE itself (avoid DNN module dependency here)
- ASSERT_EQ(2u, m_out_ie_ages.size());
- ASSERT_EQ(2u, m_out_ie_genders.size());
- ASSERT_EQ(2u, m_out_gapi_ages.size());
- ASSERT_EQ(2u, m_out_gapi_genders.size());
- normAssert(m_out_ie_ages [0], m_out_gapi_ages [0], "0: Test age output");
- normAssert(m_out_ie_genders[0], m_out_gapi_genders[0], "0: Test gender output");
- normAssert(m_out_ie_ages [1], m_out_gapi_ages [1], "1: Test age output");
- normAssert(m_out_ie_genders[1], m_out_gapi_genders[1], "1: Test gender output");
- }
- };
- struct SingleROI: public ::testing::Test {
- cv::gapi::ie::detail::ParamDesc params;
- cv::Mat m_in_mat;
- cv::Rect m_roi;
- cv::Mat m_out_gapi_age;
- cv::Mat m_out_gapi_gender;
- cv::Mat m_out_ie_age;
- cv::Mat m_out_ie_gender;
- void SetUp() {
- initDLDTDataPath();
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // FIXME: it must be cv::imread(findDataFile("../dnn/grace_hopper_227.png", false));
- m_in_mat = cv::Mat(cv::Size(320, 240), CV_8UC3);
- cv::randu(m_in_mat, 0, 255);
- m_roi = cv::Rect(cv::Point{64, 60}, cv::Size{96, 96});
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(m_roi.x)
- , static_cast<std::size_t>(m_roi.y)
- , static_cast<std::size_t>(m_roi.width)
- , static_cast<std::size_t>(m_roi.height)
- };
- IE::Blob::Ptr roi_blob = IE::make_shared_blob(cv::gapi::ie::util::to_ie(m_in_mat), ie_rc);
- infer_request.SetBlob("data", roi_blob);
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- m_out_ie_age = to_ocv(infer_request.GetBlob("age_conv3")).clone();
- m_out_ie_gender = to_ocv(infer_request.GetBlob("prob")).clone();
- }
- }
- void validate() {
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(m_out_ie_age , m_out_gapi_age , "Test age output");
- normAssert(m_out_ie_gender, m_out_gapi_gender, "Test gender output");
- }
- };
- struct SingleROINV12: public ::testing::Test {
- cv::gapi::ie::detail::ParamDesc params;
- cv::Mat m_in_y;
- cv::Mat m_in_uv;
- cv::Rect m_roi;
- cv::Mat m_out_gapi_age;
- cv::Mat m_out_gapi_gender;
- cv::Mat m_out_ie_age;
- cv::Mat m_out_ie_gender;
- void SetUp() {
- initDLDTDataPath();
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Size sz{320, 240};
- m_in_y = cv::Mat{sz, CV_8UC1};
- cv::randu(m_in_y, 0, 255);
- m_in_uv = cv::Mat{sz / 2, CV_8UC2};
- cv::randu(m_in_uv, 0, 255);
- m_roi = cv::Rect(cv::Point{64, 60}, cv::Size{96, 96});
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net, /* NV12 */ true);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- auto blob = cv::gapi::ie::util::to_ie(m_in_y, m_in_uv);
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(m_roi.x)
- , static_cast<std::size_t>(m_roi.y)
- , static_cast<std::size_t>(m_roi.width)
- , static_cast<std::size_t>(m_roi.height)
- };
- IE::Blob::Ptr roi_blob = IE::make_shared_blob(blob, ie_rc);
- infer_request.SetBlob("data", roi_blob);
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- m_out_ie_age = to_ocv(infer_request.GetBlob("age_conv3")).clone();
- m_out_ie_gender = to_ocv(infer_request.GetBlob("prob")).clone();
- }
- }
- void validate() {
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(m_out_ie_age , m_out_gapi_age , "Test age output");
- normAssert(m_out_ie_gender, m_out_gapi_gender, "Test gender output");
- }
- };
- TEST_F(ROIList, TestInfer)
- {
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(m_in_mat, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIList, TestInfer2)
- {
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(m_in_mat, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST(DISABLED_TestTwoIENNPipeline, InferBasicImage)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc AGparams;
- AGparams.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml", false);
- AGparams.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin", false);
- AGparams.device_id = "MYRIAD";
- // FIXME: Ideally it should be an image from disk
- // cv::Mat in_mat = cv::imread(findDataFile("grace_hopper_227.png"));
- cv::Mat in_mat(cv::Size(320, 240), CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age1, gapi_gender1, gapi_age2, gapi_gender2;
- // Load & run IE network
- IE::Blob::Ptr ie_age1, ie_gender1, ie_age2, ie_gender2;
- {
- auto AGplugin1 = cv::gimpl::ie::wrap::getPlugin(AGparams);
- auto AGnet1 = cv::gimpl::ie::wrap::readNetwork(AGparams);
- setNetParameters(AGnet1);
- auto AGplugin_network1 = cv::gimpl::ie::wrap::loadNetwork(AGplugin1, AGnet1, AGparams);
- auto AGinfer_request1 = AGplugin_network1.CreateInferRequest();
- AGinfer_request1.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- AGinfer_request1.Infer();
- ie_age1 = AGinfer_request1.GetBlob("age_conv3");
- ie_gender1 = AGinfer_request1.GetBlob("prob");
- auto AGplugin2 = cv::gimpl::ie::wrap::getPlugin(AGparams);
- auto AGnet2 = cv::gimpl::ie::wrap::readNetwork(AGparams);
- setNetParameters(AGnet2);
- auto AGplugin_network2 = cv::gimpl::ie::wrap::loadNetwork(AGplugin2, AGnet2, AGparams);
- auto AGinfer_request2 = AGplugin_network2.CreateInferRequest();
- AGinfer_request2.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- AGinfer_request2.Infer();
- ie_age2 = AGinfer_request2.GetBlob("age_conv3");
- ie_gender2 = AGinfer_request2.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender1, <AGInfo(cv::GMat)>, "test-age-gender1");
- G_API_NET(AgeGender2, <AGInfo(cv::GMat)>, "test-age-gender2");
- cv::GMat in;
- cv::GMat age1, gender1;
- std::tie(age1, gender1) = cv::gapi::infer<AgeGender1>(in);
- cv::GMat age2, gender2;
- // FIXME: "Multi-node inference is not supported!", workarounded 'till enabling proper tools
- std::tie(age2, gender2) = cv::gapi::infer<AgeGender2>(cv::gapi::copy(in));
- cv::GComputation comp(cv::GIn(in), cv::GOut(age1, gender1, age2, gender2));
- auto age_net1 = cv::gapi::ie::Params<AgeGender1> {
- AGparams.model_path, AGparams.weights_path, AGparams.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- auto age_net2 = cv::gapi::ie::Params<AgeGender2> {
- AGparams.model_path, AGparams.weights_path, AGparams.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat), cv::gout(gapi_age1, gapi_gender1, gapi_age2, gapi_gender2),
- cv::compile_args(cv::gapi::networks(age_net1, age_net2)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age1), gapi_age1, "Test age output 1");
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender1), gapi_gender1, "Test gender output 1");
- normAssert(cv::gapi::ie::util::to_ocv(ie_age2), gapi_age2, "Test age output 2");
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender2), gapi_gender2, "Test gender output 2");
- }
- TEST(TestAgeGenderIE, GenericInfer)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Mat in_mat(cv::Size(320, 240), CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- cv::GMat in;
- GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id};
- comp.apply(cv::gin(in_mat), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(TestAgeGenderIE, InvalidConfigGeneric)
- {
- initDLDTDataPath();
- std::string model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- std::string weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- std::string device_id = "CPU";
- // Configure & run G-API
- cv::GMat in;
- GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<cv::gapi::Generic>{
- "age-gender-generic", model_path, weights_path, device_id
- }.pluginConfig({{"unsupported_config", "some_value"}});
- EXPECT_ANY_THROW(comp.compile(cv::GMatDesc{CV_8U,3,cv::Size{320, 240}},
- cv::compile_args(cv::gapi::networks(pp))));
- }
- TEST(TestAgeGenderIE, CPUConfigGeneric)
- {
- initDLDTDataPath();
- std::string model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- std::string weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- std::string device_id = "CPU";
- // Configure & run G-API
- cv::GMat in;
- GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<cv::gapi::Generic> {
- "age-gender-generic", model_path, weights_path, device_id
- }.pluginConfig({{IE::PluginConfigParams::KEY_CPU_THROUGHPUT_STREAMS,
- IE::PluginConfigParams::CPU_THROUGHPUT_NUMA}});
- EXPECT_NO_THROW(comp.compile(cv::GMatDesc{CV_8U,3,cv::Size{320, 240}},
- cv::compile_args(cv::gapi::networks(pp))));
- }
- TEST(TestAgeGenderIE, InvalidConfig)
- {
- initDLDTDataPath();
- std::string model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- std::string weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- std::string device_id = "CPU";
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- model_path, weights_path, device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .pluginConfig({{"unsupported_config", "some_value"}});
- EXPECT_ANY_THROW(comp.compile(cv::GMatDesc{CV_8U,3,cv::Size{320, 240}},
- cv::compile_args(cv::gapi::networks(pp))));
- }
- TEST(TestAgeGenderIE, CPUConfig)
- {
- initDLDTDataPath();
- std::string model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- std::string weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- std::string device_id = "CPU";
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- model_path, weights_path, device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .pluginConfig({{IE::PluginConfigParams::KEY_CPU_THROUGHPUT_STREAMS,
- IE::PluginConfigParams::CPU_THROUGHPUT_NUMA}});
- EXPECT_NO_THROW(comp.compile(cv::GMatDesc{CV_8U,3,cv::Size{320, 240}},
- cv::compile_args(cv::gapi::networks(pp))));
- }
- TEST_F(ROIList, MediaInputBGR)
- {
- initDLDTDataPath();
- cv::GFrame in;
- cv::GArray<cv::Rect> rr;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaBGR>(m_in_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIListNV12, MediaInputNV12)
- {
- initDLDTDataPath();
- cv::GFrame in;
- cv::GArray<cv::Rect> rr;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(m_in_y, m_in_uv);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST(TestAgeGenderIE, MediaInputNV12)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Size sz{320, 240};
- cv::Mat in_y_mat(sz, CV_8UC1);
- cv::randu(in_y_mat, 0, 255);
- cv::Mat in_uv_mat(sz / 2, CV_8UC2);
- cv::randu(in_uv_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net, true);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_y_mat, in_uv_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GFrame in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(in_y_mat, in_uv_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(TestAgeGenderIE, MediaInputBGR)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Size sz{320, 240};
- cv::Mat in_mat(sz, CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GFrame in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaBGR>(in_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(InferROI, MediaInputBGR)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Size sz{320, 240};
- cv::Mat in_mat(sz, CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- cv::Rect rect(cv::Point{64, 60}, cv::Size{96, 96});
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rect.x)
- , static_cast<std::size_t>(rect.y)
- , static_cast<std::size_t>(rect.width)
- , static_cast<std::size_t>(rect.height)
- };
- IE::Blob::Ptr roi_blob = IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_mat), ie_rc);
- infer_request.SetBlob("data", roi_blob);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GFrame in;
- cv::GOpaque<cv::Rect> roi;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaBGR>(in_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, rect), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(InferROI, MediaInputNV12)
- {
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Size sz{320, 240};
- auto in_y_mat = cv::Mat{sz, CV_8UC1};
- cv::randu(in_y_mat, 0, 255);
- auto in_uv_mat = cv::Mat{sz / 2, CV_8UC2};
- cv::randu(in_uv_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- cv::Rect rect(cv::Point{64, 60}, cv::Size{96, 96});
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net, true);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rect.x)
- , static_cast<std::size_t>(rect.y)
- , static_cast<std::size_t>(rect.width)
- , static_cast<std::size_t>(rect.height)
- };
- IE::Blob::Ptr roi_blob = IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_y_mat, in_uv_mat), ie_rc);
- infer_request.SetBlob("data", roi_blob);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GFrame in;
- cv::GOpaque<cv::Rect> roi;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(in_y_mat, in_uv_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, rect), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST_F(ROIList, Infer2MediaInputBGR)
- {
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaBGR>(m_in_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIListNV12, Infer2MediaInputNV12)
- {
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(m_in_y, m_in_uv);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(SingleROI, GenericInfer)
- {
- // Configure & run G-API
- cv::GMat in;
- cv::GOpaque<cv::Rect> roi;
- cv::GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", roi, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- comp.apply(cv::gin(m_in_mat, m_roi), cv::gout(m_out_gapi_age, m_out_gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(SingleROI, GenericInferMediaBGR)
- {
- // Configure & run G-API
- cv::GFrame in;
- cv::GOpaque<cv::Rect> roi;
- cv::GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", roi, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- auto frame = MediaFrame::Create<TestMediaBGR>(m_in_mat);
- comp.apply(cv::gin(frame, m_roi), cv::gout(m_out_gapi_age, m_out_gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(SingleROINV12, GenericInferMediaNV12)
- {
- // Configure & run G-API
- cv::GFrame in;
- cv::GOpaque<cv::Rect> roi;
- cv::GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", roi, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- auto frame = MediaFrame::Create<TestMediaNV12>(m_in_y, m_in_uv);
- comp.apply(cv::gin(frame, m_roi), cv::gout(m_out_gapi_age, m_out_gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIList, GenericInfer)
- {
- cv::GMat in;
- cv::GArray<cv::Rect> rr;
- cv::GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", rr, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- comp.apply(cv::gin(m_in_mat, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIList, GenericInferMediaBGR)
- {
- cv::GFrame in;
- cv::GArray<cv::Rect> rr;
- cv::GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", rr, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- auto frame = MediaFrame::Create<TestMediaBGR>(m_in_mat);
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIListNV12, GenericInferMediaNV12)
- {
- cv::GFrame in;
- cv::GArray<cv::Rect> rr;
- cv::GInferInputs inputs;
- inputs["data"] = in;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>("age-gender-generic", rr, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- auto frame = MediaFrame::Create<TestMediaNV12>(m_in_y, m_in_uv);
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIList, GenericInfer2)
- {
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- GInferListInputs list;
- list["data"] = rr;
- auto outputs = cv::gapi::infer2<cv::gapi::Generic>("age-gender-generic", in, list);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- comp.apply(cv::gin(m_in_mat, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIList, GenericInfer2MediaInputBGR)
- {
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- GInferListInputs inputs;
- inputs["data"] = rr;
- auto outputs = cv::gapi::infer2<cv::gapi::Generic>("age-gender-generic", in, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- auto frame = MediaFrame::Create<TestMediaBGR>(m_in_mat);
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST_F(ROIListNV12, GenericInfer2MediaInputNV12)
- {
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- GInferListInputs inputs;
- inputs["data"] = rr;
- auto outputs = cv::gapi::infer2<cv::gapi::Generic>("age-gender-generic", in, inputs);
- auto age = outputs.at("age_conv3");
- auto gender = outputs.at("prob");
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- cv::gapi::ie::Params<cv::gapi::Generic> pp{
- "age-gender-generic", params.model_path, params.weights_path, params.device_id
- };
- pp.cfgNumRequests(2u);
- auto frame = MediaFrame::Create<TestMediaNV12>(m_in_y, m_in_uv);
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- validate();
- }
- TEST(Infer, SetInvalidNumberOfRequests)
- {
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::gapi::ie::Params<AgeGender> pp{"model", "weights", "device"};
- EXPECT_ANY_THROW(pp.cfgNumRequests(0u));
- }
- TEST(Infer, TestStreamingInfer)
- {
- initDLDTDataPath();
- std::string filepath = findDataFile("cv/video/768x576.avi");
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- cv::Mat gapi_age, gapi_gender;
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(4u);
- std::size_t num_frames = 0u;
- std::size_t max_frames = 10u;
- cv::VideoCapture cap;
- cap.open(filepath);
- if (!cap.isOpened())
- throw SkipTestException("Video file can not be opened");
- cap >> in_mat;
- auto pipeline = comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- pipeline.setSource<cv::gapi::wip::GCaptureSource>(filepath);
- pipeline.start();
- while (num_frames < max_frames && pipeline.pull(cv::gout(gapi_age, gapi_gender)))
- {
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- ++num_frames;
- cap >> in_mat;
- }
- pipeline.stop();
- }
- TEST(InferROI, TestStreamingInfer)
- {
- initDLDTDataPath();
- std::string filepath = findDataFile("cv/video/768x576.avi");
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- cv::Mat gapi_age, gapi_gender;
- cv::Rect rect(cv::Point{64, 60}, cv::Size{96, 96});
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GOpaque<cv::Rect> roi;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(4u);
- std::size_t num_frames = 0u;
- std::size_t max_frames = 10u;
- cv::VideoCapture cap;
- cap.open(filepath);
- if (!cap.isOpened())
- throw SkipTestException("Video file can not be opened");
- cap >> in_mat;
- auto pipeline = comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- pipeline.setSource(
- cv::gin(cv::gapi::wip::make_src<cv::gapi::wip::GCaptureSource>(filepath), rect));
- pipeline.start();
- while (num_frames < max_frames && pipeline.pull(cv::gout(gapi_age, gapi_gender)))
- {
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rect.x)
- , static_cast<std::size_t>(rect.y)
- , static_cast<std::size_t>(rect.width)
- , static_cast<std::size_t>(rect.height)
- };
- IE::Blob::Ptr roi_blob = IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_mat), ie_rc);
- infer_request.SetBlob("data", roi_blob);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- ++num_frames;
- cap >> in_mat;
- }
- pipeline.stop();
- }
- TEST(InferList, TestStreamingInfer)
- {
- initDLDTDataPath();
- std::string filepath = findDataFile("cv/video/768x576.avi");
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- std::vector<cv::Mat> ie_ages, ie_genders, gapi_ages, gapi_genders;
- std::vector<cv::Rect> roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GArray<cv::Rect> roi;
- cv::GArray<GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(4u);
- std::size_t num_frames = 0u;
- std::size_t max_frames = 10u;
- cv::VideoCapture cap;
- cap.open(filepath);
- if (!cap.isOpened())
- throw SkipTestException("Video file can not be opened");
- cap >> in_mat;
- auto pipeline = comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- pipeline.setSource(
- cv::gin(cv::gapi::wip::make_src<cv::gapi::wip::GCaptureSource>(filepath), roi_list));
- pipeline.start();
- while (num_frames < max_frames && pipeline.pull(cv::gout(gapi_ages, gapi_genders)))
- {
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- auto frame_blob = cv::gapi::ie::util::to_ie(in_mat);
- for (auto &&rc : roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- infer_request.SetBlob("data", IE::make_shared_blob(frame_blob, ie_rc));
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- } // namespace IE = ..
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(ie_ages [0], gapi_ages [0], "0: Test age output");
- normAssert(ie_genders[0], gapi_genders[0], "0: Test gender output");
- normAssert(ie_ages [1], gapi_ages [1], "1: Test age output");
- normAssert(ie_genders[1], gapi_genders[1], "1: Test gender output");
- ie_ages.clear();
- ie_genders.clear();
- ++num_frames;
- cap >> in_mat;
- }
- }
- TEST(Infer2, TestStreamingInfer)
- {
- initDLDTDataPath();
- std::string filepath = findDataFile("cv/video/768x576.avi");
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- std::vector<cv::Mat> ie_ages, ie_genders, gapi_ages, gapi_genders;
- std::vector<cv::Rect> roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(4u);
- std::size_t num_frames = 0u;
- std::size_t max_frames = 10u;
- cv::VideoCapture cap;
- cap.open(filepath);
- if (!cap.isOpened())
- throw SkipTestException("Video file can not be opened");
- cap >> in_mat;
- auto pipeline = comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- pipeline.setSource(
- cv::gin(cv::gapi::wip::make_src<cv::gapi::wip::GCaptureSource>(filepath), roi_list));
- pipeline.start();
- while (num_frames < max_frames && pipeline.pull(cv::gout(gapi_ages, gapi_genders)))
- {
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- auto frame_blob = cv::gapi::ie::util::to_ie(in_mat);
- for (auto &&rc : roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- infer_request.SetBlob("data", IE::make_shared_blob(frame_blob, ie_rc));
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- } // namespace IE = ..
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(ie_ages [0], gapi_ages [0], "0: Test age output");
- normAssert(ie_genders[0], gapi_genders[0], "0: Test gender output");
- normAssert(ie_ages [1], gapi_ages [1], "1: Test age output");
- normAssert(ie_genders[1], gapi_genders[1], "1: Test gender output");
- ie_ages.clear();
- ie_genders.clear();
- ++num_frames;
- cap >> in_mat;
- }
- pipeline.stop();
- }
- TEST(InferEmptyList, TestStreamingInfer)
- {
- initDLDTDataPath();
- std::string filepath = findDataFile("cv/video/768x576.avi");
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- std::vector<cv::Mat> ie_ages, ie_genders, gapi_ages, gapi_genders;
- // NB: Empty list of roi
- std::vector<cv::Rect> roi_list;
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GArray<cv::Rect> roi;
- cv::GArray<GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(4u);
- std::size_t num_frames = 0u;
- std::size_t max_frames = 1u;
- cv::VideoCapture cap;
- cap.open(filepath);
- if (!cap.isOpened())
- throw SkipTestException("Video file can not be opened");
- cap >> in_mat;
- auto pipeline = comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- pipeline.setSource(
- cv::gin(cv::gapi::wip::make_src<cv::gapi::wip::GCaptureSource>(filepath), roi_list));
- pipeline.start();
- while (num_frames < max_frames && pipeline.pull(cv::gout(gapi_ages, gapi_genders)))
- {
- EXPECT_TRUE(gapi_ages.empty());
- EXPECT_TRUE(gapi_genders.empty());
- }
- }
- TEST(Infer2EmptyList, TestStreamingInfer)
- {
- initDLDTDataPath();
- std::string filepath = findDataFile("cv/video/768x576.avi");
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- // Load IE network, initialize input data using that.
- cv::Mat in_mat;
- std::vector<cv::Mat> ie_ages, ie_genders, gapi_ages, gapi_genders;
- // NB: Empty list of roi
- std::vector<cv::Rect> roi_list;
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(4u);
- std::size_t num_frames = 0u;
- std::size_t max_frames = 1u;
- cv::VideoCapture cap;
- cap.open(filepath);
- if (!cap.isOpened())
- throw SkipTestException("Video file can not be opened");
- cap >> in_mat;
- auto pipeline = comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- pipeline.setSource(
- cv::gin(cv::gapi::wip::make_src<cv::gapi::wip::GCaptureSource>(filepath), roi_list));
- pipeline.start();
- while (num_frames < max_frames && pipeline.pull(cv::gout(gapi_ages, gapi_genders)))
- {
- EXPECT_TRUE(gapi_ages.empty());
- EXPECT_TRUE(gapi_genders.empty());
- }
- }
- TEST_F(InferWithReshape, TestInfer)
- {
- // IE code
- infer(m_in_mat);
- // G-API code
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" }).cfgInputReshape({{"data", reshape_dims}});
- comp.apply(cv::gin(m_in_mat), cv::gout(m_out_gapi_ages.front(), m_out_gapi_genders.front()),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(InferWithReshape, TestInferInImage)
- {
- // Input image already has 70x70 size
- cv::Mat rsz;
- cv::resize(m_in_mat, rsz, cv::Size(70, 70));
- // IE code
- infer(rsz);
- // G-API code
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" }).cfgInputReshape({"data"});
- // Reshape CNN input by input image size
- comp.apply(cv::gin(rsz), cv::gout(m_out_gapi_ages.front(), m_out_gapi_genders.front()),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(InferWithReshape, TestInferForSingleLayer)
- {
- // IE code
- infer(m_in_mat);
- // G-API code
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgInputReshape("data", reshape_dims);
- comp.apply(cv::gin(m_in_mat), cv::gout(m_out_gapi_ages.front(), m_out_gapi_genders.front()),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(InferWithReshape, TestInferList)
- {
- // IE code
- infer(m_in_mat, true);
- // G-API code
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" }).cfgInputReshape({{"data", reshape_dims}});
- comp.apply(cv::gin(m_in_mat, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(InferWithReshape, TestInferList2)
- {
- // IE code
- infer(m_in_mat, true);
- // G-API code
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" }).cfgInputReshape({{"data", reshape_dims}});
- comp.apply(cv::gin(m_in_mat, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(InferWithReshape, TestInferListBGR)
- {
- // IE code
- infer(m_in_mat, true);
- // G-API code
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaBGR>(m_in_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" }).cfgInputReshape({{"data", reshape_dims}});
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(InferWithReshapeNV12, TestInferListYUV)
- {
- // G-API code
- cv::GFrame in;
- cv::GArray<cv::Rect> rr;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(m_in_y, m_in_uv);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" }).cfgInputReshape({{"data", reshape_dims}});
- comp.apply(cv::gin(frame, m_roi_list),
- cv::gout(m_out_gapi_ages, m_out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate
- validate();
- }
- TEST_F(ROIList, CallInferMultipleTimes)
- {
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- auto cc = comp.compile(cv::descr_of(cv::gin(m_in_mat, m_roi_list)),
- cv::compile_args(cv::gapi::networks(pp)));
- for (int i = 0; i < 10; ++i) {
- cc(cv::gin(m_in_mat, m_roi_list), cv::gout(m_out_gapi_ages, m_out_gapi_genders));
- }
- validate();
- }
- TEST(IEFrameAdapter, blobParams)
- {
- cv::Mat bgr = cv::Mat::eye(240, 320, CV_8UC3);
- cv::MediaFrame frame = cv::MediaFrame::Create<TestMediaBGR>(bgr);
- auto expected = std::make_pair(IE::TensorDesc{IE::Precision::U8, {1, 3, 300, 300},
- IE::Layout::NCHW},
- IE::ParamMap{{"HELLO", 42}, {"COLOR_FORMAT",
- IE::ColorFormat::NV12}});
- auto actual = cv::util::any_cast<decltype(expected)>(frame.blobParams());
- EXPECT_EQ(expected, actual);
- }
- namespace
- {
- struct Sync {
- std::mutex m;
- std::condition_variable cv;
- int counter = 0;
- };
- class GMockMediaAdapter final: public cv::MediaFrame::IAdapter {
- public:
- explicit GMockMediaAdapter(cv::Mat m, std::shared_ptr<Sync> sync)
- : m_mat(m), m_sync(sync) {
- }
- cv::GFrameDesc meta() const override {
- return cv::GFrameDesc{cv::MediaFormat::BGR, m_mat.size()};
- }
- cv::MediaFrame::View access(cv::MediaFrame::Access) override {
- cv::MediaFrame::View::Ptrs pp = { m_mat.ptr(), nullptr, nullptr, nullptr };
- cv::MediaFrame::View::Strides ss = { m_mat.step, 0u, 0u, 0u };
- return cv::MediaFrame::View(std::move(pp), std::move(ss));
- }
- ~GMockMediaAdapter() {
- {
- std::lock_guard<std::mutex> lk{m_sync->m};
- m_sync->counter--;
- }
- m_sync->cv.notify_one();
- }
- private:
- cv::Mat m_mat;
- std::shared_ptr<Sync> m_sync;
- };
- // NB: This source is needed to simulate real
- // cases where the memory resources are limited.
- // GMockSource(int limit) - accept the number of MediaFrames that
- // the source can produce until resources are over.
- class GMockSource : public cv::gapi::wip::IStreamSource {
- public:
- explicit GMockSource(int limit)
- : m_limit(limit), m_mat(cv::Size(1920, 1080), CV_8UC3),
- m_sync(new Sync{}) {
- cv::randu(m_mat, cv::Scalar::all(0), cv::Scalar::all(255));
- }
- bool pull(cv::gapi::wip::Data& data) {
- std::unique_lock<std::mutex> lk(m_sync->m);
- m_sync->counter++;
- // NB: Can't produce new frames until old ones are released.
- m_sync->cv.wait(lk, [this]{return m_sync->counter <= m_limit;});
- data = cv::MediaFrame::Create<GMockMediaAdapter>(m_mat, m_sync);
- return true;
- }
- GMetaArg descr_of() const override {
- return GMetaArg{cv::GFrameDesc{cv::MediaFormat::BGR, m_mat.size()}};
- }
- private:
- int m_limit;
- cv::Mat m_mat;
- std::shared_ptr<Sync> m_sync;
- };
- struct LimitedSourceInfer: public ::testing::Test {
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- LimitedSourceInfer()
- : comp([](){
- cv::GFrame in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- return cv::GComputation(cv::GIn(in), cv::GOut(age, gender));
- }) {
- initDLDTDataPath();
- }
- GStreamingCompiled compileStreaming(int nireq) {
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id }
- .cfgOutputLayers({ "age_conv3", "prob" })
- .cfgNumRequests(nireq);
- return comp.compileStreaming(cv::compile_args(cv::gapi::networks(pp)));
- }
- void run(const int max_frames, const int limit, const int nireq) {
- auto pipeline = compileStreaming(nireq);
- pipeline.setSource<GMockSource>(limit);
- pipeline.start();
- int num_frames = 0;
- while (num_frames != max_frames &&
- pipeline.pull(cv::gout(out_age, out_gender))) {
- ++num_frames;
- }
- }
- cv::GComputation comp;
- cv::Mat out_age, out_gender;
- };
- } // anonymous namespace
- TEST_F(LimitedSourceInfer, ReleaseFrame)
- {
- constexpr int max_frames = 50;
- constexpr int resources_limit = 1;
- constexpr int nireq = 1;
- run(max_frames, resources_limit, nireq);
- }
- TEST_F(LimitedSourceInfer, ReleaseFrameAsync)
- {
- constexpr int max_frames = 50;
- constexpr int resources_limit = 4;
- constexpr int nireq = 8;
- run(max_frames, resources_limit, nireq);
- }
- TEST(TestAgeGenderIE, InferWithBatch)
- {
- initDLDTDataPath();
- constexpr int batch_size = 4;
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml");
- params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin");
- params.device_id = "CPU";
- cv::Mat in_mat({batch_size, 3, 320, 240}, CV_8U);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto net = cv::gimpl::ie::wrap::readNetwork(params);
- setNetParameters(net);
- net.setBatchSize(batch_size);
- auto this_network = cv::gimpl::ie::wrap::loadNetwork(plugin, net, params);
- auto infer_request = this_network.CreateInferRequest();
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat));
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.weights_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" })
- .cfgBatchSize(batch_size);
- comp.apply(cv::gin(in_mat), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(ImportNetwork, Infer)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Mat in_mat(320, 240, CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_mat), info);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(ImportNetwork, InferNV12)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path= compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Size sz{320, 240};
- cv::Mat in_y_mat(sz, CV_8UC1);
- cv::randu(in_y_mat, 0, 255);
- cv::Mat in_uv_mat(sz / 2, CV_8UC2);
- cv::randu(in_uv_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- info.setColorFormat(IE::ColorFormat::NV12);
- infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(in_y_mat, in_uv_mat), info);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GFrame in;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(in_y_mat, in_uv_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(ImportNetwork, InferROI)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Mat in_mat(320, 240, CV_8UC3);
- cv::randu(in_mat, 0, 255);
- cv::Mat gapi_age, gapi_gender;
- cv::Rect rect(cv::Point{64, 60}, cv::Size{96, 96});
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rect.x)
- , static_cast<std::size_t>(rect.y)
- , static_cast<std::size_t>(rect.width)
- , static_cast<std::size_t>(rect.height)
- };
- IE::Blob::Ptr roi_blob = IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_mat), ie_rc);
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- infer_request.SetBlob("data", roi_blob, info);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in;
- cv::GOpaque<cv::Rect> roi;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat, rect), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(ImportNetwork, InferROINV12)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Size sz{320, 240};
- cv::Mat in_y_mat(sz, CV_8UC1);
- cv::randu(in_y_mat, 0, 255);
- cv::Mat in_uv_mat(sz / 2, CV_8UC2);
- cv::randu(in_uv_mat, 0, 255);
- cv::Rect rect(cv::Point{64, 60}, cv::Size{96, 96});
- cv::Mat gapi_age, gapi_gender;
- // Load & run IE network
- IE::Blob::Ptr ie_age, ie_gender;
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rect.x)
- , static_cast<std::size_t>(rect.y)
- , static_cast<std::size_t>(rect.width)
- , static_cast<std::size_t>(rect.height)
- };
- IE::Blob::Ptr roi_blob =
- IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_y_mat, in_uv_mat), ie_rc);
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- info.setColorFormat(IE::ColorFormat::NV12);
- infer_request.SetBlob("data", roi_blob, info);
- infer_request.Infer();
- ie_age = infer_request.GetBlob("age_conv3");
- ie_gender = infer_request.GetBlob("prob");
- }
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GFrame in;
- cv::GOpaque<cv::Rect> roi;
- cv::GMat age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(roi, in);
- cv::GComputation comp(cv::GIn(in, roi), cv::GOut(age, gender));
- auto frame = MediaFrame::Create<TestMediaNV12>(in_y_mat, in_uv_mat);
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(frame, rect), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- normAssert(cv::gapi::ie::util::to_ocv(ie_age), gapi_age, "Test age output" );
- normAssert(cv::gapi::ie::util::to_ocv(ie_gender), gapi_gender, "Test gender output");
- }
- TEST(ImportNetwork, InferList)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Mat in_mat(320, 240, CV_8UC3);
- cv::randu(in_mat, 0, 255);
- std::vector<cv::Rect> roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- std::vector<cv::Mat> out_ie_ages, out_ie_genders, out_gapi_ages, out_gapi_genders;
- // Load & run IE network
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- for (auto &&rc : roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- IE::Blob::Ptr roi_blob =
- IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_mat), ie_rc);
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- infer_request.SetBlob("data", roi_blob, info);
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat, roi_list), cv::gout(out_gapi_ages, out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- GAPI_Assert(!out_gapi_ages.empty());
- ASSERT_EQ(out_gapi_genders.size(), out_gapi_ages.size());
- ASSERT_EQ(out_gapi_ages.size(), out_ie_ages.size());
- ASSERT_EQ(out_gapi_genders.size(), out_ie_genders.size());
- const size_t size = out_gapi_ages.size();
- for (size_t i = 0; i < size; ++i) {
- normAssert(out_ie_ages [i], out_gapi_ages [i], "Test age output");
- normAssert(out_ie_genders[i], out_gapi_genders[i], "Test gender output");
- }
- }
- TEST(ImportNetwork, InferListNV12)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Size sz{320, 240};
- cv::Mat in_y_mat(sz, CV_8UC1);
- cv::randu(in_y_mat, 0, 255);
- cv::Mat in_uv_mat(sz / 2, CV_8UC2);
- cv::randu(in_uv_mat, 0, 255);
- std::vector<cv::Rect> roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- std::vector<cv::Mat> out_ie_ages, out_ie_genders, out_gapi_ages, out_gapi_genders;
- // Load & run IE network
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- for (auto &&rc : roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- IE::Blob::Ptr roi_blob =
- IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_y_mat, in_uv_mat), ie_rc);
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- info.setColorFormat(IE::ColorFormat::NV12);
- infer_request.SetBlob("data", roi_blob, info);
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(rr, in);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- auto frame = MediaFrame::Create<TestMediaNV12>(in_y_mat, in_uv_mat);
- comp.apply(cv::gin(frame, roi_list), cv::gout(out_gapi_ages, out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- GAPI_Assert(!out_gapi_ages.empty());
- ASSERT_EQ(out_gapi_genders.size(), out_gapi_ages.size());
- ASSERT_EQ(out_gapi_ages.size(), out_ie_ages.size());
- ASSERT_EQ(out_gapi_genders.size(), out_ie_genders.size());
- const size_t size = out_gapi_ages.size();
- for (size_t i = 0; i < size; ++i) {
- normAssert(out_ie_ages [i], out_gapi_ages [i], "Test age output");
- normAssert(out_ie_genders[i], out_gapi_genders[i], "Test gender output");
- }
- }
- TEST(ImportNetwork, InferList2)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Mat in_mat(320, 240, CV_8UC3);
- cv::randu(in_mat, 0, 255);
- std::vector<cv::Rect> roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- std::vector<cv::Mat> out_ie_ages, out_ie_genders, out_gapi_ages, out_gapi_genders;
- // Load & run IE network
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- for (auto &&rc : roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- IE::Blob::Ptr roi_blob =
- IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_mat), ie_rc);
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- infer_request.SetBlob("data", roi_blob, info);
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GArray<cv::Rect> rr;
- cv::GMat in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- comp.apply(cv::gin(in_mat, roi_list), cv::gout(out_gapi_ages, out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- GAPI_Assert(!out_gapi_ages.empty());
- ASSERT_EQ(out_gapi_genders.size(), out_gapi_ages.size());
- ASSERT_EQ(out_gapi_ages.size(), out_ie_ages.size());
- ASSERT_EQ(out_gapi_genders.size(), out_ie_genders.size());
- const size_t size = out_gapi_ages.size();
- for (size_t i = 0; i < size; ++i) {
- normAssert(out_ie_ages [i], out_gapi_ages [i], "Test age output");
- normAssert(out_ie_genders[i], out_gapi_genders[i], "Test gender output");
- }
- }
- TEST(ImportNetwork, InferList2NV12)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- cv::Size sz{320, 240};
- cv::Mat in_y_mat(sz, CV_8UC1);
- cv::randu(in_y_mat, 0, 255);
- cv::Mat in_uv_mat(sz / 2, CV_8UC2);
- cv::randu(in_uv_mat, 0, 255);
- std::vector<cv::Rect> roi_list = {
- cv::Rect(cv::Point{64, 60}, cv::Size{ 96, 96}),
- cv::Rect(cv::Point{50, 32}, cv::Size{128, 160}),
- };
- std::vector<cv::Mat> out_ie_ages, out_ie_genders, out_gapi_ages, out_gapi_genders;
- // Load & run IE network
- {
- auto plugin = cv::gimpl::ie::wrap::getPlugin(params);
- auto this_network = cv::gimpl::ie::wrap::importNetwork(plugin, params);
- auto infer_request = this_network.CreateInferRequest();
- for (auto &&rc : roi_list) {
- const auto ie_rc = IE::ROI {
- 0u
- , static_cast<std::size_t>(rc.x)
- , static_cast<std::size_t>(rc.y)
- , static_cast<std::size_t>(rc.width)
- , static_cast<std::size_t>(rc.height)
- };
- IE::Blob::Ptr roi_blob =
- IE::make_shared_blob(cv::gapi::ie::util::to_ie(in_y_mat, in_uv_mat), ie_rc);
- IE::PreProcessInfo info;
- info.setResizeAlgorithm(IE::RESIZE_BILINEAR);
- info.setColorFormat(IE::ColorFormat::NV12);
- infer_request.SetBlob("data", roi_blob, info);
- infer_request.Infer();
- using namespace cv::gapi::ie::util;
- out_ie_ages.push_back(to_ocv(infer_request.GetBlob("age_conv3")).clone());
- out_ie_genders.push_back(to_ocv(infer_request.GetBlob("prob")).clone());
- }
- }
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GArray<cv::Rect> rr;
- cv::GFrame in;
- cv::GArray<cv::GMat> age, gender;
- std::tie(age, gender) = cv::gapi::infer2<AgeGender>(in, rr);
- cv::GComputation comp(cv::GIn(in, rr), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- auto frame = MediaFrame::Create<TestMediaNV12>(in_y_mat, in_uv_mat);
- comp.apply(cv::gin(frame, roi_list), cv::gout(out_gapi_ages, out_gapi_genders),
- cv::compile_args(cv::gapi::networks(pp)));
- // Validate with IE itself (avoid DNN module dependency here)
- GAPI_Assert(!out_gapi_ages.empty());
- ASSERT_EQ(out_gapi_genders.size(), out_gapi_ages.size());
- ASSERT_EQ(out_gapi_ages.size(), out_ie_ages.size());
- ASSERT_EQ(out_gapi_genders.size(), out_ie_genders.size());
- const size_t size = out_gapi_ages.size();
- for (size_t i = 0; i < size; ++i) {
- normAssert(out_ie_ages [i], out_gapi_ages [i], "Test age output");
- normAssert(out_ie_genders[i], out_gapi_genders[i], "Test gender output");
- }
- }
- TEST(TestAgeGender, ThrowBlobAndInputPrecisionMismatch)
- {
- const std::string device = "MYRIAD";
- skipIfDeviceNotAvailable(device);
- initDLDTDataPath();
- cv::gapi::ie::detail::ParamDesc params;
- // NB: Precision for inputs is U8.
- params.model_path = compileAgeGenderBlob(device);
- params.device_id = device;
- // Configure & run G-API
- using AGInfo = std::tuple<cv::GMat, cv::GMat>;
- G_API_NET(AgeGender, <AGInfo(cv::GMat)>, "test-age-gender");
- cv::GMat in, age, gender;
- std::tie(age, gender) = cv::gapi::infer<AgeGender>(in);
- cv::GComputation comp(cv::GIn(in), cv::GOut(age, gender));
- auto pp = cv::gapi::ie::Params<AgeGender> {
- params.model_path, params.device_id
- }.cfgOutputLayers({ "age_conv3", "prob" });
- cv::Mat in_mat(320, 240, CV_32FC3);
- cv::randu(in_mat, 0, 1);
- cv::Mat gapi_age, gapi_gender;
- // NB: Blob precision is U8, but user pass FP32 data, so exception will be thrown.
- // Now exception comes directly from IE, but since G-API has information
- // about data precision at the compile stage, consider the possibility of
- // throwing exception from there.
- EXPECT_ANY_THROW(comp.apply(cv::gin(in_mat), cv::gout(gapi_age, gapi_gender),
- cv::compile_args(cv::gapi::networks(pp))));
- }
- #ifdef HAVE_NGRAPH
- TEST(Infer, ModelWith2DInputs)
- {
- const std::string model_name = "ModelWith2DInputs";
- const std::string model_path = model_name + ".xml";
- const std::string weights_path = model_name + ".bin";
- const std::string device_id = "CPU";
- const int W = 10;
- const int H = 5;
- // NB: Define model with 2D inputs.
- auto in1 = std::make_shared<ngraph::op::Parameter>(
- ngraph::element::Type_t::u8,
- ngraph::Shape(std::vector<size_t>{(size_t)H, (size_t)W})
- );
- auto in2 = std::make_shared<ngraph::op::Parameter>(
- ngraph::element::Type_t::u8,
- ngraph::Shape(std::vector<size_t>{(size_t)H, (size_t)W})
- );
- auto result = std::make_shared<ngraph::op::v1::Add>(in1, in2);
- auto func = std::make_shared<ngraph::Function>(
- ngraph::OutputVector{result},
- ngraph::ParameterVector{in1, in2}
- );
- cv::Mat in_mat1(std::vector<int>{H, W}, CV_8U),
- in_mat2(std::vector<int>{H, W}, CV_8U),
- gapi_mat, ref_mat;
- cv::randu(in_mat1, 0, 100);
- cv::randu(in_mat2, 0, 100);
- cv::add(in_mat1, in_mat2, ref_mat, cv::noArray(), CV_32F);
- // Compile xml file
- IE::CNNNetwork(func).serialize(model_path);
- // Configure & run G-API
- cv::GMat g_in1, g_in2;
- cv::GInferInputs inputs;
- inputs[in1->get_name()] = g_in1;
- inputs[in2->get_name()] = g_in2;
- auto outputs = cv::gapi::infer<cv::gapi::Generic>(model_name, inputs);
- auto out = outputs.at(result->get_name());
- cv::GComputation comp(cv::GIn(g_in1, g_in2), cv::GOut(out));
- auto pp = cv::gapi::ie::Params<cv::gapi::Generic>(model_name,
- model_path,
- weights_path,
- device_id);
- comp.apply(cv::gin(in_mat1, in_mat2), cv::gout(gapi_mat),
- cv::compile_args(cv::gapi::networks(pp)));
- normAssert(ref_mat, gapi_mat, "Test model output");
- }
- #endif // HAVE_NGRAPH
- } // namespace opencv_test
- #endif // HAVE_INF_ENGINE
|