Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FINAL] Konverze ComplexMat => cv::Mat #55

Open
wants to merge 123 commits into
base: master
Choose a base branch
from

Conversation

oraveja1
Copy link

@oraveja1 oraveja1 commented Jan 8, 2020

  • Všechen kód který používal nebo referencoval třídy ComplexMat a DynMem byl nahrazen implementací na bázi cv::Mat
  • Nový kód vykazuje stejné číselné výsledky jako originál, jediné co se změnilo je struktura držitelů dat
  • Nový kód dokáže po spuštění sledovat označený objekt ve video streamu, stejně jako originál
  • Odstranění souborů complexmat a dynmem je již součástí pull requestu

Další úpravy:

  • Osobní poznámky a komentáře byly odstraněny
  • Testovací proměnné s postfixem "_Test" byly přejmenovány na jména originálních proměnných
  • Asserty v souboru fft.cpp byly opraveny a jejich použití odkomentováno

oraveja1 and others added 30 commits November 30, 2019 18:17
nyní přesunuty do nového souboru cvmat_func.h
- Prozatím asi jediná užitečná věc odstranění warning 
a přesun do nového souboru
- je třeba připravit úpravy volání v kódu k otestování
- výsledek nového volání je 2 kanálový cv::Mat
- obsah je stejný jako jeho protějšek v ComplexMat (otestováno)
- původní volání zatím ponecháno, volá se teď zápis do původní i upravené proměnné
- změna z typu MatScaleFeats na cv::Mat
- přidáno alternativní volání na začátku funkce KCF_Tracker::train
- funkce plane() a scale() patřící do MatScaleFeats byly přepsány do cvmat_func.cpp
- pro výpis cv::Mat je teď zohledněna přítomnost váce kanálů, při volbě počtu vypsaných elementů
- pro výpis cv::Mat je teď zohledněna přítomnost váce kanálů, při volbě počtu vypsaných elementů
- přejmenováno na matutil.h
- nepoužívané funkce zakomentovány
- funkce přesunuty do hlavičky ve formě statických funkcí třídy MatUtil
(definice v souboru .cpp nejsou viditelné kompilátorem ?)
replaced by matutil.h
replaced by matutil.cpp
- všechny kroky do zavolání fft.forward_window() mají přidanou alternativu, která zapisuje do nahrazující proměnné cv::Mat v Modelu
- fft.forward_window() předběžně reprezentuje reálnou a imag. složku dvěma sousedícími kanály
- MatUtil::set_channel() pozměněna pro práci s formátem cv::Mat.
- všechny změněné kroky otestovány

Pozn.:
Formát cv::Mat = Každý pixel je souvislý blok hodnot kanálů ve vnitřním poli. (délka bloku = počet kanálů)
Formát ComplexMat = Každý kanál je souvislý blok hodnot pixelů ve vnitřním poli. (délka bloku = plocha obrázku)
- v podstatě jen kopie Model::xf, nejspíš to bude jiné pro další volání funkce train() s jiným parametrem
- funkce použita v KCF_Tracker::train()
- funkce použita v KCF_Tracker::train()
…č m_use_linearkernel

- MatUtil::mul() přejmenován na mul_matn_mat1()
- přidána funkce MatUtil::mul_matn_matn()
- zatím netestováno, malá priorita upravené části
- použito v KCF_tracker::train()
- oprava struktury lambdy
- opraveno volání GaussianCorrelation v KCF_Tracker::train()
- pro GaussianCorrelation::operator() odstraněny kvalifikatory const
- přepracovana další část metody GaussianCorrelatio::operator()
- přepsáno volání v GaussianCorrelation::operator()
Your Name added 30 commits April 13, 2020 17:43
- Většina podpůrných funkcí, včetně init(), train() a track() také konvertována
- Některé ze závislých podpůrných funkcí nechány jako Mat, kvůli nekompatibilitě funkcí OpenCV
- Kód do začátku funkce KCF_Tracker::track() má v tuto chvíli otestovaný výstup jako shodný s původní implementací cv::Mat
- program by v tuto chvíli měl být připravený k přepnutí na testovací proměnné
- Před uzavřením ještě třeba provést test shody obsahu proměnných a funkce programu
- Testovací a původní verze má otestovaný shodný výstup i obsah proměnných
- Původní proměnné cv::Mat odstraněny a nahrazeny stejnojmennými cv::UMat
- Testovací volání pracující s cv::UMat nahrazují původní volání s cv::Mat
- Všechny výskyty postfixu "_Test" byly odstraněny z projektu
- Předběžné testování rychlosti zatím nevykazuje výraznější rozdíl oproti originálu
- na této funkci jsou závislé funkce sqr_mag(), conj() a add_scalar()
- podle zdrojů na internetu tato změna zrychlí průběh všech těchto funkcí zhruba 5-násobně
- problém byl v typovém argumentu forEach(), který přistupoval k datům nesprávným způsobem
- vyřešeno konverzí pracovávané matice na cv::_Mat< std::complex<float> > a vypuštěním typového argumentu forEach()
- prozatím implementováno pouze na funkcích používajících mat_const_operator(), další budou následovat
- Celý program však už teď pracuje mnohem, mnohem rychleji
- vypadá to že GAPI balíky příjmají jako vstupní argument také typ cv::Mat_< std::complex<float> >
- GAPI operace vykonávané nad takto předanými vstupy se zřejmě chovají správným způsobem, tzn. je použita artimetika std::complex<float>
- původní implementace forEach() je uchována pro pozdější porovnání výkonů obou funkcí
- GAPI nepoužito, neposkytuje nástroje potřebné ke konverzi této funkce
- otestováno na shodu výsledků
- rychlejší zpracování
- tato konverze má shodný výstup s původní funkcí
- napsána také konverze GAPI této funkce, která však NEMÁ shodný výstup s původní funkcí, ale liší se pouze na imaginárních pozicích, a pouze o drobné hodnoty
- předpokládám chybu knihovny GAPI, ponechávám v kódu pro pozdější použití
- hlavní tělo této funkce a mul_matn_matn() přesunuto do mat_mat_operator()
- funkce mul_matn_mat1() byla jako poslední konvertována na paralelní foreach()
- bohužel, GAPI ve verzi OpenCV 4.1.1 není schopná správně pracovat s maticemi obsahujícími komplexní čísla
- GAPI byla implementována na konverzích barevného formátu, konverzích typu matic, změny velikosti a klasických matematických výrazech
- GAPI nebyla implementována z větší části na funkcích MatUtil. 
Tam kde to šlo byly vytvořeny zakomentované funkce používající GAPI, které však zatím nebudou spolehlivě vykazovat správné výstupy (dokud nebude přidána oprava OpenCV)
- Funkce MatUtil byly místo toho zrychleny implementací cv::Mat.foreach(), která používá paralelní zpracování dat

- Testování programu ukázalo, že aplikace je nyní opravdu zřetelně rychlejší
- Ke konverzi použit Kernel API, vše implementováno ve stejném souboru
- Implementace Kernel API opatřena komentáři ohledně syntaxe a fungování
- Původní funkce zachovány s postfixem "_cpu" za jejich jménem
- Nové funkce používají opět cv::dft(), ale v kontextu GAPI
- Měření bohužel vykazují 2 až 3 násobné zpomalení všech upravených funkcí
- z nějakého důvodu dochází ke korupci dat ve všech Fourierových funkcích, a to včetně původní implementace
- po přepnutí na implementaci OpenCV program funguje bez problémů
- předpokládám jedno z následujícího:
	-> původní implementace v originále nefungovala
	-> fungovala, ale pod jinou verzí knihovny fftw3
	-> některá z mých předchozích úprav změnila formát inputu
- důvod proč ComplexMat dával všechny hodnoty každého kanálu do jednoho celistvého bloku je pravděpodoně kvůli této funkci
- z pohledu implementace fftw je prostor v matici kam zapsat zpracovanou submatici celistvým blokem, a současně jedním kanálem matice
- fftw zapisuje výsledné submatice postupně za sebou do datového prostoru, na který dostal ve vstupním argumentu ukazatel
- V cv::Mat jsou hodnoty jednoho kanálu rozděleny na pozice každého bodu v matici,
což způsobovalo chybnou reprezentaci dat po zápisu stylem fftw

- Původní implementace Fftw::forward_window() nyní dokáže správně pracovat s datovým typem cv::Mat místo ComplexMat
- vypuštěny nadbytečné argumenty a přeformátování v GAPI funkci
…ZHRANÍ GAPI

- implementace CUDA byla vynechána na základě dohody s vedoucím práce
- deklarovány nové GAPI funkce pomocí Kernel API, a implementovány pomocí funkcí
knihoven v daném buildu
- nové GAPI funkce otestovány na shodnost výstupu a funkčnost
- velká část funkcí je bohužel pomalejší než původní implementace
- odstraněno zakomentované implementační hřiště
- přidána funkce MatUtil::set_channel() pro typ cv::Mat
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant