From f8d889e1f82e78dea68a6e8e395d9149cdcf3102 Mon Sep 17 00:00:00 2001 From: am0ebe <am0ebe@gmx.de> Date: Wed, 31 Jan 2024 17:54:38 +0100 Subject: [PATCH] sort/update notes/todo and add link to cmds.cpp for quick rehash of c++ syntax/snippets --- b | 2 +- dox/cmds.cpp | 1 + dox/notes | 230 ------------------------------------ dox/notes_A | 5 + dox/notes_B | 79 ++++++++++++- dox/notes_C | 4 +- dox/timeplan-milestones.ods | Bin 21804 -> 22633 bytes dox/todo_ct | 129 ++++++++------------ 8 files changed, 134 insertions(+), 316 deletions(-) create mode 120000 dox/cmds.cpp diff --git a/b b/b index b819b9b..a6d5b19 160000 --- a/b +++ b/b @@ -1 +1 @@ -Subproject commit b819b9b8792adc4b207fb1a01855dbb2ac25e4a0 +Subproject commit a6d5b193aa6c6d525828e9de7677701f3e4b1252 diff --git a/dox/cmds.cpp b/dox/cmds.cpp new file mode 120000 index 0000000..fcee972 --- /dev/null +++ b/dox/cmds.cpp @@ -0,0 +1 @@ +/home/sugu/dox/cmds/cmds.cpp \ No newline at end of file diff --git a/dox/notes b/dox/notes index bdede4a..d8b610e 100644 --- a/dox/notes +++ b/dox/notes @@ -15,239 +15,9 @@ get feedback (occassionaly) ## Software A - Frame grab - recorder - ctb ############################################################# -# setup Vimba - > see Vimba_installation_under_Linux.pdf - > download and unpack Vimba SDK - > tar -xzf ./Vimba.tgz - > sudo ./VimbaGigETL/Install.sh -## SETUP GT1920C: -> connect lap and cam directly via ethernet -> set MTU to 8228 (jumbo frames/packets) -> set fixed IP for eth-adapter first and then cam (use Vimbaviewer -> force IP) - eth 169.254.100.1 - cam 169.254.x.x # on restart will pick random IP... - mac - 000f310338D3 - 000f310338D4 - sub 255.255.0.0 - (gat 0.0.0.0 local / none) - -> ip address of each adapter needs to be on a unique subnet - -> for multiple cams calc bandwith and use switch -# What bandwidth do i have? Do i need multiple ports? -bandwith = fps * pixel format(bpp) * resolution (* ncams) -StreamBytesPerSecond = 17 * 3 * 1936 * 1216 * 1 = 8 456 448 ~= 8,4 MBps < 125MBps - - 1. Determine max_speed with highest fps! - 2. Take max_speed and reduce fps so it still fits 2*max_speed - -> subsample same video ? - 3. calc mean_err through comparing 1. and 2. -> add to 2. as it will be lower. - - !! exposure and fps: on 10fps exposure can't be more then 100ms! - !! exposure and fps: on 17fps exposure can't be more then 59ms! - Best practice: set gain to lowest possible val and increase exposure as needed - !! if you use more than one cam on one interface, the available bandwidth has to be shared between interfaces. - -############################### -# bandwidth calculations for Alvium G1 240C -MAX BANDWITH for Gigabit ethernet port ~= 125 Mbps -max res: 1936x1216 -max fps: 49 -pixelformat: RGB8 > different options. eg 10bit/12bit RGB/MONO. - 1936 * 1216 * 49 * 1 ~= 115,3 MBps >> MONO8 @ maxFPS - 1936 * 1216 * 17 * 1 ~= 40,0 MBps >> MONO8 @ 17FPS - @ 1 Min -> 2.4GB - @ 30 Mins -> 144GB - with 60 recordings: 8.6TB - 1936 * 1216 * 17 * 3 ~= 120,1 MBps >> RGB8 @ 17FPS - @ 1 Min -> 7.2GB - @ 30 Mins -> 216.1GB - with 60 recordings: 13 TB - - 1936 * 1216 * 10 * 3 ~= 70,6 MBps - @ 1 Min -> 4.2 GB - @ 30 Mins -> 127.1 GB - with 60 recordings: 7.6TB - -Storage old ws: - 2TB: 2*1TB (7200RPM = 6GB/s) - 8Gb DDR3 RAM - Intel Xeon 3.6Ghz (4 cores) - - default bandwidth:115MBps -------------------------------- -Save "reasonable" settings in XML. -If dark, set ExposureTimeAbs -Q: how to set fps to 3? - - -##################################### -## Background Substraction - BGS -#################################### - - -#define bgs_register(x) static BGS_Register<x> register_##x(quote(x)) -## >> glue together macro? -quote() adds "" - -bgs_register(Tapter) ->> static BGS_Register<Tapter> register_Tapter("Tapter") - -/usr/include/opencv4/opencv2/opencv.hpp -PCA? - - -> difference - virtual(); - virtual(){ /*empty*/ } - virtual() = 0; #pure virtual - -> also difference - > virtual dtor(): if pointer to base-class deletes object - > pure virtual dtor(): need to also define function body, cuz dtor is special function whis is not overriden - > interface class (needs pure virtual??) - > abc - abstract base class. can't be instantiated anymore - > abc <> interface? - - - // IplImage is oldskool mat and not supported anymore.. - - > use smartpointer like so: - auto videoAnalysis = std::make_unique<VideoAnalysis>(); - videoCapture = std::make_unique<VideoCapture>(); - frameProcessor = std::make_shared<FrameProcessor>(); - - -## libarchive stuff -############################### - archive_read_xxx() - archive_write_xxx() - struct archive_entry - -huge workaround for corrupted files -clock -random -command arg parser - - - -??? -#if CV_MAJOR_VERSION > 3 || (CV_MAJOR_VERSION == 3 && CV_SUBMINOR_VERSION >= 9) - IplImage _frame = cvIplImage(img_input); - frame = &_frame; -#else - frame = new IplImage(img_input); -#endif - -#smartpointer?? -#elif CV_MAJOR_VERSION >= 3 - cv::Ptr<cv::BackgroundSubtractorMOG2> mog; -#endif - -############################### -WS / VM - > 8 cores, 16GB RAM, 2 TB for 1cam - > 48 cores, 128GB RAM, 6 TB for 6cam -############################### - -> What Tboy do... why did he do it? - > forked branch bgslib_qtgui_2.0.0 - > Tapter - > adapter for model - > was probably copied from LBAdaptiveSOM.cpp - --> which is disabled in openCV4 - - -Which Background Subtraction Algo to use?? - median, mean, framedifference - + simple, fast, - - not robust if light/bg changes - - slow changes ? - > adaptive bg? - fuzzy? - mixture - - -NAMES - Kernel? - LBSP? - Multilayer? - Sigma-Delta? - Vibe, T2F ,dp ,lb ,vumeter? - choquet, sugeno, zivkovic, pratimediod, LOBSTER - -Test/Use most common >> Ground Truth - Frame Difference - WeightedMovingMean / Variance - LBAdaptiveSOM - MOG2 (Mixture Of Gaussian) MixtureOfGaussianV2.h - KNN (K Nearest Neighbour) - > fast for small fg obj - > TRY! - FuzzySugenoIntegral.h - - LSBP - Local Binary Similarity Patterns - (2013) - LSBP-based GSoC ? - SuBSENSE: improved spatiotemporal LBSP + color features (2014) - - Combineable with - ROI - Canny Edge Detection - - -> bg modeling to update BG (eg moving trees) > pixel with threshold -> optic flow (camera is also moving. ) > vectoral estimation of own movement - - -features - edge - canny edge detector + calc contour - > https://en.wikipedia.org/wiki/Canny_edge_detector - roi - crop - color - RGB - not so robust by itself (sensitive to illumination, shadows, oscillations ...) - YUV - YCrCb - brightness, chroma, color - texture - robust to illumination and shadow - eg Local Binary Pattern (LBP) - -https://github.com/murari023/awesome-background-subtraction (2021 new stuff!) - -https://learnopencv.com/background-subtraction-with-opencv-and-bgs-libraries/ -http://docs.opencv.org/2.4/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html -https://hackthedeveloper.com/background-subtraction-opencv-python/ #mog2 + knn in python -https://docs.opencv.org/4.3.0/d4/dd5/classcv_1_1bgsegm_1_1BackgroundSubtractorGSOC.html#details #GSOC LSBP ALGO from openCV bgsegm.hpp - -https://openaccess.thecvf.com/content_cvpr_workshops_2014/W12/papers/St-Charles_Flexible_Background_Subtraction_2014_CVPR_paper.pdf -https://www.scitepress.org/Papers/2018/66296/66296.pdf #vehicle tracking latvia. 2018, BackgroundSubtractorMOG, BackgroundSubtractorMOG2 (zivkovic) -https://www-sop.inria.fr/members/Francois.Bremond/Postscript/AnhTuanAVSS14.pdf 2014 -https://arxiv.org/pdf/1803.07985.pdf # visual animal tracking (2018) -https://arxiv.org/pdf/1507.06821.pdf # Multimodal Deep Learning for Robust RGB-D Object Recognition (2015) -https://towardsdatascience.com/background-removal-with-deep-learning-c4f2104b3157?gi=2ef3a5272e5d (2017 Background removal with deep learning) - -https://opencv.org/courses/ #xpensive ai course -https://www.fast.ai/ #free ai course - -Build with Python or C++? - - -################## -# computervision # -################## -background subtraction (bgs) -segmentation - Semantic Segmentation (ai) -detection (feature, object) -classification (category recognition) - -Challenges: Occlusion, (Sensor-)Noise, changing external conditions( lighting, Shadows, fog, reflection ) - -> pre-training if lack of data -> corrupt data to guarantee robust learning diff --git a/dox/notes_A b/dox/notes_A index b9614b0..6f86d37 100644 --- a/dox/notes_A +++ b/dox/notes_A @@ -106,3 +106,8 @@ Prosilica GX: > give name connect inet --> as terminal to connect to server --> later: use for DMX lighting + + +# WS / VM + > 8 cores, 16GB RAM, 2 TB for 1cam + > 48 cores, 128GB RAM, 6 TB for 6cam diff --git a/dox/notes_B b/dox/notes_B index b52b7e2..f1074a5 100644 --- a/dox/notes_B +++ b/dox/notes_B @@ -16,6 +16,17 @@ map cam -> MAC -> IP -> name (contains ID) camtron4 000A471D2A66 172.18.227.213 allied-alviumg1-240c-04ytm.idiv.de camtron5 000A471D208D 172.18.225.129 allied-alviumg1-240c-04ytt.idiv.de camtron6 000A47139EA6 172.18.227.215 allied-alviumg1-240c-04ytv.idiv.de + direct: 169.254.75.147 + + +camtron1/// + 169.254.158.10 + fixed ip: 172.18.205.201 + 255.255.255.0 + gateway should: 172.18.205.254 + gateway is: 0.0.0.0 + +wired settings +169.254.100.3 255.255.0.0 ## connect VM + setup ssh ssh kr69sugu@idivtibcam01.usr.idiv.de @@ -34,7 +45,7 @@ ssh kr69sugu@idivtibcam01.usr.idiv.de IMWRITE_JPEG_QUALITY 100; IMWRITE_JPEG_OPTIMIZE 1; IMWRITE_JPEG_RST_INTERVAL 4; -# build/setup VimbaX +## setup VimbaX > download from https://www.alliedvision.com/en/products/software/vimba-x-sdk/ > see Vimba_installation_under_Linux.pdf > unpack Vimba SDK @@ -120,6 +131,23 @@ frames = img data + ancillaryData GenICam - camera standard TL - Transport Layer - transports data from cam to sw +# DeviceTemperatureSelector get temp of cam! +TimestampLatch +TimestampReset +TimestampLatchValue + +Statistics (sub cat) + StatFrameRate + StatFramesDelivered + StatFramesDropped + ... + +[UserSetSelector] +UserSetLoad +UserSetSave + +CurrentIPAddress + Buffer management ############################### @@ -296,3 +324,52 @@ EventCameraDiscovery -> listen to find plugged cams 17x1936x1456=47mio -> 17fps @ full res suggested CPU i7 3840 reduce ROI + + +# What bandwidth do i have? Do i need multiple ports? +############################### +bandwith = fps * pixel format(bpp) * resolution (* ncams) +StreamBytesPerSecond = 17 * 3 * 1936 * 1216 * 1 = 8 456 448 ~= 8,4 MBps < 125MBps + + 1. Determine max_speed with highest fps! + 2. Take max_speed and reduce fps so it still fits 2*max_speed + -> subsample same video ? + 3. calc mean_err through comparing 1. and 2. -> add to 2. as it will be lower. + + !! exposure and fps: on 10fps exposure can't be more then 100ms! + !! exposure and fps: on 17fps exposure can't be more then 59ms! + Best practice: set gain to lowest possible val and increase exposure as needed + !! if you use more than one cam on one interface, the available bandwidth has to be shared between interfaces. + +############################### +# bandwidth calculations for Alvium G1 240C +MAX BANDWITH for Gigabit ethernet port ~= 125 Mbps +max res: 1936x1216 +max fps: 49 +pixelformat: RGB8 > different options. eg 10bit/12bit RGB/MONO. + 1936 * 1216 * 49 * 1 ~= 115,3 MBps >> MONO8 @ maxFPS + 1936 * 1216 * 17 * 1 ~= 40,0 MBps >> MONO8 @ 17FPS + @ 1 Min -> 2.4GB + @ 30 Mins -> 144GB + with 60 recordings: 8.6TB + 1936 * 1216 * 17 * 3 ~= 120,1 MBps >> RGB8 @ 17FPS + @ 1 Min -> 7.2GB + @ 30 Mins -> 216.1GB + with 60 recordings: 13 TB + + 1936 * 1216 * 10 * 3 ~= 70,6 MBps + @ 1 Min -> 4.2 GB + @ 30 Mins -> 127.1 GB + with 60 recordings: 7.6TB + +Storage old ws: + 2TB: 2*1TB (7200RPM = 6GB/s) + 8Gb DDR3 RAM + Intel Xeon 3.6Ghz (4 cores) + + default bandwidth:115MBps +------------------------------- +Save "reasonable" settings in XML. +If dark, set ExposureTimeAbs +Q: how to set fps to 3? +############################### diff --git a/dox/notes_C b/dox/notes_C index 773a16a..1ebb5f3 100644 --- a/dox/notes_C +++ b/dox/notes_C @@ -4,7 +4,7 @@ git@gitlab.idiv.de:sugu/camtron.git Does - > background subtraction + > background subtraction // bgs > calculates centroid points of all frames in a record ############################### @@ -39,8 +39,8 @@ PCA? frameProcessor = std::make_shared<FrameProcessor>(); +## libarchive stuff ########### -libarchive stuff archive_read_xxx() archive_write_xxx() struct archive_entry diff --git a/dox/timeplan-milestones.ods b/dox/timeplan-milestones.ods index f6177144252286938371e5018a87c4f4c0619189..af243d44fd0f261616d34b706e7bf70aa9c71c3c 100644 GIT binary patch delta 10479 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 Tdpj31J20BYN0<w>zpVcQYre4P delta 9634 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 Te^wU+0{?l<|G=tM{?h&jHU8^( diff --git a/dox/todo_ct b/dox/todo_ct index bff9bf6..2c62887 100644 --- a/dox/todo_ct +++ b/dox/todo_ct @@ -8,9 +8,9 @@ CAMTRON PROCESSING PIPELINE ########################### "tackle long-term complex projects from beginning to end" -- keep up new work habit - consistently work 20-30 hwâ»Â¹ -- use copilot more efficiently -- ‼ï¸cam work with VM? (MTU) +- â²ï¸ +- ðŸ—£ï¸ sebastian hostname-fix IP +- â€¼ï¸ cam works with VM? read docu, write alliedvision -- if yes. test (VV) @@ -18,10 +18,10 @@ CAMTRON PROCESSING PIPELINE -- if no - communicate w sebastian 1rst. - communicate w uli -- ‼ï¸HPC. store some data. delete rest. - - write mail XX - - write joerdis -- â€¼ï¸ mv big ct-data to hdd +- â€¼ï¸ HPC. store some data 2018/2019 + vids. delete rest. write HPC guy +- â€¼ï¸ mv big ct-data to hdd +- use copilot more efficiently + - read Tuts, configure @@ -34,42 +34,31 @@ B) recorder - camera produces frames and timestamps - wait and detect cams - â€¼ï¸ produce frames & timestamps ============================ - - new architecture: console app (later: gui app) + Core. - CONSOLE APP: - in extra thread to not block main thread! - listen to user keys - - CORE APP - functions / args: - - out_dir: - parse dir arg and create it if it doesnt exist >- finish it / with proper user in/ output >- or cancel if it doesnt exist - >> EASIER: + no userinput which could complicate GUI app later... - - list cameras: - - store/load cam settings - - calibrate - - record - - stop recording - - consider using app settings in a json-file / QSettings - - cam mappings (IP/MAC/ID) - - out_dir - - GUI APP: - - build GUI - - ... parse output for -LISTCAMERAS- and put into tablewidget + CORE + - list cameras + - test: core::listCams worx with multiple cams? + + - store/load cam settings + - calibrate + - see ada - HPC - CALI SW + - record + - stop recording + - consider using app settings in a json-file / QSettings + - cam mappings (IP/MAC/ID) + - out_dir + + CONSOLE + - print: convert '\n' to linebreaks + - =============================== - - get pix, using + - get pix, using VV and recorder - laptop - direct connection - laptop - local network - virtual machine - get video via vimbax-SDK - - cam calibration (Use Viewer? Or own SW?) - - configure cam settings - * get video for 3 cams simultaneously - - what SW? - - calculate supported framerate+resolution+codec for hardware (CPU,RAM,HDD...) - - or do tests and see if frames are dropped - + - get video for 3 cams simultaneously + - do tests and see if frames are dropped - central config - threads for started recordings [PID] - storage folder @@ -80,13 +69,13 @@ B) recorder - camera produces frames and timestamps A) ########################### - - VM - - light + - test vm, else buy ws! + - !! light - 2*LEDs: 1*day + 1*night - find ecolux hw (Boxes, DMX per unit, DMX splitter/controller) - - arenas + - !! arenas - Acrylzylinder in 2 teile gesaegt. - - floor + - floor ? - gips+color+lack.. @@ -132,6 +121,12 @@ X) HPC - High Performance Cluster BACK-BURNER 2D ############################### +ctb +- GUI APP: + - build GUI + - ... parse output for -LISTCAMERAS- and put into tablewidget +- calculate supported framerate+resolution+codec for hardware (CPU,RAM,HDD...) + - Documentation - sketch - chamber: cam height+resolution+arena diameter for pixel to cm/mm ratio @@ -147,49 +142,19 @@ BACK-BURNER 2D Done ####################### -- started working 20-26 hwâ»Â¹ for 3 weeks now :) - - habit. consistency! -- started writing C++ again (+bash,+python) - - setup IDE (LSP plugins), QT, codecompletion - - get copilot +- print and printlist() +- integrate versionstring in new arch +- mark current cam [*] <-- selected. others [] +- write allied: submax MTU shouldnt be a huge performance hit! +- write mail HPC guy +- write joerdis +- list 1 cam and send to console via signal-slots +- version +- setup IDE (LSP plugins), QT, codecompletion +- get copilot - automate + fix backup script - get VM -- got pictures, tested all 6 cams :) +- direct VV: got pictures, tested all 6 cams :) - bup old camtrack - start implementing new arch - console app. thread. signal-slot connections. -- backup old tibcamtrack VM -- get video in VV -- connect VM. ssh and rdp -- sort ct a bit: - - folders, files, ... naming convention - - README + Description - - merge doc? - - b) exclude SDK / examples from repo -- attach cam arm to wood (DONE) -- test run 1 cam to estimate hw requirements - - test bottleneck (CPU,HDD,ethernet,) - - storage: 10s hochrechnen - - mit 25/17/10 FPS. - - different compression types - -- research suitable "fridges" - -- price!, temp-range, electricity inside, size space in lab? - -- more than 2 - Reach In Plant Growth Chambers E-36L1 - --------------------- - - setup stativ, use our lab - - how-to connect ETHernet cable? it will have to go outside of fridge?? - - how-to control temperature and humidity? (see picture from thomas dox) -- research WS (see hardware_notes.ods for details like specs. CPU, RAM, SSDs, prices) -- cam aufhaengung - research stativ/tripod: manfrotto arm + clamp + bodenplatte for cams - other stuff to fix cameras - stange -- sensors for temp+humidity (HOBO) -- backup data from towers -- setup tower (displays,cards,cables) -------------------------------- -- bal: func: list_suffices -- bal: function to replace all names to snake_case (upper to lower, space/dash to underscore) -- opd: works with "name containing spaces.pdf" -- use array for files instead of string concatenation in o_helper() -- bug: changed IFS in o_helper broke nav function -- GitLab