From e0f9d6d3944d588519f86c22a436382c72f151c5 Mon Sep 17 00:00:00 2001 From: am0ebe <am0ebe@gmx.de> Date: Wed, 17 Jan 2024 18:40:31 +0100 Subject: [PATCH] . --- b | 2 +- dox/misc2 | 38 ++++++++ dox/notes | 123 ++++++------------------- dox/notes_A | 8 +- dox/notes_B | 72 +++++++++++---- dox/timeplan-milestones.ods | Bin 11672 -> 21804 bytes dox/todo_ct | 178 +++++++++--------------------------- 7 files changed, 170 insertions(+), 251 deletions(-) diff --git a/b b/b index 76dbeb7..a77e05c 160000 --- a/b +++ b/b @@ -1 +1 @@ -Subproject commit 76dbeb7168c90a0cd061f0dbcde95f3724123e28 +Subproject commit a77e05cb66dba18688565911354234c3ff36e0e9 diff --git a/dox/misc2 b/dox/misc2 index 68667eb..cfbef04 100644 --- a/dox/misc2 +++ b/dox/misc2 @@ -1,3 +1,11 @@ +SW viewer [optional] +############################### + how? + Wie ruft man die index.html auf der VM auf? + Wie kommunizieren SW REC und Viewer? + eg. OnStopButtonClicked( cmd( ../camTrack3000 --stop ) ) ?? + REST-Server/ HTTP-Json / .. +############################### vimba: GVSPAdjustPacketSize - find max size automatically if size < 1500 > enable jumboframes @@ -8,3 +16,33 @@ check: StatFramesDropped == 0 run as root. (or workaround p159 to start app as root and drop rigths immediatly afterwards) +############################### + +## SW from tboy old workstation + https://ctrax.sourceforge.net/ + walking fly tracker + HOBOWare Lite + temperature logger + StreamPix5 + realtime digital video recording to PC memory or hdd + batch processor + https://www.norpix.com/products/streampix/streampix.php + + Matlab (.m files) + any2ufmf + fviewflytrax + avidemux + yEd - graph editor - .graphml files + batchprocessor + process sequence files to avi + ssdcleanup + +## Emilio general critique +############################### + > !! if beetle runs in circle it is in "escape mode" which doesnt represent "natural" behaviour (explore, quick move from a to b) + -> think about different setup. Bigger Arena? + > fps can be low. Try 3! + Depends on movement speed and estimated error + calc error by comparing distance of 40fps with 3fps + > duration of video can be short. eg 10 minutes. + -> no need for many fridges diff --git a/dox/notes b/dox/notes index 9c379c0..bdede4a 100644 --- a/dox/notes +++ b/dox/notes @@ -1,36 +1,19 @@ -v## SW from tboy old workstation -https://ctrax.sourceforge.net/ - walking fly tracker -HOBOWare Lite - temperature logger -StreamPix5 - realtime digital video recording to PC memory or hdd - batch processor - https://www.norpix.com/products/streampix/streampix.php - -Matlab (.m files) -any2ufmf -fviewflytrax -avidemux -yEd - graph editor - .graphml files -batchprocessor - process sequence files to avi -ssdcleanup - -############################### -## Emilio +## NOTES ############################### -> !! if beetle runs in circle it is in "escape mode" which doesnt represent "natural" behaviour (explore, quick move from a to b) - -> think about different setup. Bigger Arena? -> fps can be low. Try 3! - Depends on movement speed and estimated error - calc error by comparing distance of 40fps with 3fps -> duration of video can be short. eg 10 minutes. - -> no need for many fridges +"i conduct experiments in a lab, that i build up in a prestigious scientific institute" +"as a craftsman, i hone my skill to build/create things" +"i use my skills to earn €" +"i live and work with integrity" +------------------------------- +4-6h/d @ 4-5/w -> finetune DW/SW +get feedback (occassionaly) +------------------------------- -############################### -## Software A - Frame grab -############################## + + +############################################################## +## Software A - Frame grab - recorder - ctb +############################################################# # setup Vimba > see Vimba_installation_under_Linux.pdf @@ -88,16 +71,13 @@ pixelformat: RGB8 > different options. eg 10bit/12bit RGB/MONO. @ 30 Mins -> 127.1 GB with 60 recordings: 7.6TB -Storage: -ws1: - 2TB: 2*1TB (7200RPM) +Storage old ws: + 2TB: 2*1TB (7200RPM = 6GB/s) 8Gb DDR3 RAM Intel Xeon 3.6Ghz (4 cores) -ws2: 4TB: 3 (7200RPM = 6GB/s!) + 1 - 8GB DDR3 RAM - -default bandwidth:115MBps + default bandwidth:115MBps +------------------------------- Save "reasonable" settings in XML. If dark, set ExposureTimeAbs Q: how to set fps to 3? @@ -140,8 +120,8 @@ PCA? frameProcessor = std::make_shared<FrameProcessor>(); -########### -libarchive stuff +## libarchive stuff +############################### archive_read_xxx() archive_write_xxx() struct archive_entry @@ -166,7 +146,11 @@ command arg parser 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 @@ -265,58 +249,8 @@ Challenges: Occlusion, (Sensor-)Noise, changing external conditions( lighting, S > pre-training if lack of data > corrupt data to guarantee robust learning -###### -# AI # -###### -Convolutional Neural Networks (CNNs) - https://www.researchgate.net/publication/337401161_Fundamental_Concepts_of_Convolutional_Neural_Network (2020 37p) - > Kernel - > filter? - > preprocessing > Training > Parameter init > regularization > optimize - - -RGB-D - RGB + depth >> eg Kinect-Sensors -KNN - k-nearest neighbors algorithm -Monte Carlo tree search algorithm (alphaGo...) -RGB-D descriptor that relies on a K-Means -HMP - hierarchical matching pursuit ( hierarchical sparse-coding method; learn features from multiple channel input) -encoding depth information into three channels (HHA encoding) feature hierachy -cascade of Random Forest classifiers that are fused in a hierarchical manner ?? #Random Forest - -metrics: - recall - how many relevant items are retrieved? - precision - how many retrieved items are relevant? - > https://en.wikipedia.org/wiki/Recall_(information_retrieval) - -? -automatically learn a fusion strategy for the recognition -task – in contrast to simply training a linear classifier on -top of features extracted from both modalities - -MISRE - Multiple Input Structures with Robust Estimator -gradient-based learning - > MNIST supervised image classification - MNIST - large db of hand-written digits (used for ML and ImagePRocessing) - > also see classifiers: https://en.wikipedia.org/wiki/MNIST_database#Classifiers -multimodal learning - -the parameters of all layers were adapted using a fixed learning rate schedule - -At test time the task of the CNN is to assign the correct class label to a previously unseen object instance. - -Tasks: -Classification, clustering, regression, Summarization, Categorization, Natural language processing, - -################################## -# STAT -################################## -Regression -Hadamard Product -Bernoulli Distribution -Discrete Uniform Distribution -################################## # CMAKE ################################## sublime: install package CMAKE (syntax hilight) @@ -335,9 +269,4 @@ apt install libarchive-dev python3-pybind11 frame = new IplImage(img_input); #endif -## hardware tower old - (opt/later) setup tower1 (defunct again!) as cheap testing machine! - > get NIC working - > give name connect inet - --> as terminal to connect to server - --> later: use for DMX lighting + diff --git a/dox/notes_A b/dox/notes_A index 9aa3e93..b9614b0 100644 --- a/dox/notes_A +++ b/dox/notes_A @@ -98,5 +98,11 @@ Prosilica GX: 2 ethernet ports... configure LAG (Link aggregate group) -> double available bandwith to 240 MB/s! -##################### +## hardware tower old +############################### + (opt/later) setup tower1 (defunct again!) as cheap testing machine! + > get NIC working + > give name connect inet + --> as terminal to connect to server + --> later: use for DMX lighting diff --git a/dox/notes_B b/dox/notes_B index fbe91d1..a48007b 100644 --- a/dox/notes_B +++ b/dox/notes_B @@ -8,23 +8,34 @@ Does ############################### use opencv to convert raw cam images into JPEG pixel format ############################### -Software Setup: - > deploy to VM - -> ssh-connection - > configure - -> folder, length, cams - > .. + +map cam -> MAC -> IP -> ID -> name + cam1 000A4708ED3F 172.18.227.210 04ytr allied-alviumg1-240c-04ytr.idiv.de + cam2 000A471C0C9D 172.18.227.211 04ytp allied-alviumg1-240c-04ytp.idiv.de + cam3 000A47372777 172.18.225.164 04ytn allied-alviumg1-240c-04ytn.idiv.de + cam4 000A471D2A66 172.18.227.213 04ytm allied-alviumg1-240c-04ytm.idiv.de + cam5 000A471D208D 172.18.225.129 04ytt allied-alviumg1-240c-04ytt.idiv.de + cam6 000A47139EA6 + +## connect VM +ssh kr69sugu@idivtibcam01.usr.idiv.de + - see `cmds "login ssh without password"` for config + + +#old vm + #tibcamtrack.idiv.de (172.18.225.181) +#?? WS ??? + #idivlabo2KARL.idiv.de (172.18.226.44) ? + +------------------------------- * camera sends the raw pictures to a storage server via a network (IP/UDP) connection * internal real time clock and delivers high precision TIME STAMPS, which were simultaneous recorded for every frame (use milliseconds) -* compress frames as jpeg - used opencv version 3.2 imwrite() with parameter: +* compress frames as jpg + - used opencv version 3.2 imwrite() with parameter: IMWRITE_JPEG_QUALITY 100; IMWRITE_JPEG_OPTIMIZE 1; IMWRITE_JPEG_RST_INTERVAL 4; -## deploy -operating on the storage server -VM on ssh thomasboy@172.18.115.7 -> ask Dirk! # build/setup VimbaX > download from https://www.alliedvision.com/en/products/software/vimba-x-sdk/ @@ -36,9 +47,32 @@ VM on ssh thomasboy@172.18.115.7 -> ask Dirk! . SetGenTLPath.sh sudo VimbaGigETL_Install.sh #add api to path +## All APIs cover the following functions: + Listing currently connected cameras + Controlling camera features + Receiving images from the camera + Notifications about camera connections or disconnections + + + > browse other examples a bit: + list cams / features / actioncommands + eventhandling?? + + > read Manuals + >Vimba, C++, GigE-TL,(ImgTransform,),Cam Technical Docu + pdf "${HOME}/vimba_5_1/Documentation/Vimba Manual.pdf" "${HOME}/vimba_5_1/VimbaCPP/Documentation/Vimba CPP Manual.pdf" "${HOME}/vimba_5_1/VimbaGigETL/Documentation/VimbaGigETLFeaturesManual.pdf" "${HOME}/vimba_5_1/VimbaImageTransform/Documentation/Vimba ImageTransform Manual.pdf" "${HOME}/vimba_5_1/Documentation/Vimba Viewer Guide.pdf" + + From Thomas: + * recording single frames in data structure + * used Vimba.2.1 (1.6 more likely) + * compress each frame with loosely jpg compression + (used framework opencv version 3.2. imwrite function with parameter: IMWRITE_JPEG_QUALITY 100 ; IMWRITE_JPEG_OPTIMIZE 1; IMWRITE_JPEG_RST_INTERVAL 4;) + * stores timestamps for each frame in milliseconds + ## SETUP GT1920C: > connect lap and cam directly via ethernet > set MTU to 8228 (jumbo frames/packets) + > GVSPAdjustPacketSize: 8228 > set fixed IP for eth-adapter first and then cam (use Vimbaviewer -> force IP) eth 169.254.100.1 cam ip 169.254.x.x # on restart will pick random IP... @@ -54,12 +88,6 @@ VM on ssh thomasboy@172.18.115.7 -> ask Dirk! -> for multiple cams calc bandwith and use switch - - - - - - > list currently connected cameras > control cam features > receive images @@ -261,3 +289,13 @@ GetStreamBufferAlignment? what is it? EventCameraDiscovery -> listen to find plugged cams + + DONT do a diskbench to get writing speed (calculate needed speed with 3 cameras) to see if frames will be dropped or not... + writing speed of one of the workstations is 150MB/sec + prosilica gtx1920 needs 3x 107.53 MB/sec for BGR. 1x for MONO + avi uncompressed + 1280x1280 @ 40 fps is limit for your CPU oO + CPU can compress 47mio pix/second + 17x1936x1456=47mio -> 17fps @ full res + suggested CPU i7 3840 + reduce ROI diff --git a/dox/timeplan-milestones.ods b/dox/timeplan-milestones.ods index 0496f530cc6e32c26c9c1843055248b52c8ffeab..f6177144252286938371e5018a87c4f4c0619189 100644 GIT binary patch literal 21804 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 DYD8|q delta 10066 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 LFd<T~{K@@42W=l{ diff --git a/dox/todo_ct b/dox/todo_ct index 4481e82..78545c2 100644 --- a/dox/todo_ct +++ b/dox/todo_ct @@ -5,91 +5,13 @@ CAMTRON PROCESSING PIPELINE C) background-subtraction D) process scripts X) HPC - Z) laptop/fon maintenance ########################### "tackle long-term complex projects from beginning to end" -sort ct: - > folders, files, ... naming convention - > README + Description - > merge doc? - > b) exclude SDK / examples from repo - -PRIO: -> update opencv -> eval how much work to fix? -> update algorithm for bgs -> eval how much work to fix? - -A) -########################### - > TEST CAM! GET RUNNING PICTURES! - 1. use virtual machine - > 8 cores, 16GB RAM, 2 TB for 1cam - > 48 cores, 128GB RAM, 6 TB for 6cam - - 2. use laptop - - - - > light (opt/later) - > find hardware (Boxes, DMX per unit, DMX splitter/controller) - > setup hardware for 1 unit - > check software - > get infrared LEDs. ask if andy ordered them? - > attach IR-LEDs (solder) - - > arenas - > verglasungsfolie - > 1 floor wooden plate with circle >> really needed? - > 1 floor glass plate - > 1 floor wooden plate - - > how to connect seamlessly? - > o-ring: https://www.o-ring.de/o-ring-fpm-90/item-anfragemenge-6-categoryId-or-itemId-100022-search2-580.00-search3--search7-.html - - >> or use poisonous electro-harz zum giessen. Wie Form bauen? - - - - * setup 1 fridge - > attach cam arm to wood - > get video in VV - > get video in SW-A via SDK - > cam calibration (Use Viewer? Or own SW?) - > configure cam settings - * get video for 3 cams in one workstation - > what SW? - > calculate supported framerate+resolution+codec for hardware (CPU,RAM,HDD...) - > or do tests and see if frames are dropped - - - DONT do a diskbench to get writing speed (calculate needed speed with 3 cameras) to see if frames will be dropped or not... - writing speed of one of the workstations is 150MB/sec - prosilica gtx1920 needs 3x 107.53 MB/sec for BGR. 1x for MONO - avi uncompressed - 1280x1280 @ 40 fps is limit for your CPU oO - CPU can compress 47mio pix/second - 17x1936x1456=47mio -> 17fps @ full res - suggested CPU i7 3840 - reduce ROI - - - - # Documentation - > sketch - > chamber: cam height+resolution+arena diameter for pixel to cm/mm ratio - > lab: chambers+workstations+HPC - - > costs. update with what we actually buy! - > sketch: technical: cam (QuantumEfficiency) + IRLED - > sketch: setup plan for a chamber - > copy last setup plan from thomas - - - B) recorder - camera produces frames and timestamps ########################### (depends on cam in A)!!! - > use new api Vimba X + > use new api VimbaX > read manual (c++ / vimba) ============================ > wait and detect cams @@ -97,6 +19,17 @@ B) recorder - camera produces frames and timestamps > build GUI --> Q: might a console app be feasable?? ============================ + > get pix, using + - laptop + - 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 + > central config > threads for started recordings [PID] > storage folder @@ -105,44 +38,24 @@ B) recorder - camera produces frames and timestamps > load settings with sw > how and where to store frames? - All APIs cover the following functions: - Listing currently connected cameras - Controlling camera features - Receiving images from the camera - Notifications about camera connections or disconnections - - - > browse other examples a bit: - list cams / features / actioncommands - eventhandling?? - - > read Manuals - >Vimba, C++, GigE-TL,(ImgTransform,),Cam Technical Docu - pdf "${HOME}/vimba_5_1/Documentation/Vimba Manual.pdf" "${HOME}/vimba_5_1/VimbaCPP/Documentation/Vimba CPP Manual.pdf" "${HOME}/vimba_5_1/VimbaGigETL/Documentation/VimbaGigETLFeaturesManual.pdf" "${HOME}/vimba_5_1/VimbaImageTransform/Documentation/Vimba ImageTransform Manual.pdf" "${HOME}/vimba_5_1/Documentation/Vimba Viewer Guide.pdf" - - From Thomas: - * recording single frames in data structure - * used Vimba.2.1 (1.6 more likely) - * compress each frame with loosely jpg compression - (used framework opencv version 3.2. imwrite function with parameter: IMWRITE_JPEG_QUALITY 100 ; IMWRITE_JPEG_OPTIMIZE 1; IMWRITE_JPEG_RST_INTERVAL 4;) - * stores timestamps for each frame in milliseconds - -SW viewer [optional] -############################### - how? - Wie ruft man die index.html auf der VM auf? - Wie kommunizieren SW REC und Viewer? - eg. OnStopButtonClicked( cmd( ../camTrack3000 --stop ) ) ?? - REST-Server/ HTTP-Json / .. - - - - - +A) +########################### + > VM + > light + > 2*LEDs: 1*day + 1*night + > find ecolux hw (Boxes, DMX per unit, DMX splitter/controller) + > arenas + > Acrylzylinder in 2 teile gesaegt. + > floor + > gips+color+lack.. C) background subtraction ########################### + eval how much work to, update + > opencv + > bgs-algorithm + ctb - calculates centroid points of all frames in a record > build > find test data (cp to 00 - ..) @@ -177,36 +90,31 @@ X) HPC - High Performance Cluster or > II) vimba-software directly to HPC? -## NOTES +BACK-BURNER 2D ############################### -"i conduct experiments in a lab, that i build up in a prestigious scientific institute" -"as a craftsman, i hone my skill to build/create things" -"i use my skills to earn €" -"i live and work with integrity" -------------------------------- -4-5h/d @ 4-5/w -> finetune DW/SW -get feedback (occassionaly) +> Documentation + > sketch + > chamber: cam height+resolution+arena diameter for pixel to cm/mm ratio + > lab: chambers+workstations+HPC -milestone 1: build up hardware - > fridges,cams,light,arena,workstation, -milestone 2: get videodata - > 2.1 via vv - > 2.2 via own SW! -milestone 3: collect all data using 1 camunit -milestone 4: collect all data using 6 camunits -milestone 5: conduct experiments -milestone 6: analyze I - get simple vars - movement: calc coordinates (roi,bgs substraction,bgs midpoint,..) - aggregate CSV (coord + time + temp/rH) -milestone 7: analyze II - get more vars - > calc speed,angles,distance + > costs. update with what we actually buy! + > sketch: technical: cam (QuantumEfficiency) + IRLED + > sketch: setup plan for a chamber + > copy last setup plan from thomas -> 5 & 6 could be swapped! Done ####################### +> 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 -- GitLab