From 78ac026f0285afef104cbc687396e2920411eb75 Mon Sep 17 00:00:00 2001 From: Bin Li Date: Tue, 27 Feb 2024 18:33:33 +0800 Subject: [PATCH] code and model for the paper Neural Video Compression with Feature Modulation in CVPR 2024. --- DCVC-FM/README.md | 131 ++++ DCVC-FM/assets/bitsaving.png | Bin 0 -> 233040 bytes DCVC-FM/assets/rd_yuv420_psnr.png | Bin 0 -> 294998 bytes DCVC-FM/checkpoints/download.py | 21 + DCVC-FM/dataset_config_example_rgb.json | 100 +++ DCVC-FM/dataset_config_example_yuv420.json | 100 +++ DCVC-FM/requirements.txt | 8 + DCVC-FM/src/cpp/3rdparty/CMakeLists.txt | 4 + .../src/cpp/3rdparty/pybind11/CMakeLists.txt | 24 + .../cpp/3rdparty/pybind11/CMakeLists.txt.in | 33 + DCVC-FM/src/cpp/CMakeLists.txt | 24 + DCVC-FM/src/cpp/ops/CMakeLists.txt | 28 + DCVC-FM/src/cpp/ops/ops.cpp | 91 +++ DCVC-FM/src/cpp/py_rans/CMakeLists.txt | 30 + DCVC-FM/src/cpp/py_rans/py_rans.cpp | 281 +++++++++ DCVC-FM/src/cpp/py_rans/py_rans.h | 57 ++ DCVC-FM/src/cpp/rans/CMakeLists.txt | 23 + DCVC-FM/src/cpp/rans/rans.cpp | 362 +++++++++++ DCVC-FM/src/cpp/rans/rans.h | 152 +++++ DCVC-FM/src/cpp/rans/rans_byte.h | 155 +++++ DCVC-FM/src/models/block_mc.py | 80 +++ DCVC-FM/src/models/common_model.py | 324 ++++++++++ DCVC-FM/src/models/entropy_models.py | 304 +++++++++ DCVC-FM/src/models/extensions/block_mc.cpp | 15 + DCVC-FM/src/models/extensions/block_mc.h | 8 + .../src/models/extensions/block_mc_kernel.cu | 89 +++ DCVC-FM/src/models/extensions/common.h | 32 + DCVC-FM/src/models/extensions/setup.py | 26 + DCVC-FM/src/models/image_model.py | 225 +++++++ DCVC-FM/src/models/layers.py | 299 +++++++++ DCVC-FM/src/models/video_model.py | 581 ++++++++++++++++++ DCVC-FM/src/models/video_net.py | 209 +++++++ DCVC-FM/src/transforms/functional.py | 300 +++++++++ DCVC-FM/src/transforms/transforms.py | 118 ++++ DCVC-FM/src/utils/common.py | 148 +++++ DCVC-FM/src/utils/metrics.py | 94 +++ DCVC-FM/src/utils/stream_helper.py | 249 ++++++++ DCVC-FM/src/utils/test_helper.py | 486 +++++++++++++++ DCVC-FM/src/utils/video_reader.py | 184 ++++++ DCVC-FM/src/utils/video_writer.py | 131 ++++ DCVC-FM/test_data_to_png.py | 29 + DCVC-FM/test_video.py | 142 +++++ README.md | 11 + 43 files changed, 5708 insertions(+) create mode 100644 DCVC-FM/README.md create mode 100644 DCVC-FM/assets/bitsaving.png create mode 100644 DCVC-FM/assets/rd_yuv420_psnr.png create mode 100644 DCVC-FM/checkpoints/download.py create mode 100644 DCVC-FM/dataset_config_example_rgb.json create mode 100644 DCVC-FM/dataset_config_example_yuv420.json create mode 100644 DCVC-FM/requirements.txt create mode 100644 DCVC-FM/src/cpp/3rdparty/CMakeLists.txt create mode 100644 DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt create mode 100644 DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt.in create mode 100644 DCVC-FM/src/cpp/CMakeLists.txt create mode 100644 DCVC-FM/src/cpp/ops/CMakeLists.txt create mode 100644 DCVC-FM/src/cpp/ops/ops.cpp create mode 100644 DCVC-FM/src/cpp/py_rans/CMakeLists.txt create mode 100644 DCVC-FM/src/cpp/py_rans/py_rans.cpp create mode 100644 DCVC-FM/src/cpp/py_rans/py_rans.h create mode 100644 DCVC-FM/src/cpp/rans/CMakeLists.txt create mode 100644 DCVC-FM/src/cpp/rans/rans.cpp create mode 100644 DCVC-FM/src/cpp/rans/rans.h create mode 100644 DCVC-FM/src/cpp/rans/rans_byte.h create mode 100644 DCVC-FM/src/models/block_mc.py create mode 100644 DCVC-FM/src/models/common_model.py create mode 100644 DCVC-FM/src/models/entropy_models.py create mode 100644 DCVC-FM/src/models/extensions/block_mc.cpp create mode 100644 DCVC-FM/src/models/extensions/block_mc.h create mode 100644 DCVC-FM/src/models/extensions/block_mc_kernel.cu create mode 100644 DCVC-FM/src/models/extensions/common.h create mode 100644 DCVC-FM/src/models/extensions/setup.py create mode 100644 DCVC-FM/src/models/image_model.py create mode 100644 DCVC-FM/src/models/layers.py create mode 100644 DCVC-FM/src/models/video_model.py create mode 100644 DCVC-FM/src/models/video_net.py create mode 100644 DCVC-FM/src/transforms/functional.py create mode 100644 DCVC-FM/src/transforms/transforms.py create mode 100644 DCVC-FM/src/utils/common.py create mode 100644 DCVC-FM/src/utils/metrics.py create mode 100644 DCVC-FM/src/utils/stream_helper.py create mode 100644 DCVC-FM/src/utils/test_helper.py create mode 100644 DCVC-FM/src/utils/video_reader.py create mode 100644 DCVC-FM/src/utils/video_writer.py create mode 100644 DCVC-FM/test_data_to_png.py create mode 100644 DCVC-FM/test_video.py diff --git a/DCVC-FM/README.md b/DCVC-FM/README.md new file mode 100644 index 0000000..5ac751e --- /dev/null +++ b/DCVC-FM/README.md @@ -0,0 +1,131 @@ +# Introduction + +Official Pytorch implementation for DCVC-FM: [Neural Video Compression with **F**eature **M**odulation](https://arxiv.org/abs/2402.17414), in CVPR 2024. + +# Prerequisites +* Python 3.10 and conda, get [Conda](https://www.anaconda.com/) +* CUDA if want to use GPU +* Environment + ``` + conda create -n $YOUR_PY_ENV_NAME python=3.10 + conda activate $YOUR_PY_ENV_NAME + + conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.8 -c pytorch -c nvidia + pip install -r requirements.txt + ``` + +# Test dataset + +We support arbitrary original resolution. The input video resolution will be padded automatically. The reconstructed video will be cropped back to the original size. The distortion (PSNR) is calculated at original resolution. + +## YUV 420 content + +Put the*.yuv in the folder structure similar to the following structure. + + /media/data/HEVC_B/ + - BQTerrace_1920x1080_60.yuv + - BasketballDrive_1920x1080_50.yuv + - ... + /media/data/HEVC_D/ + /media/data/HEVC_C/ + ... + +The dataset structure can be seen in dataset_config_example_yuv420.json. + +## RGB content + +Please convert YUV 420 data to RGB data using BT.709 conversion matrix. + +For example, one video of HEVC Class B can be prepared as: +* Make the video path: + ``` + mkdir BasketballDrive_1920x1080_50 + ``` +* Convert YUV to PNG: + +We use BT.709 conversion matrix to generate png data to test RGB sequences. Please refer to ./test_data_to_png.py for more details. + +At last, the folder structure of dataset is like: + + /media/data/HEVC_B/ + * BQTerrace_1920x1080_60/ + - im00001.png + - im00002.png + - im00003.png + - ... + * BasketballDrive_1920x1080_50/ + - im00001.png + - im00002.png + - im00003.png + - ... + * ... + /media/data/HEVC_D/ + /media/data/HEVC_C/ + ... + +The dataset structure can be seen in dataset_config_example_rgb.json. + +# Build the project +Please build the C++ code if want to test with actual bitstream writing. There is minor difference about the bits for calculating the bits using entropy (the method used in the paper to report numbers) and actual bitstreaming writing. There is overhead when writing the bitstream into the file and the difference percentage depends on the bitstream size. + +## Build the entropy encoding/decoding module +```bash +sudo apt-get install cmake g++ +cd src +mkdir build +cd build +conda activate $YOUR_PY_ENV_NAME +cmake ../cpp -DCMAKE_BUILD_TYPE=Release +make -j +``` + +## Build customized flow warp implementation (especially you want to test fp16 inference) +``` +sudo apt install ninja-build +cd ./src/models/extensions/ +python setup.py build_ext --inplace +``` + +# Pretrained models + +* Download [our pretrained models](https://1drv.ms/f/s!AozfVVwtWWYoi1QkAhlIE-7aAaKV?e=OoemTr) and put them into ./checkpoints folder. +* Or run the script in ./checkpoints directly to download the model. +* There are 2 models, one for image coding and the other for video coding. + +# Test the models + +Example to test pretrained model with four rate points: +```bash +python test_video.py --model_path_i ./checkpoints/cvpr2024_image.pth.tar --model_path_p ./checkpoints/cvpr2024_video.pth.tar --rate_num 4 --test_config ./dataset_config_example_yuv420.json --cuda 1 --worker 1 --write_stream 0 --output_path output.json --force_intra_period 9999 --force_frame_num 96 +``` + +It is recommended that the ```--worker``` number is equal to your GPU number. + +You can also specify different ```--rate_num``` values (2~64) to test finer bitrate adjustment. + +# Comparing with other method +Bit saving over VTM-17.0 (HEVC E (600 frames) with single intra-frame setting (i.e. intra-period = –1) and YUV420 colorspace.) + + + +RD curve of YUV420 PSNR + + + +# Acknowledgement +The implementation is based on [CompressAI](https://github.com/InterDigitalInc/CompressAI) and [PyTorchVideoCompression](https://github.com/ZhihaoHu/PyTorchVideoCompression). +# Citation +If you find this work useful for your research, please cite: + +``` +@inproceedings{li2024neural, + title={Neural Video Compression with Feature Modulation}, + author={Li, Jiahao and Li, Bin and Lu, Yan}, + booktitle={{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2024, Seattle, WA, USA, June 17-21, 2024}, + year={2024} +} +``` + +# Trademarks +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies. diff --git a/DCVC-FM/assets/bitsaving.png b/DCVC-FM/assets/bitsaving.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed65fad62f3ef285f2ec5116fe0a8cd54dadfda GIT binary patch literal 233040 zcmeFZg;!MF8!$QoO1*%JfFhwNT_Qa+h;)~9C?yioJ(Qv-ASET;F$_oyogxYh-Hk{N z4Ku(D4EOMs{@(lj0e7wY?X?{CK4+hO_S3PS<6BL21u_y^5)cSPrlj~t8w4U^0f7j< z5?ukV?4pEyfj^hrv=wAQWqow(z<|J3Mok6;s)!~%wY&_BiCq*8-9R8}=8J!ql(g^f z0vE0Ab)UHFIN7_XS-V?4vvjuvu7N;)Oiy3fyJ$MwJGr|tfsOr`yqUlcxR`u^-vF*Z zM-Lx}2>+ii@I8F^@b5`~J@V%T(*U-2y#XN5xq#9m8C`F)%~?W!%aeA`rDmnI}%%8{CJhl{qmN) zA9=noRJU3^T6U{FqBEVOt@yDf>1!T7&h#e;fBgheF9;a_KK^ho>9--s=#Msn-^K%0 z7dZX51yRdAxb*J`1gg3jLj2n>v-7IzZ$l9GYYV*J#&&!Jl)nw7-`)Mcum1lP!n0N; zi~4uOO}o@SW#69HNbKSgPVtMIYsTHD7uzE+J^m?Mc@sR>XkU+vR|2EsZy%yr;D#5H z`d2f0-QmE81znZS({J>Sbn>-NhYY}cq?_N;#9JcS^3KI>eN61MP+qK&<7!}Fp(g6e$Gdb}}Tt*otnV-m9d$q6;L&^p6;n4wZO=#VNA0bV&j zoJ2Y5p4V&EJz1S$bg=%_nB^-@RG;~IS#*t{M9Kmpxk#hAKW6+I ztfEU@(+Uwmc2_$<7`%R*%CJ96IDb}q&TzI@JSj(b;3<{C}G<4=3)9?u7r($H)SDBoy^*2v720MkNiqB`UVE0pvbaQlr{YF`Ry<}plS9Qaec19?V%%J?y^f11hu8nVTJVV^){#yN~%UonT zpE4(WHGYKK?`GvBSeR~4qTi;Uxx~$^#9GMbqmE`N{N8`w?upTXL;T+iJEfp;6HZf0VqX&KA?y6?YN&)dTkt& zqk9?@lIH_+8S(Vg-q4nHP$*S7nZNqjcdS3H^vkwnz5-0gfT}t(y=yX0^3~N;AJ4w= z{@cast9}VBHq}F0adT16BEJab>0+=owZ z2|)=tbhVAvr%7K=Pa4>oc_&SYZaVL!r9+-3^MbBEj|%JCpj)N5;jI#(I}~;r3bzYh z;i~SDuN|@d`M~^DctA%My68KO#@qQ-Hz(fw+qJBFg01A1x@9AqK9i%|zl?X#Ri-4+ zo%`KAJ&3nkMDmZ1J-Nu4-M2PKDZix_B*U6Y1oLnzDcueMd%5>`$0qT&c(=#$Dbhy^ zre)9BA zOYrs=e)mDt(fV?-vF_AnSdhV_Vcot2xQ~2e(*ap7rtkwqw(-JTKP!RsBgeObf8`To zcNK6T5UZ0#@}xpojj(VJgPm>5W^3awC9t7mwWD@k=l!-q(}9AEFNaO!HsL)A!|2i&~O%H|~nOs6?|+uGO+i(xGXQjFK| zqesHjQ8UyAUZ|~gjhOgSlYEahnyP<^4BC)?a7mg!!G5XheCV9|q(8UoJ^1lbtivZn z^v%qJbMIvGeU#uX2V}CL{%GHPJ)$9Fc)Y}Q8O=CKgd>pcEhI%D<*b%JC?pT34;z=H zx?P#?*U>61MM)u-x}3)%`+4^C$lq*0qIjgTo>H3K=d7|n)1NOQMI^lbrY?~Xi z&`gLrv1wSAOVUeQJTF#lsq8^3|zZO%Ot~p7)D>CJ!`&^~;C5CuPxI`W1w*9e zyxNOK$cy%usb|)wXjO0iazH2W0cVvKQR!BXdpV4%$N4(Uc$aLSVkvzO!qqs?%4P9d z^~bQIwHM}A7G5#4(Sz0Jry1$z)5~Bd%~*d0AC;<;E(7;|J%hC}it!T;DuKt|^ZbXY zZ?~W{4`2~1O{M2&CeL{6%j{5Mt7Z}?xVil^D@t>QrpYP$0)DPO&#fDbyBkzSxDJi( z&;92O807nTRoyP|=pXH3bj6%IEv8*?=eeFrxOe2-*)a3iQ%N~vBsa&Rrbz<<~Q5tUA@35DYVq^T?wBV@{M4_raO3EC5h81i&UGo6j zE5@G77g{wmV^_C)U+9}Haj=T~5JZo+41Ke6n2*cq&+s!x-kzsy|Dn6V2N{rymMm6a zXf%M-uly0Ye!~))XopHYT1!6~>v5_YxIbq_HBC(R?%qQqtzZTsjhZoN&&L4F{G@di z`S$hNu8@0RB_(vgG^H)?8K%YD;p_WbIKC~;01U3gcR$_1{YR#!tM7jG=~>JASl4P{ zW;)^6H7ckgw#HYbbb3CQ@Y=sTYj@*Ml1-va&alYhxCQf#$|Ljf%JW*|7BTDt)O&~S z9;ICHdvQJC(}PVI)I=lC4<@HsiFRZ-aiZgzmvk3&ncc*SQZIb0m7Yn0{PCJ02nVbA4u) zJkJT}vV5gz$Bo&txGM~v`A+_acTL6FhK$@DkhcBE90Y2H(IBa%>2==c&qJHPf~2eq zf2Dazd92M~ruYDZ)%a=P^dvXWC$c!%;_X1D8}DF@68ZPkf*tcfa3c)F^_}W;gr}%5a5khCT8=09oh`oh>#9y^-C!G{a7!Bi{ zcPH=6&1Y{r;@Hs(G?Qr+x|JSlb;7u>D6eo}@JsMyqboH*Xl{+Nn!LngjTD7k4#5g` zUKJh>sdeF$smb~%xMrn!fC6WVmY__ZdW!pxyAjn#Dl}_xyuu}eWb|}zmDLZ!$;D4Z zyGd_=UGj?k;5W^QIx0P4s7ERNcd4J*DQGR>(+2zKB{iF#G&?WqHspFSRyo8OajGN_7n0jK7v!EHQcYZAb_?d|Iwh+d&em+tYKFxEaH#mo{_?y(%s?OeNxW zwM-@_oO5ap`Xt-SEFD^(#@P)IEP>4Wx8z$3^Cm5PPb;A@Pc6{)yFR8s7_E9}kXP85 zleR8))<$5E0`^#d{ffTB7;LjZRdmj8Nh;xXWAD5+ez@@tXW&jgOMb%Ttl-2oDsB7= zX|}OVWyd|XQ-INozEym{E2^BoCQT_4?|R4#E`iimn`cF={Jj2xj}RI56pS&WlbCKE zW0j)8jvuipoBAEYRuS{X(39Yh%jC=eSF=o0G5j1vYn*GeU=J!WYtxe{{0{YV0UP9| zFFR*_A!>P6R-4#L*1YZ~b<(8Ny3rY{{ssMJK97V=0>kI#b?xbwbPK-IAak99i|@ui zpZ=IO#$7?m;%*=;Hv3B^!fpaS0yk?Zj3xb{@>a)vFC6&n80Y4Dm@c*cG1X~o>-?zD z?9?jx^K2}qPcBa_)+uecfsb_wp9l#Zh9z;#pWrxTGM+{ceE8l~9L{U`0lFiVTr~5T zir1y6t2Hp9!i!Vb4sk{7##QMo}taa_eZVLO5{X>*xFQ z?t}C0Juknbnx%K@9n!ZjKeAHY&rst#w8FC(8j0Or1*0T;R)Or1vx!vqo$9B{SWk~S zVS9uxMCr|&z|fI!b@G2X%kI*Jh3&mo7WUKomDr~Ub@lxWZ|5pDGLh9wO^5BF^*Dnr zgd3DR1^lX7#6=sTr$lMKqqCU)0}7;Yj+fN69U=`)ZIdKA%a_W^Zv;w$JLwK@ z&w8%g<;jbb8q|oO=m#P2xIOf^N)$z6$1P~?7tGGvlA~v7FYP{iWYBY%w6~Y>6ejN^KdEL2#O%~tb+e(KGnTm6)>_5Z+pi6-BF9+MhvjIZ zwG)4OMwE|DGk-}z>b+#kU%i8hAU)jQ`oJ%)uat&$=-s1P%U3WTfH+IZNFaUI#0@#C z#5>9oujWg3T;UYb^!`O*JC^WqEA%B0VsWxqIMAyi-AKP^S8E(O8m_L7Jv)8|Sv+i6 z`{dWGQ&AGlgX z3NwF>v(^7~cheCNabh?VKluTT|)B?8o!W2`B6Rz%lQ*7IM6t~~l8 zh+P>e{iyk>_!pg8n=dR*s!pYmEY<(4bLC^AdW9*!y*=RK?d-wD%)0-x_|Y|B zaT@_$?kp0$U$PR^^v(h=NGK=kzpI#DtU?@F^q;-V0se?|>Oj(er%PN+_f`9UO~2TB z$$0#Kr_*0df8M66QYbt6OQJHDFZNh`S?51{{J6Sn)GG<9;z0L||LA-da4A%}tOe&= z$trZ0wRzJ6{mK^N9rG&?r`FZiMUu|#u9G}OAE)@+8Co{9WbIV!HZwbV5;lb`pt=r<0 zDJL7qlvJ})WthSCXK}~*n1b0#LWbr1f)a0yJr=Jl5|wY#zmypv69)^Zu%jgVa{pR1 zg{pzRyMf2sxngcZGkHeOob+a!s&<4{V1f~o%F}5Bz-mI4|EE}K!Hl~cFJ$ktKVq7is3dPuhbk6x4#V_>+ znvilSzA8<|V66&K%W!nV1Ii-)nP2&eag#4>)|+?7@ESA#^LhtwKZ%AYL*dRdT#!cxah;r>JO^5jw)s z436)^!OI%g@X{c2KH&3^cOECz!pJhf9CRJj6i+yi{}Kb2Rv@u2z5i?jJ1#j^PZB;9 zg-OUi{DYrn^Q~M=%(dojlDUZM3GofqwpSasA5z&k4t9&0uO)<^7aB9-Opq!82ETxE z2?Exl+im1HUFL3TDpyn%d1RX*`Dkz@R>G~Qi`{E&PytuOnjWam+q55H=5uoS?5G0k zj@2u$S1nLPCMjFvPCqmFtkY0wi~b_0$O0gz0`8o#&hyQO! zF@B6~1Ph=Q?xY;Jlu6!0h0o+tJNHqM4`{;P>kymPv&|WVwL#lMthQ29eyJ7^nkqbz zcD40ViR&Q5V=G`dVLaa8lC58wOIHpCmHD7@pnPNJTK+Wy@hszLbxq1tc>>4ocy* z(jz=TlKyR224Dq(?>X-^&hwGD)3CYY=Vkg%2z{+OV+M^nl1icHi{rc-a}60sudd&i zQ;UO07|x=t*nZKm6&DPc!;Nu^PJ-x%l6A(yXU+*62<1Cb$AKxXqaI*q-3YWN&&8a7 zT5GccActf`2JY@*bgt||LfuniKY>gsY}~v|LL;t=LT4vRDI%IYvB%n!RZ`xRkUo2< z@2m-j-ZibaU<~_BPBs|}frKCez}P=)gUWY+O#Hv2|4*NeeO;_h3IN&Z#@)giFZ#P1~FuuM}D4B6QN(D%^zl&h22{+vB{D&OQ7N&%tp-HPev_I znUt&fSTpa7JiS4gTo{(Ly^$iWiVs#B_z+JX;ht17y1;#=<=pT8q;j7GYRoD6X-`>Q zQk#{|J?}B=qhkt^kOKEI$+Ux{=KfyIk7d}ePyf|Hl zcRfEN=yHamnpKvbhMs@&Hf)1qHWO_HIo-m$>EF@{{9vpv_3HX~^0SUr<#vsKmZqM&J_SYp3oD+9X^hlv6P5%di89zRU3dUoz|UVT2;ZRYW3Pll{|gSG zgRjb?mI{rT{5nV}{4I9lVn%AIJYFHF_98>S0GMic+eM8oFfU47rN~3O$rT$~f6xWf zvs%$>*C`v|R!Gkp0a?D5*k5sI`_yyzX!y?xYNium43H76R(GXUbEX5-^R$=T17 zz9W$<{!-3mW6%@0nK=gPS&K+9*?71{JS$Rb@FtYlEa9hrDSSn;^^vwgt1< zUP3}F@fHV#B0I(b0?2tIO|w-JvuK!hNQT4s+n$KhXp|hfOy^YX2Rp`S-ibepK%o|; zS5mudKeFW*@o;MfV=lqBWz%HNA3yNN@+*GSqF2l4(!1xcuNy_6{B6!OG$2QhA~i$g z7Gq3Dn0?B9Sv++@N-*xO)_ZgTryXe+riPJHP~?RKI#L6o|92xSbLCEVi%Or}ge5I( zxHN62KQMfWI4<DDPgz z`1e5^!mekJ<{i=3TMx~<+nnc&2;WtEX}RbMzITIuRDM>B9=4=#W(rT+4GWa8ct54! zrG@?Wy6+jQ!=wI+2-FsEc7o#P=5hS7TEZDPMv+=`T=GB!WA_3UT-Ozt))rIRe1{%tcVte@6JOS1Mk}ly z@ivC(US9cwA{CnTc%59<^baH?y=``e%SIW^(#$q2tJ3r{)o$<7p1FV37@5#To}ed- z%*Xn*_R@{6c#~GS&$?S6tGGDp(&nw-_rds)H!(`|F|DXJrb{X}BQRE31@Y>m<8&^CRD4;}7^8MAk_RGq zxr%N_$gvM$peNLNOV}hJ+j#dzPEONfG+mC}{FjpKtqgk^`;Id@@y_|R@U0c0`p0%A z(c7O09N!2VOm>b+8CYtuM?R-te6OzaqikuWoA*0Ewl#f^{~x;o3JTaMD##5bkG1K2 zK^Gm-pZQk4!FYe3AF7<6&FyN2I?rU=8gPv{MN*2dPZ{c(ewN~D4xfUr z-Fh5uC8jpE%jR}vrb)9>$VuyLkN{rec>2U4KzOiu`v(0;Y}?zK*3^QK&&3KOMM>X| zzorRzc5AQH7)eb)sk!oL1%YkDk^m3$5Ip*I?J`=a`8X0*0Lg-U(waXuIZ_ib+wv?CS`bJeJrz%H za(g(H{6OoePONdmPL9s(-K2uU$C$g06BaBe zkz)&Xu2#~pG^Uy6Syeojy4=AWL~hh*3ABauGvaKRQIgn1PL9KR)D3xzp0S|HonZkD$ZkY}ewjd= z??iOmnfGX?o3Sxv`ZN;OVrFe^J*E~pC`TbN(zse; zPSqfQ2O|3&!^yS#(`~fno~BQ4&*rJ8_2ynlpPuq|I`ejNSgJ!U)j=I0eohDbr>t(Y zu6HEhZ{H3DU9!<8{Bvn>xX0cMrn+-=4EG3?#0Nl}o<6;1XMgO%U$j(Ql3S1=6nC|J zXZmZT_G+KaqO^Wlr(54(W$L>Cez7E%qpg?IDEZoiD4k7V)T1x_onS( ztFW_uxPj{NCSC9VRLBu4+_*yf5reU_C;Y%c$CF^Inm9O zoMea}l@5fPo5I$cVMtx846MiMx5Y893H*Nlrjzw8Ohs>VD31sIe!LT{T@yK8q$MHc zz?D;^xo3OsVob69zTfCfy0Yaj`g4KPKtG)Eie&Rjl5jtr2|$vq!R!57KRW-s z?b`#~R$#n*aa(L0=s%6V=ugxQ1N}&0;IZdlzNX;gi!8lw9WSDldz}RIj~6cbIt9RW zMI~bYwBnZt!If4p2??-SH}T_4(OPnVJ3?2-qE~Cs3xBeQgwc;W)6e&J_XN9Aol`=Q z$Hz;pUE_3aD@mb9@6)}DzL+P_uU*e??J|f=y6I*CvQ57QK>2jn0_f)`TtJ!hu#@hl zG!`8U(-ACdo}zoAU}?FqyDco0Ja(@VeGpXHM*@JxXZHc<^F75g zFL?gRB?Rb?j9ft9at0MG|6ed2`rNQP5JCWbiW(Xjzt+ayrB*k_;iodo7 z187oKX__l9ZymSqJ3h!j2#X9P_|PCENBw4}yH386%|lkWcaz?wv`frmzjk#QK+W<<*P0eRMT!qXL&I=}v^W%1L(77Gb*%ex{l3w32EZlT{ zhhxXK&SOWDvd+L;>eT;p9XG2t00B@gz1rUu>7=gq~zS`@KJ+==OsP=)c~A? z+xcAjMu4knR2^u7-$=BI$}?7g8@i}v4oNybz94JxM3IWvE84Z=;+R+~a`M(@t^tqY z*Jnkc7y>YWDa8kbW0q1^f}>!fczLRhi;EYu$j%06@#ygd)0Vdc-ogH;tF8`S6%uBW z6&+i8?i}ENl7M@L)bx3H-6kAzn{I9b$TEg@>-jGS5cWgo)6ri-Z zL3%6>W6OQ2TZT(c`n{ZnfV=8@ESWXGJ)8M@BgD@Ek8@@aw-m|N5M-NxP;`_Xzitsdw>7UcO`4jj{X{4DuM-FI-2o}nRiES9|#2ZHTCMt&7Uj?h6@UX$` zI{AgUzT>uwvFf2U?oD}<$gBfOcREwYyV14|IJn{A_PmCtiE?%2rW=Tw!&JK6&v-{j0={3c*{=7UB0?Bg(`V!DKTX zYTWa<@@?Fn%1Mfk*lXnb??=epBq8c4>3547Bq44~kvKCw$Z3w@zn%_MRx76JWsU%( z`EWUL$N{DlEx|JDk?6ivJ>;{h)WyIVNz3f9vkm*h(m-NuObxtt$A0Mk`ixtiLs<-N zpXS`dJYe*^IuJK`UVQ|FNHzwR6OEIq1O7Z78{%g64eA&gyY-F!_zGm)0e8=+Q|wn3 zJw4*@!?CD&PMB*^ph?RZjdFSD^-w>0=+Bk>`{Zmq9*UcJ5BLv0@{VKhbRx3NsHQ$Y ztvKbQ`F=}SQ6gJp^!?W*4bl`RjQjem*BO?#nGKP?HBa~tKz@m)w_2T=#GTU*PgaLG zVT$Lc1&6CrDhB4L&hFS7-#!bYk~q%5w|u%b5E>HW*yPxppSR#jTgo7|6PhbT1^ zVJ$oXXVr&2yg16!PQ3yq-m{i6_;{(ot7JHvf^Fo6sFgwL z>wWr+jfPRiwN)#~!}eC zLojjfqk2Qhw#o{O++?>|Jhr*yA1f0RYwyerCGiarvntY<+&NpM7?L|rB z4}V9kWDLg`Kcpkt@*7A%&Z&LZOBNRuB)X~ zbZIOT{?L?7{7!q_vboMHA)hyO-I?`H0r*fvCZI$TL($T0joHAyJM8i*SX+sP6u@h2 zl1Yn2pR(BLVvEb)Du|7@luo`viA&8fL5=r5tt2Epyw!J!cD}O3sEqx}6p&uBqs1mB zF{|``N#gG^|CN3|mg-GR@8~f+rB$omMYAnlys8))5mnv|_28E?urpBJV1MlUJ*0TC}hU4C~ zjIG4dcXN|&hn7XX;R9ExbZ_fj`xGizrogEFVO*>3KnF1qQ>G0wrm`+M90nsj3V9TY zA5$ciqV;^DBYb>!!m+3T8+~Xuar%BW#%FNL*Jc!4xvg!qqat`WU4dS0>EiHbpuAVL z2m)be?cy4-I3KEdo^XTFnK~%I`LA?z1@6h$|4Bg(5KvKR>+3JQK9j7M*gP7XZS#Lf zclTv4-%ypkjq4rG@gJhAYm*3^KHWvmYm&!4I>X3QM8{)bH&r0ZG>Ec)j*i>>)V8V0 zH$k~qJ4cjo{ihNIGKrS8it|@)D6o_#!#D2rh+Fe?+F9xL`HI?B;Y%C-`U5CtIID}T zEM1cPmxl-bH#J1SIx<^=+G@0|svU7Ox_vWYeJZ|TxT^MzwyTvC^JwA9f=m8-<~8Bx zva++&nq`O*#-Z@(&(_bc-(>FYHq0?OaJ_zQSYy^I`;;={0kcPgGR@(({Yqfx?ekKp z{?sN;iv`ujN71U{%M zVvBShIm(w)-dNz#_VZ9$vpz(+9UzAADUyiGcYqVQznZ2>VBmtZj9gA;tH~{ym*BI6 zJKEa0=q(55t-a$V95rRu;b!GfUSi7k;8GKnmGm52p_5SJNSZPnVN>orT79lbHdv#` z^M#N64p*Q#=eyfF)g47iVS8Y!Z_WZ0Znnr00|(^?GIMH}=U<&sO6sHQXf&jZY7 zHUfdZkjq1DgvPKc2KH{>VAy0R2Ujm9wF9Hl%EMpnUC~mESI&6npU+OJv^=Ts8}wu| z@5lsnNX|7ggsi$Meg7UTcLgmpkV3Cq-a(A=S-G{o--EbMu({LVQ+b2lk(&G&gSB(L zxkm4~zTq~@Cvx}P=j~y(9{S;mm6{Y9HA2qV$1N|;<&myJcD71U%9{uBeTwq(H3qIG z8Xg+A$}XjSbG2b6DfJ8p zmH5msy+@foI7z<|#@={h^x)`WQ>`e>^YUv6SB{EtbC2=DP{d5XafN2a*>Prbg*lc9 zYriQ28N8JS&4~2%(fuT4>^9avFqFnw-NdHSncyU9QV|ioo?o`rW%n$4NpJ{rlC6ms z0#wUJx_!AebTp4W+NqVpjJKSAAL23180)_H$_5WKVSZJ$HN6Q}?>^^) z146f4D$ZQ>wBk@=m5+*Nm=mncvK&XiC3`LFW1GFvo*HSO61+^BC07LYuaI(NA|}sdKJKy7iV)rw469ZuwG;7L~)v zCHhMAVwlxdNuWmJFXiB<48%KEW#sPhMsr-rvdB2CnWur{6Ocs~yU2_-o1THxbo5!y zmKcYYq75=2h5bLj57B!mQnDmn2DRcMEbunG0L$gKb8@sLM5ZCJJP$YZuV_Jpp7o5z zX{5;aoUCG}B_??46@3>kpG%fg0OzlNw${M!Wzx4*sqnF3+$sG|awhz$14%KTxav$+ zNG)K6rSZ);qZEm0bLb?l{MnNvz_}5yc`sleI|9oPy$LFBxtA2wny+?np68^Z8m|vS z7l<8wQRgMUxj?}^L9E@tIx<D3>opX2U^D@vXHq+kd6{hNRkczfpQqaIb|X1ny7{$aWCV)jXU2YxsaEiIsO zu#|^DF_5ABItN>io>pXLTiJq49b}&I@i)|EN?O;cH}f0cnhR2Hxhyax1h@s}Po8t9C^Zp1WR6&koSNo-QoXf*PEyd+L;f>~}Sbw=XF2&zq7051_=pDsX{>IjJE3gk*0>9?kS|#uA`sc zX4BN1FE3&A7GLSMdx*t%2$m%vBWs8V2G|E=6ck`oS=-oZP?Y&?ilsBx=pMpkN*q0Y zicK_lVlLcY8rCP(cig^tiI4|i;H?ygT*&!!3uMZEs9^_l6#8h-a-Eng;;6O)aFJ>Fy7_huTk{cW@{SM z^ba&RlYi|%fO&h_8kY}lYZPX1aW^QvH)TTWTQTu1> zp*PoXL$;oyuZln5l_&ng?%ZD`vv7dJetxX5^*}aYQzJ&|wA_7AUYlRz)8;q{DSkM~ z#%=VT9W8*gvsHG@51GxDjEvVTn?XR-1 z*YUM1`|%`0J9o9s5;uzGwkb3pXKOG}8T7oe10RTbOkINA#|&*MZkYud`mWNi=cnd& zkn_K5ode2y{*;WWH<7pVigfbwR1mV16I&YQKAq=nnPaU^C$xW375}zfV{L7#Ovvlk zrk$DG;l`jUdpDuLJcCtR=%x-lbEF)m3!Q75vXi6iF(i}Uvm&S@$HK# z_T@Enjc@wZglzQ7wBBkEfR6#2e-!CmxP6@ah}IAWWpkG(j#Xu+34YW;%n%))MlYgy z)$W;%P#G=3{Y1`Mjw>-SE2JRlo&#?Q4xWBt=(T-4-Sh&cO6c=M&1a@gaE)>}dS=T5 zx!|O*{v|7s<8HU_?DKpDTa$vwNzPs_clBGIby3@p{A9uY?)N7~O>V*2?NhSNW^8;|0+0z%);qw2)?9JoWj z9UETGt82g`Vy1evZ*+e7sbWC|aO8cSY`DvihVygmHMF5 zW_hqg#5+WSChW_X*2NIaV+Z@{OCXO4y=&>m+cr>yiIu+WDo$t4;MtR^Va^OC~p<%@zO>a{go6!g?X+oIq@qd?(k0 z2jZP+Q=XY+30E(N;e)W6>U-p8zz3%f-_`7p&>!Owjn(8fu5(i|nZ(p@)!N42h_lfT z;fEXu``Y)-BLEJf^DSZ_6Y1&&Wv&yk+z}z593c5exDncB+c1lA$5i(YvY}GL6+8hp zCMK86%;uQ*pD-Zig?_2;W%k{iPF+suDh>PkQ-;QFe}NRiCE_Xg+OMUymnNR*b5%NtqwaU+hI*DkF(k~|u9`420#iB_jL3%J4?!L93?J)3tz zoE;*+mD?TYf$miO2MY@z9esUzjtQNG1!-zVMiIawyonSvAP8!5P}w$uPS$C@vaZWF z4UzI+m|qd9vu;5N?5Ibm?!; zwF(c=M(NFd3z^R+9MEjsf(9Z%B5B%KG)`J3Kqj=<1A7Jr+1*7K-EXiCG0n@g8O3W* z3z-FH*Uh zi{#zJN*|c%Jk-a0hsS@YS9TR}KGv(Q86+DXOj?p*1&rMvefmUR0AvISfa>S}5r6J) z7~!Kbz(p)H-m~Z;$3CrDAtCw}*#9Fpu9pCWPCq=2^u>gW#p}Fi(hncF{M2c1ZJQEc zd4R>%Gv-a4Z4gi4s)`Y6!)s1mc0)mKH&!AZ0M*uLmJnj1zJQ~Xo>k`iio!D%)WK(@ ze_Q;J_(TISi>rm5vg%QywUL#a)DsD$*D3Rsdk|J{0L>=k6wf50bfvXl(t61u*@A=m z#%Q6*)s;Vv(stp~m%`dRhRa4*W<~+UV$0~B_Vp;;%BBtLdQyUUzKkq(Nld0XF=Ck* zB`%)2|3#h!GsQHqb?rxQO>siVtnA%BFhGwnliQ$j-it!le@xh&pfs_Pj?2M#glHqn zEYVuBN_;|kuwt4R)|ge-(P4XfI%Vrdl$bhZgY!I)ZN@Fyy^G!kFB1y9jx)z14#q5- zb<1<16>gsH3|%$CdfvVah`&rIH)XqNO#R9(b`;QwfbLVahM0zDg7{4 zd#OGtVWmRumKX_~4J_VABlPC&n*wV*P?h#Yd9LB#ZXw}~Xoacfrp4A^iSA-4pDC7C zuTD6x3EU7WhXZe&{1Rsj!~^#fFw;*2#xrGxfI~&yctg+tbwJZTnVRuQzA}d_&GAOE zxFSRZ!)Qa@h;6CYo<0yxGCc55+bp2GVqSPR?Q04Z2vqz#QmWXKlZRfD;fBu96IDf? zM0X`ji%SIv;aZ+zuYee_%+!Ix56a;_&>S#~PpG!n%RjW7n5y)_>S>;HO9Hv%1Q%$6 zW+uJcXp~f$BVy#9Pv-R;=y=T4C&_!2>7RTWl3%GSzhIpeJ-N(JI)^E>_VpYyZN@UZ zF-^-Xwho!4&MNl6;|2;i+5lyliTFDJu+!VL2&NY)Bw-wxrKU>8pS}~`!N^8*L!?j? zuCca5fkW}G*CTs#-)>@efefoj(!6Qg zRKqnBaWr}4rf)5vVx6e=*4`tln7twmiMhbyW%|{Cc9ca>lQj2~##|rf%Z;W7{(}`t zK)f90Y?zW|#AtrhV^C;9!`6wThhqrqH>3xxt7@w_2e*l{7!fn89x&Umz4*k{|P+n~A7S3?T1Nc)r&e&L5a=MA>N0JGotsHd2Wytr^v8=JO@P-1w1d;Uy1N#&3~k3y3AP5&$wGV$?Jke#El>qkyV zk8LsAccPmjE{Ur~3W7Mn(z901(WUZ&-an+vFU<7Tl+wuw4pKOkK?Fj}{jD4tZqSS~ zg3A>izaF8UW2ux%$oM$sve3%F$G1WP8Yl;XjSC;)LNO)`tbLr&5LWk}=?ytrAEH4m zM;IVVE!D$^$7$P~Vy@C87uFID3$<-_$uk$5ZxGGXNh7PQ(cIlnPBW8VMabRb`KJ3s z_j58n5%Ar^@AlON#Lh-U2QHl2p0Ou?vAoG~MZ#B6!Vd$VZ5St~a|aFp9wmids=Azz z9Cs0`hY@Z!f4nP3--XcC8c zat1{|r&m8*5a5#!D3Bbz;6S@q zn;%I8@d--|uyBWQol66mXYWcJ4)nuQAz+TCI64U^K;m~@9qNFz>Zuf)6a>CQ4RwA}b;GvD+6%e;MqM&7e+&3CJLu;ALK=7!VAg4#M+&K-mo}rjIaE%$uWv?N&VSyvjXi0m z+)_YGKqpzx96dQ-i%Cfu%u%yR1a|O67x`&J06VckPb%Ozn%d1imzDI!8!~YxI}Iig z0<#W*d4x!XX;w2{qqZ(1%gmcBz-(?11Wz$fwD>WjL=9s0#&($QmZOpU2@Q+%{G@47 z_ndSR`HoTycR%a5h!%YO92J-=n2ng3gV&U~v}a2f{>OF4 zzB%(8UO}M3DI!wO*=qvYm-ky}u3xBytp%A!2g>>QcA{ujoPo`0DR-SifMpP#!w4C@ zt}jRL|HIW=I7HR8d&7W)fV7ArAu6Dx(jg!qASKPvA~z|b&sBT9D- z-Q6?f4BzH{&N=UMfBXT!UVH6pUDvPHaO6qDGe-3cR0lBlCxsx8liXau8-FxolgjlN zl8}ULZQnStqb84{)Qa6Npb#h^r5l^!?yV_NwJCY@>6ubfRDhOz(;yFVoBrj*lel%* zt4ea`TE4~31L{fBR9!$+X;BVTlfTqI7l~+QhkSj|7@?fy}hpuOD|?5{G*u2%305gDLZYc z|2OG6?Y4G48-!$H zU;5-n^izQDjePWsnI-wonQL4e=7*%#V&?i(nIs#xAVCe~&z~45K2qyV*}{gCNPim^ zDt`GG#~6vz5H4w2*b*&S*Pt0B%8>n?aAMH%Zez=)#HFSCreYM?o?8L1@^GNYkSh6= zZMNvei|c;~Es_NXdolv^5s`{_1ZD3fte4^%9^ma0pJ6l$BmRl`2eLN`~l*2C7z zi=J~pZcMzzm@s0!KK8=rf+U(+*0~ke?s~}SayD)qD{WhsODI+Fq+QJ7WB!fmGs7k4 z^?Ixsk$=CHU3ZU^Ksm-ZBR@4jq!r;lmC++{Ww!-D!$D*M5m!Ixxpd%MPUj{ovJj!H z>ag!662N{F^@x43LR?i##7G)!J1;<)iC!cYh9phW8^C!q8l?nRC7+hj1qNH zgvJKY6mIHOUy&y>x>F7)D-f?D!>?BN>scn-zd{+bVa)TQD z{5w&q7yJer_uqKKr>5Ty;KMV&&pcsZ~oAa+jkx3{E6o-Hx z!DTnk;r(X4RlBuBU>IHsIo$y@IYw3SxsreKXA*Urd*Pi-CUTkvur$3*-z{DtoxyGz1G z^7#6W>n?%9u5(2a9;@StmEK9$eO}_o+V67ENj2`5PfHqfu|G8dvd90f!M-7eYK!f} zd6UM1#L9dDji=LA>QaHaccbaKfYMg1v&6^_(k39UaX`XjtT}gUXxya?kK)ynHmzH$1-W`!B{q!c_LvaPDbZ-D`e}*x7OWm! zsVN$NEsck0ISIkK=A=qK6IJ>+$U9~=f&d1uu2Q6`x7uCyMxpjtfz`8ZkIfECY%Em( zgZ{tPnUhTrv^}lS)5}ZTZ=Uf-;^^H=vAKmWZ4OzrEtQV0|CDDf&WD$$M<6|1a-K(c zDafHoP*L`8)-Y*P^MnrfqbyJ0J2kqxpfI-nsIrTq@Td;-YOs}zo!0K}x28$U{y->Z zlLAbb)Xbt)yJ@CSjyY3psg9Bdua?`_K_Y+j&=mrHh+5m%q##ZA>c9dN(ZV=O+x+F( ziinb`my(<-3D(;u|1|p|(wF=2e2?_5@7CN!9gqpHoH+pPrz`#WU$xu|i8V z9(FxKN3HX$Wh_}A!Q)x@#hoFa!jLp()D+FZKN?YaFwU*t3;^?w7Qo>H4DM+_EnY!d z|EJQe0);0_~)qf``vvTWY0$c2*v{GuL1&bkqMDdJs=pV2(jmz;0iZD r){)T4F)Y{LbU=3nWozA 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

|0Tv-hsw2LPPcOI-PlvS5-)cg7}#)fTI2)_bIl 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

sHln|bOX$jA!6cdbGl?b4#D8PvXG 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 K$Q9l&5B@*a4$;;C literal 0 HcmV?d00001 diff --git a/DCVC-FM/checkpoints/download.py b/DCVC-FM/checkpoints/download.py new file mode 100644 index 0000000..36bbc2b --- /dev/null +++ b/DCVC-FM/checkpoints/download.py @@ -0,0 +1,21 @@ +import urllib.request + + +def download_one(url, target): + urllib.request.urlretrieve(url, target) + + +def main(): + urls = { + 'https://onedrive.live.com/download?cid=2866592D5C55DF8C&resid=2866592D5C55DF8C%211494&authkey=!AOxzcrEFT_h-iCk': 'cvpr2024_image.pth.tar', + 'https://onedrive.live.com/download?cid=2866592D5C55DF8C&resid=2866592D5C55DF8C%211493&authkey=!AFxYv6oK1o6GrZc': 'cvpr2024_video.pth.tar', + } + for url in urls: + target = urls[url] + print("downloading", target) + download_one(url, target) + print("downloaded", target) + + +if __name__ == "__main__": + main() diff --git a/DCVC-FM/dataset_config_example_rgb.json b/DCVC-FM/dataset_config_example_rgb.json new file mode 100644 index 0000000..9b8dbd4 --- /dev/null +++ b/DCVC-FM/dataset_config_example_rgb.json @@ -0,0 +1,100 @@ +{ + "root_path": "/media/data/", + "test_classes": { + "UVG": { + "test": 1, + "base_path": "UVG", + "src_type": "png", + "sequences": { + "Beauty_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "Bosphorus_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "HoneyBee_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "Jockey_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "ShakeNDry_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "YachtRide_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96} + } + }, + "MCL-JCV": { + "test": 1, + "base_path": "MCL-JCV", + "src_type": "png", + "sequences": { + "videoSRC01_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC02_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC03_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC04_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC05_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC06_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC07_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC08_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC09_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC10_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC11_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC12_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC13_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC14_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC15_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC16_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC17_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC18_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC19_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC20_1920x1080_25": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC21_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC22_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC23_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC24_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC25_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC26_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC27_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC28_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC29_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "videoSRC30_1920x1080_30": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96} + } + }, + "HEVC_B": { + "test": 1, + "base_path": "HEVC_B", + "src_type": "png", + "sequences": { + "BQTerrace_1920x1080_60": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "BasketballDrive_1920x1080_50": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "Cactus_1920x1080_50": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "Kimono1_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96}, + "ParkScene_1920x1080_24": {"width": 1920, "height": 1080, "frames": 96, "intra_period": 96} + } + }, + "HEVC_E": { + "test": 1, + "base_path": "HEVC_E", + "src_type": "png", + "sequences": { + "FourPeople_1280x720_60": {"width": 1280, "height": 720, "frames": 96, "intra_period": 96}, + "Johnny_1280x720_60": {"width": 1280, "height": 720, "frames": 96, "intra_period": 96}, + "KristenAndSara_1280x720_60": {"width": 1280, "height": 720, "frames": 96, "intra_period": 96} + } + }, + "HEVC_C": { + "test": 1, + "base_path": "HEVC_C", + "src_type": "png", + "sequences": { + "BQMall_832x480_60": {"width": 832, "height": 480, "frames": 96, "intra_period": 96}, + "BasketballDrill_832x480_50": {"width": 832, "height": 480, "frames": 96, "intra_period": 96}, + "PartyScene_832x480_50": {"width": 832, "height": 480, "frames": 96, "intra_period": 96}, + "RaceHorses_832x480_30": {"width": 832, "height": 480, "frames": 96, "intra_period": 96} + } + }, + "HEVC_D": { + "test": 1, + "base_path": "HEVC_D", + "src_type": "png", + "sequences": { + "BasketballPass_416x240_50": {"width": 416, "height": 240, "frames": 96, "intra_period": 96}, + "BlowingBubbles_416x240_50": {"width": 416, "height": 240, "frames": 96, "intra_period": 96}, + "BQSquare_416x240_60": {"width": 416, "height": 240, "frames": 96, "intra_period": 96}, + "RaceHorses_416x240_30": {"width": 416, "height": 240, "frames": 96, "intra_period": 96} + } + } + } +} diff --git a/DCVC-FM/dataset_config_example_yuv420.json b/DCVC-FM/dataset_config_example_yuv420.json new file mode 100644 index 0000000..d548014 --- /dev/null +++ b/DCVC-FM/dataset_config_example_yuv420.json @@ -0,0 +1,100 @@ +{ + "root_path": "/media/data/", + "test_classes": { + "UVG": { + "test": 1, + "base_path": "UVG", + "src_type": "yuv420", + "sequences": { + "Beauty_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "Jockey_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 300, "intra_period": -1}, + "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1} + } + }, + "MCL-JCV": { + "test": 1, + "base_path": "MCL-JCV", + "src_type": "yuv420", + "sequences": { + "videoSRC01_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC02_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC03_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC04_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC05_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC06_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC07_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC08_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC09_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC10_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC11_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC12_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC13_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC14_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC15_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC16_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC17_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC18_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC19_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC20_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC21_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC22_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC23_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC24_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC25_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC26_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC27_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC28_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC29_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC30_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1} + } + }, + "HEVC_B": { + "test": 1, + "base_path": "HEVC_B", + "src_type": "yuv420", + "sequences": { + "BQTerrace_1920x1080_60.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "BasketballDrive_1920x1080_50.yuv": {"width": 1920, "height": 1080, "frames": 500, "intra_period": -1}, + "Cactus_1920x1080_50.yuv": {"width": 1920, "height": 1080, "frames": 500, "intra_period": -1}, + "Kimono1_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 240, "intra_period": -1}, + "ParkScene_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 240, "intra_period": -1} + } + }, + "HEVC_E": { + "test": 1, + "base_path": "HEVC_E", + "src_type": "yuv420", + "sequences": { + "FourPeople_1280x720_60.yuv": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1}, + "Johnny_1280x720_60.yuv": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1}, + "KristenAndSara_1280x720_60.yuv": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1} + } + }, + "HEVC_C": { + "test": 1, + "base_path": "HEVC_C", + "src_type": "yuv420", + "sequences": { + "BQMall_832x480_60.yuv": {"width": 832, "height": 480, "frames": 600, "intra_period": -1}, + "BasketballDrill_832x480_50.yuv": {"width": 832, "height": 480, "frames": 500, "intra_period": -1}, + "PartyScene_832x480_50.yuv": {"width": 832, "height": 480, "frames": 500, "intra_period": -1}, + "RaceHorses_832x480_30.yuv": {"width": 832, "height": 480, "frames": 300, "intra_period": -1} + } + }, + "HEVC_D": { + "test": 1, + "base_path": "HEVC_D", + "src_type": "yuv420", + "sequences": { + "BasketballPass_416x240_50.yuv": {"width": 416, "height": 240, "frames": 500, "intra_period": -1}, + "BlowingBubbles_416x240_50.yuv": {"width": 416, "height": 240, "frames": 500, "intra_period": -1}, + "BQSquare_416x240_60.yuv": {"width": 416, "height": 240, "frames": 600, "intra_period": -1}, + "RaceHorses_416x240_30.yuv": {"width": 416, "height": 240, "frames": 300, "intra_period": -1} + } + } + } +} diff --git a/DCVC-FM/requirements.txt b/DCVC-FM/requirements.txt new file mode 100644 index 0000000..6c5a43b --- /dev/null +++ b/DCVC-FM/requirements.txt @@ -0,0 +1,8 @@ +numpy>=1.20.0 +scipy +matplotlib +torch>=2.0.0 +tensorboard +tqdm +bd-metric +ptflops diff --git a/DCVC-FM/src/cpp/3rdparty/CMakeLists.txt b/DCVC-FM/src/cpp/3rdparty/CMakeLists.txt new file mode 100644 index 0000000..8d94573 --- /dev/null +++ b/DCVC-FM/src/cpp/3rdparty/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +add_subdirectory(pybind11) diff --git a/DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt b/DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt new file mode 100644 index 0000000..3c88809 --- /dev/null +++ b/DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +configure_file(CMakeLists.txt.in pybind11-download/CMakeLists.txt) +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pybind11-download ) +if(result) + message(FATAL_ERROR "CMake step for pybind11 failed: ${result}") +endif() +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pybind11-download ) +if(result) + message(FATAL_ERROR "Build step for pybind11 failed: ${result}") +endif() + +add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/pybind11-src/ + ${CMAKE_CURRENT_BINARY_DIR}/pybind11-build/ + EXCLUDE_FROM_ALL) + +set(PYBIND11_INCLUDE + ${CMAKE_CURRENT_BINARY_DIR}/pybind11-src/include/ + CACHE INTERNAL "") diff --git a/DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt.in b/DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt.in new file mode 100644 index 0000000..936202e --- /dev/null +++ b/DCVC-FM/src/cpp/3rdparty/pybind11/CMakeLists.txt.in @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.6.3) + +project(pybind11-download NONE) + +include(ExternalProject) +if(IS_DIRECTORY "${PROJECT_BINARY_DIR}/3rdparty/pybind11/pybind11-src/include") + ExternalProject_Add(pybind11 + GIT_REPOSITORY https://github.com/pybind/pybind11.git + GIT_TAG v2.10.4 + GIT_SHALLOW 1 + SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/pybind11-src" + BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/pybind11-build" + DOWNLOAD_COMMAND "" + UPDATE_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +else() + ExternalProject_Add(pybind11 + GIT_REPOSITORY https://github.com/pybind/pybind11.git + GIT_TAG v2.10.4 + GIT_SHALLOW 1 + SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/pybind11-src" + BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/pybind11-build" + UPDATE_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +endif() diff --git a/DCVC-FM/src/cpp/CMakeLists.txt b/DCVC-FM/src/cpp/CMakeLists.txt new file mode 100644 index 0000000..06001c6 --- /dev/null +++ b/DCVC-FM/src/cpp/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +cmake_minimum_required (VERSION 3.6.3) +project (MLCodec) + +set(CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo" CACHE STRING "" FORCE) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# treat warning as error +if (MSVC) + add_compile_options(/W4 /WX) +else() + add_compile_options(-Wall -Wextra -pedantic -Werror) +endif() + +# The sequence is tricky, put 3rd party first +add_subdirectory(3rdparty) +add_subdirectory (ops) +add_subdirectory (rans) +add_subdirectory (py_rans) diff --git a/DCVC-FM/src/cpp/ops/CMakeLists.txt b/DCVC-FM/src/cpp/ops/CMakeLists.txt new file mode 100644 index 0000000..ed31abb --- /dev/null +++ b/DCVC-FM/src/cpp/ops/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +cmake_minimum_required(VERSION 3.7) +set(PROJECT_NAME MLCodec_CXX) +project(${PROJECT_NAME}) + +set(cxx_source + ops.cpp + ) + +set(include_dirs + ${CMAKE_CURRENT_SOURCE_DIR} + ${PYBIND11_INCLUDE} + ) + +pybind11_add_module(${PROJECT_NAME} ${cxx_source}) + +target_include_directories (${PROJECT_NAME} PUBLIC ${include_dirs}) + +# The post build argument is executed after make! +add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -E copy + "$" + "${CMAKE_CURRENT_SOURCE_DIR}/../../models/" +) diff --git a/DCVC-FM/src/cpp/ops/ops.cpp b/DCVC-FM/src/cpp/ops/ops.cpp new file mode 100644 index 0000000..9463ab7 --- /dev/null +++ b/DCVC-FM/src/cpp/ops/ops.cpp @@ -0,0 +1,91 @@ +/* Copyright 2020 InterDigital Communications, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include +#include +#include + +std::vector pmf_to_quantized_cdf(const std::vector &pmf, + int precision) { + /* NOTE(begaintj): ported from `ryg_rans` public implementation. Not optimal + * although it's only run once per model after training. See TF/compression + * implementation for an optimized version. */ + + std::vector cdf(pmf.size() + 1); + cdf[0] = 0; /* freq 0 */ + + std::transform(pmf.begin(), pmf.end(), cdf.begin() + 1, [=](float p) { + return static_cast(std::round(p * (1 << precision)) + 0.5); + }); + + const uint32_t total = std::accumulate(cdf.begin(), cdf.end(), 0); + + std::transform( + cdf.begin(), cdf.end(), cdf.begin(), [precision, total](uint32_t p) { + return static_cast((((1ull << precision) * p) / total)); + }); + + std::partial_sum(cdf.begin(), cdf.end(), cdf.begin()); + cdf.back() = 1 << precision; + + for (int i = 0; i < static_cast(cdf.size() - 1); ++i) { + if (cdf[i] == cdf[i + 1]) { + /* Try to steal frequency from low-frequency symbols */ + uint32_t best_freq = ~0u; + int best_steal = -1; + for (int j = 0; j < static_cast(cdf.size()) - 1; ++j) { + uint32_t freq = cdf[j + 1] - cdf[j]; + if (freq > 1 && freq < best_freq) { + best_freq = freq; + best_steal = j; + } + } + + assert(best_steal != -1); + + if (best_steal < i) { + for (int j = best_steal + 1; j <= i; ++j) { + cdf[j]--; + } + } else { + assert(best_steal > i); + for (int j = i + 1; j <= best_steal; ++j) { + cdf[j]++; + } + } + } + } + + assert(cdf[0] == 0); + assert(cdf.back() == (1u << precision)); + for (int i = 0; i < static_cast(cdf.size()) - 1; ++i) { + assert(cdf[i + 1] > cdf[i]); + } + + return cdf; +} + +PYBIND11_MODULE(MLCodec_CXX, m) { + m.attr("__name__") = "MLCodec_CXX"; + + m.doc() = "C++ utils"; + + m.def("pmf_to_quantized_cdf", &pmf_to_quantized_cdf, + "Return quantized CDF for a given PMF"); +} diff --git a/DCVC-FM/src/cpp/py_rans/CMakeLists.txt b/DCVC-FM/src/cpp/py_rans/CMakeLists.txt new file mode 100644 index 0000000..b99e3c6 --- /dev/null +++ b/DCVC-FM/src/cpp/py_rans/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +cmake_minimum_required(VERSION 3.7) +set(PROJECT_NAME MLCodec_rans) +project(${PROJECT_NAME}) + +set(py_rans_source + py_rans.h + py_rans.cpp + ) + +set(include_dirs + ${CMAKE_CURRENT_SOURCE_DIR} + ${PYBIND11_INCLUDE} + ) + +pybind11_add_module(${PROJECT_NAME} ${py_rans_source}) + +target_include_directories (${PROJECT_NAME} PUBLIC ${include_dirs}) +target_link_libraries (${PROJECT_NAME} LINK_PUBLIC Rans) + +# The post build argument is executed after make! +add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -E copy + "$" + "${CMAKE_CURRENT_SOURCE_DIR}/../../models/" +) diff --git a/DCVC-FM/src/cpp/py_rans/py_rans.cpp b/DCVC-FM/src/cpp/py_rans/py_rans.cpp new file mode 100644 index 0000000..0311b03 --- /dev/null +++ b/DCVC-FM/src/cpp/py_rans/py_rans.cpp @@ -0,0 +1,281 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "py_rans.h" + +#include +#include + +namespace py = pybind11; + +RansEncoder::RansEncoder(bool multiThread, int streamPart) { + bool useMultiThread = multiThread || streamPart > 1; + for (int i = 0; i < streamPart; i++) { + if (useMultiThread) { + m_encoders.push_back(std::make_shared()); + } else { + m_encoders.push_back(std::make_shared()); + } + } +} + +void RansEncoder::encode_with_indexes(const py::array_t &symbols, + const py::array_t &indexes, + const int cdf_group_index) { + py::buffer_info symbols_buf = symbols.request(); + py::buffer_info indexes_buf = indexes.request(); + int16_t *symbols_ptr = static_cast(symbols_buf.ptr); + int16_t *indexes_ptr = static_cast(indexes_buf.ptr); + + int encoderNum = static_cast(m_encoders.size()); + int symbolSize = static_cast(symbols.size()); + int eachSymbolSize = symbolSize / encoderNum; + int lastSymbolSize = symbolSize - eachSymbolSize * (encoderNum - 1); + for (int i = 0; i < encoderNum; i++) { + int currSymbolSize = i < encoderNum - 1 ? eachSymbolSize : lastSymbolSize; + int currOffset = i * eachSymbolSize; + auto copySize = sizeof(int16_t) * currSymbolSize; + auto vec_symbols = std::make_shared>(currSymbolSize); + memcpy(vec_symbols->data(), symbols_ptr + currOffset, copySize); + auto vec_indexes = std::make_shared>(eachSymbolSize); + memcpy(vec_indexes->data(), indexes_ptr + currOffset, copySize); + m_encoders[i]->encode_with_indexes(vec_symbols, vec_indexes, + cdf_group_index); + } +} + +int RansEncoder::add_cdf(const py::array_t &cdfs, + const py::array_t &cdfs_sizes, + const py::array_t &offsets) { + py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); + py::buffer_info offsets_buf = offsets.request(); + int32_t *cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); + int32_t *offsets_ptr = static_cast(offsets_buf.ptr); + + int cdf_num = static_cast(cdfs_sizes.size()); + auto vec_cdfs_sizes = std::make_shared>(cdf_num); + memcpy(vec_cdfs_sizes->data(), cdfs_sizes_ptr, sizeof(int32_t) * cdf_num); + auto vec_offsets = std::make_shared>(offsets.size()); + memcpy(vec_offsets->data(), offsets_ptr, sizeof(int32_t) * offsets.size()); + + int per_vector_size = static_cast(cdfs.size() / cdf_num); + auto vec_cdfs = std::make_shared>>(cdf_num); + auto cdfs_raw = cdfs.unchecked<2>(); + for (int i = 0; i < cdf_num; i++) { + std::vector t(per_vector_size); + memcpy(t.data(), cdfs_raw.data(i, 0), sizeof(int32_t) * per_vector_size); + vec_cdfs->at(i) = t; + } + + int encoderNum = static_cast(m_encoders.size()); + int cdfIdx = 0; + for (int i = 0; i < encoderNum; i++) { + cdfIdx = m_encoders[i]->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); + } + return cdfIdx; +} + +void RansEncoder::empty_cdf_buffer() { + int encoderNum = static_cast(m_encoders.size()); + for (int i = 0; i < encoderNum; i++) { + m_encoders[i]->empty_cdf_buffer(); + } +} + +void RansEncoder::flush() { + for (auto encoder : m_encoders) { + encoder->flush(); + } +} + +py::array_t RansEncoder::get_encoded_stream() { + std::vector> results; + int maximumSize = 0; + int totalSize = 0; + int encoderNumber = static_cast(m_encoders.size()); + for (int i = 0; i < encoderNumber; i++) { + std::vector result = m_encoders[i]->get_encoded_stream(); + results.push_back(result); + int nbytes = static_cast(result.size()); + if (i < encoderNumber - 1 && nbytes > maximumSize) { + maximumSize = nbytes; + } + totalSize += nbytes; + } + + int overhead = 1; + int perStreamHeader = maximumSize > 65535 ? 4 : 2; + if (encoderNumber > 1) { + overhead += ((encoderNumber - 1) * perStreamHeader); + } + + py::array_t stream(totalSize + overhead); + py::buffer_info stream_buf = stream.request(); + uint8_t *stream_ptr = static_cast(stream_buf.ptr); + + uint8_t flag = static_cast(((encoderNumber - 1) << 4) + + (perStreamHeader == 2 ? 1 : 0)); + memcpy(stream_ptr, &flag, 1); + for (int i = 0; i < encoderNumber - 1; i++) { + if (perStreamHeader == 2) { + uint16_t streamSizes = static_cast(results[i].size()); + memcpy(stream_ptr + 1 + 2 * i, &streamSizes, 2); + } else { + uint32_t streamSizes = static_cast(results[i].size()); + memcpy(stream_ptr + 1 + 4 * i, &streamSizes, 4); + } + } + + int offset = overhead; + for (int i = 0; i < encoderNumber; i++) { + int nbytes = static_cast(results[i].size()); + memcpy(stream_ptr + offset, results[i].data(), nbytes); + offset += nbytes; + } + return stream; +} + +void RansEncoder::reset() { + for (auto encoder : m_encoders) { + encoder->reset(); + } +} + +RansDecoder::RansDecoder(int streamPart) { + for (int i = 0; i < streamPart; i++) { + m_decoders.push_back(std::make_shared()); + } +} + +void RansDecoder::set_stream(const py::array_t &encoded) { + py::buffer_info encoded_buf = encoded.request(); + uint8_t flag = *(static_cast(encoded_buf.ptr)); + int numberOfStreams = (flag >> 4) + 1; + + uint8_t perStreamSizeLength = (flag & 0x0f) == 1 ? 2 : 4; + std::vector streamSizes; + int offset = 1; + int totalSize = 0; + for (int i = 0; i < numberOfStreams - 1; i++) { + uint8_t *currPos = static_cast(encoded_buf.ptr) + offset; + if (perStreamSizeLength == 2) { + uint16_t streamSize = *(reinterpret_cast(currPos)); + offset += 2; + streamSizes.push_back(streamSize); + totalSize += streamSize; + } else { + uint32_t streamSize = *(reinterpret_cast(currPos)); + offset += 4; + streamSizes.push_back(streamSize); + totalSize += streamSize; + } + } + streamSizes.push_back(static_cast(encoded.size()) - offset - totalSize); + for (int i = 0; i < numberOfStreams; i++) { + auto stream = std::make_shared>(streamSizes[i]); + memcpy(stream->data(), static_cast(encoded_buf.ptr) + offset, + streamSizes[i]); + m_decoders[i]->set_stream(stream); + offset += streamSizes[i]; + } +} + +py::array_t +RansDecoder::decode_stream(const py::array_t &indexes, + const int cdf_group_index) { + py::buffer_info indexes_buf = indexes.request(); + int16_t *indexes_ptr = static_cast(indexes_buf.ptr); + + int decoderNum = static_cast(m_decoders.size()); + int indexSize = static_cast(indexes.size()); + int eachSymbolSize = indexSize / decoderNum; + int lastSymbolSize = indexSize - eachSymbolSize * (decoderNum - 1); + + std::vector>> results; + + for (int i = 0; i < decoderNum; i++) { + int currSymbolSize = i < decoderNum - 1 ? eachSymbolSize : lastSymbolSize; + int copySize = sizeof(int16_t) * currSymbolSize; + auto vec_indexes = std::make_shared>(currSymbolSize); + memcpy(vec_indexes->data(), indexes_ptr + i * eachSymbolSize, copySize); + + std::shared_future> result = + std::async(std::launch::async, [=]() { + return m_decoders[i]->decode_stream(vec_indexes, cdf_group_index); + }); + results.push_back(result); + } + + py::array_t output(indexes.size()); + py::buffer_info buf = output.request(); + int offset = 0; + for (int i = 0; i < decoderNum; i++) { + std::vector result = results[i].get(); + int resultSize = static_cast(result.size()); + int copySize = sizeof(int16_t) * resultSize; + memcpy(static_cast(buf.ptr) + offset, result.data(), copySize); + offset += resultSize; + } + + return output; +} + +int RansDecoder::add_cdf(const py::array_t &cdfs, + const py::array_t &cdfs_sizes, + const py::array_t &offsets) { + py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); + py::buffer_info offsets_buf = offsets.request(); + int32_t *cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); + int32_t *offsets_ptr = static_cast(offsets_buf.ptr); + + int cdf_num = static_cast(cdfs_sizes.size()); + auto vec_cdfs_sizes = std::make_shared>(cdf_num); + memcpy(vec_cdfs_sizes->data(), cdfs_sizes_ptr, sizeof(int32_t) * cdf_num); + auto vec_offsets = std::make_shared>(offsets.size()); + memcpy(vec_offsets->data(), offsets_ptr, sizeof(int32_t) * offsets.size()); + + int per_vector_size = static_cast(cdfs.size() / cdf_num); + auto vec_cdfs = std::make_shared>>(cdf_num); + auto cdfs_raw = cdfs.unchecked<2>(); + for (int i = 0; i < cdf_num; i++) { + std::vector t(per_vector_size); + memcpy(t.data(), cdfs_raw.data(i, 0), sizeof(int32_t) * per_vector_size); + vec_cdfs->at(i) = t; + } + int decoderNum = static_cast(m_decoders.size()); + int cdfIdx = 0; + for (int i = 0; i < decoderNum; i++) { + cdfIdx = m_decoders[i]->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); + } + + return cdfIdx; +} + +void RansDecoder::empty_cdf_buffer() { + int decoderNum = static_cast(m_decoders.size()); + for (int i = 0; i < decoderNum; i++) { + m_decoders[i]->empty_cdf_buffer(); + } +} + +PYBIND11_MODULE(MLCodec_rans, m) { + m.attr("__name__") = "MLCodec_rans"; + + m.doc() = "range Asymmetric Numeral System python bindings"; + + py::class_(m, "RansEncoder") + .def(py::init()) + .def("encode_with_indexes", &RansEncoder::encode_with_indexes) + .def("flush", &RansEncoder::flush) + .def("get_encoded_stream", &RansEncoder::get_encoded_stream) + .def("reset", &RansEncoder::reset) + .def("add_cdf", &RansEncoder::add_cdf) + .def("empty_cdf_buffer", &RansEncoder::empty_cdf_buffer); + + py::class_(m, "RansDecoder") + .def(py::init()) + .def("set_stream", &RansDecoder::set_stream) + .def("decode_stream", &RansDecoder::decode_stream) + .def("add_cdf", &RansDecoder::add_cdf) + .def("empty_cdf_buffer", &RansDecoder::empty_cdf_buffer); +} diff --git a/DCVC-FM/src/cpp/py_rans/py_rans.h b/DCVC-FM/src/cpp/py_rans/py_rans.h new file mode 100644 index 0000000..39045b4 --- /dev/null +++ b/DCVC-FM/src/cpp/py_rans/py_rans.h @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once +#include "rans.h" +#include +#include + +namespace py = pybind11; + +// the classes in this file only perform the type conversion +// from python type (numpy) to C++ type (vector) +class RansEncoder { +public: + RansEncoder(bool multiThread, int streamPart); + + RansEncoder(const RansEncoder &) = delete; + RansEncoder(RansEncoder &&) = delete; + RansEncoder &operator=(const RansEncoder &) = delete; + RansEncoder &operator=(RansEncoder &&) = delete; + + void encode_with_indexes(const py::array_t &symbols, + const py::array_t &indexes, + const int cdf_group_index); + void flush(); + py::array_t get_encoded_stream(); + void reset(); + int add_cdf(const py::array_t &cdfs, + const py::array_t &cdfs_sizes, + const py::array_t &offsets); + void empty_cdf_buffer(); + +private: + std::vector> m_encoders; +}; + +class RansDecoder { +public: + RansDecoder(int streamPart); + + RansDecoder(const RansDecoder &) = delete; + RansDecoder(RansDecoder &&) = delete; + RansDecoder &operator=(const RansDecoder &) = delete; + RansDecoder &operator=(RansDecoder &&) = delete; + + void set_stream(const py::array_t &); + + py::array_t decode_stream(const py::array_t &indexes, + const int cdf_group_index); + int add_cdf(const py::array_t &cdfs, + const py::array_t &cdfs_sizes, + const py::array_t &offsets); + void empty_cdf_buffer(); + +private: + std::vector> m_decoders; +}; diff --git a/DCVC-FM/src/cpp/rans/CMakeLists.txt b/DCVC-FM/src/cpp/rans/CMakeLists.txt new file mode 100644 index 0000000..ea23ba6 --- /dev/null +++ b/DCVC-FM/src/cpp/rans/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +cmake_minimum_required(VERSION 3.7) +set(PROJECT_NAME Rans) +project(${PROJECT_NAME}) + +set(rans_source + rans_byte.h + rans.h + rans.cpp + ) + +set(include_dirs + ${CMAKE_CURRENT_SOURCE_DIR} + ${RYG_RANS_INCLUDE} + ) + +if (NOT MSVC) + add_compile_options(-fPIC) +endif() +add_library (${PROJECT_NAME} ${rans_source}) +target_include_directories (${PROJECT_NAME} PUBLIC ${include_dirs}) diff --git a/DCVC-FM/src/cpp/rans/rans.cpp b/DCVC-FM/src/cpp/rans/rans.cpp new file mode 100644 index 0000000..14dc46c --- /dev/null +++ b/DCVC-FM/src/cpp/rans/rans.cpp @@ -0,0 +1,362 @@ +/* Copyright 2020 InterDigital Communications, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Rans64 extensions from: + * https://fgiesen.wordpress.com/2015/12/21/rans-in-practice/ + * Unbounded range coding from: + * https://github.com/tensorflow/compression/blob/master/tensorflow_compression/cc/kernels/unbounded_index_range_coding_kernels.cc + **/ + +#include "rans.h" + +#include +#include +#include + +/* probability range, this could be a parameter... */ +constexpr int precision = 16; + +constexpr uint16_t bypass_precision = 2; /* number of bits in bypass mode */ +constexpr uint16_t max_bypass_val = (1 << bypass_precision) - 1; +namespace { + +inline void RansEncPutBits(RansState *r, uint8_t **pptr, uint32_t val, + uint32_t nbits) { + assert(nbits <= 8); + assert(val < (1u << nbits)); + + uint32_t x = *r; + uint32_t freq = 1 << (precision - nbits); + // uint32_t x_max = + //((RANS_BYTE_L >> precision) << 8) * freq; // this turns into a shift. + uint32_t x_max = freq << 15; + while (x >= x_max) { + *(--(*pptr)) = static_cast(x & 0xff); + x >>= 8; + } + + *r = (x << nbits) | val; +} + +inline uint32_t RansDecGetBits(RansState *r, uint8_t **pptr, uint32_t n_bits) { + uint32_t x = *r; + uint32_t val = x & ((1u << n_bits) - 1); + + /* Re-normalize */ + x = x >> n_bits; + if (x < RANS_BYTE_L) { + x = (x << 8) | **pptr; + *pptr += 1; + RansAssert(x >= RANS_BYTE_L); + } + + *r = x; + + return val; +} +} // namespace + +int RansEncoderLib::add_cdf( + const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets) { + + auto ransSymbols = + std::make_shared>>(cdfs->size()); + for (int i = 0; i < static_cast(cdfs->size()); i++) { + const int32_t *cdf = cdfs->at(i).data(); + std::vector ransSym(cdfs->at(i).size()); + const int ransSize = static_cast(ransSym.size() - 1); + for (int j = 0; j < ransSize; j++) { + ransSym[j] = RansSymbol({static_cast(cdf[j]), + static_cast(cdf[j + 1] - cdf[j])}); + } + ransSymbols->at(i) = ransSym; + } + + _ransSymbols.push_back(ransSymbols); + _cdfs_sizes.push_back(cdfs_sizes); + _offsets.push_back(offsets); + return static_cast(_ransSymbols.size()) - 1; +} + +void RansEncoderLib::empty_cdf_buffer() { + _ransSymbols.clear(); + _cdfs_sizes.clear(); + _offsets.clear(); +} + +void RansEncoderLib::encode_with_indexes( + const std::shared_ptr> symbols, + const std::shared_ptr> indexes, + const int cdf_group_index) { + + // backward loop on symbols from the end; + const int16_t *symbols_ptr = symbols->data(); + const int16_t *indexes_ptr = indexes->data(); + const int32_t *cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); + const int32_t *offsets_ptr = _offsets[cdf_group_index]->data(); + const int symbol_size = static_cast(symbols->size()); + _syms.reserve(symbol_size * 3 / 2); + auto ransSymbols = _ransSymbols[cdf_group_index]; + + for (int i = 0; i < symbol_size; ++i) { + const int32_t cdf_idx = indexes_ptr[i]; + if (cdf_idx < 0) { + continue; + } + const int32_t max_value = cdfs_sizes_ptr[cdf_idx] - 2; + int32_t value = symbols_ptr[i] - offsets_ptr[cdf_idx]; + + uint32_t raw_val = 0; + if (value < 0) { + raw_val = -2 * value - 1; + value = max_value; + } else if (value >= max_value) { + raw_val = 2 * (value - max_value); + value = max_value; + } + + _syms.push_back(ransSymbols->at(cdf_idx)[value]); + + /* Bypass coding mode (value == max_value -> sentinel flag) */ + if (value == max_value) { + /* Determine the number of bypasses (in bypass_precision size) needed to + * encode the raw value. */ + int32_t n_bypass = 0; + while ((raw_val >> (n_bypass * bypass_precision)) != 0) { + ++n_bypass; + } + + /* Encode number of bypasses */ + int32_t val = n_bypass; + while (val >= max_bypass_val) { + _syms.push_back({max_bypass_val, 0}); + val -= max_bypass_val; + } + _syms.push_back({static_cast(val), 0}); + + /* Encode raw value */ + for (int32_t j = 0; j < n_bypass; ++j) { + const int32_t val1 = + (raw_val >> (j * bypass_precision)) & max_bypass_val; + _syms.push_back({static_cast(val1), 0}); + } + } + } +} + +void RansEncoderLib::flush() { + RansState rans; + RansEncInit(&rans); + + std::vector output(_syms.size()); // too much space ? + uint8_t *ptrEnd = output.data() + output.size(); + uint8_t *ptr = ptrEnd; + assert(ptr != nullptr); + + for (auto it = _syms.rbegin(); it < _syms.rend(); it++) { + const RansSymbol sym = *it; + + if (sym.range != 0) { + RansEncPut(&rans, &ptr, sym.start, sym.range, precision); + } else { + // unlikely... + RansEncPutBits(&rans, &ptr, sym.start, bypass_precision); + } + } + + RansEncFlush(&rans, &ptr); + + const int nbytes = static_cast(std::distance(ptr, ptrEnd)); + + _stream.resize(nbytes); + memcpy(_stream.data(), ptr, nbytes); +} + +std::vector RansEncoderLib::get_encoded_stream() { return _stream; } + +void RansEncoderLib::reset() { _syms.clear(); } + +RansEncoderLibMultiThread::RansEncoderLibMultiThread() + : RansEncoderLib(), m_finish(false), m_result_ready(false), + m_thread(std::thread(&RansEncoderLibMultiThread::worker, this)) {} + +RansEncoderLibMultiThread::~RansEncoderLibMultiThread() { + { + std::lock_guard lk(m_mutex_pending); + std::lock_guard lk1(m_mutex_result); + m_finish = true; + } + m_cv_pending.notify_one(); + m_cv_result.notify_one(); + m_thread.join(); +} + +void RansEncoderLibMultiThread::encode_with_indexes( + const std::shared_ptr> symbols, + const std::shared_ptr> indexes, + const int cdf_group_index) { + PendingTask p; + p.workType = WorkType::Encode; + p.symbols = symbols; + p.indexes = indexes; + p.cdf_group_index = cdf_group_index; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push_back(p); + } + m_cv_pending.notify_one(); +} + +void RansEncoderLibMultiThread::flush() { + PendingTask p; + p.workType = WorkType::Flush; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push_back(p); + } + m_cv_pending.notify_one(); +} + +std::vector RansEncoderLibMultiThread::get_encoded_stream() { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + return RansEncoderLib::get_encoded_stream(); +} + +void RansEncoderLibMultiThread::reset() { + RansEncoderLib::reset(); + std::lock_guard lk(m_mutex_result); + m_result_ready = false; +} + +void RansEncoderLibMultiThread::worker() { + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending.size() > 0 || m_finish; }); + if (m_finish) { + lk.unlock(); + break; + } + if (m_pending.size() == 0) { + lk.unlock(); + // std::cout << "contine in worker" << std::endl; + continue; + } + while (m_pending.size() > 0) { + auto p = m_pending.front(); + m_pending.pop_front(); + lk.unlock(); + if (p.workType == WorkType::Encode) { + RansEncoderLib::encode_with_indexes(p.symbols, p.indexes, + p.cdf_group_index); + } else if (p.workType == WorkType::Flush) { + RansEncoderLib::flush(); + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + } + lk.lock(); + } + lk.unlock(); + } +} + +void RansDecoderLib::set_stream( + const std::shared_ptr> encoded) { + _stream = encoded; + _ptr8 = (uint8_t *)(_stream->data()); + RansDecInit(&_rans, &_ptr8); +} + +int RansDecoderLib::add_cdf( + const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets) { + _cdfs.push_back(cdfs); + _cdfs_sizes.push_back(cdfs_sizes); + _offsets.push_back(offsets); + return static_cast(_cdfs.size()) - 1; +} + +void RansDecoderLib::empty_cdf_buffer() { + _cdfs.clear(); + _cdfs_sizes.clear(); + _offsets.clear(); +} + +std::vector RansDecoderLib::decode_stream( + const std::shared_ptr> indexes, + const int cdf_group_index) { + + int index_size = static_cast(indexes->size()); + std::vector output(index_size); + + int16_t *outout_ptr = output.data(); + const int16_t *indexes_ptr = indexes->data(); + const int32_t *cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); + const int32_t *offsets_ptr = _offsets[cdf_group_index]->data(); + const auto &cdfs = _cdfs[cdf_group_index]; + for (int i = 0; i < index_size; ++i) { + const int32_t cdf_idx = indexes_ptr[i]; + if (cdf_idx < 0) { + outout_ptr[i] = 0; + continue; + } + const int32_t *cdf = cdfs->at(cdf_idx).data(); + const int32_t max_value = cdfs_sizes_ptr[cdf_idx] - 2; + const uint32_t cum_freq = RansDecGet(&_rans, precision); + + const auto cdf_end = cdf + cdfs_sizes_ptr[cdf_idx]; + const auto it = std::find_if(cdf, cdf_end, [cum_freq](int v) { + return static_cast(v) > cum_freq; + }); + const uint32_t s = static_cast(std::distance(cdf, it) - 1); + + RansDecAdvance(&_rans, &_ptr8, cdf[s], cdf[s + 1] - cdf[s], precision); + + int32_t value = static_cast(s); + + if (value == max_value) { + /* Bypass decoding mode */ + int32_t val = RansDecGetBits(&_rans, &_ptr8, bypass_precision); + int32_t n_bypass = val; + + while (val == max_bypass_val) { + val = RansDecGetBits(&_rans, &_ptr8, bypass_precision); + n_bypass += val; + } + + int32_t raw_val = 0; + for (int j = 0; j < n_bypass; ++j) { + val = RansDecGetBits(&_rans, &_ptr8, bypass_precision); + raw_val |= val << (j * bypass_precision); + } + value = raw_val >> 1; + if (raw_val & 1) { + value = -value - 1; + } else { + value += max_value; + } + } + + const int32_t offset = offsets_ptr[cdf_idx]; + outout_ptr[i] = static_cast(value + offset); + } + return output; +} diff --git a/DCVC-FM/src/cpp/rans/rans.h b/DCVC-FM/src/cpp/rans/rans.h new file mode 100644 index 0000000..2837c17 --- /dev/null +++ b/DCVC-FM/src/cpp/rans/rans.h @@ -0,0 +1,152 @@ +/* Copyright 2020 InterDigital Communications, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#pragma GCC diagnostic ignored "-Wsign-compare" +#endif + +#ifdef _MSC_VER +#pragma warning(disable : 4244) +#endif + +#include "rans_byte.h" + +#ifdef _MSC_VER +#pragma warning(default : 4244) +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + +struct RansSymbol { + uint16_t start; + uint16_t range; // range for normal coding and 0 for bypass coding +}; + +enum class WorkType { + Encode, + Flush, +}; + +struct PendingTask { + WorkType workType; + std::shared_ptr> symbols; + std::shared_ptr> indexes; + int cdf_group_index{0}; +}; + +/* NOTE: Warning, we buffer everything for now... In case of large files we + * should split the bitstream into chunks... Or for a memory-bounded encoder + **/ +class RansEncoderLib { +public: + RansEncoderLib() {} + virtual ~RansEncoderLib() = default; + + RansEncoderLib(const RansEncoderLib &) = delete; + RansEncoderLib(RansEncoderLib &&) = delete; + RansEncoderLib &operator=(const RansEncoderLib &) = delete; + RansEncoderLib &operator=(RansEncoderLib &&) = delete; + + virtual void + encode_with_indexes(const std::shared_ptr> symbols, + const std::shared_ptr> indexes, + const int cdf_group_index); + virtual void flush(); + virtual std::vector get_encoded_stream(); + virtual void reset(); + virtual int + add_cdf(const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets); + virtual void empty_cdf_buffer(); + +private: + std::vector _syms; + std::vector _stream; + + std::vector>>> + _ransSymbols; + std::vector>> _cdfs_sizes; + std::vector>> _offsets; +}; + +class RansEncoderLibMultiThread : public RansEncoderLib { +public: + RansEncoderLibMultiThread(); + virtual ~RansEncoderLibMultiThread(); + + virtual void + encode_with_indexes(const std::shared_ptr> symbols, + const std::shared_ptr> indexes, + const int cdf_group_index) override; + virtual void flush() override; + virtual std::vector get_encoded_stream() override; + virtual void reset() override; + + void worker(); + +private: + bool m_finish; + bool m_result_ready; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + std::list m_pending; +}; + +class RansDecoderLib { +public: + RansDecoderLib() {} + virtual ~RansDecoderLib() = default; + + RansDecoderLib(const RansDecoderLib &) = delete; + RansDecoderLib(RansDecoderLib &&) = delete; + RansDecoderLib &operator=(const RansDecoderLib &) = delete; + RansDecoderLib &operator=(RansDecoderLib &&) = delete; + + void set_stream(const std::shared_ptr> encoded); + + std::vector + decode_stream(const std::shared_ptr> indexes, + const int cdf_group_index); + + virtual int + add_cdf(const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets); + virtual void empty_cdf_buffer(); + +private: + RansState _rans; + uint8_t *_ptr8; + std::shared_ptr> _stream; + + std::vector>>> _cdfs; + std::vector>> _cdfs_sizes; + std::vector>> _offsets; +}; diff --git a/DCVC-FM/src/cpp/rans/rans_byte.h b/DCVC-FM/src/cpp/rans/rans_byte.h new file mode 100644 index 0000000..4d42339 --- /dev/null +++ b/DCVC-FM/src/cpp/rans/rans_byte.h @@ -0,0 +1,155 @@ +// The code is from https://github.com/rygorous/ryg_rans +// The original lisence is below. + +// To the extent possible under law, Fabian Giesen has waived all +// copyright and related or neighboring rights to ryg_rans, as +// per the terms of the CC0 license: + +// https://creativecommons.org/publicdomain/zero/1.0 + +// This work is published from the United States. + +// Simple byte-aligned rANS encoder/decoder - public domain - Fabian 'ryg' +// Giesen 2014 +// +// Not intended to be "industrial strength"; just meant to illustrate the +// general idea. + +#pragma once + +#include + +#ifdef assert +#define RansAssert assert +#else +#define RansAssert(x) +#endif + +// READ ME FIRST: +// +// This is designed like a typical arithmetic coder API, but there's three +// twists you absolutely should be aware of before you start hacking: +// +// 1. You need to encode data in *reverse* - last symbol first. rANS works +// like a stack: last in, first out. +// 2. Likewise, the encoder outputs bytes *in reverse* - that is, you give +// it a pointer to the *end* of your buffer (exclusive), and it will +// slowly move towards the beginning as more bytes are emitted. +// 3. Unlike basically any other entropy coder implementation you might +// have used, you can interleave data from multiple independent rANS +// encoders into the same bytestream without any extra signaling; +// you can also just write some bytes by yourself in the middle if +// you want to. This is in addition to the usual arithmetic encoder +// property of being able to switch models on the fly. Writing raw +// bytes can be useful when you have some data that you know is +// incompressible, and is cheaper than going through the rANS encode +// function. Using multiple rANS coders on the same byte stream wastes +// a few bytes compared to using just one, but execution of two +// independent encoders can happen in parallel on superscalar and +// Out-of-Order CPUs, so this can be *much* faster in tight decoding +// loops. +// +// This is why all the rANS functions take the write pointer as an +// argument instead of just storing it in some context struct. + +// -------------------------------------------------------------------------- + +// L ('l' in the paper) is the lower bound of our normalization interval. +// Between this and our byte-aligned emission, we use 31 (not 32!) bits. +// This is done intentionally because exact reciprocals for 31-bit uints +// fit in 32-bit uints: this permits some optimizations during encoding. +#define RANS_BYTE_L (1u << 23) // lower bound of our normalization interval + +// State for a rANS encoder. Yep, that's all there is to it. +typedef uint32_t RansState; + +// Initialize a rANS encoder. +static inline void RansEncInit(RansState *r) { *r = RANS_BYTE_L; } + +// Renormalize the encoder. Internal function. +static inline RansState RansEncRenorm(RansState x, uint8_t **pptr, + uint32_t freq, uint32_t scale_bits) { + (void)scale_bits; + // const uint32_t x_max = ((RANS_BYTE_L >> scale_bits) << 8) * freq; // this + // turns into a shift. + const uint32_t x_max = freq << 15; + while (x >= x_max) { + *(--(*pptr)) = static_cast(x & 0xff); + x >>= 8; + } + return x; +} + +// Encodes a single symbol with range start "start" and frequency "freq". +// All frequencies are assumed to sum to "1 << scale_bits", and the +// resulting bytes get written to ptr (which is updated). +// +// NOTE: With rANS, you need to encode symbols in *reverse order*, i.e. from +// beginning to end! Likewise, the output bytestream is written *backwards*: +// ptr starts pointing at the end of the output buffer and keeps decrementing. +static inline void RansEncPut(RansState *r, uint8_t **pptr, uint32_t start, + uint32_t freq, uint32_t scale_bits) { + // renormalize + RansState x = RansEncRenorm(*r, pptr, freq, scale_bits); + + // x = C(s,x) + *r = ((x / freq) << scale_bits) + (x % freq) + start; +} + +// Flushes the rANS encoder. +static inline void RansEncFlush(RansState *r, uint8_t **pptr) { + uint32_t x = *r; + uint8_t *ptr = *pptr; + + ptr -= 4; + ptr[0] = (uint8_t)(x >> 0); + ptr[1] = (uint8_t)(x >> 8); + ptr[2] = (uint8_t)(x >> 16); + ptr[3] = (uint8_t)(x >> 24); + + *pptr = ptr; +} + +// Initializes a rANS decoder. +// Unlike the encoder, the decoder works forwards as you'd expect. +static inline void RansDecInit(RansState *r, uint8_t **pptr) { + uint32_t x; + uint8_t *ptr = *pptr; + + x = ptr[0] << 0; + x |= ptr[1] << 8; + x |= ptr[2] << 16; + x |= ptr[3] << 24; + ptr += 4; + + *pptr = ptr; + *r = x; +} + +// Returns the current cumulative frequency (map it to a symbol yourself!) +static inline uint32_t RansDecGet(RansState *r, uint32_t scale_bits) { + return *r & ((1u << scale_bits) - 1); +} + +// Advances in the bit stream by "popping" a single symbol with range start +// "start" and frequency "freq". All frequencies are assumed to sum to "1 << +// scale_bits", and the resulting bytes get written to ptr (which is updated). +static inline void RansDecAdvance(RansState *r, uint8_t **pptr, uint32_t start, + uint32_t freq, uint32_t scale_bits) { + uint32_t mask = (1u << scale_bits) - 1; + + // s, x = D(x) + uint32_t x = *r; + x = freq * (x >> scale_bits) + (x & mask) - start; + + // renormalize + if (x < RANS_BYTE_L) { + uint8_t *ptr = *pptr; + do + x = (x << 8) | *ptr++; + while (x < RANS_BYTE_L); + *pptr = ptr; + } + + *r = x; +} diff --git a/DCVC-FM/src/models/block_mc.py b/DCVC-FM/src/models/block_mc.py new file mode 100644 index 0000000..c16e8b9 --- /dev/null +++ b/DCVC-FM/src/models/block_mc.py @@ -0,0 +1,80 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os + +import torch + + +CUSTOMIZED_CUDA = False +try: + from .extensions.block_mc_cpp_cuda import block_mc_forward # pylint: disable=E0401, E0611 + CUSTOMIZED_CUDA = True +except Exception: # pylint: disable=W0718 + pass + +if not CUSTOMIZED_CUDA: + try: + from block_mc_cpp_cuda import block_mc_forward # pylint: disable=E0401 # noqa: F811 + CUSTOMIZED_CUDA = True + except Exception: # pylint: disable=W0718 + pass + +if not CUSTOMIZED_CUDA and 'SUPPRESS_CUSTOM_KERNEL_WARNING' not in os.environ: + print("cannot import motion compensation in cuda, fallback to pytorch grid_sample.") + + +backward_grid = [{} for _ in range(9)] # 0~7 for GPU, -1 for CPU +FORCE_RECALCULATE_GRID = False + + +def set_force_recalculate_grid(force): + global FORCE_RECALCULATE_GRID + FORCE_RECALCULATE_GRID = force + + +def add_grid_cache(flow): + device_id = -1 if flow.device == torch.device('cpu') else flow.device.index + if str(flow.size()) not in backward_grid[device_id] or FORCE_RECALCULATE_GRID: + B, _, H, W = flow.size() + tensor_hor = torch.linspace(-1.0, 1.0, W, device=flow.device, dtype=torch.float32).view( + 1, 1, 1, W).expand(B, -1, H, -1) + tensor_ver = torch.linspace(-1.0, 1.0, H, device=flow.device, dtype=torch.float32).view( + 1, 1, H, 1).expand(B, -1, -1, W) + backward_grid[device_id][str(flow.size())] = torch.cat([tensor_hor, tensor_ver], 1) + + +def torch_warp(feature, flow): + device_id = -1 if feature.device == torch.device('cpu') else feature.device.index + add_grid_cache(flow) + flow = torch.cat([flow[:, 0:1, :, :] / ((feature.size(3) - 1.0) / 2.0), + flow[:, 1:2, :, :] / ((feature.size(2) - 1.0) / 2.0)], 1) + + grid = backward_grid[device_id][str(flow.size())] + flow + return torch.nn.functional.grid_sample(input=feature, + grid=grid.permute(0, 2, 3, 1), + mode='bilinear', + padding_mode='border', + align_corners=True) + + +def flow_warp(im, flow): + is_float16 = False + if im.dtype == torch.float16: + is_float16 = True + im = im.to(torch.float32) + flow = flow.to(torch.float32) + warp = torch_warp(im, flow) + if is_float16: + warp = warp.to(torch.float16) + return warp + + +def block_mc_func(im, flow): + if not CUSTOMIZED_CUDA: + return flow_warp(im, flow) + with torch.no_grad(): + B, C, H, W = im.size() + out = torch.empty_like(im) + block_mc_forward(out, im, flow, B, C, H, W) + return out diff --git a/DCVC-FM/src/models/common_model.py b/DCVC-FM/src/models/common_model.py new file mode 100644 index 0000000..924f538 --- /dev/null +++ b/DCVC-FM/src/models/common_model.py @@ -0,0 +1,324 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import math + +import torch +from torch import nn + +from .entropy_models import BitEstimator, GaussianEncoder, EntropyCoder +from ..utils.stream_helper import get_padding_size + + +class CompressionModel(nn.Module): + def __init__(self, y_distribution, z_channel, mv_z_channel=None, + ec_thread=False, stream_part=1): + super().__init__() + + self.y_distribution = y_distribution + self.z_channel = z_channel + self.mv_z_channel = mv_z_channel + self.entropy_coder = None + if mv_z_channel is None: + self.bit_estimator_z = BitEstimator(64, z_channel) + self.bit_estimator_z_mv = None + else: + self.bit_estimator_z = BitEstimator(1, z_channel) + self.bit_estimator_z_mv = BitEstimator(1, mv_z_channel) + self.gaussian_encoder = GaussianEncoder(distribution=y_distribution) + self.ec_thread = ec_thread + self.stream_part = stream_part + + self.masks = {} + + def quant(self, x): + return torch.round(x) + + def get_one_q_scale(self, q_scale, q_index): + min_q = q_scale[0:1, :, :, :] + max_q = q_scale[1:2, :, :, :] + step = (torch.log(max_q) - torch.log(min_q)) / (self.get_qp_num() - 1) + q = torch.exp(torch.log(min_q) + step * q_index) + return q + + def get_curr_q(self, q_scale, q_index): + if isinstance(q_index, list): + q_step = [self.get_one_q_scale(q_scale, i) for i in q_index] + q_step = torch.cat(q_step, dim=0) + else: + q_step = self.get_one_q_scale(q_scale, q_index) + + return q_step + + @staticmethod + def get_index_tensor(q_index, device): + if not isinstance(q_index, list): + q_index = [q_index] + return torch.tensor(q_index, dtype=torch.int32, device=device) + + @staticmethod + def get_qp_num(): + return 64 + + + @staticmethod + def probs_to_bits(probs): + factor = -1.0 / math.log(2.0) + bits = torch.log(probs + 1e-5) * factor + bits = torch.clamp(bits, 0, None) + return bits + + def get_y_gaussian_bits(self, y, sigma): + mu = torch.zeros_like(sigma) + sigma = sigma.clamp(1e-5, 1e10) + gaussian = torch.distributions.normal.Normal(mu, sigma) + probs = gaussian.cdf(y + 0.5) - gaussian.cdf(y - 0.5) + probs = probs.to(torch.float32) + return CompressionModel.probs_to_bits(probs) + + def get_y_laplace_bits(self, y, sigma): + mu = torch.zeros_like(sigma) + sigma = sigma.clamp(1e-5, 1e10) + gaussian = torch.distributions.laplace.Laplace(mu, sigma) + probs = gaussian.cdf(y + 0.5) - gaussian.cdf(y - 0.5) + probs = probs.to(torch.float32) + return CompressionModel.probs_to_bits(probs) + + def get_z_bits(self, z, bit_estimator, index): + probs = bit_estimator.get_cdf(z + 0.5, index) - bit_estimator.get_cdf(z - 0.5, index) + probs = probs.to(torch.float32) + return CompressionModel.probs_to_bits(probs) + + def update(self, force=False): + self.entropy_coder = EntropyCoder(self.ec_thread, self.stream_part) + self.gaussian_encoder.update(force=force, entropy_coder=self.entropy_coder) + self.bit_estimator_z.update(force=force, entropy_coder=self.entropy_coder) + if self.bit_estimator_z_mv is not None: + self.bit_estimator_z_mv.update(force=force, entropy_coder=self.entropy_coder) + + def pad_for_y(self, y): + _, _, H, W = y.size() + padding_l, padding_r, padding_t, padding_b = get_padding_size(H, W, 4) + y_pad = torch.nn.functional.pad( + y, + (padding_l, padding_r, padding_t, padding_b), + mode="replicate", + ) + return y_pad, (-padding_l, -padding_r, -padding_t, -padding_b) + + @staticmethod + def get_to_y_slice_shape(height, width): + padding_l, padding_r, padding_t, padding_b = get_padding_size(height, width, 4) + return (-padding_l, -padding_r, -padding_t, -padding_b) + + def slice_to_y(self, param, slice_shape): + return torch.nn.functional.pad(param, slice_shape) + + @staticmethod + def separate_prior(params, is_video=False): + if is_video: + quant_step, scales, means = params.chunk(3, 1) + quant_step = torch.clamp(quant_step, 0.5, None) + q_enc = 1. / quant_step + q_dec = quant_step + else: + q = params[:, :2, :, :] + q_enc, q_dec = (torch.sigmoid(q) * 1.5 + 0.5).chunk(2, 1) + scales, means = params[:, 2:, :, :].chunk(2, 1) + return q_enc, q_dec, scales, means + + def get_mask(self, height, width, dtype, device): + curr_mask_str = f"{width}x{height}" + if curr_mask_str not in self.masks: + micro_mask = torch.tensor(((1, 0), (0, 1)), dtype=dtype, device=device) + mask_0 = micro_mask.repeat((height + 1) // 2, (width + 1) // 2) + mask_0 = mask_0[:height, :width] + mask_0 = torch.unsqueeze(mask_0, 0) + mask_0 = torch.unsqueeze(mask_0, 0) + mask_1 = torch.ones_like(mask_0) - mask_0 + self.masks[curr_mask_str] = [mask_0, mask_1] + return self.masks[curr_mask_str] + + def process_with_mask(self, y, scales, means, mask): + scales_hat = scales * mask + means_hat = means * mask + + y_res = (y - means_hat) * mask + y_q = self.quant(y_res) + y_hat = y_q + means_hat + + return y_res, y_q, y_hat, scales_hat + + @staticmethod + def get_one_channel_four_parts_mask(height, width, dtype, device): + micro_mask_0 = torch.tensor(((1, 0), (0, 0)), dtype=dtype, device=device) + mask_0 = micro_mask_0.repeat((height + 1) // 2, (width + 1) // 2) + mask_0 = mask_0[:height, :width] + mask_0 = torch.unsqueeze(mask_0, 0) + mask_0 = torch.unsqueeze(mask_0, 0) + + micro_mask_1 = torch.tensor(((0, 1), (0, 0)), dtype=dtype, device=device) + mask_1 = micro_mask_1.repeat((height + 1) // 2, (width + 1) // 2) + mask_1 = mask_1[:height, :width] + mask_1 = torch.unsqueeze(mask_1, 0) + mask_1 = torch.unsqueeze(mask_1, 0) + + micro_mask_2 = torch.tensor(((0, 0), (1, 0)), dtype=dtype, device=device) + mask_2 = micro_mask_2.repeat((height + 1) // 2, (width + 1) // 2) + mask_2 = mask_2[:height, :width] + mask_2 = torch.unsqueeze(mask_2, 0) + mask_2 = torch.unsqueeze(mask_2, 0) + + micro_mask_3 = torch.tensor(((0, 0), (0, 1)), dtype=dtype, device=device) + mask_3 = micro_mask_3.repeat((height + 1) // 2, (width + 1) // 2) + mask_3 = mask_3[:height, :width] + mask_3 = torch.unsqueeze(mask_3, 0) + mask_3 = torch.unsqueeze(mask_3, 0) + + return mask_0, mask_1, mask_2, mask_3 + + def get_mask_four_parts(self, batch, channel, height, width, dtype, device): + curr_mask_str = f"{batch}_{channel}x{width}x{height}" + with torch.no_grad(): + if curr_mask_str not in self.masks: + assert channel % 4 == 0 + m = torch.ones((batch, channel // 4, height, width), dtype=dtype, device=device) + m0, m1, m2, m3 = self.get_one_channel_four_parts_mask(height, width, dtype, device) + + mask_0 = torch.cat((m * m0, m * m1, m * m2, m * m3), dim=1) + mask_1 = torch.cat((m * m3, m * m2, m * m1, m * m0), dim=1) + mask_2 = torch.cat((m * m2, m * m3, m * m0, m * m1), dim=1) + mask_3 = torch.cat((m * m1, m * m0, m * m3, m * m2), dim=1) + + self.masks[curr_mask_str] = [mask_0, mask_1, mask_2, mask_3] + return self.masks[curr_mask_str] + + @staticmethod + def combine_four_parts(x_0_0, x_0_1, x_0_2, x_0_3, + x_1_0, x_1_1, x_1_2, x_1_3, + x_2_0, x_2_1, x_2_2, x_2_3, + x_3_0, x_3_1, x_3_2, x_3_3): + x_0 = x_0_0 + x_0_1 + x_0_2 + x_0_3 + x_1 = x_1_0 + x_1_1 + x_1_2 + x_1_3 + x_2 = x_2_0 + x_2_1 + x_2_2 + x_2_3 + x_3 = x_3_0 + x_3_1 + x_3_2 + x_3_3 + return torch.cat((x_0, x_1, x_2, x_3), dim=1) + + @staticmethod + def combine_for_writing(x): + x0, x1, x2, x3 = x.chunk(4, 1) + return (x0 + x1) + (x2 + x3) + + def forward_four_part_prior(self, y, common_params, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior, + y_spatial_prior_reduction=None, write=False): + ''' + y_0 means split in channel, the 0/4 quater + y_1 means split in channel, the 1/4 quater + y_2 means split in channel, the 2/4 quater + y_3 means split in channel, the 3/4 quater + y_?_0, means multiply with mask_0 + y_?_1, means multiply with mask_1 + y_?_2, means multiply with mask_2 + y_?_3, means multiply with mask_3 + ''' + q_enc, q_dec, scales, means = self.separate_prior(common_params, + y_spatial_prior_reduction is None) + if y_spatial_prior_reduction is not None: + common_params = y_spatial_prior_reduction(common_params) + dtype = y.dtype + device = y.device + B, C, H, W = y.size() + mask_0, mask_1, mask_2, mask_3 = self.get_mask_four_parts(B, C, H, W, dtype, device) + + y = y * q_enc + + y_res_0, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) + + y_hat_so_far = y_hat_0 + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) + y_res_1, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) + + y_hat_so_far = y_hat_so_far + y_hat_1 + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) + y_res_2, y_q_2, y_hat_2, s_hat_2 = self.process_with_mask(y, scales, means, mask_2) + + y_hat_so_far = y_hat_so_far + y_hat_2 + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) + y_res_3, y_q_3, y_hat_3, s_hat_3 = self.process_with_mask(y, scales, means, mask_3) + + y_res = (y_res_0 + y_res_1) + (y_res_2 + y_res_3) + y_q = (y_q_0 + y_q_1) + (y_q_2 + y_q_3) + y_hat = y_hat_so_far + y_hat_3 + scales_hat = (s_hat_0 + s_hat_1) + (s_hat_2 + s_hat_3) + + y_hat = y_hat * q_dec + + if write: + y_q_w_0 = self.combine_for_writing(y_q_0) + y_q_w_1 = self.combine_for_writing(y_q_1) + y_q_w_2 = self.combine_for_writing(y_q_2) + y_q_w_3 = self.combine_for_writing(y_q_3) + scales_w_0 = self.combine_for_writing(s_hat_0) + scales_w_1 = self.combine_for_writing(s_hat_1) + scales_w_2 = self.combine_for_writing(s_hat_2) + scales_w_3 = self.combine_for_writing(s_hat_3) + return y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, \ + scales_w_0, scales_w_1, scales_w_2, scales_w_3, y_hat + return y_res, y_q, y_hat, scales_hat + + def compress_four_part_prior(self, y, common_params, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior, + y_spatial_prior_reduction=None): + return self.forward_four_part_prior(y, common_params, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior, + y_spatial_prior_reduction, write=True) + + def decompress_four_part_prior(self, common_params, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior, + y_spatial_prior_reduction=None): + _, quant_step, scales, means = self.separate_prior(common_params, + y_spatial_prior_reduction is None) + if y_spatial_prior_reduction is not None: + common_params = y_spatial_prior_reduction(common_params) + dtype = means.dtype + device = means.device + B, C, H, W = means.size() + mask_0, mask_1, mask_2, mask_3 = self.get_mask_four_parts(B, C, H, W, dtype, device) + + scales_r = self.combine_for_writing(scales * mask_0) + y_q_r = self.gaussian_encoder.decode_stream(scales_r, dtype, device) + y_hat_curr_step = (torch.cat((y_q_r, y_q_r, y_q_r, y_q_r), dim=1) + means) * mask_0 + y_hat_so_far = y_hat_curr_step + + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) + scales_r = self.combine_for_writing(scales * mask_1) + y_q_r = self.gaussian_encoder.decode_stream(scales_r, dtype, device) + y_hat_curr_step = (torch.cat((y_q_r, y_q_r, y_q_r, y_q_r), dim=1) + means) * mask_1 + y_hat_so_far = y_hat_so_far + y_hat_curr_step + + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) + scales_r = self.combine_for_writing(scales * mask_2) + y_q_r = self.gaussian_encoder.decode_stream(scales_r, dtype, device) + y_hat_curr_step = (torch.cat((y_q_r, y_q_r, y_q_r, y_q_r), dim=1) + means) * mask_2 + y_hat_so_far = y_hat_so_far + y_hat_curr_step + + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) + scales_r = self.combine_for_writing(scales * mask_3) + y_q_r = self.gaussian_encoder.decode_stream(scales_r, dtype, device) + y_hat_curr_step = (torch.cat((y_q_r, y_q_r, y_q_r, y_q_r), dim=1) + means) * mask_3 + y_hat_so_far = y_hat_so_far + y_hat_curr_step + + y_hat = y_hat_so_far * quant_step + + return y_hat diff --git a/DCVC-FM/src/models/entropy_models.py b/DCVC-FM/src/models/entropy_models.py new file mode 100644 index 0000000..a941fa4 --- /dev/null +++ b/DCVC-FM/src/models/entropy_models.py @@ -0,0 +1,304 @@ +import math + +import torch +import numpy as np +from torch import nn +import torch.nn.functional as F + + +class EntropyCoder(): + def __init__(self, ec_thread=False, stream_part=1): + super().__init__() + + from .MLCodec_rans import RansEncoder, RansDecoder # pylint: disable=E0401 + self.encoder = RansEncoder(ec_thread, stream_part) + self.decoder = RansDecoder(stream_part) + + @staticmethod + def pmf_to_quantized_cdf(pmf, precision=16): + from .MLCodec_CXX import pmf_to_quantized_cdf as _pmf_to_cdf # pylint: disable=E0401 + cdf = _pmf_to_cdf(pmf.tolist(), precision) + cdf = torch.IntTensor(cdf) + return cdf + + @staticmethod + def pmf_to_cdf(pmf, tail_mass, pmf_length, max_length): + entropy_coder_precision = 16 + cdf = torch.zeros((len(pmf_length), max_length + 2), dtype=torch.int32) + for i, p in enumerate(pmf): + prob = torch.cat((p[: pmf_length[i]], tail_mass[i]), dim=0) + _cdf = EntropyCoder.pmf_to_quantized_cdf(prob, entropy_coder_precision) + cdf[i, : _cdf.size(0)] = _cdf + return cdf + + def reset(self): + self.encoder.reset() + + def add_cdf(self, cdf, cdf_length, offset): + enc_cdf_idx = self.encoder.add_cdf(cdf, cdf_length, offset) + dec_cdf_idx = self.decoder.add_cdf(cdf, cdf_length, offset) + assert enc_cdf_idx == dec_cdf_idx + return enc_cdf_idx + + def encode_with_indexes(self, symbols, indexes, cdf_group_index): + self.encoder.encode_with_indexes(symbols.clamp(-30000, 30000).to(torch.int16).cpu().numpy(), + indexes.to(torch.int16).cpu().numpy(), + cdf_group_index) + + def encode_with_indexes_np(self, symbols, indexes, cdf_group_index): + self.encoder.encode_with_indexes(symbols.clip(-30000, 30000).astype(np.int16).reshape(-1), + indexes.astype(np.int16).reshape(-1), + cdf_group_index) + + def flush(self): + self.encoder.flush() + + def get_encoded_stream(self): + return self.encoder.get_encoded_stream().tobytes() + + def set_stream(self, stream): + self.decoder.set_stream((np.frombuffer(stream, dtype=np.uint8))) + + def decode_stream(self, indexes, cdf_group_index): + rv = self.decoder.decode_stream(indexes.to(torch.int16).cpu().numpy(), + cdf_group_index) + rv = torch.Tensor(rv) + return rv + + def decode_stream_np(self, indexes, cdf_group_index): + rv = self.decoder.decode_stream(indexes.astype(np.int16).reshape(-1), + cdf_group_index) + return rv + + +class Bitparm(nn.Module): + def __init__(self, qp_num, channel, final=False): + super().__init__() + self.final = final + self.h = nn.Parameter(torch.nn.init.normal_( + torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) + self.b = nn.Parameter(torch.nn.init.normal_( + torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) + if not final: + self.a = nn.Parameter(torch.nn.init.normal_( + torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) + else: + self.a = None + + def forward(self, x, index): + h = torch.index_select(self.h, 0, index) + b = torch.index_select(self.b, 0, index) + x = x * F.softplus(h) + b + if self.final: + return x + + a = torch.index_select(self.a, 0, index) + return x + torch.tanh(x) * torch.tanh(a) + + +class AEHelper(): + def __init__(self): + super().__init__() + self.entropy_coder = None + self.cdf_group_index = None + self._offset = None + self._quantized_cdf = None + self._cdf_length = None + + def set_cdf_info(self, quantized_cdf, cdf_length, offset): + self._quantized_cdf = quantized_cdf.cpu().numpy() + self._cdf_length = cdf_length.reshape(-1).int().cpu().numpy() + self._offset = offset.reshape(-1).int().cpu().numpy() + + def get_cdf_info(self): + return self._quantized_cdf, \ + self._cdf_length, \ + self._offset + + +class BitEstimator(AEHelper, nn.Module): + def __init__(self, qp_num, channel): + super().__init__() + self.f1 = Bitparm(qp_num, channel) + self.f2 = Bitparm(qp_num, channel) + self.f3 = Bitparm(qp_num, channel) + self.f4 = Bitparm(qp_num, channel, True) + self.qp_num = qp_num + self.channel = channel + + def forward(self, x, index): + return self.get_cdf(x, index) + + def get_logits_cdf(self, x, index): + x = self.f1(x, index) + x = self.f2(x, index) + x = self.f3(x, index) + x = self.f4(x, index) + return x + + def get_cdf(self, x, index): + return torch.sigmoid(self.get_logits_cdf(x, index)) + + def update(self, force=False, entropy_coder=None): + assert entropy_coder is not None + self.entropy_coder = entropy_coder + + if not force and self._offset is not None: + return + + with torch.no_grad(): + device = next(self.parameters()).device + medians = torch.zeros((self.qp_num, self.channel, 1, 1), device=device) + index = torch.arange(self.qp_num, device=device, dtype=torch.int32) + + minima = medians + 50 + for i in range(50, 1, -1): + samples = torch.zeros_like(medians) - i + probs = self.forward(samples, index) + minima = torch.where(probs < torch.zeros_like(medians) + 0.0001, + torch.zeros_like(medians) + i, minima) + + maxima = medians + 50 + for i in range(50, 1, -1): + samples = torch.zeros_like(medians) + i + probs = self.forward(samples, index) + maxima = torch.where(probs > torch.zeros_like(medians) + 0.9999, + torch.zeros_like(medians) + i, maxima) + + minima = minima.int() + maxima = maxima.int() + + offset = -minima + + pmf_start = medians - minima + pmf_length = maxima + minima + 1 + + max_length = pmf_length.max() + device = pmf_start.device + samples = torch.arange(max_length, device=device) + + samples = samples[None, None, None, :] + pmf_start + + half = float(0.5) + + lower = self.forward(samples - half, index) + upper = self.forward(samples + half, index) + pmf = upper - lower + + pmf = pmf[:, :, 0, :] + tail_mass = lower[:, :, 0, :1] + (1.0 - upper[:, :, 0, -1:]) + + pmf = pmf.reshape([-1, max_length]) + tail_mass = tail_mass.reshape([-1, 1]) + pmf_length = pmf_length.reshape([-1]) + offset = offset.reshape([-1]) + quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) + cdf_length = pmf_length + 2 + self.set_cdf_info(quantized_cdf, cdf_length, offset) + self.cdf_group_index = self.entropy_coder.add_cdf(*self.get_cdf_info()) + + def build_indexes(self, size, qp): + B, C, H, W = size + indexes = torch.arange(C, dtype=torch.int).view(1, -1, 1, 1) + qp * self.channel + return indexes.repeat(B, 1, H, W) + + def build_indexes_np(self, size, qp): + return self.build_indexes(size, qp).cpu().numpy() + + def encode(self, x, qp): + indexes = self.build_indexes(x.size(), qp) + return self.entropy_coder.encode_with_indexes(x.reshape(-1), indexes.reshape(-1), + self.cdf_group_index) + + def decode_stream(self, size, dtype, device, qp): + output_size = (1, self.channel, size[0], size[1]) + indexes = self.build_indexes(output_size, qp) + val = self.entropy_coder.decode_stream(indexes.reshape(-1), self.cdf_group_index) + val = val.reshape(indexes.shape) + return val.to(dtype).to(device) + + +class GaussianEncoder(AEHelper): + def __init__(self, distribution='laplace'): + super().__init__() + assert distribution in ['laplace', 'gaussian'] + self.distribution = distribution + if distribution == 'laplace': + self.cdf_distribution = torch.distributions.laplace.Laplace + self.scale_min = 0.01 + self.scale_max = 64.0 + self.scale_level = 256 + elif distribution == 'gaussian': + self.cdf_distribution = torch.distributions.normal.Normal + self.scale_min = 0.11 + self.scale_max = 64.0 + self.scale_level = 256 + self.scale_table = self.get_scale_table(self.scale_min, self.scale_max, self.scale_level) + + self.log_scale_min = math.log(self.scale_min) + self.log_scale_max = math.log(self.scale_max) + self.log_scale_step = (self.log_scale_max - self.log_scale_min) / (self.scale_level - 1) + + @staticmethod + def get_scale_table(min_val, max_val, levels): + return torch.exp(torch.linspace(math.log(min_val), math.log(max_val), levels)) + + def update(self, force=False, entropy_coder=None): + assert entropy_coder is not None + self.entropy_coder = entropy_coder + + if not force and self._offset is not None: + return + + pmf_center = torch.zeros_like(self.scale_table) + 50 + scales = torch.zeros_like(pmf_center) + self.scale_table + mu = torch.zeros_like(scales) + cdf_distribution = self.cdf_distribution(mu, scales) + for i in range(50, 1, -1): + samples = torch.zeros_like(pmf_center) + i + probs = cdf_distribution.cdf(samples) + probs = torch.squeeze(probs) + pmf_center = torch.where(probs > torch.zeros_like(pmf_center) + 0.9999, + torch.zeros_like(pmf_center) + i, pmf_center) + + pmf_center = pmf_center.int() + pmf_length = 2 * pmf_center + 1 + max_length = torch.max(pmf_length).item() + + device = pmf_center.device + samples = torch.arange(max_length, device=device) - pmf_center[:, None] + samples = samples.float() + + scales = torch.zeros_like(samples) + self.scale_table[:, None] + mu = torch.zeros_like(scales) + cdf_distribution = self.cdf_distribution(mu, scales) + + upper = cdf_distribution.cdf(samples + 0.5) + lower = cdf_distribution.cdf(samples - 0.5) + pmf = upper - lower + + tail_mass = 2 * lower[:, :1] + + quantized_cdf = torch.Tensor(len(pmf_length), max_length + 2) + quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) + + self.set_cdf_info(quantized_cdf, pmf_length+2, -pmf_center) + self.cdf_group_index = self.entropy_coder.add_cdf(*self.get_cdf_info()) + + def build_indexes(self, scales): + scales = torch.maximum(scales, torch.zeros_like(scales) + 1e-5) + indexes = (torch.log(scales) - self.log_scale_min) / self.log_scale_step + indexes = indexes.clamp_(0, self.scale_level - 1) + return indexes.int() + + def encode(self, x, scales): + indexes = self.build_indexes(scales) + return self.entropy_coder.encode_with_indexes(x.reshape(-1), indexes.reshape(-1), + self.cdf_group_index) + + def decode_stream(self, scales, dtype, device): + indexes = self.build_indexes(scales) + val = self.entropy_coder.decode_stream(indexes.reshape(-1), + self.cdf_group_index) + val = val.reshape(scales.shape) + return val.to(device).to(dtype) diff --git a/DCVC-FM/src/models/extensions/block_mc.cpp b/DCVC-FM/src/models/extensions/block_mc.cpp new file mode 100644 index 0000000..c9cd9e9 --- /dev/null +++ b/DCVC-FM/src/models/extensions/block_mc.cpp @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "block_mc.h" +#include + +void block_mc_forward(torch::Tensor &out, const torch::Tensor &im, + const torch::Tensor &flow, const int B, const int C, + const int H, const int W) { + block_mc_forward_cuda(out, im, flow, B, C, H, W); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("block_mc_forward", &block_mc_forward, "Motion Compensation forward"); +} diff --git a/DCVC-FM/src/models/extensions/block_mc.h b/DCVC-FM/src/models/extensions/block_mc.h new file mode 100644 index 0000000..5012a45 --- /dev/null +++ b/DCVC-FM/src/models/extensions/block_mc.h @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include + +void block_mc_forward_cuda(torch::Tensor &out, const torch::Tensor &im, + const torch::Tensor &flow, const int B, const int C, + const int H, const int W); diff --git a/DCVC-FM/src/models/extensions/block_mc_kernel.cu b/DCVC-FM/src/models/extensions/block_mc_kernel.cu new file mode 100644 index 0000000..cbc2a4a --- /dev/null +++ b/DCVC-FM/src/models/extensions/block_mc_kernel.cu @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include +#include +#include +#include + +#include "block_mc.h" +#include "common.h" +#include + +inline __device__ float __tofloat(float a) { return a; } + +inline __device__ float __tofloat(__half a) { return __half2float(a); } + +inline __device__ float __multiply_add(float a, float b, float c) { + return __fmaf_rn(a, b, c); +} + +inline __device__ __half __multiply_add(__half a, __half b, __half c) { + return __hfma(a, b, c); +} + +template +__global__ void block_mc_forward_kernel(GPUTensor out, const GPUTensor im, + const GPUTensor flow, const int B, + const int C, const int H, const int W) { + const int b = blockIdx.z; + const int h = blockIdx.y * blockDim.y + threadIdx.y; + const int w = blockIdx.x * blockDim.x + threadIdx.x; + + if (h < H && w < W) { + const T x_off = flow.ptr[b * flow.stride[0] + 0 * flow.stride[1] + + h * flow.stride[2] + w * flow.stride[3]]; + const T y_off = flow.ptr[b * flow.stride[0] + 1 * flow.stride[1] + + h * flow.stride[2] + w * flow.stride[3]]; + float x_pos = __tofloat(x_off) + static_cast(w); + float y_pos = __tofloat(y_off) + static_cast(h); + x_pos = min(max(x_pos, 0.f), static_cast(W - 1)); + y_pos = min(max(y_pos, 0.f), static_cast(H - 1)); + int x0 = __float2int_rd(x_pos); + int x1 = min(x0 + 1, W - 1); + int y0 = __float2int_rd(y_pos); + int y1 = min(y0 + 1, H - 1); + + float w_r = x_pos - static_cast(x0); + float w_l = 1.f - w_r; + float w_b = y_pos - static_cast(y0); + float w_t = 1.f - w_b; + + const T wa = __totype(w_l * w_t); + const T wb = __totype(w_l * w_b); + const T wc = __totype(w_r * w_t); + const T wd = __totype(w_r * w_b); + + for (int c = 0; c < C; c++) { + const int baseOffset = b * im.stride[0] + c * im.stride[1]; + + T r = __totype(0.f); + const T ima = im.ptr[baseOffset + y0 * im.stride[2] + x0 * im.stride[3]]; + r = __multiply_add(ima, wa, r); + const T imb = im.ptr[baseOffset + y1 * im.stride[2] + x0 * im.stride[3]]; + r = __multiply_add(imb, wb, r); + const T imc = im.ptr[baseOffset + y0 * im.stride[2] + x1 * im.stride[3]]; + r = __multiply_add(imc, wc, r); + const T imd = im.ptr[baseOffset + y1 * im.stride[2] + x1 * im.stride[3]]; + r = __multiply_add(imd, wd, r); + out.ptr[b * out.stride[0] + c * out.stride[1] + h * out.stride[2] + + w * out.stride[3]] = r; + } + } +} + +void block_mc_forward_cuda(torch::Tensor &out, const torch::Tensor &im, + const torch::Tensor &flow, const int B, const int C, + const int H, const int W) { + const int BLOCK_SIZE = 32; + const dim3 gridDim((W + BLOCK_SIZE - 1) / BLOCK_SIZE, + (H + BLOCK_SIZE - 1) / BLOCK_SIZE, B); + const dim3 blockDim(BLOCK_SIZE, BLOCK_SIZE); + if (im.element_size() == 4) { + block_mc_forward_kernel + <<>>(out, im, flow, B, C, H, W); + } else if (im.element_size() == 2) { + block_mc_forward_kernel<__half> + <<>>(out, im, flow, B, C, H, W); + } +} diff --git a/DCVC-FM/src/models/extensions/common.h b/DCVC-FM/src/models/extensions/common.h new file mode 100644 index 0000000..ab367d2 --- /dev/null +++ b/DCVC-FM/src/models/extensions/common.h @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +template struct GPUTensor { + GPUTensor(torch::Tensor &t) : ptr(static_cast(t.data_ptr())) { + assert(sizeof(T) == t.element_size()); + assert(t.dim() <= 8); + for (int i = 0; i < t.dim(); i++) { + stride[i] = static_cast(t.stride(i)); + } + } + GPUTensor(const torch::Tensor &t) : ptr(static_cast(t.data_ptr())) { + assert(sizeof(T) == t.element_size()); + assert(t.dim() <= 8); + for (int i = 0; i < t.dim(); i++) { + stride[i] = static_cast(t.stride(i)); + } + } + + T *__restrict__ const ptr; + int stride[8] = {0}; +}; + +template inline __device__ T __totype(float a) { + return static_cast(a); +} + +template <> inline __device__ __half __totype(float a) { + return __float2half(a); +} diff --git a/DCVC-FM/src/models/extensions/setup.py b/DCVC-FM/src/models/extensions/setup.py new file mode 100644 index 0000000..6a86b25 --- /dev/null +++ b/DCVC-FM/src/models/extensions/setup.py @@ -0,0 +1,26 @@ +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + + +cxx_flags = ["-O3"] +nvcc_flags = ["-O3", "--use_fast_math", "--extra-device-vectorization", "-arch=native"] + + +setup( + name='block_mc_cpp', + ext_modules=[ + CUDAExtension( + name='block_mc_cpp_cuda', + sources=[ + 'block_mc.cpp', + 'block_mc_kernel.cu', + ], + extra_compile_args={ + "cxx": cxx_flags, + "nvcc": nvcc_flags, + },) + ], + cmdclass={ + 'build_ext': BuildExtension + } + ) diff --git a/DCVC-FM/src/models/image_model.py b/DCVC-FM/src/models/image_model.py new file mode 100644 index 0000000..38ec5ba --- /dev/null +++ b/DCVC-FM/src/models/image_model.py @@ -0,0 +1,225 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import torch +from torch import nn + + +from .common_model import CompressionModel +from .layers import conv3x3, DepthConvBlock2, DepthConvBlock3, DepthConvBlock4, \ + ResidualBlockUpsample, ResidualBlockWithStride2 +from .video_net import UNet +from ..utils.stream_helper import write_ip, get_downsampled_shape + + +class IntraEncoder(nn.Module): + def __init__(self, N, inplace=False): + super().__init__() + + self.enc_1 = nn.Sequential( + ResidualBlockWithStride2(3, 128, inplace=inplace), + DepthConvBlock3(128, 128, inplace=inplace), + ) + self.enc_2 = nn.Sequential( + ResidualBlockWithStride2(128, 192, inplace=inplace), + DepthConvBlock3(192, 192, inplace=inplace), + ResidualBlockWithStride2(192, N, inplace=inplace), + DepthConvBlock3(N, N, inplace=inplace), + nn.Conv2d(N, N, 3, stride=2, padding=1), + ) + + def forward(self, x, quant_step): + out = self.enc_1(x) + out = out * quant_step + return self.enc_2(out) + + +class IntraDecoder(nn.Module): + def __init__(self, N, inplace=False): + super().__init__() + + self.dec_1 = nn.Sequential( + DepthConvBlock3(N, N, inplace=inplace), + ResidualBlockUpsample(N, N, 2, inplace=inplace), + DepthConvBlock3(N, N, inplace=inplace), + ResidualBlockUpsample(N, 192, 2, inplace=inplace), + DepthConvBlock3(192, 192, inplace=inplace), + ResidualBlockUpsample(192, 128, 2, inplace=inplace), + ) + self.dec_2 = nn.Sequential( + DepthConvBlock3(128, 128, inplace=inplace), + ResidualBlockUpsample(128, 16, 2, inplace=inplace), + ) + + def forward(self, x, quant_step): + out = self.dec_1(x) + out = out * quant_step + return self.dec_2(out) + + +class DMCI(CompressionModel): + def __init__(self, N=256, z_channel=128, ec_thread=False, stream_part=1, inplace=False): + super().__init__(y_distribution='gaussian', z_channel=z_channel, + ec_thread=ec_thread, stream_part=stream_part) + + self.enc = IntraEncoder(N, inplace) + + self.hyper_enc = nn.Sequential( + DepthConvBlock4(N, z_channel, inplace=inplace), + nn.Conv2d(z_channel, z_channel, 3, stride=2, padding=1), + nn.LeakyReLU(inplace=inplace), + nn.Conv2d(z_channel, z_channel, 3, stride=2, padding=1), + ) + self.hyper_dec = nn.Sequential( + ResidualBlockUpsample(z_channel, z_channel, 2, inplace=inplace), + ResidualBlockUpsample(z_channel, z_channel, 2, inplace=inplace), + DepthConvBlock4(z_channel, N), + ) + + self.y_prior_fusion = nn.Sequential( + DepthConvBlock4(N, N * 2, inplace=inplace), + DepthConvBlock4(N * 2, N * 2 + 2, inplace=inplace), + ) + + self.y_spatial_prior_reduction = nn.Conv2d(N * 2 + 2, N * 1, 1) + self.y_spatial_prior_adaptor_1 = DepthConvBlock2(N * 2, N * 2, inplace=inplace) + self.y_spatial_prior_adaptor_2 = DepthConvBlock2(N * 2, N * 2, inplace=inplace) + self.y_spatial_prior_adaptor_3 = DepthConvBlock2(N * 2, N * 2, inplace=inplace) + self.y_spatial_prior = nn.Sequential( + DepthConvBlock2(N * 2, N * 2, inplace=inplace), + DepthConvBlock2(N * 2, N * 2, inplace=inplace), + DepthConvBlock2(N * 2, N * 2, inplace=inplace), + ) + + self.dec = IntraDecoder(N, inplace) + self.refine = nn.Sequential( + UNet(16, 16, inplace=inplace), + conv3x3(16, 3), + ) + + self.q_scale_enc = nn.Parameter(torch.ones((self.get_qp_num(), 128, 1, 1))) + self.q_scale_dec = nn.Parameter(torch.ones((self.get_qp_num(), 128, 1, 1))) + + def forward_one_frame(self, x, q_index=None): + _, _, H, W = x.size() + device = x.device + index = self.get_index_tensor(q_index, device) + curr_q_enc = torch.index_select(self.q_scale_enc, 0, index) + curr_q_dec = torch.index_select(self.q_scale_dec, 0, index) + + y = self.enc(x, curr_q_enc) + y_pad, slice_shape = self.pad_for_y(y) + z = self.hyper_enc(y_pad) + z_q = self.quant(z) + z_hat = z_q + + params = self.hyper_dec(z_hat) + params = self.y_prior_fusion(params) + params = self.slice_to_y(params, slice_shape) + y_res, y_q, y_hat, scales_hat = self.forward_four_part_prior( + y, params, + self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior, + y_spatial_prior_reduction=self.y_spatial_prior_reduction) + + x_hat = self.dec(y_hat, curr_q_dec) + x_hat = self.refine(x_hat) + + y_for_bit = y_q + z_for_bit = z_q + bits_y = self.get_y_gaussian_bits(y_for_bit, scales_hat) + bits_z = self.get_z_bits(z_for_bit, self.bit_estimator_z, index) + pixel_num = H * W + bpp_y = torch.sum(bits_y, dim=(1, 2, 3)) / pixel_num + bpp_z = torch.sum(bits_z, dim=(1, 2, 3)) / pixel_num + + bits = torch.sum(bpp_y + bpp_z) * pixel_num + + return { + "x_hat": x_hat, + "bit": bits, + } + + def encode(self, x, q_index, sps_id=0, output_file=None): + # pic_width and pic_height may be different from x's size. X here is after padding + # x_hat has the same size with x + if output_file is None: + encoded = self.forward_one_frame(x, q_index) + result = { + 'bit': encoded['bit'].item(), + 'x_hat': encoded['x_hat'], + } + return result + + compressed = self.compress(x, q_index) + bit_stream = compressed['bit_stream'] + written = write_ip(output_file, True, sps_id, bit_stream) + result = { + 'bit': written * 8, + 'x_hat': compressed['x_hat'], + } + return result + + def compress(self, x, q_index): + device = x.device + index = self.get_index_tensor(q_index, device) + curr_q_enc = torch.index_select(self.q_scale_enc, 0, index) + curr_q_dec = torch.index_select(self.q_scale_dec, 0, index) + + y = self.enc(x, curr_q_enc) + y_pad, slice_shape = self.pad_for_y(y) + z = self.hyper_enc(y_pad) + z_q = torch.round(z) + z_hat = z_q + + params = self.hyper_dec(z_hat) + params = self.y_prior_fusion(params) + params = self.slice_to_y(params, slice_shape) + y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, \ + scales_w_0, scales_w_1, scales_w_2, scales_w_3, y_hat = self.compress_four_part_prior( + y, params, self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior, + y_spatial_prior_reduction=self.y_spatial_prior_reduction) + + self.entropy_coder.reset() + self.bit_estimator_z.encode(z_q, q_index) + self.gaussian_encoder.encode(y_q_w_0, scales_w_0) + self.gaussian_encoder.encode(y_q_w_1, scales_w_1) + self.gaussian_encoder.encode(y_q_w_2, scales_w_2) + self.gaussian_encoder.encode(y_q_w_3, scales_w_3) + self.entropy_coder.flush() + + x_hat = self.refine(self.dec(y_hat, curr_q_dec)).clamp_(0, 1) + bit_stream = self.entropy_coder.get_encoded_stream() + + result = { + "bit_stream": bit_stream, + "x_hat": x_hat, + } + return result + + def decompress(self, bit_stream, sps): + dtype = next(self.parameters()).dtype + device = next(self.parameters()).device + index = self.get_index_tensor(sps['qp'], device) + curr_q_dec = torch.index_select(self.q_scale_dec, 0, index) + + self.entropy_coder.set_stream(bit_stream) + z_size = get_downsampled_shape(sps['height'], sps['width'], 64) + y_height, y_width = get_downsampled_shape(sps['height'], sps['width'], 16) + slice_shape = self.get_to_y_slice_shape(y_height, y_width) + z_q = self.bit_estimator_z.decode_stream(z_size, dtype, device, sps['qp']) + z_hat = z_q + + params = self.hyper_dec(z_hat) + params = self.y_prior_fusion(params) + params = self.slice_to_y(params, slice_shape) + y_hat = self.decompress_four_part_prior(params, + self.y_spatial_prior_adaptor_1, + self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, + self.y_spatial_prior, + self.y_spatial_prior_reduction) + + x_hat = self.refine(self.dec(y_hat, curr_q_dec)).clamp_(0, 1) + return {"x_hat": x_hat} diff --git a/DCVC-FM/src/models/layers.py b/DCVC-FM/src/models/layers.py new file mode 100644 index 0000000..5f43237 --- /dev/null +++ b/DCVC-FM/src/models/layers.py @@ -0,0 +1,299 @@ +# Copyright 2020 InterDigital Communications, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from torch import nn + + +def conv3x3(in_ch, out_ch, stride=1): + """3x3 convolution with padding.""" + return nn.Conv2d(in_ch, out_ch, kernel_size=3, stride=stride, padding=1) + + +def subpel_conv3x3(in_ch, out_ch, r=1): + """3x3 sub-pixel convolution for up-sampling.""" + return nn.Sequential( + nn.Conv2d(in_ch, out_ch * r ** 2, kernel_size=3, padding=1), nn.PixelShuffle(r) + ) + + +def subpel_conv1x1(in_ch, out_ch, r=1): + """1x1 sub-pixel convolution for up-sampling.""" + return nn.Sequential( + nn.Conv2d(in_ch, out_ch * r ** 2, kernel_size=1, padding=0), nn.PixelShuffle(r) + ) + + +def conv1x1(in_ch, out_ch, stride=1): + """1x1 convolution.""" + return nn.Conv2d(in_ch, out_ch, kernel_size=1, stride=stride) + + +class ResidualBlockWithStride2(nn.Module): + def __init__(self, in_ch, out_ch, inplace=False): + super().__init__() + self.down = nn.Conv2d(in_ch, out_ch, 2, stride=2) + self.conv = nn.Sequential( + nn.Conv2d(out_ch, out_ch, 3, padding=1), + nn.LeakyReLU(inplace=inplace), + nn.Conv2d(out_ch, out_ch, 1), + nn.LeakyReLU(inplace=inplace), + ) + + def forward(self, x): + x = self.down(x) + identity = x + out = self.conv(x) + out = out + identity + return out + + +class ResidualBlockWithStride(nn.Module): + """Residual block with a stride on the first convolution. + + Args: + in_ch (int): number of input channels + out_ch (int): number of output channels + stride (int): stride value (default: 2) + """ + + def __init__(self, in_ch, out_ch, stride=2, inplace=False): + super().__init__() + self.conv1 = conv3x3(in_ch, out_ch, stride=stride) + self.leaky_relu = nn.LeakyReLU(inplace=inplace) + self.conv2 = conv3x3(out_ch, out_ch) + self.leaky_relu2 = nn.LeakyReLU(negative_slope=0.1, inplace=inplace) + if stride != 1: + self.downsample = conv1x1(in_ch, out_ch, stride=stride) + else: + self.downsample = None + + def forward(self, x): + identity = x + out = self.conv1(x) + out = self.leaky_relu(out) + out = self.conv2(out) + out = self.leaky_relu2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out = out + identity + return out + + +class ResidualBlockUpsample(nn.Module): + """Residual block with sub-pixel upsampling on the last convolution. + + Args: + in_ch (int): number of input channels + out_ch (int): number of output channels + upsample (int): upsampling factor (default: 2) + """ + + def __init__(self, in_ch, out_ch, upsample=2, inplace=False): + super().__init__() + self.subpel_conv = subpel_conv1x1(in_ch, out_ch, upsample) + self.leaky_relu = nn.LeakyReLU(inplace=inplace) + self.conv = conv3x3(out_ch, out_ch) + self.leaky_relu2 = nn.LeakyReLU(negative_slope=0.1, inplace=inplace) + self.upsample = subpel_conv1x1(in_ch, out_ch, upsample) + + def forward(self, x): + identity = x + out = self.subpel_conv(x) + out = self.leaky_relu(out) + out = self.conv(out) + out = self.leaky_relu2(out) + identity = self.upsample(x) + out = out + identity + return out + + +class ResidualBlock(nn.Module): + """Simple residual block with two 3x3 convolutions. + + Args: + in_ch (int): number of input channels + out_ch (int): number of output channels + """ + + def __init__(self, in_ch, out_ch, leaky_relu_slope=0.01, inplace=False): + super().__init__() + self.conv1 = conv3x3(in_ch, out_ch) + self.leaky_relu = nn.LeakyReLU(negative_slope=leaky_relu_slope, inplace=inplace) + self.conv2 = conv3x3(out_ch, out_ch) + self.adaptor = None + if in_ch != out_ch: + self.adaptor = conv1x1(in_ch, out_ch) + + def forward(self, x): + identity = x + if self.adaptor is not None: + identity = self.adaptor(identity) + + out = self.conv1(x) + out = self.leaky_relu(out) + out = self.conv2(out) + out = self.leaky_relu(out) + + out = out + identity + return out + + +class DepthConv(nn.Module): + def __init__(self, in_ch, out_ch, slope=0.01, inplace=False): + super().__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(in_ch, in_ch, 1), + nn.LeakyReLU(negative_slope=slope, inplace=inplace), + ) + self.depth_conv = nn.Conv2d(in_ch, in_ch, 3, padding=1, groups=in_ch) + self.conv2 = nn.Conv2d(in_ch, out_ch, 1) + + self.adaptor = None + if in_ch != out_ch: + self.adaptor = nn.Conv2d(in_ch, out_ch, 1) + + def forward(self, x): + identity = x + if self.adaptor is not None: + identity = self.adaptor(identity) + + out = self.conv1(x) + out = self.depth_conv(out) + out = self.conv2(out) + + return out + identity + + +class DepthConv2(nn.Module): + def __init__(self, in_ch, out_ch, slope=0.01, inplace=False): + super().__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(in_ch, out_ch, 1), + nn.LeakyReLU(negative_slope=slope, inplace=inplace), + nn.Conv2d(out_ch, out_ch, 3, padding=1, groups=out_ch) + ) + self.conv2 = nn.Conv2d(in_ch, out_ch, 1) + self.out_conv = nn.Conv2d(out_ch, out_ch, 1) + self.adaptor = None + if in_ch != out_ch: + self.adaptor = nn.Conv2d(in_ch, out_ch, 1) + + def forward(self, x): + identity = x + if self.adaptor is not None: + identity = self.adaptor(x) + x1 = self.conv1(x) + x2 = self.conv2(x) + x = self.out_conv(x1 * x2) + return identity + x + + +class ConvFFN(nn.Module): + def __init__(self, in_ch, slope=0.1, inplace=False): + super().__init__() + internal_ch = max(min(in_ch * 4, 1024), in_ch * 2) + self.conv = nn.Sequential( + nn.Conv2d(in_ch, internal_ch, 1), + nn.LeakyReLU(negative_slope=slope, inplace=inplace), + nn.Conv2d(internal_ch, in_ch, 1), + nn.LeakyReLU(negative_slope=slope, inplace=inplace), + ) + + def forward(self, x): + identity = x + return identity + self.conv(x) + + +class ConvFFN2(nn.Module): + def __init__(self, in_ch, slope=0.1, inplace=False): + super().__init__() + expansion_factor = 2 + slope = 0.1 + internal_ch = in_ch * expansion_factor + self.conv = nn.Conv2d(in_ch, internal_ch * 2, 1) + self.conv_out = nn.Conv2d(internal_ch, in_ch, 1) + self.relu = nn.LeakyReLU(negative_slope=slope, inplace=inplace) + + def forward(self, x): + identity = x + x1, x2 = self.conv(x).chunk(2, 1) + out = x1 * self.relu(x2) + return identity + self.conv_out(out) + + +class ConvFFN3(nn.Module): + def __init__(self, in_ch, inplace=False): + super().__init__() + expansion_factor = 2 + internal_ch = in_ch * expansion_factor + self.conv = nn.Conv2d(in_ch, internal_ch * 2, 1) + self.conv_out = nn.Conv2d(internal_ch, in_ch, 1) + self.relu1 = nn.LeakyReLU(negative_slope=0.1, inplace=inplace) + self.relu2 = nn.LeakyReLU(negative_slope=0.01, inplace=inplace) + + def forward(self, x): + identity = x + x1, x2 = self.conv(x).chunk(2, 1) + out = self.relu1(x1) + self.relu2(x2) + return identity + self.conv_out(out) + + +class DepthConvBlock(nn.Module): + def __init__(self, in_ch, out_ch, slope_depth_conv=0.01, slope_ffn=0.1, inplace=False): + super().__init__() + self.block = nn.Sequential( + DepthConv(in_ch, out_ch, slope=slope_depth_conv, inplace=inplace), + ConvFFN(out_ch, slope=slope_ffn, inplace=inplace), + ) + + def forward(self, x): + return self.block(x) + + +class DepthConvBlock2(nn.Module): + def __init__(self, in_ch, out_ch, slope_depth_conv=0.01, slope_ffn=0.1, inplace=False): + super().__init__() + self.block = nn.Sequential( + DepthConv(in_ch, out_ch, slope=slope_depth_conv, inplace=inplace), + ConvFFN2(out_ch, slope=slope_ffn, inplace=inplace), + ) + + def forward(self, x): + return self.block(x) + + +class DepthConvBlock3(nn.Module): + def __init__(self, in_ch, out_ch, slope_depth_conv=0.01, slope_ffn=0.1, inplace=False): + super().__init__() + self.block = nn.Sequential( + DepthConv2(in_ch, out_ch, slope=slope_depth_conv, inplace=inplace), + ConvFFN2(out_ch, slope=slope_ffn, inplace=inplace), + ) + + def forward(self, x): + return self.block(x) + + +class DepthConvBlock4(nn.Module): + def __init__(self, in_ch, out_ch, slope_depth_conv=0.01, inplace=False): + super().__init__() + self.block = nn.Sequential( + DepthConv(in_ch, out_ch, slope=slope_depth_conv, inplace=inplace), + ConvFFN3(out_ch, inplace=inplace), + ) + + def forward(self, x): + return self.block(x) diff --git a/DCVC-FM/src/models/video_model.py b/DCVC-FM/src/models/video_model.py new file mode 100644 index 0000000..5c57698 --- /dev/null +++ b/DCVC-FM/src/models/video_model.py @@ -0,0 +1,581 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import time + +import torch +from torch import nn +import torch.utils.checkpoint + +from .common_model import CompressionModel +from .video_net import ME_Spynet, ResBlock, UNet2, bilinearupsacling, bilineardownsacling +from .layers import subpel_conv3x3, subpel_conv1x1, DepthConvBlock, DepthConvBlock4, \ + ResidualBlockWithStride, ResidualBlockUpsample +from .block_mc import block_mc_func +from ..utils.stream_helper import get_downsampled_shape, write_ip, write_p_frames + + +g_ch_1x = 48 +g_ch_2x = 64 +g_ch_4x = 96 +g_ch_8x = 96 +g_ch_16x = 128 +g_ch_z = 64 + + +class OffsetDiversity(nn.Module): + def __init__(self, in_channel=g_ch_1x, aux_feature_num=g_ch_1x+3+2, + offset_num=2, group_num=16, max_residue_magnitude=40, inplace=False): + super().__init__() + self.in_channel = in_channel + self.offset_num = offset_num + self.group_num = group_num + self.max_residue_magnitude = max_residue_magnitude + self.conv_offset = nn.Sequential( + nn.Conv2d(aux_feature_num, g_ch_2x, 3, 2, 1), + nn.LeakyReLU(negative_slope=0.1, inplace=inplace), + nn.Conv2d(g_ch_2x, g_ch_2x, 3, 1, 1), + nn.LeakyReLU(negative_slope=0.1, inplace=inplace), + nn.Conv2d(g_ch_2x, 3 * group_num * offset_num, 3, 1, 1), + ) + self.fusion = nn.Conv2d(in_channel * offset_num, in_channel, 1, 1, groups=group_num) + + def forward(self, x, aux_feature, flow): + B, C, H, W = x.shape + out = self.conv_offset(aux_feature) + out = bilinearupsacling(out) + o1, o2, mask = torch.chunk(out, 3, dim=1) + mask = torch.sigmoid(mask) + # offset + offset = self.max_residue_magnitude * torch.tanh(torch.cat((o1, o2), dim=1)) + offset = offset + flow.repeat(1, self.group_num * self.offset_num, 1, 1) + + # warp + offset = offset.view(B * self.group_num * self.offset_num, 2, H, W) + mask = mask.view(B * self.group_num * self.offset_num, 1, H, W) + x = x.repeat(1, self.offset_num, 1, 1) + x = x.view(B * self.group_num * self.offset_num, C // self.group_num, H, W) + x = block_mc_func(x, offset) + x = x * mask + x = x.view(B, C * self.offset_num, H, W) + x = self.fusion(x) + + return x + + +class FeatureExtractor(nn.Module): + def __init__(self, inplace=False): + super().__init__() + self.conv1 = nn.Conv2d(g_ch_1x, g_ch_1x, 3, stride=1, padding=1) + self.res_block1 = ResBlock(g_ch_1x, inplace=inplace) + self.conv2 = nn.Conv2d(g_ch_1x, g_ch_2x, 3, stride=2, padding=1) + self.res_block2 = ResBlock(g_ch_2x, inplace=inplace) + self.conv3 = nn.Conv2d(g_ch_2x, g_ch_4x, 3, stride=2, padding=1) + self.res_block3 = ResBlock(g_ch_4x, inplace=inplace) + + def forward(self, feature): + layer1 = self.conv1(feature) + layer1 = self.res_block1(layer1) + + layer2 = self.conv2(layer1) + layer2 = self.res_block2(layer2) + + layer3 = self.conv3(layer2) + layer3 = self.res_block3(layer3) + + return layer1, layer2, layer3 + + +class MultiScaleContextFusion(nn.Module): + def __init__(self, inplace=False): + super().__init__() + self.conv3_up = subpel_conv3x3(g_ch_4x, g_ch_2x, 2) + self.res_block3_up = ResBlock(g_ch_2x, inplace=inplace) + self.conv3_out = nn.Conv2d(g_ch_4x, g_ch_4x, 3, padding=1) + self.res_block3_out = ResBlock(g_ch_4x, inplace=inplace) + self.conv2_up = subpel_conv3x3(g_ch_2x * 2, g_ch_1x, 2) + self.res_block2_up = ResBlock(g_ch_1x, inplace=inplace) + self.conv2_out = nn.Conv2d(g_ch_2x * 2, g_ch_2x, 3, padding=1) + self.res_block2_out = ResBlock(g_ch_2x, inplace=inplace) + self.conv1_out = nn.Conv2d(g_ch_1x * 2, g_ch_1x, 3, padding=1) + self.res_block1_out = ResBlock(g_ch_1x, inplace=inplace) + + def forward(self, context1, context2, context3): + context3_up = self.conv3_up(context3) + context3_up = self.res_block3_up(context3_up) + context3_out = self.conv3_out(context3) + context3_out = self.res_block3_out(context3_out) + context2_up = self.conv2_up(torch.cat((context3_up, context2), dim=1)) + context2_up = self.res_block2_up(context2_up) + context2_out = self.conv2_out(torch.cat((context3_up, context2), dim=1)) + context2_out = self.res_block2_out(context2_out) + context1_out = self.conv1_out(torch.cat((context2_up, context1), dim=1)) + context1_out = self.res_block1_out(context1_out) + context1 = context1 + context1_out + context2 = context2 + context2_out + context3 = context3 + context3_out + + return context1, context2, context3 + + +class MvEnc(nn.Module): + def __init__(self, input_channel, channel, inplace=False): + super().__init__() + self.enc_1 = nn.Sequential( + ResidualBlockWithStride(input_channel, channel, stride=2, inplace=inplace), + DepthConvBlock4(channel, channel, inplace=inplace), + ) + self.enc_2 = ResidualBlockWithStride(channel, channel, stride=2, inplace=inplace) + + self.adaptor_0 = DepthConvBlock4(channel, channel, inplace=inplace) + self.adaptor_1 = DepthConvBlock4(channel * 2, channel, inplace=inplace) + self.enc_3 = nn.Sequential( + ResidualBlockWithStride(channel, channel, stride=2, inplace=inplace), + DepthConvBlock4(channel, channel, inplace=inplace), + nn.Conv2d(channel, channel, 3, stride=2, padding=1), + ) + + def forward(self, x, context, quant_step): + out = self.enc_1(x) + out = out * quant_step + out = self.enc_2(out) + if context is None: + out = self.adaptor_0(out) + else: + out = self.adaptor_1(torch.cat((out, context), dim=1)) + return self.enc_3(out) + + +class MvDec(nn.Module): + def __init__(self, output_channel, channel, inplace=False): + super().__init__() + self.dec_1 = nn.Sequential( + DepthConvBlock4(channel, channel, inplace=inplace), + ResidualBlockUpsample(channel, channel, 2, inplace=inplace), + DepthConvBlock4(channel, channel, inplace=inplace), + ResidualBlockUpsample(channel, channel, 2, inplace=inplace), + DepthConvBlock4(channel, channel, inplace=inplace) + ) + self.dec_2 = ResidualBlockUpsample(channel, channel, 2, inplace=inplace) + self.dec_3 = nn.Sequential( + DepthConvBlock4(channel, channel, inplace=inplace), + subpel_conv1x1(channel, output_channel, 2), + ) + + def forward(self, x, quant_step): + feature = self.dec_1(x) + out = self.dec_2(feature) + out = out * quant_step + mv = self.dec_3(out) + return mv, feature + + +class ContextualEncoder(nn.Module): + def __init__(self, inplace=False): + super().__init__() + self.conv1 = nn.Conv2d(g_ch_1x + 3, g_ch_2x, 3, stride=2, padding=1) + self.res1 = DepthConvBlock4(g_ch_2x * 2, g_ch_2x * 2, inplace=inplace) + self.conv2 = nn.Conv2d(g_ch_2x * 2, g_ch_4x, 3, stride=2, padding=1) + self.res2 = DepthConvBlock4(g_ch_4x * 2, g_ch_4x * 2, inplace=inplace) + self.conv3 = nn.Conv2d(g_ch_4x * 2, g_ch_8x, 3, stride=2, padding=1) + self.conv4 = nn.Conv2d(g_ch_8x, g_ch_16x, 3, stride=2, padding=1) + + def forward(self, x, context1, context2, context3, quant_step): + feature = self.conv1(torch.cat([x, context1], dim=1)) + feature = self.res1(torch.cat([feature, context2], dim=1)) + feature = feature * quant_step + feature = self.conv2(feature) + feature = self.res2(torch.cat([feature, context3], dim=1)) + feature = self.conv3(feature) + feature = self.conv4(feature) + return feature + + +class ContextualDecoder(nn.Module): + def __init__(self, inplace=False): + super().__init__() + self.up1 = subpel_conv3x3(g_ch_16x, g_ch_8x, 2) + self.up2 = subpel_conv3x3(g_ch_8x, g_ch_4x, 2) + self.res1 = DepthConvBlock4(g_ch_4x * 2, g_ch_4x * 2, inplace=inplace) + self.up3 = subpel_conv3x3(g_ch_4x * 2, g_ch_2x, 2) + self.res2 = DepthConvBlock4(g_ch_2x * 2, g_ch_2x * 2, inplace=inplace) + self.up4 = subpel_conv3x3(g_ch_2x * 2, 32, 2) + + def forward(self, x, context2, context3, quant_step): + feature = self.up1(x) + feature = self.up2(feature) + feature = self.res1(torch.cat([feature, context3], dim=1)) + feature = self.up3(feature) + feature = feature * quant_step + feature = self.res2(torch.cat([feature, context2], dim=1)) + feature = self.up4(feature) + return feature + + +class ReconGeneration(nn.Module): + def __init__(self, ctx_channel=g_ch_1x, res_channel=32, inplace=False): + super().__init__() + self.first_conv = nn.Conv2d(ctx_channel + res_channel, g_ch_1x, 3, stride=1, padding=1) + self.unet_1 = UNet2(g_ch_1x, g_ch_1x, inplace=inplace) + self.unet_2 = UNet2(g_ch_1x, g_ch_1x, inplace=inplace) + self.recon_conv = nn.Conv2d(g_ch_1x, 3, 3, stride=1, padding=1) + + def forward(self, ctx, res): + feature = self.first_conv(torch.cat((ctx, res), dim=1)) + feature = self.unet_1(feature) + feature = self.unet_2(feature) + recon = self.recon_conv(feature) + return feature, recon + + +class DMC(CompressionModel): + def __init__(self, ec_thread=False, stream_part=1, inplace=False): + super().__init__(y_distribution='laplace', z_channel=g_ch_z, mv_z_channel=64, + ec_thread=ec_thread, stream_part=stream_part) + + channel_mv = 64 + channel_N = 64 + + self.optic_flow = ME_Spynet() + self.align = OffsetDiversity(inplace=inplace) + + self.mv_encoder = MvEnc(2, channel_mv) + self.mv_hyper_prior_encoder = nn.Sequential( + DepthConvBlock4(channel_mv, channel_N, inplace=inplace), + nn.Conv2d(channel_N, channel_N, 3, stride=2, padding=1), + nn.LeakyReLU(inplace=inplace), + nn.Conv2d(channel_N, channel_N, 3, stride=2, padding=1), + ) + self.mv_hyper_prior_decoder = nn.Sequential( + ResidualBlockUpsample(channel_N, channel_N, 2, inplace=inplace), + ResidualBlockUpsample(channel_N, channel_N, 2, inplace=inplace), + DepthConvBlock4(channel_N, channel_mv), + ) + + self.mv_y_prior_fusion_adaptor_0 = DepthConvBlock(channel_mv * 1, channel_mv * 2, + inplace=inplace) + self.mv_y_prior_fusion_adaptor_1 = DepthConvBlock(channel_mv * 2, channel_mv * 2, + inplace=inplace) + + self.mv_y_prior_fusion = nn.Sequential( + DepthConvBlock(channel_mv * 2, channel_mv * 3, inplace=inplace), + DepthConvBlock(channel_mv * 3, channel_mv * 3, inplace=inplace), + ) + + self.mv_y_spatial_prior_adaptor_1 = nn.Conv2d(channel_mv * 4, channel_mv * 3, 1) + self.mv_y_spatial_prior_adaptor_2 = nn.Conv2d(channel_mv * 4, channel_mv * 3, 1) + self.mv_y_spatial_prior_adaptor_3 = nn.Conv2d(channel_mv * 4, channel_mv * 3, 1) + + self.mv_y_spatial_prior = nn.Sequential( + DepthConvBlock(channel_mv * 3, channel_mv * 3, inplace=inplace), + DepthConvBlock(channel_mv * 3, channel_mv * 3, inplace=inplace), + DepthConvBlock(channel_mv * 3, channel_mv * 2, inplace=inplace), + ) + + self.mv_decoder = MvDec(2, channel_mv, inplace=inplace) + + self.feature_adaptor_I = nn.Conv2d(3, g_ch_1x, 3, stride=1, padding=1) + self.feature_adaptor = nn.ModuleList([nn.Conv2d(g_ch_1x, g_ch_1x, 1) for _ in range(3)]) + self.feature_extractor = FeatureExtractor(inplace=inplace) + self.context_fusion_net = MultiScaleContextFusion(inplace=inplace) + + self.contextual_encoder = ContextualEncoder(inplace=inplace) + + self.contextual_hyper_prior_encoder = nn.Sequential( + DepthConvBlock4(g_ch_16x, g_ch_z, inplace=inplace), + nn.Conv2d(g_ch_z, g_ch_z, 3, stride=2, padding=1), + nn.LeakyReLU(inplace=inplace), + nn.Conv2d(g_ch_z, g_ch_z, 3, stride=2, padding=1), + ) + self.contextual_hyper_prior_decoder = nn.Sequential( + ResidualBlockUpsample(g_ch_z, g_ch_z, 2, inplace=inplace), + ResidualBlockUpsample(g_ch_z, g_ch_z, 2, inplace=inplace), + DepthConvBlock4(g_ch_z, g_ch_16x), + ) + + self.temporal_prior_encoder = nn.Sequential( + nn.Conv2d(g_ch_4x, g_ch_8x, 3, stride=2, padding=1), + nn.LeakyReLU(0.1, inplace=inplace), + nn.Conv2d(g_ch_8x, g_ch_16x, 3, stride=2, padding=1), + ) + + self.y_prior_fusion_adaptor_0 = DepthConvBlock(g_ch_16x * 2, g_ch_16x * 3, + inplace=inplace) + self.y_prior_fusion_adaptor_1 = DepthConvBlock(g_ch_16x * 3, g_ch_16x * 3, + inplace=inplace) + + self.y_prior_fusion = nn.Sequential( + DepthConvBlock(g_ch_16x * 3, g_ch_16x * 3, inplace=inplace), + DepthConvBlock(g_ch_16x * 3, g_ch_16x * 3, inplace=inplace), + ) + + self.y_spatial_prior_adaptor_1 = nn.Conv2d(g_ch_16x * 4, g_ch_16x * 3, 1) + self.y_spatial_prior_adaptor_2 = nn.Conv2d(g_ch_16x * 4, g_ch_16x * 3, 1) + self.y_spatial_prior_adaptor_3 = nn.Conv2d(g_ch_16x * 4, g_ch_16x * 3, 1) + + self.y_spatial_prior = nn.Sequential( + DepthConvBlock(g_ch_16x * 3, g_ch_16x * 3, inplace=inplace), + DepthConvBlock(g_ch_16x * 3, g_ch_16x * 3, inplace=inplace), + DepthConvBlock(g_ch_16x * 3, g_ch_16x * 2, inplace=inplace), + ) + + self.contextual_decoder = ContextualDecoder(inplace=inplace) + self.recon_generation_net = ReconGeneration(inplace=inplace) + + self.mv_y_q_enc = nn.Parameter(torch.ones((2, 1, 1, 1))) + self.mv_y_q_dec = nn.Parameter(torch.ones((2, 1, 1, 1))) + + self.y_q_enc = nn.Parameter(torch.ones((2, 1, 1, 1))) + self.y_q_dec = nn.Parameter(torch.ones((2, 1, 1, 1))) + + def multi_scale_feature_extractor(self, dpb, fa_idx): + if dpb["ref_feature"] is None: + feature = self.feature_adaptor_I(dpb["ref_frame"]) + else: + feature = self.feature_adaptor[fa_idx](dpb["ref_feature"]) + return self.feature_extractor(feature) + + def motion_compensation(self, dpb, mv, fa_idx): + warpframe = block_mc_func(dpb["ref_frame"], mv) + mv2 = bilineardownsacling(mv) / 2 + mv3 = bilineardownsacling(mv2) / 2 + ref_feature1, ref_feature2, ref_feature3 = self.multi_scale_feature_extractor(dpb, fa_idx) + context1_init = block_mc_func(ref_feature1, mv) + context1 = self.align(ref_feature1, torch.cat( + (context1_init, warpframe, mv), dim=1), mv) + context2 = block_mc_func(ref_feature2, mv2) + context3 = block_mc_func(ref_feature3, mv3) + context1, context2, context3 = self.context_fusion_net(context1, context2, context3) + return context1, context2, context3, warpframe + + def mv_prior_param_decoder(self, mv_z_hat, dpb, slice_shape=None): + mv_params = self.mv_hyper_prior_decoder(mv_z_hat) + mv_params = self.slice_to_y(mv_params, slice_shape) + ref_mv_y = dpb["ref_mv_y"] + if ref_mv_y is None: + mv_params = self.mv_y_prior_fusion_adaptor_0(mv_params) + else: + mv_params = torch.cat((mv_params, ref_mv_y), dim=1) + mv_params = self.mv_y_prior_fusion_adaptor_1(mv_params) + mv_params = self.mv_y_prior_fusion(mv_params) + return mv_params + + def contextual_prior_param_decoder(self, z_hat, dpb, context3, slice_shape=None): + hierarchical_params = self.contextual_hyper_prior_decoder(z_hat) + hierarchical_params = self.slice_to_y(hierarchical_params, slice_shape) + temporal_params = self.temporal_prior_encoder(context3) + ref_y = dpb["ref_y"] + if ref_y is None: + params = torch.cat((temporal_params, hierarchical_params), dim=1) + params = self.y_prior_fusion_adaptor_0(params) + else: + params = torch.cat((temporal_params, hierarchical_params, ref_y), dim=1) + params = self.y_prior_fusion_adaptor_1(params) + params = self.y_prior_fusion(params) + return params + + def get_recon_and_feature(self, y_hat, context1, context2, context3, y_q_dec): + recon_image_feature = self.contextual_decoder(y_hat, context2, context3, y_q_dec) + feature, x_hat = self.recon_generation_net(recon_image_feature, context1) + x_hat = x_hat.clamp_(0, 1) + return x_hat, feature + + def motion_estimation_and_mv_encoding(self, x, dpb, mv_y_q_enc): + est_mv = self.optic_flow(x, dpb["ref_frame"]) + ref_mv_feature = dpb["ref_mv_feature"] + mv_y = self.mv_encoder(est_mv, ref_mv_feature, mv_y_q_enc) + return mv_y + + def get_all_q(self, q_index): + mv_y_q_enc = self.get_curr_q(self.mv_y_q_enc, q_index) + mv_y_q_dec = self.get_curr_q(self.mv_y_q_dec, q_index) + y_q_enc = self.get_curr_q(self.y_q_enc, q_index) + y_q_dec = self.get_curr_q(self.y_q_dec, q_index) + return mv_y_q_enc, mv_y_q_dec, y_q_enc, y_q_dec + + def compress(self, x, dpb, q_index, fa_idx): + # pic_width and pic_height may be different from x's size. x here is after padding + # x_hat has the same size with x + mv_y_q_enc, mv_y_q_dec, y_q_enc, y_q_dec = self.get_all_q(q_index) + mv_y = self.motion_estimation_and_mv_encoding(x, dpb, mv_y_q_enc) + mv_y_pad, slice_shape = self.pad_for_y(mv_y) + mv_z = self.mv_hyper_prior_encoder(mv_y_pad) + mv_z_hat = torch.round(mv_z) + mv_params = self.mv_prior_param_decoder(mv_z_hat, dpb, slice_shape) + mv_y_q_w_0, mv_y_q_w_1, mv_y_q_w_2, mv_y_q_w_3, \ + mv_scales_w_0, mv_scales_w_1, mv_scales_w_2, mv_scales_w_3, mv_y_hat = \ + self.compress_four_part_prior( + mv_y, mv_params, + self.mv_y_spatial_prior_adaptor_1, self.mv_y_spatial_prior_adaptor_2, + self.mv_y_spatial_prior_adaptor_3, self.mv_y_spatial_prior) + + mv_hat, mv_feature = self.mv_decoder(mv_y_hat, mv_y_q_dec) + context1, context2, context3, _ = self.motion_compensation(dpb, mv_hat, fa_idx) + + y = self.contextual_encoder(x, context1, context2, context3, y_q_enc) + y_pad, slice_shape = self.pad_for_y(y) + z = self.contextual_hyper_prior_encoder(y_pad) + z_hat = torch.round(z) + params = self.contextual_prior_param_decoder(z_hat, dpb, context3, slice_shape) + y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, \ + scales_w_0, scales_w_1, scales_w_2, scales_w_3, y_hat = \ + self.compress_four_part_prior( + y, params, self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior) + + self.entropy_coder.reset() + self.bit_estimator_z_mv.encode(mv_z_hat, 0) + self.bit_estimator_z.encode(z_hat, 0) + self.gaussian_encoder.encode(mv_y_q_w_0, mv_scales_w_0) + self.gaussian_encoder.encode(mv_y_q_w_1, mv_scales_w_1) + self.gaussian_encoder.encode(mv_y_q_w_2, mv_scales_w_2) + self.gaussian_encoder.encode(mv_y_q_w_3, mv_scales_w_3) + self.gaussian_encoder.encode(y_q_w_0, scales_w_0) + self.gaussian_encoder.encode(y_q_w_1, scales_w_1) + self.gaussian_encoder.encode(y_q_w_2, scales_w_2) + self.gaussian_encoder.encode(y_q_w_3, scales_w_3) + self.entropy_coder.flush() + + x_hat, feature = self.get_recon_and_feature(y_hat, context1, context2, context3, y_q_dec) + bit_stream = self.entropy_coder.get_encoded_stream() + + result = { + "dpb": { + "ref_frame": x_hat, + "ref_feature": feature, + "ref_mv_feature": mv_feature, + "ref_y": y_hat, + "ref_mv_y": mv_y_hat, + }, + "bit_stream": bit_stream, + } + return result + + def decompress(self, bit_stream, dpb, sps): + dtype = next(self.parameters()).dtype + device = next(self.parameters()).device + torch.cuda.synchronize(device=device) + t0 = time.time() + _, mv_y_q_dec, _, y_q_dec = self.get_all_q(sps['qp']) + + if bit_stream is not None: + self.entropy_coder.set_stream(bit_stream) + z_size = get_downsampled_shape(sps['height'], sps['width'], 64) + y_height, y_width = get_downsampled_shape(sps['height'], sps['width'], 16) + slice_shape = self.get_to_y_slice_shape(y_height, y_width) + mv_z_hat = self.bit_estimator_z_mv.decode_stream(z_size, dtype, device, 0) + z_hat = self.bit_estimator_z.decode_stream(z_size, dtype, device, 0) + mv_params = self.mv_prior_param_decoder(mv_z_hat, dpb, slice_shape) + mv_y_hat = self.decompress_four_part_prior(mv_params, + self.mv_y_spatial_prior_adaptor_1, + self.mv_y_spatial_prior_adaptor_2, + self.mv_y_spatial_prior_adaptor_3, + self.mv_y_spatial_prior) + + mv_hat, mv_feature = self.mv_decoder(mv_y_hat, mv_y_q_dec) + context1, context2, context3, _ = self.motion_compensation(dpb, mv_hat, sps['fa_idx']) + + params = self.contextual_prior_param_decoder(z_hat, dpb, context3, slice_shape) + y_hat = self.decompress_four_part_prior(params, + self.y_spatial_prior_adaptor_1, + self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, + self.y_spatial_prior) + x_hat, feature = self.get_recon_and_feature(y_hat, context1, context2, context3, y_q_dec) + + torch.cuda.synchronize(device=device) + t1 = time.time() + return { + "dpb": { + "ref_frame": x_hat, + "ref_feature": feature, + "ref_mv_feature": mv_feature, + "ref_y": y_hat, + "ref_mv_y": mv_y_hat, + }, + "decoding_time": t1 - t0, + } + + def encode(self, x, dpb, q_index, fa_idx, sps_id=0, output_file=None): + # pic_width and pic_height may be different from x's size. x here is after padding + # x_hat has the same size with x + if output_file is None: + encoded = self.forward_one_frame(x, dpb, q_index=q_index, fa_idx=fa_idx) + result = { + "dpb": encoded['dpb'], + "bit": encoded['bit'].item(), + } + return result + + device = x.device + torch.cuda.synchronize(device=device) + t0 = time.time() + encoded = self.compress(x, dpb, q_index, fa_idx) + written = write_ip(output_file, False, sps_id, encoded['bit_stream']) + torch.cuda.synchronize(device=device) + t1 = time.time() + result = { + "dpb": encoded["dpb"], + "bit": written * 8, + "encoding_time": t1 - t0, + } + return result + + def forward_one_frame(self, x, dpb, q_index=None, fa_idx=0): + mv_y_q_enc, mv_y_q_dec, y_q_enc, y_q_dec = self.get_all_q(q_index) + index = self.get_index_tensor(0, x.device) + + est_mv = self.optic_flow(x, dpb["ref_frame"]) + mv_y = self.mv_encoder(est_mv, dpb["ref_mv_feature"], mv_y_q_enc) + + mv_y_pad, slice_shape = self.pad_for_y(mv_y) + mv_z = self.mv_hyper_prior_encoder(mv_y_pad) + mv_z_hat = self.quant(mv_z) + mv_params = self.mv_prior_param_decoder(mv_z_hat, dpb, slice_shape) + mv_y_res, mv_y_q, mv_y_hat, mv_scales_hat = self.forward_four_part_prior( + mv_y, mv_params, self.mv_y_spatial_prior_adaptor_1, self.mv_y_spatial_prior_adaptor_2, + self.mv_y_spatial_prior_adaptor_3, self.mv_y_spatial_prior) + + mv_hat, mv_feature = self.mv_decoder(mv_y_hat, mv_y_q_dec) + + context1, context2, context3, _ = self.motion_compensation(dpb, mv_hat, fa_idx) + + y = self.contextual_encoder(x, context1, context2, context3, y_q_enc) + y_pad, slice_shape = self.pad_for_y(y) + z = self.contextual_hyper_prior_encoder(y_pad) + z_hat = self.quant(z) + params = self.contextual_prior_param_decoder(z_hat, dpb, context3, slice_shape) + y_res, y_q, y_hat, scales_hat = self.forward_four_part_prior( + y, params, self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior) + x_hat, feature = self.get_recon_and_feature(y_hat, context1, context2, context3, y_q_dec) + + _, _, H, W = x.size() + pixel_num = H * W + + y_for_bit = y_q + mv_y_for_bit = mv_y_q + z_for_bit = z_hat + mv_z_for_bit = mv_z_hat + bits_y = self.get_y_laplace_bits(y_for_bit, scales_hat) + bits_mv_y = self.get_y_laplace_bits(mv_y_for_bit, mv_scales_hat) + bits_z = self.get_z_bits(z_for_bit, self.bit_estimator_z, index) + bits_mv_z = self.get_z_bits(mv_z_for_bit, self.bit_estimator_z_mv, index) + + bpp_y = torch.sum(bits_y, dim=(1, 2, 3)) / pixel_num + bpp_z = torch.sum(bits_z, dim=(1, 2, 3)) / pixel_num + bpp_mv_y = torch.sum(bits_mv_y, dim=(1, 2, 3)) / pixel_num + bpp_mv_z = torch.sum(bits_mv_z, dim=(1, 2, 3)) / pixel_num + + bpp = bpp_y + bpp_z + bpp_mv_y + bpp_mv_z + bit = torch.sum(bpp) * pixel_num + + return {"dpb": { + "ref_frame": x_hat, + "ref_feature": feature, + "ref_mv_feature": mv_feature, + "ref_y": y_hat, + "ref_mv_y": mv_y_hat, + }, + "bit": bit, + } diff --git a/DCVC-FM/src/models/video_net.py b/DCVC-FM/src/models/video_net.py new file mode 100644 index 0000000..68e2e3b --- /dev/null +++ b/DCVC-FM/src/models/video_net.py @@ -0,0 +1,209 @@ +import torch +from torch import nn +import torch.nn.functional as F + +from .layers import subpel_conv1x1, DepthConvBlock2, DepthConvBlock4 +from .block_mc import block_mc_func + + +def bilinearupsacling(inputfeature): + inputheight = inputfeature.size(2) + inputwidth = inputfeature.size(3) + outfeature = F.interpolate( + inputfeature, (inputheight * 2, inputwidth * 2), mode='bilinear', align_corners=False) + + return outfeature + + +def bilineardownsacling(inputfeature): + inputheight = inputfeature.size(2) + inputwidth = inputfeature.size(3) + outfeature = F.interpolate( + inputfeature, (inputheight // 2, inputwidth // 2), mode='bilinear', align_corners=False) + return outfeature + + +class ResBlock(nn.Module): + def __init__(self, channel, slope=0.01, end_with_relu=False, + bottleneck=False, inplace=False): + super().__init__() + in_channel = channel // 2 if bottleneck else channel + self.first_layer = nn.LeakyReLU(negative_slope=slope, inplace=False) + self.conv1 = nn.Conv2d(channel, in_channel, 3, padding=1) + self.relu = nn.LeakyReLU(negative_slope=slope, inplace=inplace) + self.conv2 = nn.Conv2d(in_channel, channel, 3, padding=1) + self.last_layer = self.relu if end_with_relu else nn.Identity() + + def forward(self, x): + identity = x + out = self.first_layer(x) + out = self.conv1(out) + out = self.relu(out) + out = self.conv2(out) + out = self.last_layer(out) + return identity + out + + +class MEBasic(nn.Module): + def __init__(self, complexity_level=0): + super().__init__() + self.relu = nn.ReLU() + self.by_pass = False + if complexity_level < 0: + self.by_pass = True + elif complexity_level == 0: + self.conv1 = nn.Conv2d(8, 32, 7, 1, padding=3) + self.conv2 = nn.Conv2d(32, 64, 7, 1, padding=3) + self.conv3 = nn.Conv2d(64, 32, 7, 1, padding=3) + self.conv4 = nn.Conv2d(32, 16, 7, 1, padding=3) + self.conv5 = nn.Conv2d(16, 2, 7, 1, padding=3) + elif complexity_level == 3: + self.conv1 = nn.Conv2d(8, 32, 5, 1, padding=2) + self.conv2 = nn.Conv2d(32, 64, 5, 1, padding=2) + self.conv3 = nn.Conv2d(64, 32, 5, 1, padding=2) + self.conv4 = nn.Conv2d(32, 16, 5, 1, padding=2) + self.conv5 = nn.Conv2d(16, 2, 5, 1, padding=2) + + def forward(self, x): + if self.by_pass: + return x[:, -2:, :, :] + + x = self.relu(self.conv1(x)) + x = self.relu(self.conv2(x)) + x = self.relu(self.conv3(x)) + x = self.relu(self.conv4(x)) + x = self.conv5(x) + return x + + +class ME_Spynet(nn.Module): + def __init__(self): + super().__init__() + self.me_8x = MEBasic(0) + self.me_4x = MEBasic(0) + self.me_2x = MEBasic(3) + self.me_1x = MEBasic(3) + + def forward(self, im1, im2): + batchsize = im1.size()[0] + + im1_1x = im1 + im1_2x = F.avg_pool2d(im1_1x, kernel_size=2, stride=2) + im1_4x = F.avg_pool2d(im1_2x, kernel_size=2, stride=2) + im1_8x = F.avg_pool2d(im1_4x, kernel_size=2, stride=2) + im2_1x = im2 + im2_2x = F.avg_pool2d(im2_1x, kernel_size=2, stride=2) + im2_4x = F.avg_pool2d(im2_2x, kernel_size=2, stride=2) + im2_8x = F.avg_pool2d(im2_4x, kernel_size=2, stride=2) + + shape_fine = im1_8x.size() + zero_shape = [batchsize, 2, shape_fine[2], shape_fine[3]] + flow_8x = torch.zeros(zero_shape, dtype=im1.dtype, device=im1.device) + flow_8x = self.me_8x(torch.cat((im1_8x, im2_8x, flow_8x), dim=1)) + + flow_4x = bilinearupsacling(flow_8x) * 2.0 + flow_4x = flow_4x + self.me_4x(torch.cat((im1_4x, + block_mc_func(im2_4x, flow_4x), + flow_4x), + dim=1)) + + flow_2x = bilinearupsacling(flow_4x) * 2.0 + flow_2x = flow_2x + self.me_2x(torch.cat((im1_2x, + block_mc_func(im2_2x, flow_2x), + flow_2x), + dim=1)) + + flow_1x = bilinearupsacling(flow_2x) * 2.0 + flow_1x = flow_1x + self.me_1x(torch.cat((im1_1x, + block_mc_func(im2_1x, flow_1x), + flow_1x), + dim=1)) + return flow_1x + + +class UNet(nn.Module): + def __init__(self, in_ch=64, out_ch=64, inplace=False): + super().__init__() + self.conv1 = DepthConvBlock2(in_ch, 32, inplace=inplace) + self.down1 = nn.Conv2d(32, 32, 2, stride=2) + self.conv2 = DepthConvBlock2(32, 64, inplace=inplace) + self.down2 = nn.Conv2d(64, 64, 2, stride=2) + self.conv3 = DepthConvBlock2(64, 128, inplace=inplace) + + self.context_refine = nn.Sequential( + DepthConvBlock2(128, 128, inplace=inplace), + DepthConvBlock2(128, 128, inplace=inplace), + DepthConvBlock2(128, 128, inplace=inplace), + DepthConvBlock2(128, 128, inplace=inplace), + ) + + self.up3 = subpel_conv1x1(128, 64, 2) + self.up_conv3 = DepthConvBlock2(128, 64, inplace=inplace) + + self.up2 = subpel_conv1x1(64, 32, 2) + self.up_conv2 = DepthConvBlock2(64, out_ch, inplace=inplace) + + def forward(self, x): + # encoding path + x1 = self.conv1(x) + x2 = self.down1(x1) + + x2 = self.conv2(x2) + x3 = self.down2(x2) + + x3 = self.conv3(x3) + x3 = self.context_refine(x3) + + # decoding + concat path + d3 = self.up3(x3) + d3 = torch.cat((x2, d3), dim=1) + d3 = self.up_conv3(d3) + + d2 = self.up2(d3) + d2 = torch.cat((x1, d2), dim=1) + d2 = self.up_conv2(d2) + return d2 + + +class UNet2(nn.Module): + def __init__(self, in_ch=64, out_ch=64, inplace=False): + super().__init__() + self.max_pool = nn.MaxPool2d(kernel_size=2, stride=2) + + self.conv1 = DepthConvBlock4(in_ch, 32, inplace=inplace) + self.conv2 = DepthConvBlock4(32, 64, inplace=inplace) + self.conv3 = DepthConvBlock4(64, 128, inplace=inplace) + + self.context_refine = nn.Sequential( + DepthConvBlock4(128, 128, inplace=inplace), + DepthConvBlock4(128, 128, inplace=inplace), + DepthConvBlock4(128, 128, inplace=inplace), + DepthConvBlock4(128, 128, inplace=inplace), + ) + + self.up3 = subpel_conv1x1(128, 64, 2) + self.up_conv3 = DepthConvBlock4(128, 64, inplace=inplace) + + self.up2 = subpel_conv1x1(64, 32, 2) + self.up_conv2 = DepthConvBlock4(64, out_ch, inplace=inplace) + + def forward(self, x): + # encoding path + x1 = self.conv1(x) + x2 = self.max_pool(x1) + + x2 = self.conv2(x2) + x3 = self.max_pool(x2) + + x3 = self.conv3(x3) + x3 = self.context_refine(x3) + + # decoding + concat path + d3 = self.up3(x3) + d3 = torch.cat((x2, d3), dim=1) + d3 = self.up_conv3(d3) + + d2 = self.up2(d3) + d2 = torch.cat((x1, d2), dim=1) + d2 = self.up_conv2(d2) + return d2 diff --git a/DCVC-FM/src/transforms/functional.py b/DCVC-FM/src/transforms/functional.py new file mode 100644 index 0000000..104554c --- /dev/null +++ b/DCVC-FM/src/transforms/functional.py @@ -0,0 +1,300 @@ +from typing import Tuple, Union + +import numpy as np +import scipy.ndimage +import torch +import torch.nn.functional as F + +from torch import Tensor + +YCBCR_WEIGHTS = { + # Spec: (K_r, K_g, K_b) with K_g = 1 - K_r - K_b + "ITU-R_BT.709": (0.2126, 0.7152, 0.0722) +} + + +def rgb_to_ycbcr420(rgb): + ''' + input is 3xhxw RGB float numpy array, in the range of [0, 1] + output is y: 1xhxw, uv: 2x(h/2)x(w/2), in the range of [0, 1] + ''' + c, h, w = rgb.shape + assert c == 3 + assert h % 2 == 0 + assert w % 2 == 0 + r, g, b = np.split(rgb, 3, axis=0) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + y = Kr * r + Kg * g + Kb * b + cb = 0.5 * (b - y) / (1 - Kb) + 0.5 + cr = 0.5 * (r - y) / (1 - Kr) + 0.5 + + # to 420 + cb = np.mean(np.reshape(cb, (1, h//2, 2, w//2, 2)), axis=(-1, -3)) + cr = np.mean(np.reshape(cr, (1, h//2, 2, w//2, 2)), axis=(-1, -3)) + uv = np.concatenate((cb, cr), axis=0) + + y = np.clip(y, 0., 1.) + uv = np.clip(uv, 0., 1.) + + return y, uv + + +def rgb_to_ycbcr444(rgb): + ''' + input is 3xhxw RGB float numpy array, in the range of [0, 1] + output is y: 1xhxw, uv: 2xhxw, in the range of [0, 1] + ''' + c, _, _ = rgb.shape + assert c == 3 + r, g, b = np.split(rgb, 3, axis=0) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + y = Kr * r + Kg * g + Kb * b + cb = 0.5 * (b - y) / (1 - Kb) + 0.5 + cr = 0.5 * (r - y) / (1 - Kr) + 0.5 + uv = np.concatenate((cb, cr), axis=0) + + y = np.clip(y, 0., 1.) + uv = np.clip(uv, 0., 1.) + + return y, uv + + +def ycbcr420_to_rgb(y, uv, order=1): + ''' + y is 1xhxw Y float numpy array, in the range of [0, 1] + uv is 2x(h/2)x(w/2) UV float numpy array, in the range of [0, 1] + order: 0 nearest neighbor, 1: binear (default) + return value is 3xhxw RGB float numpy array, in the range of [0, 1] + ''' + uv = scipy.ndimage.zoom(uv, (1, 2, 2), order=order) + cb = uv[0:1, :, :] + cr = uv[1:2, :, :] + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + r = y + (2 - 2 * Kr) * (cr - 0.5) + b = y + (2 - 2 * Kb) * (cb - 0.5) + g = (y - Kr * r - Kb * b) / Kg + rgb = np.concatenate((r, g, b), axis=0) + rgb = np.clip(rgb, 0., 1.) + return rgb + + +def ycbcr444_to_rgb(y, uv): + ''' + y is 1xhxw Y float numpy array, in the range of [0, 1] + uv is 2xhxw UV float numpy array, in the range of [0, 1] + return value is 3xhxw RGB float numpy array, in the range of [0, 1] + ''' + cb = uv[0:1, :, :] + cr = uv[1:2, :, :] + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + r = y + (2 - 2 * Kr) * (cr - 0.5) + b = y + (2 - 2 * Kb) * (cb - 0.5) + g = (y - Kr * r - Kb * b) / Kg + rgb = np.concatenate((r, g, b), axis=0) + rgb = np.clip(rgb, 0., 1.) + return rgb + + +def ycbcr420_to_444(y, uv, order=0, separate=False): + ''' + y is 1xhxw Y float numpy array, in the range of [0, 1] + uv is 2x(h/2)x(w/2) UV float numpy array, in the range of [0, 1] + order: 0 nearest neighbor (default), 1: binear + return value is 3xhxw YCbCr float numpy array, in the range of [0, 1] + ''' + uv = scipy.ndimage.zoom(uv, (1, 2, 2), order=order) + if separate: + return y, uv + yuv = np.concatenate((y, uv), axis=0) + return yuv + + +def ycbcr444_to_420(yuv): + ''' + input is 3xhxw YUV float numpy array, in the range of [0, 1] + output is y: 1xhxw, uv: 2x(h/2)x(w/x), in the range of [0, 1] + ''' + c, h, w = yuv.shape + assert c == 3 + assert h % 2 == 0 + assert w % 2 == 0 + y, u, v = np.split(yuv, 3, axis=0) + + # to 420 + u = np.mean(np.reshape(u, (1, h//2, 2, w//2, 2)), axis=(-1, -3)) + v = np.mean(np.reshape(v, (1, h//2, 2, w//2, 2)), axis=(-1, -3)) + uv = np.concatenate((u, v), axis=0) + + y = np.clip(y, 0., 1.) + uv = np.clip(uv, 0., 1.) + + return y, uv + + +def rgb_to_ycbcr(rgb): + ''' + input is 3xhxw RGB float numpy array, in the range of [0, 1] + output is yuv: 3xhxw, in the range of [0, 1] + ''' + c, h, w = rgb.shape + assert c == 3 + r, g, b = np.split(rgb, 3, axis=0) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + y = Kr * r + Kg * g + Kb * b + cb = 0.5 * (b - y) / (1 - Kb) + 0.5 + cr = 0.5 * (r - y) / (1 - Kr) + 0.5 + + yuv = np.concatenate((y, cb, cr), axis=0) + yuv = np.clip(yuv, 0., 1.) + + return yuv + + +def ycbcr_to_rgb(yuv): + ''' + yuv is 3xhxw YCbCr float numpy array, in the range of [0, 1] + return value is 3xhxw RGB float numpy array, in the range of [0, 1] + ''' + y, cb, cr = np.split(yuv, 3, axis=0) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + r = y + (2 - 2 * Kr) * (cr - 0.5) + b = y + (2 - 2 * Kb) * (cb - 0.5) + g = (y - Kr * r - Kb * b) / Kg + rgb = np.concatenate((r, g, b), axis=0) + rgb = np.clip(rgb, 0., 1.) + return rgb + + +def _check_input_tensor(tensor: Tensor) -> None: + if ( + not isinstance(tensor, Tensor) + or not tensor.is_floating_point() + or not len(tensor.size()) in (3, 4) + or not tensor.size(-3) == 3 + ): + raise ValueError( + "Expected a 3D or 4D tensor with shape (Nx3xHxW) or (3xHxW) as input" + ) + + +def rgb2ycbcr(rgb: Tensor) -> Tensor: + """RGB to YCbCr conversion for torch Tensor. + Using ITU-R BT.709 coefficients. + + Args: + rgb (torch.Tensor): 3D or 4D floating point RGB tensor + + Returns: + ycbcr (torch.Tensor): converted tensor + """ + _check_input_tensor(rgb) + + r, g, b = rgb.chunk(3, -3) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + y = Kr * r + Kg * g + Kb * b + cb = 0.5 * (b - y) / (1 - Kb) + 0.5 + cr = 0.5 * (r - y) / (1 - Kr) + 0.5 + ycbcr = torch.cat((y, cb, cr), dim=-3) + ycbcr = torch.clamp(ycbcr, 0., 1.) + return ycbcr + + +def down_and_upsample(yuv: Tensor) -> Tensor: + y, u, v = yuv.chunk(3, 1) + u = F.avg_pool2d(u, kernel_size=2, stride=2) + u = F.interpolate(u, scale_factor=2, mode='nearest') + v = F.avg_pool2d(v, kernel_size=2, stride=2) + v = F.interpolate(v, scale_factor=2, mode='nearest') + return torch.cat((y, u, v), dim=1) + + +def ycbcr2rgb(ycbcr: Tensor) -> Tensor: + """YCbCr to RGB conversion for torch Tensor. + Using ITU-R BT.709 coefficients. + + Args: + ycbcr (torch.Tensor): 3D or 4D floating point RGB tensor + + Returns: + rgb (torch.Tensor): converted tensor + """ + _check_input_tensor(ycbcr) + + y, cb, cr = ycbcr.chunk(3, -3) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + r = y + (2 - 2 * Kr) * (cr - 0.5) + b = y + (2 - 2 * Kb) * (cb - 0.5) + g = (y - Kr * r - Kb * b) / Kg + rgb = torch.cat((r, g, b), dim=-3) + rgb = torch.clamp(rgb, 0., 1.) + return rgb + + +def yuv_444_to_420( + yuv: Union[Tensor, Tuple[Tensor, Tensor, Tensor]], + mode: str = "avg_pool", +) -> Tuple[Tensor, Tensor, Tensor]: + """Convert a 444 tensor to a 420 representation. + + Args: + yuv (torch.Tensor or (torch.Tensor, torch.Tensor, torch.Tensor)): 444 + input to be downsampled. Takes either a (Nx3xHxW) tensor or a tuple + of 3 (Nx1xHxW) tensors. + mode (str): algorithm used for downsampling: ``'avg_pool'``. Default + ``'avg_pool'`` + + Returns: + (torch.Tensor, torch.Tensor, torch.Tensor): Converted 420 + """ + if mode not in ("avg_pool",): + raise ValueError(f'Invalid downsampling mode "{mode}".') + + if mode == "avg_pool": + + def _downsample(tensor): + return F.avg_pool2d(tensor, kernel_size=2, stride=2) + + if isinstance(yuv, torch.Tensor): + y, u, v = yuv.chunk(3, 1) + else: + y, u, v = yuv + + return (y, _downsample(u), _downsample(v)) + + +def yuv_420_to_444( + yuv: Tuple[Tensor, Tensor, Tensor], + mode: str = "bilinear", + return_tuple: bool = False, +) -> Union[Tensor, Tuple[Tensor, Tensor, Tensor]]: + """Convert a 420 input to a 444 representation. + + Args: + yuv (torch.Tensor, torch.Tensor, torch.Tensor): 420 input frames in + (Nx1xHxW) format + mode (str): algorithm used for upsampling: ``'bilinear'`` | + ``'nearest'`` Default ``'bilinear'`` + return_tuple (bool): return input as tuple of tensors instead of a + concatenated tensor, 3 (Nx1xHxW) tensors instead of one (Nx3xHxW) + tensor (default: False) + + Returns: + (torch.Tensor or (torch.Tensor, torch.Tensor, torch.Tensor)): Converted + 444 + """ + if len(yuv) != 3 or any(not isinstance(c, torch.Tensor) for c in yuv): + raise ValueError("Expected a tuple of 3 torch tensors") + + if mode not in ("bilinear", "nearest"): + raise ValueError(f'Invalid upsampling mode "{mode}".') + + if mode in ("bilinear", "nearest"): + + def _upsample(tensor): + return F.interpolate(tensor, scale_factor=2, mode=mode, align_corners=False) + + y, u, v = yuv + u, v = _upsample(u), _upsample(v) + if return_tuple: + return y, u, v + return torch.cat((y, u, v), dim=1) diff --git a/DCVC-FM/src/transforms/transforms.py b/DCVC-FM/src/transforms/transforms.py new file mode 100644 index 0000000..a9f7e59 --- /dev/null +++ b/DCVC-FM/src/transforms/transforms.py @@ -0,0 +1,118 @@ +from . import functional as F_transforms + +__all__ = [ + "RGB2YCbCr", + "YCbCr2RGB", + "YUV444To420", + "YUV420To444", +] + + +class RGB2YCbCr: + """Convert a RGB tensor to YCbCr. + The tensor is expected to be in the [0, 1] floating point range, with a + shape of (3xHxW) or (Nx3xHxW). + """ + + def __call__(self, rgb): + """ + Args: + rgb (torch.Tensor): 3D or 4D floating point RGB tensor + + Returns: + ycbcr(torch.Tensor): converted tensor + """ + return F_transforms.rgb2ycbcr(rgb) + + def ___repr__(self): + return f"{self.__class__.__name__}()" + + +class YCbCr2RGB: + """Convert a YCbCr tensor to RGB. + The tensor is expected to be in the [0, 1] floating point range, with a + shape of (3xHxW) or (Nx3xHxW). + """ + + def __call__(self, ycbcr): + """ + Args: + ycbcr(torch.Tensor): 3D or 4D floating point RGB tensor + + Returns: + rgb(torch.Tensor): converted tensor + """ + return F_transforms.ycbcr2rgb(ycbcr) + + def ___repr__(self): + return f"{self.__class__.__name__}()" + + +class YUV444To420: + """Convert a YUV 444 tensor to a 420 representation. + + Args: + mode (str): algorithm used for downsampling: ``'avg_pool'``. Default + ``'avg_pool'`` + + Example: + >>> x = torch.rand(1, 3, 32, 32) + >>> y, u, v = YUV444To420()(x) + >>> y.size() # 1, 1, 32, 32 + >>> u.size() # 1, 1, 16, 16 + """ + + def __init__(self, mode: str = "avg_pool"): + self.mode = str(mode) + + def __call__(self, yuv): + """ + Args: + yuv (torch.Tensor or (torch.Tensor, torch.Tensor, torch.Tensor)): + 444 input to be downsampled. Takes either a (Nx3xHxW) tensor or + a tuple of 3 (Nx1xHxW) tensors. + + Returns: + (torch.Tensor, torch.Tensor, torch.Tensor): Converted 420 + """ + return F_transforms.yuv_444_to_420(yuv, mode=self.mode) + + def ___repr__(self): + return f"{self.__class__.__name__}()" + + +class YUV420To444: + """Convert a YUV 420 input to a 444 representation. + + Args: + mode (str): algorithm used for upsampling: ``'bilinear'`` | ``'nearest'``. + Default ``'bilinear'`` + return_tuple (bool): return input as tuple of tensors instead of a + concatenated tensor, 3 (Nx1xHxW) tensors instead of one (Nx3xHxW) + tensor (default: False) + + Example: + >>> y = torch.rand(1, 1, 32, 32) + >>> u, v = torch.rand(1, 1, 16, 16), torch.rand(1, 1, 16, 16) + >>> x = YUV420To444()((y, u, v)) + >>> x.size() # 1, 3, 32, 32 + """ + + def __init__(self, mode: str = "bilinear", return_tuple: bool = False): + self.mode = str(mode) + self.return_tuple = bool(return_tuple) + + def __call__(self, yuv): + """ + Args: + yuv (torch.Tensor, torch.Tensor, torch.Tensor): 420 input frames in + (Nx1xHxW) format + + Returns: + (torch.Tensor or (torch.Tensor, torch.Tensor, torch.Tensor)): Converted + 444 + """ + return F_transforms.yuv_420_to_444(yuv, return_tuple=self.return_tuple) + + def ___repr__(self): + return f"{self.__class__.__name__}(return_tuple={self.return_tuple})" diff --git a/DCVC-FM/src/utils/common.py b/DCVC-FM/src/utils/common.py new file mode 100644 index 0000000..658cdb5 --- /dev/null +++ b/DCVC-FM/src/utils/common.py @@ -0,0 +1,148 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import json +import os +from unittest.mock import patch + +import numpy as np + + + +def str2bool(v): + return str(v).lower() in ("yes", "y", "true", "t", "1") + + +def create_folder(path, print_if_create=False): + if not os.path.exists(path): + os.makedirs(path) + if print_if_create: + print(f"created folder: {path}") + + +@patch('json.encoder.c_make_encoder', None) +def dump_json(obj, fid, float_digits=-1, **kwargs): + of = json.encoder._make_iterencode # pylint: disable=W0212 + + def inner(*args, **kwargs): + args = list(args) + # fifth argument is float formater which we will replace + args[4] = lambda o: format(o, '.%df' % float_digits) + return of(*args, **kwargs) + + with patch('json.encoder._make_iterencode', wraps=inner): + json.dump(obj, fid, **kwargs) + + +def generate_log_json(frame_num, frame_pixel_num, test_time, frame_types, bits, psnrs, ssims, + verbose=False): + include_yuv = len(psnrs[0]) > 1 + assert not include_yuv or (len(psnrs[0]) == 4 and len(ssims[0]) == 4) + i_bits = 0 + i_psnr = 0 + i_psnr_y = 0 + i_psnr_u = 0 + i_psnr_v = 0 + i_ssim = 0 + i_ssim_y = 0 + i_ssim_u = 0 + i_ssim_v = 0 + p_bits = 0 + p_psnr = 0 + p_psnr_y = 0 + p_psnr_u = 0 + p_psnr_v = 0 + p_ssim = 0 + p_ssim_y = 0 + p_ssim_u = 0 + p_ssim_v = 0 + i_num = 0 + p_num = 0 + for idx in range(frame_num): + if frame_types[idx] == 0: + i_bits += bits[idx] + i_psnr += psnrs[idx][0] + i_ssim += ssims[idx][0] + i_num += 1 + if include_yuv: + i_psnr_y += psnrs[idx][1] + i_psnr_u += psnrs[idx][2] + i_psnr_v += psnrs[idx][3] + i_ssim_y += ssims[idx][1] + i_ssim_u += ssims[idx][2] + i_ssim_v += ssims[idx][3] + else: + p_bits += bits[idx] + p_psnr += psnrs[idx][0] + p_ssim += ssims[idx][0] + p_num += 1 + if include_yuv: + p_psnr_y += psnrs[idx][1] + p_psnr_u += psnrs[idx][2] + p_psnr_v += psnrs[idx][3] + p_ssim_y += ssims[idx][1] + p_ssim_u += ssims[idx][2] + p_ssim_v += ssims[idx][3] + + log_result = {} + log_result['frame_pixel_num'] = frame_pixel_num + log_result['i_frame_num'] = i_num + log_result['p_frame_num'] = p_num + log_result['ave_i_frame_bpp'] = i_bits / i_num / frame_pixel_num + log_result['ave_i_frame_psnr'] = i_psnr / i_num + log_result['ave_i_frame_msssim'] = i_ssim / i_num + if include_yuv: + log_result['ave_i_frame_psnr_y'] = i_psnr_y / i_num + log_result['ave_i_frame_psnr_u'] = i_psnr_u / i_num + log_result['ave_i_frame_psnr_v'] = i_psnr_v / i_num + log_result['ave_i_frame_msssim_y'] = i_ssim_y / i_num + log_result['ave_i_frame_msssim_u'] = i_ssim_u / i_num + log_result['ave_i_frame_msssim_v'] = i_ssim_v / i_num + if verbose: + log_result['frame_bpp'] = list(np.array(bits) / frame_pixel_num) + log_result['frame_psnr'] = [v[0] for v in psnrs] + log_result['frame_msssim'] = [v[0] for v in ssims] + log_result['frame_type'] = frame_types + if include_yuv: + log_result['frame_psnr_y'] = [v[1] for v in psnrs] + log_result['frame_psnr_u'] = [v[2] for v in psnrs] + log_result['frame_psnr_v'] = [v[3] for v in psnrs] + log_result['frame_msssim_y'] = [v[1] for v in ssims] + log_result['frame_msssim_u'] = [v[2] for v in ssims] + log_result['frame_msssim_v'] = [v[3] for v in ssims] + log_result['test_time'] = test_time + if p_num > 0: + total_p_pixel_num = p_num * frame_pixel_num + log_result['ave_p_frame_bpp'] = p_bits / total_p_pixel_num + log_result['ave_p_frame_psnr'] = p_psnr / p_num + log_result['ave_p_frame_msssim'] = p_ssim / p_num + if include_yuv: + log_result['ave_p_frame_psnr_y'] = p_psnr_y / p_num + log_result['ave_p_frame_psnr_u'] = p_psnr_u / p_num + log_result['ave_p_frame_psnr_v'] = p_psnr_v / p_num + log_result['ave_p_frame_msssim_y'] = p_ssim_y / p_num + log_result['ave_p_frame_msssim_u'] = p_ssim_u / p_num + log_result['ave_p_frame_msssim_v'] = p_ssim_v / p_num + else: + log_result['ave_p_frame_bpp'] = 0 + log_result['ave_p_frame_psnr'] = 0 + log_result['ave_p_frame_msssim'] = 0 + if include_yuv: + log_result['ave_p_frame_psnr_y'] = 0 + log_result['ave_p_frame_psnr_u'] = 0 + log_result['ave_p_frame_psnr_v'] = 0 + log_result['ave_p_frame_msssim_y'] = 0 + log_result['ave_p_frame_msssim_u'] = 0 + log_result['ave_p_frame_msssim_v'] = 0 + log_result['ave_all_frame_bpp'] = (i_bits + p_bits) / (frame_num * frame_pixel_num) + log_result['ave_all_frame_psnr'] = (i_psnr + p_psnr) / frame_num + log_result['ave_all_frame_msssim'] = (i_ssim + p_ssim) / frame_num + if include_yuv: + log_result['ave_all_frame_psnr_y'] = (i_psnr_y + p_psnr_y) / frame_num + log_result['ave_all_frame_psnr_u'] = (i_psnr_u + p_psnr_u) / frame_num + log_result['ave_all_frame_psnr_v'] = (i_psnr_v + p_psnr_v) / frame_num + log_result['ave_all_frame_msssim_y'] = (i_ssim_y + p_ssim_y) / frame_num + log_result['ave_all_frame_msssim_u'] = (i_ssim_u + p_ssim_u) / frame_num + log_result['ave_all_frame_msssim_v'] = (i_ssim_v + p_ssim_v) / frame_num + + return log_result diff --git a/DCVC-FM/src/utils/metrics.py b/DCVC-FM/src/utils/metrics.py new file mode 100644 index 0000000..828d230 --- /dev/null +++ b/DCVC-FM/src/utils/metrics.py @@ -0,0 +1,94 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import numpy as np +from scipy import signal +from scipy import ndimage + + +def fspecial_gauss(size, sigma): + x, y = np.mgrid[-size // 2 + 1:size // 2 + 1, -size // 2 + 1:size // 2 + 1] + g = np.exp(-((x**2 + y**2) / (2.0 * sigma**2))) + return g / g.sum() + + +def calc_ssim(img1, img2, data_range=255): + img1 = img1.astype(np.float64) + img2 = img2.astype(np.float64) + size = 11 + sigma = 1.5 + window = fspecial_gauss(size, sigma) + K1 = 0.01 + K2 = 0.03 + C1 = (K1 * data_range)**2 + C2 = (K2 * data_range)**2 + mu1 = signal.fftconvolve(window, img1, mode='valid') + mu2 = signal.fftconvolve(window, img2, mode='valid') + mu1_sq = mu1 * mu1 + mu2_sq = mu2 * mu2 + mu1_mu2 = mu1 * mu2 + sigma1_sq = signal.fftconvolve(window, img1 * img1, mode='valid') - mu1_sq + sigma2_sq = signal.fftconvolve(window, img2 * img2, mode='valid') - mu2_sq + sigma12 = signal.fftconvolve(window, img1 * img2, mode='valid') - mu1_mu2 + + return (((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * + (sigma1_sq + sigma2_sq + C2)), + (2.0 * sigma12 + C2) / (sigma1_sq + sigma2_sq + C2)) + + +def calc_msssim(img1, img2, data_range=255): + ''' + img1 and img2 are 2D arrays + ''' + level = 5 + weight = np.array([0.0448, 0.2856, 0.3001, 0.2363, 0.1333]) + height, width = img1.shape + if height < 176 or width < 176: + # according to HM implementation + level = 4 + weight = np.array([0.0517, 0.3295, 0.3462, 0.2726]) + if height < 88 or width < 88: + assert False + downsample_filter = np.ones((2, 2)) / 4.0 + im1 = img1.astype(np.float64) + im2 = img2.astype(np.float64) + mssim = np.array([]) + mcs = np.array([]) + for _ in range(level): + ssim_map, cs_map = calc_ssim(im1, im2, data_range=data_range) + mssim = np.append(mssim, ssim_map.mean()) + mcs = np.append(mcs, cs_map.mean()) + filtered_im1 = ndimage.filters.convolve(im1, downsample_filter, + mode='reflect') + filtered_im2 = ndimage.filters.convolve(im2, downsample_filter, + mode='reflect') + im1 = filtered_im1[::2, ::2] + im2 = filtered_im2[::2, ::2] + return (np.prod(mcs[0:level - 1]**weight[0:level - 1]) * + (mssim[level - 1]**weight[level - 1])) + + +def calc_msssim_rgb(img1, img2, data_range=255): + ''' + img1 and img2 are arrays with 3xHxW + ''' + msssim = 0 + for i in range(3): + msssim += calc_msssim(img1[i, :, :], img2[i, :, :], data_range) + return msssim / 3 + + +def calc_psnr(img1, img2, data_range=255): + ''' + img1 and img2 are arrays with same shape + ''' + img1 = img1.astype(np.float64) + img2 = img2.astype(np.float64) + mse = np.mean(np.square(img1 - img2)) + if np.isnan(mse) or np.isinf(mse): + return -999.9 + if mse > 1e-10: + psnr = 10 * np.log10(data_range * data_range / mse) + else: + psnr = 999.9 + return psnr diff --git a/DCVC-FM/src/utils/stream_helper.py b/DCVC-FM/src/utils/stream_helper.py new file mode 100644 index 0000000..ff2b815 --- /dev/null +++ b/DCVC-FM/src/utils/stream_helper.py @@ -0,0 +1,249 @@ +# Copyright 2020 InterDigital Communications, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import enum +import struct +from pathlib import Path + +import torch +from torch.nn.modules.utils import consume_prefix_in_state_dict_if_present + + +def get_padding_size(height, width, p=64): + new_h = (height + p - 1) // p * p + new_w = (width + p - 1) // p * p + # padding_left = (new_w - width) // 2 + padding_left = 0 + padding_right = new_w - width - padding_left + # padding_top = (new_h - height) // 2 + padding_top = 0 + padding_bottom = new_h - height - padding_top + return padding_left, padding_right, padding_top, padding_bottom + + +def get_downsampled_shape(height, width, p): + new_h = (height + p - 1) // p * p + new_w = (width + p - 1) // p * p + return int(new_h / p + 0.5), int(new_w / p + 0.5) + + +def get_state_dict(ckpt_path): + ckpt = torch.load(ckpt_path, map_location=torch.device('cpu')) + if "state_dict" in ckpt: + ckpt = ckpt['state_dict'] + if "net" in ckpt: + ckpt = ckpt["net"] + consume_prefix_in_state_dict_if_present(ckpt, prefix="module.") + return ckpt + + +def filesize(filepath: str) -> int: + if not Path(filepath).is_file(): + raise ValueError(f'Invalid file "{filepath}".') + return Path(filepath).stat().st_size + + +def write_uints(fd, values, fmt=">{:d}I"): + fd.write(struct.pack(fmt.format(len(values)), *values)) + return len(values) * 4 + + +def write_uchars(fd, values, fmt=">{:d}B"): + fd.write(struct.pack(fmt.format(len(values)), *values)) + return len(values) + + +def read_uints(fd, n, fmt=">{:d}I"): + sz = struct.calcsize("I") + return struct.unpack(fmt.format(n), fd.read(n * sz)) + + +def read_uchars(fd, n, fmt=">{:d}B"): + sz = struct.calcsize("B") + return struct.unpack(fmt.format(n), fd.read(n * sz)) + + +def write_bytes(fd, values, fmt=">{:d}s"): + if len(values) == 0: + return 0 + fd.write(struct.pack(fmt.format(len(values)), values)) + return len(values) + + +def read_bytes(fd, n, fmt=">{:d}s"): + sz = struct.calcsize("s") + return struct.unpack(fmt.format(n), fd.read(n * sz))[0] + + +def write_ushorts(fd, values, fmt=">{:d}H"): + fd.write(struct.pack(fmt.format(len(values)), *values)) + return len(values) * 2 + + +def read_ushorts(fd, n, fmt=">{:d}H"): + sz = struct.calcsize("H") + return struct.unpack(fmt.format(n), fd.read(n * sz)) + + +def write_uint_adaptive(f, a): + if a <= 32767: + a0 = a & 0xff + a1 = a >> 8 + write_uchars(f, (a1, a0)) + return 2 + + assert a < (1 << 30) + a0 = a & 0xff + a1 = (a >> 8) & 0xff + a2 = (a >> 16) & 0xff + a3 = (a >> 24) & 0xff + a3 = a3 | (1 << 7) + write_uchars(f, (a3, a2, a1, a0)) + return 4 + + +def read_uint_adaptive(f): + a3 = read_uchars(f, 1)[0] + a2 = read_uchars(f, 1)[0] + + if (a3 >> 7) == 0: + return (a3 << 8) + a2 + a3 = a3 & 0x7f + a1 = read_uchars(f, 1)[0] + a0 = read_uchars(f, 1)[0] + return (a3 << 24) + (a2 << 16) + (a1 << 8) + a0 + + +class NalType(enum.IntEnum): + NAL_SPS = 0 + NAL_I = 1 + NAL_P = 2 + NAL_Ps = 3 + + +class SPSHelper(): + def __init__(self): + super().__init__() + self.spss = [] + + def get_sps_id(self, target_sps): + min_id = -1 + for sps in self.spss: + if sps['height'] == target_sps['height'] and sps['width'] == target_sps['width'] and \ + sps['qp'] == target_sps['qp'] and sps['fa_idx'] == target_sps['fa_idx']: + return sps['sps_id'], False + if sps['sps_id'] > min_id: + min_id = sps['sps_id'] + assert min_id < 15 + sps = target_sps.copy() + sps['sps_id'] = min_id + 1 + self.spss.append(sps) + return sps['sps_id'], True + + def add_sps_by_id(self, sps): + for i in range(len(self.spss)): + if self.spss[i]['sps_id'] == sps['sps_id']: + self.spss[i] = sps.copy() + return + self.spss.append(sps.copy()) + + def get_sps_by_id(self, sps_id): + for sps in self.spss: + if sps['sps_id'] == sps_id: + return sps + return None + + +def write_sps(f, sps): + # nal_type(4), sps_id(4) + # height (variable) + # width (vairable) + # qp(6), fa_idx(2) + assert sps['sps_id'] < 16 + assert sps['qp'] < 64 + assert sps['fa_idx'] < 4 + written = 0 + flag = int((NalType.NAL_SPS << 4) + sps['sps_id']) + written += write_uchars(f, (flag,)) + written += write_uint_adaptive(f, sps['height']) + written += write_uint_adaptive(f, sps['width']) + flag = (sps['qp'] << 2) + sps['fa_idx'] + written += write_uchars(f, (flag,)) + return written + + +def read_header(f): + header = {} + flag = read_uchars(f, 1)[0] + nal_type = flag >> 4 + header['nal_type'] = NalType(nal_type) + if nal_type < 3: + header['sps_id'] = flag & 0x0f + return header + + frame_num_minus1 = flag & 0x0f + frame_num = frame_num_minus1 + 1 + header['frame_num'] = frame_num + sps_ids = [] + for _ in range(0, frame_num, 2): + flag = read_uchars(f, 1)[0] + sps_ids.append(flag >> 4) + sps_ids.append(flag & 0x0f) + sps_ids = sps_ids[:frame_num] + header['sps_ids'] = sps_ids + return header + + +def read_sps_remaining(f, sps_id): + sps = {} + sps['sps_id'] = sps_id + sps['height'] = read_uint_adaptive(f) + sps['width'] = read_uint_adaptive(f) + flag = read_uchars(f, 1)[0] + sps['qp'] = flag >> 2 + sps['fa_idx'] = flag & 0x03 + return sps + + +def write_ip(f, is_i_frame, sps_id, bit_stream): + written = 0 + flag = (int(NalType.NAL_I if is_i_frame else NalType.NAL_P) << 4) + sps_id + written += write_uchars(f, (flag,)) + # we write all the streams in the same file, thus, we need to write the per-frame length + # if packed independently, we do not need to write it + written += write_uint_adaptive(f, len(bit_stream)) + written += write_bytes(f, bit_stream) + return written + + +def read_ip_remaining(f): + stream_length = read_uint_adaptive(f) + bit_stream = read_bytes(f, stream_length) + return bit_stream + + +def write_p_frames(f, sps_ids, bit_stream): + frame_num_minus1 = len(sps_ids) - 1 + assert frame_num_minus1 < 16 + written = 0 + flag = (int(NalType.NAL_Ps) << 4) + frame_num_minus1 + written += write_uchars(f, (flag,)) + if len(sps_ids) % 2 == 1: + sps_ids.append(0) + for i in range(0, len(sps_ids), 2): + flag = (sps_ids[i] << 4) + sps_ids[i+1] + written += write_uchars(f, (flag,)) + written += write_uint_adaptive(f, len(bit_stream)) + written += write_bytes(f, bit_stream) + return written diff --git a/DCVC-FM/src/utils/test_helper.py b/DCVC-FM/src/utils/test_helper.py new file mode 100644 index 0000000..f11a40b --- /dev/null +++ b/DCVC-FM/src/utils/test_helper.py @@ -0,0 +1,486 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +import json +import multiprocessing +import os +import time +from pathlib import Path + +import torch +import torch.nn.functional as F +import numpy as np + +from src.models.video_model import DMC +from src.models.image_model import DMCI + +from src.utils.common import str2bool, create_folder, generate_log_json +from src.utils.stream_helper import get_padding_size, get_state_dict, SPSHelper, NalType, \ + write_sps, read_header, read_sps_remaining, read_ip_remaining +from src.utils.video_reader import PNGReader, YUVReader +from src.utils.video_writer import PNGWriter, YUVWriter +from src.utils.metrics import calc_psnr, calc_msssim, calc_msssim_rgb +from src.transforms.functional import ycbcr444_to_420, ycbcr420_to_444, \ + rgb_to_ycbcr444, ycbcr444_to_rgb + + +def parse_args(): + parser = argparse.ArgumentParser(description="Example testing script") + + parser.add_argument("--ec_thread", type=str2bool, default=False) + parser.add_argument("--stream_part_i", type=int, default=1) + parser.add_argument("--stream_part_p", type=int, default=1) + parser.add_argument('--model_path_i', type=str) + parser.add_argument('--model_path_p', type=str) + parser.add_argument('--rate_num', type=int, default=4) + parser.add_argument('--q_indexes_i', type=int, nargs="+") + parser.add_argument('--q_indexes_p', type=int, nargs="+") + parser.add_argument("--force_intra", type=str2bool, default=False) + parser.add_argument("--force_frame_num", type=int, default=-1) + parser.add_argument("--force_intra_period", type=int, default=-1) + parser.add_argument("--rate_gop_size", type=int, default=8, choices=[4, 8]) + parser.add_argument('--reset_interval', type=int, default=32, required=False) + parser.add_argument('--test_config', type=str, required=True) + parser.add_argument('--force_root_path', type=str, default=None, required=False) + parser.add_argument("--worker", "-w", type=int, default=1, help="worker number") + parser.add_argument('--float16', type=str2bool, default=False) + parser.add_argument("--cuda", type=str2bool, default=False) + parser.add_argument('--cuda_idx', type=int, nargs="+", help='GPU indexes to use') + parser.add_argument('--calc_ssim', type=str2bool, default=False, required=False) + parser.add_argument('--write_stream', type=str2bool, default=False) + parser.add_argument('--stream_path', type=str, default="out_bin") + parser.add_argument('--save_decoded_frame', type=str2bool, default=False) + parser.add_argument('--output_path', type=str, required=True) + parser.add_argument('--verbose_json', type=str2bool, default=False) + parser.add_argument('--verbose', type=int, default=0) + + args = parser.parse_args() + return args + + +def np_image_to_tensor(img): + image = torch.from_numpy(img).type(torch.FloatTensor) + image = image.unsqueeze(0) + return image + + +def get_src_reader(args): + if args['src_type'] == 'png': + src_reader = PNGReader(args['src_path'], args['src_width'], args['src_height']) + elif args['src_type'] == 'yuv420': + src_reader = YUVReader(args['src_path'], args['src_width'], args['src_height']) + return src_reader + + +def get_src_frame(args, src_reader, device): + if args['src_type'] == 'yuv420': + y, uv = src_reader.read_one_frame(dst_format="420") + yuv = ycbcr420_to_444(y, uv) + x = np_image_to_tensor(yuv) + y = y[0, :, :] + u = uv[0, :, :] + v = uv[1, :, :] + rgb = None + else: + assert args['src_type'] == 'png' + rgb = src_reader.read_one_frame(dst_format="rgb") + y, uv = rgb_to_ycbcr444(rgb) + u, v = None, None + yuv = np.concatenate((y, uv), axis=0) + x = np_image_to_tensor(yuv) + + if args['float16']: + x = x.to(torch.float16) + x = x.to(device) + return x, y, u, v, rgb + + +def get_distortion(args, x_hat, y, u, v, rgb): + if args['src_type'] == 'yuv420': + yuv_rec = x_hat.squeeze(0).cpu().numpy() + y_rec, uv_rec = ycbcr444_to_420(yuv_rec) + y_rec = y_rec[0, :, :] + u_rec = uv_rec[0, :, :] + v_rec = uv_rec[1, :, :] + psnr_y = calc_psnr(y, y_rec, data_range=1) + psnr_u = calc_psnr(u, u_rec, data_range=1) + psnr_v = calc_psnr(v, v_rec, data_range=1) + psnr = (6 * psnr_y + psnr_u + psnr_v) / 8 + if args['calc_ssim']: + ssim_y = calc_msssim(y, y_rec, data_range=1) + ssim_u = calc_msssim(u, u_rec, data_range=1) + ssim_v = calc_msssim(v, v_rec, data_range=1) + else: + ssim_y, ssim_u, ssim_v = 0., 0., 0. + ssim = (6 * ssim_y + ssim_u + ssim_v) / 8 + + curr_psnr = [psnr, psnr_y, psnr_u, psnr_v] + curr_ssim = [ssim, ssim_y, ssim_u, ssim_v] + else: + assert args['src_type'] == 'png' + yuv_rec = x_hat.squeeze(0).cpu().numpy() + rgb_rec = ycbcr444_to_rgb(yuv_rec[:1, :, :], yuv_rec[1:, :, :]) + psnr = calc_psnr(rgb, rgb_rec, data_range=1) + if args['calc_ssim']: + msssim = calc_msssim_rgb(rgb, rgb_rec, data_range=1) + else: + msssim = 0. + curr_psnr = [psnr] + curr_ssim = [msssim] + return curr_psnr, curr_ssim + + +def run_one_point_fast(p_frame_net, i_frame_net, args): + frame_num = args['frame_num'] + rate_gop_size = args['rate_gop_size'] + verbose = args['verbose'] + reset_interval = args['reset_interval'] + verbose_json = args['verbose_json'] + device = next(i_frame_net.parameters()).device + + frame_types = [] + psnrs = [] + msssims = [] + bits = [] + index_map = [0, 1, 0, 2, 0, 2, 0, 2] + + start_time = time.time() + src_reader = get_src_reader(args) + pic_height = args['src_height'] + pic_width = args['src_width'] + padding_l, padding_r, padding_t, padding_b = get_padding_size(pic_height, pic_width, 16) + + with torch.no_grad(): + for frame_idx in range(frame_num): + frame_start_time = time.time() + x, y, u, v, rgb = get_src_frame(args, src_reader, device) + + # pad if necessary + x_padded = F.pad(x, (padding_l, padding_r, padding_t, padding_b), mode="replicate") + + if frame_idx % args['intra_period'] == 0: + result = i_frame_net.encode(x_padded, args['q_index_i']) + dpb = { + "ref_frame": result["x_hat"], + "ref_feature": None, + "ref_mv_feature": None, + "ref_y": None, + "ref_mv_y": None, + } + recon_frame = result["x_hat"] + frame_types.append(0) + bits.append(result["bit"]) + else: + if reset_interval > 0 and frame_idx % reset_interval == 1: + dpb["ref_feature"] = None + fa_idx = index_map[frame_idx % rate_gop_size] + result = p_frame_net.encode(x_padded, dpb, args['q_index_p'], fa_idx) + + dpb = result["dpb"] + recon_frame = dpb["ref_frame"] + frame_types.append(1) + bits.append(result['bit']) + + recon_frame = recon_frame.clamp_(0, 1) + x_hat = F.pad(recon_frame, (-padding_l, -padding_r, -padding_t, -padding_b)) + frame_end_time = time.time() + curr_psnr, curr_ssim = get_distortion(args, x_hat, y, u, v, rgb) + psnrs.append(curr_psnr) + msssims.append(curr_ssim) + + if verbose >= 2: + print(f"frame {frame_idx}, {frame_end_time - frame_start_time:.3f} seconds, " + f"bits: {bits[-1]:.3f}, PSNR: {psnrs[-1][0]:.4f}, " + f"MS-SSIM: {msssims[-1][0]:.4f} ") + + src_reader.close() + test_time = time.time() - start_time + + log_result = generate_log_json(frame_num, pic_height * pic_width, test_time, + frame_types, bits, psnrs, msssims, verbose=verbose_json) + return log_result + + +def run_one_point_with_stream(p_frame_net, i_frame_net, args): + frame_num = args['frame_num'] + rate_gop_size = args['rate_gop_size'] + save_decoded_frame = args['save_decoded_frame'] + verbose = args['verbose'] + reset_interval = args['reset_interval'] + verbose_json = args['verbose_json'] + device = next(i_frame_net.parameters()).device + + src_reader = get_src_reader(args) + pic_height = args['src_height'] + pic_width = args['src_width'] + padding_l, padding_r, padding_t, padding_b = get_padding_size(pic_height, pic_width, 16) + + frame_types = [] + psnrs = [] + msssims = [] + bits = [] + + start_time = time.time() + p_frame_number = 0 + overall_p_encoding_time = 0 + overall_p_decoding_time = 0 + index_map = [0, 1, 0, 2, 0, 2, 0, 2] + + bitstream_path = Path(args['curr_bin_path']) + output_file = bitstream_path.open("wb") + sps_helper = SPSHelper() + outstanding_sps_bytes = 0 + sps_buffer = [] + + with torch.no_grad(): + for frame_idx in range(frame_num): + frame_start_time = time.time() + x, y, u, v, rgb = get_src_frame(args, src_reader, device) + + # pad if necessary + x_padded = F.pad(x, (padding_l, padding_r, padding_t, padding_b), mode="replicate") + + if frame_idx % args['intra_period'] == 0: + sps = { + 'sps_id': -1, + 'height': pic_height, + 'width': pic_width, + 'qp': args['q_index_i'], + 'fa_idx': 0, + } + sps_id, sps_new = sps_helper.get_sps_id(sps) + sps['sps_id'] = sps_id + if sps_new: + outstanding_sps_bytes += write_sps(output_file, sps) + if verbose >= 2: + print("new sps", sps) + result = i_frame_net.encode(x_padded, args['q_index_i'], sps_id, output_file) + dpb = { + "ref_frame": result["x_hat"], + "ref_feature": None, + "ref_mv_feature": None, + "ref_y": None, + "ref_mv_y": None, + } + recon_frame = result["x_hat"] + frame_types.append(0) + bits.append(result["bit"] + outstanding_sps_bytes * 8) + outstanding_sps_bytes = 0 + else: + fa_idx = index_map[frame_idx % rate_gop_size] + if reset_interval > 0 and frame_idx % reset_interval == 1: + dpb["ref_feature"] = None + fa_idx = 3 + + sps = { + 'sps_id': -1, + 'height': pic_height, + 'width': pic_width, + 'qp': args['q_index_p'], + 'fa_idx': fa_idx, + } + sps_id, sps_new = sps_helper.get_sps_id(sps) + sps['sps_id'] = sps_id + if sps_new: + outstanding_sps_bytes += write_sps(output_file, sps) + if verbose >= 2: + print("new sps", sps) + result = p_frame_net.encode(x_padded, dpb, args['q_index_p'], fa_idx, sps_id, + output_file) + + dpb = result["dpb"] + recon_frame = dpb["ref_frame"] + frame_types.append(1) + bits.append(result['bit'] + outstanding_sps_bytes * 8) + outstanding_sps_bytes = 0 + p_frame_number += 1 + overall_p_encoding_time += result['encoding_time'] + + recon_frame = recon_frame.clamp_(0, 1) + x_hat = F.pad(recon_frame, (-padding_l, -padding_r, -padding_t, -padding_b)) + frame_end_time = time.time() + curr_psnr, curr_ssim = get_distortion(args, x_hat, y, u, v, rgb) + psnrs.append(curr_psnr) + msssims.append(curr_ssim) + + if verbose >= 2: + print(f"frame {frame_idx} encoded, {frame_end_time - frame_start_time:.3f} s, " + f"bits: {bits[-1]}, PSNR: {psnrs[-1][0]:.4f}, " + f"MS-SSIM: {msssims[-1][0]:.4f} ") + + src_reader.close() + output_file.close() + sps_helper = SPSHelper() + input_file = bitstream_path.open("rb") + decoded_frame_number = 0 + src_reader = get_src_reader(args) + + if save_decoded_frame: + if args['src_type'] == 'png': + recon_writer = PNGWriter(args['bin_folder'], args['src_width'], args['src_height']) + elif args['src_type'] == 'yuv420': + recon_writer = YUVWriter(args['curr_rec_path'], args['src_width'], args['src_height']) + pending_frame_spss = [] + with torch.no_grad(): + while decoded_frame_number < frame_num: + new_stream = False + if len(pending_frame_spss) == 0: + header = read_header(input_file) + if header['nal_type'] == NalType.NAL_SPS: + sps = read_sps_remaining(input_file, header['sps_id']) + sps_helper.add_sps_by_id(sps) + if verbose >= 2: + print("new sps", sps) + continue + if header['nal_type'] == NalType.NAL_Ps: + pending_frame_spss = header['sps_ids'][1:] + sps_id = header['sps_ids'][0] + else: + sps_id = header['sps_id'] + new_stream = True + else: + sps_id = pending_frame_spss[0] + pending_frame_spss.pop(0) + sps = sps_helper.get_sps_by_id(sps_id) + if new_stream: + bit_stream = read_ip_remaining(input_file) + else: + bit_stream = None + frame_start_time = time.time() + x, y, u, v, rgb = get_src_frame(args, src_reader, device) + if header['nal_type'] == NalType.NAL_I: + decoded = i_frame_net.decompress(bit_stream, sps) + dpb = { + "ref_frame": decoded["x_hat"], + "ref_feature": None, + "ref_mv_feature": None, + "ref_y": None, + "ref_mv_y": None, + } + recon_frame = decoded["x_hat"] + elif header['nal_type'] == NalType.NAL_P or header['nal_type'] == NalType.NAL_Ps: + if sps['fa_idx'] == 3: + dpb["ref_feature"] = None + decoded = p_frame_net.decompress(bit_stream, dpb, sps) + dpb = decoded["dpb"] + recon_frame = dpb["ref_frame"] + overall_p_decoding_time += decoded['decoding_time'] + + recon_frame = recon_frame.clamp_(0, 1) + x_hat = F.pad(recon_frame, (-padding_l, -padding_r, -padding_t, -padding_b)) + frame_end_time = time.time() + curr_psnr, curr_ssim = get_distortion(args, x_hat, y, u, v, rgb) + assert psnrs[decoded_frame_number][0] == curr_psnr[0] + + if verbose >= 2: + stream_length = 0 if bit_stream is None else len(bit_stream) * 8 + print(f"frame {decoded_frame_number} decoded, " + f"{frame_end_time - frame_start_time:.3f} s, " + f"bits: {stream_length}, PSNR: {curr_psnr[0]:.4f} ") + + if save_decoded_frame: + yuv_rec = x_hat.squeeze(0).cpu().numpy() + if args['src_type'] == 'yuv420': + y_rec, uv_rec = ycbcr444_to_420(yuv_rec) + recon_writer.write_one_frame(y=y_rec, uv=uv_rec, src_format='420') + else: + assert args['src_type'] == 'png' + rgb_rec = ycbcr444_to_rgb(yuv_rec[:1, :, :], yuv_rec[1:, :, :]) + recon_writer.write_one_frame(rgb=rgb_rec, src_format='rgb') + decoded_frame_number += 1 + input_file.close() + src_reader.close() + + if save_decoded_frame: + recon_writer.close() + + test_time = time.time() - start_time + if verbose >= 1 and p_frame_number > 0: + print(f"encoding/decoding {p_frame_number} P frames, " + f"average encoding time {overall_p_encoding_time/p_frame_number * 1000:.0f} ms, " + f"average decoding time {overall_p_decoding_time/p_frame_number * 1000:.0f} ms.") + + log_result = generate_log_json(frame_num, pic_height * pic_width, test_time, + frame_types, bits, psnrs, msssims, verbose=verbose_json) + with open(args['curr_json_path'], 'w') as fp: + json.dump(log_result, fp, indent=2) + return log_result + + +i_frame_net = None # the model is initialized after each process is spawn, thus OK for multiprocess +p_frame_net = None + + +def worker(args): + global i_frame_net + global p_frame_net + + sub_dir_name = args['seq'] + bin_folder = os.path.join(args['stream_path'], args['ds_name']) + if args['write_stream']: + create_folder(bin_folder, True) + + args['src_path'] = os.path.join(args['dataset_path'], sub_dir_name) + args['bin_folder'] = bin_folder + args['curr_bin_path'] = os.path.join(bin_folder, + f"{args['seq']}_q{args['q_index_i']}.bin") + args['curr_rec_path'] = args['curr_bin_path'].replace('.bin', '.yuv') + args['curr_json_path'] = args['curr_bin_path'].replace('.bin', '.json') + + if args['write_stream']: + result = run_one_point_with_stream(p_frame_net, i_frame_net, args) + else: + result = run_one_point_fast(p_frame_net, i_frame_net, args) + + result['ds_name'] = args['ds_name'] + result['seq'] = args['seq'] + result['rate_idx'] = args['rate_idx'] + + return result + + +def init_func(args, gpu_num): + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + torch.manual_seed(0) + torch.set_num_threads(1) + np.random.seed(seed=0) + + process_name = multiprocessing.current_process().name + process_idx = int(process_name[process_name.rfind('-') + 1:]) + gpu_id = -1 + if gpu_num > 0: + gpu_id = process_idx % gpu_num + if gpu_id >= 0: + if args.cuda_idx is not None: + gpu_id = args.cuda_idx[gpu_id] + os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id) + device = "cuda:0" + else: + device = "cpu" + + global i_frame_net + i_state_dict = get_state_dict(args.model_path_i) + i_frame_net = DMCI(ec_thread=args.ec_thread, stream_part=args.stream_part_i, inplace=True) + i_frame_net.load_state_dict(i_state_dict) + i_frame_net = i_frame_net.to(device) + i_frame_net.eval() + + global p_frame_net + if not args.force_intra: + p_state_dict = get_state_dict(args.model_path_p) + p_frame_net = DMC(ec_thread=args.ec_thread, stream_part=args.stream_part_p, inplace=True) + p_frame_net.load_state_dict(p_state_dict) + p_frame_net = p_frame_net.to(device) + p_frame_net.eval() + + if args.write_stream: + if p_frame_net is not None: + p_frame_net.update(force=True) + i_frame_net.update(force=True) + + if args.float16: + if p_frame_net is not None: + p_frame_net.half() + i_frame_net.half() diff --git a/DCVC-FM/src/utils/video_reader.py b/DCVC-FM/src/utils/video_reader.py new file mode 100644 index 0000000..c25c9d6 --- /dev/null +++ b/DCVC-FM/src/utils/video_reader.py @@ -0,0 +1,184 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os + +import numpy as np +from PIL import Image +from ..transforms.functional import rgb_to_ycbcr420, ycbcr420_to_rgb, ycbcr444_to_rgb, \ + ycbcr444_to_420, rgb_to_ycbcr444 + + +class VideoReader(): + def __init__(self, src_path, width, height): + self.src_path = src_path + self.width = width + self.height = height + self.eof = False + + def read_one_frame(self, dst_format='rgb'): + ''' + y is 1xhxw Y float numpy array, in the range of [0, 1] + uv is 2x(h/2)x(w/2) UV float numpy array, in the range of [0, 1] + rgb is 3xhxw float numpy array, in the range of [0, 1] + ''' + raise NotImplementedError + + @staticmethod + def _none_exist_frame(dst_format): + if dst_format == "420": + return None, None + assert dst_format == "rgb" + return None + + @staticmethod + def _get_dst_format(rgb=None, y=None, uv=None, src_format='rgb', dst_format='rgb'): + if dst_format == 'rgb': + if src_format == '420': + rgb = ycbcr420_to_rgb(y, uv, order=1) + elif src_format == '444': + rgb = ycbcr444_to_rgb(y, uv) + return rgb + elif dst_format == '420': + if src_format == 'rgb': + y, uv = rgb_to_ycbcr420(rgb) + elif src_format == '444': + y, uv = ycbcr444_to_420(np.concatenate((y, uv), axis=0)) + return y, uv + elif dst_format == '444': + if src_format == 'rgb': + y, uv = rgb_to_ycbcr444(rgb) + elif src_format == '420': + y, uv = ycbcr444_to_420(y, uv) + return y, uv + assert False + + +class PNGReader(VideoReader): + def __init__(self, src_path, width, height, start_num=1): + super().__init__(src_path, width, height) + + pngs = os.listdir(self.src_path) + if 'im1.png' in pngs: + self.padding = 1 + elif 'im00001.png' in pngs: + self.padding = 5 + else: + raise ValueError('unknown image naming convention; please specify') + self.current_frame_index = start_num + + def read_one_frame(self, dst_format="rgb"): + if self.eof: + return self._none_exist_frame(dst_format) + + png_path = os.path.join(self.src_path, + f"im{str(self.current_frame_index).zfill(self.padding)}.png" + ) + if not os.path.exists(png_path): + self.eof = True + return self._none_exist_frame(dst_format) + + rgb = Image.open(png_path).convert('RGB') + rgb = np.asarray(rgb).astype('float32').transpose(2, 0, 1) + rgb = rgb / 255. + _, height, width = rgb.shape + assert height == self.height + assert width == self.width + + self.current_frame_index += 1 + return self._get_dst_format(rgb=rgb, src_format='rgb', dst_format=dst_format) + + def close(self): + self.current_frame_index = 1 + + +class RGBReader(VideoReader): + def __init__(self, src_path, width, height, src_format='rgb', bit_depth=8): + super().__init__(src_path, width, height) + + self.src_format = src_format + self.bit_depth = bit_depth + self.rgb_size = width * height * 3 + self.dtype = np.uint8 + self.max_val = 255 + if bit_depth > 8 and bit_depth <= 16: + self.rgb_size = self.rgb_size * 2 + self.dtype = np.uint16 + self.max_val = (1 << bit_depth) - 1 + else: + assert bit_depth == 8 + # pylint: disable=R1732 + self.file = open(src_path, "rb") + # pylint: enable=R1732 + + def read_one_frame(self, dst_format="420"): + if self.eof: + return self._none_exist_frame(dst_format) + rgb = self.file.read(self.rgb_size) + if not rgb: + self.eof = True + return self._none_exist_frame(dst_format) + rgb = np.frombuffer(rgb, dtype=self.dtype).copy().reshape(3, self.height, self.width) + rgb = rgb.astype(np.float32) / self.max_val + + return self._get_dst_format(rgb=rgb, src_format='rgb', dst_format=dst_format) + + def close(self): + self.file.close() + + +class YUVReader(VideoReader): + def __init__(self, src_path, width, height, src_format='420', bit_depth=8, skip_frame=0): + super().__init__(src_path, width, height) + if not src_path.endswith('.yuv'): + src_path = src_path + '.yuv' + self.src_path = src_path + + self.src_format = src_format + self.y_size = width * height + self.uv_size = self.y_size * 2 + self.uv_width = width + self.uv_height = height + self.src_format = '444' + if src_format == '420': + self.src_format = '420' + self.uv_size = width * height // 2 + self.uv_width = width // 2 + self.uv_height = height // 2 + self.dtype = np.uint8 + self.max_val = 255 + if bit_depth > 8 and bit_depth <= 16: + self.y_size = self.y_size * 2 + self.uv_size = self.uv_size * 2 + self.dtype = np.uint16 + self.max_val = (1 << bit_depth) - 1 + else: + assert bit_depth == 8 + # pylint: disable=R1732 + self.file = open(src_path, "rb") + # pylint: enable=R1732 + skipped_frame = 0 + while not self.eof and skipped_frame < skip_frame: + y = self.file.read(self.y_size) + uv = self.file.read(self.uv_size) + if not y or not uv: + self.eof = True + skipped_frame += 1 + + def read_one_frame(self, dst_format="420"): + if self.eof: + return self._none_exist_frame(dst_format) + y = self.file.read(self.y_size) + uv = self.file.read(self.uv_size) + if not y or not uv: + self.eof = True + return self._none_exist_frame(dst_format) + y = np.frombuffer(y, dtype=self.dtype).copy().reshape(1, self.height, self.width) + uv = np.frombuffer(uv, dtype=self.dtype).copy().reshape(2, self.uv_height, self.uv_width) + y = y.astype(np.float32) / self.max_val + uv = uv.astype(np.float32) / self.max_val + + return self._get_dst_format(y=y, uv=uv, src_format=self.src_format, dst_format=dst_format) + + def close(self): + self.file.close() diff --git a/DCVC-FM/src/utils/video_writer.py b/DCVC-FM/src/utils/video_writer.py new file mode 100644 index 0000000..b1063aa --- /dev/null +++ b/DCVC-FM/src/utils/video_writer.py @@ -0,0 +1,131 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os + +import numpy as np +from PIL import Image +from ..transforms.functional import ycbcr420_to_rgb, rgb_to_ycbcr420, ycbcr444_to_rgb, \ + rgb_to_ycbcr444, ycbcr420_to_444, ycbcr444_to_420 + + +class VideoWriter(): + def __init__(self, dst_path, width, height): + self.dst_path = dst_path + self.width = width + self.height = height + + def write_one_frame(self, rgb=None, y=None, uv=None, src_format="rgb"): + ''' + y is 1xhxw Y float numpy array, in the range of [0, 1] + uv is 2x(h/2)x(w/2) UV float numpy array, in the range of [0, 1] + rgb is 3xhxw float numpy array, in the range of [0, 1] + ''' + raise NotImplementedError + + +class PNGWriter(VideoWriter): + def __init__(self, dst_path, width, height): + super().__init__(dst_path, width, height) + self.padding = 5 + self.current_frame_index = 1 + os.makedirs(dst_path, exist_ok=True) + + def write_one_frame(self, rgb=None, y=None, uv=None, src_format="rgb"): + if src_format == "420": + rgb = ycbcr420_to_rgb(y, uv, order=1) + elif src_format == "444": + rgb = ycbcr444_to_rgb(y, uv) + rgb = rgb.transpose(1, 2, 0) + + png_path = os.path.join(self.dst_path, + f"im{str(self.current_frame_index).zfill(self.padding)}.png" + ) + img = np.clip(np.rint(rgb * 255), 0, 255).astype(np.uint8) + Image.fromarray(img).save(png_path) + + self.current_frame_index += 1 + + def close(self): + self.current_frame_index = 1 + + +class RGBWriter(VideoWriter): + def __init__(self, dst_path, width, height, dst_format='rgb', bit_depth=8): + super().__init__(dst_path, width, height) + + self.dst_format = dst_format + self.bit_depth = bit_depth + self.rgb_size = width * height * 3 + self.dtype = np.uint8 + self.max_val = 255 + if bit_depth > 8 and bit_depth <= 16: + self.rgb_size = self.rgb_size * 2 + self.dtype = np.uint16 + self.max_val = (1 << bit_depth) - 1 + else: + assert bit_depth == 8 + # pylint: disable=R1732 + self.file = open(dst_path, "wb") + # pylint: enable=R1732 + + def write_one_frame(self, rgb=None, y=None, uv=None, src_format="rgb"): + if src_format == '420': + rgb = ycbcr420_to_rgb(y, uv, order=1) + elif src_format == '444': + rgb = ycbcr444_to_rgb(y, uv) + rgb = np.clip(np.rint(rgb * self.max_val), 0, self.max_val).astype(self.dtype) + + self.file.write(rgb.tobytes()) + + def close(self): + self.file.close() + + +class YUVWriter(VideoWriter): + def __init__(self, dst_path, width, height, dst_format='420', bit_depth=8): + super().__init__(dst_path, width, height) + if not dst_path.endswith('.yuv'): + dst_path = dst_path + '/out.yuv' + self.dst_path = dst_path + + self.dst_format = dst_format + self.y_size = width * height + self.uv_size = width * height + if dst_format == '420': + self.uv_size = width * height // 2 + self.bit_depth = bit_depth + self.dtype = np.uint8 + self.max_val = 255 + if bit_depth > 8 and bit_depth <= 16: + self.y_size = self.y_size * 2 + self.uv_size = self.uv_size * 2 + self.dtype = np.uint16 + self.max_val = (1 << bit_depth) - 1 + else: + assert bit_depth == 8 + self.eof = False + # pylint: disable=R1732 + self.file = open(dst_path, "wb") + # pylint: enable=R1732 + + def write_one_frame(self, rgb=None, y=None, uv=None, src_format="420"): + if src_format == 'rgb': + if self.dst_format == '420': + y, uv = rgb_to_ycbcr420(rgb) + elif self.dst_format == '444': + y, uv = rgb_to_ycbcr444(rgb) + else: + assert False + elif src_format == '420' and self.dst_format == '444': + y, uv = ycbcr420_to_444(y, uv, separate=True) + elif src_format == '444' and self.dst_format == '420': + y, uv = ycbcr444_to_420(y, uv) + y = np.clip(np.rint(y * self.max_val), 0, self.max_val).astype(self.dtype) + uv = np.clip(np.rint(uv * self.max_val), 0, self.max_val).astype(self.dtype) + + self.file.write(y.tobytes()) + self.file.write(uv.tobytes()) + + def close(self): + self.file.close() diff --git a/DCVC-FM/test_data_to_png.py b/DCVC-FM/test_data_to_png.py new file mode 100644 index 0000000..6c4f456 --- /dev/null +++ b/DCVC-FM/test_data_to_png.py @@ -0,0 +1,29 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from src.utils.video_reader import YUVReader +from src.utils.video_writer import PNGWriter + + +def convert_one_seq_to_png(src_path, width, height, dst_path): + src_reader = YUVReader(src_path, width, height, src_format='420') + png_writer = PNGWriter(dst_path, width, height) + rgb = src_reader.read_one_frame(dst_format='rgb') + processed_frame = 0 + while not src_reader.eof: + png_writer.write_one_frame(rgb=rgb, src_format='rgb') + processed_frame += 1 + rgb = src_reader.read_one_frame(dst_format='rgb') + print(src_path, processed_frame) + + +def main(): + src_path = "source_yuv_path" + width = 1920 + height = 1080 + dst_path = "destination_png_path" + convert_one_seq_to_png(src_path, width, height, dst_path) + + +if __name__ == "__main__": + main() diff --git a/DCVC-FM/test_video.py b/DCVC-FM/test_video.py new file mode 100644 index 0000000..ac750e3 --- /dev/null +++ b/DCVC-FM/test_video.py @@ -0,0 +1,142 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import concurrent.futures +import json +import multiprocessing +import time + +import torch +import numpy as np +from src.models.video_model import DMC +from src.utils.common import create_folder, dump_json +from src.utils.test_helper import parse_args, init_func, worker +from tqdm import tqdm + + +def main(): + begin_time = time.time() + + torch.backends.cudnn.enabled = True + args = parse_args() + + if args.cuda_idx is not None: + cuda_device = ','.join([str(s) for s in args.cuda_idx]) + os.environ['CUDA_VISIBLE_DEVICES'] = cuda_device + os.environ['CUBLAS_WORKSPACE_CONFIG'] = ":4096:8" + + worker_num = args.worker + assert worker_num >= 1 + + with open(args.test_config) as f: + config = json.load(f) + + gpu_num = 0 + if args.cuda: + gpu_num = torch.cuda.device_count() + + multiprocessing.set_start_method("spawn") + threadpool_executor = concurrent.futures.ProcessPoolExecutor(max_workers=worker_num, + initializer=init_func, + initargs=(args, gpu_num)) + objs = [] + + count_frames = 0 + count_sequences = 0 + + rate_num = args.rate_num + q_indexes_i = [] + if args.q_indexes_i is not None: + assert len(args.q_indexes_i) == rate_num + q_indexes_i = args.q_indexes_i + else: + assert 2 <= rate_num <= DMC.get_qp_num() + for i in np.linspace(0, DMC.get_qp_num() - 1, num=rate_num): + q_indexes_i.append(int(i+0.5)) + + if not args.force_intra: + if args.q_indexes_p is not None: + assert len(args.q_indexes_p) == rate_num + q_indexes_p = args.q_indexes_p + else: + q_indexes_p = q_indexes_i + + print(f"testing {rate_num} rates, using q_indexes: ", end='') + for q in q_indexes_i: + print(f"{q}, ", end='') + print() + + root_path = args.force_root_path if args.force_root_path is not None else config['root_path'] + config = config['test_classes'] + for ds_name in config: + if config[ds_name]['test'] == 0: + continue + for seq in config[ds_name]['sequences']: + count_sequences += 1 + for rate_idx in range(rate_num): + cur_args = {} + cur_args['rate_idx'] = rate_idx + cur_args['float16'] = args.float16 + cur_args['q_index_i'] = q_indexes_i[rate_idx] + if not args.force_intra: + cur_args['q_index_p'] = q_indexes_p[rate_idx] + cur_args['force_intra'] = args.force_intra + cur_args['reset_interval'] = args.reset_interval + cur_args['seq'] = seq + cur_args['src_type'] = config[ds_name]['src_type'] + cur_args['src_height'] = config[ds_name]['sequences'][seq]['height'] + cur_args['src_width'] = config[ds_name]['sequences'][seq]['width'] + cur_args['intra_period'] = config[ds_name]['sequences'][seq]['intra_period'] + if args.force_intra: + cur_args['intra_period'] = 1 + if args.force_intra_period > 0: + cur_args['intra_period'] = args.force_intra_period + cur_args['frame_num'] = config[ds_name]['sequences'][seq]['frames'] + if args.force_frame_num > 0: + cur_args['frame_num'] = args.force_frame_num + cur_args['rate_gop_size'] = args.rate_gop_size + cur_args['calc_ssim'] = args.calc_ssim + cur_args['dataset_path'] = os.path.join(root_path, config[ds_name]['base_path']) + cur_args['write_stream'] = args.write_stream + cur_args['stream_path'] = args.stream_path + cur_args['save_decoded_frame'] = args.save_decoded_frame + cur_args['ds_name'] = ds_name + cur_args['verbose'] = args.verbose + cur_args['verbose_json'] = args.verbose_json + + count_frames += cur_args['frame_num'] + + obj = threadpool_executor.submit(worker, cur_args) + objs.append(obj) + + results = [] + for obj in tqdm(objs): + result = obj.result() + results.append(result) + + log_result = {} + for ds_name in config: + if config[ds_name]['test'] == 0: + continue + log_result[ds_name] = {} + for seq in config[ds_name]['sequences']: + log_result[ds_name][seq] = {} + + for res in results: + log_result[res['ds_name']][res['seq']][f"{res['rate_idx']:03d}"] = res + + out_json_dir = os.path.dirname(args.output_path) + if len(out_json_dir) > 0: + create_folder(out_json_dir, True) + with open(args.output_path, 'w') as fp: + dump_json(log_result, fp, float_digits=6, indent=2) + + total_minutes = (time.time() - begin_time) / 60 + print('Test finished') + print(f'Tested {count_frames} frames from {count_sequences} sequences') + print(f'Total elapsed time: {total_minutes:.1f} min') + + +if __name__ == "__main__": + main() diff --git a/README.md b/README.md index 03a38c6..589d1f2 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ Official Pytorch implementation for Neural Video and Image Compression including * DCVC-DC: [Neural Video Compression with **D**iverse **C**ontexts](https://arxiv.org/abs/2302.14402), CVPR 2023, in [this folder](./DCVC-DC/). - The first end-to-end neural video codec to exceed [ECM](https://jvet-experts.org/doc_end_user/documents/27_Teleconference/wg11/JVET-AA0006-v1.zip) using the highest compression ratio low delay configuration with a intra refresh period roughly to one second (32 frames), in terms of PSNR and MS-SSIM for RGB content. - The first end-to-end neural video codec to exceed ECM using the highest compression ratio low delay configuration with a intra refresh period roughly to one second (32 frames), in terms of PSNR for YUV420 content. + * DCVC-FM: [Neural Video Compression with **F**eature **M**odulation](https://arxiv.org/abs/2402.17414), CVPR 2024, in [this folder](./DCVC-FM/). + - The first end-to-end neural video codec to exceed ECM using the highest compression ratio low delay configuration with only one intra frame, in terms of PSNR for both YUV420 content and RGB content in a single model. + - The first end-to-end neural video codec that support a large quality and bitrate range in a single model. * Neural Image Codec * [EVC: Towards Real-Time Neural Image Compression with Mask Decay](https://openreview.net/forum?id=XUxad2Gj40n), ICLR 2023, in [this folder](./EVC/). @@ -62,6 +65,14 @@ If you find this work useful for your research, please cite: year={2023} } +@inproceedings{li2024neural, + title={Neural Video Compression with Feature Modulation}, + author={Li, Jiahao and Li, Bin and Lu, Yan}, + booktitle={{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2024, Seattle, WA, USA, June 17-21, 2024}, + year={2024} +} + @inproceedings{wang2023EVC, title={EVC: Towards Real-Time Neural Image Compression with Mask Decay}, author={Wang, Guo-Hua and Li, Jiahao and Li, Bin and Lu, Yan},