From 79fe76aba1b87f48058bd16d523dde0902e2e688 Mon Sep 17 00:00:00 2001 From: Jiayu Liu Date: Wed, 24 Jan 2024 13:30:16 +0800 Subject: [PATCH] add segformer --- candle-examples/examples/segformer/README.md | 23 + .../segformer/assets/ADE_val_00000001.jpg | Bin 0 -> 52650 bytes .../examples/segformer/assets/burger.jpg | Bin 0 -> 62870 bytes .../examples/segformer/assets/labels.json | 752 ++++++++++++++++++ .../examples/segformer/assets/output.png | Bin 0 -> 17482 bytes candle-examples/examples/segformer/main.rs | 165 ++++ candle-transformers/src/models/mod.rs | 1 + candle-transformers/src/models/segformer.rs | 704 ++++++++++++++++ 8 files changed, 1645 insertions(+) create mode 100644 candle-examples/examples/segformer/README.md create mode 100644 candle-examples/examples/segformer/assets/ADE_val_00000001.jpg create mode 100644 candle-examples/examples/segformer/assets/burger.jpg create mode 100644 candle-examples/examples/segformer/assets/labels.json create mode 100644 candle-examples/examples/segformer/assets/output.png create mode 100644 candle-examples/examples/segformer/main.rs create mode 100644 candle-transformers/src/models/segformer.rs diff --git a/candle-examples/examples/segformer/README.md b/candle-examples/examples/segformer/README.md new file mode 100644 index 0000000000..42a21e8ebf --- /dev/null +++ b/candle-examples/examples/segformer/README.md @@ -0,0 +1,23 @@ +# candle-segformer + +- [HuggingFace Segformer Model Card][segformer] +- [`mit-b0` - An encoder only pretrained model][encoder] +- [`segformer-b0-finetuned-ade-512-512` - A fine tuned model for segmentation][ade512] + +[segformer]: https://huggingface.co/docs/transformers/model_doc/segformer +[encoder]: https://huggingface.co/nvidia/mit-b0 +[ade512]: https://huggingface.co/nvidia/segformer-b0-finetuned-ade-512-512 + +## How to run + +```bash +# run image classification task +cargo run --example segformer classify candle-examples/examples/segformer/assets/burger.jpg +``` + +Example output: + +```text +classification logits [3.275261e-5, 0.0008562019, 0.0008868563, 0.9977506, 0.0002465068, 0.0002241473, 2.846596e-6] +label: hamburger +``` diff --git a/candle-examples/examples/segformer/assets/ADE_val_00000001.jpg b/candle-examples/examples/segformer/assets/ADE_val_00000001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a48e2325948aaeb2d1aa387d1b616953c2c4e1e GIT binary patch literal 52650 zcmbTdXH-*P^eq|)T~JEUAfdMe6bT?jx=0{^l+dJzO79SQkuIPygkGgd?*dW<6qVka zbPx$ex-^mMJ^uc8+&jkm^xg}Dd^sok?6vpWbImo^I)A7BE`sRQQD_v1gaia40scUL zXF+IoR25!eE@d!UCM!w|HPMxFq71 z2vS^JoI^lbPD)f(SWH~>-ykH^)YP0~INVvb07nRl-<6P*lD?<> zKn10$hE~_pH!w7MWNcz-Wo=_?XYb(Q>E-R?>*pW-A|f*Cbi~vEG{+JVfLX%p(T5j7Z16Xc>A=li+bH;{9w-;D zdooNqg2ty)kb^j)g=I!G6sd7q_VYh?H7S_L%n;Wn1?;sOz|U>q ze?hWiC5VvJJeKVN1RMEn5I+K`p+SI?G!}H+X*w^?v9L&h9TpMOwO16W32^RAoMwOy z7@Llq#08tsfy5w|`$ZPfwV*i*!uXa4in0JC$)0GDi9-&6Bq1IeI64u=FvLS>KB=w- z4o(6mO@Vl*glOvGM~UgkKf_@4G3+KLNETxe+c|u1?0439Y7Pji0?CavQ#!#A_Y1bs zn)khPQx;-6LzwCy3>u>$OuzDC)J@bu@Pd5OSZdWLm#s2;g-f9k{0MsyI0+Jkz;2^t zhPmMDhXoycAT9`IWF~|)#ssOg*}=z2t7kuz8*&R1ry?x3p{S{=5u>N-@RSdFI(ncw z5yAwq#F^U_l3L<4_0BNfITS=-v2cixeqBOP?d}AQB$^cGZ*XA7b}X7 zXmvnyD3)+uY!M=?Q@UEYk)##`M1Y416;EE;o~4cV0}=m=~uJ8cdWlVjS*YwZ|$#a&(Z$I8~S0 zEuVbSRB9YjYa9I?Ma={v#Uy?JlsX+lr8KQj0LTKm;~j({^34oe0sZM&m$skeeoOl8@sz zO*C~l^9%C8vZMcY)B~;9o|pc_K{`hz1awqnnXL{lA(0s??tm7O5>oRjAQmCl6Tota zFL+>O(YPRmdzt}3`k*=g5nPaTeuoGvAp>KPJ-`tGoHI+n9gBd6G(wzjQW%^*bDe4_lTd33q5W^k8*?Zua6t&9B3<5zUiAd-srXen01XK6t~ydyG|tCg z&W@xp7Z_0o*_fL_3Cx}`p+Xpe?EpzKo3HLKjG)sMuZq>Wcm2x4BtH`0eDw_F$3RWu ze-V7OZe=oM@`gJyZd%!kN^WyPFnSX*PFGuU$UVu4&4^{YVM2IT&+HwT&24_sh=`k4|YaXuuC@CoA zU|!P1vbKL$E$Z@sMS(fj*u>6DqX$}4$%(Jy6~ePeQcA{@zX?Qs*J`w1rmA3t3p8==nLpyk zQ3^pE#loYzlHM7Pm;Y!TTaENhR)MQgR(F{kWZt>oGM-8LfF}mJFn8_iL`zHHn9aWhWUV5TkH}mYZt3m7LGdnvXzJdcS9B$GT&P2YsRQ>_2|ZI z9XzqN9ydo^k-ng+=vfK#jej)KzQ%9p`eE*u>f6$C61-prdlO~C>BRHhl27kZ?sFa3 zDh;c>zFB1YY;818h!YJ7Z)P5T!X}UQ{d7cqtg>L$$(%Qv%ENrs;^LI;6b21?sTdn~ z-?a*V7SG8#)$CNIQkyI|u|Nirx%pF@42j0;l_1r~a)D?H97xE) zDG(A{N^wi^a}1F=wG$v4)v5=DU?8sk$%E;Uqz*tKr*M+g0@BP5id5R1qavGhJJ66g zQ~JG;4iS)wusuA7JU2dNQ<3DtUcR@wE{7oNq0603JMI7oB_lCg%BU)V$=Nt+z zaStGR9u<;W#AoA>Lj?ev2!fnrEHiK*SAM+S%RGqLf2fJ^ZQ-)GT47T^98K*_fXUBiBagwciRO%)!VvxTY1(^Z!Mj%7PRUcdx2|C z&lmpu1<`zM4iDVItCF4P{RLGD<<%0<3>jM-!l*}997QIp?~d>Ghg_GE2A|`NAcMU! zapGn!pKaG;ePO3qEk|i%oRh_()$-Fz7HCmk=FV~hIKpgieG@I-#38}!=64%k%+_q1 zV4NvSqn~H^$aR0R6MQ&p@O}6$bM1E zMfj}D7^+e{tKi?#Kx;vg4xm#fqW+K%Brux5 zp8|k7Q^qL0ht^RZr8t!{bTv6SgcaZlL!+;0)wL^Rpa2?u_cyPtwaCAZu}C4qnbA=2 z@d4rbI7ej*gV$Y1VNO%Vs=#woUx39el5v(yFpMS68_u&3!ivXf()a)o5^Rsu%7gT< z;LP*@Ck4%67Hv}4;2p?UYAUydfe2SXnur+&`(toVfWSy{r3P6oC3xR7nzDmfren!q3}JBKfB<9#2)bOg zBsd_1)}{hbhSgf+ z`g_l>6nz#{_29fCelqx7?_`l?f6dVA@#>I@UIcUo?x~Zu%eXLkoLt{-t#yw8c!2eb zAwO=vXeP@d-q1^Cl+?^XRfuTEpd@VrG2`1GSL*}aFTK&x`R|_kbtpy$*d|*e_~#3# zK%7ozXTe7i9!8p#Y6}#sv`wACut}w)NWHyd zG-e(HK!}T_B~8v$>h#ArT@lYsVIQ~1w+L8D0B92sr#2X+{FFH6PWME4`1muS=r9c=uKzxwKTmUIC z|7MujSO9#d=0O@i|Kq8Rz#WZ+A0IfWQc}jLbn?bPM3mij3K6_i5*hLSo)r%nW}ZMc zCMK@HlHGC{))Izev1660pVU`9?OsbH+48j1gw1kTs!P>+$R_RXbkI&G93%p*JIX80bwe zPk$=VwD*4Ezb;J8_u5uY?xgGP>bL%!+OVddn7;g@v#+{_AkP zf_}Tk>@nz*ARZ(cI2tG?B~FN=XOyO%>5`Tv^G}#a=e}zB^i0w0SChc`>BMAYtyN2l z=$wZuD<$8@O?rjc@@SXjLc;5!yLjZnTojxP zO9qSia8+tEy}EOL!M&stWUzchBrV~MbzLs%znA#=RDUp}on0LBb*DyRD|~ZTjZ`L# zLS(%KPu~SzcrR>5eLso}AJW88;HZMFSr)G@G27R2lR7N#OK9q`Bs8mN4%pr8H@cyx z$^$Km@VReB9#Jt>3?hsZDoCydJ7t%!#fCj;ezgbZ7{i~(Zg5{Db zhDS#fUAEeC*7+f#-@mH<%9l=-t0EFv`Psz^NtWh$FIZ8vZ->OA9&ZX8KkB~yO|P%_ zBTL9FcWtNTUxEt>flO1mFZ)m$Y@f9U2Hb9oUx{=d>zfXK5$ISo=31v*Wcp!hs^|J3 zv#I4$3r&pjY#v=e`p=0VtZQu#g8=XKzo45VbxmpY+zz6$kHrt4;O z*(w5q{Z3IiIX0Ri&Lr=U?`JcdDQA~k`ozKTgTKv^4)xF1eH=MuiHQcY{33~&xs@iR zM(G8aFXf+auoiyq3o;n|?i;1kLgKU}F`TgzR7rVQ-tnk9v#TGQVxeK1)$~r{qcwD0 zTW>Tkxz}V!S^c>EhEe~>Ot|YcSoX)Zzo0u`-Y1jkwGL;wkwE8nXDcLl&N}THq}j8k z!SRB2EAg6K;5DcBppUJeZtj;(mKe;xpD4JW$!8T+vvp9V%iKK!rj5~(i>lD|BV$y1 zWBiKC2S%iv`}QjKgizxb4*kNl5%?E$@13+E>Z*xo_Lt~cmdiREs@!HJOXqXV*S9>M za_&OL1l25Qixebzpo?dttl=CCIktlkhFGcH6Ma_A0a^wMACE!E%GB>mgItuB+UVHr zCkD*~Dn$bw4=xsBk@mjW<95T}xevw``K6vd$%v)UE|Lqp_*nPkVck8ska}&-`8nEN zqkKz_p5W|>qFQub+z-mI>4ilR*Px5_RP@}aekLcTy8P|?uzZ1^+DbZtgJEdvh_5ix z6Uw-qd-^vRQ@>w>1d8qNWq(N)D(InMwL9x>iM4wW1EeQW9wi$+Ut-kb3e@=Lv=|7` ztK%hZ8;@r2Vs}vHM!(8_-`Iygy-iGv_!{5ld3c;Z)xX*I#xaqg7JCxDa#B6kF!A0x z+E}t4WG?BZB~+R^`;vXhksQ9|Eg=%HXj5eyUHF=T=)-cm>uzFND=$8cXRfsAY11Hm ztbf2w$G2Q4YLFZC?^A>CHCmAPoX}4F9XW+0!}#m36p>PMC~rb=CZBNRj>Nc?lJOJY zlpGqpx4&h-osonr3R6(X1$^U`F=+VsMe$37fI^W;b5XwICkJPXJb}rC$G$=Vz8R@~ zXVf?B0GUHrXno{B841X%x;RBZ^90C3J{Zukwk+^IKth5CvUPwA0~v)PwW|M<3TO@) zfB^rZ@+#r5Q96&Kf)fxT0rkm_MD8b~bx(zp29SWdr1Ozfd8C=4D7l}cT_&1XjX%R! z|@93!I)JIos)|r!3|u zhZHAYt0R(wlNqK1!H)7ER+kVxdR>*75OIpi4h|^W-P`|@Xv#FsUnNm-dcoG>37fY$k+|lQo!{UlH_J(mN zpY1vIZ7Eom(yke8K+CZ57xDGtuSS+VgeQV^W^1`l<4u#h!qXr7UUITY^+)e+ z8*5dqu)Pt@aN$h0QHWvY#Sv;mBjyIW!Es~aH8HofjM2K|clPCzR`uUu%39LaN5760 zRzOr&PKtK@99m%P_dGeh3e|8{g8SUDJ`&#*{b72{c^0F>YP`QxH5n8`-J-l#Ei)RV zce{$qM+(obwLdb}7yKeB;?c7^nlXBfZ%U%`$_pKluFds7ddAg~sBRsf28ANm(K6~h z!jC@9@)yS^QLg6LhtxkGByd+9gihswS7s>W&VC=g&1a$xXPfG52it)^t!=8!TArl2 zNu1|re~`oe8Dm#sF8q;^rN7K{srAr))#^J+^;TMf2Yo9E<>XY5!L+aKLk$h1iFZ6Y zkAvMatX1EQuU5&5$A9 z*TJk#(FA{nS<|k2wKZDg?NLbrE+bQVPwV{D;=IM!J3buXsu2W4TO3Pl)^(*YkMFqr zT}H7|tLJT{YkVGRSuZNF{5^U?$I4f80v#y0DJikK&9p{i`z2(TPx?1TT?Ubp?1w*) zi5DFfir`>P9r9P8*gRu(_2nZi)6x7$YWl`~qQ&$r#bxk?Lv2lq<7%pbK08JN$}v$9 zSmcJbcu}(R`4#V_Ckfx&9T@AN<5}prkc8o^Xyq0(N-OO`$bAO7T<@9If6I-6 zM3%jX`Hc^Ai|C22Sw6Ay$LFC!Ar||RF_nrinK~UX7xYK!@n!8aZ(Sy}M~sDf_E)Lm zn{rb_E@Iig3Tu@?hy(&kD>&1p+*76y^FfG_$XDM$OM#*c-qc%f){r*9cIgdYNEdBM zT}*-2$d+S+pG+i=QZ!`b(KCl4i=~OOmj<(8j(4HtRtH-#Nv&m_3}GCQcTjY93IO=o z1!VmJXukN1u2x9ndGWfU9drqQQ(0qxlUBDr5hw~NKI$ODT-dt_i6d))>V>9SFB3dmrwmXOD8$MY zVd8$sEZXJkx>|90bVN@KS#8weVNq>dqge>)K9%`jkh!4G_=pfUPYnokzj5%IyINt( z8>3xTaSQCG zyep7e+085}7Dm#>J}+1D4vC@fWECXo(`1f0s_9tj9?WXhf(LP>ZK3}5SEfBG)xT?e4dPVVP#ikMSNLt_H7Ys;k z2~}f|&Y(*#UfpGlmjtQybnUZkDpT}qZ{=wVY1U$1QA)C^N}aC7yZIfS3mLpT!-&(r zerf@t7m*+&!MJ6l$duydGTt*pddr~|)~bp`R1yLtlqfTf%4Ztm)c2ONE&C48-GkV4 zCx_RpE_y8B&(ak&2Z~wLmF*Z7P#D`94loiIXj1 zW(9*+oxF*~ETv*nO&PT#A*MN>mpR7n+JoGg3Bze82CDx3E#uo;Me)*HaZq}(mHM$i zxIvBT3P~H|2ZXzyU&iQ$VIR^9O8m%R53xKdwJ)1)@r&FBBW0AH2l+9Jn%#4*-_bh)o#S0~u<_izc!CaV%vA0+!5!z@Z9 zuHMi7;S$t%*WqId^^=*ek4Fyvq{|NmY5rHZvG_pHg%@=FKz}a)Dp@k4L>wGC=b=GB zOyvWFM-@OB=u!x)Dxkyy@>=RSysJQlt#}hqFa(sf{&AAX6aXodnbrXT15w@^?m>TJ z{1-wZx!hhd_iCbn(YUj2^(uv&RQcI=CgT~d8RaStPgr)hk@#NX)2(GsWlBT!^ZFx+ zb=uw{@^OX@M|?_0idabfuTKK3F}>GTvezCBm2Rl?TxrgFOEN@EU(0&>ZYM8S+QV@n zZWG{JJ_VKIeqR_+(!YVCX(}~ZE58tI*X94DGXZA6MGXMjDj@p_!}Hk3+cW{;J3trj zKMb%ptVTErPM?@r;sywOoVkerTEWFJM@K+48*j^=*lJ&+0TZdM5m6gv><^$}5B(Tk z-37_Pl%e(_2@mIpp3Wf$r{_ug3G z)FBj%GLwOamw!2y>^;G84?ELh>5ung<_pEDf_?vjBK(|g`xKioR`+>$@T54=#%ou& z5gjVEw2EA4-mItWPQ2pLW8=4N|l;|k3qg^%AKGsxvbSJu#`2A#Tmc@w5z*pdw^md%tnu&=qHIMU& zwemsVD`x>W+dLDmDZz%k7@NL61prrSTjk{On~`dvpYC1c=bvTQu7^rgYb{S@he zm*wl}Ci22NE5^0cu8J|(D_khu43|ZAX|^)ct#k_odDihr;)spq(It(~*FGC|?rb;N zsRq5Ci=XdQYjbY^!mNX*X1VFlrFpqlJ!dz z3WCeR!q4!6Usx@Ykq6D-nuE!b)jC(!HZ(9UO_XEU0}p2O0&$LcGgp4U44h6)s%o(;>(wibm1*(fYI z27Eac{r;G>IR`U3zt=r@d^q%6pLG!0X(B0w?vmJD#qiiu8DBqNJa221%s*_6AHjnvX*>^0(jD@@S}3 z+(kP-~gqi3S`%&QKc=KkKCO;CPh#z#$0CH74B$x z6BOiB<_;o$M9_xKeNpha7m;`|pT|QHX-zZY-pk6lRwP%d_Kw!>(v2?#6e6QHvpO_j zXt^&+bS(Z0Ito55k%?whx)$gD2{DCo7is?%uo`EMhOw`_l+AK@blJ~4xLr2&&cS+5 z-aW$F3oh@H@fQ^R;J0|u9%MNZkYfpw54%dAH+7l3TsP!JX3fyOK34~IY1LWNh{(KN zuD@zjw4xagO)~4@>{-!PCMcX9rQ0f_0_+V-O}C7g+KX06Y}z(wEBy_-Bk&rG(fOc4 zO;S@fQAcUZkS6JkYj-k^4h3*C2SmD%ev$mlJOQc0il_a8T#U%uwQ*0>!x)>j+>~iL z$87djQncb4(3C)v%)zMG@Fg3ax!U$XpSo3?sFXF#rSy2hRTeov^U)=TFD|%6=I!aE zIs5y9yF7$CJ`Aj&#U@NlcUCJ!qU2uSB+KWmfbbnbC!^s`b@iWnCic_Od2Ij6x9vdr zVf|lg3=%~r!?J`2Iw3kBTbSQDmVkKm4w6WviDA%UL%b72HTf8vrfZ>vY7$|Yv2X0a z>3tvfgx^@C#Xs$;d8c<+>3!BEjOv45U0u8myEc??0zk0m+lkAl2O>#)AER7DD72Zg z{mR#WOEb+0#tKC_o9eaTDMeK?eti7t+P-$GFEV>Fc|}HJh3PXJH1LY`t5ce#lGIkG zav#0Eg!#F-H=PvT3O29uV%|5-HXp1Vmiu`HYU`$+(5e%_g7IQU3O@|3tJPG~SYcUE z(Rc+|%&K7XJ*awhyb}UC7zUtk$ z{cow;&g?M$6C3KztEfPcrVF)_8=j?~?9!%zMw>Cvjj>ANiO%jV-9@hDzo0&qp044) zpuM{Zu9hmy0kI`9+Aq)ueUGnBu^Ak0IoT7LOv$f|EulR4B85K(YX@Z`sEPW5Jn4j8 z>rU*UfZch7ILjOblQ7j*U(CqEhhu{MhjC*ScixGIS5SP+KjHFFv&&gZeUV=v9x?_R z;JX8qzcbeZMrLqNIn?2&m|>tXL^ar-jF0Un(Dy-&lhFmbt&V`s5FAJysR8hJ$~vn* z1cMmWBxo$}iI$wulXbI6+|ZjFu~a8U{MGFm$!~0GEeFKSN8Zs*B)DiexAO>$mwX=j zVaW4oZV2kuq3z#6q;Rp}*M_Zk9ee zEty#{Xw!4}Eu$-LjeA8Oi~U?a?_nCFR%83P#;odM-0GKh$?r-N4}}@-Sap29735iV z7u!Z;gXew^Ta$2at6T8vR?qS;Wj_hVPwj;5Np2T!mTtvqIH8`?#8-?_)v z*THo0$yp>_Zc3ZmW`wd5WH2`}iWcnTa$|O(*@ycYf8kgNvWigkX?&&Zc2)B$7DTt;$z>+j;Vvuu5 z`xc?J9j|ZC+L{;jsNL#%cbhcePAOSqsGc-40U00L0+l+B`!oIKbDeGCQDNxICzqwk zOG?fwUm@36h~Io+gmQ<7qV` zZ+BvqI?A89GVp?nk4yUtg`zc>lGszq<^@ix}~LnKsc5zLNB8g;V&!`0K-7X z!(AADHB$y~0EsqY6pHzZVlBPs!!$yh&sw|-QO8X8U3d{I^`x-y>@OL7$)aCWRTQzw z6b;h&R||5IkDjKT@r_w!jr3j8oo{L|Gw~JXTh*sq+aQ1B(YWV$x==Dd(aL%_I&D_J z`Np!g;r#H)k7s{^>ed&9fRoU$FNO3Bnh~}DsYctgxA`~9bcUu6ej+vfc<@1c-xL<4D%m$XQjXng zOq^elE_;OIdVD^;+3n*ctR*yqIJ8ZOS(ePd?zC(crSzO@@5qrpcGQl-+J6Rz6O!Vv zMEDJ#=|xe?rn^1Cw!PNWtE!>L``0*LEobKxvE)SmM#X(xFn%?pt%%L;ZQ_eAyPZAf ztxB#g^R8vIY0u`ZhzyPD5KT_}_mn>qV&)q+w3h5w3@CwC4EffLpN;{emnPMVlqye} z{~Vr+AYxqlO~4VMTAGeM3T9T<`i*2anx3P6<@NnatB<=iNpTk$@w49utDq=$I#E&a zK^0=d780K9KbuCGTZ!VX{3>=Qp^d`+XwM#SW16e=K9s zI_2@zTlt1_{tNQ{)fLP-`LE)oSTg~OWz=|4{yTc{6sBhhMRFRNODIFJ|Qs^ZRTDr-W# zE{%_-yw0I9%l3QkZz*AvZ=P}|aXeXMCcEK|GBdpu@&2H`-*Q87{m*da=b82fY3g@%q?hnEYzsu8e<-pg`SKS^!2&*z7j&?Tl%7NPF+q2!8dKw zJg!8fFRD{XVN}6;x7sfu6BA58{0dQ)upk#i z8TNOC;4veuP(n0D7pxF)(%l--bjnuoU;yD;1kRt=S8d8%iALzqd#RmX+ zCm|Im5)3&g3dq-WZA5KL`dn*z*`pH<+rw?zCUl3PO>+?rKgj;L6aKMzP)yO9nbf+8 zpny4p`NOzBrVI}5vsJ8_S5?gxCkBWYgwqG2xt;P}-aWh=&qk{%rk!Qct`hE*J+ZCt zKc5<|wv=D$7ne7&dIL%qx!+ypkqupEB!G1Jsgh1VpgFQ76-D+u}Qt91do{#WsuIm zasE@)fz9=F&x+q~LhCgXE!?Hf(d%fY8(w4{98#MJnAXv7+quzyAnjv!0 zGG{HPBKU@HtmDm4wbY9+(g&7O3jv?TPK^+^a9bZAt+DX#g`54sWeg=bc|9v}uk>l0 zO-6FsD12?OlQW$tdFZmwrQ)Nqu?EX_QxJ?r`gvDgrJ(K%&NL6Z3;*cyP4gG}vwXIC zhYV}qV=5={*BX92en}bc2F9=#z7@BXb=0g6Wb^%E1{;{FItsuxF8v)WhqI2X^#NdZZP(?Z1ECF_kR8n%fk2dwfZ0 zGEAHD{PM24#wV$yFn-RXA%(TQ0ad#46k6*n-RoocZohMd({B#9TQ%o3Zd03B7$|?} zxEZt5O*wZ*@08}j0snpHZNA1UgX@&N@;IqWFRsW@?s(I(hj4|!%k@)SY-`8(CTtX` z^cQq1)>-!tO`Vm^tYzYyDS7G!Xi%gFf^G!w&eU^F+-(j>D}0o`H?Nd7qD8TT4Q-Ph z_vf{@ciRrHhAfgSG=C?b6|`??&Jb!wSZ1951)Y}iaiU@Ie^!q;BuzZB(qM!n$#a2U zWpF42wimjjbg z-RqSD$y>tNm|C3UBXhDiwB3phlw_Fr=`X0X5JwUHRTig{1!6yvGGOe0!F%bQzp#Ib zmYofU8-CCe;IZEd@W31o7t|LR|FA2%14(<*0;yCiJ=PKJhKeTfGBt!z7CLGf#*2(( zmO~j(fk7oS`YB*R)WM%XWP}uGb}=XBCZi z>s4i;e0yFJMb+i$CwT8IVmoQJuc%K}*EK~s zIr66JR)Ge#$I^#2o=Ub{pETvj(QyM*Atb+uv_*Wo;^zerXOM!4)Y^z530{EK-jNGTXpgHRM_#zx#E@ zB)2ZJwpwy;JFR>6FDOu7Z+iAo)x(2r*Hj8i{sp;{3eLE@ybCWJC8n9(-`>a|naJd6 z?Y#eGP-$=&d&*>Bj=hrjC^64tl_5+;#mmDM>^J1YxXpst2$Wi?ZA!|%Z`}fK=JY~Y zpY+BJiuxUuo@T$Ht$y;>CY@6hdp!0h~g&R_T$7|r;H?(7tl+=l1#IzUoX8t7E zeLU*hBJC+AFnLCT7d6=a%WQG2((S5ajUPU})<>i$Ie%9!y6+uSEUZ3`{`(iT%c653 z?oFMEJ5ZPGK70mAqxbRp2}a|rVWxV!Q{AdpPnS+jF|8TN6g~S zKT42!7WqP4y#rO{_q%pfZ9kaIH6vRuEI78{UU0kztzX=u9edGs!XKFBepx(SNo${i z3Qu$?7HC*FENnM+el2fB;{Ifp{DP|7Z)N!VbUUkO4b^!ST8D*FtF>+O53YD`K{lGX zDxON&)?3T;*OLuIisTe_r3dmhMkcXZH>QN6K+)#x{tG`%UH%~5LG5AN6Pn`BJN;`? zTN>ig2~Mz(8x-^uW@jPP3NMRoY8yYF>4r&m^|BmG$dTfS`=wQyhAL{+@xFuC{t)+> zn_OKXx_)CWqH(buB%o``-5dpG*<1{@-CJ9hkt2lP-ZZRGO4lEQ3S1b9SIL_1u?IVY zikFs0koEjzM``s&9X+o6L8{-&F)POW8nybysPQ;?3}um)_MZu~w9NZ};xZoe^J&@` z2En|YZfxAi=Ry(h`8TAPGdg#_-hJ>6p=n^zG9bY-DIMV$WB(%ydx}!LMLR5$YVu~wRjJsWnikNgx*(-QO zcPa#P?yO#PFBpA7L`~Cy(%=0%E%}G|V&jLX#L+e@%1jF$D z>+4t{lC7}}26k1m zRQsG-w^u9Z2o#mqccEijAGau`I06_B;wA9LPHt)^5vWW8ZBBHM+Q#4i8X*cm zqyK7$fY=U{5dOXGWtr{`?|S~PRQay~9q6;fc}wR(XuJ2wI&UMsX%Fy_a{#Skf<%Vb z@0{N0Wzb$S5Bq*xvouwNG|+Lev~_7YrbTFHFwpD@@RAQIa9p>kh+{$ANFfTy8GLchal&YN*bL2!Gk70zg=6Q; z=DqEw*B-)}6$!O>ly(q?`={F(_jBh+MdjByCi3Fa)k{ro{^Y4wIVgM-yPPc&ns7e! zL#OARalU38?|T{AXQ+DtM;AierfQZaYt8dq($<&9M|s=T@M%})7>~A69h6Ji&pR`B zTs}Yj0+IDxJ9l8=#tB^GjpnhvRqlTYk(}Z08EjL1u&6(5Om1jnC>OGBXdAGDN^$R= zbzY*m=c4dK?+P_vpN0@xpui+-s1LNw5xS|DmfPS>Q?TsvGMsnpz9mn6yE+u42nE-v zC!aJMM6;xQa9$Jtxh=eUaeij;%5VQ5{=1%$bJ$za4|sA;P)m@fsghZh&X)yc;i=)3 zs%!EYlSV%*Ii>`n9|=WaMCL46&JS=aJg?&EO`|;G<$%`y@jqVE&r*|mU06ViS@&$- zC#bZqzfD#mQRb#El3iSC`U|?zou!pgpkMU?1LLrqsGllpH(EipaV~nX{{^Mojb18& z*d-&yOIB6=v*AxtfB6kO@VUL^sKpcJDKl?rUfPm@H&>kPZowKW8+=^h@ z+F>Sa&+aucO>PdD)>+pyy%dixsAi43l5w5WOKQDK{nZb&Gp~N*GdNilCnfYWgTY{) zcDM_6ti__*m$7I&IU2&N(L~p69sAO~!^fNKaHv9CJj+4i#9$?=WJh{^$ALvWKXXaR zt%O1EY$7-@+eMJMR^lM_`Xd3drypR8YjxnMk@^q&pC+Lz?rEeVlC~o?_q;9yjUlZq z@$@&m=PE}&AF(It%=ALVW79w|=tnn27!dNpm;SI8IbR2ZXa!$hvVxKy)fP2X?N zH36Q?azzdTQs2~g%#i7K+Ba-l-_f~{jQP0k>)XwV-Lvedoj}JFQ%}ku3F1YpXkc(p zNsZ|n6k}GG`K4HGosX&7PT`4LlTKa?Ccset^7cn*wRWWB!&ynBT&MtPb-St`ui!fu zH|@g`9O_kAOM~Sl<+;5F{O~S;{X%^=Ft|8=Y_5BeAvPR*SXwwG{3x?aibZ;Db9S$+ z;~Pm2rR!6%m`$DXT(^!OZ%X?v&LFu@H=plYm+HKPa)&C#DcZ<_sD=&|GBqt({mjEd zjHKnKFC$CL{BX+KYM}zhFP5_lDG*^8EEP+%pD1#AHCSE!_7U(p*`s2IGmQiHiwGVPNKxnKoh&|B-+Wf>eN`)3b zdl_e-%FZiq>@O()7{;MbSb87ct~7amLW-tL~RhT>9hO=DMYA?`>r^TB`5v`)m<`=!R{SN72y*`pznB*kHvD_PrkfR zbdzhag-lgc7CQG>HEtbL+gvyn<2vCfR3Smk))vcxp$Y4c844_uCY)>|4j3}#Q7~~NE&n@ zPy6=Fr5hJDW>)BCmDuT*9)cdeDg{9%`WD<_GYdfR9t!evrg{* zs!@cl&mt;>6ZT80hcketESS5Tj#QYJmp;#1@wA$ww`q;9M%7EIcQS#i$&r^UH4O)Q zPi6qRpb|JN&NCd(cixp&k)}enovU#a7{!Ab#XTObe9e%knX)z zpKF+;Z9woIcS&~zr*BSky+O(fg599{a$;C}6VuYU{Q*&uSkFB3!1^rQTWrUd*;3oJ zwl_+t+p31bZI?8lQrCyn zx|6z{qq?6wr9eAIUNe**p9mao>qi{Euo}2?@!o6p57y{$MIn4c^|@94(@Q^xvfJhF zctlN`5wZ;88J9_jV?lG(%4`Qsy=Kom-06d%q^dd0=w+>enIX{aL{LFMEQ-lG;iMVl z;B}QRUlj+07ZBq*GSm$-c+6^;3eXbuDS{LSLN2605^W)EI$|gU$tFshsCea%E)EX7 zU7ea6=KDK$(QSe6P0)Kz5F?H$>nqUvoAyl~Nt7PkiQ2@NKm1*`zS?$cHz9!_rv5T@ zrc_B_GJVgXFWot-g3pduoXnS>+|O%s_rkBk{8#4Jw~Y;CKa8J%E2%$U2*N|3MNerp zfiwJV>+Za`uev0*npu_aVrAjRtm+=9&{?B?degl96fe4t>8?4!_QV%}PCllU=Q1Co z!$Z&Ij{@4$E3<u9OFv9kUL#%1_{63lh$w(xQP1FeAaTQK|m9OEuH!2KNXAN;e)*jqy z%_)@!vB5)iCShVpHow{KZcU1UA-t}fF3;l92^yMQ0cGVPQ0V3TO!1w?@&}?>6%C(= zx_pJlYrI(=CjSfAKqtQ~44ZFqNbcfy7&mP?uBC65P;0fASevQ-&n997uu z5UP$Cb?3b?Xk$gEHc29{Lt-|9*z^Lf!(`ip2`1g{06lxwx>#CSpC(0VWCUclJ$h4& zT#1y@F;)agRd^o4rAP^k?g3bmaz3@Ca6q>>i6c^RfH~mREzOoBZ5Y5grsHB`E0IfY zz8!(tPB_8jn$nL?7A+)kBB;W?ag)i#Q`pSPSx)SBRM&$>av{3!Y|$_ zW?sIy;B>}+N-J)HmZ*EIsyW&N3>6%5JNG@Spz!k%Z76k2?id`LAFXq&K}B{2ir`>z z>-uK8PYuH)_SZ4Q%Zvh4oMd9Tp2q8QP%YDB!ccmEdJkTenc}37X;!TwHsrWNlDX@i z{i{tGqhYWdmBXHcuTFc`M~UOcj*QM({?LPi$9&YsMrigorjQA@8+F>l7*W9OP^bz{ z70VISHhHC(2XLz}-M1K#f6jYQrbw9vSZlr=Zph;O_AHYcYPhJ7< zPkm8Y%$tmkepW7{X&v|isx!>8sZE8CUA+!HYFl(*o20hD7$64V)ZW7wJhoVNg$M=- z4aq-3YH-aPU=)0)!02&AGuyic`vk@;{Mb-QZ~nD9ON#=J6wq7+EPS@)5Ibkmjlf86 z5-DOA8w6Nm`?nd%9+e%Wf9WPbg%o6fPfT+a;VgbqasjmzWJcx{1LU$G|g$s;h-`2TJ zLg}sPqeq7a$v0Mm*f(cn0qXi_N#8y&HM|50apPCW(F3FhsNhq(;lF8s*<(Dk}Aae*x+z-Pp=&@O;f(CQmU4SS*`>M$>yY!HUjNa z#(VSW?M#8fMq+5)oz7XE$iOGRLTO-6-WIx%M$>?-ybOB|F;W=gxep@9uL#CYR1A*T z=~``}o$sjGE|`LbDKMaXsJsAAQ;u=Twt%t{{SKk<2|x)e@cOVWyny{ah=PzA3y-7+!-4S2pgD^%%G|K@IRe2wMbHW zHgAcrqjY2(bLc-BV7d;jV=<6}EJJ5+CEKMBBoTbHE>$(z%jLR(3Yth;&z} zbvc@F%2$Du49AWMEZ?W;RxA(MS%d}_a85^-U7J1rUMgtp)+kys6&#J=ZxMifut}`M zl1R&;gcfDmNn<8{odE19==K(?Sr55Ykj&fmMnUxMM-%{Ub4%j+KMrnYL-^2sko6PCW>m=({r`R!cZuHx@d+DX`lXvaa1{=R69!I*+X zIC%q2H}NwZoceQ4Z#bzafiua)X?>O@D)<0nKUz(Z0tsX5fzD|(T4r)u%OT6N9yrZR zw!$EVfa}oKnqc9!?Oxfb>=k6xUPeW691iLkdJ&3gUqM{YhQjXm3vUAz&);EyDp6@Q zjnt7$RDhtIAJV!pEyU3bx0VVH7qw#Ee(ze4az@dTdsdRA%Nv=(uQRaJ#@v(vk6L&P zN65etjMQtpxyb(StvWYslEG9TewCS5ELw#(&}5y$MdRNhw{GLj;~al;n!vGTeL?^- ze|ot%_pXNUX7TgrmAxLO6-?{E1-R%&f30Im43Y!4VGOKtw%}dOs$y^h9$Bw*A>!SA$9HVTN=C*8;BT8!Z}XT ztH&5886482>=hNl=j`%1hF1sXEKzwhj;=N&aiYZIks}2p_3h0@ft*sOkx0O?_;gg?g=lr;a zS}mmtZVkyia7Q0X>byAVo+-6q&g(04pZjJj zs_^_D@lWdUHx4CQ3D2@wT&Yyu5FNn6e=XD$x_jFHFTPiWE+ zkjz(i&FDX^GcP1ZHz#6-D2dyi_0Dc5+9QH5FkDH4#y0S3BX}ld3ep1DA9!QGuS$2? zC5<*KF0Zz_UtUdwiiI zOq_w}Kb>8LRy%QVDtSm3<#0$Rj-Th&u(e%ONh=JnmQEL(?HKRxig(vgNxh7Von~9f z8_KqnhU!}YRaoG^cLXePr=~K0Gn&|o%Q1!udU{i2xsEf9tVrvDU9qPdT;!EWr(-nf zb56Lpxt00n<~84VU&1#!hK8O_w)V*zl}HKc-#vTgxhK4a7?I|cA`UX4x|-fgcyBE2 zgAkJ88_L zn_CFZBDIL&6S*aha!+z=N5s0qU*9dviq41%M3WLuJ$dJo&m9GG zF|4|oJ6;e;!NJE~y?NQC;d1N*ZL4jD-UzH-2ZI*0H;9L!!wo zNEMn5#%YP4AwdK(fIIi%pSm_h1>}^BI&IZe?VUEHV`?ae@fOKORTEDm(l8Z8juGA2T1BxH&(V82qa@ zQNML(Rk`zy?3p%g&(MGMs}PdzNn%f2n${4#u3=KGo`P~ny(rWf?sAzCBDq3N)0I=j`v)BCdPW}Cs227;PnIW zuH?@(tr5v-H&cIY+M#f$(rqfBC_j}q$5047OCo`Q(Z>G(nuGmoRv!($rmY3!m(ehd z_lV<0KZZ^@{3`adZKmqC4S#bCrPd@)B>8?&0PWuuGMrLIk%MiIuy6RMERmNvh-4l* z5NlG-`rZ^<+msCPsq)cBF8#Raf&D8LE{Ry8*|iATPy0E@sIDfN)rml=zbtttJAJ?v z%_{A-(Y$D@E0r!o-f9nds7PLCCB9H_G3&GsZZlO`JlMptBkbM)$yLht;FFwH)Gy|3 zVi}3rO0EL;JoohanxUyo&v=kT2?_u>kwWq9)B#-Ww)HyUqR@i=TMfQs7DePI@5p)& zqJLVX_csh$ITaN@g%pf#J^4L<4Asbz+9?c^#T&C9x$`jna6ejeUE8C(*&`&R<8Wjf zeSlDZoiy#CO*gwLvMvJr>g6$kl1cU859d<%?UQ}P1 zrB-2&R%Rf613ya9w3ADcHZOJNI;IOKWFJLU10(gM=VTFsZ08t8CS?sIk&}YXj0yZY zesy*<6JE47&XB?rZc7C}i320`H81u`k1}hBM|6Mf~!*M+DNt8h^_t z7~}o|KT3SpS_6+O)VF&i2G$!~%2`G?L>WV4w&ThC>V>hH5zJFT3-slNeJ}_I^UZ17 z!x?iUpeG-D?Ee6tE^sQQp}uLwwY1AJ4oq=2cKf!#2jQB8?V)XHa+^sccT$=6I=IH* z=0Sn}_5u8=MAQ^019m=%{uIj;idKJ`Gb$gyBPtAglau&X%0X_(3&{&H>O|6W`c*kt zl?$Gs+JHFgONv}q(58I2f{J!Hr2?J6ZYbJ41v`o{MZjj!N*CUp*iql5FdA3ql3P-gYX}BZ*0M|=`J%2g?F*22SJBr%Q<9R*z=m)N_w|g(Fm(%Nv}! zX1fk-#UQIL8C}(*{R5 z3_E9~2ubX`9svIU>r}K-F0m|;jx(NWeKkVrH$>n8X!&o-ssoi#$Ue1qOI+MulY&L7 z4ms*pnp&YfnX4WIKyq*eVc(-2Vrc>pqX3@S#clbK#TfG#ElLi zq~vFhO6aQBDbGgy#9M;yq~jljb6Uqi zcErE-jkqn0$h-l@Gg{iCT_yBk9RkV@2wq0fp7o8UyB$i~E~hdl9=wX^^-!Yb(38&B zAY-q~TGLt?RC<_Ngl!$SnIp7^a`5bN$jxP>o18HlxW)jjtz6>J0=-#BuWG^>-NOI} zK9p2ij+?qI+Y#qN0{q+5WSo)6?Oj%;1}t-&nLnYfJ{Aiq$gIr4fxzv}b@!|$iov4= zzHm-C#}rfQg;K>Eh7sGAY=y$-116)ID}aO|DNx^ka63oWo<5ao<#yYHAW)}h`KvXS z77W8B9|sGZN+d^q^Em3Qr8z-~CtPHUTFL_p>} zyGT(XUVDMhTIoDH5jHc(S=v3r9CU1d^{buiZnrhmPar?MJ5=`UJq2X=k)AIP%#7QE zG8_#50DN;>dpF8dm_h{&wf<4`=~+G}iDS@jFo5IB1%vQDVbY;)Y0%vlx*ghDTwdu@ z$$K5Nah8hb8492em!)V8Z%u~6?#|N6@n*R|qjRIE!Sx4<#zl|h_ z&Vgf)MP=%UTSTyC zVp{|fd)Afn7tplnw)~EY!yFDpR=;d$)^4hV9o!L-UX&G?LY5h%Lh9@)fnlv(}1dfe&K-J z-`yOHf&A->{?LVEWL7G2a_n-|*EM>dW+z<=Uur`nWW2xfTg+q~0*)6xxCWmL zS-FvteXuXfv0Uyr9@(leqe@aR>SSy&BmV_Xk(?M*8}%RU!FK78l7>#2xuvKR}KquFZp7pN`mUhvslHSI$o_3i@VfZHkoVxv`t=hS}cacv4 zU?iWTHcd4*b0-C3zH2>UZK8o}VuS4YMw)x1jU?yqDCFbc9M)~h-9Y~Uztk)nb_Uya zc~9rSu67M#!sasX1>tOxeCKR8>&;wwB?!$N5l15r-GF%m-;OG$S=z}H8Y{V@Ge8jn z-A?%+mPnNb0q6YZwL^${Cp85tT(H3{Q*)ta+F6+G0ZHk}J%2jP zztkOeELS1X!C#g76YGFKAyqEf2}M~+ZQn7Bk;lFh6g_0DzR=mOPg|%K=D3)^p2_u`+UTo(wQ=O61vGKbtiFWX92Qt*Nl&Pv;CnG#LxY! zX==F0jaw`SzR)?UcN6Igw&AsdD{Ta-rsBubpX6z)y~igMv}Ef&m8{Pol-$V7afuYF zp4~w|%9X|Am6}V5i-JB?+^PrHyy%&gWQ)^D?@Hup=&Fw$ISr!$Xn+m`{SqM_|=O$=;T*vA(+ZI^2~dVG44PW z$BX;aU?Z8({{XUaP_TCenaN^#$?I0B>0=pIySdmIE$5x2X`r@`f*&Uwe6rR==J>kqNhO|5BgGkuI*ox_ubjejA7 zR1b&%IPzpaS=zF2N`(o)rW9=S6<*FOa$Q-o>7Xfb?@Y-b!f4(HT#EKj41Fy(Bi5HZ za6zYVuym!Q_oD`#z+a%G`cNrN0bwWugGN0maYe^r53Llwv{My?#wf)t9+V2gVvJLT zFXKR1Z3dl11F+gTr6YkKgt@lm8 zIQojtPr3-}$l|noC{Om4@dr47{{T7`=v^6OPPaj3Sg6S@&-@Cqu7MZxj4&mKUr%b= zvL&rIU@muXKi;fMl2-0eUwPg@Z1alRr^1YB{7h?%#>IaDiiF@c-Nj-nT^6RTCB>OkV}*R+XCEzc5XjM7#c+2QiNgR% z#%lb&BD#Dk6izq;CbWaL8NL2Q84>a!o0i)#6H|FA2$QH>sdEvp{Dzl7VRgIyxAP!^v-fRWDoP!rgm>E zhu+~q$Y4Mt*nggt6t=|{MnwZTRwMYjp45wPuo+Pp0yqo6{4>a@Zu^ZAtfjUrf4hjT zHZmNF=(Hy>+shJjml+tz99ATHWzEH~m7#le&&<=y%O74(9qXjgtk&Ka6PSaR`9^Wp zqEAZ~9n0}d%@J=gV_}si@%5~~6B!4G?$>_scDD!pq0Meb1Ps^{MilZ!&<|?M@g=+| z;r&BthYJvH8=USP2dzqpS1wqvlS+U`CRo6ug&67mDe_25oyfae0GxCm<4LEjqiD8% zT&^T&V=Ti5u*k-KwB@w3c=tqRGY)n!01wNqD3;+6U_%uW?rt!lPI3NCN1T$LW-xn> zzvEK0Bpu#sCm1APDsipK|&9GgUZNWkMBy*m9Xl9u4y z%v%{=z;pQaH8l4vJCMgJdFnqhI@V65c{DMViO@(#%49jm&>!)rZMS4}Q-X@-WLoB; zwif#lfVgw($REzQ$)}p~Vnz{tgN*Zx1$ zuA*3XN#u{btvHhzmC{5#d90T z_#0Co#q%QwM&rBNrA53G$RyI`Og*DD{{Xg188K~; z{X@!neiamY)znT}6}OKh^i1RPs&PZ+DJKB>8ksHAfx9?7@z$M?xup7p`lZz8ak!Tx zaunk=13a?w#os^PVruMG>)Ao?Px3}V3IRN4G-$RKuXZ}sUI+w{#~hAOmjj?3066cT z&Yf(MHOY2!G|Dr{>^;x&tB?ZgD;yUIj4F+->6&e{7?iS@z+PCg=Lepj{d$J=DI;4) z+$_I*JkSpBo17fy9^Jplt#3LpJTm4&&5kyLeSe)$gh2|JnRck<&U*B~{zLJq(p?!E zZT3XN+fpJH-O&5KQZ?;N+=wtX$eK( zee7qB^xaABUd>h#P&BF)v(C(tTie&^Q(~?%=Ty4$WLAa(qjN(Hk%J>1IUw`TYRSLX zZ{T47n$|s_hD&tdA5u?$rBJq-S#=q%nTwSS;1j^~{Ya{fZpE?`^XpqErMZ)n74N5z z5ce`1oyX=R=AazpfW%ehvIrM&B)4o;*0jtqpxn3{uzgSY6?g1L<|4*hu^&!qLm$cp z%wzSfMYRP^&~r#_NFd-5+MUA2YUVNs3HXfv06KGA+{qV~WN$21Z6Uty4 z=EnpIyMn-vvmAEG#S*|03;;6SK<;T2W|cU}C+cd-!}5=m(*1(u#pd~8Q?6ODQ~9gt zfA5-Y5|4Ikz)#DP2M2FBp>9m2A8FWIABA8W#zm9n`B>wQ4J=o(Bpy&;K5S-^#;fXb zx*BM7<<-}2Ff+z`)78<500WOo!A(V#vA7n-4;*x;mr#&Q6;4KY8+z938x%*?+0x-p zJt;ztnKhAZcH-puoNnpfw9<8Bj<`6@bknaHnM#w1Ce!`nMjO_b^QFyiax5p!=qTs9 z{T)xL7ek6cFB{@}&9wjXQw8_2n0HH=Q6Sb9sb~y@$Pet1|^B1E;Nd zTfX_-u%)w)m~`g3aZf~VhhFnLe+b5(@QmwIF$$`->`!6y5Ni(Nf!HDFmiAoPr!F z*qk3vr6gKJ3mmBMEt@N>tMnVM}NKnHW9{A2XQ(>?%M$$Z{KtLD(00msCUqd*zIElCN)I2s-cPrsXUtuUSuGqwj;F6A zv@ z)Wi@8C9&6~SY0i|ij5qO$C0!XkFF}iYU>_NmYySzuy@_~)_nTy_mv_W=8XRUasiC{ zasD)OGL%h(No=i=E=s_oq?61CZktCn1e(r{hjB}b$5WNs3J=z~Pd%PeL??0QFHZ{c z5thKuZUsZV%1Ipo@nrU;zQd=(06d14Lguoi*YEC0-FUDQ$XHY^PvA3Eql{Zoy7#SVC zb5YH9Un%F2YYiQkXV!#n8*i2NLUsA2A2#fGawG5!-E%Cz8u}BmO;^bDG>1@kra4u6kidy*1a%jnR;j zd!E$pD;aTF{_~OVk6M;n60SopJw^p-!mx{Qar5Aukx`9~`COcGLs4-vKkN-E?HN(j zx1}QJ!IyD%#yi%DoT0~-FnZ#qMrk5A9@Jfq$0s7}k(aL0MJ>2Kas$RrDc5LL?o~aQ zid#b%yobygP2+ZYV>NvUdzz*J78$aeO^$tRBF^`~IyNdvM&AuIQY z0E5$tiK24CD9di@!_t>;@6}0AoMx`rubFuAH_oaFd{n;Uv2u1;p@u)4fT73DjGT4+ zY8h1)H*gnwWk%6~#xj1H%@<^}yQNaO1cA`=`ted~G8vXAl%NQ5`8X$znDpenMm@~dXb#|ea%Z&DI5e*;U)?>!e9ZME_u(tO1o=gB$5dxUy~eFdx@i4&Cx`# zlwNf@_Uij-xN&Za8jHG&0s)iWLhxv%l zK~&ymmNFSfu@y?hZcfj*<}g7&-l&Lv0}yl64%G?}80D~fRI&L={{VZMZ3|+&@y3c6 z!e7``Z?r@FHp3(P#^Je9 z@`15_@C>IPfH|aKS%U1!t};(gr5b+|UN1sW_WuBAQoE4sKAZ|tf{O(v?kdVvNgsg6 z6%OEk$f*l2CubP$e_BG(jy9g2lnnF<*lyT*cH{ZdMEGXO2hyaC1eZu0sRZ|_&AP=O znUFSTob~7Rt{B0~-X*?W2+304DLb35Y;j1k;&x!%1Gni_-bPuRjt4=_Bv&VDpkJGk z4nJC*B=sq5Ypmollmn6LR^ho&z;4Si$labl8l&Z^s?fbNup z(gp{ipqh69BtN@s`Wo_J=ggQW1=YDDy?U(Y5J|}Uhxu2OMJczlawnK15ymaMjLgH)iVemw5L|Ml!*2NEOUnYFDvGC9D^7M+@M{ksYe! z4*2WERDv~dOCT(uvEFh`b3$CG-ch?X)S?jVPBG616!}?-0O`0Kpap~Hug>{it)%P*`tZ~kL2eo21h>I>F zw}v1Tg3>nPKLLuYz9iL{`F7V%s0Mby5J8WwC}^aa+lzac@Nf$4JBB#MdgPEQg!gt< zz?Z*?alwi*9Qq6eu0m;V?+Zyh(oM%%)?#bol>0^oqihXDOeEecU)V0C?l^?NpaU+@#zW01itwK>R95G{{jr zsSnM&Sq$kJo5vL?{iBW(h<5CBOK$E&TDY#!B=2V(U0Ri zbNExOArN_+6$>w5-2VXj>9&H#49`CBj*18!8E8Rp&!0782dN4w=A#%h2|#5r;C1!? z0PE(ZM#6>!VET${VqSz0Mwd!sxtXQ_U=;+g{{R}2TV%6=<3$*3VVvd9;5Zdz5Rj0h zg(Pr48hXa8q_Q&%p7`g}G*~%|sBN4tniPdna(yc7aRC@aLgb#kzZ!gU307!KLnv~) zex8+b+A|`?f<+1j2mphheknEubhG34jpdFA&w7Gbgv)TCasc3-m9SPQK2Nj~F_Hr3 z`Sz-^2qr-sNh5Cm0G5gX%`1-AC($rLFu-JC78C=53BdmVKU(x}4N6X!5y2%}Y58&3 zSDa|mm@g$ojoB0^QQUofE71HrRrJOJLYb9`#(EqYi3E2ygy>ZK?0D&n;<2@RX1DdW@MLXOjp10&*)fwKOE~qey%+rIr#yk0*7}ezBEQO1`;qHLJh;e_ z6f+zH-2VWDExBSg9oyHwIQ;4I2VkwZ0qDc60%R{HKH&wranMteNdN(fIOs^}OnDb} z<;LEbAIggzc;0f6@Pq*lvgJv;ZOagQ!~?Il6ZD$T(!7~X<2)2Jl=RRLYmZdM_P`=E8EOvNC< z3!a?@L89WY((UH?XLmn$npJg=f5^u@@;cNd9b*l!=Nz7DP;vk{z`z+4Ty`L5+4yK1{}9%AAmK#xi;ePVE9T3duI5G?-Rl z$Rnfk>sms^FJxSKZox+4Ncm4BlkJMf)9xgNBn`-LaHM_i59M3diiveQFChY>dNIHl z`f*u34HLO>SId_%Zj34^QJn41_57*Yj8Yp|*n+H_2VsD|xE{Fve$=fbGbfoG?h|$# z4CHas^feXANSbsr2Wc1`#s2T{e8cDm`R1gvmwl66Ln^BYB48Yr-WeGE?DxSu)YDq0 zn99$BhiJ!7tu|$fJC~RSjXceg`F#P&1dmMmderyOgph*3$^1>8N%gH0Gm%%y0D-t; zI60;m{$?XPdK1Mt<6uIP0)d?N6dA}xRbKe#`c|o#GP}cuI2rf#rXq)KP@iGmr;jREYmCv^n>3l>~*vM;ig6)W%9OQzi4o5#q(bU8Ztyve5)$<%`r9Kh`?bvaj zy_|o%DPt|1CK9vI#xbXF8$XJj;0~i@Os7&mqXe-CHPQ@O9 zxnp@{4}>l9^Uwj0=}vjXw(XpfhddrJ{S8qPiK7a3TSUCMP*kR0EPaeJh4i zN!bKq+SG}!NrqCr4gm~sN3Zg$8hqwFJ1ECd^gSvhiaCk$$T=kLC!T5WM9H|ZQP^Pf zQ0A>+q;vw|WJ!YTF_VCvf~!R<#q#~`i8hTV}KE#a6386KE5kL9A7(5}~I!EbUp)2z^1$XK{C1yv&_ zfsFdr{Ouxn5z+;8f;W7~8I-p?4t-DJD@RPWD$p{{6%gdc2I5aAlb=#+S~aAfD<-8i zYn#(brruxoNIu+Gk)7Zk$2bJ{HR*Sa_L9n(0|#+m%Dn1D^5aL?Fv>H7(>bcIE7&MU zagpKjWpk0qT=f+z?J<@C7EXZf-H}9ayzJgnLNSgVvAU;@!N@Bt@hT8O2saWs;;^%^ zwbjSKyW<#8%Y(rk{j*Tt0US~gaB+>G^{Jy&NZCQcjydH1IHp`l9Epj(K%*gvz^K`e zbYrE51hjmx>yGte3vGxzxYbTM+&QMbz=7EnyuwfLo+`w4mlDCgLFKvXql|aYxAUa# zTCrWi{QhuOIpnD156YvC>fQ$u$iYrm-XY(Q6^9NCru}B&GI^w8L zZ*wH&n%opT2HFW+dV|nYQ3oU>mnPtCgzZ&4s;@i09=}>_a}b9yZ6oIr)WEkerBA3zbmFGFL1)-~tV6M`IeH1|{5)i4O$ue;T6??yhsUOGUXh26CGIpVJf%w#btFvxjf zo|RKk-1jbW#Z;V=o;j+TvL-I<&MMOxkphIz(DBsfnG}X43bHr^@DES(_|(v%$!{x0 z$9Tai6bymapYztM#(*<4ryPzwGwE2|+QP|oGZbyxh;BDyf-5vjf@Sk^rHGMO@-ljl zTCl{&A`)1mF$58grl3n@^O&&)B5*O>=cl(yIt=J^DB0KT3_Q5omdPJB4?$h$hb2*_ z{H&73T;YO|*m2J_z*wx7@Wr*?YpW2g86@@N@~-Q{xP3b(c0`2a@Hz^Iwt|b)=p?yA z0X!}aao74*PN_1THtCx?JeJ4`{(thCW$bt05Tj7c9qU)3k8TG z0uQYlc==gDBLsoPAS^%tt^wrctV39kx!gg|0CW^9mrzN`T=l1w4y*^Q2(F_U<#JD_ z(vZb5vtfcBc*yBcFp(Q*0Q4EFer%|KF47MNBN(WjPyyP-kMTA*ppulT(cMPQ0UWQ( z&MEjr49YXyie=DThYEgD4&l&Lg&9xHf%U2o^(Dfp3_0fpk@q_su-%^Yn|qOfe(4mc zwNvjAk8wiKdX^G=k-6EucX9yjP)`dX4hvxNIp}$)_GQ}*xw_$M-Mmsy`=E!Y-zMIJ zKD9E_QLRemGZLxYxme4cy^!d*{-ncwJ;r#3(sZ7~=+qj4WG1uFyJ+WYf4< zv1cvFY23!9Pzr+GRl0r{>+g!#wP9^!dS)`b9!nGbYoCc7EzVOrq|OQG2Y=SObOtMK zACV^KU^B;I_=?VD#G2M7m65hMRgWStpbgbzTuAXO4{l|QBW^9w9Q5|$sy)EDg%wyY zR(+>#eE|G0D%YH2g^&Ziz~6)SvETHp%@K=trtMh-QxelY+c0S}vCL68VwfyB9XeGv{ob!RaeyR#dv&Y2ln;4xXDm#H zG}>5~0~p7@wO`sJp^*0_uCAlX zla|jx?Nyv_7#SV2iiz%N0##zn#!s8*dFxR&;>3X1{3-VFu`BarQ{5kN{mQq#Pc@rm z>~ut}xny2J860#KW6TZ)<^u;U&t5$~zsjlk+k)o}8RUbGzu{9Ng8hDG8RYOQf>60> zGR#F`k9Kmz@JPquPi0ZL)w7)7XQfv1m0@s61b_esxH)t*Yq^`Jsi${zlUzp~z1l->Cuam>JfB>2tk!fpPnhQm zhQJ(}t0Jp1Ze}Q_Jvz~W8uB`IAoikDxJDK=ZD#YQ0dlDr=%eY6$E`N*M3Lla0VA$Y zW9llJ+$>h?sxTXokLyv(CSz3$er)F?)Hyp9%8S;MAi}cbk(^@{Jg$DwcLfT20g;}7 zR&BhYr66Ync0D~RZ!{#PO~8a3Mt!;dbSb2)4mWo+U0caUa@pH}J#$xd`<7LZqhueM zMt!o$bO_rl+OgCozbhVduFP&tYmH|&7VMa{{Z#tM^X-{X3^v~ z*_32;98|Ze6{1W7x)x$e=aJHsmDu9!j(G||-d+k5>yOr*AR-oKVn);0bHx`pju9!3 zc3TAJAC)AGBY^}!L>Q_5@I2OR(J?}(RLRLG2iF~|awPrH&wDlJ@~jDE1ry~Pm9d36 z&u{Bp94RD`N3nv3w*Y*+jAFE=XH#T05TL2<3VwpBUChgSEMG1%a2W78JmQ|Fe5*X2 z2qypzhZSD#)e`s2Wi0Xm^AnSbsjqaHH_TQD){_E^g?Zice57BVS9od4wB;VEs;g zGyQA2@aOLA8wB$yT(5QSVjmBi(5`FaYd)1s!-j z>oZ%J-VIh?3tBeK!{!+$9OTyXIoepqy9XznVz7J{I{yH|D{hUvfLj15IONwr&l|?T zI|KYGr-SvPdx|>^S(Judi??^KNUtgJ3}tnT@ei#~ta-DDp-* z9{B58JCcZ9l^Y6r^yh(578{QI5uBV;ScM?4#ts8#tu;9Zalq;-kcX>$ylq~X-9jpW z$7me)r+@=C;sM7e6w}A42cCH5s6>ElC5Z=&^rUdxakzu&%}M3$Q@PZ!-~s(A7tCrE zeqshc8bCFP1Lp74QYlsA868T4jGC2GdW^8h?T^x;;BYcdaf+*mbD(I#lnOJFb5RmG z4~0|CPc=IXkj_{Rq||dV<#wh*@<|-fv=xT1Q?Uz!{oHn`2*V_tF9+p5zO@pf0Ayw3 zJt-DIWDAl{raBDMxP?&XbA};~bB;4pS<2`c*tS62Fis9J$K_Dv;~~^zJaB5&z016~ zBstG4!|R;lrdtgY%Mx6dnYV3Wv>)R3C;V$RSr01TARG=k{7r4aAD0-6`9L#qmE<0| ztgS^??admuAo5AzfI3t~>tfn0X^`)=c3`CL7~FaSd9Afj_Rgr|%<2I@bg0E)nLO1%ym8Q+;~2+!efQbsMifAW+5T7`omaNWL4ZNWao)Cz(8{7K z%`lLtD$Dg4sH7Z^nxC6kch)B00X^9WS4~#Nq{){j}*zK2PXe5;2U9aYV0~3JB!SY$+m`VP)IB3gmi`PnbD- zh>N&}c*y*yByA%DBRRpQgvb1|IQKNWRY%Pi2hh~Aki=3k&RDsB(j4(!V5hpkp9X}sRb^}SSM5F}`!K%M# zMRq(M{c};~GTVVIxNR%zimM~$KP?C@Po)U}6hZ601LKmfH zC(2oIlNjU^!9S%+)~_n&HUlfuIsGWI0$W+eNN@_XW3MCWR}6)QNCU9|^sKbBniK;m z*RF7C<+v*%ZXDx-yEyvMaRZN=Bc^&(W=){vA8NMp#L}3|iH?43{{Wt9<+hm9#;h(8 zm4@KGIQ)O54oM9`y^OwGa7H-jXeIXn$T{hn)t^mND!y!ECj%!VKGjZJCRs{50LjT5 z=A|^m;L!|D!ZLa{BaWu03cgZ+>M`rv)7KFO0%G;K6`AI_=X zD3T~}gb>){*EN3bCi^5)N?$76^Nu?5e+r&B17sA)-W%vh>OV@#S~FO!3J{_4R79i@ z{{S&PyZ-?7zZ&Xn)NHlD{{WT;IIL%l!R2szo_NJ-*-WM3jNmfHct4@1PFjUnX>zor zY)}yV+3iq z3xl1Y5PuK<0998|(r!rbbHOM4@mdqZ=E%GqiO*iA{N|u&nh6Oi36q8A*0NSNGu6Ur z?;b}CPDk?x@TWwHj1 z$A8D3o|N9g>P(W4v@DER$l#Nl@O^XEy-&k&E9m&_SPloUuQj`XpR+s)&P*qa9ORS7 zy?Td*mA|q88`K8dxko$!Sv^qJk~M9=b2jF~s**~P!KY0snB{LPY7{sMeUJYDuB8@% zqZ?$AuzqZIs<&`W95R?Td5s%$uyMsjnWAXt{1pqy;fqqFgT4B6>;C}ju9xiB4HKQG zYH;nz$N9~39tM?V@YHcB4J2|fbsa`e{{XJKwT+3}9B&#wP*~&Z)|`{Lky%WO8C4~h zk-_R~&OBt|EqYA3Qz9!7j-9`ydX$!|u#(KL_+a~YuQ>7LzTHaROc=w%w1esox%U+j zzc$4^jyS5B3mm$hR|nVDrYO;=!r_NPImJU7p}8uI8HaP<6>j2Ybt-trRRjEMSGg$9 zmvn%$w%l`oI#f%y%yJG?jE+CTtUB&s0N6r6{h${a|l0pKy~RDp~nup4vF89${t zNFz7}f&8iS5FCkDG7dOBe;RZ5c|I zwL-Z`R}0QK7(CNmoGBcPo|S4ym6!Km;2xBaM!+4>7dx^E{{Ry}GN6FwDhouT}TKC*PrW2bt}3f zd6^B2VE!NBPE=VAWXyjiGtd+0J$-3MLYwGm+1y9vhD_zy^PYBqa54FQRjQ>Y)1)EV zCXn^pk{3BVeihDHWJ`x^lfVRHpzH1Qu8re(MXZMf&;Y=I00)kqxjYJqA;ptg4>Y-t zqbO7(IU~6|bnTyWO}4#@?F$s2Jcn>pZgO$XM^1mvYPGyFTS%y~ubC{Hor|77+59QY zZPQei>LzI=Md-XJ7(0ef7Z5uj*SZAoKhQv>yVO_vEUc8Pv)pxgi zjIKR7t1lp4sB_!WhnTq^yCWUzNV67K3ek*=VET;G0W&uWF`R`UWBJtPMO7`Zp5Bzm zrujHi>;*fC4pfkQ{#MdC%{@|88B#Ldyi=O%34$1cIl$>iB_|aq2eL2AmrO~tyg z2P#iOL8#ZkfP5UzfN!oGO z4V+Zwa0URw5zyoVO&2olASQ9wjQ+G-WM&sC3RKJIDu5+Cf3;2$ouIk}&%Q+hWkI(Y z$JUF!qOl@vX^Qq7f}tuvtaFTFvJh99`wi=i?=xgxmyKj4N>QD~5bJw{1Yev?_?t4c| zMp&E>!OL#l{>}*L$24psomm($Bw%DNazHuFY1+KIaMtYc=L4J%UMo@jJ$hzI^#f|r zAq?vfDqIe6j-2~d+p9-QM|*e{2gzWCa34HijGmky+ zlmbAxz%9@Ydiz$IBQ~ZZDi3_A9eZ)maf(?M;wffL@k5=f8qWU!Dh>zCMn5_%`UT1} z+cl-aMLHb1i)e z$BfgZ(9NCFO0YXJfU2-U(kaR3a3{7Xu*$2a-Ugj!v6nBxj0OljM<<#sw4rY<%iTWk z#uS34Ex$KjeX&}COL(U9E`wS>RaUokETf?tTZ8!3IeyJ~dnz@|OB1kVGe*qJG05eP zD7SDH>qv)9xweiiHKdi?i7lLz&(X$4e@-h_{{T*sSS`i2l@uEWWl1Luo;m^mz^t82 zLf3Zb1O!5+pX(hj0qgiMjP0k;Od&TN@BrLk+Z^b%b-;Nd90F zeEv|!`yijk0;0c)+ULqP7D1$6mD|oBDC?Xs1msindwXv){UYN}hbzjIBWE70+#j#f zsbA>!H!{TpQrg^-JklhK=3o!^{XMCxSeBi{c=c$M#dB`}u#*b&H0ie;#yB}Rs(PlE zWp+)PIzR{q%}En)UU<*-t5WFktY5mfwNyYz4Iu!x_dxBF-_nt^xa72q$tIs_uZLs^ z4{ZJ7c|V0tr5I`8{Us%lrPP{8B_Iu4~gxQIyU3`GG}=4mzt z1E|RB+O@np9CuffeXQABTJ79qo>Hw7W1u6iQTbK5Zj8bgvLYeTo?9i}GCG1sbBys& z-&^TEYZx!CBfOYm@+FL_vikD84EGgE>!~lbikF%-w9&kl*6DNeGLg82lLxOSBcV9O zNd}p7X>SRJ$qL-#Xg242w_qCt4*hB9k?Ge8mbX&~T;@h%jGXC|L-YO=HGQ36=D(QaD@wr~wT{dEh%Zm!`i0!A6U z#S-KJ+vgpsRJ?0h1k7hKV28?NDCZwuG0(5HFkM^yh}+rT-1%in;Kr^1BcaX>Jw>5f z$5mZCo9hd>E%zOZAcWu?XQw^0_57kDKeLK@(u~X^!7EaETYUT-)Oox z81o~IVorD*5y9si)wnelfkTmZAaVj0k}_W-w?EF6*z9E|hUUAmfO%H}6^J4qF9fbT zf^rQ`nq#AgzRe?~NMblr3giyiJHDc{Punc*7VhmYB#i*wwn)@tIL0&6r!`r%h@M3- zM{yY58cf_qk&pkgXZOgefMs4PXO{{UIRh_ftyL{N>0zn)D*V`2X>A)(2S8>AR zI5;DN`ewJT<+atL{l)d>^vGFObd5>(#!nfn$*z(MMTs}u+{B|MJC<@-^*ud*3NG08 zC`YCX$;>fIq2mJs`@^y0@u94(V!AN3)@5E>2cOUSR=ev76yLjwQ7-`bGr2g?4sgCq5= z8J6Qa`@+==3mj9h0q9QO3@O*X9Y z!!wJeYzN;P9n5=VXE^p0`IuPeE%ev5GTMzwINe+4DvU6Cj-9@>C9Z*OtofleG6YG5 zcp)Sl4xM`O`I_kN8tjpA7`j=dK#C)Mp+L_#-OuD|3k`4Wa!t6rQXvWDuqqwLu+M(< zU7$%Z`c|7^6e(^s3)Px9$yl1uf_rC?_~*83r_<7SZ9KVUkg~A=I$*N)&(^u2D%v;N zrnNE4j1+5v{AZ`oo@=4f?uFH=leQ&4bcq4auhORXS`U`YoXa?JOs$`$2lJ^^$Uu=N z!*$7A)J2ZxO}l{h7;na!Vv*luQ2AtXMnI!ixXdpJF^cb7jFN=i6NuyEJDc9S2vSx| z$#54PR~-KUI^%pkth%zIXy&>=_Y&t*A5ROat!{J z#(3frCYKzH+{ZQn+CjkwujyT6ft)|i#B(n{wRgXJ} zq;e_R81wTJ(ye)`ASCS!-3Mx`xm#}|0FjecH+-j@fHT1AD@h4xDBcEgqv$r(cSAGb zK4w#qxZvicWxync=}ch7(YI|-I306B5d$eV1)T3A8P7vfNidM%;l|U)&5V60WpA_> z-HqO!howa#KIUNfVd?tSCMyp~$w%^3p+2XYV$R!}c-+Kblis9gc0wid076Fm^~tDm z%Ye_hLBPlIrjVN?dzk|L#XuK=7dbwdqT1?N*u+8tS3Hg=g+qhAa0h&HYEV%#fwy<4 z=N{BO2CN=KBj8Dndva;=?nt*r$0MaON6!c50Pr)%<4|r7A;=0dkVhYd9Rx1<*-IVn zp2DNrTo(nip7;=um`4qvP)i)EIS2F<)(nh^Bd%G+M{v?39Q?>fJaRe;Hy*_@q1gsD1biI((!1s~ z+C~5%4t`VDKdGtj1D8Cm-q<~RAL&RLK4{)C<+Oh*9zJhe{&d7mXbIFKkyx@A*E^T! zD|pT4GeW?CT*x1{%hx}RU_`?ym8EQv z%>)-JyN*<{=e~2F$B)d^d6rO`Bug3cjNCF1dBMoQAC*zIidZb7M^z50GweUcw6z4y zn+Wg-knCOnE#1%fd)8XKrW5AwW+lFS=Zx{1sIn)}wA-8SDFAn<^2$Lf*!9m9Rp*$D zIpFcZ>sCWFs521Tj)c~T&7hadWDNOSjtMm!9#`H2bb$2V)}&pbF|cE{4ro&v$_R|$ z9$Tg=h!nZp859f-a@^7gzkXb>RBqYkpM>5^?(2+-c#Iqd8;4>#(Qpuf_eKcpGfaGt z6fSt@oKnh&fHI~SAI^>6E>7;5I9$@W>{OOK0HI_DxfuNFG>YK;#eLm*UP!A1#U|p5 zC!DMNL#;-$?L~h!HD$*R4r!(VfQ%6CEJl9e=}1M+PTOY3Za@0 zV~@g??$xA_vd*a%02@zA=1m(HR@O_ac42~0V`v?RZ_2Of4Hm%38}1T$W-_3J_vfIf zG|3V>kgh`V0{MgWJo8#iuq^H&o*k^=v(8C9a2MW{!7iqWx3-Q~mPn>{kwU0V+e>=w z990crmH`_oNs)p~o4EEF`kK7b$sMlv+FvnxDU7Q6WSsIj?OfgTvq`=&DoNOIdj52f zXghv7r z01?x*b@q0ebP>t+Ln^7{DRy8FsL!ofKQc9g$u{ENHe^Ay*Kt=W2N)pZ^arIf;$1w< zB$YKNikueAgda|X)Zgi`Ar}a4!X*0OKGF3tiD zax>5AP*1XB1h+R9(1jt&yzkS~IjbMo>`rZ>w30Q+GeI|)c=cRnuEi`7+%w5%VG&#* zGCHF-Pf?#vD0c+WhXwVlnzZ&2*)`0JOGPrE2v-2`&ULF+Fra5cF@QzS&UvpkIOaz&Tu;lWv!l>EbZn)aI&6GW0!z^$i_aD1exBauoh;E27vR(C9<5KbH^8P0j{>&;7V zrdnB~mqyRZQn`0zG7<+l=Oj^Uh0Iwdc{SLkpHZ?a6j%uhkQn6k?cdg{NU`4P2|SVM zv$SZ!5$2q)xyU)k>6+c#O`^J5&onK9p&|n#{no*%kwh+Jd%G<*1Y~WD*H+>ub{&TY zIOm=P9%4o%?W{6Pi!=u^E*Qly94W~;1A~q_bgQvxHWFH@GjZBV%J8tZ;-{Qv zU?Y*=JYuV)mv4V@WhR{E;USEIKqKdo$s_q1FJv2%E~PEr_sKU7{;UZT`xVsT*)$AfKo`fBMx=?2}r~ zvqh&Oo`^i0x%>b){Ob4ib?w6DSP>U?;2J={9OsO4#a_6wx>;C}O6=KouVqt3qv@k9=1&shW=Nys&=y??y==#eOzzG_pK|GwYc3k+peA+zjX%Cp8O1-r`DM=+$<&SCb^PE zD}@L#jEtPH^!K0&hfX$THn`Mdl0Ptrus&r3AG~}1l_wf~yfMdiHtqq421Q?7}`A2e<&n!-QpKs2u>K-8Tgj3BF_-(DZ)F#qB zFgf)4RZBfu!IE32Md4LeKQAax_jAXte;;aX^$wRheKK)<0?3w$G6@JJ-wdn30|)Ux zm1?D^hSpVzFq`EB1|#KMjGW`9GhD@m^}XfetZ`e#BdN~N0Z=-3=Ld?n702$3DSTuR zPloSTU~Hyx4muEeS1<7AQn+|E1)6DOP|1bKVmkEpu7g{-j(sZb zHFrO|Zp3D}r5;&W(L3yUm@5;i$O`21-lSO&F~HnU@~r9P+EfGX6kyeqx@Se~IORv_ zTiKCv+x*H7K5m}X3NRt#>cotC)69xS!r92_nr6asTL(G88T=>}$0{jC4aXV5J-bqc z$UiALI6kBQ0IgObPcgTz&9#4c0UUecv|zAeH>!dM%2ynb{&=Nwmb)1V1fe&KI9zUA z_Nd&h?XMY*Q_k+#{{RZ;4x0}wS$4<@mBuiC3as`B6;@5k;ew-p4nGf1tsKY_W{is4%Uno>Pa~Z+~d?%@N{cynYXHp5<)SRbb!okt7{E~O{T2Sc3k z&r|EgW@wALl$*5k7Tu;oPC*=UD=IZIszU^16+7cwC;xxvgUKBSLX^6TgB~ zGL&FI`eafYqS69YGCOuP3th67BOLxU8(fBvvD?p3IHopeMAF=+mRj9%yGHi_8mQ-E zm0+Nb2;WVHc-4mJmB=84I0CdARm&Vgxc7-z{&?n)JqhjDi4-#o5CdT69eMplOj#Nk z6daHbUY?o!>Kk-s0g4Umr-FOqjDD2`zR(zsHv)L;?fk2m>S}9Q-3V>AG)7k-^X23L z(2CKD=Gi3?tTVPiE9Kj^Gux0cSuvf8jGLq5I431@T2N|Nsc(gX;DUZqkboQMxc>l3 zmvI+v?^g1~N0RY|83nMQfPT3(gy@Sd^;TWPkD0snBBsU3w%7(`Cz8$Xd;4d%r3nO% z%93Maju>)WbC1l`AoC`$GH=}+a%Lbt@!*VodgnFO!+WXQsZ_pJ5*1YQ<0d$P>~{R$ zjb&I|X^CyK?Kpl(P)8qAj=WTs(#pD;GQGv+vVsaMv99d&Zp2{rC!VzK56rsojrePO z1~Rc}BuK~y9E=h&dG{4GzFdlu{eaw&oc)?C?fQX^wDYP*Fp>`{GE|?MQVN_7p1pm$ zR$YzrJY;>h?2{~;S~Z1F$;UkO=lN9gE~2_F!(hl-Xsl*2N-|=S;K&cOs&N^i)Jt0!*=JDFywhzf zjs^f9=N)Q?c3ZWdRnr*3C7g3jFDoc<8n6SNfRXukrwOIMxQ+|W95VyF$rMIkC$J%i z1f27LIHy|bGK=9klG=YL5wMmR&r_3}{V`HYtUAvpl$J4rmHz;bqDVb+jl6J28KFHj z3lrwzMpavjv9tKr$cAtG=pTO79saFrrlK|Mx{?FJ%3&Bi@%M31%dEz67`lgfT<^(Y zyWXLfU2$m=wagCDux*bSV8nX!z@*$kJ24|`Ep|1XlU6{aY?;W65yxc%BmCyC21unP zVY}K72Xd%CfyQeZeO`O3ysh+6j)i59F_L@aatB{pWzMQ>7%j)yXI21zqsm4Pwnsmu zB_M4xaqg`L`UTFZG&ffXlwF@QXV9wSBAC%$EGY|F%IvGKHtt8RPVdIBCfDY8V|z3< z^Ps?-ZEu%3BN*s-rHjN`lt8nvVt8yWKOE+hnnLDX%hB9wcC&qjw2QQ99ZE>id7IQP zbGQZXOw^)>Qq&-@)va!PsSfms*J|VgmdGd9)N|`p?)BO3EZ!!PXqmR1@sdtPeRJ2+ zk}YK?w`*-mCX^5xDBfO3#xahElg&PBf@t2h(5-aaX`|Ba?&HY>!t#uLI&q$v>rq_U zYLK*Vr9H9A6_zWvYz$yEq%)Q?fHxmhB; zN#ull$pc8+cpMYXTk)Z_YYj;^p}4wC?PmkuUC72k`^B}7YMhRNxgdQFL3g3R(fc+EAft{y-<=RuJoEIfZYx)1 z!y_ri4?St`Z8p*Z;EzH-tuA5nGp;WdRw(rqJHO?g70Uy_9Xr;5lI|;X@~>hj7iP)e z>PNUB*AE0TA{B@fZJ-muIH^Q;AryV4LI)VnYCWS4W1_WdtIKPlb1X5Hkg9FmcahJ0 z5V_+#(%kB|8g|y7?8P5?{^mv`FdaDnV!87h$uMagu0}`z{&d3u&eJCFr=ePxQI72B z;<)p|tT)jzoP6yNC)`85t#C*Cvft%UGREw$9Jx-JwZ3cs<>zw@ea-$s{l+dN2QXvho# zkj>kt{{ULHqgZ289wP&|T=X>=x3b*1wnx}^E>xT!YA<~lNj71@s>JtgzSc;kae!Sw z=sIWfIj5}tRGwg*Nosh>Qrr3Nf5x{rLL&oj&`_6g#7CC|nE>GNfI4)cv`;6Q4d03G zBsTFzv&$S^06!}X4*357KDEzX=+WF|?b4Uz1EU^VXpbY;2DqPYRDUYC9TAHuH#7~DWTdvQUI1M_2$c*vqsZQYc;PIhk(!*eD<2zmgcgYSxjXfUdv zOO`E@yLJa1tEXg(DgjV)%?8mV89OuRI@47og5GB=bXOs^&R01bvCwuEExmz?+C-T0 zuels>O5>rfiR~mrDyxM)gdQrpK@y=S4gtXoc?Z2xs>yL|#DdkLx)_#rq3ouECxdmMtSLjRy@+} zv&=XLs`SsPrJ=3*l$zb#n`qrJ| z+zE_cODnbxc{`3d$LCoR+OmSr-1V*C)rgdlBFv_BB<=&AIH13o3vy1=k@V010IH){ zRy$JcM&>wC>^ho>OO6zBct1*^8n!q4F2MwqAO_D|bpBbY#|Lm`!jbZxpF>puCSCzM zl#z;^l!*#R;!V8nLzM&T^rFZUBHS64F2szUxTh*_Yy+Qsnz+SimJ^N?##b2_LM9}A8%)y9Vhk^$=Ijp;5=iWxd>>)Pb zgVSy+UMP#rWQqdC8Bz|0fTF;gnxlCutl0X64RZdGE=s&`u*JhWp zEJ+cH@-}5A9jX#W{t=G<08G+J9G79ESx)5#0D6v?#ar55+BT4FR0DIBKQi|R(ySdm zDHJn_V#28o4jB4lKSTLaZ6Hj`4(axd<(@+0U>s!j^13P-> zJwU18JK<;u+@#@n+uJAVdQ>h;-87Ju+nhT}HV=II3T*cgTErXA4CV4L2_xyApZ=;H z{A$f zI6t2}({?l4843V$HjMJ$hv8Z?-2U~vw@DQIp!VE7GtEOPEZS>2kr~~RrL(y4lU2;a zn_CnkofiPcgk!x*mx!tcz;WMi{{UK#?CF+2Fd{Mn0A(YZtnG#)C-BIt=3M~jEiSzI zqg6waLlf8x^Pg^i&MCIWNcA}#t=K6fj1CQK+Uc@Fj^Z)plg@e?wH!h-x-iS0!;Jk! zayqM^IkslJf#e|}R05;~APvKfXnOR)6eq04p(={SnqpLAhF8mhTjymLjDtvaa zK)76=Vt>yyE>{)XDS+X(Jf6$P`TEo1v4k?p=W!S-yQudbm31RRIN^QHX=ETM7#ts3 zo4(@ZZ+0;;ExC(3Qy2kwq_eb&6=srsikaKLCEM70W~2=m1d)@_3W&B}?u_FA=7PCL z+(j6ay3Hhjj05*b6Ce8(s2nqMu7mLvcv6*pw=KljZo0?2CGOkP6w z95-)52X3_J^!ue7gY41BPzrJ^gb` z^2Cl+&>qBRuf09w3giN(*bW6S&RFo>4`EN3G$is-RBgcLAY(jJWVgzl-kkL2m}Nc5 zBj1V|Pm=%-p!KD3TtZbq8wPXKo|Pbs0m~1>W~-@?^S8AwWguli1O2LZ2Fb7(0M4|Q#&9|cP!Ix08T>O*nAZb?&$TMTy>P^K>qW(JYH zFEi!ZH@5?fXY1eas9z-H1MWLi#j~Btzm+3Ms&Jcm_M+@euk)*XqZmI*eq6EYPhX`= z=I64~d8i*d2cgGWU^nL+Z5$4OQj;Su$~NHkH1jHUjQ({VLCE=s;hI1Zi9zMK_Y|dE zobSQ*G{3uH^KTjKXbPDDP6xd`2cW?lWd8F5Jmsn~rC8=cin7s@z);`tDnV@L9rHj~ zfNjY;hvh~9&Ljh$PIFR=78$^9I%birr4P7g9`p#0%Q+{1=4pJ0pPw-XKia1>5&@F! z)3~Ja)nho${PoTU(;wD=1-4GUWPLfM`xJY!u9?qTU@mY9HcxztUd2v9@5KS3GTWS# z1#);89Mc-y1NVW)uYcBsP;-~T`g1^En~=P8&otW&1_+%Pt^g!wAmXGDN>G3aBh{%k z?7;M=BRX=wQNI%nR|npQ*h^l82kXD?0OXpWRgnYW3R0~ zBpBOD*6*fy~knOP#z>B zCj|OaE?|yFbVDQC z;DN?K+e&va>ZJREXw+&5&X+*7naOy*U^alf1s$>JRolYwZTT4F`YH1f;bEZ08~k!#cvy|hb6JpS4W9kJp%eE z#W@HAEgnvL)Aq9N9H{0-fo_*8BL+Kg!9fLo&lRq&+hRboGRC`A8J7Ta=snF`Bmh?1F&(-Z8=as@zyP_?@PSrvZ*as27~Mi$gou!P0DJF34YY2;+*>PR%%bqHc8Hakd|2)#1j zUiil}1d&P1VL>3A9=?>*ZybP`VlCfs{V`9RyO@{K%J*JgKXZ-8921Uv9#7V+TwM+E zDzu3kjjJAc>F?OqzuD}=EP+bNjv0pG{W+}E)56?+rS7D62RL>4N$s2(r8R9vyvE(K z{hOf*xarAIPXnHr=CdZB?GLt7<*qWZgUTOVR<-t-ERnQgWC70OwGUr$-m=$8yoU6%%o=o<2nBTJ!;b5TN{STCm$(2PEV=y{{ZWH)mUw$x@Z05vN81K znEQ@+?rPK;VDgq&%Es%%F7gRs)aT#R@TrnrNN~H*rgYibW>}Q8ag4Jn?aKO`^y`jl z^Z}$I0kvN{Sd0Kc1dNf`QE?^OPv<~JbosfzCHk4{uQ3rOo6<@xjxjf-m`UVeJh&8^CI|l z$s#uIf?Pe{{UBvcg+k&a#?Ua7c~oG02M3; zy(&r+V;qh-6;?yJC<)hb=cdt0AOn#kfcHMMqT>S@>FG^Xl0%Zgy|Yrmh|sSp(h?8* zRE&_RVV%wN zrItBePD1lhh&L+|je(4iIvREhvF2$T1yGFl>}ky@VjBTQdM`iDpfLsj0?J20%^p;M zU@$z=u&&9x&Nlgtnge9xBY+q5KU% zvd%JDagO_{Pqa1;Nj}-2E?5pg8RPy0b3(L|AC*|~*yf^Jh__=Or74*ll~%#_pk(=A za8ZU12+yTIb{8d1M?ry5q-;iVarMOvk^{RAKs%tVZ0oAB`^Uzw*-`t|%SJ+A)EIVUJ3W=NuT^^ZnXjn+=gDJm6$hzI$!S zVUx!c282X88PC@=WtDd>)1JKasXXzLST23XIi>SpZVumYC=Ccpo_7z@gD6pshZOVV z6V#8!l*1czko`!`DS=&XRDwgd)bMHl0BRT*n38&P)}{M8m%>V}z<+k4Ht)M8HP2k* z6j=bG;JD^f@0w|poEB6*_@pYkuw!5k98(%4BZ9zoIL#Ioq@H4tf{HlwG=YgZ2)X=e zf;Tt|Asw;Ol&s26IU~^Zp&?w6k2okZ^`_-FV8%huG{zDTNx|bdrUKbJi-Yu_E?6wM zs6gsLqQIFTQT^!i>(3O0Sd52WJvgR7wdR3k`7%_|y*z~2$7DNvw8wCjT=8()(U~cxvt6L#{OpLyn=kumL zxhE+gJoLpoq4Ki2$aitKJ@}~vybQ(&?@C}NZvbHR6wsI)kcX%^>qXG4$9b`Ua~B?f znsAaW*z(^1Qx1B0nE-kUZb}@4JPx4$07_#dEpAQ>tT_9)=M?1-oCT1MIxwoOIm+O3 z?}JO`?%a0Ah3ZKF{vNc4a?g;XC0;E0@+nf+B%d&HdWNb+S(?>O`+pTdJK{(P;zhdpQ)Y_^8bN>UebAs7cOj|~O1M*xD23;? zeSb=)_IQHk<1AN&*fHO|N(oiUJ9Ebr^^!n-_&7Mh6q{kpXFakx-y7|6OE4-%dvJ5s zp_azfg)E3NMs}X{uFc6NG&$#i#XB&&?RasYN@`=~GM7#ys8;f~o?V!clk1A4@JSPx z%9h*4eq);7WPu#vSr~endc10&G^>%;j%GJGGABfAWzI?GigLji=ve2rF;;{MFabOs zJJZZh!mnRi%*MqBfaHw zB?d6(rx@)(S(cVkakg9!e)S<~8GiDd{{Rr=)^n!L?oK%OsKad|mmfizV!Jfim3V)f z(~1O;wg$ovs5M0{K41?%go<*^t<(|UIikopi{wGm&2L_&ljSY)Nw|+gRMmm|tOIr6 z)51yz-QAx`Rztcc%z%(^e-GBCjmqFE0&!IUbpUd|)_~4>w*$T?u+uI1iaBndN`_0A zcVH5I*ncVq&OeF0bJ$Z^QMo4r-->B5*i$MGzE|_9NQuXF&q}TKP)-LU*mb70xrlw~ z209G!Ma5=X5VjA_IQOPJWQ?9c{{U-)QO5EpUK<{i36Kntv}5r6sJK{D8k}Gd4L8Y& zTR6w`sW++N7yx}JXxWs7$R4!Epxvc0uz{b}p0Y`ki3bOzHBg+64{Y_I#Nd&*dzw}d z3zrO4g5Y)eXlt09eCxCx^#O&+Jupw8=A7woL9pDYl4x%}!UiJh=x zJRJ2MY3R-d;?0jkPBZt<;hYL;=q!j#Smb4LIuS@>EDL1g-1n)BgfKZ~KIVeWDdIDZ zxy>ty#TC{jRxP-Wypz_X+T48Hp6qz37h*CQBiy3|u6gUzG)*O}jzlQ&r=uOjeNHG9 zk{DPq`H+!}XVRod!|;en9kErM>Q<6G!ig-C~ z%;N-lQ$lbG$GDvL>qukL;gpTtyXQ48+c$Ht5PRaO$s02Afqx#fEM-RAH{njhMdlGm zzbH9AqN8hfToB&aB-KeA#`y)09E{bN?i@g7Tx9eF<8dv&GC`VPZh2UC(%eJZ;v z9&%gSu9>%@vIzZsDj6NY`BOgG;8U=2q6pA8U_I&U8!lULIO(|3o%?ym;YsiK<239m z3eMp^WgGgQXjk2|6)Xo(r?0QljODSPr8VRzPU6_~JkeoTdTkq+ebbPmo((j_>xL5H zUpNPXY83%UV(Yl~0~F;E7aQ60*BCgW+6kffVS${U{8JkvIac?nR7SbS&5_qQqzp6I z6VPWg3sSgqoDP}m-lp?O#t9hv#PLB_Z1MwBTjhRSbJ~jqnJJOf?JP*{dg7d(V9DBt z>N8NcmZyw12Ou7_3A4BXfCnDb?1y4@noYeEgV!A?p_PCee!SE?@I$6a&&(;v`@evC ze6C!LM@ zQfy*=Vxt_ErDV$=m>Ml{*naK2xj%(CO&)Qd*A(dj{{RondiqsaBHfd;kFQKrAs3^X z*bK;6XVaRL8(zu?_w}rhc6`4!KAe7Z@his1pTiW#b5dAiY;7A)pgk%RZo!Uz=>9Bq zs8Zp!;I=(#b8sC%-GB!;?@bQm2WSV@o{}L@F`he9nRg$&y#AEMw{nc?I8rwdI2q}h z6^C><`3ylh2i}@dH)I@-N@tWoz$LNz&=lmH9lxb9*$$H38zyl#F>DCArIg&02knT=bCf*YqTm8-{n1MSz--# zfUhV=e0tW0*y2dbw9vO4DuyMG<%+E$e4(&F>`gl%a-yMy0~4^5+yha`8*MvO=Nadv zTq@4l^Am5UJwCM3Tt3G8zlRi9T&STLnOFT-4bKbHHDyeg{q{nVNan0Oi=287yhrIw zEs_Y&Jx5wi0*J{nqz%uE9x1B8jPC@F-RK*bhtJE{nrUOWh1j8i^U8BTH2cWO^G zvB}322%IA-{{X5u9Fn}#R%{l+5D)87o2|J7F*q6apvsNUILF<`G+1{g`#>iuT4DcK8hOp>|WxzF)Xs&^0G0>4g`0Bx*QlabN0 znpHkuLJw?GvI`QDH+|(4jzMf~Jv$nRJj^#C7(I6yH_N-C?K#|NL1ajqh`{6? zBR?Sn(9{f!a=69^-3PS*xGk_2B=eC^&~`-rL|d?3N$>4UV5%~NdkoVK=Noa?oxKR9 z0d@$9_ek63`CV9Xo+(@hsF9CFKT2tE$7$RDXUzBn-r{ht|NF%zA`Obcn>{3INCpx24Z{N?tv@UPR*Uka#bE?1 z*^Wrdaw(?SP#gkz=Le-cNa^aw}FzBat`?NE~u= zRGId^e6$|9V~kLn4M3xDE>O{&}N77$#yf zoc=V|lOX-%9<=imjntx(#xsfx1Y?{W^(KTeGxLrlr8yKpcu}Fv%g>(QPA+ zP6bw?)QElJZ~^?s>q-e>oRvh_C4oKwCZRF4T$o~NEnmJ|IEXdMT$4*aLenPaQK&G7OS>fxzogW-F33O6Q)S_3co+MVlauj_18Ucgc+Ybi2b3o1Qa_ zQ`BT$QP0kDPdpAO$gB0sN{LjTDWn0PX;zQIqe5VT}3NoUsiOp~A1O z?u7eN36pVRxnbI)RgWAI&*4pu0Jvt5FvlyJOfG1H8-Owg*s~%Z+NT**u(Zb5OOSDJ&muJDPSg z70Dj7AZ6>$f0as)9#lWcpW-CY7GJ0f!n1;J%-I_+w2oph+DcOd+u(ve+A3<3@ZPSi@|f%6|+3Z7DIiPG+1;4xw` z^AYP(CF7ODF%6M{R0h&=qu&FJns8-bm5Cj>qmXF7_J#pS1@Xc5sLjh0@_?*5)fpQL zh2f4uuWC@=yB=U*!?$0?g%DRS3yCBFiVPleyR{*?4V41~H~Ga?ibZfi2cNx@z^A*S z{JlB+>Dd-eT!k#eayTUPrlYP0%o~h1y+o`#9!IxIX*gb+z39+HrB}i zgN0y8&VA{N^A4ELT0l0gbMqbr7DKTlZ6dn-*um+K%C5D{j>ljHI&B9$R(N0lFY=sV zoKgvyTy0~6-#uvM6_I$I$iTu^JRE`ise~_eBzDN#QT?Tq^~m)+kxxt3+;X`GqZ7%c z%FwI^F_H{eUJuL7ApoC{5<$onFudut6?pGXYk#9{dSk{{ zjiV%TbK0!=kT)z{M_d)+oXH%=JGQTI4mk9p@2C`BREf5Yfcu`6F2*akD)Ml1(yo1! zOCOmOELAbc83XH4`CxIpdjZ;wMRl=J)kaRz2iBQ`jDShUL01G(V-DwW?}~5{B8<8E zQE>Sg`3kvZDtZnmW(0s#bI%9#tAs*SsSJ6|L{{1Mf=aPG0<_0sIKqxscO8Z*z>YSE z=Oc{ej|6*De1sSzu}txUiUd%BytWsi+sC*cgsuY|=h#vQg${hE`t|jo2nz*bFi6cR?j)5~+JA(ODeZE( zCt?ho<227OXD2+K0i$thCeEdmRCgT?DXp~f2VX|(O1(G(c5{a9QM|0o00TeX0*f*3 zK1iLH8-ORid(x~@p!uAfanm`d426zJ$?M7Dlx{nZ%rWY7PRv#;qe#jWE*IZ{?Mh;k zji`hkxy@H;WcgJ=Jaf6RPWwYK+QoWj@9;gT*mm>{Hfr3@k zf_}KE8c6o8D#tx76G^^Mn1V-^)Rvs+)BLj&ox}2SC&}`&OLAiFu7z* zha`{U1c6tQ0Ee$0pmnA4i6e6zzwFag-$Wvo#wr~U=Q}_hGfVb)Ncr7VWM`ZMR|IIR zSyW{D^G*ZhE3gsiw}DovND2l5N7R~M qEDqWF(&r~R=hqZ>_4T5_AVJU!pGpGp$P{F8fN4SFq5SFWBmdbT+%GZ! literal 0 HcmV?d00001 diff --git a/candle-examples/examples/segformer/assets/burger.jpg b/candle-examples/examples/segformer/assets/burger.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e823c37aa5f73f93b88015f9b47bba05878c8d7c GIT binary patch literal 62870 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 XuW@Cxg5$uPMvz+YuW(o{;LrcruaYXD literal 0 HcmV?d00001 diff --git a/candle-examples/examples/segformer/assets/labels.json b/candle-examples/examples/segformer/assets/labels.json new file mode 100644 index 0000000000..645d215264 --- /dev/null +++ b/candle-examples/examples/segformer/assets/labels.json @@ -0,0 +1,752 @@ +[ + { + "index": 1, + "color": "#787878", + "label": "wall" + }, + { + "index": 2, + "color": "#B47878", + "label": "building;edifice" + }, + { + "index": 3, + "color": "#06E6E6", + "label": "sky" + }, + { + "index": 4, + "color": "#503232", + "label": "floor;flooring" + }, + { + "index": 5, + "color": "#04C803", + "label": "tree" + }, + { + "index": 6, + "color": "#787850", + "label": "ceiling" + }, + { + "index": 7, + "color": "#8C8C8C", + "label": "road;route" + }, + { + "index": 8, + "color": "#CC05FF", + "label": "bed" + }, + { + "index": 9, + "color": "#E6E6E6", + "label": "windowpane;window" + }, + { + "index": 10, + "color": "#04FA07", + "label": "grass" + }, + { + "index": 11, + "color": "#E005FF", + "label": "cabinet" + }, + { + "index": 12, + "color": "#EBFF07", + "label": "sidewalk;pavement" + }, + { + "index": 13, + "color": "#96053D", + "label": "person;individual;someone;somebody;mortal;soul" + }, + { + "index": 14, + "color": "#787846", + "label": "earth;ground" + }, + { + "index": 15, + "color": "#08FF33", + "label": "door;double;door" + }, + { + "index": 16, + "color": "#FF0652", + "label": "table" + }, + { + "index": 17, + "color": "#8FFF8C", + "label": "mountain;mount" + }, + { + "index": 18, + "color": "#CCFF04", + "label": "plant;flora;plant;life" + }, + { + "index": 19, + "color": "#FF3307", + "label": "curtain;drape;drapery;mantle;pall" + }, + { + "index": 20, + "color": "#CC4603", + "label": "chair" + }, + { + "index": 21, + "color": "#0066C8", + "label": "car;auto;automobile;machine;motorcar" + }, + { + "index": 22, + "color": "#3DE6FA", + "label": "water" + }, + { + "index": 23, + "color": "#FF0633", + "label": "painting;picture" + }, + { + "index": 24, + "color": "#0B66FF", + "label": "sofa;couch;lounge" + }, + { + "index": 25, + "color": "#FF0747", + "label": "shelf" + }, + { + "index": 26, + "color": "#FF09E0", + "label": "house" + }, + { + "index": 27, + "color": "#0907E6", + "label": "sea" + }, + { + "index": 28, + "color": "#DCDCDC", + "label": "mirror" + }, + { + "index": 29, + "color": "#FF095C", + "label": "rug;carpet;carpeting" + }, + { + "index": 30, + "color": "#7009FF", + "label": "field" + }, + { + "index": 31, + "color": "#08FFD6", + "label": "armchair" + }, + { + "index": 32, + "color": "#07FFE0", + "label": "seat" + }, + { + "index": 33, + "color": "#FFB806", + "label": "fence;fencing" + }, + { + "index": 34, + "color": "#0AFF47", + "label": "desk" + }, + { + "index": 35, + "color": "#FF290A", + "label": "rock;stone" + }, + { + "index": 36, + "color": "#07FFFF", + "label": "wardrobe;closet;press" + }, + { + "index": 37, + "color": "#E0FF08", + "label": "lamp" + }, + { + "index": 38, + "color": "#6608FF", + "label": "bathtub;bathing;tub;bath;tub" + }, + { + "index": 39, + "color": "#FF3D06", + "label": "railing;rail" + }, + { + "index": 40, + "color": "#FFC207", + "label": "cushion" + }, + { + "index": 41, + "color": "#FF7A08", + "label": "base;pedestal;stand" + }, + { + "index": 42, + "color": "#00FF14", + "label": "box" + }, + { + "index": 43, + "color": "#FF0829", + "label": "column;pillar" + }, + { + "index": 44, + "color": "#FF0599", + "label": "signboard;sign" + }, + { + "index": 45, + "color": "#0633FF", + "label": "chest;of;drawers;chest;bureau;dresser" + }, + { + "index": 46, + "color": "#EB0CFF", + "label": "counter" + }, + { + "index": 47, + "color": "#A09614", + "label": "sand" + }, + { + "index": 48, + "color": "#00A3FF", + "label": "sink" + }, + { + "index": 49, + "color": "#8C8C8C", + "label": "skyscraper" + }, + { + "index": 50, + "color": "#FA0A0F", + "label": "fireplace;hearth;open;fireplace" + }, + { + "index": 51, + "color": "#14FF00", + "label": "refrigerator;icebox" + }, + { + "index": 52, + "color": "#1FFF00", + "label": "grandstand;covered;stand" + }, + { + "index": 53, + "color": "#FF1F00", + "label": "path" + }, + { + "index": 54, + "color": "#FFE000", + "label": "stairs;steps" + }, + { + "index": 55, + "color": "#99FF00", + "label": "runway" + }, + { + "index": 56, + "color": "#0000FF", + "label": "case;display;case;showcase;vitrine" + }, + { + "index": 57, + "color": "#FF4700", + "label": "pool;table;billiard;table;snooker;table" + }, + { + "index": 58, + "color": "#00EBFF", + "label": "pillow" + }, + { + "index": 59, + "color": "#00ADFF", + "label": "screen;door;screen" + }, + { + "index": 60, + "color": "#1F00FF", + "label": "stairway;staircase" + }, + { + "index": 61, + "color": "#0BC8C8", + "label": "river" + }, + { + "index": 62, + "color": "#FF5200", + "label": "bridge;span" + }, + { + "index": 63, + "color": "#00FFF5", + "label": "bookcase" + }, + { + "index": 64, + "color": "#003DFF", + "label": "blind;screen" + }, + { + "index": 65, + "color": "#00FF70", + "label": "coffee;table;cocktail;table" + }, + { + "index": 66, + "color": "#00FF85", + "label": "toilet;can;commode;crapper;pot;potty;stool;throne" + }, + { + "index": 67, + "color": "#FF0000", + "label": "flower" + }, + { + "index": 68, + "color": "#FFA300", + "label": "book" + }, + { + "index": 69, + "color": "#FF6600", + "label": "hill" + }, + { + "index": 70, + "color": "#C2FF00", + "label": "bench" + }, + { + "index": 71, + "color": "#008FFF", + "label": "countertop" + }, + { + "index": 72, + "color": "#33FF00", + "label": "stove;kitchen;stove;range;kitchen;range;cooking;stove" + }, + { + "index": 73, + "color": "#0052FF", + "label": "palm;palm;tree" + }, + { + "index": 74, + "color": "#00FF29", + "label": "kitchen;island" + }, + { + "index": 75, + "color": "#00FFAD", + "label": "computer;computing;machine;computing;device;data;processor;electronic;computer;information;processing;system" + }, + { + "index": 76, + "color": "#0A00FF", + "label": "swivel;chair" + }, + { + "index": 77, + "color": "#ADFF00", + "label": "boat" + }, + { + "index": 78, + "color": "#00FF99", + "label": "bar" + }, + { + "index": 79, + "color": "#FF5C00", + "label": "arcade;machine" + }, + { + "index": 80, + "color": "#FF00FF", + "label": "hovel;hut;hutch;shack;shanty" + }, + { + "index": 81, + "color": "#FF00F5", + "label": "bus;autobus;coach;charabanc;double-decker;jitney;motorbus;motorcoach;omnibus;passenger;vehicle" + }, + { + "index": 82, + "color": "#FF0066", + "label": "towel" + }, + { + "index": 83, + "color": "#FFAD00", + "label": "light;light;source" + }, + { + "index": 84, + "color": "#FF0014", + "label": "truck;motortruck" + }, + { + "index": 85, + "color": "#FFB8B8", + "label": "tower" + }, + { + "index": 86, + "color": "#001FFF", + "label": "chandelier;pendant;pendent" + }, + { + "index": 87, + "color": "#00FF3D", + "label": "awning;sunshade;sunblind" + }, + { + "index": 88, + "color": "#0047FF", + "label": "streetlight;street;lamp" + }, + { + "index": 89, + "color": "#FF00CC", + "label": "booth;cubicle;stall;kiosk" + }, + { + "index": 90, + "color": "#00FFC2", + "label": "television;television;receiver;television;set;tv;tv;set;idiot;box;boob;tube;telly;goggle;box" + }, + { + "index": 91, + "color": "#00FF52", + "label": "airplane;aeroplane;plane" + }, + { + "index": 92, + "color": "#000AFF", + "label": "dirt;track" + }, + { + "index": 93, + "color": "#0070FF", + "label": "apparel;wearing;apparel;dress;clothes" + }, + { + "index": 94, + "color": "#3300FF", + "label": "pole" + }, + { + "index": 95, + "color": "#00C2FF", + "label": "land;ground;soil" + }, + { + "index": 96, + "color": "#007AFF", + "label": "bannister;banister;balustrade;balusters;handrail" + }, + { + "index": 97, + "color": "#00FFA3", + "label": "escalator;moving;staircase;moving;stairway" + }, + { + "index": 98, + "color": "#FF9900", + "label": "ottoman;pouf;pouffe;puff;hassock" + }, + { + "index": 99, + "color": "#00FF0A", + "label": "bottle" + }, + { + "index": 100, + "color": "#FF7000", + "label": "buffet;counter;sideboard" + }, + { + "index": 101, + "color": "#8FFF00", + "label": "poster;posting;placard;notice;bill;card" + }, + { + "index": 102, + "color": "#5200FF", + "label": "stage" + }, + { + "index": 103, + "color": "#A3FF00", + "label": "van" + }, + { + "index": 104, + "color": "#FFEB00", + "label": "ship" + }, + { + "index": 105, + "color": "#08B8AA", + "label": "fountain" + }, + { + "index": 106, + "color": "#8500FF", + "label": "conveyer;belt;conveyor;belt;conveyer;conveyor;transporter" + }, + { + "index": 107, + "color": "#00FF5C", + "label": "canopy" + }, + { + "index": 108, + "color": "#B800FF", + "label": "washer;automatic;washer;washing;machine" + }, + { + "index": 109, + "color": "#FF001F", + "label": "plaything;toy" + }, + { + "index": 110, + "color": "#00B8FF", + "label": "swimming;pool;swimming;bath;natatorium" + }, + { + "index": 111, + "color": "#00D6FF", + "label": "stool" + }, + { + "index": 112, + "color": "#FF0070", + "label": "barrel;cask" + }, + { + "index": 113, + "color": "#5CFF00", + "label": "basket;handbasket" + }, + { + "index": 114, + "color": "#00E0FF", + "label": "waterfall;falls" + }, + { + "index": 115, + "color": "#70E0FF", + "label": "tent;collapsible;shelter" + }, + { + "index": 116, + "color": "#46B8A0", + "label": "bag" + }, + { + "index": 117, + "color": "#A300FF", + "label": "minibike;motorbike" + }, + { + "index": 118, + "color": "#9900FF", + "label": "cradle" + }, + { + "index": 119, + "color": "#47FF00", + "label": "oven" + }, + { + "index": 120, + "color": "#FF00A3", + "label": "ball" + }, + { + "index": 121, + "color": "#FFCC00", + "label": "food;solid;food" + }, + { + "index": 122, + "color": "#FF008F", + "label": "step;stair" + }, + { + "index": 123, + "color": "#00FFEB", + "label": "tank;storage;tank" + }, + { + "index": 124, + "color": "#85FF00", + "label": "trade;name;brand;name;brand;marque" + }, + { + "index": 125, + "color": "#FF00EB", + "label": "microwave;microwave;oven" + }, + { + "index": 126, + "color": "#F500FF", + "label": "pot;flowerpot" + }, + { + "index": 127, + "color": "#FF007A", + "label": "animal;animate;being;beast;brute;creature;fauna" + }, + { + "index": 128, + "color": "#FFF500", + "label": "bicycle;bike;wheel;cycle" + }, + { + "index": 129, + "color": "#0ABED4", + "label": "lake" + }, + { + "index": 130, + "color": "#D6FF00", + "label": "dishwasher;dish;washer;dishwashing;machine" + }, + { + "index": 131, + "color": "#00CCFF", + "label": "screen;silver;screen;projection;screen" + }, + { + "index": 132, + "color": "#1400FF", + "label": "blanket;cover" + }, + { + "index": 133, + "color": "#FFFF00", + "label": "sculpture" + }, + { + "index": 134, + "color": "#0099FF", + "label": "hood;exhaust;hood" + }, + { + "index": 135, + "color": "#0029FF", + "label": "sconce" + }, + { + "index": 136, + "color": "#00FFCC", + "label": "vase" + }, + { + "index": 137, + "color": "#2900FF", + "label": "traffic;light;traffic;signal;stoplight" + }, + { + "index": 138, + "color": "#29FF00", + "label": "tray" + }, + { + "index": 139, + "color": "#AD00FF", + "label": "ashcan;trash;can;garbage;can;wastebin;ash;bin;ash-bin;ashbin;dustbin;trash;barrel;trash;bin" + }, + { + "index": 140, + "color": "#00F5FF", + "label": "fan" + }, + { + "index": 141, + "color": "#4700FF", + "label": "pier;wharf;wharfage;dock" + }, + { + "index": 142, + "color": "#7A00FF", + "label": "crt;screen" + }, + { + "index": 143, + "color": "#00FFB8", + "label": "plate" + }, + { + "index": 144, + "color": "#005CFF", + "label": "monitor;monitoring;device" + }, + { + "index": 145, + "color": "#B8FF00", + "label": "bulletin;board;notice;board" + }, + { + "index": 146, + "color": "#0085FF", + "label": "shower" + }, + { + "index": 147, + "color": "#FFD600", + "label": "radiator" + }, + { + "index": 148, + "color": "#19C2C2", + "label": "glass;drinking;glass" + }, + { + "index": 149, + "color": "#66FF00", + "label": "clock" + }, + { + "index": 150, + "color": "#5C00FF", + "label": "flag" + } +] diff --git a/candle-examples/examples/segformer/assets/output.png b/candle-examples/examples/segformer/assets/output.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae556bffd91ca88ed28f7e6bba1b405bc5f4791 GIT binary patch literal 17482 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 literal 0 HcmV?d00001 diff --git a/candle-examples/examples/segformer/main.rs b/candle-examples/examples/segformer/main.rs new file mode 100644 index 0000000000..9bab5db854 --- /dev/null +++ b/candle-examples/examples/segformer/main.rs @@ -0,0 +1,165 @@ +use candle::Device; +use candle::Module; +use candle_nn::VarBuilder; +use candle_transformers::models::segformer::{ + Config, ImageClassificationModel, SemanticSegmentationModel, +}; +use clap::{Args, Parser, Subcommand}; +use image::Rgb; +use imageproc::integral_image::ArrayData; +use std::collections::HashMap; +use std::path::PathBuf; + +#[derive(Parser)] +#[clap(about, version, long_about = None)] +struct CliArgs { + #[arg(long, help = "use cpu")] + cpu: bool, + #[command(subcommand)] + command: Commands, +} +#[derive(Args, Debug)] +struct SegmentationArgs { + #[arg( + long, + help = "name of the huggingface hub model", + default_value = "nvidia/segformer-b0-finetuned-ade-512-512" + )] + model_name: String, + #[arg( + long, + help = "path to the label file in json format", + default_value = "candle-examples/examples/segformer/assets/labels.json" + )] + label_path: PathBuf, + #[arg( + long, + help = "path to for the output mask image", + default_value = "candle-examples/examples/segformer/assets/output.png" + )] + output_path: PathBuf, + #[arg( + help = "path to image as input", + default_value = "candle-examples/examples/segformer/assets/ADE_val_00000001.jpg" + )] + image: PathBuf, +} + +#[derive(Args, Debug)] +struct ClassificationArgs { + #[arg( + long, + help = "name of the huggingface hub model", + default_value = "paolinox/segformer-finetuned-food101" + )] + model_name: String, + #[arg( + help = "path to image as input", + default_value = "candle-examples/examples/segformer/assets/burger.jpg" + )] + image: PathBuf, +} + +#[derive(Subcommand, Debug)] +enum Commands { + Segment(SegmentationArgs), + Classify(ClassificationArgs), +} + +fn get_vb_and_config(model_name: String, device: &Device) -> anyhow::Result<(VarBuilder, Config)> { + println!("loading model {} via huggingface hub", model_name); + let api = hf_hub::api::sync::Api::new()?; + let api = api.model(model_name.clone()); + let model_file = api.get("model.safetensors")?; + println!("model {} downloaded and loaded", model_name); + let vb = + unsafe { VarBuilder::from_mmaped_safetensors(&[model_file], candle::DType::F32, device)? }; + let config = std::fs::read_to_string(api.get("config.json")?)?; + let config: Config = serde_json::from_str(&config)?; + println!("{:?}", config); + Ok((vb, config)) +} + +#[derive(Debug, serde::Deserialize)] +struct LabelItem { + index: u32, + color: String, +} + +fn segmentation_task(args: SegmentationArgs, device: &Device) -> anyhow::Result<()> { + let label_file = std::fs::read_to_string(&args.label_path)?; + let label_items: Vec = serde_json::from_str(&label_file)?; + let label_colors: HashMap> = label_items + .iter() + .map(|x| { + (x.index - 1, { + let color = x.color.trim_start_matches('#'); + let r = u8::from_str_radix(&color[0..2], 16).unwrap(); + let g = u8::from_str_radix(&color[2..4], 16).unwrap(); + let b = u8::from_str_radix(&color[4..6], 16).unwrap(); + Rgb([r, g, b]) + }) + }) + .collect(); + + let image = candle_examples::imagenet::load_image224(args.image)? + .unsqueeze(0)? + .to_device(device)?; + let (vb, config) = get_vb_and_config(args.model_name, device)?; + let num_labels = label_items.len(); + + let model = SemanticSegmentationModel::new(&config, num_labels, vb)?; + let segmentations = model.forward(&image)?; + + // generate a mask image + let mask = &segmentations.squeeze(0)?.argmax(0)?; + let (h, w) = mask.dims2()?; + let mask = mask.flatten_all()?.to_vec1::()?; + let mask = mask + .iter() + .flat_map(|x| label_colors[x].data()) + .collect::>(); + let mask: image::ImageBuffer, Vec> = + image::ImageBuffer::from_raw(w as u32, h as u32, mask).unwrap(); + // resize + let mask = image::DynamicImage::from(mask); + let mask = mask.resize_to_fill( + w as u32 * 4, + h as u32 * 4, + image::imageops::FilterType::CatmullRom, + ); + mask.save(args.output_path.clone())?; + println!("mask image saved to {:?}", args.output_path); + Ok(()) +} + +fn classification_task(args: ClassificationArgs, device: &Device) -> anyhow::Result<()> { + let image = candle_examples::imagenet::load_image224(args.image)? + .unsqueeze(0)? + .to_device(device)?; + let (vb, config) = get_vb_and_config(args.model_name, device)?; + let num_labels = 7; + let model = ImageClassificationModel::new(&config, num_labels, vb)?; + let classification = model.forward(&image)?; + let classification = candle_nn::ops::softmax_last_dim(&classification)?; + let classification = classification.squeeze(0)?; + println!( + "classification logits {:?}", + classification.to_vec1::()? + ); + let label_id = classification.argmax(0)?.to_scalar::()?; + let label_id = format!("{}", label_id); + println!("label: {}", config.id2label[&label_id]); + Ok(()) +} + +pub fn main() -> anyhow::Result<()> { + let args = CliArgs::parse(); + let device = candle_examples::device(args.cpu)?; + if let Commands::Segment(args) = args.command { + segmentation_task(args, &device)? + } else if let Commands::Classify(args) = args.command { + classification_task(args, &device)? + } + Ok(()) +} diff --git a/candle-transformers/src/models/mod.rs b/candle-transformers/src/models/mod.rs index a5f03059b8..6833bab0f8 100644 --- a/candle-transformers/src/models/mod.rs +++ b/candle-transformers/src/models/mod.rs @@ -41,6 +41,7 @@ pub mod repvgg; pub mod resnet; pub mod rwkv_v5; pub mod rwkv_v6; +pub mod segformer; pub mod segment_anything; pub mod stable_diffusion; pub mod stable_lm; diff --git a/candle-transformers/src/models/segformer.rs b/candle-transformers/src/models/segformer.rs new file mode 100644 index 0000000000..eee82f4f8e --- /dev/null +++ b/candle-transformers/src/models/segformer.rs @@ -0,0 +1,704 @@ +use crate::models::with_tracing::{conv2d, linear, Conv2d, Linear}; +use candle::{Module, ModuleT, Result, Tensor, D}; +use candle_nn::{conv2d_no_bias, layer_norm, Activation, Conv2dConfig, VarBuilder}; +use serde::Deserialize; +use std::collections::HashMap; + +// https://github.com/huggingface/transformers/blob/main/src/transformers/models/segformer/configuration_segformer.py +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct Config { + pub id2label: HashMap, + pub num_channels: usize, + pub num_encoder_blocks: usize, + pub depths: Vec, + pub sr_ratios: Vec, + pub hidden_sizes: Vec, + pub patch_sizes: Vec, + pub strides: Vec, + pub num_attention_heads: Vec, + pub mlp_ratios: Vec, + pub hidden_act: candle_nn::Activation, + pub layer_norm_eps: f64, + pub decoder_hidden_size: usize, +} + +#[derive(Debug, Clone)] +struct SegformerOverlapPatchEmbeddings { + projection: Conv2d, + layer_norm: candle_nn::LayerNorm, +} + +impl SegformerOverlapPatchEmbeddings { + fn new( + config: &Config, + patch_size: usize, + stride: usize, + num_channels: usize, + hidden_size: usize, + vb: VarBuilder, + ) -> Result { + let projection = conv2d( + num_channels, + hidden_size, + patch_size, + Conv2dConfig { + stride, + padding: patch_size / 2, + ..Default::default() + }, + vb.pp("proj"), + )?; + let layer_norm = + candle_nn::layer_norm(hidden_size, config.layer_norm_eps, vb.pp("layer_norm"))?; + Ok(Self { + projection, + layer_norm, + }) + } +} + +impl Module for SegformerOverlapPatchEmbeddings { + fn forward(&self, x: &Tensor) -> Result { + let embeddings = self.projection.forward(x)?; + let shape = embeddings.shape(); + // [B, C, H, W] -> [B, H * W, C] + let embeddings = embeddings.flatten_from(2)?.transpose(1, 2)?; + let embeddings = self.layer_norm.forward(&embeddings)?; + // [B, H * W, C] -> [B, C, H, W] + let embeddings = embeddings.transpose(1, 2)?.reshape(shape)?; + Ok(embeddings) + } +} + +#[derive(Debug, Clone)] +struct SegformerEfficientSelfAttention { + num_attention_heads: usize, + attention_head_size: usize, + query: Linear, + key: Linear, + value: Linear, + sr: Option, + layer_norm: Option, +} + +impl SegformerEfficientSelfAttention { + fn new( + config: &Config, + hidden_size: usize, + num_attention_heads: usize, + sequence_reduction_ratio: usize, + vb: VarBuilder, + ) -> Result { + if hidden_size % num_attention_heads != 0 { + candle::bail!( + "The hidden size {} is not a multiple of the number of attention heads {}", + hidden_size, + num_attention_heads + ) + } + let attention_head_size = hidden_size / num_attention_heads; + let all_head_size = num_attention_heads * attention_head_size; + let query = linear(hidden_size, all_head_size, vb.pp("query"))?; + let key = linear(hidden_size, all_head_size, vb.pp("key"))?; + let value = linear(hidden_size, all_head_size, vb.pp("value"))?; + let (sr, layer_norm) = if sequence_reduction_ratio > 1 { + ( + Some(conv2d( + hidden_size, + hidden_size, + sequence_reduction_ratio, + Conv2dConfig { + stride: sequence_reduction_ratio, + ..Default::default() + }, + vb.pp("sr"), + )?), + Some(candle_nn::layer_norm( + hidden_size, + config.layer_norm_eps, + vb.pp("layer_norm"), + )?), + ) + } else { + (None, None) + }; + Ok(Self { + num_attention_heads, + attention_head_size, + query, + key, + value, + sr, + layer_norm, + }) + } + + fn transpose_for_scores(&self, hidden_states: Tensor) -> Result { + let (batch, seq_length, _) = hidden_states.shape().dims3()?; + let new_shape = &[ + batch, + seq_length, + self.num_attention_heads, + self.attention_head_size, + ]; + let hidden_states = hidden_states.reshape(new_shape)?; + let hidden_states = hidden_states.permute((0, 2, 1, 3))?; + Ok(hidden_states) + } +} + +impl Module for SegformerEfficientSelfAttention { + fn forward(&self, x: &Tensor) -> Result { + // [B, C, H, W] -> [B, H * W, C] + let hidden_states = x.flatten_from(2)?.permute((0, 2, 1))?; + let query = self + .transpose_for_scores(self.query.forward(&hidden_states)?)? + .contiguous()?; + let hidden_states = if let (Some(sr), Some(layer_norm)) = (&self.sr, &self.layer_norm) { + let hidden_states = sr.forward(x)?; + // [B, C, H, W] -> [B, H * W, C] + let hidden_states = hidden_states.flatten_from(2)?.permute((0, 2, 1))?; + layer_norm.forward(&hidden_states)? + } else { + // already [B, H * W, C] + hidden_states + }; + // standard self-attention + let key = self + .transpose_for_scores(self.key.forward(&hidden_states)?)? + .contiguous()?; + let value = self + .transpose_for_scores(self.value.forward(&hidden_states)?)? + .contiguous()?; + let attention_scores = + (query.matmul(&key.t()?)? / f64::sqrt(self.attention_head_size as f64))?; + let attention_scores = candle_nn::ops::softmax_last_dim(&attention_scores)?; + let result = attention_scores.matmul(&value)?; + let result = result.permute((0, 2, 1, 3))?.contiguous()?; + result.flatten_from(D::Minus2) + } +} + +#[derive(Debug, Clone)] +struct SegformerSelfOutput { + dense: Linear, +} + +impl SegformerSelfOutput { + fn new(hidden_size: usize, vb: VarBuilder) -> Result { + let dense = linear(hidden_size, hidden_size, vb.pp("dense"))?; + Ok(Self { dense }) + } +} + +impl Module for SegformerSelfOutput { + fn forward(&self, x: &Tensor) -> Result { + self.dense.forward(x) + } +} + +#[derive(Debug, Clone)] +struct SegformerAttention { + attention: SegformerEfficientSelfAttention, + output: SegformerSelfOutput, +} + +impl SegformerAttention { + fn new( + config: &Config, + hidden_size: usize, + num_attention_heads: usize, + sequence_reduction_ratio: usize, + vb: VarBuilder, + ) -> Result { + let attention = SegformerEfficientSelfAttention::new( + config, + hidden_size, + num_attention_heads, + sequence_reduction_ratio, + vb.pp("self"), + )?; + let output = SegformerSelfOutput::new(hidden_size, vb.pp("output"))?; + Ok(Self { attention, output }) + } +} + +impl Module for SegformerAttention { + fn forward(&self, x: &Tensor) -> Result { + let attention_output = self.attention.forward(x)?; + self.output.forward(&attention_output) + } +} + +#[derive(Debug, Clone)] +struct SegformerDWConv { + dw_conv: Conv2d, +} + +impl SegformerDWConv { + fn new(dim: usize, vb: VarBuilder) -> Result { + let dw_conv = conv2d( + dim, + dim, + 3, + Conv2dConfig { + stride: 1, + padding: 1, + groups: dim, + ..Default::default() + }, + vb.pp("dwconv"), + )?; + Ok(Self { dw_conv }) + } +} + +impl Module for SegformerDWConv { + fn forward(&self, x: &Tensor) -> Result { + self.dw_conv.forward(x) + } +} + +#[derive(Debug, Clone)] +struct SegformerMixFFN { + dense1: Linear, + dw_conv: SegformerDWConv, + act: Activation, + dense2: Linear, +} + +impl SegformerMixFFN { + fn new( + config: &Config, + in_features: usize, + hidden_features: usize, + out_features: usize, + vb: VarBuilder, + ) -> Result { + let dense1 = linear(in_features, hidden_features, vb.pp("dense1"))?; + let dw_conv = SegformerDWConv::new(hidden_features, vb.pp("dwconv"))?; + let act = config.hidden_act; + let dense2 = linear(hidden_features, out_features, vb.pp("dense2"))?; + Ok(Self { + dense1, + dw_conv, + act, + dense2, + }) + } +} + +impl Module for SegformerMixFFN { + fn forward(&self, x: &Tensor) -> Result { + let (batch, _, height, width) = x.shape().dims4()?; + let hidden_states = self + .dense1 + .forward(&x.flatten_from(2)?.permute((0, 2, 1))?)?; + let channels = hidden_states.dim(2)?; + let hidden_states = self.dw_conv.forward( + &hidden_states + .permute((0, 2, 1))? + .reshape((batch, channels, height, width))?, + )?; + let hidden_states = self.act.forward(&hidden_states)?; + let hidden_states = self + .dense2 + .forward(&hidden_states.flatten_from(2)?.permute((0, 2, 1))?)?; + let channels = hidden_states.dim(2)?; + hidden_states + .permute((0, 2, 1))? + .reshape((batch, channels, height, width)) + } +} + +#[derive(Debug, Clone)] +struct SegformerLayer { + layer_norm_1: candle_nn::LayerNorm, + attention: SegformerAttention, + layer_norm_2: candle_nn::LayerNorm, + mlp: SegformerMixFFN, +} + +impl SegformerLayer { + fn new( + config: &Config, + hidden_size: usize, + num_attention_heads: usize, + sequence_reduction_ratio: usize, + mlp_ratio: usize, + vb: VarBuilder, + ) -> Result { + let layer_norm_1 = layer_norm(hidden_size, config.layer_norm_eps, vb.pp("layer_norm_1"))?; + let attention = SegformerAttention::new( + config, + hidden_size, + num_attention_heads, + sequence_reduction_ratio, + vb.pp("attention"), + )?; + let layer_norm_2 = layer_norm(hidden_size, config.layer_norm_eps, vb.pp("layer_norm_2"))?; + let mlp = SegformerMixFFN::new( + config, + hidden_size, + hidden_size * mlp_ratio, + hidden_size, + vb.pp("mlp"), + )?; + Ok(Self { + layer_norm_1, + attention, + layer_norm_2, + mlp, + }) + } +} + +impl Module for SegformerLayer { + fn forward(&self, x: &Tensor) -> Result { + let shape = x.shape().dims4()?; + // [B, C, H, W] -> [B, H * W, C] + let hidden_states = x.flatten_from(2)?.permute((0, 2, 1))?; + let layer_norm_output = self.layer_norm_1.forward(&hidden_states)?; + let layer_norm_output = layer_norm_output.permute((0, 2, 1))?.reshape(shape)?; + // attention takes in [B, C, H, W] in order to properly do conv2d (and output [B, H * W, C]) + let attention_output = self.attention.forward(&layer_norm_output)?; + let hidden_states = (attention_output + hidden_states)?; + let layer_norm_output = self.layer_norm_2.forward(&hidden_states)?; + let mlp_output = self + .mlp + .forward(&layer_norm_output.permute((0, 2, 1))?.reshape(shape)?)?; + hidden_states.permute((0, 2, 1))?.reshape(shape)? + mlp_output + } +} + +#[derive(Debug, Clone)] +struct SegformerEncoder { + /// config file + config: Config, + /// a list of embeddings + patch_embeddings: Vec, + /// a list of attention blocks, each consisting of layers + blocks: Vec>, + /// a final list of layer norms + layer_norms: Vec, +} + +impl SegformerEncoder { + fn new(config: Config, vb: VarBuilder) -> Result { + let mut patch_embeddings = Vec::with_capacity(config.num_encoder_blocks); + let mut blocks = Vec::with_capacity(config.num_encoder_blocks); + let mut layer_norms = Vec::with_capacity(config.num_encoder_blocks); + for i in 0..config.num_encoder_blocks { + let patch_size = config.patch_sizes[i]; + let stride = config.strides[i]; + let hidden_size = config.hidden_sizes[i]; + let num_channels = if i == 0 { + config.num_channels + } else { + config.hidden_sizes[i - 1] + }; + patch_embeddings.push(SegformerOverlapPatchEmbeddings::new( + &config, + patch_size, + stride, + num_channels, + hidden_size, + vb.pp(&format!("patch_embeddings.{}", i)), + )?); + let mut layers = Vec::with_capacity(config.depths[i]); + for j in 0..config.depths[i] { + let sequence_reduction_ratio = config.sr_ratios[i]; + let num_attention_heads = config.num_attention_heads[i]; + let mlp_ratio = config.mlp_ratios[i]; + layers.push(SegformerLayer::new( + &config, + hidden_size, + num_attention_heads, + sequence_reduction_ratio, + mlp_ratio, + vb.pp(&format!("block.{}.{}", i, j)), + )?); + } + blocks.push(layers); + layer_norms.push(layer_norm( + hidden_size, + config.layer_norm_eps, + vb.pp(&format!("layer_norm.{}", i)), + )?); + } + Ok(Self { + config, + patch_embeddings, + blocks, + layer_norms, + }) + } +} + +impl ModuleWithHiddenStates for SegformerEncoder { + fn forward(&self, x: &Tensor) -> Result> { + let mut all_hidden_states = Vec::with_capacity(self.config.num_encoder_blocks); + let mut hidden_states = x.clone(); + for i in 0..self.config.num_encoder_blocks { + hidden_states = self.patch_embeddings[i].forward(&hidden_states)?; + for layer in &self.blocks[i] { + hidden_states = layer.forward(&hidden_states)?; + } + let shape = hidden_states.shape().dims4()?; + hidden_states = + self.layer_norms[i].forward(&hidden_states.flatten_from(2)?.permute((0, 2, 1))?)?; + hidden_states = hidden_states.permute((0, 2, 1))?.reshape(shape)?; + all_hidden_states.push(hidden_states.clone()); + } + Ok(all_hidden_states) + } +} + +#[derive(Debug, Clone)] +struct SegformerModel { + encoder: SegformerEncoder, +} + +impl SegformerModel { + fn new(config: &Config, vb: VarBuilder) -> Result { + let encoder = SegformerEncoder::new(config.clone(), vb.pp("encoder"))?; + Ok(Self { encoder }) + } +} + +impl ModuleWithHiddenStates for SegformerModel { + fn forward(&self, x: &Tensor) -> Result> { + self.encoder.forward(x) + } +} + +#[derive(Debug, Clone)] +struct SegformerMLP { + proj: Linear, +} + +impl SegformerMLP { + fn new(config: &Config, input_dim: usize, vb: VarBuilder) -> Result { + let proj = linear(input_dim, config.decoder_hidden_size, vb.pp("proj"))?; + Ok(Self { proj }) + } +} + +impl Module for SegformerMLP { + fn forward(&self, x: &Tensor) -> Result { + self.proj.forward(x) + } +} + +#[derive(Debug, Clone)] +struct SegformerDecodeHead { + linear_c: Vec, + linear_fuse: candle_nn::Conv2d, + batch_norm: candle_nn::BatchNorm, + classifier: candle_nn::Conv2d, +} + +impl SegformerDecodeHead { + fn new(config: &Config, num_labels: usize, vb: VarBuilder) -> Result { + let mut linear_c = Vec::with_capacity(config.num_encoder_blocks); + for i in 0..config.num_encoder_blocks { + let hidden_size = config.hidden_sizes[i]; + linear_c.push(SegformerMLP::new( + config, + hidden_size, + vb.pp(&format!("linear_c.{}", i)), + )?); + } + let linear_fuse = conv2d_no_bias( + config.decoder_hidden_size * config.num_encoder_blocks, + config.decoder_hidden_size, + 1, + Conv2dConfig::default(), + vb.pp("linear_fuse"), + )?; + let batch_norm = candle_nn::batch_norm( + config.decoder_hidden_size, + config.layer_norm_eps, + vb.pp("batch_norm"), + )?; + let classifier = conv2d_no_bias( + config.decoder_hidden_size, + num_labels, + 1, + Conv2dConfig::default(), + vb.pp("classifier"), + )?; + Ok(Self { + linear_c, + linear_fuse, + batch_norm, + classifier, + }) + } + + fn forward(&self, encoder_hidden_states: &[Tensor]) -> Result { + if encoder_hidden_states.len() != self.linear_c.len() { + candle::bail!( + "The number of encoder hidden states {} is not equal to the number of linear layers {}", + encoder_hidden_states.len(), + self.linear_c.len() + ) + } + // most fine layer + let (_, _, upsample_height, upsample_width) = encoder_hidden_states[0].shape().dims4()?; + let mut hidden_states = Vec::with_capacity(self.linear_c.len()); + for (hidden_state, mlp) in encoder_hidden_states.iter().zip(&self.linear_c) { + let (batch, _, height, width) = hidden_state.shape().dims4()?; + let hidden_state = mlp.forward(&hidden_state.flatten_from(2)?.permute((0, 2, 1))?)?; + let hidden_state = hidden_state.permute((0, 2, 1))?.reshape(( + batch, + hidden_state.dim(2)?, + height, + width, + ))?; + let hidden_state = hidden_state.upsample_nearest2d(upsample_height, upsample_width)?; + hidden_states.push(hidden_state); + } + hidden_states.reverse(); + let hidden_states = Tensor::cat(&hidden_states, 1)?; + let hidden_states = self.linear_fuse.forward(&hidden_states)?; + let hidden_states = self.batch_norm.forward_t(&hidden_states, false)?; + let hidden_states = hidden_states.relu()?; + self.classifier.forward(&hidden_states) + } +} + +trait ModuleWithHiddenStates { + fn forward(&self, xs: &Tensor) -> Result>; +} + +#[derive(Debug, Clone)] +pub struct SemanticSegmentationModel { + segformer: SegformerModel, + decode_head: SegformerDecodeHead, +} + +impl SemanticSegmentationModel { + pub fn new(config: &Config, num_labels: usize, vb: VarBuilder) -> Result { + let segformer = SegformerModel::new(config, vb.pp("segformer"))?; + let decode_head = SegformerDecodeHead::new(config, num_labels, vb.pp("decode_head"))?; + Ok(Self { + segformer, + decode_head, + }) + } +} + +impl Module for SemanticSegmentationModel { + fn forward(&self, x: &Tensor) -> Result { + let hidden_states = self.segformer.forward(x)?; + self.decode_head.forward(&hidden_states) + } +} + +#[derive(Debug, Clone)] +pub struct ImageClassificationModel { + segformer: SegformerModel, + classifier: Linear, +} + +impl ImageClassificationModel { + pub fn new(config: &Config, num_labels: usize, vb: VarBuilder) -> Result { + let segformer = SegformerModel::new(config, vb.pp("segformer"))?; + let classifier = linear(config.decoder_hidden_size, num_labels, vb.pp("classifier"))?; + Ok(Self { + segformer, + classifier, + }) + } +} + +impl Module for ImageClassificationModel { + fn forward(&self, x: &Tensor) -> Result { + let all_hidden_states = self.segformer.forward(x)?; + let hidden_states = all_hidden_states.last().unwrap(); + let hidden_states = hidden_states.flatten_from(2)?.permute((0, 2, 1))?; + let mean = hidden_states.mean(1)?; + self.classifier.forward(&mean) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_config_json_load() { + let raw_json = r#"{ + "architectures": [ + "SegformerForImageClassification" + ], + "attention_probs_dropout_prob": 0.0, + "classifier_dropout_prob": 0.1, + "decoder_hidden_size": 256, + "depths": [ + 2, + 2, + 2, + 2 + ], + "downsampling_rates": [ + 1, + 4, + 8, + 16 + ], + "drop_path_rate": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.0, + "hidden_sizes": [ + 32, + 64, + 160, + 256 + ], + "image_size": 224, + "initializer_range": 0.02, + "layer_norm_eps": 1e-06, + "mlp_ratios": [ + 4, + 4, + 4, + 4 + ], + "model_type": "segformer", + "num_attention_heads": [ + 1, + 2, + 5, + 8 + ], + "num_channels": 3, + "num_encoder_blocks": 4, + "patch_sizes": [ + 7, + 3, + 3, + 3 + ], + "sr_ratios": [ + 8, + 4, + 2, + 1 + ], + "strides": [ + 4, + 2, + 2, + 2 + ], + "torch_dtype": "float32", + "transformers_version": "4.12.0.dev0" + }"#; + let config: Config = serde_json::from_str(raw_json).unwrap(); + assert_eq!(vec![4, 2, 2, 2], config.strides); + assert_eq!(1e-6, config.layer_norm_eps); + } +}