From 9891d60cb23e294d4f85a47e883c60c40a14c07a Mon Sep 17 00:00:00 2001 From: Michael Welter Date: Thu, 31 Oct 2024 20:03:36 +0100 Subject: [PATCH] Squashed changes from private branch: * Update readme * Docu of recent changes * Implement more sensible translation distribution for augmentation * Add the alignment for Biwi from the SRHP/OPAL paper * Add BIWI Benchmark * Fix labels in evaluate_stability plots * Fix non_blocking data transfers. * Stabilize NLL loss by mixing in a uniform probability density * Remove rotation laplace distribution * Change lower bound for variance output * Fix warning from loading weights with torch.load * Comment awefull train update func and fix type annotations * Try post train quantization. Optional added to exporter. * Parameterize variance like earlier and remove BN (OpenTrack release v0.2) * Rename the variance heads (actual scales heads) * New training schedules: Exponential LR rampup; NLL rampup; train variance parameters slower; * Always include the shape plausibility loss * Implement shape plausibility loss without torch gmm package * Tests for support of negative log likelihood losses * Improve grouping of losses and visualization of losses * Save models in a more self-describing format for not having to know how to construct it prior to loading * Bring back the learnable pose offset in local head coordinates * Vastly simplify the ONNX compute graph! * Rewrote image geometric transforms: - Torch implementation for differentiability and GPU execution (currently not used) - OpenCV implementation for speed on cpu * Evaluation script fixes --- doc/recent-changes.md | 39 ++ doc/traincurve-now.jpg | Bin 0 -> 22259 bytes doc/traincurve-paper.jpg | Bin 0 -> 23293 bytes readme.md | 119 ++++-- run.sh | 3 +- scripts/AFLW20003dEvaluation.ipynb | 14 +- scripts/dsprocess_biwi.py | 164 ++++++--- scripts/dsprocess_lapa.py | 13 +- scripts/evaluate_pose_network.py | 106 +++++- scripts/evaluate_stability.py | 10 +- scripts/export_model.py | 100 +++++- scripts/show_train_test_splits.py | 3 +- scripts/train_poseestimator.py | 83 +++-- test/test_affine_img_trafo.py | 339 +++++++----------- test/test_datatransformation.py | 22 ++ test/test_eval.py | 104 ++++++ test/test_io.py | 36 ++ test/test_landmarks.py | 5 +- test/test_math.py | 55 ++- test/test_models_sanity.py | 6 +- test/test_negloglikelihood.py | 49 +++ test/test_train.py | 15 +- test/test_utils.py | 2 +- trackertraincode/backbones/resnet.py | 1 - trackertraincode/datasets/batch.py | 8 + trackertraincode/datasets/dshdf5.py | 9 + .../datatransformation/__init__.py | 18 +- .../datatransformation/affinetrafo.py | 160 +-------- .../datatransformation/image_geometric_cv2.py | 137 +++++++ .../image_geometric_torch.py | 89 +++++ .../{imageaugment.py => image_intensity.py} | 0 trackertraincode/datatransformation/loader.py | 9 +- trackertraincode/datatransformation/misc.py | 55 +++ .../{otheraugment.py => sample_geometric.py} | 122 +++---- trackertraincode/eval.py | 121 ++++++- trackertraincode/neuralnets/bnfusion.py | 58 +++ trackertraincode/neuralnets/io.py | 44 +++ trackertraincode/neuralnets/losses.py | 20 ++ .../neuralnets/modelcomponents.py | 39 +- trackertraincode/neuralnets/models.py | 74 +++- .../neuralnets/negloglikelihood.py | 271 ++++---------- .../neuralnets/rotation-laplace-grids3.npy | Bin 1327232 -> 0 bytes .../neuralnets/torchquaternion.py | 107 ++++-- trackertraincode/pipelines.py | 22 +- trackertraincode/train.py | 301 ++++++++++------ trackertraincode/utils.py | 8 + trackertraincode/vis.py | 13 +- 47 files changed, 1925 insertions(+), 1048 deletions(-) create mode 100644 doc/recent-changes.md create mode 100644 doc/traincurve-now.jpg create mode 100644 doc/traincurve-paper.jpg create mode 100644 test/test_datatransformation.py create mode 100644 test/test_eval.py create mode 100644 test/test_io.py create mode 100644 test/test_negloglikelihood.py create mode 100644 trackertraincode/datatransformation/image_geometric_cv2.py create mode 100644 trackertraincode/datatransformation/image_geometric_torch.py rename trackertraincode/datatransformation/{imageaugment.py => image_intensity.py} (100%) create mode 100644 trackertraincode/datatransformation/misc.py rename trackertraincode/datatransformation/{otheraugment.py => sample_geometric.py} (69%) create mode 100644 trackertraincode/neuralnets/bnfusion.py create mode 100644 trackertraincode/neuralnets/io.py delete mode 100644 trackertraincode/neuralnets/rotation-laplace-grids3.npy diff --git a/doc/recent-changes.md b/doc/recent-changes.md new file mode 100644 index 0000000..9a6c0d5 --- /dev/null +++ b/doc/recent-changes.md @@ -0,0 +1,39 @@ +# Recent Changes + +## Post Train Quantization +* Added to onnx export. +* Minimal accuracy loss for ResNet18 model. MobileNet variant becomes too noisy and is probably unusable. +* Inference time reduced to ca. 60% of float32 original. + +## Variance Parameterization +* Back to earlier implementation: + - Use "smoothclip" func to force diagonals of covariance factors positive. + - Overparameterize with scale factor that is applied to all covariances. +* Remove BN + +## Training +* Exponential LR warmup +* Train variance parameters 10x slower +* First train without NLL losses. After LR warmup, ramp up the weight of NLL losses. +* Add the "shape plausibility loss" back in. It's based on a GMM probability density for the face shape parameters. +* The warmup changes helped to get: + - Decent performance without BN in the variance heads + - Smoother loss curves than before + +Curve of rotation loss at time of publication: + +![Curve of rotation loss at time of publication](traincurve-paper.jpg) + +Now: + +![Curve of rotation loss at time of publication](traincurve-now.jpg) + + +## Model +* Add back learnable local pose offsets (Looks like it doesn't help) +* Simplify ONNX graph +* Store model config in checkpoint. Allows loading without having to know the config in advance. + +## Evaluation +* Add evaluation of 2d NME for 68 landmark AFLW2000-3D benchmark. +* \ No newline at end of file diff --git a/doc/traincurve-now.jpg b/doc/traincurve-now.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c519beae827732e350bd35b6ed99864df161a570 GIT binary patch literal 22259 zcmeIaWmuJ4w=jIu64E89bR*p?Q0W%wQjr#rE@2@`ND2r@cb9a7NP~2DcXuro-|c?R z^K5PJ zDk>T(${jQ`G<5Vk7+8dNu`n^Q?%@;Q5K@v+Q&EypP~4~EV7yPmMoU4#B*4t}kc*d> zmzq&XOpsfYgNK*<=OGB_=;&COSfqFFl5#(wc)?~&0nFfuW-@bd8s2nq>5ej+6; zBP%Db{!BwtOIt_R_?3yNnYo3fgQJtPi>sUa`wzZ;{sA8YBO*UXMaO)JjY~_<$jr*l z$;~S*E3c@ms;;U1-qPCE-qG3BJv2NrIyOErIkmX7yt2BszOlJ=cyxSndUk$sdG!-7 z1OVwDXo0`~f!M#{g$Lq=h>VPcjP?^R1Vk5bAmJgSJm5mbmsCT0VMjp2{q7Foqwv&{ zW^`Jfrw2qY?FTW4>3A3E4}YTe2WJ285cB!p!t7s&{fXBUfQ5trG7kw4fB@&uQPB{C zaU>E0)(BEw^eLEp6S4Dj8j`2_o1;x8v_MYIqeI4PBfI?oK6dzfeA{z#+@D~+9 z9y^LQ_F||qHFN-a%H7vElG11?IlDG5>dXDM<|OF|Xu8NlgEL-HcaCUXMfpY9o`p!C zP4(Sve%td=ldo%oyA^8yCE<@<1&|A+x6HS|WB!m^;N2ng@EP>G)uPJPy>eR^PS7n7 zm~!{W-wXdH&)-7vw<`RfXem|>V|-V`jl){wMCx$!@;&kBlDzMZAQUa522$^P5vn3} z%u>tiN}kIMMSEi`lv5HY4|p+K5>Ht-MH0sGa#wTo=>!iU%Dq&PfUxXa1^YK&op{k( zTi0tFnuXkVg7*cZ`s#mGuD9<#Hw& z6I+r{v<^nwn{qa&$PammH*;qBW7#tfyO=_{*fL+uxCeI}yIhtcw6ms;in2P{i(!Tw!D+;j6X|vj1iLhPBhsx3F&LPG9A>#xZ?L4NH(4H!?${vDV4yo%=3r5A2jBaRivICwu~f0( zh5xG~t1HS*A89oY^Z4)6*0+G(Fk7RI+m7?KQwnxn-%!&AMbia#x!aW14N}Z4fH0Qt z8GZ|_2YG4U0*gu!Z5biqsh?1hDYH-@?~rJ`$;B&D^ei>c@F#YY76?eMA2zoc9G4eg zp>e{I3SIkZ?v5od^(e8hOVe0))7KyEnEL8e<5PVo){h(r9?!LiV;*LsEthoQZ~hV4 zg%#X-N|ylF$k?5j}*&U3Vt z@_(FqpT}!31KRHco%c=OC6j?&Fy36~4l)I1#y$hM<)+(YZ0Rdz(8bEycsb8sg@i{n zez21uZ2Vuh3?0Q>zdzCy&4e$&qP_pKL+g;E&(+Ya=a|#!ybnLW`1Hn&i1TyP40Xf+ zs_j3qDfj#nMP0+Ex4;`O1=Uz<%}r}vS*aFgr+`vh7U56A%X8k$A5Y#7tNbLuyXAYl zXM@JLlXvEKRTt|&RbO_vZ*iunTh8C_lQAihX{+3cd!qP~MSK*8?(xmy&0rj`H~-U* z-2xs5Y2H-g8&^+DIrSywpho+`EqC_R$XYd6M2Q%IB^0Q>sl-7;#|I_tf{oNF*am(tG~uL zpaV-jlb`K*@BupAIYX_AzaeuOf62zw2wsmp_O#mviGAu>vE$84cP�k!$)c!Sxv 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 z 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 X+%uTO|6lSSTxg$DuLAUB_%rt}y998K literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index f514618..ffa99c9 100644 --- a/readme.md +++ b/readme.md @@ -1,13 +1,24 @@ -# OpNet: On the power of data augmentation for head pose estimation networks +OpenTrack "NeuralNet Tracker" Training & Evaluation +=================================================== -A.K.A. OpenTrack's NeuralNet Tracker Training and Evaluation Code +/ [**"OpNet: On the power of data augmentation for head pose estimation"**](https://arxiv.org/abs/2407.05357) -Intro ------ +If you are looking for the code for the publication please note the [`paper` branch](https://github.com/opentrack/neuralnet-tracker-traincode/tree/paper), +which is a special tailored snapshot for the publication. -This branch contains the code for the publication. Beware, it also contains leftover things from past experiments. +This repository contains the code to train the neural nets for the NeuralNet tracker plugin of [Opentrack](https://github.com/opentrack/opentrack). It allows head tracking with a simple webcam. + + +Overview +-------- + +The tracker plugin is based on deep learning, i.e. neural network models optimized using data to perform their tasks. +There are two parts: A localizer network, and the actual pose estimation network. +The localizer tries to find a single face and generates a bounding box around it from where a crop is extracted for the pose network to analyze. + +In the following there are steps outlined to reproduce the networks +delivered with OpenTrack. This includes training and evaluation. However, the instructions are currently focussed on the pose estimator. At the end there is a section on the localizer. -This readme contains instructions for evaluation and training. Install ------- @@ -42,13 +53,15 @@ Evaluation Download AFLW2000-3D from http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm. +Biwi can be obtained from Kaggle https://www.kaggle.com/datasets/kmader/biwi-kinect-head-pose-database. I couldn't find a better source that is still accessible. + Download a pytorch model checkpoint. * Baseline Ensemble: https://drive.google.com/file/d/19LrssD36COWzKDp7akxtJFeVTcltNVlR/view?usp=sharing * Additionally trained on Face Synthetics (BL+FS): https://drive.google.com/file/d/19zN8KICVEbLnGFGB5KkKuWrPjfet-jC8/view?usp=sharing * Labeling Ensemble (RA-300W-LP from Table 3): https://drive.google.com/file/d/13LSi6J4zWSJnEzEXwZxr5UkWndFXdjcb/view?usp=sharing -### Option 1 +### Option 1 (AFLW2000 3D) Run `scripts/AFLW20003dEvaluation.ipynb` It should give results pretty close to the paper. The face crop selection is different though and so the result won't be exactly the same. @@ -58,59 +71,62 @@ It should give results pretty close to the paper. The face crop selection is dif Run the preprocessing and then the evaluation script. ```bash -# The output filename "aflw2k.h5" must batch the hardcoded value in "pipelines.py" -python scripts/dsaflw2k_processing.py $DATADIR/AFLW2000-3D.zip $DATADIR/aflw2k.h5` +# Preprocess the data. The output filename "aflw2k.h5" must match the hardcoded value in "pipelines.py" +python scripts/dsaflw2k_processing.py /AFLW2000-3D.zip $DATADIR/aflw2k.h5` # Will look in $DATADIR for aflw2k.h5. python scripts/evaluate_pose_network.py --ds aflw2k3d ``` -It supports ONNX conversions as well as pytorch checkpoints. But the script must be adapted to the concrete model configuration for the checkpoint if that is used. If you wish to process the outputs further, like for averaging like in the paper, there is an option to generate json files. +It supports ONNX conversions as well as PyTorch checkpoints. For PyTorch the script must be adapted to the concrete model configuration for the checkpoint. If you wish to process the outputs further, like for averaging like in the paper, there is an option to generate json files. +Evaluation on the Biwi benchmark works similarly. However, we use the annotations file from https://github.com/pcr-upm/opal23_headpose in order to adhere to the experimental protocol. It can be found under https://github.com/pcr-upm/opal23_headpose/blob/main/annotations/biwi_ann.txt. +```bash +# Preprocess the data. +python --opal-annotation /biwi_ann.txt scripts/dsprocess_biwi.py /biwi.zip $DATADIR/biwi-v3.h5 -Integration in OpenTrack ------------------------- +# Will look in $DATADIR for biwi-v3.h5. +python scripts/evaluate_pose_network.py --ds biwi --roi-expansion 0.8 --perspective-correction +``` +You want the `--perspective-correction` for SOTA results. It enables that the orientation obtained from the face crop is corrected for camera perspective since with the Kinect's field of view, the assumption of orthographic projection no longer holds true. I.e. the pose from the crop is transformed into the global coordinate frame. W.r.t this frame it is compared with the original labels. Without the correction, the pose from the crop is taken directly for comparison with the labels. +Setting `--roi-expansion 0.8` causes the cropped area to be smaller relative to the bounding box annotation. That is also necessary for good results because the annotations have much larger bounding boxes than the networks were trained with. -https://github.com/opentrack/opentrack - It currently has some older models though. Choose the "Neuralnet" tracker plugin. +Integration in OpenTrack +------------------------ +Choose the "Neuralnet" tracker plugin. It currently comes with some older models which don't +achieve the same SOTA benchmark results but are a little bit more noise resistent and invariant +to eye movements. Training -------- -Several datasets are used. All of which are preprocessed and the result (partially) stored in h5 files. +Rough guidelines for reproduction follow. -Rough guidelines for reproduction follow. First to get the data there is -the expositional script below which enumerates everything. +### Datasets -```bash -# 300W-LP -# Go to http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm and find the download for 300W-LP.zip. -# Currently it's on google drive with the ID as used below. Better check it yourself. -gdown 0B7OEHD3T4eCkVGs0TkhUWFN6N1k -# Note: gdown is a pip installable tool for downloading from google drive. You can ofc use anything you want. +#### 300W-LP & AFLW2000-3d -# AFLW2000-3d -wget www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/Database/AFLW2000-3D.zip +There should be download links for `300W-LP.zip` and `AFLW2000-3D.zip` on http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm. -#LaPa Megaface 3D Labeled "Large Pose" Extension -#https://drive.google.com/file/d/1K4CQ8QqAVXj3Cd-yUt3HU9Z8o8gDmSEV/view?usp=drive_link -$ gdown 1K4CQ8QqAVXj3Cd-yUt3HU9Z8o8gDmSEV +#### 300W-LP Reproduction +My version of 300W-LP with custom out-of-plane rotation augmentation applied. +Includes "closed-eyes" augmentation as well as directional illumination. +On Google Drive https://drive.google.com/file/d/1uEqba5JCGQMzrULnPHxf4EJa04z_yHWw/view?usp=drive_link. -#300W-LP Reproduction -#https://drive.google.com/file/d/1uEqba5JCGQMzrULnPHxf4EJa04z_yHWw/view?usp=drive_link -$ gdown 1uEqba5JCGQMzrULnPHxf4EJa04z_yHWw +#### LaPa Megaface 3D Labeled "Large Pose" Extension +My pseudo / semi-automatically labeled subset of the Megaface frames from LaPa. +On Google Drive https://drive.google.com/file/d/1K4CQ8QqAVXj3Cd-yUt3HU9Z8o8gDmSEV/view?usp=drive_link. -#WFLW 3D Labeled "Large Pose" Extension -#https://drive.google.com/file/d/1SY33foUF8oZP8RUsFmcEIjq5xF5m3oJ1/view?usp=drive_link -$ gdown 1SY33foUF8oZP8RUsFmcEIjq5xF5m3oJ1 +#### WFLW 3D Labeled "Large Pose" Extension +My pseudo / semi-automatically labeled subset. +On Google Drive https://drive.google.com/file/d/1SY33foUF8oZP8RUsFmcEIjq5xF5m3oJ1/view?usp=drive_link. -# Face Synthetics (https://github.com/microsoft/FaceSynthetics) -wget --tries=0 --continue --server-response --timeout=0 --retry-connrefused https://facesyntheticspubwedata.blob.core.windows.net/iccv-2021/dataset_100000.zip -``` +#### Face Synthetics +There should be a download link on https://github.com/microsoft/FaceSynthetics for the 100k samples variant `dataset_100000.zip`. -Now some preprocessing and unpacking: +### Preprocessing ```bash python scripts/dsprocess_aflw2k.py AFLW2000-3D.zip $DATADIR/aflw2k.h5 @@ -129,6 +145,8 @@ unzip reproduction_300wlp-v12.zip -d ../$DATADIR/ The processed files can be inspected in the notebook `DataVisualization.ipynb`. +### Training Process + Now training should be possible. For the baseline it should be: ```bash python scripts/train_poseestimator.py --lr 1.e-3 --epochs 1500 --ds "repro_300_wlp+lapa_megaface_lp:20000+wflw_lp" \ @@ -159,6 +177,20 @@ It will look at the environment variable `DATADIR` to find the datasets. Notable --ds "repro_300_wlp" # Train only on the 300W-LP reproduction --ds "repro_300_wlp+lapa_megaface_lp+wflw_lp+synface" # Train the "BL + FS" case which should give best performing models. ``` +### Deployment + +I use ONNX for deployment and most evaluation purposes. There is a script for conversion. WARNING: it is necessary to adapt its code to the model configuration. :-/ It is easy though. Only one statement where the model is instantiated needs to be changed. The script has two modes. For exports for OpenTrack use +```bash +python scripts/export_model.py --posenet +``` +It omits the landmark predictions and renames the output tensors (for historical reasons). The script performs sanity checks to ensure the outputs from ONNX are almost equal to PyTorch outputs. +To use the model in OpenTrack, find the directory with the other `.onnx` models and copy the new one there. Then in OpenTrack, in the tracker settings, there is a button to select the model file. + +For evaluation use +``` +python scripts/export_model.py --full --posenet +``` +The model created in this way includes all outputs. Creation of 3D Labeled WFLW & LaPa Large Pose Expansions -------------------------------------------------------- @@ -209,4 +241,13 @@ encoded as JPG, else as PNG. When `storage` is set to `image_filename` then the files. The other label fields are label data and should be relatively self-explanatory. Relevant code for reading and writing those files can be found in `trackertraincode/datasets/dshdf5.py`, -`trackertraincode/datasets/dshdf5pose.py` and the preprocessing scripts `scripts/dsprocess_*.py`. \ No newline at end of file +`trackertraincode/datasets/dshdf5pose.py` and the preprocessing scripts `scripts/dsprocess_*.py`. + +Localizer Network +----------------- + +There is an old notebook to train this network. + +The training data is a processed version of the Wider Face dataset. The processing accounts for the fact that Wider Face contains images with potentially many faces. Therefore, sections which contain only one face or none are extracted. + +The localizer network is trained to generate a "heatmap" with a peak where it suspects the center of a face. In addition, parameters of a bounding box are outputted. \ No newline at end of file diff --git a/run.sh b/run.sh index 886ecba..2e5b5f0 100644 --- a/run.sh +++ b/run.sh @@ -6,4 +6,5 @@ python scripts/train_poseestimator.py --lr 1.e-3 --epochs 1500 --ds "repro_300_w --with-nll-loss \ --roi-override original \ --no-blurpool \ - --backbone mobilenetv1 \ No newline at end of file + --backbone resnet18 \ + --outdir model_files/ \ No newline at end of file diff --git a/scripts/AFLW20003dEvaluation.ipynb b/scripts/AFLW20003dEvaluation.ipynb index 79b1eea..bd4afb6 100644 --- a/scripts/AFLW20003dEvaluation.ipynb +++ b/scripts/AFLW20003dEvaluation.ipynb @@ -77,11 +77,7 @@ "outputs": [], "source": [ "modelfile = '../model_files/pub_synface_oroi/run2/swa_NetworkWithPointHead_mobilenetv1.ckpt'\n", - "net = trackertraincode.neuralnets.models.NetworkWithPointHead(\n", - " enable_point_head=True,\n", - " config='mobilenetv1', \n", - " enable_uncertainty=True)\n", - "net.load_state_dict(torch.load(modelfile))\n", + "net = trackertraincode.neuralnets.models.load_model(modelfile)\n", "inputsize = net.input_resolution\n", "net.cuda()\n", "net.eval()" @@ -240,7 +236,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "" ] @@ -257,7 +253,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "" ] @@ -317,7 +313,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "" ] @@ -334,7 +330,7 @@ }, { "data": { - "image/png": "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i5wUnyIhgWBWmxXQDY9I45q97U/V920BqRKXNdABxMJo5aq0lkUu5/7UHx5aC0quFKHiYN8z141P7mmyDsqiGp6RvRXgNxizRWe9vPRt79ctl/PZu6y2LJlqCxamy47T6f7D6QWVvatnnsEWRNXY2kjNgAXA3SRqL1QTANkGGoIJor7AAwOACKD255fnS0+//+7vTs8/bNayhjF5aCbXu69+97uvl0/cX8WICCqEqlk63nbOkSaHe8Lebm9h0QpbbDczefgB7KLq818et/uvv/2H/17/9mNyWRZlKJqd1TMevv7tf/kvX7e1v16K93d3y1Gxj4qFnpzI81+2IRu9TNVBi8lwyzbqnWGC8U8mkZfn5/7wzd9/99vLX9fOFlK0EAkQOreH9+/uTl5O91e09+emEDArafpmA97O1pAO7lUGbbqKI8njWMIs/apyvzy94P7+9//jv358ufL90gFDklAOsEHafrz+mdf9Ye1aKAok1cYSfeMGb+5FBVAB5G5QMKqKzr23Ue7jkETsLGz9UvfLd//0T3+7/+lSH0+Pu50WskioAYiXdLb7d/dLoHeTVYzWZuV8YIxtomBTVjjVUNXNMGzUDld3myE4ohZlBS5bP384ffV3f/egfff5rl32na7KgkgbkDpyP5+13LXaY8BQSKSGBvS291nECpaKkgiWZ4UPRGtliBzAARta8mnfP3z9ze+/WS//nrhfFc9Pe0/7apEt0yapUzvd34XLoFAiY9SOBAcMHi5gHzU+oWjILEtBCVWxzMRzUDUpFkbi4+/+9h/un/7fX9/95t09+n277BurewGHVKR2ev+wroFMu2ARCunmB+Np9IB5g5BFgZ68WaGgCsupkSAKhsbW6lLx8avvfv8+Xh9rWdclePpwwefsCbbB/RnLInCJWTebFCXqzQbDALyJZAApGCLJiIhFIlssayOGZGUYENk34Lv3f//7/V///fLw3UnIOL33fkF2LmMFENsSEfSoDAUHgppqytuHxzkQg6MMxihS0ShC6xJNs9AiNB6+8eHbb357/+Pn7/HxPdwJ3vuhydnUaASwLIw1so/dukIj2UowijAgm7BYIGUZAFVR2AtiSI2GlnV1m1KaQYv2xeJv/tt9/9e//nRaT1R679mvpRBd1QK0WwzSyuHTinkAswA3DqYEYBTzg5FEGa3CZoQERGPu7ablgbRz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\n", + "image/png": "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i5wUnyIhgWBWmxXQDY9I45q97U/V920BqRKXNdABxMJo5aq0lkUu5/7UHx5aC0quFKHiYN8z141P7mmyDsqiGp6RvRXgNxizRWe9vPRt79ctl/PZu6y2LJlqCxamy47T6f7D6QWVvatnnsEWRNXY2kjNgAXA3SRqL1QTANkGGoIJor7AAwOACKD255fnS0+//+7vTs8/bNayhjF5aCbXu69+97uvl0/cX8WICCqEqlk63nbOkSaHe8Lebm9h0QpbbDczefgB7KLq818et/uvv/2H/17/9mNyWRZlKJqd1TMevv7tf/kvX7e1v16K93d3y1Gxj4qFnpzI81+2IRu9TNVBi8lwyzbqnWGC8U8mkZfn5/7wzd9/99vLX9fOFlK0EAkQOreH9+/uTl5O91e09+emEDArafpmA97O1pAO7lUGbbqKI8njWMIs/apyvzy94P7+9//jv358ufL90gFDklAOsEHafrz+mdf9Ye1aKAok1cYSfeMGb+5FBVAB5G5QMKqKzr23Ue7jkETsLGz9UvfLd//0T3+7/+lSH0+Pu50WskioAYiXdLb7d/dLoHeTVYzWZuV8YIxtomBTVjjVUNXNMGzUDld3myE4ohZlBS5bP384ffV3f/egfff5rl32na7KgkgbkDpyP5+13LXaY8BQSKSGBvS291nECpaKkgiWZ4UPRGtliBzAARta8mnfP3z9ze+/WS//nrhfFc9Pe0/7apEt0yapUzvd34XLoFAiY9SOBAcMHi5gHzU+oWjILEtBCVWxzMRzUDUpFkbi4+/+9h/un/7fX9/95t09+n277BurewGHVKR2ev+wroFMu2ARCunmB+Np9IB5g5BFgZ68WaGgCsupkSAKhsbW6lLx8avvfv8+Xh9rWdclePpwwefsCbbB/RnLInCJWTebFCXqzQbDALyJZAApGCLJiIhFIlssayOGZGUYENk34Lv3f//7/V///fLw3UnIOL33fkF2LmMFENsSEfSoDAUHgppqytuHxzkQg6MMxihS0ShC6xJNs9AiNB6+8eHbb357/+Pn7/HxPdwJ3vuhydnUaASwLIw1so/dukIj2UowijAgm7BYIGUZAFVR2AtiSI2GlnV1m1KaQYv2xeJv/tt9/9e//nRaT1R679mvpRBd1QK0WwzSyuHTinkAswA3DqYEYBTzg5FEGa3CZoQERGPu7ablgbRz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", "text/plain": [ "" ] diff --git a/scripts/dsprocess_biwi.py b/scripts/dsprocess_biwi.py index c1b1dfc..9dd29da 100644 --- a/scripts/dsprocess_biwi.py +++ b/scripts/dsprocess_biwi.py @@ -1,6 +1,7 @@ import os import sys import zipfile +import pandas import numpy as np from os.path import join, dirname, basename, splitext import re @@ -16,17 +17,44 @@ import io from collections import defaultdict from zipfile import ZipFile -from typing import Tuple +from typing import Tuple, Sequence, Any, Optional, Dict +from numpy.typing import NDArray + +from facenet_pytorch import MTCNN from trackertraincode.datasets.preprocessing import imdecode, imencode, extract_image_roi from trackertraincode.datasets.dshdf5pose import create_pose_dataset, FieldCategory +from dsprocess_lapa import improve_roi_with_face_detector +from filter_dataset import filter_file_by_frames + C = FieldCategory +# See "FSA-Net: Learning Fine-Grained Structure Aggregation for Head Pose Estimation from a Single Image" +# as reference for the evaluation protocol. Uses MTCNN to generate bounding boxes. +# https://github.com/shamangary/FSA-Net/blob/master/data/TYY_create_db_biwi.py +# Differences: +# * Projection using the camera matrix +# * Keeping the aspect ratio in the face crop. (The bbox is extended along the shorter side.) +# * Skip frames where MTCNN predicts a box far off the projected head center. (In FSA frames where skipped +# based on the inter-frame movement difference.) +# * Where multiple detections: Take the one closest to the projected head center. (In FSA, the detection +# closest to a fixed position in the image was picked, approximating the heads locations) +# * When generating the dataset with cropped images, a rotation correction is applied which is due to perspective. +# Thereby the angle spanned between the forward direction and the head position is added to the head orientation. +# Currently, this assumes a prescribed FOV. +# * Only small number of images is affected by failed detections. 15074 of 15678 are good. + +# Update: +# This script can now load the anotations from +# https://github.com/pcr-upm/opal23_headpose/blob/main/annotations/biwi_ann.txt +# for best reproducability and fair comparison. + PROJ_FOV = 65. HEAD_SIZE_MM = 100. -PREFIX='faces_0/' +PREFIX1='faces_0/' +PREFIX2='kinect_head_pose_db/' def get_pose_from_mat(f): @@ -47,6 +75,19 @@ def get_camera_extrinsics(zf : ZipFile, fn) -> Tuple[Rotation,np.ndarray]: return rot, pos +Affine = Tuple[Rotation,NDArray[Any]] + + +def affine_to_str(affine : Affine): + rot, pos = affine + return f"R={rot.as_matrix()}, T={pos}" + + +def assert_extrinsics_have_identity_rotation(extrinsics : Sequence[Tuple[Any,Affine]]): + for id_, (rot,_) in extrinsics: + assert np.allclose(rot.as_matrix(), np.eye(3),atol=0.04, rtol=0.), f"Rotation {rot.as_matrix()} of {id_} is far from identity" + + class PinholeCam(object): def __init__(self, fov, w, h): self.fov = fov @@ -78,36 +119,41 @@ def project_size_to_image(self, depth, scale): def compute_rotation_to_vector(pos): - # Computes a rotation which aligns - # the x axes with the given head position. + # Computes a rotation which aligns the z axes with the given position. + # It's done in terms of a rotation matrix which represents the new aligned + # coordinate frame, i.e. it's z-axis will point towards "pos". This leaves + # a degree of rotation around the this axis. This is resolved by constraining + # the x axis to the horizonal plane (perpendicular to the global y-axis). z = pos / np.linalg.norm(pos) x = np.cross([0.,1.,0.],z) + x = x / np.linalg.norm(x) y = -np.cross(x, z) + y = y / np.linalg.norm(y) M = np.array([x,y,z]).T rot = Rotation.from_matrix(M) return rot -def apply_local_head_origin_offset(rot, sz, offset): +def transform_local_to_screen_offset(rot, sz, offset): offset = rot.apply(offset)*sz # world to screen transform: offset = offset[:2] return offset -def find_image_file_names(zf : ZipFile): +def find_image_file_names(filelist : Sequence[str]): """ Returns dict of filename lists. Keys are person numbers. """ - regex = re.compile(PREFIX+r'(\d\d)/frame_(\d\d\d\d\d)_rgb.png') + regex = re.compile(PREFIX1+r'(\d\d)/frame_(\d\d\d\d\d)_rgb.png') samples = defaultdict(list) - for f in zf.filelist: - m = regex.match(f.orig_filename) + for f in filelist: + m = regex.match(f) if m is None: continue person = int(m.group(1)) frame = m.group(2) - samples[person].append((frame, f.orig_filename)) + samples[person].append((frame, f)) for k, v in samples.items(): # Sort by frame number then discard frame number v = sorted(v, key = lambda t: t[0]) @@ -116,7 +162,7 @@ def find_image_file_names(zf : ZipFile): def find_cal_files(zf : ZipFile): - regex = re.compile(PREFIX+r'(\d\d)/rgb.cal') + regex = re.compile(PREFIX1+r'(\d\d)/rgb.cal') cal_files = {} for f in zf.filelist: m = regex.match(f.orig_filename) @@ -127,8 +173,7 @@ def find_cal_files(zf : ZipFile): return cal_files - -def read_data(zf, imagefile, cal): +def read_data(zf, imagefile, cam_extrinsics_inv, mtcnn : MTCNN | None, box_annotation : tuple[int,int,int,int] | None): posefile = imagefile[:-len('_rgb.png')]+'_pose.txt' imgbuffer = zf.read(imagefile) @@ -138,26 +183,28 @@ def read_data(zf, imagefile, cal): with io.StringIO(zf.read(posefile).decode('ascii')) as f: rot, pos = get_pose_from_mat(f) - cam_inv = cal #utils.affine3d_inv(cal) - rot, pos = utils.affine3d_chain(cam_inv, (rot, pos)) - - rot_correction = compute_rotation_to_vector(pos) - rot = rot_correction.inv() * rot + rot, pos = utils.affine3d_chain(cam_extrinsics_inv, (rot, pos)) cam = PinholeCam(PROJ_FOV, w, h) x, y = cam.project_to_image(pos) size = cam.project_size_to_image(pos[2], HEAD_SIZE_MM) - roi = np.array([x-size, y-size, x+size, y+size]) - img, offset = extract_image_roi(img, roi, 0.5, return_offset=True) - roi[[0,1]] += offset - roi[[2,3]] += offset - x += offset[0] - y += offset[1] + if box_annotation: + roi = np.asarray(box_annotation) + else: + roi = np.array([x-size, y-size, x+size, y+size]) + + if mtcnn is not None: + roi, ok = improve_roi_with_face_detector(img, roi, mtcnn, iou_threshold=0.01, confidence_threshold=0.9) + if not ok: + print (f"WARNING: MTCNN didn't find a face that overlaps with the projected head position. Frame {imagefile}.") + else: + ok = True # Offset in local frame is given as argument. # It was found by eyemeasure. It could perhaps be improved by optimizing it during the training. - offset = apply_local_head_origin_offset(rot, size, np.array([0.03,-0.35,-0.2])) + # It does not affect the rotation, and thus also not the benchmarks, so I'm free to do this. + offset = transform_local_to_screen_offset(rot, size, np.array([0.03,-0.35,-0.2])) x += offset[0] y += offset[1] @@ -166,39 +213,61 @@ def read_data(zf, imagefile, cal): 'coord' : np.array([x, y, size]), 'roi' : roi, 'image' : img, - } - - -def generate_hdf5_dataset(source_file, outfilename, count=None): + }, ok + + +def generate_hdf5_dataset(source_file, outfilename, opal_annotation : str | None, count : int | None =None): + mtcnn = None + sequence_frames = None + box_annotations = None + if opal_annotation: + dataframe = pandas.read_csv(opal_annotation, header=0, sep=';') + dataframe.columns = dataframe.columns[1:].append(pandas.Index([ 'dummy'])) + filelist : list[str] = dataframe['image'].values.tolist() + filelist = [ f.replace(PREFIX2,PREFIX1) for f in filelist ] + box_annotations = dataframe[list('tl_x;tl_y;br_x;br_y'.split(';'))].values.tolist() + box_annotations = dict(zip(filelist, box_annotations)) + sequence_frames = find_image_file_names(filelist) + assert sum(len(frames) for frames in sequence_frames.values()) == len(filelist) + else: + mtcnn = MTCNN(keep_all=True, device='cpu') every = 1 with ZipFile(source_file,mode='r') as zf: calibration_data = { k:get_camera_extrinsics(zf,fn) for k,fn in find_cal_files(zf).items() } - print ("Found calibration files: ", calibration_data.keys()) - sequence_frames = find_image_file_names(zf) + #print ("Found calibration files: ", calibration_data.keys()) + print ("Sample camera params: ", affine_to_str(next(iter(calibration_data.values())))) + assert_extrinsics_have_identity_rotation(calibration_data.items()) + if opal_annotation is None: + sequence_frames = find_image_file_names([ f.orig_filename for f in zf.filelist]) if count or every: for k, v in sequence_frames.items(): sequence_frames[k] = v[slice(0,count,every)] - sequence_lengths = [len(v) for v in sequence_frames.values()] - print ([(k,len(v)) for k,v in sequence_frames.items()]) - N = sum(sequence_lengths) + max_num_frames = sum(len(v) for v in sequence_frames.values()) + print ("Found videos (id,length): ",[(k,len(v)) for k,v in sequence_frames.items()]) with h5py.File(outfilename, mode='w') as f: - ds_img = create_pose_dataset(f, C.image, count=N) - ds_roi = create_pose_dataset(f, C.roi, count=N) - ds_quats = create_pose_dataset(f, C.quat, count=N) - ds_coords = create_pose_dataset(f, C.xys, count=N) - f.create_dataset('sequence_starts', data = np.cumsum([0]+sequence_lengths)) + ds_img = create_pose_dataset(f, C.image, count=max_num_frames) + ds_roi = create_pose_dataset(f, C.roi, count=max_num_frames) + ds_quats = create_pose_dataset(f, C.quat, count=max_num_frames) + ds_coords = create_pose_dataset(f, C.xys, count=max_num_frames) i = 0 - with tqdm.tqdm(total=N) as bar: + sequence_starts = [0] + with tqdm.tqdm(total=max_num_frames) as bar: for ident, frames in sequence_frames.items(): for fn in frames: - sample = read_data(zf, fn, calibration_data[ident]) - ds_img[i] = sample['image'] - ds_quats[i] = sample['pose'] - ds_coords[i] = sample['coord'] - ds_roi[i] = sample['roi'] - i += 1 + sample, ok = read_data(zf, fn, calibration_data[ident], mtcnn, box_annotations[fn] if box_annotations else None) + if ok: + ds_img[i] = sample['image'] + ds_quats[i] = sample['pose'] + ds_coords[i] = sample['coord'] + ds_roi[i] = sample['roi'].tolist() + i += 1 bar.update(1) + assert i != sequence_starts[-1], "Every sequence should have at least one good frame!" + sequence_starts.append(i) + for ds in [ds_img, ds_roi, ds_quats, ds_coords]: + ds.resize(i, axis=0) + f.create_dataset('sequence_starts', data = sequence_starts) if __name__ == '__main__': @@ -206,7 +275,8 @@ def generate_hdf5_dataset(source_file, outfilename, count=None): parser.add_argument('source', help="source file", type=str) parser.add_argument('destination', help='destination file', type=str, nargs='?', default=None) parser.add_argument('-n', dest = 'count', type=int, default=None) + parser.add_argument('--opal-annotation', help='Use annotations from opal paper', type=str, nargs='?', default=None) args = parser.parse_args() dst = args.destination if args.destination else \ splitext(args.source)[0]+'.h5' - generate_hdf5_dataset(args.source, dst, args.count) \ No newline at end of file + generate_hdf5_dataset(args.source, dst, args.opal_annotation, args.count) \ No newline at end of file diff --git a/scripts/dsprocess_lapa.py b/scripts/dsprocess_lapa.py index 09e37f6..0c96493 100644 --- a/scripts/dsprocess_lapa.py +++ b/scripts/dsprocess_lapa.py @@ -72,14 +72,21 @@ def poor_mans_roi(points: np.ndarray): return np.array([x0, y0, x1, y1]) -def improve_roi_with_face_detector(img, roi, mtcnn : MTCNN): - new_roi, _ = mtcnn.detect(img) +def improve_roi_with_face_detector(img, roi, mtcnn : MTCNN, iou_threshold : float = 0.25, confidence_threshold : float = 0.): + new_roi, confidences = mtcnn.detect(img) if new_roi is not None: + # Filter by confidence + mask = confidences > confidence_threshold + new_roi = new_roi[mask] + confidences = confidences[mask] + if len(new_roi) <= 0: + return roi, False + # Find the box with highest iou overlap with input roi iou = box_iou(roi, new_roi) i = np.argmax(iou) new_roi = new_roi[i] iou = iou[i] - if iou > 0.25: + if iou > iou_threshold: return new_roi, True return roi, False diff --git a/scripts/evaluate_pose_network.py b/scripts/evaluate_pose_network.py index 038c4cd..65df64f 100644 --- a/scripts/evaluate_pose_network.py +++ b/scripts/evaluate_pose_network.py @@ -6,17 +6,17 @@ import torch.multiprocessing torch.multiprocessing.set_sharing_strategy('file_system') -from typing import Any, List, NamedTuple, Tuple, Dict +from typing import Any, List, NamedTuple, Tuple, Dict, Callable, Literal import numpy as np import argparse import tqdm import tabulate import json import os +import copy import pprint from numpy.typing import NDArray from matplotlib import pyplot -from os.path import basename import functools import torch from torch import Tensor @@ -25,15 +25,19 @@ from trackertraincode.datasets.batch import Batch, Metadata import trackertraincode.datatransformation as dtr -import trackertraincode.eval import trackertraincode.pipelines import trackertraincode.vis as vis import trackertraincode.utils as utils -from trackertraincode.eval import load_pose_network, predict +from trackertraincode.eval import load_pose_network, predict, compute_opal_paper_alignment, PerspectiveCorrector load_pose_network = functools.lru_cache(maxsize=1)(load_pose_network) +# According to this https://gmv.cast.uark.edu/scanning/hardware/microsoft-kinect-resourceshardware/ +# The horizontal field of view of the kinect is .. +BIWI_HORIZONTAL_FOV = 57. + + class RoiConfig(NamedTuple): expansion_factor : float = 1.1 center_crop : bool = False @@ -43,7 +47,6 @@ def __str__(self): crop = ['ROI','CC'][self.center_crop] return f'{"(H_roi)" if self.use_head_roi else "(F_roi)"}{crop}{self.expansion_factor:0.1f}' -normal_roi_configs = [ RoiConfig() ] comprehensive_roi_configs = [ RoiConfig(*x) for x in [ (1.2, False), (1.1, False), @@ -61,7 +64,17 @@ def determine_roi(sample : Batch, use_center_crop : bool): return torch.tensor([0,0,h,w], dtype=torch.float32) -def compute_predictions_and_targets(loader, net, keys, roi_config : RoiConfig): +EvalResults = Dict[str, Tensor] +BatchPerspectiveCorrector = Callable[[Tensor,EvalResults],EvalResults] + +AlignmentScheme = Literal['perspective','opal23_headpose','none'] + + +def compute_predictions_and_targets(loader, net, keys, roi_config : RoiConfig) -> Tuple[EvalResults, EvalResults]: + """ + Return: + Prediction and GT, each in a dict. + """ preds = defaultdict(list) targets = defaultdict(list) first = True @@ -86,7 +99,50 @@ def compute_predictions_and_targets(loader, net, keys, roi_config : RoiConfig): return preds, targets -def iterate_predictions(loader, preds : Batch): +def compute_predictions_and_targets_biwi(loader, net, keys, roi_config : RoiConfig, alignment : AlignmentScheme) -> Tuple[EvalResults, EvalResults]: + """ + Return: + Prediction and GT, each in a dict. + """ + preds = defaultdict(list) + targets = defaultdict(list) + other = defaultdict(list) + bar = tqdm.tqdm(total = len(loader.dataset)) + first = True + for batch in utils.iter_batched(loader, 32): + images = [ sample['image'] for sample in batch ] + rois = torch.stack([ determine_roi(sample, roi_config.center_crop) for sample in batch ]) + pred = predict( + net, + images, + rois=rois, + focus_roi_expansion_factor=roi_config.expansion_factor) + if first: + keys = list(frozenset(pred.keys()).intersection(frozenset(keys))) + first = False + for k in keys: + preds[k].append(pred[k]) + targets[k].append(torch.stack([sample[k] for sample in batch])) + other['image_sizes'].extend([ img.shape[:2][::-1] for img in images ]) + other['individual'].extend([ sample['individual'] for sample in batch ]) + bar.update(len(batch)) + preds = { k:torch.cat(v) for k,v in preds.items() } + targets = { k:torch.cat(v) for k,v in targets.items() } + other = { k:np.asarray(v) for k,v in other.items() } + if alignment == 'perspective': + corrector = PerspectiveCorrector(BIWI_HORIZONTAL_FOV) + assert 'pt3d_68' not in targets, "Unsupported. Must be computed after correction." + preds['pose'] = corrector.corrected_rotation(torch.from_numpy(other['image_sizes']), preds['coord'], preds['pose']) + elif alignment == 'opal23_headpose': + assert 'pt3d_68' not in targets, "Unsupported. Must be computed after correction." + preds['pose'] = compute_opal_paper_alignment(preds['pose'],targets['pose'], other['individual']) + return preds, targets + + +def zip_gt_with_pred(loader, preds : Batch): + ''' + Returns iterator over tuples of the Batch type. + ''' pred_iter = (dtr.to_numpy(s) for s in preds.iter_frames()) sample_iter = (dtr.to_numpy(sample) for batch in loader for sample in dtr.undo_collate(batch)) yield from zip(sample_iter, pred_iter) @@ -127,15 +183,11 @@ def __init__(self): self._header = [ 'Data', 'Pitch°', 'Yaw°', 'Roll°', 'Mean°', 'Geodesic°', 'XY%', 'S%', 'NME3d%', 'NME2d%_30', 'NME2d%_60', 'NME2d%_90', 'NME2d%_avg' ] self._entries_by_model = defaultdict(list) - def add_row(self, model : str, data : str, euler_angles : List[float], geodesic : float, rmse_pos : float, rmse_size : float, uw_nme_3d, nme_2d, data_aux_string = None): - # maxlen = 30 - # if len(model) > maxlen+3: - # model = '...'+model[-maxlen:] - - uw_nme_3d = uw_nme_3d*100 if uw_nme_3d is not None else 'n/a' - nme_2d_30, nme_2d_60, nme_2d_90, nme_2d_avg = [(x*100 if nme_2d is not None else 'n/a') for x in nme_2d] + def add_row(self, model : str, data : str, euler_angles : List[float], geodesic : float, rmse_pos : float, rmse_size : float, unweighted_nme_3d, nme_2d, data_aux_string = None): + unweighted_nme_3d = unweighted_nme_3d*100 if unweighted_nme_3d is not None else 'n/a' + nme_2d_30, nme_2d_60, nme_2d_90, nme_2d_avg = ['/na' for _ in range(4)] if nme_2d is None else [x*100 for x in nme_2d] data = self.data_name_table.get(data, data) + (data_aux_string if data_aux_string is not None else '') - self._entries_by_model[model] += [[data] + euler_angles + [ np.average(euler_angles).tolist(), geodesic, rmse_pos, rmse_size, uw_nme_3d, nme_2d_30, nme_2d_60, nme_2d_90, nme_2d_avg]] + self._entries_by_model[model] += [[data] + euler_angles + [ np.average(euler_angles).tolist(), geodesic, rmse_pos, rmse_size, unweighted_nme_3d, nme_2d_30, nme_2d_60, nme_2d_90, nme_2d_avg]] def build(self) -> str: prefix = commonprefix(list(self._entries_by_model.keys())) @@ -165,7 +217,11 @@ def model_table(rows): def report(net_filename, data_name, roi_config : RoiConfig, args : argparse.Namespace, builder : TableBuilder): loader = trackertraincode.pipelines.make_validation_loader(data_name, use_head_roi=roi_config.use_head_roi) net = load_pose_network(net_filename, args.device) - preds, targets = compute_predictions_and_targets(loader, net, ['coord','pose', 'roi', 'pt3d_68'], roi_config) + if data_name == 'biwi': + preds, targets = compute_predictions_and_targets_biwi(loader, net, ['coord','pose', 'roi'], roi_config, args.alignment_scheme) + + else: + preds, targets = compute_predictions_and_targets(loader, net, ['coord','pose', 'roi', 'pt3d_68'], roi_config) # Position and size errors are measured relative to the ROI size. Hence in percent. poseerrs = trackertraincode.eval.PoseErr()(preds, targets) eulererrs = trackertraincode.eval.EulerAngleErrors()(preds, targets) @@ -185,7 +241,7 @@ def report(net_filename, data_name, roi_config : RoiConfig, args : argparse.Name rmse_pos=(rmse_pos*100.).tolist(), rmse_size=(rmse_size*100.).tolist(), data_aux_string=' / ' + str(roi_config), - uw_nme_3d=np.average(uw_nme_3d) if uw_nme_3d is not None else None, + unweighted_nme_3d=np.average(uw_nme_3d) if uw_nme_3d is not None else None, nme_2d=nme_2d ) @@ -202,7 +258,7 @@ def report(net_filename, data_name, roi_config : RoiConfig, args : argparse.Name order = np.ascontiguousarray(np.argsort(quantity)[::-1]) loader = trackertraincode.pipelines.make_validation_loader(data_name, order=order) new_preds = Batch(Metadata(0, batchsize=len(order)), **{k:v[order] for k,v in preds.items()}) - worst_rot_iter = iterate_predictions(loader, new_preds) + worst_rot_iter = zip_gt_with_pred(loader, new_preds) history = DrawPredictionsWithHistory(data_name + '/' + net_filename) fig, btn = vis.matplotlib_plot_iterable(worst_rot_iter, history) fig.suptitle(data_name + ' / ' + str(roi_config) + ' / ' + net_filename) @@ -214,7 +270,17 @@ def report(net_filename, data_name, roi_config : RoiConfig, args : argparse.Name def run(args): gui = [] table_builder = TableBuilder() - roi_configs = comprehensive_roi_configs if args.comprehensive_roi else normal_roi_configs + + if not args.comprehensive_roi: + if args.roi_expansion is not None: + roi_configs = [ RoiConfig(expansion_factor=args.roi_expansion) ] + else: + roi_configs = [ RoiConfig() ] + else: + assert args.roi_expansion is None, "Conflicting arguments" + roi_configs = comprehensive_roi_configs + + datasets = args.ds.split('+') for net_filename in args.filenames: for name in datasets: @@ -240,6 +306,8 @@ def run(args): parser.add_argument('--vis', dest='vis', help='visualization of worst', default='none', choices=['none','kpts','rot','size']) parser.add_argument('--device', help='select device: cpu or cuda', default='cuda', type=str) parser.add_argument('--comprehensive-roi', action='store_true', default=False) + parser.add_argument('--alignment-scheme', choices=['perspective','opal23_headpose','none'], default='none') + parser.add_argument('--roi-expansion', default=None, type=float) parser.add_argument('--json', type=str, default=None) parser.add_argument('--ds', type=str, default='aflw2k3d') args = parser.parse_args() diff --git a/scripts/evaluate_stability.py b/scripts/evaluate_stability.py index 4830e78..32c8b41 100644 --- a/scripts/evaluate_stability.py +++ b/scripts/evaluate_stability.py @@ -185,9 +185,9 @@ def make_nice(axes): axes[k+3].plot(pred.coord_scales[...,1,0]) axes[k+4].plot(pred.coord_scales[...,2,0]) axes[k+5].plot(pred.coord_scales[...,2,1]) - for i, label in zip(range(k,k+6),['y-sz', 'x-sz', 'sz', 'x', 'y', 'x-y']): + for i, label in zip(range(k,k+6),['sz', 'x', 'y', 'x-y', 'y-sz', 'x-sz' ]): axes[i].set(ylabel=label) - else: + elif pred.coord_scales is not None: axes[k].plot(pred.coord_scales[...,2]) axes[k].set(ylabel='sz') make_nice(axes) @@ -470,6 +470,9 @@ def compute_metrics_for_roi(gt : torch.Tensor, preds : torch.Tensor): prefix = os.path.commonprefix([p for p,_,_ in metrics_by_network_and_noise_and_quantity.keys()]) metrics_by_network_and_noise_and_quantity = { (os.path.relpath(k,prefix),n,q):v for (k,n,q),v in metrics_by_network_and_noise_and_quantity.items() } + with open('/tmp/noise_resist_result_v2.pkl','wb') as f: + pickle.dump(metrics_by_network_and_noise_and_quantity, f) + # Mean and average over ensemble metrics_by_network_and_quantity = defaultdict(list) for (cp, noise, quantity), results in metrics_by_network_and_noise_and_quantity.items(): @@ -485,9 +488,6 @@ def compute_metrics_for_roi(gt : torch.Tensor, preds : torch.Tensor): rows = zip(noise, avg[:,0], maybe_std[:,0], avg[:,1], maybe_std[:,1]) print (tabulate.tabulate(rows, [ 'noise', 'center', '+/-', 'spread', '+/-', 'err', '+/-' ], tablefmt='github', floatfmt=".2f")) - with open('/tmp/noise_resist_result.pkl','wb') as f: - pickle.dump(metrics_by_network_and_quantity, f) - if 1: # vis checkpoints = frozenset([cp for cp,_ in metrics_by_network_and_quantity.keys()]) for quantity in ['pose','roi']: diff --git a/scripts/export_model.py b/scripts/export_model.py index ed9c2cf..18e11ab 100644 --- a/scripts/export_model.py +++ b/scripts/export_model.py @@ -4,6 +4,13 @@ import os import torch import copy +import tqdm +import itertools + +from torch.ao.quantization import get_default_qconfig_mapping, QConfig, QConfigMapping +from torch.ao.quantization.quantize_fx import convert_fx, prepare_fx +from torch.ao.quantization import fake_quantize +from torch.ao.quantization import observer import torch.onnx import torch.nn as nn @@ -14,7 +21,9 @@ ort = None print ("Warning cannot import ONNX runtime: Runtime checks disabled") +from trackertraincode.neuralnets.bnfusion import fuse_convbn import trackertraincode.neuralnets.models +import trackertraincode.pipelines # Only single thread for inference time measurement os.environ["OMP_NUM_THREADS"] = "1" @@ -26,7 +35,7 @@ def clear_denormals(state_dict, threshold=1.e-20): # decrease compared to pretrained weights from torchvision. # The real denormals start below 2.*10^-38 # Denormals make computations on CPU very slow .. at least back then ... - state_dict = copy.deepcopy(state_dict) + state_dict = { k:v.detach().clone() for k,v in state_dict.items() } print ("Denormals or zeros:") for k, v in state_dict.items(): if v.dtype == torch.float32: @@ -38,6 +47,64 @@ def clear_denormals(state_dict, threshold=1.e-20): return state_dict + +def quantize_backbone(original : trackertraincode.neuralnets.models.NetworkWithPointHead): + original = copy.deepcopy(original) + + dsid = trackertraincode.pipelines.Id + train_loader, _, _ = trackertraincode.pipelines.make_pose_estimation_loaders( + inputsize = original.input_resolution, + batchsize = 128, + datasets = [dsid.REPO_300WLP,dsid.SYNFACE,dsid], + dataset_weights = {}, + use_weights_as_sampling_frequency=True, + enable_image_aug=True, + rotation_aug_angle=30., + roi_override='original', + device=None) + example_input = (next(iter(train_loader))[0]['image'],) + original.eval() + + # Configuration chosen as per advice from + # https://oscar-savolainen.medium.com/how-to-quantize-a-neural-network-model-in-pytorch-an-in-depth-explanation-d4a2cdf632a4 + config = QConfig(activation=fake_quantize.FusedMovingAvgObsFakeQuantize.with_args(observer=observer.MovingAverageMinMaxObserver, + quant_min=0, + quant_max=255, + dtype=torch.quint8, + qscheme=torch.per_tensor_affine), + weight=fake_quantize.FakeQuantize.with_args(observer=fake_quantize.MovingAveragePerChannelMinMaxObserver, + quant_min=-128, + quant_max=127, + dtype=torch.qint8, + qscheme=torch.per_channel_symmetric)) + #qconfig_mapping = get_default_qconfig_mapping("x86") + #qconfig_mapping = get_default_qconfig_mapping("fbgemm") + #qconfig_mapping = get_default_qconfig_mapping("qnnpack") + qconfig_mapping = QConfigMapping() + qconfig_mapping.set_global(config) + # Disable quantization after the convolutional layers. + # The final relu+global pooling seems to be fast enough to do in float32 without + # significant slowdown. + qconfig_mapping = qconfig_mapping.set_object_type(nn.AdaptiveAvgPool2d, None) + if original.config == 'resnet18': + # TODO: better SW design? + # Disables quantization of the input of the AveragePooling + qconfig_mapping = qconfig_mapping.set_module_name('layers.7.1.relu', None) + + convnet = prepare_fx( + fuse_convbn(torch.fx.symbolic_trace(original.convnet)), + qconfig_mapping, + example_input) + + for _, batches in tqdm.tqdm(zip(range(20), train_loader)): + for batch in batches: + convnet(batch['image']) + + original.convnet = convert_fx(convnet) + + return original + + class ModelForOpenTrack(nn.Module): """ Rearranges the model output @@ -94,19 +161,6 @@ def forward(self, x): return tuple(y[k] for k in self.output_names) -def load_posemodel(args): - sd = torch.load(args.posemodelfilename) - net = trackertraincode.neuralnets.models.NetworkWithPointHead( - enable_point_head=True, - enable_face_detector=False, - config='mobilenetv1', - enable_uncertainty=True, - backbone_args = {'use_blurpool' : False} - ) - net.load_state_dict(sd, strict=True) - return net - - def load_facelocalizer(args): sd = torch.load(args.localizermodelfilename) net = trackertraincode.neuralnets.models.LocalizerNet() @@ -137,8 +191,10 @@ def compare_network_outputs(torchmodel, ort_session, inputs): @torch.no_grad() -def convert_posemodel_onnx(net : nn.Module, filename, for_opentrack=True): +def convert_posemodel_onnx(net : nn.Module, filename, for_opentrack=True, quantize=False): net.load_state_dict(clear_denormals(net.state_dict())) + if quantize: + net = quantize_backbone(net) if for_opentrack: net = ModelForOpenTrack(net) else: @@ -153,7 +209,7 @@ def convert_posemodel_onnx(net : nn.Module, filename, for_opentrack=True): B, C, H, W = inputs[0].shape - destination = splitext(filename)[0]+('.onnx' if for_opentrack else '_complete.onnx') + destination = splitext(filename)[0]+('_ptq' if quantize else '')+('.onnx' if for_opentrack else '_complete.onnx') print (f"Exporting {net.__class__}, input size = {H},{W} to {destination}") @@ -174,6 +230,13 @@ def convert_posemodel_onnx(net : nn.Module, filename, for_opentrack=True): dynamic_axes = dynamic_axes, verbose=False) + # torch.onnx.dynamo_export( + # net, # model being run + # inputs, # model input (or a tuple for multiple inputs) + # export_options=torch.onnx.ExportOptions( + # dynamic_shapes=False, + # )).save(destination) + onnxmodel = onnx.load(destination) onnxmodel.doc_string = 'Head pose prediction' onnxmodel.model_version = 4 # This must be an integer or long. @@ -233,10 +296,11 @@ def convert_localizer(args): parser.add_argument('--posenet', dest = 'posemodelfilename', help="filename of model checkpoint", type=str, default=None) parser.add_argument('--full', action='store_true', default=False) parser.add_argument('--localizer', dest = 'localizermodelfilename', help="filename of model checkpoint", type=str, default=None) + parser.add_argument('--quantize', action='store_true', default=False) args = parser.parse_args() if args.posemodelfilename: - net = load_posemodel(args) - convert_posemodel_onnx(net, args.posemodelfilename, for_opentrack=not args.full) + net = trackertraincode.neuralnets.models.load_model(args.posemodelfilename) + convert_posemodel_onnx(net, args.posemodelfilename, for_opentrack=not args.full, quantize=args.quantize) if args.localizermodelfilename: convert_localizer(args) if not args.posemodelfilename and not args.localizermodelfilename: diff --git a/scripts/show_train_test_splits.py b/scripts/show_train_test_splits.py index 4eb6ddf..6ead42e 100644 --- a/scripts/show_train_test_splits.py +++ b/scripts/show_train_test_splits.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import numpy as np import torch from matplotlib import pyplot @@ -21,7 +22,7 @@ def iterate_predictions(): the_iter = itertools.chain.from_iterable(loader) if loader_outputs_list_of_batches else loader for subset in the_iter: print(subset.meta.tag) - subset = dtr.to_device('cpu', subset) + subset = subset.to('cpu') subset['image'] = trackertraincode.pipelines.unwhiten_image(subset['image']) subset = dtr.unnormalize_batch(subset) subset = dtr.to_numpy(subset) diff --git a/scripts/train_poseestimator.py b/scripts/train_poseestimator.py index acc1895..83f814a 100644 --- a/scripts/train_poseestimator.py +++ b/scripts/train_poseestimator.py @@ -15,6 +15,7 @@ import torch.optim as optim import torch +import torch.nn as nn import trackertraincode.neuralnets.losses as losses import trackertraincode.neuralnets.models as models import trackertraincode.neuralnets.negloglikelihood as NLL @@ -96,18 +97,26 @@ def setup_datasets(args : MyArgs): return train_loader, test_loader, ds_size -def parameter_groups_with_decaying_learning_rate(parameter_groups, slow_lr, fast_lr): - # Note: Parameters are enumerated in the order from the input to the output layers - factor = (fast_lr/slow_lr)**(1./(len(parameter_groups)-1)) +def find_variance_parameters(net : nn.Module): + if isinstance(net,(NLL.FeaturesAsTriangularScale,NLL.FeaturesAsDiagonalScale,NLL.DiagonalScaleParameter)): + return list(net.parameters()) + else: + return sum((find_variance_parameters(x) for x in net.children()), start=[]) + + +def setup_lr_with_slower_variance_training(net, base_lr): + variance_params = find_variance_parameters(net) + other_params = list(frozenset(net.parameters()).difference(frozenset(variance_params))) return [ - { 'params' : p, 'lr' : slow_lr*factor**i } for i,p in enumerate(parameter_groups) + { 'params' : other_params, 'lr' : base_lr }, + { 'params' : variance_params, 'lr' : 0.1*base_lr } ] def create_optimizer(net, args : MyArgs): - to_optimize = net.parameters() - #optimizer = optim.AdamW(to_optimize, lr=args.lr, weight_decay=1.e-3) - optimizer = optim.Adam(to_optimize, lr=args.lr) + optimizer = optim.Adam( + setup_lr_with_slower_variance_training(net,args.lr), + lr=args.lr,) if args.find_lr: print ("LR finding mode!") n_epochs = args.epochs @@ -116,7 +125,8 @@ def create_optimizer(net, args : MyArgs): scheduler = optim.lr_scheduler.LambdaLR(optimizer, lambda e: base**e, verbose=True) else: n_epochs = args.epochs - scheduler = train.LinearUpThenSteps(optimizer, max(1,n_epochs//(2*10)), 0.1, [n_epochs//2]) + #scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, [n_epochs//2], 0.1) + scheduler = train.ExponentialUpThenSteps(optimizer, max(1,n_epochs//(10)), 0.1, [n_epochs//2]) return optimizer, scheduler, n_epochs @@ -133,8 +143,6 @@ class SaveBestSpec(NamedTuple): def setup_losses(args : MyArgs, net): C = train.Criterion - - chasface = [ C('hasface', losses.HasFaceLoss(), 0.01) ] cregularize = [ C('quatregularization1', losses.QuaternionNormalizationSoftConstraint(), 1.e-6), ] @@ -145,24 +153,29 @@ def setup_losses(args : MyArgs, net): shapeparamloss = [] if args.with_nll_loss: - nllw = 0.01 + def ramped_up_nll_weight(multiplier): + def wrapped(step): + strength = min(1., max(0., (step / args.epochs - 0.1) * 10.)) + return 0.01 * strength * multiplier + return wrapped + #return multiplier * 0.01 poselosses += [ - C('nllrot', NLL.QuatPoseNLLLoss().to('cuda'), 0.3*nllw), - C('nllcoord', NLL.CorrelatedCoordPoseNLLLoss().cuda(), 0.3*nllw) + C('nllrot', NLL.QuatPoseNLLLoss().to('cuda'), ramped_up_nll_weight(0.5)), + C('nllcoord', NLL.CorrelatedCoordPoseNLLLoss().cuda(), ramped_up_nll_weight(0.5)) ] if args.with_roi_train: roilosses += [ - C('nllbox', NLL.BoxNLLLoss(distribution='gaussian'), 0.01*nllw) + C('nllbox', NLL.BoxNLLLoss(distribution='gaussian'), ramped_up_nll_weight(0.01)) ] if args.with_pointhead: pointlosses += [ - C('nllpoints3d', NLL.Points3dNLLLoss(chin_weight=0.8, eye_weight=0., distribution='laplace').cuda(), 0.7*nllw) + C('nllpoints3d', NLL.Points3dNLLLoss(chin_weight=0.8, eye_weight=0., distribution='gaussian').cuda(), ramped_up_nll_weight(0.5)) ] pointlosses25d = [ - C('nllpoints3d', NLL.Points3dNLLLoss(chin_weight=0.8, eye_weight=0., pointdimension=2, distribution='laplace').cuda(), 0.7*nllw) + C('nllpoints3d', NLL.Points3dNLLLoss(chin_weight=0.8, eye_weight=0., pointdimension=2, distribution='gaussian').cuda(), ramped_up_nll_weight(0.5)) ] shapeparamloss += [ - C('nllshape', NLL.ShapeParamsNLLLoss(distribution='gaussian'), 0.05*nllw) + #C('nllshape', NLL.ShapeParamsNLLLoss(distribution='gaussian'), ramped_up_nll_weight(0.01)) ] if 1: poselosses += [ @@ -176,29 +189,32 @@ def setup_losses(args : MyArgs, net): ] if args.with_pointhead: pointlosses += [ - C('points3d', losses.Points3dLoss('l1', chin_weight=0.8, eye_weights=0.).cuda(), 0.7) + C('points3d', losses.Points3dLoss('l2', chin_weight=0.8, eye_weights=0.).cuda(), 0.5), + ] + pointlosses25d += [ + C('points3d', losses.Points3dLoss('l2', pointdimension=2, chin_weight=0.8, eye_weights=0.).cuda(), 0.5), ] - pointlosses25d += [ C('points3d', losses.Points3dLoss('l1', pointdimension=2, chin_weight=0.8, eye_weights=0.).cuda(), 0.7) ] shapeparamloss += [ - C('shp_l2', losses.ShapeParameterLoss(), 0.05), + C('shp_l2', losses.ShapeParameterLoss(), 0.1), + ] + cregularize += [ + C('nll_shp_gmm', losses.ShapePlausibilityLoss().cuda(), 0.1), ] train_criterions = { - Tag.ONLY_POSE : train.MultiTaskLoss(poselosses + cregularize), - Tag.POSE_WITH_LANDMARKS : train.MultiTaskLoss(poselosses + cregularize + pointlosses + shapeparamloss + roilosses), - Tag.POSE_WITH_LANDMARKS_3D_AND_2D : train.MultiTaskLoss(poselosses + cregularize + pointlosses + shapeparamloss + roilosses), - Tag.ONLY_LANDMARKS : train.MultiTaskLoss(pointlosses + cregularize), - Tag.ONLY_LANDMARKS_25D : train.MultiTaskLoss(pointlosses25d + cregularize), - Tag.FACE_DETECTION : train.MultiTaskLoss(chasface + roilosses), + Tag.ONLY_POSE : train.CriterionGroup(poselosses + cregularize), + Tag.POSE_WITH_LANDMARKS : train.CriterionGroup(poselosses + cregularize + pointlosses + shapeparamloss + roilosses), + Tag.POSE_WITH_LANDMARKS_3D_AND_2D : train.CriterionGroup(poselosses + cregularize + pointlosses + shapeparamloss + roilosses), + Tag.ONLY_LANDMARKS : train.CriterionGroup(pointlosses + cregularize), + Tag.ONLY_LANDMARKS_25D : train.CriterionGroup(pointlosses25d + cregularize), } test_criterions = { - Tag.POSE_WITH_LANDMARKS : train.DefaultTestFunc(poselosses + pointlosses + roilosses + shapeparamloss), - Tag.FACE_DETECTION : train.DefaultTestFunc(chasface + roilosses), + Tag.POSE_WITH_LANDMARKS : train.DefaultTestFunc(poselosses + pointlosses + roilosses + shapeparamloss + cregularize), } savebest = SaveBestSpec( - [l.w for l in poselosses], - [ l.name for l in poselosses]) + [ 1.0, 1.0, 1.0], + [ 'rot', 'xy', 'sz' ]) return train_criterions, test_criterions, savebest @@ -212,7 +228,6 @@ def create_net(args : MyArgs): backbone_args={'use_blurpool' : args.with_blurpool} ) - def main(): np.seterr(all='raise') cv2.setNumThreads(1) @@ -281,11 +296,11 @@ def main(): if args.swa: swa_filename = join(args.outdir,f'swa_{swa_model.module.name}.ckpt') - torch.save(swa_model.module.state_dict(), swa_filename) + models.save_model(swa_model.module, swa_filename) last_save_filename = join(args.outdir,f'last_{net.name}.ckpt') - torch.save(net.state_dict(), last_save_filename) + models.save_model(net, last_save_filename) if args.export_onnx: from scripts.export_model import convert_posemodel_onnx @@ -293,7 +308,7 @@ def main(): net.to('cpu') convert_posemodel_onnx(net, filename=last_save_filename) - net.load_state_dict(torch.load(save_callback.filename)) + net.load_state_dict(torch.load(save_callback.filename)['state_dict']) convert_posemodel_onnx(net, filename=save_callback.filename) if args.swa: diff --git a/test/test_affine_img_trafo.py b/test/test_affine_img_trafo.py index 094121b..0528bb4 100644 --- a/test/test_affine_img_trafo.py +++ b/test/test_affine_img_trafo.py @@ -1,5 +1,5 @@ import numpy as np -from typing import Callable, Set, Sequence, Union, List, Tuple, Dict, Optional, NamedTuple +from typing import Callable, Set, Sequence, Union, List, Tuple, Dict, Optional, NamedTuple, Any, Literal from matplotlib import pyplot import pytest import numpy.testing @@ -9,13 +9,11 @@ import torch.nn.functional as F import trackertraincode.datatransformation as dtr -from trackertraincode.datatransformation.affinetrafo import ( - transform_image_torch, - transform_image_pil, - croprescale_image_cv2) - -from trackertraincode.datasets.batch import Batch, Metadata +from trackertraincode.datatransformation.image_geometric_torch import croprescale_image_torch, affine_transform_image_torch +from trackertraincode.datatransformation.image_geometric_cv2 import croprescale_image_cv2, affine_transform_image_cv2, DownFilters, UpFilters from trackertraincode.neuralnets.affine2d import Affine2d +from trackertraincode.neuralnets.math import affinevecmul +from trackertraincode.datasets.batch import Batch, Metadata from kornia.geometry.subpix import spatial_expectation2d @@ -32,108 +30,64 @@ ''' -def no_randomization(B, scaling_mode) -> dtr.RoiFocusRandomizationParameters: +def no_randomization(B, filter_args) -> dtr.RoiFocusRandomizationParameters: return dtr.RoiFocusRandomizationParameters( scales = torch.tensor(1.), angles = torch.tensor(0.), translations = torch.tensor([0.,0.]), - scaling_mode = scaling_mode) + **filter_args) -def with_some_similarity_trafo(B, scaling_mode) -> dtr.RoiFocusRandomizationParameters: + +def with_some_similarity_trafo(B, filter_args) -> dtr.RoiFocusRandomizationParameters: return dtr.RoiFocusRandomizationParameters( - scales = torch.tensor(1.5), + scales = torch.tensor(0.75), angles = torch.tensor(20.*np.pi/180.), - translations = torch.tensor([-0.30,-0.05]), - scaling_mode = scaling_mode) + translations = torch.tensor([-0.1, 0.03]), + **filter_args) +UpDownSampleHint = Literal["up","down"] -class Case(NamedTuple): +class TestData(NamedTuple): S : int # size R : int # new size - X : int # point position - Y : int # point position - batch : Batch - tol : List[float] - - -def make_batch(scale_up_or_down, aligned_corners): - tolerances = [ 1.5, 0.1, 1.5] - if aligned_corners: - if scale_up_or_down == 'down': - S = 101 - R = (S-1)//10+1 - X, Y = 30, 5 - else: - S = 10 # S-1 segments. Every segment will have S-1 more points - R = (S-1)*10+1 - X, Y = 3, 2 - tolerances = [ 4., 1., 4. ] - else: - if scale_up_or_down == 'down': - S = 100 - R = 10 - X, Y = 30, 10 - else: - S = 10 - R = 100 - X, Y = 3, 2 - - img = torch.zeros((3,S,S), dtype=torch.float32) - img[0,0,0] = 255. - img[1,Y,X] = 255. - img[2,S-1,S-1] = 255. - points = torch.tensor([[0.,0.,0.],[X,Y,0.],[S-1,S-1,0.]], dtype=torch.float32) - roi = torch.tensor([0.,0.,S-1,S-1]) - if not aligned_corners: - points += 0.5 - roi = torch.tensor([0.,0.,S,S]) - batch = Batch( - Metadata(_imagesize = S, batchsize=0, categories= - {'image' : dtr.FieldCategory.image, - 'pt3d_68' : dtr.FieldCategory.points, - 'roi' : dtr.FieldCategory.roi}), { - 'image' : img, - 'pt3d_68' : points, - 'roi' : roi - }) - return Case(S, R, X, Y, batch, tolerances) - - -def make_batch_with_room_around_roi(scale_up_or_down, aligned_corners): - tolerances = [ 1.5, 0.1, 1.5] - if aligned_corners: - if scale_up_or_down == 'down': - pad = 50 - S = 101 - R = (S-1)//10+1 - X, Y = 30, 5 - else: - pad = 2 - S = 10 # S-1 segments. Every segment will have S-1 more points - R = (S-1)*10+1 - X, Y = 3, 2 - tolerances = [ 4., 1., 4. ] + batch : Batch # Contains image, 3d points, and roi. + tol : float # Pixel tolerance for point reconstruction based on heatmap. + + +def make_test_data(scale_up_or_down : UpDownSampleHint): + '''Creates a heatmap with 3 peaks and corresponding 3d points and an roi bounding the full image. + + When downscaling is used then the image is made up of 10x10 blocks, so that the downscaling + will produce 1 pixel per block so that the points can be reconstructed accurately. + + Otherwise a single pixels will be set per point. + ''' + if scale_up_or_down == 'down': + S = 200 + R = 20 + points = torch.tensor([[15,15,0],[45,35,0],[85,85,0]], dtype=torch.float32) + points += 50 else: - if scale_up_or_down == 'down': - pad = 50 - S = 100 - R = 10 - X, Y = 30, 10 - else: - pad = 2 - S = 10 - R = 100 - X, Y = 3, 2 - - img = torch.zeros((3,S+2*pad,S+2*pad), dtype=torch.float32) - img[0,pad,pad] = 255. - img[1,Y+pad,X+pad] = 255. - img[2,S+pad-1,S+pad-1] = 255. - points = torch.tensor([[pad,pad,0.],[X+pad,Y+pad,0.],[S+pad-1,S+pad-1,0.]], dtype=torch.float32) - roi = torch.tensor([pad,pad,S+pad-1,S+pad-1], dtype=torch.float32) - if not aligned_corners: + S = 20 + R = 200 + points = torch.tensor([[1,1,0],[4,3,0],[8,8,0]], dtype=torch.float32) + # For align_corners=False when pixel values are cell centered: points += 0.5 - roi = torch.tensor([pad,pad,S+pad,S+pad], dtype=torch.float32) + points += 5 + + img = torch.zeros((3,20,20), dtype=torch.float32) + # Leave space at border to account for blurring so that the points can be + # reconstructed from the peaks very precisely. + img[0,5+1,5+1] = 255. + img[1,5+3,5+4] = 255. + img[2,5+8,5+8] = 255. + if scale_up_or_down == 'down': + img = img.repeat_interleave(10,dim=1).repeat_interleave(10,dim=2) + + # For align_corners=False, the roi subsumes the area from the first + # to the last pixel completely + roi = torch.tensor([0.,0.,S,S]) + batch = Batch( Metadata(_imagesize = S, batchsize=0, categories= {'image' : dtr.FieldCategory.image, @@ -143,132 +97,95 @@ def make_batch_with_room_around_roi(scale_up_or_down, aligned_corners): 'pt3d_68' : points, 'roi' : roi }) - return Case(S, R, X, Y, batch, tolerances) - + return TestData(S, R, batch, 0.01) -def check(result : Batch, td : Case, align_corners : bool): - hm = result['image'][None,...] - assert hm.shape == (1,len(td.batch['pt3d_68']),td.R,td.R) +def check(td : TestData, image, points): + """Check if heatmap and points match.""" + hm = image[None,...] + assert hm.shape == (1,len(points),td.R,td.R) hm /= hm.sum(dim=[-1,-2],keepdims=True) heatmap_points = spatial_expectation2d(hm, normalized_coordinates=False)[0] - if not align_corners: - # Because the vertices of the heatmap are centered in the middle of the pixel areas - heatmap_points += 0.5 - coord_points = result['pt3d_68'][:,:2] - for i, (a, b, tol) in enumerate(zip(heatmap_points, coord_points, td.tol)): - numpy.testing.assert_allclose(a, b, atol = tol, err_msg=f'Mismatch at point {i}') - - -def vis(td, result, align_corners): - fig, ax = pyplot.subplots(1,1) - extent = [-0.5,td.R-1+0.5,td.R-1+0.5,-0.5] if align_corners else [0.,td.R,td.R,0.] - img = ax.imshow( - dtr._ensure_image_nhwc(result['image']).mean(dim=-1), - interpolation='bilinear' if align_corners else 'nearest', - vmin=0., - extent=extent) - ax.scatter(*result['pt3d_68'].T[:2]) - fig.colorbar(img, ax=ax) - pyplot.show() - - -@pytest.mark.parametrize('scaling_way', [ 'up','down']) -@pytest.mark.parametrize('sampling_method', [ - dtr.ScalingMode.TORCH_GRID_SAMPLE_NO_ALIGN_CORNERS, - dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS, - dtr.ScalingMode.PIL_HAMMING_WINDOW, - dtr.ScalingMode.OPENCV_AREA -]) -def test_scalingtrafo(scaling_way, sampling_method): - align_corners = sampling_method==dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS - td = make_batch(scaling_way, align_corners) - augmentation = dtr.RandomFocusRoi(new_size = td.R) - augmentation.make_randomization_parameters = partial(no_randomization, scaling_mode=sampling_method) - result = augmentation(td.batch) - #vis(td, result, align_corners) - if sampling_method in (dtr.ScalingMode.PIL_HAMMING_WINDOW, dtr.ScalingMode.OPENCV_AREA) and scaling_way == 'down': - # At least one pixel tolerance, due to aliasing. - td = td._replace(tol = [max(1.,t) for t in td.tol]) - check(result,td,align_corners) - - -@pytest.mark.parametrize('scaling_way', ['down', 'up']) -@pytest.mark.parametrize('sampling_method', [ - dtr.ScalingMode.TORCH_GRID_SAMPLE_NO_ALIGN_CORNERS, - dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS, - dtr.ScalingMode.PIL_HAMMING_WINDOW, - dtr.ScalingMode.OPENCV_AREA -]) -def test_scalingtrafo_with_randomizer(scaling_way, sampling_method): - align_corners = sampling_method==dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS - td = make_batch_with_room_around_roi(scaling_way, align_corners) - augmentation = dtr.RandomFocusRoi(new_size = td.R) - augmentation.make_randomization_parameters = partial(with_some_similarity_trafo, scaling_mode=sampling_method) - result = augmentation(td.batch) - #vis(td, result, align_corners) - if sampling_method in (dtr.ScalingMode.PIL_HAMMING_WINDOW, dtr.ScalingMode.OPENCV_AREA) and scaling_way == 'down': - # At least one pixel tolerance, due to aliasing. - td = td._replace(tol = [max(1.,t) for t in td.tol]) - check(result,td,align_corners) - - -@pytest.mark.parametrize('scaling_mode', [ - dtr.ScalingMode.PIL_HAMMING_WINDOW, - dtr.ScalingMode.OPENCV_AREA, - dtr.ScalingMode.TORCH_GRID_SAMPLE_NO_ALIGN_CORNERS, - dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS, -]) -@pytest.mark.parametrize('dt',[torch.float32, torch.uint8]) -def test_transform_image_only(scaling_mode, dt): - img = 1.*torch.ones((1,8,18),dtype=torch.float32) - img = torch.nn.functional.pad(img, [1,1,1,1], mode='constant', value=1.) - if dt == torch.uint8: - img = (img * 255).to(dt) - - if scaling_mode == dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS: - tr = Affine2d.range_remap_2d([15.,5.],[24.,14.], [0., 0.], [99.,99.]) - else: - roi = torch.tensor([15, 5, 25, 15], dtype=torch.float32) - tr = Affine2d.range_remap_2d([15,5],[25.,15.], [0., 0.], [100.,100.]) - # x x x x o o corner = pixel - # | | - # - # x x x x o o cell-center = pixel - # | | | - if scaling_mode in (dtr.ScalingMode.TORCH_GRID_SAMPLE_NO_ALIGN_CORNERS, dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS): - new_img = transform_image_torch(img, tr, 100, scaling_mode==dtr.ScalingMode.TORCH_GRID_SAMPLE_ALIGN_CORNERS, dtr.FieldCategory.image) - else: - new_img = { - dtr.ScalingMode.PIL_HAMMING_WINDOW : transform_image_pil, - dtr.ScalingMode.OPENCV_AREA : croprescale_image_cv2 - }[scaling_mode](img, roi, 100, dtr.FieldCategory.image) + # Because the vertices of the heatmap are centered in the middle of the pixel areas + heatmap_points += 0.5 + coord_points = points[:,:2] + for i, (a, b) in enumerate(zip(heatmap_points, coord_points)): + numpy.testing.assert_allclose(a, b, atol = td.tol, err_msg=f'Mismatch at point {i}') - nonzeroval, zero, tol = { - torch.float32 : (1., 0., 1.e-3), - torch.uint8 : (255, 0, 1) - }[dt] +def vis(td, image, points): if 0: - print (scaling_mode) - pyplot.imshow(new_img[0]) + fig, ax = pyplot.subplots(1,1) + extent = [0.,td.R,td.R,0.] + img = ax.imshow( + dtr._ensure_image_nhwc(image).mean(dim=-1), + interpolation='nearest', + vmin=0., + extent=extent) + ax.scatter(*points.T[:2]) + fig.colorbar(img, ax=ax) pyplot.show() - assert new_img.shape==(1,100,100) - numpy.testing.assert_allclose(new_img[:,:40,:40], np.array(nonzeroval), atol=tol) - numpy.testing.assert_allclose(new_img[:,60:,:], np.array(zero), atol=tol) - numpy.testing.assert_allclose(new_img[:,:,60:], np.array(zero), atol=tol) -# def test_transform_image_pil_aliasing(): -# img = 255.*torch.eye(100,dtype=torch.float32).expand(1,-1,-1) -# roi = torch.tensor([0., 0., 99., 99.], dtype=torch.float32) +up_down_sample_configs = [ + ('up', { 'upfilter' : 'linear' }, 0.,), + ('up', { 'upfilter' : 'cubic' }, 0.5,), + ('up', { 'upfilter' : 'lanczos' }, 0.5,), + ('down', {'downfilter' : 'gaussian' }, 0.), + ('down', {'downfilter' : 'hamming' }, 0.), + ('down', {'downfilter' : 'area' }, 0.) +] -# new_img = dtr.transform_image_opencv(img, roi, 10, dtr.FieldCategoryPoseDataset.image) -# pyplot.imshow(new_img[0]) -# pyplot.show() +@pytest.mark.parametrize('scaling_way, filter_args, tol', up_down_sample_configs) +def test_scalingtrafo(scaling_way, filter_args, tol): + td = make_test_data(scaling_way) + augmentation = dtr.RandomFocusRoi(new_size = td.R) + augmentation.make_randomization_parameters = partial(no_randomization, filter_args=filter_args) + td = td._replace(tol = td.tol + tol) + result = augmentation(td.batch) + vis(td, result['image'], result['pt3d_68']) + check(td, result['image'], result['pt3d_68']) -if __name__ == '__main__': - #pytest.main(["-s","-x",__file__, "-k", "test_transform_image_only"]) - pytest.main(["-s","-x",__file__]) \ No newline at end of file +@pytest.mark.parametrize('scaling_way, filter_args, tol', up_down_sample_configs) +def test_scalingtrafo_with_randomizer(scaling_way, filter_args, tol): + td = make_test_data(scaling_way) + augmentation = dtr.RandomFocusRoi(new_size = td.R) + augmentation.make_randomization_parameters = partial(with_some_similarity_trafo, filter_args=filter_args) + result = augmentation(td.batch) + td = td._replace(tol = td.tol + tol + (0.2 if scaling_way=='down' else 0.5)) + vis(td, result['image'], result['pt3d_68']) + check(td, result['image'], result['pt3d_68']) + + +@pytest.mark.parametrize('scaling_way', ['up','down']) +def test_image_affine_transform(scaling_way : str): + td = make_test_data(scaling_way) + tr = Affine2d.range_remap_2d([0,0], [td.S, td.S], [0,0], [td.R, td.R]) + tr = Affine2d.trs( + translations=torch.tensor([3.,-td.R*0.45]), + angles = torch.tensor(20.*np.pi/180.), + scales = torch.tensor(1.5)) @ tr + td = td._replace(tol = 1.0) + cv2result = affine_transform_image_cv2(td.batch['image'], tr, td.R) + torchresult = affine_transform_image_torch(td.batch['image'], tr, td.R) + points = affinevecmul(tr.tensor(), td.batch['pt3d_68'][...,:2]) + assert torch.sqrt(torch.nn.functional.mse_loss(cv2result, torchresult)).item() <= (2. if scaling_way=='up' else 10.) + vis(td, cv2result, points) + check(td, cv2result, points) + check(td, torchresult, points) + + +@pytest.mark.parametrize('scaling_way', ['up','down']) +def test_image_crop_rescale(scaling_way : str): + td = make_test_data(scaling_way) + td.batch['roi'] = td.batch['roi'].to(torch.int32) + tr = Affine2d.range_remap_2d(td.batch['roi'][:2], td.batch['roi'][2:], [0,0], [td.R, td.R]) + cv2result = croprescale_image_cv2(td.batch['image'], roi=td.batch['roi'], new_size=(td.R, td.R)) + torchresult = croprescale_image_torch(td.batch['image'], roi=td.batch['roi'], new_size=(td.R, td.R)) + points = affinevecmul(tr.tensor(), td.batch['pt3d_68'][...,:2]) + assert torch.sqrt(torch.nn.functional.mse_loss(cv2result, torchresult)).item() <= 7. + vis(td, cv2result, points) + check(td, cv2result, points) + check(td, torchresult, points) \ No newline at end of file diff --git a/test/test_datatransformation.py b/test/test_datatransformation.py new file mode 100644 index 0000000..75ca337 --- /dev/null +++ b/test/test_datatransformation.py @@ -0,0 +1,22 @@ +import torch +import pytest + +from trackertraincode.datatransformation.sample_geometric import GeneralFocusRoi + +@pytest.mark.parametrize('bbox,f,t,bbs, expected',[ + ([-10,-10,10,10], 1., [-1.,0.], 0.3, [-16,-10,4,10]), + ([-10,-10,10,10], 1., [ 1.,0.], 0.3, [-4,-10,16,10]), + ([-10,-10,10,10], 1., [0.,-1.], 0.3, [-10,-16,10,4]), + ([-10,-10,10,10], 1., [0., 1.], 0.3, [-10,-4,10,16]), + ([-10,-10,10,10], 2., [0., 0.], 0.3, [-20,-20,20,20]), + ([-10,-10,10,10], 2., [-1., 0.], 0.3, [-36,-20,4,20]), + ([-10,-10,10,10], 0.5, [0., 0.], 0.3, [-5,-5,5,5]), + ([-10,-10,10,10], 0.5, [-1., 0.], 0.3, [-13,-5,-3,5]), +]) +def test_compute_view_roi(bbox, f, t, bbs, expected): + outbox = GeneralFocusRoi._compute_view_roi( + face_bbox = torch.tensor(bbox, dtype=torch.float32), + enlargement_factor = torch.tensor(f), + translation_factor = torch.tensor(t), + beyond_border_shift = bbs) + assert outbox.numpy().tolist() == expected \ No newline at end of file diff --git a/test/test_eval.py b/test/test_eval.py new file mode 100644 index 0000000..1fc24b1 --- /dev/null +++ b/test/test_eval.py @@ -0,0 +1,104 @@ +from torch import nn +from torch import Tensor +import torch + +import math +from scipy.spatial.transform import Rotation +import pytest +import numpy as np + +from trackertraincode.eval import PerspectiveCorrector, _compute_mean_rotation, compute_opal_paper_alignment + + +def _make_rotations_around_mean(mean : Rotation, count : int, spread_deg : float, random_state : np.random.RandomState | None): + output = Rotation.identity(num=0) + while len(output) < count: + random_rots = Rotation.random(count, random_state) + mask = (mean.inv() * random_rots).magnitude() < spread_deg * np.pi / 180. + random_rots = random_rots[mask] + output = Rotation.concatenate([output,random_rots]) + return output[:count] + + + +def test_mean_rotation(): + # Setup + # Warning: It works only for small rotations up to pi/2 at the very most + center_rot = Rotation.from_euler('XYZ', [20.,10.,5.], degrees=True) + random_rots = _make_rotations_around_mean(center_rot, 100, 60., np.random.RandomState(seed=123456)) + # Test if the average matches the known mean + mean = _compute_mean_rotation(random_rots) + assert (mean.inv() * center_rot).magnitude() < 5. * np.pi / 180. + + +def test_opal_alignment(): + rand_state = np.random.RandomState(seed=123456) + N = 100 + center1 = Rotation.from_euler('XYZ', [20.,10.,5.], degrees=True) + center2 = Rotation.from_euler('XYZ', [4.,2.,30.], degrees=True) + center3 = Rotation.from_euler('XYZ', [3.,5.,10.], degrees=True) + center4 = Rotation.from_euler('XYZ', [5.,20.,5.], degrees=True) + #rots1, rots2, rots3, rots4 = (Rotation.from_quat(np.broadcast_to(c.as_quat(), (N,4))) for c in [center1,center2,center3,center4]) + rots1, rots2, rots3, rots4 = (_make_rotations_around_mean(c, N, 30., rand_state) for c in [center1,center2,center3,center4]) + rots12 = Rotation.concatenate([rots1,rots2]) + rots34 = Rotation.concatenate([rots3,rots4]) + clusters = np.concatenate([np.full((N,), 0, dtype=np.int32), np.full((N,), 1, dtype=np.int32)]) + + print(f"expected delta1: {(center1.inv()*center3).magnitude()*180./np.pi}") + print(f"expected delta2: {(center2.inv()*center4).magnitude()*180./np.pi}") + print(f"actual delta: {(rots12[:N].mean().inv() * center3).magnitude()*180./np.pi}") + print(f"actual delta: {(rots12[N:].mean().inv() * center4).magnitude()*180./np.pi}") + + assert (rots12[:N].mean().inv() * center3).magnitude() > 15. * np.pi / 180. + assert (rots12[N:].mean().inv() * center4).magnitude() > 30. * np.pi / 180. + + aligned12 = Rotation.from_quat(compute_opal_paper_alignment(torch.from_numpy(rots12.as_quat()), torch.from_numpy(rots34.as_quat()), clusters).numpy()) + + print(f"aligned delta: {(aligned12[:N].mean().inv() * center3).magnitude()*180./np.pi}") + print(f"aligned delta: {(aligned12[N:].mean().inv() * center4).magnitude()*180./np.pi}") + + assert (aligned12[:N].mean().inv() * center3).magnitude() < 3. * np.pi / 180. + assert (aligned12[N:].mean().inv() * center4).magnitude() < 3. * np.pi / 180. + + + +def fov_h(fov, aspect): + # w/h = aspect + # w/f = 2*tan(fov_w/2) + # h/f = 2*tan(a) + # aspect = tan(fov_w/2)/tan(a) + # -> a = atan(1/aspect * tan(fov_w/2)) + return 2.*math.atan(1./aspect*math.tan(fov/2.*math.pi/180.))*180./math.pi + + +@pytest.mark.parametrize("fov, image_size, coord, pose, expected", [ + # Rotation matches the fov angle when position is at the edge of the screen (horizontal) + (90.0, [200,100], [200.,50.,1.], Rotation.identity(), Rotation.from_rotvec([0.,45.,0.],degrees=True)), + # Rotation matches the fov angle when position is at the edge of the screen (vertial) + (90.0, [200,100], [100.,100.,1.], Rotation.identity(), Rotation.from_rotvec([-fov_h(90.,2.)/2.,0.,0.],degrees=True)), + # Returns identity for position in the center + (90.0, [200,100], [100.,50.,1.], Rotation.identity(), Rotation.identity()), + # Test if original rotation is considered + (90.0, [200,100], [100.,50.,1.], Rotation.from_rotvec([10.,20.,30.],degrees=True), Rotation.from_rotvec([10.,20.,30.],degrees=True)), +]) +def test_perspective_corrector(fov, image_size, coord, pose, expected): + corrector = PerspectiveCorrector(fov) + result = Rotation.from_quat(corrector.corrected_rotation( + image_sizes = torch.as_tensor(image_size,dtype=torch.long), + coord = torch.as_tensor(coord, dtype=torch.float32), + pose = torch.from_numpy(pose.as_quat()).to(dtype=torch.float32) + ).numpy()) + assert Rotation.approx_equal(expected, result, atol=0.01, degrees=True), f"Converted to quats: expected = {expected.as_quat()} vs result = {result.as_quat()}" + + +def test_make_look_at_matrix(): + m = PerspectiveCorrector.make_look_at_matrix(torch.as_tensor([0.,0.,1.])).numpy() + np.testing.assert_allclose(m, np.eye(3)) + + SQRT3 = math.sqrt(3.) + m = PerspectiveCorrector.make_look_at_matrix(torch.as_tensor([1.,1.,1.])).numpy() + np.testing.assert_allclose(m[:,2], np.asarray([1./SQRT3,1./SQRT3,1./SQRT3])) + assert np.abs(np.dot(m[:,0],np.asarray([0.,1.,0.]))) < 1.e-6 + assert m[0,0] > 0.1 + assert m[1,1] > 0.1 + diff --git a/test/test_io.py b/test/test_io.py new file mode 100644 index 0000000..338068d --- /dev/null +++ b/test/test_io.py @@ -0,0 +1,36 @@ +from trackertraincode.neuralnets import io + +from torch import nn +from torch import Tensor +import torch + +import pytest + +def test_load_save(tmp_path): + class Model(nn.Module): + def __init__(self, input_size : int, width : int): + super().__init__() + self._input_size = input_size + self._width = width + self.layers = nn.Sequential( + nn.Linear(input_size, width), + nn.ReLU(), + nn.Linear(width, 1) + ) + def __call__(self, x : Tensor): + return self.layers(x) + def get_config(self): + return { + 'input_size' : self._input_size, + 'width' : self._width + } + + m = Model(42, 32) + m(torch.zeros((1,42))) # Model is executable? + + filename = tmp_path / 'model.ckpt' + io.save_model(m, filename) + + restored : Model = io.load_model(filename, [Model]) + for p, q in zip(restored.parameters(), m.parameters()): + torch.testing.assert_close(p,q) \ No newline at end of file diff --git a/test/test_landmarks.py b/test/test_landmarks.py index 82e7c56..cf8e012 100644 --- a/test/test_landmarks.py +++ b/test/test_landmarks.py @@ -3,7 +3,6 @@ from matplotlib import projections, pyplot from mpl_toolkits.mplot3d import Axes3D import numpy as np -from scipy.spatial.transform import Rotation import random from functools import partial @@ -17,6 +16,7 @@ from trackertraincode.datasets.dshdf5pose import Hdf5PoseDataset import trackertraincode.vis as vis +# TODO: rename to test_modelcomponents.py def test_landmarks(): @@ -52,5 +52,6 @@ def test_landmarks(): assert torch.max(diff) < 0.01, f"Landmark reconstruction error too large: {torch.max(diff)}" + if __name__ == '__main__': - test_landmarks() \ No newline at end of file + raise RuntimeError("Run pytest") \ No newline at end of file diff --git a/test/test_math.py b/test/test_math.py index e0296d9..faad29f 100644 --- a/test/test_math.py +++ b/test/test_math.py @@ -1,11 +1,12 @@ from scipy.spatial.transform import Rotation from trackertraincode.neuralnets.math import affinevecmul, random_choice -from trackertraincode.neuralnets.torchquaternion import mult, rotate, tomatrix, from_rotvec, iw, to_rotvec, slerp, geodesicdistance +from trackertraincode.neuralnets.torchquaternion import mult, rotate, tomatrix, from_rotvec, iw, to_rotvec, slerp, geodesicdistance, from_matrix, positivereal from trackertraincode.neuralnets.affine2d import Affine2d, roi_normalizing_transform import torch import numpy as np - +import onnx +import io def test_quaternions(): us = Rotation.from_rotvec(np.random.uniform(0.,1.,size=(7,3))) @@ -53,6 +54,56 @@ def test_quaternions(): expected_angle_diff = (rots.inv() * rots2).magnitude() assert np.allclose(angle_difference, expected_angle_diff) + for rots in [Rotation.random(100), Rotation.identity()]: + input_mat = rots.as_matrix() + expected_quat = positivereal(torch.from_numpy(rots.as_quat())) + output_quat = from_matrix(torch.from_numpy(input_mat)) + np.testing.assert_allclose(expected_quat.numpy(), output_quat.numpy()) + + + +def _export_func(model, inputs, filename): + torch.onnx.export( + model, # model being run + inputs, # model input (or a tuple for multiple inputs) + filename, + training=torch.onnx.TrainingMode.EVAL, + export_params=True, # store the trained parameter weights inside the model file + opset_version=13, # the ONNX version to export the model to + do_constant_folding=True, # whether to execute constant folding for optimization + keep_initializers_as_inputs=False, + verbose=False) + + +def test_quaternion_mult_onnx_export(tmp_path): + class Model(torch.nn.Module): + def __call__(self, q, p): + return mult(q,p) + + q = torch.from_numpy(Rotation.random(10).as_quat()) + p = torch.from_numpy(Rotation.random(10).as_quat()) + + _export_func( + Model(), # model being run + (q,p), # model input (or a tuple for multiple inputs) + tmp_path / 'mult_model.onnx') + + +def test_quaternion_rotate_onnx_export(tmp_path): + class Model(torch.nn.Module): + def __call__(self, q, p): + return rotate(q,p) + + q = torch.from_numpy(Rotation.random(10).as_quat()) + p = torch.from_numpy(np.random.uniform(-10.,10.,size=(10,3))) + + # /tmp/pytest-of-mwelter/pytest-current/test_quaternion_rotate_onnx_excurrent/rotate_model.onnx + _export_func( + Model(), # model being run + (q,p), # model input (or a tuple for multiple inputs) + tmp_path / 'rotate_model.onnx') + + def test_transforms(): # Multiplying a transform with its inverse should result in identity matrix diff --git a/test/test_models_sanity.py b/test/test_models_sanity.py index 493c733..61d715b 100644 --- a/test/test_models_sanity.py +++ b/test/test_models_sanity.py @@ -43,13 +43,17 @@ def onnx_export_and_inference_speed(net): print (f"ONNX Inference time: {time/N*1000:.01f} ms averaged over {N} runs") -def test_pose_network_sanity(): +def test_pose_network_sanity(tmp_path): torch.set_num_threads(1) net = trackertraincode.neuralnets.models.NetworkWithPointHead(config='mobilenetv1', enable_uncertainty=True) net.eval() timing_and_output(net, torch.rand(1, 1, net.input_resolution, net.input_resolution)) + filename = tmp_path / 'model.onnx' + trackertraincode.neuralnets.models.save_model(net, filename) + trackertraincode.neuralnets.models.load_model(filename) + onnx_export_and_inference_speed(net) # Check if gradients can be computed. diff --git a/test/test_negloglikelihood.py b/test/test_negloglikelihood.py new file mode 100644 index 0000000..65eff4a --- /dev/null +++ b/test/test_negloglikelihood.py @@ -0,0 +1,49 @@ + +import torch +import torch.nn as nn + +from trackertraincode.neuralnets.negloglikelihood import ( + FeaturesAsTriangularScale, + TangentSpaceRotationDistribution, + FeaturesAsDiagonalScale) + + +def test_tangent_space_rotation_distribution(): + with torch.autograd.set_detect_anomaly(True): + B = 5 + q = torch.rand((B, 4), requires_grad=True) + cov_features = torch.rand((B, 6), requires_grad=True) + r = torch.rand((B, 4)) + cov_converter = FeaturesAsTriangularScale(6,3) + dist = TangentSpaceRotationDistribution(q, cov_converter(cov_features)) + val = dist.log_prob(r).sum() + val.backward() + assert q.grad is not None + assert cov_features.grad is not None + + +def test_feature_to_variance_mapping(): + B = 1 + N = 7 + M = 3 + q = torch.zeros((B, N), requires_grad=True) + m = FeaturesAsDiagonalScale(N,M).eval() + v = m(q) + val = v.sum() + val.backward() + assert next(iter(m.parameters())).grad is not None + assert q.grad is not None + torch.testing.assert_close(v, torch.ones((B,M)), atol=0.1, rtol=0.1) + +def test_feature_as_triangular_cov_factor(): + B = 1 + N = 7 + M = 3 + q = torch.zeros((B,N), requires_grad=True) + m = FeaturesAsTriangularScale(N, M).eval() + v = m(q) + val = v.sum() + val.backward() + assert next(iter(m.parameters())).grad is not None + assert q.grad is not None + torch.testing.assert_close(v, torch.eye(M)[None,...], atol=0.1, rtol=0.1) \ No newline at end of file diff --git a/test/test_train.py b/test/test_train.py index 3c86b74..0728e82 100644 --- a/test/test_train.py +++ b/test/test_train.py @@ -10,20 +10,22 @@ from trackertraincode.datatransformation import PostprocessingDataLoader -def update_fun(net, batch : Batch, optimizer : torch.optim.Optimizer, state : train.State, loss): +def update_fun(net, batch : Batch, optimizer : torch.optim.Optimizer, state : train.State, loss : train.CriterionGroup): optimizer.zero_grad() y = net(batch['image']) - lossvals : List[train.LossVal] = loss(y, batch) - l = sum((l.val for l in lossvals), 0.) + lossvals : List[train.LossVal] = loss.evaluate(y, batch, state.step) + lossvals = [ v._replace(weight = v.val.new_full(v.val.shape, v.weight)) for v in lossvals ] + l = sum((l.val.sum() for l in lossvals), 0.) l.backward() optimizer.step() - return [ (l.name,l.val) for l in lossvals ] + lossvals = [ v._replace(val = v.val.detach().to('cpu', non_blocking=True)) for v in lossvals ] + return [lossvals] def test_run_the_training(): class LossMock(object): def __call__(self, pred, batch): - return torch.nn.functional.mse_loss(pred, batch['y']) + return torch.nn.functional.mse_loss(pred, batch['y'], reduction='none') class MockDataset(Dataset): def __init__(self, n): self.n = n @@ -38,6 +40,7 @@ def __getitem__(self, i): torch.nn.Linear(5,128), torch.nn.ReLU(), torch.nn.Linear(128,5)) + net.get_config = lambda : {} trainloader = DataLoader(MockDataset(20), batch_size=2, collate_fn=Batch.collate) testloader = PostprocessingDataLoader(MockDataset(8), batch_size=2, collate_fn=Batch.collate, unroll_list_of_batches=True) @@ -55,7 +58,7 @@ def cbsleep(state): net, trainloader, testloader, - functools.partial(update_fun,loss=train.MultiTaskLoss([ c1, c3 ])), + functools.partial(update_fun,loss=train.CriterionGroup([ c1, c3 ])), train.DefaultTestFunc([c1, c2]), callbacks = [cbsleep, train.SaveBestCallback(net, 'c2', model_dir='/tmp',retain_max=3)], close_plot_on_exit=True, diff --git a/test/test_utils.py b/test/test_utils.py index ba65544..9d9fcdc 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -9,7 +9,7 @@ def test_affine3d(): t1 = np.random.rand(3) inv = utils.affine3d_inv((R1,t1)) R2, t2 = utils.affine3d_chain((R1,t1), inv) - np.testing.assert_allclose(R2.as_matrix(), np.eye(3)) + np.testing.assert_allclose(R2.as_matrix(), np.eye(3), atol = 1.e-15) np.testing.assert_allclose(t2, 0., atol = 1.e-9) diff --git a/trackertraincode/backbones/resnet.py b/trackertraincode/backbones/resnet.py index e084974..75296d3 100644 --- a/trackertraincode/backbones/resnet.py +++ b/trackertraincode/backbones/resnet.py @@ -52,7 +52,6 @@ def __init__(self, *args, **kwargs): super().__init__() use_blurpool = kwargs.pop('use_blurpool') - print ("ResNet blurpool = ", use_blurpool) kwargs['block']=CustomBlock if use_blurpool else torchvision.models.resnet.BasicBlock diff --git a/trackertraincode/datasets/batch.py b/trackertraincode/datasets/batch.py index e1c1c87..b4c9509 100644 --- a/trackertraincode/datasets/batch.py +++ b/trackertraincode/datasets/batch.py @@ -142,6 +142,14 @@ def undo_collate(self) -> List["Batch"]: def pin_memory(self): return Batch(self.meta, pin_memory(self._data)) + def copy(self): + '''Shallow copy.''' + return Batch(self.meta, **self._data) + + def to(self, *args, **kwargs): + assert all(isinstance(x,torch.Tensor) for x in self._data.values()), "Only applicable to PyTorch" + return Batch(self.meta, ((k,v.to(*args,**kwargs)) for k,v in self._data.items())) + class Collation(object): def __init__(self, divide_by_tag : bool = True, divide_by_image_size : bool = False, ragged_categories : Optional[Set[Any]] = None): diff --git a/trackertraincode/datasets/dshdf5.py b/trackertraincode/datasets/dshdf5.py index 54308e1..6bea2ae 100644 --- a/trackertraincode/datasets/dshdf5.py +++ b/trackertraincode/datasets/dshdf5.py @@ -81,6 +81,9 @@ def __setitem__(self, index : int, value) : def __len__(self): return len(self.ds) + def resize(self, size, axis): + return self.ds.resize(size, axis) + @cached_property def attrs(self): return self.ds.attrs @@ -125,6 +128,9 @@ def __getitem__(self, index : int): def __len__(self): return len(self._filelist) + def resize(self, size, axis): + return self.ds.resize(size, axis) + @cached_property def attrs(self): return self._ds.attrs @@ -183,6 +189,9 @@ def attrs(self): def __len__(self): return len(self.ds) + def resize(self, size, axis): + return self.ds.resize(size, axis) + @staticmethod def create(g : h5py.Group, name : str, size : int, sample_dimensionality : int, maxsize : Optional[int] = None): dt = np.dtype([('shape','i4',(sample_dimensionality,)), ('minval', 'f4'), ('maxval','f4'), ('buffer',variable_length_hdf5_buffer_dtype)]) diff --git a/trackertraincode/datatransformation/__init__.py b/trackertraincode/datatransformation/__init__.py index 8abbc4d..5add010 100644 --- a/trackertraincode/datatransformation/__init__.py +++ b/trackertraincode/datatransformation/__init__.py @@ -1,12 +1,11 @@ +from trackertraincode.datatransformation.misc import PutRoiFromLandmarks, StabilizeRoi +from trackertraincode.datatransformation.image_geometric_torch import croprescale_image_torch, affine_transform_image_torch +from trackertraincode.datatransformation.image_geometric_cv2 import affine_transform_image_cv2, croprescale_image_cv2 from trackertraincode.datatransformation.affinetrafo import ( position_normalization, position_unnormalization, - apply_affine2d, - affine_transform_image_torch, - affine_transform_image_cv2, - croprescale_image_torch, - croprescale_image_cv2) + apply_affine2d) -from trackertraincode.datatransformation.imageaugment import ( +from trackertraincode.datatransformation.image_intensity import ( KorniaImageDistortions, RandomBoxBlur, RandomPlasmaBrightness, @@ -32,8 +31,7 @@ collate_list_of_batches, undo_collate, DeleteKeys, - WhitelistKeys, - to_device) + WhitelistKeys) from trackertraincode.datatransformation.normalization import ( normalize_batch, @@ -51,9 +49,7 @@ from_numpy_or_tensor ) -from trackertraincode.datatransformation.otheraugment import ( - PutRoiFromLandmarks, - StabilizeRoi, +from trackertraincode.datatransformation.sample_geometric import ( RandomFocusRoi, FocusRoi, RoiFocusRandomizationParameters, diff --git a/trackertraincode/datatransformation/affinetrafo.py b/trackertraincode/datatransformation/affinetrafo.py index deba3a5..769dfa4 100644 --- a/trackertraincode/datatransformation/affinetrafo.py +++ b/trackertraincode/datatransformation/affinetrafo.py @@ -1,21 +1,11 @@ import numpy as np -from copy import copy -from typing import Callable, Set, Sequence, Union, List, Tuple, Dict, Optional, NamedTuple, Any -from PIL import Image -from numpy.typing import NDArray -import enum -import cv2 +from typing import Callable, Set, Sequence, Union, List, Optional, NamedTuple, Literal import torch -from torch import Tensor -import torch.nn.functional as F -from torchvision.transforms.functional import crop, resize -import kornia.filters from trackertraincode.datasets.dshdf5pose import FieldCategory, imagelike_categories from trackertraincode.neuralnets.affine2d import Affine2d from trackertraincode.neuralnets.math import affinevecmul -from trackertraincode.datatransformation.core import _ensure_image_nchw, _ensure_image_nhwc def position_normalization(w : int ,h : int): @@ -26,154 +16,6 @@ def position_unnormalization(w : int, h : int): return Affine2d.range_remap_2d([-1.,-1.], [1.,1.], [0., 0.], [w, h]) -def _extract_size_tuple(new_size : Union[int, Tuple[int,int]]): - try: - new_w, new_h = new_size - except TypeError: - assert int(new_size), "Must be convertible to single integer" - new_w = new_h = new_size - return new_w, new_h - - -def _fixup_image_format_for_resample(img : Tensor): - original_dtype = img.dtype - assert original_dtype in (torch.uint8, torch.float32, torch.float16) - if img.device == torch.device('cpu'): - new_dtype = torch.float32 # Float32 and Uint8 are not supported - else: - new_dtype = torch.float16 if original_dtype==torch.uint8 else original_dtype - img = img.to(new_dtype) - def restore(x : Tensor): - if original_dtype == torch.uint8: - x = x.clip(0., 255.).to(dtype=torch.uint8) - return x - return img, restore - - -def _numpy_extract_roi(img : np.ndarray, roi : Tensor): - # TODO: use OpenCV's copy border function? - h, w, c = img.shape - x0, y0, x1, y1 = tuple(map(int,roi)) - xmin = min(x0,0) - ymin = min(y0,0) - xmax = max(x1,w) - ymax = max(y1,h) - canvas_size = (ymax-ymin,xmax-xmin,c) - canvas = np.zeros(canvas_size, dtype=img.dtype) - x0 -= xmin - x1 -= xmin - y0 -= ymin - y1 -= ymin - canvas[0-ymin:h-ymin,0-xmin:w-xmin,:] = img - img = np.ascontiguousarray(canvas[y0:y1,x0:x1,:]) - return img - - -def croprescale_image_cv2(img : Tensor, roi : Tensor, new_size): - new_w,new_h = _extract_size_tuple(new_size) - img = _ensure_image_nhwc(img) - img = _numpy_extract_roi(img.numpy(), roi) - interpolation = cv2.INTER_AREA if (img.shape[-2] >= new_size) else cv2.INTER_LINEAR - img = cv2.resize(img, (new_w, new_h), interpolation=interpolation) - img = torch.from_numpy(img) - if img.ndim == 2: # Add back channel dimension which might have been removed by opencv - img = img[...,None] - img = _ensure_image_nchw(img) - return img - - -def affine_transform_image_cv2(img : Tensor, tr : Affine2d, new_size : Union[int, Tuple[int,int]]): - new_w,new_h = _extract_size_tuple(new_size) - img = _ensure_image_nhwc(img) - scale_factor = float(tr.scales.numpy()) - if scale_factor > 1.: - img = cv2.warpAffine( - img.numpy(), - M=tr.tensor().numpy(), - dsize=(new_w,new_h), - flags=cv2.INTER_LINEAR, - borderMode=cv2.BORDER_CONSTANT, - borderValue=None) - else: - rot_w, rot_h = round(new_w/scale_factor), round(new_h/scale_factor) - scale_compensation = rot_h / new_h - scaletr = Affine2d.trs(scales=torch.tensor(scale_compensation)) - rotated = cv2.warpAffine( - img.numpy(), - M=(scaletr @ tr).tensor().numpy(), - dsize=(rot_w,rot_h), - flags=cv2.INTER_LINEAR, - borderMode=cv2.BORDER_CONSTANT, - borderValue=None) - img = cv2.resize(rotated, dsize=(new_w, new_h), interpolation=cv2.INTER_AREA) - if img.ndim == 2: # Add back channel dimension which might have been removed by opencv - img = img[...,None] - return torch.from_numpy(_ensure_image_nchw(img)) - - -def _normalize_transform(tr : Affine2d, wh : Tuple[int,int], new_wh : Tuple[int,int]): - '''Normalize an affine image transform so that the input/output domain is [-1,1] instead of pixel ranges. - Image size is given as (width,height) tuples. - ''' - w, h = wh - new_w, new_h = new_wh - m1= Affine2d.range_remap_2d([-1,-1], [1,1], [0, 0], [w, h])[None,...] - m2 = Affine2d.range_remap_2d([0, 0], [new_w, new_h], [-1,-1], [1, 1])[None,...] - return m2 @ tr @ m1 - - -def croprescale_image_torch(img : Tensor, roi : Tensor, new_size : Union[int, Tuple[int,int]]): - assert roi.dtype == torch.int32 - assert img.ndim == 3 - assert roi.ndim == 1 - img, restore_dtype = _fixup_image_format_for_resample(img) - new_w, new_h = _extract_size_tuple(new_size) - lt = roi[:2] - wh = roi[2:]-roi[:2] - img = crop(img, lt[1], lt[0], wh[1], wh[0]) - img = resize(img, (new_h, new_w), antialias=True) - assert img.shape[-2:] == (new_h, new_w), f"Torchvision resize failed. Expected shape ({new_h,new_w}). Got {img.shape[-2:]}." - img = restore_dtype(img) - return img - - -def affine_transform_image_torch(tmp : Tensor, tr : Affine2d, new_size : Union[int, Tuple[int,int]], antialias=False): - '''Basically torch.grid_sample. - - WARNING: tr is defined w.r.t. pixel ranges, not [-1,1] - ''' - # For regular images. TODO: semseg - tmp, restore_dtype = _fixup_image_format_for_resample(tmp) - new_w, new_h = _extract_size_tuple(new_size) - C, H, W = tmp.shape - tmp = tmp[None,...] # Add batch dim - tr = tr[None,...] - tr_normalized = _normalize_transform(tr, (W,H), (new_w, new_h)) - tr_normalized = tr_normalized.inv().tensor() - if antialias: - # A little bit of Anti-aliasing - # WARNING: this is inefficient as the filter size gets larger - scaling = tr.scales - sampling_distance = 1./scaling - ks = 0.4*sampling_distance - intks = max(3,int(ks*3)) - intks = intks if (intks&1)==1 else (intks+1) - tmp = kornia.filters.gaussian_blur2d(tmp, (intks,intks), (ks,ks), border_type='constant', separable=True) - grid = F.affine_grid( - tr_normalized.to(device=tmp.device), - [1, C, new_h, new_w], - align_corners=False) - if 0: # Debugging - from matplotlib import pyplot - pyplot.imshow(tmp[0,0], extent=[-1.,1.,1.,-1.]) - pyplot.scatter(grid[0,:,:,0].ravel(), grid[0,:,:,1].ravel()) - pyplot.show() - tmp = F.grid_sample(tmp, grid, align_corners=False, mode='bilinear', padding_mode='zeros') - tmp = tmp[0] # Remove batch dim - tmp = restore_dtype(tmp) - return tmp - - def handle_backtransform_insertion(sample : dict, W : int, H : int, tr : Affine2d, type : str = 'tensor'): assert type in ('tensor','ndarray') if (prev_tr := sample.get('image_backtransform', None)) is not None: diff --git a/trackertraincode/datatransformation/image_geometric_cv2.py b/trackertraincode/datatransformation/image_geometric_cv2.py new file mode 100644 index 0000000..882856f --- /dev/null +++ b/trackertraincode/datatransformation/image_geometric_cv2.py @@ -0,0 +1,137 @@ +import numpy as np +from numpy.typing import NDArray +from typing import Literal, Any, Tuple, Union, Optional + +#from trackertraincode.datatransformation.image_geometric_cv2 import _numpy_extract_roi +from trackertraincode.datatransformation.core import _ensure_image_nchw, _ensure_image_nhwc +from trackertraincode.neuralnets.affine2d import Affine2d + +import scipy.signal.windows +import torch +from torch import Tensor +import cv2 + + +DownFilters = Literal['gaussian','hamming','area'] +UpFilters = Literal['linear','cubic','lanczos'] + + +def _extract_size_tuple(new_size : Union[int, Tuple[int,int]]): + try: + new_w, new_h = new_size + except TypeError: + assert int(new_size), "Must be convertible to single integer" + new_w = new_h = new_size + return new_w, new_h + + +def _numpy_extract_roi(img : NDArray, roi : Tensor): + # TODO: use OpenCV's copy border function? + h, w, c = img.shape + x0, y0, x1, y1 = tuple(map(int,roi)) + xmin = min(x0,0) + ymin = min(y0,0) + xmax = max(x1,w) + ymax = max(y1,h) + canvas_size = (ymax-ymin,xmax-xmin,c) + canvas = np.zeros(canvas_size, dtype=img.dtype) + x0 -= xmin + x1 -= xmin + y0 -= ymin + y1 -= ymin + canvas[0-ymin:h-ymin,0-xmin:w-xmin,:] = img + img = np.ascontiguousarray(canvas[y0:y1,x0:x1,:]) + return img + + +def _apply_antialias_filter(img : NDArray[Any], scale_factor : float, filter : str) -> NDArray[Any]: + if filter == 'gaussian': + ks = 0.5 / scale_factor + return cv2.GaussianBlur(img, (0,0), ks, ks, cv2.BORDER_REPLICATE) + elif filter == 'hamming': + ks = 1.0 / scale_factor + intks = max(1,round(ks*2+1)) + intks = intks if (intks&1) else (intks+1) # Make it odd + # kern becomes a 1d array containing the hamming window + kern = scipy.signal.windows.hamming(intks) + kern /= np.sum(kern) + # Pretend it was seperable. But it actually isn't. This function applies the filter + # first along rows then along columns. + return cv2.sepFilter2D(img, -1, kern, kern) + else: + raise NotImplementedError(f"Filter: {filter}") + + +def _resize(img, new_w, new_h, downfilter : DownFilters, upfilter : UpFilters) -> NDArray[Any]: + old_h, old_w = img.shape if len(img.shape)==2 else img.shape[-3:-1] + scale_factor = 0.5*(new_w/old_w + new_h/old_h) + filter = downfilter if scale_factor<1. else upfilter + if filter not in ('gaussian','hamming'): + interp = { + 'linear' : cv2.INTER_LINEAR, + 'cubic' : cv2.INTER_CUBIC, + 'lanczos' : cv2.INTER_LANCZOS4, + 'area' : cv2.INTER_AREA + }[filter] + return cv2.resize(img, dsize=(new_w, new_h), interpolation=interp) + else: + return cv2.resize(_apply_antialias_filter(img, scale_factor, filter), dsize=(new_w, new_h), interpolation=cv2.INTER_LINEAR) + + +def affine_transform_image_cv2(img : Tensor, tr : Affine2d, new_size : Union[int, Tuple[int,int]], downfilter : Optional[DownFilters] = None, upfilter : Optional[UpFilters] = None): + '''Anti-aliased warpAffine. + Args: + img: Input in hwc format + tr: Affine transformation that can be provided to cv2.warpAffine + new_size: Output size that can be provided to cv2.warpAffine + downfilter: Filter when downsampling + upfilter: Filter when upsampling + ''' + upfilter = 'linear' if upfilter is None else upfilter + downfilter = 'area' if downfilter is None else downfilter + new_w,new_h = _extract_size_tuple(new_size) + img = _ensure_image_nhwc(img) + scale_factor = float(tr.scales.numpy()) + if scale_factor > 1.: + upscale_warp_interp = { + 'linear' : cv2.INTER_LINEAR, + 'cubic' : cv2.INTER_CUBIC, + 'lanczos' : cv2.INTER_LANCZOS4 + }[upfilter] + tr = tr @ Affine2d.trs(translations=torch.tensor([0.5,0.5])) + img = cv2.warpAffine( + img.numpy(), + M=tr.tensor().numpy(), + dsize=(new_w,new_h), + flags=upscale_warp_interp, + borderMode=cv2.BORDER_CONSTANT, + borderValue=None) + else: + rot_w, rot_h = round(new_w/scale_factor), round(new_h/scale_factor) + scale_compensation = rot_h / new_h + scaletr = Affine2d.trs(scales=torch.tensor(scale_compensation)) + rotated = cv2.warpAffine( + img.numpy(), + M=(scaletr @ tr).tensor().numpy(), + dsize=(rot_w,rot_h), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=None) + img = _resize(rotated, new_w, new_h, downfilter, upfilter) + if img.ndim == 2: # Add back channel dimension which might have been removed by opencv + img = img[...,None] + return torch.from_numpy(_ensure_image_nchw(img)) + + +def croprescale_image_cv2(img : Tensor, roi : Tensor, new_size : Union[int,Tuple[int,int]], downfilter : Optional[DownFilters] = None, upfilter : Optional[UpFilters] = None): + upfilter = 'linear' if upfilter is None else upfilter + downfilter = 'area' if downfilter is None else downfilter + new_w,new_h = _extract_size_tuple(new_size) + img = _ensure_image_nhwc(img) + img = _numpy_extract_roi(img.numpy(), roi) + img = _resize(img, new_w, new_h, downfilter, upfilter) + img = torch.from_numpy(img) + if img.ndim == 2: # Add back channel dimension which might have been removed by opencv + img = img[...,None] + img = _ensure_image_nchw(img) + return img \ No newline at end of file diff --git a/trackertraincode/datatransformation/image_geometric_torch.py b/trackertraincode/datatransformation/image_geometric_torch.py new file mode 100644 index 0000000..2009bdd --- /dev/null +++ b/trackertraincode/datatransformation/image_geometric_torch.py @@ -0,0 +1,89 @@ +from typing import Tuple, Union + +import torch.nn.functional as F +import torch +from torch import Tensor +from torchvision.transforms.functional import crop, resize + +import kornia.filters + +from trackertraincode.datatransformation.image_geometric_cv2 import _extract_size_tuple +from trackertraincode.neuralnets.affine2d import Affine2d + + +def _fixup_image_format_for_resample(img : Tensor): + original_dtype = img.dtype + assert original_dtype in (torch.uint8, torch.float32, torch.float16) + if img.device == torch.device('cpu'): + new_dtype = torch.float32 # Float16 and Uint8 are not supported + else: + new_dtype = torch.float16 if original_dtype==torch.uint8 else original_dtype + img = img.to(new_dtype) + def restore(x : Tensor): + if original_dtype == torch.uint8: + x = x.clip(0., 255.).to(dtype=torch.uint8) + return x + return img, restore + + +def croprescale_image_torch(img : Tensor, roi : Tensor, new_size : Union[int, Tuple[int,int]]): + assert roi.dtype == torch.int32 + assert img.ndim == 3 + assert roi.ndim == 1 + img, restore_dtype = _fixup_image_format_for_resample(img) + new_w, new_h = _extract_size_tuple(new_size) + lt = roi[:2] + wh = roi[2:]-roi[:2] + img = crop(img, lt[1], lt[0], wh[1], wh[0]) + img = resize(img, (new_h, new_w), antialias=True) + assert img.shape[-2:] == (new_h, new_w), f"Torchvision resize failed. Expected shape ({new_h,new_w}). Got {img.shape[-2:]}." + img = restore_dtype(img) + return img + + +def _normalize_transform(tr : Affine2d, wh : Tuple[int,int], new_wh : Tuple[int,int]): + '''Normalize an affine image transform so that the input/output domain is [-1,1] instead of pixel ranges. + Image size is given as (width,height) tuples. + ''' + w, h = wh + new_w, new_h = new_wh + m1= Affine2d.range_remap_2d([-1,-1], [1,1], [0, 0], [w, h])[None,...] + m2 = Affine2d.range_remap_2d([0, 0], [new_w, new_h], [-1,-1], [1, 1])[None,...] + return m2 @ tr @ m1 + + +def affine_transform_image_torch(tmp : Tensor, tr : Affine2d, new_size : Union[int, Tuple[int,int]], antialias=False): + '''Basically torch.grid_sample. + + Args: + tr The image transform. It is defined w.r.t. pixel ranges, not [-1,1] + ''' + tmp, restore_dtype = _fixup_image_format_for_resample(tmp) + new_w, new_h = _extract_size_tuple(new_size) + C, H, W = tmp.shape + tmp = tmp[None,...] # Add batch dim + tr = tr[None,...] + tr_normalized = _normalize_transform(tr, (W,H), (new_w, new_h)) + tr_normalized = tr_normalized.inv().tensor() + if antialias: + # A little bit of Anti-aliasing + # WARNING: this is inefficient as the filter size gets larger + scaling = tr.scales + sampling_distance = 1./scaling + ks = 0.4*sampling_distance + intks = max(3,int(ks*3)) + intks = intks if (intks&1)==1 else (intks+1) + tmp = kornia.filters.gaussian_blur2d(tmp, (intks,intks), (ks,ks), border_type='constant', separable=True) + grid = F.affine_grid( + tr_normalized.to(device=tmp.device), + [1, C, new_h, new_w], + align_corners=False) + if 0: # Debugging + from matplotlib import pyplot + pyplot.imshow(tmp[0,0], extent=[-1.,1.,1.,-1.]) + pyplot.scatter(grid[0,:,:,0].ravel(), grid[0,:,:,1].ravel()) + pyplot.show() + tmp = F.grid_sample(tmp, grid, align_corners=False, mode='bilinear', padding_mode='zeros') + tmp = tmp[0] # Remove batch dim + tmp = restore_dtype(tmp) + return tmp \ No newline at end of file diff --git a/trackertraincode/datatransformation/imageaugment.py b/trackertraincode/datatransformation/image_intensity.py similarity index 100% rename from trackertraincode/datatransformation/imageaugment.py rename to trackertraincode/datatransformation/image_intensity.py diff --git a/trackertraincode/datatransformation/loader.py b/trackertraincode/datatransformation/loader.py index 52d4991..46b6832 100644 --- a/trackertraincode/datatransformation/loader.py +++ b/trackertraincode/datatransformation/loader.py @@ -117,11 +117,4 @@ def __call__(self, sample): for k in list(sample.keys()): if not k in self.keys: del sample[k] - return sample - -# TODO move to core -def to_device(device : str, batch : Batch): - batch = copy(batch) - for k, v in batch.items(): - batch[k] = v.to(device, non_blocking=True) - return batch \ No newline at end of file + return sample \ No newline at end of file diff --git a/trackertraincode/datatransformation/misc.py b/trackertraincode/datatransformation/misc.py new file mode 100644 index 0000000..e95ba34 --- /dev/null +++ b/trackertraincode/datatransformation/misc.py @@ -0,0 +1,55 @@ +from trackertraincode.facemodel.bfm import BFMModel, ScaledBfmModule +from trackertraincode.neuralnets.modelcomponents import PosedDeformableHead +from trackertraincode.pipelines import Batch + + +import torch + + +class PutRoiFromLandmarks(object): + def __init__(self, extend_to_forehead = False): + self.extend_to_forehead = extend_to_forehead + self.headmodel = PosedDeformableHead(ScaledBfmModule(BFMModel())) + + def _create_roi(self, landmarks3d, sample): + if self.extend_to_forehead: + vertices = self.headmodel( + sample['coord'], + sample['pose'], + sample['shapeparam']) + min_ = torch.amin(vertices[...,:2], dim=-2) + max_ = torch.amax(vertices[...,:2], dim=-2) + else: + min_ = torch.amin(landmarks3d[...,:2], dim=-2) + max_ = torch.amax(landmarks3d[...,:2], dim=-2) + roi = torch.cat([min_, max_], dim=0).to(torch.float32) + return roi + + def __call__(self, sample : Batch): + if 'pt3d_68' in sample: + sample['roi'] = self._create_roi(sample['pt3d_68'], sample) + return sample + + +class StabilizeRoi(object): + def __init__(self, alpha=0.01, destination='roi'): + self.roi_filter_alpha = alpha + self.last_roi = None + self.last_id = None + self.destination = destination + + def filter_roi(self, sample): + roi = sample['roi'] + id_ = sample['individual'] if 'individual' in sample else None + if id_ == self.last_id and self.last_roi is not None: + roi = self.roi_filter_alpha*roi + (1.-self.roi_filter_alpha)*self.last_roi + # print (f"Filt: {id_}") + # else: + # print (f"Raw: {id_}") + self.last_roi = roi + self.last_id = id_ + return roi + + def __call__(self, batch): + batch[self.destination] = self.filter_roi(batch) + return batch \ No newline at end of file diff --git a/trackertraincode/datatransformation/otheraugment.py b/trackertraincode/datatransformation/sample_geometric.py similarity index 69% rename from trackertraincode/datatransformation/otheraugment.py rename to trackertraincode/datatransformation/sample_geometric.py index 2790605..fbf5e5d 100644 --- a/trackertraincode/datatransformation/otheraugment.py +++ b/trackertraincode/datatransformation/sample_geometric.py @@ -1,8 +1,6 @@ import numpy as np from copy import copy from typing import Callable, Set, Sequence, Union, List, Tuple, Dict, Optional, NamedTuple -from functools import partial -import enum import torch from torch import Tensor @@ -10,27 +8,24 @@ from trackertraincode.pipelines import Batch from trackertraincode.datasets.batch import Metadata -from trackertraincode.datasets import preprocessing from trackertraincode.neuralnets.affine2d import Affine2d from trackertraincode.datasets.dshdf5pose import FieldCategory, imagelike_categories -from trackertraincode.neuralnets.math import random_choice, random_uniform from trackertraincode.datatransformation.core import get_category +from trackertraincode.datatransformation.image_geometric_cv2 import ( + affine_transform_image_cv2, croprescale_image_cv2, DownFilters, UpFilters) from trackertraincode.datatransformation.affinetrafo import ( apply_affine2d, - croprescale_image_torch, - croprescale_image_cv2, - affine_transform_image_cv2, - affine_transform_image_torch, position_normalization, position_unnormalization) -from trackertraincode.facemodel.bfm import ScaledBfmModule, BFMModel -from trackertraincode.neuralnets.modelcomponents import PosedDeformableHead + class RoiFocusRandomizationParameters(NamedTuple): scales : torch.Tensor # Shape B angles : torch.Tensor # Shape B translations : torch.Tensor # Shape (B, 2) + upfilter : Optional[UpFilters] = None + downfilter : Optional[DownFilters] = None def RandomFocusRoi(new_size, roi_variable='roi', rotation_aug_angle : float = 30., extension_factor = 1.1, insert_backtransform=False): @@ -48,7 +43,6 @@ def FocusRoi(new_size, extent_factor, roi_variable='roi', insert_backtransform=F roi_variable, insert_backtransform) - class MakeRoiRandomizationParameters(object): def __init__(self, rotation_aug_angle, extension_factor): self.rotation_aug_angle = rotation_aug_angle @@ -58,10 +52,13 @@ def __call__(self, B : tuple) -> RoiFocusRandomizationParameters: scales = torch.randn(size=B).mul(0.1).clip(-0.5,0.5).add(self.extension_factor) translations = torch.randn(size=B+(2,)).mul(0.5).clip(-1., 1.) angles = self._pick_angles(B, self.rotation_aug_angle) if self.rotation_aug_angle else torch.zeros(size=B) + return RoiFocusRandomizationParameters( scales = scales, angles = angles, - translations = translations) + translations = translations, + upfilter = 'linear', + downfilter = 'area') def _pick_angles(self, B : tuple, angle : float): angles = torch.full(B, fill_value=np.pi*angle/180.) @@ -89,30 +86,46 @@ def __init__(self, make_randomization_parameters, new_size, roi_variable, insert self._max_beyond_border_shift = 0.3 self.make_randomization_parameters = make_randomization_parameters - - def _compute_view_roi(self, face_roi : torch.Tensor, enlargement_factor : torch.Tensor, translation_distribution : torch.Tensor, beyond_border_shift : float): + + @staticmethod + def _compute_view_roi(face_bbox : torch.Tensor, enlargement_factor : torch.Tensor, translation_factor : torch.Tensor, beyond_border_shift : float): ''' - enlargement_factor: By how much the current roi is scaled up - translation_distribution: Random number between -1 and 1 indicating the movement of the face roi within the expanded roi - beyond_border_shift: Fraction of the original roi by which the face can be moved beyond the border of the expanded roi + Computes the expanded and shifted ROI based on the face bounding box. + + Case 1: small roi + |--- bbox ----| + |-roi-| + <-> At most [beyond_border_shift] of ROI sidelength + Case 2: large roi + |--- bbox ----| + |-------- roi -------| + <--> At most [beyond_border_shift] of bounding box side lenght + + Args: + enlargement_factor: By how much the face bounding box is scaled up + translation_factor: Random number between -1 and 1 indicating the movement of the face roi within the expanded roi + beyond_border_shift: Controls the length up to which which ROI and original BBOX may not intersect. ''' - x0, y0, x1, y1 = torch.moveaxis(face_roi, -1, 0) - rx, ry = translation_distribution.moveaxis(-1,0) - roi_w = x1-x0 - roi_h = y1-y0 + assert face_bbox.shape[:-1] == enlargement_factor.shape + assert face_bbox.shape[:-1] == translation_factor.shape[:-1] + x0, y0, x1, y1 = face_bbox.unbind(-1) + rx, ry = translation_factor.unbind(-1) + # Size and center of the BBox. + bbox_w = x1-x0 + bbox_h = y1-y0 cx = 0.5*(x1+x0) cy = 0.5*(y1+y0) - size = torch.maximum(roi_w, roi_h)*enlargement_factor - wiggle_room_x = F.relu(size-roi_w) - wiggle_room_y = F.relu(size-roi_h) - tx = (wiggle_room_x * 0.5 + roi_w * beyond_border_shift) * rx - ty = (wiggle_room_y * 0.5 + roi_h * beyond_border_shift) * ry + # Size of the expanded ROI. + size = torch.maximum(bbox_w, bbox_h)*enlargement_factor + wiggle_room_x = 0.5*torch.abs(size-bbox_w) + beyond_border_shift*torch.minimum(size, bbox_w) + wiggle_room_y = 0.5*torch.abs(size-bbox_h) + beyond_border_shift*torch.minimum(size, bbox_h) + tx = wiggle_room_x * rx + ty = wiggle_room_y * ry x0 = cx - size*0.5 + tx x1 = cx + size*0.5 + tx y0 = cy - size*0.5 + ty y1 = cy + size*0.5 + ty new_roi = torch.stack([x0, y0, x1, y1], dim=-1) - new_roi = torch.round(new_roi).to(torch.int32) return new_roi @@ -156,13 +169,15 @@ def __call__(self, sample : Batch): self._maybe_account_for_video(sample.meta, params) view_roi = self._compute_view_roi(roi, params.scales, params.translations, self._max_beyond_border_shift) + view_roi = torch.round(view_roi).to(torch.int32) tr = self._compute_point_transform_from_roi(B, view_roi, self.new_size) tr = self._center_rotation_tr(params.angles) @ tr + # TODO: this won't work for videos ... if params.angles.item() != 0.: - image_transform_function = lambda img: affine_transform_image_cv2(img, tr, self.new_size) + image_transform_function = lambda img: affine_transform_image_cv2(img, tr, self.new_size, downfilter=params.downfilter, upfilter=params.upfilter) else: - image_transform_function = lambda img: croprescale_image_cv2(img, view_roi, self.new_size) + image_transform_function = lambda img: croprescale_image_cv2(img, view_roi, self.new_size, downfilter=params.downfilter, upfilter=params.upfilter) for k, v in sample.items(): c = get_category(sample, k) @@ -179,55 +194,6 @@ def __call__(self, sample : Batch): return sample -class PutRoiFromLandmarks(object): - def __init__(self, extend_to_forehead = False): - self.extend_to_forehead = extend_to_forehead - self.headmodel = PosedDeformableHead(ScaledBfmModule(BFMModel())) - - def _create_roi(self, landmarks3d, sample): - if self.extend_to_forehead: - vertices = self.headmodel( - sample['coord'], - sample['pose'], - sample['shapeparam']) - min_ = torch.amin(vertices[...,:2], dim=-2) - max_ = torch.amax(vertices[...,:2], dim=-2) - else: - min_ = torch.amin(landmarks3d[...,:2], dim=-2) - max_ = torch.amax(landmarks3d[...,:2], dim=-2) - roi = torch.cat([min_, max_], dim=0).to(torch.float32) - return roi - - def __call__(self, sample : Batch): - if 'pt3d_68' in sample: - sample['roi'] = self._create_roi(sample['pt3d_68'], sample) - return sample - - -class StabilizeRoi(object): - def __init__(self, alpha=0.01, destination='roi'): - self.roi_filter_alpha = alpha - self.last_roi = None - self.last_id = None - self.destination = destination - - def filter_roi(self, sample): - roi = sample['roi'] - id_ = sample['individual'] if 'individual' in sample else None - if id_ == self.last_id and self.last_roi is not None: - roi = self.roi_filter_alpha*roi + (1.-self.roi_filter_alpha)*self.last_roi - # print (f"Filt: {id_}") - # else: - # print (f"Raw: {id_}") - self.last_roi = roi - self.last_id = id_ - return roi - - def __call__(self, batch): - batch[self.destination] = self.filter_roi(batch) - return batch - - def horizontal_flip_and_rot_90(p_rot : float, sample : Batch): assert sample.meta.batchsize == 0 do_flip = np.random.randint(0,2) == 0 diff --git a/trackertraincode/eval.py b/trackertraincode/eval.py index a54bbc7..4c4d060 100644 --- a/trackertraincode/eval.py +++ b/trackertraincode/eval.py @@ -4,6 +4,8 @@ from typing import Iterable, Optional, Tuple, Dict, Any, Union, List, NamedTuple from copy import copy from numpy.typing import NDArray +from scipy.spatial.transform import Rotation +import math import torch from torch import nn @@ -13,6 +15,7 @@ from trackertraincode.neuralnets.affine2d import Affine2d import trackertraincode.datatransformation as dtr +import trackertraincode.neuralnets.torchquaternion as torchquaternion import trackertraincode.utils as utils from trackertraincode.pipelines import whiten_image @@ -118,14 +121,7 @@ def __call__(self, batch): class PytorchPoseNetwork(InferenceNetwork): def __init__(self, modelfile, device): - # The checkpoints are not self-describing. So we must have a matching network in code. - net = trackertraincode.neuralnets.models.NetworkWithPointHead( - enable_point_head=True, - enable_face_detector=False, - config='mobilenetv1', - enable_uncertainty=True) - state_dict = torch.load(modelfile) - net.load_state_dict(state_dict) + net = trackertraincode.neuralnets.models.load_model(modelfile) net.eval() net.to(device) self._net = net @@ -158,8 +154,11 @@ def _apply_backtrafo(backtrafo : Affine2d, batch : Batch): @torch.no_grad() def predict(net : InferenceNetwork, images : List[Tensor], rois : Optional[Tensor] = None, focus_roi_expansion_factor : float = 1.2) -> Batch: ''' - Unnormalized uint8 images - rois according to standard conventions + Args: + net : Inference function + images : Unnormalized uint8 images in HWC format + rois: Tensor in x0,y0,x1,y1 format + focus_roi_expansion_factor: Factor by which to enlarge the cropping region. Normally it's the squareified ROI. ''' B = len(images) H,W,C = images[-1].shape @@ -201,7 +200,7 @@ def create_batch(image, roi): preds = dtr.unnormalize_batch(preds) if net.device_for_input != input_device: - preds = dtr.to_device(input_device, preds) + preds = preds.to(input_device) if roi_focus is not None: batch = dtr.unnormalize_batch(batch) @@ -335,3 +334,103 @@ def _compute_bin_masks(self, pose_gt : Tensor): ((a <= abs_yaw_deg) & (abs_yaw_deg < b)) for (a,b) in bounds_list ] return masks + + +def _compute_displacement(mean_rot : Rotation, rots : Rotation): + return (mean_rot.inv() * rots).as_rotvec() + + +def _compute_mean_rotation(rots : Rotation, tol=0.0001, max_iter=100000): + # Adapted from https://github.com/pcr-upm/opal23_headpose/blob/main/test/evaluator.py#L111C1-L126C27 + # Exclude samples outside the sphere of radius pi/2 for convergence + rots = rots[rots.magnitude() < np.pi/2] + mean_rot = rots[0] + for _ in range(max_iter): + displacement = _compute_displacement(mean_rot, rots) + displacement = np.mean(displacement, axis=0) + d_norm = np.linalg.norm(displacement) + if d_norm < tol: + break + mean_rot = mean_rot * Rotation.from_rotvec(displacement) + return mean_rot + + +def compute_opal_paper_alignment(pose_pred : Tensor, pose_target : Tensor, cluster_ids : NDArray[np.int32]): + assert pose_pred.get_device() == -1 # CPU + assert pose_target.get_device() == -1 # CPU + clusters = np.unique(cluster_ids) + out = torch.empty_like(pose_pred) + print ("Aligning clusters", clusters) + for id_ in clusters: + mask = cluster_ids == id_ + pred_rot = Rotation.from_quat(pose_pred[mask].numpy()) + target_rot = Rotation.from_quat(pose_target[mask].numpy()) + align_rot = _compute_mean_rotation(target_rot.inv()*pred_rot) + #print (f"id = {id_}, align = {align_rot.magnitude()*180./np.pi}, {np.count_nonzero(mask)} items") + # (P (T^-1 * P)^-1 )^-1 T + # ----+---- + # align_rot + # => (P P^-1 T)^-1 T = Identity + pred_rot = pred_rot * align_rot.inv() + out[mask] = torch.from_numpy(pred_rot.as_quat()).to(pose_pred.dtype) + return out + + +class PerspectiveCorrector: + def __init__(self, fov): + self._fov = fov + self.f = 1. / math.tan(fov*math.pi/180.*0.5) + + def corrected_rotation(self, image_sizes : Tensor, coord : Tensor, pose : Tensor): + ''' + Explanation though top view + ^ face-local z-axis + z-axis ^ | ^ direction under which the CNN "sees" the face through it's crop + | _|__/ + | / \ + | | face | + | \ __ / + | / Note: <----> marks the face crop + | / + -----------------------<-x->-------------- screen + | / xy_normalized + f | / + |/ + camera x ------> x-axis + + Thus, it is apparent that the CNN sees the face approximately under an angle spanned by the forward + direction and the 3d position of the face. The more wide-angle the lense is the stronger the effect. + As usual perspective distortion within the crop is neglected. + Hence, we assume that the detected rotation is given w.r.t to a coordinate system whose z-axis is + aligned with the position vector as illustrated. Consequently, the resulting pose is simply the + cnn-output transformed into the world coordinate system. + + Beware, position correction is handled in the evaluation scripts. It's much simpler as we only have + to consider the offset and scaling due to the cropping and resizing to the CNN input size. + + Args: + image_size: B x [Width, Height] + ''' + xy_image = coord[...,:2] + half_image_size_tensor = 0.5*image_sizes + xy_normalized = (xy_image - half_image_size_tensor) / half_image_size_tensor[0] + fs = torch.as_tensor(self.f, device=xy_image.device).expand_as(xy_normalized[...,:-1]) + xyz = torch.cat([xy_normalized, fs],dim=-1) + m = PerspectiveCorrector.make_look_at_matrix(xyz) + out = torchquaternion.mult(torchquaternion.from_matrix(m), pose) + return out + + def make_look_at_matrix(pos : Tensor): + '''Computes a rotation matrix where the z axes is aligned with the argument vector. + + This leaves a degree of rotation around the this axis. This is resolved by constraining + the x axis to the horizonal plane (perpendicular to the global y-axis). + ''' + z = pos / torch.norm(pos, dim=-1, keepdim=True) + x = torch.cross(*torch.broadcast_tensors(pos.new_tensor([0.,1.,0.]),z),dim=-1) + x = x / torch.norm(x, dim=-1, keepdim=True) + y = torch.cross(z, x, dim=-1) + y = y / torch.norm(x, dim=-1, keepdim=True) + M = torch.stack([x,y,z],dim=-1) + return M + \ No newline at end of file diff --git a/trackertraincode/neuralnets/bnfusion.py b/trackertraincode/neuralnets/bnfusion.py new file mode 100644 index 0000000..cc80d62 --- /dev/null +++ b/trackertraincode/neuralnets/bnfusion.py @@ -0,0 +1,58 @@ +from typing import Tuple, Dict, Any +import copy + +import torch +import torch.nn as nn +import torch.fx as fx + + +def _split_name(target : str) -> Tuple[str, str]: + """ + Splits a ``qualname`` into parent path and last atom. + For example, `foo.bar.baz` -> (`foo.bar`, `baz`) + """ + *parent, name = target.rsplit('.', 1) + return parent[0] if parent else '', name + + +def replace_node_module(node: fx.Node, modules: Dict[str, Any], new_module: torch.nn.Module): + assert(isinstance(node.target, str)) + parent_name, name = _split_name(node.target) + setattr(modules[parent_name], name, new_module) + + +def fuse_convbn(net : fx.GraphModule): + '''From https://pytorch.org/tutorials/intermediate/fx_conv_bn_fuser.html''' + net = copy.deepcopy(net) + modules = dict(net.named_modules()) + for node in net.graph.nodes: + # The FX IR contains several types of nodes, which generally represent + # call sites to modules, functions, or methods. The type of node is + # determined by `Node.op`. + if node.op != 'call_module': # If our current node isn't calling a Module then we can ignore it. + continue + # For call sites, `Node.target` represents the module/function/method + # that's being called. Here, we check `Node.target` to see if it's a + # batch norm module, and then check `Node.args[0].target` to see if the + # input `Node` is a convolution. + if type(modules[node.target]) is nn.BatchNorm2d and type(modules[node.args[0].target]) is nn.Conv2d: + if len(node.args[0].users) > 1: # Output of conv is used by other nodes + continue + print ("FUSING: ", node.target) + conv = modules[node.args[0].target] + bn = modules[node.target] + fused_conv = torch.nn.utils.fuse_conv_bn_eval(conv, bn) + replace_node_module(node.args[0], modules, fused_conv) + # As we've folded the batch nor into the conv, we need to replace all uses + # of the batch norm with the conv. + node.replace_all_uses_with(node.args[0]) + # Now that all uses of the batch norm have been replaced, we can + # safely remove the batch norm. + net.graph.erase_node(node) + net.graph.lint() + # After we've modified our graph, we need to recompile our graph in order + # to keep the generated code in sync. + net.recompile() + #print ("FUSION RESULT: ") + #net.graph.print_tabular() + return net \ No newline at end of file diff --git a/trackertraincode/neuralnets/io.py b/trackertraincode/neuralnets/io.py new file mode 100644 index 0000000..b03dafc --- /dev/null +++ b/trackertraincode/neuralnets/io.py @@ -0,0 +1,44 @@ +from os.path import splitext +import argparse +import numpy as np +import os +import torch +import copy +from typing import Any, Protocol, Container + +import torch.onnx +import torch.nn as nn + + +class SavableModel(Protocol): + def state_dict() -> dict[str,Any]: + ... + def get_config() -> dict[str,Any]: + ... + def load_state_dict(d : dict[str,Any], strict : bool) -> None: + ... + + +def save_model(model : SavableModel, filename : str): + contents = { + 'state_dict' : model.state_dict(), + 'class_name' : model.__class__.__name__, + 'config' : model.get_config() + } + torch.save(contents, filename) + + +class InvalidFileFormatError(Exception): + def __init__(self,msg): + super.__init__(msg) + + +def load_model(filename : str, class_candidates : Container[type]): + contents = torch.load(filename, weights_only=True) + if not all(x in contents for x in ['state_dict','class_name','config']): + raise InvalidFileFormatError(f'Bad dict contents. Got {list(contents.keys())}') + class_name = contents['class_name'] + class_ = { c.__name__:c for c in class_candidates }[class_name] + instance : SavableModel = class_(**contents['config']) + instance.load_state_dict(contents['state_dict'], strict=True) + return instance \ No newline at end of file diff --git a/trackertraincode/neuralnets/losses.py b/trackertraincode/neuralnets/losses.py index e208f99..c2d6ec5 100644 --- a/trackertraincode/neuralnets/losses.py +++ b/trackertraincode/neuralnets/losses.py @@ -5,6 +5,7 @@ import torch import torch.nn as nn import torch.nn.functional as F +import pickle import trackertraincode.facemodel.keypoints68 as kpts68 from trackertraincode.neuralnets.gmm import unpickle_scipy_gmm @@ -75,6 +76,25 @@ def __call__(self, pred, sample): return self.eval_on_params(pred['shapeparam'], sample['shapeparam']) +class ShapePlausibilityLoss(nn.Module): + def __init__(self): + super().__init__() + with open(join(dirname(__file__),'../facemodel/shapeparams_gmm.pkl'), 'rb') as f: + scipy_gmm = pickle.load(f) + self.register_buffer('weights', torch.from_numpy(scipy_gmm.weights_))#.to(torch.float32)) + self.register_buffer('scales', torch.from_numpy(scipy_gmm.covariances_).rsqrt())#.to(torch.float32)) + self.register_buffer('means',torch.from_numpy(scipy_gmm.means_))#.to(torch.float32)) + self.register_buffer('fudge_factor', torch.as_tensor(0.001/scipy_gmm.n_components)) #,dtype=torch.float32)) + + def _eval(self, x): + return -torch.logsumexp(-0.5*((x - self.means) * self.scales).square().sum(dim=-1) + torch.log(self.weights) + torch.log(self.scales).sum(dim=-1),dim=-1)*self.fudge_factor + + def __call__(self, pred, sample): + mean_nll = self._eval(pred['shapeparam'][:,None,:].to(torch.float64)).to(torch.float32) + assert len(mean_nll.shape) == 1 + return mean_nll + + class QuaternionNormalizationSoftConstraint(object): def __init__(self, prefix=''): self._prefix = prefix diff --git a/trackertraincode/neuralnets/modelcomponents.py b/trackertraincode/neuralnets/modelcomponents.py index 179c290..5cfd09a 100644 --- a/trackertraincode/neuralnets/modelcomponents.py +++ b/trackertraincode/neuralnets/modelcomponents.py @@ -1,7 +1,7 @@ from __future__ import annotations from os.path import join, dirname -from typing import Union, Optional +from typing import Tuple, Union, Optional import numpy as np import torch import torch.nn as nn @@ -67,10 +67,6 @@ def __init__(self, num_shape=40, num_expr=10): keyeigvecs = torch.from_numpy(full.scaled_bases[:,full.keypoints,:]).contiguous() self.register_buffer('keypts', keypts) self.register_buffer('keyeigvecs', keyeigvecs) - self.eye_left_top = torch.tensor([ 37, 38 ], dtype=torch.long) - self.eye_left_bottom = torch.tensor([ 41, 40 ], dtype=torch.long) - self.eye_right_top = torch.tensor([ 43, 44 ], dtype=torch.long) - self.eye_right_bottom = torch.tensor([ 47, 46 ], dtype=torch.long) def _deformvector(self, shapeparams): # (..., num_eigvecs, 68, 3) x (... , B, num_eigvecs). -> Need for broadcasting and unsqueezing. @@ -154,10 +150,7 @@ def _compute_correction_quat(self): return torch.cat([torch.sin(c), c.new_zeros((2,)), torch.cos(c) ]) def _compute_correction_offset(self): - q = self.p.new_empty((3,)) - q[0] = 0. - q[1:] = self.p[1:3] - return q + return torch.cat([self.p.new_zeros((1,)), self.p[1:3]]) def _compute_correction_scale(self): return smoothclip0(self.p[3]) @@ -220,6 +213,21 @@ def freeze_norm_stats(m): p.requires_grad = False +def quaternion_from_features(z : Tensor): + ''' + Returns: + (quaternions, unnormalized quaternions) + ''' + assert torchquaternion.iw == 3 + # The real component can be positive because -q is the same rotation as q. + # Seems easier to learn like so. + quats_unnormalized = torch.cat([ + z[...,torchquaternion.iijk], + smoothclip0(z[...,torchquaternion.iw:])], dim=-1) + quats = torchquaternion.normalized(quats_unnormalized) + return quats, quats_unnormalized + + # TODO: proper test def _test_local_to_global_transform_offset(): from scipy.spatial.transform import Rotation @@ -240,19 +248,6 @@ def _test_local_to_global_transform_offset(): print (pred_c, expect_c, expect_scale) -def quaternion_from_features(z : Tensor): - ''' - Returns: - (quaternions, unnormalized quaternions) - ''' - quats_unnormalized = torch.empty_like(z) - # The real component can be positive because -q is the same rotation as q. - # Seems easier to learn like so. - quats_unnormalized[...,torchquaternion.iw] = smoothclip0(z[...,torchquaternion.iw]) - quats_unnormalized[...,torchquaternion.iijk] = z[...,torchquaternion.iijk] - quats = torchquaternion.normalized(quats_unnormalized) - return quats, quats_unnormalized - if __name__ == '__main__': _test_local_to_global_transform_offset() \ No newline at end of file diff --git a/trackertraincode/neuralnets/models.py b/trackertraincode/neuralnets/models.py index 0d875b5..5c725e7 100644 --- a/trackertraincode/neuralnets/models.py +++ b/trackertraincode/neuralnets/models.py @@ -7,6 +7,7 @@ from torch import Tensor import torchvision.models from trackertraincode.neuralnets.math import inv_smoothclip0, smoothclip0 +import trackertraincode.neuralnets.io from trackertraincode.neuralnets.modelcomponents import ( freeze_norm_stats, @@ -109,8 +110,8 @@ def __init__(self, num_features, enable_uncertainty=False): if self.enable_uncertainty: # pointscales = NLL.FeaturesAsUncorrelatedVariance(num_features, 68, torch.full((68,))) # shapescales = NLL.FeaturesAsUncorrelatedVariance(num_features, 50, torch.full((50,))) - self.point_distrib_scales = NLL.UncorrelatedVarianceParameter(68) - self.shape_distrib_scales = NLL.UncorrelatedVarianceParameter(50) + self.point_distrib_scales = NLL.DiagonalScaleParameter(68) + self.shape_distrib_scales = NLL.DiagonalScaleParameter(50) def forward(self, z, quats, coords) -> Dict[str, Tensor]: shapeparam = self.shapenet(z) @@ -136,7 +137,7 @@ def __init__(self, num_features, enable_uncertainty = False): self.linear = nn.Linear(num_features, 4, bias=True) self.linear.bias.data[torchquaternion.iw] = inv_smoothclip0(torch.as_tensor(0.1)) if enable_uncertainty: - self.uncertainty_net = NLL.FeaturesAsTriangularCovFactor( + self.uncertainty_net = NLL.FeaturesAsTriangularScale( num_features, 3) def forward(self, x) -> Dict[str, Tensor]: @@ -161,7 +162,7 @@ def __init__(self, num_features, enable_uncertainty = False): self.linear = nn.Linear(num_features, 4) self.linear.bias.data[...] = torch.tensor([0.0, 0.0, 0.5, 0.5]) if enable_uncertainty: - self.scales = NLL.UncorrelatedVarianceParameter(4) + self.scales = NLL.DiagonalScaleParameter(4) def forward(self, x : Tensor) -> Dict[str, Tensor]: z = self.linear(x) @@ -187,8 +188,7 @@ def __init__(self, num_features, enable_uncertainty = False): self.linear_size = nn.Linear(num_features, 1) self.linear_size.bias.data.fill_(0.5) if enable_uncertainty: - #self.scales = NLL.FeaturesAsUncorrelatedVariance(num_features, 3) - self.scales = NLL.FeaturesAsTriangularCovFactor(num_features, 3) + self.scales = NLL.FeaturesAsTriangularScale(num_features, 3) def forward(self, x : Tensor): coord = torch.cat([ @@ -216,11 +216,13 @@ def create_pose_estimator_backbone(config : str, args : Dict[str,Any]): class NetworkWithPointHead(nn.Module): def __init__( - self, enable_point_head=True, + self, + enable_point_head=True, enable_face_detector=False, config='mobilenetv1', enable_uncertainty=False, dropout_prob = 0.5, + use_local_pose_offset = True, backbone_args = None): super(NetworkWithPointHead, self).__init__() self.enable_point_head = enable_point_head @@ -228,22 +230,35 @@ def __init__( self.finetune = False self.config = config self.enable_uncertainty = enable_uncertainty - if backbone_args is None: - backbone_args = {} + self.use_local_pose_offset = use_local_pose_offset + self._backbone_args = {} if (backbone_args is None) else backbone_args self._input_resolution = (129, 97) - self.convnet = create_pose_estimator_backbone(config, backbone_args) + self.convnet = create_pose_estimator_backbone(config, self._backbone_args) num_features = self.convnet.num_features self.dropout = nn.Dropout(dropout_prob) self.boxnet = BoundingBox(num_features, enable_uncertainty) self.posnet = PositionSizeOutput(num_features, enable_uncertainty) self.quatnet = DirectQuaternionWithNormalization(num_features, enable_uncertainty) + self.local_pose_offset = LocalToGlobalCoordinateOffset() + self.local_pose_offset_kpts = LocalToGlobalCoordinateOffset() if enable_point_head: self.landmarks = Landmarks3dOutput(num_features, enable_uncertainty) if enable_face_detector: self.face_detector = nn.Linear(num_features, 1, bias=True) + def get_config(self): + return { + 'enable_point_head' : self.enable_point_head, + 'enable_face_detector' : self.enable_face_detector, + 'config' : self.config, + 'enable_uncertainty' : self.enable_uncertainty, + 'dropout_prob' : self.dropout.p, + 'use_local_pose_offset' : self.use_local_pose_offset, + 'backbone_args' : self._backbone_args + } + @property def input_resolutions(self) -> Tuple[int]: return self._input_resolution if isinstance(self._input_resolution,tuple) else (self._input_resolution,) @@ -256,14 +271,6 @@ def input_resolution(self) -> int: def name(self) -> str: return type(self).__name__+'_'+self.config - - def load_partial(self, state_dict): - mine = self.state_dict() - assert (not frozenset(state_dict.keys()).difference(frozenset(mine.keys()))), f"Failed to load model dict. Keys {frozenset(state_dict.keys()).difference(frozenset(mine.keys()))} not found in present model" - mine.update(state_dict) - self.load_state_dict(mine) - - def forward(self, x): assert x.shape[2] in self.input_resolutions and \ x.shape[3] == x.shape[2] @@ -275,10 +282,23 @@ def forward(self, x): out.update(self.posnet(x)) out.update(self.quatnet(x)) + + if self.use_local_pose_offset: + out.update({ + 'hidden_pose' : out['pose'], + 'hidden_coord' : out['coord'] + }) + quats, coords = self.local_pose_offset(out.pop('pose'), out.pop('coord')) + out.update({ + 'pose' : quats, + 'coord' : coords + }) quats, coords = out['pose'], out['coord'] if self.enable_point_head: + if self.use_local_pose_offset: + quats, coords = self.local_pose_offset_kpts(out['hidden_pose'], out['hidden_coord']) out.update(self.landmarks(x, quats, coords)) if self.enable_face_detector: @@ -308,3 +328,21 @@ def train(self, mode=True): self.convnet.apply(freeze_norm_stats) +save_model = trackertraincode.neuralnets.io.save_model + + +def load_model(filename : str): + def load_legacy(filename : str): + sd = torch.load(filename) + net = NetworkWithPointHead( + enable_point_head=True, + enable_face_detector=False, + config='resnet18', + enable_uncertainty=True, + backbone_args = {'use_blurpool' : False} + ) + net.load_state_dict(sd, strict=True) + try: + return trackertraincode.neuralnets.io.load_model(filename, [NetworkWithPointHead]) + except trackertraincode.neuralnets.io.InvalidFileFormatError: + return load_legacy(filename) \ No newline at end of file diff --git a/trackertraincode/neuralnets/negloglikelihood.py b/trackertraincode/neuralnets/negloglikelihood.py index 30a9176..ebeb7d6 100644 --- a/trackertraincode/neuralnets/negloglikelihood.py +++ b/trackertraincode/neuralnets/negloglikelihood.py @@ -1,4 +1,5 @@ from typing import Dict, NamedTuple, Optional, Literal +import sys import torch import numpy as np from os.path import join, dirname @@ -16,39 +17,47 @@ inv_make_positive = inv_smoothclip0 -class FeaturesAsUncorrelatedVariance(nn.Module): +class Neck(nn.Module): def __init__(self, num_in_features, num_out_features): super().__init__() self.num_out_features = num_out_features self.num_in_features = num_in_features - self.lin = nn.Linear(num_in_features, num_out_features, bias=False) - self.bn = nn.BatchNorm1d(num_out_features) - self.bn.weight.data[...] *= 1.e-4 - self.bn.bias.data[...] = 1. - self.eps = torch.tensor(1.e-2) # Prevent numerical problems due to too small variance + self.lin = nn.Linear(num_in_features, num_out_features+1) + self.lin.bias.data[...] = inv_make_positive(torch.ones((num_out_features+1))) + + def set_biases(self, x : Tensor): + self.lin.bias.data[...,1:] = x + + def forward(self, x : Tensor): + x = self.lin(x) + return x[...,1:], make_positive(x[...,:1]) + + +class FeaturesAsDiagonalScale(nn.Module): + def __init__(self, num_in_features, num_out_features): + super().__init__() + self.neck = Neck(num_in_features, num_out_features) + self.eps = torch.tensor(1.e-6) # Prevent numerical problems due to too small variance def forward(self, x : Tensor): - x = self.bn(self.lin(x)) - x = torch.square(x) + self.eps + x, multiplier = self.neck(x) + x = make_positive(x) * multiplier + self.eps return x -class UncorrelatedVarianceParameter(nn.Module): +class DiagonalScaleParameter(nn.Module): ''' Provides a trainable, input-independent scale parameter which starts off as 1 and is guaranteed to be always positive. ''' def __init__(self, num_out_features): super().__init__() - self.num_out_features = num_out_features - self.num_in_features = num_out_features - self.hidden_scale = nn.Parameter( - torch.ones((self.num_in_features)).requires_grad_(True), - requires_grad=True) - self.eps = torch.tensor(1.e-2) + initial_values = inv_make_positive(torch.ones((num_out_features+1,))) + self.hidden_scale = nn.Parameter(initial_values.requires_grad_(True), requires_grad=True) + self.eps = torch.tensor(1.e-6) def forward(self): - return torch.square(self.hidden_scale) + self.eps + return make_positive(self.hidden_scale[:1]) * make_positive(self.hidden_scale[1:]) + self.eps SimpleDistributionSwitch = Literal['gaussian','laplace'] @@ -70,15 +79,29 @@ def __call__(self, preds, sample): return -self.distribution_class(pred, scale).log_prob(target).mul(self.weights[None,:]).mean(dim=-1) +class MixWithUniformProbability(nn.Module): + def __init__(self, state_space_volume): + super().__init__() + self.register_buffer("log_uniform_prob", -torch.as_tensor([state_space_volume]).log()) + self.register_buffer("log_weights", torch.as_tensor([[ 0.999, 0.001 ]]).log()) + + def __call__(self, log_prob): + log_uniform = torch.broadcast_to(self.log_uniform_prob, log_prob.shape) + return torch.logsumexp(torch.stack([ log_prob, log_uniform ], dim=-1) + self.log_weights, dim=-1) + + class CorrelatedCoordPoseNLLLoss(nn.Module): def __init__(self): super().__init__() + # Space volume = [-1,1]x[-1,1]x[0,1] + self.uniform_mixing = MixWithUniformProbability(4.) def __call__(self, preds, sample): target = sample['coord'] pred = preds['coord'] scale : Tensor = preds['coord_scales'] - return -MultivariateNormal(pred, scale_tril=scale, validate_args=False).log_prob(target) + log_prob = MultivariateNormal(pred, scale_tril=scale, validate_args=not sys.flags.optimize).log_prob(target) + return -self.uniform_mixing(log_prob) class BoxNLLLoss(nn.Module): @@ -127,25 +150,29 @@ def __call__(self, preds, sample): ## There is the little problem that this distribution ## is not normalized over SO3 ... -@torch.jit.script def _fill_triangular_matrix(dim : int, z : Tensor): ''' dim: Matrix dimension z: Tensor with values to fill into the lower triangular part. First the diagonal amounting to `dim` values. Then offdiagonals. ''' - m = z.new_zeros(z.shape[:-1]+(dim,dim)) + if dim == 3: # Special case for our application because ONNX does not support tril_indices - m[:,0,0] = z[:,0] - m[:,1,1] = z[:,1] - m[:,2,2] = z[:,2] - m[:,1,0] = z[:,3] - m[:,2,0] = z[:,4] - m[:,2,1] = z[:,5] + m =z[...,( + 0, 0, 0, + 3, 1, 0, + 4, 5, 2, + )].view(*z.shape[:-1],3,3) + m = m * z.new_tensor([ + [ 1., 0., 0. ], + [ 1., 1., 0.], + [ 1., 1., 1.] + ]) return m else: # General case + m = z.new_zeros(z.shape[:-1]+(dim,dim)) idx = torch.tril_indices(dim, dim, -1, device=z.device) irow, icol = idx[0], idx[1] # Ellipsis for the batch dimensions is not supported by the script compiler. @@ -156,51 +183,33 @@ def _fill_triangular_matrix(dim : int, z : Tensor): return m -def _mult_cols_to_make_diag_positive(m: Tensor): - if m.size(-1) == 3 and not m.requires_grad: # Fix for ONNX export - f1 = torch.sign(m[...,0,0]) - f2 = torch.sign(m[...,1,1]) - f3 = torch.sign(m[...,2,2]) - m = m.clone() - m[...,:,0] *= f1[...,None] - m[...,:,1] *= f2[...,None] - m[...,:,2] *= f3[...,None] - return m - else: - return m*torch.sign(torch.diagonal(m, dim1=-2, dim2=-1))[...,None,:] - - -class FeaturesAsTriangularCovFactor(nn.Module): +class FeaturesAsTriangularScale(nn.Module): def __init__(self, num_in_features, dim): super().__init__() self.dim = dim self.num_matrix_params = (dim*(dim+1))//2 - self.num_features = self.num_matrix_params - self.lin = nn.Linear(num_in_features, self.num_features, bias=False) - self.bn = nn.BatchNorm1d(self.num_features) - self.bn.weight.data[...] *= 1.e-4 - self.bn.bias.data[...] = 1. - self.bn.bias.data[:self.dim] = 1. - self.bn.bias.data[self.dim:] = 0. - self.min_diag = 1.e-2 + self.neck = Neck(num_in_features, self.num_matrix_params) + bias_init = inv_make_positive(torch.ones((self.num_matrix_params))) + bias_init[self.dim:] = 0. # Offdiagonals + self.neck.set_biases(bias_init) + min_diag = torch.full((self.num_matrix_params,), 1.e-6) + min_diag[self.dim:] = 0. # Offdiagonals + self.register_buffer("min_diag", min_diag) + def forward(self, x : Tensor): - x = self.bn(self.lin(x)) - x_diags = x[...,:self.dim] - x_offdiags = x[...,self.dim:] - z = x.new_empty(tuple(x.shape[:-1])+(self.num_matrix_params,)) - z[...,:self.dim] = x_diags - z[...,self.dim:] = x_offdiags - m = _fill_triangular_matrix(self.dim, z) - # Equivalent to cholesky(m @ m.mT) - m = _mult_cols_to_make_diag_positive(m) - m += self.min_diag*torch.eye(self.dim, device=x.device).expand(*x.shape[:-1],3,3) - return m + x, multiplier = self.neck(x) + z = torch.cat([ + make_positive(x[...,:self.dim]), + x[...,self.dim:]], + dim=-1) + z = multiplier * z + self.min_diag + return _fill_triangular_matrix(self.dim, z) class TangentSpaceRotationDistribution(object): def __init__(self, quat : Tensor, scale_tril : Optional[Tensor] = None, precision : Optional[Tensor] = None): - self.dist = MultivariateNormal(quat.new_zeros(quat.shape[:-1]+(3,)), scale_tril=scale_tril, precision_matrix=precision, validate_args=False) + self.dist = MultivariateNormal(quat.new_zeros(quat.shape[:-1]+(3,)), scale_tril=scale_tril, precision_matrix=precision, validate_args=not sys.flags.optimize) self.quat = quat def log_prob(self, otherquat : Tensor): @@ -209,143 +218,17 @@ def log_prob(self, otherquat : Tensor): class QuatPoseNLLLoss(nn.Module): + def __init__(self): + super().__init__() + r = torch.pi + v = r*r*r*torch.pi*4./3. + self.uniform_mixing = MixWithUniformProbability(v) + def __call__(self, preds, sample): target = sample['pose'] quat = preds['pose'] cov = preds['pose_scales_tril'] - return -TangentSpaceRotationDistribution(quat, cov).log_prob(target) - - - -########################################################### -## Rotation Laplace Distribution -########################################################### - -# Reimplemented from https://github.com/yd-yin/RotationLaplace/blob/master/rotation_laplace.py -# Grids file taken unchanged from that repo. - -class SO3DistributionParams(NamedTuple): - mode : Tensor # Where the peak of the distribution is - cholesky_factor : Tensor # Cholesky decomposition of V S Vt - + log_prob = TangentSpaceRotationDistribution(quat, cov).log_prob(target) + return -self.uniform_mixing(log_prob) -class RotationLaplaceLoss(nn.Module): - def __init__(self): - super().__init__() - grids = torch.from_numpy(np.load(join(dirname(__file__), 'rotation-laplace-grids3.npy'))) - self.register_buffer('grids', grids) - - - def power_function(self, matrix_r : Tensor, cov_factor_tril : Tensor): - '''sqrt(tr(S - At R)) = - - sqrt(tr(cov - cov R0_t R)) - ''' - - # a = (LLt)^-1 = Lt^-1 L^-1 - # a_t = a_t - # out = Lt^-1 L^-1 R - # -> solve L Z1 = R - # -> solve Lt out = Z1 - - # m_z = torch.linalg.solve_triangular(cov_factor_tril, matrix_r, upper=False) - # m_z = torch.linalg.solve_triangular(cov_factor_tril.transpose(-1,-2), m_z, upper=True) - #m_z = torch.linalg.inv(torch.matmul(cov_factor_tril, cov_factor_tril.transpose(-1,-2))) - m_z = torch.cholesky_inverse(cov_factor_tril) - m_cov_diags = torch.diagonal(m_z, dim1=-2, dim2=-1) - m_z = torch.matmul(m_z, matrix_r) - trace_quantity = (m_cov_diags - torch.diagonal(m_z, dim1=-2, dim2=-1)).sum(-1) - if trace_quantity.min() < -1.e-6: - print (f"Warning: Rotation Laplace failure. Trace negative: {trace_quantity.min()}") - print (f"cov factor = ", repr(cov_factor_tril.detach().cpu().numpy())) - power = torch.sqrt(torch.clamp_min(trace_quantity, 1.e-8)) - return power - - - def log_normalization(self, grids : Tensor, cov_factor_tril : Tensor): - # Integral over rotations of exp(-P)/P - # Numerically: log (sum 1/N exp(-P_i)/P_i) - # = log [ 1/N sum exp(-P_i)/P_i ] - - # log [ 1/N sum exp(-P_i -c + c)/P_i ] = - # log [ 1/N sum exp(-P_i +c)*exp(-c)/P_i ] = - # log [ 1/N *exp(-c)* sum exp(-P_i +c)/P_i ] - - grids : Tensor = grids[None,:,:,:] # (1, N, 3, 3) - cov_factor_tril = cov_factor_tril[:, None, :,:] # (B, 1, 3, 3) - N = grids.size(1) - - inv_log_weight = torch.log(torch.tensor(N,dtype=torch.float32)) - # Shape B x N - powers = self.power_function(grids, cov_factor_tril) - stability = torch.amin(powers, dim=-1) - powers = powers.to(torch.float64) - log_exp_sum = torch.log((torch.exp(-powers+stability[:,None])/powers).sum(dim=1)).to(torch.float32) - logF = log_exp_sum - inv_log_weight - stability - return logF - - - def compute_nll(self, gt_quat : Tensor, dist_params : SO3DistributionParams): - # The NLL is log(F(A)) + P + log(P) - # where P = sqrt(tr(S - At R)) - matrix_r = Q.tomatrix(gt_quat) - - # At = V S Vt R0t. - # Therefore - # A = R0 V S Vt - # The choleksy factor is L, and LLt = V S Vt - mr0 = Q.tomatrix(dist_params.mode) - cov_factor = dist_params.cholesky_factor - # Beware of correct transpose axis order! - matrix_r = torch.matmul(mr0.transpose(-1,-2), matrix_r) - power = self.power_function(matrix_r, cov_factor) - logF = self.log_normalization(self.grids, cov_factor) - nll = logF + power + torch.log(power) - return nll - - def forward(self, preds, sample): - target = sample['pose'] - - dist_params = SO3DistributionParams( - mode = preds['pose'], - cholesky_factor = preds['pose_scales_tril']) - - return self.compute_nll(target, dist_params) - - -########################################################### -## Tests -########################################################### -# TODO: proper tests -def test_tangent_space_rotation_distribution(): - B = 5 - S = 7 - q = torch.rand((B, 4), requires_grad=True) - cov_features = torch.rand((B, 6), requires_grad=True) - r = torch.rand((B, 4)) - cov_converter = FeaturesAsTriangularCovFactor(3) - dist = TangentSpaceRotationDistribution(q, cov_converter(cov_features)) - dist.rsample((S,)) - val = dist.log_prob(r).sum() - val.backward() - assert cov_converter.scales.grad is not None - assert q.grad is not None - assert cov_features.grad is not None - - -def test_feature_to_variance_mapping(): - B = 5 - N = 7 - q = torch.rand((B, N), requires_grad=True) - m = FeaturesAsUncorrelatedVariance(N) - v = m(q) - val = v.sum() - val.backward() - assert m.scales.grad is not None - assert q.grad is not None - -if __name__ == '__main__': - with torch.autograd.set_detect_anomaly(True): - test_tangent_space_rotation_distribution() - test_feature_to_variance_mapping() \ No newline at end of file diff --git a/trackertraincode/neuralnets/rotation-laplace-grids3.npy b/trackertraincode/neuralnets/rotation-laplace-grids3.npy deleted file mode 100644 index 461d2c8668341c5a0f96f62d459282d5f5fa9964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1327232 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�Ug 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
qQ4GodBDEr; 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

by;rB=?c9r#ZN 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�`IjM`lCJo;Ie^;V4XA$H0mskUXkWT+eK zC8M!O-B@qDE8CL)bgFk;$)V}|UnTcw*z=6hyRzi>^jacvYbw9zh|&6|AJFQWV9wJ`8^x9jf~b0 zCBNr{ZL67RgL1HX{gZ7Yqq?FE%E9WjM7E8L+8p{Q2dmd4*)}p-W0d@`UjJm@8kYDY@Dk?cqH01#eeA z`gk|Z811E$eDsa>a3Y6$_n9@`Fk-YPQ}WTb+QW$)?#f3$V)T2-NAJD3$l^-#XBN_EQ`qCW!i#@y-mwhB74Wlp3IzNAh_w=%lWYkWL z&qdEap=Tc}X0Sam*+(+8J@%0dZI683i_X?yHroK3X1@4bGz z=Nqq_Y7c*fxm)$ud}5bIXIRr?_vj9P>oM`1pD{WM*kJ$X^sAkJYol|DFaPQ4?pLon zXvFAD;XOM%xj%94TCL70zVJUw^&h?D9618uo0ua%=^sN zleL#R!DnqBKBMiw`S(K>vmBjSM1Py;ubI?=jLv|fzfJVlb)^nube0tTZKJ<#bLv1w zXHwDMHu~$nrw(LvwiW$tqrVMxAfq#~=x-bS^;o11WON=E{cWSa3#miRM1R{D_l`P{ zQC-pBHpbm&K&b;6wK@9R#<=?|DRm&DzDIwX7Oe+)iE*FCxcjUvb*PxZ&ZSlAK!$cs9mr^m($1*^8QFZ=IdveTxs!HI9mr@7 zrkzs*O4_~*2dufp7o&+Aq{Sg|!`jC=+zJ7&55Lp!e2%2#2vqkq!fvD>aAM!p9JZFWbu z)xu5fyK>O;mg{d=Ws4CbABMj!e|~rHF0Zx!&svW>y+8ZAD~}kJzt=`D?+)1gVEg~P z>+kdWlOMT0=KHKYYUhjBJ7s#`>yEMi&rRoU*uVSjJC7Lk_sx5RZ^m^?a(i8K$%g$d zuiGe|3A1wK;}M!Pp^5WCxQ2~FD2#ABLTk&*vTXwrrz3#nDjgeGm+Pe-lD zsIJhY4g0aLNNPn!Z4OP^u%Dh>ChW() zG^rICjcI5y3Hz~6PHII){SEt>hW*&LC$*}WVNOZU)QSw}6tyCwam+bIt;lHZ8bvc`~Gy8_7B@jKl-%(`pLN?MtwQ^ zj(0BHZSf-eKi~4Tr}t0Y`2H!&k^i&K=jB≫om^HZ*BM6PJ@(k%{(np-B^(xIL*A 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%0DM=~0x<`mD%ahG!} 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 Tensor: return torch.sum(x*w, dim).div(torch.sum(w,dim)) -Criterion = namedtuple('Criterion', 'name f w', defaults=(None,None,1.)) + +class LossVal(NamedTuple): + val : Tensor + weight : float + name : str + + +def concatenated_lossvals_by_name(vals : list[LossVal]): + '''Sorts by name and concatenates. + + Assumes that names can occur multiple times. Then corresponding weights and + values are concatenated. Useful for concatenating the loss terms from different + sub-batches. + + Return: + Dict[name,(values,weights)] + ''' + value_lists = defaultdict(list) + weight_lists = defaultdict(list) + for v in vals: + value_lists[v.name].append(v.val) + weight_lists[v.name].append(v.weight) + return { + k:(torch.concat(value_lists[k]),torch.concat(weight_lists[k])) for k in value_lists + } + + +class Criterion(NamedTuple): + name : str + f : Callable[[Batch,Batch],Tensor] + w : Union[float,Callable[[int],float]] + + def evaluate(self, pred, batch, step) -> List[LossVal]: + val = self.f(pred,batch) + w = self._eval_weight(step) + return [ LossVal(val, w, self.name) ] + + def _eval_weight(self, step): + if isinstance(self.w, float): + return self.w + else: + return self.w(step) + + +class CriterionGroup(NamedTuple): + criterions : List[Union['CriterionGroup',Criterion]] + name : str = '' + w : Union[float,Callable[[int],float]] = 1.0 + + def _eval_weight(self, step): + if isinstance(self.w, float): + return self.w + else: + return self.w(step) + + def evaluate(self, pred, batch, step) -> List[LossVal]: + w = self._eval_weight(step) + lossvals = sum((c.evaluate(pred, batch, step) for c in self.criterions), start=[]) + lossvals = [ LossVal(v.val,v.weight*w,self.name+v.name) for v in lossvals ] + return lossvals + @dataclasses.dataclass class History: @@ -34,11 +98,6 @@ class History: logplot : bool = True -class LossVal(NamedTuple): - val : Tensor - weight : float - name : str - # From https://stackoverflow.com/questions/15411967/how-can-i-check-if-code-is-executed-in-the-ipython-notebook def in_notebook(): @@ -154,9 +213,14 @@ def summarize_single_train_history(k, h : History): return epochs, values = zip(*h.current_train_buffer) try: + if next(iter(values)).shape != (): + values = np.concatenate(values) + else: + values = np.stack(values) h.train.append((np.average(epochs), np.average(values), np.std(values))) except FloatingPointError: - print (f"Floating point error at {k} in epochs {np.average(epochs)} with values:\n {str(values)}\n") + with np.printoptions(precision=4, suppress=True, threshold=20000): + print (f"Floating point error at {k} in epochs {np.average(epochs)} with values:\n {str(values)} of which there are {len(values)}\n") h.train.append((np.average(epochs), np.nan, np.nan)) h.current_train_buffer = [] @@ -281,10 +345,9 @@ def run_the_training( net.train() for batch in train_iter: - lossvals = update_func(net, batch, optimizer, state) - state.lossvals = lossvals - for name, val in lossvals: - plotter.add_train_point(epoch, state.step, name, val.detach().to('cpu',non_blocking=True)) + trainlossvals = update_func(net, batch, optimizer, state) + for name, (val, _) in concatenated_lossvals_by_name(itertools.chain.from_iterable(trainlossvals)).items(): + plotter.add_train_point(epoch, state.step, name, val) state.step += 1 if state.grad_norm is not None: plotter.add_train_point(epoch, state.step, '|grad L|', state.grad_norm) @@ -333,7 +396,75 @@ def filename(self): def save(self): os.makedirs(self.model_dir, exist_ok=True) - torch.save(self.net.state_dict(), self.filename) + trackertraincode.neuralnets.io.save_model(self.net, self.filename) + + +class DebugData(NamedTuple): + parameters : dict[str,Tensor] + batches : list[Batch] + preds : dict[str,Tensor] + lossvals : list[list[LossVal]] + + def is_bad(self): + '''Checks data for badness. + + Currently NANs and input value range. + + Return: + True if so. + ''' + #TODO: decouple for name of input tensor + for k,v in self.parameters.items(): + if torch.any(torch.isnan(v)): + print(f"{k} is NAN") + return True + for b in self.batches: + for k, v in b.items(): + if torch.any(torch.isnan(v)): + print(f"{k} is NAN") + return True + inputs = b['image'] + if torch.amin(inputs)<-2. or torch.amax(inputs)>2.: + print(f"Input image {inputs.shape} exceeds value limits with {torch.amin(inputs)} to {torch.amax(inputs)}") + return True + for k,v in self.preds.items(): + if torch.any(torch.isnan(v)): + print(f"{k} is NAN") + return True + for lv_list in self.lossvals: + for lv in lv_list: + if torch.any(torch.isnan(lv.val)): + print(f"{lv.name} is NAN") + return True + return False + +class DebugCallback(): + '''For dumping a history of stuff when problems are detected.''' + def __init__(self): + self.history_length = 3 + self.debug_data : List[DebugData] = [] + self.filename = '/tmp/notgood.pkl' + + def observe(self, net_pre_update : nn.Module, batches : list[Batch], preds : dict[str,Tensor], lossvals : list[list[LossVal]]): + '''Record and check. + Args: + batches: Actually sub-batches + lossvals: One list of loss terms per sub-batch + ''' + dd = DebugData( + {k:v.detach().to('cpu', non_blocking=True,copy=True) for k,v in net_pre_update.state_dict().items()}, + [b.to('cpu', non_blocking=True,copy=True) for b in batches ], + {k:v.detach().to('cpu', non_blocking=True,copy=True) for k,v in preds.items()}, + lossvals + ) + if len(self.debug_data) >= self.history_length: + self.debug_data.pop(0) + self.debug_data.append(dd) + torch.cuda.current_stream().synchronize() + if dd.is_bad(): + with open(self.filename, 'wb') as f: + pickle.dump(self.debug_data, f) + raise RuntimeError("Bad state detected") class SaveBestCallback(SaveCallback): @@ -402,28 +533,6 @@ def __call__(self, state : State): self.save() -def _check_loss(loss, pred, batch, name): - if not torch.isfinite(loss).all(): - import pickle - with open('/tmp/pred.pkl', 'wb') as f: - pickle.dump(pred,f) - with open('/tmp/batch.pkl', 'wb') as f: - pickle.dump(batch, f) - raise RuntimeError(f"Non-finite value created by loss {name}") - - -def checked_criterion_eval(lossfunc : Callable, pred : Dict, batch : Dict) -> List[LossVal]: - loss = lossfunc(pred, batch) - if isinstance(loss, Tensor): - # Only enable for debugging: - # _check_loss(loss, pred, batch, type(lossfunc).__name__) - return [LossVal(loss,1.,'')] - elif isinstance(loss, LossVal): - return [loss] - else: - return loss - - def compute_inf_norm_of_grad(net : nn.Module): device = next(iter(net.parameters())).device result = torch.zeros((), device=device, dtype=torch.float32, requires_grad=False) @@ -434,107 +543,70 @@ def compute_inf_norm_of_grad(net : nn.Module): return result -def _convert_multi_task_loss_list(multi_task_terms: Dict[str,List[Tuple[Tensor,float,int]]], device : str) -> Dict[str,Tuple[Tensor,Tensor,Tensor]]: - # Convert list of list of tuples to list of tuples of tensors - def _cvt_item(k, vals_weights_idx): - vals, weights, idxs = zip(*vals_weights_idx) - #print (f"CVT {k}: v {[v.shape for v in vals]}, w {[w.shape for w in weights]}") - vals = [ (val*w).mean() for val, w in zip(vals, weights) ] - vals = torch.stack(vals) - #weights = torch.as_tensor(weights, dtype=torch.float32).to(device, non_blocking=True) - #weights = torch.stack(weights) - weights = torch.stack([w.mean() for w in weights]) - idxs = torch.as_tensor(idxs) - return vals, weights, idxs - return { k:_cvt_item(k,v) for k,v in multi_task_terms.items() } - - -def _accumulate_losses_over_batches(multi_task_terms: Sequence[Tuple[Tensor,Tensor,Tensor]], batchsizes : Tensor): - all_lossvals = 0. - for vals, weights, idxs in multi_task_terms: - all_lossvals = all_lossvals + torch.sum(vals*batchsizes[idxs]) - all_lossvals = all_lossvals / torch.sum(batchsizes) - return all_lossvals +# g_debug = DebugCallback() -def default_update_fun(net, batch : List[Batch], optimizer : torch.optim.Optimizer, state : State, loss): - assert isinstance(batch, list) - +def default_update_fun(net, batch : List[Batch], optimizer : torch.optim.Optimizer, state : State, loss : dict[Any, Criterion | CriterionGroup] | Criterion | CriterionGroup): + # global g_debug + optimizer.zero_grad() inputs = torch.concat([b['image'] for b in batch], dim=0) - - assert torch.amin(inputs)>=-2., f"Input out of normal image bounds: {torch.amin(inputs)}" - assert torch.amax(inputs)<= 2., f"Input out of normal image bounds: {torch.amax(inputs)}" preds = net(inputs) - all_multi_task_terms = defaultdict(list) - batchsizes = torch.tensor([ subset.meta.batchsize for subset in batch ], dtype=torch.float32).to(inputs.device, non_blocking=True) + lossvals_by_name = defaultdict(list) + all_lossvals : list[list[LossVal]] = [] + # Iterate over different datasets / loss configurations offset = 0 - for subset_idx, subset in enumerate(batch): + for subset in batch: frames_in_subset, = subset.meta.prefixshape subpreds = { k:v[offset:offset+frames_in_subset,...] for k,v in preds.items() } - loss_func_of_subset = loss[subset.meta.tag] if isinstance(loss, dict) else loss - multi_task_terms = checked_criterion_eval(loss_func_of_subset, subpreds, subset) + # Get loss function and evaluate + loss_func_of_subset : Union[Criterion,CriterionGroup] = loss[subset.meta.tag] if isinstance(loss, dict) else loss + multi_task_terms : List[LossVal] = loss_func_of_subset.evaluate(subpreds, subset, state.epoch) + # Support loss weighting by datasets if 'dataset_weight' in subset: - dataset_weights = subset['dataset_weight'] - assert dataset_weights.size(0) == subset.meta.batchsize + dataset_weight = subset['dataset_weight'] + assert dataset_weight.size(0) == subset.meta.batchsize + multi_task_terms = [ v._replace(weight=v.weight*dataset_weight) for v in multi_task_terms ] else: - dataset_weights = torch.ones((frames_in_subset,), device=inputs.device) + # Else, make the weight member a tensor the same shape as the loss values + multi_task_terms = [ v._replace(weight=v.val.new_full(size=v.val.shape,fill_value=v.weight)) for v in multi_task_terms ] - for elem in multi_task_terms: - weight = dataset_weights * elem.weight - assert weight.shape == elem.val.shape, f"Bad loss {elem.name}" - all_multi_task_terms[elem.name].append((elem.val, weight)) - if state.num_samples_per_loss is not None: - state.num_samples_per_loss[elem.name] += frames_in_subset - + all_lossvals.append(multi_task_terms) del multi_task_terms, loss_func_of_subset offset += frames_in_subset - def _concat_over_subsets(items : List[Tuple[Tensor,Tensor]]): - values, weights = zip(*items) - return ( - torch.concat(values), - torch.concat(weights)) - all_multi_task_terms = { k:_concat_over_subsets(v) for k,v in all_multi_task_terms.items() } + batchsize = sum(subset.meta.batchsize for subset in batch) + # Concatenate the loss values over the sub-batches. + lossvals_by_name = concatenated_lossvals_by_name(itertools.chain.from_iterable(all_lossvals)) + # Compute weighted average, dividing by the batch size which is equivalent to substituting missing losses by 0. + loss_sum = torch.concat([ (values*weights) for values,weights in lossvals_by_name.values() ]).sum() / batchsize + + # Transfer to CPU + for loss_list in all_lossvals: + for i, v in enumerate(loss_list): + loss_list[i] = v._replace(val = v.val.detach().to('cpu', non_blocking=True)) - loss_sum = torch.concat([ (values*weights) for values,weights in all_multi_task_terms.values() ]).sum() / batchsizes.sum() loss_sum.backward() - + + # g_debug.observe(net, batch, preds, all_lossvals) + if 1: state.grad_norm = compute_inf_norm_of_grad(net).to('cpu', non_blocking=True) # Gradients get very large more often than looks healthy ... Loss spikes a lot. # Gradient magnitudes below 0.1 seem to be normal. Initially gradients are larger, - nn.utils.clip_grad_norm_(net.parameters(), 0.1, norm_type=float('inf')) + nn.utils.clip_grad_norm_(net.parameters(), 1.0, norm_type=float('inf')) optimizer.step() - # This is only for logging - for k, (vals, weights) in all_multi_task_terms.items(): - all_multi_task_terms[k] = weighted_mean(vals, weights, 0) - - return list(all_multi_task_terms.items()) - - -class MultiTaskLoss(object): - def __init__(self, criterions : Sequence[Criterion]): - self.criterions = criterions - - def __iadd__(self, crit : Criterion): - self.criterions += crit - return self - - def __call__(self, pred, batch): - def _eval_crit(crit : Criterion): - return [ - LossVal(lv.val, lv.weight*crit.w, crit.name+lv.name) for lv in checked_criterion_eval(crit.f, pred, batch) ] - return sum((_eval_crit(c) for c in self.criterions), start=[]) + torch.cuda.current_stream().synchronize() + return all_lossvals class DefaultTestFunc(object): @@ -596,4 +668,23 @@ def lr_func(i): else: step_index = [j for j,step in enumerate(steps) if i>step][-1] return gamma**step_index + return LambdaLR(optimizer, lr_func) + + +def ExponentialUpThenSteps(optimizer, num_up, gamma, steps): + steps = [0] + steps + def lr_func(i): + eps = 1.e-2 + scale = math.log(eps) + if i < num_up: + f = ((i+1)/num_up) + #return torch.sigmoid((f - 0.5) * 15.) + # a * exp(f / l) | f=1 == 1. + # a * exp(f / l) | f=0 ~= eps + # => a = eps + # => ln(1./eps) = 1./l + return eps * math.exp(-scale*f) + else: + step_index = [j for j,step in enumerate(steps) if i>step][-1] + return gamma**step_index return LambdaLR(optimizer, lr_func) \ No newline at end of file diff --git a/trackertraincode/utils.py b/trackertraincode/utils.py index 3289253..d1de63b 100644 --- a/trackertraincode/utils.py +++ b/trackertraincode/utils.py @@ -13,10 +13,18 @@ def identity(arg): return arg def as_hpb(rot): + '''This uses an aeronautic-like convention. + + Rotation are applied (in terms of extrinsic rotations) as follows in the given order: + Roll - around the forward direction. + Pitch - around the world lateral direction + Heading - around the world vertical direction + ''' return rot.as_euler('YXZ') def from_hpb(hpb): + '''See "as_hpb"''' return Rotation.from_euler('YXZ', hpb) diff --git a/trackertraincode/vis.py b/trackertraincode/vis.py index 5c3a469..59ab474 100644 --- a/trackertraincode/vis.py +++ b/trackertraincode/vis.py @@ -54,8 +54,10 @@ def draw_axis(img, rot, tdx=None, tdy=None, size = 100, brgt = 255, lw=3, color return img -def draw_points3d(img, pt3d, size=3, color=(255,255,255), labels=False): +def draw_points3d(img, pt3d, size=3, color = None, labels=False): assert pt3d.shape[-1] in (2,3) + if color is None: + color = (255,255,255) r,g,b = color for i, p in enumerate(pt3d[:,:2]): p = tuple(p.astype(int)) @@ -129,9 +131,8 @@ def draw_semseg_logits(semseg : np.ndarray): return colored -def _draw_sample(img : np.ndarray, sample : Union[Batch,dict], is_prediction : bool, labels : bool = True): +def _draw_sample(img : np.ndarray, sample : Union[Batch,dict], labels : bool = True, color : Optional[tuple[int,int,int]] = None): linewidth = 2 - color = PRED_COLOR if is_prediction else GT_COLOR if 'seg_image' in sample: semseg = draw_semseg_class_indices(sample['seg_image']) img //= 2 @@ -156,15 +157,15 @@ def _draw_sample(img : np.ndarray, sample : Union[Batch,dict], is_prediction : b def draw_prediction(sample_pred : Tuple[Batch,dict]): sample, pred = sample_pred img = np.ascontiguousarray(_with3channels_hwc(sample['image'].copy())) - _draw_sample(img, sample, False, False) - _draw_sample(img, pred, True, False) + _draw_sample(img, sample, False, GT_COLOR) + _draw_sample(img, pred, False, PRED_COLOR) return img def draw_dataset_sample(sample : Batch, label=False): sample = dict(sample.items()) img = np.ascontiguousarray(_with3channels_hwc(sample['image'].copy())) - _draw_sample(img, sample, False, label) + _draw_sample(img, sample, label, None) return img