From 9d3778425b5b3985814d3d004d8b811c083a4c42 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Wed, 31 Jan 2018 13:17:17 -0800 Subject: [PATCH 01/42] README --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 85657d8f5d5..f95295482f3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Here are the major features: backward passes might be different too), or it can be set for the whole Net. * **Integration with [cuDNN](https://developer.nvidia.com/cudnn) v7**. * **Automatic selection of the best cuDNN convolution algorithm**. -* **Integration with v2.1 of [NCCL library](https://github.com/NVIDIA/nccl)** +* **Integration with v2.2 of [NCCL library](https://github.com/NVIDIA/nccl)** for improved multi-GPU scaling. * **Optimized GPU memory management** for data and parameters storage, I/O buffers and workspace for convolutional layers. @@ -44,5 +44,7 @@ Please cite Caffe in your publications if it helps your research: ## Useful notes Libturbojpeg library is used since 0.16.5. It has a packaging bug. Please execute the following (required for Makefile, optional for CMake): +``` sudo apt-get install libturbojpeg libturbojpeg-dev sudo ln -s /usr/lib/x86_64-linux-gnu/libturbojpeg.so.0.1.0 /usr/lib/x86_64-linux-gnu/libturbojpeg.so +``` \ No newline at end of file From d4bc664f83e169aa18d56b32aaf92a9629d3aae4 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Wed, 31 Jan 2018 13:06:50 -0800 Subject: [PATCH 02/42] User Guide added --- NVCaffe-User-Guide.pdf | Bin 0 -> 1664628 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 NVCaffe-User-Guide.pdf diff --git a/NVCaffe-User-Guide.pdf b/NVCaffe-User-Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b38dd6445090c4aa9d68ffccbcdea90a555ec6de GIT binary patch literal 1664628 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 `!iLjWqJn+Pgn6e5slK^G9 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�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

r1(7eyYxfqr016;{ z^so7?5nDNbTfFkIo*X`Io5UDL^RNT&R_kBTvK7@CHC|GL@)6?}P|^9UTnx_oef@`q^3l=Z6y@U!-736Nu#B=2yRFsS@*7fJp5S$)@QOfDnwdKF!8u ziHf{94rib86&W$xwlh~HvOb({`R^BK9mLEy;t}PUDw^Sa;HjDJeD^;-r0lFrD=gF; z<{dd3`JDi&H;H)ZvbXZ9=E6Hn!HcTtX@WJXy1Y6k_yFNo+FyDbaqpo!Hv%Xh#D;O> zwAa$|@5+4r*TRL~)(J>E8&ApdRoZuLI@1-_Z{DPemvk{tSE8nbSOGF;2fLq4h>Rjk zN6()Y5M;Zw(Kp1@kH}SGtO&HDNlFP%N zqeAtWqJpnKkQf3a7nfprV~w`Md!&~bUTvM-(~gflE)y=Z-ghzk03^6vDV?OK*mMEl z9xQU4CH2D|*h%PD;vqCIOyq`i*Y7$tYnix|(ICwY(>8`Y7_0Q5T59dfpX9w1OBTfo zS9n-+nUpZenh#_DxGjixEN8!HkH|aPv~_Z!xP1_Dkzj8xfABxSjL1a7shI+nE#e}e z1Wvwy{fQr52Y{`w+nDiJ z6Hp1(gQlB z@X^wlx6?=3ZFZ-y!QI7y2UYV-2IQ-*a3_~{O1>uMJ}=*HJB9UNy~Ne-l#kRF%nb_` zCX&0X4*x}0qDj_D2aa(44}hBL2y46xXyQtvBp}rcD%fpq}Oh3fq#0?8J#@=I_h%g&jC(k{6;SdZDgzO&#```^}>`Y z<_4>zCTHA|e9zhozp|uxkMbsY8t53qbbZ{(_!)rnsMjl8g+$ASS|?5>ts=V@`*+yt zJADh!i)!7VT#}_-KyZ?WmlK(M{C5vkZl@AU9`SnPSii`^l`ZN%a2jB3?Jqr6E5`5?=-|`AMXF&ZXVA0@L62AmqOhi z{zP#p)xBkTX&z~ND+b2WwUU#Mr?GQM`1}(0+tzBiCOy7NqXr2S77ZA;ef0F+c0hvc z$2$>8p*%kK@64r6E_fkH*3nlraCgg%Ma4w1!%K@x`(f$O5=3f@^$F^6YytGfV^agA zz3f@P`@2(p_;{ANf+*cbgL<|?g^q5k9lmb)rXyR&wti=qB9fwW2&wPy-01*{o7x?= z4>S`QEXruBCpuI#eE%05;l#p#owR28s8-;d896R8WXYz%*L@gB_1Y@6ijG(%f9m#w zK?YoRvR4u=?FhJt7%c!q^L9JxDW95L2a?)sHc#Jk)O}~;R|Pr!YM++la|idmOZa%K zaJ@a@AeA0iBl?i?hP9226IR%%sTIDJ%-|v0ZXjIg@pA)6c5AOb?e4=)Dc9UoYqz<1 zv>US)QLt8�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�T}eTQrhA%T7&h0!+cO zQO?;n2(id3BLTLM1*CHKqgg1IBpB0zN5*)|?GQr(ER)HUYcd-{s4#-4=g%~D-@d`o zpv&O>5QhND6&r}9WLuDaeO-L}KI1TGA|TjS@cHXu*FOxcfV9TXUfo+5(3+R5AT`yy zmlSBncU&Pm)l?W`r|dI5_k(6-3IFrS+$!yTNYiI^vf$?8kIU%s=K1wu5Z<|{LLO8W zZn1DScr4Yv@5A@-e7^mEusk&mgzL_4`VHFh{H!U>j+fq6UhVkbF3v(r%~vxH=HvF< zW%=#;7@aA>IsR26Luz=Ijd)O-@!&u|ocH`bQQp6lx!E3zpXeaJG5z)D-EV)kbrB@Z zhex;COIoaI$nP5xt`4Orh4hmX+#}?(I1#$vhds&&-94U%!T4S9349PNQojh0lp*A9 zaS-B&GFn^NdNqFZdelUzHS26bn-N>Y{w(=Z4WWbAu*m*d0wbP_BY%dfAN2`){ubCA z(L?w;P7TGuY19yJO|SXAhr$=eF%=uUZMRB&!~KowG{Uv{sQ=EU`(fg)xK_R+p1}P# z%KLlrv;T^wn_^EJ6*edZsT<99m3d>$j`gdJS0=+opi6*c+Ig5p91UThdeElGqWo1^ z%N#QQJNq!f;t-`FDiLM=yk0hWNhF6^BnOhZ^ncqSpFJS>qCXa#=RHTlh$jl zpVd9_cav|XEvRLz8=z-CpVfU>4J)d#ELFo+u&o?~7>qqB3nVS0DR%6n5mofbZH*A+ z^c^+@yo^2+S!mIBDX^%ePc+Bep&{_7V~>G?trlG=9CXjRZCsbkN#)FV+f%`5%eua@ znNBtF-Zh`E=9#ju4M$2O3Uzr^eZeM(ApSY&*+{;k5JDykv9UF3$UxJ@G~-x_*;%!O zV#8^JjXmGqTMmEwwx+Nx+KvCruQA%h zb1({HK5Y+4X^ME!UWT{!);*omBJ!7{y;4+Xr0%wSJ&h|t52BPm>oCOb0kTId(=lFOZYSTz$U#_^(jzLLfck4$)VEpD5c0^pDjcymhi$yQ|7_ z`X!G9;MDR^nBuT=wZE%30(#e8OXoXiY3_zc1PX4X#MM%4tmD-5XP*trii@va(b4&}ZgbX#jPhvLElgAaw@4%^(9%csb`?=DK+2T>U-fhG=k2Ui?yCJinwINo?Mo%)zs^Z4mXnYTtFZ^9ZZC(z;wKmc@A4HY9{#Y#J^J#q_1NL3g zo~VSh-o2mn^AYHfC+F05!FFxf?VAPwY)GGQJYQ5V*xMGR zU)oq4TtGG(eQ{bM!LvP!Hrgp_bh$2WWl`4}b$gB>SfT}?4)1LXr-8(_?(E5NI?V6T z%0A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 z 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%0Ac|kqdsw;+99#rX}>*vr=mY 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

=uC`!7khXu4Lm@U<)hOTPKI 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

p~S5$&y?Y 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

~Zcn^TYM*(C95&Xcw*NLp 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%0D92y+hzO`@T zx>d{TD+h%$n@UzKYVp9pw_Kjy`rtD zuBs$AEzY2ptesU`TV1q;3lu2s9vq58ffjd)6u06Y+}+*XDehJ%?(PsAin|4uBEj|K zJLfN)T;(dy&d%C%t<3q3F`{0(9G;P(3j#->^Qy}Sj<%xqs5qu`7a8d5Y^~#s_=k6X zv$?aRuDQLFo?DO|I|KZ|0K*-9{7MDc-2?3DfilF=B*e$g!k>p4Sy}a5P~oO*QdwR> z&oVYHBOigR`a{BRq-whrx;hK8v-Q?neH6C>3^OFj@zSz?Wh84TsZCfZ;Nc$}nwb`V z9+nKLC^jyLr^`DXcIr&&4D-+7C;Sg1;{s<1~ z)*k_M)E|ROaP3G>hh6V`DP(bpb2c%drIrL_#X2-R{9Q^SB;4|+QzXv^pxgvIv<4ty zI6Jw5uLL`NLa8{ywTn>D=H4;rZ7A_7=B(6YGH9e}ZmzIfoi}u$wLz_wt&0iy_RENe zmukd!#x$ms%F-X~s!nZk#MsQ}xKEEBnO~qKN(?JuG#^uuja-0Ag$5lN8ChQiUe5x1 z8uKl=H{gT60XZ8+H-8%Vvn-mA|eN+)=jwMHDJKHavUu6+A`sW5Rr|s=D)d2A1=o zW)vGPZ(Y5z?CWTq@lX^VlX|7*|NEPjB9t;g>b0}P)CFTg7dI!j7^n@^jbasFZPOCh z`(JZE>MDK$>uOjRggc)E_3Rh1u0Bt@IoL55eOA`$?+JJN4WkP*s%%G(Y<)f&y6N}A zHR)t?mus-X?WWIG=DjGTIZ?^qG}zy7SH?1$2&~WfH8D}U|7gjaZ=l;(SED7g1fR z|E{h}(#HIx3C-5~#feBCCP%uWS3c(m)E9e|jmye$8mOLBrFi`9E|;^Uvs{xkL>l)DHdiaT6jdjPm_O0;FlKF+}_W-#CY&+}yP9B1DEI&=R9{K2NuFGq8B(tIG>CufmopU-R{(d-h2yXl8 zFr(|b00n@j1u)8<5)7t8=?y0N63d)I(A9LQnzQm-v2?w~iunNJUKgJ*} z?h&}a9MSr?bF*S}q2`3~Bj(_z4Y)cF6*=o7z3=Icv<#t<_J$;mg_4nT&N>k{0I$$bO?DBaUQf2GDfd+IJ=GAoHT+7yUzg%0_bh@1E zFX{X3?58Q_`Q6T=u;mK5p3I|6zn>TM$gR81?Zf5Bx9tSN`pj1EQ5%J6Om<=(Eb@e} zvpXL3)=|?bZn|GD*WpNgj>{A9GroTFjwci5a(o}f36E0*bRUlFBqL&w32AksPWK1J z^g9)rA3A0a{L5{<-xGYs*z(?e*pR}IU-v(IxO)ElkH_n!HxUTJ*!14L+)Es|mnReU z5^yGZtZkc0l=>V`&hKWjd$cnOmim{o?tinKC{9O*E-y#M!^iG*IYlSq;o|k&-MfMdkIUh4b8#}hrg?&hDYI@-mP7oiY7-%Cece zPV!c7cZ6kta&W~i2#Jd-u@msBhw%D`kv`d>lljwQdbHvW@Yp%*LRww+0yak`6Ynpx zxIgKj-+Cm-2m52k2{K-e=*?ZhkGpC6vXGzhK1i}`dl%2IsKsc;sgV2?adzx=~Wk zZn$0ypl@6poS*L>@9$4Cy^!4macL+bo19@5MMtS{JMpbqI8lBi$0myo|YBVn5hr&{Rsu$-XpaxxBfGF~IbmI1-MJqjN}e z90|93;~|_E=<9^oG=Nw;;J~PlG#OeCu8Wql^IVkeTxB-q>LF zyF1MU?}rPidpvIzXQRqqPo?3s=&F)5jCbuBBjHF%x(U!d7XJ6bL$0>0PA`(`9iqgv zv|dtS34$=7F-F_b*^4g@{uG(&(_!CdVL1+vKwWzGBiW{3puTrL$djUX8k8K5&M6Ff zSQhdl`x5SGr2?&!pAx?d{WKS;(cC$XR~X6}rzL!Tr13%M`gD5pYVeH4Iwb&^xOT3| zKA4zW+Ip6pVHb{rTtV&}4*Qo2Mf&nmmPng*`<%LK2znou8GXD)0N&4$u(S9_oVD|u zr!T*D260F`RP5m6FZM|=nHk^cE-CV8pP!z$F%0d*joZKa?=vh1y2DG04^ky+0H?$lIr6{xhK**I!=W(@9tQsR&tl3|5ec#FA`se zHOIMy7%<6RuNcAVpYQnEu2!8SD<&pZe7)^O2(pF~hxP3ec<>SO%0>K$XzGvDg+Ow1 zUPZ)O?L&rhKi%qbqI0^>hK%)2=F&Rd5EKOKBY4<^II-~^K`P*1>AeJ3&I?`S8;sCR z7R!eb1%;!VFH#(yn?X+?vm9oJoomaEAc*mUH7;Qx>d(G@n_?Y_bTXkOTe3L4wto*K zjGcsT%Tm<0e5tyhlNsi()d`;jDX%FC;?u%Ez!Sb1m)ith?6hzbXM6nP;o?s-nPBfu z?n7Q-$q)8Tq)Uye6AW;aTjQ^L(psDHols=H3Doxg6I!#G<4_D$Ts7k~YH#V&y7fV0 z+KBweyRcw09R{K<0uVg}C9%K%i;RW<07W&QTrGxtYX|hJ;}@+LWJ+XkD)eE-J8YBw z&;k!J-*d%N4aFx%^hV{u!0I*u_`i#|n}Vtoy61)=LTil3!&}5HZ87naQ~+<3 zV7!8z1(bK9^qYOjZhm&A>g96r+!Cs zcG_ZU9>3K|D&oIZ2Csl8jl4`hag0Di#UDC;8^m}&jDCiR=NkP*Q3S$xTa{VZ*=Y%k zgE;RM(9KeXQkBH#Jc+{t-Ce^ zA9Qt%lq$tP>;#VgjJbATF?`ZNU-!XjoUb2e8e^kT4k!(zL(?0V> zTuzOSd5VOCa2`8x1_T0OwBbEPXdfBJ>9sQ?1Yc~pZ1qPH%GJq{5FtV0g=^wO4EjHi z!^CkO6ojyYX1DW}eHQafWX0)&JHG%RBQ49Astq%b;Ny0^y||_R))3&0V3h3iA5XN0 z)f$%dLw)C;C7oz|2hjF&LlThs#>nVtq;(mswr1Wztynz_fI@EIkJTRj zH`V~IrdKHElPe_qScj)A0fgaIJG6<;H*z>^aYKvx-4P)I$jSxc7=SeA-R2r*EKkq* zib5%Xx=+5*U}A#5HNEY05f?-5hdc9vJ3K|TpU%9|=+!7;M(WaofvZL;j7$CKkH)sj zTtki?YCbQY(+$`GIHZgi$d`~?oT!o`GA>&WF6`m$>FMFIy&xc=X`?MV6y+XRZkTQoR&FLCqBXn5pe=Ix{c^7r$A@pqAwr;zne<9w-wv%c+F%Jm}v6h`Tk$ zDr<#~0=Fvl9W4O?az86(0M=AVDj0$2ms+Y$HovJX{Ngg`6`9jk$@YzWv+0tt{nxJ$ zh@`|H0t1DD?}naH34OPw?(eVeu4pm#_tv9`FMXd%hLv^2T^{(snDXUe2yhBk;ls}Zm$v{NONtFdFp_QBH`MuQ{)^eze?Xfn0swwxq0AcT&w5B5Oot29Mp2l6<31S) z+igN$gi%uU3w6f;^pB4yuP>p-k$eKIMI)N-un+CiV~vb1vQx)cAOI0b6X}{q3 z>*pLNj42g!Yiw@$#Vx(9O*J(B&=G(O?f;PYod`b`U;^HsSwj2sb$KbXOFd%B9YK1& zqN;X)wDOOrokWO2m6~Ng6^?3vEQfbm3ix96qn~~&{;VkUB-t{Y77oWdK zpi+1wwXZ)^bB;P5wck-?$^TqXR_Dg8vxlBS3HQI|sc9O~(mUKkdxxub+k;OA_gGc0 zrQ^m%eo;=>vSvmacGVI+91~e(p zB-wMJ9gK!OY-3-*xn?@A!sZ7SZs$t7OAPGD!9J&0N};0GQkbJDg{}+*^G!4F?}@~e zE~j{_G43K#-sbYQmTtx$S=UmSToaL$;y}NC0r#lp_>r?&c*FLYdheD)EB8a`sdAg& zL!^$Sr~e|X^pm*{=!!|5MrZdLIx5x5;e~P9OIl!Eul%%X3YqGhtOtc_<0_S}84#-m0k4^ z#u7?O?0)ty7hK(g07bzv$o&96vMvjcLhz$XEl+&hH6~S57O6w`R+G$VCYejx9YzGW z1{rhY6S>}ZD4{4%?czQM{>x{@exeHsD#uE)2Ij$%p1vvoiJX`kuM_g~G52-?UZZI5 z;u9r1;T&Om7eblalf* zCCSpLw0#!fV(A%sVA}rE%{*7Q?7lcb(v?n7Ij`2|6bU-DisIb8VYE!p1Td>o#|1t{ zmE6UbmFmYM=QpFYW%7nq2Y=vc)*N5kPk{LHYf&OO_!OHT@L*}${qyL`VNR7TadOpk zaZ>O+m$Z01O3)TJ-g530gDP56*Z}104M)+mOm{UT<$20 zb;Z2SBXGJaKmnT2&h3LyCR;>j@QdMFg;tHCX$s3;_Cw2Hgy2-C4Be7wxe;bAE>Y6x zSH2v%y+g-;Nn|;$IOB~^KV}kzwC$P4f5gm42gAa_4ut^o4eA;nfrSKUyC0GowiCph zct8m}@vCX!OkAYc`$n%4WyOm(_+j7&n$r$9UYUDqHRLwk@^6DBcxps}@~Wkq(sRmr z{cV5_mFV+KfTnQeGqF`vf=&S{7E&mTG146q{vw$_WX0UT=k4*(z~}0i&cN?!hM!byS_hy8@HeuVZ4BLB?KVa7f6?H~_-;R5MGu{%P|7RxL_A@9SV z8V0YBJU!P1sIQsd!oJ4a%i;TdR@OzX&(rO+Eu(>l8Y%YCY2V?l?c-u)@Q1THoTlS- zIwi*GCyO`gZlu*|h)xET^wIuy?3`I#azLmNN>ZP(mUQPE@10OHIBHywvn&S}EZ z$rQn7l$V#+&R;>xRTS2qwgIZpa1|zz<0nKH8lw{>P=65EH~&u_pX(LvGwW(JI~lMs z`Gto5Vl&pFdw04r1#7p}v*waeow9Sofug)S>Cf{XEI>g@pcmz!%HO8m1eSB_4^{sL<+E{9I< z>FT;1YVlw=IR0kU)xd9GzVPsbkR<{m_OH6QMO!Xa+kfDcDwjt9l{IZc*1uNriy!+Y z{fdKcY9U}dkPt-R8!MU|-i>K>u%Q+Z6!5i(Gm6JuTZByMH+afk4BwtER%*AwTJKjZ zST9zeuFiCo+e4ZIjZ7-<$=(Q#UK!3cMuKM=22r?S!~y02#I6(aTZpsV#kguQ9JVmI zzU$+@MiBOQ?p|01g6bUeL&X^>n{)Utn6*hB^zKoRSa|6K7@Vq_xy&HkoZa#dc-2pv9d5+R&H9 z$WJG~Dhu22-u@`t76e-MVN zysa-#RtE&tuw^}AjSi&s!0^Epx~fzVq3&uT8X#I`rU41~#!%n{R^FTka($ogUWnCR zI)-+hZ@z$vPesLM7obbn%gz}}#!r1?;$QvM(mZ1&q21kC)diQ4GFAPbG|nCM0?>wl ze!Y@f09_9b%xLAFDA~E5oM|)R{X$c8nby&qSJmdwIn(t0rT)jbY5m#e&cB+?#_E>NTB{h$z+&d zhQDnkqjV85@1^HI*i4||Yn`oU%Y{2Pms;9^IW%;eb{GVrqxno*Qe0|kvcE@=rcO+v z&9_*&)o5zC%~5N8)hfz@hAcvdCC7vCjOY9>?X%#b<4~!X8}+tB3)(q=XodF^2icYy zkC%MB1M_zP-RHj27dgQux1Zk5dQh#qvXP%3nTk+J5HuV*Y4&>TWHs#9-Orp2-!+7m zfqUA`YVH{#luq2)JM6Qc1{xM-^PL$Sxr{#vps^{p3%?F&Bz6bG5#vEcyb7xb{4i^a zqEj&oYS1|4;z7`N3BvvXw6KVg-$%=>A;t4CXD_?gnPH1~IV8_5_8ka(mb>FBsZ`%_ zDR8mk0v$I609kkYKlY9@;2D zQlcJM!U5=ZMe^V)0qEd({VLlE{?C6DO0JGo9;K%f+NeN7ZJnXO*a`Iabi23jMrc30 zsLGD`0^N0ImEwlTwlf#8x)iurAj3BUDi%qGyvtkj>FdY>Zjn8NenTq-g+Vcc=?+yg zpOGYykrJg%kxR63D&iv|6-OtSsw=JaR+=owx0&)A(lgsdtCGVbBz7@FS&6$@1<64? zo&e0sdBIPu#RhgKrz@>>Wi^Og*(O=R)PiB)h`~LBAO*vd8rOvqPohyrWdz^f>QcqD zJz-&Cp(Ip=#{cOkQO2wieyq&&z&De_!ISP|d9ie9@&0La+ut%`^JdcHu9_y9v!?uB zVuxV+{^r)JnVThtFZxk{8$C_GSP|i_rk3Tx%}mNqK}N1sk`)Vam)#r&CXh;5$st0m zdOn1>5UkpOJQg#_v}k+sI^-`>#_rlfsTS!T{sXtbuxA&VLH3GV3M#Eca-iEBuaOz{y}PqiTf+2}|44As@Oaq@}gA#K+gvkn@G{Xi{l}6B{RST+3Kx@?(w!)FV{h zJBuyUW8TOs_4B@gvH@94T&6wnfU~Ko>TiFb<4q_9wBeh;{l1EO%v-#WMGNYI(R-Z- z?n`L>ILi2)f)Fhc*!bP!B%3e;H&U)(_JkU&T93?hf;sX!LkD&X7A;Fk-j#=LI|$eQ zXbXq2j?71Xn#OHhfRx0%C&5wmkiW{|3xJD^zANMzp$g6{PF3Ko%#ZxMG{mh9QbiUV z4-YTT=LgCZtWl%HtMWG51$pRAZ$)UXez-u$QKyt}H^3uC+xPhQW_RH0$zVU}Uui$Q zRB30hIa}WeygeBg>E3()v5y{e!_3=_1-;|(DSIVDM2$|kj;_+YPI%=!L!-bpCX{$QHv@un-j?J{3m#ZZ?yS)w>`~scJRlZ zM<-*r@1jePsYplwpo~@u8eOrKH4Qf0@%$ZO4i!ws8w6+;&PxuK98g4e*8h2To$-{j zMMG2FnKY{SGRQt5oXcrogtaev*CAME_ESgIS5Hse`MCluA3j?Hd#_Y_+Ao2H7vYzz zkbX)I08gg0!^7(np{F5b^6vR5c|f5Vlp75cLc zTwxoZ^xe!pswB~xScCC;M2XSC3h@1g5*PUV#@5U-b*lIyrk5J+a)OP3M&o4>Fvuac z0%H53S^aIW^xzkQ}PlGmB4@bVci8bgCnFuaubdokIqRbeo=KK zr2Gsai`@_zc*^>1VXSO&l*-_lDtRSUb}Auq5iG zf{l9P9)6MF z5T@93YIra}Ce>7%X^4Hh4zjYgp2~i9c2EOq+i{s0z#v<+iOKmWrL`9-C^Mqi#IR`( zZl#>Pz>GYHoo=d8-cg($%szS3d;FCmWe#YZ3!vq)o{2HFWFHTiRDIQmk4U*9BC zI!%(}IuPwytI);PLL$on9$09!EY6x-1;&fMUAb?df{xbAue7!=D2d$uvEYuoCPr!v z4gcD&opiI``+m}7!UPMIT;>7koKw<1MqGDq&8Zn^rDSE~=4R;VF3fz&DtqEA?>B75uzqdBWBmnKTi!xTuUY;|0zw_F23WCL5>^}8T7;$A`|9Fb&RD8h z>3J}x0QsOc6F}7zM6G2XQ&UxWM>{VW6%`pteM@<;`pjO9hA|#xoc3J99^oAehqJ)= zgGiJKEJyAhesYqAatl@pL7o>gl;%lf3B!lma9&v4UHkrktnMZBSE!NvS^NbPtMzc3Ye84ZjHrXCI$HmCexDuxK|*_Y5X*Z z-Su6UekmnJj-f^e&7+puHY#TJ^y}(O#IoA+E3lpo!#||nN@R3bLx;pFsy+!^NJUiy zR;iDUb*=rE;Ld~>7j*;0x8wl>rELm=9CV<0I?-Fv#AG75+xTGgXAeoAkGq<<^yrD< zyD<_hGj$L3YJUo&wQ@2tB*r%K)5v~9PatJZzf-cz4hUO?r-%6px*<+-_c8fqwBg|4 z*vaXDDU&aZe7a?Gp%Q~7W~<|ML)v6C?Vc{4;-322J|-UNo0zEyaYEN<+G0})>WNS^meXg16195dmkI-hZ#c%{Cc91O*%&t12%sgIV9JKCvY1&fJjg12b_c3UXy z$a7sS$v|^XP%qacWEE_B;KB4CTlW#)K{zXmFp>uy6B#biT>6(-fMDy^==|(HR;y4D zYRfTv*QKGYys}p%nf=ca0vddVsVu<@w`x+QT~rey8~=d|V{lRbRm{Cd$9WwNXO>Pu zC~i5xrt-hoJ>;Kb(sOD_rdmi$f3)Z*r^TL^ZYBW1uThAH`|0bSazAkU$H+~wgj7uk zW@X`q@_r^=oL{c{a`yoQS5;!YDSfK8t|Eouc)bMg`Lmiy*9z^!8T(S`iMuCt)@iy%6kykq?j=-A<>iiSV` z5$-=nwPN$kgD9S`Z{k^;7hLDHCTmbR_Kq7Sw&DTJ&MXmB)MW6%E$`_ zgBv|ucGbozS#)vx{HI5AY@acx=@r^^6wU>aahg&EssIdedy$ne=xB$(A1UXaB{0*i4X5kJow1iJ1L!n<)p#{)mhHN(jxQKf7UK zUc9ETbr-&{&u456hI{e(ZCCQ3rH%M!(Njo;UFX!Gg9qUW&mZ0)CO(?e&}nabzxn~y zY1tf-bY=9~)z#?(>kyKxr91agR#3G;-d7ObCy+pYBKji>oia6~R>$ZBv&F)*B^Kg* zHoP2o#*(j^Avd5iiHgN;7&i@!msieJL1S=yly&yiQov?yx*i}W)&JIO3V-`ryKR>0 zsZ=9K!ImKS8Ib%m`a31tOiAU1Aq=RfXz%|5FQTtL*;K2_2PjRAe(e(Ym@8z`iZ+s% zQ3NH+ztoSxU&I@=vgkY}9-)DS*vXz7TSIdKTm3i0)0A{{;iudeWx7Iuo1S7JMn zv)O*ZPkcRq5z2+dV7uYFX0EaiI|sGN|4TTTgx^d5$hbPPcjl!8f8Y#{3VJY0piQ}6 zB})fh+2NCI?1A@xoSdoE_KBqtF+s|i*e6*Vwp-0bU%{T&cxL?h(K4d}leWAWfxK}d zcRYfpG)H(BOT|*|d;N%zkLw z$D98{gjwvEJS1l;!cL>IL7X+RKEpXKM~VQCqz~ROYnqNB4zHZCFU&({B6SI@M=jqL z6W1aL(lIH1nKkJpSR9Y)~0I~j)* zB-KDcuV`^JD8#S(ZKPq*Ol(o5>~pP7Ab}|J@HCrxHg}D`&0|}!J}h4{_}CJOJrNgF z>oXMI0DYiR!gYy}OmcU75J;>YB9XOZcO7|nrm+f#8TM8`Yr;ILBEWm4T%YUyw}rQ| z+U}-v9}>!`8thNV%&3o=LoDMS|M^sKQS-K}w-Rwd4k9&kIB1lP;=@_WJ4D&qlAM_K zjD82o*#!+aNQbW=^iwE908V{%LPzF+ z(O%_s0!C>7%}*;FQ9*R_eDgKUc06=VL@gwlRG$_jeQ%ph?hNEV1TU^uUQ`3@m8&*f z-V^hyk^3sr-sS!_HpT5x%BeN2y`eV|sEQ+u)wTiOj=hETjNUVIX+gcO6p8`7cQ+Vf zb=F=)N8XRRqR2bT13BX*)|^RBW3h0x==JWQ$3H!s^Tdh*ZwK0mJMh>!vj$eqH7a2p zU$&}oKY<2oq(@+EZ8M%q;6Yr68_+N8!Gcl$YE)mIdm~bI5Yfh$%*UH87AHR$UM;V9 zo|uqa%QV~2NA}J_Fj&`+#edG28qhw@c}M6tL5WW6#w-&vZgiUEKmBQr(UhZ&PtBQk zZ_9r%cq2;s1;)eSe0zDg4cU3&uZ|CEI{1NOdH5=?RBQ68?GbrSJ68^tfk?pFQSem_ zLPz>NJ7b=6G;^_~&+S9LG~4%xrNT4mE-fe2vjNx}rtFOo)DEar!Wa`Yy~lZ%4wkI3 zqy`nPe){vo)1gjKs?PY6&v$+x!T()}I@h)+FEO|!7o73@Mw;$k1i7dqtu;FW9-F-r z4qq|*g|->1!A0U3Xf5=99KT5dbm2XK)$Kej_pS{}VT=go z(bpFmd-m43_vOoTY3s^74S6i@0IM2#`N?up{V@eK!S#)^8 zU9PF!BpXKpRlC#?MB&TC*wzZs_z$cNh}|X@B;?Mi=D96tKe$fe13K6wyJ1s=OP3(V z|6p@QdKS$xuR$xdx1IM^W=<1oHc@!9c`)dg3+UL)$=@u`$db_wQgp;@lzf?N`Z=0P z%{BgT%f@7gBo0)I2z>np3Q6JCEybB|(#1x-h zOD#66;%rZ&zZtx;|Ky7#pcbQcHeC4=uTwvpe%pEWEW*aSBy3jLi7A0P==IXn)mA~l zq8`tCx9!YZT!i~iFNjxRaP20bDA{dQugh}u%C(jo9^~1&jpnTTvHmyB6p+Ua7!~8h z6a(y?2&ClVI4B|lV!>2RC(YLxF|YtYxm?@i}0~V!@O)*r-juw&R>oz zsMY%+(j>_>0q&)+q>hS>_Ol!jU>iJo=-5`wl8HDMT(-Qt4#$X<<;5%~%E!0TU25Jo zjmuMWTrR-GGpyqmEjl;G!sAvj-27ucETmEejI3ESFyI(@b%pddA!((&<|+1Ih3gmR zIP@CKvJr3McWyym+yBBq(N5`J-1MNs2fR{x#eyKz&z|l;Ydy=)PEdtIdlP>lA@_s$ z-LeL5;dgW=KM7S78{4O6{PLXV8|G(?4~M}45Ij_n`ZFG@+|W-=W;bTT0sT!z8R#n# zo>ni{uDZ`|h!-z7`ha{|qvgj1O7iakr@(V!jQ#!MgeUM(NF(z|)b;%QGv^C3L_4?h z6E?H|)!tUF*KXi5RL>&dcXreVhlsH*?sD{y7zxHnzJJ>U+X8l>Xn-~K7G83YS{`2~esLHclDxcLRwhp$+$;I&L06QNFLqC5%=jlX~uY?wb;5bfpt zfiiAxPmI#-M}H=p_S=3;*pQ4Tc1PnLPJ%VkpFdk*7vMzQ@0rnN+#U8UmTZ;tg#*1< z*oXyKr<92s8p>N}LACwnOlRzqbqjCo2kAi8?22Gl1z$$t9tzS%&I=;QNayhnS!nCz z5lHe(K23VaE?yS&lVe%`xV+roeqy}%UY5ECR$EGVvL=7{au<|ej03&yIiMFV^J<+U z^Z+>%#5zz%IOT}-+u_h9afK{vZ43w60ahA$yRCTHg`F|W+=6zLv=&-)QJeM%xgP8( zukGaCBSbPP_kc56`RP@>!qk+j`E;*L^@ci8LKQiq?41sHi`3v1a3CL(nWgHAeT0aHeQI6L56nfIu7EUIUfQHi0lRX8weY@ai zA{3(p4rVS=0fRWg?gfPW`WPIP~*x)q$HcYV07kswv-)l zuP^LM&DSDc%Z){&lbiYdZQQ%EB;JAVx4lNC(gXwtrGt`3t_A8h?%p-4K|s2>08i78 zHWxv`-(;u+b7TKogcqS*1q*ME?DYOG*I#>#Gl4KR^8Rj}L>z5s)6E6MtPfM`rPjXL z<~jzIo=<-}95)1g;e3_?tui9tR`gPmacw^>Sp9ehYHr$Q3Ysx;NpKt!U#{_~V4R+5 z{dX{FW^+HW{KJc|&y*k-SGSkWD5!b@eBys_DS!2NN< zw@%h$G0M)%Rv#zknh;u|k_%JyvY{_K-FyYfZ2nX~f$x3R`-E&JgBd=4f3qW76GkgX zPfE`;77_nx&g#-9VZIVtK)pIR7LtIBW62}ehJxaN>QmD@HGA#pE6Ag|6Y5llJeZJR zJ4t=<$BJnaiAWb_caY1)o8MvM3YS8IQ+7fpR#;+}Z|8JQ9>|rzqaDH&K-y<<&cq-c z%^6a$U^T(+Kx)!1Xy&yo`-^I9;K>`?^28P>g7Q$k77&9L=Wl>_2?K8u1~_X~>ahDJ;jl$?BP?P~O0gr*8uN15cfQ zzOvCu*8D7=hfc9^^96JJ*!9P8!kGKC$%-cLDvzP(4Vu#4CpN72WkzpZ4`iohf>K90 z`DI!nlvz=H%@O1o(xz`WHY7F9b{X)XURTVuYrL)7;+-w7^Mz2Iv7 z+kW^Dbifw&&&!0${E7cD`f>4Z7Vl^3rS(zmO>L&FHOF?vvOzsnTUp91UWL$`_>984 z;E<#{TBROX+`}BcG@zGy+&519g9Uf+aFnI|k@-3*|2g{?|4s%$UYYQ5Quu$m$?Mr^ zZ6Ax#1wMM4%f1>&SgMPKD3l~5w{>QygFIQMpo^e&?!?_arMo<3GD*Dt7dS-C@Q>Ol zFTx{;jbM6v*;rDt4vSCDUcYP6C|hXFOg)Z(=i+YT$wTFdaXYhLK*N3O@+FpA$X+6; zzqrPW>FSQEN`;l$dA5P;+Otg-ci%{lsY!5_8i0ZX>W%+bE^x}DFp0Ro zPzLgx`1MH`YhQEzL-f_bg5TVTKn+ne#T>8x439lDB7k+}n?P-e``pvNH#EU41j(A# z#|PECJ~zMYKXfNd5Y?gqHK%g5>LBNrI9`JtF*FNg6=toJ@LS2Cpw%yy!J=kQ8bsJC z0RUAJu|9wlbO6=u@EJ6r{_oRzd^PQVj#x}aNab@j06Z@v;Ws>JgC z!U8~#^&OKmH3jZI!)K9Ne)W2YLRw4U#7g5)THdKQp#Ih1E*c>UQr~x=JPi*0>@n@Cmrc39VZ#A&mCbb zYW}v}rE42eHT~s<(kIMQ`T}V>Mx&10m9OKxx1i|hEAF+Ek#7tRd6JQ^&Zy%ZUBEu} zpN4ePp|_j*UtV?j8ocI48zl!V+%j2s!fuy!=-(egoq0dYQa-FpBd(O4w~ME2>dCg@ zVM9+k5C>FfBVgUU{iEN|XleWG*~ef>d>ZUXaoqN!Jvq(Sx(pyInLq^MSJ9R{<`n%{ z^TiuN1o{v?U0r!6M@J)z+*t5~nqlQ@b`#)G2#NP>!Y8x@7|1`exNb3xR_I!pn>k2A zlTE9$6Y&Jp+|rafSxZFlkvEcwr2nFXOC<#`?>jK>R)$Wl(8y3fDIWy_nei2TU5XEP zZMX(mJu*g8A1kx}`gd^9Ok2hC8+L6e>YQre2C4Iz@5QJ6?FgGBHEH4No!67;z*E!V zMsyIEtI_oF7Fb!8uKqy=pvT=6Iv61vK$rl(IQ|Yoo!L`X*3YWS5Dq`C&5XLy&0%3U z;9&!YEn*mW9S@PrhK~Pgb8^6_KBmbMZg0d_3hyaDtU4fUt~u8AmNRFz02MC0UH`jZ zWVahS8_!#O#%rz$=20?0{koKz5K4+gM8~)!L90`Tjve)?9N5tjP`SU++)Kyb(@me0 zMJ-qnwGeySF4qQTYiziDCFx<W zNF{Ha!^8dq<(2GxWpwoU_m4%$3XAWng@bDj>KYOl9mCb|77Wy(Bwc1$GZsVt$K;!AQb1JsDWTo66#>*xO zm|}i>Fbuu`fa;b<8t5rH|X_lU}~H}JpdJ{0<# zJKaKU$0^#p-FgQ%!!Ky>nvEDmHgy}HmeCxOxOmeveqKdS(_owQdxfiWWih7mKHgS0 z%`K&y(AvJ7RSp!N{=vZBo}6;?@26X)%|af0FK@4H-df~k?M*2SU7st7bRg=#ezr)|I;>lB3B#GwOy&Z$#7ik(8utS&Ty3bGs ziMq>tTB06|v9MKs9Ufrr)=rF^jm=&-Q4WEm@_J-BR}WY;07Z`Yo2P3?;ey2nihvz= zXF-#iB8j;&fq%HKFgelF=p15)y*Yb2RK_6an2~UyLj9lXyN);r0{P>C2pK*uxFEa) zz06OoV%AHdBGf`=b)a#%ScrqpQPiraPE;SW%TE?NF~!yPN&V=0&DRY;iT7f4;RJie zzq6fVdAD?N2%d{CJlEa`r82!?j-Wk&jFfD-+11(K{-RV~@NnsK;b!;Sq)rP)%o!kz zxS&SnGLy_wJo?MQ^X|o-f4lf8)CNjNo8+46dpCQ0p)lXt9`iPMbEnZ<)VZ?PIh6v( z%VuYJxHBvCzf!S!uIbYmNSxvRCWI8NesMsUbELl(*9A3a&7;=f~%KaJJH5-tBpQLa0n-XZu#Ex!rfDLZRCE*Ew}oM#M9;d`{iTro&&3 zEi|2Pg!mn`6R+X4+e=^#!9Ds`NHO-$?dhzn7M+WM;?h{DjI+2$cW?3m;eo~r=@Jq{ zFx=~pTya=pX?9m1$l_+Kp0!4mg~8@3N00V@d{md)>u`6KPQEqsv?M)kV7LCBmq759 zexbNi#!x~EA~0Be$Dm`q^P@mDiETnvF1SwV?dlAW#ettV>WMe3Y<-8BSM&$E#!VLY z&SDFy4U&2{augl2VH-ikZ<=^PiuyFlgd$oc@4B0F z4R)?l)~dd?@;`s>`&3j^m)lxc>D9IWF{gGA0MD;JBE8Zoc&e&Dj~Y z&bfky|JB7?2A7byd;2q+8n&_n;_cpuajgGMaix((rB6POJ2tJikW{kV!@RU)`JRD2L{S3CWy#_#|;Q+sZ$!Sk#S zVVyw0j*I)A-=?BB=+h=gh4%ML)8OL$*thB$QeK&9 zvkW{oowBE=tRER28=F$o@9};1M{I1y?))FF-T}OlrtKDvZQHhO+qP}nwlkR|lZmZ~ zZ5tC~$F}|FdC&RZ@A=Mk?Q8Gu>Z)B;-F4T!s=8_|)6c{}viupxH+c(ujOtvuaWnFv zg(D3A)6ljb=`I48^a)x1nF#TFZyGO4oz`~TlS=4)ZtVl88dW*TXQ6u?K91*M z?H=Adi$sf9x~Oq_KC$QqfEc~qg7YabWam~&;349U%kaBHd_Lc-UNpN@A`j)tOerWT z{2rHlT`F{D;Z>5r4~rTm{7QjdhgHvamIKH5g=>bmaWmGRZnN&kg7<|z4c+xtJw)%i z2f8`MZcY*3n3OGE5YuG4eJ#<_0wP$J#j-L-n_!CzX>q_v*U-WO6j@!l|2>itFcz@<=^D?KnP zqL@GVE5K#pp@8+_oW^C*IL+IGl2E=&+xBi!-PG>=Lpf^%>3%Mx)XYH0K3g$jPw*vR zXhagxVUveFmQBSNI5E?3)D)xR*Xc!>r%odaaTUUX zcKKK`b$a@*DQct%_hNMTiv~Ht@Qn(T7%=b`@D~<1cS2_M41VCp^?BIfu`~ImCUpeP zU0<%$+@by?n`*%XTI|hC6#fMKxc3_v=OGs(VVkW+mKruBp`KH{8vBObDcQM^5l;=l ztAvxMQo)YaR&$@mo`&cUW=6=+JuR2|zkdWj!AUJLZRLNO^vVVc8MXJ94IQoPRM`8p zQ3-OUrhl_+5Ml=J?xCWjYHQndstxQoT$orG3MHb+426e?6J>$ZUmWsGDp{(3 zq~pM`S)&zc1oQzP(>RM$McuS-0Ov^Uy))-NZ4d~LHclbp&0(@96bTO(KkjjpL5*P< z|8AuI$;JncF5;4|?%7Kg)nCr@U=v0VPm$@3q03OQ)C4HuE_N}Zqb2aY16I(>>?i?W z*K!2%y9cDfM~h=M!W*k+L`>igcM&~NmcV0N&T?~!{?_5fWOW4y4#a7^`$d&@E^feWN$k;6g1X8( zjWrG73{742JaJ_J9cb@t^sQrF^Ym>{A^dr93;*Yty6AvPRQ-8j0!c$_GQZ=fw&KC--2w64*1qm4u zJa|*Kr)M*m5xKi!fG)0kD4jV9f+y$zO(5|76htS8yi_2V_DM6&Og?qJ4DS$= zz)}VA;j~%3)(JOK_KA<6JKoo2?s9_P-Az}A2WZSu=`e&ZFOF?aF+_SJlI35pM9vcD zoId1HH;iwYMqTzGQ@S?FXPm;LTDZo=XLOBdzmpjn$7$ZJdClc#?h?n3fMPx3)Um(g z8l9p~dh6d(c!4dY<;4My*FAUv_q5N0%j83!TqV~OR7-0=cAibLGK$m&M86(Z zt-hY=Gb1c;!%WeT5giNUml2sKx^GLj?aOQb%u8|%=!HrKqJiK>=t8TyU=KITbWO`ibZLn~%b1Xtmx6T_cQO7)Q*coE^qD>!S z+RDS-$=Sx?4Azeh%M}aS*|=r>HB&J4lV(o8OEB5-tcp+`e(Llqk)qC|UGyO@k9ayv z>#C?}D{gDbA6FK?WixD|w#M__g;BgOr}hWX8on)U`+qZ6`Av(5;>2I6}| zeDZ+=5`NyO3O;{6eSYE^3Yz^Dl9D29jt(;IU%s97{PjL9_;q|@nfQLb!u;%h{yY;H z@c!&7nfS3jca-pPPAQpy7jP=6DDaY%zT#6;GIJQ6Ms9wYK^fq(Z2f#g4s#|~ z&~>Ljob_nBUyxDH?`(G!)^a9?|L!bPA(t!Qew8rbC_C`&MG{e<&U0q|7eCPMg)XKA zWRtJ~*bt*NC}ugm9SSpB!{ z)kbT;!8fDRa;-tT-_2B|pgYcAtZ)pEp7%4&ZLYw}DcafHYFSMOy$*=Pfx=}6y*7`J zTwKjs{kF%)1KCVZ_Evl>6$#h$-z|eo1b$Stw%(_Q@lRX6PhC%r{!Vv?Q%{ZoKyI)B z+nw%bht-Ge~7X0YPFt%j@bmImv#z zrtLO5$!liSR>v!RJY99IuGWa@lu|5JNsn|FI(k0{HaF&u|D?Dvtx*i@{OC4UGH-6j z;dzxPNn)Iu7WK7m_EPDsqNW*@hczasJnoq9YdNb*kEhrFFkR4XzS3E9{rY&jEDcZ% zyeRx63LFT0yWH-u#MH)mXygdyrGQOK7Yx}rf#4(B3Wb!O(m!q%>Q`*uRNY0I3LD$;BvAJyT=emFvm6QuFnm4(`aB2v z_<}?@Fa1hqW7~qCtrf5vI5$jXP2Mn<jeME)BrrNegjpDPyt8B={hI8;g>@c$1Ob>gS^JF=s{m~b{ws)St@3C4t7PdB z<`|MUKj=dJh0brrvk_b1<% z?1RJF=n6sktKHFykqGvtCuAZCGo9t0O@huVY%j2}a&y4DKdqzIox1Vx&+RK~>uh4j zA{3(5o4PpYlWgdx+m|jskxBM;AFsjAk1Ul>n|(CPYg&`Kv5gOiiMA1<`>5g)Z20WB znE89y%d*AIc;~nO>ZwLh5*oY6D#*x4kF>5CmHwPEYQUdEp?~;CzZE3t$ilLOVq_!& z@{QBo^P50lo%;dw{zG?gopGNl1{*7MzRdRqF-h(?5{C`X5wDk z-qbO)<~&iqHL`*ZH*d#kyg<*DKrGt^$PpTeKN3|?2cYV=o)ZO3f?%iJVBTFbLB_cUI zTZEqzENl6AU=GC{wkCI?(R^&h^<|Grf|KjVPJk@>*!Z~xV1&(O{fno54~7~epTf`87?=&Ky54PEJ+{PJL^_60NtxR3@aoNJ+~LUTNqxYM0_>$IHom>nMv$qB%}( z=KTDJSPmB-8|VD$?BdeS(YmU#oT}mHgH4;5R&ThwxeLhQebqx-)PDEheP3k=T!=qK zRqgd%o3uST1bDeW5bT&aS^1fHq;S$s z&D4}rtsLS?drb31DTII&x#L`>80ntsfx`IZ;}H?>n>m-#22g~QYm#R2ZL6CXBZqKGtkafrbXN)wQ)$cD2=1 zOjgkkXGWuuzTEy*^6TIP-VTx*1ioh`Nq)*-eN-NCv}{~1ll1+S6WQQy>1is%I| zNkrnVTiDU>peFsCLx-`2j4xp`euGL!1;=q*3hxHI8TUNLbdzK+--OO#7Hcdn;wNH4 zvsM)nwY=0+9_VC6<|C3HDYOduk^RO5TvJ%x)RtdUGJa5(6|a*nr=pdVnH@d-BWze; z>j&V+=ONL8_IM?(PKVDMWTfQqJ9J!OPir9EQhU7Lbdre8RnWEvQfM9P^&NIX6qkQ3su5d6Vb9;ph^;@je2qk!azal7W2 zl7wlGmcqr$I_)^0s2Uh9?N$k`VP+Gu&|JopzB8`MGp6E-!i78@p0!?THBm&Jw$>m& zi5PucwaP8UfcM;y9PYUaaVh4wX7~^?~{~hq67f&xxI*eMO~* zj%-;d573@h=Q!A4Y6aXk>8yJ^k-nzlq8K#%xPzmuy|sf~S#3Cbd&8uG4a@POOL=Qu zPAwhCy z$d4fNTciv|49G0CsguMEw64TP6Wd5u8SIP%ui%(wBf065OI7%aD<}tAi@(uSQgrA%kUg0y^wn=fsAU8r}AOXpBla3rj+ImMV;pwN)Zqgo# z>Vj*lU%ebOqeVT>EZ0CPs1wj|WePg$D06P>e+}vv;Mapsl;D8r+?g^%{ zIpTBYD3lXZ=}Bj~G@Q&dnY4;otjS`J^AeUMC5|ZUZ}y@rusDpwlcNJzF_f&7pm`Z6 zC9BzreH3M2PTWG%N!EwO?=_3P*=F^3;3nmAy zrb~`ttJJKViHSIBqMQ<@(Sq3VK5oe>^+A#$ra{hhz$~<&*?pBZLZRg3CC5=t95~eG zw(K_PD#W2f2u7_zBgTca3c#trXuc$SzwJE|6I#KEI%Eo2vE(Tl1cf;vx-w7*Hh2lb zXU2D~!AKU%r?Covby9JTUi`4UVYrq5f)_$MYV*=mZ)u^dz;9*>*D8;bkq9yKQu5OB zW~OQe4O9SCm3q@v$Ogqt3GsNThO_A0Lcxz`$ixhqBrEkY zj(+b0I|V1uRV2gMyBW%-pbx=h^C0nM9{mkNR;-fH<{sjw;GiLa1KW_o`e)_0s&X=$ z8K~bnNiq<|52jmaTCbniLI$Bv7Q24oA;N+z=Mwm0M0m;YXxZ7hS;^nbTUqdh^hg+E zXf*K>l?x}mo#@w6#LE6DPYrzV$mbLc%vs=47Or=jQ5u$ zyl@S>u~*yd7!aQ!EJoWn#cZB~q$ zdv#SCklJfnLPkkGIAXs65WayaZc*B?r6!_8B^Gis8iOS|25S^4=c5LuW`+h5h0ev? z=zZhsro;a!skxbuGbGwKTU=~zc7${QHhyqH$BBCc?R7FJR>!=n+cyXk-pCIF4iNE+ z8>fZ;_+)|sLSa(Sz~Q?8ohJN@U9B=pRXhuI^qBE7?E3;yO5(H9e@l+1TcH9b1fG;5 z#e6qrp%)D0n>fn^f^2+VpXu(#nKqi0rTv)}?P~B7(XfhGY;#FgIG|#h|nztUFL*tkn#geVm_I zH0bH6_%U^?EGFLyC^uyEF!-Ra`+PamFJx4`<-xbU0fcNPHY8E4@M@|*Y(t;}WPUi_ zJHsLuJsreaB-*LIM_tRy$wiGWWv)udj0zd#LlsL9dHHDRCQAF58^zVq4D=R0dL^X3dtRTfYPq@SvFm-H;dDJ3}(MlzWWI^gcw&l2gKv2x2 zX2u%>divqM`SXM%=?HHx;I?qBNPn8qkYr89-GgN(BWPe<<>G31`}U!jA1f~H$l8-} z;K*H@-tHb_YCz3}FbAj40Qs?PCyhmMsU@#6U|!vrV-WtLx;$G}71F|AeZ0I|20y6o zXDxxzt}00C#4vOpkg3K>)?7v#kJ{fl6+;doK{QyRhfPKjTYJyTHf2vroyt*TBv;TL?eiN#Mz`{I@^xf=0Aq8LM+eK zUKB2l&cEI2b7MPi@<7;S(tJkQ1T{6dYYC~m3(};MYoCUA2^lMa?$aYn4#31Jj zSm~oey)9mw{dTH7H#Wbf1AZZ77=|2c9rv4LS>W+7rC`sav`4~B?{QNh^W zoQP4{p7Wm*HE*Zy6D>s(8*@{)e*)yp9W33fh*+4}z7whZ6Cz=4=VtEm{cC6JW-exK z>S$*EPq3=HiQ9h?OWPY;{wGA!+Uz?eCo{`Gm!-_DEv?*$*jfLRjfl0ItCG2ksH44; zql3AF8xhw(aYP;M99>kMj7`mnbQz^ZMMaEV&CQ6||H)YYKUv5dyV`yih50{45fFg+ zzZLV!InM?6LYI8H_I%nZg2wT3a@@%WL5uMh3Ih_?A>#t`^z@``g@A=7b^xoM&<%&7 zza(auRq;OfYIfAsImBJf%1!rmO-14;^8IyZXJKjiv^Ck~Ipa9P%?cVso}pzDO`a$Z zCQIiXV)FR3DKvSBB1>04_|I2Sk_m?xR@AEgca;Cc%Rp0^jDP}V?)d*>45o<0tRfi` zS$O{67>Sx>!bs&J_0H@lTjVq`A!G$O(wente>*so>s-y#WeW6Bc9tws&!y}=I6cca zQh5s-WB>aHd<4kibCof^={yCR@?{|!w#RDQB_+!K^dkp4dgk;alD5{h+T|E3wK^4r zbtThx4(eyp>SwZlaiyAYR&50=Z8ye2Gb-7WXqJ)l>@N-Wv~@3rA1%7g^ZZx4wqzaR z4Q|TrI`Nl!Gu#c`d~3pe2Q>Krm$LYLhPMoNCcKI+JRAOPg-3Vxe04tEv(pXbidjdx zzHAQd(LQVPBg+^TWv2F+B+g%0TbZAdN-dOtaj%`J_&iYp0SQ@de&uMA?dz#Uw&We z^~odl$Rp;s0(RK?*z}K-5fCNc7MkN!y2S>81=%P7slfDySfBNPszU3Egt{)$B5drjN-S5={k}I)m(dHY*A1w)1rI$NeNDu zW(3-L(IJLY2f~pN0p9jtNYQ6eCqKhIUl;$Fe|90dv<6w-JRlm3dmgH>3Q=1>@QSRv zVFbUCuyQV7lIp*x@ua-IDS72Y*s$RLPLLSwOY4TMja?W;K16OI8W#Lx^SedfdKEd} zjf-k#<`GcS`>xv$yEpV%IG{q+`uxRKd)2H}1XNkA(Y6l0^|e_Vem zs-^|JUZ}dE836Sc^jG&OAwi|!?f23;N*mE}FHiWTzl7d3pFb`#wC|!R7u5;9t6qxW zDqaR%FG_#e3Q~7GF0h;lGRD#^yqef%PzZ#}$!?o*l3-|A%UTuO+ zjpmjw>XO>3YvJi7uKJ@vErwsA&-Ii|U0=8E-%v;OZO_W3?rip_t+MVbi|UUS8~jey zr`~Uddk72>6`ZglzK$!6DN)bU$YKtJuJva??rY=~2VB=W(h^?#0>Ek9HBtqq*Qa$e zu+rmr^Jrkf0H$l5itgcMc2Q!-TE73113}*2kL&{63*XO#bmdTLEmm^gFidh_;b%l? zj~iQ|wwO;t;mK70LUzBsnZ#Y;iM(@`RYO@72J>od@9S|@hI5-eNyAS`3ywsoK{@iVre&1FC>7bv%D6#GrG zt;+}(hhq=WPwPYZ78g?6T0AfKc zh0i`rduM+Z2Z$M&06_f2@%^6QIAy=S7n%WvM!#lQ`t|rZOxdTT79y@2-;1iG*YRWz zkN5!_VW1XPU4Mg1Jd4FPflR{>cw`6@k4!BSY2~5K&8~||_l~$HC@luKO$xD+mbcTH zle{mEn+-=*!4G>px*Tzym-DOCxyP2Vqt72cmrvA30eP=OR|`GwriYn5Gw-`k*p`9W zZkH|8bwQ_JKLQ?Gs0}{_&S=X5CqGXUxsSfIoIVr74ZoPbvLj=o4ZK?6&Rohc2^qc~ zcjg@l8H5i6HT8 z@P=|&5XPb&klBFKCx#CLa6~Q$Vc8`?h&b;+sc8_I7kF{<;p2se!#S~miWQC7_eZD5 zc%W$#7(ZwoyuuYZajKLeOLQP3oJLEShe%bG^>R+IwRWq_G-v5e$mLr6{^HDeH*6FY zkzOv&7vKwK}kuX;wZ z1A={Xo+ADuFFa)gjMFzjU3SZ~gro<3wIX>LqEvNlfIpm2LPR=&bB9w=D<@v^C`AJ` zr0a!jPYkZl6vh#{uJk7xqF+^*tA)RR`5N4hL{+1(+_UEV?|>F|&j3?t1>0UryQ}CG zh8FurxnR+W$AHhCVv&5Z9rPWk4vap919!;0G0;kkb!> zGVv7GnH%cLf#ji;nR=kq9g0lXG05J@7oNXoK+-)58;QeX57&aJJMc2x2htc~tt-^A zXd~W}unYI9@WBPtr{L5e-f_a0IRI~Qb3LD+Q}hfPu8bBDg^PGp7-pXbPUP}8ZE9f= zlE|77Im7``IUPrX`Wl=1Vb*Rd3s_sB4@)1{(J^{%uOe_-LHMozLJ(L>$4r?)aXH|+ zSa3;^&+e*2&uUhL<&8r5=a5|#6H-IRHvo&FIiQUV7$EPNi=vHiz})&Y9>uS_gK*)p z8&MNN3kD_&!*%h-q}vv8h`(57mf8^M@O7AzsY0S}-W1t-GrA>`xGYWsjuKzm)Exgm9qzw0rw$=`y0p>PV?LBhRNA4S*v+~DG#1a%hwrbCKR z{x3i*Dhp{f30riAd(^Z;-Fh>2qk$Uki{1P|*lfzN68`~bCX1#alCyOsCYe9^~+OKUEDdv5x{Gw9M;+}MY{CYU29VQ1e z2RcZcL2_5k%*ypxO%227{!sh7e8>E?2I;iN&RLxKe*i6-I+5mcLhonH!R{=6zoekN zyeMavKig$pq&PzvOCyv8arAl_zsefdO0c5V4&?j!4A)K)kE#em9T#}C30G@YBp210 z=hvYOTyZK^*lA!N#*5Pirh`Cw2ax|Xmu3N|I+^dK>uDShHv zDTVxU(#V@=GG21M)U;bI5>ijIt5xAk+rTK={TcM-zQYq_bPx@#&zN2G2IBtzgW0Jo z((X|FBW3X=V}U1zj61>oUj2J)aci0iPyWhy=Z zpJ0Ab8###1>>3~grplCuD(<7!Mk2Nz+@gVK*@sNiyOFNQF@-kE!c>{;r}NpKgD41W zeDc!254g#4y0N)iIOHvU6_$rTs2!&biixPGZ3m(xx*m@MT1oaXRycT@Q4V2f9UHLz z-Kvvl{UUa_p!Q>O`;WeUWg;ZZmR2XBamNdf1sahF?F5_A6R35d?F+G9nf;!#lq`qE z;NZg`=U|TWe!z$K8oTn=%Qh9-12^_;>jhTDJntxxV7||xB#s*<6*-yBc6v1oQ$7lf z6;oCsH-NpZxffFRnm01^dNn0B9{_`sPq?Wer?dg1Yj{T=qWv$FR8gbWRlbK7(?hP) z!>gBk-u=QbA7!>8fHw1DYW$=YpHQ#6ccyN-m3bw3@|q?X5N%U#%(r%t3uaS2z~Yk1 zQ0m94d4b7kGB<N0Q>&i8nEYHvN=l$5D3CL^wbLXF}LihkR>IBi zl(hyd8~)0u`x#?`_OGWns>iGWr$rJ6gE8~fP68_S!+}ILb)K43N_+2md98dA1oBB* zZYPRXBF6{1|B9wO@zp{GD%4XxNlxmKLjO(~ZLSMRftCChmL^s0M0?uX=*rRUip2`i zIJ_%@amNXucbxOoG%$P!eTeE`)i?f(5s(d=>zn8N(#`tx+=&5Mx$MtXNQJ;wz$zlg zQUT-S>jN~kQb}kf+qbYHw9zU)x~GXiO-Oj54C`xp75t<@gd-MJ5OLqi-u)R8sxOF& zw|YG-3%vAwo9X_Q54EcDJwePndRHct=~IWkPb-B!cC2QKI_r|q73A#7nbLHtZB@en zH}Ps{+oy`&v7xtMr!5F)XvFiiKF=(X{Np>Jaw%t>EOp#Y8m&myCS$-l&Tx;6jkAfI zwCb=j+mtA8=g=7ELi$bfiw#HA#$zIeKV6_W^Z$%8(bSPN;ga7+hy#cA4r4?*VqdIb z_WgjmgNM&6rr5kE`DCVEk$JKj@IZ)kKlM1UNpZoY;jOriCN*#2wIYZ!fqEIH@z5lx z#If3M#-j7jsT}`kXUQ+f8+qW#05V3obs z=^0P$>F4~+p7wo!9u zyurYn729Mc?y7Tlq_DgRGe^E79wJ153?QhZJVn&_Jegkp!Kyayn_nFA;mO{CzM6^S z2q@P{+VuF~jSusF`8Ei&L&?R?xqNZA`5DS+URVuBN099n8Z_ck*7iA3{JTN^+a8UbleS{Rpd=!KcYD(z zFRtG&XEHM6!kYzNp?`z>p%*NADsv%5oFQb4yuh0+_+N|4x<&KAXol$>ulSZLZSThH z{@d7obB!8}1@i62NE4eo2GL^^NgOS*Z`x^(FIEW!J=zzAQtk2wb+jt^%_Tuyq8GBi zf)z3)>L=DE%G=28DSPzCxWspPKe#P`%|!s))yiu?pb=0Qwg4TQshY#wI?jRf zsst4h?uFVRR*MjCgLz*>wyq-KSht}(08{{5E$)~AegZt4x+`0Zzh9iUn;{LqHD3nf z#oib9e$X?kcPOZa&RHm0?Z1jTgz7RxG>Be1gJ~h|T^zIt-gef0J9*Y=V1AHgJ&SKL z9LvcQ1DbxV@UTLfm%_w$CFjm;+iPguhieGSzbg@EYqhOYve9Gx) zr9$cs&u0JpWP!)d#KRo(2gdQ96dTjId8OAkNrG4PuE&WmW}aAqUqq$?VmW>~{fm*L zO_Ba*;7rb~1F9w-=1Ze9z{f;V{~i|GMSSCJTk)i2_`CW3+vAUVXQK`h+=YwZxU&jt z1*3qL`Fpxl#sR7j%aaLPxMd|T?{;#iEhmwN)Nf}tmE*A8Bo?CeJ?2EXYu!`~#oQ10 zF&AWQw?y*|$-i9x{zAg|8NGWEFsEiL{w}@?O0qvuk|ftYU`*FpNE%ow)~=lGW?v!+ zEW(sTEASqmv;9}(Ba^;{N`e`e1a9!0p?)x>0A?pf0To%ZitjHIEA+vZ3|I!YGJbZsT~pZR-v6&#j#P8ZhwVI6p$hLRl=GQj+0IQ14nyxk5ycom zTR5SjOQ^c>1^%R?*fBoFVS_SCd0srt5k1>9cN9j|_UANH;AhErYIKQrrwk43eoXDB z<3Em={$CDqr_E#vH{O+Ny|nu+oyvVPsD0(uS=-D5Kb+(@@pSJ4cGN1IVVO`Zf#~{3 zFRTe zMfB$Ef7M-HV7dwythPLX&~kXhG#$j#Swfn!nrX%bLk~mXG!4$|O`4*bt_Xk*T84-< zg~!iPSwOo@$tCqR#i)d0R2!5!z#JEO;(yjJ~AcffA~ z(P}T5DX;G8ffUbEK}u5!leLL1*T1T%2KIstV?Gx%=J~F2sG?lW;*s-%#T8kzgWo@yetH~nRb6@eG zXp9u1Ocg*)#<_XPDdA=tgQ;MkowHnsgMXO%<$86etjIUz9(baz*w*WRT1EKvf$j1u zamJR$kFoDrneGB5&q;kCn6jj)u5`#7l?@o=9>u`DY{!*ak|UAqe%gBYgh)Ww7{wp0 z#C?sXRUyJpCVhp>A$w9uEJ!@fVNsN&DfEtlKra*8<71v{Uzs;tAs6fX%Y})w7JN6) z)&6NkodaruPrsaN1{!y8D+ctv=T+7S0Y=mX)PXp=b~r?4KiNmXOt!L3;NHU{kEnf# zccf?uDDJ7y-eSkit1D}xJ=|jQ4#TMXJ)`}##i+Yg=@5?<(!{aUM}fkYG2a)k`S=fH z(J^5{ag(y%6;Wqrv+=8>F1D{ZGNsG}7)`fX6`2$vz?UzoUA9-9od36{RsB~nceM#z zhtLMmI|Loy__=c7Q5u9*5TvFdMvQ=MNouuYD9oIP#dD8(FYj*rsDcA`H5$OYapDi) z2%%xDa)6-yKtiW)+ZDj4ADs1%Zfxp%Xf=hTo)mW58g^emOoQMOn7tI0DISE&8B=Ct z7i@=T&9JKT!VH$U^~;VI`|_~r*A>Vx3l86AQzQW4VaXZz26#mX`Mh31(8hbmda z(kXEb16ps+zG?&#-KIFd^dVcyt|!(U1GMihYHb zKi6Df&s#w~N`tzv0ag@I;~>o3M8LKt3|tRXwvIg( zG(^8DhH)a@E;n)wl+t>33*3*MYMeKT73D{1=d9v6398-G3Ff;g8g}dA6PW-hfo5LO zYzdM=$M#)lW4is6D}}%&x1VKu02l;Sm7Tz!Adiz=I`w_D7TcsUP5<(j;s%~}AuI0f zTt?MQ3}RTWN?5ogae{Plh^Q2J$P^K`e1nO;fMWU4N6!ZZEbBw;WK^3dkO6rGGU@qk_{%5gmw`pAyD1v<$JrqXSs(9AMPaiBL z%X${bs9;30ZCT=)sIry1_|>N!bDg+G zfLA#C)za#%_8z`rCzeaGy^2lGQ%|1XWhOW0=SH|CSWG*j!WN|Cey}PQM@oGc12kQ7 z+4|J-eaA|WBSbU_^w+Yq7X0)$$jBc&Jep*jyz>2ezKlw1+SM|H7`B@ZLX5%A>@w1WZyyL4rgP| zdF8%ctFpI2=C`4G$m9fGvIJP<5rY13(J~7-;bea(H3^aH6?(XJaX>S85_-{vK)&_o zDJHeqXFND8&^=)ib4s;T`7B~sZ^x7ui>!^xRM>eRm4I{pJ+PdVNeEo~3Y&qei{V}hngnA89 zRsi0Pec$K{^)d!A94jXXUVlDlCHa3{e?9bSamF@ zaLy)t&L@4&BJSs2vEu%7#UH~Z=w62if)4qu8tttX8L|o;5^~H8L>bHlDhz3m7;+y( zEFsx9YzK=Y;u0<50$G9(tweksGq@~)TK%A-Ng z1qUq_#bQ>HHmdq)(xKp0DI|f@$p23Xb3~ZfC7K%G=U9A$vd@LHACz+ft$r|W$GqG^ z{ZCFk5qt^>QT^R4$e?ECQFir2IFr?UXEz{ZTU1$V;V~$d{s=DyhC(vmvNnThyz$SudJwkHRhf#%D<|3lF zrjQv6Nv435VG^ok2hw(82nn9MInvUC_ z`Ds_ik?o6@p+Jn%pbu`M9RZmcuGG+}$}! zypcl#j;SK@D=npL$HxL6H03T)cC1mXR6=^Pl$Ok57aua0Om``Ss^SF#1vfw!b(xJH z%djMVrE@3U_DyGwDe+RD`$`&q#Gc`9Rv~FBZoTZ0j;4ja>0Um|en!QZY+GEyie6Id z<;Cz+I~0Z{THe3<$8e|c8KzZyVWALoubL!Sgx&#Nf2mdS$m0_*SspMI1ndelfO5}V z!IxM4nOgmkU;Q=>TAHwN=H_l$7ZiumwRtI0t3K8rb*w-5-mDfQnYv%Xp`&NDpL?a& z%U>JG@Fvc!`)&ygdIc@nV4!UFRvMvp>e~0g0ANXc=@kjWiL^rW5pVNg=uX&d@`X%= zeS>guey9wx`ZLwgU!!^$lQyVVVBXL&Ec^US7ETfx`_&a=#90PMTo=r@6!1QY-LB!5 zqr8*5fN^mzr5?qLqkeahIqD(zc+36X;IIG_q`ifk04%dOJ*Sl9pk!{T{p3(@ z+&cJh2)18XCNc5T9u?o`1!M(KmyHQA&_#+Cg6Hm z<^DieANTy;*Kw*#E(?y78+vn&3r6MsS={@#p6*3mL5X6ASJ)f(02Zv zYaW?(>l&A6_79wq(nOa+lhu8Cx^mKl!^~lGs=F4V_Mq(@c|tb(In}z>g6F}1P2vAK z7;63?&*07Phi>BGRx|p`%NbGLMM8GY0vD-c#RRSb*%!Bb6a_3hB#b+>!;54JAX6E{ z3T+`8hT0&POMF~;v`#I$54!8A>MxX4Fr^%pwpmJ#blCFk6$P)B+s}cXjJTbKT)k91 z%NrC0aknBfw+1H4LX=J_+^{9Lq=w4>h6+KTHA%H&Eu{&V8d4SvXz~a&-pVz_Fj-R5 zG$(kFH-%y~fhm7l%@*m_&|gj$_!>39$@GxI28Gq8VFaiKsuf2pGE$d0!u9IE$Dxe> zPbXLwRp1w!^2JmGnCnN@sVQiGdWCe?Z-tjIsH7koR_-cH3A=&rT8~p~D(z`#-{pK=e&Ghvvc~4>x zWLHfL-mL|gU{}erG@S5U0XIBMUKs<7jWn5fa06q>JQ>S%`#9Lq4 za3CE{%)BKsLZ;Dh5DaW+XjpLeEKq7zy?JPl!^8AP{kN?H1Ml%(b37Q4IgfXOjcLn# z_SV}SMDsFd!%91KL-{9(#KLIHjEXvgaE(C2=N;ptDVUP@xG5WjN+Lg?uRLNc8%Vz! zE#@m=q!;q}`ALET>50TrxQES!#K*k6L~EwV!VG6H@&Gm+`esVjHu$W|y}0%qnKTW3yEE(Oq8; zM8NG?o%NgpC?}M^CX~LVRF}o#v`K1=s#G#xz?Qvj<_h}{K{F1UD{9!7M+S|-rnX|&TK`283F<66@t zVj#d`+eGHS^F_Cu=pET=O~14X>t~IBFZy;fk&OEPT{r0HwnK6qd8^Jd;C)&jtVCSi z@Ip(2c|0l*=SjH=PTdY|aSYWrMO=BSL3yPU)`r0!fyt%xK`_u+4$PUdY!wX*CnXFg zmc3rk<0?SV>Tn=+^x z^81C;|GcXBqzLJ+G+-~X)P=ryl?KgNx4@N6TBqNBX8>$C?m6y3WEFjx8z&g6K?E2HN8_%q)2p&-xPY!hF@wV!&QNz>aPtPD0XnWy}hN zM_{m-A6+L2n$`i6>d6ge56gG9X|uyotO9PC{UQsqIt=nC9}VddR^xU_kys(@#e$g4 zI+*CkO`qB_2*0>^LB;$Kw>lBGCO3ueDNCX#YQ^zJa;Y?Rz@5ZQHh;Ofa!++qP|6lZhv`ZQHgv$$Q?a-@W%= zbw0qUy`NgES9h=8MO4yuBC%mg(JLVx4nL}BX@`mqvMZ^4r5}U3V{j+llIQOl0QB%{30&m zDu%UN(LSi%RqPoG-~Y89n7C!B9Ny(Go!f&rp{(Rum*&|fScwcc<{tcxfX>R5-6EutRh8s4|ZHO zwPFQ@{`n^#P=g0MfNjG8=4H7gCoC$^I#1KFVSF!oYUXqH>0-xh z8@!`I*oHvM?K4)V^N|vtF;nWM_cKRIdb3)?jf=GA)%NdgZU!wzWG=MK44fbx+T(_A3$XYsbOaNHAx_I z<^`L$+dWzQ!Euj)?B{OhvK_@|-bPDEYOo|u3j1Av;dy>va%EMBwX`z9&@jX&9rjzy z5fVNTifZjQi45=3#w4cW5Klym(#FIrI*HFoCe~F`)F+cWTj^kU^%4=lfnkw}p@d)= z?|Km%G|dW1W%vw|zD_jfe>)2^NWBtt{+Q>LGY3+>6CH*?fY3N%mI0BTWGtjeGqG!6 z3@1i^`mH0qI!f^?-AFO4;5^;JP&xjbVr8BYRDJ$QfXkK6mFN&Adke?nzv*vmf!62= zLMd5(zaaIQ99p%=uI24?N3@ntD-lBEdJilT&!(rf5(nOn_Z&NFH3ei`W#-eE=rGFO zUl+F(9v;Hex27NcDxAvN^AGOn^Cj)`IwMpQ&JT9nbu0EHD?Un9`v4er+#;4uHUDLZ zmL~lKE5Z0?SG|<;PO>Fyie-OIn^_U7#r0((=V$EsJHfi*^Nz zh7pITRBy2b8Y0Al@pa)0eZ@eFg$NO^a4Qm`oe#!vAXvBP`nf@pzxIb@ARr_Eu0R3P zh7xatq}nfY=i+C)Q#}HEdcK(AXVf6DGG7NTlrN09;!%2})Z=0NXHw+TC0XYm zJkgTAW%f6-2<6vj_jwSWfknhL2^io~-jCJcUbxTjG6VWz7@yJ3$f)FNB5&j-^Au$D zx9@@6{ya`^5^aG2o##wA;}-GAmXdq&NSLUGz#-wHA3D`hz< zg-NwdwOaeNjA_k*g3H#zzcanPxU<}uy-3r$?3Xa*-g?L>qqK=%d?+LvxQV&V$5(N( zIB({9eijs?f*+;V^+Crb>x!hw<=2H(2SRQz8A0R!D6;~%Nq54W!3F&smTX`GK@qGe z1T82KLyz9DT$)r(7F{aXS_e$NJbH!0p>mB13=_qNV3rYZ!H+c91KA%423&X!Fm3x+ zmz7_r|5q$Hq((|%S5&lFmOgJ8?S59ddS$y|{N{YZSWN-lzn?YQu{T-Z&as5aG+X*% ziXw6uqHr8ZqI?J1SV^?Tq9pxki{~`4^4;P!YBq?@Z&ti1ZqZtZ9V#|g*0b84zuMfR z@!|P_dX0NOVum@9(&(v*TD6FJ!PzLdqi3}&ZiQ;_KtS^rJ7@x)$6b@g?wL&PCf-9mZD;YQQ}*ThQiyZRWwkq2yLn8McJ`EyMr@ zxj@2~^cVSEXAAJkEvucSk5`uLG-ZCK=4@MC zjDna>A}h9IXnAU@=D$3P^ccD{N|%+C9B=f%a-03fh;#Y9Ue~RI9tBiaxJD3N>zG=h z%=msqfG8|WYw+gq+HYYxo7|krkfa0Fws3YYfBAj;gO|RI6F)rx2hyluq8hC5zv#h3 z&7epse_(`M6i-5v9yG|-w@Mq(hpgajX1Yn(pVGCACwtHEoHhqDX@li<#|*<}nD8yZ zcn08_?>lxZ>NjMe(4pv&bbq6GF-k7z|Mn<;uKc}sM)V1c!|ilDHan#J%Y}fxIV=l= z@*Mid({!v!7ExA8C7BA@nG+=*j

$~FPaP{bA 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Ξ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

&I>;-EQdfU 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

s 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 z

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 literal 0 HcmV?d00001 diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 1d48063a93c..f5a1a2f7812 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -145,9 +145,9 @@ Caffe::Caffe() void Caffe::init() { if (mode_ == GPU && curand_generator_ == nullptr) { curand_stream_ = CudaStream::create(); - CURAND_CHECK_ARG(curandCreateGenerator(&curand_generator_, CURAND_RNG_PSEUDO_DEFAULT), device_); - CURAND_CHECK_ARG(curandSetPseudoRandomGeneratorSeed(curand_generator_, cluster_seedgen()), device_); - CURAND_CHECK_ARG(curandSetStream(curand_generator_, curand_stream_->get()), device_); + CURAND_CHECK(curandCreateGenerator(&curand_generator_, CURAND_RNG_PSEUDO_DEFAULT)); + CURAND_CHECK(curandSetPseudoRandomGeneratorSeed(curand_generator_, cluster_seedgen())); + CURAND_CHECK(curandSetStream(curand_generator_, curand_stream_->get())); } } diff --git a/src/caffe/layers/smooth_L1_loss_layer.cu b/src/caffe/layers/smooth_L1_loss_layer.cu index 244766c03c1..678e9cc0b07 100644 --- a/src/caffe/layers/smooth_L1_loss_layer.cu +++ b/src/caffe/layers/smooth_L1_loss_layer.cu @@ -44,9 +44,11 @@ void SmoothL1LossLayer::Forward_gpu(const vector& bottom, diff_.gpu_data(), diff_.mutable_gpu_data()); // d := w * (b0 - b1) } + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) - SmoothL1Forward<<>>( + SmoothL1Forward<<>>( count, diff_.gpu_data(), errors_.mutable_gpu_data()); + CUDA_CHECK(cudaStreamSynchronize(stream)); CUDA_POST_KERNEL_CHECK; Dtype loss; @@ -73,10 +75,12 @@ template void SmoothL1LossLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { int count = diff_.count(); + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) - SmoothL1Backward<<>>( + SmoothL1Backward<<>>( count, diff_.gpu_data(), diff_.mutable_gpu_data()); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { const Dtype sign = (i == 0) ? 1 : -1; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 6b2822af015..1e27a3b5cfe 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -918,7 +918,7 @@ void Net::update_grad_scale() { if (global_grad_scale_adaptive_) { const float wgsq = wgrad_sq(); if (wgsq > 0.F) { - global_grad_scale_coeff_ = std::sqrt(std::max(wgsq, 1.F / Caffe::solver_count())) * global_grad_scale_param_; + global_grad_scale_coeff_ = std::sqrt(wgsq) * global_grad_scale_param_; return; } } diff --git a/src/caffe/util/bbox_util.cu b/src/caffe/util/bbox_util.cu index 460a222e528..5a4a6eb5807 100644 --- a/src/caffe/util/bbox_util.cu +++ b/src/caffe/util/bbox_util.cu @@ -197,12 +197,13 @@ void DecodeBBoxesGPU(const int nthreads, const int num_priors, const bool share_location, const int num_loc_classes, const int background_label_id, const bool clip_bbox, Dtype* bbox_data) { + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) - DecodeBBoxesKernel<<>>(nthreads, loc_data, prior_data, code_type, - variance_encoded_in_target, num_priors, share_location, num_loc_classes, - background_label_id, clip_bbox, bbox_data); + DecodeBBoxesKernel<<>> + (nthreads, loc_data, prior_data, code_type, variance_encoded_in_target, num_priors, + share_location, num_loc_classes, background_label_id, clip_bbox, bbox_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } template void DecodeBBoxesGPU(const int nthreads, @@ -242,11 +243,13 @@ template void PermuteDataGPU(const int nthreads, const Dtype* data, const int num_classes, const int num_data, const int num_dim, Dtype* new_data) { + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) PermuteDataKernel<<>>(nthreads, data, num_classes, num_data, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(nthreads, data, num_classes, num_data, num_dim, new_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } template void PermuteDataGPU(const int nthreads, @@ -327,32 +330,34 @@ void SoftMaxGPU(const Dtype* data, const int outer_num, TBlob scale(shape); Dtype* scale_data = scale.mutable_gpu_data(); int count = outer_num * channels * inner_num; + cudaStream_t stream = Caffe::thread_stream(); // We need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. // compute max // NOLINT_NEXT_LINE(whitespace/operators) kernel_channel_max<<>>(outer_num, channels, inner_num, data, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(outer_num, channels, inner_num, data, scale_data); // subtract // NOLINT_NEXT_LINE(whitespace/operators) kernel_channel_subtract<<>>(count, outer_num, channels, inner_num, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(count, outer_num, channels, inner_num, data, scale_data, prob); // exponentiate // NOLINT_NEXT_LINE(whitespace/operators) - kernel_exp<<>>( + kernel_exp<<>>( count, prob, prob); // sum after exp // NOLINT_NEXT_LINE(whitespace/operators) kernel_channel_sum<<>>(outer_num, channels, inner_num, prob, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(outer_num, channels, inner_num, prob, scale_data); // divide // NOLINT_NEXT_LINE(whitespace/operators) kernel_channel_div<<>>(count, outer_num, channels, inner_num, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(count, outer_num, channels, inner_num, scale_data, prob); + CUDA_CHECK(cudaStreamSynchronize(stream)); } template void SoftMaxGPU(const float* data, const int outer_num, @@ -388,11 +393,13 @@ template void ComputeOverlappedGPU(const int nthreads, const Dtype* bbox_data, const int num_bboxes, const int num_classes, const Dtype overlap_threshold, bool* overlapped_data) { + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) ComputeOverlappedKernel<<>>(nthreads, bbox_data, num_bboxes, num_classes, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(nthreads, bbox_data, num_bboxes, num_classes, overlap_threshold, overlapped_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } template void ComputeOverlappedGPU(const int nthreads, @@ -428,11 +435,13 @@ template void ComputeOverlappedByIdxGPU(const int nthreads, const Dtype* bbox_data, const Dtype overlap_threshold, const int* idx, const int num_idx, bool* overlapped_data) { + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) ComputeOverlappedByIdxKernel<<>>(nthreads, bbox_data, overlap_threshold, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(nthreads, bbox_data, overlap_threshold, idx, num_idx, overlapped_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } template void ComputeOverlappedByIdxGPU(const int nthreads, @@ -537,11 +546,13 @@ void GetDetectionsGPU(const Dtype* bbox_data, const Dtype* conf_data, // Prepare detection_blob. detection_blob->Reshape(1, 1, num_det, 7); Dtype* detection_data = detection_blob->mutable_gpu_data(); + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) GetDetectionsKernel<<>>(num_det, bbox_data, conf_data, image_id, label, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(num_det, bbox_data, conf_data, image_id, label, idx_blob.gpu_data(), clip_bbox, detection_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } template void GetDetectionsGPU(const float* bbox_data, const float* conf_data, @@ -632,10 +643,12 @@ void ComputeConfLossGPU(const TBlob& conf_blob, const int num, TBlob conf_loss_blob(num, num_preds_per_class, 1, 1); Dtype* conf_loss_gpu_data = conf_loss_blob.mutable_gpu_data(); const int num_threads = num * num_preds_per_class; + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) ComputeConfLossKernel<<>>(num_threads, conf_gpu_data, num_preds_per_class, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(num_threads, conf_gpu_data, num_preds_per_class, num_classes, loss_type, match_blob.gpu_data(), conf_loss_gpu_data); + CUDA_CHECK(cudaStreamSynchronize(stream)); // Save the loss. all_conf_loss->clear(); const Dtype* loss_data = conf_loss_blob.cpu_data(); From a9bc987a61e0224a85f0280cab03b18d2471ca4e Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sat, 17 Mar 2018 22:20:58 -0700 Subject: [PATCH 37/42] Tuning --- README.md | 2 +- examples/faceboxes/SSD.prototxt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1032f956245..2eed99237da 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,6 @@ Please cite Caffe in your publications if it helps your research: Libturbojpeg library is used since 0.16.5. It has a packaging bug. Please execute the following (required for Makefile, optional for CMake): ``` -sudo apt-get install libturbojpeg libturbojpeg-dev +sudo apt-get install libturbojpeg sudo ln -s /usr/lib/x86_64-linux-gnu/libturbojpeg.so.0.1.0 /usr/lib/x86_64-linux-gnu/libturbojpeg.so ``` \ No newline at end of file diff --git a/examples/faceboxes/SSD.prototxt b/examples/faceboxes/SSD.prototxt index 9c61a39d3d7..5b73fb021d4 100644 --- a/examples/faceboxes/SSD.prototxt +++ b/examples/faceboxes/SSD.prototxt @@ -1,9 +1,9 @@ name: "VGG_WIDER_FACE_SFD_deploy" -default_forward_type: FLOAT16 -default_backward_type: FLOAT16 -default_forward_math: FLOAT16 -default_backward_math: FLOAT16 +#default_forward_type: FLOAT16 +#default_backward_type: FLOAT16 +#default_forward_math: FLOAT16 +#default_backward_math: FLOAT16 #global_grad_scale: 10 #global_grad_scale_adaptive: true From a83e4e5681872f591d9011b5e132da85e443a9ee Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 19 Mar 2018 00:54:36 -0700 Subject: [PATCH 38/42] all in one pr118 --- include/caffe/net.hpp | 8 +- include/caffe/util/benchmark.hpp | 17 +-- python/caffe/_caffe.cpp | 32 ++++- python/caffe/test/test_net.py | 231 ++++++++++++++++++++++++++++++- src/caffe/net.cpp | 15 +- src/caffe/parallel.cpp | 2 + src/caffe/test/test_net.cpp | 127 +++++++++++++++++ src/caffe/util/benchmark.cpp | 16 ++- tools/caffe.cpp | 65 +++++++-- 9 files changed, 483 insertions(+), 30 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index d609ed0bcfe..0ab97e303d7 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -34,13 +34,17 @@ class Net { size_t solver_rank = 0U, Flag* solver_init_flag = nullptr, const Net* root_net = nullptr, - bool inner_net = false); + bool inner_net = false, + int level = 0, + const vector* stages = NULL); Net(const string& param_file, Phase phase, size_t solver_rank = 0U, Flag* solver_init_flag = nullptr, const Net* root_net = nullptr, - bool inner_net = false); + bool inner_net = false, + int level = 0, + const vector* stages = NULL); ~Net(); /// @brief Initialize a network with a NetParameter. diff --git a/include/caffe/util/benchmark.hpp b/include/caffe/util/benchmark.hpp index 842812ea04c..61c223fae64 100644 --- a/include/caffe/util/benchmark.hpp +++ b/include/caffe/util/benchmark.hpp @@ -17,9 +17,9 @@ class Timer { virtual float MicroSeconds(); virtual float Seconds(); - inline bool initted() { return initted_; } - inline bool running() { return running_; } - inline bool has_run_at_least_once() { return has_run_at_least_once_; } + bool initted() { return initted_; } + bool running() { return running_; } + bool has_run_at_least_once() { return has_run_at_least_once_; } protected: void Init(); @@ -33,16 +33,17 @@ class Timer { boost::posix_time::ptime stop_cpu_; float elapsed_milliseconds_; float elapsed_microseconds_; + int device_; }; class CPUTimer : public Timer { public: explicit CPUTimer(); - virtual ~CPUTimer() {} - virtual void Start(); - virtual void Stop(); - virtual float MilliSeconds(); - virtual float MicroSeconds(); + ~CPUTimer() override {} + void Start() override; + void Stop() override; + float MilliSeconds() override; + float MicroSeconds() override; }; } // namespace caffe diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 27aeda3743f..d663e5b33b2 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -143,16 +143,37 @@ void CheckContiguousArray(PyArrayObject* arr, string name, } // Net constructor for passing phase as int -shared_ptr Net_Init(string param_file, int phase) { +shared_ptr Net_Init(string param_file, int phase, + const int level, const bp::object& stages, + const bp::object& weights) { + // Convert stages from list to vector + vector stages_vector; + if (!stages.is_none()) { + for (int i = 0; i < bp::len(stages); i++) { + stages_vector.push_back(bp::extract(stages[i])); + } + } PyGILRelease gil; CheckFile(param_file); - shared_ptr net(new Net(param_file, static_cast(phase))); + shared_ptr net(new Net(param_file, static_cast(phase), + 0U, nullptr, nullptr, false, level, &stages_vector)); + // Load weights + if (!weights.is_none()) { + std::string weights_file_str = bp::extract(weights); + CheckFile(weights_file_str); + net->CopyTrainedLayersFrom(weights_file_str); + } return net; } // Net construct-and-load convenience constructor shared_ptr Net_Init_Load(string param_file, string pretrained_param_file, int phase) { PyGILRelease gil; + LOG(WARNING) << "DEPRECATION WARNING - deprecated use of Python interface"; + LOG(WARNING) << "Use this instead (with the named \"weights\"" + << " parameter):"; + LOG(WARNING) << "Net('" << param_file << "', " << phase + << ", weights='" << pretrained_param_file << "')"; CheckFile(param_file); CheckFile(pretrained_param_file); shared_ptr net(new Net(param_file, static_cast(phase))); @@ -415,7 +436,12 @@ BOOST_PYTHON_MODULE(_caffe) { bp::class_, boost::noncopyable >("Net", bp::no_init) - .def("__init__", bp::make_constructor(&Net_Init)) + // Constructor + .def("__init__", bp::make_constructor(&Net_Init, + bp::default_call_policies(), (bp::arg("network_file"), "phase", + bp::arg("level")=0, bp::arg("stages")=bp::object(), + bp::arg("weights")=bp::object()))) + // Legacy constructor .def("__init__", bp::make_constructor(&Net_Init_Load)) .def("_forward", &Net_ForwardFromToNoGIL) .def("_backward", &Net_BackwardFromToNoGIL) diff --git a/python/caffe/test/test_net.py b/python/caffe/test/test_net.py index 3abc171c679..92b4d5ee7bb 100644 --- a/python/caffe/test/test_net.py +++ b/python/caffe/test/test_net.py @@ -83,10 +83,239 @@ def test_save_and_read(self): f.close() self.net.save(f.name) net_file = simple_net_file(self.num_output) - net2 = caffe.Net(net_file, f.name, caffe.TRAIN) + # Test legacy constructor + # should print deprecation warning + caffe.Net(net_file, f.name, caffe.TRAIN) + # Test named constructor + net2 = caffe.Net(net_file, caffe.TRAIN, weights=f.name) +# net2 = caffe.Net(net_file, f.name, caffe.TRAIN) os.remove(net_file) os.remove(f.name) for name in self.net.params: for i in range(len(self.net.params[name])): self.assertEqual(abs(self.net.params[name][i].data - net2.params[name][i].data).sum(), 0) + +class TestLevels(unittest.TestCase): + + TEST_NET = """ +layer { + name: "data" + type: "DummyData" + top: "data" + dummy_data_param { shape { dim: 1 dim: 1 dim: 10 dim: 10 } } +} +layer { + name: "NoLevel" + type: "InnerProduct" + bottom: "data" + top: "NoLevel" + inner_product_param { num_output: 1 } +} +layer { + name: "Level0Only" + type: "InnerProduct" + bottom: "data" + top: "Level0Only" + include { min_level: 0 max_level: 0 } + inner_product_param { num_output: 1 } +} +layer { + name: "Level1Only" + type: "InnerProduct" + bottom: "data" + top: "Level1Only" + include { min_level: 1 max_level: 1 } + inner_product_param { num_output: 1 } +} +layer { + name: "Level>=0" + type: "InnerProduct" + bottom: "data" + top: "Level>=0" + include { min_level: 0 } + inner_product_param { num_output: 1 } +} +layer { + name: "Level>=1" + type: "InnerProduct" + bottom: "data" + top: "Level>=1" + include { min_level: 1 } + inner_product_param { num_output: 1 } +} +""" + + def setUp(self): + self.f = tempfile.NamedTemporaryFile(mode='w+', delete=False) + self.f.write(self.TEST_NET) + self.f.close() + + def tearDown(self): + os.remove(self.f.name) + + def check_net(self, net, blobs): + net_blobs = [b for b in net.blobs.keys() if 'data' not in b] + self.assertEqual(net_blobs, blobs) + + def test_0(self): + net = caffe.Net(self.f.name, caffe.TEST) + self.check_net(net, ['NoLevel', 'Level0Only', 'Level>=0']) + + def test_1(self): + net = caffe.Net(self.f.name, caffe.TEST, level=1) + self.check_net(net, ['NoLevel', 'Level1Only', 'Level>=0', 'Level>=1']) + + +class TestStages(unittest.TestCase): + + TEST_NET = """ +layer { + name: "data" + type: "DummyData" + top: "data" + dummy_data_param { shape { dim: 1 dim: 1 dim: 10 dim: 10 } } +} +layer { + name: "A" + type: "InnerProduct" + bottom: "data" + top: "A" + include { stage: "A" } + inner_product_param { num_output: 1 } +} +layer { + name: "B" + type: "InnerProduct" + bottom: "data" + top: "B" + include { stage: "B" } + inner_product_param { num_output: 1 } +} +layer { + name: "AorB" + type: "InnerProduct" + bottom: "data" + top: "AorB" + include { stage: "A" } + include { stage: "B" } + inner_product_param { num_output: 1 } +} +layer { + name: "AandB" + type: "InnerProduct" + bottom: "data" + top: "AandB" + include { stage: "A" stage: "B" } + inner_product_param { num_output: 1 } +} +""" + + def setUp(self): + self.f = tempfile.NamedTemporaryFile(mode='w+', delete=False) + self.f.write(self.TEST_NET) + self.f.close() + + def tearDown(self): + os.remove(self.f.name) + + def check_net(self, net, blobs): + net_blobs = [b for b in net.blobs.keys() if 'data' not in b] + self.assertEqual(net_blobs, blobs) + + def test_A(self): + net = caffe.Net(self.f.name, caffe.TEST, stages=['A']) + self.check_net(net, ['A', 'AorB']) + + def test_B(self): + net = caffe.Net(self.f.name, caffe.TEST, stages=['B']) + self.check_net(net, ['B', 'AorB']) + + def test_AandB(self): + net = caffe.Net(self.f.name, caffe.TEST, stages=['A', 'B']) + self.check_net(net, ['A', 'B', 'AorB', 'AandB']) + + +class TestAllInOne(unittest.TestCase): + + TEST_NET = """ +layer { + name: "train_data" + type: "DummyData" + top: "data" + top: "label" + dummy_data_param { + shape { dim: 1 dim: 1 dim: 10 dim: 10 } + shape { dim: 1 dim: 1 dim: 1 dim: 1 } + } + include { phase: TRAIN stage: "train" } +} +layer { + name: "val_data" + type: "DummyData" + top: "data" + top: "label" + dummy_data_param { + shape { dim: 1 dim: 1 dim: 10 dim: 10 } + shape { dim: 1 dim: 1 dim: 1 dim: 1 } + } + include { phase: TEST stage: "val" } +} +layer { + name: "deploy_data" + type: "Input" + top: "data" + input_param { shape { dim: 1 dim: 1 dim: 10 dim: 10 } } + include { phase: TEST stage: "deploy" } +} +layer { + name: "ip" + type: "InnerProduct" + bottom: "data" + top: "ip" + inner_product_param { num_output: 2 } +} +layer { + name: "loss" + type: "SoftmaxWithLoss" + bottom: "ip" + bottom: "label" + top: "loss" + include: { phase: TRAIN stage: "train" } + include: { phase: TEST stage: "val" } +} +layer { + name: "pred" + type: "Softmax" + bottom: "ip" + top: "pred" + include: { phase: TEST stage: "deploy" } +} +""" + + def setUp(self): + self.f = tempfile.NamedTemporaryFile(mode='w+', delete=False) + self.f.write(self.TEST_NET) + self.f.close() + + def tearDown(self): + os.remove(self.f.name) + + def check_net(self, net, outputs): + self.assertEqual(list(net.blobs['data'].shape), [1,1,10,10]) + self.assertEqual(net.outputs, outputs) + + def test_train(self): + net = caffe.Net(self.f.name, caffe.TRAIN, stages=['train']) + self.check_net(net, ['loss']) + + def test_val(self): + net = caffe.Net(self.f.name, caffe.TEST, stages=['val']) + self.check_net(net, ['loss']) + + def test_deploy(self): + net = caffe.Net(self.f.name, caffe.TEST, stages=['deploy']) + self.check_net(net, ['pred']) + +# if __name__ == '__main__': +# unittest.main() \ No newline at end of file diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 1e27a3b5cfe..8c209cede89 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -25,7 +25,9 @@ Net::Net(const NetParameter& param, size_t solver_rank, Flag* solver_init_flag, const Net* root_net, - bool inner_net) + bool inner_net, + int level, + const vector* stages) : root_net_(root_net), solver_(nullptr), solver_rank_(solver_rank), @@ -39,7 +41,9 @@ Net::Net(const string& param_file, size_t solver_rank, Flag* solver_init_flag, const Net* root_net, - bool inner_net) + bool inner_net, + int level, + const vector* stages) : root_net_(root_net), solver_(nullptr), solver_rank_(solver_rank), @@ -47,7 +51,14 @@ Net::Net(const string& param_file, inner_net_(inner_net) { NetParameter param; ReadNetParamsFromTextFileOrDie(param_file, ¶m); + // Set phase, stages and level param.mutable_state()->set_phase(phase); + if (stages != NULL) { + for (int i = 0; i < stages->size(); ++i) { + param.mutable_state()->add_stage(stages->at(i)); + } + } + param.mutable_state()->set_level(level); Init(param); } diff --git a/src/caffe/parallel.cpp b/src/caffe/parallel.cpp index fbd56364ab2..8ecc8087adf 100644 --- a/src/caffe/parallel.cpp +++ b/src/caffe/parallel.cpp @@ -96,6 +96,7 @@ P2PSync::P2PSync(P2PManager* mgr, shared_ptr root_solver, #ifndef USE_NCCL LOG(FATAL) << "USE_NCCL := 1 must be specified for multi-GPU"; #endif + CHECK_EQ(target_device_, solver_param_.device_id()); LOG(INFO) << "[" << rank << " - " << this->target_device_ << "] P2pSync adding callback"; } @@ -117,6 +118,7 @@ void P2PSync::InternalThreadEntry() { solver_->set_callback(this); CHECK_EQ(nranks_, Caffe::solver_count()); + CHECK_EQ(target_device_, Caffe::current_device()); #ifdef USE_NCCL ncclUniqueId* nccl_id = reinterpret_cast(this->aux_); diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 21f9461ef3d..df9e1f9ed5c 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -48,6 +48,16 @@ class NetTest : public MultiDeviceTest { } } + virtual void InitNetFromProtoFileWithState(const string& proto, + Phase phase = caffe::TRAIN, const int level = 0, + const vector* stages = NULL) { + NetParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + string param_file = MakeTempFilename(); + WriteProtoToTextFile(param, param_file); + net_.reset(new Net(param_file, phase, 0U, nullptr, nullptr, false, level, stages)); + } + virtual void CopyNetBlobs(const bool copy_diff, vector > >* blobs_copy) { CHECK(net_); @@ -876,10 +886,67 @@ class NetTest : public MultiDeviceTest { InitNetFromProtoString(proto); } + virtual void InitAllInOneNet(Phase phase = caffe::TRAIN, + const int level = 0, const vector* stages = NULL) { + string proto = + "name: 'All-in-one Network'" + "layer { " + " name: 'train-data' " + " type: 'DummyData' " + " top: 'data' " + " top: 'label' " + " dummy_data_param { " + " shape { dim: 1 dim: 10 } " + " shape { dim: 1 dim: 1 } " + " } " + " include { phase: TRAIN stage: 'train' } " + "} " + "layer { " + " name: 'val-data' " + " type: 'DummyData' " + " top: 'data' " + " top: 'label' " + " dummy_data_param { " + " shape { dim: 1 dim: 10 } " + " shape { dim: 1 dim: 1 } " + " } " + " include { phase: TEST stage: 'val' } " + "} " + "layer { " + " name: 'deploy-data' " + " type: 'Input' " + " top: 'data' " + " input_param { " + " shape { dim: 1 dim: 10 } " + " } " + " include { phase: TEST stage: 'deploy' } " + "} " + "layer { " + " name: 'ip' " + " type: 'InnerProduct' " + " bottom: 'data' " + " top: 'ip' " + " inner_product_param { " + " num_output: 2 " + " } " + "} " + "layer { " + " name: 'loss' " + " type: 'SoftmaxWithLoss' " + " bottom: 'ip' " + " bottom: 'label' " + " top: 'loss' " + " include { phase: TRAIN stage: 'train' } " + " include { phase: TEST stage: 'val' } " + "} "; + InitNetFromProtoFileWithState(proto, phase, level, stages); + } + int seed_; shared_ptr net_; }; + TYPED_TEST_CASE(NetTest, TestDtypesAndDevices); TYPED_TEST(NetTest, TestHasBlob) { @@ -2624,4 +2691,64 @@ TYPED_TEST(NetTest, TestForcePropagateDown) { } } +TYPED_TEST(NetTest, TestAllInOneNetTrain) { + vector stages; + stages.push_back("train"); + this->InitAllInOneNet(caffe::TRAIN, 0, &stages); + bool found_data = false; + bool found_loss = false; + for (int i = 0; i < this->net_->layers().size(); ++i) { + const string& layer_name = this->net_->layer_names()[i]; + if (layer_name == "train-data") { + found_data = true; + } else if (layer_name == "loss") { + found_loss = true; + } else { + ASSERT_NE(layer_name, "val-data"); + ASSERT_NE(layer_name, "deploy-data"); + } + } + ASSERT_TRUE(found_data); + ASSERT_TRUE(found_loss); +} + +TYPED_TEST(NetTest, TestAllInOneNetVal) { + vector stages; + stages.push_back("val"); + this->InitAllInOneNet(caffe::TEST, 0, &stages); + bool found_data = false; + bool found_loss = false; + for (int i = 0; i < this->net_->layers().size(); ++i) { + const string& layer_name = this->net_->layer_names()[i]; + if (layer_name == "val-data") { + found_data = true; + } else if (layer_name == "loss") { + found_loss = true; + } else { + ASSERT_NE(layer_name, "train-data"); + ASSERT_NE(layer_name, "deploy-data"); + } + } + ASSERT_TRUE(found_data); + ASSERT_TRUE(found_loss); +} + +TYPED_TEST(NetTest, TestAllInOneNetDeploy) { + vector stages; + stages.push_back("deploy"); + this->InitAllInOneNet(caffe::TEST, 0, &stages); + bool found_data = false; + for (int i = 0; i < this->net_->layers().size(); ++i) { + const string& layer_name = this->net_->layer_names()[i]; + if (layer_name == "deploy-data") { + found_data = true; + } else { + ASSERT_NE(layer_name, "train-data"); + ASSERT_NE(layer_name, "val-data"); + ASSERT_NE(layer_name, "loss"); + } + } + ASSERT_TRUE(found_data); +} + } // namespace caffe diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp index 04a4d106ce3..daa81345d94 100644 --- a/src/caffe/util/benchmark.cpp +++ b/src/caffe/util/benchmark.cpp @@ -8,7 +8,10 @@ namespace caffe { Timer::Timer() : initted_(false), running_(false), - has_run_at_least_once_(false) { + has_run_at_least_once_(false), + start_gpu_(nullptr), + stop_gpu_(nullptr), + device_(-1) { Init(); } @@ -31,6 +34,7 @@ Timer::~Timer() { void Timer::Start() { if (!running()) { if (Caffe::mode() == Caffe::GPU) { + CHECK_EQ(device_, Caffe::current_device()); CUDA_CHECK(cudaEventRecord(start_gpu_, 0)); } else { start_cpu_ = boost::posix_time::microsec_clock::local_time(); @@ -43,6 +47,7 @@ void Timer::Start() { void Timer::Stop() { if (running()) { if (Caffe::mode() == Caffe::GPU) { + CHECK_EQ(device_, Caffe::current_device()); CUDA_CHECK(cudaEventRecord(stop_gpu_, 0)); CUDA_CHECK(cudaEventSynchronize(stop_gpu_)); } else { @@ -52,7 +57,6 @@ void Timer::Stop() { } } - float Timer::MicroSeconds() { if (!has_run_at_least_once()) { LOG(WARNING) << "Timer has never been run before reading time."; @@ -62,6 +66,7 @@ float Timer::MicroSeconds() { Stop(); } if (Caffe::mode() == Caffe::GPU) { + CHECK_EQ(device_, Caffe::current_device()); CUDA_CHECK(cudaEventElapsedTime(&elapsed_milliseconds_, start_gpu_, stop_gpu_)); // Cuda only measure milliseconds elapsed_microseconds_ = elapsed_milliseconds_ * 1000; @@ -80,6 +85,7 @@ float Timer::MilliSeconds() { Stop(); } if (Caffe::mode() == Caffe::GPU) { + CHECK_EQ(device_, Caffe::current_device()); CUDA_CHECK(cudaEventElapsedTime(&elapsed_milliseconds_, start_gpu_, stop_gpu_)); } else { elapsed_milliseconds_ = (stop_cpu_ - start_cpu_).total_milliseconds(); @@ -94,6 +100,12 @@ float Timer::Seconds() { void Timer::Init() { if (!initted()) { if (Caffe::mode() == Caffe::GPU) { + int current_device = Caffe::current_device(); + if (device_ < 0) { + device_ = current_device; + } else { + CHECK_EQ(device_, current_device); + } CUDA_CHECK(cudaEventCreate(&start_gpu_)); CUDA_CHECK(cudaEventCreate(&stop_gpu_)); } else { diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 48fb6269b5c..9ed96043453 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -34,6 +34,13 @@ DEFINE_string(solver, "", "The solver definition protocol buffer text file."); DEFINE_string(model, "", "The model definition protocol buffer text file."); +DEFINE_string(phase, "", + "Optional; network phase (TRAIN or TEST). Only used for 'time'."); +DEFINE_int32(level, 0, + "Optional; network level."); +DEFINE_string(stage, "", + "Optional; network stages (not to be confused with phase), " + "separated by ','."); DEFINE_string(snapshot, "", "Optional; the snapshot solver state to resume training."); DEFINE_string(weights, "", @@ -100,6 +107,25 @@ static void get_gpus(vector* gpus) { } } +// Parse phase from flags +caffe::Phase get_phase_from_flags(caffe::Phase default_value) { + if (FLAGS_phase == "") + return default_value; + if (FLAGS_phase == "TRAIN") + return caffe::TRAIN; + if (FLAGS_phase == "TEST") + return caffe::TEST; + LOG(FATAL) << "phase must be \"TRAIN\" or \"TEST\""; + return caffe::TRAIN; // Avoid warning +} + +// Parse stages from flags +vector get_stages_from_flags() { + vector stages; + boost::split(stages, FLAGS_stage, boost::is_any_of(",")); + return stages; +} + // caffe commands to call by // caffe // @@ -156,25 +182,31 @@ int train() { CHECK(!FLAGS_snapshot.size() || !FLAGS_weights.size()) << "Give a snapshot to resume training or weights to finetune " "but not both."; + vector stages = get_stages_from_flags(); caffe::SolverParameter solver_param = caffe::ReadSolverParamsFromTextFileOrDie(FLAGS_solver); + solver_param.mutable_train_state()->set_level(FLAGS_level); + for (int i = 0; i < stages.size(); i++) { + solver_param.mutable_train_state()->add_stage(stages[i]); + } + // If the gpus flag is not provided, allow the mode and device to be set // in the solver prototxt. if (FLAGS_gpu.size() == 0 + && solver_param.has_solver_mode() && solver_param.solver_mode() == caffe::SolverParameter_SolverMode_GPU) { if (solver_param.has_device_id()) { - FLAGS_gpu = "" + - boost::lexical_cast(solver_param.device_id()); + FLAGS_gpu = std::to_string(solver_param.device_id()); } else { // Set default GPU if unspecified - FLAGS_gpu = "" + boost::lexical_cast(0); + FLAGS_gpu = std::to_string(0); } } // Read flags for list of GPUs vector gpus; get_gpus(&gpus); - caffe::GPUMemory::Scope gpu_memory_scope(gpus); + // Set mode and device id[s] if (gpus.size() == 0) { LOG(INFO) << "Use CPU."; @@ -185,19 +217,17 @@ int train() { s << (i ? ", " : "") << gpus[i]; } + caffe::GPUMemory::Scope gpu_memory_scope(gpus); + LOG(INFO) << "Using GPUs " << s.str(); - int dev_id = 0; cudaDeviceProp device_prop; for (int i = 0; i < gpus.size(); ++i) { cudaGetDeviceProperties(&device_prop, gpus[i]); LOG(INFO) << "GPU " << gpus[i] << ": " << device_prop.name; - if (solver_param.has_device_id() && gpus[i] == solver_param.device_id()) { - dev_id = i; - } } - CUDA_CHECK(cudaSetDevice(gpus[dev_id])); - Caffe::SetDevice(gpus[dev_id]); - solver_param.set_device_id(gpus[dev_id]); + CUDA_CHECK(cudaSetDevice(gpus[0])); + Caffe::SetDevice(gpus[0]); + solver_param.set_device_id(gpus[0]); Caffe::set_mode(Caffe::GPU); Caffe::set_gpus(gpus); Caffe::set_solver_count(gpus.size()); @@ -244,6 +274,7 @@ RegisterBrewFunction(train); int test() { CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to score."; CHECK_GT(FLAGS_weights.size(), 0) << "Need model weights to score."; + vector stages = get_stages_from_flags(); // Read flags for list of GPUs vector gpus; @@ -271,7 +302,7 @@ int test() { } // Instantiate the caffe net. - Net caffe_net(FLAGS_model, caffe::TEST, 0U); + Net caffe_net(FLAGS_model, caffe::TEST, 0U, nullptr, nullptr, false, FLAGS_level, &stages); caffe_net.CopyTrainedLayersFrom(FLAGS_weights); LOG(INFO) << "Running for " << FLAGS_iterations << " iterations."; @@ -496,6 +527,9 @@ RegisterBrewFunction(test_detection); // Time: benchmark the execution time of a model. int time() { CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to time."; + caffe::Phase phase = get_phase_from_flags(caffe::TRAIN); + vector stages = get_stages_from_flags(); + vector gpus; // Read flags for list of GPUs get_gpus(&gpus); @@ -530,6 +564,13 @@ int time() { solver_param.set_random_seed(1371LL); solver_param.set_test_interval(FLAGS_iterations + 1); solver_param.set_display(0); + + solver_param.mutable_train_state()->set_level(FLAGS_level); + for (int i = 0; i < stages.size(); i++) { + solver_param.mutable_train_state()->add_stage(stages[i]); + } + solver_param.mutable_net_param()->mutable_state()->set_phase(phase); + shared_ptr solver(caffe::SolverRegistry::CreateSolver(solver_param)); shared_ptr caffe_net = solver->net(); From 3c2f87bf84b144ee75e4f03f96c1068c805b355a Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 19 Mar 2018 21:08:56 -0700 Subject: [PATCH 39/42] Eltwise optimized --- src/caffe/layers/eltwise_layer.cpp | 15 +++++++++++---- src/caffe/layers/eltwise_layer.cu | 9 ++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index ba04cae21fd..b549aa462d4 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -45,6 +45,7 @@ void EltwiseLayer::Reshape(const vector& bottom, } if (op_ == EltwiseParameter_EltwiseOp_SUM && no_coeffs_) { bottom[0]->ShareDiff(*top[0]); + top[0]->ShareData(*bottom[0]); } } @@ -64,10 +65,16 @@ void EltwiseLayer::Forward_cpu( } break; case EltwiseParameter_EltwiseOp_SUM: - caffe_set(count, Ftype(0), top_data); - // TODO(shelhamer) does BLAS optimize to sum for coeff = 1? - for (int i = 0; i < bottom.size(); ++i) { - caffe_axpy(count, Ftype(coeffs_[i]), bottom[i]->cpu_data(), top_data); + if (no_coeffs_) { + for (int i = 1; i < bottom.size(); ++i) { + caffe_axpy(count, Ftype(1), bottom[i]->cpu_data(), top_data); + } + } else { + caffe_set(count, Ftype(0), top_data); + // TODO(shelhamer) does BLAS optimize to sum for coeff = 1? + for (int i = 0; i < bottom.size(); ++i) { + caffe_axpy(count, Ftype(coeffs_[i]), bottom[i]->cpu_data(), top_data); + } } break; case EltwiseParameter_EltwiseOp_MAX: diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index acc22e24be8..2479e9a6b04 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -47,13 +47,8 @@ void EltwiseLayer::Forward_gpu(const vector& bottom, break; case EltwiseParameter_EltwiseOp_SUM: if (no_coeffs_) { - if (bottom.size() >= 2) { - caffe_gpu_add(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), top_data); - for (int i = 2; i < bottom.size(); ++i) { - caffe_gpu_incr(count, bottom[i]->gpu_data(), top_data); - } - } else if (bottom.size() == 1) { - caffe_copy(count, bottom[0]->gpu_data(), top_data); + for (int i = 1; i < bottom.size(); ++i) { + caffe_gpu_incr(count, bottom[i]->gpu_data(), top_data); } } else { caffe_gpu_set(count, Ftype(0.), top_data); From 5ebd8f3e1bb81b2b35ae32da7ac26ae411ae475a Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 20 Mar 2018 15:55:24 -0700 Subject: [PATCH 40/42] Eltwise optimized, 2 --- .../caffe/test/test_gradient_check_util.hpp | 26 ++++++++++++++++++- src/caffe/layers/eltwise_layer.cpp | 10 +++---- src/caffe/layers/eltwise_layer.cu | 6 +---- src/caffe/test/test_eltwise_layer.cpp | 18 ++++++++----- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/include/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp index 004decf6896..a668d639d01 100644 --- a/include/caffe/test/test_gradient_check_util.hpp +++ b/include/caffe/test/test_gradient_check_util.hpp @@ -189,7 +189,31 @@ void GradientChecker::CheckGradientExhaustive(LayerBase* layer, const vec template void GradientChecker::CheckGradientEltwise(LayerBase* layer, const vector& bottom, const vector& top) { - layer->SetUp(bottom, top); + vector bottom_copy(bottom.size()), top_copy(top.size()); + vector> bottom_scopy(bottom.size()), top_scopy(top.size()); + for (int i = 0; i < bottom.size(); ++i) { + if (bottom[i]->count() > 0) { + bottom_scopy[i] = Blob::create(bottom[i]->shape()); + bottom_scopy[i]->CopyDataFrom(*bottom[i]); + bottom_scopy[i]->CopyDiffFrom(*bottom[i]); + } else { + bottom_scopy[i] = Blob::create(); + } + bottom_copy[i] = bottom_scopy[i].get(); + } + for (int i = 0; i < top.size(); ++i) { + if (top[i]->count() > 0) { + top_scopy[i] = Blob::create(top[i]->shape()); + top_scopy[i]->CopyDataFrom(*top[i]); + top_scopy[i]->CopyDiffFrom(*top[i]); + } else { + top_scopy[i] = Blob::create(bottom[0]->shape()); + top_scopy[i]->CopyDataFrom(*bottom[0]); + top_scopy[i]->CopyDiffFrom(*bottom[0]); + } + top_copy[i] = top_scopy[i].get(); + } + layer->SetUp(bottom_copy, top_copy); CHECK_GT(top.size(), 0) << "Eltwise mode requires at least one top blob."; const int check_bottom = -1; const bool element_wise = true; diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index b549aa462d4..a425aa51f27 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -44,7 +44,9 @@ void EltwiseLayer::Reshape(const vector& bottom, max_idx_.Reshape(bottom[0]->shape()); } if (op_ == EltwiseParameter_EltwiseOp_SUM && no_coeffs_) { - bottom[0]->ShareDiff(*top[0]); + for (int i = 0; i < bottom.size(); ++i) { + bottom[i]->ShareDiff(*top[0]); + } top[0]->ShareData(*bottom[0]); } } @@ -141,11 +143,7 @@ void EltwiseLayer::Backward_cpu(const vector& top, caffe_mul(count, bottom_diff, top_diff, bottom_diff); break; case EltwiseParameter_EltwiseOp_SUM: - if (no_coeffs_) { - if (i > 0) { - caffe_copy(count, top_diff, bottom_diff); - } - } else { + if (!no_coeffs_) { caffe_cpu_scale(count, Btype(coeffs_[i]), top_diff, bottom_diff); } break; diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 2479e9a6b04..fb469ac7e70 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -122,11 +122,7 @@ void EltwiseLayer::Backward_gpu(const vector& top, } break; case EltwiseParameter_EltwiseOp_SUM: - if (no_coeffs_) { - if (i > 0) { - caffe_copy(count, top_diff, bottom[i]->mutable_gpu_diff()); - } - } else { + if (!no_coeffs_) { caffe_gpu_scale(count, Btype(coeffs_[i]), top_diff, bottom[i]->mutable_gpu_diff()); } break; diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index c6b187a420d..00fff4abe4b 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -94,6 +94,17 @@ TYPED_TEST(EltwiseLayerTest, TestProd) { TYPED_TEST(EltwiseLayerTest, TestSum) { typedef typename TypeParam::Dtype Dtype; + const int count = this->blob_top_->count(); + const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); + const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); + const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); + vector shape(count); + TBlob val(shape); + Dtype* pval = val.mutable_cpu_data(); + for (int i = 0; i < count; ++i) { + pval[i] = in_data_a[i] + in_data_b[i] + in_data_c[i]; + } + LayerParameter layer_param; layer_param.set_forward_type(tp()); layer_param.set_backward_type(tp()); @@ -106,13 +117,8 @@ TYPED_TEST(EltwiseLayerTest, TestSum) { layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->blob_top_->cpu_data(); - const int count = this->blob_top_->count(); - const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); - const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); - const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); for (int i = 0; i < count; ++i) { - EXPECT_NEAR(data[i], in_data_a[i] + in_data_b[i] + in_data_c[i], - tol(1e-4, 2e-3)); + EXPECT_NEAR(data[i], pval[i], tol(1e-4, 2e-3)); } } From 7bb496bdf4d584781de2ea8b7aba3077c6caf560 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 20 Mar 2018 19:31:12 -0700 Subject: [PATCH 41/42] Eltwise optimized, 2 --- include/caffe/net.hpp | 4 ++++ src/caffe/layers/eltwise_layer.cpp | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 0ab97e303d7..ab02a2652e2 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -288,6 +288,10 @@ class Net { return has_global_grad_scale_param_ && global_grad_scale_param_ > 0.F; } + bool inner_net() const { + return inner_net_; + } + void update_grad_scale(); std::string print_current_device() const { diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index a425aa51f27..1b37d80c177 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -2,7 +2,7 @@ #include #include "caffe/layers/eltwise_layer.hpp" -#include "caffe/util/math_functions.hpp" +#include "caffe/net.hpp" namespace caffe { @@ -30,7 +30,9 @@ void EltwiseLayer::LayerSetUp(const vector& bottom, template void EltwiseLayer::Reshape(const vector& bottom, const vector& top) { - no_coeffs_ = true; + const Net* pnet = this->parent_net(); + // Inner nets are usually cyclic + no_coeffs_ = pnet != nullptr && !pnet->inner_net(); for (int i = 0; i < bottom.size(); ++i) { no_coeffs_ = no_coeffs_ && coeffs_[i] == 1.F; } From 3886d952016e1b37cfcbeea28d748ffa6c5f5e17 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Fri, 23 Mar 2018 14:36:15 -0700 Subject: [PATCH 42/42] -todo --- src/caffe/layers/pooling_layer.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index a87e9bd76ce..70469d88ab4 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -25,7 +25,7 @@ __global__ void MaxPoolForward(const int nthreads, const int wend = min(wstart + kernel_w, width); hstart = max(hstart, 0); wstart = max(wstart, 0); - float maxval = -static_cast(max_dtype()); // TODO Ftype? + float maxval = -static_cast(max_dtype()); int maxidx = -1; const Ftype* const bottom_slice = bottom_data + (n * channels + c) * height * width;

{Z}W($@XI%sr{ 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 ly+0wmKfHVRf01h>`QO(sFR#}O1}e+;?# Date: Mon, 12 Feb 2018 13:23:39 -0800 Subject: [PATCH 03/42] IDL threads --- src/caffe/layers/base_data_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index cb68035a61b..9e8cedaa350 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -13,7 +13,7 @@ namespace caffe { template size_t BasePrefetchingDataLayer::threads(const LayerParameter& param) { - if (param.has_image_data_param()) { + if (param.type().compare("ImageData") == 0 && param.has_image_data_param()) { return param.image_data_param().threads(); } From f11c170913853c009409aefbb6a5334c44d76d44 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sat, 24 Feb 2018 21:19:29 -0800 Subject: [PATCH 04/42] Squashed commit of the following: commit c9bf5d6649d6204837d961ba83d020d690803c19 Author: Sergei Nikolaev Date: Sat Feb 24 21:16:01 2018 -0800 Post-merge 5 commit e0edbab92131d05dc77641afb9dac1861385a323 Author: Sergei Nikolaev Date: Sat Feb 24 20:54:49 2018 -0800 Post-merge 4 commit e34ea8fb286c8f27ca5e123c524bc77f40985b85 Author: Sergei Nikolaev Date: Sat Feb 24 14:33:10 2018 -0800 Post-merge 3 commit 20eb63531f9f349d88ed1f1b11724ac7611b68b4 Author: Sergei Nikolaev Date: Sat Feb 24 14:19:20 2018 -0800 Post-merge 3 commit 27418028e313f16ab5254db2e8e1345acfe2330e Author: Sergei Nikolaev Date: Sat Feb 24 14:05:13 2018 -0800 Post-merge 2 commit 732e2e9ab83250c673ef793753b218d975bddd96 Author: Sergei Nikolaev Date: Thu Feb 22 19:25:50 2018 -0800 WIP commit e161d0cdcc6086f87097c6a1d4bb5493c9656004 Author: Sergei Nikolaev Date: Thu Feb 22 00:20:16 2018 -0800 Post-merge 1 commit b0fa2d525e1912f664027548f6fa65d38cdc6b0e Author: Sergei Nikolaev Date: Wed Feb 21 22:54:25 2018 -0800 446 merged commit 86d84ff2cb0cec4a230f4fd770393c467e6ac698 Author: Sergei Nikolaev Date: Wed Feb 21 18:12:47 2018 -0800 WIP commit 82dd1470db712791610b460f8f9971505f097b96 Author: Sergei Nikolaev Date: Tue Feb 20 23:06:18 2018 -0800 WIP commit 9f7714cb7acc722164718df20c9b905057b89e60 Author: Sergei Nikolaev Date: Mon Feb 12 18:58:53 2018 -0800 IDL threads commit 40def9c0a8d22e394776e03c05e292321367f16e Merge: 68156bb6e 2c6adf246 Author: Sergei Nikolaev Date: Mon Feb 12 14:00:58 2018 -0800 Merge branch 'caffe-0.17' into caffe-0.17-rnn commit 68156bb6e68fd2ccf42c6e4b24f286a39f29522e Author: Sergei Nikolaev Date: Thu Feb 8 14:58:49 2018 -0800 wip commit f46a188344a8be6bd6172669c26b6e235b642a19 Author: Sergei Nikolaev Date: Mon Feb 5 18:47:04 2018 -0800 wip commit 07022d6390d4ae620324a5ef9437f01714669d36 Author: Sergei Nikolaev Date: Thu Feb 1 19:26:41 2018 -0800 wip commit 70d4d7b08a29f13196ea9f5123eaae365a6dcfa2 Author: Sergei Nikolaev Date: Wed Jan 31 19:27:33 2018 -0800 Headers commit 332017e5103b918764587a4c3563982a4fcc7450 Author: Sergei Nikolaev Date: Wed Jan 31 14:42:54 2018 -0800 Headers --- CMakeLists.txt | 2 +- LICENSE | 6 + Makefile | 6 +- cmake/Dependencies.cmake | 2 +- data/ILSVRC2016/README.md | 29 + data/ILSVRC2016/create_data.sh | 30 + data/ILSVRC2016/create_list.py | 109 + .../labelmap_ilsvrc_clsloc.prototxt | 5005 +++++++++++++++++ data/ILSVRC2016/labelmap_ilsvrc_det.prototxt | 1005 ++++ data/VOC0712/coco_voc_map.txt | 21 + data/VOC0712/create_data.sh | 25 + data/VOC0712/create_list.sh | 51 + data/VOC0712/labelmap_voc.prototxt | 105 + data/coco/README.md | 38 + data/coco/create_data.sh | 27 + data/coco/create_list.py | 125 + data/coco/labelmap_coco.prototxt | 405 ++ data/coco/labels.txt | 80 + examples/02-fine-tuning.ipynb | 2 +- examples/detection.ipynb | 2 +- examples/ssd/model_libs.py | 933 +++ examples/ssd/plot_detections.py | 124 + examples/ssd/score_ssd_coco.py | 558 ++ examples/ssd/score_ssd_pascal.py | 558 ++ examples/ssd/ssd_coco.py | 576 ++ examples/ssd/ssd_detect.cpp | 346 ++ examples/ssd/ssd_detect.py | 149 + examples/ssd/ssd_ilsvrc.py | 575 ++ examples/ssd/ssd_pascal.py | 575 ++ examples/ssd/ssd_pascal_orig.py | 582 ++ examples/ssd/ssd_pascal_resnet.py | 522 ++ examples/ssd/ssd_pascal_speed.py | 556 ++ examples/ssd/ssd_pascal_video.py | 293 + examples/ssd/ssd_pascal_webcam.py | 296 + examples/ssd/ssd_pascal_zf.py | 580 ++ include/caffe/common.hpp | 23 +- include/caffe/data_reader.hpp | 37 +- include/caffe/data_transformer.hpp | 463 +- include/caffe/layer.hpp | 17 +- include/caffe/layers/accuracy_layer.hpp | 23 +- include/caffe/layers/annotated_data_layer.hpp | 51 + include/caffe/layers/base_data_layer.hpp | 18 +- include/caffe/layers/cudnn_conv_layer.hpp | 18 +- include/caffe/layers/cudnn_deconv_layer.hpp | 69 + include/caffe/layers/data_layer.hpp | 8 +- .../caffe/layers/detection_evaluate_layer.hpp | 73 + .../caffe/layers/detection_output_layer.hpp | 120 + include/caffe/layers/loss_layer.hpp | 12 + include/caffe/layers/lstm_layer.hpp | 149 + include/caffe/layers/memory_data_layer.hpp | 4 +- include/caffe/layers/multibox_loss_layer.hpp | 114 + include/caffe/layers/normalize_layer.hpp | 53 + include/caffe/layers/permute_layer.hpp | 61 + include/caffe/layers/pooling_layer.hpp | 4 +- include/caffe/layers/prior_box_layer.hpp | 86 + include/caffe/layers/recurrent_layer.hpp | 181 + include/caffe/layers/rnn_layer.hpp | 45 + include/caffe/layers/smooth_L1_loss_layer.hpp | 70 + include/caffe/layers/video_data_layer.hpp | 56 + include/caffe/net.hpp | 16 +- include/caffe/parallel.hpp | 2 +- include/caffe/solver.hpp | 1 + .../caffe/test/test_gradient_check_util.hpp | 15 +- include/caffe/type.hpp | 5 + include/caffe/util/bbox_util.hpp | 518 ++ include/caffe/util/cudnn.hpp | 16 + include/caffe/util/db.hpp | 1 + include/caffe/util/db_leveldb.hpp | 4 + include/caffe/util/db_lmdb.hpp | 3 + include/caffe/util/gpu_memory.hpp | 15 + include/caffe/util/im_transforms.hpp | 86 + include/caffe/util/io.hpp | 94 + include/caffe/util/sampler.hpp | 39 + .../VGGNet/coco/SSD_300x300/deploy.prototxt | 1629 ++++++ .../VGGNet/coco/SSD_300x300/solver.prototxt | 33 + models/VGGNet/coco/SSD_300x300/test.prototxt | 1671 ++++++ models/VGGNet/coco/SSD_300x300/train.prototxt | 1733 ++++++ python/caffe/net_spec.py | 22 +- scripts/create_annoset.py | 167 + src/caffe/common.cpp | 15 +- src/caffe/data_reader.cpp | 75 +- src/caffe/data_transformer.cpp | 1440 ++++- src/caffe/data_transformer.cu | 8 +- src/caffe/layer.cpp | 5 +- src/caffe/layers/accuracy_layer.cu | 150 + src/caffe/layers/annotated_data_layer.cpp | 337 ++ src/caffe/layers/base_data_layer.cpp | 53 +- src/caffe/layers/concat_layer.cu | 6 +- src/caffe/layers/cudnn_conv_layer.cpp | 72 +- src/caffe/layers/cudnn_conv_layer.cu | 12 +- src/caffe/layers/cudnn_deconv_layer.cpp | 328 ++ src/caffe/layers/cudnn_deconv_layer.cu | 138 + src/caffe/layers/data_layer.cpp | 30 +- src/caffe/layers/detection_evaluate_layer.cpp | 250 + src/caffe/layers/detection_output_layer.cpp | 470 ++ src/caffe/layers/detection_output_layer.cu | 303 + src/caffe/layers/dropout_layer.cu | 21 +- src/caffe/layers/embed_layer.cu | 29 +- src/caffe/layers/hdf5_data_layer.cpp | 4 +- src/caffe/layers/image_data_layer.cpp | 23 +- src/caffe/layers/inner_product_layer.cpp | 2 +- src/caffe/layers/loss_layer.cpp | 31 + src/caffe/layers/lstm_layer.cpp | 244 + src/caffe/layers/lstm_unit_layer.cpp | 126 + src/caffe/layers/lstm_unit_layer.cu | 162 + src/caffe/layers/multibox_loss_layer.cpp | 375 ++ src/caffe/layers/normalize_layer.cpp | 229 + src/caffe/layers/normalize_layer.cu | 220 + src/caffe/layers/permute_layer.cpp | 139 + src/caffe/layers/permute_layer.cu | 78 + src/caffe/layers/pooling_layer.cpp | 2 +- src/caffe/layers/pooling_layer.cu | 19 +- src/caffe/layers/prior_box_layer.cpp | 224 + src/caffe/layers/recurrent_layer.cpp | 297 + src/caffe/layers/recurrent_layer.cu | 44 + src/caffe/layers/reduction_layer.cpp | 6 +- src/caffe/layers/reshape_layer.cpp | 2 +- src/caffe/layers/rnn_layer.cpp | 236 + src/caffe/layers/scale_layer.cpp | 4 +- src/caffe/layers/slice_layer.cu | 6 +- src/caffe/layers/smooth_L1_loss_layer.cpp | 104 + src/caffe/layers/smooth_L1_loss_layer.cu | 96 + src/caffe/layers/video_data_layer.cpp | 157 + src/caffe/net.cpp | 19 +- src/caffe/proto/caffe.proto | 567 +- src/caffe/solver.cpp | 143 +- src/caffe/tensor.cpp | 12 +- src/caffe/test/test_common.cpp | 2 + src/caffe/test/test_convolution_layer.cpp | 4 +- src/caffe/test/test_data_transformer.cpp | 50 +- src/caffe/test/test_lstm_layer.cpp | 324 ++ src/caffe/test/test_neuron_layer.cpp | 4 +- src/caffe/test/test_rnn_layer.cpp | 241 + src/caffe/test/test_stochastic_pooling.cpp | 21 +- src/caffe/util/bbox_util.cpp | 2304 ++++++++ src/caffe/util/bbox_util.cu | 669 +++ src/caffe/util/blocking_queue.cpp | 1 + src/caffe/util/gpu_memory.cpp | 12 + src/caffe/util/im_transforms.cpp | 729 +++ src/caffe/util/io.cpp | 553 +- src/caffe/util/math_functions.cu | 14 +- src/caffe/util/math_functions2.cu | 7 + src/caffe/util/sampler.cpp | 167 + tools/caffe.cpp | 188 + tools/convert_annoset.cpp | 203 + tools/create_label_map.cpp | 65 + tools/get_image_size.cpp | 109 + 147 files changed, 34460 insertions(+), 643 deletions(-) create mode 100644 data/ILSVRC2016/README.md create mode 100644 data/ILSVRC2016/create_data.sh create mode 100644 data/ILSVRC2016/create_list.py create mode 100644 data/ILSVRC2016/labelmap_ilsvrc_clsloc.prototxt create mode 100644 data/ILSVRC2016/labelmap_ilsvrc_det.prototxt create mode 100644 data/VOC0712/coco_voc_map.txt create mode 100644 data/VOC0712/create_data.sh create mode 100644 data/VOC0712/create_list.sh create mode 100644 data/VOC0712/labelmap_voc.prototxt create mode 100644 data/coco/README.md create mode 100644 data/coco/create_data.sh create mode 100644 data/coco/create_list.py create mode 100644 data/coco/labelmap_coco.prototxt create mode 100644 data/coco/labels.txt create mode 100644 examples/ssd/model_libs.py create mode 100644 examples/ssd/plot_detections.py create mode 100644 examples/ssd/score_ssd_coco.py create mode 100644 examples/ssd/score_ssd_pascal.py create mode 100644 examples/ssd/ssd_coco.py create mode 100644 examples/ssd/ssd_detect.cpp create mode 100644 examples/ssd/ssd_detect.py create mode 100644 examples/ssd/ssd_ilsvrc.py create mode 100644 examples/ssd/ssd_pascal.py create mode 100644 examples/ssd/ssd_pascal_orig.py create mode 100644 examples/ssd/ssd_pascal_resnet.py create mode 100644 examples/ssd/ssd_pascal_speed.py create mode 100644 examples/ssd/ssd_pascal_video.py create mode 100644 examples/ssd/ssd_pascal_webcam.py create mode 100644 examples/ssd/ssd_pascal_zf.py create mode 100644 include/caffe/layers/annotated_data_layer.hpp create mode 100644 include/caffe/layers/cudnn_deconv_layer.hpp create mode 100644 include/caffe/layers/detection_evaluate_layer.hpp create mode 100644 include/caffe/layers/detection_output_layer.hpp create mode 100644 include/caffe/layers/lstm_layer.hpp create mode 100644 include/caffe/layers/multibox_loss_layer.hpp create mode 100644 include/caffe/layers/normalize_layer.hpp create mode 100644 include/caffe/layers/permute_layer.hpp create mode 100644 include/caffe/layers/prior_box_layer.hpp create mode 100644 include/caffe/layers/recurrent_layer.hpp create mode 100644 include/caffe/layers/rnn_layer.hpp create mode 100644 include/caffe/layers/smooth_L1_loss_layer.hpp create mode 100644 include/caffe/layers/video_data_layer.hpp create mode 100644 include/caffe/util/bbox_util.hpp create mode 100644 include/caffe/util/im_transforms.hpp create mode 100644 include/caffe/util/sampler.hpp create mode 100644 models/VGGNet/coco/SSD_300x300/deploy.prototxt create mode 100644 models/VGGNet/coco/SSD_300x300/solver.prototxt create mode 100644 models/VGGNet/coco/SSD_300x300/test.prototxt create mode 100644 models/VGGNet/coco/SSD_300x300/train.prototxt create mode 100644 scripts/create_annoset.py create mode 100644 src/caffe/layers/accuracy_layer.cu create mode 100644 src/caffe/layers/annotated_data_layer.cpp create mode 100644 src/caffe/layers/cudnn_deconv_layer.cpp create mode 100644 src/caffe/layers/cudnn_deconv_layer.cu create mode 100644 src/caffe/layers/detection_evaluate_layer.cpp create mode 100644 src/caffe/layers/detection_output_layer.cpp create mode 100644 src/caffe/layers/detection_output_layer.cu create mode 100644 src/caffe/layers/lstm_layer.cpp create mode 100644 src/caffe/layers/lstm_unit_layer.cpp create mode 100644 src/caffe/layers/lstm_unit_layer.cu create mode 100644 src/caffe/layers/multibox_loss_layer.cpp create mode 100644 src/caffe/layers/normalize_layer.cpp create mode 100644 src/caffe/layers/normalize_layer.cu create mode 100644 src/caffe/layers/permute_layer.cpp create mode 100644 src/caffe/layers/permute_layer.cu create mode 100644 src/caffe/layers/prior_box_layer.cpp create mode 100644 src/caffe/layers/recurrent_layer.cpp create mode 100644 src/caffe/layers/recurrent_layer.cu create mode 100644 src/caffe/layers/rnn_layer.cpp create mode 100644 src/caffe/layers/smooth_L1_loss_layer.cpp create mode 100644 src/caffe/layers/smooth_L1_loss_layer.cu create mode 100644 src/caffe/layers/video_data_layer.cpp create mode 100644 src/caffe/test/test_lstm_layer.cpp create mode 100644 src/caffe/test/test_rnn_layer.cpp create mode 100644 src/caffe/util/bbox_util.cpp create mode 100644 src/caffe/util/bbox_util.cu create mode 100644 src/caffe/util/im_transforms.cpp create mode 100644 src/caffe/util/sampler.cpp create mode 100644 tools/convert_annoset.cpp create mode 100644 tools/create_label_map.cpp create mode 100644 tools/get_image_size.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b9372db4ca..64aef17340e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ endif() project(Caffe C CXX) # ---[ Caffe version -set(CAFFE_TARGET_VERSION "0.16.5") +set(CAFFE_TARGET_VERSION "0.16.6") set(CAFFE_TARGET_SOVERSION "0.16") add_definitions(-DCAFFE_VERSION=${CAFFE_TARGET_VERSION}) diff --git a/LICENSE b/LICENSE index d69d16f5bc7..6b6633dfc1f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,11 @@ COPYRIGHT +All changes from Caffe SSD (https://github.com/weiliu89/caffe/tree/ssd) +Copyright (c) 2015, 2016 Wei Liu (UNC Chapel Hill), Dragomir Anguelov (Zoox), +Dumitru Erhan (Google), Christian Szegedy (Google), Scott Reed (UMich Ann Arbor), +Cheng-Yang Fu (UNC Chapel Hill), Alexander C. Berg (UNC Chapel Hill). +All rights reserved. + All contributions by the University of California: Copyright (c) 2014, 2015, The Regents of the University of California (Regents) All rights reserved. diff --git a/Makefile b/Makefile index a568769d4d3..b5d72c4208b 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ LIB_BUILD_DIR := $(BUILD_DIR)/lib STATIC_NAME := $(LIB_BUILD_DIR)/lib$(LIBRARY_NAME).a DYNAMIC_VERSION_MAJOR := 0 DYNAMIC_VERSION_MINOR := 16 -DYNAMIC_VERSION_REVISION := 5 +DYNAMIC_VERSION_REVISION := 6 DYNAMIC_NAME_SHORT := lib$(LIBRARY_NAME).so DYNAMIC_SONAME_SHORT := $(DYNAMIC_NAME_SHORT).$(DYNAMIC_VERSION_MAJOR).$(DYNAMIC_VERSION_MINOR) DYNAMIC_VERSIONED_NAME_SHORT := $(DYNAMIC_SONAME_SHORT).$(DYNAMIC_VERSION_REVISION) @@ -216,7 +216,7 @@ ifeq ($(USE_OPENCV), 1) LIBRARIES += opencv_core opencv_highgui opencv_imgproc ifeq ($(OPENCV_VERSION), 3) - LIBRARIES += opencv_imgcodecs + LIBRARIES += opencv_imgcodecs opencv_videoio endif endif @@ -292,7 +292,7 @@ ifeq ($(LINUX), 1) endif # boost::thread is reasonably called boost_thread (compare OS X) # We will also explicitly add stdc++ to the link target. - LIBRARIES += boost_thread stdc++ + LIBRARIES += boost_thread boost_regex stdc++ VERSIONFLAGS += -Wl,-soname,$(DYNAMIC_SONAME_SHORT) -Wl,-rpath,$(ORIGIN)/../lib endif diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 386333fd20e..affbde8f316 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -69,7 +69,7 @@ endif() # ---[ OpenCV find_package(OpenCV QUIET COMPONENTS imgcodecs) if(OPENCV_IMGCODECS_FOUND) - find_package(OpenCV REQUIRED COMPONENTS core imgcodecs imgproc) + find_package(OpenCV REQUIRED COMPONENTS core imgcodecs highgui imgproc videoio) message(STATUS "Found OpenCV 3.x: ${OpenCV_CONFIG_PATH}") else() find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc) diff --git a/data/ILSVRC2016/README.md b/data/ILSVRC2016/README.md new file mode 100644 index 00000000000..c4e5a6fc5a7 --- /dev/null +++ b/data/ILSVRC2016/README.md @@ -0,0 +1,29 @@ +### Preparation +#### ILSVRC2016 +We encourage you to register [ILSVRC2016](http://image-net.org/challenges/LSVRC/2016) and download the DET dataset. By default, we assume the data is stored in `$HOME/data/ILSVRC` and will call it `$ILSVRC_ROOT`. + +#### ILSVRC2015 +If you choose to use ILSVRC2015 DET dataset, here are a few noticeable steps before running the following scripts: + +1. There are a few problematic images. You can download the fixed ones [here](http://www.cs.unc.edu/~wliu/projects/SSD/ILSVRC2015_DET_fix.tar.gz). + +2. You should download the [val1/val2 split](http://www.cs.unc.edu/~wliu/projects/SSD/ILSVRC2015_DET_val1_val2.tar.gz), courtesy of [Ross Girshick](http://people.eecs.berkeley.edu/~rbg), and put it in `$ILSVRC_ROOT/ImageSets/DET`. + +### Remove an invalid file +Find the invalid image file `Data/DET/val/ILSVRC2013_val_00004542.JPEG`, and remove it. + +### Create the LMDB file. +After you have downloaded the dataset, we can create the lmdb files. + + ```Shell + cd $CAFFE_ROOT + # Create the trainval1.txt, val2.txt, val2_name_size.txt, test.txt and test_name_size.txt in data/ILSVRC2016/ + python data/ILSVRC2016/create_list.py + # You can modify the parameters in create_data.sh if needed. + # It will create lmdb files for trainval1, val2 and test with encoded original image: + # - $HOME/data/ILSVRC/lmdb/DET/ILSVRC2016_trainval1_lmdb + # - $HOME/data/ILSVRC/lmdb/DET/ILSVRC2016_val2_lmdb + # - $HOME/data/ILSVRC/lmdb/DET/ILSVRC2016_test_lmdb + # and make soft links at examples/ILSVRC2016/ + ./data/ILSVRC2016/create_data.sh + ``` diff --git a/data/ILSVRC2016/create_data.sh b/data/ILSVRC2016/create_data.sh new file mode 100644 index 00000000000..688db535824 --- /dev/null +++ b/data/ILSVRC2016/create_data.sh @@ -0,0 +1,30 @@ +cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd ) +root_dir=$cur_dir/../.. + +cd $root_dir + +redo=false +data_root_dir="$HOME/data/ILSVRC" +dataset_name="ILSVRC2016" +mapfile="$root_dir/data/$dataset_name/labelmap_ilsvrc_det.prototxt" +db="lmdb" +min_dim=0 +max_dim=0 +width=0 +height=0 + +extra_cmd="--encode-type=jpg --encoded" +if $redo +then + extra_cmd="$extra_cmd --redo" +fi + +for dataset in test +do + python $root_dir/scripts/create_annoset.py --anno-type="classification" --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$dataset".txt" $data_root_dir/$db/DET/$dataset_name"_"$dataset"_"$db examples/$dataset_name 2>&1 | tee $root_dir/data/$dataset_name/$dataset.log +done + +for dataset in val2 trainval1 +do + python $root_dir/scripts/create_annoset.py --anno-type="detection" --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$dataset".txt" $data_root_dir/$db/DET/$dataset_name"_"$dataset"_"$db examples/$dataset_name 2>&1 | tee $root_dir/data/$dataset_name/$dataset.log +done diff --git a/data/ILSVRC2016/create_list.py b/data/ILSVRC2016/create_list.py new file mode 100644 index 00000000000..8e6dce2b8fc --- /dev/null +++ b/data/ILSVRC2016/create_list.py @@ -0,0 +1,109 @@ +import argparse +import os +from random import shuffle +import shutil +import subprocess +import sys + +HOMEDIR = os.path.expanduser("~") +CURDIR = os.path.dirname(os.path.realpath(__file__)) + +# If true, re-create all list files. +redo = False +# The root directory which holds all information of the dataset. +data_dir = "{}/data/ILSVRC".format(HOMEDIR) +# The directory name which holds the image sets. +imgset_dir = "ImageSets/DET" +# The direcotry which contains the images. +img_dir = "Data/DET" +img_ext = "JPEG" +# The directory which contains the annotations. +anno_dir = "Annotations/DET" +anno_ext = "xml" + +train_list_file = "{}/trainval1.txt".format(CURDIR) +val_list_file = "{}/val2.txt".format(CURDIR) +val_name_size_file = "{}/val2_name_size.txt".format(CURDIR) +test_list_file = "{}/test.txt".format(CURDIR) +test_name_size_file = "{}/test_name_size.txt".format(CURDIR) + +# Create training set. +# We follow Ross Girschick's split in R-CNN. +if redo or not os.path.exists(train_list_file): + datasets = ["train", "val1"] + img_files = [] + anno_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n").split(" ")[0] + subset = name.split("/")[0].split("_")[1] + anno_file = "{}/{}/{}.{}".format(anno_dir, subset, name, anno_ext) + # Ignore image if it does not have annotation. These are the negative images in ILSVRC. + if not os.path.exists("{}/{}".format(data_dir, anno_file)): + continue + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)) + img_files.append(img_file) + anno_files.append(anno_file) + # Shuffle the images. + idx = [i for i in xrange(len(img_files))] + shuffle(idx) + with open(train_list_file, "w") as f: + for i in idx: + f.write("{} {}\n".format(img_files[i], anno_files[i])) + +if redo or not os.path.exists(val_list_file): + datasets = ["val2"] + subset = "val" + img_files = [] + anno_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n").split(" ")[0] + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)) + anno_file = "{}/{}/{}.{}".format(anno_dir, subset, name, anno_ext) + assert os.path.exists("{}/{}".format(data_dir, anno_file)) + img_files.append(img_file) + anno_files.append(anno_file) + with open(val_list_file, "w") as f: + for i in xrange(len(img_files)): + f.write("{} {}\n".format(img_files[i], anno_files[i])) + +if redo or not os.path.exists(val_name_size_file): + dataset = 'val2' + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + cmd = "{}/../../build/tools/get_image_size --name_id_file={} {} {} {}".format( + CURDIR, imgset_file, data_dir, val_list_file, val_name_size_file) + print cmd + process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) + output = process.communicate()[0] + +if redo or not os.path.exists(test_list_file): + datasets = ["test"] + subset = "test" + img_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n").split(" ")[0] + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)) + img_files.append(img_file) + with open(test_list_file, "w") as f: + for i in xrange(len(img_files)): + f.write("{} 0\n".format(img_files[i])) + +if redo or not os.path.exists(test_name_size_file): + dataset = 'test' + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + cmd = "{}/../../build/tools/get_image_size --name_id_file={} {} {} {}".format( + CURDIR, imgset_file, data_dir, test_list_file, test_name_size_file) + print cmd + process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) + output = process.communicate()[0] diff --git a/data/ILSVRC2016/labelmap_ilsvrc_clsloc.prototxt b/data/ILSVRC2016/labelmap_ilsvrc_clsloc.prototxt new file mode 100644 index 00000000000..1a27998cd53 --- /dev/null +++ b/data/ILSVRC2016/labelmap_ilsvrc_clsloc.prototxt @@ -0,0 +1,5005 @@ +item { + name: "none_of_the_above" + label: 0 + display_name: "background" +} +item { + name: "n02119789" + label: 1 + display_name: "kit_fox" +} +item { + name: "n02100735" + label: 2 + display_name: "English_setter" +} +item { + name: "n02110185" + label: 3 + display_name: "Siberian_husky" +} +item { + name: "n02096294" + label: 4 + display_name: "Australian_terrier" +} +item { + name: "n02102040" + label: 5 + display_name: "English_springer" +} +item { + name: "n02066245" + label: 6 + display_name: "grey_whale" +} +item { + name: "n02509815" + label: 7 + display_name: "lesser_panda" +} +item { + name: "n02124075" + label: 8 + display_name: "Egyptian_cat" +} +item { + name: "n02417914" + label: 9 + display_name: "ibex" +} +item { + name: "n02123394" + label: 10 + display_name: "Persian_cat" +} +item { + name: "n02125311" + label: 11 + display_name: "cougar" +} +item { + name: "n02423022" + label: 12 + display_name: "gazelle" +} +item { + name: "n02346627" + label: 13 + display_name: "porcupine" +} +item { + name: "n02077923" + label: 14 + display_name: "sea_lion" +} +item { + name: "n02110063" + label: 15 + display_name: "malamute" +} +item { + name: "n02447366" + label: 16 + display_name: "badger" +} +item { + name: "n02109047" + label: 17 + display_name: "Great_Dane" +} +item { + name: "n02089867" + label: 18 + display_name: "Walker_hound" +} +item { + name: "n02102177" + label: 19 + display_name: "Welsh_springer_spaniel" +} +item { + name: "n02091134" + label: 20 + display_name: "whippet" +} +item { + name: "n02092002" + label: 21 + display_name: "Scottish_deerhound" +} +item { + name: "n02071294" + label: 22 + display_name: "killer_whale" +} +item { + name: "n02442845" + label: 23 + display_name: "mink" +} +item { + name: "n02504458" + label: 24 + display_name: "African_elephant" +} +item { + name: "n02092339" + label: 25 + display_name: "Weimaraner" +} +item { + name: "n02098105" + label: 26 + display_name: "soft-coated_wheaten_terrier" +} +item { + name: "n02096437" + label: 27 + display_name: "Dandie_Dinmont" +} +item { + name: "n02114712" + label: 28 + display_name: "red_wolf" +} +item { + name: "n02105641" + label: 29 + display_name: "Old_English_sheepdog" +} +item { + name: "n02128925" + label: 30 + display_name: "jaguar" +} +item { + name: "n02091635" + label: 31 + display_name: "otterhound" +} +item { + name: "n02088466" + label: 32 + display_name: "bloodhound" +} +item { + name: "n02096051" + label: 33 + display_name: "Airedale" +} +item { + name: "n02117135" + label: 34 + display_name: "hyena" +} +item { + name: "n02138441" + label: 35 + display_name: "meerkat" +} +item { + name: "n02097130" + label: 36 + display_name: "giant_schnauzer" +} +item { + name: "n02493509" + label: 37 + display_name: "titi" +} +item { + name: "n02457408" + label: 38 + display_name: "three-toed_sloth" +} +item { + name: "n02389026" + label: 39 + display_name: "sorrel" +} +item { + name: "n02443484" + label: 40 + display_name: "black-footed_ferret" +} +item { + name: "n02110341" + label: 41 + display_name: "dalmatian" +} +item { + name: "n02089078" + label: 42 + display_name: "black-and-tan_coonhound" +} +item { + name: "n02086910" + label: 43 + display_name: "papillon" +} +item { + name: "n02445715" + label: 44 + display_name: "skunk" +} +item { + name: "n02093256" + label: 45 + display_name: "Staffordshire_bullterrier" +} +item { + name: "n02113978" + label: 46 + display_name: "Mexican_hairless" +} +item { + name: "n02106382" + label: 47 + display_name: "Bouvier_des_Flandres" +} +item { + name: "n02441942" + label: 48 + display_name: "weasel" +} +item { + name: "n02113712" + label: 49 + display_name: "miniature_poodle" +} +item { + name: "n02113186" + label: 50 + display_name: "Cardigan" +} +item { + name: "n02105162" + label: 51 + display_name: "malinois" +} +item { + name: "n02415577" + label: 52 + display_name: "bighorn" +} +item { + name: "n02356798" + label: 53 + display_name: "fox_squirrel" +} +item { + name: "n02488702" + label: 54 + display_name: "colobus" +} +item { + name: "n02123159" + label: 55 + display_name: "tiger_cat" +} +item { + name: "n02098413" + label: 56 + display_name: "Lhasa" +} +item { + name: "n02422699" + label: 57 + display_name: "impala" +} +item { + name: "n02114855" + label: 58 + display_name: "coyote" +} +item { + name: "n02094433" + label: 59 + display_name: "Yorkshire_terrier" +} +item { + name: "n02111277" + label: 60 + display_name: "Newfoundland" +} +item { + name: "n02132136" + label: 61 + display_name: "brown_bear" +} +item { + name: "n02119022" + label: 62 + display_name: "red_fox" +} +item { + name: "n02091467" + label: 63 + display_name: "Norwegian_elkhound" +} +item { + name: "n02106550" + label: 64 + display_name: "Rottweiler" +} +item { + name: "n02422106" + label: 65 + display_name: "hartebeest" +} +item { + name: "n02091831" + label: 66 + display_name: "Saluki" +} +item { + name: "n02120505" + label: 67 + display_name: "grey_fox" +} +item { + name: "n02104365" + label: 68 + display_name: "schipperke" +} +item { + name: "n02086079" + label: 69 + display_name: "Pekinese" +} +item { + name: "n02112706" + label: 70 + display_name: "Brabancon_griffon" +} +item { + name: "n02098286" + label: 71 + display_name: "West_Highland_white_terrier" +} +item { + name: "n02095889" + label: 72 + display_name: "Sealyham_terrier" +} +item { + name: "n02484975" + label: 73 + display_name: "guenon" +} +item { + name: "n02137549" + label: 74 + display_name: "mongoose" +} +item { + name: "n02500267" + label: 75 + display_name: "indri" +} +item { + name: "n02129604" + label: 76 + display_name: "tiger" +} +item { + name: "n02090721" + label: 77 + display_name: "Irish_wolfhound" +} +item { + name: "n02396427" + label: 78 + display_name: "wild_boar" +} +item { + name: "n02108000" + label: 79 + display_name: "EntleBucher" +} +item { + name: "n02391049" + label: 80 + display_name: "zebra" +} +item { + name: "n02412080" + label: 81 + display_name: "ram" +} +item { + name: "n02108915" + label: 82 + display_name: "French_bulldog" +} +item { + name: "n02480495" + label: 83 + display_name: "orangutan" +} +item { + name: "n02110806" + label: 84 + display_name: "basenji" +} +item { + name: "n02128385" + label: 85 + display_name: "leopard" +} +item { + name: "n02107683" + label: 86 + display_name: "Bernese_mountain_dog" +} +item { + name: "n02085936" + label: 87 + display_name: "Maltese_dog" +} +item { + name: "n02094114" + label: 88 + display_name: "Norfolk_terrier" +} +item { + name: "n02087046" + label: 89 + display_name: "toy_terrier" +} +item { + name: "n02100583" + label: 90 + display_name: "vizsla" +} +item { + name: "n02096177" + label: 91 + display_name: "cairn" +} +item { + name: "n02494079" + label: 92 + display_name: "squirrel_monkey" +} +item { + name: "n02105056" + label: 93 + display_name: "groenendael" +} +item { + name: "n02101556" + label: 94 + display_name: "clumber" +} +item { + name: "n02123597" + label: 95 + display_name: "Siamese_cat" +} +item { + name: "n02481823" + label: 96 + display_name: "chimpanzee" +} +item { + name: "n02105505" + label: 97 + display_name: "komondor" +} +item { + name: "n02088094" + label: 98 + display_name: "Afghan_hound" +} +item { + name: "n02085782" + label: 99 + display_name: "Japanese_spaniel" +} +item { + name: "n02489166" + label: 100 + display_name: "proboscis_monkey" +} +item { + name: "n02364673" + label: 101 + display_name: "guinea_pig" +} +item { + name: "n02114548" + label: 102 + display_name: "white_wolf" +} +item { + name: "n02134084" + label: 103 + display_name: "ice_bear" +} +item { + name: "n02480855" + label: 104 + display_name: "gorilla" +} +item { + name: "n02090622" + label: 105 + display_name: "borzoi" +} +item { + name: "n02113624" + label: 106 + display_name: "toy_poodle" +} +item { + name: "n02093859" + label: 107 + display_name: "Kerry_blue_terrier" +} +item { + name: "n02403003" + label: 108 + display_name: "ox" +} +item { + name: "n02097298" + label: 109 + display_name: "Scotch_terrier" +} +item { + name: "n02108551" + label: 110 + display_name: "Tibetan_mastiff" +} +item { + name: "n02493793" + label: 111 + display_name: "spider_monkey" +} +item { + name: "n02107142" + label: 112 + display_name: "Doberman" +} +item { + name: "n02096585" + label: 113 + display_name: "Boston_bull" +} +item { + name: "n02107574" + label: 114 + display_name: "Greater_Swiss_Mountain_dog" +} +item { + name: "n02107908" + label: 115 + display_name: "Appenzeller" +} +item { + name: "n02086240" + label: 116 + display_name: "Shih-Tzu" +} +item { + name: "n02102973" + label: 117 + display_name: "Irish_water_spaniel" +} +item { + name: "n02112018" + label: 118 + display_name: "Pomeranian" +} +item { + name: "n02093647" + label: 119 + display_name: "Bedlington_terrier" +} +item { + name: "n02397096" + label: 120 + display_name: "warthog" +} +item { + name: "n02437312" + label: 121 + display_name: "Arabian_camel" +} +item { + name: "n02483708" + label: 122 + display_name: "siamang" +} +item { + name: "n02097047" + label: 123 + display_name: "miniature_schnauzer" +} +item { + name: "n02106030" + label: 124 + display_name: "collie" +} +item { + name: "n02099601" + label: 125 + display_name: "golden_retriever" +} +item { + name: "n02093991" + label: 126 + display_name: "Irish_terrier" +} +item { + name: "n02110627" + label: 127 + display_name: "affenpinscher" +} +item { + name: "n02106166" + label: 128 + display_name: "Border_collie" +} +item { + name: "n02326432" + label: 129 + display_name: "hare" +} +item { + name: "n02108089" + label: 130 + display_name: "boxer" +} +item { + name: "n02097658" + label: 131 + display_name: "silky_terrier" +} +item { + name: "n02088364" + label: 132 + display_name: "beagle" +} +item { + name: "n02111129" + label: 133 + display_name: "Leonberg" +} +item { + name: "n02100236" + label: 134 + display_name: "German_short-haired_pointer" +} +item { + name: "n02486261" + label: 135 + display_name: "patas" +} +item { + name: "n02115913" + label: 136 + display_name: "dhole" +} +item { + name: "n02486410" + label: 137 + display_name: "baboon" +} +item { + name: "n02487347" + label: 138 + display_name: "macaque" +} +item { + name: "n02099849" + label: 139 + display_name: "Chesapeake_Bay_retriever" +} +item { + name: "n02108422" + label: 140 + display_name: "bull_mastiff" +} +item { + name: "n02104029" + label: 141 + display_name: "kuvasz" +} +item { + name: "n02492035" + label: 142 + display_name: "capuchin" +} +item { + name: "n02110958" + label: 143 + display_name: "pug" +} +item { + name: "n02099429" + label: 144 + display_name: "curly-coated_retriever" +} +item { + name: "n02094258" + label: 145 + display_name: "Norwich_terrier" +} +item { + name: "n02099267" + label: 146 + display_name: "flat-coated_retriever" +} +item { + name: "n02395406" + label: 147 + display_name: "hog" +} +item { + name: "n02112350" + label: 148 + display_name: "keeshond" +} +item { + name: "n02109961" + label: 149 + display_name: "Eskimo_dog" +} +item { + name: "n02101388" + label: 150 + display_name: "Brittany_spaniel" +} +item { + name: "n02113799" + label: 151 + display_name: "standard_poodle" +} +item { + name: "n02095570" + label: 152 + display_name: "Lakeland_terrier" +} +item { + name: "n02128757" + label: 153 + display_name: "snow_leopard" +} +item { + name: "n02101006" + label: 154 + display_name: "Gordon_setter" +} +item { + name: "n02115641" + label: 155 + display_name: "dingo" +} +item { + name: "n02097209" + label: 156 + display_name: "standard_schnauzer" +} +item { + name: "n02342885" + label: 157 + display_name: "hamster" +} +item { + name: "n02097474" + label: 158 + display_name: "Tibetan_terrier" +} +item { + name: "n02120079" + label: 159 + display_name: "Arctic_fox" +} +item { + name: "n02095314" + label: 160 + display_name: "wire-haired_fox_terrier" +} +item { + name: "n02088238" + label: 161 + display_name: "basset" +} +item { + name: "n02408429" + label: 162 + display_name: "water_buffalo" +} +item { + name: "n02133161" + label: 163 + display_name: "American_black_bear" +} +item { + name: "n02328150" + label: 164 + display_name: "Angora" +} +item { + name: "n02410509" + label: 165 + display_name: "bison" +} +item { + name: "n02492660" + label: 166 + display_name: "howler_monkey" +} +item { + name: "n02398521" + label: 167 + display_name: "hippopotamus" +} +item { + name: "n02112137" + label: 168 + display_name: "chow" +} +item { + name: "n02510455" + label: 169 + display_name: "giant_panda" +} +item { + name: "n02093428" + label: 170 + display_name: "American_Staffordshire_terrier" +} +item { + name: "n02105855" + label: 171 + display_name: "Shetland_sheepdog" +} +item { + name: "n02111500" + label: 172 + display_name: "Great_Pyrenees" +} +item { + name: "n02085620" + label: 173 + display_name: "Chihuahua" +} +item { + name: "n02123045" + label: 174 + display_name: "tabby" +} +item { + name: "n02490219" + label: 175 + display_name: "marmoset" +} +item { + name: "n02099712" + label: 176 + display_name: "Labrador_retriever" +} +item { + name: "n02109525" + label: 177 + display_name: "Saint_Bernard" +} +item { + name: "n02454379" + label: 178 + display_name: "armadillo" +} +item { + name: "n02111889" + label: 179 + display_name: "Samoyed" +} +item { + name: "n02088632" + label: 180 + display_name: "bluetick" +} +item { + name: "n02090379" + label: 181 + display_name: "redbone" +} +item { + name: "n02443114" + label: 182 + display_name: "polecat" +} +item { + name: "n02361337" + label: 183 + display_name: "marmot" +} +item { + name: "n02105412" + label: 184 + display_name: "kelpie" +} +item { + name: "n02483362" + label: 185 + display_name: "gibbon" +} +item { + name: "n02437616" + label: 186 + display_name: "llama" +} +item { + name: "n02107312" + label: 187 + display_name: "miniature_pinscher" +} +item { + name: "n02325366" + label: 188 + display_name: "wood_rabbit" +} +item { + name: "n02091032" + label: 189 + display_name: "Italian_greyhound" +} +item { + name: "n02129165" + label: 190 + display_name: "lion" +} +item { + name: "n02102318" + label: 191 + display_name: "cocker_spaniel" +} +item { + name: "n02100877" + label: 192 + display_name: "Irish_setter" +} +item { + name: "n02074367" + label: 193 + display_name: "dugong" +} +item { + name: "n02504013" + label: 194 + display_name: "Indian_elephant" +} +item { + name: "n02363005" + label: 195 + display_name: "beaver" +} +item { + name: "n02102480" + label: 196 + display_name: "Sussex_spaniel" +} +item { + name: "n02113023" + label: 197 + display_name: "Pembroke" +} +item { + name: "n02086646" + label: 198 + display_name: "Blenheim_spaniel" +} +item { + name: "n02497673" + label: 199 + display_name: "Madagascar_cat" +} +item { + name: "n02087394" + label: 200 + display_name: "Rhodesian_ridgeback" +} +item { + name: "n02127052" + label: 201 + display_name: "lynx" +} +item { + name: "n02116738" + label: 202 + display_name: "African_hunting_dog" +} +item { + name: "n02488291" + label: 203 + display_name: "langur" +} +item { + name: "n02091244" + label: 204 + display_name: "Ibizan_hound" +} +item { + name: "n02114367" + label: 205 + display_name: "timber_wolf" +} +item { + name: "n02130308" + label: 206 + display_name: "cheetah" +} +item { + name: "n02089973" + label: 207 + display_name: "English_foxhound" +} +item { + name: "n02105251" + label: 208 + display_name: "briard" +} +item { + name: "n02134418" + label: 209 + display_name: "sloth_bear" +} +item { + name: "n02093754" + label: 210 + display_name: "Border_terrier" +} +item { + name: "n02106662" + label: 211 + display_name: "German_shepherd" +} +item { + name: "n02444819" + label: 212 + display_name: "otter" +} +item { + name: "n01882714" + label: 213 + display_name: "koala" +} +item { + name: "n01871265" + label: 214 + display_name: "tusker" +} +item { + name: "n01872401" + label: 215 + display_name: "echidna" +} +item { + name: "n01877812" + label: 216 + display_name: "wallaby" +} +item { + name: "n01873310" + label: 217 + display_name: "platypus" +} +item { + name: "n01883070" + label: 218 + display_name: "wombat" +} +item { + name: "n04086273" + label: 219 + display_name: "revolver" +} +item { + name: "n04507155" + label: 220 + display_name: "umbrella" +} +item { + name: "n04147183" + label: 221 + display_name: "schooner" +} +item { + name: "n04254680" + label: 222 + display_name: "soccer_ball" +} +item { + name: "n02672831" + label: 223 + display_name: "accordion" +} +item { + name: "n02219486" + label: 224 + display_name: "ant" +} +item { + name: "n02317335" + label: 225 + display_name: "starfish" +} +item { + name: "n01968897" + label: 226 + display_name: "chambered_nautilus" +} +item { + name: "n03452741" + label: 227 + display_name: "grand_piano" +} +item { + name: "n03642806" + label: 228 + display_name: "laptop" +} +item { + name: "n07745940" + label: 229 + display_name: "strawberry" +} +item { + name: "n02690373" + label: 230 + display_name: "airliner" +} +item { + name: "n04552348" + label: 231 + display_name: "warplane" +} +item { + name: "n02692877" + label: 232 + display_name: "airship" +} +item { + name: "n02782093" + label: 233 + display_name: "balloon" +} +item { + name: "n04266014" + label: 234 + display_name: "space_shuttle" +} +item { + name: "n03344393" + label: 235 + display_name: "fireboat" +} +item { + name: "n03447447" + label: 236 + display_name: "gondola" +} +item { + name: "n04273569" + label: 237 + display_name: "speedboat" +} +item { + name: "n03662601" + label: 238 + display_name: "lifeboat" +} +item { + name: "n02951358" + label: 239 + display_name: "canoe" +} +item { + name: "n04612504" + label: 240 + display_name: "yawl" +} +item { + name: "n02981792" + label: 241 + display_name: "catamaran" +} +item { + name: "n04483307" + label: 242 + display_name: "trimaran" +} +item { + name: "n03095699" + label: 243 + display_name: "container_ship" +} +item { + name: "n03673027" + label: 244 + display_name: "liner" +} +item { + name: "n03947888" + label: 245 + display_name: "pirate" +} +item { + name: "n02687172" + label: 246 + display_name: "aircraft_carrier" +} +item { + name: "n04347754" + label: 247 + display_name: "submarine" +} +item { + name: "n04606251" + label: 248 + display_name: "wreck" +} +item { + name: "n03478589" + label: 249 + display_name: "half_track" +} +item { + name: "n04389033" + label: 250 + display_name: "tank" +} +item { + name: "n03773504" + label: 251 + display_name: "missile" +} +item { + name: "n02860847" + label: 252 + display_name: "bobsled" +} +item { + name: "n03218198" + label: 253 + display_name: "dogsled" +} +item { + name: "n02835271" + label: 254 + display_name: "bicycle-built-for-two" +} +item { + name: "n03792782" + label: 255 + display_name: "mountain_bike" +} +item { + name: "n03393912" + label: 256 + display_name: "freight_car" +} +item { + name: "n03895866" + label: 257 + display_name: "passenger_car" +} +item { + name: "n02797295" + label: 258 + display_name: "barrow" +} +item { + name: "n04204347" + label: 259 + display_name: "shopping_cart" +} +item { + name: "n03791053" + label: 260 + display_name: "motor_scooter" +} +item { + name: "n03384352" + label: 261 + display_name: "forklift" +} +item { + name: "n03272562" + label: 262 + display_name: "electric_locomotive" +} +item { + name: "n04310018" + label: 263 + display_name: "steam_locomotive" +} +item { + name: "n02704792" + label: 264 + display_name: "amphibian" +} +item { + name: "n02701002" + label: 265 + display_name: "ambulance" +} +item { + name: "n02814533" + label: 266 + display_name: "beach_wagon" +} +item { + name: "n02930766" + label: 267 + display_name: "cab" +} +item { + name: "n03100240" + label: 268 + display_name: "convertible" +} +item { + name: "n03594945" + label: 269 + display_name: "jeep" +} +item { + name: "n03670208" + label: 270 + display_name: "limousine" +} +item { + name: "n03770679" + label: 271 + display_name: "minivan" +} +item { + name: "n03777568" + label: 272 + display_name: "Model_T" +} +item { + name: "n04037443" + label: 273 + display_name: "racer" +} +item { + name: "n04285008" + label: 274 + display_name: "sports_car" +} +item { + name: "n03444034" + label: 275 + display_name: "go-kart" +} +item { + name: "n03445924" + label: 276 + display_name: "golfcart" +} +item { + name: "n03785016" + label: 277 + display_name: "moped" +} +item { + name: "n04252225" + label: 278 + display_name: "snowplow" +} +item { + name: "n03345487" + label: 279 + display_name: "fire_engine" +} +item { + name: "n03417042" + label: 280 + display_name: "garbage_truck" +} +item { + name: "n03930630" + label: 281 + display_name: "pickup" +} +item { + name: "n04461696" + label: 282 + display_name: "tow_truck" +} +item { + name: "n04467665" + label: 283 + display_name: "trailer_truck" +} +item { + name: "n03796401" + label: 284 + display_name: "moving_van" +} +item { + name: "n03977966" + label: 285 + display_name: "police_van" +} +item { + name: "n04065272" + label: 286 + display_name: "recreational_vehicle" +} +item { + name: "n04335435" + label: 287 + display_name: "streetcar" +} +item { + name: "n04252077" + label: 288 + display_name: "snowmobile" +} +item { + name: "n04465501" + label: 289 + display_name: "tractor" +} +item { + name: "n03776460" + label: 290 + display_name: "mobile_home" +} +item { + name: "n04482393" + label: 291 + display_name: "tricycle" +} +item { + name: "n04509417" + label: 292 + display_name: "unicycle" +} +item { + name: "n03538406" + label: 293 + display_name: "horse_cart" +} +item { + name: "n03599486" + label: 294 + display_name: "jinrikisha" +} +item { + name: "n03868242" + label: 295 + display_name: "oxcart" +} +item { + name: "n02804414" + label: 296 + display_name: "bassinet" +} +item { + name: "n03125729" + label: 297 + display_name: "cradle" +} +item { + name: "n03131574" + label: 298 + display_name: "crib" +} +item { + name: "n03388549" + label: 299 + display_name: "four-poster" +} +item { + name: "n02870880" + label: 300 + display_name: "bookcase" +} +item { + name: "n03018349" + label: 301 + display_name: "china_cabinet" +} +item { + name: "n03742115" + label: 302 + display_name: "medicine_chest" +} +item { + name: "n03016953" + label: 303 + display_name: "chiffonier" +} +item { + name: "n04380533" + label: 304 + display_name: "table_lamp" +} +item { + name: "n03337140" + label: 305 + display_name: "file" +} +item { + name: "n03891251" + label: 306 + display_name: "park_bench" +} +item { + name: "n02791124" + label: 307 + display_name: "barber_chair" +} +item { + name: "n04429376" + label: 308 + display_name: "throne" +} +item { + name: "n03376595" + label: 309 + display_name: "folding_chair" +} +item { + name: "n04099969" + label: 310 + display_name: "rocking_chair" +} +item { + name: "n04344873" + label: 311 + display_name: "studio_couch" +} +item { + name: "n04447861" + label: 312 + display_name: "toilet_seat" +} +item { + name: "n03179701" + label: 313 + display_name: "desk" +} +item { + name: "n03982430" + label: 314 + display_name: "pool_table" +} +item { + name: "n03201208" + label: 315 + display_name: "dining_table" +} +item { + name: "n03290653" + label: 316 + display_name: "entertainment_center" +} +item { + name: "n04550184" + label: 317 + display_name: "wardrobe" +} +item { + name: "n07742313" + label: 318 + display_name: "Granny_Smith" +} +item { + name: "n07747607" + label: 319 + display_name: "orange" +} +item { + name: "n07749582" + label: 320 + display_name: "lemon" +} +item { + name: "n07753113" + label: 321 + display_name: "fig" +} +item { + name: "n07753275" + label: 322 + display_name: "pineapple" +} +item { + name: "n07753592" + label: 323 + display_name: "banana" +} +item { + name: "n07754684" + label: 324 + display_name: "jackfruit" +} +item { + name: "n07760859" + label: 325 + display_name: "custard_apple" +} +item { + name: "n07768694" + label: 326 + display_name: "pomegranate" +} +item { + name: "n12267677" + label: 327 + display_name: "acorn" +} +item { + name: "n12620546" + label: 328 + display_name: "hip" +} +item { + name: "n13133613" + label: 329 + display_name: "ear" +} +item { + name: "n11879895" + label: 330 + display_name: "rapeseed" +} +item { + name: "n12144580" + label: 331 + display_name: "corn" +} +item { + name: "n12768682" + label: 332 + display_name: "buckeye" +} +item { + name: "n03854065" + label: 333 + display_name: "organ" +} +item { + name: "n04515003" + label: 334 + display_name: "upright" +} +item { + name: "n03017168" + label: 335 + display_name: "chime" +} +item { + name: "n03249569" + label: 336 + display_name: "drum" +} +item { + name: "n03447721" + label: 337 + display_name: "gong" +} +item { + name: "n03720891" + label: 338 + display_name: "maraca" +} +item { + name: "n03721384" + label: 339 + display_name: "marimba" +} +item { + name: "n04311174" + label: 340 + display_name: "steel_drum" +} +item { + name: "n02787622" + label: 341 + display_name: "banjo" +} +item { + name: "n02992211" + label: 342 + display_name: "cello" +} +item { + name: "n04536866" + label: 343 + display_name: "violin" +} +item { + name: "n03495258" + label: 344 + display_name: "harp" +} +item { + name: "n02676566" + label: 345 + display_name: "acoustic_guitar" +} +item { + name: "n03272010" + label: 346 + display_name: "electric_guitar" +} +item { + name: "n03110669" + label: 347 + display_name: "cornet" +} +item { + name: "n03394916" + label: 348 + display_name: "French_horn" +} +item { + name: "n04487394" + label: 349 + display_name: "trombone" +} +item { + name: "n03494278" + label: 350 + display_name: "harmonica" +} +item { + name: "n03840681" + label: 351 + display_name: "ocarina" +} +item { + name: "n03884397" + label: 352 + display_name: "panpipe" +} +item { + name: "n02804610" + label: 353 + display_name: "bassoon" +} +item { + name: "n03838899" + label: 354 + display_name: "oboe" +} +item { + name: "n04141076" + label: 355 + display_name: "sax" +} +item { + name: "n03372029" + label: 356 + display_name: "flute" +} +item { + name: "n11939491" + label: 357 + display_name: "daisy" +} +item { + name: "n12057211" + label: 358 + display_name: "yellow_lady\'s_slipper" +} +item { + name: "n09246464" + label: 359 + display_name: "cliff" +} +item { + name: "n09468604" + label: 360 + display_name: "valley" +} +item { + name: "n09193705" + label: 361 + display_name: "alp" +} +item { + name: "n09472597" + label: 362 + display_name: "volcano" +} +item { + name: "n09399592" + label: 363 + display_name: "promontory" +} +item { + name: "n09421951" + label: 364 + display_name: "sandbar" +} +item { + name: "n09256479" + label: 365 + display_name: "coral_reef" +} +item { + name: "n09332890" + label: 366 + display_name: "lakeside" +} +item { + name: "n09428293" + label: 367 + display_name: "seashore" +} +item { + name: "n09288635" + label: 368 + display_name: "geyser" +} +item { + name: "n03498962" + label: 369 + display_name: "hatchet" +} +item { + name: "n03041632" + label: 370 + display_name: "cleaver" +} +item { + name: "n03658185" + label: 371 + display_name: "letter_opener" +} +item { + name: "n03954731" + label: 372 + display_name: "plane" +} +item { + name: "n03995372" + label: 373 + display_name: "power_drill" +} +item { + name: "n03649909" + label: 374 + display_name: "lawn_mower" +} +item { + name: "n03481172" + label: 375 + display_name: "hammer" +} +item { + name: "n03109150" + label: 376 + display_name: "corkscrew" +} +item { + name: "n02951585" + label: 377 + display_name: "can_opener" +} +item { + name: "n03970156" + label: 378 + display_name: "plunger" +} +item { + name: "n04154565" + label: 379 + display_name: "screwdriver" +} +item { + name: "n04208210" + label: 380 + display_name: "shovel" +} +item { + name: "n03967562" + label: 381 + display_name: "plow" +} +item { + name: "n03000684" + label: 382 + display_name: "chain_saw" +} +item { + name: "n01514668" + label: 383 + display_name: "cock" +} +item { + name: "n01514859" + label: 384 + display_name: "hen" +} +item { + name: "n01518878" + label: 385 + display_name: "ostrich" +} +item { + name: "n01530575" + label: 386 + display_name: "brambling" +} +item { + name: "n01531178" + label: 387 + display_name: "goldfinch" +} +item { + name: "n01532829" + label: 388 + display_name: "house_finch" +} +item { + name: "n01534433" + label: 389 + display_name: "junco" +} +item { + name: "n01537544" + label: 390 + display_name: "indigo_bunting" +} +item { + name: "n01558993" + label: 391 + display_name: "robin" +} +item { + name: "n01560419" + label: 392 + display_name: "bulbul" +} +item { + name: "n01580077" + label: 393 + display_name: "jay" +} +item { + name: "n01582220" + label: 394 + display_name: "magpie" +} +item { + name: "n01592084" + label: 395 + display_name: "chickadee" +} +item { + name: "n01601694" + label: 396 + display_name: "water_ouzel" +} +item { + name: "n01608432" + label: 397 + display_name: "kite" +} +item { + name: "n01614925" + label: 398 + display_name: "bald_eagle" +} +item { + name: "n01616318" + label: 399 + display_name: "vulture" +} +item { + name: "n01622779" + label: 400 + display_name: "great_grey_owl" +} +item { + name: "n01795545" + label: 401 + display_name: "black_grouse" +} +item { + name: "n01796340" + label: 402 + display_name: "ptarmigan" +} +item { + name: "n01797886" + label: 403 + display_name: "ruffed_grouse" +} +item { + name: "n01798484" + label: 404 + display_name: "prairie_chicken" +} +item { + name: "n01806143" + label: 405 + display_name: "peacock" +} +item { + name: "n01806567" + label: 406 + display_name: "quail" +} +item { + name: "n01807496" + label: 407 + display_name: "partridge" +} +item { + name: "n01817953" + label: 408 + display_name: "African_grey" +} +item { + name: "n01818515" + label: 409 + display_name: "macaw" +} +item { + name: "n01819313" + label: 410 + display_name: "sulphur-crested_cockatoo" +} +item { + name: "n01820546" + label: 411 + display_name: "lorikeet" +} +item { + name: "n01824575" + label: 412 + display_name: "coucal" +} +item { + name: "n01828970" + label: 413 + display_name: "bee_eater" +} +item { + name: "n01829413" + label: 414 + display_name: "hornbill" +} +item { + name: "n01833805" + label: 415 + display_name: "hummingbird" +} +item { + name: "n01843065" + label: 416 + display_name: "jacamar" +} +item { + name: "n01843383" + label: 417 + display_name: "toucan" +} +item { + name: "n01847000" + label: 418 + display_name: "drake" +} +item { + name: "n01855032" + label: 419 + display_name: "red-breasted_merganser" +} +item { + name: "n01855672" + label: 420 + display_name: "goose" +} +item { + name: "n01860187" + label: 421 + display_name: "black_swan" +} +item { + name: "n02002556" + label: 422 + display_name: "white_stork" +} +item { + name: "n02002724" + label: 423 + display_name: "black_stork" +} +item { + name: "n02006656" + label: 424 + display_name: "spoonbill" +} +item { + name: "n02007558" + label: 425 + display_name: "flamingo" +} +item { + name: "n02009912" + label: 426 + display_name: "American_egret" +} +item { + name: "n02009229" + label: 427 + display_name: "little_blue_heron" +} +item { + name: "n02011460" + label: 428 + display_name: "bittern" +} +item { + name: "n02012849" + label: 429 + display_name: "crane" +} +item { + name: "n02013706" + label: 430 + display_name: "limpkin" +} +item { + name: "n02018207" + label: 431 + display_name: "American_coot" +} +item { + name: "n02018795" + label: 432 + display_name: "bustard" +} +item { + name: "n02025239" + label: 433 + display_name: "ruddy_turnstone" +} +item { + name: "n02027492" + label: 434 + display_name: "red-backed_sandpiper" +} +item { + name: "n02028035" + label: 435 + display_name: "redshank" +} +item { + name: "n02033041" + label: 436 + display_name: "dowitcher" +} +item { + name: "n02037110" + label: 437 + display_name: "oystercatcher" +} +item { + name: "n02017213" + label: 438 + display_name: "European_gallinule" +} +item { + name: "n02051845" + label: 439 + display_name: "pelican" +} +item { + name: "n02056570" + label: 440 + display_name: "king_penguin" +} +item { + name: "n02058221" + label: 441 + display_name: "albatross" +} +item { + name: "n01484850" + label: 442 + display_name: "great_white_shark" +} +item { + name: "n01491361" + label: 443 + display_name: "tiger_shark" +} +item { + name: "n01494475" + label: 444 + display_name: "hammerhead" +} +item { + name: "n01496331" + label: 445 + display_name: "electric_ray" +} +item { + name: "n01498041" + label: 446 + display_name: "stingray" +} +item { + name: "n02514041" + label: 447 + display_name: "barracouta" +} +item { + name: "n02536864" + label: 448 + display_name: "coho" +} +item { + name: "n01440764" + label: 449 + display_name: "tench" +} +item { + name: "n01443537" + label: 450 + display_name: "goldfish" +} +item { + name: "n02526121" + label: 451 + display_name: "eel" +} +item { + name: "n02606052" + label: 452 + display_name: "rock_beauty" +} +item { + name: "n02607072" + label: 453 + display_name: "anemone_fish" +} +item { + name: "n02643566" + label: 454 + display_name: "lionfish" +} +item { + name: "n02655020" + label: 455 + display_name: "puffer" +} +item { + name: "n02640242" + label: 456 + display_name: "sturgeon" +} +item { + name: "n02641379" + label: 457 + display_name: "gar" +} +item { + name: "n01664065" + label: 458 + display_name: "loggerhead" +} +item { + name: "n01665541" + label: 459 + display_name: "leatherback_turtle" +} +item { + name: "n01667114" + label: 460 + display_name: "mud_turtle" +} +item { + name: "n01667778" + label: 461 + display_name: "terrapin" +} +item { + name: "n01669191" + label: 462 + display_name: "box_turtle" +} +item { + name: "n01675722" + label: 463 + display_name: "banded_gecko" +} +item { + name: "n01677366" + label: 464 + display_name: "common_iguana" +} +item { + name: "n01682714" + label: 465 + display_name: "American_chameleon" +} +item { + name: "n01685808" + label: 466 + display_name: "whiptail" +} +item { + name: "n01687978" + label: 467 + display_name: "agama" +} +item { + name: "n01688243" + label: 468 + display_name: "frilled_lizard" +} +item { + name: "n01689811" + label: 469 + display_name: "alligator_lizard" +} +item { + name: "n01692333" + label: 470 + display_name: "Gila_monster" +} +item { + name: "n01693334" + label: 471 + display_name: "green_lizard" +} +item { + name: "n01694178" + label: 472 + display_name: "African_chameleon" +} +item { + name: "n01695060" + label: 473 + display_name: "Komodo_dragon" +} +item { + name: "n01704323" + label: 474 + display_name: "triceratops" +} +item { + name: "n01697457" + label: 475 + display_name: "African_crocodile" +} +item { + name: "n01698640" + label: 476 + display_name: "American_alligator" +} +item { + name: "n01728572" + label: 477 + display_name: "thunder_snake" +} +item { + name: "n01728920" + label: 478 + display_name: "ringneck_snake" +} +item { + name: "n01729322" + label: 479 + display_name: "hognose_snake" +} +item { + name: "n01729977" + label: 480 + display_name: "green_snake" +} +item { + name: "n01734418" + label: 481 + display_name: "king_snake" +} +item { + name: "n01735189" + label: 482 + display_name: "garter_snake" +} +item { + name: "n01737021" + label: 483 + display_name: "water_snake" +} +item { + name: "n01739381" + label: 484 + display_name: "vine_snake" +} +item { + name: "n01740131" + label: 485 + display_name: "night_snake" +} +item { + name: "n01742172" + label: 486 + display_name: "boa_constrictor" +} +item { + name: "n01744401" + label: 487 + display_name: "rock_python" +} +item { + name: "n01748264" + label: 488 + display_name: "Indian_cobra" +} +item { + name: "n01749939" + label: 489 + display_name: "green_mamba" +} +item { + name: "n01751748" + label: 490 + display_name: "sea_snake" +} +item { + name: "n01753488" + label: 491 + display_name: "horned_viper" +} +item { + name: "n01755581" + label: 492 + display_name: "diamondback" +} +item { + name: "n01756291" + label: 493 + display_name: "sidewinder" +} +item { + name: "n01629819" + label: 494 + display_name: "European_fire_salamander" +} +item { + name: "n01630670" + label: 495 + display_name: "common_newt" +} +item { + name: "n01631663" + label: 496 + display_name: "eft" +} +item { + name: "n01632458" + label: 497 + display_name: "spotted_salamander" +} +item { + name: "n01632777" + label: 498 + display_name: "axolotl" +} +item { + name: "n01641577" + label: 499 + display_name: "bullfrog" +} +item { + name: "n01644373" + label: 500 + display_name: "tree_frog" +} +item { + name: "n01644900" + label: 501 + display_name: "tailed_frog" +} +item { + name: "n04579432" + label: 502 + display_name: "whistle" +} +item { + name: "n04592741" + label: 503 + display_name: "wing" +} +item { + name: "n03876231" + label: 504 + display_name: "paintbrush" +} +item { + name: "n03483316" + label: 505 + display_name: "hand_blower" +} +item { + name: "n03868863" + label: 506 + display_name: "oxygen_mask" +} +item { + name: "n04251144" + label: 507 + display_name: "snorkel" +} +item { + name: "n03691459" + label: 508 + display_name: "loudspeaker" +} +item { + name: "n03759954" + label: 509 + display_name: "microphone" +} +item { + name: "n04152593" + label: 510 + display_name: "screen" +} +item { + name: "n03793489" + label: 511 + display_name: "mouse" +} +item { + name: "n03271574" + label: 512 + display_name: "electric_fan" +} +item { + name: "n03843555" + label: 513 + display_name: "oil_filter" +} +item { + name: "n04332243" + label: 514 + display_name: "strainer" +} +item { + name: "n04265275" + label: 515 + display_name: "space_heater" +} +item { + name: "n04330267" + label: 516 + display_name: "stove" +} +item { + name: "n03467068" + label: 517 + display_name: "guillotine" +} +item { + name: "n02794156" + label: 518 + display_name: "barometer" +} +item { + name: "n04118776" + label: 519 + display_name: "rule" +} +item { + name: "n03841143" + label: 520 + display_name: "odometer" +} +item { + name: "n04141975" + label: 521 + display_name: "scale" +} +item { + name: "n02708093" + label: 522 + display_name: "analog_clock" +} +item { + name: "n03196217" + label: 523 + display_name: "digital_clock" +} +item { + name: "n04548280" + label: 524 + display_name: "wall_clock" +} +item { + name: "n03544143" + label: 525 + display_name: "hourglass" +} +item { + name: "n04355338" + label: 526 + display_name: "sundial" +} +item { + name: "n03891332" + label: 527 + display_name: "parking_meter" +} +item { + name: "n04328186" + label: 528 + display_name: "stopwatch" +} +item { + name: "n03197337" + label: 529 + display_name: "digital_watch" +} +item { + name: "n04317175" + label: 530 + display_name: "stethoscope" +} +item { + name: "n04376876" + label: 531 + display_name: "syringe" +} +item { + name: "n03706229" + label: 532 + display_name: "magnetic_compass" +} +item { + name: "n02841315" + label: 533 + display_name: "binoculars" +} +item { + name: "n04009552" + label: 534 + display_name: "projector" +} +item { + name: "n04356056" + label: 535 + display_name: "sunglasses" +} +item { + name: "n03692522" + label: 536 + display_name: "loupe" +} +item { + name: "n04044716" + label: 537 + display_name: "radio_telescope" +} +item { + name: "n02879718" + label: 538 + display_name: "bow" +} +item { + name: "n02950826" + label: 539 + display_name: "cannon" +} +item { + name: "n02749479" + label: 540 + display_name: "assault_rifle" +} +item { + name: "n04090263" + label: 541 + display_name: "rifle" +} +item { + name: "n04008634" + label: 542 + display_name: "projectile" +} +item { + name: "n03085013" + label: 543 + display_name: "computer_keyboard" +} +item { + name: "n04505470" + label: 544 + display_name: "typewriter_keyboard" +} +item { + name: "n03126707" + label: 545 + display_name: "crane" +} +item { + name: "n03666591" + label: 546 + display_name: "lighter" +} +item { + name: "n02666196" + label: 547 + display_name: "abacus" +} +item { + name: "n02977058" + label: 548 + display_name: "cash_machine" +} +item { + name: "n04238763" + label: 549 + display_name: "slide_rule" +} +item { + name: "n03180011" + label: 550 + display_name: "desktop_computer" +} +item { + name: "n03485407" + label: 551 + display_name: "hand-held_computer" +} +item { + name: "n03832673" + label: 552 + display_name: "notebook" +} +item { + name: "n06359193" + label: 553 + display_name: "web_site" +} +item { + name: "n03496892" + label: 554 + display_name: "harvester" +} +item { + name: "n04428191" + label: 555 + display_name: "thresher" +} +item { + name: "n04004767" + label: 556 + display_name: "printer" +} +item { + name: "n04243546" + label: 557 + display_name: "slot" +} +item { + name: "n04525305" + label: 558 + display_name: "vending_machine" +} +item { + name: "n04179913" + label: 559 + display_name: "sewing_machine" +} +item { + name: "n03602883" + label: 560 + display_name: "joystick" +} +item { + name: "n04372370" + label: 561 + display_name: "switch" +} +item { + name: "n03532672" + label: 562 + display_name: "hook" +} +item { + name: "n02974003" + label: 563 + display_name: "car_wheel" +} +item { + name: "n03874293" + label: 564 + display_name: "paddlewheel" +} +item { + name: "n03944341" + label: 565 + display_name: "pinwheel" +} +item { + name: "n03992509" + label: 566 + display_name: "potter\'s_wheel" +} +item { + name: "n03425413" + label: 567 + display_name: "gas_pump" +} +item { + name: "n02966193" + label: 568 + display_name: "carousel" +} +item { + name: "n04371774" + label: 569 + display_name: "swing" +} +item { + name: "n04067472" + label: 570 + display_name: "reel" +} +item { + name: "n04040759" + label: 571 + display_name: "radiator" +} +item { + name: "n04019541" + label: 572 + display_name: "puck" +} +item { + name: "n03492542" + label: 573 + display_name: "hard_disc" +} +item { + name: "n04355933" + label: 574 + display_name: "sunglass" +} +item { + name: "n03929660" + label: 575 + display_name: "pick" +} +item { + name: "n02965783" + label: 576 + display_name: "car_mirror" +} +item { + name: "n04258138" + label: 577 + display_name: "solar_dish" +} +item { + name: "n04074963" + label: 578 + display_name: "remote_control" +} +item { + name: "n03208938" + label: 579 + display_name: "disk_brake" +} +item { + name: "n02910353" + label: 580 + display_name: "buckle" +} +item { + name: "n03476684" + label: 581 + display_name: "hair_slide" +} +item { + name: "n03627232" + label: 582 + display_name: "knot" +} +item { + name: "n03075370" + label: 583 + display_name: "combination_lock" +} +item { + name: "n03874599" + label: 584 + display_name: "padlock" +} +item { + name: "n03804744" + label: 585 + display_name: "nail" +} +item { + name: "n04127249" + label: 586 + display_name: "safety_pin" +} +item { + name: "n04153751" + label: 587 + display_name: "screw" +} +item { + name: "n03803284" + label: 588 + display_name: "muzzle" +} +item { + name: "n04162706" + label: 589 + display_name: "seat_belt" +} +item { + name: "n04228054" + label: 590 + display_name: "ski" +} +item { + name: "n02948072" + label: 591 + display_name: "candle" +} +item { + name: "n03590841" + label: 592 + display_name: "jack-o\'-lantern" +} +item { + name: "n04286575" + label: 593 + display_name: "spotlight" +} +item { + name: "n04456115" + label: 594 + display_name: "torch" +} +item { + name: "n03814639" + label: 595 + display_name: "neck_brace" +} +item { + name: "n03933933" + label: 596 + display_name: "pier" +} +item { + name: "n04485082" + label: 597 + display_name: "tripod" +} +item { + name: "n03733131" + label: 598 + display_name: "maypole" +} +item { + name: "n03794056" + label: 599 + display_name: "mousetrap" +} +item { + name: "n04275548" + label: 600 + display_name: "spider_web" +} +item { + name: "n01768244" + label: 601 + display_name: "trilobite" +} +item { + name: "n01770081" + label: 602 + display_name: "harvestman" +} +item { + name: "n01770393" + label: 603 + display_name: "scorpion" +} +item { + name: "n01773157" + label: 604 + display_name: "black_and_gold_garden_spider" +} +item { + name: "n01773549" + label: 605 + display_name: "barn_spider" +} +item { + name: "n01773797" + label: 606 + display_name: "garden_spider" +} +item { + name: "n01774384" + label: 607 + display_name: "black_widow" +} +item { + name: "n01774750" + label: 608 + display_name: "tarantula" +} +item { + name: "n01775062" + label: 609 + display_name: "wolf_spider" +} +item { + name: "n01776313" + label: 610 + display_name: "tick" +} +item { + name: "n01784675" + label: 611 + display_name: "centipede" +} +item { + name: "n01990800" + label: 612 + display_name: "isopod" +} +item { + name: "n01978287" + label: 613 + display_name: "Dungeness_crab" +} +item { + name: "n01978455" + label: 614 + display_name: "rock_crab" +} +item { + name: "n01980166" + label: 615 + display_name: "fiddler_crab" +} +item { + name: "n01981276" + label: 616 + display_name: "king_crab" +} +item { + name: "n01983481" + label: 617 + display_name: "American_lobster" +} +item { + name: "n01984695" + label: 618 + display_name: "spiny_lobster" +} +item { + name: "n01985128" + label: 619 + display_name: "crayfish" +} +item { + name: "n01986214" + label: 620 + display_name: "hermit_crab" +} +item { + name: "n02165105" + label: 621 + display_name: "tiger_beetle" +} +item { + name: "n02165456" + label: 622 + display_name: "ladybug" +} +item { + name: "n02167151" + label: 623 + display_name: "ground_beetle" +} +item { + name: "n02168699" + label: 624 + display_name: "long-horned_beetle" +} +item { + name: "n02169497" + label: 625 + display_name: "leaf_beetle" +} +item { + name: "n02172182" + label: 626 + display_name: "dung_beetle" +} +item { + name: "n02174001" + label: 627 + display_name: "rhinoceros_beetle" +} +item { + name: "n02177972" + label: 628 + display_name: "weevil" +} +item { + name: "n02190166" + label: 629 + display_name: "fly" +} +item { + name: "n02206856" + label: 630 + display_name: "bee" +} +item { + name: "n02226429" + label: 631 + display_name: "grasshopper" +} +item { + name: "n02229544" + label: 632 + display_name: "cricket" +} +item { + name: "n02231487" + label: 633 + display_name: "walking_stick" +} +item { + name: "n02233338" + label: 634 + display_name: "cockroach" +} +item { + name: "n02236044" + label: 635 + display_name: "mantis" +} +item { + name: "n02256656" + label: 636 + display_name: "cicada" +} +item { + name: "n02259212" + label: 637 + display_name: "leafhopper" +} +item { + name: "n02264363" + label: 638 + display_name: "lacewing" +} +item { + name: "n02268443" + label: 639 + display_name: "dragonfly" +} +item { + name: "n02268853" + label: 640 + display_name: "damselfly" +} +item { + name: "n02276258" + label: 641 + display_name: "admiral" +} +item { + name: "n02277742" + label: 642 + display_name: "ringlet" +} +item { + name: "n02279972" + label: 643 + display_name: "monarch" +} +item { + name: "n02280649" + label: 644 + display_name: "cabbage_butterfly" +} +item { + name: "n02281406" + label: 645 + display_name: "sulphur_butterfly" +} +item { + name: "n02281787" + label: 646 + display_name: "lycaenid" +} +item { + name: "n01910747" + label: 647 + display_name: "jellyfish" +} +item { + name: "n01914609" + label: 648 + display_name: "sea_anemone" +} +item { + name: "n01917289" + label: 649 + display_name: "brain_coral" +} +item { + name: "n01924916" + label: 650 + display_name: "flatworm" +} +item { + name: "n01930112" + label: 651 + display_name: "nematode" +} +item { + name: "n01943899" + label: 652 + display_name: "conch" +} +item { + name: "n01944390" + label: 653 + display_name: "snail" +} +item { + name: "n01945685" + label: 654 + display_name: "slug" +} +item { + name: "n01950731" + label: 655 + display_name: "sea_slug" +} +item { + name: "n01955084" + label: 656 + display_name: "chiton" +} +item { + name: "n02319095" + label: 657 + display_name: "sea_urchin" +} +item { + name: "n02321529" + label: 658 + display_name: "sea_cucumber" +} +item { + name: "n03584829" + label: 659 + display_name: "iron" +} +item { + name: "n03297495" + label: 660 + display_name: "espresso_maker" +} +item { + name: "n03761084" + label: 661 + display_name: "microwave" +} +item { + name: "n03259280" + label: 662 + display_name: "Dutch_oven" +} +item { + name: "n04111531" + label: 663 + display_name: "rotisserie" +} +item { + name: "n04442312" + label: 664 + display_name: "toaster" +} +item { + name: "n04542943" + label: 665 + display_name: "waffle_iron" +} +item { + name: "n04517823" + label: 666 + display_name: "vacuum" +} +item { + name: "n03207941" + label: 667 + display_name: "dishwasher" +} +item { + name: "n04070727" + label: 668 + display_name: "refrigerator" +} +item { + name: "n04554684" + label: 669 + display_name: "washer" +} +item { + name: "n03133878" + label: 670 + display_name: "Crock_Pot" +} +item { + name: "n03400231" + label: 671 + display_name: "frying_pan" +} +item { + name: "n04596742" + label: 672 + display_name: "wok" +} +item { + name: "n02939185" + label: 673 + display_name: "caldron" +} +item { + name: "n03063689" + label: 674 + display_name: "coffeepot" +} +item { + name: "n04398044" + label: 675 + display_name: "teapot" +} +item { + name: "n04270147" + label: 676 + display_name: "spatula" +} +item { + name: "n02699494" + label: 677 + display_name: "altar" +} +item { + name: "n04486054" + label: 678 + display_name: "triumphal_arch" +} +item { + name: "n03899768" + label: 679 + display_name: "patio" +} +item { + name: "n04311004" + label: 680 + display_name: "steel_arch_bridge" +} +item { + name: "n04366367" + label: 681 + display_name: "suspension_bridge" +} +item { + name: "n04532670" + label: 682 + display_name: "viaduct" +} +item { + name: "n02793495" + label: 683 + display_name: "barn" +} +item { + name: "n03457902" + label: 684 + display_name: "greenhouse" +} +item { + name: "n03877845" + label: 685 + display_name: "palace" +} +item { + name: "n03781244" + label: 686 + display_name: "monastery" +} +item { + name: "n03661043" + label: 687 + display_name: "library" +} +item { + name: "n02727426" + label: 688 + display_name: "apiary" +} +item { + name: "n02859443" + label: 689 + display_name: "boathouse" +} +item { + name: "n03028079" + label: 690 + display_name: "church" +} +item { + name: "n03788195" + label: 691 + display_name: "mosque" +} +item { + name: "n04346328" + label: 692 + display_name: "stupa" +} +item { + name: "n03956157" + label: 693 + display_name: "planetarium" +} +item { + name: "n04081281" + label: 694 + display_name: "restaurant" +} +item { + name: "n03032252" + label: 695 + display_name: "cinema" +} +item { + name: "n03529860" + label: 696 + display_name: "home_theater" +} +item { + name: "n03697007" + label: 697 + display_name: "lumbermill" +} +item { + name: "n03065424" + label: 698 + display_name: "coil" +} +item { + name: "n03837869" + label: 699 + display_name: "obelisk" +} +item { + name: "n04458633" + label: 700 + display_name: "totem_pole" +} +item { + name: "n02980441" + label: 701 + display_name: "castle" +} +item { + name: "n04005630" + label: 702 + display_name: "prison" +} +item { + name: "n03461385" + label: 703 + display_name: "grocery_store" +} +item { + name: "n02776631" + label: 704 + display_name: "bakery" +} +item { + name: "n02791270" + label: 705 + display_name: "barbershop" +} +item { + name: "n02871525" + label: 706 + display_name: "bookshop" +} +item { + name: "n02927161" + label: 707 + display_name: "butcher_shop" +} +item { + name: "n03089624" + label: 708 + display_name: "confectionery" +} +item { + name: "n04200800" + label: 709 + display_name: "shoe_shop" +} +item { + name: "n04443257" + label: 710 + display_name: "tobacco_shop" +} +item { + name: "n04462240" + label: 711 + display_name: "toyshop" +} +item { + name: "n03388043" + label: 712 + display_name: "fountain" +} +item { + name: "n03042490" + label: 713 + display_name: "cliff_dwelling" +} +item { + name: "n04613696" + label: 714 + display_name: "yurt" +} +item { + name: "n03216828" + label: 715 + display_name: "dock" +} +item { + name: "n02892201" + label: 716 + display_name: "brass" +} +item { + name: "n03743016" + label: 717 + display_name: "megalith" +} +item { + name: "n02788148" + label: 718 + display_name: "bannister" +} +item { + name: "n02894605" + label: 719 + display_name: "breakwater" +} +item { + name: "n03160309" + label: 720 + display_name: "dam" +} +item { + name: "n03000134" + label: 721 + display_name: "chainlink_fence" +} +item { + name: "n03930313" + label: 722 + display_name: "picket_fence" +} +item { + name: "n04604644" + label: 723 + display_name: "worm_fence" +} +item { + name: "n04326547" + label: 724 + display_name: "stone_wall" +} +item { + name: "n03459775" + label: 725 + display_name: "grille" +} +item { + name: "n04239074" + label: 726 + display_name: "sliding_door" +} +item { + name: "n04501370" + label: 727 + display_name: "turnstile" +} +item { + name: "n03792972" + label: 728 + display_name: "mountain_tent" +} +item { + name: "n04149813" + label: 729 + display_name: "scoreboard" +} +item { + name: "n03530642" + label: 730 + display_name: "honeycomb" +} +item { + name: "n03961711" + label: 731 + display_name: "plate_rack" +} +item { + name: "n03903868" + label: 732 + display_name: "pedestal" +} +item { + name: "n02814860" + label: 733 + display_name: "beacon" +} +item { + name: "n07711569" + label: 734 + display_name: "mashed_potato" +} +item { + name: "n07720875" + label: 735 + display_name: "bell_pepper" +} +item { + name: "n07714571" + label: 736 + display_name: "head_cabbage" +} +item { + name: "n07714990" + label: 737 + display_name: "broccoli" +} +item { + name: "n07715103" + label: 738 + display_name: "cauliflower" +} +item { + name: "n07716358" + label: 739 + display_name: "zucchini" +} +item { + name: "n07716906" + label: 740 + display_name: "spaghetti_squash" +} +item { + name: "n07717410" + label: 741 + display_name: "acorn_squash" +} +item { + name: "n07717556" + label: 742 + display_name: "butternut_squash" +} +item { + name: "n07718472" + label: 743 + display_name: "cucumber" +} +item { + name: "n07718747" + label: 744 + display_name: "artichoke" +} +item { + name: "n07730033" + label: 745 + display_name: "cardoon" +} +item { + name: "n07734744" + label: 746 + display_name: "mushroom" +} +item { + name: "n04209239" + label: 747 + display_name: "shower_curtain" +} +item { + name: "n03594734" + label: 748 + display_name: "jean" +} +item { + name: "n02971356" + label: 749 + display_name: "carton" +} +item { + name: "n03485794" + label: 750 + display_name: "handkerchief" +} +item { + name: "n04133789" + label: 751 + display_name: "sandal" +} +item { + name: "n02747177" + label: 752 + display_name: "ashcan" +} +item { + name: "n04125021" + label: 753 + display_name: "safe" +} +item { + name: "n07579787" + label: 754 + display_name: "plate" +} +item { + name: "n03814906" + label: 755 + display_name: "necklace" +} +item { + name: "n03134739" + label: 756 + display_name: "croquet_ball" +} +item { + name: "n03404251" + label: 757 + display_name: "fur_coat" +} +item { + name: "n04423845" + label: 758 + display_name: "thimble" +} +item { + name: "n03877472" + label: 759 + display_name: "pajama" +} +item { + name: "n04120489" + label: 760 + display_name: "running_shoe" +} +item { + name: "n03062245" + label: 761 + display_name: "cocktail_shaker" +} +item { + name: "n03014705" + label: 762 + display_name: "chest" +} +item { + name: "n03717622" + label: 763 + display_name: "manhole_cover" +} +item { + name: "n03777754" + label: 764 + display_name: "modem" +} +item { + name: "n04493381" + label: 765 + display_name: "tub" +} +item { + name: "n04476259" + label: 766 + display_name: "tray" +} +item { + name: "n02777292" + label: 767 + display_name: "balance_beam" +} +item { + name: "n07693725" + label: 768 + display_name: "bagel" +} +item { + name: "n03998194" + label: 769 + display_name: "prayer_rug" +} +item { + name: "n03617480" + label: 770 + display_name: "kimono" +} +item { + name: "n07590611" + label: 771 + display_name: "hot_pot" +} +item { + name: "n04579145" + label: 772 + display_name: "whiskey_jug" +} +item { + name: "n03623198" + label: 773 + display_name: "knee_pad" +} +item { + name: "n07248320" + label: 774 + display_name: "book_jacket" +} +item { + name: "n04277352" + label: 775 + display_name: "spindle" +} +item { + name: "n04229816" + label: 776 + display_name: "ski_mask" +} +item { + name: "n02823428" + label: 777 + display_name: "beer_bottle" +} +item { + name: "n03127747" + label: 778 + display_name: "crash_helmet" +} +item { + name: "n02877765" + label: 779 + display_name: "bottlecap" +} +item { + name: "n04435653" + label: 780 + display_name: "tile_roof" +} +item { + name: "n03724870" + label: 781 + display_name: "mask" +} +item { + name: "n03710637" + label: 782 + display_name: "maillot" +} +item { + name: "n03920288" + label: 783 + display_name: "Petri_dish" +} +item { + name: "n03379051" + label: 784 + display_name: "football_helmet" +} +item { + name: "n02807133" + label: 785 + display_name: "bathing_cap" +} +item { + name: "n04399382" + label: 786 + display_name: "teddy" +} +item { + name: "n03527444" + label: 787 + display_name: "holster" +} +item { + name: "n03983396" + label: 788 + display_name: "pop_bottle" +} +item { + name: "n03924679" + label: 789 + display_name: "photocopier" +} +item { + name: "n04532106" + label: 790 + display_name: "vestment" +} +item { + name: "n06785654" + label: 791 + display_name: "crossword_puzzle" +} +item { + name: "n03445777" + label: 792 + display_name: "golf_ball" +} +item { + name: "n07613480" + label: 793 + display_name: "trifle" +} +item { + name: "n04350905" + label: 794 + display_name: "suit" +} +item { + name: "n04562935" + label: 795 + display_name: "water_tower" +} +item { + name: "n03325584" + label: 796 + display_name: "feather_boa" +} +item { + name: "n03045698" + label: 797 + display_name: "cloak" +} +item { + name: "n07892512" + label: 798 + display_name: "red_wine" +} +item { + name: "n03250847" + label: 799 + display_name: "drumstick" +} +item { + name: "n04192698" + label: 800 + display_name: "shield" +} +item { + name: "n03026506" + label: 801 + display_name: "Christmas_stocking" +} +item { + name: "n03534580" + label: 802 + display_name: "hoopskirt" +} +item { + name: "n07565083" + label: 803 + display_name: "menu" +} +item { + name: "n04296562" + label: 804 + display_name: "stage" +} +item { + name: "n02869837" + label: 805 + display_name: "bonnet" +} +item { + name: "n07871810" + label: 806 + display_name: "meat_loaf" +} +item { + name: "n02799071" + label: 807 + display_name: "baseball" +} +item { + name: "n03314780" + label: 808 + display_name: "face_powder" +} +item { + name: "n04141327" + label: 809 + display_name: "scabbard" +} +item { + name: "n04357314" + label: 810 + display_name: "sunscreen" +} +item { + name: "n02823750" + label: 811 + display_name: "beer_glass" +} +item { + name: "n13052670" + label: 812 + display_name: "hen-of-the-woods" +} +item { + name: "n07583066" + label: 813 + display_name: "guacamole" +} +item { + name: "n03637318" + label: 814 + display_name: "lampshade" +} +item { + name: "n04599235" + label: 815 + display_name: "wool" +} +item { + name: "n07802026" + label: 816 + display_name: "hay" +} +item { + name: "n02883205" + label: 817 + display_name: "bow_tie" +} +item { + name: "n03709823" + label: 818 + display_name: "mailbag" +} +item { + name: "n04560804" + label: 819 + display_name: "water_jug" +} +item { + name: "n02909870" + label: 820 + display_name: "bucket" +} +item { + name: "n03207743" + label: 821 + display_name: "dishrag" +} +item { + name: "n04263257" + label: 822 + display_name: "soup_bowl" +} +item { + name: "n07932039" + label: 823 + display_name: "eggnog" +} +item { + name: "n03786901" + label: 824 + display_name: "mortar" +} +item { + name: "n04479046" + label: 825 + display_name: "trench_coat" +} +item { + name: "n03873416" + label: 826 + display_name: "paddle" +} +item { + name: "n02999410" + label: 827 + display_name: "chain" +} +item { + name: "n04367480" + label: 828 + display_name: "swab" +} +item { + name: "n03775546" + label: 829 + display_name: "mixing_bowl" +} +item { + name: "n07875152" + label: 830 + display_name: "potpie" +} +item { + name: "n04591713" + label: 831 + display_name: "wine_bottle" +} +item { + name: "n04201297" + label: 832 + display_name: "shoji" +} +item { + name: "n02916936" + label: 833 + display_name: "bulletproof_vest" +} +item { + name: "n03240683" + label: 834 + display_name: "drilling_platform" +} +item { + name: "n02840245" + label: 835 + display_name: "binder" +} +item { + name: "n02963159" + label: 836 + display_name: "cardigan" +} +item { + name: "n04370456" + label: 837 + display_name: "sweatshirt" +} +item { + name: "n03991062" + label: 838 + display_name: "pot" +} +item { + name: "n02843684" + label: 839 + display_name: "birdhouse" +} +item { + name: "n03482405" + label: 840 + display_name: "hamper" +} +item { + name: "n03942813" + label: 841 + display_name: "ping-pong_ball" +} +item { + name: "n03908618" + label: 842 + display_name: "pencil_box" +} +item { + name: "n03902125" + label: 843 + display_name: "pay-phone" +} +item { + name: "n07584110" + label: 844 + display_name: "consomme" +} +item { + name: "n02730930" + label: 845 + display_name: "apron" +} +item { + name: "n04023962" + label: 846 + display_name: "punching_bag" +} +item { + name: "n02769748" + label: 847 + display_name: "backpack" +} +item { + name: "n10148035" + label: 848 + display_name: "groom" +} +item { + name: "n02817516" + label: 849 + display_name: "bearskin" +} +item { + name: "n03908714" + label: 850 + display_name: "pencil_sharpener" +} +item { + name: "n02906734" + label: 851 + display_name: "broom" +} +item { + name: "n03788365" + label: 852 + display_name: "mosquito_net" +} +item { + name: "n02667093" + label: 853 + display_name: "abaya" +} +item { + name: "n03787032" + label: 854 + display_name: "mortarboard" +} +item { + name: "n03980874" + label: 855 + display_name: "poncho" +} +item { + name: "n03141823" + label: 856 + display_name: "crutch" +} +item { + name: "n03976467" + label: 857 + display_name: "Polaroid_camera" +} +item { + name: "n04264628" + label: 858 + display_name: "space_bar" +} +item { + name: "n07930864" + label: 859 + display_name: "cup" +} +item { + name: "n04039381" + label: 860 + display_name: "racket" +} +item { + name: "n06874185" + label: 861 + display_name: "traffic_light" +} +item { + name: "n04033901" + label: 862 + display_name: "quill" +} +item { + name: "n04041544" + label: 863 + display_name: "radio" +} +item { + name: "n07860988" + label: 864 + display_name: "dough" +} +item { + name: "n03146219" + label: 865 + display_name: "cuirass" +} +item { + name: "n03763968" + label: 866 + display_name: "military_uniform" +} +item { + name: "n03676483" + label: 867 + display_name: "lipstick" +} +item { + name: "n04209133" + label: 868 + display_name: "shower_cap" +} +item { + name: "n03782006" + label: 869 + display_name: "monitor" +} +item { + name: "n03857828" + label: 870 + display_name: "oscilloscope" +} +item { + name: "n03775071" + label: 871 + display_name: "mitten" +} +item { + name: "n02892767" + label: 872 + display_name: "brassiere" +} +item { + name: "n07684084" + label: 873 + display_name: "French_loaf" +} +item { + name: "n04522168" + label: 874 + display_name: "vase" +} +item { + name: "n03764736" + label: 875 + display_name: "milk_can" +} +item { + name: "n04118538" + label: 876 + display_name: "rugby_ball" +} +item { + name: "n03887697" + label: 877 + display_name: "paper_towel" +} +item { + name: "n13044778" + label: 878 + display_name: "earthstar" +} +item { + name: "n03291819" + label: 879 + display_name: "envelope" +} +item { + name: "n03770439" + label: 880 + display_name: "miniskirt" +} +item { + name: "n03124170" + label: 881 + display_name: "cowboy_hat" +} +item { + name: "n04487081" + label: 882 + display_name: "trolleybus" +} +item { + name: "n03916031" + label: 883 + display_name: "perfume" +} +item { + name: "n02808440" + label: 884 + display_name: "bathtub" +} +item { + name: "n07697537" + label: 885 + display_name: "hotdog" +} +item { + name: "n12985857" + label: 886 + display_name: "coral_fungus" +} +item { + name: "n02917067" + label: 887 + display_name: "bullet_train" +} +item { + name: "n03938244" + label: 888 + display_name: "pillow" +} +item { + name: "n15075141" + label: 889 + display_name: "toilet_tissue" +} +item { + name: "n02978881" + label: 890 + display_name: "cassette" +} +item { + name: "n02966687" + label: 891 + display_name: "carpenter\'s_kit" +} +item { + name: "n03633091" + label: 892 + display_name: "ladle" +} +item { + name: "n13040303" + label: 893 + display_name: "stinkhorn" +} +item { + name: "n03690938" + label: 894 + display_name: "lotion" +} +item { + name: "n03476991" + label: 895 + display_name: "hair_spray" +} +item { + name: "n02669723" + label: 896 + display_name: "academic_gown" +} +item { + name: "n03220513" + label: 897 + display_name: "dome" +} +item { + name: "n03127925" + label: 898 + display_name: "crate" +} +item { + name: "n04584207" + label: 899 + display_name: "wig" +} +item { + name: "n07880968" + label: 900 + display_name: "burrito" +} +item { + name: "n03937543" + label: 901 + display_name: "pill_bottle" +} +item { + name: "n03000247" + label: 902 + display_name: "chain_mail" +} +item { + name: "n04418357" + label: 903 + display_name: "theater_curtain" +} +item { + name: "n04590129" + label: 904 + display_name: "window_shade" +} +item { + name: "n02795169" + label: 905 + display_name: "barrel" +} +item { + name: "n04553703" + label: 906 + display_name: "washbasin" +} +item { + name: "n02783161" + label: 907 + display_name: "ballpoint" +} +item { + name: "n02802426" + label: 908 + display_name: "basketball" +} +item { + name: "n02808304" + label: 909 + display_name: "bath_towel" +} +item { + name: "n03124043" + label: 910 + display_name: "cowboy_boot" +} +item { + name: "n03450230" + label: 911 + display_name: "gown" +} +item { + name: "n04589890" + label: 912 + display_name: "window_screen" +} +item { + name: "n12998815" + label: 913 + display_name: "agaric" +} +item { + name: "n02992529" + label: 914 + display_name: "cellular_telephone" +} +item { + name: "n03825788" + label: 915 + display_name: "nipple" +} +item { + name: "n02790996" + label: 916 + display_name: "barbell" +} +item { + name: "n03710193" + label: 917 + display_name: "mailbox" +} +item { + name: "n03630383" + label: 918 + display_name: "lab_coat" +} +item { + name: "n03347037" + label: 919 + display_name: "fire_screen" +} +item { + name: "n03769881" + label: 920 + display_name: "minibus" +} +item { + name: "n03871628" + label: 921 + display_name: "packet" +} +item { + name: "n03733281" + label: 922 + display_name: "maze" +} +item { + name: "n03976657" + label: 923 + display_name: "pole" +} +item { + name: "n03535780" + label: 924 + display_name: "horizontal_bar" +} +item { + name: "n04259630" + label: 925 + display_name: "sombrero" +} +item { + name: "n03929855" + label: 926 + display_name: "pickelhaube" +} +item { + name: "n04049303" + label: 927 + display_name: "rain_barrel" +} +item { + name: "n04548362" + label: 928 + display_name: "wallet" +} +item { + name: "n02979186" + label: 929 + display_name: "cassette_player" +} +item { + name: "n06596364" + label: 930 + display_name: "comic_book" +} +item { + name: "n03935335" + label: 931 + display_name: "piggy_bank" +} +item { + name: "n06794110" + label: 932 + display_name: "street_sign" +} +item { + name: "n02825657" + label: 933 + display_name: "bell_cote" +} +item { + name: "n03388183" + label: 934 + display_name: "fountain_pen" +} +item { + name: "n04591157" + label: 935 + display_name: "Windsor_tie" +} +item { + name: "n04540053" + label: 936 + display_name: "volleyball" +} +item { + name: "n03866082" + label: 937 + display_name: "overskirt" +} +item { + name: "n04136333" + label: 938 + display_name: "sarong" +} +item { + name: "n04026417" + label: 939 + display_name: "purse" +} +item { + name: "n02865351" + label: 940 + display_name: "bolo_tie" +} +item { + name: "n02834397" + label: 941 + display_name: "bib" +} +item { + name: "n03888257" + label: 942 + display_name: "parachute" +} +item { + name: "n04235860" + label: 943 + display_name: "sleeping_bag" +} +item { + name: "n04404412" + label: 944 + display_name: "television" +} +item { + name: "n04371430" + label: 945 + display_name: "swimming_trunks" +} +item { + name: "n03733805" + label: 946 + display_name: "measuring_cup" +} +item { + name: "n07920052" + label: 947 + display_name: "espresso" +} +item { + name: "n07873807" + label: 948 + display_name: "pizza" +} +item { + name: "n02895154" + label: 949 + display_name: "breastplate" +} +item { + name: "n04204238" + label: 950 + display_name: "shopping_basket" +} +item { + name: "n04597913" + label: 951 + display_name: "wooden_spoon" +} +item { + name: "n04131690" + label: 952 + display_name: "saltshaker" +} +item { + name: "n07836838" + label: 953 + display_name: "chocolate_sauce" +} +item { + name: "n09835506" + label: 954 + display_name: "ballplayer" +} +item { + name: "n03443371" + label: 955 + display_name: "goblet" +} +item { + name: "n13037406" + label: 956 + display_name: "gyromitra" +} +item { + name: "n04336792" + label: 957 + display_name: "stretcher" +} +item { + name: "n04557648" + label: 958 + display_name: "water_bottle" +} +item { + name: "n03187595" + label: 959 + display_name: "dial_telephone" +} +item { + name: "n04254120" + label: 960 + display_name: "soap_dispenser" +} +item { + name: "n03595614" + label: 961 + display_name: "jersey" +} +item { + name: "n04146614" + label: 962 + display_name: "school_bus" +} +item { + name: "n03598930" + label: 963 + display_name: "jigsaw_puzzle" +} +item { + name: "n03958227" + label: 964 + display_name: "plastic_bag" +} +item { + name: "n04069434" + label: 965 + display_name: "reflex_camera" +} +item { + name: "n03188531" + label: 966 + display_name: "diaper" +} +item { + name: "n02786058" + label: 967 + display_name: "Band_Aid" +} +item { + name: "n07615774" + label: 968 + display_name: "ice_lolly" +} +item { + name: "n04525038" + label: 969 + display_name: "velvet" +} +item { + name: "n04409515" + label: 970 + display_name: "tennis_ball" +} +item { + name: "n03424325" + label: 971 + display_name: "gasmask" +} +item { + name: "n03223299" + label: 972 + display_name: "doormat" +} +item { + name: "n03680355" + label: 973 + display_name: "Loafer" +} +item { + name: "n07614500" + label: 974 + display_name: "ice_cream" +} +item { + name: "n07695742" + label: 975 + display_name: "pretzel" +} +item { + name: "n04033995" + label: 976 + display_name: "quilt" +} +item { + name: "n03710721" + label: 977 + display_name: "maillot" +} +item { + name: "n04392985" + label: 978 + display_name: "tape_player" +} +item { + name: "n03047690" + label: 979 + display_name: "clog" +} +item { + name: "n03584254" + label: 980 + display_name: "iPod" +} +item { + name: "n13054560" + label: 981 + display_name: "bolete" +} +item { + name: "n10565667" + label: 982 + display_name: "scuba_diver" +} +item { + name: "n03950228" + label: 983 + display_name: "pitcher" +} +item { + name: "n03729826" + label: 984 + display_name: "matchstick" +} +item { + name: "n02837789" + label: 985 + display_name: "bikini" +} +item { + name: "n04254777" + label: 986 + display_name: "sock" +} +item { + name: "n02988304" + label: 987 + display_name: "CD_player" +} +item { + name: "n03657121" + label: 988 + display_name: "lens_cap" +} +item { + name: "n04417672" + label: 989 + display_name: "thatch" +} +item { + name: "n04523525" + label: 990 + display_name: "vault" +} +item { + name: "n02815834" + label: 991 + display_name: "beaker" +} +item { + name: "n09229709" + label: 992 + display_name: "bubble" +} +item { + name: "n07697313" + label: 993 + display_name: "cheeseburger" +} +item { + name: "n03888605" + label: 994 + display_name: "parallel_bars" +} +item { + name: "n03355925" + label: 995 + display_name: "flagpole" +} +item { + name: "n03063599" + label: 996 + display_name: "coffee_mug" +} +item { + name: "n04116512" + label: 997 + display_name: "rubber_eraser" +} +item { + name: "n04325704" + label: 998 + display_name: "stole" +} +item { + name: "n07831146" + label: 999 + display_name: "carbonara" +} +item { + name: "n03255030" + label: 1000 + display_name: "dumbbell" +} diff --git a/data/ILSVRC2016/labelmap_ilsvrc_det.prototxt b/data/ILSVRC2016/labelmap_ilsvrc_det.prototxt new file mode 100644 index 00000000000..54c493e340f --- /dev/null +++ b/data/ILSVRC2016/labelmap_ilsvrc_det.prototxt @@ -0,0 +1,1005 @@ +item { + name: "none_of_the_above" + label: 0 + display_name: "background" +} +item { + name: "n02672831" + label: 1 + display_name: "accordion" +} +item { + name: "n02691156" + label: 2 + display_name: "airplane" +} +item { + name: "n02219486" + label: 3 + display_name: "ant" +} +item { + name: "n02419796" + label: 4 + display_name: "antelope" +} +item { + name: "n07739125" + label: 5 + display_name: "apple" +} +item { + name: "n02454379" + label: 6 + display_name: "armadillo" +} +item { + name: "n07718747" + label: 7 + display_name: "artichoke" +} +item { + name: "n02764044" + label: 8 + display_name: "axe" +} +item { + name: "n02766320" + label: 9 + display_name: "baby_bed" +} +item { + name: "n02769748" + label: 10 + display_name: "backpack" +} +item { + name: "n07693725" + label: 11 + display_name: "bagel" +} +item { + name: "n02777292" + label: 12 + display_name: "balance_beam" +} +item { + name: "n07753592" + label: 13 + display_name: "banana" +} +item { + name: "n02786058" + label: 14 + display_name: "band_aid" +} +item { + name: "n02787622" + label: 15 + display_name: "banjo" +} +item { + name: "n02799071" + label: 16 + display_name: "baseball" +} +item { + name: "n02802426" + label: 17 + display_name: "basketball" +} +item { + name: "n02807133" + label: 18 + display_name: "bathing_cap" +} +item { + name: "n02815834" + label: 19 + display_name: "beaker" +} +item { + name: "n02131653" + label: 20 + display_name: "bear" +} +item { + name: "n02206856" + label: 21 + display_name: "bee" +} +item { + name: "n07720875" + label: 22 + display_name: "bell_pepper" +} +item { + name: "n02828884" + label: 23 + display_name: "bench" +} +item { + name: "n02834778" + label: 24 + display_name: "bicycle" +} +item { + name: "n02840245" + label: 25 + display_name: "binder" +} +item { + name: "n01503061" + label: 26 + display_name: "bird" +} +item { + name: "n02870880" + label: 27 + display_name: "bookshelf" +} +item { + name: "n02883205" + label: 28 + display_name: "bow_tie" +} +item { + name: "n02879718" + label: 29 + display_name: "bow" +} +item { + name: "n02880940" + label: 30 + display_name: "bowl" +} +item { + name: "n02892767" + label: 31 + display_name: "brassiere" +} +item { + name: "n07880968" + label: 32 + display_name: "burrito" +} +item { + name: "n02924116" + label: 33 + display_name: "bus" +} +item { + name: "n02274259" + label: 34 + display_name: "butterfly" +} +item { + name: "n02437136" + label: 35 + display_name: "camel" +} +item { + name: "n02951585" + label: 36 + display_name: "can_opener" +} +item { + name: "n02958343" + label: 37 + display_name: "car" +} +item { + name: "n02970849" + label: 38 + display_name: "cart" +} +item { + name: "n02402425" + label: 39 + display_name: "cattle" +} +item { + name: "n02992211" + label: 40 + display_name: "cello" +} +item { + name: "n01784675" + label: 41 + display_name: "centipede" +} +item { + name: "n03000684" + label: 42 + display_name: "chain_saw" +} +item { + name: "n03001627" + label: 43 + display_name: "chair" +} +item { + name: "n03017168" + label: 44 + display_name: "chime" +} +item { + name: "n03062245" + label: 45 + display_name: "cocktail_shaker" +} +item { + name: "n03063338" + label: 46 + display_name: "coffee_maker" +} +item { + name: "n03085013" + label: 47 + display_name: "computer_keyboard" +} +item { + name: "n03793489" + label: 48 + display_name: "computer_mouse" +} +item { + name: "n03109150" + label: 49 + display_name: "corkscrew" +} +item { + name: "n03128519" + label: 50 + display_name: "cream" +} +item { + name: "n03134739" + label: 51 + display_name: "croquet_ball" +} +item { + name: "n03141823" + label: 52 + display_name: "crutch" +} +item { + name: "n07718472" + label: 53 + display_name: "cucumber" +} +item { + name: "n03797390" + label: 54 + display_name: "cup_or_mug" +} +item { + name: "n03188531" + label: 55 + display_name: "diaper" +} +item { + name: "n03196217" + label: 56 + display_name: "digital_clock" +} +item { + name: "n03207941" + label: 57 + display_name: "dishwasher" +} +item { + name: "n02084071" + label: 58 + display_name: "dog" +} +item { + name: "n02121808" + label: 59 + display_name: "domestic_cat" +} +item { + name: "n02268443" + label: 60 + display_name: "dragonfly" +} +item { + name: "n03249569" + label: 61 + display_name: "drum" +} +item { + name: "n03255030" + label: 62 + display_name: "dumbbell" +} +item { + name: "n03271574" + label: 63 + display_name: "electric_fan" +} +item { + name: "n02503517" + label: 64 + display_name: "elephant" +} +item { + name: "n03314780" + label: 65 + display_name: "face_powder" +} +item { + name: "n07753113" + label: 66 + display_name: "fig" +} +item { + name: "n03337140" + label: 67 + display_name: "filing_cabinet" +} +item { + name: "n03991062" + label: 68 + display_name: "flower_pot" +} +item { + name: "n03372029" + label: 69 + display_name: "flute" +} +item { + name: "n02118333" + label: 70 + display_name: "fox" +} +item { + name: "n03394916" + label: 71 + display_name: "french_horn" +} +item { + name: "n01639765" + label: 72 + display_name: "frog" +} +item { + name: "n03400231" + label: 73 + display_name: "frying_pan" +} +item { + name: "n02510455" + label: 74 + display_name: "giant_panda" +} +item { + name: "n01443537" + label: 75 + display_name: "goldfish" +} +item { + name: "n03445777" + label: 76 + display_name: "golf_ball" +} +item { + name: "n03445924" + label: 77 + display_name: "golfcart" +} +item { + name: "n07583066" + label: 78 + display_name: "guacamole" +} +item { + name: "n03467517" + label: 79 + display_name: "guitar" +} +item { + name: "n03483316" + label: 80 + display_name: "hair_dryer" +} +item { + name: "n03476991" + label: 81 + display_name: "hair_spray" +} +item { + name: "n07697100" + label: 82 + display_name: "hamburger" +} +item { + name: "n03481172" + label: 83 + display_name: "hammer" +} +item { + name: "n02342885" + label: 84 + display_name: "hamster" +} +item { + name: "n03494278" + label: 85 + display_name: "harmonica" +} +item { + name: "n03495258" + label: 86 + display_name: "harp" +} +item { + name: "n03124170" + label: 87 + display_name: "hat_with_a_wide_brim" +} +item { + name: "n07714571" + label: 88 + display_name: "head_cabbage" +} +item { + name: "n03513137" + label: 89 + display_name: "helmet" +} +item { + name: "n02398521" + label: 90 + display_name: "hippopotamus" +} +item { + name: "n03535780" + label: 91 + display_name: "horizontal_bar" +} +item { + name: "n02374451" + label: 92 + display_name: "horse" +} +item { + name: "n07697537" + label: 93 + display_name: "hotdog" +} +item { + name: "n03584254" + label: 94 + display_name: "iPod" +} +item { + name: "n01990800" + label: 95 + display_name: "isopod" +} +item { + name: "n01910747" + label: 96 + display_name: "jellyfish" +} +item { + name: "n01882714" + label: 97 + display_name: "koala_bear" +} +item { + name: "n03633091" + label: 98 + display_name: "ladle" +} +item { + name: "n02165456" + label: 99 + display_name: "ladybug" +} +item { + name: "n03636649" + label: 100 + display_name: "lamp" +} +item { + name: "n03642806" + label: 101 + display_name: "laptop" +} +item { + name: "n07749582" + label: 102 + display_name: "lemon" +} +item { + name: "n02129165" + label: 103 + display_name: "lion" +} +item { + name: "n03676483" + label: 104 + display_name: "lipstick" +} +item { + name: "n01674464" + label: 105 + display_name: "lizard" +} +item { + name: "n01982650" + label: 106 + display_name: "lobster" +} +item { + name: "n03710721" + label: 107 + display_name: "maillot" +} +item { + name: "n03720891" + label: 108 + display_name: "maraca" +} +item { + name: "n03759954" + label: 109 + display_name: "microphone" +} +item { + name: "n03761084" + label: 110 + display_name: "microwave" +} +item { + name: "n03764736" + label: 111 + display_name: "milk_can" +} +item { + name: "n03770439" + label: 112 + display_name: "miniskirt" +} +item { + name: "n02484322" + label: 113 + display_name: "monkey" +} +item { + name: "n03790512" + label: 114 + display_name: "motorcycle" +} +item { + name: "n07734744" + label: 115 + display_name: "mushroom" +} +item { + name: "n03804744" + label: 116 + display_name: "nail" +} +item { + name: "n03814639" + label: 117 + display_name: "neck_brace" +} +item { + name: "n03838899" + label: 118 + display_name: "oboe" +} +item { + name: "n07747607" + label: 119 + display_name: "orange" +} +item { + name: "n02444819" + label: 120 + display_name: "otter" +} +item { + name: "n03908618" + label: 121 + display_name: "pencil_box" +} +item { + name: "n03908714" + label: 122 + display_name: "pencil_sharpener" +} +item { + name: "n03916031" + label: 123 + display_name: "perfume" +} +item { + name: "n00007846" + label: 124 + display_name: "person" +} +item { + name: "n03928116" + label: 125 + display_name: "piano" +} +item { + name: "n07753275" + label: 126 + display_name: "pineapple" +} +item { + name: "n03942813" + label: 127 + display_name: "ping-pong_ball" +} +item { + name: "n03950228" + label: 128 + display_name: "pitcher" +} +item { + name: "n07873807" + label: 129 + display_name: "pizza" +} +item { + name: "n03958227" + label: 130 + display_name: "plastic_bag" +} +item { + name: "n03961711" + label: 131 + display_name: "plate_rack" +} +item { + name: "n07768694" + label: 132 + display_name: "pomegranate" +} +item { + name: "n07615774" + label: 133 + display_name: "popsicle" +} +item { + name: "n02346627" + label: 134 + display_name: "porcupine" +} +item { + name: "n03995372" + label: 135 + display_name: "power_drill" +} +item { + name: "n07695742" + label: 136 + display_name: "pretzel" +} +item { + name: "n04004767" + label: 137 + display_name: "printer" +} +item { + name: "n04019541" + label: 138 + display_name: "puck" +} +item { + name: "n04023962" + label: 139 + display_name: "punching_bag" +} +item { + name: "n04026417" + label: 140 + display_name: "purse" +} +item { + name: "n02324045" + label: 141 + display_name: "rabbit" +} +item { + name: "n04039381" + label: 142 + display_name: "racket" +} +item { + name: "n01495701" + label: 143 + display_name: "ray" +} +item { + name: "n02509815" + label: 144 + display_name: "red_panda" +} +item { + name: "n04070727" + label: 145 + display_name: "refrigerator" +} +item { + name: "n04074963" + label: 146 + display_name: "remote_control" +} +item { + name: "n04116512" + label: 147 + display_name: "rubber_eraser" +} +item { + name: "n04118538" + label: 148 + display_name: "rugby_ball" +} +item { + name: "n04118776" + label: 149 + display_name: "ruler" +} +item { + name: "n04131690" + label: 150 + display_name: "salt_or_pepper_shaker" +} +item { + name: "n04141076" + label: 151 + display_name: "saxophone" +} +item { + name: "n01770393" + label: 152 + display_name: "scorpion" +} +item { + name: "n04154565" + label: 153 + display_name: "screwdriver" +} +item { + name: "n02076196" + label: 154 + display_name: "seal" +} +item { + name: "n02411705" + label: 155 + display_name: "sheep" +} +item { + name: "n04228054" + label: 156 + display_name: "ski" +} +item { + name: "n02445715" + label: 157 + display_name: "skunk" +} +item { + name: "n01944390" + label: 158 + display_name: "snail" +} +item { + name: "n01726692" + label: 159 + display_name: "snake" +} +item { + name: "n04252077" + label: 160 + display_name: "snowmobile" +} +item { + name: "n04252225" + label: 161 + display_name: "snowplow" +} +item { + name: "n04254120" + label: 162 + display_name: "soap_dispenser" +} +item { + name: "n04254680" + label: 163 + display_name: "soccer_ball" +} +item { + name: "n04256520" + label: 164 + display_name: "sofa" +} +item { + name: "n04270147" + label: 165 + display_name: "spatula" +} +item { + name: "n02355227" + label: 166 + display_name: "squirrel" +} +item { + name: "n02317335" + label: 167 + display_name: "starfish" +} +item { + name: "n04317175" + label: 168 + display_name: "stethoscope" +} +item { + name: "n04330267" + label: 169 + display_name: "stove" +} +item { + name: "n04332243" + label: 170 + display_name: "strainer" +} +item { + name: "n07745940" + label: 171 + display_name: "strawberry" +} +item { + name: "n04336792" + label: 172 + display_name: "stretcher" +} +item { + name: "n04356056" + label: 173 + display_name: "sunglasses" +} +item { + name: "n04371430" + label: 174 + display_name: "swimming_trunks" +} +item { + name: "n02395003" + label: 175 + display_name: "swine" +} +item { + name: "n04376876" + label: 176 + display_name: "syringe" +} +item { + name: "n04379243" + label: 177 + display_name: "table" +} +item { + name: "n04392985" + label: 178 + display_name: "tape_player" +} +item { + name: "n04409515" + label: 179 + display_name: "tennis_ball" +} +item { + name: "n01776313" + label: 180 + display_name: "tick" +} +item { + name: "n04591157" + label: 181 + display_name: "tie" +} +item { + name: "n02129604" + label: 182 + display_name: "tiger" +} +item { + name: "n04442312" + label: 183 + display_name: "toaster" +} +item { + name: "n06874185" + label: 184 + display_name: "traffic_light" +} +item { + name: "n04468005" + label: 185 + display_name: "train" +} +item { + name: "n04487394" + label: 186 + display_name: "trombone" +} +item { + name: "n03110669" + label: 187 + display_name: "trumpet" +} +item { + name: "n01662784" + label: 188 + display_name: "turtle" +} +item { + name: "n03211117" + label: 189 + display_name: "tv_or_monitor" +} +item { + name: "n04509417" + label: 190 + display_name: "unicycle" +} +item { + name: "n04517823" + label: 191 + display_name: "vacuum" +} +item { + name: "n04536866" + label: 192 + display_name: "violin" +} +item { + name: "n04540053" + label: 193 + display_name: "volleyball" +} +item { + name: "n04542943" + label: 194 + display_name: "waffle_iron" +} +item { + name: "n04554684" + label: 195 + display_name: "washer" +} +item { + name: "n04557648" + label: 196 + display_name: "water_bottle" +} +item { + name: "n04530566" + label: 197 + display_name: "watercraft" +} +item { + name: "n02062744" + label: 198 + display_name: "whale" +} +item { + name: "n04591713" + label: 199 + display_name: "wine_bottle" +} +item { + name: "n02391049" + label: 200 + display_name: "zebra" +} diff --git a/data/VOC0712/coco_voc_map.txt b/data/VOC0712/coco_voc_map.txt new file mode 100644 index 00000000000..7ff84d19b61 --- /dev/null +++ b/data/VOC0712/coco_voc_map.txt @@ -0,0 +1,21 @@ +0,0,background +5,1,aeroplane +2,2,bicycle +15,3,bird +9,4,boat +40,5,bottle +6,6,bus +3,7,car +16,8,cat +57,9,chair +20,10,cow +61,11,diningtable +17,12,dog +18,13,horse +4,14,motorbike +1,15,person +59,16,pottedplant +19,17,sheep +58,18,sofa +7,19,train +63,20,tvmonitor diff --git a/data/VOC0712/create_data.sh b/data/VOC0712/create_data.sh new file mode 100644 index 00000000000..ffcc97d747b --- /dev/null +++ b/data/VOC0712/create_data.sh @@ -0,0 +1,25 @@ +cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd ) +root_dir=$cur_dir/../.. + +cd $root_dir + +redo=1 +data_root_dir="$HOME/data/VOCdevkit" +dataset_name="VOC0712" +mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt" +anno_type="detection" +db="lmdb" +min_dim=0 +max_dim=0 +width=0 +height=0 + +extra_cmd="--encode-type=jpg --encoded" +if [ $redo ] +then + extra_cmd="$extra_cmd --redo" +fi +for subset in test trainval +do + python $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name +done diff --git a/data/VOC0712/create_list.sh b/data/VOC0712/create_list.sh new file mode 100644 index 00000000000..67eb1007b2b --- /dev/null +++ b/data/VOC0712/create_list.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +root_dir=$HOME/data/VOCdevkit/ +sub_dir=ImageSets/Main +bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +for dataset in trainval test +do + dst_file=$bash_dir/$dataset.txt + if [ -f $dst_file ] + then + rm -f $dst_file + fi + for name in VOC2007 VOC2012 + do + if [[ $dataset == "test" && $name == "VOC2012" ]] + then + continue + fi + echo "Create list for $name $dataset..." + dataset_file=$root_dir/$name/$sub_dir/$dataset.txt + + img_file=$bash_dir/$dataset"_img.txt" + cp $dataset_file $img_file + sed -i "s/^/$name\/JPEGImages\//g" $img_file + sed -i "s/$/.jpg/g" $img_file + + label_file=$bash_dir/$dataset"_label.txt" + cp $dataset_file $label_file + sed -i "s/^/$name\/Annotations\//g" $label_file + sed -i "s/$/.xml/g" $label_file + + paste -d' ' $img_file $label_file >> $dst_file + + rm -f $label_file + rm -f $img_file + done + + # Generate image name and size infomation. + if [ $dataset == "test" ] + then + $bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt" + fi + + # Shuffle trainval file. + if [ $dataset == "trainval" ] + then + rand_file=$dst_file.random + cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle();' > $rand_file + mv $rand_file $dst_file + fi +done diff --git a/data/VOC0712/labelmap_voc.prototxt b/data/VOC0712/labelmap_voc.prototxt new file mode 100644 index 00000000000..b5c177b7245 --- /dev/null +++ b/data/VOC0712/labelmap_voc.prototxt @@ -0,0 +1,105 @@ +item { + name: "none_of_the_above" + label: 0 + display_name: "background" +} +item { + name: "aeroplane" + label: 1 + display_name: "aeroplane" +} +item { + name: "bicycle" + label: 2 + display_name: "bicycle" +} +item { + name: "bird" + label: 3 + display_name: "bird" +} +item { + name: "boat" + label: 4 + display_name: "boat" +} +item { + name: "bottle" + label: 5 + display_name: "bottle" +} +item { + name: "bus" + label: 6 + display_name: "bus" +} +item { + name: "car" + label: 7 + display_name: "car" +} +item { + name: "cat" + label: 8 + display_name: "cat" +} +item { + name: "chair" + label: 9 + display_name: "chair" +} +item { + name: "cow" + label: 10 + display_name: "cow" +} +item { + name: "diningtable" + label: 11 + display_name: "diningtable" +} +item { + name: "dog" + label: 12 + display_name: "dog" +} +item { + name: "horse" + label: 13 + display_name: "horse" +} +item { + name: "motorbike" + label: 14 + display_name: "motorbike" +} +item { + name: "person" + label: 15 + display_name: "person" +} +item { + name: "pottedplant" + label: 16 + display_name: "pottedplant" +} +item { + name: "sheep" + label: 17 + display_name: "sheep" +} +item { + name: "sofa" + label: 18 + display_name: "sofa" +} +item { + name: "train" + label: 19 + display_name: "train" +} +item { + name: "tvmonitor" + label: 20 + display_name: "tvmonitor" +} diff --git a/data/coco/README.md b/data/coco/README.md new file mode 100644 index 00000000000..7589a7cbd3c --- /dev/null +++ b/data/coco/README.md @@ -0,0 +1,38 @@ +### Preparation +1. Download Images and Annotations from [MSCOCO](http://mscoco.org/dataset/#download). By default, we assume the data is stored in `$HOME/data/coco` + +2. Get the coco code. We will call the directory that you cloned coco into `$COCO_ROOT` + ```Shell + git clone https://github.com/weiliu89/coco.git + cd coco + git checkout dev + ``` + +3. Build the coco code. + ```Shell + cd PythonAPI + python setup.py build_ext --inplace + ``` + +4. Split the annotation to many files per image and get the image size info. + ```Shell + # Check scripts/batch_split_annotation.py and change settings accordingly. + python scripts/batch_split_annotation.py + # Create the minival2014_name_size.txt and test-dev2015_name_size.txt in $CAFFE_ROOT/data/coco + python scripts/batch_get_image_size.py + ``` + +5. Create the LMDB file. + ```Shell + cd $CAFFE_ROOT + # Create the minival.txt, testdev.txt, test.txt, train.txt in data/coco/ + python data/coco/create_list.py + # You can modify the parameters in create_data.sh if needed. + # It will create lmdb files for minival, testdev, test, and train with encoded original image: + # - $HOME/data/coco/lmdb/coco_minival_lmdb + # - $HOME/data/coco/lmdb/coco_testdev_lmdb + # - $HOME/data/coco/lmdb/coco_test_lmdb + # - $HOME/data/coco/lmdb/coco_train_lmdb + # and make soft links at examples/coco/ + ./data/coco/create_data.sh + ``` diff --git a/data/coco/create_data.sh b/data/coco/create_data.sh new file mode 100644 index 00000000000..32f45e6d7d9 --- /dev/null +++ b/data/coco/create_data.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd ) +root_dir=$cur_dir/../.. + +cd $root_dir + +redo=true +data_root_dir="$HOME/data/coco" +dataset_name="coco" +mapfile="$root_dir/data/$dataset_name/labelmap_coco.prototxt" +anno_type="detection" +label_type="json" #"xml" +db="lmdb" +min_dim=0 +max_dim=0 +width=0 +height=0 + +extra_cmd="--encode-type=jpg --encoded" +if $redo +then + extra_cmd="$extra_cmd --redo" +fi +for subset in minival testdev train test +do + python $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-type=$label_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name 2>&1 | tee $root_dir/data/$dataset_name/$subset.log +done diff --git a/data/coco/create_list.py b/data/coco/create_list.py new file mode 100644 index 00000000000..cdd86f3b2d3 --- /dev/null +++ b/data/coco/create_list.py @@ -0,0 +1,125 @@ +import argparse +import os +from random import shuffle +import shutil +import subprocess +import sys + +HOMEDIR = os.path.expanduser("~") +CURDIR = os.path.dirname(os.path.realpath(__file__)) + +# If true, re-create all list files. +redo = True +# The root directory which holds all information of the dataset. +data_dir = "{}/data/coco".format(HOMEDIR) +# The directory name which holds the image sets. +imgset_dir = "ImageSets" +# The direcotry which contains the images. +img_dir = "images" +img_ext = "jpg" +# The directory which contains the annotations. +anno_dir = "Annotations" +anno_ext = "json" + +train_list_file = "{}/train.txt".format(CURDIR) +minival_list_file = "{}/minival.txt".format(CURDIR) +testdev_list_file = "{}/testdev.txt".format(CURDIR) +test_list_file = "{}/test.txt".format(CURDIR) + +# Create training set. +# We follow Ross Girschick's split. +if redo or not os.path.exists(train_list_file): + datasets = ["train2014"]#, "valminusminival2014"] + img_files = [] + anno_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n") + subset = name.split("_")[1] + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)), \ + "{}/{} does not exist".format(data_dir, img_file) + anno_file = "{}/{}/{}.{}".format(anno_dir, subset, name, anno_ext) + assert os.path.exists("{}/{}".format(data_dir, anno_file)), \ + "{}/{} does not exist".format(data_dir, anno_file) + img_files.append(img_file) + anno_files.append(anno_file) + # Shuffle the images. + idx = [i for i in xrange(len(img_files))] + shuffle(idx) + with open(train_list_file, "w") as f: + for i in idx: + f.write("{} {}\n".format(img_files[i], anno_files[i])) + +if redo or not os.path.exists(minival_list_file): + datasets = ["val2014"] + subset = "val2014" + img_files = [] + anno_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n") + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)), \ + "{}/{} does not exist".format(data_dir, img_file) + anno_file = "{}/{}/{}.{}".format(anno_dir, subset, name, anno_ext) + assert os.path.exists("{}/{}".format(data_dir, anno_file)), \ + "{}/{} does not exist".format(data_dir, anno_file) + img_files.append(img_file) + anno_files.append(anno_file) + with open(minival_list_file, "w") as f: + for i in xrange(len(img_files)): + f.write("{} {}\n".format(img_files[i], anno_files[i])) + +if redo or not os.path.exists(testdev_list_file): +# datasets = ["test-dev2015"] +# subset = "test2015" + datasets = ["test2014"] + subset = "test2014" + img_files = [] + anno_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n") + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)), \ + "{}/{} does not exist".format(data_dir, img_file) + anno_file = "{}/{}/{}.{}".format(anno_dir, subset, name, anno_ext) + assert os.path.exists("{}/{}".format(data_dir, anno_file)), \ + "{}/{} does not exist".format(data_dir, anno_file) + img_files.append(img_file) + anno_files.append(anno_file) + with open(testdev_list_file, "w") as f: + for i in xrange(len(img_files)): + f.write("{} {}\n".format(img_files[i], anno_files[i])) + +if redo or not os.path.exists(test_list_file): + # datasets = ["test2015"] + # subset = "test2015" + datasets = ["test2014"] + subset = "test2014" + img_files = [] + anno_files = [] + for dataset in datasets: + imgset_file = "{}/{}/{}.txt".format(data_dir, imgset_dir, dataset) + with open(imgset_file, "r") as f: + for line in f.readlines(): + name = line.strip("\n") + img_file = "{}/{}/{}.{}".format(img_dir, subset, name, img_ext) + assert os.path.exists("{}/{}".format(data_dir, img_file)), \ + "{}/{} does not exist".format(data_dir, img_file) + anno_file = "{}/{}/{}.{}".format(anno_dir, subset, name, anno_ext) + assert os.path.exists("{}/{}".format(data_dir, anno_file)), \ + "{}/{} does not exist".format(data_dir, anno_file) + img_files.append(img_file) + anno_files.append(anno_file) + with open(test_list_file, "w") as f: + for i in xrange(len(img_files)): + f.write("{} {}\n".format(img_files[i], anno_files[i])) + diff --git a/data/coco/labelmap_coco.prototxt b/data/coco/labelmap_coco.prototxt new file mode 100644 index 00000000000..82252d2e9dc --- /dev/null +++ b/data/coco/labelmap_coco.prototxt @@ -0,0 +1,405 @@ +item { + name: "none_of_the_above" + label: 0 + display_name: "background" +} +item { + name: "1" + label: 1 + display_name: "person" +} +item { + name: "2" + label: 2 + display_name: "bicycle" +} +item { + name: "3" + label: 3 + display_name: "car" +} +item { + name: "4" + label: 4 + display_name: "motorcycle" +} +item { + name: "5" + label: 5 + display_name: "airplane" +} +item { + name: "6" + label: 6 + display_name: "bus" +} +item { + name: "7" + label: 7 + display_name: "train" +} +item { + name: "8" + label: 8 + display_name: "truck" +} +item { + name: "9" + label: 9 + display_name: "boat" +} +item { + name: "10" + label: 10 + display_name: "traffic light" +} +item { + name: "11" + label: 11 + display_name: "fire hydrant" +} +item { + name: "13" + label: 12 + display_name: "stop sign" +} +item { + name: "14" + label: 13 + display_name: "parking meter" +} +item { + name: "15" + label: 14 + display_name: "bench" +} +item { + name: "16" + label: 15 + display_name: "bird" +} +item { + name: "17" + label: 16 + display_name: "cat" +} +item { + name: "18" + label: 17 + display_name: "dog" +} +item { + name: "19" + label: 18 + display_name: "horse" +} +item { + name: "20" + label: 19 + display_name: "sheep" +} +item { + name: "21" + label: 20 + display_name: "cow" +} +item { + name: "22" + label: 21 + display_name: "elephant" +} +item { + name: "23" + label: 22 + display_name: "bear" +} +item { + name: "24" + label: 23 + display_name: "zebra" +} +item { + name: "25" + label: 24 + display_name: "giraffe" +} +item { + name: "27" + label: 25 + display_name: "backpack" +} +item { + name: "28" + label: 26 + display_name: "umbrella" +} +item { + name: "31" + label: 27 + display_name: "handbag" +} +item { + name: "32" + label: 28 + display_name: "tie" +} +item { + name: "33" + label: 29 + display_name: "suitcase" +} +item { + name: "34" + label: 30 + display_name: "frisbee" +} +item { + name: "35" + label: 31 + display_name: "skis" +} +item { + name: "36" + label: 32 + display_name: "snowboard" +} +item { + name: "37" + label: 33 + display_name: "sports ball" +} +item { + name: "38" + label: 34 + display_name: "kite" +} +item { + name: "39" + label: 35 + display_name: "baseball bat" +} +item { + name: "40" + label: 36 + display_name: "baseball glove" +} +item { + name: "41" + label: 37 + display_name: "skateboard" +} +item { + name: "42" + label: 38 + display_name: "surfboard" +} +item { + name: "43" + label: 39 + display_name: "tennis racket" +} +item { + name: "44" + label: 40 + display_name: "bottle" +} +item { + name: "46" + label: 41 + display_name: "wine glass" +} +item { + name: "47" + label: 42 + display_name: "cup" +} +item { + name: "48" + label: 43 + display_name: "fork" +} +item { + name: "49" + label: 44 + display_name: "knife" +} +item { + name: "50" + label: 45 + display_name: "spoon" +} +item { + name: "51" + label: 46 + display_name: "bowl" +} +item { + name: "52" + label: 47 + display_name: "banana" +} +item { + name: "53" + label: 48 + display_name: "apple" +} +item { + name: "54" + label: 49 + display_name: "sandwich" +} +item { + name: "55" + label: 50 + display_name: "orange" +} +item { + name: "56" + label: 51 + display_name: "broccoli" +} +item { + name: "57" + label: 52 + display_name: "carrot" +} +item { + name: "58" + label: 53 + display_name: "hot dog" +} +item { + name: "59" + label: 54 + display_name: "pizza" +} +item { + name: "60" + label: 55 + display_name: "donut" +} +item { + name: "61" + label: 56 + display_name: "cake" +} +item { + name: "62" + label: 57 + display_name: "chair" +} +item { + name: "63" + label: 58 + display_name: "couch" +} +item { + name: "64" + label: 59 + display_name: "potted plant" +} +item { + name: "65" + label: 60 + display_name: "bed" +} +item { + name: "67" + label: 61 + display_name: "dining table" +} +item { + name: "70" + label: 62 + display_name: "toilet" +} +item { + name: "72" + label: 63 + display_name: "tv" +} +item { + name: "73" + label: 64 + display_name: "laptop" +} +item { + name: "74" + label: 65 + display_name: "mouse" +} +item { + name: "75" + label: 66 + display_name: "remote" +} +item { + name: "76" + label: 67 + display_name: "keyboard" +} +item { + name: "77" + label: 68 + display_name: "cell phone" +} +item { + name: "78" + label: 69 + display_name: "microwave" +} +item { + name: "79" + label: 70 + display_name: "oven" +} +item { + name: "80" + label: 71 + display_name: "toaster" +} +item { + name: "81" + label: 72 + display_name: "sink" +} +item { + name: "82" + label: 73 + display_name: "refrigerator" +} +item { + name: "84" + label: 74 + display_name: "book" +} +item { + name: "85" + label: 75 + display_name: "clock" +} +item { + name: "86" + label: 76 + display_name: "vase" +} +item { + name: "87" + label: 77 + display_name: "scissors" +} +item { + name: "88" + label: 78 + display_name: "teddy bear" +} +item { + name: "89" + label: 79 + display_name: "hair drier" +} +item { + name: "90" + label: 80 + display_name: "toothbrush" +} diff --git a/data/coco/labels.txt b/data/coco/labels.txt new file mode 100644 index 00000000000..146dd8daae0 --- /dev/null +++ b/data/coco/labels.txt @@ -0,0 +1,80 @@ +1,1,person +2,2,bicycle +3,3,car +4,4,motorcycle +5,5,airplane +6,6,bus +7,7,train +8,8,truck +9,9,boat +10,10,traffic light +11,11,fire hydrant +13,12,stop sign +14,13,parking meter +15,14,bench +16,15,bird +17,16,cat +18,17,dog +19,18,horse +20,19,sheep +21,20,cow +22,21,elephant +23,22,bear +24,23,zebra +25,24,giraffe +27,25,backpack +28,26,umbrella +31,27,handbag +32,28,tie +33,29,suitcase +34,30,frisbee +35,31,skis +36,32,snowboard +37,33,sports ball +38,34,kite +39,35,baseball bat +40,36,baseball glove +41,37,skateboard +42,38,surfboard +43,39,tennis racket +44,40,bottle +46,41,wine glass +47,42,cup +48,43,fork +49,44,knife +50,45,spoon +51,46,bowl +52,47,banana +53,48,apple +54,49,sandwich +55,50,orange +56,51,broccoli +57,52,carrot +58,53,hot dog +59,54,pizza +60,55,donut +61,56,cake +62,57,chair +63,58,couch +64,59,potted plant +65,60,bed +67,61,dining table +70,62,toilet +72,63,tv +73,64,laptop +74,65,mouse +75,66,remote +76,67,keyboard +77,68,cell phone +78,69,microwave +79,70,oven +80,71,toaster +81,72,sink +82,73,refrigerator +84,74,book +85,75,clock +86,76,vase +87,77,scissors +88,78,teddy bear +89,79,hair drier +90,80,toothbrush diff --git a/examples/02-fine-tuning.ipynb b/examples/02-fine-tuning.ipynb index 07ca8df4d74..3372f549cd9 100644 --- a/examples/02-fine-tuning.ipynb +++ b/examples/02-fine-tuning.ipynb @@ -762,7 +762,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEPCAYAAACp/QjLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8VFX6/z8nJBAS0iAkQJCuoCC6IJbFEjvWtay6rq79\nu/ysW3R13XVXEAsdFZFFFFxXwYYVEQSlKChFWpBOSEgjpJOeSeb5/fF4cu/cuXfmzmRa4nm/XrxI\nJndumbn3fM7neZ5zjiAiKBQKhUKhJyrcJ6BQKBSKyEOJg0KhUCjcUOKgUCgUCjeUOCgUCoXCDSUO\nCoVCoXBDiYNCoVAo3AiqOAghFgghioUQWRZ/TxVCLBdCbBdC7BJC3BXM81EoFAqFPYLtHBYCGOfh\n7w8B2EZEpwPIBDBDCBEd5HNSKBQKhReCKg5E9C2ACg+bFAFI/PnnRABlRNQczHNSKBQKhXfC3Uuf\nD+AbIUQhgAQAN4f5fBQKhUKB8Cek/wFgOxH1AXA6gDlCiIQwn5NCoVD84gm3c/g1gOcAgIgOCSEO\nAxgKYIt+IyGEmgBKoVAo/ICIhD/vC7dz2AvgEgAQQqSDhSHbbEMiUv8C9O/pp58O+zl0lH/qs1Sf\nZyT/awtBdQ5CiMUALgCQKoTIA/A0gBgAIKJ5AJ4HsFAIsQMsVI8TUXkwz0mhUCgU3gmqOBDRrV7+\nXgrgmmCeg0KhUCh8J9xhJUUYyMzMDPcpdBjUZxlY1OcZOYi2xqVCgRCC2sN5KhQKRSQhhAC104S0\nQqFQKCIQJQ4KhUKhcEOJg0KhUCjcUOKgUCgUCjeUOCgUCoXCDSUOCoVCoXBDiYNCoVAo3FDioFAo\nFAo3lDgoFAqFwg0lDgqFQqFwQ4mDQqFQKNxQ4qBQKBQKN5Q4KBQKhcINJQ4KhUKhcEOJg0KhUCjc\nUOKgUCgUCjeUOCgUCoXCDSUONtlftj/cp6BQKBQhQ4mDDbKKs3Dq3FNR56gL96koFApFSFDiYINl\nB5ahqaUJP+T/EO5TCSgNzQ2od9SH+zRcOFB2ALVNteE+DYXiF88vQhyaWpra9P5lB5fh9F6nY23O\nWp/eV+eoAxG16diShuaG1p9bnC1t3l9jcyMu+u9FeHzl423eV6CobapF5n8z8e/V//Z7H6V1pbj3\n03tR01QTwDMLP9WN1ThaczTcp6H4BRFUcRBCLBBCFAshsjxskymE2CaE2CWEWNPWYxob42O1xzDg\nxQH4bN9nfu2vsqES24q24d/n/xtrc+2LQ01TDU7/z+mYv3W+5TaldaXYVLDJ674+2vMRLn7rYgBA\ns7MZvWf0RvLkZIx7exxyK3NdtrUjHESEB5c9iE5RnbBkzxI4yQlHiwMb8zd6fW8wmfH9DAzvORwL\nty9EcU2xz+8vry/Hpf+7FB/t/Qif7/scADB9w3R8svcTn/flaHH4/B4AqHfUY3HW4tbfa5tq8Y+v\n/4FhrwxD/vF8v47xfd73GPmfkbjto9taXyurK/Pr/PzlSNWR1mOW15dj1vez2hRm3VywGf/4+h9Y\nsG1B6+ewLncdPt7zcUDO1y6Hyg8FbF9EhIeWPYSdxTtdXvf3Xgo3wXYOCwGMs/qjECIZwBwA1xDR\nCAC/9ecg0hnUNNVg6CtDW3v4RIQ/fv5HDEsdhr+v+juanc0AuNf86IpHbd0YKw+txHn9z8Mlgy7B\nlsItqG2qxbi3x2H6huke3/fXFX9F15iuWLBtAQAgpzIHS/cvddlm/NLxuPvTu03fP2fTHHyd/TUA\nYPGuxfg+73uU1pViY/5G9Enog+w/ZePigRdjzPwxmLR2ElZlr8LVi67Gma+f6fWa5myeg40FG7Hs\n98uQGpeKDXkb8Ma2NzB2wVjsOLrDbfuaphpUNlQC4B7swm0LQURwkhN3fHyHm6gcrTkKJzm9nsdL\nP7yEPSV7AABF1UV4aeNLmHf1PNx26m2YtmEaAH6w/vXNv7C1aKvX/d372b24oP8FmHX5LLy/+33U\nNtXi2XXP4l+r/+XVwe0u2d16PyzKWoQRc0fYugYjn+77FLd/fDsq6isAAFe8cwUOVRzCdcOuww3v\n3YCG5gYQEaaun4qMmRmt96QVOZU5uHrx1Xjh4hewpXALSutKsb9sP3rN6IXdJbvdtt91bBfmbp7r\n83l74+EvH8aTXz8JAHhrx1uYsn4KRrw6ArO+n4W1OWtbOyWbCjbhYPlBj/tqbG7ErUtuRU1TDWb9\nMAvvZL0DAJi0bhIe/vJhr07/ze1v4p9f/7P1d39Do0drjmLI7CHYVrQNALcjB8oOYHPB5tbQZk1T\njW33vzJ7JT7e+zEueesSfHngSwDcmRsyewh+LPzRp3MjIr+jDiW1JYHpPMiTCNY/AAMAZFn87QEA\nz9jYB/1l+V/on1//k178/kVam7OWSmpLqKK+gu74+A5KnZpK+0r30RMrn6BBLw2icxecS06nk+Zt\nmUcj546kBkcDXbDwAnpty2tUUV9BV71zFfWf1Z+ue/c6smLN4TV01yd30ah5o+iVja8QEdGY18bQ\nNYuuoXMXnEvDXhlG/1j1D3I6na3vqW2qpTmb5tDNH9xMA18cSOV15dR7em/aU7KHLn3rUuoyqQvt\nOLqDiIi+2P8FDX5pMHWf0p3yq/Jdju1ocVDatDQa89oYqmmsocQXEunXb/yaFmctpqe+foqeWPlE\n67Y7ju6gR5Y9QqfNPY2mrZ9GadPS6HDFYcvrWn14NaVNS6ODZQeJiGjC6gn0wNIH6ISZJ9D/ffZ/\ndM7r51CLs6V1+8r6Sho9bzQNemkQHSo/RFe8fQV1fbYrzdsyj17d9Cr1nNqTzpp/VuvnkFWcRYkv\nJNJLP7zkduyyujK6/aPbqbyunLYXbaeoiVF058d3EhHRYyseo0eWPUJERPlV+dR9Sne665O76OL/\nXkxp09Jo/OfjLa+JiOjHwh+pz4w+VO+op4r6Ckp8IZFmbJhB1yy6hobPGU6rDq1y2b7F2UKbCzZT\nc0sz1TvqacjLQ+iEmSfQzqM7KX1aOvWZ0YdWH17dun3B8QL6Nvdb02Ovy1lHKw6uICKi69+9nro+\n25Xe2/Ue5VTkUI8pPcjR4iCn00k3f3AzDXl5CGW+mUkjXh1Bg14aRBvzN7rtr7qxuvWe+NtXf6O/\nLv8rERHd+N6NtGDrAnpsxWOUMSODbvngFrf33vT+TRT9TDQdKDtA9Y56mrB6ApXUlrQ+D1sLtxIR\n0YqDK2jc2+OopLbE4+dKRFTvqKeE5xOo+5Tu1OBooLNfP5uWH1hOKw+tpAeWPkCnzT2Nhs8ZTnd+\nfCd1mdSFfr/k9x73N/W7qXT1oquJiOij3R/R+QvPp8LjhZT0QhKdt+A8+u/2/7q9J68qjxwtDqpp\nrKFe03tR4guJVFJbQj/k/UDdnu9GhccLWz87/f1rJKcip/W7WrRzEXWZ1IVuW3IbOVocdPbrZ1P/\nWf3ptLmnUfxz8ZQ+LZ2in4mmG9+7kZqam0z31+JsoaLqIiIiuvKdK+n1H1+ntTlrKX1aOjlaHPRN\n9jeECaB7P73X6+e8tXArVdZXUkV9BV3034tanwci/g7s8uSqJ+nRFY8SERE38X623f6+0fYBPIvD\nLACvAFgNYAuAP1hsR8+tnk7PrHmG7l96P501/yxKnpxMUROj6IGlD9DLP7xM/Wf1px5TelBeVR4N\nnT2Unlz1JKVPS6e9JXuJiGhj/kaKey6O4p+Lp9s/up2qG6tpwIsDXBoASXFNMfWa3oumfDeFpnw3\nhUprS4mIG7CE5xMopyKHjtUco1HzRtEDSx+g2qZaWrRzEQ14cQBd/+71tGDrAio4XkBE/HCfOf9M\nOvmVk1vFav6P86nvzL60/MBy+u37v6U3t73pcvyvDn5Fo+aNoiEvD6E/ffknuvStS2n2xtl09yd3\n05jXxpies+SuT+6il3942fRvP+T9QGnT0mjloZWtr2UVZ5GYIGjc2+OoxdlCZ79+Nj279llyOp1U\nWltK5y04jx784kGa9f0sin02li7732WUVZxFqVNTqceUHpRVnEWj5o2ixVmLaWvhVuo3qx89sfIJ\nypiR4XZDP/jFg5QxI4MufetSuvDNC2nC6gmU9EIS5VXlUfcp3Sm7PLt126PVR2nqd1Pp2bXP0u5j\nu6n39N7U4myhktoSWpuzloiIyuvK6dwF59KS3Uvo2sXXulz31Yuups6TOtOXB76k17a81toYEREt\n27+Mhs8ZTsmTk+mOj++gCasn0HXvXkfPrXuOYp6JoT9/+Weavn463fXJXeRocdCdH99JyZOTKXly\ncuv9JGlxttApc06h3tN709Hqo5T4QiI9s+YZuuuTu+jF71+kuz65q3Xb5pZm2lq4ld7f9T5V1FfQ\nQ188RJO/nez2PY3/fDxlzMigwxWHKXVqKh0qP0RERO/sfIcu+99l1HNqT9pWtI3SpqXRruJdre87\nUnmEUian0ONfPU63fHAL3fnxnXTS7JPopNkn0T2f3EMZMzJo+JzhVNNYQ0NnD6VrFl1DQ2cPbd2/\npKyujNbmrKXNBZvJ6XTSlwe+pHMXnEsXLLyAZm6YSalTU10aS6fTSV/s/4Ke+vop2lW8i1Imp7T+\nvbqxunW759Y9R7/78HfUfUr31s+xsbmRek7tSQ9+8SDd8fEdtPzAcjr11VNbOxu1TbX0xMonqPOk\nznTt4mtpwuoJdPMHN9Pdn9xNz659ls5feD6dNPskenTFo1TdWE2DXxpMp809zeUe13PzBzdTv1n9\nqMXZQvd9eh9NXDORUian0ENfPESXvHVJ63HrmuroSOURqnfU01XvXEU3vnejqei8/uPrFPtsLD23\n7jlKm5ZGdU11RER01vyzaNn+ZfTIskfo4WUPU/LkZKqor2j9vF7/8XWauGYivbrpVSqtLaVp66dR\n6tRU6j6lOw18cSDd9+l9lDI5hQqOF9CS3Uuo2/PdWkXNDHluLc4WOmHmCa2d0PYsDq8A2ACgK4Ae\nAPYDONFkOxo9+ml6+mn+t3r1aiIianA0tH4409dPpze2vkFERIuzFlPnSZ1pXc46lw9Q38snIno3\n613qObUnDXppEA2dPZRu/fBWmrZ+Gl3+v8tdeueS7PJsl4a5sr6Szl94PsU+G0sX/fcit94pEdGu\n4l2ECaAVB1eQ0+mkuz+5m2547wZaum8pERHN2zKPbltym8t77v7kbpqxYQbN2TSHMAH02pbXaF/p\nPkqdmkqJLyRSY3Oj23EkS3YvoUvfupSqG6vpkrcuoeUHlhMRN4ipU1Nbj6v/TC5961LalL+p9RpP\n/8/pdPn/Lqf0aen06IpHW2+8lYdWUlVDFRFxj++1La8REbuRqIlRNODFAfTqpleJiHtR8mciop1H\nd1LPqT2puKaYLv/f5XTyKyeTo8VBt3xwC/3qP7+iG967wfKaiIiGvTKMNuZvpHs+uYe6TOpCO4/u\npAeWPkDXLLqGBr00qNU1SN7e8TYNfmkwtThbqK6pjjJmZNC9n95LT656kvrO7Etf7P+Cahpr6MI3\nL6S45+IopyKHnE4nvbntTapurKai6iJKeiGJ7l96P132v8voeMNxmrFhBl3+v8vJ6XRSdnk2Nbc0\n05LdS+iM186gm96/ic6cfyZd8fYVdLDsIPWa3ovOX3g+fbr3U4/f1bi3xxERO7h1OesotzKXUian\n0ANLH6CeU3vSNYuuad2+sr6SYp6JoYv+exEREc3cMJMSX0ikfrP60d+++hv9Zflf6OFlD7f2rk//\nz+lU01hDczfPpRvfu5Eq6yvpyneupNHzRtOlb11KTqeTZm+cTWnT0mjZ/mVExAI2et5oOuO1M6jX\n9F70zs536KEvHqIXvn2B5v84n7pM6uLVxY15bQytOrSKluxeQsmTk6ngeAGtPryaBrw4gBbtXEQb\njmxw2f4vy//i8oyMnjeaHlj6AO0p2UOnzT2Nbnr/JjpSeYR+9+HvKGpiFO0+tpu2F22nrs92peFz\nhlNORQ6lTE6h25bcRnd8fAd9+NOH1H9Wf/rr8r+6iNjekr3Uc2pPGjp7KH2b+y0NemkQZRVn0Z+/\n/HNrp88M6Zbmbp7r8rrT6aTT5p5GMzfMpMEvDaZ/f/Pv1r/N2TSHbvngFuo3qx/tKt5Ft3xwS2vn\n5d/f/JtGzh1JT339FP1+ye8p4fkEOvmVk+lI5RHKrcylLw98SU6nk/785Z/prk/uol7Te9HMDTMp\nbVoaTVs/jSrrK1uP878d/6OTXzmZukzqQm/veJtmLppJ6Velt7aV7VkcngAwQff76wB+a7IdpacT\n7d9v+t254XQ6Ka8qz9Z2Wwu30v7S/bTj6A56c9ub9MiyR+i+T+/z2ADraWpuanUWVmwv2m75t+zy\nbEqflk7birbRKXNOoefWPUcpk1MovyqfaptqaewbY+lYzTFyOp004MUBLo2FGdWN1ZTwfAL97sPf\n0WX/u4zSpqXRje/dSH1n9nUTSyvqHfU05bsprYJhh+KaYhfx/SHvB0qenEwXLLyAzltwHvWY0qNV\nLOqa6uho9VEiolbbbRWykTyx8gm68b0bKXVqKs36fhYNeHEApU9Lp/K6cjrecJwOlB1w2d7pdFJ5\nXXnr72V1ZfTU10/Rje/d2BoGIOKeqQy1GLnqnato0EuDqKyujIj4uz75lZPplDmnULfnu9GZ88+k\n4XOG0yd7PqEDZQco+ploWrhtIRERnfjyiRT/XHxrT9KM0tpSSng+gTblb6IeU3pQz6k96Yq3r6An\nVj5BzS3N9IeP/kDrj6x3ec8fPvoDfb7v89ZrLDheQHtL9tItH9xCYoKgfaX7iIhoS8EWl+uUHK44\nTOnT0imrOKv1tXU566j39N70xtY3aO7mua1h2U35myh9Wjr1ndmXdh7dSRX1FdR5Umf6Jvsby2si\nInp27bN0/9L7aejsoXTpW5fStYuvpdHzRtPirMWm2+8q3kXD5wwnR4uDiNgR3vzBzRT9TDS9+P2L\nrfdVi7OFthVta33f7R/d3uoQ7vv0PsqYkdHaOy+rK6Mr37mSRs4dSe9mvUt5VXn0h4/+QBPXTKTn\n1z1PV75zJaVNS2u9T7zd69Itf5v7LY15bQzdv/R+WpuzlobOHkotzhZqam6i5pbm1u1La0sp9tlY\nGvLyEHI6nbT+yHqKfy6eRs4dSSe+fCIV1xS3bltRX2F6n+RX5VPnSZ3pT1/+iYiIdh/bTbd8cAul\nTE6hyd9Opi/2f0Hp09Lpu9zv6Ie8H6jn1J407u1xNH399NZ9tGdxGAZgFYBOAOIAZAE4xWQ7uvVW\nogULPH5/7ZYhLw+h5MnJ9PIPL9N1715HV71zlel2T656kt7a/pbX/Y17exwNemkQHW84TtuLttNf\nl//VpaEMFftL99M32d/QN9nfuIUuJE6nkz7d+6mbqzOy/sh6wgTQ5G8nk9PppIe+eIje3/V+ME67\nlezybLfeZFZxFi3dt5QcLQ6a/+N8+u37v211Vl9nf936kD+y7BG68b0bvR5j5NyRNOTlIfTi9y/S\nBz99QD2m9KBjNcf8Ol87HSIiMg2P7C3ZS31n9qWkF5JaQxJEHEo9YeYJrd/PvtJ9Xr+rrOIsipoY\nRZlvZlKDo4FOmXMKjXltjMdcgHGfTqfTVNysqKivaM2j6ffx+b7P6YKFF1CfGX3opNknUXldOWWX\nZxMmwDRn44knVz1JnSd1ppkbZtI5r59D3ad0p9kbZ1tuf/2719Pfvvpb6+/HG47Td7nf+fT9rstZ\n5yYch8oP0aVvXeoWHZm0dhJFTYxqzb8QRbA4AFgMoBBAE4A8APcAGA9gvG6bxwD89LMwPGKxH5o9\nm+i++2x/pu2KeVvm0Ue7PwrY/nYc3UF7SvYEbH+RQHNLMz224jGqbaoN96nYoqqhylYj8Kcv/+SS\nn9H3PkPNwbKDtGjnIpfXGpsb3VyZN5xOJ2W+mdmabD9ccdglnxQJnLvgXJr/43yf3tPU3NTaWais\nr6QHlj7QGmY1o6qhyqdEsi84nU4XESDiQhZjdKAt4iD4/ZGNEIJ+/JHwhz8AP/0U7rNRKAJHdkU2\nCqsLcW6/c8N9Kr8ojjceR7fO3RAlOvY4YCEEiEj49d72Ig4OByElBThyBEhJCfcZKRQKReTTFnFo\nN7IZHQ2MGQP80LGmN1IoFIqIpN2IAwCMHQts2BDus1AoFIqOT7sSh3POUeKgUCgUoaBdicOIEcC+\nfeE+C4VCoej4tJuENBGhpQWIjwcqK4HY2HCflUKhUEQ2v4iENAB06gT06wfk5IT7TBQKhaJj067E\nAQAGDQKys8N9FgqFQtGxaXfiMHCgEgeFQqEINu1OHJRzUCgUiuCjxEGhUCgUbihxUCgUCoUb7VYc\nIrECt64O+L//C/dZKBQKRdtpd+KQlAR06QKUlIT7TNxZsgRYsCDcZ6FQKBRtp92JAxC5oaXXXwec\nTqClJdxnolAoFG2j3YrD4cPhPgtX9u8H9u4FOncGGhvDfTYKhULRNtqtOBw8GO6zcGXBAuDOO4Gu\nXYGmpnCfjUKhULSNdikOQ4dG3gR8O3YAmZnsHJQ4KBSK9k67FIdhwzRxKCsDZswI7/kAHEqKjVXi\noFAoOgbtUhyGDuX4PhGwejUwe3a4z4jFoXNnrqRS4qBQKNo77VIcUlKAuDigsBD48Ufg2LHQjHs4\nehTYtcv8b42NLAzKOSgUio5AuxQHQAstbd0K1NcDtbXBP+bHHwOzZpn/TS8OqlpJoVC0d9qtOAwd\nCuzZw86hWzd2D8GmoQFobjb/m3IOCoWiIxFUcRBCLBBCFAshsrxsN0YI0SyEuMHuvocNA1auBGJi\ngFNOCY041NcrcVAoFL8Mgu0cFgIY52kDIUQnAFMALAdgezm7YcOAZcuA0aOBtDTlHBQKhSKQBFUc\niOhbABVeNnsYwIcAfJotaehQwOEIvTg4HOZ/U+KgUCg6EtHhPLgQIgPAbwBcBGAMANs1RwMGcEM8\nejQ3xso5KOzidAJC8D+FQmFOWMUBwIsA/k5EJIQQ8BBWmjBhQuvPmZmZyMzMxEMPAWPH8lQaR44E\n/2TtiIMa5xD5/OtfQL9+wPjx4T4ThSKwrFmzBmvWrAnIvsItDqMBvMu6gFQAVwghHET0mXFDvThI\n5MjotDSuWgok330HFBQAt9yivWYlDvK16GhVytoeqKhg96BQdDRkx1kyceJEv/cV1lJWIhpERAOJ\naCA473C/mTB4Ixg5hxUrgK++cn2tvt4859DUxI4BUGGl9kBTU2SuB6JQRBJBdQ5CiMUALgCQKoTI\nA/A0gBgAIKJ5gTpOMMQhN9e9kbdyDjKkBChxaA84HEBlZbjPQqGIbIIqDkR0qw/b3u3vcYIlDomJ\nrq8pcegYOByhKWBQKNoz7XaEtJ7UVKC0NLBx5Nxc9yk5rEpZlTi0LxwOFVZSKLzRIcShc2cgIYET\njYGguRnIzzcXB+Uc2j9KHBQK73QIcQACG1oqKuJ1oH0Rh86d+WdVyhr5OBzA8eOqqkyh8IQSBxNy\nc3l/RnGwmlvJ6BxUoxPZyNCgcg8KhTVKHEzIzeXJ/FTOoWOixEGh8I4SBxM8iYPKObR/HA5e0lVV\nLCkU1nQYcejbl6fRCARHjgAnn8xhJH0FlBKHjoHDAWRkKOegUHiiw4jDuHHA0qWBWS40NxcYOJAb\n/Pp67XUVVuoYOBxAnz5KHBQKT3QYcfjVr7iR3rOn7fvKzeWJ2eLjgbo6fq25mSuYlHNo/0hxUGEl\nhcKaDiMOQgC/+Q3w6adt2w8Ri0P//iwOMu8gHYQSh/aPcg4KhXc6jDgAgRGH8nJeejQx0VUcGhqA\nrl29i0OXLqqUNdJROQeFwjsdShwuuADYvx84etT1dX2eYOtWYP16632UlgI9e/LPRnFISFCzsnYE\nVFhJofBOhxKHmBhePjQ7W3utpQUYPhzYsoV//89/gHfesd5HRQXQvTv/bBSHbt3YORiT3uEMK/3t\nb8CCBaE7XkdAhZUUCu90KHEAuNev7xF+9RVw4ACwejX/vnGj50ahogJISeGfjeIQFwdERblP8BdO\ncdi0CcjLC93xOgJKHBQK73RIcdA/9G+8AVx4IYeSamqAXbv8F4fYWF7tzRhaCpc4EAE//aTWJvAV\nh4Nn8q2vV/khhcKKcC8TGnDS0rTG/9gx4OuvecnPCy8ENm/mRLOnWHN5ubk41Ndr4mBMSjc2ams/\nhFIcjh0DysqUOPiKw8HfU48e/Pn16RPuM1IoIo8O6Rxk4//++8C113LOITaWcw1XXNE25xATYy4O\nclbWUIrDTz/x/0ocfMPh4O9RVZYpFNZ0SHGQjf/evcAZZ/DPY8cCb78NXHklN6YtLebv95SQ9uQc\nwlHKuns3cOKJShx8gYi/v5gYVVmmUHiiw4mDPqyUn89zLgHAr3/NjfbYsUBSEoePzNA7h7g493EO\nkZRz+Oknvp6OKg47dwKzZwd2nw4Hf4dC8HdlVpqsUCg6oDjonYNeHM4/H+jdGxgwwL2iSY9VzsFb\nWEmJQ+DZuLHtgxqNyJASwP8r56BQmNMhxUE2/Hl5mjicdhqQlcU9RmNFkx471UqRIA6yUqkji8Ox\nYzwoMZDoxaEjOoejR7WybYWiLXRIcSgt5Qa7spLDTJIePfh/fejJiJU46KuVIiGsJAXwpJOA6mr3\nsRcdgWCLQ0d0Dl99Bbz0UrjPQtER6HDiEBvLDfWePRxG6tTJfRtvzqEtCelQicOePbzmRKdOfJ7V\n1YE/RmkpT4UeLo4d4+8pENOwSzq6cygtDc81lZUB06eH/riK4BFUcRBCLBBCFAshsiz+fpsQYocQ\nYqcQYr0QYmQgjtuzJ8+hJENKZn8/dowb8TffdO11G52DnLLbbs5B9kYD2aCZceQI508AIDk5OKGl\no0eBFSsCt4iSHZYs0aY/kd9RTU3g9t/RnUO4xGH/fuCtt0J/XEXwCLZzWAjAU98zG8D5RDQSwCQA\nrwXioGlpwLZtnsWhpIQTnnffDfz97/x6YyM3FvHx/LvZrKxmzkE/8V5UlHnoKdAcOcJrTgAsDhUV\ngT+GFMYVKwK/byteeglYuZJ/lqGzQIaWfgnOwWzm4GBTX9/xPstIgyj4nU49QRUHIvoWgGWzRUTf\nE1HVz7+C3BnvAAAgAElEQVRuBGDRnPuGN+cgcw6bNwO/+x2vILdwoeYahODt/Jk+A+Cfg90jNYpD\nMJxDOMTh8GG+NoDFoW/fwM6BpJxDcKirU+IQbGbPBp59NnTHi6Scw70AlgViRz17Atu3e3cOW7YA\nl18OTJgAfPaZa0gJ8K+UFQhN3iFU4nDGGcDataFpRBsbgYICvraWFi4rHjZMOQdfCKc4hMOxBIsf\nf+QZjyOJgoLQThYZEXMrCSEuBHAPgLFW20yYMKH158zMTGRmZlruLy2Nb1Zv4pCfD/zzn+wUdu1y\nTUYDvs2tFA5xOOEE/jmY4tC/P/+8YQPg4SMPCLm5bJuPHGFhSE4GevUKnjiE2jnU1vLx9B2QQFNa\nyoM3Q01HCytlZ3P0IZKoqrKe2UGyZs0arFmzJiDHC7s4/JyEng9gHBFZhqD04uANuViPJ3HIyWFR\nGDaME9L5+azM3pyDnbBSsMWBiMdwhMI5xMUBl1zCtfPBFofDh1mMjhzhkFJaGs+eGqywUqidw/z5\nwLJlXG4aLEpLuUov1HS0sFJDgxZWjRSOH+ecpieMHeeJEyf6fbywhpWEEP0AfATgdiIKWE2MFAfZ\nszaSmsqN/q9+xaWgMTE8R9GGDfbEIdzOobKSb5KkJP492OKQnh6agXaHD/NI9oICoKhIE4eO4hxK\nSjjZvm1bcPbvdHJJaXsIK1VXR/bgzYYG7dmPFKqq+LxCRbBLWRcD2ABgqBAiTwhxjxBivBBi/M+b\n/BtACoC5QohtQohNgThuWho3+r16mf89OprDR3JSPgAYMQL49ltXcZAzrTY1adVKdnMOwZx8T59v\nAOyJw/ff+26TpTjExobmpjx8mJ1c9+48r1JamjaoMVAYnUMoxaGiAhgyBJg2LTj7r6xkgQiHOPga\nVnrlleB9DoGgvj7ynENVFZ9XqAhqWImIbvXy9/sA3Bfo46alsTCYDYCT9OwJjBmj/T5iBPDeezyl\ntx7pHrw5BykkQPAbHTNx2LHD83vef5+vZdQo+8eR4hCqmWYPHwauv56vbcuW0DiHUDakFRXAX/8K\n/Otf7t9hICgt5Xs+HIlhX8NKlZWRPV16pIaV9O1MsImkaqWAMXIk8OGHnrd5/HHgssu030eM4F6X\nMVloJg7hLmXV5xsAe86hutp9JtqWFs8JLr04hMo5DBzI17Z5c2hyDqF2Dv378/154EDg919ayiHA\n9hBWksn5SKW+PjLDSqF0Dh1SHDp1As4+2/M299yjzbUEsDgArtVKgCYOVtVK8udonQcLhXPQ51Ps\niMPx4+7iMHUqMGWK9Xv0YSV/e3l1dfYbd704HDzYMZ1DSgqHJ4MhtjIZHa6wUkuL/UFaNTXKOfhK\nxImDEKKbEKLTzz8PFUJcK4SICf6phZYBA7gh9OYcZM6hqQn4zW/cXQMQnrCSHXEwjqIuKuKqLStq\na9vuHBYtAv7xD8/bELGzqa9nQZDX1hFzDikpwcvhSHEIV1gJsC9MkS4O9fX8OUZKBRYRP8MRJQ4A\n1gHoIoTIALACwB8AvBnMkwoHUVHA6NFARobr61ZhpepqHjhXWNg+xMEsrFRZCRQXW78nEM6hutrz\npIBNTSwCzz/PAi2ENrYiLY0bU08r9/lKJDiH2NjgPOThdA4dTRykeAcrtPTmm751EGpqWCAiTRwE\nEdUBuAHAq0R0E4ARwT2t8LB6tWsFEwAMHcpVPsaEtPxid+8Ojzj4E1YyOoeqKnvi0JaEdF2dZ3t+\n/Dj/ffFiDikBrs4hOtrzyn2+Ei7nQMTfUbCdQ69e4QsrAfZdS6SLg7yeYIWWHn3Us2s3UlXF922k\niQOEEOcAuA3AF768r71hVt109dXAF1+4l7J6E4dg3vgVFa75ksRE72s6WDmHo0et3xOIUlZvJYHV\n1Rw62rwZmDWLX9OLAxDY0FJTk1bxEUrnUFPDx+3cOfg5h/YSVorkhLT8foIhDvX1/Cz60kYcP87F\nBpEmDn8G8CSAj4noJyHEYAC/mLWmLrmExwjU1kaGcyDiG1bOHAuwqHXrxjeQFcePa3XwEukcrJKI\ngXIOnqx5dTWQkMACcOKJ/FpqKpd7JiZqvwdKHMLlHPTzdgXbOTQ3h3b2TsB3caitbR/OIRhhpcJC\n/t+X66+q0sQhVN+tV3EgorVEdC0RTRFCRAEoIaJHQnBuEUFCAvDrX3PMu3NnLecgH+49e0IrDg0N\n3LgZXU5KCo+ONUMmfGNj+SaTVFby/qxEJRClrHacQ0KC62tCAM88o82OG8hy1nDlHIziEKycQ8+e\nnD8LtXuQ33FHCSsF0zkUFPD/vopDjx783YbqnrVTrbRYCJEohIgHsAvAHiHE48E/tcjhqqv4gRbC\n1TkIYS4OwRznUFvr6hokqanW4tDQwDdVr16uoaWqKi7dtco7BKqU1VdxMNK9u5YvaW5um4sIpHNw\nOIB16+xtGyrnkJpqPoo/2Eix6ygJ6fp6ftYjSRwSEzkkGarQkp2w0ilEdBzAdQC+BDAAXLH0i+Hq\nq/mhA1xzDoMG8c0TSufgSRysGs3qar6xUlK0RtbpZMdw4onexSGYCWl5bp7QJ9yXLeMxKv4SyIn3\nli8H7rrL3rZ6cQhmzkGKQ6iT0jLUaee4Tmfkh5UaGrhTEoywkj/icPw4F2ZEmjhE/zyu4ToAnxOR\nA0CII5rhZdAgYN8+/lkfVho8mBuYSBEH6Ry2bdPOF+AbKyGBb3bpHGpqeD8ZGdZJ6VAlpL05h6Qk\nTRyOHfNcYeWNQE6899ln9h/UYDuHlhbuXaakhGYlQiN1dfw92XEsMm4eyeJQX89hnEhyDpEoDvMA\n5ADoBmCdEGIAgCoP23dI5Bz5+rBSfDyXXwZDHBoazGv77TiH//yHV7aTmDmHykq+2dLTPTuH+Pjg\nl7J6E4fkZC1XUlnZtrLWQDkHpxP4/HP7jUewcw7V1fxdyVmGQy0O9fV8j9k5ruyNR0K10g8/mCd4\nGxqCKw6dOnUAcSCil4kog4iuICIngFwAFwX/1CITGVZqbOSHfPDgwJWyPvig1qO8917g7bfdt6mt\n5cokI3pxOHqUF3yXmDmHqipudK3EQQ646dpVy6F4KpW1oq6O32vVo7TjHPRhpYoK69yKHQLlHDZt\n4u/BH+cQjLCSDDsAoc85OBzckbEbVqqp4c/Al2ckGBVYTidwzjnA3Lnuf5POIVhhpX79fA8rJSaG\nboZkwF5COlkIMUsI8aMQ4kcA0wGEYa2pyEDvHDyJg7HR2bMHWLDAer9NTcCrr3LZLBGwahUvQGTE\njnMwioN0DvrErnQOvXqZh5UaGvi6oqI48e6vG5KNp1Uj6o84tGXEdKCcw2efATfdxPeCnYY42GEl\n2XgAoQ8r1dezs7YrSjU1fC/60jheeSWPhQkkDgff308/DWRluf4tmM6hsJBD1b48TxHpHAAsAHAc\nwE0AbgZQDWChx3d0YPQ5h9hYnp/fjjhs3QosWWK9X9kb/vprYO9ejq2bJZhlrsCIXhyKinjiOtnT\nl84hJcW+c5D5Bom/5azy4bJ6yHwVh8pKbbSxPwTKOaxcyQ2W3Yc12OIgq1mA0IeVpMO0e9yaGm54\nfRGH3Fx7uaamJvsOo6mJ7/GnngKefdb1bzIhHWhxIOLnc+DADhBWAjCYiJ4momwiOkREEwAMDvJ5\nRSxG53DHHdzz0GNWylpf7zrGwEhpKffQv/4aWLuWb1qz2n5vzoGIH6KEBJ7aG/DPORjFwd9yVm8l\ngf44B8D/vEOgnENVFY/g9vawHjvG30mwcw7hDCvJe8WuY/HHOZSUeJ6jS3LLLfwM2UGOlh82zLWz\nIUOqwRCH0lIORyYmdoxqpXohxHnyFyHEuQAibDLb0KEvZY2N5YZrsEEqzZyDp8FmAN80Z50F7NrF\nic6rrjJ3Dt7EoaKCH9QRI7Q1A2TIwegcPCWkzZyDP+JQV+fZnvsjDlFR/ucdAuUc5AJPcXGeH9Zr\nr+XvMxQ5h3A5B3mv+OIckpP5Zzsi1tzMn58dcSgp0aqBvCHFIS7O9f50ODhhnJgY+JxDQQFXCNp9\nnqT7j9RxDv8PwBwhRK4QIhfAKz+/9otE7xyM4SSJmTjU13sXh4wMFohly4Abb/TNOfTowfs4epTd\nwEknaXkH2QDrE9KVla5hJaMVN3MO/oaVUlPbJg5JSa7VSiecEH7n0NTE33/Xrp57l0VFvPBUKMJK\n0jkEO+dQUgK8/LL2uz6sZKexl0UVdgeLyo6AHXGorbXfcbASB3k98fGBdw6+isP55wMbN0ZoWImI\nthPRSAAjAYwkotMBXBj0M4tQjDkHM7p25d6RHjthpdRU4OKLufE780zfnEOPHtxgFhWxOJx4orlz\nkGEZebPFxfEDIs/tk094DYZAOAenkx9AT/bcjjgkJvLn2dLC5z94cGDEoa3OQYqDp4e1tBRYupQb\n1FAlpIMdVtq2jee+kr1af8JKUhzs3FOyk2RXHOzeG/JeMIqDfLaNrweCggKgTx/7115cDLz7buSG\nlQAARFRFRLJ5ezRI5xPxGMNKZpx8MoeH9MiwklWyTIrDrbcCkyZZz0RqJQ6yB7R3r2/OAXANLW3b\nxpVSgXAOcvU8Tz0wO+IQFcXbVFWxOAwZEpiwUludg7ewUl0dN6AnnxyanEOowkolJXy83bv5d3/C\nSt262S/5ls+BHXGoqQmcc4iLC39YqaGBC1ki0jkoXDEmpM045RSurtDfzPX13FBYNZJSHAYMAO68\nkxvUlhb37a3EAeD379rlLg6y4dAnpPVhCH3j3dTEiWy5CpzEH+cgSxzlw+d0crmuHjviALCQFRVx\nLLhPn8hyDt6+0xtv1MaLAMHJOYQyrHTsGP+/YQP/72tYKVKcg5U4yGfbn7DSzTd7jhDIUey+iEND\nAz87dpxqIFHi4CPywZOD4MyIieGE8I4d2mvyC7W6cWRDIhHCfL4kO+LQuzfXUefl8bnKUta4OO3c\n9c5BH/ttbOTFhNpSylpaqgmh7IHJtaQfftjVPfkiDjk5/GB17x5e5+B0ciMYE+P5YS0pYQf4299y\nmFASqWGlI0eAOXO8b1dSAvTty2NyAP+cgy8j70tKtDVLPEEU2JyDr2Glhgbggw9cp64xIvdt1zXV\n1wO/+x0LvxARIg5CiBohRLXZPwB9QnN6kYcd5wDwkqNbt2q/y8bAKiltFAeAGxZjUtquc+jcmXMX\nBw5opaxCaO5B39PU36hNTdxIGJ2DL6WsN9zA5biy0ZAPWXk5N6wyHyMfZrMR30aSk4HDh/l/mV/x\nh0A4B9moCOE5rCS/0379gDVrtNeDJQ76UlZ/RG/dOo5ve+PYMV4/3SgOdh2LPiFtN6w0aJB3cWhs\nZLftq3OQDa7stOhzDr6EleTKbtnZ1tv4OpllQwNP7ihXfowIcSCibkSUYPHPZM00d4QQC4QQxUKI\nLA/bvCyEOCCE2CGE+JU/FxFK7OQcAGDUKODHH7Xf5RfqizhYOQerxjQ1lR1Br17aOWzd6jp/UUYG\nD5Dz5BwaGlgg/A0rHTrEDYgxrKQvo5XXEhtrvgKfkUA6B7kSnL/OQYaUAM9hJekcjJhNR/LII8D2\n7drveXk8G7D+NU/oB8H5G1Y6cMCeaJWUABdeyCN9y8pcnYOvYSU74lxSwoPGjEUeRmRD7qtziIpy\ndcb+OgcpCocPW2/jizjIz3LUKGDLFv45IsQhQCwEMM7qj0KIKwEMIaITAfwRgMksJ5GFv87B17AS\nYO4crEZIA9r7pTiccQbfVPppsS+7jKea9uQcALbG/iSkm5o4N1Be7hpW0seC5WdgN6QE8LkePqyJ\ng7fe4c6dHMIyO79AOQfA88Nq9p0C7DiMjcOqVcA33/DP27cDY8bwNezcae+cApGQPnjQ3nd87BiH\nLs88kyeu82eEtK/OYeBA786htpbvE1/FAXAVAn9zDtnZ/DkEyjno25ion1tqvcvRh62DQVDFgYi+\nBVDhYZNrAfz35203AkgWQqQH85zaip1SVgAYPpx70PobztNSnr44B1/FQe8crryS18SWI6QB1x6c\n/H/vXnvO4YYb3Hu8ckSwMaykT4YDvomDDCulpHBYyVsDkJWl9bb06MNKnTpxQ+3rPE1652AnrGSG\nUWwLCjSn+fbbwPjxnNz0tMa3Hr3Y+5tzsCsO0hGddRZPQBiKUlY7YaXaWr73Gxvt7ddKHOxWK61e\nDbz/vjYvU3Y2cN553sVBFid4O0d5Hnpkpdu+fTxQNpiEOyGdASBP93s+gL5hOhdb6MNKVoPgAP7b\nySdr6l5fzyWjZs6hrk6b1VKPPzmHTp20BmnUKG649Y3wOedwJVVzs9b4651DYyM/YPv323MOBQW8\nP4n8ubzc3Z7ry2gB/8QhOdmecygqMu/16cUB8M89GJ2Dr2ElwLWctaaGBVyKw/r1HLbp1cv+2hWB\ncA52w0rHjvHUISNHAj/9FPxSVrviIPdr5/4AvDsH+ZpV+fl11wFvvMFTdgAsCpdc4i4On32mibUM\ntfrqHCTSORQUeA+ztZXo4O7eFsLwu+lXMWHChNafMzMzkZmZGbwz8oDdsBLAg7Vyc7lBluJg5hzK\nyrhBF4ZPIjXVPebsTRzS0zULmpTEOYbcXO0hiI7m0NKqVdrxjM5hyBDgu+9cj2N1Mzc1uT6Iubks\nUGbOoS1hJTmFRkoKX1dNDX8P0RZ3cGGhea/PKA5yNLuxh+YJuzkHu86hsJCT1nl53PDu3Mkhm7w8\nHndih7bOylpezt9LlJfuYkMDX39iIlfkPf0033PBLGX1JawUH68VLPTu7Xl7b84hOpr/ydHweoj4\nOj7/XBuTlJ0N/POfPJGf/j67915O3g8Zoj0Tctp/T1iJQ0OD9f29Zs0arNFXP7SBcItDAYATdL/3\n/fk1N/TiEE7shpUAbvjkF9jQwA2AmThYNSK+OodevbjEUM8ZZ2jhHMmVV7qGXIw5BykOdkpZm5pc\n95+byxOZSecQF6fFbtsqDgCLQ1QU/15RYd0zLyqyJw7+9LKNYSWrEJcn56Af61BQAPTvz43Z/Pnc\n6MbFeV6I6fvvudMhr6mxUbsv/AkrHTzI37u3eYnkNQnBo/Bzc/l79bVaSZayenNtRPx89O+vLYBl\nVcAg99vSYi/v4M05yNdra93Fob6eX+vcmb+H775jcTjpJP4e8/LY7RDx/S7vRSkOdkJfZmElvXNo\nbna9BsC94zxx4kTvH4QF4Q4rfQbgDgAQQpwNoJKI2rAIZPCRzsHTOAdJfLxm/TyFlazEQeYc1q7l\nGLQs/bQSh7PP5p6MnjPOcG+Ar7uOezgSY7XSkCH8s51SVofD3TmcfrrmHIxhpd692yYO8n99Oeu3\n3wJ//KPr9nbFwZ91KuyGlew6BzlqdvRoHiR47rn8utWMuTU1wNixWrWT/BylE/RH8A4eBE491XtY\nSS94nTvzvbJ1q39hJTvO4fhxrdxU/zx52q/dUmd95ZrROejFwez7lccC+Pv66CN+T1ISi4IMLdXX\n83HkefuSc/AUVios1M4jWARVHIQQiwFsADBUCJEnhLhHCDFeCDEeAIhoGYBsIcRB8HKkDwTzfAKB\n3VJWgG8e2UB5Cit5E4cXXuA6+cZGzeqaIQTHgvWcc4577zUxEbj7bu13M+cA2EtIG51DTg6Lg6xW\nMoaVBg5su3MAXMtZP/yQ4/R6CgvN48WBdg7eqpXs5BwKC1kcRo3in8eO5detnEN5udZRAFzHOAD+\nhZUOHGDHB3h2HTLfIBkxgvNTwQor6T/DhATPoSXZcbJb6qyvXDM6B9ljt6pY0ovDeefxFBeDBvHv\nenGQ97q+kyhzDt46JXbEIRgr1UmCXa10KxH1IaLORHQCES0gonlENE+3zUNENISITiOirZ72Fwn4\nknPo1k27KRoafBeHnj254mnbNh534KmM1Yqzz+b8gieMzmHAAA7d2ElIm+UcfvUrFgyzcQ7+ioNs\n/KQ46HuHK1bw56MXgqIiDi8YH8BAOwdjtVJ1NfDEE9yrr6jghsoMK+cAaOIgx60YG3p53fLe0o9x\nANoWVvJWsmwMlY0Ywf/bCSvdfTeXvjY18XHsiENJifZs2BUHO9VsgG9hJSN6cTjzTL5uM3GQxRfG\nsJLdaiVPCWn9foNBuMNK7Q5fcg56cfAnrNS9O9/AjzzC+8rJ8V0c5Hl4wugc4uK4sbLjHPRhpZYW\nvmlPO819nIMUh0GDAuMcMjI4cZuTw/uNinKtgmpp4fcYH55gOAd9zzIvD5g6lavUEhKsXZ4x55CR\nwQ3t7Nl8nwAcW+/Rwz3vJD9v2VDqk9H+XpNdcTBzDoC9sNKKFcB99/H9KJeeDaRzkJ0ns7BSczMX\nYujLlr0lpI2vG48ln6uuXTl8qxcHORBO7xzkZxMTYz+sZJVzKCw0v78DiRIHH5EPgFkFgxEpDkR8\nI6SluTqHnBxgwgQOiZiJQ0wMz8szfjwn5H76yd5UE75irFbq3Bl48kktzCC38ZaQLirSxiE4HNxY\nBzqsJP//85+BWbN4uofLL+fPR5bRFhXx5Hz6kMCGDfw9BMo5WIWV5PEWLrQOKQHuzqFPHxaShx5y\n3c4s72AmDm0NKx06xNV1/joHb2ElmViOjdXuYbvOwZewkixlNTqHsjJe2vXIEe01u87BmzgA/Ixe\ndhn/rL8XZYelpkbrLNm9dquwUl0d3xNDhihxiCiio/kLkXPreEIm0OSqYcnJruJw//08F1JiIg8o\nMuODD1g4+vfnKZL9cQ7eMI5z6NKFz002xIB1QlofVsrN5fMUgkWioEBzDtXVfO39+/snDrJnLJ3D\nyScD11/P6wpcfjlXgskHv6iIE9/x8drDc9VVbPXNxMEf52AVVqqt5et/5x3rZDTgmnOQzsEMs7xD\noMNKRLzP1FTfncPAgVoHwJMoVVXxvTB3Loc6AXtxd72rTkjwnIA1lrLqke5LPymeHedgJ+cA8EzK\nskhIP92+fqoY/WSWbRGHykr+LHr0UOIQUURHc6PmzTUAWkJaxg4TE7Wb5csvube2aBFXOowZ43lf\nwRQHM+dgto1VWEk6h9xczlcAmjjIhuPoUW1NCX/EITqawxL67SdM4B73ZZe5ikNhoeYcamu58Tt+\nnP8eiEFwnsJKtbVcBFBTY885OJ382fSxmMpSDoTbvJndCKB93lbOwdewUl0df+cxMb47h6goYMEC\nDqV4Oq5835gxnLwF7DWQZWXcCAL2w0pmzsEXcfA152BEP7OBPqwkc3CA9sxZDbADrEdIA9yZ0Hd+\ngoESBx+RCWlv+QZACyvJLzkxUVvw57HHgOnTzRtiM0LlHKzCZWaNhtPJMdyqKv5ZOgfAXRyam/mh\n1S/5WV6uOQE7SNsu6dOHY7tpaebOQT7Yci2JnBz+X18n749z8JSQrqvjBj0z07NzkDmHkhL+TKw6\nG+npLB4LF3JVFhD4nIN+6g1fnQPAI4SluHgTBz1W4rBrl7afsjItqd+tm72wUiCdgz5vqMeTOCQl\n8bnI0GqnTlpYSYpDVBS/7ul7MnMOcpJAfecnWChx8BHZ6/RFHGRiSdriPXv4/2uusX/cfv24IQy2\nc9CHTIzbGB9kWSceH88NlF4cunfnhqRrV+1BM4pDTo62vb/IEb1WYaW6Ou14hw7x96cPBwbCORjD\nSvHxwP/7f1qYwQzZCHsKKQFaWOmrr/i6AC0BLxtKY1jJ15yD/v12xMHKEenDWfv2ufaKfRGHe+7h\nQWUAX6td5+CplLWkhGP0e/dqr9lxDvr7VY8ncRBCq5iqquLOguyk6J2AN+dkVfTStasmDu12nENH\nRFaf+Ooc5NTUcXE88d0FF3jPWejp358ftlA4BzNxkI0GkTalh6wTl3PZGJ0DwNfbqRM/CN27a4u2\ntLRwYy7DUG1FnwQ0hpVknkeKg/Ha2+IczMJKcXGcD7n9dut9yJyDN3Ho1YuT6YWFWmK6vJzfIxsG\ns7CSLzkH/fs9iUNjI5/DCSeY/10vSr/5jTYhHWAuDlbVSsePa6vN+RJW0ouDmXM491zfnYMncfD0\nLMrQUmWl9l35ui67WVgJcBUH5RwiCF/EQSq7/ktOTOSJuHydGko2usF0Dk6n66hR4zaNjTxYSs4G\nKR+ulBSOgxudA6A9DHFx/Fp0NH92Bw7w+3yZ08gTnsJKnsShrc7BLCFt5zvSOwerfAPAzmHTJh7V\nXlKiLWbTr1/ow0r797OYW4VC9cetqdGcDuCbc6iu1sJA/uQc5PQU+rLVkhIef1NZqe0jWM4B0MSh\nqspaHLyV8lo5h9hYlXOISPxxDvp65aQk7glecIFvx+3enW+GYDoHmaw1czSylDUvT2s8pJBIG2/m\nHPT14lIwkpLYfQwcGLhr6N2bGwC5noS+lPX4ce6BHzwYGOdgDCtJRwXw8ex8R/J92dlafbwZcvr1\nq67iz7SkhMWhf3+tkdNPvw74F1ayIw579nCVmBV6x1JXp/X+AWtxMBPm6mpX5yDvG7ulrGbLaZaU\nsNCeeKLmHjxNn2HHOdgRh8pKnu9MFqb44hzshJWUOEQQQnCYxK5z0FcrAdzDk2s8+3rc/v2D6xw8\njd2Qpaz5+a4hKBlWOniQHzTZg7VyDkBwxCE6mj/X777j3njfvq5hpeHD2d0Ewjnoe5xRUbwP2aAa\nl1e1QjbCcnyBFVIcLrlEG/MgxUGGlfS9a3lNnsJKy5e75gP0zsOTOOzeDZxyivV+9aJUV+dagmvX\nOcjZTktKtBJbX8NKgPv4BHn8oUM1cfA0fYbeOcixCnrsiENJibtz8CXnYBVWOvVUHoOkn54nGChx\n8AMZGvFGTAxvW1HhGlbKzPQt3yAJljhI52CVjAa0Gzkvzz0/kZLCU3zok8uhdg4Ah1puvhmYOJE/\nZ31YKSODz8l4fWbOITcXuOMO6+PonQPgGlryJaxUX+9dHFJTeWLB9HQWP7nKnj6sZCYOVs7B4eBZ\nefWzrwbSOTgcHM5pbPRPHGTp8bFj3JhGRWn3kN2wEuDeq5aJ9GHDXMUhFM7B35yDlXN4912e/VU5\nh0fe6kMAAB5GSURBVAjErjgAfAPJkaEAlwFefLF/x/31r7VJ8QKJ3jlYiYNsNPLzuVeqz090786N\nvZk4hMo5AOzGxo7l0dOAa1gpKYkbVDvOIT+f5wCywvg56UMYdsNKdsUB0GZp7d2bK7yamvhnK3Hw\nFFYqLOTGV78gTaDDSvL9dsJKxsZRXtOxY64hJcB+WAmwdg5DhrDLBdzFQT+9fqBzDsZBcGbXP3eu\na/WRtyl6lDhEIHJuFDvEx/ONKXsi8+Z57pV64qmnODEZaKRz8BRWkjdyfj7/LrePiWEhyMpyFQdj\nWEmO6AT4gSsuDrw4vPgiL9soXZk+rJSYaC4OZs6hvt56OVfA3TnoK5bshpW6dmUX1qWL60h0T/Tu\nzaGd7t21smi5JKu+EfUUVpLfn6/i0NzsOnOrGVKU5GfhzTmYJWRravj7KylxFz1PI6SdTteYvr7h\ndDq18FRSkveEdLCcg7ecw5Qp3FmQWIWVJEocIhB/nIN+OL7VYiXhQjoHT2El2Wjk/byoqxQH6Rwa\nG92dQ6dOWmP82mvaIDbZEAVaHFJS3MM93sTBzDl4EwejiPobVvrpJ++uQU+vXpo4yAFhVVXapHf6\na5KC99vfugqF/P70jZA+52A1Bfnhw3x8T8Inj2sUByLX2VUlVs6hb192Dvp8A+DZOdTV8Wcqx73o\nG/vycn5vTIxrg2omDvX1rkvoJif7Lw7FxXys3r3thZWOH3d1O3acgxrnEGG0JawUifjiHPLyuNGX\n1U0y5wC4ikOPHq6NZP/+2oOYnMz7sKqXDxRG59C/vz3n0NCgNRJmGEXU37BSZaVv4tC7NwuKdA7V\n1e69a0DrwTscPFWFvkHNz+eGy1fn4C0ZDWiOpa6O73spDnK+KePnYlatVF2t5VOKi12vTc4wYIZR\nlPVhIr1r0YuGmTgcPszlurIDp5/VQI8dccjO5u8pPp7vmepq64S0nOLFV3GQ12hnuVVfUeLgB3IO\nGjt06+YaVopE7DgHWcJbV8fJUZmjkNVKgKs4pKdzItWMpCQWBqvprAOFPufgq3MArHup3sJKdktZ\nAd/FobjYNaxkjMsDWiMte5X63mVeHnD++b6Lg7d8A6CJUn093wulpRzSsVou1co5JCWxKOzd63pt\nKSksqPrxCxJ9vgFwnTDPKA6enIMxByRDyMbwjR1xOHKEr0Um1UtL3Z2DvPfq6/m6/BWHyy4DNm60\n3tYflDj4ga/OIdLFQe8cPM31FBvLll+WteoT0oD7VBgjR5rvJykp8CElM4xhpdGj3ceXWOUcAK2X\n+uKLrqEF4+dkDCvZLWUFfA8rAa5hJTPnIMM7UhT0DVt+Pn8GenGwM0Lazmh2fVgpOZnPsaLCd3FI\nSODt9+51T7QnJZkvAWocsax3CPrj60VD/z127syN89697t+JWd7BjjjINUUArR2wCivJjoheHHzJ\nORw65Dr6OxAocfADX8QhPj7yw0p2xjnI7fr21W5qfc6ha1fPs5DqOfVUYNy4wJy7J4xhpSFDgMmT\nXbfx5BykOEybxnMbScycgz9hJcB35wBo4lBTw/eWlTjIBsfoHMaM4b+ZTfltJQ6Vld4nSdSLQ1wc\nV+YVF/smDjU1LA5paexWjNeWluZaBSUxOjZ9w2knrCQE/y0ry70i0CgOcjZVTx2p+Hi+Pim63sRB\n3mu+OAc5zqGlhce/5ORYb+sPShz8oC0J6UjEzjgHQHMOenGIieHXVq+2P3bjgguAxx8PzLl7whhW\nMsMq5wBojWtFBfDNN9rfjSLqT1jJH3Ho1o3/paTwPdilCzsBq5yDVVjphBPcVyvz5hwqK71XVckZ\ni+VgLzlpoJU4mFUrVVfzNfbsydN1mImDcWU8wD2s5Mk5mIWV5Ht27jR3DpWVwNatwIMPaq7B0/0u\nBLsHvXOQE1FK2ioO8lrktCry+wwUShz8wNecQ1NTZIuDv85BhpWEsF6sKJwYnYMZ3pxDYyP/rhcH\no4j6E1aSU5lLN2CXXr1cp7DOzTV3Dvqcg74xLCvTRujLiiU74lBV5V0cpHOQJZvp6dwgenIOZglp\n6RyamtzzKT17mjsHY1jJm3MgMheHPXusncPWrTy63FtISZKaqn2usqTdF+fgLawkz106BuUcIgBf\nnQMQ2WEl+VA3NHh3Diec4B5WilSMOQczvOUcKiq4YSkrcx3jYRZWInKvZbciPZ0H2vk6Ur53b9e5\nhnJy7IeVCgv5uJ06sThkZ/N32NysNUJtcQ5WYaX1683zT95yDoD/YSUr5xATwwnipib3SSbj4vg1\nY25FlrMeOcKfd1mZfXHQOweHI7BhJYCvef9+Hn8ixSEvj8ektBUlDn4gLb0d9IuQRypysfeaGs+N\nvXQO+gS2sfonkpC9x6oq6xXnvDkHOcDswgs5dAaYj5CWNfJdutgfx3Lqqb5dDwD86U/aiGkrcbAK\nK+Xna+XDUhykcEqRaqs4GMNKBw+y6/rNb9y3l8KsLxPVOwfAflipuNh1HIVxnIN+P/Jvxvs3Lo4r\n2ozPtnQOublcfbVzpz1x6NnTNecgjyHxJA5EvonDWWex+Dc388p8CxZ4Pz9vKHHwA1/DSkBkOweA\nH1Rvy59ecglw+unuYaVIJS6OG0a5noQZVjkHue51RQXH+C+8UAstmc2tVFdnP6TUFm68kRswwH5Y\nSf4v8w0Ax9UPHHANKQGexUG/nRn6EdIyrPTOO1w6ayYsQriLszfnYBVW2raN702JPqxkTKbLXJRZ\nWMksB6QXh4QEDi/ZEYdevTTBkq7GU85BCE0cHA6+b711NOLj+XscMIA/7/x8nvX5nHO8n583gioO\nQohxQoi9QogDQognTP6eKoRYLoTYLoTYJYS4K5jnEyh8rVYCIts5AHyjVld7buynT+dyVTtzMUUC\n0dGuM8WaYeUc0tI055CSwvNabdrEfzfmZuTiMnYrlQJFQgI35N7CSrKRzM9n5wdwQ7p1qz1xkGNg\nvF2bWVipvJwnQ7TCGFrSVysB7hVSVmGlbduAUaO03/XOweh6ZLjRzDmYzV2mF4fMTD6WHXF45hlg\n/Hj+2Y5zSE01nxnWE1Ic+vRhgcjO5vEOES0OQohOAF4BMA7AKQBuFUIYh9E8BGAbEZ0OIBPADCFE\nkIdGtR1/cg6RLg7SOdhp7I3VSpFMfLxncbDKOaSn8wMr17lOT9eWnjQmpOVsqXYrlQKFDJUZk7b6\nsFJMjLlzyMjgv+3c6V0cZDLaW34kKor/1dRoziEmBrj2Wuv3GCuWZLVSWhqfl3GgpJk41NVxozh8\nuPaa0TkYxaGqivcdFeX6upVzqKjgsM3FF9sXh4QE17Wo5TEkRnHo1ct/ccjIYHFYtozdld2yck8E\n0zmcCeAgEeUQkQPAuwCMkcciAPLRTQRQRkQ+LHAYHh57zH51TnsJK3Xpwg+1nVxKewkrAd7Fwco5\npKe7hpVSUlgoZJWL/nPq3ZsbjlCLg7y3rMJK1dV8HVIciov5d8mYMcCqVa6fj5k42Mk3SKKjueHt\n2hU47TTgv//1/F5jxZIMKw0aBLzxhvv2ZjmHrCxOyBpDRLIqyXj+8fH8vRrv3auuAi691P2YSUna\nmItTT7VfraRHv86ERC+MZuJgp0Mpx7tI5/Duu+xyA0EwxSEDQJ7u9/yfX9MzH8BwIUQhgB0A/hTE\n8wkY48a5TyJmhXIO4SUuzrtzMIpDQ4N7WCk2lhu+ujp359CnDzsH48RqwSYhgc/JeH36EdK9emni\nYJy9VYqDXedgh5gY/txkqe6tt3re3hhWkuIQHc35FSNmOYdt23gJUD0ydNTQwI5H3zmLi2PBMN7r\n99zjvh+AP5+dOzmketJJ/Jqv4iDHReiP6ck56BcI84QUnT59eNaBgoLAhJQAIJghHPK+Cf4BYDsR\nZQohBgNYKYQ4jYjcZrWZMGFC68+ZmZnI9HUR5jDRXsRB5hx+ac7BKqyUlsYPWkWF67rY5eXuCWkZ\nVvK26HygSUjgczKGe4ziIMMrUugkY8awm/AmDnaS0fpjy5li7WAlDlakpPA2cklbgHMnxkZdJp3N\nXI+Vc7BCTtnRrx83wnFx/olDXJzrd2UUh6FDtbEnvoSVoqNZNLkEdw127FgDXXPpN8EUhwIA+nk3\nTwC7Bz2/BvAcABDRISHEYQBDAWwx7mxCIK42DMjGItLDSr44B30pq68PSaixE1YqLgbeew847zx+\n+I1hJVkFk5KiTSanj4XHxvJx8vJCH1YyhpQAbaRydTULl1z1zSgOZ5zB/9sRB1/CStI52MFXcYiK\n0tZKkAMIt20D7rrLdTsZVjJes/ybmXOwQl57//58/CFD/AsrGT+TQOUcevfm8xo8GEhOzsQrr2S2\nVjlNnDjRtxPVEcyw0hYAJwohBgghOgO4BcBnhm32ArgEAIQQ6WBhyEYHor05h19aWGnAAO4RPv00\n8Oab/Jo+Ia1vXLp35zls5KhwPX36cGIw1GElM3Ho1IkFTDY4+rCSvqHs0YNj+2Y5B/3YA1/EQToH\nu/d7aqoWJnI67VV86UNLDgdPY24cZCcT0lbOwRdxkOIpHeRJJ/nvHPR4CyvZ+Qzj4/neA/g+PnAg\ncOvFBE0cfk4sPwRgBYDdAN4joj1CiPFCiJ8LvPA8gDOEEDsArALwOBGZzLnYfmkv4mBnnIOkI4WV\n+vblKRHuuksbiKTPOchqJUATB7PPqHdvHvAV6rCSmTjI8QMVFZo4OJ3mDeU557hWtsja+uZmYOZM\n/p59FQdfnIN+Gg+5YI+3xk1fsVRUpE1EqEc6B7Nz99U5GMVh0iTgppvsvVfSrZt7GxAo5yDFAbCf\nC7VDUMtGiehLAF8aXpun+7kUwDXBPIdwExcHXHNN5PewfXUOVVWRP84B8C4OksRErmMHXMc5xMVp\n4pCSojkHI336cOz7xBMDd+7euOYa8wQqwOEdKQ5yChEZn9bzn/+4X09sLN8Ljz/OAx99DStVVNgX\nh8GDtenDvYWUJPqKpcJCLuM0Ip1DRYW5c8jJsX/vyvtHDj70tFSqFSkp7nmbQIhDcnLwFs2K+DEF\n7Z2oKOAzYzAtAvHVOegX+4lkevSwV/OtX2VMn3Po0sW+czh0KLRhJVlia4bROZjF3gHz8EhsLK9r\n0NLC11RZqVXpeCMmhj83X5yDXKTGrjjow0qFha49Z/15yLWozZxDRYX9ezc6mq+/LWuQjBrl3g7o\ny3j9DSuNH+9eUBEolDgoAPiXc2gPYaXJk+2tOJeU5CoOSUncuBw75ioOO3ZYi0NDQ2jDSp6IieFB\ne97EwQy5vjXAvXpfS1kB+2FUf52DN3EAWAQKCtqecwDavpCOENqob/35yZHazc38/TQ2cgjQrnMI\nZmdEza2kAKCthOVrQjrSxUGOT/CGdA5y3eiYGH4tKkp7AFNSOMZtFVYCIkcc5DXLsJI/4hATozkH\nX8JKgO85ByL7g8t69WJRAPh/q2nP4+P5722tVgoWQ4bwtZeXa5Mfyhl+7YpDMFHioACg9YZ9SUi3\nh7CSXaQ46AcfJSa6jiPwFlYCIkcc5NrHsrb+6FHfxGHXLmDsWN/FQd4PdsUhOZkb6dJS+85BzigL\neHcOhYXWYaVwi0N8POcLNm/W8hoykW43rBRMlDgoALiupWtn2/YSVrKLXhzkQ5mQ4NqgekpIS3EI\nZc7BEzExWi+8Wzceg+Grc7jsMv/FwZeGTboHu+Ige9yAZ3GIj7cOK0WCOAA8hmbdOu26pTgo56CI\nGPx1DpHwgAUCM3FITHRtULt3t07aR5pziI7WGpxu3XhGVuMEfVbExrIIXnwxv6+01Ddx6NLFdUI7\nb8i8g11xyMjQZsH1J+cgF/WJhHv39NOBb791dw4VFfZHpQcLJQ4KAL45B31CuqOFlfQTnpmJA2D+\nGcmS2UgRB71zkKO3fXEOAHDyyVy1dfSo/YYqOtp39ySdw6FD9gQsKkqbnrqoyLNzqKszdw5A5IjD\nli2u4lBby5+5r0vIBhpVraQAoPWGfRGH5ubIeMACgbz+ykrXnIO+BywbVyt3lZERWeIgG2kZVho3\nzt57Y2O5skbOjpqXZ69HbzyuXQYPBhYt4kqwLW4T51i/56efOIltNhAQ0M7DzDkAkXHvnn46F4IY\nncPRo5x4DyfKOSgAaA+Kr+McIuEBCxSJifxQWuUcZHmr1Wf0wQfA6NHBP087tDXnIBe9GTyYr9tu\nmMgfcRg0iFfZe+QR9/WbrRg8GPjuO+5dW60zoa8y0xNJzqFXLxZiozgUFYXfOShxUADwzzl0pLAS\nwA9ocbEmDklJrmGOqChuaKw+o+HDAzevTVuJjnYVh9JS38RBLnrDk7n5dlxfq2xGjACuvJJHZNtl\n8GCO1XtqQKUIGENikeQchGD3EInOQYWVFAB8dw6NjVybHgkPWKBISuLBVbJxe/hh9zESKSn2PqNw\nExOjhYJkI+mLOMgpKQYN8k0c/HEOPXsCX3zh23uGDOE1Fq6/3nobuaaE8R6NJOcAAGef7VqtVFnJ\n+S+rcFmoUOKgAOCfc7C7fXtBOgeZczCbs6Z79/ZxzcawEmBfHO69V2uYxo4Fbr/dt+OGopx38GDu\nnFglowEWATNhiyTnAPCMwDI0FhfH8z717OlbxVcwUOKgAODfOIeoqI4dVjKjvTgHY1gJsC8O+iVw\n+/YFHn3Ut+OGQhwGDOAG1ZM4xMWZi4MU/0i5d43rWB86FP58A6ByDoqf+aWPcwDsiUP37u1DHPRh\nJSkOvoSH2nLcUIzs7dKFnZ0/4iCnRInEezcujkt0w51vAJQ4KH7Gn3EOv1RxaA/XbBznINdlDsVx\nQzVKfMwYz7PFWoWVACUOdlBhJQUArTdsx2rrE9KRYs0DgTHnYEZ6evhjwXYwhpXshpQCcdxQicOH\nH3r+e1qa+VoPAAtHpIrDsWNKHBQRROfO3NDbafg6d+Yy1o5WrZSYyJUinpzDY4+F7nzawkUXaQsB\nhVIcYmIip8Nwww3W1UyR7ByAyMg5KHFQAGA3YPdhkYnojjjOAfAsDpEysZ437r9f+zk+/pcpDkJY\nD5CLZOcAKOegiCA6d/Yt0dqlCzsHq4evPWJHHNojZ56plR4HmwsuiBxx8ESkOwclDoqIwRfnILd3\nOoN3PuFAjqQN91TJgWbAAPvTUrSVK64IzXHainIO3lHioADAD4ovD0vnztqqaR2FjuocFO6kpoam\ntNdX5OhtJQ6KiKFbN3tLNEq6dFHioGi/vPFGaEp7fSUujsuOI2F23wj8eBThYMgQnhnTLl26cEK6\nI6HE4ZdDpOZFkpPNp20JB0Gt2BZCjBNC7BVCHBBCPGGxTaYQYpsQYpcQYk0wz0fhmfR0+9t26RK5\nD5i/SHHoaDkHRfvhpJOA9evDfRZM0JyDEKITgFcAXAKgAMBmIcRnRLRHt00ygDkALieifCFEarDO\nRxFYfE1gtweUc1BEApGSCwmmczgTwEEiyiEiB4B3AfzGsM3vASwhonwAIKLSIJ6PIoB0RHGIjfVv\nPQKFoiMSTHHIAJCn+z3/59f0nAiguxBitRBiixDiD0E8H0UA6YhhJSHYPShxUCiCm5AmG9vEABgF\n4GIAcQC+F0L8QEQHjBtOmDCh9efMzExkZmYG5iwVftERnQPAy3ymquCmop2yZs0arFmzJiD7EkR2\n2nA/dizE2QAmENG4n39/EoCTiKbotnkCQFcimvDz768DWE5EHxr2RcE6T4V/XH89UFYGrFsX7jNR\nKBRWCCFARH7NYxDMsNIWACcKIQYIIToDuAXAZ4ZtPgVwrhCikxAiDsBZAHYH8ZwUAaIjhpUUCoVG\n0MJKRNQshHgIwAoAnQC8QUR7hBDjf/77PCLaK4RYDmAnACeA+USkxKEd0FHDSgqFgglaWCmQqLBS\n5PHHP/LaB59+Gu4zUSgUVkRqWEnRgVFhJYWiY6PEQeEXKqykUHRslDgo/EKJg0LRsVHioPALFVZS\nKDo2ShwUfuHr+g8KhaJ9oabsVvjFwIGROR++QqEIDKqUVaFQKDooqpRVoVAoFAFFiYNCoVAo3FDi\noFAoFAo3lDgoFAqFwg0lDgqFQqFwQ4mDQqFQKNxQ4qBQKBQKN5Q4KBQKhcINJQ4KhUKhcEOJg0Kh\nUCjcUOKgUCgUCjeUOCgUCoXCDSUOCoVCoXBDiYNCoVAo3FDioFAoFAo3gioOQohxQoi9QogDQogn\nPGw3RgjRLMT/b+/uYuQq6ziOf3+ygqA1QGiqYmObWCglMfRCbKxbmpCUcqH1JYI1Ri4MaBBoTDCh\nXig3hjZEw4Wx8aUgqYqpL63FRKASihXEtbGvbpUQrQHBloteFI2k4M+L8wwc9sx0pu3M7uz297nZ\nOc+cfc6z/zxz/nPO2ed59PFBticiInozsOQg6SzgW8BKYBGwWtJlHfZbDzwEnNKiFHFyduzYMdVN\nmDESy/5KPIfHIK8crgSesX3I9nHgJ8CqNvvdCvwMeHGAbYmafAD7J7Hsr8RzeAwyOVwMPFvbfq6U\nvUbSxVQJY0MpylqgERFDYJDJoZcT/T3AHWWBaJHbShERQ0HVeXkAFUtLgDttryzba4H/2V5f2+dv\nvJ4QLgL+A9xoe9uEunJFERFxCmyf0pfuQSaHEeCvwNXA88AYsNr2wQ773wc8aPsXA2lQRET0bGRQ\nFdt+RdItwMPAWcBG2wclfb68/51BHTsiIk7PwK4cIiJi+hrqEdK9DqKLziQdkrRP0m5JY6XsQknb\nJT0t6RFJ5091O4eVpHslHZa0v1bWMX6S1pb++hdJK6am1cOpQyzvlPRc6Z+7JV1bey+xPAFJcyU9\nJunPkg5Iuq2U96V/Dm1y6HUQXXRlYLntxbavLGV3ANttXwI8Wrajvfuo+mBd2/hJWgRcT9VfVwLf\nljS0n7Ep0C6WBr5Z+udi27+GxLJHx4Ev2b4cWAJ8sZwj+9I/hznYvQ6ii+4m/rfCR4D7y+v7gY9O\nbnOmD9s7gaMTijvFbxXwgO3jtg8Bz1D146BjLKH9v7Anll3Y/pftPeX1S8BBqrFkfemfw5wcug6i\ni54Y+I2kXZJuLGVzbB8urw8Dc6amadNWp/i9i6qftqTP9uZWSXslbazdAkksT4KkecBi4A/0qX8O\nc3LIk/L+WGp7MXAt1WXnaP3NMgAxsT5FPcQvsT2xDcB84ArgBeAbJ9g3sWxD0tuAnwNrbB+rv3c6\n/XOYk8M/gbm17bm8MetFD2y/UH6+CGyhuow8LOkdAJLeCRyZuhZOS53iN7HPvruURQe2j7gAvs/r\ntzkSyx5IejNVYthke2sp7kv/HObksAtYIGmepLOpHqRs6/I7USPpPEmzyuu3AiuA/VRxvKHsdgOw\ntX0N0UGn+G0DPiXpbEnzgQVUgz+jg3LyavkYVf+ExLIrSQI2AuO276m91Zf+ObBBcKer0yC6KW7W\ndDMH2FL1IUaAH9l+RNIuYLOkzwGHgOumronDTdIDwFXARZKeBb4KrKNN/GyPS9oMjAOvADc7A4le\n0yaWXwOWS7qC6vbG34HWINnEsrulwGeAfZJ2l7K19Kl/ZhBcREQ0DPNtpYiImCJJDhER0ZDkEBER\nDUkOERHRkOQQERENSQ4REdGQ5BAzlqSXys/3SFrd57q/MmH7iT7Xf6mkH6jyZD/rjuhFkkPMZK1B\nPPOBT5/ML5Zlbk9k7RsOZC89mfp7MAr8FngfcKDPdUd0leQQZ4J1wGhZTGaNpDdJulvSWJkN9CYA\nScsl7ZT0S8oJWdLWMqPtgdastpLWAeeW+jaVstZVikrd+1UtsnRdre4dkn4q6aCkH7ZrqKTRMtp1\nPXA78CvgGpWFmiImS0ZIx4wl6ZjtWZKuAm63/eFSfhMw2/bXJZ0D/A74JDCP6mR8ue1/lH0vsH1U\n0rlU89AsK9vHbM9qc6xPUE0BcQ0wG/gj8AFgIdUcN4uoZh99Aviy7ba3oyQ9afuDku4F7s7UMTHZ\ncuUQZ4KJi8msAD5bvqE/BVwIvLe8N9ZKDMUaSXuA31PNaLmgy7E+BPy4TDR6BHgceD/VLa4x28+X\n+Wz2UCWjZmOl84CXy+YC4Onuf2JEfw3txHsRA3aL7e31AknLgX9P2L4aWGL7v5IeA97SpV7TTEat\ny/OXa2Wv0ubzV25pLQTOl7SXKoHsknSX7c1djh3RN7lyiDPBMWBWbfth4ObWQ2dJl5Rv6xO9HTha\nEsNCqnV6W453eGi9E7i+PNeYDSyjuh3VbinMBturgO8BXwBuAzaUtZWTGGJSJTnETNb6xr4XeFXS\nHklrqBaVGQf+JGk/1WpkI2X/+kO4h4ARSePAXVS3llq+SzVV8qb6sWxvAfaVYz5K9VzhSJu6abPd\nsozqmcQo1W2piEmXB9IREdGQK4eIiGhIcoiIiIYkh4iIaEhyiIiIhiSHiIhoSHKIiIiGJIeIiGhI\ncoiIiIb/AxSD6Sq0YLMCAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEPCAYAAACp/QjLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8VFX6/z8nJBAS0iAkQJCuoCC6IJbFEjvWtay6rq79\nu/ysW3R13XVXEAsdFZFFFFxXwYYVEQSlKChFWpBOSEgjpJOeSeb5/fF4cu/cuXfmzmRa4nm/XrxI\nJndumbn3fM7neZ5zjiAiKBQKhUKhJyrcJ6BQKBSKyEOJg0KhUCjcUOKgUCgUCjeUOCgUCoXCDSUO\nCoVCoXBDiYNCoVAo3AiqOAghFgghioUQWRZ/TxVCLBdCbBdC7BJC3BXM81EoFAqFPYLtHBYCGOfh\n7w8B2EZEpwPIBDBDCBEd5HNSKBQKhReCKg5E9C2ACg+bFAFI/PnnRABlRNQczHNSKBQKhXfC3Uuf\nD+AbIUQhgAQAN4f5fBQKhUKB8Cek/wFgOxH1AXA6gDlCiIQwn5NCoVD84gm3c/g1gOcAgIgOCSEO\nAxgKYIt+IyGEmgBKoVAo/ICIhD/vC7dz2AvgEgAQQqSDhSHbbEMiUv8C9O/pp58O+zl0lH/qs1Sf\nZyT/awtBdQ5CiMUALgCQKoTIA/A0gBgAIKJ5AJ4HsFAIsQMsVI8TUXkwz0mhUCgU3gmqOBDRrV7+\nXgrgmmCeg0KhUCh8J9xhJUUYyMzMDPcpdBjUZxlY1OcZOYi2xqVCgRCC2sN5KhQKRSQhhAC104S0\nQqFQKCIQJQ4KhUKhcEOJg0KhUCjcUOKgUCgUCjeUOCgUCoXCDSUOCoVCoXBDiYNCoVAo3FDioFAo\nFAo3lDgoFAqFwg0lDgqFQqFwQ4mDQqFQKNxQ4qBQKBQKN5Q4KBQKhcINJQ4KhUKhcEOJg0KhUCjc\nUOKgUCgUCjeUOCgUCoXCDSUONtlftj/cp6BQKBQhQ4mDDbKKs3Dq3FNR56gL96koFApFSFDiYINl\nB5ahqaUJP+T/EO5TCSgNzQ2od9SH+zRcOFB2ALVNteE+DYXiF88vQhyaWpra9P5lB5fh9F6nY23O\nWp/eV+eoAxG16diShuaG1p9bnC1t3l9jcyMu+u9FeHzl423eV6CobapF5n8z8e/V//Z7H6V1pbj3\n03tR01QTwDMLP9WN1ThaczTcp6H4BRFUcRBCLBBCFAshsjxskymE2CaE2CWEWNPWYxob42O1xzDg\nxQH4bN9nfu2vsqES24q24d/n/xtrc+2LQ01TDU7/z+mYv3W+5TaldaXYVLDJ674+2vMRLn7rYgBA\ns7MZvWf0RvLkZIx7exxyK3NdtrUjHESEB5c9iE5RnbBkzxI4yQlHiwMb8zd6fW8wmfH9DAzvORwL\nty9EcU2xz+8vry/Hpf+7FB/t/Qif7/scADB9w3R8svcTn/flaHH4/B4AqHfUY3HW4tbfa5tq8Y+v\n/4FhrwxD/vF8v47xfd73GPmfkbjto9taXyurK/Pr/PzlSNWR1mOW15dj1vez2hRm3VywGf/4+h9Y\nsG1B6+ewLncdPt7zcUDO1y6Hyg8FbF9EhIeWPYSdxTtdXvf3Xgo3wXYOCwGMs/qjECIZwBwA1xDR\nCAC/9ecg0hnUNNVg6CtDW3v4RIQ/fv5HDEsdhr+v+juanc0AuNf86IpHbd0YKw+txHn9z8Mlgy7B\nlsItqG2qxbi3x2H6huke3/fXFX9F15iuWLBtAQAgpzIHS/cvddlm/NLxuPvTu03fP2fTHHyd/TUA\nYPGuxfg+73uU1pViY/5G9Enog+w/ZePigRdjzPwxmLR2ElZlr8LVi67Gma+f6fWa5myeg40FG7Hs\n98uQGpeKDXkb8Ma2NzB2wVjsOLrDbfuaphpUNlQC4B7swm0LQURwkhN3fHyHm6gcrTkKJzm9nsdL\nP7yEPSV7AABF1UV4aeNLmHf1PNx26m2YtmEaAH6w/vXNv7C1aKvX/d372b24oP8FmHX5LLy/+33U\nNtXi2XXP4l+r/+XVwe0u2d16PyzKWoQRc0fYugYjn+77FLd/fDsq6isAAFe8cwUOVRzCdcOuww3v\n3YCG5gYQEaaun4qMmRmt96QVOZU5uHrx1Xjh4hewpXALSutKsb9sP3rN6IXdJbvdtt91bBfmbp7r\n83l74+EvH8aTXz8JAHhrx1uYsn4KRrw6ArO+n4W1OWtbOyWbCjbhYPlBj/tqbG7ErUtuRU1TDWb9\nMAvvZL0DAJi0bhIe/vJhr07/ze1v4p9f/7P1d39Do0drjmLI7CHYVrQNALcjB8oOYHPB5tbQZk1T\njW33vzJ7JT7e+zEueesSfHngSwDcmRsyewh+LPzRp3MjIr+jDiW1JYHpPMiTCNY/AAMAZFn87QEA\nz9jYB/1l+V/on1//k178/kVam7OWSmpLqKK+gu74+A5KnZpK+0r30RMrn6BBLw2icxecS06nk+Zt\nmUcj546kBkcDXbDwAnpty2tUUV9BV71zFfWf1Z+ue/c6smLN4TV01yd30ah5o+iVja8QEdGY18bQ\nNYuuoXMXnEvDXhlG/1j1D3I6na3vqW2qpTmb5tDNH9xMA18cSOV15dR7em/aU7KHLn3rUuoyqQvt\nOLqDiIi+2P8FDX5pMHWf0p3yq/Jdju1ocVDatDQa89oYqmmsocQXEunXb/yaFmctpqe+foqeWPlE\n67Y7ju6gR5Y9QqfNPY2mrZ9GadPS6HDFYcvrWn14NaVNS6ODZQeJiGjC6gn0wNIH6ISZJ9D/ffZ/\ndM7r51CLs6V1+8r6Sho9bzQNemkQHSo/RFe8fQV1fbYrzdsyj17d9Cr1nNqTzpp/VuvnkFWcRYkv\nJNJLP7zkduyyujK6/aPbqbyunLYXbaeoiVF058d3EhHRYyseo0eWPUJERPlV+dR9Sne665O76OL/\nXkxp09Jo/OfjLa+JiOjHwh+pz4w+VO+op4r6Ckp8IZFmbJhB1yy6hobPGU6rDq1y2b7F2UKbCzZT\nc0sz1TvqacjLQ+iEmSfQzqM7KX1aOvWZ0YdWH17dun3B8QL6Nvdb02Ovy1lHKw6uICKi69+9nro+\n25Xe2/Ue5VTkUI8pPcjR4iCn00k3f3AzDXl5CGW+mUkjXh1Bg14aRBvzN7rtr7qxuvWe+NtXf6O/\nLv8rERHd+N6NtGDrAnpsxWOUMSODbvngFrf33vT+TRT9TDQdKDtA9Y56mrB6ApXUlrQ+D1sLtxIR\n0YqDK2jc2+OopLbE4+dKRFTvqKeE5xOo+5Tu1OBooLNfP5uWH1hOKw+tpAeWPkCnzT2Nhs8ZTnd+\nfCd1mdSFfr/k9x73N/W7qXT1oquJiOij3R/R+QvPp8LjhZT0QhKdt+A8+u/2/7q9J68qjxwtDqpp\nrKFe03tR4guJVFJbQj/k/UDdnu9GhccLWz87/f1rJKcip/W7WrRzEXWZ1IVuW3IbOVocdPbrZ1P/\nWf3ptLmnUfxz8ZQ+LZ2in4mmG9+7kZqam0z31+JsoaLqIiIiuvKdK+n1H1+ntTlrKX1aOjlaHPRN\n9jeECaB7P73X6+e8tXArVdZXUkV9BV3034tanwci/g7s8uSqJ+nRFY8SERE38X623f6+0fYBPIvD\nLACvAFgNYAuAP1hsR8+tnk7PrHmG7l96P501/yxKnpxMUROj6IGlD9DLP7xM/Wf1px5TelBeVR4N\nnT2Unlz1JKVPS6e9JXuJiGhj/kaKey6O4p+Lp9s/up2qG6tpwIsDXBoASXFNMfWa3oumfDeFpnw3\nhUprS4mIG7CE5xMopyKHjtUco1HzRtEDSx+g2qZaWrRzEQ14cQBd/+71tGDrAio4XkBE/HCfOf9M\nOvmVk1vFav6P86nvzL60/MBy+u37v6U3t73pcvyvDn5Fo+aNoiEvD6E/ffknuvStS2n2xtl09yd3\n05jXxpies+SuT+6il3942fRvP+T9QGnT0mjloZWtr2UVZ5GYIGjc2+OoxdlCZ79+Nj279llyOp1U\nWltK5y04jx784kGa9f0sin02li7732WUVZxFqVNTqceUHpRVnEWj5o2ixVmLaWvhVuo3qx89sfIJ\nypiR4XZDP/jFg5QxI4MufetSuvDNC2nC6gmU9EIS5VXlUfcp3Sm7PLt126PVR2nqd1Pp2bXP0u5j\nu6n39N7U4myhktoSWpuzloiIyuvK6dwF59KS3Uvo2sXXulz31Yuups6TOtOXB76k17a81toYEREt\n27+Mhs8ZTsmTk+mOj++gCasn0HXvXkfPrXuOYp6JoT9/+Weavn463fXJXeRocdCdH99JyZOTKXly\ncuv9JGlxttApc06h3tN709Hqo5T4QiI9s+YZuuuTu+jF71+kuz65q3Xb5pZm2lq4ld7f9T5V1FfQ\nQ188RJO/nez2PY3/fDxlzMigwxWHKXVqKh0qP0RERO/sfIcu+99l1HNqT9pWtI3SpqXRruJdre87\nUnmEUian0ONfPU63fHAL3fnxnXTS7JPopNkn0T2f3EMZMzJo+JzhVNNYQ0NnD6VrFl1DQ2cPbd2/\npKyujNbmrKXNBZvJ6XTSlwe+pHMXnEsXLLyAZm6YSalTU10aS6fTSV/s/4Ke+vop2lW8i1Imp7T+\nvbqxunW759Y9R7/78HfUfUr31s+xsbmRek7tSQ9+8SDd8fEdtPzAcjr11VNbOxu1TbX0xMonqPOk\nznTt4mtpwuoJdPMHN9Pdn9xNz659ls5feD6dNPskenTFo1TdWE2DXxpMp809zeUe13PzBzdTv1n9\nqMXZQvd9eh9NXDORUian0ENfPESXvHVJ63HrmuroSOURqnfU01XvXEU3vnejqei8/uPrFPtsLD23\n7jlKm5ZGdU11RER01vyzaNn+ZfTIskfo4WUPU/LkZKqor2j9vF7/8XWauGYivbrpVSqtLaVp66dR\n6tRU6j6lOw18cSDd9+l9lDI5hQqOF9CS3Uuo2/PdWkXNDHluLc4WOmHmCa2d0PYsDq8A2ACgK4Ae\nAPYDONFkOxo9+ml6+mn+t3r1aiIianA0tH4409dPpze2vkFERIuzFlPnSZ1pXc46lw9Q38snIno3\n613qObUnDXppEA2dPZRu/fBWmrZ+Gl3+v8tdeueS7PJsl4a5sr6Szl94PsU+G0sX/fcit94pEdGu\n4l2ECaAVB1eQ0+mkuz+5m2547wZaum8pERHN2zKPbltym8t77v7kbpqxYQbN2TSHMAH02pbXaF/p\nPkqdmkqJLyRSY3Oj23EkS3YvoUvfupSqG6vpkrcuoeUHlhMRN4ipU1Nbj6v/TC5961LalL+p9RpP\n/8/pdPn/Lqf0aen06IpHW2+8lYdWUlVDFRFxj++1La8REbuRqIlRNODFAfTqpleJiHtR8mciop1H\nd1LPqT2puKaYLv/f5XTyKyeTo8VBt3xwC/3qP7+iG967wfKaiIiGvTKMNuZvpHs+uYe6TOpCO4/u\npAeWPkDXLLqGBr00qNU1SN7e8TYNfmkwtThbqK6pjjJmZNC9n95LT656kvrO7Etf7P+Cahpr6MI3\nL6S45+IopyKHnE4nvbntTapurKai6iJKeiGJ7l96P132v8voeMNxmrFhBl3+v8vJ6XRSdnk2Nbc0\n05LdS+iM186gm96/ic6cfyZd8fYVdLDsIPWa3ovOX3g+fbr3U4/f1bi3xxERO7h1OesotzKXUian\n0ANLH6CeU3vSNYuuad2+sr6SYp6JoYv+exEREc3cMJMSX0ikfrP60d+++hv9Zflf6OFlD7f2rk//\nz+lU01hDczfPpRvfu5Eq6yvpyneupNHzRtOlb11KTqeTZm+cTWnT0mjZ/mVExAI2et5oOuO1M6jX\n9F70zs536KEvHqIXvn2B5v84n7pM6uLVxY15bQytOrSKluxeQsmTk6ngeAGtPryaBrw4gBbtXEQb\njmxw2f4vy//i8oyMnjeaHlj6AO0p2UOnzT2Nbnr/JjpSeYR+9+HvKGpiFO0+tpu2F22nrs92peFz\nhlNORQ6lTE6h25bcRnd8fAd9+NOH1H9Wf/rr8r+6iNjekr3Uc2pPGjp7KH2b+y0NemkQZRVn0Z+/\n/HNrp88M6Zbmbp7r8rrT6aTT5p5GMzfMpMEvDaZ/f/Pv1r/N2TSHbvngFuo3qx/tKt5Ft3xwS2vn\n5d/f/JtGzh1JT339FP1+ye8p4fkEOvmVk+lI5RHKrcylLw98SU6nk/785Z/prk/uol7Te9HMDTMp\nbVoaTVs/jSrrK1uP878d/6OTXzmZukzqQm/veJtmLppJ6Velt7aV7VkcngAwQff76wB+a7IdpacT\n7d9v+t254XQ6Ka8qz9Z2Wwu30v7S/bTj6A56c9ub9MiyR+i+T+/z2ADraWpuanUWVmwv2m75t+zy\nbEqflk7birbRKXNOoefWPUcpk1MovyqfaptqaewbY+lYzTFyOp004MUBLo2FGdWN1ZTwfAL97sPf\n0WX/u4zSpqXRje/dSH1n9nUTSyvqHfU05bsprYJhh+KaYhfx/SHvB0qenEwXLLyAzltwHvWY0qNV\nLOqa6uho9VEiolbbbRWykTyx8gm68b0bKXVqKs36fhYNeHEApU9Lp/K6cjrecJwOlB1w2d7pdFJ5\nXXnr72V1ZfTU10/Rje/d2BoGIOKeqQy1GLnqnato0EuDqKyujIj4uz75lZPplDmnULfnu9GZ88+k\n4XOG0yd7PqEDZQco+ploWrhtIRERnfjyiRT/XHxrT9KM0tpSSng+gTblb6IeU3pQz6k96Yq3r6An\nVj5BzS3N9IeP/kDrj6x3ec8fPvoDfb7v89ZrLDheQHtL9tItH9xCYoKgfaX7iIhoS8EWl+uUHK44\nTOnT0imrOKv1tXU566j39N70xtY3aO7mua1h2U35myh9Wjr1ndmXdh7dSRX1FdR5Umf6Jvsby2si\nInp27bN0/9L7aejsoXTpW5fStYuvpdHzRtPirMWm2+8q3kXD5wwnR4uDiNgR3vzBzRT9TDS9+P2L\nrfdVi7OFthVta33f7R/d3uoQ7vv0PsqYkdHaOy+rK6Mr37mSRs4dSe9mvUt5VXn0h4/+QBPXTKTn\n1z1PV75zJaVNS2u9T7zd69Itf5v7LY15bQzdv/R+WpuzlobOHkotzhZqam6i5pbm1u1La0sp9tlY\nGvLyEHI6nbT+yHqKfy6eRs4dSSe+fCIV1xS3bltRX2F6n+RX5VPnSZ3pT1/+iYiIdh/bTbd8cAul\nTE6hyd9Opi/2f0Hp09Lpu9zv6Ie8H6jn1J407u1xNH399NZ9tGdxGAZgFYBOAOIAZAE4xWQ7uvVW\nogULPH5/7ZYhLw+h5MnJ9PIPL9N1715HV71zlel2T656kt7a/pbX/Y17exwNemkQHW84TtuLttNf\nl//VpaEMFftL99M32d/QN9nfuIUuJE6nkz7d+6mbqzOy/sh6wgTQ5G8nk9PppIe+eIje3/V+ME67\nlezybLfeZFZxFi3dt5QcLQ6a/+N8+u37v211Vl9nf936kD+y7BG68b0bvR5j5NyRNOTlIfTi9y/S\nBz99QD2m9KBjNcf8Ol87HSIiMg2P7C3ZS31n9qWkF5JaQxJEHEo9YeYJrd/PvtJ9Xr+rrOIsipoY\nRZlvZlKDo4FOmXMKjXltjMdcgHGfTqfTVNysqKivaM2j6ffx+b7P6YKFF1CfGX3opNknUXldOWWX\nZxMmwDRn44knVz1JnSd1ppkbZtI5r59D3ad0p9kbZ1tuf/2719Pfvvpb6+/HG47Td7nf+fT9rstZ\n5yYch8oP0aVvXeoWHZm0dhJFTYxqzb8QRbA4AFgMoBBAE4A8APcAGA9gvG6bxwD89LMwPGKxH5o9\nm+i++2x/pu2KeVvm0Ue7PwrY/nYc3UF7SvYEbH+RQHNLMz224jGqbaoN96nYoqqhylYj8Kcv/+SS\nn9H3PkPNwbKDtGjnIpfXGpsb3VyZN5xOJ2W+mdmabD9ccdglnxQJnLvgXJr/43yf3tPU3NTaWais\nr6QHlj7QGmY1o6qhyqdEsi84nU4XESDiQhZjdKAt4iD4/ZGNEIJ+/JHwhz8AP/0U7rNRKAJHdkU2\nCqsLcW6/c8N9Kr8ojjceR7fO3RAlOvY4YCEEiEj49d72Ig4OByElBThyBEhJCfcZKRQKReTTFnFo\nN7IZHQ2MGQP80LGmN1IoFIqIpN2IAwCMHQts2BDus1AoFIqOT7sSh3POUeKgUCgUoaBdicOIEcC+\nfeE+C4VCoej4tJuENBGhpQWIjwcqK4HY2HCflUKhUEQ2v4iENAB06gT06wfk5IT7TBQKhaJj067E\nAQAGDQKys8N9FgqFQtGxaXfiMHCgEgeFQqEINu1OHJRzUCgUiuCjxEGhUCgUbihxUCgUCoUb7VYc\nIrECt64O+L//C/dZKBQKRdtpd+KQlAR06QKUlIT7TNxZsgRYsCDcZ6FQKBRtp92JAxC5oaXXXwec\nTqClJdxnolAoFG2j3YrD4cPhPgtX9u8H9u4FOncGGhvDfTYKhULRNtqtOBw8GO6zcGXBAuDOO4Gu\nXYGmpnCfjUKhULSNdikOQ4dG3gR8O3YAmZnsHJQ4KBSK9k67FIdhwzRxKCsDZswI7/kAHEqKjVXi\noFAoOgbtUhyGDuX4PhGwejUwe3a4z4jFoXNnrqRS4qBQKNo77VIcUlKAuDigsBD48Ufg2LHQjHs4\nehTYtcv8b42NLAzKOSgUio5AuxQHQAstbd0K1NcDtbXBP+bHHwOzZpn/TS8OqlpJoVC0d9qtOAwd\nCuzZw86hWzd2D8GmoQFobjb/m3IOCoWiIxFUcRBCLBBCFAshsrxsN0YI0SyEuMHuvocNA1auBGJi\ngFNOCY041NcrcVAoFL8Mgu0cFgIY52kDIUQnAFMALAdgezm7YcOAZcuA0aOBtDTlHBQKhSKQBFUc\niOhbABVeNnsYwIcAfJotaehQwOEIvTg4HOZ/U+KgUCg6EtHhPLgQIgPAbwBcBGAMANs1RwMGcEM8\nejQ3xso5KOzidAJC8D+FQmFOWMUBwIsA/k5EJIQQ8BBWmjBhQuvPmZmZyMzMxEMPAWPH8lQaR44E\n/2TtiIMa5xD5/OtfQL9+wPjx4T4ThSKwrFmzBmvWrAnIvsItDqMBvMu6gFQAVwghHET0mXFDvThI\n5MjotDSuWgok330HFBQAt9yivWYlDvK16GhVytoeqKhg96BQdDRkx1kyceJEv/cV1lJWIhpERAOJ\naCA473C/mTB4Ixg5hxUrgK++cn2tvt4859DUxI4BUGGl9kBTU2SuB6JQRBJBdQ5CiMUALgCQKoTI\nA/A0gBgAIKJ5gTpOMMQhN9e9kbdyDjKkBChxaA84HEBlZbjPQqGIbIIqDkR0qw/b3u3vcYIlDomJ\nrq8pcegYOByhKWBQKNoz7XaEtJ7UVKC0NLBx5Nxc9yk5rEpZlTi0LxwOFVZSKLzRIcShc2cgIYET\njYGguRnIzzcXB+Uc2j9KHBQK73QIcQACG1oqKuJ1oH0Rh86d+WdVyhr5OBzA8eOqqkyh8IQSBxNy\nc3l/RnGwmlvJ6BxUoxPZyNCgcg8KhTVKHEzIzeXJ/FTOoWOixEGh8I4SBxM8iYPKObR/HA5e0lVV\nLCkU1nQYcejbl6fRCARHjgAnn8xhJH0FlBKHjoHDAWRkKOegUHiiw4jDuHHA0qWBWS40NxcYOJAb\n/Pp67XUVVuoYOBxAnz5KHBQKT3QYcfjVr7iR3rOn7fvKzeWJ2eLjgbo6fq25mSuYlHNo/0hxUGEl\nhcKaDiMOQgC/+Q3w6adt2w8Ri0P//iwOMu8gHYQSh/aPcg4KhXc6jDgAgRGH8nJeejQx0VUcGhqA\nrl29i0OXLqqUNdJROQeFwjsdShwuuADYvx84etT1dX2eYOtWYP16632UlgI9e/LPRnFISFCzsnYE\nVFhJofBOhxKHmBhePjQ7W3utpQUYPhzYsoV//89/gHfesd5HRQXQvTv/bBSHbt3YORiT3uEMK/3t\nb8CCBaE7XkdAhZUUCu90KHEAuNev7xF+9RVw4ACwejX/vnGj50ahogJISeGfjeIQFwdERblP8BdO\ncdi0CcjLC93xOgJKHBQK73RIcdA/9G+8AVx4IYeSamqAXbv8F4fYWF7tzRhaCpc4EAE//aTWJvAV\nh4Nn8q2vV/khhcKKcC8TGnDS0rTG/9gx4OuvecnPCy8ENm/mRLOnWHN5ubk41Ndr4mBMSjc2ams/\nhFIcjh0DysqUOPiKw8HfU48e/Pn16RPuM1IoIo8O6Rxk4//++8C113LOITaWcw1XXNE25xATYy4O\nclbWUIrDTz/x/0ocfMPh4O9RVZYpFNZ0SHGQjf/evcAZZ/DPY8cCb78NXHklN6YtLebv95SQ9uQc\nwlHKuns3cOKJShx8gYi/v5gYVVmmUHiiw4mDPqyUn89zLgHAr3/NjfbYsUBSEoePzNA7h7g493EO\nkZRz+Oknvp6OKg47dwKzZwd2nw4Hf4dC8HdlVpqsUCg6oDjonYNeHM4/H+jdGxgwwL2iSY9VzsFb\nWEmJQ+DZuLHtgxqNyJASwP8r56BQmNMhxUE2/Hl5mjicdhqQlcU9RmNFkx471UqRIA6yUqkji8Ox\nYzwoMZDoxaEjOoejR7WybYWiLXRIcSgt5Qa7spLDTJIePfh/fejJiJU46KuVIiGsJAXwpJOA6mr3\nsRcdgWCLQ0d0Dl99Bbz0UrjPQtER6HDiEBvLDfWePRxG6tTJfRtvzqEtCelQicOePbzmRKdOfJ7V\n1YE/RmkpT4UeLo4d4+8pENOwSzq6cygtDc81lZUB06eH/riK4BFUcRBCLBBCFAshsiz+fpsQYocQ\nYqcQYr0QYmQgjtuzJ8+hJENKZn8/dowb8TffdO11G52DnLLbbs5B9kYD2aCZceQI508AIDk5OKGl\no0eBFSsCt4iSHZYs0aY/kd9RTU3g9t/RnUO4xGH/fuCtt0J/XEXwCLZzWAjAU98zG8D5RDQSwCQA\nrwXioGlpwLZtnsWhpIQTnnffDfz97/x6YyM3FvHx/LvZrKxmzkE/8V5UlHnoKdAcOcJrTgAsDhUV\ngT+GFMYVKwK/byteeglYuZJ/lqGzQIaWfgnOwWzm4GBTX9/xPstIgyj4nU49QRUHIvoWgGWzRUTf\nE1HVz7+C3BnvAAAgAElEQVRuBGDRnPuGN+cgcw6bNwO/+x2vILdwoeYahODt/Jk+A+Cfg90jNYpD\nMJxDOMTh8GG+NoDFoW/fwM6BpJxDcKirU+IQbGbPBp59NnTHi6Scw70AlgViRz17Atu3e3cOW7YA\nl18OTJgAfPaZa0gJ8K+UFQhN3iFU4nDGGcDataFpRBsbgYICvraWFi4rHjZMOQdfCKc4hMOxBIsf\nf+QZjyOJgoLQThYZEXMrCSEuBHAPgLFW20yYMKH158zMTGRmZlruLy2Nb1Zv4pCfD/zzn+wUdu1y\nTUYDvs2tFA5xOOEE/jmY4tC/P/+8YQPg4SMPCLm5bJuPHGFhSE4GevUKnjiE2jnU1vLx9B2QQFNa\nyoM3Q01HCytlZ3P0IZKoqrKe2UGyZs0arFmzJiDHC7s4/JyEng9gHBFZhqD04uANuViPJ3HIyWFR\nGDaME9L5+azM3pyDnbBSsMWBiMdwhMI5xMUBl1zCtfPBFofDh1mMjhzhkFJaGs+eGqywUqidw/z5\nwLJlXG4aLEpLuUov1HS0sFJDgxZWjRSOH+ecpieMHeeJEyf6fbywhpWEEP0AfATgdiIKWE2MFAfZ\nszaSmsqN/q9+xaWgMTE8R9GGDfbEIdzOobKSb5KkJP492OKQnh6agXaHD/NI9oICoKhIE4eO4hxK\nSjjZvm1bcPbvdHJJaXsIK1VXR/bgzYYG7dmPFKqq+LxCRbBLWRcD2ABgqBAiTwhxjxBivBBi/M+b\n/BtACoC5QohtQohNgThuWho3+r16mf89OprDR3JSPgAYMQL49ltXcZAzrTY1adVKdnMOwZx8T59v\nAOyJw/ff+26TpTjExobmpjx8mJ1c9+48r1JamjaoMVAYnUMoxaGiAhgyBJg2LTj7r6xkgQiHOPga\nVnrlleB9DoGgvj7ynENVFZ9XqAhqWImIbvXy9/sA3Bfo46alsTCYDYCT9OwJjBmj/T5iBPDeezyl\ntx7pHrw5BykkQPAbHTNx2LHD83vef5+vZdQo+8eR4hCqmWYPHwauv56vbcuW0DiHUDakFRXAX/8K\n/Otf7t9hICgt5Xs+HIlhX8NKlZWRPV16pIaV9O1MsImkaqWAMXIk8OGHnrd5/HHgssu030eM4F6X\nMVloJg7hLmXV5xsAe86hutp9JtqWFs8JLr04hMo5DBzI17Z5c2hyDqF2Dv378/154EDg919ayiHA\n9hBWksn5SKW+PjLDSqF0Dh1SHDp1As4+2/M299yjzbUEsDgArtVKgCYOVtVK8udonQcLhXPQ51Ps\niMPx4+7iMHUqMGWK9Xv0YSV/e3l1dfYbd704HDzYMZ1DSgqHJ4MhtjIZHa6wUkuL/UFaNTXKOfhK\nxImDEKKbEKLTzz8PFUJcK4SICf6phZYBA7gh9OYcZM6hqQn4zW/cXQMQnrCSHXEwjqIuKuKqLStq\na9vuHBYtAv7xD8/bELGzqa9nQZDX1hFzDikpwcvhSHEIV1gJsC9MkS4O9fX8OUZKBRYRP8MRJQ4A\n1gHoIoTIALACwB8AvBnMkwoHUVHA6NFARobr61ZhpepqHjhXWNg+xMEsrFRZCRQXW78nEM6hutrz\npIBNTSwCzz/PAi2ENrYiLY0bU08r9/lKJDiH2NjgPOThdA4dTRykeAcrtPTmm751EGpqWCAiTRwE\nEdUBuAHAq0R0E4ARwT2t8LB6tWsFEwAMHcpVPsaEtPxid+8Ojzj4E1YyOoeqKnvi0JaEdF2dZ3t+\n/Dj/ffFiDikBrs4hOtrzyn2+Ei7nQMTfUbCdQ69e4QsrAfZdS6SLg7yeYIWWHn3Us2s3UlXF922k\niQOEEOcAuA3AF768r71hVt109dXAF1+4l7J6E4dg3vgVFa75ksRE72s6WDmHo0et3xOIUlZvJYHV\n1Rw62rwZmDWLX9OLAxDY0FJTk1bxEUrnUFPDx+3cOfg5h/YSVorkhLT8foIhDvX1/Cz60kYcP87F\nBpEmDn8G8CSAj4noJyHEYAC/mLWmLrmExwjU1kaGcyDiG1bOHAuwqHXrxjeQFcePa3XwEukcrJKI\ngXIOnqx5dTWQkMACcOKJ/FpqKpd7JiZqvwdKHMLlHPTzdgXbOTQ3h3b2TsB3caitbR/OIRhhpcJC\n/t+X66+q0sQhVN+tV3EgorVEdC0RTRFCRAEoIaJHQnBuEUFCAvDrX3PMu3NnLecgH+49e0IrDg0N\n3LgZXU5KCo+ONUMmfGNj+SaTVFby/qxEJRClrHacQ0KC62tCAM88o82OG8hy1nDlHIziEKycQ8+e\nnD8LtXuQ33FHCSsF0zkUFPD/vopDjx783YbqnrVTrbRYCJEohIgHsAvAHiHE48E/tcjhqqv4gRbC\n1TkIYS4OwRznUFvr6hokqanW4tDQwDdVr16uoaWqKi7dtco7BKqU1VdxMNK9u5YvaW5um4sIpHNw\nOIB16+xtGyrnkJpqPoo/2Eix6ygJ6fp6ftYjSRwSEzkkGarQkp2w0ilEdBzAdQC+BDAAXLH0i+Hq\nq/mhA1xzDoMG8c0TSufgSRysGs3qar6xUlK0RtbpZMdw4onexSGYCWl5bp7QJ9yXLeMxKv4SyIn3\nli8H7rrL3rZ6cQhmzkGKQ6iT0jLUaee4Tmfkh5UaGrhTEoywkj/icPw4F2ZEmjhE/zyu4ToAnxOR\nA0CII5rhZdAgYN8+/lkfVho8mBuYSBEH6Ry2bdPOF+AbKyGBb3bpHGpqeD8ZGdZJ6VAlpL05h6Qk\nTRyOHfNcYeWNQE6899ln9h/UYDuHlhbuXaakhGYlQiN1dfw92XEsMm4eyeJQX89hnEhyDpEoDvMA\n5ADoBmCdEGIAgCoP23dI5Bz5+rBSfDyXXwZDHBoazGv77TiH//yHV7aTmDmHykq+2dLTPTuH+Pjg\nl7J6E4fkZC1XUlnZtrLWQDkHpxP4/HP7jUewcw7V1fxdyVmGQy0O9fV8j9k5ruyNR0K10g8/mCd4\nGxqCKw6dOnUAcSCil4kog4iuICIngFwAFwX/1CITGVZqbOSHfPDgwJWyPvig1qO8917g7bfdt6mt\n5cokI3pxOHqUF3yXmDmHqipudK3EQQ646dpVy6F4KpW1oq6O32vVo7TjHPRhpYoK69yKHQLlHDZt\n4u/BH+cQjLCSDDsAoc85OBzckbEbVqqp4c/Al2ckGBVYTidwzjnA3Lnuf5POIVhhpX79fA8rJSaG\nboZkwF5COlkIMUsI8aMQ4kcA0wGEYa2pyEDvHDyJg7HR2bMHWLDAer9NTcCrr3LZLBGwahUvQGTE\njnMwioN0DvrErnQOvXqZh5UaGvi6oqI48e6vG5KNp1Uj6o84tGXEdKCcw2efATfdxPeCnYY42GEl\n2XgAoQ8r1dezs7YrSjU1fC/60jheeSWPhQkkDgff308/DWRluf4tmM6hsJBD1b48TxHpHAAsAHAc\nwE0AbgZQDWChx3d0YPQ5h9hYnp/fjjhs3QosWWK9X9kb/vprYO9ejq2bJZhlrsCIXhyKinjiOtnT\nl84hJcW+c5D5Bom/5azy4bJ6yHwVh8pKbbSxPwTKOaxcyQ2W3Yc12OIgq1mA0IeVpMO0e9yaGm54\nfRGH3Fx7uaamJvsOo6mJ7/GnngKefdb1bzIhHWhxIOLnc+DADhBWAjCYiJ4momwiOkREEwAMDvJ5\nRSxG53DHHdzz0GNWylpf7zrGwEhpKffQv/4aWLuWb1qz2n5vzoGIH6KEBJ7aG/DPORjFwd9yVm8l\ngf44B8D/vEOgnENVFY/g9vawHjvG30mwcw7hDCvJe8WuY/HHOZSUeJ6jS3LLLfwM2UGOlh82zLWz\nIUOqwRCH0lIORyYmdoxqpXohxHnyFyHEuQAibDLb0KEvZY2N5YZrsEEqzZyDp8FmAN80Z50F7NrF\nic6rrjJ3Dt7EoaKCH9QRI7Q1A2TIwegcPCWkzZyDP+JQV+fZnvsjDlFR/ucdAuUc5AJPcXGeH9Zr\nr+XvMxQ5h3A5B3mv+OIckpP5Zzsi1tzMn58dcSgp0aqBvCHFIS7O9f50ODhhnJgY+JxDQQFXCNp9\nnqT7j9RxDv8PwBwhRK4QIhfAKz+/9otE7xyM4SSJmTjU13sXh4wMFohly4Abb/TNOfTowfs4epTd\nwEknaXkH2QDrE9KVla5hJaMVN3MO/oaVUlPbJg5JSa7VSiecEH7n0NTE33/Xrp57l0VFvPBUKMJK\n0jkEO+dQUgK8/LL2uz6sZKexl0UVdgeLyo6AHXGorbXfcbASB3k98fGBdw6+isP55wMbN0ZoWImI\nthPRSAAjAYwkotMBXBj0M4tQjDkHM7p25d6RHjthpdRU4OKLufE780zfnEOPHtxgFhWxOJx4orlz\nkGEZebPFxfEDIs/tk094DYZAOAenkx9AT/bcjjgkJvLn2dLC5z94cGDEoa3OQYqDp4e1tBRYupQb\n1FAlpIMdVtq2jee+kr1af8JKUhzs3FOyk2RXHOzeG/JeMIqDfLaNrweCggKgTx/7115cDLz7buSG\nlQAARFRFRLJ5ezRI5xPxGMNKZpx8MoeH9MiwklWyTIrDrbcCkyZZz0RqJQ6yB7R3r2/OAXANLW3b\nxpVSgXAOcvU8Tz0wO+IQFcXbVFWxOAwZEpiwUludg7ewUl0dN6AnnxyanEOowkolJXy83bv5d3/C\nSt262S/5ls+BHXGoqQmcc4iLC39YqaGBC1ki0jkoXDEmpM045RSurtDfzPX13FBYNZJSHAYMAO68\nkxvUlhb37a3EAeD379rlLg6y4dAnpPVhCH3j3dTEiWy5CpzEH+cgSxzlw+d0crmuHjviALCQFRVx\nLLhPn8hyDt6+0xtv1MaLAMHJOYQyrHTsGP+/YQP/72tYKVKcg5U4yGfbn7DSzTd7jhDIUey+iEND\nAz87dpxqIFHi4CPywZOD4MyIieGE8I4d2mvyC7W6cWRDIhHCfL4kO+LQuzfXUefl8bnKUta4OO3c\n9c5BH/ttbOTFhNpSylpaqgmh7IHJtaQfftjVPfkiDjk5/GB17x5e5+B0ciMYE+P5YS0pYQf4299y\nmFASqWGlI0eAOXO8b1dSAvTty2NyAP+cgy8j70tKtDVLPEEU2JyDr2Glhgbggw9cp64xIvdt1zXV\n1wO/+x0LvxARIg5CiBohRLXZPwB9QnN6kYcd5wDwkqNbt2q/y8bAKiltFAeAGxZjUtquc+jcmXMX\nBw5opaxCaO5B39PU36hNTdxIGJ2DL6WsN9zA5biy0ZAPWXk5N6wyHyMfZrMR30aSk4HDh/l/mV/x\nh0A4B9moCOE5rCS/0379gDVrtNeDJQ76UlZ/RG/dOo5ve+PYMV4/3SgOdh2LPiFtN6w0aJB3cWhs\nZLftq3OQDa7stOhzDr6EleTKbtnZ1tv4OpllQwNP7ihXfowIcSCibkSUYPHPZM00d4QQC4QQxUKI\nLA/bvCyEOCCE2CGE+JU/FxFK7OQcAGDUKODHH7Xf5RfqizhYOQerxjQ1lR1Br17aOWzd6jp/UUYG\nD5Dz5BwaGlgg/A0rHTrEDYgxrKQvo5XXEhtrvgKfkUA6B7kSnL/OQYaUAM9hJekcjJhNR/LII8D2\n7drveXk8G7D+NU/oB8H5G1Y6cMCeaJWUABdeyCN9y8pcnYOvYSU74lxSwoPGjEUeRmRD7qtziIpy\ndcb+OgcpCocPW2/jizjIz3LUKGDLFv45IsQhQCwEMM7qj0KIKwEMIaITAfwRgMksJ5GFv87B17AS\nYO4crEZIA9r7pTiccQbfVPppsS+7jKea9uQcALbG/iSkm5o4N1Be7hpW0seC5WdgN6QE8LkePqyJ\ng7fe4c6dHMIyO79AOQfA88Nq9p0C7DiMjcOqVcA33/DP27cDY8bwNezcae+cApGQPnjQ3nd87BiH\nLs88kyeu82eEtK/OYeBA786htpbvE1/FAXAVAn9zDtnZ/DkEyjno25ion1tqvcvRh62DQVDFgYi+\nBVDhYZNrAfz35203AkgWQqQH85zaip1SVgAYPpx70PobztNSnr44B1/FQe8crryS18SWI6QB1x6c\n/H/vXnvO4YYb3Hu8ckSwMaykT4YDvomDDCulpHBYyVsDkJWl9bb06MNKnTpxQ+3rPE1652AnrGSG\nUWwLCjSn+fbbwPjxnNz0tMa3Hr3Y+5tzsCsO0hGddRZPQBiKUlY7YaXaWr73Gxvt7ddKHOxWK61e\nDbz/vjYvU3Y2cN553sVBFid4O0d5Hnpkpdu+fTxQNpiEOyGdASBP93s+gL5hOhdb6MNKVoPgAP7b\nySdr6l5fzyWjZs6hrk6b1VKPPzmHTp20BmnUKG649Y3wOedwJVVzs9b4651DYyM/YPv323MOBQW8\nP4n8ubzc3Z7ry2gB/8QhOdmecygqMu/16cUB8M89GJ2Dr2ElwLWctaaGBVyKw/r1HLbp1cv+2hWB\ncA52w0rHjvHUISNHAj/9FPxSVrviIPdr5/4AvDsH+ZpV+fl11wFvvMFTdgAsCpdc4i4On32mibUM\ntfrqHCTSORQUeA+ztZXo4O7eFsLwu+lXMWHChNafMzMzkZmZGbwz8oDdsBLAg7Vyc7lBluJg5hzK\nyrhBF4ZPIjXVPebsTRzS0zULmpTEOYbcXO0hiI7m0NKqVdrxjM5hyBDgu+9cj2N1Mzc1uT6Iubks\nUGbOoS1hJTmFRkoKX1dNDX8P0RZ3cGGhea/PKA5yNLuxh+YJuzkHu86hsJCT1nl53PDu3Mkhm7w8\nHndih7bOylpezt9LlJfuYkMDX39iIlfkPf0033PBLGX1JawUH68VLPTu7Xl7b84hOpr/ydHweoj4\nOj7/XBuTlJ0N/POfPJGf/j67915O3g8Zoj0Tctp/T1iJQ0OD9f29Zs0arNFXP7SBcItDAYATdL/3\n/fk1N/TiEE7shpUAbvjkF9jQwA2AmThYNSK+OodevbjEUM8ZZ2jhHMmVV7qGXIw5BykOdkpZm5pc\n95+byxOZSecQF6fFbtsqDgCLQ1QU/15RYd0zLyqyJw7+9LKNYSWrEJcn56Af61BQAPTvz43Z/Pnc\n6MbFeV6I6fvvudMhr6mxUbsv/AkrHTzI37u3eYnkNQnBo/Bzc/l79bVaSZayenNtRPx89O+vLYBl\nVcAg99vSYi/v4M05yNdra93Fob6eX+vcmb+H775jcTjpJP4e8/LY7RDx/S7vRSkOdkJfZmElvXNo\nbna9BsC94zxx4kTvH4QF4Q4rfQbgDgAQQpwNoJKI2rAIZPCRzsHTOAdJfLxm/TyFlazEQeYc1q7l\nGLQs/bQSh7PP5p6MnjPOcG+Ar7uOezgSY7XSkCH8s51SVofD3TmcfrrmHIxhpd692yYO8n99Oeu3\n3wJ//KPr9nbFwZ91KuyGlew6BzlqdvRoHiR47rn8utWMuTU1wNixWrWT/BylE/RH8A4eBE491XtY\nSS94nTvzvbJ1q39hJTvO4fhxrdxU/zx52q/dUmd95ZrROejFwez7lccC+Pv66CN+T1ISi4IMLdXX\n83HkefuSc/AUVios1M4jWARVHIQQiwFsADBUCJEnhLhHCDFeCDEeAIhoGYBsIcRB8HKkDwTzfAKB\n3VJWgG8e2UB5Cit5E4cXXuA6+cZGzeqaIQTHgvWcc4577zUxEbj7bu13M+cA2EtIG51DTg6Lg6xW\nMoaVBg5su3MAXMtZP/yQ4/R6CgvN48WBdg7eqpXs5BwKC1kcRo3in8eO5detnEN5udZRAFzHOAD+\nhZUOHGDHB3h2HTLfIBkxgvNTwQor6T/DhATPoSXZcbJb6qyvXDM6B9ljt6pY0ovDeefxFBeDBvHv\nenGQ97q+kyhzDt46JXbEIRgr1UmCXa10KxH1IaLORHQCES0gonlENE+3zUNENISITiOirZ72Fwn4\nknPo1k27KRoafBeHnj254mnbNh534KmM1Yqzz+b8gieMzmHAAA7d2ElIm+UcfvUrFgyzcQ7+ioNs\n/KQ46HuHK1bw56MXgqIiDi8YH8BAOwdjtVJ1NfDEE9yrr6jghsoMK+cAaOIgx60YG3p53fLe0o9x\nANoWVvJWsmwMlY0Ywf/bCSvdfTeXvjY18XHsiENJifZs2BUHO9VsgG9hJSN6cTjzTL5uM3GQxRfG\nsJLdaiVPCWn9foNBuMNK7Q5fcg56cfAnrNS9O9/AjzzC+8rJ8V0c5Hl4wugc4uK4sbLjHPRhpZYW\nvmlPO819nIMUh0GDAuMcMjI4cZuTw/uNinKtgmpp4fcYH55gOAd9zzIvD5g6lavUEhKsXZ4x55CR\nwQ3t7Nl8nwAcW+/Rwz3vJD9v2VDqk9H+XpNdcTBzDoC9sNKKFcB99/H9KJeeDaRzkJ0ns7BSczMX\nYujLlr0lpI2vG48ln6uuXTl8qxcHORBO7xzkZxMTYz+sZJVzKCw0v78DiRIHH5EPgFkFgxEpDkR8\nI6SluTqHnBxgwgQOiZiJQ0wMz8szfjwn5H76yd5UE75irFbq3Bl48kktzCC38ZaQLirSxiE4HNxY\nBzqsJP//85+BWbN4uofLL+fPR5bRFhXx5Hz6kMCGDfw9BMo5WIWV5PEWLrQOKQHuzqFPHxaShx5y\n3c4s72AmDm0NKx06xNV1/joHb2ElmViOjdXuYbvOwZewkixlNTqHsjJe2vXIEe01u87BmzgA/Ixe\ndhn/rL8XZYelpkbrLNm9dquwUl0d3xNDhihxiCiio/kLkXPreEIm0OSqYcnJruJw//08F1JiIg8o\nMuODD1g4+vfnKZL9cQ7eMI5z6NKFz002xIB1QlofVsrN5fMUgkWioEBzDtXVfO39+/snDrJnLJ3D\nyScD11/P6wpcfjlXgskHv6iIE9/x8drDc9VVbPXNxMEf52AVVqqt5et/5x3rZDTgmnOQzsEMs7xD\noMNKRLzP1FTfncPAgVoHwJMoVVXxvTB3Loc6AXtxd72rTkjwnIA1lrLqke5LPymeHedgJ+cA8EzK\nskhIP92+fqoY/WSWbRGHykr+LHr0UOIQUURHc6PmzTUAWkJaxg4TE7Wb5csvube2aBFXOowZ43lf\nwRQHM+dgto1VWEk6h9xczlcAmjjIhuPoUW1NCX/EITqawxL67SdM4B73ZZe5ikNhoeYcamu58Tt+\nnP8eiEFwnsJKtbVcBFBTY885OJ382fSxmMpSDoTbvJndCKB93lbOwdewUl0df+cxMb47h6goYMEC\nDqV4Oq5835gxnLwF7DWQZWXcCAL2w0pmzsEXcfA152BEP7OBPqwkc3CA9sxZDbADrEdIA9yZ0Hd+\ngoESBx+RCWlv+QZACyvJLzkxUVvw57HHgOnTzRtiM0LlHKzCZWaNhtPJMdyqKv5ZOgfAXRyam/mh\n1S/5WV6uOQE7SNsu6dOHY7tpaebOQT7Yci2JnBz+X18n749z8JSQrqvjBj0z07NzkDmHkhL+TKw6\nG+npLB4LF3JVFhD4nIN+6g1fnQPAI4SluHgTBz1W4rBrl7afsjItqd+tm72wUiCdgz5vqMeTOCQl\n8bnI0GqnTlpYSYpDVBS/7ul7MnMOcpJAfecnWChx8BHZ6/RFHGRiSdriPXv4/2uusX/cfv24IQy2\nc9CHTIzbGB9kWSceH88NlF4cunfnhqRrV+1BM4pDTo62vb/IEb1WYaW6Ou14hw7x96cPBwbCORjD\nSvHxwP/7f1qYwQzZCHsKKQFaWOmrr/i6AC0BLxtKY1jJ15yD/v12xMHKEenDWfv2ufaKfRGHe+7h\nQWUAX6td5+CplLWkhGP0e/dqr9lxDvr7VY8ncRBCq5iqquLOguyk6J2AN+dkVfTStasmDu12nENH\nRFaf+Ooc5NTUcXE88d0FF3jPWejp358ftlA4BzNxkI0GkTalh6wTl3PZGJ0DwNfbqRM/CN27a4u2\ntLRwYy7DUG1FnwQ0hpVknkeKg/Ha2+IczMJKcXGcD7n9dut9yJyDN3Ho1YuT6YWFWmK6vJzfIxsG\ns7CSLzkH/fs9iUNjI5/DCSeY/10vSr/5jTYhHWAuDlbVSsePa6vN+RJW0ouDmXM491zfnYMncfD0\nLMrQUmWl9l35ui67WVgJcBUH5RwiCF/EQSq7/ktOTOSJuHydGko2usF0Dk6n66hR4zaNjTxYSs4G\nKR+ulBSOgxudA6A9DHFx/Fp0NH92Bw7w+3yZ08gTnsJKnsShrc7BLCFt5zvSOwerfAPAzmHTJh7V\nXlKiLWbTr1/ow0r797OYW4VC9cetqdGcDuCbc6iu1sJA/uQc5PQU+rLVkhIef1NZqe0jWM4B0MSh\nqspaHLyV8lo5h9hYlXOISPxxDvp65aQk7glecIFvx+3enW+GYDoHmaw1czSylDUvT2s8pJBIG2/m\nHPT14lIwkpLYfQwcGLhr6N2bGwC5noS+lPX4ce6BHzwYGOdgDCtJRwXw8ex8R/J92dlafbwZcvr1\nq67iz7SkhMWhf3+tkdNPvw74F1ayIw579nCVmBV6x1JXp/X+AWtxMBPm6mpX5yDvG7ulrGbLaZaU\nsNCeeKLmHjxNn2HHOdgRh8pKnu9MFqb44hzshJWUOEQQQnCYxK5z0FcrAdzDk2s8+3rc/v2D6xw8\njd2Qpaz5+a4hKBlWOniQHzTZg7VyDkBwxCE6mj/X777j3njfvq5hpeHD2d0Ewjnoe5xRUbwP2aAa\nl1e1QjbCcnyBFVIcLrlEG/MgxUGGlfS9a3lNnsJKy5e75gP0zsOTOOzeDZxyivV+9aJUV+dagmvX\nOcjZTktKtBJbX8NKgPv4BHn8oUM1cfA0fYbeOcixCnrsiENJibtz8CXnYBVWOvVUHoOkn54nGChx\n8AMZGvFGTAxvW1HhGlbKzPQt3yAJljhI52CVjAa0Gzkvzz0/kZLCU3zok8uhdg4Ah1puvhmYOJE/\nZ31YKSODz8l4fWbOITcXuOMO6+PonQPgGlryJaxUX+9dHFJTeWLB9HQWP7nKnj6sZCYOVs7B4eBZ\nefWzrwbSOTgcHM5pbPRPHGTp8bFj3JhGRWn3kN2wEuDeq5aJ9GHDXMUhFM7B35yDlXN4912e/VU5\nh0fe6kMAAB5GSURBVAjErjgAfAPJkaEAlwFefLF/x/31r7VJ8QKJ3jlYiYNsNPLzuVeqz090786N\nvZk4hMo5AOzGxo7l0dOAa1gpKYkbVDvOIT+f5wCywvg56UMYdsNKdsUB0GZp7d2bK7yamvhnK3Hw\nFFYqLOTGV78gTaDDSvL9dsJKxsZRXtOxY64hJcB+WAmwdg5DhrDLBdzFQT+9fqBzDsZBcGbXP3eu\na/WRtyl6lDhEIHJuFDvEx/ONKXsi8+Z57pV64qmnODEZaKRz8BRWkjdyfj7/LrePiWEhyMpyFQdj\nWEmO6AT4gSsuDrw4vPgiL9soXZk+rJSYaC4OZs6hvt56OVfA3TnoK5bshpW6dmUX1qWL60h0T/Tu\nzaGd7t21smi5JKu+EfUUVpLfn6/i0NzsOnOrGVKU5GfhzTmYJWRravj7KylxFz1PI6SdTteYvr7h\ndDq18FRSkveEdLCcg7ecw5Qp3FmQWIWVJEocIhB/nIN+OL7VYiXhQjoHT2El2Wjk/byoqxQH6Rwa\nG92dQ6dOWmP82mvaIDbZEAVaHFJS3MM93sTBzDl4EwejiPobVvrpJ++uQU+vXpo4yAFhVVXapHf6\na5KC99vfugqF/P70jZA+52A1Bfnhw3x8T8Inj2sUByLX2VUlVs6hb192Dvp8A+DZOdTV8Wcqx73o\nG/vycn5vTIxrg2omDvX1rkvoJif7Lw7FxXys3r3thZWOH3d1O3acgxrnEGG0JawUifjiHPLyuNGX\n1U0y5wC4ikOPHq6NZP/+2oOYnMz7sKqXDxRG59C/vz3n0NCgNRJmGEXU37BSZaVv4tC7NwuKdA7V\n1e69a0DrwTscPFWFvkHNz+eGy1fn4C0ZDWiOpa6O73spDnK+KePnYlatVF2t5VOKi12vTc4wYIZR\nlPVhIr1r0YuGmTgcPszlurIDp5/VQI8dccjO5u8pPp7vmepq64S0nOLFV3GQ12hnuVVfUeLgB3IO\nGjt06+YaVopE7DgHWcJbV8fJUZmjkNVKgKs4pKdzItWMpCQWBqvprAOFPufgq3MArHup3sJKdktZ\nAd/FobjYNaxkjMsDWiMte5X63mVeHnD++b6Lg7d8A6CJUn093wulpRzSsVou1co5JCWxKOzd63pt\nKSksqPrxCxJ9vgFwnTDPKA6enIMxByRDyMbwjR1xOHKEr0Um1UtL3Z2DvPfq6/m6/BWHyy4DNm60\n3tYflDj4ga/OIdLFQe8cPM31FBvLll+WteoT0oD7VBgjR5rvJykp8CElM4xhpdGj3ceXWOUcAK2X\n+uKLrqEF4+dkDCvZLWUFfA8rAa5hJTPnIMM7UhT0DVt+Pn8GenGwM0Lazmh2fVgpOZnPsaLCd3FI\nSODt9+51T7QnJZkvAWocsax3CPrj60VD/z127syN89697t+JWd7BjjjINUUArR2wCivJjoheHHzJ\nORw65Dr6OxAocfADX8QhPj7yw0p2xjnI7fr21W5qfc6ha1fPs5DqOfVUYNy4wJy7J4xhpSFDgMmT\nXbfx5BykOEybxnMbScycgz9hJcB35wBo4lBTw/eWlTjIBsfoHMaM4b+ZTfltJQ6Vld4nSdSLQ1wc\nV+YVF/smDjU1LA5paexWjNeWluZaBSUxOjZ9w2knrCQE/y0ry70i0CgOcjZVTx2p+Hi+Pim63sRB\n3mu+OAc5zqGlhce/5ORYb+sPShz8oC0J6UjEzjgHQHMOenGIieHXVq+2P3bjgguAxx8PzLl7whhW\nMsMq5wBojWtFBfDNN9rfjSLqT1jJH3Ho1o3/paTwPdilCzsBq5yDVVjphBPcVyvz5hwqK71XVckZ\ni+VgLzlpoJU4mFUrVVfzNfbsydN1mImDcWU8wD2s5Mk5mIWV5Ht27jR3DpWVwNatwIMPaq7B0/0u\nBLsHvXOQE1FK2ioO8lrktCry+wwUShz8wNecQ1NTZIuDv85BhpWEsF6sKJwYnYMZ3pxDYyP/rhcH\no4j6E1aSU5lLN2CXXr1cp7DOzTV3Dvqcg74xLCvTRujLiiU74lBV5V0cpHOQJZvp6dwgenIOZglp\n6RyamtzzKT17mjsHY1jJm3MgMheHPXusncPWrTy63FtISZKaqn2usqTdF+fgLawkz106BuUcIgBf\nnQMQ2WEl+VA3NHh3Diec4B5WilSMOQczvOUcKiq4YSkrcx3jYRZWInKvZbciPZ0H2vk6Ur53b9e5\nhnJy7IeVCgv5uJ06sThkZ/N32NysNUJtcQ5WYaX1683zT95yDoD/YSUr5xATwwnipib3SSbj4vg1\nY25FlrMeOcKfd1mZfXHQOweHI7BhJYCvef9+Hn8ixSEvj8ektBUlDn4gLb0d9IuQRypysfeaGs+N\nvXQO+gS2sfonkpC9x6oq6xXnvDkHOcDswgs5dAaYj5CWNfJdutgfx3Lqqb5dDwD86U/aiGkrcbAK\nK+Xna+XDUhykcEqRaqs4GMNKBw+y6/rNb9y3l8KsLxPVOwfAflipuNh1HIVxnIN+P/Jvxvs3Lo4r\n2ozPtnQOublcfbVzpz1x6NnTNecgjyHxJA5EvonDWWex+Dc388p8CxZ4Pz9vKHHwA1/DSkBkOweA\nH1Rvy59ecglw+unuYaVIJS6OG0a5noQZVjkHue51RQXH+C+8UAstmc2tVFdnP6TUFm68kRswwH5Y\nSf4v8w0Ax9UPHHANKQGexUG/nRn6EdIyrPTOO1w6ayYsQriLszfnYBVW2raN702JPqxkTKbLXJRZ\nWMksB6QXh4QEDi/ZEYdevTTBkq7GU85BCE0cHA6+b711NOLj+XscMIA/7/x8nvX5nHO8n583gioO\nQohxQoi9QogDQognTP6eKoRYLoTYLoTYJYS4K5jnEyh8rVYCIts5AHyjVld7buynT+dyVTtzMUUC\n0dGuM8WaYeUc0tI055CSwvNabdrEfzfmZuTiMnYrlQJFQgI35N7CSrKRzM9n5wdwQ7p1qz1xkGNg\nvF2bWVipvJwnQ7TCGFrSVysB7hVSVmGlbduAUaO03/XOweh6ZLjRzDmYzV2mF4fMTD6WHXF45hlg\n/Hj+2Y5zSE01nxnWE1Ic+vRhgcjO5vEOES0OQohOAF4BMA7AKQBuFUIYh9E8BGAbEZ0OIBPADCFE\nkIdGtR1/cg6RLg7SOdhp7I3VSpFMfLxncbDKOaSn8wMr17lOT9eWnjQmpOVsqXYrlQKFDJUZk7b6\nsFJMjLlzyMjgv+3c6V0cZDLaW34kKor/1dRoziEmBrj2Wuv3GCuWZLVSWhqfl3GgpJk41NVxozh8\nuPaa0TkYxaGqivcdFeX6upVzqKjgsM3FF9sXh4QE17Wo5TEkRnHo1ct/ccjIYHFYtozdld2yck8E\n0zmcCeAgEeUQkQPAuwCMkcciAPLRTQRQRkQ+LHAYHh57zH51TnsJK3Xpwg+1nVxKewkrAd7Fwco5\npKe7hpVSUlgoZJWL/nPq3ZsbjlCLg7y3rMJK1dV8HVIciov5d8mYMcCqVa6fj5k42Mk3SKKjueHt\n2hU47TTgv//1/F5jxZIMKw0aBLzxhvv2ZjmHrCxOyBpDRLIqyXj+8fH8vRrv3auuAi691P2YSUna\nmItTT7VfraRHv86ERC+MZuJgp0Mpx7tI5/Duu+xyA0EwxSEDQJ7u9/yfX9MzH8BwIUQhgB0A/hTE\n8wkY48a5TyJmhXIO4SUuzrtzMIpDQ4N7WCk2lhu+ujp359CnDzsH48RqwSYhgc/JeH36EdK9emni\nYJy9VYqDXedgh5gY/txkqe6tt3re3hhWkuIQHc35FSNmOYdt23gJUD0ydNTQwI5H3zmLi2PBMN7r\n99zjvh+AP5+dOzmketJJ/Jqv4iDHReiP6ck56BcI84QUnT59eNaBgoLAhJQAIJghHPK+Cf4BYDsR\nZQohBgNYKYQ4jYjcZrWZMGFC68+ZmZnI9HUR5jDRXsRB5hx+ac7BKqyUlsYPWkWF67rY5eXuCWkZ\nVvK26HygSUjgczKGe4ziIMMrUugkY8awm/AmDnaS0fpjy5li7WAlDlakpPA2cklbgHMnxkZdJp3N\nXI+Vc7BCTtnRrx83wnFx/olDXJzrd2UUh6FDtbEnvoSVoqNZNLkEdw127FgDXXPpN8EUhwIA+nk3\nTwC7Bz2/BvAcABDRISHEYQBDAWwx7mxCIK42DMjGItLDSr44B30pq68PSaixE1YqLgbeew847zx+\n+I1hJVkFk5KiTSanj4XHxvJx8vJCH1YyhpQAbaRydTULl1z1zSgOZ5zB/9sRB1/CStI52MFXcYiK\n0tZKkAMIt20D7rrLdTsZVjJes/ybmXOwQl57//58/CFD/AsrGT+TQOUcevfm8xo8GEhOzsQrr2S2\nVjlNnDjRtxPVEcyw0hYAJwohBgghOgO4BcBnhm32ArgEAIQQ6WBhyEYHor05h19aWGnAAO4RPv00\n8Oab/Jo+Ia1vXLp35zls5KhwPX36cGIw1GElM3Ho1IkFTDY4+rCSvqHs0YNj+2Y5B/3YA1/EQToH\nu/d7aqoWJnI67VV86UNLDgdPY24cZCcT0lbOwRdxkOIpHeRJJ/nvHPR4CyvZ+Qzj4/neA/g+PnAg\ncOvFBE0cfk4sPwRgBYDdAN4joj1CiPFCiJ8LvPA8gDOEEDsArALwOBGZzLnYfmkv4mBnnIOkI4WV\n+vblKRHuuksbiKTPOchqJUATB7PPqHdvHvAV6rCSmTjI8QMVFZo4OJ3mDeU557hWtsja+uZmYOZM\n/p59FQdfnIN+Gg+5YI+3xk1fsVRUpE1EqEc6B7Nz99U5GMVh0iTgppvsvVfSrZt7GxAo5yDFAbCf\nC7VDUMtGiehLAF8aXpun+7kUwDXBPIdwExcHXHNN5PewfXUOVVWRP84B8C4OksRErmMHXMc5xMVp\n4pCSojkHI336cOz7xBMDd+7euOYa8wQqwOEdKQ5yChEZn9bzn/+4X09sLN8Ljz/OAx99DStVVNgX\nh8GDtenDvYWUJPqKpcJCLuM0Ip1DRYW5c8jJsX/vyvtHDj70tFSqFSkp7nmbQIhDcnLwFs2K+DEF\n7Z2oKOAzYzAtAvHVOegX+4lkevSwV/OtX2VMn3Po0sW+czh0KLRhJVlia4bROZjF3gHz8EhsLK9r\n0NLC11RZqVXpeCMmhj83X5yDXKTGrjjow0qFha49Z/15yLWozZxDRYX9ezc6mq+/LWuQjBrl3g7o\ny3j9DSuNH+9eUBEolDgoAPiXc2gPYaXJk+2tOJeU5CoOSUncuBw75ioOO3ZYi0NDQ2jDSp6IieFB\ne97EwQy5vjXAvXpfS1kB+2FUf52DN3EAWAQKCtqecwDavpCOENqob/35yZHazc38/TQ2cgjQrnMI\nZmdEza2kAKCthOVrQjrSxUGOT/CGdA5y3eiYGH4tKkp7AFNSOMZtFVYCIkcc5DXLsJI/4hATozkH\nX8JKgO85ByL7g8t69WJRAPh/q2nP4+P5722tVgoWQ4bwtZeXa5Mfyhl+7YpDMFHioACg9YZ9SUi3\nh7CSXaQ46AcfJSa6jiPwFlYCIkcc5NrHsrb+6FHfxGHXLmDsWN/FQd4PdsUhOZkb6dJS+85BzigL\neHcOhYXWYaVwi0N8POcLNm/W8hoykW43rBRMlDgoALiupWtn2/YSVrKLXhzkQ5mQ4NqgekpIS3EI\nZc7BEzExWi+8Wzceg+Grc7jsMv/FwZeGTboHu+Ige9yAZ3GIj7cOK0WCOAA8hmbdOu26pTgo56CI\nGPx1DpHwgAUCM3FITHRtULt3t07aR5pziI7WGpxu3XhGVuMEfVbExrIIXnwxv6+01Ddx6NLFdUI7\nb8i8g11xyMjQZsH1J+cgF/WJhHv39NOBb791dw4VFfZHpQcLJQ4KAL45B31CuqOFlfQTnpmJA2D+\nGcmS2UgRB71zkKO3fXEOAHDyyVy1dfSo/YYqOtp39ySdw6FD9gQsKkqbnrqoyLNzqKszdw5A5IjD\nli2u4lBby5+5r0vIBhpVraQAoPWGfRGH5ubIeMACgbz+ykrXnIO+BywbVyt3lZERWeIgG2kZVho3\nzt57Y2O5skbOjpqXZ69HbzyuXQYPBhYt4kqwLW4T51i/56efOIltNhAQ0M7DzDkAkXHvnn46F4IY\nncPRo5x4DyfKOSgAaA+Kr+McIuEBCxSJifxQWuUcZHmr1Wf0wQfA6NHBP087tDXnIBe9GTyYr9tu\nmMgfcRg0iFfZe+QR9/WbrRg8GPjuO+5dW60zoa8y0xNJzqFXLxZiozgUFYXfOShxUADwzzl0pLAS\nwA9ocbEmDklJrmGOqChuaKw+o+HDAzevTVuJjnYVh9JS38RBLnrDk7n5dlxfq2xGjACuvJJHZNtl\n8GCO1XtqQKUIGENikeQchGD3EInOQYWVFAB8dw6NjVybHgkPWKBISuLBVbJxe/hh9zESKSn2PqNw\nExOjhYJkI+mLOMgpKQYN8k0c/HEOPXsCX3zh23uGDOE1Fq6/3nobuaaE8R6NJOcAAGef7VqtVFnJ\n+S+rcFmoUOKgAOCfc7C7fXtBOgeZczCbs6Z79/ZxzcawEmBfHO69V2uYxo4Fbr/bdt+OGopx38GDu\nnFglowEWATNhiyTnAPCMwDI0FhfH8z717OlbxVcwUOKgAODfOIeoqI4dVjKjvTgHY1gJsC8O+iVw\n+/YFHn3Ut+OGQhwGDOAG1ZM4xMWZi4MU/0i5d43rWB86FP58A6ByDoqf+aWPcwDsiUP37u1DHPRh\nJSkOvoSH2nLcUIzs7dKFnZ0/4iCnRInEezcujkt0w51vAJQ4KH7Gn3EOv1RxaA/XbBznINdlDsVx\nQzVKfMwYz7PFWoWVACUOdlBhJQUArTdsx2rrE9KRYs0DgTHnYEZ6evhjwXYwhpXshpQCcdxQicOH\nH3r+e1qa+VoPAAtHpIrDsWNKHBQRROfO3NDbafg6d+Yy1o5WrZSYyJUinpzDY4+F7nzawkUXaQsB\nhVIcYmIip8Nwww3W1UyR7ByAyMg5KHFQAGA3YPdhkYnojjjOAfAsDpEysZ437r9f+zk+/pcpDkJY\nD5CLZOcAKOegiCA6d/Yt0dqlCzsHq4evPWJHHNojZ56plR4HmwsuiBxx8ESkOwclDoqIwRfnILd3\nOoN3PuFAjqQN91TJgWbAAPvTUrSVK64IzXHainIO3lHioADAD4ovD0vnztqqaR2FjuocFO6kpoam\ntNdX5OhtJQ6KiKFbN3tLNEq6dFHioGi/vPFGaEp7fSUujsuOI2F23wj8eBThYMgQnhnTLl26cEK6\nI6HE4ZdDpOZFkpPNp20JB0Gt2BZCjBNC7BVCHBBCPGGxTaYQYpsQYpcQYk0wz0fhmfR0+9t26RK5\nD5i/SHHoaDkHRfvhpJOA9evDfRZM0JyDEKITgFcAXAKgAMBmIcRnRLRHt00ygDkALieifCFEarDO\nRxFYfE1gtweUc1BEApGSCwmmczgTwEEiyiEiB4B3AfzGsM3vASwhonwAIKLSIJ6PIoB0RHGIjfVv\nPQKFoiMSTHHIAJCn+z3/59f0nAiguxBitRBiixDiD0E8H0UA6YhhJSHYPShxUCiCm5AmG9vEABgF\n4GIAcQC+F0L8QEQHjBtOmDCh9efMzExkZmYG5iwVftERnQPAy3ymquCmop2yZs0arFmzJiD7EkR2\n2nA/dizE2QAmENG4n39/EoCTiKbotnkCQFcimvDz768DWE5EHxr2RcE6T4V/XH89UFYGrFsX7jNR\nKBRWCCFARH7NYxDMsNIWACcKIQYIIToDuAXAZ4ZtPgVwrhCikxAiDsBZAHYH8ZwUAaIjhpUUCoVG\n0MJKRNQshHgIwAoAnQC8QUR7hBDjf/77PCLaK4RYDmAnACeA+USkxKEd0FHDSgqFgglaWCmQqLBS\n5PHHP/LaB59+Gu4zUSgUVkRqWEnRgVFhJYWiY6PEQeEXKqykUHRslDgo/EKJg0LRsVHioPALFVZS\nKDo2ShwUfuHr+g8KhaJ9oabsVvjFwIGROR++QqEIDKqUVaFQKDooqpRVoVAoFAFFiYNCoVAo3FDi\noFAoFAo3lDgoFAqFwg0lDgqFQqFwQ4mDQqFQKNxQ4qBQKBQKN5Q4KBQKhcINJQ4KhUKhcEOJg0Kh\nUCjcUOKgUCgUCjeUOCgUCoXCDSUOCoVCoXBDiYNCoVAo3FDioFAoFAo3gioOQohxQoi9QogDQogn\nPGw3RgjRLMT/b+/uYuQq6ziOf3+ygqA1QGiqYmObWCglMfRCbKxbmpCUcqH1JYI1Ri4MaBBoTDCh\nXig3hjZEw4Wx8aUgqYqpL63FRKASihXEtbGvbpUQrQHBloteFI2k4M+L8wwc9sx0pu3M7uz297nZ\nOc+cfc6z/zxz/nPO2ed59PFBticiInozsOQg6SzgW8BKYBGwWtJlHfZbDzwEnNKiFHFyduzYMdVN\nmDESy/5KPIfHIK8crgSesX3I9nHgJ8CqNvvdCvwMeHGAbYmafAD7J7Hsr8RzeAwyOVwMPFvbfq6U\nvUbSxVQJY0MpylqgERFDYJDJoZcT/T3AHWWBaJHbShERQ0HVeXkAFUtLgDttryzba4H/2V5f2+dv\nvJ4QLgL+A9xoe9uEunJFERFxCmyf0pfuQSaHEeCvwNXA88AYsNr2wQ773wc8aPsXA2lQRET0bGRQ\nFdt+RdItwMPAWcBG2wclfb68/51BHTsiIk7PwK4cIiJi+hrqEdK9DqKLziQdkrRP0m5JY6XsQknb\nJT0t6RFJ5091O4eVpHslHZa0v1bWMX6S1pb++hdJK6am1cOpQyzvlPRc6Z+7JV1bey+xPAFJcyU9\nJunPkg5Iuq2U96V/Dm1y6HUQXXRlYLntxbavLGV3ANttXwI8Wrajvfuo+mBd2/hJWgRcT9VfVwLf\nljS0n7Ep0C6WBr5Z+udi27+GxLJHx4Ev2b4cWAJ8sZwj+9I/hznYvQ6ii+4m/rfCR4D7y+v7gY9O\nbnOmD9s7gaMTijvFbxXwgO3jtg8Bz1D146BjLKH9v7Anll3Y/pftPeX1S8BBqrFkfemfw5wcug6i\ni54Y+I2kXZJuLGVzbB8urw8Dc6amadNWp/i9i6qftqTP9uZWSXslbazdAkksT4KkecBi4A/0qX8O\nc3LIk/L+WGp7MXAt1WXnaP3NMgAxsT5FPcQvsT2xDcB84ArgBeAbJ9g3sWxD0tuAnwNrbB+rv3c6\n/XOYk8M/gbm17bm8MetFD2y/UH6+CGyhuow8LOkdAJLeCRyZuhZOS53iN7HPvruURQe2j7gAvs/r\ntzkSyx5IejNVYthke2sp7kv/HObksAtYIGmepLOpHqRs6/I7USPpPEmzyuu3AiuA/VRxvKHsdgOw\ntX0N0UGn+G0DPiXpbEnzgQVUgz+jg3LyavkYVf+ExLIrSQI2AuO276m91Zf+ObBBcKer0yC6KW7W\ndDMH2FL1IUaAH9l+RNIuYLOkzwGHgOumronDTdIDwFXARZKeBb4KrKNN/GyPS9oMjAOvADc7A4le\n0yaWXwOWS7qC6vbG34HWINnEsrulwGeAfZJ2l7K19Kl/ZhBcREQ0DPNtpYiImCJJDhER0ZDkEBER\nDUkOERHRkOQQERENSQ4REdGQ5BAzlqSXys/3SFrd57q/MmH7iT7Xf6mkH6jyZD/rjuhFkkPMZK1B\nPPOBT5/ML5Zlbk9k7RsOZC89mfp7MAr8FngfcKDPdUd0leQQZ4J1wGhZTGaNpDdJulvSWJkN9CYA\nScsl7ZT0S8oJWdLWMqPtgdastpLWAeeW+jaVstZVikrd+1UtsnRdre4dkn4q6aCkH7ZrqKTRMtp1\nPXA78CvgGpWFmiImS0ZIx4wl6ZjtWZKuAm63/eFSfhMw2/bXJZ0D/A74JDCP6mR8ue1/lH0vsH1U\n0rlU89AsK9vHbM9qc6xPUE0BcQ0wG/gj8AFgIdUcN4uoZh99Aviy7ba3oyQ9afuDku4F7s7UMTHZ\ncuUQZ4KJi8msAD5bvqE/BVwIvLe8N9ZKDMUaSXuA31PNaLmgy7E+BPy4TDR6BHgceD/VLa4x28+X\n+Wz2UCWjZmOl84CXy+YC4Onuf2JEfw3txHsRA3aL7e31AknLgX9P2L4aWGL7v5IeA97SpV7TTEat\ny/OXa2Wv0ubzV25pLQTOl7SXKoHsknSX7c1djh3RN7lyiDPBMWBWbfth4ObWQ2dJl5Rv6xO9HTha\nEsNCqnV6W453eGi9E7i+PNeYDSyjuh3VbinMBturgO8BXwBuAzaUtZWTGGJSJTnETNb6xr4XeFXS\nHklrqBaVGQf+JGk/1WpkI2X/+kO4h4ARSePAXVS3llq+SzVV8qb6sWxvAfaVYz5K9VzhSJu6abPd\nsozqmcQo1W2piEmXB9IREdGQK4eIiGhIcoiIiIYkh4iIaEhyiIiIhiSHiIhoSHKIiIiGJIeIiGhI\ncoiIiIb/AxSD6Sq0YLMCAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 6a03c996245..36f419f834e 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -1806,7 +1806,7 @@ "dLvdaza+eH10u11LmYWWOe5QCjKDTnJ9fd3iLsrlslKplIbDoSlIQDLG7RMQD4AzozpHpYJ/HfU4\n", "aV2Li4tGanrT61YNTVgYUCsdx9H8/Lw1K3BtUTQsLi6aQThaQZosHOXn5uZMv5ZIJLS7u2s7PU0Z\n", "qmdqZmpRFiA7FaPuyclJ86qD7ww/hIEGqabjkB8BnKhKxnfLy8tL87igJ4AZyOtA5GHRj9vzIlJg\n", - "kWIOiXHO8vKywXfU/XiLzM3NmXqFwQeuUdJVPuN4LiGYfyqVMgHxcDjU2traje7/rdqZganm5+dt\n", + "kWIOiXHO8vKywXfU/XiLzM3NmXqFwQeuUdJVPuN4LiGYfyqVMgHxcDjU2traje7/rdqZganm5+bdt\n", "6kT2M0GPHN00c/l83gYY9XpdpVLJ0I5ut2v13Dh0BfmdLp8d/fT0VOVy2WrdcDis8/Nz40wwZOl2\n", "uzbuHvdwAxtnOrm3t6dyuWziV5Qf8DtOT08Vi8WMQffy5Ut7T9LVWBu73mazqVwuZycJtlrS1QNU\n", "KBTsBKnVauYeSkNNn8FpVq/Xbdw9GAz08uVLM1qv1WrGQDw5OTGolO+gVCoZlo76u9Pp6MWLFze6\n", diff --git a/examples/ssd/model_libs.py b/examples/ssd/model_libs.py new file mode 100644 index 00000000000..84c8bf27d71 --- /dev/null +++ b/examples/ssd/model_libs.py @@ -0,0 +1,933 @@ +import os + +import caffe +from caffe import layers as L +from caffe import params as P +from caffe.proto import caffe_pb2 + +def check_if_exist(path): + return os.path.exists(path) + +def make_if_not_exist(path): + if not os.path.exists(path): + os.makedirs(path) + +def UnpackVariable(var, num): + assert len > 0 + if type(var) is list and len(var) == num: + return var + else: + ret = [] + if type(var) is list: + assert len(var) == 1 + for i in xrange(0, num): + ret.append(var[0]) + else: + for i in xrange(0, num): + ret.append(var) + return ret + +def ConvBNLayer(net, from_layer, out_layer, use_bn, use_relu, num_output, + kernel_size, pad, stride, dilation=1, use_scale=True, lr_mult=1, + conv_prefix='', conv_postfix='', bn_prefix='', bn_postfix='_bn', + scale_prefix='', scale_postfix='_scale', bias_prefix='', bias_postfix='_bias', + **bn_params): + if use_bn: + # parameters for convolution layer with batchnorm. + kwargs = { + 'param': [dict(lr_mult=lr_mult, decay_mult=1)], + 'weight_filler': dict(type='gaussian', std=0.01), + 'bias_term': False, + } + eps = bn_params.get('eps', 0.001) + moving_average_fraction = bn_params.get('moving_average_fraction', 0.999) + use_global_stats = bn_params.get('use_global_stats', False) + # parameters for batchnorm layer. + bn_kwargs = { + 'param': [ + dict(lr_mult=0, decay_mult=0), + dict(lr_mult=0, decay_mult=0), + dict(lr_mult=0, decay_mult=0)], + 'eps': eps, + 'moving_average_fraction': moving_average_fraction, + } + bn_lr_mult = lr_mult + if use_global_stats: + # only specify if use_global_stats is explicitly provided; + # otherwise, use_global_stats_ = this->phase_ == TEST; + bn_kwargs = { + 'param': [ + dict(lr_mult=0, decay_mult=0), + dict(lr_mult=0, decay_mult=0), + dict(lr_mult=0, decay_mult=0)], + 'eps': eps, + 'use_global_stats': use_global_stats, + } + # not updating scale/bias parameters + bn_lr_mult = 0 + # parameters for scale bias layer after batchnorm. + if use_scale: + sb_kwargs = { + 'bias_term': True, + 'param': [ + dict(lr_mult=bn_lr_mult, decay_mult=0), + dict(lr_mult=bn_lr_mult, decay_mult=0)], + 'filler': dict(type='constant', value=1.0), + 'bias_filler': dict(type='constant', value=0.0), + } + else: + bias_kwargs = { + 'param': [dict(lr_mult=bn_lr_mult, decay_mult=0)], + 'filler': dict(type='constant', value=0.0), + } + else: + kwargs = { + 'param': [ + dict(lr_mult=lr_mult, decay_mult=1), + dict(lr_mult=2 * lr_mult, decay_mult=0)], + 'weight_filler': dict(type='xavier'), + 'bias_filler': dict(type='constant', value=0) + } + + conv_name = '{}{}{}'.format(conv_prefix, out_layer, conv_postfix) + [kernel_h, kernel_w] = UnpackVariable(kernel_size, 2) + [pad_h, pad_w] = UnpackVariable(pad, 2) + [stride_h, stride_w] = UnpackVariable(stride, 2) + if kernel_h == kernel_w: + net[conv_name] = L.Convolution(net[from_layer], num_output=num_output, + kernel_size=kernel_h, pad=pad_h, stride=stride_h, **kwargs) + else: + net[conv_name] = L.Convolution(net[from_layer], num_output=num_output, + kernel_h=kernel_h, kernel_w=kernel_w, pad_h=pad_h, pad_w=pad_w, + stride_h=stride_h, stride_w=stride_w, **kwargs) + if dilation > 1: + net.update(conv_name, {'dilation': dilation}) + if use_bn: + bn_name = '{}{}{}'.format(bn_prefix, out_layer, bn_postfix) + net[bn_name] = L.BatchNorm(net[conv_name], in_place=True, **bn_kwargs) + if use_scale: + sb_name = '{}{}{}'.format(scale_prefix, out_layer, scale_postfix) + net[sb_name] = L.Scale(net[bn_name], in_place=True, **sb_kwargs) + else: + bias_name = '{}{}{}'.format(bias_prefix, out_layer, bias_postfix) + net[bias_name] = L.Bias(net[bn_name], in_place=True, **bias_kwargs) + if use_relu: + relu_name = '{}_relu'.format(conv_name) + net[relu_name] = L.ReLU(net[conv_name], in_place=True) + +def ResBody(net, from_layer, block_name, out2a, out2b, out2c, stride, use_branch1, dilation=1, **bn_param): + # ResBody(net, 'pool1', '2a', 64, 64, 256, 1, True) + + conv_prefix = 'res{}_'.format(block_name) + conv_postfix = '' + bn_prefix = 'bn{}_'.format(block_name) + bn_postfix = '' + scale_prefix = 'scale{}_'.format(block_name) + scale_postfix = '' + use_scale = True + + if use_branch1: + branch_name = 'branch1' + ConvBNLayer(net, from_layer, branch_name, use_bn=True, use_relu=False, + num_output=out2c, kernel_size=1, pad=0, stride=stride, use_scale=use_scale, + conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + branch1 = '{}{}'.format(conv_prefix, branch_name) + else: + branch1 = from_layer + + branch_name = 'branch2a' + ConvBNLayer(net, from_layer, branch_name, use_bn=True, use_relu=True, + num_output=out2a, kernel_size=1, pad=0, stride=stride, use_scale=use_scale, + conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + out_name = '{}{}'.format(conv_prefix, branch_name) + + branch_name = 'branch2b' + if dilation == 1: + ConvBNLayer(net, out_name, branch_name, use_bn=True, use_relu=True, + num_output=out2b, kernel_size=3, pad=1, stride=1, use_scale=use_scale, + conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + else: + pad = int((3 + (dilation - 1) * 2) - 1) / 2 + ConvBNLayer(net, out_name, branch_name, use_bn=True, use_relu=True, + num_output=out2b, kernel_size=3, pad=pad, stride=1, use_scale=use_scale, + dilation=dilation, conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + out_name = '{}{}'.format(conv_prefix, branch_name) + + branch_name = 'branch2c' + ConvBNLayer(net, out_name, branch_name, use_bn=True, use_relu=False, + num_output=out2c, kernel_size=1, pad=0, stride=1, use_scale=use_scale, + conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + branch2 = '{}{}'.format(conv_prefix, branch_name) + + res_name = 'res{}'.format(block_name) + net[res_name] = L.Eltwise(net[branch1], net[branch2]) + relu_name = '{}_relu'.format(res_name) + net[relu_name] = L.ReLU(net[res_name], in_place=True) + + +def InceptionTower(net, from_layer, tower_name, layer_params, **bn_param): + use_scale = False + for param in layer_params: + tower_layer = '{}/{}'.format(tower_name, param['name']) + del param['name'] + if 'pool' in tower_layer: + net[tower_layer] = L.Pooling(net[from_layer], **param) + else: + param.update(bn_param) + ConvBNLayer(net, from_layer, tower_layer, use_bn=True, use_relu=True, + use_scale=use_scale, **param) + from_layer = tower_layer + return net[from_layer] + +def CreateAnnotatedDataLayer(source, batch_size=32, backend=P.Data.LMDB, + output_label=True, train=True, label_map_file='', anno_type=None, + transform_param={}, batch_sampler=[{}]): + if train: + kwargs = { + 'include': dict(phase=caffe_pb2.Phase.Value('TRAIN')), + 'transform_param': transform_param, + } + else: + kwargs = { + 'include': dict(phase=caffe_pb2.Phase.Value('TEST')), + 'transform_param': transform_param, + } + ntop = 1 + if output_label: + ntop = 2 + annotated_data_param = { + 'label_map_file': label_map_file, + 'batch_sampler': batch_sampler, + } + if anno_type is not None: + annotated_data_param.update({'anno_type': anno_type}) + return L.AnnotatedData(name="data", annotated_data_param=annotated_data_param, + data_param=dict(batch_size=batch_size, backend=backend, source=source), + ntop=ntop, **kwargs) + + +def ZFNetBody(net, from_layer, need_fc=True, fully_conv=False, reduced=False, + dilated=False, dropout=True, need_fc8=False, freeze_layers=[]): + kwargs = { + 'param': [dict(lr_mult=1, decay_mult=1), dict(lr_mult=2, decay_mult=0)], + 'weight_filler': dict(type='xavier'), + 'bias_filler': dict(type='constant', value=0)} + + assert from_layer in net.keys() + net.conv1 = L.Convolution(net[from_layer], num_output=96, pad=3, kernel_size=7, stride=2, **kwargs) + net.relu1 = L.ReLU(net.conv1, in_place=True) + + net.norm1 = L.LRN(net.relu1, local_size=3, alpha=0.00005, beta=0.75, + norm_region=P.LRN.WITHIN_CHANNEL, engine=P.LRN.CAFFE) + + net.pool1 = L.Pooling(net.norm1, pool=P.Pooling.MAX, pad=1, kernel_size=3, stride=2) + + net.conv2 = L.Convolution(net.pool1, num_output=256, pad=2, kernel_size=5, stride=2, **kwargs) + net.relu2 = L.ReLU(net.conv2, in_place=True) + + net.norm2 = L.LRN(net.relu2, local_size=3, alpha=0.00005, beta=0.75, + norm_region=P.LRN.WITHIN_CHANNEL, engine=P.LRN.CAFFE) + + net.pool2 = L.Pooling(net.norm2, pool=P.Pooling.MAX, pad=1, kernel_size=3, stride=2) + + net.conv3 = L.Convolution(net.pool2, num_output=384, pad=1, kernel_size=3, **kwargs) + net.relu3 = L.ReLU(net.conv3, in_place=True) + net.conv4 = L.Convolution(net.relu3, num_output=384, pad=1, kernel_size=3, **kwargs) + net.relu4 = L.ReLU(net.conv4, in_place=True) + net.conv5 = L.Convolution(net.relu4, num_output=256, pad=1, kernel_size=3, **kwargs) + net.relu5 = L.ReLU(net.conv5, in_place=True) + + if need_fc: + if dilated: + name = 'pool5' + net[name] = L.Pooling(net.relu5, pool=P.Pooling.MAX, pad=1, kernel_size=3, stride=1) + else: + name = 'pool5' + net[name] = L.Pooling(net.relu5, pool=P.Pooling.MAX, pad=1, kernel_size=3, stride=2) + + if fully_conv: + if dilated: + if reduced: + net.fc6 = L.Convolution(net[name], num_output=1024, pad=5, kernel_size=3, dilation=5, **kwargs) + else: + net.fc6 = L.Convolution(net[name], num_output=4096, pad=5, kernel_size=6, dilation=2, **kwargs) + else: + if reduced: + net.fc6 = L.Convolution(net[name], num_output=1024, pad=2, kernel_size=3, dilation=2, **kwargs) + else: + net.fc6 = L.Convolution(net[name], num_output=4096, pad=2, kernel_size=6, **kwargs) + + net.relu6 = L.ReLU(net.fc6, in_place=True) + if dropout: + net.drop6 = L.Dropout(net.relu6, dropout_ratio=0.5, in_place=True) + + if reduced: + net.fc7 = L.Convolution(net.relu6, num_output=1024, kernel_size=1, **kwargs) + else: + net.fc7 = L.Convolution(net.relu6, num_output=4096, kernel_size=1, **kwargs) + net.relu7 = L.ReLU(net.fc7, in_place=True) + if dropout: + net.drop7 = L.Dropout(net.relu7, dropout_ratio=0.5, in_place=True) + else: + net.fc6 = L.InnerProduct(net.pool5, num_output=4096) + net.relu6 = L.ReLU(net.fc6, in_place=True) + if dropout: + net.drop6 = L.Dropout(net.relu6, dropout_ratio=0.5, in_place=True) + net.fc7 = L.InnerProduct(net.relu6, num_output=4096) + net.relu7 = L.ReLU(net.fc7, in_place=True) + if dropout: + net.drop7 = L.Dropout(net.relu7, dropout_ratio=0.5, in_place=True) + if need_fc8: + from_layer = net.keys()[-1] + if fully_conv: + net.fc8 = L.Convolution(net[from_layer], num_output=1000, kernel_size=1, **kwargs) + else: + net.fc8 = L.InnerProduct(net[from_layer], num_output=1000) + net.prob = L.Softmax(net.fc8) + + # Update freeze layers. + kwargs['param'] = [dict(lr_mult=0, decay_mult=0), dict(lr_mult=0, decay_mult=0)] + layers = net.keys() + for freeze_layer in freeze_layers: + if freeze_layer in layers: + net.update(freeze_layer, kwargs) + + return net + + +def VGGNetBody(net, from_layer, need_fc=True, fully_conv=False, reduced=False, + dilated=False, nopool=False, dropout=True, freeze_layers=[], dilate_pool4=False): + kwargs = { + 'param': [dict(lr_mult=1, decay_mult=1), dict(lr_mult=2, decay_mult=0)], + 'weight_filler': dict(type='xavier'), + 'bias_filler': dict(type='constant', value=0)} + + assert from_layer in net.keys() + net.conv1_1 = L.Convolution(net[from_layer], num_output=64, pad=1, kernel_size=3, **kwargs) + + net.relu1_1 = L.ReLU(net.conv1_1, in_place=True) + net.conv1_2 = L.Convolution(net.relu1_1, num_output=64, pad=1, kernel_size=3, **kwargs) + net.relu1_2 = L.ReLU(net.conv1_2, in_place=True) + + if nopool: + name = 'conv1_3' + net[name] = L.Convolution(net.relu1_2, num_output=64, pad=1, kernel_size=3, stride=2, **kwargs) + else: + name = 'pool1' + net.pool1 = L.Pooling(net.relu1_2, pool=P.Pooling.MAX, kernel_size=2, stride=2) + + net.conv2_1 = L.Convolution(net[name], num_output=128, pad=1, kernel_size=3, **kwargs) + net.relu2_1 = L.ReLU(net.conv2_1, in_place=True) + net.conv2_2 = L.Convolution(net.relu2_1, num_output=128, pad=1, kernel_size=3, **kwargs) + net.relu2_2 = L.ReLU(net.conv2_2, in_place=True) + + if nopool: + name = 'conv2_3' + net[name] = L.Convolution(net.relu2_2, num_output=128, pad=1, kernel_size=3, stride=2, **kwargs) + else: + name = 'pool2' + net[name] = L.Pooling(net.relu2_2, pool=P.Pooling.MAX, kernel_size=2, stride=2) + + net.conv3_1 = L.Convolution(net[name], num_output=256, pad=1, kernel_size=3, **kwargs) + net.relu3_1 = L.ReLU(net.conv3_1, in_place=True) + net.conv3_2 = L.Convolution(net.relu3_1, num_output=256, pad=1, kernel_size=3, **kwargs) + net.relu3_2 = L.ReLU(net.conv3_2, in_place=True) + net.conv3_3 = L.Convolution(net.relu3_2, num_output=256, pad=1, kernel_size=3, **kwargs) + net.relu3_3 = L.ReLU(net.conv3_3, in_place=True) + + if nopool: + name = 'conv3_4' + net[name] = L.Convolution(net.relu3_3, num_output=256, pad=1, kernel_size=3, stride=2, **kwargs) + else: + name = 'pool3' + net[name] = L.Pooling(net.relu3_3, pool=P.Pooling.MAX, kernel_size=2, stride=2) + + net.conv4_1 = L.Convolution(net[name], num_output=512, pad=1, kernel_size=3, **kwargs) + net.relu4_1 = L.ReLU(net.conv4_1, in_place=True) + net.conv4_2 = L.Convolution(net.relu4_1, num_output=512, pad=1, kernel_size=3, **kwargs) + net.relu4_2 = L.ReLU(net.conv4_2, in_place=True) + net.conv4_3 = L.Convolution(net.relu4_2, num_output=512, pad=1, kernel_size=3, **kwargs) + net.relu4_3 = L.ReLU(net.conv4_3, in_place=True) + + if nopool: + name = 'conv4_4' + net[name] = L.Convolution(net.relu4_3, num_output=512, pad=1, kernel_size=3, stride=2, **kwargs) + else: + name = 'pool4' + if dilate_pool4: + net[name] = L.Pooling(net.relu4_3, pool=P.Pooling.MAX, kernel_size=3, stride=1, pad=1) + dilation = 2 + else: + net[name] = L.Pooling(net.relu4_3, pool=P.Pooling.MAX, kernel_size=2, stride=2) + dilation = 1 + + kernel_size = 3 + pad = int((kernel_size + (dilation - 1) * (kernel_size - 1)) - 1) / 2 + net.conv5_1 = L.Convolution(net[name], num_output=512, pad=pad, kernel_size=kernel_size, dilation=dilation, **kwargs) + net.relu5_1 = L.ReLU(net.conv5_1, in_place=True) + net.conv5_2 = L.Convolution(net.relu5_1, num_output=512, pad=pad, kernel_size=kernel_size, dilation=dilation, **kwargs) + net.relu5_2 = L.ReLU(net.conv5_2, in_place=True) + net.conv5_3 = L.Convolution(net.relu5_2, num_output=512, pad=pad, kernel_size=kernel_size, dilation=dilation, **kwargs) + net.relu5_3 = L.ReLU(net.conv5_3, in_place=True) + + if need_fc: + if dilated: + if nopool: + name = 'conv5_4' + net[name] = L.Convolution(net.relu5_3, num_output=512, pad=1, kernel_size=3, stride=1, **kwargs) + else: + name = 'pool5' + net[name] = L.Pooling(net.relu5_3, pool=P.Pooling.MAX, pad=1, kernel_size=3, stride=1) + else: + if nopool: + name = 'conv5_4' + net[name] = L.Convolution(net.relu5_3, num_output=512, pad=1, kernel_size=3, stride=2, **kwargs) + else: + name = 'pool5' + net[name] = L.Pooling(net.relu5_3, pool=P.Pooling.MAX, kernel_size=2, stride=2) + + if fully_conv: + if dilated: + if reduced: + dilation = dilation * 6 + kernel_size = 3 + num_output = 1024 + else: + dilation = dilation * 2 + kernel_size = 7 + num_output = 4096 + else: + if reduced: + dilation = dilation * 3 + kernel_size = 3 + num_output = 1024 + else: + kernel_size = 7 + num_output = 4096 + pad = int((kernel_size + (dilation - 1) * (kernel_size - 1)) - 1) / 2 + net.fc6 = L.Convolution(net[name], num_output=num_output, pad=pad, kernel_size=kernel_size, dilation=dilation, **kwargs) + + net.relu6 = L.ReLU(net.fc6, in_place=True) + if dropout: + net.drop6 = L.Dropout(net.relu6, dropout_ratio=0.5, in_place=True) + + if reduced: + net.fc7 = L.Convolution(net.relu6, num_output=1024, kernel_size=1, **kwargs) + else: + net.fc7 = L.Convolution(net.relu6, num_output=4096, kernel_size=1, **kwargs) + net.relu7 = L.ReLU(net.fc7, in_place=True) + if dropout: + net.drop7 = L.Dropout(net.relu7, dropout_ratio=0.5, in_place=True) + else: + net.fc6 = L.InnerProduct(net.pool5, num_output=4096) + net.relu6 = L.ReLU(net.fc6, in_place=True) + if dropout: + net.drop6 = L.Dropout(net.relu6, dropout_ratio=0.5, in_place=True) + net.fc7 = L.InnerProduct(net.relu6, num_output=4096) + net.relu7 = L.ReLU(net.fc7, in_place=True) + if dropout: + net.drop7 = L.Dropout(net.relu7, dropout_ratio=0.5, in_place=True) + + # Update freeze layers. + kwargs['param'] = [dict(lr_mult=0, decay_mult=0), dict(lr_mult=0, decay_mult=0)] + layers = net.keys() + for freeze_layer in freeze_layers: + if freeze_layer in layers: + net.update(freeze_layer, kwargs) + + return net + + +def ResNet101Body(net, from_layer, use_pool5=True, use_dilation_conv5=False, **bn_param): + conv_prefix = '' + conv_postfix = '' + bn_prefix = 'bn_' + bn_postfix = '' + scale_prefix = 'scale_' + scale_postfix = '' + ConvBNLayer(net, from_layer, 'conv1', use_bn=True, use_relu=True, + num_output=64, kernel_size=7, pad=3, stride=2, + conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + + net.pool1 = L.Pooling(net.conv1, pool=P.Pooling.MAX, kernel_size=3, stride=2) + + ResBody(net, 'pool1', '2a', out2a=64, out2b=64, out2c=256, stride=1, use_branch1=True, **bn_param) + ResBody(net, 'res2a', '2b', out2a=64, out2b=64, out2c=256, stride=1, use_branch1=False, **bn_param) + ResBody(net, 'res2b', '2c', out2a=64, out2b=64, out2c=256, stride=1, use_branch1=False, **bn_param) + + ResBody(net, 'res2c', '3a', out2a=128, out2b=128, out2c=512, stride=2, use_branch1=True, **bn_param) + + from_layer = 'res3a' + for i in xrange(1, 4): + block_name = '3b{}'.format(i) + ResBody(net, from_layer, block_name, out2a=128, out2b=128, out2c=512, stride=1, use_branch1=False, **bn_param) + from_layer = 'res{}'.format(block_name) + + ResBody(net, from_layer, '4a', out2a=256, out2b=256, out2c=1024, stride=2, use_branch1=True, **bn_param) + + from_layer = 'res4a' + for i in xrange(1, 23): + block_name = '4b{}'.format(i) + ResBody(net, from_layer, block_name, out2a=256, out2b=256, out2c=1024, stride=1, use_branch1=False, **bn_param) + from_layer = 'res{}'.format(block_name) + + stride = 2 + dilation = 1 + if use_dilation_conv5: + stride = 1 + dilation = 2 + + ResBody(net, from_layer, '5a', out2a=512, out2b=512, out2c=2048, stride=stride, use_branch1=True, dilation=dilation, **bn_param) + ResBody(net, 'res5a', '5b', out2a=512, out2b=512, out2c=2048, stride=1, use_branch1=False, dilation=dilation, **bn_param) + ResBody(net, 'res5b', '5c', out2a=512, out2b=512, out2c=2048, stride=1, use_branch1=False, dilation=dilation, **bn_param) + + if use_pool5: + net.pool5 = L.Pooling(net.res5c, pool=P.Pooling.AVE, global_pooling=True) + + return net + + +def ResNet152Body(net, from_layer, use_pool5=True, use_dilation_conv5=False, **bn_param): + conv_prefix = '' + conv_postfix = '' + bn_prefix = 'bn_' + bn_postfix = '' + scale_prefix = 'scale_' + scale_postfix = '' + ConvBNLayer(net, from_layer, 'conv1', use_bn=True, use_relu=True, + num_output=64, kernel_size=7, pad=3, stride=2, + conv_prefix=conv_prefix, conv_postfix=conv_postfix, + bn_prefix=bn_prefix, bn_postfix=bn_postfix, + scale_prefix=scale_prefix, scale_postfix=scale_postfix, **bn_param) + + net.pool1 = L.Pooling(net.conv1, pool=P.Pooling.MAX, kernel_size=3, stride=2) + + ResBody(net, 'pool1', '2a', out2a=64, out2b=64, out2c=256, stride=1, use_branch1=True, **bn_param) + ResBody(net, 'res2a', '2b', out2a=64, out2b=64, out2c=256, stride=1, use_branch1=False, **bn_param) + ResBody(net, 'res2b', '2c', out2a=64, out2b=64, out2c=256, stride=1, use_branch1=False, **bn_param) + + ResBody(net, 'res2c', '3a', out2a=128, out2b=128, out2c=512, stride=2, use_branch1=True, **bn_param) + + from_layer = 'res3a' + for i in xrange(1, 8): + block_name = '3b{}'.format(i) + ResBody(net, from_layer, block_name, out2a=128, out2b=128, out2c=512, stride=1, use_branch1=False, **bn_param) + from_layer = 'res{}'.format(block_name) + + ResBody(net, from_layer, '4a', out2a=256, out2b=256, out2c=1024, stride=2, use_branch1=True, **bn_param) + + from_layer = 'res4a' + for i in xrange(1, 36): + block_name = '4b{}'.format(i) + ResBody(net, from_layer, block_name, out2a=256, out2b=256, out2c=1024, stride=1, use_branch1=False, **bn_param) + from_layer = 'res{}'.format(block_name) + + stride = 2 + dilation = 1 + if use_dilation_conv5: + stride = 1 + dilation = 2 + + ResBody(net, from_layer, '5a', out2a=512, out2b=512, out2c=2048, stride=stride, use_branch1=True, dilation=dilation, **bn_param) + ResBody(net, 'res5a', '5b', out2a=512, out2b=512, out2c=2048, stride=1, use_branch1=False, dilation=dilation, **bn_param) + ResBody(net, 'res5b', '5c', out2a=512, out2b=512, out2c=2048, stride=1, use_branch1=False, dilation=dilation, **bn_param) + + if use_pool5: + net.pool5 = L.Pooling(net.res5c, pool=P.Pooling.AVE, global_pooling=True) + + return net + + +def InceptionV3Body(net, from_layer, output_pred=False, **bn_param): + # scale is fixed to 1, thus we ignore it. + use_scale = False + + out_layer = 'conv' + ConvBNLayer(net, from_layer, out_layer, use_bn=True, use_relu=True, + num_output=32, kernel_size=3, pad=0, stride=2, use_scale=use_scale, + **bn_param) + from_layer = out_layer + + out_layer = 'conv_1' + ConvBNLayer(net, from_layer, out_layer, use_bn=True, use_relu=True, + num_output=32, kernel_size=3, pad=0, stride=1, use_scale=use_scale, + **bn_param) + from_layer = out_layer + + out_layer = 'conv_2' + ConvBNLayer(net, from_layer, out_layer, use_bn=True, use_relu=True, + num_output=64, kernel_size=3, pad=1, stride=1, use_scale=use_scale, + **bn_param) + from_layer = out_layer + + out_layer = 'pool' + net[out_layer] = L.Pooling(net[from_layer], pool=P.Pooling.MAX, + kernel_size=3, stride=2, pad=0) + from_layer = out_layer + + out_layer = 'conv_3' + ConvBNLayer(net, from_layer, out_layer, use_bn=True, use_relu=True, + num_output=80, kernel_size=1, pad=0, stride=1, use_scale=use_scale, + **bn_param) + from_layer = out_layer + + out_layer = 'conv_4' + ConvBNLayer(net, from_layer, out_layer, use_bn=True, use_relu=True, + num_output=192, kernel_size=3, pad=0, stride=1, use_scale=use_scale, + **bn_param) + from_layer = out_layer + + out_layer = 'pool_1' + net[out_layer] = L.Pooling(net[from_layer], pool=P.Pooling.MAX, + kernel_size=3, stride=2, pad=0) + from_layer = out_layer + + # inceptions with 1x1, 3x3, 5x5 convolutions + for inception_id in xrange(0, 3): + if inception_id == 0: + out_layer = 'mixed' + tower_2_conv_num_output = 32 + else: + out_layer = 'mixed_{}'.format(inception_id) + tower_2_conv_num_output = 64 + towers = [] + tower_name = '{}'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=64, kernel_size=1, pad=0, stride=1), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=48, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=64, kernel_size=5, pad=2, stride=1), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower_1'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=64, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=96, kernel_size=3, pad=1, stride=1), + dict(name='conv_2', num_output=96, kernel_size=3, pad=1, stride=1), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower_2'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='pool', pool=P.Pooling.AVE, kernel_size=3, pad=1, stride=1), + dict(name='conv', num_output=tower_2_conv_num_output, kernel_size=1, pad=0, stride=1), + ], **bn_param) + towers.append(tower) + out_layer = '{}/join'.format(out_layer) + net[out_layer] = L.Concat(*towers, axis=1) + from_layer = out_layer + + # inceptions with 1x1, 3x3(in sequence) convolutions + out_layer = 'mixed_3' + towers = [] + tower_name = '{}'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=384, kernel_size=3, pad=0, stride=2), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=64, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=96, kernel_size=3, pad=1, stride=1), + dict(name='conv_2', num_output=96, kernel_size=3, pad=0, stride=2), + ], **bn_param) + towers.append(tower) + tower_name = '{}'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='pool', pool=P.Pooling.MAX, kernel_size=3, pad=0, stride=2), + ], **bn_param) + towers.append(tower) + out_layer = '{}/join'.format(out_layer) + net[out_layer] = L.Concat(*towers, axis=1) + from_layer = out_layer + + # inceptions with 1x1, 7x1, 1x7 convolutions + for inception_id in xrange(4, 8): + if inception_id == 4: + num_output = 128 + elif inception_id == 5 or inception_id == 6: + num_output = 160 + elif inception_id == 7: + num_output = 192 + out_layer = 'mixed_{}'.format(inception_id) + towers = [] + tower_name = '{}'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=192, kernel_size=1, pad=0, stride=1), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=num_output, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=num_output, kernel_size=[1, 7], pad=[0, 3], stride=[1, 1]), + dict(name='conv_2', num_output=192, kernel_size=[7, 1], pad=[3, 0], stride=[1, 1]), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower_1'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=num_output, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=num_output, kernel_size=[7, 1], pad=[3, 0], stride=[1, 1]), + dict(name='conv_2', num_output=num_output, kernel_size=[1, 7], pad=[0, 3], stride=[1, 1]), + dict(name='conv_3', num_output=num_output, kernel_size=[7, 1], pad=[3, 0], stride=[1, 1]), + dict(name='conv_4', num_output=192, kernel_size=[1, 7], pad=[0, 3], stride=[1, 1]), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower_2'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='pool', pool=P.Pooling.AVE, kernel_size=3, pad=1, stride=1), + dict(name='conv', num_output=192, kernel_size=1, pad=0, stride=1), + ], **bn_param) + towers.append(tower) + out_layer = '{}/join'.format(out_layer) + net[out_layer] = L.Concat(*towers, axis=1) + from_layer = out_layer + + # inceptions with 1x1, 3x3, 1x7, 7x1 filters + out_layer = 'mixed_8' + towers = [] + tower_name = '{}/tower'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=192, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=320, kernel_size=3, pad=0, stride=2), + ], **bn_param) + towers.append(tower) + tower_name = '{}/tower_1'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=192, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=192, kernel_size=[1, 7], pad=[0, 3], stride=[1, 1]), + dict(name='conv_2', num_output=192, kernel_size=[7, 1], pad=[3, 0], stride=[1, 1]), + dict(name='conv_3', num_output=192, kernel_size=3, pad=0, stride=2), + ], **bn_param) + towers.append(tower) + tower_name = '{}'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='pool', pool=P.Pooling.MAX, kernel_size=3, pad=0, stride=2), + ], **bn_param) + towers.append(tower) + out_layer = '{}/join'.format(out_layer) + net[out_layer] = L.Concat(*towers, axis=1) + from_layer = out_layer + + for inception_id in xrange(9, 11): + num_output = 384 + num_output2 = 448 + if inception_id == 9: + pool = P.Pooling.AVE + else: + pool = P.Pooling.MAX + out_layer = 'mixed_{}'.format(inception_id) + towers = [] + tower_name = '{}'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=320, kernel_size=1, pad=0, stride=1), + ], **bn_param) + towers.append(tower) + + tower_name = '{}/tower'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=num_output, kernel_size=1, pad=0, stride=1), + ], **bn_param) + subtowers = [] + subtower_name = '{}/mixed'.format(tower_name) + subtower = InceptionTower(net, '{}/conv'.format(tower_name), subtower_name, [ + dict(name='conv', num_output=num_output, kernel_size=[1, 3], pad=[0, 1], stride=[1, 1]), + ], **bn_param) + subtowers.append(subtower) + subtower = InceptionTower(net, '{}/conv'.format(tower_name), subtower_name, [ + dict(name='conv_1', num_output=num_output, kernel_size=[3, 1], pad=[1, 0], stride=[1, 1]), + ], **bn_param) + subtowers.append(subtower) + net[subtower_name] = L.Concat(*subtowers, axis=1) + towers.append(net[subtower_name]) + + tower_name = '{}/tower_1'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='conv', num_output=num_output2, kernel_size=1, pad=0, stride=1), + dict(name='conv_1', num_output=num_output, kernel_size=3, pad=1, stride=1), + ], **bn_param) + subtowers = [] + subtower_name = '{}/mixed'.format(tower_name) + subtower = InceptionTower(net, '{}/conv_1'.format(tower_name), subtower_name, [ + dict(name='conv', num_output=num_output, kernel_size=[1, 3], pad=[0, 1], stride=[1, 1]), + ], **bn_param) + subtowers.append(subtower) + subtower = InceptionTower(net, '{}/conv_1'.format(tower_name), subtower_name, [ + dict(name='conv_1', num_output=num_output, kernel_size=[3, 1], pad=[1, 0], stride=[1, 1]), + ], **bn_param) + subtowers.append(subtower) + net[subtower_name] = L.Concat(*subtowers, axis=1) + towers.append(net[subtower_name]) + + tower_name = '{}/tower_2'.format(out_layer) + tower = InceptionTower(net, from_layer, tower_name, [ + dict(name='pool', pool=pool, kernel_size=3, pad=1, stride=1), + dict(name='conv', num_output=192, kernel_size=1, pad=0, stride=1), + ], **bn_param) + towers.append(tower) + out_layer = '{}/join'.format(out_layer) + net[out_layer] = L.Concat(*towers, axis=1) + from_layer = out_layer + + if output_pred: + net.pool_3 = L.Pooling(net[from_layer], pool=P.Pooling.AVE, kernel_size=8, pad=0, stride=1) + net.softmax = L.InnerProduct(net.pool_3, num_output=1008) + net.softmax_prob = L.Softmax(net.softmax) + + return net + +def CreateMultiBoxHead(net, data_layer="data", num_classes=[], from_layers=[], + use_objectness=False, normalizations=[], use_batchnorm=True, lr_mult=1, + use_scale=True, min_sizes=[], max_sizes=[], prior_variance = [0.1], + aspect_ratios=[], steps=[], img_height=0, img_width=0, share_location=True, + flip=True, clip=True, offset=0.5, inter_layer_depth=[], kernel_size=1, pad=0, + conf_postfix='', loc_postfix='', **bn_param): + assert num_classes, "must provide num_classes" + assert num_classes > 0, "num_classes must be positive number" + if normalizations: + assert len(from_layers) == len(normalizations), "from_layers and normalizations should have same length" + assert len(from_layers) == len(min_sizes), "from_layers and min_sizes should have same length" + if max_sizes: + assert len(from_layers) == len(max_sizes), "from_layers and max_sizes should have same length" + if aspect_ratios: + assert len(from_layers) == len(aspect_ratios), "from_layers and aspect_ratios should have same length" + if steps: + assert len(from_layers) == len(steps), "from_layers and steps should have same length" + net_layers = net.keys() + assert data_layer in net_layers, "data_layer is not in net's layers" + if inter_layer_depth: + assert len(from_layers) == len(inter_layer_depth), "from_layers and inter_layer_depth should have same length" + + num = len(from_layers) + priorbox_layers = [] + loc_layers = [] + conf_layers = [] + objectness_layers = [] + for i in range(0, num): + from_layer = from_layers[i] + + # Get the normalize value. + if normalizations: + if normalizations[i] != -1: + norm_name = "{}_norm".format(from_layer) + net[norm_name] = L.Normalize(net[from_layer], scale_filler=dict(type="constant", value=normalizations[i]), + across_spatial=False, channel_shared=False) + from_layer = norm_name + + # Add intermediate layers. + if inter_layer_depth: + if inter_layer_depth[i] > 0: + inter_name = "{}_inter".format(from_layer) + ConvBNLayer(net, from_layer, inter_name, use_bn=use_batchnorm, use_relu=True, lr_mult=lr_mult, + num_output=inter_layer_depth[i], kernel_size=3, pad=1, stride=1, **bn_param) + from_layer = inter_name + + # Estimate number of priors per location given provided parameters. + min_size = min_sizes[i] + if type(min_size) is not list: + min_size = [min_size] + aspect_ratio = [] + if len(aspect_ratios) > i: + aspect_ratio = aspect_ratios[i] + if type(aspect_ratio) is not list: + aspect_ratio = [aspect_ratio] + max_size = [] + if len(max_sizes) > i: + max_size = max_sizes[i] + if type(max_size) is not list: + max_size = [max_size] + if max_size: + assert len(max_size) == len(min_size), "max_size and min_size should have same length." + if max_size: + num_priors_per_location = (2 + len(aspect_ratio)) * len(min_size) + else: + num_priors_per_location = (1 + len(aspect_ratio)) * len(min_size) + if flip: + num_priors_per_location += len(aspect_ratio) * len(min_size) + step = [] + if len(steps) > i: + step = steps[i] + + # Create location prediction layer. + name = "{}_mbox_loc{}".format(from_layer, loc_postfix) + num_loc_output = num_priors_per_location * 4; + if not share_location: + num_loc_output *= num_classes + ConvBNLayer(net, from_layer, name, use_bn=use_batchnorm, use_relu=False, lr_mult=lr_mult, + num_output=num_loc_output, kernel_size=kernel_size, pad=pad, stride=1, **bn_param) + permute_name = "{}_perm".format(name) + net[permute_name] = L.Permute(net[name], order=[0, 2, 3, 1]) + flatten_name = "{}_flat".format(name) + net[flatten_name] = L.Flatten(net[permute_name], axis=1) + loc_layers.append(net[flatten_name]) + + # Create confidence prediction layer. + name = "{}_mbox_conf{}".format(from_layer, conf_postfix) + num_conf_output = num_priors_per_location * num_classes; + ConvBNLayer(net, from_layer, name, use_bn=use_batchnorm, use_relu=False, lr_mult=lr_mult, + num_output=num_conf_output, kernel_size=kernel_size, pad=pad, stride=1, **bn_param) + permute_name = "{}_perm".format(name) + net[permute_name] = L.Permute(net[name], order=[0, 2, 3, 1]) + flatten_name = "{}_flat".format(name) + net[flatten_name] = L.Flatten(net[permute_name], axis=1) + conf_layers.append(net[flatten_name]) + + # Create prior generation layer. + name = "{}_mbox_priorbox".format(from_layer) + net[name] = L.PriorBox(net[from_layer], net[data_layer], min_size=min_size, + clip=clip, variance=prior_variance, offset=offset) + if max_size: + net.update(name, {'max_size': max_size}) + if aspect_ratio: + net.update(name, {'aspect_ratio': aspect_ratio, 'flip': flip}) + if step: + net.update(name, {'step': step}) + if img_height != 0 and img_width != 0: + if img_height == img_width: + net.update(name, {'img_size': img_height}) + else: + net.update(name, {'img_h': img_height, 'img_w': img_width}) + priorbox_layers.append(net[name]) + + # Create objectness prediction layer. + if use_objectness: + name = "{}_mbox_objectness".format(from_layer) + num_obj_output = num_priors_per_location * 2; + ConvBNLayer(net, from_layer, name, use_bn=use_batchnorm, use_relu=False, lr_mult=lr_mult, + num_output=num_obj_output, kernel_size=kernel_size, pad=pad, stride=1, **bn_param) + permute_name = "{}_perm".format(name) + net[permute_name] = L.Permute(net[name], order=[0, 2, 3, 1]) + flatten_name = "{}_flat".format(name) + net[flatten_name] = L.Flatten(net[permute_name], axis=1) + objectness_layers.append(net[flatten_name]) + + # Concatenate priorbox, loc, and conf layers. + mbox_layers = [] + name = "mbox_loc" + net[name] = L.Concat(*loc_layers, axis=1) + mbox_layers.append(net[name]) + name = "mbox_conf" + net[name] = L.Concat(*conf_layers, axis=1) + mbox_layers.append(net[name]) + name = "mbox_priorbox" + net[name] = L.Concat(*priorbox_layers, axis=2) + mbox_layers.append(net[name]) + if use_objectness: + name = "mbox_objectness" + net[name] = L.Concat(*objectness_layers, axis=1) + mbox_layers.append(net[name]) + + return mbox_layers diff --git a/examples/ssd/plot_detections.py b/examples/ssd/plot_detections.py new file mode 100644 index 00000000000..e682b4b5e07 --- /dev/null +++ b/examples/ssd/plot_detections.py @@ -0,0 +1,124 @@ +''' +Plot the detection results output by ssd_detect.cpp. +''' + +import argparse +from collections import OrderedDict +from google.protobuf import text_format +import matplotlib +# Force matplotlib to not use any Xwindows backend. +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import numpy as np +import os +import skimage.io as io +import sys + +import caffe +from caffe.proto import caffe_pb2 + +def get_labelname(labelmap, labels): + num_labels = len(labelmap.item) + labelnames = [] + if type(labels) is not list: + labels = [labels] + for label in labels: + found = False + for i in xrange(0, num_labels): + if label == labelmap.item[i].label: + found = True + labelnames.append(labelmap.item[i].display_name) + break + assert found == True + return labelnames + +def showResults(img_file, results, labelmap=None, threshold=None, display=None): + if not os.path.exists(img_file): + print "{} does not exist".format(img_file) + return + img = io.imread(img_file) + plt.clf() + plt.imshow(img) + plt.axis('off'); + ax = plt.gca() + if labelmap: + # generate same number of colors as classes in labelmap. + num_classes = len(labelmap.item) + else: + # generate 20 colors. + num_classes = 20 + colors = plt.cm.hsv(np.linspace(0, 1, num_classes)).tolist() + for res in results: + if 'score' in res and threshold and float(res["score"]) < threshold: + continue + label = res['label'] + name = "class " + str(label) + if labelmap: + name = get_labelname(labelmap, label)[0] + if display_classes and name not in display_classes: + continue + color = colors[label % num_classes] + bbox = res['bbox'] + coords = (bbox[0], bbox[1]), bbox[2] - bbox[0], bbox[3] - bbox[1] + ax.add_patch(plt.Rectangle(*coords, fill=False, edgecolor=color, linewidth=3)) + if 'score' in res: + score = res['score'] + display_text = '%s: %.2f' % (name, score) + else: + display_text = name + ax.text(bbox[0], bbox[1], display_text, bbox={'facecolor':color, 'alpha':0.5}) + if len(results) > 0 and "out_file" in results[0]: + plt.savefig(results[0]["out_file"], bbox_inches="tight") + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description = "Plot the detection results output by ssd_detect.") + parser.add_argument("resultfile", + help = "A file which contains all the detection results.") + parser.add_argument("imgdir", + help = "A directory which contains the images.") + parser.add_argument("--labelmap-file", default="", + help = "A file which contains the LabelMap.") + parser.add_argument("--visualize-threshold", default=0.01, type=float, + help = "Display detections with score higher than the threshold.") + parser.add_argument("--save-dir", default="", + help = "A directory which saves the image with detection results.") + parser.add_argument("--display-classes", default=None, + help = "If provided, only display specified class. Separate by ','") + + args = parser.parse_args() + result_file = args.resultfile + img_dir = args.imgdir + if not os.path.exists(img_dir): + print "{} does not exist".format(img_dir) + sys.exit() + labelmap_file = args.labelmap_file + labelmap = None + if labelmap_file and os.path.exists(labelmap_file): + file = open(labelmap_file, 'r') + labelmap = caffe_pb2.LabelMap() + text_format.Merge(str(file.read()), labelmap) + visualize_threshold = args.visualize_threshold + save_dir = args.save_dir + if save_dir and not os.path.exists(save_dir): + os.makedirs(save_dir) + display_classes = args.display_classes + + img_results = OrderedDict() + with open(result_file, "r") as f: + for line in f.readlines(): + img_name, label, score, xmin, ymin, xmax, ymax = line.strip("\n").split() + img_file = "{}/{}".format(img_dir, img_name) + result = dict() + result["label"] = int(label) + result["score"] = float(score) + result["bbox"] = [float(xmin), float(ymin), float(xmax), float(ymax)] + if save_dir: + out_file = "{}/{}.png".format(save_dir, os.path.basename(img_name)) + result["out_file"] = out_file + if img_file not in img_results: + img_results[img_file] = [result] + else: + img_results[img_file].append(result) + for img_file, results in img_results.iteritems(): + showResults(img_file, results, labelmap, visualize_threshold, display_classes) diff --git a/examples/ssd/score_ssd_coco.py b/examples/ssd/score_ssd_coco.py new file mode 100644 index 00000000000..5d817092f07 --- /dev/null +++ b/examples/ssd/score_ssd_coco.py @@ -0,0 +1,558 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# Notice: we do evaluation by setting the solver parameters approximately. +# The reason that we do not use ./build/tools/caffe test ... is because it +# only supports testing for classification problem now. +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True + +# The database file for training data. Created by data/coco/create_data.sh +train_data = "examples/coco/coco_train_lmdb" +# The database file for testing data. Created by data/coco/create_data.sh +test_data = "examples/coco/coco_minival_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'force_color': True, + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'force_color': True, + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# The job name should be same as the name used in examples/ssd/ssd_coco.py. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_coco_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/coco/{}_score".format(job_name) +# Directory which stores the snapshot of trained models. +snapshot_dir = "models/VGGNet/coco/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/coco/{}_score".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/mscoco/results/{}_score/".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Find most recent snapshot. +max_iter = 0 +for file in os.listdir(snapshot_dir): + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +if max_iter == 0: + print("Cannot find snapshot in {}".format(snapshot_dir)) + sys.exit() + +# Stores the test image names and sizes. Created by data/coco/create_list.sh +name_size_file = "data/coco/minival2014_name_size.txt" +# The resume model. +pretrain_model = "{}_iter_{}.caffemodel".format(snapshot_prefix, max_iter) +# Stores LabelMapItem. +label_map_file = "data/coco/labelmap_coco.prototxt" + +# MultiBoxLoss parameters. +num_classes = 81 +share_location = True +background_label_id=0 +train_on_diff_gt = False +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 15 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 7 / 100.] + min_sizes +max_sizes = [min_dim * 15 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# The number does not matter since we do not do training with this script. +batch_size = 1 +accum_batch_size = 1 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 5000 +test_batch_size = 8 +test_iter = num_test_image / test_batch_size + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [280000, 360000, 400000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 0, + 'snapshot': 0, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': False, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': True, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "detections_minival_ssd300_results", + 'output_format': "COCO", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write('--weights="{}" \\\n'.format(pretrain_model)) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}_test{}.log\n'.format(gpus, job_dir, model_name, max_iter)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/score_ssd_pascal.py b/examples/ssd/score_ssd_pascal.py new file mode 100644 index 00000000000..cc13125e32b --- /dev/null +++ b/examples/ssd/score_ssd_pascal.py @@ -0,0 +1,558 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# Notice: we do evaluation by setting the solver parameters approximately. +# The reason that we do not use ./build/tools/caffe test ... is because it +# only supports testing for classification problem now. +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True + +# The database file for training data. Created by data/VOC0712/create_data.sh +train_data = "examples/VOC0712/VOC0712_trainval_lmdb" +# The database file for testing data. Created by data/VOC0712/create_data.sh +test_data = "examples/VOC0712/VOC0712_test_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# The job name should be same as the name used in examples/ssd/ssd_pascal.py. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/VOC0712/{}_score".format(job_name) +# Directory which stores the snapshot of trained models. +snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/VOC0712/{}_score".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}_score/Main".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Find most recent snapshot. +max_iter = 0 +for file in os.listdir(snapshot_dir): + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +if max_iter == 0: + print("Cannot find snapshot in {}".format(snapshot_dir)) + sys.exit() + +# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh +name_size_file = "data/VOC0712/test_name_size.txt" +# The resume model. +pretrain_model = "{}_iter_{}.caffemodel".format(snapshot_prefix, max_iter) +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" + +# MultiBoxLoss parameters. +num_classes = 21 +share_location = True +background_label_id=0 +train_on_diff_gt = True +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# The number does not matter since we do not do training with this script. +batch_size = 1 +accum_batch_size = 1 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 4952 +test_batch_size = 8 +# Ideally test_batch_size should be divisible by num_test_image, +# otherwise mAP will be slightly off the true value. +test_iter = int(math.ceil(float(num_test_image) / test_batch_size)) + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [80000, 100000, 120000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 0, + 'snapshot': 0, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': False, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': True, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "comp4_det_test_", + 'output_format': "VOC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write('--weights="{}" \\\n'.format(pretrain_model)) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}_test{}.log\n'.format(gpus, job_dir, model_name, max_iter)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_coco.py b/examples/ssd/ssd_coco.py new file mode 100644 index 00000000000..3296d7abb32 --- /dev/null +++ b/examples/ssd/ssd_coco.py @@ -0,0 +1,576 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# Set true if you want to load from most recently saved snapshot. +# Otherwise, we will load from the pretrain_model defined below. +resume_training = True +# If true, Remove old model files. +remove_old_models = False + +# The database file for training data. Created by data/coco/create_data.sh +train_data = "examples/coco/coco_train_lmdb" +# The database file for testing data. Created by data/coco/create_data.sh +test_data = "examples/coco/coco_minival_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'force_color': True, + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'force_color': True, + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# Modify the job name if you want. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_coco_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/coco/{}".format(job_name) +# Directory which stores the snapshot of models. +snapshot_dir = "models/VGGNet/coco/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/coco/{}".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/mscoco/results/{}".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Stores the test image names and sizes. Created by data/coco/create_list.sh +name_size_file = "data/coco/test2014_name_size.txt" +# The pretrained model. We use the Fully convolutional reduced (atrous) VGGNet. +pretrain_model = "models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel" +# Stores LabelMapItem. +label_map_file = "data/coco/labelmap_coco.prototxt" + +# MultiBoxLoss parameters. +num_classes = 81 +share_location = True +background_label_id=0 +train_on_diff_gt = False +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 15 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 7 / 100.] + min_sizes +max_sizes = [min_dim * 15 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0,1" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# Divide the mini-batch to different GPUs. +batch_size = 32 +accum_batch_size = 32 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 5000 +test_batch_size = 8 +test_iter = num_test_image / test_batch_size + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [280000, 360000, 400000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 400000, + 'snapshot': 40000, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': True, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': False, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "detections_minival_ssd300_results", + 'output_format': "COCO", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +max_iter = 0 +# Find most recent snapshot. +for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +train_src_param = '--weights="{}" \\\n'.format(pretrain_model) +if resume_training: + if max_iter > 0: + train_src_param = '--snapshot="{}_iter_{}.solverstate" \\\n'.format(snapshot_prefix, max_iter) + +if remove_old_models: + # Remove any snapshots smaller than max_iter. + for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') +# f.write('./cmake-build-debug/tools/caffe-d train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write(train_src_param) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}.log\n'.format(gpus, job_dir, model_name)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_detect.cpp b/examples/ssd/ssd_detect.cpp new file mode 100644 index 00000000000..11d3dc3bd5e --- /dev/null +++ b/examples/ssd/ssd_detect.cpp @@ -0,0 +1,346 @@ +// This is a demo code for using a SSD model to do detection. +// The code is modified from examples/cpp_classification/classification.cpp. +// Usage: +// ssd_detect [FLAGS] model_file weights_file list_file +// +// where model_file is the .prototxt file defining the network architecture, and +// weights_file is the .caffemodel file containing the network parameters, and +// list_file contains a list of image files with the format as follows: +// folder/img1.JPEG +// folder/img2.JPEG +// list_file can also contain a list of video files with the format as follows: +// folder/video1.mp4 +// folder/video2.mp4 +// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace caffe; // NOLINT(build/namespaces) + +class Detector { + public: + Detector(const string& model_file, + const string& weights_file, + const string& mean_file, + const string& mean_value); + + std::vector > Detect(const cv::Mat& img); + + private: + void SetMean(const string& mean_file, const string& mean_value); + + void WrapInputLayer(std::vector* input_channels); + + void Preprocess(const cv::Mat& img, + std::vector* input_channels); + + private: + shared_ptr net_; + cv::Size input_geometry_; + int num_channels_; + cv::Mat mean_; +}; + +Detector::Detector(const string& model_file, + const string& weights_file, + const string& mean_file, + const string& mean_value) { + Caffe::set_mode(Caffe::GPU); + + /* Load the network. */ + net_.reset(new Net(model_file, TEST)); + net_->CopyTrainedLayersFrom(weights_file); + + CHECK_EQ(net_->num_inputs(), 1) << "Network should have exactly one input."; + CHECK_EQ(net_->num_outputs(), 1) << "Network should have exactly one output."; + + Blob* input_layer = net_->input_blobs()[0]; + num_channels_ = input_layer->channels(); + CHECK(num_channels_ == 3 || num_channels_ == 1) + << "Input layer should have 1 or 3 channels."; + input_geometry_ = cv::Size(input_layer->width(), input_layer->height()); + + /* Load the binaryproto mean file. */ + SetMean(mean_file, mean_value); +} + +std::vector > Detector::Detect(const cv::Mat& img) { + Blob* input_layer = net_->input_blobs()[0]; + input_layer->Reshape(1, num_channels_, + input_geometry_.height, input_geometry_.width); + /* Forward dimension change to all layers. */ + net_->Reshape(); + + std::vector input_channels; + WrapInputLayer(&input_channels); + + Preprocess(img, &input_channels); + + net_->Forward(); + + /* Copy the output layer to a std::vector */ + Blob* result_blob = net_->output_blobs()[0]; + const float* result = result_blob->cpu_data(); + const int num_det = result_blob->height(); + vector > detections; + for (int k = 0; k < num_det; ++k) { + if (result[0] == -1) { + // Skip invalid detection. + result += 7; + continue; + } + vector detection(result, result + 7); + detections.push_back(detection); + result += 7; + } + return detections; +} + +/* Load the mean file in binaryproto format. */ +void Detector::SetMean(const string& mean_file, const string& mean_value) { + cv::Scalar channel_mean; + if (!mean_file.empty()) { + CHECK(mean_value.empty()) << + "Cannot specify mean_file and mean_value at the same time"; + BlobProto blob_proto; + ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); + + /* Convert from BlobProto to Blob */ + TBlob mean_blob; + mean_blob.FromProto(blob_proto); + CHECK_EQ(mean_blob.channels(), num_channels_) + << "Number of channels of mean file doesn't match input layer."; + + /* The format of the mean file is planar 32-bit float BGR or grayscale. */ + std::vector channels; + float* data = mean_blob.mutable_cpu_data(); + for (int i = 0; i < num_channels_; ++i) { + /* Extract an individual channel. */ + cv::Mat channel(mean_blob.height(), mean_blob.width(), CV_32FC1, data); + channels.push_back(channel); + data += mean_blob.height() * mean_blob.width(); + } + + /* Merge the separate channels into a single image. */ + cv::Mat mean; + cv::merge(channels, mean); + + /* Compute the global mean pixel value and create a mean image + * filled with this value. */ + channel_mean = cv::mean(mean); + mean_ = cv::Mat(input_geometry_, mean.type(), channel_mean); + } + if (!mean_value.empty()) { + CHECK(mean_file.empty()) << + "Cannot specify mean_file and mean_value at the same time"; + stringstream ss(mean_value); + vector values; + string item; + while (getline(ss, item, ',')) { + float value = std::atof(item.c_str()); + values.push_back(value); + } + CHECK(values.size() == 1 || values.size() == num_channels_) << + "Specify either 1 mean_value or as many as channels: " << num_channels_; + + std::vector channels; + for (int i = 0; i < num_channels_; ++i) { + /* Extract an individual channel. */ + cv::Mat channel(input_geometry_.height, input_geometry_.width, CV_32FC1, + cv::Scalar(values[i])); + channels.push_back(channel); + } + cv::merge(channels, mean_); + } +} + +/* Wrap the input layer of the network in separate cv::Mat objects + * (one per channel). This way we save one memcpy operation and we + * don't need to rely on cudaMemcpy2D. The last preprocessing + * operation will write the separate channels directly to the input + * layer. */ +void Detector::WrapInputLayer(std::vector* input_channels) { + Blob* input_layer = net_->input_blobs()[0]; + + int width = input_layer->width(); + int height = input_layer->height(); + float* input_data = input_layer->mutable_cpu_data(); + for (int i = 0; i < input_layer->channels(); ++i) { + cv::Mat channel(height, width, CV_32FC1, input_data); + input_channels->push_back(channel); + input_data += width * height; + } +} + +void Detector::Preprocess(const cv::Mat& img, + std::vector* input_channels) { + /* Convert the input image to the input image format of the network. */ + cv::Mat sample; + if (img.channels() == 3 && num_channels_ == 1) + cv::cvtColor(img, sample, cv::COLOR_BGR2GRAY); + else if (img.channels() == 4 && num_channels_ == 1) + cv::cvtColor(img, sample, cv::COLOR_BGRA2GRAY); + else if (img.channels() == 4 && num_channels_ == 3) + cv::cvtColor(img, sample, cv::COLOR_BGRA2BGR); + else if (img.channels() == 1 && num_channels_ == 3) + cv::cvtColor(img, sample, cv::COLOR_GRAY2BGR); + else + sample = img; + + cv::Mat sample_resized; + if (sample.size() != input_geometry_) + cv::resize(sample, sample_resized, input_geometry_); + else + sample_resized = sample; + + cv::Mat sample_float; + if (num_channels_ == 3) + sample_resized.convertTo(sample_float, CV_32FC3); + else + sample_resized.convertTo(sample_float, CV_32FC1); + + cv::Mat sample_normalized; + cv::subtract(sample_float, mean_, sample_normalized); + + /* This operation will write the separate BGR planes directly to the + * input layer of the network because it is wrapped by the cv::Mat + * objects in input_channels. */ + cv::split(sample_normalized, *input_channels); + + CHECK(reinterpret_cast(input_channels->at(0).data) + == net_->input_blobs()[0]->cpu_data()) + << "Input channels are not wrapping the input layer of the network."; +} + +DEFINE_string(mean_file, "", + "The mean file used to subtract from the input image."); +DEFINE_string(mean_value, "104,117,123", + "If specified, can be one value or can be same as image channels" + " - would subtract from the corresponding channel). Separated by ','." + "Either mean_file or mean_value should be provided, not both."); +DEFINE_string(file_type, "image", + "The file type in the list_file. Currently support image and video."); +DEFINE_string(out_file, "", + "If provided, store the detection results in the out_file."); +DEFINE_double(confidence_threshold, 0.01, + "Only store detections with score higher than the threshold."); + +int main(int argc, char** argv) { + ::google::InitGoogleLogging(argv[0]); + // Print output to stderr (while still logging) + FLAGS_alsologtostderr = 1; + +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + + gflags::SetUsageMessage("Do detection using SSD mode.\n" + "Usage:\n" + " ssd_detect [FLAGS] model_file weights_file list_file\n"); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (argc < 4) { + gflags::ShowUsageWithFlagsRestrict(argv[0], "examples/ssd/ssd_detect"); + return 1; + } + + const string& model_file = argv[1]; + const string& weights_file = argv[2]; + const string& mean_file = FLAGS_mean_file; + const string& mean_value = FLAGS_mean_value; + const string& file_type = FLAGS_file_type; + const string& out_file = FLAGS_out_file; + const float confidence_threshold = FLAGS_confidence_threshold; + + // Initialize the network. + Detector detector(model_file, weights_file, mean_file, mean_value); + + // Set the output mode. + std::streambuf* buf = std::cout.rdbuf(); + std::ofstream outfile; + if (!out_file.empty()) { + outfile.open(out_file.c_str()); + if (outfile.good()) { + buf = outfile.rdbuf(); + } + } + std::ostream out(buf); + + // Process image one by one. + std::ifstream infile(argv[3]); + std::string file; + while (infile >> file) { + if (file_type == "image") { + cv::Mat img = cv::imread(file, -1); + CHECK(!img.empty()) << "Unable to decode image " << file; + std::vector > detections = detector.Detect(img); + + /* Print the detection results. */ + for (int i = 0; i < detections.size(); ++i) { + const vector& d = detections[i]; + // Detection format: [image_id, label, score, xmin, ymin, xmax, ymax]. + CHECK_EQ(d.size(), 7); + const float score = d[2]; + if (score >= confidence_threshold) { + out << file << " "; + out << static_cast(d[1]) << " "; + out << score << " "; + out << static_cast(d[3] * img.cols) << " "; + out << static_cast(d[4] * img.rows) << " "; + out << static_cast(d[5] * img.cols) << " "; + out << static_cast(d[6] * img.rows) << std::endl; + } + } + } else if (file_type == "video") { + cv::VideoCapture cap(file); + if (!cap.isOpened()) { + LOG(FATAL) << "Failed to open video: " << file; + } + cv::Mat img; + int frame_count = 0; + while (true) { + bool success = cap.read(img); + if (!success) { + LOG(INFO) << "Process " << frame_count << " frames from " << file; + break; + } + CHECK(!img.empty()) << "Error when read frame"; + std::vector > detections = detector.Detect(img); + + /* Print the detection results. */ + for (int i = 0; i < detections.size(); ++i) { + const vector& d = detections[i]; + // Detection format: [image_id, label, score, xmin, ymin, xmax, ymax]. + CHECK_EQ(d.size(), 7); + const float score = d[2]; + if (score >= confidence_threshold) { + out << file << "_"; + out << std::setfill('0') << std::setw(6) << frame_count << " "; + out << static_cast(d[1]) << " "; + out << score << " "; + out << static_cast(d[3] * img.cols) << " "; + out << static_cast(d[4] * img.rows) << " "; + out << static_cast(d[5] * img.cols) << " "; + out << static_cast(d[6] * img.rows) << std::endl; + } + } + ++frame_count; + } + if (cap.isOpened()) { + cap.release(); + } + } else { + LOG(FATAL) << "Unknown file_type: " << file_type; + } + } + return 0; +} diff --git a/examples/ssd/ssd_detect.py b/examples/ssd/ssd_detect.py new file mode 100644 index 00000000000..945930bea03 --- /dev/null +++ b/examples/ssd/ssd_detect.py @@ -0,0 +1,149 @@ +#encoding=utf8 +''' +Detection with SSD +In this example, we will load a SSD model and use it to detect objects. +''' + +import os +import sys +import argparse +import numpy as np +from PIL import Image, ImageDraw +# Make sure that caffe is on the python path: +caffe_root = './' +os.chdir(caffe_root) +sys.path.insert(0, os.path.join(caffe_root, 'python')) +import caffe + +from google.protobuf import text_format +from caffe.proto import caffe_pb2 + + +def get_labelname(labelmap, labels): + num_labels = len(labelmap.item) + labelnames = [] + if type(labels) is not list: + labels = [labels] + for label in labels: + found = False + for i in xrange(0, num_labels): + if label == labelmap.item[i].label: + found = True + labelnames.append(labelmap.item[i].display_name) + break + assert found == True + return labelnames + +class CaffeDetection: + def __init__(self, gpu_id, model_def, model_weights, image_resize, labelmap_file): + caffe.set_device(gpu_id) + caffe.set_mode_gpu() + + self.image_resize = image_resize + # Load the net in the test phase for inference, and configure input preprocessing. + self.net = caffe.Net(model_def, # defines the structure of the model + model_weights, # contains the trained weights + caffe.TEST) # use test mode (e.g., don't perform dropout) + # input preprocessing: 'data' is the name of the input blob == net.inputs[0] + self.transformer = caffe.io.Transformer({'data': self.net.blobs['data'].data.shape}) + self.transformer.set_transpose('data', (2, 0, 1)) + self.transformer.set_mean('data', np.array([104, 117, 123])) # mean pixel + # the reference model operates on images in [0,255] range instead of [0,1] + self.transformer.set_raw_scale('data', 255) + # the reference model has channels in BGR order instead of RGB + self.transformer.set_channel_swap('data', (2, 1, 0)) + + # load PASCAL VOC labels + file = open(labelmap_file, 'r') + self.labelmap = caffe_pb2.LabelMap() + text_format.Merge(str(file.read()), self.labelmap) + + def detect(self, image_file, conf_thresh=0.5, topn=5): + ''' + SSD detection + ''' + # set net to batch size of 1 + # image_resize = 300 + self.net.blobs['data'].reshape(1, 3, self.image_resize, self.image_resize) + image = caffe.io.load_image(image_file) + + #Run the net and examine the top_k results + transformed_image = self.transformer.preprocess('data', image) + self.net.blobs['data'].data[...] = transformed_image + + # Forward pass. + detections = self.net.forward()['detection_out'] + + # Parse the outputs. + det_label = detections[0,0,:,1] + det_conf = detections[0,0,:,2] + det_xmin = detections[0,0,:,3] + det_ymin = detections[0,0,:,4] + det_xmax = detections[0,0,:,5] + det_ymax = detections[0,0,:,6] + + # Get detections with confidence higher than 0.6. + top_indices = [i for i, conf in enumerate(det_conf) if conf >= conf_thresh] + + top_conf = det_conf[top_indices] + top_label_indices = det_label[top_indices].tolist() + top_labels = get_labelname(self.labelmap, top_label_indices) + top_xmin = det_xmin[top_indices] + top_ymin = det_ymin[top_indices] + top_xmax = det_xmax[top_indices] + top_ymax = det_ymax[top_indices] + + result = [] + for i in xrange(min(topn, top_conf.shape[0])): + xmin = top_xmin[i] # xmin = int(round(top_xmin[i] * image.shape[1])) + ymin = top_ymin[i] # ymin = int(round(top_ymin[i] * image.shape[0])) + xmax = top_xmax[i] # xmax = int(round(top_xmax[i] * image.shape[1])) + ymax = top_ymax[i] # ymax = int(round(top_ymax[i] * image.shape[0])) + score = top_conf[i] + label = int(top_label_indices[i]) + label_name = top_labels[i] + result.append([xmin, ymin, xmax, ymax, label, score, label_name]) + return result + +def main(args): + '''main ''' + detection = CaffeDetection(args.gpu_id, + args.model_def, args.model_weights, + args.image_resize, args.labelmap_file) + result = detection.detect(args.image_file) + print result + + img = Image.open(args.image_file) + draw = ImageDraw.Draw(img) + width, height = img.size + print width, height + for item in result: + xmin = int(round(item[0] * width)) + ymin = int(round(item[1] * height)) + xmax = int(round(item[2] * width)) + ymax = int(round(item[3] * height)) + draw.rectangle([xmin, ymin, xmax, ymax], outline=(255, 0, 0)) + draw.text([xmin, ymin], item[-1] + str(item[-2]), (0, 0, 255)) + print item + print [xmin, ymin, xmax, ymax] + print [xmin, ymin], item[-1] + img.save('detect_result.jpg') + + +def parse_args(): + '''parse args''' + parser = argparse.ArgumentParser() + parser.add_argument('--gpu_id', type=int, default=0, help='gpu id') + parser.add_argument('--labelmap_file', + default='data/VOC0712/labelmap_voc.prototxt') + parser.add_argument('--model_def', + default='models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt') + parser.add_argument('--image_resize', default=300, type=int) + parser.add_argument('--model_weights', + default='models/VGGNet/VOC0712/SSD_300x300/' + 'VGG_VOC0712_SSD_300x300_iter_120000.caffemodel') + parser.add_argument('--image_file', default='examples/images/fish-bike.jpg') + return parser.parse_args() + +if __name__ == '__main__': + main(parse_args()) diff --git a/examples/ssd/ssd_ilsvrc.py b/examples/ssd/ssd_ilsvrc.py new file mode 100644 index 00000000000..932bc0da2e4 --- /dev/null +++ b/examples/ssd/ssd_ilsvrc.py @@ -0,0 +1,575 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# Set true if you want to load from most recently saved snapshot. +# Otherwise, we will load from the pretrain_model defined below. +resume_training = True +# If true, Remove old model files. +remove_old_models = True + +# The database file for training data. Created by data/ILSVRC2016/create_data.sh +train_data = "examples/ILSVRC2016/ILSVRC2016_trainval1_lmdb" +# The database file for testing data. Created by data/ILSVRC2016/create_data.sh +test_data = "examples/ILSVRC2016/ILSVRC2016_val2_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'force_color': True, + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'force_color': True, + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# Modify the job name if you want. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_ILSVRC2016_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/ILSVRC2016/{}".format(job_name) +# Directory which stores the snapshot of models. +snapshot_dir = "models/VGGNet/ILSVRC2016/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/ILSVRC2016/{}".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/ILSVRC2016/results/{}".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Stores the test image names and sizes. Created by data/ILSVRC2016/create_list.py +name_size_file = "data/ILSVRC2016/val2_name_size.txt" +# The pretrained model. We use the Fully convolutional reduced (atrous) VGGNet. +pretrain_model = "models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel" +# Stores LabelMapItem. +label_map_file = "data/ILSVRC2016/labelmap_ilsvrc_det.prototxt" + +# MultiBoxLoss parameters. +num_classes = 201 +share_location = True +background_label_id=0 +train_on_diff_gt = False +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0,1,2,3" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# Divide the mini-batch to different GPUs. +batch_size = 32 +accum_batch_size = 32 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 9917 +test_batch_size = 1 +test_iter = num_test_image / test_batch_size + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [320000, 400000, 440000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 440000, + 'snapshot': 30000, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': True, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "MaxIntegral", + 'test_initialization': False, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "val2_ssd{}_results".format(min_dim), + 'output_format': "ILSVRC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +max_iter = 0 +# Find most recent snapshot. +for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +train_src_param = '--weights="{}" \\\n'.format(pretrain_model) +if resume_training: + if max_iter > 0: + train_src_param = '--snapshot="{}_iter_{}.solverstate" \\\n'.format(snapshot_prefix, max_iter) + +if remove_old_models: + # Remove any snapshots smaller than max_iter. + for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write(train_src_param) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}.log\n'.format(gpus, job_dir, model_name)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal.py b/examples/ssd/ssd_pascal.py new file mode 100644 index 00000000000..e7a98174b82 --- /dev/null +++ b/examples/ssd/ssd_pascal.py @@ -0,0 +1,575 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# Set true if you want to load from most recently saved snapshot. +# Otherwise, we will load from the pretrain_model defined below. +resume_training = True +# If true, Remove old model files. +remove_old_models = False + +# The database file for training data. Created by data/VOC0712/create_data.sh +train_data = "examples/VOC0712/VOC0712_trainval_lmdb" +# The database file for testing data. Created by data/VOC0712/create_data.sh +test_data = "examples/VOC0712/VOC0712_test_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# Modify the job name if you want. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the snapshot of models. +snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}/Main".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh +name_size_file = "data/VOC0712/test_name_size.txt" +# The pretrained model. We use the Fully convolutional reduced (atrous) VGGNet. +pretrain_model = "models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel" +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" + +# MultiBoxLoss parameters. +num_classes = 21 +share_location = True +background_label_id=0 +train_on_diff_gt = True +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0,1,2,3" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# Divide the mini-batch to different GPUs. +batch_size = 32 +accum_batch_size = 32 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 4952 +test_batch_size = 8 +# Ideally test_batch_size should be divisible by num_test_image, +# otherwise mAP will be slightly off the true value. +test_iter = int(math.ceil(float(num_test_image) / test_batch_size)) + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [80000, 100000, 120000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 120000, + 'snapshot': 80000, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': True, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': False, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "comp4_det_test_", + 'output_format': "VOC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +max_iter = 0 +# Find most recent snapshot. +for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +train_src_param = '--weights="{}" \\\n'.format(pretrain_model) +if resume_training: + if max_iter > 0: + train_src_param = '--snapshot="{}_iter_{}.solverstate" \\\n'.format(snapshot_prefix, max_iter) + +if remove_old_models: + # Remove any snapshots smaller than max_iter. + for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write(train_src_param) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}.log\n'.format(gpus, job_dir, model_name)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal_orig.py b/examples/ssd/ssd_pascal_orig.py new file mode 100644 index 00000000000..a927d4490e8 --- /dev/null +++ b/examples/ssd/ssd_pascal_orig.py @@ -0,0 +1,582 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# Set true if you want to load from most recently saved snapshot. +# Otherwise, we will load from the pretrain_model defined below. +resume_training = True +# If true, Remove old model files. +remove_old_models = False + +# The database file for training data. Created by data/VOC0712/create_data.sh +train_data = "examples/VOC0712/VOC0712_trainval_lmdb" +# The database file for testing data. Created by data/VOC0712/create_data.sh +test_data = "examples/VOC0712/VOC0712_test_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.FIT_SMALL_SIZE, + 'height': resize_height, + 'width': resize_width, + 'height_scale': resize_height, + 'width_scale': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +resize_param = { + 'prob': 1, + 'resize_mode': P.Resize.FIT_SMALL_SIZE, + 'height': resize_height, + 'width': resize_width, + 'height_scale': resize_height, + 'width_scale': resize_height, + 'interp_mode': [P.Resize.LINEAR], + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': resize_param, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# Modify the job name if you want. +job_name = "SSD_{}_orig".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the snapshot of models. +snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}/Main".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh +name_size_file = "data/VOC0712/test_name_size.txt" +# The pretrained model. We use the Fully convolutional reduced (atrous) VGGNet. +pretrain_model = "models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel" +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" + +# MultiBoxLoss parameters. +num_classes = 21 +share_location = True +background_label_id=0 +train_on_diff_gt = True +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0,1,2,3" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# Divide the mini-batch to different GPUs. +batch_size = num_gpus +accum_batch_size = 32 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 4952 +test_batch_size = 1 +test_iter = num_test_image / test_batch_size + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [80000, 100000, 120000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 120000, + 'snapshot': 80000, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': True, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': False, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "comp4_det_test_", + 'output_format': "VOC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + 'resize_param': resize_param, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + 'resize_param': resize_param, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, img_height=resize_height, + img_width=resize_width, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, img_height=resize_height, + img_width=resize_width, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +max_iter = 0 +# Find most recent snapshot. +for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +train_src_param = '--weights="{}" \\\n'.format(pretrain_model) +if resume_training: + if max_iter > 0: + train_src_param = '--snapshot="{}_iter_{}.solverstate" \\\n'.format(snapshot_prefix, max_iter) + +if remove_old_models: + # Remove any snapshots smaller than max_iter. + for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write(train_src_param) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}.log\n'.format(gpus, job_dir, model_name)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal_resnet.py b/examples/ssd/ssd_pascal_resnet.py new file mode 100644 index 00000000000..c721be8b34a --- /dev/null +++ b/examples/ssd/ssd_pascal_resnet.py @@ -0,0 +1,522 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + last_layer = net.keys()[-1] + + # 10 x 10 + from_layer = last_layer + out_layer = "{}/conv1_1".format(last_layer) + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1) + from_layer = out_layer + + out_layer = "{}/conv1_2".format(last_layer) + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2) + from_layer = out_layer + + for i in xrange(2, 4): + out_layer = "{}/conv{}_1".format(last_layer, i) + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1) + from_layer = out_layer + + out_layer = "{}/conv{}_2".format(last_layer, i) + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2) + from_layer = out_layer + + # Add global pooling layer. + name = net.keys()[-1] + net.pool6 = L.Pooling(net[name], pool=P.Pooling.AVE, global_pooling=True) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# Set true if you want to load from most recently saved snapshot. +# Otherwise, we will load from the pretrain_model defined below. +resume_training = True +# If true, Remove old model files. +remove_old_models = False + +# The database file for training data. Created by data/VOC0712/create_data.sh +train_data = "examples/VOC0712/VOC0712_trainval_lmdb" +# The database file for testing data. Created by data/VOC0712/create_data.sh +test_data = "examples/VOC0712/VOC0712_test_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# A learning rate for batch_size = 1, num_gpus = 1. +base_lr = 0.00004 + +# Modify the job name if you want. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "ResNet_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/ResNet/VOC0712/{}".format(job_name) +# Directory which stores the snapshot of models. +snapshot_dir = "models/ResNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/ResNet/VOC0712/{}".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}/Main".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh +name_size_file = "data/VOC0712/test_name_size.txt" +# The pretrained ResNet101 model from https://github.com/KaimingHe/deep-residual-networks. +pretrain_model = "models/ResNet/ResNet-101-model.caffemodel" +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" + +# MultiBoxLoss parameters. +num_classes = 21 +share_location = True +background_label_id=0 +train_on_diff_gt = True +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# res3b3_relu ==> 38 x 38 +# res5c_relu ==> 19 x 19 +# res5c_relu/conv1_2 ==> 10 x 10 +# res5c_relu/conv2_2 ==> 5 x 5 +# res5c_relu/conv3_2 ==> 3 x 3 +# pool6 ==> 1 x 1 +mbox_source_layers = ['res3b3_relu', 'res5c_relu', 'res5c_relu/conv1_2', 'res5c_relu/conv2_2', 'res5c_relu/conv3_2', 'pool6'] +# in percent % +min_ratio = 20 +max_ratio = 95 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [[]] + max_sizes +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = True + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0,1,2,3" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# Divide the mini-batch to different GPUs. +batch_size = 32 +accum_batch_size = 32 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 4952 +test_batch_size = 1 +test_iter = num_test_image / test_batch_size + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "step", + 'stepsize': 40000, + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 60000, + 'snapshot': 40000, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': True, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': False, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "comp4_det_test_", + 'output_format': "VOC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +ResNet101Body(net, from_layer='data', use_pool5=False, use_dilation_conv5=True) + +# Use batch norm for the newly added layers. +AddExtraLayers(net, use_batchnorm=True) + +# Don't use batch norm for location/confidence prediction layers. +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=False, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, num_classes=num_classes, share_location=share_location, + flip=flip, clip=clip, prior_variance=prior_variance, kernel_size=3, pad=1) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +ResNet101Body(net, from_layer='data', use_pool5=False, use_dilation_conv5=True) + +# Use batch norm for the newly added layers. +AddExtraLayers(net, use_batchnorm=True) + +# Don't use batch norm for location/confidence prediction layers. +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=False, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, num_classes=num_classes, share_location=share_location, + flip=flip, clip=clip, prior_variance=prior_variance, kernel_size=3, pad=1) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +max_iter = 0 +# Find most recent snapshot. +for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +train_src_param = '--weights="{}" \\\n'.format(pretrain_model) +if resume_training: + if max_iter > 0: + train_src_param = '--snapshot="{}_iter_{}.solverstate" \\\n'.format(snapshot_prefix, max_iter) + +if remove_old_models: + # Remove any snapshots smaller than max_iter. + for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write(train_src_param) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}.log\n'.format(gpus, job_dir, model_name)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal_speed.py b/examples/ssd/ssd_pascal_speed.py new file mode 100644 index 00000000000..fd766a62322 --- /dev/null +++ b/examples/ssd/ssd_pascal_speed.py @@ -0,0 +1,556 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# Notice: we do evaluation by setting the solver parameters approximately. +# The reason that we do not use ./build/tools/caffe test ... is because it +# only supports testing for classification problem now. +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True + +# The database file for training data. Created by data/VOC0712/create_data.sh +train_data = "examples/VOC0712/VOC0712_trainval_lmdb" +# The database file for testing data. Created by data/VOC0712/create_data.sh +test_data = "examples/VOC0712/VOC0712_test_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# The job name should be same as the name used in examples/ssd/ssd_pascal.py. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/VOC0712/{}_speed".format(job_name) +# Directory which stores the snapshot of trained models. +snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/VOC0712/{}_speed".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}_speed/Main".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Find most recent snapshot. +max_iter = 0 +for file in os.listdir(snapshot_dir): + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +if max_iter == 0: + print("Cannot find snapshot in {}".format(snapshot_dir)) + sys.exit() + +# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh +name_size_file = "data/VOC0712/test_name_size.txt" +# The resume model. +pretrain_model = "{}_iter_{}.caffemodel".format(snapshot_prefix, max_iter) +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" + +# MultiBoxLoss parameters. +num_classes = 21 +share_location = True +background_label_id=0 +train_on_diff_gt = True +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# The number does not matter since we do not do training with this script. +batch_size = 1 +accum_batch_size = 1 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 4952 +test_batch_size = 8 +# Ideally test_batch_size should be divisible by num_test_image, +# otherwise mAP will be slightly off the true value. +test_iter = int(math.ceil(float(num_test_image) / test_batch_size)) + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [80000, 100000, 120000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 0, + 'snapshot': 0, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': False, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'test_initialization': True, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + # Not saving results when testing speed. + # 'output_directory': output_result_dir, + 'output_name_prefix': "comp4_det_test_", + 'output_format': "VOC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=False, label_map_file=label_map_file, + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.slience = L.Silence(net.detection_out, ntop=0, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write('--weights="{}" \\\n'.format(pretrain_model)) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}_test{}.log\n'.format(gpus, job_dir, model_name, max_iter)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal_video.py b/examples/ssd/ssd_pascal_video.py new file mode 100644 index 00000000000..ac2463d97db --- /dev/null +++ b/examples/ssd/ssd_pascal_video.py @@ -0,0 +1,293 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# The video file path +video_file = "examples/videos/ILSVRC2015_train_00755001.mp4" + +# The parameters for the video demo + +# Key parameters used in training +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +num_classes = 21 +share_location = True +background_label_id=0 +conf_loss_type = P.MultiBoxLoss.SOFTMAX +code_type = P.PriorBox.CENTER_SIZE +lr_mult = 1. +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" +# The resized image size +resize_width = 300 +resize_height = 300 + +# Parameters needed for test. +# Set the number of test iterations to the maximum integer number. +test_iter = int(math.pow(2, 29) - 1) +# Use GPU or CPU +solver_mode = P.Solver.GPU +# Defining which GPUs to use. +gpus = "0" +# Number of frames to be processed per batch. +test_batch_size = 1 +# Only display high quality detections whose scores are higher than a threshold. +visualize_threshold = 0.3 +# Size of video image. +video_width = 1280 +video_height = 720 +# Scale the image size for display. +scale = 0.8 + +### Hopefully you don't need to change the following ### +resize = "{}x{}".format(resize_width, resize_height) +video_data_param = { + 'video_type': P.VideoData.VIDEO, + 'video_file': video_file, + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } +output_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': int(video_height * scale), + 'width': int(video_width * scale), + 'interp_mode': [P.Resize.LINEAR], + }, + } +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'label_map_file': label_map_file, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + 'visualize': True, + 'visualize_threshold': visualize_threshold, + } + +# The job name should be same as the name used in examples/ssd/ssd_pascal.py. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/VOC0712/{}_video".format(job_name) +# Directory which stores the snapshot of trained models. +snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/VOC0712/{}_video".format(job_name) + +# model definition files. +test_net_file = "{}/test.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Find most recent snapshot. +max_iter = 0 +for file in os.listdir(snapshot_dir): + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +if max_iter == 0: + print("Cannot find snapshot in {}".format(snapshot_dir)) + sys.exit() + +# The resume model. +pretrain_model = "{}_iter_{}.caffemodel".format(snapshot_prefix, max_iter) + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Check file. +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create test net. +net = caffe.NetSpec() +net.data = L.VideoData(video_data_param=video_data_param, + data_param=dict(batch_size=test_batch_size), + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if conf_loss_type == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif conf_loss_type == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +mbox_layers.append(net.data) +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + transform_param=output_transform_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.slience = L.Silence(net.detection_out, ntop=0, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe test \\\n') + f.write('--model="{}" \\\n'.format(test_net_file)) + f.write('--weights="{}" \\\n'.format(pretrain_model)) + f.write('--iterations="{}" \\\n'.format(test_iter)) + if solver_mode == P.Solver.GPU: + f.write('--gpu {}\n'.format(gpus)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal_webcam.py b/examples/ssd/ssd_pascal_webcam.py new file mode 100644 index 00000000000..3b58e5437b2 --- /dev/null +++ b/examples/ssd/ssd_pascal_webcam.py @@ -0,0 +1,296 @@ +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# The device id for webcam +webcam_id = 0 +# Number of frames to be skipped. +skip_frames = 0 + +# The parameters for the webcam demo + +# Key parameters used in training +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +num_classes = 21 +share_location = True +background_label_id=0 +conf_loss_type = P.MultiBoxLoss.SOFTMAX +code_type = P.PriorBox.CENTER_SIZE +lr_mult = 1. +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" +# The resized image size +resize_width = 300 +resize_height = 300 + +# Parameters needed for test. +# Set the number of test iterations to the maximum integer number. +test_iter = int(math.pow(2, 29) - 1) +# Use GPU or CPU +solver_mode = P.Solver.GPU +# Defining which GPUs to use. +gpus = "0" +# Number of frames to be processed per batch. +test_batch_size = 1 +# Only display high quality detections whose scores are higher than a threshold. +visualize_threshold = 0.6 +# Size of webcam image. +webcam_width = 640 +webcam_height = 480 +# Scale the image size for display. +scale = 1.5 + +### Hopefully you don't need to change the following ### +resize = "{}x{}".format(resize_width, resize_height) +video_data_param = { + 'video_type': P.VideoData.WEBCAM, + 'device_id': webcam_id, + 'skip_frames': skip_frames, + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } +output_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': int(webcam_height * scale), + 'width': int(webcam_width * scale), + 'interp_mode': [P.Resize.LINEAR], + }, + } +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'label_map_file': label_map_file, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + 'visualize': True, + 'visualize_threshold': visualize_threshold, + } + +# The job name should be same as the name used in examples/ssd/ssd_pascal.py. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "VGG_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/VGGNet/VOC0712/{}_webcam".format(job_name) +# Directory which stores the snapshot of trained models. +snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/VGGNet/VOC0712/{}_webcam".format(job_name) + +# model definition files. +test_net_file = "{}/test.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Find most recent snapshot. +max_iter = 0 +for file in os.listdir(snapshot_dir): + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +if max_iter == 0: + print("Cannot find snapshot in {}".format(snapshot_dir)) + sys.exit() + +# The resume model. +pretrain_model = "{}_iter_{}.caffemodel".format(snapshot_prefix, max_iter) + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv4_3 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv4_3. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Check file. +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create test net. +net = caffe.NetSpec() +net.data = L.VideoData(video_data_param=video_data_param, + data_param=dict(batch_size=test_batch_size), + transform_param=test_transform_param) + +VGGNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if conf_loss_type == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif conf_loss_type == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +mbox_layers.append(net.data) +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + transform_param=output_transform_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.slience = L.Silence(net.detection_out, ntop=0, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe test \\\n') + f.write('--model="{}" \\\n'.format(test_net_file)) + f.write('--weights="{}" \\\n'.format(pretrain_model)) + f.write('--iterations="{}" \\\n'.format(test_iter)) + if solver_mode == P.Solver.GPU: + f.write('--gpu {}\n'.format(gpus)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/examples/ssd/ssd_pascal_zf.py b/examples/ssd/ssd_pascal_zf.py new file mode 100644 index 00000000000..1531c26560d --- /dev/null +++ b/examples/ssd/ssd_pascal_zf.py @@ -0,0 +1,580 @@ +''' +Before running this script, you should download the fully convolutional reduced (atrous) ZFNet at: + http://cs.unc.edu/~wliu/projects/SSD/ZF_conv_reduced.caffemodel +By default, we assume the model is stored in `$CAFFE_ROOT/models/ZFNet/` +''' +from __future__ import print_function +import caffe +from google.protobuf import text_format + +import math +import os +import shutil +import stat +import subprocess +import sys + +sys.path.insert(0, 'examples/ssd') +from model_libs import * + +# Add extra layers on top of a "base" network (e.g. VGGNet or Inception). +def AddExtraLayers(net, use_batchnorm=True, lr_mult=1): + use_relu = True + + # Add additional convolutional layers. + # 19 x 19 + from_layer = net.keys()[-1] + + # TODO(weiliu89): Construct the name using the last layer to avoid duplication. + # 10 x 10 + out_layer = "conv6_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv6_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2, + lr_mult=lr_mult) + + # 5 x 5 + from_layer = out_layer + out_layer = "conv7_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv7_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2, + lr_mult=lr_mult) + + # 3 x 3 + from_layer = out_layer + out_layer = "conv8_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv8_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + # 1 x 1 + from_layer = out_layer + out_layer = "conv9_1" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1, + lr_mult=lr_mult) + + from_layer = out_layer + out_layer = "conv9_2" + ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1, + lr_mult=lr_mult) + + return net + + +### Modify the following parameters accordingly ### +# The directory which contains the caffe code. +# We assume you are running the script at the CAFFE_ROOT. +caffe_root = os.getcwd() + +# Set true if you want to start training right after generating all files. +run_soon = True +# Set true if you want to load from most recently saved snapshot. +# Otherwise, we will load from the pretrain_model defined below. +resume_training = True +# If true, Remove old model files. +remove_old_models = False + +# The database file for training data. Created by data/VOC0712/create_data.sh +train_data = "examples/VOC0712/VOC0712_trainval_lmdb" +# The database file for testing data. Created by data/VOC0712/create_data.sh +test_data = "examples/VOC0712/VOC0712_test_lmdb" +# Specify the batch sampler. +resize_width = 300 +resize_height = 300 +resize = "{}x{}".format(resize_width, resize_height) +batch_sampler = [ + { + 'sampler': { + }, + 'max_trials': 1, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.1, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.3, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.5, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.7, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'min_jaccard_overlap': 0.9, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + { + 'sampler': { + 'min_scale': 0.3, + 'max_scale': 1.0, + 'min_aspect_ratio': 0.5, + 'max_aspect_ratio': 2.0, + }, + 'sample_constraint': { + 'max_jaccard_overlap': 1.0, + }, + 'max_trials': 50, + 'max_sample': 1, + }, + ] +train_transform_param = { + 'mirror': True, + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [ + P.Resize.LINEAR, + P.Resize.AREA, + P.Resize.NEAREST, + P.Resize.CUBIC, + P.Resize.LANCZOS4, + ], + }, + 'distort_param': { + 'brightness_prob': 0.5, + 'brightness_delta': 32, + 'contrast_prob': 0.5, + 'contrast_lower': 0.5, + 'contrast_upper': 1.5, + 'hue_prob': 0.5, + 'hue_delta': 18, + 'saturation_prob': 0.5, + 'saturation_lower': 0.5, + 'saturation_upper': 1.5, + 'random_order_prob': 0.0, + }, + 'expand_param': { + 'prob': 0.5, + 'max_expand_ratio': 4.0, + }, + 'emit_constraint': { + 'emit_type': caffe_pb2.EmitConstraint.CENTER, + } + } +test_transform_param = { + 'mean_value': [104, 117, 123], + 'resize_param': { + 'prob': 1, + 'resize_mode': P.Resize.WARP, + 'height': resize_height, + 'width': resize_width, + 'interp_mode': [P.Resize.LINEAR], + }, + } + +# If true, use batch norm for all newly added layers. +# Currently only the non batch norm version has been tested. +use_batchnorm = False +lr_mult = 1 +# Use different initial learning rate. +if use_batchnorm: + base_lr = 0.0004 +else: + # A learning rate for batch_size = 1, num_gpus = 1. + base_lr = 0.00004 + +# Modify the job name if you want. +job_name = "SSD_{}".format(resize) +# The name of the model. Modify it if you want. +model_name = "ZF_VOC0712_{}".format(job_name) + +# Directory which stores the model .prototxt file. +save_dir = "models/ZFNet/VOC0712/{}".format(job_name) +# Directory which stores the snapshot of models. +snapshot_dir = "models/ZFNet/VOC0712/{}".format(job_name) +# Directory which stores the job script and log file. +job_dir = "jobs/ZFNet/VOC0712/{}".format(job_name) +# Directory which stores the detection results. +output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}/Main".format(os.environ['HOME'], job_name) + +# model definition files. +train_net_file = "{}/train.prototxt".format(save_dir) +test_net_file = "{}/test.prototxt".format(save_dir) +deploy_net_file = "{}/deploy.prototxt".format(save_dir) +solver_file = "{}/solver.prototxt".format(save_dir) +# snapshot prefix. +snapshot_prefix = "{}/{}".format(snapshot_dir, model_name) +# job script path. +job_file = "{}/{}.sh".format(job_dir, model_name) + +# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh +name_size_file = "data/VOC0712/test_name_size.txt" +# The pretrained model. We use the Fully convolutional reduced (atrous) ZFNet. +pretrain_model = "models/ZFNet/ZF_conv_reduced.caffemodel" +# Stores LabelMapItem. +label_map_file = "data/VOC0712/labelmap_voc.prototxt" + +# MultiBoxLoss parameters. +num_classes = 21 +share_location = True +background_label_id=0 +train_on_diff_gt = True +normalization_mode = P.Loss.VALID +code_type = P.PriorBox.CENTER_SIZE +ignore_cross_boundary_bbox = False +mining_type = P.MultiBoxLoss.MAX_NEGATIVE +neg_pos_ratio = 3. +loc_weight = (neg_pos_ratio + 1.) / 4. +multibox_loss_param = { + 'loc_loss_type': P.MultiBoxLoss.SMOOTH_L1, + 'conf_loss_type': P.MultiBoxLoss.SOFTMAX, + 'loc_weight': loc_weight, + 'num_classes': num_classes, + 'share_location': share_location, + 'match_type': P.MultiBoxLoss.PER_PREDICTION, + 'overlap_threshold': 0.5, + 'use_prior_for_matching': True, + 'background_label_id': background_label_id, + 'use_difficult_gt': train_on_diff_gt, + 'mining_type': mining_type, + 'neg_pos_ratio': neg_pos_ratio, + 'neg_overlap': 0.5, + 'code_type': code_type, + 'ignore_cross_boundary_bbox': ignore_cross_boundary_bbox, + } +loss_param = { + 'normalization': normalization_mode, + } + +# parameters for generating priors. +# minimum dimension of input image +min_dim = 300 +# conv2 ==> 38 x 38 +# fc7 ==> 19 x 19 +# conv6_2 ==> 10 x 10 +# conv7_2 ==> 5 x 5 +# conv8_2 ==> 3 x 3 +# conv9_2 ==> 1 x 1 +mbox_source_layers = ['conv2', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] +# in percent % +min_ratio = 20 +max_ratio = 90 +step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2))) +min_sizes = [] +max_sizes = [] +for ratio in xrange(min_ratio, max_ratio + 1, step): + min_sizes.append(min_dim * ratio / 100.) + max_sizes.append(min_dim * (ratio + step) / 100.) +min_sizes = [min_dim * 10 / 100.] + min_sizes +max_sizes = [min_dim * 20 / 100.] + max_sizes +steps = [8, 16, 32, 64, 100, 300] +aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] +# L2 normalize conv2. +normalizations = [20, -1, -1, -1, -1, -1] +# variance used to encode/decode prior bboxes. +if code_type == P.PriorBox.CENTER_SIZE: + prior_variance = [0.1, 0.1, 0.2, 0.2] +else: + prior_variance = [0.1] +flip = True +clip = False + +# Solver parameters. +# Defining which GPUs to use. +gpus = "0,1,2,3" +gpulist = gpus.split(",") +num_gpus = len(gpulist) + +# Divide the mini-batch to different GPUs. +batch_size = 32 +accum_batch_size = 32 +iter_size = accum_batch_size / batch_size +solver_mode = P.Solver.CPU +device_id = 0 +batch_size_per_device = batch_size +if num_gpus > 0: + batch_size_per_device = int(math.ceil(float(batch_size) / num_gpus)) + iter_size = int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus))) + solver_mode = P.Solver.GPU + device_id = int(gpulist[0]) + +if normalization_mode == P.Loss.NONE: + base_lr /= batch_size_per_device +elif normalization_mode == P.Loss.VALID: + base_lr *= 25. / loc_weight +elif normalization_mode == P.Loss.FULL: + # Roughly there are 2000 prior bboxes per image. + # TODO(weiliu89): Estimate the exact # of priors. + base_lr *= 2000. + +# Evaluate on whole test set. +num_test_image = 4952 +test_batch_size = 8 +# Ideally test_batch_size should be divisible by num_test_image, +# otherwise mAP will be slightly off the true value. +test_iter = int(math.ceil(float(num_test_image) / test_batch_size)) + +solver_param = { + # Train parameters + 'base_lr': base_lr, + 'weight_decay': 0.0005, + 'lr_policy': "multistep", + 'stepvalue': [80000, 100000, 120000], + 'gamma': 0.1, + 'momentum': 0.9, + 'iter_size': iter_size, + 'max_iter': 120000, + 'snapshot': 80000, + 'display': 10, + 'average_loss': 10, + 'type': "SGD", + 'solver_mode': solver_mode, + 'device_id': device_id, + 'debug_info': False, + 'snapshot_after_train': True, + # Test parameters + 'test_iter': [test_iter], + 'test_interval': 10000, + 'eval_type': "detection", + 'ap_version': "11point", + 'test_initialization': False, + } + +# parameters for generating detection output. +det_out_param = { + 'num_classes': num_classes, + 'share_location': share_location, + 'background_label_id': background_label_id, + 'nms_param': {'nms_threshold': 0.45, 'top_k': 400}, + 'save_output_param': { + 'output_directory': output_result_dir, + 'output_name_prefix': "comp4_det_test_", + 'output_format': "VOC", + 'label_map_file': label_map_file, + 'name_size_file': name_size_file, + 'num_test_image': num_test_image, + }, + 'keep_top_k': 200, + 'confidence_threshold': 0.01, + 'code_type': code_type, + } + +# parameters for evaluating detection results. +det_eval_param = { + 'num_classes': num_classes, + 'background_label_id': background_label_id, + 'overlap_threshold': 0.5, + 'evaluate_difficult_gt': False, + 'name_size_file': name_size_file, + } + +### Hopefully you don't need to change the following ### +# Check file. +check_if_exist(train_data) +check_if_exist(test_data) +check_if_exist(label_map_file) +check_if_exist(pretrain_model) +make_if_not_exist(save_dir) +make_if_not_exist(job_dir) +make_if_not_exist(snapshot_dir) + +# Create train net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(train_data, batch_size=batch_size_per_device, + train=True, output_label=True, label_map_file=label_map_file, + transform_param=train_transform_param, batch_sampler=batch_sampler) + +ZFNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +# Create the MultiBoxLossLayer. +name = "mbox_loss" +mbox_layers.append(net.label) +net[name] = L.MultiBoxLoss(*mbox_layers, multibox_loss_param=multibox_loss_param, + loss_param=loss_param, include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), + propagate_down=[True, True, False, False]) + +with open(train_net_file, 'w') as f: + print('name: "{}_train"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(train_net_file, job_dir) + +# Create test net. +net = caffe.NetSpec() +net.data, net.label = CreateAnnotatedDataLayer(test_data, batch_size=test_batch_size, + train=False, output_label=True, label_map_file=label_map_file, + transform_param=test_transform_param) + +ZFNetBody(net, from_layer='data', fully_conv=True, reduced=True, dilated=True, + dropout=False) + +AddExtraLayers(net, use_batchnorm, lr_mult=lr_mult) + +mbox_layers = CreateMultiBoxHead(net, data_layer='data', from_layers=mbox_source_layers, + use_batchnorm=use_batchnorm, min_sizes=min_sizes, max_sizes=max_sizes, + aspect_ratios=aspect_ratios, steps=steps, normalizations=normalizations, + num_classes=num_classes, share_location=share_location, flip=flip, clip=clip, + prior_variance=prior_variance, kernel_size=3, pad=1, lr_mult=lr_mult) + +conf_name = "mbox_conf" +if multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.SOFTMAX: + reshape_name = "{}_reshape".format(conf_name) + net[reshape_name] = L.Reshape(net[conf_name], shape=dict(dim=[0, -1, num_classes])) + softmax_name = "{}_softmax".format(conf_name) + net[softmax_name] = L.Softmax(net[reshape_name], axis=2) + flatten_name = "{}_flatten".format(conf_name) + net[flatten_name] = L.Flatten(net[softmax_name], axis=1) + mbox_layers[1] = net[flatten_name] +elif multibox_loss_param["conf_loss_type"] == P.MultiBoxLoss.LOGISTIC: + sigmoid_name = "{}_sigmoid".format(conf_name) + net[sigmoid_name] = L.Sigmoid(net[conf_name]) + mbox_layers[1] = net[sigmoid_name] + +net.detection_out = L.DetectionOutput(*mbox_layers, + detection_output_param=det_out_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) +net.detection_eval = L.DetectionEvaluate(net.detection_out, net.label, + detection_evaluate_param=det_eval_param, + include=dict(phase=caffe_pb2.Phase.Value('TEST'))) + +with open(test_net_file, 'w') as f: + print('name: "{}_test"'.format(model_name), file=f) + print(net.to_proto(), file=f) +shutil.copy(test_net_file, job_dir) + +# Create deploy net. +# Remove the first and last layer from test net. +deploy_net = net +with open(deploy_net_file, 'w') as f: + net_param = deploy_net.to_proto() + # Remove the first (AnnotatedData) and last (DetectionEvaluate) layer from test net. + del net_param.layer[0] + del net_param.layer[-1] + net_param.name = '{}_deploy'.format(model_name) + net_param.input.extend(['data']) + net_param.input_shape.extend([ + caffe_pb2.BlobShape(dim=[1, 3, resize_height, resize_width])]) + print(net_param, file=f) +shutil.copy(deploy_net_file, job_dir) + +# Create solver. +solver = caffe_pb2.SolverParameter( + train_net=train_net_file, + test_net=[test_net_file], + snapshot_prefix=snapshot_prefix, + **solver_param) + +with open(solver_file, 'w') as f: + print(solver, file=f) +shutil.copy(solver_file, job_dir) + +max_iter = 0 +# Find most recent snapshot. +for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if iter > max_iter: + max_iter = iter + +train_src_param = '--weights="{}" \\\n'.format(pretrain_model) +if resume_training: + if max_iter > 0: + train_src_param = '--snapshot="{}_iter_{}.solverstate" \\\n'.format(snapshot_prefix, max_iter) + +if remove_old_models: + # Remove any snapshots smaller than max_iter. + for file in os.listdir(snapshot_dir): + if file.endswith(".solverstate"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + if file.endswith(".caffemodel"): + basename = os.path.splitext(file)[0] + iter = int(basename.split("{}_iter_".format(model_name))[1]) + if max_iter > iter: + os.remove("{}/{}".format(snapshot_dir, file)) + +# Create job file. +with open(job_file, 'w') as f: + f.write('cd {}\n'.format(caffe_root)) + f.write('./build/tools/caffe train \\\n') + f.write('--solver="{}" \\\n'.format(solver_file)) + f.write(train_src_param) + if solver_param['solver_mode'] == P.Solver.GPU: + f.write('--gpu {} 2>&1 | tee {}/{}.log\n'.format(gpus, job_dir, model_name)) + else: + f.write('2>&1 | tee {}/{}.log\n'.format(job_dir, model_name)) + +# Copy the python script to job_dir. +py_file = os.path.abspath(__file__) +shutil.copy(py_file, job_dir) + +# Run the job. +os.chmod(job_file, stat.S_IRWXU) +if run_soon: + subprocess.call(job_file, shell=True) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 36c497c0fa9..ea576f7193d 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -350,6 +350,9 @@ class Caffe { static curandGenerator_t curand_generator() { return Get().curand_generator_; } + static cudaStream_t curand_stream() { + return Get().curand_stream_->get(); + } static shared_ptr short_term_cublas_phandle() { return make_shared(); } @@ -432,10 +435,11 @@ class Caffe { static void set_restored_iter(int val); static void set_gpus(const std::vector& gpus) { - props().gpus_ = gpus; + std::lock_guard lock(caffe_mutex_); + gpus_ = gpus; } static const std::vector& gpus() { - return props().gpus_; + return gpus_; } static const std::string& caffe_version() { return props().caffe_version(); @@ -505,9 +509,10 @@ class Caffe { // Default device chosen by a user and associated with the main thread. // For example, if user runs `caffe train -gpu=1,0,3` then it has to be set to 1. + static int root_device_; static Brew mode_; static int solver_count_; - static int root_device_; + static std::vector gpus_; static int thread_count_; static int restored_iter_; static std::atomic root_seed_; @@ -526,10 +531,14 @@ class Caffe { DISABLE_COPY_MOVE_AND_ASSIGN(Caffe); + public: // Caffe Properties singleton class Properties { friend class Caffe; + public: + Properties(); + const std::string& caffe_version() const { return caffe_version_; } @@ -560,7 +569,6 @@ class Caffe { } private: - std::vector gpus_; std::time_t init_time_; std::uint32_t main_thread_id_; std::string caffe_version_; @@ -570,15 +578,10 @@ class Caffe { std::string cuda_driver_version_; std::vector compute_capabilities_; - Properties(); DISABLE_COPY_MOVE_AND_ASSIGN(Properties); }; - static Properties props_; - - static Properties& props() { - return props_; - } + static Properties& props(); }; // Yet another Event implementation diff --git a/include/caffe/data_reader.hpp b/include/caffe/data_reader.hpp index 0887315dea6..9c2fccc48a4 100644 --- a/include/caffe/data_reader.hpp +++ b/include/caffe/data_reader.hpp @@ -23,6 +23,7 @@ namespace caffe { * to allow deterministic ordering down the road. Data is distributed to solvers * in a round-robin way to keep parallel training deterministic. */ +template class DataReader : public InternalThread { private: class CursorManager { @@ -43,8 +44,8 @@ class DataReader : public InternalThread { size_t solver_rank, size_t parser_threads, size_t parser_thread_id, size_t batch_size_, bool cache, bool shuffle, bool epoch_count_required); ~CursorManager(); - void next(shared_ptr& datum); - void fetch(Datum* datum); + void next(shared_ptr& datum); + void fetch(DatumType* datum); void rewind(); size_t full_cycle() const { @@ -66,8 +67,8 @@ class DataReader : public InternalThread { return data_cache_inst_.get(); } - shared_ptr& next_new(); - shared_ptr& next_cached(DataReader& reader); + shared_ptr& next_new(); + shared_ptr& next_cached(DataReader& reader); bool check_memory(); void check_db(const std::string& db_source) { std::lock_guard lock(cache_mutex_); @@ -92,7 +93,7 @@ class DataReader : public InternalThread { just_cached_(false) {} std::string db_source_; - vector> cache_buffer_; + vector> cache_buffer_; size_t cache_idx_; boost::barrier cache_bar_; bool shuffle_; @@ -120,37 +121,37 @@ class DataReader : public InternalThread { start_reading_flag_.set(); } - void free_push(size_t queue_id, const shared_ptr& datum) { + void free_push(size_t queue_id, const shared_ptr& datum) { if (!sample_only_) { free_[queue_id]->push(datum); } } - shared_ptr free_pop(size_t queue_id) { + shared_ptr free_pop(size_t queue_id) { return free_[queue_id]->pop(); } - shared_ptr sample() { + shared_ptr sample() { return init_->peek(); } - void full_push(size_t queue_id, const shared_ptr& datum) { + void full_push(size_t queue_id, const shared_ptr& datum) { full_[queue_id]->push(datum); } - shared_ptr full_peek(size_t queue_id) { + shared_ptr full_peek(size_t queue_id) { return full_[queue_id]->peek(); } - shared_ptr full_pop(size_t queue_id, const char* log_on_wait) { + shared_ptr full_pop(size_t queue_id, const char* log_on_wait) { return full_[queue_id]->pop(log_on_wait); } - shared_ptr& next_new() { + shared_ptr& next_new() { return data_cache_->next_new(); } - shared_ptr& next_cached() { + shared_ptr& next_cached() { return data_cache_->next_cached(*this); } @@ -174,9 +175,9 @@ class DataReader : public InternalThread { const bool skip_one_batch_; DataParameter_DB backend_; - shared_ptr>> init_; - vector>>> free_; - vector>>> full_; + shared_ptr>> init_; + vector>>> free_; + vector>>> full_; private: int current_rec_; @@ -192,6 +193,10 @@ class DataReader : public InternalThread { DISABLE_COPY_MOVE_AND_ASSIGN(DataReader); }; +template +unique_ptr::DataCache> + DataReader::DataCache::data_cache_inst_; + } // namespace caffe #endif // CAFFE_DATA_READER_HPP_ diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 3d2658d7af2..853a1f281c8 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -11,24 +11,31 @@ #include "caffe/util/blocking_queue.hpp" #include "caffe/util/io.hpp" +#include "google/protobuf/repeated_field.h" +using google::protobuf::RepeatedPtrField; + namespace caffe { /** * @brief Applies common transformations to the input data, such as - * scaling, mirroring, substracting the image mean... + * scaling, mirroring, subtracting the image mean... */ +template class DataTransformer { public: DataTransformer(const TransformationParameter& param, Phase phase); ~DataTransformer() = default; + const TransformationParameter& transform_param() const { + return param_; + } + /** * @brief Initialize the Random number generations if needed by the * transformation. */ void InitRand(); - template void TransformGPU(int N, int C, int H, int W, size_t sizeof_element, const void* in, Dtype* out, const unsigned int* rands, bool signed_data); @@ -45,42 +52,8 @@ class DataTransformer { * shape. If nullptr passed then only shape vector is computed. * @return Output shape */ - template vector Transform(const Datum* datum, Dtype* buf, size_t buf_len, - Packing& out_packing, bool repack = true) { - vector shape; - const bool shape_only = buf == nullptr; - CHECK(!(param_.force_color() && param_.force_gray())) - << "cannot set both force_color and force_gray"; - const int color_mode = param_.force_color() ? 1 : (param_.force_gray() ? -1 : 0); - cv::Mat img; - bool v1_path = false; - if (datum->encoded()) { - shape = DecodeDatumToCVMat(*datum, color_mode, img, shape_only, false); - out_packing = NHWC; - } else { - if (image_random_resize_enabled() || buf == nullptr || buf_len == 0UL) { - shape = DatumToCVMat(*datum, img, shape_only); - out_packing = NHWC; - } else { - // here we can use fast V1 path - TransformV1(*datum, buf, buf_len); - shape = vector{1, datum->channels(), datum->height(), datum->width()}; - v1_path = true; - out_packing = NCHW; - } - } - if (param_.crop_size() > 0) { - shape[2] = param_.crop_size(); - shape[3] = param_.crop_size(); - } - if (!shape_only && !v1_path) { - CHECK_NOTNULL(img.data); - Transform(img, buf, buf_len, repack); - out_packing = NHWC; - } - return shape; - } + Packing& out_packing, bool repack = true); /** * @brief Applies transformations defined in the image data layer's @@ -94,96 +67,23 @@ class DataTransformer { * The destination array that will store transformed data of a fixed * shape. */ - template - void Transform(const cv::Mat& src, Dtype* buf, size_t buf_len, bool repack = true) { - cv::Mat tmp, dst; - - image_random_resize(src, tmp); - - if (image_random_crop_enabled()) { - image_random_crop(param_.crop_size(), param_.crop_size(), tmp); // TODO - } else if (image_center_crop_enabled()) { - image_center_crop(param_.crop_size(), param_.crop_size(), tmp); - } - apply_mean_scale_mirror(tmp, dst); - FloatCVMatToBuf(dst, buf_len, buf, repack); - } + void Transform(const cv::Mat& src, Dtype* buf, size_t buf_len, bool repack = true) const; - /** - * @brief Applies the transformation defined in the data layer's - * transform_param block to a vector of Mat. - * - * @param mat_vector - * A vector of Mat containing the data to be transformed. - * @param transformed_blob - * This is destination blob. It can be part of top blob's data if - * set_cpu_data() is used. See memory_layer.cpp for an example. - */ - template - void Transform(const vector& mat_vector, TBlob* transformed_blob) { - const size_t mat_num = mat_vector.size(); - const int num = transformed_blob->num(); - CHECK_GT(mat_num, 0) << "There is no MAT to add"; - CHECK_EQ(mat_num, num) << "The size of mat_vector must be equals to transformed_blob->num()"; - cv::Mat dst; - size_t buf_len = transformed_blob->offset(1); - for (size_t item_id = 0; item_id < mat_num; ++item_id) { - size_t offset = transformed_blob->offset(item_id); - apply_mean_scale_mirror(mat_vector[item_id], dst); - FloatCVMatToBuf(dst, buf_len, transformed_blob->mutable_cpu_data(false) + offset); - } - } + void Transform(const cv::Mat& img, TBlob *transformed_blob) const; - template - void Transform(const cv::Mat& img, TBlob *transformed_blob) { - const int crop_size = param_.crop_size(); - const int img_channels = img.channels(); - const int img_height = img.rows; - const int img_width = img.cols; - - // Check dimensions. - const int channels = transformed_blob->channels(); - const int height = transformed_blob->height(); - const int width = transformed_blob->width(); - const int num = transformed_blob->num(); - - CHECK_EQ(channels, img_channels); - CHECK_LE(height, img_height); - CHECK_LE(width, img_width); - CHECK_GE(num, 1); - // TODO - if (crop_size > 0) { - CHECK_EQ(crop_size, height); - CHECK_EQ(crop_size, width); - } - Transform(img, transformed_blob->mutable_cpu_data(false), transformed_blob->count()); - } + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to a vector of Mat. + * + * @param mat_vector + * A vector of Mat containing the data to be transformed. + * @param transformed_blob + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used. See memory_layer.cpp for an example. + */ + void Transform(const vector& mat_vector, TBlob* transformed_blob) const; - /** - * @brief Applies the transformation defined in the data layer's - * transform_param block to a vector of Datum. - * - * @param datum_vector - * A vector of Datum containing the data to be transformed. - * @param transformed_blob - * This is destination blob. It can be part of top blob's data if - * set_cpu_data() is used. See memory_layer.cpp for an example. - */ - template - void Transform(const vector& datum_vector, TBlob* transformed_blob) { - const size_t datum_num = datum_vector.size(); - const int num = transformed_blob->num(); - CHECK_GT(datum_num, 0) << "There is no datum to add"; - CHECK_LE(datum_num, num) - << "The size of datum_vector must be not greater than transformed_blob->num()"; - cv::Mat dst; - size_t buf_len = transformed_blob->offset(1); - for (size_t item_id = 0; item_id < datum_num; ++item_id) { - size_t offset = transformed_blob->offset(item_id); - DatumToCVMat(datum_vector[item_id], dst, false); - FloatCVMatToBuf(dst, buf_len, transformed_blob->mutable_cpu_data(false) + offset); - } - } + void Transform(const vector& datum_vector, TBlob *transformed_blob) const; /** * @brief Generates a random integer from Uniform({0, 1, ..., n-1}). @@ -199,173 +99,194 @@ class DataTransformer { } // tests only, TODO: clean - template - void Transform(Datum& datum, TBlob* transformed_blob) { + void Transform(const Datum& datum, TBlob* transformed_blob) const { cv::Mat img; DatumToCVMat(datum, img, false); Transform(img, transformed_blob); } - void VariableSizedTransforms(Datum* datum); void Fill3Randoms(unsigned int *rand) const; - protected: + void TransformInv(const Blob* blob, vector* cv_imgs); + void TransformInv(const Dtype* data, cv::Mat* cv_img, const int height, + const int width, const int channels); + + vector InferBlobShape(const cv::Mat& cv_img); + vector InferDatumShape(const Datum& datum); + vector InferCVMatShape(const cv::Mat& img); + + /** + * @brief Infers the shape of transformed_blob will have when + * the transformation is applied to the data. + * + * @param bottom_shape + * The shape of the data to be transformed. + */ + vector InferBlobShape(const vector& bottom_shape, bool use_gpu = false); + + /** + * @brief Infers the shape of transformed_blob will have when + * the transformation is applied to the data. + * + * @param datum + * Datum containing the data to be transformed. + */ + vector InferBlobShape(const Datum& datum); + + /** + * @brief Crops the datum according to bbox. + */ + + void CropImage(const Datum& datum, const NormalizedBBox& bbox, Datum* crop_datum); + + /** + * @brief Crops the datum and AnnotationGroup according to bbox. + */ + void CropImage(const AnnotatedDatum& anno_datum, const NormalizedBBox& bbox, + AnnotatedDatum* cropped_anno_datum); + + /** + * @brief Expand the datum. + */ + void ExpandImage(const Datum& datum, const float expand_ratio, + NormalizedBBox* expand_bbox, Datum* expanded_datum); + + /** + * @brief Expand the datum and adjust AnnotationGroup. + */ + void ExpandImage(const AnnotatedDatum& anno_datum, AnnotatedDatum* expanded_anno_datum); + + /** + * @brief Apply distortion to the datum. + */ + void DistortImage(const Datum& datum, Datum* distort_datum); + + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to the annotated data. + * + * @param anno_datum + * AnnotatedDatum containing the data and annotation to be transformed. + * @param transformed_blob + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used. See annotated_data_layer.cpp for an example. + * @param transformed_anno_vec + * This is destination annotation. + */ + void Transform(const AnnotatedDatum& anno_datum, + TBlob* transformed_blob, + RepeatedPtrField* transformed_anno_vec); + + void Transform(const AnnotatedDatum& anno_datum, + TBlob* transformed_blob, + RepeatedPtrField* transformed_anno_vec, + bool* do_mirror); + + void Transform(const AnnotatedDatum& anno_datum, + TBlob* transformed_blob, + vector* transformed_anno_vec, + bool* do_mirror); + + void Transform(const AnnotatedDatum& anno_datum, + TBlob* transformed_blob, + vector* transformed_anno_vec); + bool image_random_resize_enabled() const; - bool image_random_crop_enabled() const; bool image_center_crop_enabled() const; + bool image_random_crop_enabled() const; + void image_random_resize(const cv::Mat& src, cv::Mat& dst) const; + void image_center_crop(int crop_w, int crop_h, cv::Mat& img) const; + void image_random_crop(int crop_w, int crop_h, cv::Mat& img) const; - void apply_mean_scale_mirror(const cv::Mat& src, cv::Mat& dst); - void image_random_crop(int crop_w, int crop_h, cv::Mat& img); - - template - void TransformV1(const Datum& datum, Dtype* buf, size_t buf_len) { - const string& data = datum.data(); - const int datum_channels = datum.channels(); - const int datum_height = datum.height(); - const int datum_width = datum.width(); - - const int crop_size = param_.crop_size(); - const float scale = param_.scale(); - const bool do_mirror = param_.mirror() && (Rand() % 2); - const bool has_mean_file = param_.has_mean_file(); - const bool has_uint8 = data.size() > 0; - const bool has_mean_values = mean_values_.size() > 0; - - CHECK_GT(datum_channels, 0); - CHECK_GE(datum_height, crop_size); - CHECK_GE(datum_width, crop_size); - - const float* mean = NULL; - if (has_mean_file) { - CHECK_EQ(datum_channels, data_mean_.channels()); - CHECK_EQ(datum_height, data_mean_.height()); - CHECK_EQ(datum_width, data_mean_.width()); - mean = data_mean_.cpu_data(); - } - if (has_mean_values) { - CHECK(mean_values_.size() == 1 || mean_values_.size() == datum_channels) - << "Specify either 1 mean_value or as many as channels: " << datum_channels; - if (datum_channels > 1 && mean_values_.size() == 1) { - // Replicate the mean_value for simplicity - for (int c = 1; c < datum_channels; ++c) { - mean_values_.push_back(mean_values_[0]); - } - } - } - - int height = datum_height; - int width = datum_width; - - int h_off = 0; - int w_off = 0; - if (crop_size) { - height = crop_size; - width = crop_size; - // We only do random crop when we do training. - if (phase_ == TRAIN) { - h_off = Rand() % (datum_height - crop_size + 1); - w_off = Rand() % (datum_width - crop_size + 1); - } else { - h_off = (datum_height - crop_size) / 2; - w_off = (datum_width - crop_size) / 2; - } - } - - int top_index, data_index, ch, cdho; - const int m = do_mirror ? -1 : 1; - - if (has_uint8) { - float datum_element, mnv; - - if (scale == 1.F) { - for (int c = 0; c < datum_channels; ++c) { - cdho = c * datum_height + h_off; - ch = c * height; - mnv = has_mean_values && !has_mean_file ? mean_values_[c] : 0.F; - for (int h = 0; h < height; ++h) { - top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; - data_index = (cdho + h) * datum_width + w_off; - for (int w = 0; w < width; ++w) { - datum_element = static_cast(data[data_index]); - if (has_mean_file) { - buf[top_index] = datum_element - mean[data_index]; - } else { - if (has_mean_values) { - buf[top_index] = datum_element - mnv; - } else { - buf[top_index] = datum_element; - } - } - ++data_index; - top_index += m; - } - } - } - } else { - for (int c = 0; c < datum_channels; ++c) { - cdho = c * datum_height + h_off; - ch = c * height; - mnv = has_mean_values && !has_mean_file ? mean_values_[c] : 0.F; - for (int h = 0; h < height; ++h) { - top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; - data_index = (cdho + h) * datum_width + w_off; - for (int w = 0; w < width; ++w) { - datum_element = static_cast(data[data_index]); - if (has_mean_file) { - buf[top_index] = (datum_element - mean[data_index]) * scale; - } else { - if (has_mean_values) { - buf[top_index] = (datum_element - mnv) * scale; - } else { - buf[top_index] = datum_element * scale; - } - } - ++data_index; - top_index += m; - } - } - } - } - } else { - float datum_element; - for (int c = 0; c < datum_channels; ++c) { - cdho = c * datum_height + h_off; - ch = c * height; - for (int h = 0; h < height; ++h) { - top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; - data_index = (cdho + h) * datum_width + w_off; - for (int w = 0; w < width; ++w) { - datum_element = datum.float_data(data_index); - if (has_mean_file) { - buf[top_index] = (datum_element - mean[data_index]) * scale; - } else { - if (has_mean_values) { - buf[top_index] = (datum_element - mean_values_[c]) * scale; - } else { - buf[top_index] = datum_element * scale; - } - } - ++data_index; - top_index += m; - } - } - } - } - } + protected: + void apply_mean_scale_mirror(const cv::Mat& src, cv::Mat& dst) const; + + void TransformV1(const Datum& datum, Dtype* buf, size_t buf_len); - void image_random_resize(const cv::Mat& src, cv::Mat& dst); - static void image_center_crop(int crop_w, int crop_h, cv::Mat& img); unsigned int Rand() const; float Rand(float lo, float up) const; + void Copy(const Datum& datum, Dtype* data, size_t& out_sizeof_element); + void Copy(const cv::Mat& datum, Dtype* data); + + /** + * @brief Transform the annotation according to the transformation applied + * to the datum. + * + * @param anno_datum + * AnnotatedDatum containing the data and annotation to be transformed. + * @param do_resize + * If true, resize the annotation accordingly before crop. + * @param crop_bbox + * The cropped region applied to anno_datum.datum() + * @param do_mirror + * If true, meaning the datum has mirrored. + * @param transformed_anno_group_all + * Stores all transformed AnnotationGroup. + */ + void TransformAnnotation( + const AnnotatedDatum& anno_datum, const bool do_resize, + const NormalizedBBox& crop_bbox, const bool do_mirror, + RepeatedPtrField* transformed_anno_group_all); + + + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to a cv::Mat + * + * @param cv_img + * cv::Mat containing the data to be transformed. + * @param transformed_blob + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used. See image_data_layer.cpp for an example. + */ + void Transform(const cv::Mat& cv_img, TBlob* transformed_blob, + NormalizedBBox* crop_bbox, bool* do_mirror); + + /** + * @brief Crops img according to bbox. + */ + void CropImage(const cv::Mat& img, const NormalizedBBox& bbox, cv::Mat* crop_img); + + /** + * @brief Expand img to include mean value as background. + */ + void ExpandImage(const cv::Mat& img, const float expand_ratio, + NormalizedBBox* expand_bbox, cv::Mat* expand_img); + + /** + * @brief Infers the shape of transformed_blob will have when + * the transformation is applied to the data. + * It uses the first element to infer the shape of the blob. + * + * @param datum_vector + * A vector of Datum containing the data to be transformed. + */ + vector InferBlobShape(const vector & datum_vector); + + void Transform(const Datum& datum, + Dtype *transformed_data, const std::array& rand); + + protected: + // Transform and return the transformation information. + void Transform(const Datum& datum, Dtype* transformed_data, + NormalizedBBox* crop_bbox, bool* do_mirror); + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to the data and return transform information. + */ + void Transform(const Datum& datum, TBlob* transformed_blob, + NormalizedBBox* crop_bbox, bool* do_mirror); + // Tranformation parameters TransformationParameter param_; shared_ptr rng_; Phase phase_; TBlob data_mean_; vector mean_values_; - cv::Mat mean_mat_orig_, mean_mat_; - cv::Mat tmp_; + cv::Mat mean_mat_orig_; + mutable cv::Mat mean_mat_; + mutable cv::Mat tmp_; const float rand_resize_ratio_lower_, rand_resize_ratio_upper_; const float vertical_stretch_lower_; diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 6b1bf079b86..ca71ec08051 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -137,7 +137,7 @@ class LayerBase { // Iteration counter maintained by Solver int iter() const; - int relative_iter() const; + int parent_rank() const; Net* parent_net() { return parent_net_; @@ -567,16 +567,11 @@ inline float Layer::Forward(const vector& bottom, const vec for (int top_id = 0; top_id < top.size(); ++top_id) { if (this->loss(top_id) == 0.F) { continue; } const int count = top[top_id]->count(); - if (count < 16 && is_precise()) { - loss += caffe_cpu_dot(count, top[top_id]->cpu_data(), - top[top_id]->cpu_diff()); - } else { - const Ftype* data = top[top_id]->gpu_data(); - const Ftype* loss_weights = top[top_id]->gpu_diff(); - float blob_loss = 0.F; - caffe_gpu_dot(count, data, loss_weights, &blob_loss); - loss += blob_loss; - } + const Ftype* data = top[top_id]->gpu_data(); + const Ftype* loss_weights = top[top_id]->gpu_diff(); + float blob_loss = 0.F; + caffe_gpu_dot(count, data, loss_weights, &blob_loss); + loss += blob_loss; } break; default: diff --git a/include/caffe/layers/accuracy_layer.hpp b/include/caffe/layers/accuracy_layer.hpp index 4b2009fedaa..08990f4e297 100644 --- a/include/caffe/layers/accuracy_layer.hpp +++ b/include/caffe/layers/accuracy_layer.hpp @@ -28,17 +28,16 @@ class AccuracyLayer : public Layer { */ explicit AccuracyLayer(const LayerParameter& param) : Layer(param) {} - virtual void LayerSetUp(const vector& bottom, - const vector& top); - virtual void Reshape(const vector& bottom, - const vector& top); + void LayerSetUp(const vector& bottom, const vector& top) override; + void Reshape(const vector& bottom, const vector& top) override; - virtual inline const char* type() const { return "Accuracy"; } - virtual inline int ExactNumBottomBlobs() const { return 2; } + inline const char* type() const override { return "Accuracy"; } + inline int ExactNumBottomBlobs() const override { return 2; } // If there are two top blobs, then the second blob will contain // accuracies per class. - virtual inline int MinTopBlobs() const { return 1; } + inline int MinTopBlobs() const override { return 1; } + inline int MaxTopBlobs() const override { return 2; } protected: /** @@ -65,16 +64,18 @@ class AccuracyLayer : public Layer { * \end{array} \right. * @f$ */ - virtual void Forward_cpu(const vector& bottom, - const vector& top); + void Forward_cpu(const vector& bottom, const vector& top) override; + void Forward_gpu(const vector& bottom, const vector& top) override; /// @brief Not implemented -- AccuracyLayer cannot be used as a loss. - virtual void Backward_cpu(const vector& top, - const vector& propagate_down, const vector& bottom) { + void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) override { for (int i = 0; i < propagate_down.size(); ++i) { if (propagate_down[i]) { NOT_IMPLEMENTED; } } } + void Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) override; int label_axis_, outer_num_, inner_num_; int top_k_; diff --git a/include/caffe/layers/annotated_data_layer.hpp b/include/caffe/layers/annotated_data_layer.hpp new file mode 100644 index 00000000000..bdaf95b638d --- /dev/null +++ b/include/caffe/layers/annotated_data_layer.hpp @@ -0,0 +1,51 @@ +#ifndef CAFFE_ANNOTATED_DATA_LAYER_HPP_ +#define CAFFE_ANNOTATED_DATA_LAYER_HPP_ + +#include +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/data_reader.hpp" +#include "caffe/data_transformer.hpp" +#include "caffe/internal_thread.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/data_layer.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" + +namespace caffe { + +template +class AnnotatedDataLayer : public DataLayer { + public: + AnnotatedDataLayer(const LayerParameter& param, size_t solver_rank); + void DataLayerSetUp(const vector& bottom, const vector& top) override; + + const char* type() const override { + return "AnnotatedData"; + } + int ExactNumBottomBlobs() const override { + return 0; + } + int MinTopBlobs() const override { + return 1; + } + + protected: + void load_batch(Batch* batch, int thread_id, size_t queue_id) override; + void start_reading() override { + areader_->start_reading(); + } + + std::shared_ptr> sample_areader_, areader_; + bool has_anno_type_; + AnnotatedDatum_AnnotationType anno_type_; + vector batch_samplers_; + string label_map_file_; +}; + +} // namespace caffe + +#endif // CAFFE_DATA_LAYER_HPP_ diff --git a/include/caffe/layers/base_data_layer.hpp b/include/caffe/layers/base_data_layer.hpp index 77053042be2..a25b52956d0 100644 --- a/include/caffe/layers/base_data_layer.hpp +++ b/include/caffe/layers/base_data_layer.hpp @@ -61,8 +61,11 @@ class BasePrefetchingDataLayer : public BaseDataLayer, public Inte void Forward_cpu(const vector& bottom, const vector& top) override; void Forward_gpu(const vector& bottom, const vector& top) override; - DataTransformer* dt(int id) { - return data_transformers_.at(id).get(); + DataTransformer* bdt(int id) { + return bwd_data_transformers_.at(id).get(); + } + DataTransformer* fdt(int id) { + return fwd_data_transformers_.at(id).get(); } bool is_gpu_transform() const override { @@ -110,18 +113,23 @@ class BasePrefetchingDataLayer : public BaseDataLayer, public Inte static bool auto_mode(const LayerParameter& param); std::vector batch_ids_; - const bool auto_mode_; + bool auto_mode_; size_t parsers_num_, transf_num_, queues_num_; // These two are for delayed init only std::vector bottom_init_; std::vector top_init_; - vector> data_transformers_; + // Use Btype as a transformer type (i.e. better float 32) + // since data layers don't have bottom channels + std::vector>> bwd_data_transformers_; + // TransformGPU may do this in-place + std::vector>> fwd_data_transformers_; - boost::shared_ptr> batch_transformer_; + shared_ptr> batch_transformer_; std::vector last_shape_; int batch_size_; + Flag iter0_; }; } // namespace caffe diff --git a/include/caffe/layers/cudnn_conv_layer.hpp b/include/caffe/layers/cudnn_conv_layer.hpp index 048ee558e60..2a79e127f99 100644 --- a/include/caffe/layers/cudnn_conv_layer.hpp +++ b/include/caffe/layers/cudnn_conv_layer.hpp @@ -43,11 +43,9 @@ class CuDNNConvolutionLayer : public ConvolutionLayer { static constexpr int ATTEMPTS_TO_RESERVE_WS = 3; static std::mutex m_; - static ThreadSafeMap> ws_allocated_; static ThreadSafeMap> train_mem_req_all_grps_; static ThreadSafeMap> test_mem_req_all_grps_; static ThreadSafeMap> train_tmp_weights_mem_; - static ThreadSafeMap> ws_released_; public: explicit CuDNNConvolutionLayer(const LayerParameter& param) @@ -167,14 +165,14 @@ constexpr int CuDNNConvolutionLayer::ATTEMPTS_TO_RESERVE_WS; template std::mutex CuDNNConvolutionLayer::m_; -template -ThreadSafeMap> -CuDNNConvolutionLayer::ws_allocated_( - CuDNNConvolutionLayer::m_); -template -ThreadSafeMap> -CuDNNConvolutionLayer::ws_released_( - CuDNNConvolutionLayer::m_); +//template +//ThreadSafeMap> +//CuDNNConvolutionLayer::ws_allocated_( +// CuDNNConvolutionLayer::m_); +//template +//ThreadSafeMap> +//CuDNNConvolutionLayer::ws_released_( +// CuDNNConvolutionLayer::m_); template ThreadSafeMap> CuDNNConvolutionLayer::train_mem_req_all_grps_( diff --git a/include/caffe/layers/cudnn_deconv_layer.hpp b/include/caffe/layers/cudnn_deconv_layer.hpp new file mode 100644 index 00000000000..9abdcd589ef --- /dev/null +++ b/include/caffe/layers/cudnn_deconv_layer.hpp @@ -0,0 +1,69 @@ +#ifndef CAFFE_CUDNN_DECONV_LAYER_HPP_ +#define CAFFE_CUDNN_DECONV_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/layers/deconv_layer.hpp" + +namespace caffe { + +#ifdef USE_CUDNN +/* + * @brief cuDNN implementation of DeConvolutionLayer. + * Fallback to DeConvolutionLayer for CPU mode. + * + * cuDNN accelerates deconvolution through forward kernels for filtering and + * bias plus backward kernels for the gradient w.r.t. the filters, biases, and + * inputs. Caffe + cuDNN further speeds up the computation through forward + * parallelism across groups and backward parallelism across gradients. +*/ +template +class CuDNNDeconvolutionLayer : public DeconvolutionLayer { + public: + explicit CuDNNDeconvolutionLayer(const LayerParameter& param) + : DeconvolutionLayer(param), + handles_setup_(false), + forward_math_(tpmax()), + backward_data_math_(tpmax()), + backward_filter_math_(tpmax()) {} + virtual ~CuDNNDeconvolutionLayer(); + void LayerSetUp(const vector& bottom, const vector& top) override; + void Reshape(const vector& bottom, const vector& top) override; + + protected: + void Forward_gpu(const vector& bottom, const vector& top) override; + void Backward_gpu(const vector& top, const vector& propagate_down, + const vector& bottom) override; + + bool handles_setup_; + cudnnHandle_t* handle_; + cudaStream_t* stream_; + + // algorithms for forward and backwards convolutions + cudnnConvolutionFwdAlgo_t *fwd_algo_; + cudnnConvolutionBwdFilterAlgo_t *bwd_filter_algo_; + cudnnConvolutionBwdDataAlgo_t *bwd_data_algo_; + + vector bottom_descs_, top_descs_; + cudnnTensorDescriptor_t bias_desc_; + cudnnFilterDescriptor_t filter_desc_; + vector conv_descs_; + int bottom_offset_, top_offset_, bias_offset_; + Type forward_math_, backward_data_math_, backward_filter_math_; + + size_t *workspace_fwd_sizes_; + size_t *workspace_bwd_data_sizes_; + size_t *workspace_bwd_filter_sizes_; + size_t workspaceSizeInBytes; // size of underlying storage + void *workspaceData; // underlying storage + void **workspace; // aliases into workspaceData +}; +#endif + +} // namespace caffe + +#endif // CAFFE_CUDNN_DECONV_LAYER_HPP_ diff --git a/include/caffe/layers/data_layer.hpp b/include/caffe/layers/data_layer.hpp index 661d28441b2..49f63837936 100644 --- a/include/caffe/layers/data_layer.hpp +++ b/include/caffe/layers/data_layer.hpp @@ -57,12 +57,12 @@ class DataLayer : public BasePrefetchingDataLayer { reader_->start_reading(); } - std::shared_ptr sample_reader_, reader_; - vector> tmp_gpu_buffer_; + std::shared_ptr> sample_reader_, reader_; + std::vector> tmp_gpu_buffer_; // stored random numbers for this batch - vector>> random_vectors_; - mutable vector parser_offsets_, queue_ids_; + std::vector>> random_vectors_; + mutable std::vector parser_offsets_, queue_ids_; Flag layer_inititialized_flag_; std::atomic_bool sample_only_; const bool cache_, shuffle_; diff --git a/include/caffe/layers/detection_evaluate_layer.hpp b/include/caffe/layers/detection_evaluate_layer.hpp new file mode 100644 index 00000000000..e783b0ac3c8 --- /dev/null +++ b/include/caffe/layers/detection_evaluate_layer.hpp @@ -0,0 +1,73 @@ +#ifndef CAFFE_DETECTION_EVALUATE_LAYER_HPP_ +#define CAFFE_DETECTION_EVALUATE_LAYER_HPP_ + +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Generate the detection evaluation based on DetectionOutputLayer and + * ground truth bounding box labels. + * + * Intended for use with MultiBox detection method. + * + * NOTE: does not implement Backwards operation. + */ +template +class DetectionEvaluateLayer : public Layer { + typedef Ftype Dtype; + + public: + explicit DetectionEvaluateLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "DetectionEvaluate"; } + virtual inline int ExactBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + /** + * @brief Evaluate the detection output. + * + * @param bottom input Blob vector (exact 2) + * -# @f$ (1 \times 1 \times N \times 7) @f$ + * N detection results. + * -# @f$ (1 \times 1 \times M \times 7) @f$ + * M ground truth. + * @param top Blob vector (length 1) + * -# @f$ (1 \times 1 \times N \times 4) @f$ + * N is the number of detections, and each row is: + * [image_id, label, confidence, true_pos, false_pos] + */ + virtual void Forward_cpu(const vector& bottom, + const vector& top); + /// @brief Not implemented + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + NOT_IMPLEMENTED; + } + + int num_classes_; + int background_label_id_; + float overlap_threshold_; + bool evaluate_difficult_gt_; + vector > sizes_; + int count_; + bool use_normalized_bbox_; + + bool has_resize_; + ResizeParameter resize_param_; +}; + +} // namespace caffe + +#endif // CAFFE_DETECTION_EVALUATE_LAYER_HPP_ diff --git a/include/caffe/layers/detection_output_layer.hpp b/include/caffe/layers/detection_output_layer.hpp new file mode 100644 index 00000000000..795f4264c83 --- /dev/null +++ b/include/caffe/layers/detection_output_layer.hpp @@ -0,0 +1,120 @@ +#ifndef CAFFE_DETECTION_OUTPUT_LAYER_HPP_ +#define CAFFE_DETECTION_OUTPUT_LAYER_HPP_ + +#include "caffe/common.hpp" + +#include +#include +#include + +#include +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/data_transformer.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/bbox_util.hpp" + +using namespace boost::property_tree; // NOLINT(build/namespaces) + +namespace caffe { + +/** + * @brief Generate the detection output based on location and confidence + * predictions by doing non maximum suppression. + * + * Intended for use with MultiBox detection method. + * + * NOTE: does not implement Backwards operation. + */ +template +class DetectionOutputLayer : public Layer { + public: + explicit DetectionOutputLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "DetectionOutput"; } + virtual inline int MinBottomBlobs() const { return 3; } + virtual inline int MaxBottomBlobs() const { return 4; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + /** + * @brief Do non maximum suppression (nms) on prediction results. + * + * @param bottom input Blob vector (at least 2) + * -# @f$ (N \times C1 \times 1 \times 1) @f$ + * the location predictions with C1 predictions. + * -# @f$ (N \times C2 \times 1 \times 1) @f$ + * the confidence predictions with C2 predictions. + * -# @f$ (N \times 2 \times C3 \times 1) @f$ + * the prior bounding boxes with C3 values. + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times N \times 7) @f$ + * N is the number of detections after nms, and each row is: + * [image_id, label, confidence, xmin, ymin, xmax, ymax] + */ + virtual void Forward_cpu(const vector& bottom, + const vector& top); + virtual void Forward_gpu(const vector& bottom, + const vector& top); + /// @brief Not implemented + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + NOT_IMPLEMENTED; + } + virtual void Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + NOT_IMPLEMENTED; + } + + int num_classes_; + bool share_location_; + int num_loc_classes_; + int background_label_id_; + CodeType code_type_; + bool variance_encoded_in_target_; + int keep_top_k_; + float confidence_threshold_; + + int num_; + int num_priors_; + + float nms_threshold_; + int top_k_; + float eta_; + + bool need_save_; + string output_directory_; + string output_name_prefix_; + string output_format_; + map label_to_name_; + map label_to_display_name_; + vector names_; + vector > sizes_; + int num_test_image_; + int name_count_; + bool has_resize_; + ResizeParameter resize_param_; + + ptree detections_; + + bool visualize_; + float visualize_threshold_; + shared_ptr> data_transformer_; + string save_file_; + TBlob bbox_preds_; + TBlob bbox_permute_; + TBlob conf_permute_; +}; + +} // namespace caffe + +#endif // CAFFE_DETECTION_OUTPUT_LAYER_HPP_ diff --git a/include/caffe/layers/loss_layer.hpp b/include/caffe/layers/loss_layer.hpp index bd0659f3325..232ee742e4e 100644 --- a/include/caffe/layers/loss_layer.hpp +++ b/include/caffe/layers/loss_layer.hpp @@ -21,6 +21,8 @@ const float kLOG_THRESHOLD = 1e-20; */ template class LossLayer : public Layer { + typedef Ftype Dtype; + public: explicit LossLayer(const LayerParameter& param) : Layer(param) {} @@ -29,6 +31,16 @@ class LossLayer : public Layer { virtual void Reshape( const vector& bottom, const vector& top); + /** + * Read the normalization mode parameter and compute the normalizer based + * on the blob size. If normalization_mode is VALID, the count of valid + * outputs will be read from valid_count, unless it is -1 in which case + * all outputs are assumed to be valid. + */ + Ftype GetNormalizer( + const LossParameter_NormalizationMode normalization_mode, + const int outer_num, const int inner_num, const int valid_count); + virtual inline int ExactNumBottomBlobs() const { return 2; } /** diff --git a/include/caffe/layers/lstm_layer.hpp b/include/caffe/layers/lstm_layer.hpp new file mode 100644 index 00000000000..402236f429e --- /dev/null +++ b/include/caffe/layers/lstm_layer.hpp @@ -0,0 +1,149 @@ +#ifndef CAFFE_LSTM_LAYER_HPP_ +#define CAFFE_LSTM_LAYER_HPP_ + +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/recurrent_layer.hpp" +#include "caffe/net.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Processes sequential inputs using a "Long Short-Term Memory" (LSTM) + * [1] style recurrent neural network (RNN). Implemented by unrolling + * the LSTM computation through time. + * + * The specific architecture used in this implementation is as described in + * "Learning to Execute" [2], reproduced below: + * i_t := \sigmoid[ W_{hi} * h_{t-1} + W_{xi} * x_t + b_i ] + * f_t := \sigmoid[ W_{hf} * h_{t-1} + W_{xf} * x_t + b_f ] + * o_t := \sigmoid[ W_{ho} * h_{t-1} + W_{xo} * x_t + b_o ] + * g_t := \tanh[ W_{hg} * h_{t-1} + W_{xg} * x_t + b_g ] + * c_t := (f_t .* c_{t-1}) + (i_t .* g_t) + * h_t := o_t .* \tanh[c_t] + * In the implementation, the i, f, o, and g computations are performed as a + * single inner product. + * + * Notably, this implementation lacks the "diagonal" gates, as used in the + * LSTM architectures described by Alex Graves [3] and others. + * + * [1] Hochreiter, Sepp, and Schmidhuber, Jürgen. "Long short-term memory." + * Neural Computation 9, no. 8 (1997): 1735-1780. + * + * [2] Zaremba, Wojciech, and Sutskever, Ilya. "Learning to execute." + * arXiv preprint arXiv:1410.4615 (2014). + * + * [3] Graves, Alex. "Generating sequences with recurrent neural networks." + * arXiv preprint arXiv:1308.0850 (2013). + */ +template +class LSTMLayer : public RecurrentLayer { + public: + explicit LSTMLayer(const LayerParameter& param) + : RecurrentLayer(param) {} + + virtual inline const char* type() const { return "LSTM"; } + + protected: + void FillUnrolledNet(NetParameter* net_param) const override; + void RecurrentInputBlobNames(vector* names) const override; + void RecurrentOutputBlobNames(vector* names) const override; + void RecurrentInputShapes(vector* shapes) const override; + void OutputBlobNames(vector* names) const override; +}; + +/** + * @brief A helper for LSTMLayer: computes a single timestep of the + * non-linearity of the LSTM, producing the updated cell and hidden + * states. + */ +template +class LSTMUnitLayer : public Layer { + public: + explicit LSTMUnitLayer(const LayerParameter& param) + : Layer(param), hidden_dim_(0), X_acts_(Blob::create()) {} + void Reshape(const vector& bottom, const vector& top) override; + + const char* type() const override { return "LSTMUnit"; } + int ExactNumBottomBlobs() const override { return 3; } + int ExactNumTopBlobs() const override { return 2; } + + bool AllowForceBackward(const int bottom_index) const override { + // Can't propagate to sequence continuation indicators. + return bottom_index != 2; + } + + protected: + /** + * @param bottom input Blob vector (length 3) + * -# @f$ (1 \times N \times D) @f$ + * the previous timestep cell state @f$ c_{t-1} @f$ + * -# @f$ (1 \times N \times 4D) @f$ + * the "gate inputs" @f$ [i_t', f_t', o_t', g_t'] @f$ + * -# @f$ (1 \times N) @f$ + * the sequence continuation indicators @f$ \delta_t @f$ + * @param top output Blob vector (length 2) + * -# @f$ (1 \times N \times D) @f$ + * the updated cell state @f$ c_t @f$, computed as: + * i_t := \sigmoid[i_t'] + * f_t := \sigmoid[f_t'] + * o_t := \sigmoid[o_t'] + * g_t := \tanh[g_t'] + * c_t := cont_t * (f_t .* c_{t-1}) + (i_t .* g_t) + * -# @f$ (1 \times N \times D) @f$ + * the updated hidden state @f$ h_t @f$, computed as: + * h_t := o_t .* \tanh[c_t] + */ + void Forward_cpu(const vector& bottom, const vector& top) override; + void Forward_gpu(const vector& bottom, const vector& top) override; + + /** + * @brief Computes the error gradient w.r.t. the LSTMUnit inputs. + * + * @param top output Blob vector (length 2), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times N \times D) @f$: + * containing error gradients @f$ \frac{\partial E}{\partial c_t} @f$ + * with respect to the updated cell state @f$ c_t @f$ + * -# @f$ (1 \times N \times D) @f$: + * containing error gradients @f$ \frac{\partial E}{\partial h_t} @f$ + * with respect to the updated cell state @f$ h_t @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 3), into which the error gradients + * with respect to the LSTMUnit inputs @f$ c_{t-1} @f$ and the gate + * inputs are computed. Computatation of the error gradients w.r.t. + * the sequence indicators is not implemented. + * -# @f$ (1 \times N \times D) @f$ + * the error gradient w.r.t. the previous timestep cell state + * @f$ c_{t-1} @f$ + * -# @f$ (1 \times N \times 4D) @f$ + * the error gradient w.r.t. the "gate inputs" + * @f$ [ + * \frac{\partial E}{\partial i_t} + * \frac{\partial E}{\partial f_t} + * \frac{\partial E}{\partial o_t} + * \frac{\partial E}{\partial g_t} + * ] @f$ + * -# @f$ (1 \times 1 \times N) @f$ + * the gradient w.r.t. the sequence continuation indicators + * @f$ \delta_t @f$ is currently not computed. + */ + void Backward_cpu(const vector& top, const vector& propagate_down, + const vector& bottom) override; + void Backward_gpu(const vector& top, const vector& propagate_down, + const vector& bottom) override; + + /// @brief The hidden and output dimension. + int hidden_dim_; + shared_ptr X_acts_; +}; + +} // namespace caffe + +#endif // CAFFE_LSTM_LAYER_HPP_ diff --git a/include/caffe/layers/memory_data_layer.hpp b/include/caffe/layers/memory_data_layer.hpp index 8bb75dfe718..e879e784ac2 100644 --- a/include/caffe/layers/memory_data_layer.hpp +++ b/include/caffe/layers/memory_data_layer.hpp @@ -21,7 +21,7 @@ class MemoryDataLayer : public BaseDataLayer { public: explicit MemoryDataLayer(const LayerParameter& param) : BaseDataLayer(param, 1), has_new_data_(false) { - dt_ = make_shared(this->transform_param_, this->phase_); + dt_ = make_shared>(this->transform_param_, this->phase_); } virtual void DataLayerSetUp(const vector& bottom, const vector& top); @@ -58,7 +58,7 @@ class MemoryDataLayer : public BaseDataLayer { TBlob added_data_; TBlob added_label_; bool has_new_data_; - shared_ptr dt_; + shared_ptr> dt_; }; } // namespace caffe diff --git a/include/caffe/layers/multibox_loss_layer.hpp b/include/caffe/layers/multibox_loss_layer.hpp new file mode 100644 index 00000000000..e6295469189 --- /dev/null +++ b/include/caffe/layers/multibox_loss_layer.hpp @@ -0,0 +1,114 @@ +#ifndef CAFFE_MULTIBOX_LOSS_LAYER_HPP_ +#define CAFFE_MULTIBOX_LOSS_LAYER_HPP_ + +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/bbox_util.hpp" + +#include "caffe/layers/loss_layer.hpp" + +namespace caffe { + +/** + * @brief Perform MultiBox operations. Including the following: + * + * - decode the predictions. + * - perform matching between priors/predictions and ground truth. + * - use matched boxes and confidences to compute loss. + * + */ +template +class MultiBoxLossLayer : public LossLayer { + typedef Ftype Dtype; + + public: + explicit MultiBoxLossLayer(const LayerParameter& param) + : LossLayer(param) {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "MultiBoxLoss"; } + // bottom[0] stores the location predictions. + // bottom[1] stores the confidence predictions. + // bottom[2] stores the prior bounding boxes. + // bottom[3] stores the ground truth bounding boxes. + virtual inline int ExactNumBottomBlobs() const { return 4; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual void Forward_cpu(const vector& bottom, + const vector& top); + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom); + + // The internal localization loss layer. + shared_ptr loc_loss_layer_; + LocLossType loc_loss_type_; + float loc_weight_; + // bottom vector holder used in Forward function. + vector loc_bottom_vec_; + // top vector holder used in Forward function. + vector loc_top_vec_; + // blob which stores the matched location prediction. + TBlob loc_pred_; + // blob which stores the corresponding matched ground truth. + TBlob loc_gt_; + // localization loss. + TBlob loc_loss_; + + // The internal confidence loss layer. + shared_ptr conf_loss_layer_; + ConfLossType conf_loss_type_; + // bottom vector holder used in Forward function. + vector conf_bottom_vec_; + // top vector holder used in Forward function. + vector conf_top_vec_; + // blob which stores the confidence prediction. + TBlob conf_pred_; + // blob which stores the corresponding ground truth label. + TBlob conf_gt_; + // confidence loss. + TBlob conf_loss_; + + MultiBoxLossParameter multibox_loss_param_; + int num_classes_; + bool share_location_; + MatchType match_type_; + float overlap_threshold_; + bool use_prior_for_matching_; + int background_label_id_; + bool use_difficult_gt_; + bool do_neg_mining_; + float neg_pos_ratio_; + float neg_overlap_; + CodeType code_type_; + bool encode_variance_in_target_; + bool map_object_to_agnostic_; + bool ignore_cross_boundary_bbox_; + bool bp_inside_; + MiningType mining_type_; + + int loc_classes_; + int num_gt_; + int num_; + int num_priors_; + + int num_matches_; + int num_conf_; + vector > > all_match_indices_; + vector > all_neg_indices_; + + // How to normalize the loss. + LossParameter_NormalizationMode normalization_; +}; + +} // namespace caffe + +#endif // CAFFE_MULTIBOX_LOSS_LAYER_HPP_ diff --git a/include/caffe/layers/normalize_layer.hpp b/include/caffe/layers/normalize_layer.hpp new file mode 100644 index 00000000000..0cfb22cadf0 --- /dev/null +++ b/include/caffe/layers/normalize_layer.hpp @@ -0,0 +1,53 @@ +#ifndef CAFFE_NORMALIZE_LAYER_HPP_ +#define CAFFE_NORMALIZE_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Normalizes the input to have L_p norm of 1 with scale learnable. + * + * TODO(weiliu89): thorough documentation for Forward, Backward, and proto params. + */ +template +class NormalizeLayer : public Layer { + typedef Ftype Dtype; + + public: + explicit NormalizeLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "Normalize"; } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual void Forward_cpu(const vector& bottom, + const vector& top); + virtual void Forward_gpu(const vector& bottom, + const vector& top); + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom); + virtual void Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom); + + TBlob norm_; + TBlob sum_channel_multiplier_, sum_spatial_multiplier_; + TBlob buffer_, buffer_channel_, buffer_spatial_; + bool across_spatial_; + bool channel_shared_; + Dtype eps_; +}; + +} // namespace caffe + +#endif // CAFFE_MVN_LAYER_HPP_ diff --git a/include/caffe/layers/permute_layer.hpp b/include/caffe/layers/permute_layer.hpp new file mode 100644 index 00000000000..1dff70f0059 --- /dev/null +++ b/include/caffe/layers/permute_layer.hpp @@ -0,0 +1,61 @@ +#ifndef CAFFE_PERMUTE_LAYER_HPP_ +#define CAFFE_PERMUTE_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Permute the input blob by changing the memory order of the data. + * + * TODO(weiliu89): thorough documentation for Forward, Backward, and proto params. + */ + +// The main function which does the permute. +template +void Permute(const int count, Dtype* bottom_data, const bool forward, + const int* permute_order, const int* old_steps, const int* new_steps, + const int num_axes, Dtype* top_data); + +template +class PermuteLayer : public Layer { + typedef Ftype Dtype; + + public: + explicit PermuteLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "Permute"; } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual void Forward_cpu(const vector& bottom, + const vector& top); + virtual void Forward_gpu(const vector& bottom, + const vector& top); + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom); + virtual void Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom); + + int num_axes_; + bool need_permute_; + + // Use Blob because it is convenient to be accessible in .cu file. + TBlob permute_order_; + TBlob old_steps_; + TBlob new_steps_; +}; + +} // namespace caffe + +#endif // CAFFE_PERMUTE_LAYER_HPP_ diff --git a/include/caffe/layers/pooling_layer.hpp b/include/caffe/layers/pooling_layer.hpp index 6cf7930300f..48e2d21d111 100644 --- a/include/caffe/layers/pooling_layer.hpp +++ b/include/caffe/layers/pooling_layer.hpp @@ -18,7 +18,7 @@ template class PoolingLayer : public Layer { public: explicit PoolingLayer(const LayerParameter& param) - : Layer(param) {} + : Layer(param), rand_idx_(Blob::create()) {} virtual void LayerSetUp(const vector& bottom, const vector& top); virtual void Reshape(const vector& bottom, @@ -52,7 +52,7 @@ class PoolingLayer : public Layer { int pooled_height_, pooled_width_; bool global_pooling_; bool is_max_pooling_; - TBlob rand_idx_; + shared_ptr rand_idx_; TBlob max_idx_; }; diff --git a/include/caffe/layers/prior_box_layer.hpp b/include/caffe/layers/prior_box_layer.hpp new file mode 100644 index 00000000000..0a33f625ec0 --- /dev/null +++ b/include/caffe/layers/prior_box_layer.hpp @@ -0,0 +1,86 @@ +#ifndef CAFFE_PRIORBOX_LAYER_HPP_ +#define CAFFE_PRIORBOX_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Generate the prior boxes of designated sizes and aspect ratios across + * all dimensions @f$ (H \times W) @f$. + * + * Intended for use with MultiBox detection method to generate prior (template). + * + * NOTE: does not implement Backwards operation. + */ +template +class PriorBoxLayer : public Layer { + typedef Ftype Dtype; + + public: + /** + * @param param provides PriorBoxParameter prior_box_param, + * with PriorBoxLayer options: + * - min_size (\b minimum box size in pixels. can be multiple. required!). + * - max_size (\b maximum box size in pixels. can be ignored or same as the + * # of min_size.). + * - aspect_ratio (\b optional aspect ratios of the boxes. can be multiple). + * - flip (\b optional bool, default true). + * if set, flip the aspect ratio. + */ + explicit PriorBoxLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "PriorBox"; } + virtual inline int ExactBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + /** + * @brief Generates prior boxes for a layer with specified parameters. + * + * @param bottom input Blob vector (at least 2) + * -# @f$ (N \times C \times H_i \times W_i) @f$ + * the input layer @f$ x_i @f$ + * -# @f$ (N \times C \times H_0 \times W_0) @f$ + * the data layer @f$ x_0 @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times 2 \times K*4) @f$ where @f$ K @f$ is the prior numbers + * By default, a box of aspect ratio 1 and min_size and a box of aspect + * ratio 1 and sqrt(min_size * max_size) are created. + */ + virtual void Forward_cpu(const vector& bottom, + const vector& top); + /// @brief Not implemented + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + return; + } + + vector min_sizes_; + vector max_sizes_; + vector aspect_ratios_; + bool flip_; + int num_priors_; + bool clip_; + vector variance_; + + int img_w_; + int img_h_; + float step_w_; + float step_h_; + + float offset_; +}; + +} // namespace caffe + +#endif // CAFFE_PRIORBOX_LAYER_HPP_ diff --git a/include/caffe/layers/recurrent_layer.hpp b/include/caffe/layers/recurrent_layer.hpp new file mode 100644 index 00000000000..c772b264dc7 --- /dev/null +++ b/include/caffe/layers/recurrent_layer.hpp @@ -0,0 +1,181 @@ +#ifndef CAFFE_RECURRENT_LAYER_HPP_ +#define CAFFE_RECURRENT_LAYER_HPP_ + +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/net.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/format.hpp" + +namespace caffe { + +/** + * @brief An abstract class for implementing recurrent behavior inside of an + * unrolled network. This Layer type cannot be instantiated -- instead, + * you should use one of its implementations which defines the recurrent + * architecture, such as RNNLayer or LSTMLayer. + */ +template +class RecurrentLayer : public Layer { + public: + explicit RecurrentLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, const vector& top); + virtual void Reshape(const vector& bottom, const vector& top); + virtual void Reset(); + + virtual inline const char* type() const { return "Recurrent"; } + virtual inline int MinBottomBlobs() const { + int min_bottoms = 2; + if (this->layer_param_.recurrent_param().expose_hidden()) { + vector inputs; + this->RecurrentInputBlobNames(&inputs); + min_bottoms += inputs.size(); + } + return min_bottoms; + } + virtual inline int MaxBottomBlobs() const { return MinBottomBlobs() + 1; } + virtual inline int ExactNumTopBlobs() const { + int num_tops = 1; + if (this->layer_param_.recurrent_param().expose_hidden()) { + vector outputs; + this->RecurrentOutputBlobNames(&outputs); + num_tops += outputs.size(); + } + return num_tops; + } + + virtual inline bool AllowForceBackward(const int bottom_index) const { + // Can't propagate to sequence continuation indicators. + return bottom_index != 1; + } + + protected: + /** + * @brief Fills net_param with the recurrent network architecture. Subclasses + * should define this -- see RNNLayer and LSTMLayer for examples. + */ + virtual void FillUnrolledNet(NetParameter* net_param) const = 0; + + /** + * @brief Fills names with the names of the 0th timestep recurrent input + * Blob&s. Subclasses should define this -- see RNNLayer and LSTMLayer + * for examples. + */ + virtual void RecurrentInputBlobNames(vector* names) const = 0; + + /** + * @brief Fills shapes with the shapes of the recurrent input Blob&s. + * Subclasses should define this -- see RNNLayer and LSTMLayer + * for examples. + */ + virtual void RecurrentInputShapes(vector* shapes) const = 0; + + /** + * @brief Fills names with the names of the Tth timestep recurrent output + * Blob&s. Subclasses should define this -- see RNNLayer and LSTMLayer + * for examples. + */ + virtual void RecurrentOutputBlobNames(vector* names) const = 0; + + /** + * @brief Fills names with the names of the output blobs, concatenated across + * all timesteps. Should return a name for each top Blob. + * Subclasses should define this -- see RNNLayer and LSTMLayer for + * examples. + */ + virtual void OutputBlobNames(vector* names) const = 0; + + /** + * @param bottom input Blob vector (length 2-3) + * + * -# @f$ (T \times N \times ...) @f$ + * the time-varying input @f$ x @f$. After the first two axes, whose + * dimensions must correspond to the number of timesteps @f$ T @f$ and + * the number of independent streams @f$ N @f$, respectively, its + * dimensions may be arbitrary. Note that the ordering of dimensions -- + * @f$ (T \times N \times ...) @f$, rather than + * @f$ (N \times T \times ...) @f$ -- means that the @f$ N @f$ + * independent input streams must be "interleaved". + * + * -# @f$ (T \times N) @f$ + * the sequence continuation indicators @f$ \delta @f$. + * These inputs should be binary (0 or 1) indicators, where + * @f$ \delta_{t,n} = 0 @f$ means that timestep @f$ t @f$ of stream + * @f$ n @f$ is the beginning of a new sequence, and hence the previous + * hidden state @f$ h_{t-1} @f$ is multiplied by @f$ \delta_t = 0 @f$ + * and has no effect on the cell's output at timestep @f$ t @f$, and + * a value of @f$ \delta_{t,n} = 1 @f$ means that timestep @f$ t @f$ of + * stream @f$ n @f$ is a continuation from the previous timestep + * @f$ t-1 @f$, and the previous hidden state @f$ h_{t-1} @f$ affects the + * updated hidden state and output. + * + * -# @f$ (N \times ...) @f$ (optional) + * the static (non-time-varying) input @f$ x_{static} @f$. + * After the first axis, whose dimension must be the number of + * independent streams, its dimensions may be arbitrary. + * This is mathematically equivalent to using a time-varying input of + * @f$ x'_t = [x_t; x_{static}] @f$ -- i.e., tiling the static input + * across the @f$ T @f$ timesteps and concatenating with the time-varying + * input. Note that if this input is used, all timesteps in a single + * batch within a particular one of the @f$ N @f$ streams must share the + * same static input, even if the sequence continuation indicators + * suggest that difference sequences are ending and beginning within a + * single batch. This may require padding and/or truncation for uniform + * length. + * + * @param top output Blob vector (length 1) + * -# @f$ (T \times N \times D) @f$ + * the time-varying output @f$ y @f$, where @f$ D @f$ is + * recurrent_param.num_output(). + * Refer to documentation for particular RecurrentLayer implementations + * (such as RNNLayer and LSTMLayer) for the definition of @f$ y @f$. + */ + virtual void Forward_cpu(const vector& bottom, const vector& top); + virtual void Forward_gpu(const vector& bottom, const vector& top); + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom); + + /// @brief A Net to implement the Recurrent functionality. + shared_ptr unrolled_net_; + + /// @brief The number of independent streams to process simultaneously. + int N_; + + /** + * @brief The number of timesteps in the layer's input, and the number of + * timesteps over which to backpropagate through time. + */ + int T_; + + /// @brief Whether the layer has a "static" input copied across all timesteps. + bool static_input_; + + /** + * @brief The last layer to run in the network. (Any later layers are losses + * added to force the recurrent net to do backprop.) + */ + int last_layer_index_; + + /** + * @brief Whether the layer's hidden state at the first and last timesteps + * are layer inputs and outputs, respectively. + */ + bool expose_hidden_; + + vector recur_input_blobs_; + vector recur_output_blobs_; + vector output_blobs_; + Blob* x_input_blob_; + Blob* x_static_input_blob_; + Blob* cont_input_blob_; +}; + +} // namespace caffe + +#endif // CAFFE_RECURRENT_LAYER_HPP_ diff --git a/include/caffe/layers/rnn_layer.hpp b/include/caffe/layers/rnn_layer.hpp new file mode 100644 index 00000000000..bd36e68f437 --- /dev/null +++ b/include/caffe/layers/rnn_layer.hpp @@ -0,0 +1,45 @@ +#ifndef CAFFE_RNN_LAYER_HPP_ +#define CAFFE_RNN_LAYER_HPP_ + +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/recurrent_layer.hpp" +#include "caffe/net.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Processes time-varying inputs using a simple recurrent neural network + * (RNN). Implemented as a network unrolling the RNN computation in time. + * + * Given time-varying inputs @f$ x_t @f$, computes hidden state @f$ + * h_t := \tanh[ W_{hh} h_{t_1} + W_{xh} x_t + b_h ] + * @f$, and outputs @f$ + * o_t := \tanh[ W_{ho} h_t + b_o ] + * @f$. + */ +template +class RNNLayer : public RecurrentLayer { + public: + explicit RNNLayer(const LayerParameter& param) + : RecurrentLayer(param) {} + + virtual inline const char* type() const { return "RNN"; } + + protected: + void FillUnrolledNet(NetParameter* net_param) const override; + void RecurrentInputBlobNames(vector* names) const override; + void RecurrentOutputBlobNames(vector* names) const override; + void RecurrentInputShapes(vector* shapes) const override; + void OutputBlobNames(vector* names) const override; +}; + +} // namespace caffe + +#endif // CAFFE_RNN_LAYER_HPP_ diff --git a/include/caffe/layers/smooth_L1_loss_layer.hpp b/include/caffe/layers/smooth_L1_loss_layer.hpp new file mode 100644 index 00000000000..889ef4ebf8b --- /dev/null +++ b/include/caffe/layers/smooth_L1_loss_layer.hpp @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------ +// Fast R-CNN +// copyright (c) 2015 Microsoft +// Licensed under The MIT License [see fast-rcnn/LICENSE for details] +// Written by Ross Girshick +// Modified by Wei Liu +// ------------------------------------------------------------------ + +#ifndef CAFFE_SMOOTH_L1_LOSS_LAYER_HPP_ +#define CAFFE_SMOOTH_L1_LOSS_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/layers/loss_layer.hpp" + +namespace caffe { + +/** + * @brief Computes the SmoothL1 loss as introduced in:@f$ + * Fast R-CNN, Ross Girshick, ICCV 2015. + */ +template +class SmoothL1LossLayer : public LossLayer { + typedef Ftype Dtype; + + public: + explicit SmoothL1LossLayer(const LayerParameter& param) + : LossLayer(param), diff_() {} + virtual void LayerSetUp(const vector& bottom, + const vector& top); + virtual void Reshape(const vector& bottom, + const vector& top); + + virtual inline const char* type() const { return "SmoothL1Loss"; } + + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int MaxBottomBlobs() const { return 3; } + + /** + * Unlike most loss layers, in the SmoothL1LossLayer we can backpropagate + * to both inputs -- override to return true and always allow force_backward. + */ + virtual inline bool AllowForceBackward(const int bottom_index) const { + return true; + } + + protected: + /// @copydoc SmoothL1LossLayer + virtual void Forward_cpu(const vector& bottom, + const vector& top); + virtual void Forward_gpu(const vector& bottom, + const vector& top); + + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom); + virtual void Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom); + + TBlob diff_; + TBlob errors_; + bool has_weights_; +}; + +} // namespace caffe + +#endif // CAFFE_SMOOTH_L1_LOSS_LAYER_HPP_ diff --git a/include/caffe/layers/video_data_layer.hpp b/include/caffe/layers/video_data_layer.hpp new file mode 100644 index 00000000000..a4e09b62515 --- /dev/null +++ b/include/caffe/layers/video_data_layer.hpp @@ -0,0 +1,56 @@ +#ifndef CAFFE_VIDEO_DATA_LAYER_HPP_ +#define CAFFE_VIDEO_DATA_LAYER_HPP_ + +#if OPENCV_VERSION == 3 +#include +#else +#include +#endif // OPENCV_VERSION == 3 + +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/data_transformer.hpp" +#include "caffe/internal_thread.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/base_data_layer.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" + +namespace caffe { + +/** + * @brief Provides data to the Net from webcam or video files. + * + * TODO(weiliu89): thorough documentation for Forward and proto params. + */ +template +class VideoDataLayer : public BasePrefetchingDataLayer { + public: + VideoDataLayer(const LayerParameter& param, size_t solver_rank); + virtual ~VideoDataLayer(); + virtual void DataLayerSetUp(const vector& bottom, + const vector& top); + virtual inline bool ShareInParallel() const { return false; } + virtual inline const char* type() const { return "VideoData"; } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int MinTopBlobs() const { return 1; } + + protected: + void load_batch(Batch* batch, int thread_id, size_t queue_id) override; + void start_reading() override {} + + VideoDataParameter_VideoType video_type_; + cv::VideoCapture cap_; + + int skip_frames_; + + int total_frames_; + int processed_frames_; + vector top_shape_; +}; + +} // namespace caffe + +#endif // CAFFE_VIDEO_DATA_LAYER_HPP_ diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 31821c0ac6a..4722aa8efff 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -16,6 +16,7 @@ #include "caffe/util/blocking_queue.hpp" #include "caffe/util/thread_pool.hpp" #include "caffe/layers/data_layer.hpp" +#include "caffe/layers/annotated_data_layer.hpp" namespace caffe { @@ -33,13 +34,15 @@ class Net { size_t solver_rank = 0U, Flag* solver_init_flag = nullptr, Flag* solver_iter0_flag = nullptr, - const Net* root_net = nullptr); + const Net* root_net = nullptr, + bool inner_net = false); Net(const string& param_file, Phase phase, size_t solver_rank = 0U, Flag* solver_init_flag = nullptr, Flag* solver_iter0_flag = nullptr, - const Net* root_net = nullptr); + const Net* root_net = nullptr, + bool inner_net = false); ~Net(); /// @brief Initialize a network with a NetParameter. @@ -275,6 +278,10 @@ class Net { return infer_count_; } + size_t solver_rank() const { + return solver_rank_; + } + bool global_grad_scale_enabled() const { return global_grad_scale_param_ > 1.F; } @@ -293,7 +300,8 @@ class Net { size_t prefetch_bytes() { size_t bytes = 0UL; for (const shared_ptr& layer : layers_) { - if (typeid(*layer) == typeid(DataLayer)) { + if (typeid(*layer) == typeid(DataLayer) || + typeid(*layer) == typeid(AnnotatedDataLayer)) { bytes += reinterpret_cast*>(layer.get())->prefetch_bytes(); } } @@ -428,6 +436,8 @@ class Net { std::atomic_llong wgrad_sq_; float global_grad_scale_coeff_, global_grad_scale_param_; bool global_grad_scale_adaptive_; + /// Inner net runs on singe GPU (see recurrent layers) + const bool inner_net_; static constexpr float GRAD_FACTOR = 1.E6F; diff --git a/include/caffe/parallel.hpp b/include/caffe/parallel.hpp index 9df87d525fe..b7cab7f4c4a 100644 --- a/include/caffe/parallel.hpp +++ b/include/caffe/parallel.hpp @@ -36,7 +36,7 @@ struct SharedScores { private: vector> memory_; - static constexpr size_t MAX_SCORES = 1000; + static constexpr size_t MAX_SCORES = 1000*10; }; template diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 3c9cc493dab..853006c9aa6 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -197,6 +197,7 @@ class Solver { // The test routine vector TestAll(const int iters = 0, bool use_multi_gpu = false); vector Test(const int test_net_id = 0, const int iters = 0, bool use_multi_gpu = false); + vector TestDetection(const int test_net_id = 0); virtual void SnapshotSolverState(const string& model_filename) = 0; virtual void RestoreSolverStateFromHDF5(const string& state_file) = 0; virtual void RestoreSolverStateFromBinaryProto(const string& state_file) = 0; diff --git a/include/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp index 4513d61a56e..004decf6896 100644 --- a/include/caffe/test/test_gradient_check_util.hpp +++ b/include/caffe/test/test_gradient_check_util.hpp @@ -22,9 +22,12 @@ class GradientChecker { // kink - kink_range <= |feature value| <= kink + kink_range, // which accounts for all nonsmoothness in use by caffe GradientChecker(const float stepsize, const float threshold, const unsigned int seed = 1701, - const float kink = 0., const float kink_range = -1) : stepsize_(stepsize), - threshold_(threshold), kink_(kink), - kink_range_(kink_range), seed_(seed) {} + const float kink = 0.F, const float kink_range = -1.F) + : stepsize_(stepsize), + threshold_(threshold), + kink_(kink), + kink_range_(kink_range), + seed_(seed) {} // Checks the gradient of a layer, with provided bottom layers and top // layers. @@ -132,9 +135,9 @@ void GradientChecker::CheckGradientSingle(LayerBase* layer, const vector< // bottom[blob_id][i] only for i == top_data_id. For any other // i != top_data_id, we know the derivative is 0 by definition, and simply // check that that's true. - float estimated_gradient = 0; - float positive_objective = 0; - float negative_objective = 0; + float estimated_gradient = 0.F; + float positive_objective = 0.F; + float negative_objective = 0.F; if (!element_wise || (feat_id == top_data_id)) { // Do finite differencing. // Compute loss with stepsize_ added to input. diff --git a/include/caffe/type.hpp b/include/caffe/type.hpp index 2c2e5207b53..23cf368364d 100644 --- a/include/caffe/type.hpp +++ b/include/caffe/type.hpp @@ -34,6 +34,11 @@ template <> inline constexpr Type tp() { return UINT; } +template <> +inline constexpr Type tp() { + //CHECK(false) << "Should not reach here: tp()"; + return BOOL; +} #ifdef USE_CUDNN template diff --git a/include/caffe/util/bbox_util.hpp b/include/caffe/util/bbox_util.hpp new file mode 100644 index 00000000000..b41ab0dc529 --- /dev/null +++ b/include/caffe/util/bbox_util.hpp @@ -0,0 +1,518 @@ +#include +#include +#include + +#ifndef CAFFE_UTIL_BBOX_UTIL_H_ +#define CAFFE_UTIL_BBOX_UTIL_H_ + +#include +#include // for std::fabs and std::signbit +#include +#include +#include +#include + +#include "glog/logging.h" + +#include "caffe/caffe.hpp" + +namespace caffe { + +typedef EmitConstraint_EmitType EmitType; +typedef PriorBoxParameter_CodeType CodeType; +typedef MultiBoxLossParameter_MatchType MatchType; +typedef MultiBoxLossParameter_LocLossType LocLossType; +typedef MultiBoxLossParameter_ConfLossType ConfLossType; +typedef MultiBoxLossParameter_MiningType MiningType; + +typedef map > LabelBBox; + +// Function used to sort NormalizedBBox, stored in STL container (e.g. vector), +// in ascend order based on the score value. +bool SortBBoxAscend(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2); + +// Function used to sort NormalizedBBox, stored in STL container (e.g. vector), +// in descend order based on the score value. +bool SortBBoxDescend(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2); + +// Function sued to sort pair, stored in STL container (e.g. vector) +// in descend order based on the score (first) value. +template +bool SortScorePairAscend(const pair& pair1, + const pair& pair2); + +// Function sued to sort pair, stored in STL container (e.g. vector) +// in descend order based on the score (first) value. +template +bool SortScorePairDescend(const pair& pair1, + const pair& pair2); + +// Generate unit bbox [0, 0, 1, 1] +NormalizedBBox UnitBBox(); + +// Check if a bbox is cross boundary or not. +bool IsCrossBoundaryBBox(const NormalizedBBox& bbox); + +// Compute the intersection between two bboxes. +void IntersectBBox(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2, + NormalizedBBox* intersect_bbox); + +// Compute bbox size. +float BBoxSize(const NormalizedBBox& bbox, const bool normalized = true); + +template +Dtype BBoxSize(const Dtype* bbox, const bool normalized = true); + +// Clip the NormalizedBBox such that the range for each corner is [0, 1]. +void ClipBBox(const NormalizedBBox& bbox, NormalizedBBox* clip_bbox); + +// Clip the bbox such that the bbox is within [0, 0; width, height]. +void ClipBBox(const NormalizedBBox& bbox, const float height, const float width, + NormalizedBBox* clip_bbox); + +// Scale the NormalizedBBox w.r.t. height and width. +void ScaleBBox(const NormalizedBBox& bbox, const int height, const int width, + NormalizedBBox* scale_bbox); + +// Output predicted bbox on the actual image. +void OutputBBox(const NormalizedBBox& bbox, const pair& img_size, + const bool has_resize, const ResizeParameter& resize_param, + NormalizedBBox* out_bbox); + +// Locate bbox in the coordinate system that src_bbox sits. +void LocateBBox(const NormalizedBBox& src_bbox, const NormalizedBBox& bbox, + NormalizedBBox* loc_bbox); + +// Project bbox onto the coordinate system defined by src_bbox. +bool ProjectBBox(const NormalizedBBox& src_bbox, const NormalizedBBox& bbox, + NormalizedBBox* proj_bbox); + +// Extrapolate the transformed bbox if height_scale and width_scale is +// explicitly provided, and it is only effective for FIT_SMALL_SIZE case. +void ExtrapolateBBox(const ResizeParameter& param, const int height, + const int width, const NormalizedBBox& crop_bbox, NormalizedBBox* bbox); + +// Compute the jaccard (intersection over union IoU) overlap between two bboxes. +float JaccardOverlap(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2, + const bool normalized = true); + +template +Dtype JaccardOverlap(const Dtype* bbox1, const Dtype* bbox2); + +// Compute the coverage of bbox1 by bbox2. +float BBoxCoverage(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2); + +// Encode a bbox according to a prior bbox. +void EncodeBBox(const NormalizedBBox& prior_bbox, + const vector& prior_variance, const CodeType code_type, + const bool encode_variance_in_target, const NormalizedBBox& bbox, + NormalizedBBox* encode_bbox); + +// Check if a bbox meet emit constraint w.r.t. src_bbox. +bool MeetEmitConstraint(const NormalizedBBox& src_bbox, + const NormalizedBBox& bbox, const EmitConstraint& emit_constraint); + +// Decode a bbox according to a prior bbox. +void DecodeBBox(const NormalizedBBox& prior_bbox, + const vector& prior_variance, const CodeType code_type, + const bool variance_encoded_in_target, const bool clip_bbox, + const NormalizedBBox& bbox, NormalizedBBox* decode_bbox); + +// Decode a set of bboxes according to a set of prior bboxes. +void DecodeBBoxes(const vector& prior_bboxes, + const vector >& prior_variances, + const CodeType code_type, const bool variance_encoded_in_target, + const bool clip_bbox, const vector& bboxes, + vector* decode_bboxes); + +// Decode all bboxes in a batch. +void DecodeBBoxesAll(const vector& all_loc_pred, + const vector& prior_bboxes, + const vector >& prior_variances, + const int num, const bool share_location, + const int num_loc_classes, const int background_label_id, + const CodeType code_type, const bool variance_encoded_in_target, + const bool clip, vector* all_decode_bboxes); + +// Match prediction bboxes with ground truth bboxes. +void MatchBBox(const vector& gt, + const vector& pred_bboxes, const int label, + const MatchType match_type, const float overlap_threshold, + const bool ignore_cross_boundary_bbox, + vector* match_indices, vector* match_overlaps); + +// Find matches between prediction bboxes and ground truth bboxes. +// all_loc_preds: stores the location prediction, where each item contains +// location prediction for an image. +// all_gt_bboxes: stores ground truth bboxes for the batch. +// prior_bboxes: stores all the prior bboxes in the format of NormalizedBBox. +// prior_variances: stores all the variances needed by prior bboxes. +// multibox_loss_param: stores the parameters for MultiBoxLossLayer. +// all_match_overlaps: stores jaccard overlaps between predictions and gt. +// all_match_indices: stores mapping between predictions and ground truth. +void FindMatches(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + vector > >* all_match_overlaps, + vector > >* all_match_indices); + +// Count the number of matches from the match indices. +int CountNumMatches(const vector > >& all_match_indices, + const int num); + +// Mine the hard examples from the batch. +// conf_blob: stores the confidence prediction. +// all_loc_preds: stores the location prediction, where each item contains +// location prediction for an image. +// all_gt_bboxes: stores ground truth bboxes for the batch. +// prior_bboxes: stores all the prior bboxes in the format of NormalizedBBox. +// prior_variances: stores all the variances needed by prior bboxes. +// all_match_overlaps: stores jaccard overlap between predictions and gt. +// multibox_loss_param: stores the parameters for MultiBoxLossLayer. +// all_match_indices: stores mapping between predictions and ground truth. +// all_loc_loss: stores the confidence loss per location for each image. +template +void MineHardExamples(const TBlob& conf_blob, + const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const vector > >& all_match_overlaps, + const MultiBoxLossParameter& multibox_loss_param, + int* num_matches, int* num_negs, + vector > >* all_match_indices, + vector >* all_neg_indices); + +// Retrieve bounding box ground truth from gt_data. +// gt_data: 1 x 1 x num_gt x 7 blob. +// num_gt: the number of ground truth. +// background_label_id: the label for background class which is used to do +// santity check so that no ground truth contains it. +// all_gt_bboxes: stores ground truth for each image. Label of each bbox is +// stored in NormalizedBBox. +template +void GetGroundTruth(const Dtype* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map >* all_gt_bboxes); +// Store ground truth bboxes of same label in a group. +template +void GetGroundTruth(const Dtype* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map* all_gt_bboxes); + +// Get location predictions from loc_data. +// loc_data: num x num_preds_per_class * num_loc_classes * 4 blob. +// num: the number of images. +// num_preds_per_class: number of predictions per class. +// num_loc_classes: number of location classes. It is 1 if share_location is +// true; and is equal to number of classes needed to predict otherwise. +// share_location: if true, all classes share the same location prediction. +// loc_preds: stores the location prediction, where each item contains +// location prediction for an image. +template +void GetLocPredictions(const Dtype* loc_data, const int num, + const int num_preds_per_class, const int num_loc_classes, + const bool share_location, vector* loc_preds); + +// Encode the localization prediction and ground truth for each matched prior. +// all_loc_preds: stores the location prediction, where each item contains +// location prediction for an image. +// all_gt_bboxes: stores ground truth bboxes for the batch. +// all_match_indices: stores mapping between predictions and ground truth. +// prior_bboxes: stores all the prior bboxes in the format of NormalizedBBox. +// prior_variances: stores all the variances needed by prior bboxes. +// multibox_loss_param: stores the parameters for MultiBoxLossLayer. +// loc_pred_data: stores the location prediction results. +// loc_gt_data: stores the encoded location ground truth. +template +void EncodeLocPrediction(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector > >& all_match_indices, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + Dtype* loc_pred_data, Dtype* loc_gt_data); + +// Compute the localization loss per matched prior. +// loc_pred: stores the location prediction results. +// loc_gt: stores the encoded location ground truth. +// all_match_indices: stores mapping between predictions and ground truth. +// num: number of images in the batch. +// num_priors: total number of priors. +// loc_loss_type: type of localization loss, Smooth_L1 or L2. +// all_loc_loss: stores the localization loss for all priors in a batch. +template +void ComputeLocLoss(const TBlob& loc_pred, const TBlob& loc_gt, + const vector > >& all_match_indices, + const int num, const int num_priors, const LocLossType loc_loss_type, + vector >* all_loc_loss); + +// Get confidence predictions from conf_data. +// conf_data: num x num_preds_per_class * num_classes blob. +// num: the number of images. +// num_preds_per_class: number of predictions per class. +// num_classes: number of classes. +// conf_preds: stores the confidence prediction, where each item contains +// confidence prediction for an image. +template +void GetConfidenceScores(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + vector > >* conf_scores); + +// Get confidence predictions from conf_data. +// conf_data: num x num_preds_per_class * num_classes blob. +// num: the number of images. +// num_preds_per_class: number of predictions per class. +// num_classes: number of classes. +// class_major: if true, data layout is +// num x num_classes x num_preds_per_class; otherwise, data layerout is +// num x num_preds_per_class * num_classes. +// conf_preds: stores the confidence prediction, where each item contains +// confidence prediction for an image. +template +void GetConfidenceScores(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const bool class_major, vector > >* conf_scores); + +// Compute the confidence loss for each prior from conf_data. +// conf_data: num x num_preds_per_class * num_classes blob. +// num: the number of images. +// num_preds_per_class: number of predictions per class. +// num_classes: number of classes. +// background_label_id: it is used to skip selecting max scores from +// background class. +// loss_type: compute the confidence loss according to the loss type. +// all_match_indices: stores mapping between predictions and ground truth. +// all_gt_bboxes: stores ground truth bboxes from the batch. +// all_conf_loss: stores the confidence loss per location for each image. +template +void ComputeConfLoss(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); + +// Compute the negative confidence loss for each prior from conf_data. +// conf_data: num x num_preds_per_class * num_classes blob. +// num: the number of images. +// num_preds_per_class: number of predictions per class. +// num_classes: number of classes. +// background_label_id: it is used to skip selecting max scores from +// background class. +// loss_type: compute the confidence loss according to the loss type. +// all_conf_loss: stores the confidence loss per location for each image. +template +void ComputeConfLoss(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + vector >* all_conf_loss); + +// Encode the confidence predictions and ground truth for each matched prior. +// conf_data: num x num_priors * num_classes blob. +// num: number of images. +// num_priors: number of priors (predictions) per image. +// multibox_loss_param: stores the parameters for MultiBoxLossLayer. +// all_match_indices: stores mapping between predictions and ground truth. +// all_neg_indices: stores the indices for negative samples. +// all_gt_bboxes: stores ground truth bboxes for the batch. +// conf_pred_data: stores the confidence prediction results. +// conf_gt_data: stores the confidence ground truth. +template +void EncodeConfPrediction(const Dtype* conf_data, const int num, + const int num_priors, const MultiBoxLossParameter& multibox_loss_param, + const vector > >& all_match_indices, + const vector >& all_neg_indices, + const map >& all_gt_bboxes, + Dtype* conf_pred_data, Dtype* conf_gt_data); + +// Get prior bounding boxes from prior_data. +// prior_data: 1 x 2 x num_priors * 4 x 1 blob. +// num_priors: number of priors. +// prior_bboxes: stores all the prior bboxes in the format of NormalizedBBox. +// prior_variances: stores all the variances needed by prior bboxes. +template +void GetPriorBBoxes(const Dtype* prior_data, const int num_priors, + vector* prior_bboxes, + vector >* prior_variances); + +// Get detection results from det_data. +// det_data: 1 x 1 x num_det x 7 blob. +// num_det: the number of detections. +// background_label_id: the label for background class which is used to do +// santity check so that no detection contains it. +// all_detections: stores detection results for each class from each image. +template +void GetDetectionResults(const Dtype* det_data, const int num_det, + const int background_label_id, + map* all_detections); + +// Get top_k scores with corresponding indices. +// scores: a set of scores. +// indices: a set of corresponding indices. +// top_k: if -1, keep all; otherwise, keep at most top_k. +// score_index_vec: store the sorted (score, index) pair. +void GetTopKScoreIndex(const vector& scores, const vector& indices, + const int top_k, vector >* score_index_vec); + +// Get max scores with corresponding indices. +// scores: a set of scores. +// threshold: only consider scores higher than the threshold. +// top_k: if -1, keep all; otherwise, keep at most top_k. +// score_index_vec: store the sorted (score, index) pair. +void GetMaxScoreIndex(const vector& scores, const float threshold, + const int top_k, vector >* score_index_vec); + +// Get max scores with corresponding indices. +// scores: an array of scores. +// num: number of total scores in the array. +// threshold: only consider scores higher than the threshold. +// top_k: if -1, keep all; otherwise, keep at most top_k. +// score_index_vec: store the sorted (score, index) pair. +template +void GetMaxScoreIndex(const Dtype* scores, const int num, const float threshold, + const int top_k, vector >* score_index_vec); + +// Get max scores with corresponding indices. +// scores: a set of scores. +// threshold: only consider scores higher than the threshold. +// top_k: if -1, keep all; otherwise, keep at most top_k. +// score_index_vec: store the sorted (score, index) pair. +void GetMaxScoreIndex(const vector& scores, const float threshold, + const int top_k, vector >* score_index_vec); + +// Do non maximum suppression given bboxes and scores. +// bboxes: a set of bounding boxes. +// scores: a set of corresponding confidences. +// threshold: the threshold used in non maximum suppression. +// top_k: if not -1, keep at most top_k picked indices. +// reuse_overlaps: if true, use and update overlaps; otherwise, always +// compute overlap. +// overlaps: a temp place to optionally store the overlaps between pairs of +// bboxes if reuse_overlaps is true. +// indices: the kept indices of bboxes after nms. +void ApplyNMS(const vector& bboxes, const vector& scores, + const float threshold, const int top_k, const bool reuse_overlaps, + map >* overlaps, vector* indices); + +void ApplyNMS(const vector& bboxes, const vector& scores, + const float threshold, const int top_k, vector* indices); + +void ApplyNMS(const bool* overlapped, const int num, vector* indices); + +// Do non maximum suppression given bboxes and scores. +// Inspired by Piotr Dollar's NMS implementation in EdgeBox. +// https://goo.gl/jV3JYS +// bboxes: a set of bounding boxes. +// scores: a set of corresponding confidences. +// score_threshold: a threshold used to filter detection results. +// nms_threshold: a threshold used in non maximum suppression. +// eta: adaptation rate for nms threshold (see Piotr's paper). +// top_k: if not -1, keep at most top_k picked indices. +// indices: the kept indices of bboxes after nms. +void ApplyNMSFast(const vector& bboxes, + const vector& scores, const float score_threshold, + const float nms_threshold, const float eta, const int top_k, + vector* indices); + +// Do non maximum suppression based on raw bboxes and scores data. +// Inspired by Piotr Dollar's NMS implementation in EdgeBox. +// https://goo.gl/jV3JYS +// bboxes: an array of bounding boxes. +// scores: an array of corresponding confidences. +// num: number of total boxes/confidences in the array. +// score_threshold: a threshold used to filter detection results. +// nms_threshold: a threshold used in non maximum suppression. +// eta: adaptation rate for nms threshold (see Piotr's paper). +// top_k: if not -1, keep at most top_k picked indices. +// indices: the kept indices of bboxes after nms. +template +void ApplyNMSFast(const Dtype* bboxes, const Dtype* scores, const int num, + const float score_threshold, const float nms_threshold, + const float eta, const int top_k, vector* indices); + +// Compute cumsum of a set of pairs. +void CumSum(const vector >& pairs, vector* cumsum); + +// Compute average precision given true positive and false positive vectors. +// tp: contains pairs of scores and true positive. +// num_pos: number of positives. +// fp: contains pairs of scores and false positive. +// ap_version: different ways of computing Average Precision. +// Check https://sanchom.wordpress.com/tag/average-precision/ for details. +// 11point: the 11-point interpolated average precision. Used in VOC2007. +// MaxIntegral: maximally interpolated AP. Used in VOC2012/ILSVRC. +// Integral: the natural integral of the precision-recall curve. +// prec: stores the computed precisions. +// rec: stores the computed recalls. +// ap: the computed Average Precision. +void ComputeAP(const vector >& tp, const int num_pos, + const vector >& fp, const string ap_version, + vector* prec, vector* rec, float* ap); + +template +__host__ __device__ Dtype BBoxSizeGPU(const Dtype* bbox, + const bool normalized = true); + +template +__host__ __device__ Dtype JaccardOverlapGPU(const Dtype* bbox1, + const Dtype* bbox2); + +template +void DecodeBBoxesGPU(const int nthreads, + const Dtype* loc_data, const Dtype* prior_data, + const CodeType code_type, const bool variance_encoded_in_target, + const int num_priors, const bool share_location, + const int num_loc_classes, const int background_label_id, + const bool clip_bbox, Dtype* bbox_data); + +template +void PermuteDataGPU(const int nthreads, + const Dtype* data, const int num_classes, const int num_data, + const int num_dim, Dtype* new_data); + +template +void SoftMaxGPU(const Dtype* data, const int outer_num, const int channels, + const int inner_num, Dtype* prob); + +template +void ComputeOverlappedGPU(const int nthreads, + const Dtype* bbox_data, const int num_bboxes, const int num_classes, + const Dtype overlap_threshold, bool* overlapped_data); + +template +void ComputeOverlappedByIdxGPU(const int nthreads, + const Dtype* bbox_data, const Dtype overlap_threshold, + const int* idx, const int num_idx, bool* overlapped_data); + +template +void ApplyNMSGPU(const Dtype* bbox_data, const Dtype* conf_data, + const int num_bboxes, const float confidence_threshold, + const int top_k, const float nms_threshold, vector* indices); + +template +void GetDetectionsGPU(const Dtype* bbox_data, const Dtype* conf_data, + const int image_id, const int label, const vector& indices, + const bool clip_bbox, TBlob* detection_blob); + +template + void ComputeConfLossGPU(const TBlob& conf_blob, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); + +vector GetColors(const int n); + +template +void VisualizeBBox(const vector& images, const Blob* detections, + const float threshold, const vector& colors, + const map& label_to_display_name, + const string& save_file); + +} // namespace caffe + +#endif // CAFFE_UTIL_BBOX_UTIL_H_ diff --git a/include/caffe/util/cudnn.hpp b/include/caffe/util/cudnn.hpp index 51978d7b148..0c5de457fb6 100644 --- a/include/caffe/util/cudnn.hpp +++ b/include/caffe/util/cudnn.hpp @@ -127,6 +127,22 @@ cudnnDataType_t cudnn_data_type(Type math) { return ret; } +template +inline void createFilterDesc(cudnnFilterDescriptor_t* desc, int n, int c, int h, int w) { + CUDNN_CHECK(cudnnCreateFilterDescriptor(desc)); + CUDNN_CHECK(cudnnSetFilter4dDescriptor(*desc, cudnn::dataType::type, + CUDNN_TENSOR_NCHW, n, c, h, w)); +} + +inline void setConvolutionDesc(Type math, cudnnConvolutionDescriptor_t conv, + int pad_h, int pad_w, int stride_h, int stride_w, int dilation_h, int dilation_w) { + int padA[2] = {pad_h, pad_w}; + int strideA[2] = {stride_h, stride_w}; + int upscaleA[2] = {dilation_h, dilation_w}; + CUDNN_CHECK(cudnnSetConvolutionNdDescriptor(conv, 2, padA, strideA, upscaleA, + CUDNN_CROSS_CORRELATION, cudnn::cudnn_data_type(math))); +} + template inline void createTensor4dDesc(cudnnTensorDescriptor_t *desc) { CUDNN_CHECK(cudnnCreateTensorDescriptor(desc)); diff --git a/include/caffe/util/db.hpp b/include/caffe/util/db.hpp index 1239d579e2f..4d0186ac2f6 100644 --- a/include/caffe/util/db.hpp +++ b/include/caffe/util/db.hpp @@ -21,6 +21,7 @@ class Cursor { virtual const void* data() const = 0; virtual size_t size() const = 0; virtual bool parse(Datum* datum) const = 0; + virtual bool parse(AnnotatedDatum* datum) const = 0; virtual bool parse(C2TensorProtos* c2p) const = 0; virtual bool valid() const = 0; diff --git a/include/caffe/util/db_leveldb.hpp b/include/caffe/util/db_leveldb.hpp index e228ffdeffb..92c7f234ec2 100644 --- a/include/caffe/util/db_leveldb.hpp +++ b/include/caffe/util/db_leveldb.hpp @@ -20,9 +20,13 @@ class LevelDBCursor : public Cursor { void Next() override { iter_->Next(); } string key() const override { return iter_->key().ToString(); } string value() const override { return iter_->value().ToString(); } + bool parse(Datum* datum) const override { return datum->ParseFromArray(iter_->value().data(), iter_->value().size()); } + bool parse(AnnotatedDatum* adatum) const override { + return adatum->ParseFromArray(iter_->value().data(), iter_->value().size()); + } bool parse(C2TensorProtos* c2p) const override { return c2p->ParseFromArray(iter_->value().data(), iter_->value().size()); } diff --git a/include/caffe/util/db_lmdb.hpp b/include/caffe/util/db_lmdb.hpp index be8b77b8d1a..e7609ba2f6e 100644 --- a/include/caffe/util/db_lmdb.hpp +++ b/include/caffe/util/db_lmdb.hpp @@ -38,6 +38,9 @@ class LMDBCursor : public Cursor { bool parse(Datum* datum) const override { return datum->ParseFromArray(mdb_value_.mv_data, mdb_value_.mv_size); } + bool parse(AnnotatedDatum* adatum) const override { + return adatum->ParseFromArray(mdb_value_.mv_data, mdb_value_.mv_size); + } bool parse(C2TensorProtos* c2p) const override { return c2p->ParseFromArray(mdb_value_.mv_data, mdb_value_.mv_size); } diff --git a/include/caffe/util/gpu_memory.hpp b/include/caffe/util/gpu_memory.hpp index 19d988e1688..b3807cbaccf 100644 --- a/include/caffe/util/gpu_memory.hpp +++ b/include/caffe/util/gpu_memory.hpp @@ -112,6 +112,21 @@ struct GPUMemory { DISABLE_COPY_MOVE_AND_ASSIGN(Workspace); }; + struct PinnedBuffer { + explicit PinnedBuffer(size_t size); + ~PinnedBuffer(); + + void* get() { + return dptr_; + } + + private: + void* hptr_; + void* dptr_; + + DISABLE_COPY_MOVE_AND_ASSIGN(PinnedBuffer); + }; + private: struct Manager { Manager(); diff --git a/include/caffe/util/im_transforms.hpp b/include/caffe/util/im_transforms.hpp new file mode 100644 index 00000000000..dbbc1a5ba8e --- /dev/null +++ b/include/caffe/util/im_transforms.hpp @@ -0,0 +1,86 @@ +#ifndef IM_TRANSFORMS_HPP +#define IM_TRANSFORMS_HPP + +#include +#include + +#include + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +// Generate random number given the probablities for each number. +int roll_weighted_die(const std::vector& probabilities); + +void UpdateBBoxByResizePolicy(const ResizeParameter& param, + const int old_width, const int old_height, + NormalizedBBox* bbox); + +void InferNewSize(const ResizeParameter& resize_param, + const int old_width, const int old_height, + int* new_width, int* new_height); + +template +bool is_border(const cv::Mat& edge, T color); + +// Auto cropping image. +template +cv::Rect CropMask(const cv::Mat& src, T point, int padding = 2); + +cv::Mat colorReduce(const cv::Mat& image, int div = 64); + +void fillEdgeImage(const cv::Mat& edgesIn, cv::Mat* filledEdgesOut); + +void CenterObjectAndFillBg(const cv::Mat& in_img, const bool fill_bg, + cv::Mat* out_img); + +cv::Mat AspectKeepingResizeAndPad(const cv::Mat& in_img, + const int new_width, const int new_height, + const int pad_type = cv::BORDER_CONSTANT, + const cv::Scalar pad = cv::Scalar(0, 0, 0), + const int interp_mode = cv::INTER_LINEAR); + +cv::Mat AspectKeepingResizeBySmall(const cv::Mat& in_img, + const int new_width, const int new_height, + const int interp_mode = cv::INTER_LINEAR); + +void constantNoise(const int n, const vector& val, cv::Mat* image); + +cv::Mat ApplyResize(const cv::Mat& in_img, const ResizeParameter& param); + +cv::Mat ApplyNoise(const cv::Mat& in_img, const NoiseParameter& param); + + +void RandomBrightness(const cv::Mat& in_img, cv::Mat* out_img, + const float brightness_prob, const float brightness_delta); + +void AdjustBrightness(const cv::Mat& in_img, const float delta, + cv::Mat* out_img); + +void RandomContrast(const cv::Mat& in_img, cv::Mat* out_img, + const float contrast_prob, const float lower, const float upper); + +void AdjustContrast(const cv::Mat& in_img, const float delta, + cv::Mat* out_img); + +void RandomSaturation(const cv::Mat& in_img, cv::Mat* out_img, + const float saturation_prob, const float lower, const float upper); + +void AdjustSaturation(const cv::Mat& in_img, const float delta, + cv::Mat* out_img); + +void RandomHue(const cv::Mat& in_img, cv::Mat* out_img, + const float hue_prob, const float hue_delta); + +void AdjustHue(const cv::Mat& in_img, const float delta, cv::Mat* out_img); + +void RandomOrderChannels(const cv::Mat& in_img, cv::Mat* out_img, + const float random_order_prob); + +cv::Mat ApplyDistort(const cv::Mat& in_img, const DistortionParameter& param); + +} // namespace caffe + +#endif // IM_TRANSFORMS_HPP diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index dacffcd96eb..ec98f5a43c0 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -7,6 +7,7 @@ #include #include #include // NOLINT(readability/streams) +#include #include #include "google/protobuf/message.h" @@ -131,6 +132,24 @@ inline bool ReadFileToDatum(const string& filename, Datum* datum) { return ReadFileToDatum(filename, -1, datum); } +bool ReadImageToDatum(const string& filename, const int label, + const int height, const int width, const int min_dim, const int max_dim, + const bool is_color, const std::string & encoding, Datum* datum); + +inline bool ReadImageToDatum(const string& filename, const int label, + const int height, const int width, const int min_dim, const int max_dim, + const bool is_color, Datum* datum) { + return ReadImageToDatum(filename, label, height, width, min_dim, max_dim, + is_color, "", datum); +} + +inline bool ReadImageToDatum(const string& filename, const int label, + const int height, const int width, const int min_dim, const int max_dim, + Datum* datum) { + return ReadImageToDatum(filename, label, height, width, min_dim, max_dim, + true, datum); +} + bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, const bool is_color, const std::string & encoding, Datum* datum); @@ -161,6 +180,78 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, true, encoding, datum); } + +void GetImageSize(const string& filename, int* height, int* width); + +bool ReadRichImageToAnnotatedDatum(const string& filename, + const string& labelname, const int height, const int width, + const int min_dim, const int max_dim, const bool is_color, + const std::string& encoding, const AnnotatedDatum_AnnotationType type, + const string& labeltype, const std::map& name_to_label, + AnnotatedDatum* anno_datum); + +inline bool ReadRichImageToAnnotatedDatum(const string& filename, + const string& labelname, const int height, const int width, + const bool is_color, const std::string & encoding, + const AnnotatedDatum_AnnotationType type, const string& labeltype, + const std::map& name_to_label, AnnotatedDatum* anno_datum) { + return ReadRichImageToAnnotatedDatum(filename, labelname, height, width, 0, 0, + is_color, encoding, type, labeltype, name_to_label, + anno_datum); +} + +bool ReadXMLToAnnotatedDatum(const string& labelname, const int img_height, + const int img_width, const std::map& name_to_label, + AnnotatedDatum* anno_datum); + +bool ReadJSONToAnnotatedDatum(const string& labelname, const int img_height, + const int img_width, const std::map& name_to_label, + AnnotatedDatum* anno_datum); + +bool ReadTxtToAnnotatedDatum(const string& labelname, const int height, + const int width, AnnotatedDatum* anno_datum); + +bool ReadLabelFileToLabelMap(const string& filename, bool include_background, + const string& delimiter, LabelMap* map); + +inline bool ReadLabelFileToLabelMap(const string& filename, + bool include_background, LabelMap* map) { + return ReadLabelFileToLabelMap(filename, include_background, " ", map); +} + +inline bool ReadLabelFileToLabelMap(const string& filename, LabelMap* map) { + return ReadLabelFileToLabelMap(filename, true, map); +} + +bool MapNameToLabel(const LabelMap& map, const bool strict_check, + std::map* name_to_label); + +inline bool MapNameToLabel(const LabelMap& map, + std::map* name_to_label) { + return MapNameToLabel(map, true, name_to_label); +} + +bool MapLabelToName(const LabelMap& map, const bool strict_check, + std::map* label_to_name); + +inline bool MapLabelToName(const LabelMap& map, + std::map* label_to_name) { + return MapLabelToName(map, true, label_to_name); +} + +bool MapLabelToDisplayName(const LabelMap& map, const bool strict_check, + std::map* label_to_display_name); + +inline bool MapLabelToDisplayName(const LabelMap& map, + std::map* label_to_display_name) { + return MapLabelToDisplayName(map, true, label_to_display_name); +} +cv::Mat ReadImageToCVMat(const string& filename, const int height, + const int width, const int min_dim, const int max_dim, const bool is_color); + +cv::Mat ReadImageToCVMat(const string& filename, const int height, + const int width, const int min_dim, const int max_dim); + cv::Mat ReadImageToCVMat(const string& filename, int height, int width, bool is_color, int short_side = 0); @@ -177,6 +268,9 @@ cv::Mat DecodeDatumToCVMatNative(const Datum& datum); cv::Mat DecodeDatumToCVMat(const Datum& datum, bool is_color); bool DecodeDatumNative(Datum* datum); bool DecodeDatum(Datum* datum, bool is_color); +void EncodeCVMatToDatum(const cv::Mat& cv_img, const string& encoding, + Datum* datum); + void CVMatToDatum(const cv::Mat& cv_img, Datum& datum); vector DatumToCVMat(const Datum& datum, cv::Mat& img, bool shape_only); vector DecodeDatumToCVMat(const Datum& datum, int color_mode, cv::Mat& cv_img, diff --git a/include/caffe/util/sampler.hpp b/include/caffe/util/sampler.hpp new file mode 100644 index 00000000000..9f0280d79f6 --- /dev/null +++ b/include/caffe/util/sampler.hpp @@ -0,0 +1,39 @@ +#ifndef CAFFE_UTIL_SAMPLER_H_ +#define CAFFE_UTIL_SAMPLER_H_ + +#include + +#include "glog/logging.h" + +#include "caffe/caffe.hpp" + +namespace caffe { + +// Find all annotated NormalizedBBox. +void GroupObjectBBoxes(const AnnotatedDatum& anno_datum, + vector* object_bboxes); + +// Check if a sampled bbox satisfy the constraints with all object bboxes. +bool SatisfySampleConstraint(const NormalizedBBox& sampled_bbox, + const vector& object_bboxes, + const SampleConstraint& sample_constraint); + +// Sample a NormalizedBBox given the specifictions. +void SampleBBox(const Sampler& sampler, NormalizedBBox* sampled_bbox); + +// Generate samples from NormalizedBBox using the BatchSampler. +void GenerateSamples(const NormalizedBBox& source_bbox, + const vector& object_bboxes, + const BatchSampler& batch_sampler, + vector* sampled_bboxes); + +// Generate samples from AnnotatedDatum using the BatchSampler. +// All sampled bboxes which satisfy the constraints defined in BatchSampler +// is stored in sampled_bboxes. +void GenerateBatchSamples(const AnnotatedDatum& anno_datum, + const vector& batch_samplers, + vector* sampled_bboxes); + +} // namespace caffe + +#endif // CAFFE_UTIL_SAMPLER_H_ diff --git a/models/VGGNet/coco/SSD_300x300/deploy.prototxt b/models/VGGNet/coco/SSD_300x300/deploy.prototxt new file mode 100644 index 00000000000..d5e2116ad8a --- /dev/null +++ b/models/VGGNet/coco/SSD_300x300/deploy.prototxt @@ -0,0 +1,1629 @@ +name: "VGG_coco_SSD_300x300_deploy" +input: "data" +input_shape { + dim: 1 + dim: 3 + dim: 300 + dim: 300 +} +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 1024 + pad: 6 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 6 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 1024 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "conv6_1" + type: "Convolution" + bottom: "fc7" + top: "conv6_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1" + top: "conv6_1" +} +layer { + name: "conv6_2" + type: "Convolution" + bottom: "conv6_1" + top: "conv6_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2" + top: "conv6_2" +} +layer { + name: "conv7_1" + type: "Convolution" + bottom: "conv6_2" + top: "conv7_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1" + top: "conv7_1" +} +layer { + name: "conv7_2" + type: "Convolution" + bottom: "conv7_1" + top: "conv7_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2" + top: "conv7_2" +} +layer { + name: "conv8_1" + type: "Convolution" + bottom: "conv7_2" + top: "conv8_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_1_relu" + type: "ReLU" + bottom: "conv8_1" + top: "conv8_1" +} +layer { + name: "conv8_2" + type: "Convolution" + bottom: "conv8_1" + top: "conv8_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_relu" + type: "ReLU" + bottom: "conv8_2" + top: "conv8_2" +} +layer { + name: "conv9_1" + type: "Convolution" + bottom: "conv8_2" + top: "conv9_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_1_relu" + type: "ReLU" + bottom: "conv9_1" + top: "conv9_1" +} +layer { + name: "conv9_2" + type: "Convolution" + bottom: "conv9_1" + top: "conv9_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_relu" + type: "ReLU" + bottom: "conv9_2" + top: "conv9_2" +} +layer { + name: "conv4_3_norm" + type: "Normalize" + bottom: "conv4_3" + top: "conv4_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 20.0 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 21.0 + max_size: 45.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 8.0 + offset: 0.5 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 45.0 + max_size: 99.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 16.0 + offset: 0.5 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 99.0 + max_size: 153.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 32.0 + offset: 0.5 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 153.0 + max_size: 207.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 64.0 + offset: 0.5 + } +} +layer { + name: "conv8_2_mbox_loc" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_mbox_loc_perm" + type: "Permute" + bottom: "conv8_2_mbox_loc" + top: "conv8_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv8_2_mbox_loc_perm" + top: "conv8_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_conf" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_mbox_conf_perm" + type: "Permute" + bottom: "conv8_2_mbox_conf" + top: "conv8_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv8_2_mbox_conf_perm" + top: "conv8_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv8_2" + bottom: "data" + top: "conv8_2_mbox_priorbox" + prior_box_param { + min_size: 207.0 + max_size: 261.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 100.0 + offset: 0.5 + } +} +layer { + name: "conv9_2_mbox_loc" + type: "Convolution" + bottom: "conv9_2" + top: "conv9_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_mbox_loc_perm" + type: "Permute" + bottom: "conv9_2_mbox_loc" + top: "conv9_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv9_2_mbox_loc_perm" + top: "conv9_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_conf" + type: "Convolution" + bottom: "conv9_2" + top: "conv9_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_mbox_conf_perm" + type: "Permute" + bottom: "conv9_2_mbox_conf" + top: "conv9_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv9_2_mbox_conf_perm" + top: "conv9_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv9_2" + bottom: "data" + top: "conv9_2_mbox_priorbox" + prior_box_param { + min_size: 261.0 + max_size: 315.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 300.0 + offset: 0.5 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + bottom: "conv8_2_mbox_loc_flat" + bottom: "conv9_2_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + bottom: "conv8_2_mbox_conf_flat" + bottom: "conv9_2_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + bottom: "conv8_2_mbox_priorbox" + bottom: "conv9_2_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} +layer { + name: "mbox_conf_reshape" + type: "Reshape" + bottom: "mbox_conf" + top: "mbox_conf_reshape" + reshape_param { + shape { + dim: 0 + dim: -1 + dim: 81 + } + } +} +layer { + name: "mbox_conf_softmax" + type: "Softmax" + bottom: "mbox_conf_reshape" + top: "mbox_conf_softmax" + softmax_param { + axis: 2 + } +} +layer { + name: "mbox_conf_flatten" + type: "Flatten" + bottom: "mbox_conf_softmax" + top: "mbox_conf_flatten" + flatten_param { + axis: 1 + } +} +layer { + name: "detection_out" + type: "DetectionOutput" + bottom: "mbox_loc" + bottom: "mbox_conf_flatten" + bottom: "mbox_priorbox" + top: "detection_out" + include { + phase: TEST + } + detection_output_param { + num_classes: 81 + share_location: true + background_label_id: 0 + nms_param { + nms_threshold: 0.449999988079 + top_k: 400 + } + save_output_param { + output_directory: "/home/snikolaev/data/mscoco/results/SSD_300x300" + output_name_prefix: "detections_minival_ssd300_results" + output_format: "COCO" + label_map_file: "data/coco/labelmap_coco.prototxt" + name_size_file: "data/coco/test2014_name_size.txt" + num_test_image: 5000 + } + code_type: CENTER_SIZE + keep_top_k: 200 + confidence_threshold: 0.00999999977648 + } +} + diff --git a/models/VGGNet/coco/SSD_300x300/solver.prototxt b/models/VGGNet/coco/SSD_300x300/solver.prototxt new file mode 100644 index 00000000000..1e5cc781df3 --- /dev/null +++ b/models/VGGNet/coco/SSD_300x300/solver.prototxt @@ -0,0 +1,33 @@ +train_net: "models/VGGNet/coco/SSD_300x300/train.prototxt" +test_net: "models/VGGNet/coco/SSD_300x300/test.prototxt" +test_iter: 156 #625 +test_interval: 1000 + +base_lr: 0.001 + +lr_policy: "poly" +power: 2 + +display: 10 +max_iter: 5000 #400000 + +#lr_policy: "multistep" +#gamma: 0.10000000149 + +momentum: 0.9 +weight_decay: 0.0005 +snapshot: 1000 #40000 +snapshot_prefix: "models/VGGNet/coco/SSD_300x300/VGG_coco_SSD_300x300" +solver_mode: GPU +device_id: 0 +debug_info: false +snapshot_after_train: true +test_initialization: false +average_loss: 10 +#stepvalue: 3500 #280000 +#stepvalue: 4500 #360000 +#stepvalue: 5000 #400000 +#iter_size: 1 +type: "SGD" +eval_type: "detection" +ap_version: "11point" diff --git a/models/VGGNet/coco/SSD_300x300/test.prototxt b/models/VGGNet/coco/SSD_300x300/test.prototxt new file mode 100644 index 00000000000..56b530e25a1 --- /dev/null +++ b/models/VGGNet/coco/SSD_300x300/test.prototxt @@ -0,0 +1,1671 @@ +name: "VGG_coco_SSD_300x300_test" +layer { + name: "data" + type: "AnnotatedData" + top: "data" + top: "label" + include { + phase: TEST + } + transform_param { + mean_value: 104.0 + mean_value: 117.0 + mean_value: 123.0 + force_color: true + resize_param { + prob: 1.0 + resize_mode: WARP + height: 300 + width: 300 + interp_mode: LINEAR + } + } + data_param { + source: "examples/coco/coco_minival_lmdb" + batch_size: 32 #8 + backend: LMDB + } + annotated_data_param { + batch_sampler { + } + label_map_file: "data/coco/labelmap_coco.prototxt" + } +} +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 1024 + pad: 6 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 6 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 1024 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "conv6_1" + type: "Convolution" + bottom: "fc7" + top: "conv6_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1" + top: "conv6_1" +} +layer { + name: "conv6_2" + type: "Convolution" + bottom: "conv6_1" + top: "conv6_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2" + top: "conv6_2" +} +layer { + name: "conv7_1" + type: "Convolution" + bottom: "conv6_2" + top: "conv7_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1" + top: "conv7_1" +} +layer { + name: "conv7_2" + type: "Convolution" + bottom: "conv7_1" + top: "conv7_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2" + top: "conv7_2" +} +layer { + name: "conv8_1" + type: "Convolution" + bottom: "conv7_2" + top: "conv8_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_1_relu" + type: "ReLU" + bottom: "conv8_1" + top: "conv8_1" +} +layer { + name: "conv8_2" + type: "Convolution" + bottom: "conv8_1" + top: "conv8_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_relu" + type: "ReLU" + bottom: "conv8_2" + top: "conv8_2" +} +layer { + name: "conv9_1" + type: "Convolution" + bottom: "conv8_2" + top: "conv9_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_1_relu" + type: "ReLU" + bottom: "conv9_1" + top: "conv9_1" +} +layer { + name: "conv9_2" + type: "Convolution" + bottom: "conv9_1" + top: "conv9_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_relu" + type: "ReLU" + bottom: "conv9_2" + top: "conv9_2" +} +layer { + name: "conv4_3_norm" + type: "Normalize" + bottom: "conv4_3" + top: "conv4_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 20.0 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 21.0 + max_size: 45.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 8.0 + offset: 0.5 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 45.0 + max_size: 99.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 16.0 + offset: 0.5 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 99.0 + max_size: 153.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 32.0 + offset: 0.5 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 153.0 + max_size: 207.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 64.0 + offset: 0.5 + } +} +layer { + name: "conv8_2_mbox_loc" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_mbox_loc_perm" + type: "Permute" + bottom: "conv8_2_mbox_loc" + top: "conv8_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv8_2_mbox_loc_perm" + top: "conv8_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_conf" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_mbox_conf_perm" + type: "Permute" + bottom: "conv8_2_mbox_conf" + top: "conv8_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv8_2_mbox_conf_perm" + top: "conv8_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv8_2" + bottom: "data" + top: "conv8_2_mbox_priorbox" + prior_box_param { + min_size: 207.0 + max_size: 261.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 100.0 + offset: 0.5 + } +} +layer { + name: "conv9_2_mbox_loc" + type: "Convolution" + bottom: "conv9_2" + top: "conv9_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_mbox_loc_perm" + type: "Permute" + bottom: "conv9_2_mbox_loc" + top: "conv9_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv9_2_mbox_loc_perm" + top: "conv9_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_conf" + type: "Convolution" + bottom: "conv9_2" + top: "conv9_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_mbox_conf_perm" + type: "Permute" + bottom: "conv9_2_mbox_conf" + top: "conv9_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv9_2_mbox_conf_perm" + top: "conv9_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv9_2" + bottom: "data" + top: "conv9_2_mbox_priorbox" + prior_box_param { + min_size: 261.0 + max_size: 315.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 300.0 + offset: 0.5 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + bottom: "conv8_2_mbox_loc_flat" + bottom: "conv9_2_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + bottom: "conv8_2_mbox_conf_flat" + bottom: "conv9_2_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + bottom: "conv8_2_mbox_priorbox" + bottom: "conv9_2_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} +layer { + name: "mbox_conf_reshape" + type: "Reshape" + bottom: "mbox_conf" + top: "mbox_conf_reshape" + reshape_param { + shape { + dim: 0 + dim: -1 + dim: 81 + } + } +} +layer { + name: "mbox_conf_softmax" + type: "Softmax" + bottom: "mbox_conf_reshape" + top: "mbox_conf_softmax" + softmax_param { + axis: 2 + } +} +layer { + name: "mbox_conf_flatten" + type: "Flatten" + bottom: "mbox_conf_softmax" + top: "mbox_conf_flatten" + flatten_param { + axis: 1 + } +} +layer { + name: "detection_out" + type: "DetectionOutput" + bottom: "mbox_loc" + bottom: "mbox_conf_flatten" + bottom: "mbox_priorbox" + top: "detection_out" + include { + phase: TEST + } + detection_output_param { + num_classes: 81 + share_location: true + background_label_id: 0 + nms_param { + nms_threshold: 0.449999988079 + top_k: 400 + } + save_output_param { + output_directory: "/home/snikolaev/data/mscoco/results/SSD_300x300" + output_name_prefix: "detections_minival_ssd300_results" + output_format: "COCO" + label_map_file: "data/coco/labelmap_coco.prototxt" + name_size_file: "data/coco/test2014_name_size.txt" + num_test_image: 5000 + } + code_type: CENTER_SIZE + keep_top_k: 200 + confidence_threshold: 0.00999999977648 + } +} +layer { + name: "detection_eval" + type: "DetectionEvaluate" + bottom: "detection_out" + bottom: "label" + top: "detection_eval" + include { + phase: TEST + } + detection_evaluate_param { + num_classes: 81 + background_label_id: 0 + overlap_threshold: 0.5 + evaluate_difficult_gt: false + name_size_file: "data/coco/test2014_name_size.txt" + } +} + diff --git a/models/VGGNet/coco/SSD_300x300/train.prototxt b/models/VGGNet/coco/SSD_300x300/train.prototxt new file mode 100644 index 00000000000..289b4c7a9fa --- /dev/null +++ b/models/VGGNet/coco/SSD_300x300/train.prototxt @@ -0,0 +1,1733 @@ +name: "VGG_coco_SSD_300x300_train" +layer { + name: "data" + type: "AnnotatedData" + top: "data" + top: "label" + include { + phase: TRAIN + } + transform_param { + mirror: true + mean_value: 104.0 + mean_value: 117.0 + mean_value: 123.0 + force_color: true + resize_param { + prob: 1.0 + resize_mode: WARP + height: 300 + width: 300 + interp_mode: LINEAR + interp_mode: AREA + interp_mode: NEAREST + interp_mode: CUBIC + interp_mode: LANCZOS4 + } + emit_constraint { + emit_type: CENTER + } + distort_param { + brightness_prob: 0.5 + brightness_delta: 32.0 + contrast_prob: 0.5 + contrast_lower: 0.5 + contrast_upper: 1.5 + hue_prob: 0.5 + hue_delta: 18.0 + saturation_prob: 0.5 + saturation_lower: 0.5 + saturation_upper: 1.5 + random_order_prob: 0.0 + } + expand_param { + prob: 0.5 + max_expand_ratio: 4.0 + } + } + data_param { + source: "examples/coco/coco_train_lmdb" + batch_size: 128 #16 + backend: LMDB + } + annotated_data_param { + batch_sampler { + max_sample: 1 + max_trials: 1 + } + batch_sampler { + sampler { + min_scale: 0.300000011921 + max_scale: 1.0 + min_aspect_ratio: 0.5 + max_aspect_ratio: 2.0 + } + sample_constraint { + min_jaccard_overlap: 0.10000000149 + } + max_sample: 1 + max_trials: 50 + } + batch_sampler { + sampler { + min_scale: 0.300000011921 + max_scale: 1.0 + min_aspect_ratio: 0.5 + max_aspect_ratio: 2.0 + } + sample_constraint { + min_jaccard_overlap: 0.300000011921 + } + max_sample: 1 + max_trials: 50 + } + batch_sampler { + sampler { + min_scale: 0.300000011921 + max_scale: 1.0 + min_aspect_ratio: 0.5 + max_aspect_ratio: 2.0 + } + sample_constraint { + min_jaccard_overlap: 0.5 + } + max_sample: 1 + max_trials: 50 + } + batch_sampler { + sampler { + min_scale: 0.300000011921 + max_scale: 1.0 + min_aspect_ratio: 0.5 + max_aspect_ratio: 2.0 + } + sample_constraint { + min_jaccard_overlap: 0.699999988079 + } + max_sample: 1 + max_trials: 50 + } + batch_sampler { + sampler { + min_scale: 0.300000011921 + max_scale: 1.0 + min_aspect_ratio: 0.5 + max_aspect_ratio: 2.0 + } + sample_constraint { + min_jaccard_overlap: 0.899999976158 + } + max_sample: 1 + max_trials: 50 + } + batch_sampler { + sampler { + min_scale: 0.300000011921 + max_scale: 1.0 + min_aspect_ratio: 0.5 + max_aspect_ratio: 2.0 + } + sample_constraint { + max_jaccard_overlap: 1.0 + } + max_sample: 1 + max_trials: 50 + } + label_map_file: "data/coco/labelmap_coco.prototxt" + } +} +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 1 + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 1024 + pad: 6 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + dilation: 6 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 1024 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "conv6_1" + type: "Convolution" + bottom: "fc7" + top: "conv6_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1" + top: "conv6_1" +} +layer { + name: "conv6_2" + type: "Convolution" + bottom: "conv6_1" + top: "conv6_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2" + top: "conv6_2" +} +layer { + name: "conv7_1" + type: "Convolution" + bottom: "conv6_2" + top: "conv7_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1" + top: "conv7_1" +} +layer { + name: "conv7_2" + type: "Convolution" + bottom: "conv7_1" + top: "conv7_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2" + top: "conv7_2" +} +layer { + name: "conv8_1" + type: "Convolution" + bottom: "conv7_2" + top: "conv8_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_1_relu" + type: "ReLU" + bottom: "conv8_1" + top: "conv8_1" +} +layer { + name: "conv8_2" + type: "Convolution" + bottom: "conv8_1" + top: "conv8_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_relu" + type: "ReLU" + bottom: "conv8_2" + top: "conv8_2" +} +layer { + name: "conv9_1" + type: "Convolution" + bottom: "conv8_2" + top: "conv9_1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_1_relu" + type: "ReLU" + bottom: "conv9_1" + top: "conv9_1" +} +layer { + name: "conv9_2" + type: "Convolution" + bottom: "conv9_1" + top: "conv9_2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_relu" + type: "ReLU" + bottom: "conv9_2" + top: "conv9_2" +} +layer { + name: "conv4_3_norm" + type: "Normalize" + bottom: "conv4_3" + top: "conv4_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 20.0 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 21.0 + max_size: 45.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 8.0 + offset: 0.5 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 45.0 + max_size: 99.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 16.0 + offset: 0.5 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 99.0 + max_size: 153.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 32.0 + offset: 0.5 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 486 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 153.0 + max_size: 207.0 + aspect_ratio: 2.0 + aspect_ratio: 3.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 64.0 + offset: 0.5 + } +} +layer { + name: "conv8_2_mbox_loc" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_mbox_loc_perm" + type: "Permute" + bottom: "conv8_2_mbox_loc" + top: "conv8_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv8_2_mbox_loc_perm" + top: "conv8_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_conf" + type: "Convolution" + bottom: "conv8_2" + top: "conv8_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv8_2_mbox_conf_perm" + type: "Permute" + bottom: "conv8_2_mbox_conf" + top: "conv8_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv8_2_mbox_conf_perm" + top: "conv8_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv8_2" + bottom: "data" + top: "conv8_2_mbox_priorbox" + prior_box_param { + min_size: 207.0 + max_size: 261.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 100.0 + offset: 0.5 + } +} +layer { + name: "conv9_2_mbox_loc" + type: "Convolution" + bottom: "conv9_2" + top: "conv9_2_mbox_loc" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_mbox_loc_perm" + type: "Permute" + bottom: "conv9_2_mbox_loc" + top: "conv9_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv9_2_mbox_loc_perm" + top: "conv9_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_conf" + type: "Convolution" + bottom: "conv9_2" + top: "conv9_2_mbox_conf" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 0.0 + } + convolution_param { + num_output: 324 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv9_2_mbox_conf_perm" + type: "Permute" + bottom: "conv9_2_mbox_conf" + top: "conv9_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv9_2_mbox_conf_perm" + top: "conv9_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv9_2" + bottom: "data" + top: "conv9_2_mbox_priorbox" + prior_box_param { + min_size: 261.0 + max_size: 315.0 + aspect_ratio: 2.0 + flip: true + clip: false + variance: 0.10000000149 + variance: 0.10000000149 + variance: 0.20000000298 + variance: 0.20000000298 + step: 300.0 + offset: 0.5 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + bottom: "conv8_2_mbox_loc_flat" + bottom: "conv9_2_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + bottom: "conv8_2_mbox_conf_flat" + bottom: "conv9_2_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + bottom: "conv8_2_mbox_priorbox" + bottom: "conv9_2_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} +layer { + name: "mbox_loss" + type: "MultiBoxLoss" + bottom: "mbox_loc" + bottom: "mbox_conf" + bottom: "mbox_priorbox" + bottom: "label" + top: "mbox_loss" + include { + phase: TRAIN + } + propagate_down: true + propagate_down: true + propagate_down: false + propagate_down: false + loss_param { + normalization: VALID + } + multibox_loss_param { + loc_loss_type: SMOOTH_L1 + conf_loss_type: SOFTMAX + loc_weight: 1.0 + num_classes: 81 + share_location: true + match_type: PER_PREDICTION + overlap_threshold: 0.5 + use_prior_for_matching: true + background_label_id: 0 + use_difficult_gt: false + neg_pos_ratio: 3.0 + neg_overlap: 0.5 + code_type: CENTER_SIZE + ignore_cross_boundary_bbox: false + mining_type: MAX_NEGATIVE + } +} + diff --git a/python/caffe/net_spec.py b/python/caffe/net_spec.py index 5fb1f0b3fb1..5d13067382b 100644 --- a/python/caffe/net_spec.py +++ b/python/caffe/net_spec.py @@ -93,6 +93,9 @@ def to_proto(self): return to_proto(self) + def _update(self, params): + self.fn._update(params) + def _to_proto(self, layers, names, autonames): return self.fn._to_proto(layers, names, autonames) @@ -128,6 +131,9 @@ def _get_top_name(self, top, names, autonames): names[top] = top.fn.type_name + str(autonames[top.fn.type_name]) return names[top] + def _update(self, params): + self.params.update(params) + def _to_proto(self, layers, names, autonames): if self in layers: return @@ -181,7 +187,21 @@ def __setitem__(self, key, value): def __getitem__(self, item): return self.__getattr__(item) - def to_proto(self): + def __delitem__(self, name): + del self.tops[name] + + def keys(self): + keys = [k for k, v in six.iteritems(self.tops)] + return keys + + def vals(self): + vals = [v for k, v in six.iteritems(self.tops)] + return vals + + def update(self, name, params): + self.tops[name]._update(params) + + def to_proto(self, verbose=False): names = {v: k for k, v in six.iteritems(self.tops)} autonames = Counter() layers = OrderedDict() diff --git a/scripts/create_annoset.py b/scripts/create_annoset.py new file mode 100644 index 00000000000..eed11ab9556 --- /dev/null +++ b/scripts/create_annoset.py @@ -0,0 +1,167 @@ +import argparse +import os +import shutil +import subprocess +import sys + +from caffe.proto import caffe_pb2 +from google.protobuf import text_format + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Create AnnotatedDatum database") + parser.add_argument("root", + help="The root directory which contains the images and annotations.") + parser.add_argument("listfile", + help="The file which contains image paths and annotation info.") + parser.add_argument("outdir", + help="The output directory which stores the database file.") + parser.add_argument("exampledir", + help="The directory to store the link of the database files.") + parser.add_argument("--redo", default = False, action = "store_true", + help="Recreate the database.") + parser.add_argument("--anno-type", default = "classification", + help="The type of annotation {classification, detection}.") + parser.add_argument("--label-type", default = "xml", + help="The type of label file format for detection {xml, json, txt}.") + parser.add_argument("--backend", default = "lmdb", + help="The backend {lmdb, leveldb} for storing the result") + parser.add_argument("--check-size", default = False, action = "store_true", + help="Check that all the datum have the same size.") + parser.add_argument("--encode-type", default = "", + help="What type should we encode the image as ('png','jpg',...).") + parser.add_argument("--encoded", default = False, action = "store_true", + help="The encoded image will be save in datum.") + parser.add_argument("--gray", default = False, action = "store_true", + help="Treat images as grayscale ones.") + parser.add_argument("--label-map-file", default = "", + help="A file with LabelMap protobuf message.") + parser.add_argument("--min-dim", default = 0, type = int, + help="Minimum dimension images are resized to.") + parser.add_argument("--max-dim", default = 0, type = int, + help="Maximum dimension images are resized to.") + parser.add_argument("--resize-height", default = 0, type = int, + help="Height images are resized to.") + parser.add_argument("--resize-width", default = 0, type = int, + help="Width images are resized to.") + parser.add_argument("--shuffle", default = False, action = "store_true", + help="Randomly shuffle the order of images and their labels.") + parser.add_argument("--check-label", default = False, action = "store_true", + help="Check that there is no duplicated name/label.") + + args = parser.parse_args() + root_dir = args.root + list_file = args.listfile + out_dir = args.outdir + example_dir = args.exampledir + + redo = args.redo + anno_type = args.anno_type + label_type = args.label_type + backend = args.backend + check_size = args.check_size + encode_type = args.encode_type + encoded = args.encoded + gray = args.gray + label_map_file = args.label_map_file + min_dim = args.min_dim + max_dim = args.max_dim + resize_height = args.resize_height + resize_width = args.resize_width + shuffle = args.shuffle + check_label = args.check_label + + # check if root directory exists + if not os.path.exists(root_dir): + print "root directory: {} does not exist".format(root_dir) + sys.exit() + # add "/" to root directory if needed + if root_dir[-1] != "/": + root_dir += "/" + # check if list file exists + if not os.path.exists(list_file): + print "list file: {} does not exist".format(list_file) + sys.exit() + # check list file format is correct + with open(list_file, "r") as lf: + for line in lf.readlines(): + img_file, anno = line.strip("\n").split(" ") + if not os.path.exists(root_dir + img_file): + print "image file: {} does not exist".format(root_dir + img_file) + if anno_type == "classification": + if not anno.isdigit(): + print "annotation: {} is not an integer".format(anno) + elif anno_type == "detection": + if not os.path.exists(root_dir + anno): + print "annofation file: {} does not exist".format(root_dir + anno) + sys.exit() + break + # check if label map file exist + if anno_type == "detection": + if not os.path.exists(label_map_file): + print "label map file: {} does not exist".format(label_map_file) + sys.exit() + label_map = caffe_pb2.LabelMap() + lmf = open(label_map_file, "r") + try: + text_format.Merge(str(lmf.read()), label_map) + except: + print "Cannot parse label map file: {}".format(label_map_file) + sys.exit() + out_parent_dir = os.path.dirname(out_dir) + if not os.path.exists(out_parent_dir): + os.makedirs(out_parent_dir) + if os.path.exists(out_dir) and not redo: + print "{} already exists and I do not hear redo".format(out_dir) + sys.exit() + if os.path.exists(out_dir): + shutil.rmtree(out_dir) + + # get caffe root directory + caffe_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + if anno_type == "detection": + cmd = "{}/build/tools/convert_annoset" \ + " --anno_type={}" \ + " --label_type={}" \ + " --label_map_file={}" \ + " --check_label={}" \ + " --min_dim={}" \ + " --max_dim={}" \ + " --resize_height={}" \ + " --resize_width={}" \ + " --backend={}" \ + " --shuffle={}" \ + " --check_size={}" \ + " --encode_type={}" \ + " --encoded={}" \ + " --gray={}" \ + " {} {} {}" \ + .format(caffe_root, anno_type, label_type, label_map_file, check_label, + min_dim, max_dim, resize_height, resize_width, backend, shuffle, + check_size, encode_type, encoded, gray, root_dir, list_file, out_dir) + elif anno_type == "classification": + cmd = "{}/build/tools/convert_annoset" \ + " --anno_type={}" \ + " --min_dim={}" \ + " --max_dim={}" \ + " --resize_height={}" \ + " --resize_width={}" \ + " --backend={}" \ + " --shuffle={}" \ + " --check_size={}" \ + " --encode_type={}" \ + " --encoded={}" \ + " --gray={}" \ + " {} {} {}" \ + .format(caffe_root, anno_type, min_dim, max_dim, resize_height, + resize_width, backend, shuffle, check_size, encode_type, encoded, + gray, root_dir, list_file, out_dir) + print cmd + process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) + output = process.communicate()[0] + + if not os.path.exists(example_dir): + os.makedirs(example_dir) + link_dir = os.path.join(example_dir, os.path.basename(out_dir)) + if os.path.exists(link_dir): + os.unlink(link_dir) + os.symlink(out_dir, link_dir) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 3f51d19d77f..01b83653c35 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -17,6 +17,7 @@ namespace caffe { // Must be set before brewing Caffe::Brew Caffe::mode_ = Caffe::GPU; int Caffe::solver_count_ = 1; +std::vector Caffe::gpus_; int Caffe::root_device_ = -1; int Caffe::thread_count_ = 0; int Caffe::restored_iter_ = -1; @@ -453,23 +454,27 @@ CuDNNHandle::~CuDNNHandle() { } #endif -Caffe::Properties Caffe::props_; +Caffe::Properties& Caffe::props() { + static Caffe::Properties props_; + return props_; +} Caffe::Properties::Properties() : init_time_(std::time(nullptr)), main_thread_id_(lwp_id()), caffe_version_(AS_STRING(CAFFE_VERSION)) { - const int count = Caffe::device_count(); + const std::vector& gpus = Caffe::gpus(); + const int count = gpus.size(); if (count == 0) { return; } compute_capabilities_.resize(count); cudaDeviceProp device_prop; for (int gpu = 0; gpu < compute_capabilities_.size(); ++gpu) { - CUDA_CHECK(cudaGetDeviceProperties(&device_prop, gpu)); + CUDA_CHECK(cudaGetDeviceProperties(&device_prop, gpus[gpu])); compute_capabilities_[gpu] = device_prop.major * 100 + device_prop.minor; - DLOG(INFO) << "GPU " << gpu << " '" << device_prop.name << "' has compute capability " - << device_prop.major << "." << device_prop.minor; + DLOG(INFO) << "GPU " << gpus[gpu] << " '" << device_prop.name + << "' has compute capability " << device_prop.major << "." << device_prop.minor; } #ifdef USE_CUDNN cudnn_version_ = std::to_string(cudnnGetVersion()); diff --git a/src/caffe/data_reader.cpp b/src/caffe/data_reader.cpp index ba94cbc6e8d..74005968646 100644 --- a/src/caffe/data_reader.cpp +++ b/src/caffe/data_reader.cpp @@ -2,17 +2,20 @@ #include #include "caffe/util/rng.hpp" -#include "caffe/common.hpp" #include "caffe/parallel.hpp" #include "caffe/data_reader.hpp" namespace caffe { -std::mutex DataReader::db_mutex_; -std::mutex DataReader::DataCache::cache_mutex_; -unique_ptr DataReader::DataCache::data_cache_inst_; +template +std::mutex DataReader::db_mutex_; +// https://stackoverflow.com/questions/26935824/gcc-gives-an-undefined-reference-error-to-static-data-members-in-templated-cla -DataReader::DataReader(const LayerParameter& param, +template +std::mutex DataReader::DataCache::cache_mutex_{}; + +template +DataReader::DataReader(const LayerParameter& param, size_t solver_count, size_t solver_rank, size_t parser_threads_num, @@ -55,26 +58,29 @@ DataReader::DataReader(const LayerParameter& param, LOG(INFO) << (sample_only ? "Sample " : "") << "Data Reader threads: " << this->threads_num() << ", out queues: " << queues_num_ << ", depth: " << queue_depth_; for (size_t i = 0; i < queues_num_; ++i) { - full_[i] = make_shared>>(); - free_[i] = make_shared>>(); + full_[i] = make_shared>>(); + free_[i] = make_shared>>(); for (size_t j = 0; j < queue_depth_ - 1U; ++j) { // +1 in InternalThreadEntryN - free_[i]->push(make_shared()); + free_[i]->push(make_shared()); } } db_source_ = param.data_param().source(); - init_ = make_shared>>(); + init_ = make_shared>>(); StartInternalThread(false, Caffe::next_seed()); } -DataReader::~DataReader() { +template +DataReader::~DataReader() { StopInternalThread(); } -void DataReader::InternalThreadEntry() { +template +void DataReader::InternalThreadEntry() { InternalThreadEntryN(0U); } -void DataReader::InternalThreadEntryN(size_t thread_id) { +template +void DataReader::InternalThreadEntryN(size_t thread_id) { if (cache_) { data_cache_->check_db(db_source_); data_cache_->register_new_thread(); @@ -97,7 +103,7 @@ void DataReader::InternalThreadEntryN(size_t thread_id) { cache_ && !sample_only_, shuffle_ && !sample_only_, epoch_count_required_); - shared_ptr init_datum = make_shared(); + shared_ptr init_datum = make_shared(); cm.fetch(init_datum.get()); init_->push(init_datum); @@ -108,7 +114,7 @@ void DataReader::InternalThreadEntryN(size_t thread_id) { size_t skip = skip_one_batch_ ? batch_size_ : 0UL; size_t queue_id, ranked_rec, batch_on_solver, sample_count = 0UL; - shared_ptr datum = make_shared(); + shared_ptr datum = make_shared(); try { while (!must_stop(thread_id)) { cm.next(datum); @@ -137,13 +143,15 @@ void DataReader::InternalThreadEntryN(size_t thread_id) { } } -shared_ptr& DataReader::DataCache::next_new() { +template +shared_ptr& DataReader::DataCache::next_new() { std::lock_guard lock(cache_mutex_); - cache_buffer_.emplace_back(make_shared()); + cache_buffer_.emplace_back(make_shared()); return cache_buffer_.back(); } -shared_ptr& DataReader::DataCache::next_cached(DataReader& reader) { +template +shared_ptr& DataReader::DataCache::next_cached(DataReader& reader) { if (just_cached_.load()) { cache_bar_.wait(); just_cached_.store(false); @@ -170,19 +178,21 @@ shared_ptr& DataReader::DataCache::next_cached(DataReader& reader) { LOG(INFO) << "Shuffling " << cache_buffer_.size() << " records..."; caffe::shuffle(cache_buffer_.begin(), cache_buffer_.end()); } - shared_ptr& datum = cache_buffer_[cache_idx_++]; + shared_ptr& datum = cache_buffer_[cache_idx_++]; if (cache_idx_ >= cache_buffer_.size()) { cache_idx_= 0UL; } return datum; } -void DataReader::DataCache::just_cached() { +template +void DataReader::DataCache::just_cached() { just_cached_.store(true); cached_flags_[lwp_id()]->set(); } -bool DataReader::DataCache::check_memory() { +template +bool DataReader::DataCache::check_memory() { #ifdef __APPLE__ return true; #else @@ -240,7 +250,8 @@ bool DataReader::DataCache::check_memory() { #endif } -DataReader::CursorManager::CursorManager(db::DB* db, DataReader* reader, +template +DataReader::CursorManager::CursorManager(db::DB* db, DataReader* reader, size_t solver_count, size_t solver_rank, size_t parser_threads, size_t parser_thread_id, size_t batch_size, bool cache, bool shuffle, bool epoch_count_required) : db_(db), @@ -261,12 +272,14 @@ DataReader::CursorManager::CursorManager(db::DB* db, DataReader* reader, epoch_count_(0UL), epoch_count_required_(epoch_count_required) {} -DataReader::CursorManager::~CursorManager() { +template +DataReader::CursorManager::~CursorManager() { cursor_.reset(); db_->Close(); } -void DataReader::CursorManager::next(shared_ptr& datum) { +template +void DataReader::CursorManager::next(shared_ptr& datum) { if (cached_all_) { datum = reader_->next_cached(); } else { @@ -332,7 +345,8 @@ S1 | r1pt1.q1 --> S1.tr0 S1.q2 <-- rank cycle -> <---------- full cycle -----------> */ -void DataReader::CursorManager::rewind() { +template +void DataReader::CursorManager::rewind() { CHECK(parser_threads_); size_t rank_cycle_begin = rank_cycle_ * solver_rank_; rec_id_ = rank_cycle_begin + parser_thread_id_ * batch_size_; @@ -346,7 +360,8 @@ void DataReader::CursorManager::rewind() { } } -void DataReader::CursorManager::fetch(Datum* datum) { +template<> +void DataReader::CursorManager::fetch(Datum* datum) { C2TensorProtos protos; if (cursor_->parse(&protos) && protos.protos_size() >= 2) { C2TensorProto* image_proto = protos.mutable_protos(0); @@ -378,4 +393,14 @@ void DataReader::CursorManager::fetch(Datum* datum) { // DLOG(INFO) << cursor_->key() << " " << datum->label(); } +template<> +void DataReader::CursorManager::fetch(AnnotatedDatum* datum) { + if (!cursor_->parse(datum)) { + LOG(ERROR) << "Database cursor failed to parse Datum record"; + } +} + +template class DataReader; +template class DataReader; + } // namespace caffe diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index d0454efa15b..b8894e1f607 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -1,23 +1,28 @@ #include #include #include -#include -#include #include "caffe/data_transformer.hpp" +#include "caffe/util/bbox_util.hpp" +#include "caffe/util/im_transforms.hpp" #include "caffe/util/rng.hpp" +#include "caffe/proto/caffe.pb.h" + namespace caffe { -bool DataTransformer::image_random_crop_enabled() const { +template +bool DataTransformer::image_random_crop_enabled() const { return this->phase_ == TRAIN && param_.crop_size() > 0; } -bool DataTransformer::image_center_crop_enabled() const { +template +bool DataTransformer::image_center_crop_enabled() const { return this->phase_ == TEST && param_.crop_size() > 0; } -DataTransformer::DataTransformer(const TransformationParameter& param, Phase phase) +template +DataTransformer::DataTransformer(const TransformationParameter& param, Phase phase) : param_(param), phase_(phase), rand_resize_ratio_lower_(param_.rand_resize_ratio_lower()), rand_resize_ratio_upper_(param_.rand_resize_ratio_upper()), @@ -49,7 +54,8 @@ DataTransformer::DataTransformer(const TransformationParameter& param, Phase pha InitRand(); } -void DataTransformer::image_random_resize(const cv::Mat& src, cv::Mat& dst) { +template +void DataTransformer::image_random_resize(const cv::Mat& src, cv::Mat& dst) const { if (!image_random_resize_enabled()) { dst = src; return; @@ -114,7 +120,8 @@ void DataTransformer::image_random_resize(const cv::Mat& src, cv::Mat& dst) { } } -bool DataTransformer::image_random_resize_enabled() const { +template +bool DataTransformer::image_random_resize_enabled() const { const int resize_lower = param_.img_rand_resize_lower(); const int resize_upper = param_.img_rand_resize_upper(); const bool use_rand_resize = @@ -127,7 +134,8 @@ bool DataTransformer::image_random_resize_enabled() const { return resize_lower != 0 || resize_upper != 0 || use_rand_resize; } -void DataTransformer::image_random_crop(int crop_w, int crop_h, cv::Mat& img) { +template +void DataTransformer::image_random_crop(int crop_w, int crop_h, cv::Mat& img) const { CHECK_GT(crop_w, 0) << "crop_w parameter must be positive"; CHECK_GT(crop_h, 0) << "crop_h parameter must be positive"; const int img_width = img.cols; @@ -143,7 +151,8 @@ void DataTransformer::image_random_crop(int crop_w, int crop_h, cv::Mat& img) { img = img(roi).clone(); } -void DataTransformer::image_center_crop(int crop_w, int crop_h, cv::Mat& img) { +template +void DataTransformer::image_center_crop(int crop_w, int crop_h, cv::Mat& img) const { CHECK_GT(crop_w, 0) << "center crop_w parameter must be positive"; CHECK_GT(crop_h, 0) << "center crop_h parameter must be positive"; const int img_width = img.cols; @@ -159,7 +168,8 @@ void DataTransformer::image_center_crop(int crop_w, int crop_h, cv::Mat& img) { img = img(roi).clone(); } -void DataTransformer::apply_mean_scale_mirror(const cv::Mat& src, cv::Mat& dst) { +template +void DataTransformer::apply_mean_scale_mirror(const cv::Mat& src, cv::Mat& dst) const { const float scale = param_.scale(); const bool has_mean_file = param_.has_mean_file(); const bool has_mean_values = !mean_values_.empty(); @@ -202,21 +212,24 @@ void DataTransformer::apply_mean_scale_mirror(const cv::Mat& src, cv::Mat& dst) } } -void DataTransformer::InitRand() { +template +void DataTransformer::InitRand() { // Use random_seed setting for deterministic transformations const uint64_t random_seed = param_.random_seed() >= 0 ? static_cast(param_.random_seed()) : Caffe::next_seed(); rng_.reset(new Caffe::RNG(random_seed)); } -unsigned int DataTransformer::Rand() const { +template +unsigned int DataTransformer::Rand() const { CHECK(rng_); caffe::rng_t *rng = static_cast(rng_->generator()); // this doesn't actually produce a uniform distribution return (*rng)(); } -float DataTransformer::Rand(float a, float b) const { +template +float DataTransformer::Rand(float a, float b) const { if (a == b) { return a; } @@ -226,28 +239,71 @@ float DataTransformer::Rand(float a, float b) const { return static_cast(lo + (up - lo) * r / UM); } -// tests only, TODO: clean -void DataTransformer::VariableSizedTransforms(Datum* datum) { - cv::Mat img1, img2; - const int color_mode = param_.force_color() ? 1 : (param_.force_gray() ? -1 : 0); - if (datum->encoded()) { - DecodeDatumToCVMat(*datum, color_mode, img1, false); - } else { - DatumToCVMat(*datum, img1, false); - } +template +void DataTransformer::Copy(const cv::Mat& cv_img, Dtype *data) { + const int channels = cv_img.channels(); + const int height = cv_img.rows; + const int width = cv_img.cols; - image_random_resize(img1, img2); + CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte"; - if (image_random_crop_enabled()) { - image_random_crop(param_.crop_size(), param_.crop_size(), img2); + int top_index; + for (int c = 0; c < channels; ++c) { + for (int h = 0; h < height; ++h) { + const uchar *ptr = cv_img.ptr(h); + for (int w = 0; w < width; ++w) { + int img_index = w * channels + c; + top_index = (c * height + h) * width + w; + data[top_index] = static_cast(ptr[img_index]); + } + } + } +} + +template +void DataTransformer::Copy(const Datum& datum, Dtype* data, size_t& out_sizeof_element) { + // If datum is encoded, decoded and transform the cv::image. + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // Transform the cv::image into blob. + Copy(cv_img, data); + out_sizeof_element = sizeof(Dtype); + return; + } else { + if (param_.force_color() || param_.force_gray()) { + LOG(ERROR) << "Force_color and force_gray are for encoded datum only"; + } } - if (image_center_crop_enabled()) { - image_center_crop(param_.crop_size(), param_.crop_size(), img2); + + const string& datum_data = datum.data(); + const int N = datum.channels() * datum.height() * datum.width(); + const void* src_ptr; + if (datum_data.size() > 0) { + CHECK_LE(sizeof(uint8_t), sizeof(Dtype)); + CHECK_EQ(N, datum_data.size()); + out_sizeof_element = sizeof(uint8_t); + src_ptr = &datum_data.front(); + } else { + CHECK_LE(sizeof(float), sizeof(Dtype)); + out_sizeof_element = sizeof(float); + src_ptr = &datum.float_data().Get(0); } - CVMatToDatum(img2, *datum); + cudaStream_t stream = Caffe::thread_stream(); + CUDA_CHECK(cudaMemcpyAsync(data, src_ptr, N * out_sizeof_element, + cudaMemcpyHostToDevice, stream)); + CUDA_CHECK(cudaStreamSynchronize(stream)); } -void DataTransformer::Fill3Randoms(unsigned int *rand) const { +template +void DataTransformer::Fill3Randoms(unsigned int *rand) const { rand[0] = rand[1] = rand[2] = 0; if (param_.mirror()) { rand[0] = Rand() + 1; @@ -258,4 +314,1330 @@ void DataTransformer::Fill3Randoms(unsigned int *rand) const { } } +template +vector DataTransformer::Transform(const Datum* datum, Dtype* buf, size_t buf_len, + Packing& out_packing, bool repack) { + vector shape; + const bool shape_only = buf == nullptr; + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + const int color_mode = param_.force_color() ? 1 : (param_.force_gray() ? -1 : 0); + cv::Mat img; + bool v1_path = false; + if (datum->encoded()) { + shape = DecodeDatumToCVMat(*datum, color_mode, img, shape_only, false); + out_packing = NHWC; + } else { + if (image_random_resize_enabled() || buf == nullptr || buf_len == 0UL) { + shape = DatumToCVMat(*datum, img, shape_only); + out_packing = NHWC; + } else { + // here we can use fast V1 path + TransformV1(*datum, buf, buf_len); + shape = vector{1, datum->channels(), datum->height(), datum->width()}; + v1_path = true; + out_packing = NCHW; + } + } + if (param_.crop_size() > 0) { + shape[2] = param_.crop_size(); + shape[3] = param_.crop_size(); + } + if (!shape_only && !v1_path) { + CHECK_NOTNULL(img.data); + Transform(img, buf, buf_len, repack); + out_packing = NHWC; + } + return shape; +} + + +template +void DataTransformer::Transform(const cv::Mat& src, Dtype* buf, size_t buf_len, + bool repack) const { + cv::Mat tmp, dst; + + image_random_resize(src, tmp); + + const int crop_w = param_.crop_w() > 0 ? param_.crop_w() : param_.crop_size(); + const int crop_h = param_.crop_h() > 0 ? param_.crop_h() : param_.crop_size(); + if (image_random_crop_enabled()) { + image_random_crop(crop_w, crop_h, tmp); + } else if (image_center_crop_enabled()) { + image_center_crop(crop_w, crop_h, tmp); + } + apply_mean_scale_mirror(tmp, dst); + FloatCVMatToBuf(dst, buf_len, buf, repack); +} + +template +void DataTransformer::Transform(const vector& mat_vector, + TBlob* transformed_blob) const { + const size_t mat_num = mat_vector.size(); + const int num = transformed_blob->num(); + CHECK_GT(mat_num, 0) << "There is no MAT to add"; + CHECK_EQ(mat_num, num) << "The size of mat_vector must be equals to transformed_blob->num()"; + cv::Mat dst; + size_t buf_len = transformed_blob->offset(1); + for (size_t item_id = 0; item_id < mat_num; ++item_id) { + size_t offset = transformed_blob->offset(item_id); + apply_mean_scale_mirror(mat_vector[item_id], dst); + FloatCVMatToBuf(dst, buf_len, transformed_blob->mutable_cpu_data(false) + offset); + } +} + +template +void DataTransformer::Transform(const vector& datum_vector, + TBlob *transformed_blob) const { + const int datum_num = datum_vector.size(); + const int num = transformed_blob->num(); + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + + CHECK_GT(datum_num, 0) << "There is no datum to add"; + CHECK_LE(datum_num, num) + << "The size of datum_vector must be no greater than transformed_blob->num()"; + TBlob uni_blob(1, channels, height, width); + for (int item_id = 0; item_id < datum_num; ++item_id) { + int offset = transformed_blob->offset(item_id); + uni_blob.set_cpu_data(transformed_blob->mutable_cpu_data() + offset); + Transform(datum_vector[item_id], &uni_blob); + } +} + +template +void DataTransformer::Transform(const Datum& datum, + TBlob* transformed_blob, + NormalizedBBox* crop_bbox, + bool* do_mirror) { + // If datum is encoded, decoded and transform the cv::image. + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // Transform the cv::image into blob. + return Transform(cv_img, transformed_blob, crop_bbox, do_mirror); + } else { + if (param_.force_color() || param_.force_gray()) { + LOG(ERROR) << "force_color and force_gray only for encoded datum"; + } + } + + const int crop_size = param_.crop_size(); + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + // Check dimensions. + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + const int num = transformed_blob->num(); + + CHECK_EQ(channels, datum_channels); + CHECK_LE(height, datum_height); + CHECK_LE(width, datum_width); + CHECK_GE(num, 1); + + if (crop_size) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + } else { + CHECK_EQ(datum_height, height); + CHECK_EQ(datum_width, width); + } + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + Transform(datum, transformed_data, crop_bbox, do_mirror); +} + + +template +void DataTransformer::Transform( + const AnnotatedDatum& anno_datum, TBlob* transformed_blob, + RepeatedPtrField* transformed_anno_group_all, + bool* do_mirror) { + // Transform datum. + const Datum& datum = anno_datum.datum(); + NormalizedBBox crop_bbox; + Transform(datum, transformed_blob, &crop_bbox, do_mirror); + + // Transform annotation. + const bool do_resize = true; + TransformAnnotation(anno_datum, do_resize, crop_bbox, *do_mirror, + transformed_anno_group_all); +} + +template +void DataTransformer::Transform( + const AnnotatedDatum& anno_datum, TBlob* transformed_blob, + RepeatedPtrField* transformed_anno_group_all) { + bool do_mirror; + Transform(anno_datum, transformed_blob, transformed_anno_group_all, + &do_mirror); +} + +template +void DataTransformer::Transform( + const AnnotatedDatum& anno_datum, TBlob* transformed_blob, + vector* transformed_anno_vec, bool* do_mirror) { + RepeatedPtrField transformed_anno_group_all; + Transform(anno_datum, transformed_blob, &transformed_anno_group_all, + do_mirror); + for (int g = 0; g < transformed_anno_group_all.size(); ++g) { + transformed_anno_vec->push_back(transformed_anno_group_all.Get(g)); + } +} + +template +void DataTransformer::Transform( + const AnnotatedDatum& anno_datum, TBlob* transformed_blob, + vector* transformed_anno_vec) { + bool do_mirror; + Transform(anno_datum, transformed_blob, transformed_anno_vec, &do_mirror); +} + +// Transform and return the transformation information. +template +void DataTransformer::Transform(const Datum& datum, Dtype* transformed_data, + NormalizedBBox* crop_bbox, bool* do_mirror) { + const string& data = datum.data(); + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + *do_mirror = param_.mirror() && Rand(2); + const bool has_mean_file = param_.has_mean_file(); + const bool has_uint8 = data.size() > 0; + const bool has_mean_values = mean_values_.size() > 0; + + CHECK_GT(datum_channels, 0); + CHECK_GE(datum_height, crop_size); + CHECK_GE(datum_width, crop_size); + + float* mean = NULL; + if (has_mean_file) { + CHECK_EQ(datum_channels, data_mean_.channels()); + CHECK_EQ(datum_height, data_mean_.height()); + CHECK_EQ(datum_width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == datum_channels) << + "Specify either 1 mean_value or as many as channels: " << datum_channels; + if (datum_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < datum_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } + + int height = datum_height; + int width = datum_width; + + int h_off = 0; + int w_off = 0; + if (crop_size) { + height = crop_size; + width = crop_size; + // We only do random crop when we do training. + if (phase_ == TRAIN) { + h_off = Rand(datum_height - crop_size + 1); + w_off = Rand(datum_width - crop_size + 1); + } else { + h_off = (datum_height - crop_size) / 2; + w_off = (datum_width - crop_size) / 2; + } + } + + // Return the normalized crop bbox. + crop_bbox->set_xmin(Dtype(w_off) / datum_width); + crop_bbox->set_ymin(Dtype(h_off) / datum_height); + crop_bbox->set_xmax(Dtype(w_off + width) / datum_width); + crop_bbox->set_ymax(Dtype(h_off + height) / datum_height); + + Dtype datum_element; + int top_index, data_index; + for (int c = 0; c < datum_channels; ++c) { + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + data_index = (c * datum_height + h_off + h) * datum_width + w_off + w; + if (*do_mirror) { + top_index = (c * height + h) * width + (width - 1 - w); + } else { + top_index = (c * height + h) * width + w; + } + if (has_uint8) { + datum_element = + static_cast(static_cast(data[data_index])); + } else { + datum_element = datum.float_data(data_index); + } + if (has_mean_file) { + transformed_data[top_index] = + (datum_element - mean[data_index]) * scale; + } else { + if (has_mean_values) { + transformed_data[top_index] = + (datum_element - mean_values_[c]) * scale; + } else { + transformed_data[top_index] = datum_element * scale; + } + } + } + } + } +} + + +template +void DataTransformer::TransformAnnotation( + const AnnotatedDatum& anno_datum, const bool do_resize, + const NormalizedBBox& crop_bbox, const bool do_mirror, + RepeatedPtrField* transformed_anno_group_all) { + const int img_height = anno_datum.datum().height(); + const int img_width = anno_datum.datum().width(); + if (anno_datum.type() == AnnotatedDatum_AnnotationType_BBOX) { + // Go through each AnnotationGroup. + for (int g = 0; g < anno_datum.annotation_group_size(); ++g) { + const AnnotationGroup& anno_group = anno_datum.annotation_group(g); + AnnotationGroup transformed_anno_group; + // Go through each Annotation. + bool has_valid_annotation = false; + for (int a = 0; a < anno_group.annotation_size(); ++a) { + const Annotation& anno = anno_group.annotation(a); + const NormalizedBBox& bbox = anno.bbox(); + // Adjust bounding box annotation. + NormalizedBBox resize_bbox = bbox; + if (do_resize && param_.has_resize_param()) { + CHECK_GT(img_height, 0); + CHECK_GT(img_width, 0); + UpdateBBoxByResizePolicy(param_.resize_param(), img_width, img_height, + &resize_bbox); + } + if (param_.has_emit_constraint() && + !MeetEmitConstraint(crop_bbox, resize_bbox, + param_.emit_constraint())) { + continue; + } + NormalizedBBox proj_bbox; + if (ProjectBBox(crop_bbox, resize_bbox, &proj_bbox)) { + has_valid_annotation = true; + Annotation* transformed_anno = + transformed_anno_group.add_annotation(); + transformed_anno->set_instance_id(anno.instance_id()); + NormalizedBBox* transformed_bbox = transformed_anno->mutable_bbox(); + transformed_bbox->CopyFrom(proj_bbox); + if (do_mirror) { + Dtype temp = transformed_bbox->xmin(); + transformed_bbox->set_xmin(1 - transformed_bbox->xmax()); + transformed_bbox->set_xmax(1 - temp); + } + if (do_resize && param_.has_resize_param()) { + ExtrapolateBBox(param_.resize_param(), img_height, img_width, + crop_bbox, transformed_bbox); + } + } + } + // Save for output. + if (has_valid_annotation) { + transformed_anno_group.set_group_label(anno_group.group_label()); + transformed_anno_group_all->Add()->CopyFrom(transformed_anno_group); + } + } + } else { + LOG(FATAL) << "Unknown annotation type."; + } +} + +template +void DataTransformer::CropImage(const Datum& datum, + const NormalizedBBox& bbox, + Datum* crop_datum) { + // If datum is encoded, decode and crop the cv::image. + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // Crop the image. + cv::Mat crop_img; + CropImage(cv_img, bbox, &crop_img); + // Save the image into datum. + EncodeCVMatToDatum(crop_img, "jpg", crop_datum); + crop_datum->set_label(datum.label()); + return; + } else { + if (param_.force_color() || param_.force_gray()) { + LOG(ERROR) << "force_color and force_gray only for encoded datum"; + } + } + + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + // Get the bbox dimension. + NormalizedBBox clipped_bbox; + ClipBBox(bbox, &clipped_bbox); + NormalizedBBox scaled_bbox; + ScaleBBox(clipped_bbox, datum_height, datum_width, &scaled_bbox); + const int w_off = static_cast(scaled_bbox.xmin()); + const int h_off = static_cast(scaled_bbox.ymin()); + const int width = static_cast(scaled_bbox.xmax() - scaled_bbox.xmin()); + const int height = static_cast(scaled_bbox.ymax() - scaled_bbox.ymin()); + + // Crop the image using bbox. + crop_datum->set_channels(datum_channels); + crop_datum->set_height(height); + crop_datum->set_width(width); + crop_datum->set_label(datum.label()); + crop_datum->clear_data(); + crop_datum->clear_float_data(); + crop_datum->set_encoded(false); + const int crop_datum_size = datum_channels * height * width; + const std::string& datum_buffer = datum.data(); + std::string buffer(crop_datum_size, ' '); + for (int h = h_off; h < h_off + height; ++h) { + for (int w = w_off; w < w_off + width; ++w) { + for (int c = 0; c < datum_channels; ++c) { + int datum_index = (c * datum_height + h) * datum_width + w; + int crop_datum_index = (c * height + h - h_off) * width + w - w_off; + buffer[crop_datum_index] = datum_buffer[datum_index]; + } + } + } + crop_datum->set_data(buffer); +} + +template +void DataTransformer::CropImage(const AnnotatedDatum& anno_datum, + const NormalizedBBox& bbox, + AnnotatedDatum* cropped_anno_datum) { + // Crop the datum. + CropImage(anno_datum.datum(), bbox, cropped_anno_datum->mutable_datum()); + cropped_anno_datum->set_type(anno_datum.type()); + + // Transform the annotation according to crop_bbox. + const bool do_resize = false; + const bool do_mirror = false; + NormalizedBBox crop_bbox; + ClipBBox(bbox, &crop_bbox); + TransformAnnotation(anno_datum, do_resize, crop_bbox, do_mirror, + cropped_anno_datum->mutable_annotation_group()); +} + +template +void DataTransformer::ExpandImage(const Datum& datum, + const float expand_ratio, + NormalizedBBox* expand_bbox, + Datum* expand_datum) { + // If datum is encoded, decode and crop the cv::image. + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // Expand the image. + cv::Mat expand_img; + ExpandImage(cv_img, expand_ratio, expand_bbox, &expand_img); + // Save the image into datum. + EncodeCVMatToDatum(expand_img, "jpg", expand_datum); + expand_datum->set_label(datum.label()); + return; + } else { + if (param_.force_color() || param_.force_gray()) { + LOG(ERROR) << "force_color and force_gray only for encoded datum"; + } + } + + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + // Get the bbox dimension. + int height = static_cast(datum_height * expand_ratio); + int width = static_cast(datum_width * expand_ratio); + float h_off, w_off; + caffe_rng_uniform(1, 0.f, static_cast(height - datum_height), &h_off); + caffe_rng_uniform(1, 0.f, static_cast(width - datum_width), &w_off); + h_off = floor(h_off); + w_off = floor(w_off); + expand_bbox->set_xmin(-w_off/datum_width); + expand_bbox->set_ymin(-h_off/datum_height); + expand_bbox->set_xmax((width - w_off)/datum_width); + expand_bbox->set_ymax((height - h_off)/datum_height); + + // Crop the image using bbox. + expand_datum->set_channels(datum_channels); + expand_datum->set_height(height); + expand_datum->set_width(width); + expand_datum->set_label(datum.label()); + expand_datum->clear_data(); + expand_datum->clear_float_data(); + expand_datum->set_encoded(false); + const int expand_datum_size = datum_channels * height * width; + const std::string& datum_buffer = datum.data(); + std::string buffer(expand_datum_size, ' '); + for (int h = h_off; h < h_off + datum_height; ++h) { + for (int w = w_off; w < w_off + datum_width; ++w) { + for (int c = 0; c < datum_channels; ++c) { + int datum_index = + (c * datum_height + h - h_off) * datum_width + w - w_off; + int expand_datum_index = (c * height + h) * width + w; + buffer[expand_datum_index] = datum_buffer[datum_index]; + } + } + } + expand_datum->set_data(buffer); +} + +template +void DataTransformer::ExpandImage(const AnnotatedDatum& anno_datum, + AnnotatedDatum* expanded_anno_datum) { + if (!param_.has_expand_param()) { + expanded_anno_datum->CopyFrom(anno_datum); + return; + } + const ExpansionParameter& expand_param = param_.expand_param(); + const float expand_prob = expand_param.prob(); + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + if (prob > expand_prob) { + expanded_anno_datum->CopyFrom(anno_datum); + return; + } + const float max_expand_ratio = expand_param.max_expand_ratio(); + if (fabs(max_expand_ratio - 1.) < 1e-2) { + expanded_anno_datum->CopyFrom(anno_datum); + return; + } + float expand_ratio; + caffe_rng_uniform(1, 1.f, max_expand_ratio, &expand_ratio); + // Expand the datum. + NormalizedBBox expand_bbox; + ExpandImage(anno_datum.datum(), expand_ratio, &expand_bbox, + expanded_anno_datum->mutable_datum()); + expanded_anno_datum->set_type(anno_datum.type()); + + // Transform the annotation according to crop_bbox. + const bool do_resize = false; + const bool do_mirror = false; + TransformAnnotation(anno_datum, do_resize, expand_bbox, do_mirror, + expanded_anno_datum->mutable_annotation_group()); +} + +template +void DataTransformer::DistortImage(const Datum& datum, + Datum* distort_datum) { + if (!param_.has_distort_param()) { + distort_datum->CopyFrom(datum); + return; + } + // If datum is encoded, decode and crop the cv::image. + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // Distort the image. + cv::Mat distort_img = ApplyDistort(cv_img, param_.distort_param()); + // Save the image into datum. + EncodeCVMatToDatum(distort_img, "jpg", distort_datum); + distort_datum->set_label(datum.label()); + return; + } else { + LOG(ERROR) << "Only support encoded datum now"; + } +} + +template +void DataTransformer::Transform(const cv::Mat& cv_img, + TBlob* transformed_blob, + NormalizedBBox* crop_bbox, + bool* do_mirror) { + // Check dimensions. + const int img_channels = cv_img.channels(); + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + const int num = transformed_blob->num(); + + CHECK_GT(img_channels, 0); + CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte"; + CHECK_EQ(channels, img_channels); + CHECK_GE(num, 1); + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + *do_mirror = param_.mirror() && Rand(2); + const bool has_mean_file = param_.has_mean_file(); + const bool has_mean_values = mean_values_.size() > 0; + + float* mean = NULL; + if (has_mean_file) { + CHECK_EQ(img_channels, data_mean_.channels()); + mean = data_mean_.mutable_cpu_data(); + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == img_channels) << + "Specify either 1 mean_value or as many as channels: " << img_channels; + if (img_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < img_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } + + int crop_h = param_.crop_h(); + int crop_w = param_.crop_w(); + if (crop_size) { + crop_h = crop_size; + crop_w = crop_size; + } + + cv::Mat cv_resized_image, cv_noised_image, cv_cropped_image; + if (param_.has_resize_param()) { + cv_resized_image = ApplyResize(cv_img, param_.resize_param()); + } else { + cv_resized_image = cv_img; + } + if (param_.has_noise_param()) { + cv_noised_image = ApplyNoise(cv_resized_image, param_.noise_param()); + } else { + cv_noised_image = cv_resized_image; + } + int img_height = cv_noised_image.rows; + int img_width = cv_noised_image.cols; + CHECK_GE(img_height, crop_h); + CHECK_GE(img_width, crop_w); + + int h_off = 0; + int w_off = 0; + if ((crop_h > 0) && (crop_w > 0)) { + CHECK_EQ(crop_h, height); + CHECK_EQ(crop_w, width); + // We only do random crop when we do training. + if (phase_ == TRAIN) { + h_off = Rand(img_height - crop_h + 1); + w_off = Rand(img_width - crop_w + 1); + } else { + h_off = (img_height - crop_h) / 2; + w_off = (img_width - crop_w) / 2; + } + cv::Rect roi(w_off, h_off, crop_w, crop_h); + cv_cropped_image = cv_noised_image(roi); + } else { + cv_cropped_image = cv_noised_image; + } + + // Return the normalized crop bbox. + crop_bbox->set_xmin(Dtype(w_off) / img_width); + crop_bbox->set_ymin(Dtype(h_off) / img_height); + crop_bbox->set_xmax(Dtype(w_off + width) / img_width); + crop_bbox->set_ymax(Dtype(h_off + height) / img_height); + + if (has_mean_file) { + CHECK_EQ(cv_cropped_image.rows, data_mean_.height()); + CHECK_EQ(cv_cropped_image.cols, data_mean_.width()); + } + CHECK(cv_cropped_image.data); + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + int top_index; + for (int h = 0; h < height; ++h) { + const uchar* ptr = cv_cropped_image.ptr(h); + int img_index = 0; + int h_idx = h; + for (int w = 0; w < width; ++w) { + int w_idx = w; + if (*do_mirror) { + w_idx = (width - 1 - w); + } + int h_idx_real = h_idx; + int w_idx_real = w_idx; + for (int c = 0; c < img_channels; ++c) { + top_index = (c * height + h_idx_real) * width + w_idx_real; + Dtype pixel = static_cast(ptr[img_index++]); + if (has_mean_file) { + int mean_index = (c * img_height + h_off + h_idx_real) * img_width + + w_off + w_idx_real; + transformed_data[top_index] = + (pixel - mean[mean_index]) * scale; + } else { + if (has_mean_values) { + transformed_data[top_index] = + (pixel - mean_values_[c]) * scale; + } else { + transformed_data[top_index] = pixel * scale; + } + } + } + } + } +} + +template +void DataTransformer::TransformInv(const Dtype* data, cv::Mat* cv_img, + const int height, const int width, + const int channels) { + const Dtype scale = param_.scale(); + const bool has_mean_file = param_.has_mean_file(); + const bool has_mean_values = mean_values_.size() > 0; + + float* mean = NULL; + if (has_mean_file) { + CHECK_EQ(channels, data_mean_.channels()); + CHECK_EQ(height, data_mean_.height()); + CHECK_EQ(width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == channels) << + "Specify either 1 mean_value or as many as channels: " << channels; + if (channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } + + const int img_type = channels == 3 ? CV_8UC3 : CV_8UC1; + cv::Mat orig_img(height, width, img_type, cv::Scalar(0, 0, 0)); + for (int h = 0; h < height; ++h) { + uchar* ptr = orig_img.ptr(h); + int img_idx = 0; + for (int w = 0; w < width; ++w) { + for (int c = 0; c < channels; ++c) { + int idx = (c * height + h) * width + w; + if (has_mean_file) { + ptr[img_idx++] = static_cast(data[idx] / scale + mean[idx]); + } else { + if (has_mean_values) { + ptr[img_idx++] = + static_cast(data[idx] / scale + mean_values_[c]); + } else { + ptr[img_idx++] = static_cast(data[idx] / scale); + } + } + } + } + } + + if (param_.has_resize_param()) { + *cv_img = ApplyResize(orig_img, param_.resize_param()); + } else { + *cv_img = orig_img; + } +} + +template +void DataTransformer::TransformInv(const Blob* blob, + vector* cv_imgs) { + const int channels = blob->channels(); + const int height = blob->height(); + const int width = blob->width(); + const int num = blob->num(); + CHECK_GE(num, 1); + const Dtype* image_data = blob->cpu_data(); + + for (int i = 0; i < num; ++i) { + cv::Mat cv_img; + TransformInv(image_data, &cv_img, height, width, channels); + cv_imgs->push_back(cv_img); + image_data += blob->offset(1); + } +} + +template +void DataTransformer::CropImage(const cv::Mat& img, + const NormalizedBBox& bbox, + cv::Mat* crop_img) { + const int img_height = img.rows; + const int img_width = img.cols; + + // Get the bbox dimension. + NormalizedBBox clipped_bbox; + ClipBBox(bbox, &clipped_bbox); + NormalizedBBox scaled_bbox; + ScaleBBox(clipped_bbox, img_height, img_width, &scaled_bbox); + + // Crop the image using bbox. + int w_off = static_cast(scaled_bbox.xmin()); + int h_off = static_cast(scaled_bbox.ymin()); + int width = static_cast(scaled_bbox.xmax() - scaled_bbox.xmin()); + int height = static_cast(scaled_bbox.ymax() - scaled_bbox.ymin()); + cv::Rect bbox_roi(w_off, h_off, width, height); + + img(bbox_roi).copyTo(*crop_img); +} + +template +void DataTransformer::ExpandImage(const cv::Mat& img, + const float expand_ratio, + NormalizedBBox* expand_bbox, + cv::Mat* expand_img) { + const int img_height = img.rows; + const int img_width = img.cols; + const int img_channels = img.channels(); + + // Get the bbox dimension. + int height = static_cast(img_height * expand_ratio); + int width = static_cast(img_width * expand_ratio); + float h_off, w_off; + caffe_rng_uniform(1, 0.f, static_cast(height - img_height), &h_off); + caffe_rng_uniform(1, 0.f, static_cast(width - img_width), &w_off); + h_off = floor(h_off); + w_off = floor(w_off); + expand_bbox->set_xmin(-w_off/img_width); + expand_bbox->set_ymin(-h_off/img_height); + expand_bbox->set_xmax((width - w_off)/img_width); + expand_bbox->set_ymax((height - h_off)/img_height); + + expand_img->create(height, width, img.type()); + expand_img->setTo(cv::Scalar(0)); + const bool has_mean_file = param_.has_mean_file(); + const bool has_mean_values = mean_values_.size() > 0; + + if (has_mean_file) { + CHECK_EQ(img_channels, data_mean_.channels()); + CHECK_EQ(height, data_mean_.height()); + CHECK_EQ(width, data_mean_.width()); + float* mean = data_mean_.mutable_cpu_data(); + for (int h = 0; h < height; ++h) { + uchar* ptr = expand_img->ptr(h); + int img_index = 0; + for (int w = 0; w < width; ++w) { + for (int c = 0; c < img_channels; ++c) { + int blob_index = (c * height + h) * width + w; + ptr[img_index++] = static_cast(mean[blob_index]); + } + } + } + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == img_channels) << + "Specify either 1 mean_value or as many as channels: " << img_channels; + if (img_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < img_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + vector channels(img_channels); + cv::split(*expand_img, channels); + CHECK_EQ(channels.size(), mean_values_.size()); + for (int c = 0; c < img_channels; ++c) { + channels[c] = mean_values_[c]; + } + cv::merge(channels, *expand_img); + } + + cv::Rect bbox_roi(w_off, h_off, img_width, img_height); + img.copyTo((*expand_img)(bbox_roi)); +} + +template +vector DataTransformer::InferBlobShape(const Datum& datum) { + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // InferBlobShape using the cv::image. + return InferBlobShape(cv_img); + } + const int crop_size = param_.crop_size(); + int crop_h = param_.crop_h(); + int crop_w = param_.crop_w(); + if (crop_size) { + crop_h = crop_size; + crop_w = crop_size; + } + const int datum_channels = datum.channels(); + int datum_height = datum.height(); + int datum_width = datum.width(); + + // Check dimensions. + CHECK_GT(datum_channels, 0); + if (param_.has_resize_param()) { + InferNewSize(param_.resize_param(), datum_width, datum_height, + &datum_width, &datum_height); + } + CHECK_GE(datum_height, crop_h); + CHECK_GE(datum_width, crop_w); + + // Build BlobShape. + vector shape(4); + shape[0] = 1; + shape[1] = datum_channels; + shape[2] = (crop_h)? crop_h: datum_height; + shape[3] = (crop_w)? crop_w: datum_width; + return shape; +} + +template +vector DataTransformer::InferBlobShape( + const vector & datum_vector) { + const int num = datum_vector.size(); + CHECK_GT(num, 0) << "There is no datum to in the vector"; + // Use first datum in the vector to InferBlobShape. + vector shape = InferBlobShape(datum_vector[0]); + // Adjust num to the size of the vector. + shape[0] = num; + return shape; +} + +template +vector DataTransformer::InferBlobShape(const cv::Mat& cv_img) { + const int crop_size = param_.crop_size(); + int crop_h = param_.crop_h(); + int crop_w = param_.crop_w(); + if (crop_size) { + crop_h = crop_size; + crop_w = crop_size; + } + const int img_channels = cv_img.channels(); + int img_height = cv_img.rows; + int img_width = cv_img.cols; + // Check dimensions. + CHECK_GT(img_channels, 0); + if (param_.has_resize_param()) { + InferNewSize(param_.resize_param(), img_width, img_height, + &img_width, &img_height); + } + CHECK_GE(img_height, crop_h); + CHECK_GE(img_width, crop_w); + + // Build BlobShape. + vector shape(4); + shape[0] = 1; + shape[1] = img_channels; + shape[2] = (crop_h)? crop_h: img_height; + shape[3] = (crop_w)? crop_w: img_width; + return shape; +} + +template +vector DataTransformer::InferDatumShape(const Datum& datum) { + if (datum.encoded()) { + CHECK(!(param_.force_color() && param_.force_gray())) + << "cannot set both force_color and force_gray"; + cv::Mat cv_img; + if (param_.force_color() || param_.force_gray()) { + // If force_color then decode in color otherwise decode in gray. + cv_img = DecodeDatumToCVMat(datum, param_.force_color()); + } else { + cv_img = DecodeDatumToCVMatNative(datum); + } + // Infer shape using the cv::image. + return InferCVMatShape(cv_img); + } + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + vector datum_shape(4); + datum_shape[0] = 1; + datum_shape[1] = datum_channels; + datum_shape[2] = datum_height; + datum_shape[3] = datum_width; + return datum_shape; +} + +template +vector DataTransformer::InferCVMatShape(const cv::Mat& cv_img) { + int img_channels = cv_img.channels(); + int img_height = cv_img.rows; + int img_width = cv_img.cols; + vector shape(4); + shape[0] = 1; + shape[1] = img_channels; + shape[2] = img_height; + shape[3] = img_width; + + const int crop_size = param_.crop_size(); + int crop_h = param_.crop_h(); + int crop_w = param_.crop_w(); + if (crop_size) { + crop_h = crop_size; + crop_w = crop_size; + } + + // Check dimensions. + if (param_.has_resize_param()) { + InferNewSize(param_.resize_param(), img_width, img_height, + &img_width, &img_height); + } + CHECK_GE(img_height, crop_h); + CHECK_GE(img_width, crop_w); + + // Build BlobShape. + shape[0] = 1; + shape[1] = img_channels; + shape[2] = (crop_h)? crop_h: img_height; + shape[3] = (crop_w)? crop_w: img_width; + + return shape; +} + + +template +vector DataTransformer::InferBlobShape(const vector& bottom_shape, bool use_gpu) { + const int crop_size = param_.crop_size(); + CHECK_EQ(bottom_shape.size(), 4); + CHECK_EQ(bottom_shape[0], 1); + const int bottom_channels = bottom_shape[1]; + const int bottom_height = bottom_shape[2]; + const int bottom_width = bottom_shape[3]; + // Check dimensions. + CHECK_GT(bottom_channels, 0); + CHECK_GE(bottom_height, crop_size); + CHECK_GE(bottom_width, crop_size); + // Build BlobShape. + vector top_shape(4); + top_shape[0] = 1; + top_shape[1] = bottom_channels; + // if using GPU transform, don't crop + if (use_gpu) { + top_shape[2] = bottom_height; + top_shape[3] = bottom_width; + } else { + top_shape[2] = (crop_size) ? crop_size : bottom_height; + top_shape[3] = (crop_size) ? crop_size : bottom_width; + } + return top_shape; +} + +template +void DataTransformer::Transform(const Datum& datum, + Dtype *transformed_data, const std::array& rand) { + const string& data = datum.data(); + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + const int crop_size = param_.crop_size(); + const float scale = param_.scale(); + const bool do_mirror = param_.mirror() && (rand[0] % 2); + const bool has_mean_file = param_.has_mean_file(); + const bool has_uint8 = data.size() > 0; + const bool has_mean_values = mean_values_.size() > 0; + + CHECK_GT(datum_channels, 0); + CHECK_GE(datum_height, crop_size); + CHECK_GE(datum_width, crop_size); + + const float* mean = NULL; + if (has_mean_file) { + CHECK_EQ(datum_channels, data_mean_.channels()); + CHECK_EQ(datum_height, data_mean_.height()); + CHECK_EQ(datum_width, data_mean_.width()); + mean = data_mean_.cpu_data(); + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == datum_channels) + << "Specify either 1 mean_value or as many as channels: " << datum_channels; + if (datum_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < datum_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } + + int height = datum_height; + int width = datum_width; + + int h_off = 0; + int w_off = 0; + if (crop_size) { + height = crop_size; + width = crop_size; + // We only do random crop when we do training. + if (phase_ == TRAIN) { + h_off = rand[1] % (datum_height - crop_size + 1); + w_off = rand[2] % (datum_width - crop_size + 1); + } else { + h_off = (datum_height - crop_size) / 2; + w_off = (datum_width - crop_size) / 2; + } + } + + int top_index, data_index, ch, cdho; + const int m = do_mirror ? -1 : 1; + + if (has_uint8) { + Dtype datum_element, mnv; + + if (scale == 1.F) { + for (int c = 0; c < datum_channels; ++c) { + cdho = c * datum_height + h_off; + ch = c * height; + mnv = has_mean_values && !has_mean_file ? mean_values_[c] : 0.F; + for (int h = 0; h < height; ++h) { + top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; + data_index = (cdho + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + datum_element = static_cast(data[data_index]); + if (has_mean_file) { + transformed_data[top_index] = datum_element - mean[data_index]; + } else { + if (has_mean_values) { + transformed_data[top_index] = datum_element - mnv; + } else { + transformed_data[top_index] = datum_element; + } + } + ++data_index; + top_index += m; + } + } + } + } else { + for (int c = 0; c < datum_channels; ++c) { + cdho = c * datum_height + h_off; + ch = c * height; + mnv = has_mean_values && !has_mean_file ? mean_values_[c] : 0.F; + for (int h = 0; h < height; ++h) { + top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; + data_index = (cdho + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + datum_element = static_cast(data[data_index]); + if (has_mean_file) { + transformed_data[top_index] = (datum_element - mean[data_index]) * scale; + } else { + if (has_mean_values) { + transformed_data[top_index] = (datum_element - mnv) * scale; + } else { + transformed_data[top_index] = datum_element * scale; + } + } + ++data_index; + top_index += m; + } + } + } + } + } else { + Dtype datum_element; + for (int c = 0; c < datum_channels; ++c) { + cdho = c * datum_height + h_off; + ch = c * height; + for (int h = 0; h < height; ++h) { + top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; + data_index = (cdho + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + datum_element = datum.float_data(data_index); + if (has_mean_file) { + transformed_data[top_index] = (datum_element - mean[data_index]) * scale; + } else { + if (has_mean_values) { + transformed_data[top_index] = (datum_element - mean_values_[c]) * scale; + } else { + transformed_data[top_index] = datum_element * scale; + } + } + ++data_index; + top_index += m; + } + } + } + } +} + +template +void DataTransformer::Transform(const cv::Mat& img, TBlob *transformed_blob) const { + const int crop_size = param_.crop_size(); + const int img_channels = img.channels(); + const int img_height = img.rows; + const int img_width = img.cols; + + // Check dimensions. + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + const int num = transformed_blob->num(); + + CHECK_EQ(channels, img_channels); + CHECK_LE(height, img_height); + CHECK_LE(width, img_width); + CHECK_GE(num, 1); + // TODO + if (crop_size > 0) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + } + Transform(img, transformed_blob->mutable_cpu_data(false), transformed_blob->count()); +} + +template +void DataTransformer::TransformV1(const Datum& datum, Dtype* buf, size_t buf_len) { + const string& data = datum.data(); + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + const int crop_size = param_.crop_size(); + const float scale = param_.scale(); + const bool do_mirror = param_.mirror() && (Rand() % 2); + const bool has_mean_file = param_.has_mean_file(); + const bool has_uint8 = data.size() > 0; + const bool has_mean_values = mean_values_.size() > 0; + + CHECK_GT(datum_channels, 0); + CHECK_GE(datum_height, crop_size); + CHECK_GE(datum_width, crop_size); + + const float* mean = NULL; + if (has_mean_file) { + CHECK_EQ(datum_channels, data_mean_.channels()); + CHECK_EQ(datum_height, data_mean_.height()); + CHECK_EQ(datum_width, data_mean_.width()); + mean = data_mean_.cpu_data(); + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == datum_channels) + << "Specify either 1 mean_value or as many as channels: " << datum_channels; + if (datum_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < datum_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } + + int height = datum_height; + int width = datum_width; + + int h_off = 0; + int w_off = 0; + if (crop_size) { + height = crop_size; + width = crop_size; + // We only do random crop when we do training. + if (phase_ == TRAIN) { + h_off = Rand() % (datum_height - crop_size + 1); + w_off = Rand() % (datum_width - crop_size + 1); + } else { + h_off = (datum_height - crop_size) / 2; + w_off = (datum_width - crop_size) / 2; + } + } + + int top_index, data_index, ch, cdho; + const int m = do_mirror ? -1 : 1; + + if (has_uint8) { + float datum_element, mnv; + + if (scale == 1.F) { + for (int c = 0; c < datum_channels; ++c) { + cdho = c * datum_height + h_off; + ch = c * height; + mnv = has_mean_values && !has_mean_file ? mean_values_[c] : 0.F; + for (int h = 0; h < height; ++h) { + top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; + data_index = (cdho + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + datum_element = static_cast(data[data_index]); + if (has_mean_file) { + buf[top_index] = datum_element - mean[data_index]; + } else { + if (has_mean_values) { + buf[top_index] = datum_element - mnv; + } else { + buf[top_index] = datum_element; + } + } + ++data_index; + top_index += m; + } + } + } + } else { + for (int c = 0; c < datum_channels; ++c) { + cdho = c * datum_height + h_off; + ch = c * height; + mnv = has_mean_values && !has_mean_file ? mean_values_[c] : 0.F; + for (int h = 0; h < height; ++h) { + top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; + data_index = (cdho + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + datum_element = static_cast(data[data_index]); + if (has_mean_file) { + buf[top_index] = (datum_element - mean[data_index]) * scale; + } else { + if (has_mean_values) { + buf[top_index] = (datum_element - mnv) * scale; + } else { + buf[top_index] = datum_element * scale; + } + } + ++data_index; + top_index += m; + } + } + } + } + } else { + float datum_element; + for (int c = 0; c < datum_channels; ++c) { + cdho = c * datum_height + h_off; + ch = c * height; + for (int h = 0; h < height; ++h) { + top_index = do_mirror ? (ch + h + 1) * width - 1 : (ch + h) * width; + data_index = (cdho + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + datum_element = datum.float_data(data_index); + if (has_mean_file) { + buf[top_index] = (datum_element - mean[data_index]) * scale; + } else { + if (has_mean_values) { + buf[top_index] = (datum_element - mean_values_[c]) * scale; + } else { + buf[top_index] = datum_element * scale; + } + } + ++data_index; + top_index += m; + } + } + } + } +} + +INSTANTIATE_CLASS(DataTransformer); + } // namespace caffe diff --git a/src/caffe/data_transformer.cu b/src/caffe/data_transformer.cu index 88a6cfbd48d..c682b0d04d9 100644 --- a/src/caffe/data_transformer.cu +++ b/src/caffe/data_transformer.cu @@ -190,7 +190,7 @@ void transform_kernel<__half>(int N, int C, template -void DataTransformer::TransformGPU(int N, int C, int H, int W, +void DataTransformer::TransformGPU(int N, int C, int H, int W, size_t sizeof_element, const void *in, Dtype *out, const unsigned int *random_numbers, bool signed_data) { @@ -274,11 +274,11 @@ void DataTransformer::TransformGPU(int N, int C, int H, int W, CUDA_CHECK(cudaStreamSynchronize(stream)); } -template void DataTransformer::TransformGPU(int, int, int, int, +template void DataTransformer::TransformGPU(int, int, int, int, size_t, const void*, float*, const unsigned int*, bool); -template void DataTransformer::TransformGPU(int, int, int, int, +template void DataTransformer::TransformGPU(int, int, int, int, size_t, const void*, double*, const unsigned int*, bool); -template void DataTransformer::TransformGPU(int, int, int, int, +template void DataTransformer::TransformGPU(int, int, int, int, size_t, const void*, float16*, const unsigned int*, bool); } // namespace caffe diff --git a/src/caffe/layer.cpp b/src/caffe/layer.cpp index 13867ecaf8b..09fddf8bcc7 100644 --- a/src/caffe/layer.cpp +++ b/src/caffe/layer.cpp @@ -88,9 +88,8 @@ int LayerBase::iter() const { return psolver == nullptr ? 0 : psolver->iter(); } -int LayerBase::relative_iter() const { - const Solver* psolver = parent_solver(); - return psolver == nullptr ? 0 : psolver->relative_iter(); +int LayerBase::parent_rank() const { + return parent_net_ == nullptr ? 0 : parent_net_->solver_rank(); } std::string LayerBase::print_current_device() const { diff --git a/src/caffe/layers/accuracy_layer.cu b/src/caffe/layers/accuracy_layer.cu new file mode 100644 index 00000000000..82fa16a4e74 --- /dev/null +++ b/src/caffe/layers/accuracy_layer.cu @@ -0,0 +1,150 @@ +#include +#include + +#include "caffe/layers/accuracy_layer.hpp" +#include "caffe/util/math_functions.hpp" + + +namespace caffe { + +template +__global__ void AccuracyForwardGPU(const int nthreads, + const Dtype* bottom_data, const Dtype* label, Dtype* acc, + const int num, const int dim, const int spatial_dim, + const int num_labels, const int top_k, + const bool has_ignore_label_, const int ignore_label_, + Dtype* counts) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int n = index / spatial_dim; + const int s = index % spatial_dim; + const int label_value = static_cast(label[n * spatial_dim + s]); + const Dtype prob_of_true_class = bottom_data[n * dim + + label_value * spatial_dim + + s]; + int num_better_predictions = -1; // true_class also counts as "better" + if (has_ignore_label_ && label_value == ignore_label_) { + acc[index] = 0; + counts[index] = 0; + } else { + for (int k = 0; k < num_labels & num_better_predictions < top_k; k++) { + num_better_predictions += + (bottom_data[n * dim + k * spatial_dim + s] >= prob_of_true_class); + } + acc[index] = (num_better_predictions < top_k); + counts[index] = 1; + } + } +} + +template +__global__ void AccuracyForwardWithPerClassGPU(const int nthreads, + const Dtype* bottom_data, const Dtype* label, + Dtype* acc, Dtype* counts, + const int num, const int dim, const int spatial_dim, + const int num_labels, const int top_k, + const bool has_ignore_label_, const int ignore_label_) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int n = index / spatial_dim; + const int s = index % spatial_dim; + const int label_value = static_cast(label[n * spatial_dim + s]); + const Dtype prob_of_true_class = bottom_data[n * dim + + label_value * spatial_dim + + s]; + if (has_ignore_label_ && label_value == ignore_label_) { + // nothing to be done. + } else { + int num_better_predictions = -1; // true_class also counts as "better" + for (int k = 0; k < num_labels & num_better_predictions < top_k; k++) { + num_better_predictions += + (bottom_data[n * dim + k * spatial_dim + s] >= prob_of_true_class); + } + acc[label_value*nthreads + index] += (num_better_predictions < top_k); + counts[label_value*nthreads + index] = 1; + } + } +} + +template +void AccuracyLayer::Forward_gpu( + const vector& bottom, const vector& top) { + const Ftype* bottom_data = bottom[0]->gpu_data(); + const Ftype* bottom_label = bottom[1]->gpu_data(); + const int dim = bottom[0]->count() / outer_num_; + const int num_labels = bottom[0]->shape(label_axis_); + const int nthreads = outer_num_ * inner_num_; + // Since this memory is not used for anything, we use it here to avoid having + // to allocate new GPU memory to accumulate intermediate results. + Ftype* acc_data = bottom[0]->mutable_gpu_diff(); + if (top.size() == 1) { + // simple case - report only global accuracy. + + // Similarly, this memory is never used elsewhere, and thus we can use it + // to avoid having to allocate additional GPU memory. + Ftype* counts = bottom[1]->mutable_gpu_diff(); + // NOLINT_NEXT_LINE(whitespace/operators) + AccuracyForwardGPU<<>>(nthreads, bottom_data, bottom_label, + acc_data, outer_num_, dim, inner_num_, num_labels, top_k_, + has_ignore_label_, ignore_label_, counts); + Ftype acc; + caffe_gpu_asum(nthreads, acc_data, &acc, 0); + Ftype valid_count; + caffe_gpu_asum(nthreads, counts, &valid_count, 0); + if (valid_count > 0) { + top[0]->mutable_cpu_data()[0] = acc / valid_count; + } else { + top[0]->mutable_cpu_data()[0] = 0; + } + } else { + // need to report per-class accuracy as well + + // allocate space for more detailed "counts" + nums_buffer_.ReshapeLike(*bottom[0]); + Ftype* counts = nums_buffer_.mutable_gpu_data(); + + caffe_gpu_set(bottom[0]->count(), Ftype(0), acc_data); + caffe_gpu_set(nums_buffer_.count(), Ftype(0), counts); + + // NOLINT_NEXT_LINE(whitespace/operators) + AccuracyForwardWithPerClassGPU<<>>(nthreads, bottom_data, bottom_label, + acc_data, counts, outer_num_, dim, inner_num_, num_labels, top_k_, + has_ignore_label_, ignore_label_); + + // get the overall accuracy + Ftype acc; + caffe_gpu_asum(bottom[0]->count(), acc_data, &acc, 0); + Ftype valid_count; + caffe_gpu_asum(nums_buffer_.count(), counts, &valid_count, 0); + if (valid_count > 0) { + top[0]->mutable_cpu_data()[0] = acc / valid_count; + } else { + top[0]->mutable_cpu_data()[0] = 0; + } + + // get per-class accuracy + Ftype* per_class_acc = top[1]->mutable_cpu_data(); + for (int l = 0; l < num_labels; l++) { + caffe_gpu_asum(nthreads, acc_data + l*nthreads, per_class_acc+l, 0); + caffe_gpu_asum(nthreads, counts + l*nthreads, &valid_count, 0); + if (valid_count > 0) { + per_class_acc[l] /= valid_count; + } else { + per_class_acc[l] = 0; + } + } + } + // Clear scratch memory to prevent interfering with backward (see #6202). + caffe_gpu_set(bottom[0]->count(), Ftype(0), bottom[0]->mutable_gpu_diff()); +} + + +template +void AccuracyLayer::Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + if (propagate_down[1]) { NOT_IMPLEMENTED; } +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(AccuracyLayer); + +} // namespace caffe diff --git a/src/caffe/layers/annotated_data_layer.cpp b/src/caffe/layers/annotated_data_layer.cpp new file mode 100644 index 00000000000..6e14b9ec188 --- /dev/null +++ b/src/caffe/layers/annotated_data_layer.cpp @@ -0,0 +1,337 @@ +#include +#include + +#include +#include +#include + +#include "caffe/data_transformer.hpp" +#include "caffe/layers/annotated_data_layer.hpp" +#include "caffe/util/benchmark.hpp" +#include "caffe/util/sampler.hpp" +#include "caffe/parallel.hpp" + +namespace caffe { + +template +AnnotatedDataLayer::AnnotatedDataLayer(const LayerParameter& param, + size_t solver_rank) + : DataLayer(param, solver_rank) {} + +template +void AnnotatedDataLayer::DataLayerSetUp( + const vector& bottom, const vector& top) { + const LayerParameter& param = this->layer_param(); + const AnnotatedDataParameter& anno_data_param = param.annotated_data_param(); + const int batch_size = param.data_param().batch_size(); + const bool cache = this->cache_ && this->phase_ == TRAIN; + const bool shuffle = cache && this->shuffle_ && this->phase_ == TRAIN; + TBlob transformed_datum; + + for (int i = 0; i < anno_data_param.batch_sampler_size(); ++i) { + batch_samplers_.push_back(anno_data_param.batch_sampler(i)); + } + + if (this->auto_mode()) { + if (!sample_areader_) { + sample_areader_ = std::make_shared>(param, + Caffe::solver_count(), + this->rank_, + this->parsers_num_, + this->threads_num(), + batch_size, + true, + false, + cache, + shuffle, + false); + } else if (!areader_) { + areader_ = std::make_shared>(param, + Caffe::solver_count(), + this->rank_, + this->parsers_num_, + this->threads_num(), + batch_size, + false, + true, + cache, + shuffle, + this->phase_ == TRAIN); + } + } else if (!areader_) { + areader_ = std::make_shared>(param, + Caffe::solver_count(), + this->rank_, + this->parsers_num_, + this->threads_num(), + batch_size, + false, + false, + cache, + shuffle, + this->phase_ == TRAIN); + start_reading(); + } + + label_map_file_ = anno_data_param.label_map_file(); + // Make sure dimension is consistent within batch. + const TransformationParameter& transform_param = + this->layer_param_.transform_param(); + if (transform_param.has_resize_param()) { + if (transform_param.resize_param().resize_mode() == + ResizeParameter_Resize_mode_FIT_SMALL_SIZE) { + CHECK_EQ(batch_size, 1) + << "Only support batch size of 1 for FIT_SMALL_SIZE."; + } + } + + // Read a data point, and use it to initialize the top blob. + shared_ptr sample_datum = + this->sample_only_ ? this->sample_areader_->sample() : this->areader_->sample(); + AnnotatedDatum& anno_datum = *sample_datum; + this->ResizeQueues(); + this->init_offsets(); + + // Calculate the variable sized transformed datum shape. + vector sample_datum_shape = this->bdt(0)->InferDatumShape(sample_datum->datum()); + // Reshape top[0] and prefetch_data according to the batch_size. + // Note: all these reshapings here in load_batch are needed only in case of + // different datum shapes coming from database. + vector top_shape = this->bdt(0)->InferBlobShape(sample_datum_shape); + transformed_datum.Reshape(top_shape); + top_shape[0] = batch_size; + top[0]->Reshape(top_shape); + + LOG(INFO) << "output data size: " << top[0]->num() << "," + << top[0]->channels() << "," << top[0]->height() << "," + << top[0]->width(); + // label + vector label_shape(4, 1); + if (this->output_labels_) { + has_anno_type_ = anno_datum.has_type() || anno_data_param.has_anno_type(); + if (has_anno_type_) { + anno_type_ = anno_datum.type(); + if (anno_data_param.has_anno_type()) { + // If anno_type is provided in AnnotatedDataParameter, replace + // the type stored in each individual AnnotatedDatum. + LOG(WARNING) << "type stored in AnnotatedDatum is shadowed."; + anno_type_ = anno_data_param.anno_type(); + } + // Infer the label shape from anno_datum.AnnotationGroup(). + int num_bboxes = 0; + if (anno_type_ == AnnotatedDatum_AnnotationType_BBOX) { + // Since the number of bboxes can be different for each image, + // we store the bbox information in a specific format. In specific: + // All bboxes are stored in one spatial plane (num and channels are 1) + // And each row contains one and only one box in the following format: + // [item_id, group_label, instance_id, xmin, ymin, xmax, ymax, diff] + // Note: Refer to caffe.proto for details about group_label and + // instance_id. + for (int g = 0; g < anno_datum.annotation_group_size(); ++g) { + num_bboxes += anno_datum.annotation_group(g).annotation_size(); + } + label_shape[0] = 1; + label_shape[1] = 1; + // BasePrefetchingDataLayer::LayerSetUp() requires to call + // cpu_data and gpu_data for consistent prefetch thread. Thus we make + // sure there is at least one bbox. + label_shape[2] = std::max(num_bboxes, 1); + label_shape[3] = 8; + } else { + LOG(FATAL) << "Unknown annotation type."; + } + } else { + label_shape[0] = batch_size; + } + top[1]->Reshape(label_shape); + } + this->batch_transformer_->reshape(top_shape, label_shape, this->is_gpu_transform()); + + LOG(INFO) << this->print_current_device() << " Output data size: " + << top[0]->num() << ", " + << top[0]->channels() << ", " + << top[0]->height() << ", " + << top[0]->width(); +} + +// This function is called on prefetch thread +template +void AnnotatedDataLayer::load_batch(Batch* batch, int thread_id, size_t queue_id) { + const bool sample_only = this->sample_only_.load(); + TBlob transformed_datum; + + //const bool use_gpu_transform = false;//this->is_gpu_transform(); + // Reshape according to the first anno_datum of each batch + // on single input batches allows for inputs of varying dimension. + const int batch_size = this->layer_param_.data_param().batch_size(); + const AnnotatedDataParameter& anno_data_param = + this->layer_param_.annotated_data_param(); + const TransformationParameter& transform_param = + this->layer_param_.transform_param(); + + const size_t qid = sample_only ? 0UL : queue_id; + DataReader* reader = sample_only ? sample_areader_.get() : areader_.get(); + shared_ptr init_datum = reader->full_peek(qid); + CHECK(init_datum); + + // Use data_transformer to infer the expected blob shape from datum. + vector top_shape = this->bdt(thread_id)->InferBlobShape(init_datum->datum()); + transformed_datum.Reshape(top_shape); + // Reshape batch according to the batch_size. + top_shape[0] = batch_size; + batch->data_->Reshape(top_shape); + + Ftype* top_data = batch->data_->mutable_cpu_data(); + Ftype* top_label = NULL; // suppress warnings about uninitialized variables + if (this->output_labels_ && !has_anno_type_) { + top_label = batch->label_->mutable_cpu_data(); + } + + // Store transformed annotation. + map > all_anno; + int num_bboxes = 0; + + size_t current_batch_id = 0UL; + for (size_t entry = 0; entry < batch_size; ++entry) { + // get an anno_datum + shared_ptr anno_datum = reader->full_pop(qid, "Waiting for data"); + size_t item_id = anno_datum->record_id() % batch_size; + if (item_id == 0UL) { + current_batch_id = anno_datum->record_id() / batch_size; + } + AnnotatedDatum distort_datum; + AnnotatedDatum expand_datum; + if (transform_param.has_distort_param()) { + distort_datum.CopyFrom(*anno_datum); + this->bdt(thread_id)->DistortImage(anno_datum->datum(), distort_datum.mutable_datum()); + if (transform_param.has_expand_param()) { + this->bdt(thread_id)->ExpandImage(distort_datum, &expand_datum); + } else { + expand_datum = distort_datum; + } + } else { + if (transform_param.has_expand_param()) { + this->bdt(thread_id)->ExpandImage(*anno_datum, &expand_datum); + } else { + expand_datum = *anno_datum; + } + } + AnnotatedDatum sampled_datum; + if (batch_samplers_.size() > 0) { + // Generate sampled bboxes from expand_datum. + vector sampled_bboxes; + GenerateBatchSamples(expand_datum, batch_samplers_, &sampled_bboxes); + if (sampled_bboxes.size() > 0) { + // Randomly pick a sampled bbox and crop the expand_datum. + int rand_idx = caffe_rng_rand() % sampled_bboxes.size(); + this->bdt(thread_id)->CropImage(expand_datum, sampled_bboxes[rand_idx], &sampled_datum); + } else { + sampled_datum = expand_datum; + } + } else { + sampled_datum = expand_datum; + } + vector shape = + this->bdt(thread_id)->InferBlobShape(sampled_datum.datum()); + if (transform_param.has_resize_param()) { + if (transform_param.resize_param().resize_mode() == + ResizeParameter_Resize_mode_FIT_SMALL_SIZE) { + transformed_datum.Reshape(shape); + batch->data_->Reshape(shape); + top_data = batch->data_->mutable_cpu_data(); + } else { + CHECK(std::equal(top_shape.begin() + 1, top_shape.begin() + 4, + shape.begin() + 1)); + } + } else { + CHECK(std::equal(top_shape.begin() + 1, top_shape.begin() + 4, + shape.begin() + 1)); + } + // Apply data transformations (mirror, scale, crop...) + int offset = batch->data_->offset(item_id); + transformed_datum.set_cpu_data(top_data + offset); + vector transformed_anno_vec; + if (this->output_labels_) { + if (has_anno_type_) { + // Make sure all data have same annotation type. + CHECK(sampled_datum.has_type()) << "Some datum misses AnnotationType."; + if (anno_data_param.has_anno_type()) { + sampled_datum.set_type(anno_type_); + } else { + CHECK_EQ(anno_type_, sampled_datum.type()) << "Different AnnotationType."; + } + // Transform datum and annotation_group at the same time + transformed_anno_vec.clear(); + this->fdt(thread_id)->Transform(sampled_datum, &transformed_datum, &transformed_anno_vec); + if (anno_type_ == AnnotatedDatum_AnnotationType_BBOX) { + // Count the number of bboxes. + for (int g = 0; g < transformed_anno_vec.size(); ++g) { + num_bboxes += transformed_anno_vec[g].annotation_size(); + } + } else { + LOG(FATAL) << "Unknown annotation type."; + } + all_anno[item_id] = transformed_anno_vec; + } else { + this->fdt(thread_id)->Transform(sampled_datum.datum(), &(transformed_datum)); + // Otherwise, store the label from datum. + CHECK(sampled_datum.datum().has_label()) << "Cannot find any label."; + top_label[item_id] = sampled_datum.datum().label(); + } + } else { + this->fdt(thread_id)->Transform(sampled_datum.datum(), &transformed_datum); + } + + reader->free_push(queue_id, anno_datum); + } + + // Store "rich" annotation if needed. + if (this->output_labels_ && has_anno_type_) { + vector label_shape(4); + if (anno_type_ == AnnotatedDatum_AnnotationType_BBOX) { + label_shape[0] = 1; + label_shape[1] = 1; + label_shape[3] = 8; + if (num_bboxes == 0) { + // Store all -1 in the label. + label_shape[2] = 1; + batch->label_->Reshape(label_shape); + caffe_set(8, -1, batch->label_->mutable_cpu_data()); + } else { + // Reshape the label and store the annotation. + label_shape[2] = num_bboxes; + batch->label_->Reshape(label_shape); + top_label = batch->label_->mutable_cpu_data(); + int idx = 0; + for (int item_id = 0; item_id < batch_size; ++item_id) { + const vector& anno_vec = all_anno[item_id]; + for (int g = 0; g < anno_vec.size(); ++g) { + const AnnotationGroup& anno_group = anno_vec[g]; + for (int a = 0; a < anno_group.annotation_size(); ++a) { + const Annotation& anno = anno_group.annotation(a); + const NormalizedBBox& bbox = anno.bbox(); + top_label[idx++] = item_id; + top_label[idx++] = anno_group.group_label(); + top_label[idx++] = anno.instance_id(); + top_label[idx++] = bbox.xmin(); + top_label[idx++] = bbox.ymin(); + top_label[idx++] = bbox.xmax(); + top_label[idx++] = bbox.ymax(); + top_label[idx++] = bbox.difficult(); + } + } + } + } + } else { + LOG(FATAL) << "Unknown annotation type."; + } + } +// batch->set_data_packing(packing); todo + batch->set_id(current_batch_id); + this->sample_only_.store(false); +} + +INSTANTIATE_CLASS_FB(AnnotatedDataLayer); +REGISTER_LAYER_CLASS_R(AnnotatedData); + +} // namespace caffe diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 9e8cedaa350..8d2ad5ec722 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -16,7 +16,6 @@ size_t BasePrefetchingDataLayer::threads(const LayerParameter& par if (param.type().compare("ImageData") == 0 && param.has_image_data_param()) { return param.image_data_param().threads(); } - // Check user's override in prototxt file size_t threads = param.data_param().threads(); if (!auto_mode(param) && threads == 0U) { @@ -67,7 +66,8 @@ BasePrefetchingDataLayer::BasePrefetchingDataLayer(const LayerPara transf_num_(threads(param)), queues_num_(transf_num_ * parsers_num_), batch_transformer_(make_shared>(Caffe::current_device(), - solver_rank, queues_num_, param.transform_param(), is_gpu_transform())) { + solver_rank, queues_num_, param.transform_param(), is_gpu_transform())), + iter0_(true) { CHECK_EQ(transf_num_, threads_num()); batch_size_ = param.data_param().batch_size(); // We begin with minimum required @@ -87,8 +87,10 @@ void BasePrefetchingDataLayer::LayerSetUp(const vector& bot BaseDataLayer::LayerSetUp(bottom, top); for (int i = 0; i < transf_num_; ++i) { - data_transformers_.emplace_back( - make_shared(this->transform_param_, this->phase_)); + bwd_data_transformers_.emplace_back( + make_shared>(this->transform_param_, this->phase_)); + fwd_data_transformers_.emplace_back( + make_shared>(this->transform_param_, this->phase_)); } const Solver* psolver = this->parent_solver(); const uint64_t random_seed = (psolver == nullptr || @@ -104,14 +106,18 @@ void BasePrefetchingDataLayer::InternalThreadEntry() { template void BasePrefetchingDataLayer::InternalThreadEntryN(size_t thread_id) { - static thread_local bool iter0 = this->phase_ == TRAIN; - if (iter0 && this->net_inititialized_flag_ != nullptr) { + const bool auto_mode = this->auto_mode(); + if (auto_mode) { + iter0_.wait_reset(); // sample reader first + } else if (this->phase_ == TRAIN) { + iter0_.wait(); + } + if (auto_mode && this->net_inititialized_flag_ != nullptr) { this->net_inititialized_flag_->wait(); - } else { // nothing to wait -> initialize and start pumping - InitializePrefetch(); - start_reading(); - iter0 = false; } + InitializePrefetch(); + start_reading(); + try { while (!must_stop(thread_id)) { const size_t qid = this->queue_id(thread_id); @@ -122,19 +128,13 @@ void BasePrefetchingDataLayer::InternalThreadEntryN(size_t thread_ break; } batch_transformer_->prefetched_push_full(qid, batch); - if (iter0) { + + if (auto_mode) { if (this->net_iteration0_flag_ != nullptr) { this->net_iteration0_flag_->wait(); } - if (this->net_inititialized_flag_ != nullptr) { - this->net_inititialized_flag_ = nullptr; // no wait on the second round - InitializePrefetch(); - start_reading(); - } - if (this->auto_mode()) { - break; - } // manual otherwise, thus keep rolling - iter0 = false; + iter0_.set(); + break; } } } catch (boost::thread_interrupted&) { @@ -150,11 +150,18 @@ void BasePrefetchingDataLayer::ResizeQueues() { batch_ids_[i] = i; } } - size = this->data_transformers_.size(); + size = this->bwd_data_transformers_.size(); + if (transf_num_ > size) { + for (size_t i = size; i < transf_num_; ++i) { + this->bwd_data_transformers_.emplace_back( + make_shared>(this->transform_param_, this->phase_)); + } + } + size = this->fwd_data_transformers_.size(); if (transf_num_ > size) { for (size_t i = size; i < transf_num_; ++i) { - this->data_transformers_.emplace_back( - make_shared(this->transform_param_, this->phase_)); + this->fwd_data_transformers_.emplace_back( + make_shared>(this->transform_param_, this->phase_)); } } } diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index bf67a44d947..5b5a520efb9 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -37,8 +37,6 @@ void ConcatLayer::Forward_gpu(const vector& bottom, if (bottom.size() == 1) { return; } - - for (int i = 0; i < bottom.size(); ++i) { bottom_data = bottom[i]->gpu_data(); const int bottom_concat_axis = bottom[i]->shape(concat_axis_); @@ -56,10 +54,9 @@ void ConcatLayer::Forward_gpu(const vector& bottom, nthreads, bottom_data, kForward, num_concats_, concat_input_size_, top_concat_axis, bottom_concat_axis, offset_concat_axis, top_data); } + CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream())); offset_concat_axis += bottom_concat_axis; } - - CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream())); } template @@ -83,6 +80,7 @@ void ConcatLayer::Backward_gpu(const vector& top, <<>>( nthreads, top_diff, kForward, num_concats_, concat_input_size_, top_concat_axis, bottom_concat_axis, offset_concat_axis, bottom_diff); + CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream())); } offset_concat_axis += bottom_concat_axis; } diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index 093cca3cebf..8e113aa99e6 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -20,23 +20,6 @@ namespace caffe { (CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NONFUSED + 1) #endif -template -void createFilterDesc(cudnnFilterDescriptor_t* desc, int n, int c, int h, int w) { - CUDNN_CHECK(cudnnCreateFilterDescriptor(desc)); - CUDNN_CHECK(cudnnSetFilter4dDescriptor(*desc, cudnn::dataType::type, - CUDNN_TENSOR_NCHW, n, c, h, w)); -} - -void setConvolutionDesc(Type math, cudnnConvolutionDescriptor_t conv, - int pad_h, int pad_w, int stride_h, int stride_w, int dilation_h, int dilation_w) { - int padA[2] = {pad_h, pad_w}; - int strideA[2] = {stride_h, stride_w}; - int upscaleA[2] = {dilation_h, dilation_w}; - CUDNN_CHECK(cudnnSetConvolutionNdDescriptor(conv, - 2, padA, strideA, upscaleA, CUDNN_CROSS_CORRELATION, - cudnn::cudnn_data_type(math))); -} - void setConvolutionDescMath(Type math, cudnnConvolutionDescriptor_t conv) { int padA[2]; int strideA[2]; @@ -155,19 +138,19 @@ void CuDNNConvolutionLayer::LayerSetUp( const int kernel_w = kernel_shape_data[1]; if (use_v7grouping()) { - createFilterDesc(&fwd_filter_desc_, + cudnn::createFilterDesc(&fwd_filter_desc_, this->num_output_, this->channels_ / groups(), kernel_h, kernel_w); - createFilterDesc(&bwd_filter_desc_, + cudnn::createFilterDesc(&bwd_filter_desc_, this->num_output_, this->channels_ / groups(), kernel_h, kernel_w); this->weight_offset_ = this->num_output_ * (this->channels_ / groups()) * kernel_h * kernel_w; } else { - createFilterDesc(&fwd_filter_desc_, + cudnn::createFilterDesc(&fwd_filter_desc_, this->num_output_ / groups(), this->channels_ / groups(), kernel_h, kernel_w); - createFilterDesc(&bwd_filter_desc_, + cudnn::createFilterDesc(&bwd_filter_desc_, this->num_output_ / groups(), this->channels_ / groups(), kernel_h, kernel_w); this->weight_offset_ = (this->num_output_ / groups()) * @@ -252,9 +235,6 @@ void CuDNNConvolutionLayer::LayerSetUp( template void CuDNNConvolutionLayer::AllocateFindExWorkspace() { const int dev = Caffe::current_device(); - if (ws_released_[dev]) { - return; - } shared_ptr ws = GPUMemory::workspace_[dev]; size_t bytes_available, bytes_total; GPUMemory::GetInfo(&bytes_available, &bytes_total, true); @@ -279,7 +259,6 @@ void CuDNNConvolutionLayer::AllocateFindExWorkspace() { LOG(INFO) << this->print_current_device() << " Retrying to allocate " << req_bytes << " bytes, attempts left: " << attempts; } - ws_allocated_[dev] = ws->size(); } template @@ -397,17 +376,17 @@ void CuDNNConvolutionLayer::Reshape( this->num_output_ * this->out_spatial_dim_, this->out_spatial_dim_, width_out, 1); - setConvolutionDesc(forward_math_, fwd_conv_descs_[i], + cudnn::setConvolutionDesc(forward_math_, fwd_conv_descs_[i], pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w); - setConvolutionDesc(forward_math_, fwd_cached_conv_descs_[i], + cudnn::setConvolutionDesc(forward_math_, fwd_cached_conv_descs_[i], pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w); - setConvolutionDesc(backward_data_math_, bwd_conv_data_descs_[i], + cudnn::setConvolutionDesc(backward_data_math_, bwd_conv_data_descs_[i], pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w); - setConvolutionDesc(backward_filter_math_, bwd_conv_filter_descs_[i], + cudnn::setConvolutionDesc(backward_filter_math_, bwd_conv_filter_descs_[i], pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w); - setConvolutionDesc(backward_data_math_, bwd_cached_conv_data_descs_[i], + cudnn::setConvolutionDesc(backward_data_math_, bwd_cached_conv_data_descs_[i], pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w); - setConvolutionDesc(backward_filter_math_, bwd_cached_conv_filter_descs_[i], + cudnn::setConvolutionDesc(backward_filter_math_, bwd_cached_conv_filter_descs_[i], pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w); // Set cached descriptors @@ -461,9 +440,12 @@ void CuDNNConvolutionLayer::Reshape( // Now taking the rest for running FindEx calls // We'll release what's possible in BW pass AllocateFindExWorkspace(); + // Also used by Test Net but based on shared space taken by Train: + FindExConvAlgo(bottom, top); } - // Also used by Test Net but based on shared space taken by Train: - FindExConvAlgo(bottom, top); +// else { +// AllocateWorkspace(bottom.size()); +// } use_algo_seeker_ = false; } break; @@ -471,27 +453,6 @@ void CuDNNConvolutionLayer::Reshape( LOG(FATAL) << "Wrong value for cudnn_convolution_algo_seeker"; } } - - if (ok_to_release() && this->phase_ == TRAIN) { - const int dev = Caffe::current_device(); - shared_ptr& ws = GPUMemory::workspace_[dev]; - if (!ws_released_[dev] && ws_allocated_[dev] > 0UL) { - // Housekeeping: release excessive amount of device memory after FindEx calls - size_t mem_req = align_up<7>(std::max(train_mem_req_all_grps_[dev], - test_mem_req_all_grps_[dev]) + PAGE_SIZE); - if (mem_req > 0UL && ws->size() > mem_req) { - // Winner needs half less - release the rest - LOG(INFO) << this->print_current_device() - << " Layer '" << this->name() << "' reallocating workspace " - << mem_fmt(ws->size()) << " to " << mem_fmt(mem_req); - // TRAIN only - ws->release(); - ws->reserve(mem_req); - ws_released_[dev] = true; - GPUMemory::weights_workspace_[dev]->release(); - } - } - } } template @@ -848,6 +809,7 @@ void CuDNNConvolutionLayer::FindExConvAlgo( } } CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream())); + ws->release(); AllocateWorkspace(bottom.size()); // if user overrides size_t available_memory, total_memory; @@ -982,8 +944,6 @@ bool CuDNNConvolutionLayer::IsConvDescChanged( template CuDNNConvolutionLayer::~CuDNNConvolutionLayer() { - const int dev = Caffe::current_device(); - ws_released_[dev] = false; // For next unit test // Check that handles have been setup before destroying. if (!handles_setup_) { return; } diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 569fcf0058a..3da17628437 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -12,9 +12,9 @@ template void CuDNNConvolutionLayer::Forward_gpu(const vector& bottom, const vector& top) { const Ftype* weight = this->blobs_[0]->template gpu_data(); - if (fwd_count_ < 4) { - AllocateWorkspace(bottom.size()); - } +// if (fwd_count_ < 4) { +// AllocateWorkspace(bottom.size()); +// } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { for (int i = 0; i < bottom.size(); ++i) { @@ -83,9 +83,9 @@ template void CuDNNConvolutionLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { propagate_down_ = propagate_down; - if (bwd_count_ < 4) { - AllocateWorkspace(bottom.size()); - } +// if (bwd_count_ < 4) { +// AllocateWorkspace(bottom.size()); +// } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { // compute dE/dB = sum_c(dE/dy) diff --git a/src/caffe/layers/cudnn_deconv_layer.cpp b/src/caffe/layers/cudnn_deconv_layer.cpp new file mode 100644 index 00000000000..6834dfda3b6 --- /dev/null +++ b/src/caffe/layers/cudnn_deconv_layer.cpp @@ -0,0 +1,328 @@ +#ifdef USE_CUDNN +#include +#include + +#include "caffe/layers/cudnn_deconv_layer.hpp" + +namespace caffe { + +// Set to three for the benefit of the backward pass, which +// can use separate streams for calculating the gradient w.r.t. +// bias, filter weights, and bottom data for each group independently +#define CUDNN_STREAMS_PER_GROUP 3 + +/** + * TODO(dox) explain cuDNN interface + */ +template +void CuDNNDeconvolutionLayer::LayerSetUp( + const vector& bottom, const vector& top) { + DeconvolutionLayer::LayerSetUp(bottom, top); + // Initialize CUDA streams and cuDNN. + stream_ = new cudaStream_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; + handle_ = new cudnnHandle_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; + + // Initialize algorithm arrays + fwd_algo_ = new cudnnConvolutionFwdAlgo_t[bottom.size()]; + bwd_filter_algo_= new cudnnConvolutionBwdFilterAlgo_t[bottom.size()]; + bwd_data_algo_ = new cudnnConvolutionBwdDataAlgo_t[bottom.size()]; + + // initialize size arrays + workspace_fwd_sizes_ = new size_t[bottom.size()]; + workspace_bwd_filter_sizes_ = new size_t[bottom.size()]; + workspace_bwd_data_sizes_ = new size_t[bottom.size()]; + + // workspace data + workspaceSizeInBytes = 0; + workspaceData = NULL; + workspace = new void*[this->group_ * CUDNN_STREAMS_PER_GROUP]; + + for (size_t i = 0; i < bottom.size(); ++i) { + // initialize all to default algorithms + fwd_algo_[i] = (cudnnConvolutionFwdAlgo_t)0; + bwd_filter_algo_[i] = (cudnnConvolutionBwdFilterAlgo_t)0; + bwd_data_algo_[i] = (cudnnConvolutionBwdDataAlgo_t)0; + // default algorithms don't require workspace + workspace_fwd_sizes_[i] = 0; + workspace_bwd_data_sizes_[i] = 0; + workspace_bwd_filter_sizes_[i] = 0; + } + + for (int g = 0; g < this->group_ * CUDNN_STREAMS_PER_GROUP; g++) { + CUDA_CHECK(cudaStreamCreate(&stream_[g])); + CUDNN_CHECK(cudnnCreate(&handle_[g])); + CUDNN_CHECK(cudnnSetStream(handle_[g], stream_[g])); + workspace[g] = NULL; + } + + // Set the indexing parameters. + bias_offset_ = (this->num_output_ / this->group_); + + // Create filter descriptor. + const int* kernel_shape_data = this->kernel_shape_.cpu_data(); + const int kernel_h = kernel_shape_data[0]; + const int kernel_w = kernel_shape_data[1]; + cudnn::createFilterDesc(&filter_desc_, ///////// FIXME!!!!!!!!!!!!! + this->channels_ / this->group_, + this->num_output_ / this->group_, + kernel_h, + kernel_w); + + // Create tensor descriptor(s) for data and corresponding convolution(s). + for (int i = 0; i < bottom.size(); i++) { + cudnnTensorDescriptor_t bottom_desc; + cudnn::createTensor4dDesc(&bottom_desc); + bottom_descs_.push_back(bottom_desc); + cudnnTensorDescriptor_t top_desc; + cudnn::createTensor4dDesc(&top_desc); + top_descs_.push_back(top_desc); + cudnnConvolutionDescriptor_t conv_desc; + cudnnCreateConvolutionDescriptor(&conv_desc); + conv_descs_.push_back(conv_desc); + } + + // Tensor descriptor for bias. + if (this->bias_term_) { + cudnn::createTensor4dDesc(&bias_desc_); + } + + handles_setup_ = true; +} + +template +void CuDNNDeconvolutionLayer::Reshape( + const vector& bottom, const vector& top) { + DeconvolutionLayer::Reshape(bottom, top); + CHECK_EQ(2, this->num_spatial_axes_) + << "CuDNNDeconvolutionLayer input must have 2 spatial axes " + << "(e.g., height and width). " + << "Use 'engine: CAFFE' for general ND convolution."; + bottom_offset_ = this->bottom_dim_ / this->group_; + top_offset_ = this->top_dim_ / this->group_; + const int height = bottom[0]->shape(this->channel_axis_ + 1); + const int width = bottom[0]->shape(this->channel_axis_ + 2); + const int height_out = top[0]->shape(this->channel_axis_ + 1); + const int width_out = top[0]->shape(this->channel_axis_ + 2); + const int* pad_data = this->pad_.cpu_data(); + const int pad_h = pad_data[0]; + const int pad_w = pad_data[1]; + const int* stride_data = this->stride_.cpu_data(); + const int stride_h = stride_data[0]; + const int stride_w = stride_data[1]; + + // Specify workspace limit for kernels directly until we have a + // planning strategy and a rewrite of Caffe's GPU memory mangagement + size_t workspace_limit_bytes = 8*1024*1024; + + for (int i = 0; i < bottom.size(); i++) { + cudnn::setTensor4dDesc(&bottom_descs_[i], + this->num_, + this->channels_ / this->group_, + height, + width, + this->channels_ * height * width, + height * width, + width, + 1); + cudnn::setTensor4dDesc(&top_descs_[i], + this->num_, + this->num_output_ / this->group_, + height_out, + width_out, + this->num_output_ * height_out * width_out, + height_out * width_out, + width_out, + 1); + cudnn::setConvolutionDesc(forward_math_, + conv_descs_[i], +// top_descs_[i], +// filter_desc_, + pad_h, + pad_w, + stride_h, + stride_w, 1, 1); + + // choose forward and backward algorithms + workspace(s) + CUDNN_CHECK(cudnnGetConvolutionForwardAlgorithm( + handle_[0], + top_descs_[i], + filter_desc_, + conv_descs_[i], + bottom_descs_[i], + CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT, + workspace_limit_bytes, + &fwd_algo_[i])); + + // We have found that CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM is + // buggy. Thus, if this algo was chosen, choose winograd instead. If + // winograd is not supported or workspace is larger than threshold, choose + // implicit_gemm instead. +// if (fwd_algo_[i] == CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM) { +// size_t winograd_workspace_size; +// cudnnStatus_t status = cudnnGetConvolutionForwardWorkspaceSize( +// handle_[0], +// top_descs_[i], +// filter_desc_, +// conv_descs_[i], +// bottom_descs_[i], +// CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD, +// &winograd_workspace_size); +// if (status != CUDNN_STATUS_SUCCESS || +// winograd_workspace_size >= workspace_limit_bytes) { +// fwd_algo_[i] = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM; +// } else { +// fwd_algo_[i] = CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD; +// } +// } + + CUDNN_CHECK(cudnnGetConvolutionForwardWorkspaceSize( + handle_[0], + top_descs_[i], + filter_desc_, + conv_descs_[i], + bottom_descs_[i], + fwd_algo_[i], + &(workspace_fwd_sizes_[i]))); + + // choose backward algorithm for filter + CUDNN_CHECK(cudnnGetConvolutionBackwardFilterAlgorithm( + handle_[0], + top_descs_[i], + bottom_descs_[i], + conv_descs_[i], + filter_desc_, + CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT, + workspace_limit_bytes, + &bwd_filter_algo_[i])); + + // get workspace for backwards filter algorithm + CUDNN_CHECK(cudnnGetConvolutionBackwardFilterWorkspaceSize( + handle_[0], + top_descs_[i], + bottom_descs_[i], + conv_descs_[i], + filter_desc_, + bwd_filter_algo_[i], + &workspace_bwd_filter_sizes_[i])); + + // choose backward algo for data + CUDNN_CHECK(cudnnGetConvolutionBackwardDataAlgorithm( + handle_[0], + filter_desc_, + bottom_descs_[i], + conv_descs_[i], + top_descs_[i], + CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT, + workspace_limit_bytes, + &bwd_data_algo_[i])); + + // get workspace size + CUDNN_CHECK(cudnnGetConvolutionBackwardDataWorkspaceSize( + handle_[0], + filter_desc_, + bottom_descs_[i], + conv_descs_[i], + top_descs_[i], + bwd_data_algo_[i], + &workspace_bwd_data_sizes_[i])); + } + + // reduce over all workspace sizes to get a maximum to allocate / reallocate + size_t total_workspace_fwd = 0; + size_t total_workspace_bwd_data = 0; + size_t total_workspace_bwd_filter = 0; + + for (size_t i = 0; i < bottom.size(); i++) { + total_workspace_fwd = std::max(total_workspace_fwd, + workspace_fwd_sizes_[i]); + total_workspace_bwd_data = std::max(total_workspace_bwd_data, + workspace_bwd_data_sizes_[i]); + total_workspace_bwd_filter = std::max(total_workspace_bwd_filter, + workspace_bwd_filter_sizes_[i]); + } + // get max over all operations + size_t max_workspace = std::max(total_workspace_fwd, + total_workspace_bwd_data); + max_workspace = std::max(max_workspace, total_workspace_bwd_filter); + // ensure all groups have enough workspace + size_t total_max_workspace = max_workspace * + (this->group_ * CUDNN_STREAMS_PER_GROUP); + + // this is the total amount of storage needed over all groups + streams + if (total_max_workspace > workspaceSizeInBytes) { + DLOG(INFO) << "Reallocating workspace storage: " << total_max_workspace; + workspaceSizeInBytes = total_max_workspace; + + // free the existing workspace and allocate a new (larger) one + cudaFree(this->workspaceData); + + cudaError_t err = cudaMalloc(&(this->workspaceData), workspaceSizeInBytes); + if (err != cudaSuccess) { + // force zero memory path + for (int i = 0; i < bottom.size(); i++) { + workspace_fwd_sizes_[i] = 0; + workspace_bwd_filter_sizes_[i] = 0; + workspace_bwd_data_sizes_[i] = 0; + fwd_algo_[i] = CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING; + bwd_filter_algo_[i] = CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0; + bwd_data_algo_[i] = CUDNN_CONVOLUTION_BWD_DATA_ALGO_0; + } + + // NULL out all workspace pointers + for (int g = 0; g < (this->group_ * CUDNN_STREAMS_PER_GROUP); g++) { + workspace[g] = NULL; + } + // NULL out underlying data + workspaceData = NULL; + workspaceSizeInBytes = 0; + } + + // if we succeed in the allocation, set pointer aliases for workspaces + for (int g = 0; g < (this->group_ * CUDNN_STREAMS_PER_GROUP); g++) { + workspace[g] = reinterpret_cast(workspaceData) + g*max_workspace; + } + } + + // Tensor descriptor for bias. + if (this->bias_term_) { + cudnn::setTensor4dDesc( + &bias_desc_, 1, this->num_output_ / this->group_, 1, 1); + } +} + +template +CuDNNDeconvolutionLayer::~CuDNNDeconvolutionLayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + + for (int i = 0; i < bottom_descs_.size(); i++) { + cudnnDestroyTensorDescriptor(bottom_descs_[i]); + cudnnDestroyTensorDescriptor(top_descs_[i]); + cudnnDestroyConvolutionDescriptor(conv_descs_[i]); + } + if (this->bias_term_) { + cudnnDestroyTensorDescriptor(bias_desc_); + } + cudnnDestroyFilterDescriptor(filter_desc_); + + for (int g = 0; g < this->group_ * CUDNN_STREAMS_PER_GROUP; g++) { + cudaStreamDestroy(stream_[g]); + cudnnDestroy(handle_[g]); + } + + cudaFree(workspaceData); + delete [] workspace; + delete [] stream_; + delete [] handle_; + delete [] fwd_algo_; + delete [] bwd_filter_algo_; + delete [] bwd_data_algo_; + delete [] workspace_fwd_sizes_; + delete [] workspace_bwd_data_sizes_; + delete [] workspace_bwd_filter_sizes_; +} + +INSTANTIATE_CLASS_FB(CuDNNDeconvolutionLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_deconv_layer.cu b/src/caffe/layers/cudnn_deconv_layer.cu new file mode 100644 index 00000000000..377a23e0303 --- /dev/null +++ b/src/caffe/layers/cudnn_deconv_layer.cu @@ -0,0 +1,138 @@ +#ifdef USE_CUDNN +#include + +#include "caffe/layers/cudnn_deconv_layer.hpp" + +namespace caffe { + +__global__ void sync_deconv_groups() {} + +template +void CuDNNDeconvolutionLayer::Forward_gpu( + const vector& bottom, const vector& top) { + const Ftype* weight = this->blobs_[0]->template gpu_data(); + for (int i = 0; i < bottom.size(); ++i) { + const Ftype* bottom_data = bottom[i]->gpu_data(); + Ftype* top_data = top[i]->mutable_gpu_data(); + + // Forward through cuDNN in parallel over groups. + for (int g = 0; g < this->group_; g++) { + // Filters. + CUDNN_CHECK(cudnnConvolutionBackwardData( + handle_[g], + cudnn::dataType::one, + filter_desc_, + weight + this->weight_offset_ * g, + bottom_descs_[i], + bottom_data + bottom_offset_ * g, + conv_descs_[i], + bwd_data_algo_[i], + workspace[g], + workspace_bwd_data_sizes_[i], + cudnn::dataType::zero, + top_descs_[i], + top_data + top_offset_ * g)); + + // Bias. + if (this->bias_term_) { + const Ftype* bias_data = this->blobs_[1]->template gpu_data(); + CUDNN_CHECK(cudnnAddTensor(handle_[g], + cudnn::dataType::one, + bias_desc_, + bias_data + bias_offset_ * g, + cudnn::dataType::one, + top_descs_[i], + top_data + top_offset_ * g)); + } + } + + // Synchronize the work across groups, each of which went into its own + // stream, by launching an empty kernel into the default (null) stream. + // NOLINT_NEXT_LINE(whitespace/operators) + sync_deconv_groups<<<1, 1>>>(); // FIXME + } +} + +template +void CuDNNDeconvolutionLayer::Backward_gpu( + const vector& top, + const vector& propagate_down, + const vector& bottom) { + const Btype* weight = NULL; + Btype* weight_diff = NULL; + if (this->param_propagate_down_[0]) { + weight = this->blobs_[0]->template gpu_data(); + weight_diff = this->blobs_[0]->template mutable_gpu_diff(); + } + Btype* bias_diff = NULL; + if (this->bias_term_ && this->param_propagate_down_[1]) { + bias_diff = this->blobs_[1]->template mutable_gpu_diff(); + } + for (int i = 0; i < top.size(); ++i) { + const Btype* top_diff = top[i]->gpu_diff(); + // Backward through cuDNN in parallel over groups and gradients. + for (int g = 0; g < this->group_; g++) { + // Gradient w.r.t. bias. + if (this->bias_term_ && this->param_propagate_down_[1]) { + CUDNN_CHECK(cudnnConvolutionBackwardBias(handle_[0 * this->group_ + g], + cudnn::dataType::one, + top_descs_[i], + top_diff + top_offset_ * g, + cudnn::dataType::one, + bias_desc_, + bias_diff + bias_offset_ * g)); + } + + // Gradient w.r.t. weights. + if (this->param_propagate_down_[0]) { + const Btype* bottom_data = bottom[i]->gpu_data(); + CUDNN_CHECK(cudnnConvolutionBackwardFilter( + handle_[1 * this->group_ + g], + cudnn::dataType::one, + top_descs_[i], + top_diff + top_offset_ * g, + bottom_descs_[i], + bottom_data + bottom_offset_ * g, + conv_descs_[i], + bwd_filter_algo_[i], + workspace[1 * this->group_ + g], + workspace_bwd_filter_sizes_[i], + cudnn::dataType::one, + filter_desc_, + weight_diff + this->weight_offset_ * g)); + } + + // Gradient w.r.t. bottom data. + if (propagate_down[i]) { + if (weight == NULL) { + weight = this->blobs_[0]->template gpu_data(); + } + Btype* bottom_diff = bottom[i]->mutable_gpu_diff(); + CUDNN_CHECK( + cudnnConvolutionForward(handle_[2 * this->group_ + g], + cudnn::dataType::one, + top_descs_[i], + top_diff + top_offset_ * g, + filter_desc_, + weight + this->weight_offset_ * g, + conv_descs_[i], + fwd_algo_[i], + workspace[2 * this->group_ + g], + workspace_fwd_sizes_[i], + cudnn::dataType::zero, + bottom_descs_[i], + bottom_diff + bottom_offset_ * g)); + } + } + + // Synchronize the work across groups, each of which went into its own + // stream, by launching an empty kernel into the default (null) stream. + // NOLINT_NEXT_LINE(whitespace/operators) + sync_deconv_groups<<<1, 1>>>(); + } +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(CuDNNDeconvolutionLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 2a18ee483c8..53a8005b922 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -10,7 +10,7 @@ DataLayer::DataLayer(const LayerParameter& param, size_t solver_ra : BasePrefetchingDataLayer(param, solver_rank), cache_(param.data_param().cache()), shuffle_(param.data_param().shuffle()) { - sample_only_.store(this->auto_mode_ && this->phase_ == TRAIN); + sample_only_.store(this->auto_mode_); init_offsets(); datum_encoded_ = false; } @@ -44,7 +44,8 @@ DataLayer::InitializePrefetch() { if (layer_inititialized_flag_.is_set()) { return; } - if (this->auto_mode()) { + const bool auto_mode = this->auto_mode_; + if (auto_mode) { // Here we try to optimize memory split between prefetching and convolution. // All data and parameter blobs are allocated at this moment. // Now let's find out what's left... @@ -95,14 +96,16 @@ DataLayer::InitializePrefetch() { if (this->parsers_num_ > 1) { parser_offsets_[0]++; // 0th already processed } + this->auto_mode_ = false; + layer_inititialized_flag_.set(); this->go(); // kick off new threads if any } CHECK_EQ(this->threads_num(), this->transf_num_); LOG(INFO) << this->print_current_device() << " Parser threads: " - << this->parsers_num_ << (this->auto_mode_ ? " (auto)" : ""); + << this->parsers_num_ << (auto_mode ? " (auto)" : ""); LOG(INFO) << this->print_current_device() << " Transformer threads: " - << this->transf_num_ << (this->auto_mode_ ? " (auto)" : ""); + << this->transf_num_ << (auto_mode ? " (auto)" : ""); layer_inititialized_flag_.set(); } @@ -127,7 +130,7 @@ DataLayer::DataLayerSetUp(const vector& bottom, const vecto if (this->auto_mode_) { if (!sample_reader_) { - sample_reader_ = std::make_shared(param, Caffe::solver_count(), + sample_reader_ = std::make_shared>(param, Caffe::solver_count(), this->rank_, this->parsers_num_, this->threads_num(), @@ -138,7 +141,7 @@ DataLayer::DataLayerSetUp(const vector& bottom, const vecto shuffle, false); } else if (!reader_) { - reader_ = std::make_shared(param, + reader_ = std::make_shared>(param, Caffe::solver_count(), this->rank_, this->parsers_num_, @@ -151,7 +154,7 @@ DataLayer::DataLayerSetUp(const vector& bottom, const vecto this->phase_ == TRAIN); } } else if (!reader_) { - reader_ = std::make_shared(param, + reader_ = std::make_shared>(param, Caffe::solver_count(), this->rank_, this->parsers_num_, @@ -174,8 +177,7 @@ DataLayer::DataLayerSetUp(const vector& bottom, const vecto // Note: all these reshapings here in load_batch are needed only in case of // different datum shapes coming from database. Packing packing = NHWC; // OpenCV - vector top_shape = this->dt(0)->template Transform(sample_datum.get(), - nullptr, 0, packing); + vector top_shape = this->bdt(0)->Transform(sample_datum.get(), nullptr, 0, packing); top_shape[0] = batch_size; top[0]->Reshape(top_shape); @@ -209,14 +211,14 @@ void DataLayer::load_batch(Batch* batch, int thread_id, size_t que const int batch_size = this->layer_param_.data_param().batch_size(); const size_t qid = sample_only ? 0UL : queue_id; - DataReader* reader = sample_only ? sample_reader_.get() : reader_.get(); + DataReader* reader = sample_only ? sample_reader_.get() : reader_.get(); shared_ptr init_datum = reader->full_peek(qid); CHECK(init_datum); const bool use_gpu_transform = this->is_gpu_transform(); Packing packing = NHWC; // OpenCV // Use data_transformer to infer the expected blob shape from datum. vector top_shape = - this->dt(thread_id)->template Transform(init_datum.get(), nullptr, 0, packing); + this->bdt(thread_id)->Transform(init_datum.get(), nullptr, 0, packing); // Reshape batch according to the batch_size. top_shape[0] = batch_size; if (top_shape != batch->data_->shape()) { @@ -303,14 +305,14 @@ void DataLayer::load_batch(Batch* batch, int thread_id, size_t que CUDA_CHECK(cudaMemcpyAsync(static_cast(dst_gptr) + item_id * datum_size, src_buf.data(), datum_size, cudaMemcpyHostToDevice, stream)); CUDA_CHECK(cudaStreamSynchronize(stream)); - this->dt(thread_id)->Fill3Randoms(&random_vectors_[thread_id]-> + this->bdt(thread_id)->Fill3Randoms(&random_vectors_[thread_id]-> mutable_cpu_data()[item_id * 3]); } else { // Get data offset for this datum to hand off to transform thread const size_t offset = batch->data_->offset(item_id); CHECK_EQ(0, offset % buf_len); #if defined(USE_CUDNN) - vector shape = this->dt(thread_id)->Transform(datum.get(), dst_cptr + offset, + vector shape = this->bdt(thread_id)->Transform(datum.get(), dst_cptr + offset, buf_len, packing, false); #else vector tmp(top_shape[1] * top_shape[2] * top_shape[3]); @@ -333,7 +335,7 @@ void DataLayer::load_batch(Batch* batch, int thread_id, size_t que } if (use_gpu_transform) { - this->dt(thread_id)->TransformGPU(top_shape[0], top_shape[1], + this->fdt(thread_id)->TransformGPU(top_shape[0], top_shape[1], init_datum_height, // non-crop init_datum_width, // non-crop datum_sizeof_element, diff --git a/src/caffe/layers/detection_evaluate_layer.cpp b/src/caffe/layers/detection_evaluate_layer.cpp new file mode 100644 index 00000000000..6b53f04342f --- /dev/null +++ b/src/caffe/layers/detection_evaluate_layer.cpp @@ -0,0 +1,250 @@ +#include +#include +#include +#include + +#include "caffe/layers/detection_evaluate_layer.hpp" +#include "caffe/util/bbox_util.hpp" + +namespace caffe { + +template +void DetectionEvaluateLayer::LayerSetUp( + const vector& bottom, const vector& top) { + const DetectionEvaluateParameter& detection_evaluate_param = + this->layer_param_.detection_evaluate_param(); + CHECK(detection_evaluate_param.has_num_classes()) + << "Must provide num_classes."; + num_classes_ = detection_evaluate_param.num_classes(); + background_label_id_ = detection_evaluate_param.background_label_id(); + overlap_threshold_ = detection_evaluate_param.overlap_threshold(); + CHECK_GT(overlap_threshold_, 0.) << "overlap_threshold must be non negative."; + evaluate_difficult_gt_ = detection_evaluate_param.evaluate_difficult_gt(); + if (detection_evaluate_param.has_name_size_file()) { + string name_size_file = detection_evaluate_param.name_size_file(); + std::ifstream infile(name_size_file.c_str()); + CHECK(infile.good()) + << "Failed to open name size file: " << name_size_file; + // The file is in the following format: + // name height width + // ... + string name; + int height, width; + while (infile >> name >> height >> width) { + sizes_.push_back(std::make_pair(height, width)); + } + infile.close(); + } + count_ = 0; + // If there is no name_size_file provided, use normalized bbox to evaluate. + use_normalized_bbox_ = sizes_.size() == 0; + + // Retrieve resize parameter if there is any provided. + has_resize_ = detection_evaluate_param.has_resize_param(); + if (has_resize_) { + resize_param_ = detection_evaluate_param.resize_param(); + } +} + +template +void DetectionEvaluateLayer::Reshape(const vector& bottom, + const vector& top) { + CHECK_LE(count_, sizes_.size()); + CHECK_EQ(bottom[0]->num(), 1); + CHECK_EQ(bottom[0]->channels(), 1); + CHECK_EQ(bottom[0]->width(), 7); + CHECK_EQ(bottom[1]->num(), 1); + CHECK_EQ(bottom[1]->channels(), 1); + CHECK_EQ(bottom[1]->width(), 8); + + // num() and channels() are 1. + vector top_shape(2, 1); + int num_pos_classes = background_label_id_ == -1 ? + num_classes_ : num_classes_ - 1; + int num_valid_det = 0; + const Dtype* det_data = bottom[0]->cpu_data(); + for (int i = 0; i < bottom[0]->height(); ++i) { + if (det_data[1] != -1) { + ++num_valid_det; + } + det_data += 7; + } + top_shape.push_back(num_pos_classes + num_valid_det); + // Each row is a 5 dimension vector, which stores + // [image_id, label, confidence, true_pos, false_pos] + top_shape.push_back(5); + top[0]->Reshape(top_shape); +} + +template +void DetectionEvaluateLayer::Forward_cpu( + const vector& bottom, const vector& top) { + const Dtype* det_data = bottom[0]->cpu_data(); + const Dtype* gt_data = bottom[1]->cpu_data(); + + // Retrieve all detection results. + map all_detections; + GetDetectionResults(det_data, bottom[0]->height(), background_label_id_, + &all_detections); + + // Retrieve all ground truth (including difficult ones). + map all_gt_bboxes; + GetGroundTruth(gt_data, bottom[1]->height(), background_label_id_, + true, &all_gt_bboxes); + + Dtype* top_data = top[0]->mutable_cpu_data(); + caffe_set(top[0]->count(), Dtype(0.), top_data); + int num_det = 0; + + // Insert number of ground truth for each label. + map num_pos; + for (map::iterator it = all_gt_bboxes.begin(); + it != all_gt_bboxes.end(); ++it) { + for (LabelBBox::iterator iit = it->second.begin(); iit != it->second.end(); + ++iit) { + int count = 0; + if (evaluate_difficult_gt_) { + count = iit->second.size(); + } else { + // Get number of non difficult ground truth. + for (int i = 0; i < iit->second.size(); ++i) { + if (!iit->second[i].difficult()) { + ++count; + } + } + } + if (num_pos.find(iit->first) == num_pos.end()) { + num_pos[iit->first] = count; + } else { + num_pos[iit->first] += count; + } + } + } + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + continue; + } + top_data[num_det * 5] = -1; + top_data[num_det * 5 + 1] = c; + if (num_pos.find(c) == num_pos.end()) { + top_data[num_det * 5 + 2] = 0; + } else { + top_data[num_det * 5 + 2] = num_pos.find(c)->second; + } + top_data[num_det * 5 + 3] = -1; + top_data[num_det * 5 + 4] = -1; + ++num_det; + } + + // Insert detection evaluate status. + for (map::iterator it = all_detections.begin(); + it != all_detections.end(); ++it) { + int image_id = it->first; + LabelBBox& detections = it->second; + if (all_gt_bboxes.find(image_id) == all_gt_bboxes.end()) { + // No ground truth for current image. All detections become false_pos. + for (LabelBBox::iterator iit = detections.begin(); + iit != detections.end(); ++iit) { + int label = iit->first; + if (label == -1) { + continue; + } + const vector& bboxes = iit->second; + for (int i = 0; i < bboxes.size(); ++i) { + top_data[num_det * 5] = image_id; + top_data[num_det * 5 + 1] = label; + top_data[num_det * 5 + 2] = bboxes[i].score(); + top_data[num_det * 5 + 3] = 0; + top_data[num_det * 5 + 4] = 1; + ++num_det; + } + } + } else { + LabelBBox& label_bboxes = all_gt_bboxes.find(image_id)->second; + for (LabelBBox::iterator iit = detections.begin(); + iit != detections.end(); ++iit) { + int label = iit->first; + if (label == -1) { + continue; + } + vector& bboxes = iit->second; + if (label_bboxes.find(label) == label_bboxes.end()) { + // No ground truth for current label. All detections become false_pos. + for (int i = 0; i < bboxes.size(); ++i) { + top_data[num_det * 5] = image_id; + top_data[num_det * 5 + 1] = label; + top_data[num_det * 5 + 2] = bboxes[i].score(); + top_data[num_det * 5 + 3] = 0; + top_data[num_det * 5 + 4] = 1; + ++num_det; + } + } else { + vector& gt_bboxes = label_bboxes.find(label)->second; + // Scale ground truth if needed. + if (!use_normalized_bbox_) { + CHECK_LT(count_, sizes_.size()); + for (int i = 0; i < gt_bboxes.size(); ++i) { + OutputBBox(gt_bboxes[i], sizes_[count_], has_resize_, + resize_param_, &(gt_bboxes[i])); + } + } + vector visited(gt_bboxes.size(), false); + // Sort detections in descend order based on scores. + std::sort(bboxes.begin(), bboxes.end(), SortBBoxDescend); + for (int i = 0; i < bboxes.size(); ++i) { + top_data[num_det * 5] = image_id; + top_data[num_det * 5 + 1] = label; + top_data[num_det * 5 + 2] = bboxes[i].score(); + if (!use_normalized_bbox_) { + OutputBBox(bboxes[i], sizes_[count_], has_resize_, + resize_param_, &(bboxes[i])); + } + // Compare with each ground truth bbox. + float overlap_max = -1; + int jmax = -1; + for (int j = 0; j < gt_bboxes.size(); ++j) { + float overlap = JaccardOverlap(bboxes[i], gt_bboxes[j], + use_normalized_bbox_); + if (overlap > overlap_max) { + overlap_max = overlap; + jmax = j; + } + } + if (overlap_max >= overlap_threshold_) { + if (evaluate_difficult_gt_ || + (!evaluate_difficult_gt_ && !gt_bboxes[jmax].difficult())) { + if (!visited[jmax]) { + // true positive. + top_data[num_det * 5 + 3] = 1; + top_data[num_det * 5 + 4] = 0; + visited[jmax] = true; + } else { + // false positive (multiple detection). + top_data[num_det * 5 + 3] = 0; + top_data[num_det * 5 + 4] = 1; + } + } + } else { + // false positive. + top_data[num_det * 5 + 3] = 0; + top_data[num_det * 5 + 4] = 1; + } + ++num_det; + } + } + } + } + if (sizes_.size() > 0) { + ++count_; + if (count_ == sizes_.size()) { + // reset count after a full iterations through the DB. + count_ = 0; + } + } + } +} + +INSTANTIATE_CLASS_FB(DetectionEvaluateLayer); +REGISTER_LAYER_CLASS(DetectionEvaluate); + +} // namespace caffe diff --git a/src/caffe/layers/detection_output_layer.cpp b/src/caffe/layers/detection_output_layer.cpp new file mode 100644 index 00000000000..ebdb235bf3a --- /dev/null +++ b/src/caffe/layers/detection_output_layer.cpp @@ -0,0 +1,470 @@ +#include +#include // NOLINT(readability/streams) +#include +#include +#include +#include + +#include "boost/filesystem.hpp" +#include "boost/foreach.hpp" + +#include "caffe/layers/detection_output_layer.hpp" + +namespace caffe { + +template +void DetectionOutputLayer::LayerSetUp(const vector& bottom, + const vector& top) { + const DetectionOutputParameter& detection_output_param = + this->layer_param_.detection_output_param(); + CHECK(detection_output_param.has_num_classes()) << "Must specify num_classes"; + num_classes_ = detection_output_param.num_classes(); + share_location_ = detection_output_param.share_location(); + num_loc_classes_ = share_location_ ? 1 : num_classes_; + background_label_id_ = detection_output_param.background_label_id(); + code_type_ = detection_output_param.code_type(); + variance_encoded_in_target_ = + detection_output_param.variance_encoded_in_target(); + keep_top_k_ = detection_output_param.keep_top_k(); + confidence_threshold_ = detection_output_param.has_confidence_threshold() ? + detection_output_param.confidence_threshold() : -FLT_MAX; + // Parameters used in nms. + nms_threshold_ = detection_output_param.nms_param().nms_threshold(); + CHECK_GE(nms_threshold_, 0.) << "nms_threshold must be non negative."; + eta_ = detection_output_param.nms_param().eta(); + CHECK_GT(eta_, 0.); + CHECK_LE(eta_, 1.); + top_k_ = -1; + if (detection_output_param.nms_param().has_top_k()) { + top_k_ = detection_output_param.nms_param().top_k(); + } + const SaveOutputParameter& save_output_param = + detection_output_param.save_output_param(); + output_directory_ = save_output_param.output_directory(); + if (!output_directory_.empty()) { + if (boost::filesystem::is_directory(output_directory_)) { + boost::filesystem::remove_all(output_directory_); + } + if (!boost::filesystem::create_directories(output_directory_)) { + LOG(WARNING) << "Failed to create directory: " << output_directory_; + } + } + output_name_prefix_ = save_output_param.output_name_prefix(); + need_save_ = output_directory_ == "" ? false : true; + output_format_ = save_output_param.output_format(); + if (save_output_param.has_label_map_file()) { + string label_map_file = save_output_param.label_map_file(); + if (label_map_file.empty()) { + // Ignore saving if there is no label_map_file provided. + LOG(WARNING) << "Provide label_map_file if output results to files."; + need_save_ = false; + } else { + LabelMap label_map; + CHECK(ReadProtoFromTextFile(label_map_file, &label_map)) + << "Failed to read label map file: " << label_map_file; + CHECK(MapLabelToName(label_map, true, &label_to_name_)) + << "Failed to convert label to name."; + CHECK(MapLabelToDisplayName(label_map, true, &label_to_display_name_)) + << "Failed to convert label to display name."; + } + } else { + need_save_ = false; + } + if (save_output_param.has_name_size_file()) { + string name_size_file = save_output_param.name_size_file(); + if (name_size_file.empty()) { + // Ignore saving if there is no name_size_file provided. + LOG(WARNING) << "Provide name_size_file if output results to files."; + need_save_ = false; + } else { + std::ifstream infile(name_size_file.c_str()); + CHECK(infile.good()) + << "Failed to open name size file: " << name_size_file; + // The file is in the following format: + // name height width + // ... + string name; + int height, width; + while (infile >> name >> height >> width) { + names_.push_back(name); + sizes_.push_back(std::make_pair(height, width)); + } + infile.close(); + if (save_output_param.has_num_test_image()) { + num_test_image_ = save_output_param.num_test_image(); + } else { + num_test_image_ = names_.size(); + } + CHECK_LE(num_test_image_, names_.size()); + } + } else { + need_save_ = false; + } + has_resize_ = save_output_param.has_resize_param(); + if (has_resize_) { + resize_param_ = save_output_param.resize_param(); + } + name_count_ = 0; + visualize_ = detection_output_param.visualize(); + if (visualize_) { + visualize_threshold_ = 0.6; + if (detection_output_param.has_visualize_threshold()) { + visualize_threshold_ = detection_output_param.visualize_threshold(); + } + data_transformer_.reset(new DataTransformer(this->layer_param_.transform_param(), + this->phase_)); + data_transformer_->InitRand(); + save_file_ = detection_output_param.save_file(); + } + bbox_preds_.ReshapeLike(*(bottom[0])); + if (!share_location_) { + bbox_permute_.ReshapeLike(*(bottom[0])); + } + conf_permute_.ReshapeLike(*(bottom[1])); +} + +template +void DetectionOutputLayer::Reshape(const vector& bottom, + const vector& top) { + if (need_save_) { + CHECK_LE(name_count_, names_.size()); + if (name_count_ % num_test_image_ == 0) { + // Clean all outputs. + if (output_format_ == "VOC") { + boost::filesystem::path output_directory(output_directory_); + for (map::iterator it = label_to_name_.begin(); + it != label_to_name_.end(); ++it) { + if (it->first == background_label_id_) { + continue; + } + std::ofstream outfile; + boost::filesystem::path file( + output_name_prefix_ + it->second + ".txt"); + boost::filesystem::path out_file = output_directory / file; + outfile.open(out_file.string().c_str(), std::ofstream::out); + } + } + } + } + CHECK_EQ(bottom[0]->num(), bottom[1]->num()); + if (bbox_preds_.num() != bottom[0]->num() || + bbox_preds_.count(1) != bottom[0]->count(1)) { + bbox_preds_.ReshapeLike(*(bottom[0])); + } + if (!share_location_ && (bbox_permute_.num() != bottom[0]->num() || + bbox_permute_.count(1) != bottom[0]->count(1))) { + bbox_permute_.ReshapeLike(*(bottom[0])); + } + if (conf_permute_.num() != bottom[1]->num() || + conf_permute_.count(1) != bottom[1]->count(1)) { + conf_permute_.ReshapeLike(*(bottom[1])); + } + num_priors_ = bottom[2]->height() / 4; + CHECK_EQ(num_priors_ * num_loc_classes_ * 4, bottom[0]->channels()) + << "Number of priors must match number of location predictions."; + CHECK_EQ(num_priors_ * num_classes_, bottom[1]->channels()) + << "Number of priors must match number of confidence predictions."; + // num() and channels() are 1. + vector top_shape(2, 1); + // Since the number of bboxes to be kept is unknown before nms, we manually + // set it to (fake) 1. + top_shape.push_back(1); + // Each row is a 7 dimension vector, which stores + // [image_id, label, confidence, xmin, ymin, xmax, ymax] + top_shape.push_back(7); + top[0]->Reshape(top_shape); +} + +template +void DetectionOutputLayer::Forward_cpu( + const vector& bottom, const vector& top) { + const Ftype* loc_data = bottom[0]->cpu_data(); + const Ftype* conf_data = bottom[1]->cpu_data(); + const Ftype* prior_data = bottom[2]->cpu_data(); + const int num = bottom[0]->num(); + + // Retrieve all location predictions. + vector all_loc_preds; + GetLocPredictions(loc_data, num, num_priors_, num_loc_classes_, + share_location_, &all_loc_preds); + + // Retrieve all confidences. + vector > > all_conf_scores; + GetConfidenceScores(conf_data, num, num_priors_, num_classes_, + &all_conf_scores); + + // Retrieve all prior bboxes. It is same within a batch since we assume all + // images in a batch are of same dimension. + vector prior_bboxes; + vector > prior_variances; + GetPriorBBoxes(prior_data, num_priors_, &prior_bboxes, &prior_variances); + + // Decode all loc predictions to bboxes. + vector all_decode_bboxes; + const bool clip_bbox = false; + DecodeBBoxesAll(all_loc_preds, prior_bboxes, prior_variances, num, + share_location_, num_loc_classes_, background_label_id_, + code_type_, variance_encoded_in_target_, clip_bbox, + &all_decode_bboxes); + + int num_kept = 0; + vector > > all_indices; + for (int i = 0; i < num; ++i) { + const LabelBBox& decode_bboxes = all_decode_bboxes[i]; + const map >& conf_scores = all_conf_scores[i]; + map > indices; + int num_det = 0; + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + // Ignore background class. + continue; + } + if (conf_scores.find(c) == conf_scores.end()) { + // Something bad happened if there are no predictions for current label. + LOG(FATAL) << "Could not find confidence predictions for label " << c; + } + const vector& scores = conf_scores.find(c)->second; + int label = share_location_ ? -1 : c; + if (decode_bboxes.find(label) == decode_bboxes.end()) { + // Something bad happened if there are no predictions for current label. + LOG(FATAL) << "Could not find location predictions for label " << label; + continue; + } + const vector& bboxes = decode_bboxes.find(label)->second; + ApplyNMSFast(bboxes, scores, confidence_threshold_, nms_threshold_, eta_, + top_k_, &(indices[c])); + num_det += indices[c].size(); + } + if (keep_top_k_ > -1 && num_det > keep_top_k_) { + vector > > score_index_pairs; + for (map >::iterator it = indices.begin(); + it != indices.end(); ++it) { + int label = it->first; + const vector& label_indices = it->second; + if (conf_scores.find(label) == conf_scores.end()) { + // Something bad happened for current label. + LOG(FATAL) << "Could not find location predictions for " << label; + continue; + } + const vector& scores = conf_scores.find(label)->second; + for (int j = 0; j < label_indices.size(); ++j) { + int idx = label_indices[j]; + CHECK_LT(idx, scores.size()); + score_index_pairs.push_back(std::make_pair( + scores[idx], std::make_pair(label, idx))); + } + } + // Keep top k results per image. + std::sort(score_index_pairs.begin(), score_index_pairs.end(), + SortScorePairDescend >); + score_index_pairs.resize(keep_top_k_); + // Store the new indices. + map > new_indices; + for (int j = 0; j < score_index_pairs.size(); ++j) { + int label = score_index_pairs[j].second.first; + int idx = score_index_pairs[j].second.second; + new_indices[label].push_back(idx); + } + all_indices.push_back(new_indices); + num_kept += keep_top_k_; + } else { + all_indices.push_back(indices); + num_kept += num_det; + } + } + + vector top_shape(2, 1); + top_shape.push_back(num_kept); + top_shape.push_back(7); + Ftype* top_data; + if (num_kept == 0) { + LOG(INFO) << "Couldn't find any detections"; + top_shape[2] = num; + top[0]->Reshape(top_shape); + top_data = top[0]->mutable_cpu_data(); + caffe_set(top[0]->count(), static_cast(-1), top_data); + // Generate fake results per image. + for (int i = 0; i < num; ++i) { + top_data[0] = i; + top_data += 7; + } + } else { + top[0]->Reshape(top_shape); + top_data = top[0]->mutable_cpu_data(); + } + + int count = 0; + boost::filesystem::path output_directory(output_directory_); + for (int i = 0; i < num; ++i) { + const map >& conf_scores = all_conf_scores[i]; + const LabelBBox& decode_bboxes = all_decode_bboxes[i]; + for (map >::iterator it = all_indices[i].begin(); + it != all_indices[i].end(); ++it) { + int label = it->first; + if (conf_scores.find(label) == conf_scores.end()) { + // Something bad happened if there are no predictions for current label. + LOG(FATAL) << "Could not find confidence predictions for " << label; + continue; + } + const vector& scores = conf_scores.find(label)->second; + int loc_label = share_location_ ? -1 : label; + if (decode_bboxes.find(loc_label) == decode_bboxes.end()) { + // Something bad happened if there are no predictions for current label. + LOG(FATAL) << "Could not find location predictions for " << loc_label; + continue; + } + const vector& bboxes = + decode_bboxes.find(loc_label)->second; + vector& indices = it->second; + if (need_save_) { + CHECK(label_to_name_.find(label) != label_to_name_.end()) + << "Cannot find label: " << label << " in the label map."; + CHECK_LT(name_count_, names_.size()); + } + for (int j = 0; j < indices.size(); ++j) { + int idx = indices[j]; + top_data[count * 7] = i; + top_data[count * 7 + 1] = label; + top_data[count * 7 + 2] = scores[idx]; + const NormalizedBBox& bbox = bboxes[idx]; + top_data[count * 7 + 3] = bbox.xmin(); + top_data[count * 7 + 4] = bbox.ymin(); + top_data[count * 7 + 5] = bbox.xmax(); + top_data[count * 7 + 6] = bbox.ymax(); + if (need_save_) { + NormalizedBBox out_bbox; + OutputBBox(bbox, sizes_[name_count_], has_resize_, resize_param_, + &out_bbox); + float score = top_data[count * 7 + 2]; + float xmin = out_bbox.xmin(); + float ymin = out_bbox.ymin(); + float xmax = out_bbox.xmax(); + float ymax = out_bbox.ymax(); + ptree pt_xmin, pt_ymin, pt_width, pt_height; + pt_xmin.put("", round(xmin * 100) / 100.); + pt_ymin.put("", round(ymin * 100) / 100.); + pt_width.put("", round((xmax - xmin) * 100) / 100.); + pt_height.put("", round((ymax - ymin) * 100) / 100.); + + ptree cur_bbox; + cur_bbox.push_back(std::make_pair("", pt_xmin)); + cur_bbox.push_back(std::make_pair("", pt_ymin)); + cur_bbox.push_back(std::make_pair("", pt_width)); + cur_bbox.push_back(std::make_pair("", pt_height)); + + ptree cur_det; + cur_det.put("image_id", names_[name_count_]); + if (output_format_ == "ILSVRC") { + cur_det.put("category_id", label); + } else { + cur_det.put("category_id", label_to_name_[label].c_str()); + } + cur_det.add_child("bbox", cur_bbox); + cur_det.put("score", score); + + detections_.push_back(std::make_pair("", cur_det)); + } + ++count; + } + } + if (need_save_) { + ++name_count_; + if (name_count_ % num_test_image_ == 0) { + if (output_format_ == "VOC") { + map outfiles; + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + continue; + } + string label_name = label_to_name_[c]; + boost::filesystem::path file( + output_name_prefix_ + label_name + ".txt"); + boost::filesystem::path out_file = output_directory / file; + outfiles[label_name] = new std::ofstream(out_file.string().c_str(), + std::ofstream::out); + } + BOOST_FOREACH(ptree::value_type &det, detections_.get_child("")) { + ptree pt = det.second; + string label_name = pt.get("category_id"); + if (outfiles.find(label_name) == outfiles.end()) { + std::cout << "Cannot find " << label_name << std::endl; + continue; + } + string image_name = pt.get("image_id"); + float score = pt.get("score"); + vector bbox; + BOOST_FOREACH(ptree::value_type &elem, pt.get_child("bbox")) { + bbox.push_back(static_cast(elem.second.get_value())); + } + *(outfiles[label_name]) << image_name; + *(outfiles[label_name]) << " " << score; + *(outfiles[label_name]) << " " << bbox[0] << " " << bbox[1]; + *(outfiles[label_name]) << " " << bbox[0] + bbox[2]; + *(outfiles[label_name]) << " " << bbox[1] + bbox[3]; + *(outfiles[label_name]) << std::endl; + } + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + continue; + } + string label_name = label_to_name_[c]; + outfiles[label_name]->flush(); + outfiles[label_name]->close(); + delete outfiles[label_name]; + } + } else if (output_format_ == "COCO") { + boost::filesystem::path output_directory(output_directory_); + boost::filesystem::path file(output_name_prefix_ + ".json"); + boost::filesystem::path out_file = output_directory / file; + std::ofstream outfile; + outfile.open(out_file.string().c_str(), std::ofstream::out); + + boost::regex exp("\"(null|true|false|-?[0-9]+(\\.[0-9]+)?)\""); + ptree output; + output.add_child("detections", detections_); + std::stringstream ss; + write_json(ss, output); + std::string rv = boost::regex_replace(ss.str(), exp, "$1"); + outfile << rv.substr(rv.find("["), rv.rfind("]") - rv.find("[")) + << std::endl << "]" << std::endl; + } else if (output_format_ == "ILSVRC") { + boost::filesystem::path output_directory(output_directory_); + boost::filesystem::path file(output_name_prefix_ + ".txt"); + boost::filesystem::path out_file = output_directory / file; + std::ofstream outfile; + outfile.open(out_file.string().c_str(), std::ofstream::out); + + BOOST_FOREACH(ptree::value_type &det, detections_.get_child("")) { + ptree pt = det.second; + int label = pt.get("category_id"); + string image_name = pt.get("image_id"); + float score = pt.get("score"); + vector bbox; + BOOST_FOREACH(ptree::value_type &elem, pt.get_child("bbox")) { + bbox.push_back(static_cast(elem.second.get_value())); + } + outfile << image_name << " " << label << " " << score; + outfile << " " << bbox[0] << " " << bbox[1]; + outfile << " " << bbox[0] + bbox[2]; + outfile << " " << bbox[1] + bbox[3]; + outfile << std::endl; + } + } + name_count_ = 0; + detections_.clear(); + } + } + } + if (visualize_) { + vector cv_imgs; + this->data_transformer_->TransformInv(bottom[3], &cv_imgs); + vector colors = GetColors(label_to_display_name_.size()); + VisualizeBBox(cv_imgs, top[0], visualize_threshold_, colors, + label_to_display_name_, save_file_); + } +} + +INSTANTIATE_CLASS_FB(DetectionOutputLayer); +REGISTER_LAYER_CLASS(DetectionOutput); + +} // namespace caffe diff --git a/src/caffe/layers/detection_output_layer.cu b/src/caffe/layers/detection_output_layer.cu new file mode 100644 index 00000000000..4f5024b111b --- /dev/null +++ b/src/caffe/layers/detection_output_layer.cu @@ -0,0 +1,303 @@ +#include +#include +#include +#include // NOLINT(readability/streams) +#include +#include +#include +#include + +#include "caffe/layers/detection_output_layer.hpp" + +#include +#include + +namespace caffe { + +template +void DetectionOutputLayer::Forward_gpu( + const vector& bottom, const vector& top) { + const Ftype* loc_data = bottom[0]->gpu_data(); + const Ftype* prior_data = bottom[2]->gpu_data(); + const int num = bottom[0]->num(); + + // Decode predictions. + Ftype* bbox_data = bbox_preds_.mutable_gpu_data(); + const int loc_count = bbox_preds_.count(); + const bool clip_bbox = false; + DecodeBBoxesGPU(loc_count, loc_data, prior_data, code_type_, + variance_encoded_in_target_, num_priors_, share_location_, + num_loc_classes_, background_label_id_, clip_bbox, bbox_data); + // Retrieve all decoded location predictions. + const Ftype* bbox_cpu_data; + if (!share_location_) { + Ftype* bbox_permute_data = bbox_permute_.mutable_gpu_data(); + PermuteDataGPU(loc_count, bbox_data, num_loc_classes_, num_priors_, + 4, bbox_permute_data); + bbox_cpu_data = bbox_permute_.cpu_data(); + } else { + bbox_cpu_data = bbox_preds_.cpu_data(); + } + + // Retrieve all confidences. + Ftype* conf_permute_data = conf_permute_.mutable_gpu_data(); + PermuteDataGPU(bottom[1]->count(), bottom[1]->gpu_data(), + num_classes_, num_priors_, 1, conf_permute_data); + const Ftype* conf_cpu_data = conf_permute_.cpu_data(); + + int num_kept = 0; + vector > > all_indices; + for (int i = 0; i < num; ++i) { + map > indices; + int num_det = 0; + const int conf_idx = i * num_classes_ * num_priors_; + int bbox_idx; + if (share_location_) { + bbox_idx = i * num_priors_ * 4; + } else { + bbox_idx = conf_idx * 4; + } + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + // Ignore background class. + continue; + } + const Ftype* cur_conf_data = conf_cpu_data + conf_idx + c * num_priors_; + const Ftype* cur_bbox_data = bbox_cpu_data + bbox_idx; + if (!share_location_) { + cur_bbox_data += c * num_priors_ * 4; + } + ApplyNMSFast(cur_bbox_data, cur_conf_data, num_priors_, + confidence_threshold_, nms_threshold_, eta_, top_k_, &(indices[c])); + num_det += indices[c].size(); + } + if (keep_top_k_ > -1 && num_det > keep_top_k_) { + vector > > score_index_pairs; + for (map >::iterator it = indices.begin(); + it != indices.end(); ++it) { + int label = it->first; + const vector& label_indices = it->second; + for (int j = 0; j < label_indices.size(); ++j) { + int idx = label_indices[j]; + float score = conf_cpu_data[conf_idx + label * num_priors_ + idx]; + score_index_pairs.push_back(std::make_pair( + score, std::make_pair(label, idx))); + } + } + // Keep top k results per image. +// std::sort(score_index_pairs.begin(), score_index_pairs.end(), +// SortScorePairDescend >); +// score_index_pairs.resize(keep_top_k_); + std::partial_sort( + score_index_pairs.begin(), score_index_pairs.begin() + keep_top_k_, + score_index_pairs.end(), SortScorePairDescend>); + // Store the new indices. + map > new_indices; + for (int j = 0; j < keep_top_k_; ++j) { + int label = score_index_pairs[j].second.first; + int idx = score_index_pairs[j].second.second; + new_indices[label].push_back(idx); + } + all_indices.push_back(new_indices); + num_kept += keep_top_k_; + } else { + all_indices.push_back(indices); + num_kept += num_det; + } + } + + vector top_shape(2, 1); + top_shape.push_back(num_kept); + top_shape.push_back(7); + Ftype* top_data; + if (num_kept == 0) { + LOG(INFO) << "Couldn't find any detections"; + top_shape[2] = num; + top[0]->Reshape(top_shape); + top_data = top[0]->mutable_cpu_data(); + caffe_set(top[0]->count(), -1, top_data); + // Generate fake results per image. + for (int i = 0; i < num; ++i) { + top_data[0] = i; + top_data += 7; + } + } else { + top[0]->Reshape(top_shape); + top_data = top[0]->mutable_cpu_data(); + } + + int count = 0; + boost::filesystem::path output_directory(output_directory_); + for (int i = 0; i < num; ++i) { + const int conf_idx = i * num_classes_ * num_priors_; + int bbox_idx; + if (share_location_) { + bbox_idx = i * num_priors_ * 4; + } else { + bbox_idx = conf_idx * 4; + } + for (map >::iterator it = all_indices[i].begin(); + it != all_indices[i].end(); ++it) { + int label = it->first; + vector& indices = it->second; + if (need_save_) { + CHECK(label_to_name_.find(label) != label_to_name_.end()) + << "Cannot find label: " << label << " in the label map."; + CHECK_LT(name_count_, names_.size()); + } + const Ftype* cur_conf_data = + conf_cpu_data + conf_idx + label * num_priors_; + const Ftype* cur_bbox_data = bbox_cpu_data + bbox_idx; + if (!share_location_) { + cur_bbox_data += label * num_priors_ * 4; + } + for (int j = 0; j < indices.size(); ++j) { + int idx = indices[j]; + top_data[count * 7] = i; + top_data[count * 7 + 1] = label; + top_data[count * 7 + 2] = cur_conf_data[idx]; + for (int k = 0; k < 4; ++k) { + top_data[count * 7 + 3 + k] = cur_bbox_data[idx * 4 + k]; + } + if (need_save_) { + // Generate output bbox. + NormalizedBBox bbox; + bbox.set_xmin(top_data[count * 7 + 3]); + bbox.set_ymin(top_data[count * 7 + 4]); + bbox.set_xmax(top_data[count * 7 + 5]); + bbox.set_ymax(top_data[count * 7 + 6]); + NormalizedBBox out_bbox; + OutputBBox(bbox, sizes_[name_count_], has_resize_, resize_param_, + &out_bbox); + float score = top_data[count * 7 + 2]; + float xmin = out_bbox.xmin(); + float ymin = out_bbox.ymin(); + float xmax = out_bbox.xmax(); + float ymax = out_bbox.ymax(); + ptree pt_xmin, pt_ymin, pt_width, pt_height; + pt_xmin.put("", round(xmin * 100) / 100.); + pt_ymin.put("", round(ymin * 100) / 100.); + pt_width.put("", round((xmax - xmin) * 100) / 100.); + pt_height.put("", round((ymax - ymin) * 100) / 100.); + + ptree cur_bbox; + cur_bbox.push_back(std::make_pair("", pt_xmin)); + cur_bbox.push_back(std::make_pair("", pt_ymin)); + cur_bbox.push_back(std::make_pair("", pt_width)); + cur_bbox.push_back(std::make_pair("", pt_height)); + + ptree cur_det; + cur_det.put("image_id", names_[name_count_]); + if (output_format_ == "ILSVRC") { + cur_det.put("category_id", label); + } else { + cur_det.put("category_id", label_to_name_[label].c_str()); + } + cur_det.add_child("bbox", cur_bbox); + cur_det.put("score", score); + + detections_.push_back(std::make_pair("", cur_det)); + } + ++count; + } + } + if (need_save_) { + ++name_count_; + if (name_count_ % num_test_image_ == 0) { + if (output_format_ == "VOC") { + map outfiles; + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + continue; + } + string label_name = label_to_name_[c]; + boost::filesystem::path file( + output_name_prefix_ + label_name + ".txt"); + boost::filesystem::path out_file = output_directory / file; + outfiles[label_name] = new std::ofstream(out_file.string().c_str(), + std::ofstream::out); + } + BOOST_FOREACH(ptree::value_type &det, detections_.get_child("")) { + ptree pt = det.second; + string label_name = pt.get("category_id"); + if (outfiles.find(label_name) == outfiles.end()) { + std::cout << "Cannot find " << label_name << std::endl; + continue; + } + string image_name = pt.get("image_id"); + float score = pt.get("score"); + vector bbox; + BOOST_FOREACH(ptree::value_type &elem, pt.get_child("bbox")) { + bbox.push_back(static_cast(elem.second.get_value())); + } + *(outfiles[label_name]) << image_name; + *(outfiles[label_name]) << " " << score; + *(outfiles[label_name]) << " " << bbox[0] << " " << bbox[1]; + *(outfiles[label_name]) << " " << bbox[0] + bbox[2]; + *(outfiles[label_name]) << " " << bbox[1] + bbox[3]; + *(outfiles[label_name]) << std::endl; + } + for (int c = 0; c < num_classes_; ++c) { + if (c == background_label_id_) { + continue; + } + string label_name = label_to_name_[c]; + outfiles[label_name]->flush(); + outfiles[label_name]->close(); + delete outfiles[label_name]; + } + } else if (output_format_ == "COCO") { + boost::filesystem::path output_directory(output_directory_); + boost::filesystem::path file(output_name_prefix_ + ".json"); + boost::filesystem::path out_file = output_directory / file; + std::ofstream outfile; + outfile.open(out_file.string().c_str(), std::ofstream::out); + + boost::regex exp("\"(null|true|false|-?[0-9]+(\\.[0-9]+)?)\""); + ptree output; + output.add_child("detections", detections_); + std::stringstream ss; + write_json(ss, output); + std::string rv = boost::regex_replace(ss.str(), exp, "$1"); + outfile << rv.substr(rv.find("["), rv.rfind("]") - rv.find("[")) + << std::endl << "]" << std::endl; + } else if (output_format_ == "ILSVRC") { + boost::filesystem::path output_directory(output_directory_); + boost::filesystem::path file(output_name_prefix_ + ".txt"); + boost::filesystem::path out_file = output_directory / file; + std::ofstream outfile; + outfile.open(out_file.string().c_str(), std::ofstream::out); + + BOOST_FOREACH(ptree::value_type &det, detections_.get_child("")) { + ptree pt = det.second; + int label = pt.get("category_id"); + string image_name = pt.get("image_id"); + float score = pt.get("score"); + vector bbox; + BOOST_FOREACH(ptree::value_type &elem, pt.get_child("bbox")) { + bbox.push_back(static_cast(elem.second.get_value())); + } + outfile << image_name << " " << label << " " << score; + outfile << " " << bbox[0] << " " << bbox[1]; + outfile << " " << bbox[0] + bbox[2]; + outfile << " " << bbox[1] + bbox[3]; + outfile << std::endl; + } + } + name_count_ = 0; + detections_.clear(); + } + } + } + if (visualize_) { + vector cv_imgs; + this->data_transformer_->TransformInv(bottom[3], &cv_imgs); + vector colors = GetColors(label_to_display_name_.size()); + VisualizeBBox(cv_imgs, top[0], visualize_threshold_, colors, + label_to_display_name_, save_file_); + } +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(DetectionOutputLayer); + +} // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 5d46514af9c..d3703afea3d 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -11,11 +11,7 @@ __global__ void DropoutForward(const int n, const Dtype* in, const unsigned int* mask, const unsigned int threshold, const float scale, Dtype* out) { CUDA_KERNEL_LOOP(index, n) { - // out[index] = in[index] * (mask[index] > threshold) * scale; - if (mask[index] > threshold) - out[index] = Dtype(static_cast(in[index]) * scale); - else - out[index] = 0.; + out[index] = in[index] * (mask[index] > threshold ? Dtype(1) : Dtype(0)) * scale; } } @@ -36,7 +32,7 @@ DropoutLayer::Forward_gpu(const vector& bottom, const vecto CUDA_POST_KERNEL_CHECK; CUDA_CHECK(cudaStreamSynchronize(stream)); } else { - caffe_copy(count, bottom_data, top_data); + caffe_copy(count, bottom_data, top_data); } } @@ -44,24 +40,19 @@ template __global__ void DropoutBackward(const int n, const Dtype* in_diff, const unsigned int* mask, const unsigned int threshold, const float scale, Dtype* out_diff) { CUDA_KERNEL_LOOP(index, n) { - // out_diff[index] = in_diff[index] * (mask[index] > threshold) * scale; - if (mask[index] > threshold) - out_diff[index] = Dtype(static_cast(in_diff[index]) * scale); - else - out_diff[index] = 0.; + out_diff[index] = in_diff[index] * (mask[index] > threshold ? Dtype(1) : Dtype(0)) * scale; } } template void DropoutLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { - const Btype* top_diff = top[0]->gpu_diff(); - Btype* bottom_diff = bottom[0]->mutable_gpu_diff(); - if (propagate_down[0]) { + const Btype* top_diff = top[0]->gpu_diff(); + Btype* bottom_diff = bottom[0]->mutable_gpu_diff(); if (this->phase_ == TRAIN) { // Needed for TEST cudaStream_t stream = Caffe::thread_stream(); - const unsigned int* mask = static_cast(rand_vec_.gpu_data()); + const unsigned int* mask = rand_vec_.gpu_data(); const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) DropoutBackward<<>> diff --git a/src/caffe/layers/embed_layer.cu b/src/caffe/layers/embed_layer.cu index 8fa153ff855..bf721244931 100644 --- a/src/caffe/layers/embed_layer.cu +++ b/src/caffe/layers/embed_layer.cu @@ -9,26 +9,19 @@ namespace caffe { template __global__ void EmbedForward(const int nthreads, const Dtype* bottom_data, - const Dtype* weight, const int M, const int N, const int K, - Dtype* top_data) { + const Dtype* weight, const int N, Dtype* top_data) { CUDA_KERNEL_LOOP(top_index, nthreads) { const int n = top_index / N; const int d = top_index % N; - const int index = static_cast(static_cast(bottom_data[n])); - const int weight_index = index * N + d; + const int index = static_cast(bottom_data[n]); + const int weight_index = abs(index * N + d); top_data[top_index] = weight[weight_index]; } } template __global__ void EmbedBackward(const int nthreads, const Dtype* bottom_data, - const Dtype* top_diff, const int M, const int N, const int K, - Dtype* weight_diff); - -template -__global__ void EmbedBackward(const int nthreads, const Dtype* bottom_data, - const Dtype* top_diff, const int M, const int N, const int K, - Dtype* weight_diff) { + const Dtype* top_diff, const int N, Dtype* weight_diff) { CUDA_KERNEL_LOOP(top_index, nthreads) { const int n = top_index / N; const int d = top_index % N; @@ -45,15 +38,16 @@ void EmbedLayer::Forward_gpu(const vector& bottom, Ftype* top_data = top[0]->mutable_gpu_data(); const Ftype* weight = this->blobs_[0]->template gpu_data(); const int count = top[0]->count(); + cudaStream_t stream = Caffe::thread_stream(); EmbedForward // NOLINT_NEXT_LINE(whitespace/operators) - <<>>( - count, bottom_data, weight, M_, N_, K_, top_data); + <<>>( + count, bottom_data, weight, N_, top_data); + CUDA_CHECK(cudaStreamSynchronize(stream)); if (bias_term_) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, Ftype(1), bias_multiplier_.template gpu_data(), this->blobs_[1]->template gpu_data(), Ftype(1), top_data); } - CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream())); } template @@ -65,10 +59,11 @@ void EmbedLayer::Backward_gpu(const vector& top, const Btype* top_diff = top[0]->gpu_diff(); const Btype* bottom_data = bottom[0]->gpu_data(); Btype* weight_diff = this->blobs_[0]->template mutable_gpu_diff(); + cudaStream_t stream = Caffe::thread_stream(); EmbedBackward // NOLINT_NEXT_LINE(whitespace/operators) - <<>>( - top_count, bottom_data, top_diff, M_, N_, K_, weight_diff); - CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream())); + <<>>( + top_count, bottom_data, top_diff, N_, weight_diff); + CUDA_CHECK(cudaStreamSynchronize(stream)); } if (bias_term_ && this->param_propagate_down_[1]) { const Btype* top_diff = top[0]->gpu_diff(); diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 6f778e9cb07..0c3bfc1fb6e 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -62,10 +62,10 @@ void HDF5DataLayer::LoadHDF5FileData(const char* filename) { // Shuffle if needed. if (this->layer_param_.hdf5_data_param().shuffle()) { caffe::shuffle(data_permutation_.begin(), data_permutation_.end()); - DLOG(INFO) << "Successully loaded " << hdf_blobs_[0]->shape(0) + LOG(INFO) << "Successully loaded " << hdf_blobs_[0]->shape(0) << " rows (shuffled)"; } else { - DLOG(INFO) << "Successully loaded " << hdf_blobs_[0]->shape(0) << " rows"; + LOG(INFO) << "Successully loaded " << hdf_blobs_[0]->shape(0) << " rows"; } } diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 0ec9c3988e1..9f4d8caf046 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -206,7 +206,7 @@ void ImageDataLayer::load_batch(Batch* batch, int thread_id, size_ if (cv_img.data) { int offset = batch->data_->offset(item_id); #if defined(USE_CUDNN) - this->dt(thread_id)->Transform(cv_img, prefetch_data + offset, buf_len, false); + this->bdt(thread_id)->Transform(cv_img, prefetch_data + offset, buf_len, false); #else CHECK_EQ(buf_len, tmp.size()); this->dt(thread_id)->Transform(cv_img, prefetch_data + offset, buf_len, false); @@ -242,16 +242,23 @@ void ImageDataLayer::load_batch(Batch* batch, int thread_id, size_ // go to the next iter line_ids_[thread_id] += line_bucket; if (line_ids_[thread_id] >= lines_size) { - // We have reached the end. Restart from the first. - DLOG(INFO) << this->print_current_device() << " Restarting data prefetching from start."; while (line_ids_[thread_id] >= lines_size) { line_ids_[thread_id] -= lines_size; } - if (thread_id == 0 && this->rank_ == 0 && shuffle) { - LOG(INFO) << "Shuffling data"; - ShuffleImages(); - epoch_count_ += lines_size; - Caffe::report_epoch_count(epoch_count_); + if (thread_id == 0 && this->rank_ == 0) { + if (this->phase_ == TRAIN) { + // We have reached the end. Restart from the first. + LOG(INFO) << this->print_current_device() << " Restarting data prefetching (" + << lines_size << ")"; + if (epoch_count_ == 0UL) { + epoch_count_ += lines_size; + Caffe::report_epoch_count(epoch_count_); + } + } + if (shuffle) { + LOG(INFO) << "Shuffling data"; + ShuffleImages(); + } } } line_id = line_ids_[thread_id]; diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 56bf2a0574d..7fa4d7c4e65 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -37,7 +37,7 @@ InnerProductLayer::LayerSetUp(const vector& bottom, const v weight_shape[1] = K_; } // CPU filler always 32 bits - this->blobs_[0] = Blob::create(weight_shape); + this->blobs_[0] = Blob::create(weight_shape); shared_ptr> weight_filler( GetFiller(this->layer_param_.inner_product_param().weight_filler())); diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 848e101a35a..54fb58306cb 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -22,6 +22,37 @@ void LossLayer::Reshape( top[0]->Reshape(loss_shape); } +template +Ftype LossLayer::GetNormalizer( + const LossParameter_NormalizationMode normalization_mode, + const int outer_num, const int inner_num, const int valid_count) { + Dtype normalizer; + switch (normalization_mode) { + case LossParameter_NormalizationMode_FULL: + normalizer = Dtype(outer_num * inner_num); + break; + case LossParameter_NormalizationMode_VALID: + if (valid_count == -1) { + normalizer = Dtype(outer_num * inner_num); + } else { + normalizer = Dtype(valid_count); + } + break; + case LossParameter_NormalizationMode_BATCH_SIZE: + normalizer = Dtype(outer_num); + break; + case LossParameter_NormalizationMode_NONE: + normalizer = Dtype(1); + break; + default: + LOG(FATAL) << "Unknown normalization mode: " + << LossParameter_NormalizationMode_Name(normalization_mode); + } + // Some users will have no labels for some examples in order to 'turn off' a + // particular loss in a multi-task setup. The max prevents NaNs in that case. + return std::max(Dtype(1.0), normalizer); +} + INSTANTIATE_CLASS_FB(LossLayer); } // namespace caffe diff --git a/src/caffe/layers/lstm_layer.cpp b/src/caffe/layers/lstm_layer.cpp new file mode 100644 index 00000000000..81eb6f32cac --- /dev/null +++ b/src/caffe/layers/lstm_layer.cpp @@ -0,0 +1,244 @@ +#include +#include + +#include "caffe/common.hpp" +#include "caffe/blob.hpp" +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/lstm_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void LSTMLayer::RecurrentInputBlobNames(vector* names) const { + names->resize(2); + (*names)[0] = "h_0"; + (*names)[1] = "c_0"; +} + +template +void LSTMLayer::RecurrentOutputBlobNames(vector* names) const { + names->resize(2); + (*names)[0] = "h_" + format_int(this->T_); + (*names)[1] = "c_T"; +} + +template +void LSTMLayer::RecurrentInputShapes(vector* shapes) const { + const int num_output = this->layer_param_.recurrent_param().num_output(); + const int num_blobs = 2; + shapes->resize(num_blobs); + for (int i = 0; i < num_blobs; ++i) { + (*shapes)[i].Clear(); + (*shapes)[i].add_dim(1); // a single timestep + (*shapes)[i].add_dim(this->N_); + (*shapes)[i].add_dim(num_output); + } +} + +template +void LSTMLayer::OutputBlobNames(vector* names) const { + names->resize(1); + (*names)[0] = "h"; +} + +template +void LSTMLayer::FillUnrolledNet(NetParameter* net_param) const { + const int num_output = this->layer_param_.recurrent_param().num_output(); + CHECK_GT(num_output, 0) << "num_output must be positive"; + const FillerParameter& weight_filler = + this->layer_param_.recurrent_param().weight_filler(); + const FillerParameter& bias_filler = + this->layer_param_.recurrent_param().bias_filler(); + + // Add generic LayerParameter's (without bottoms/tops) of layer types we'll + // use to save redundant code. + LayerParameter hidden_param; + hidden_param.set_type("InnerProduct"); + hidden_param.mutable_inner_product_param()->set_num_output(num_output * 4); + hidden_param.mutable_inner_product_param()->set_bias_term(false); + hidden_param.mutable_inner_product_param()->set_axis(2); + hidden_param.mutable_inner_product_param()-> + mutable_weight_filler()->CopyFrom(weight_filler); + + LayerParameter biased_hidden_param(hidden_param); + biased_hidden_param.mutable_inner_product_param()->set_bias_term(true); + biased_hidden_param.mutable_inner_product_param()-> + mutable_bias_filler()->CopyFrom(bias_filler); + + LayerParameter sum_param; + sum_param.set_type("Eltwise"); + sum_param.mutable_eltwise_param()->set_operation( + EltwiseParameter_EltwiseOp_SUM); + + LayerParameter scale_param; + scale_param.set_type("Scale"); + scale_param.mutable_scale_param()->set_axis(0); + + LayerParameter slice_param; + slice_param.set_type("Slice"); + slice_param.mutable_slice_param()->set_axis(0); + + LayerParameter split_param; + split_param.set_type("Split"); + + vector input_shapes; + RecurrentInputShapes(&input_shapes); + CHECK_EQ(2, input_shapes.size()); + + LayerParameter* input_layer_param = net_param->add_layer(); + input_layer_param->set_type("Input"); + InputParameter* input_param = input_layer_param->mutable_input_param(); + + input_layer_param->add_top("c_0"); + input_param->add_shape()->CopyFrom(input_shapes[0]); + + input_layer_param->add_top("h_0"); + input_param->add_shape()->CopyFrom(input_shapes[1]); + + LayerParameter* cont_slice_param = net_param->add_layer(); + cont_slice_param->CopyFrom(slice_param); + cont_slice_param->set_name("cont_slice"); + cont_slice_param->add_bottom("cont"); + cont_slice_param->mutable_slice_param()->set_axis(0); + + // Add layer to transform all timesteps of x to the hidden state dimension. + // W_xc_x = W_xc * x + b_c + { + LayerParameter* x_transform_param = net_param->add_layer(); + x_transform_param->CopyFrom(biased_hidden_param); + x_transform_param->set_name("x_transform"); + x_transform_param->add_param()->set_name("W_xc"); + x_transform_param->add_param()->set_name("b_c"); + x_transform_param->add_bottom("x"); + x_transform_param->add_top("W_xc_x"); + x_transform_param->add_propagate_down(true); + } + + if (this->static_input_) { + // Add layer to transform x_static to the gate dimension. + // W_xc_x_static = W_xc_static * x_static + LayerParameter* x_static_transform_param = net_param->add_layer(); + x_static_transform_param->CopyFrom(hidden_param); + x_static_transform_param->mutable_inner_product_param()->set_axis(1); + x_static_transform_param->set_name("W_xc_x_static"); + x_static_transform_param->add_param()->set_name("W_xc_static"); + x_static_transform_param->add_bottom("x_static"); + x_static_transform_param->add_top("W_xc_x_static_preshape"); + x_static_transform_param->add_propagate_down(true); + + LayerParameter* reshape_param = net_param->add_layer(); + reshape_param->set_type("Reshape"); + BlobShape* new_shape = + reshape_param->mutable_reshape_param()->mutable_shape(); + new_shape->add_dim(1); // One timestep. + // Should infer this->N as the dimension so we can reshape on batch size. + new_shape->add_dim(-1); + new_shape->add_dim( + x_static_transform_param->inner_product_param().num_output()); + reshape_param->set_name("W_xc_x_static_reshape"); + reshape_param->add_bottom("W_xc_x_static_preshape"); + reshape_param->add_top("W_xc_x_static"); + } + + LayerParameter* x_slice_param = net_param->add_layer(); + x_slice_param->CopyFrom(slice_param); + x_slice_param->add_bottom("W_xc_x"); + x_slice_param->set_name("W_xc_x_slice"); + + LayerParameter output_concat_layer; + output_concat_layer.set_name("h_concat"); + output_concat_layer.set_type("Concat"); + output_concat_layer.add_top("h"); + output_concat_layer.mutable_concat_param()->set_axis(0); + + for (int t = 1; t <= this->T_; ++t) { + string tm1s = format_int(t - 1); + string ts = format_int(t); + + cont_slice_param->add_top("cont_" + ts); + x_slice_param->add_top("W_xc_x_" + ts); + + // Add layers to flush the hidden state when beginning a new + // sequence, as indicated by cont_t. + // h_conted_{t-1} := cont_t * h_{t-1} + // + // Normally, cont_t is binary (i.e., 0 or 1), so: + // h_conted_{t-1} := h_{t-1} if cont_t == 1 + // 0 otherwise + { + LayerParameter* cont_h_param = net_param->add_layer(); + cont_h_param->CopyFrom(scale_param); + cont_h_param->set_name("h_conted_" + tm1s); + cont_h_param->add_bottom("h_" + tm1s); + cont_h_param->add_bottom("cont_" + ts); + cont_h_param->add_top("h_conted_" + tm1s); + } + + // Add layer to compute + // W_hc_h_{t-1} := W_hc * h_conted_{t-1} + { + LayerParameter* w_param = net_param->add_layer(); + w_param->CopyFrom(hidden_param); + w_param->set_name("transform_" + ts); + w_param->add_param()->set_name("W_hc"); + w_param->add_bottom("h_conted_" + tm1s); + w_param->add_top("W_hc_h_" + tm1s); + w_param->mutable_inner_product_param()->set_axis(2); + } + + // Add the outputs of the linear transformations to compute the gate input. + // gate_input_t := W_hc * h_conted_{t-1} + W_xc * x_t + b_c + // = W_hc_h_{t-1} + W_xc_x_t + b_c + { + LayerParameter* input_sum_layer = net_param->add_layer(); + input_sum_layer->CopyFrom(sum_param); + input_sum_layer->set_name("gate_input_" + ts); + input_sum_layer->add_bottom("W_hc_h_" + tm1s); + input_sum_layer->add_bottom("W_xc_x_" + ts); + if (this->static_input_) { + input_sum_layer->add_bottom("W_xc_x_static"); + } + input_sum_layer->add_top("gate_input_" + ts); + } + + // Add LSTMUnit layer to compute the cell & hidden vectors c_t and h_t. + // Inputs: c_{t-1}, gate_input_t = (i_t, f_t, o_t, g_t), cont_t + // Outputs: c_t, h_t + // [ i_t' ] + // [ f_t' ] := gate_input_t + // [ o_t' ] + // [ g_t' ] + // i_t := \sigmoid[i_t'] + // f_t := \sigmoid[f_t'] + // o_t := \sigmoid[o_t'] + // g_t := \tanh[g_t'] + // c_t := cont_t * (f_t .* c_{t-1}) + (i_t .* g_t) + // h_t := o_t .* \tanh[c_t] + { + LayerParameter* lstm_unit_param = net_param->add_layer(); + lstm_unit_param->set_type("LSTMUnit"); + lstm_unit_param->add_bottom("c_" + tm1s); + lstm_unit_param->add_bottom("gate_input_" + ts); + lstm_unit_param->add_bottom("cont_" + ts); + lstm_unit_param->add_top("c_" + ts); + lstm_unit_param->add_top("h_" + ts); + lstm_unit_param->set_name("unit_" + ts); + } + output_concat_layer.add_bottom("h_" + ts); + } // for (int t = 1; t <= this->T_; ++t) + + { + LayerParameter* c_T_copy_param = net_param->add_layer(); + c_T_copy_param->CopyFrom(split_param); + c_T_copy_param->add_bottom("c_" + format_int(this->T_)); + c_T_copy_param->add_top("c_T"); + } + net_param->add_layer()->CopyFrom(output_concat_layer); +} + +INSTANTIATE_CLASS_FB(LSTMLayer); +REGISTER_LAYER_CLASS(LSTM); + +} // namespace caffe diff --git a/src/caffe/layers/lstm_unit_layer.cpp b/src/caffe/layers/lstm_unit_layer.cpp new file mode 100644 index 00000000000..4f093f83801 --- /dev/null +++ b/src/caffe/layers/lstm_unit_layer.cpp @@ -0,0 +1,126 @@ +#include +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/layers/lstm_layer.hpp" + +namespace caffe { + +template +inline Dtype sigmoid(Dtype x) { + return 1. / (1. + exp(-x)); +} + +template +inline Dtype tanh(Dtype x) { + return 2. * sigmoid(2. * x) - 1.; +} + +template +void LSTMUnitLayer::Reshape(const vector& bottom, + const vector& top) { + const int num_instances = bottom[0]->shape(1); + for (int i = 0; i < bottom.size(); ++i) { + if (i == 2) { + CHECK_EQ(2, bottom[i]->num_axes()); + } else { + CHECK_EQ(3, bottom[i]->num_axes()); + } + CHECK_EQ(1, bottom[i]->shape(0)); + CHECK_EQ(num_instances, bottom[i]->shape(1)); + } + hidden_dim_ = bottom[0]->shape(2); + CHECK_EQ(4 * hidden_dim_, bottom[1]->shape(2)); + top[0]->ReshapeLike(*bottom[0]); + top[1]->ReshapeLike(*bottom[0]); + X_acts_->ReshapeLike(*bottom[1]); +} + +template +void LSTMUnitLayer::Forward_cpu(const vector& bottom, + const vector& top) { + const int num = bottom[0]->shape(1); + const int x_dim = hidden_dim_ * 4; + const Ftype* C_prev = bottom[0]->cpu_data(); + const Ftype* X = bottom[1]->cpu_data(); + const Ftype* cont = bottom[2]->cpu_data(); + Ftype* C = top[0]->mutable_cpu_data(); + Ftype* H = top[1]->mutable_cpu_data(); + for (int n = 0; n < num; ++n) { + for (int d = 0; d < hidden_dim_; ++d) { + const Ftype i = sigmoid(X[d]); + const Ftype f = (*cont == 0) ? 0 : + (*cont * sigmoid(X[1 * hidden_dim_ + d])); + const Ftype o = sigmoid(X[2 * hidden_dim_ + d]); + const Ftype g = tanh(X[3 * hidden_dim_ + d]); + const Ftype c_prev = C_prev[d]; + const Ftype c = f * c_prev + i * g; + C[d] = c; + const Ftype tanh_c = tanh(c); + H[d] = o * tanh_c; + } + C_prev += hidden_dim_; + X += x_dim; + C += hidden_dim_; + H += hidden_dim_; + ++cont; + } +} + +template +void LSTMUnitLayer::Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + CHECK(!propagate_down[2]) << "Cannot backpropagate to sequence indicators."; + if (!propagate_down[0] && !propagate_down[1]) { return; } + + const int num = bottom[0]->shape(1); + const int x_dim = hidden_dim_ * 4; + const Btype* C_prev = bottom[0]->cpu_data(); + const Btype* X = bottom[1]->cpu_data(); + const Btype* cont = bottom[2]->cpu_data(); + const Btype* C = top[0]->cpu_data(); + const Btype* H = top[1]->cpu_data(); + const Btype* C_diff = top[0]->cpu_diff(); + const Btype* H_diff = top[1]->cpu_diff(); + Btype* C_prev_diff = bottom[0]->mutable_cpu_diff(); + Btype* X_diff = bottom[1]->mutable_cpu_diff(); + for (int n = 0; n < num; ++n) { + for (int d = 0; d < hidden_dim_; ++d) { + const Btype i = sigmoid(X[d]); + const Btype f = (*cont == 0) ? 0 : + (*cont * sigmoid(X[1 * hidden_dim_ + d])); + const Btype o = sigmoid(X[2 * hidden_dim_ + d]); + const Btype g = tanh(X[3 * hidden_dim_ + d]); + const Btype c_prev = C_prev[d]; + const Btype c = C[d]; + const Btype tanh_c = tanh(c); + Btype* c_prev_diff = C_prev_diff + d; + Btype* i_diff = X_diff + d; + Btype* f_diff = X_diff + 1 * hidden_dim_ + d; + Btype* o_diff = X_diff + 2 * hidden_dim_ + d; + Btype* g_diff = X_diff + 3 * hidden_dim_ + d; + const Btype c_term_diff = + C_diff[d] + H_diff[d] * o * (1 - tanh_c * tanh_c); + *c_prev_diff = c_term_diff * f; + *i_diff = c_term_diff * g * i * (1 - i); + *f_diff = c_term_diff * c_prev * f * (1 - f); + *o_diff = H_diff[d] * tanh_c * o * (1 - o); + *g_diff = c_term_diff * i * (1 - g * g); + } + C_prev += hidden_dim_; + X += x_dim; + C += hidden_dim_; + H += hidden_dim_; + C_diff += hidden_dim_; + H_diff += hidden_dim_; + X_diff += x_dim; + C_prev_diff += hidden_dim_; + ++cont; + } +} + +INSTANTIATE_CLASS_FB(LSTMUnitLayer); +REGISTER_LAYER_CLASS(LSTMUnit); + +} // namespace caffe diff --git a/src/caffe/layers/lstm_unit_layer.cu b/src/caffe/layers/lstm_unit_layer.cu new file mode 100644 index 00000000000..d8ee81d0ef3 --- /dev/null +++ b/src/caffe/layers/lstm_unit_layer.cu @@ -0,0 +1,162 @@ +#include +#include +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/layers/lstm_layer.hpp" + +namespace caffe { + +template +__device__ Dtype sigmoid(const Dtype x) { + return Dtype(1) / (Dtype(1) + exp(-x)); +} + +template +__device__ Dtype tanh(const Dtype x) { + return Dtype(2) * sigmoid(Dtype(2) * x) - Dtype(1); +} + +template +__global__ void LSTMActsForward(const int nthreads, const int dim, + const Dtype* X, Dtype* X_acts) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int x_dim = 4 * dim; + const int d = index % x_dim; + if (d < 3 * dim) { + X_acts[index] = sigmoid(X[index]); + } else { + X_acts[index] = tanh(X[index]); + } + } +} + +template +__global__ void LSTMUnitForward(const int nthreads, const int dim, + const Dtype* C_prev, const Dtype* X, const Dtype* cont, + Dtype* C, Dtype* H) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int n = index / dim; + const int d = index % dim; + const Dtype* X_offset = X + 4 * dim * n; + const Dtype i = X_offset[d]; + const Dtype f = X_offset[1 * dim + d]; + const Dtype o = X_offset[2 * dim + d]; + const Dtype g = X_offset[3 * dim + d]; + const Dtype c_prev = C_prev[index]; + const Dtype c = cont[n] * f * c_prev + i * g; + C[index] = c; + const Dtype tanh_c = tanh(c); + H[index] = o * tanh_c; + } +} + +template +void LSTMUnitLayer::Forward_gpu(const vector& bottom, + const vector& top) { + const int count = top[1]->count(); + const Ftype* C_prev = bottom[0]->gpu_data(); + const Ftype* X = bottom[1]->gpu_data(); + const Ftype* cont = bottom[2]->gpu_data(); + Ftype* X_acts = X_acts_->mutable_gpu_data(); + Ftype* C = top[0]->mutable_gpu_data(); + Ftype* H = top[1]->mutable_gpu_data(); + const int X_count = bottom[1]->count(); + cudaStream_t stream = Caffe::thread_stream(); + // NOLINT_NEXT_LINE(whitespace/operators) + LSTMActsForward<<>>( + X_count, hidden_dim_, X, X_acts); + CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); + // NOLINT_NEXT_LINE(whitespace/operators) + LSTMUnitForward<<>>( + count, hidden_dim_, C_prev, X_acts, cont, C, H); + CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); +} + +template +__global__ void LSTMUnitBackward(const int nthreads, const int dim, + const Dtype* C_prev, const Dtype* X, const Dtype* C, const Dtype* H, + const Dtype* cont, const Dtype* C_diff, const Dtype* H_diff, + Dtype* C_prev_diff, Dtype* X_diff) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int n = index / dim; + const int d = index % dim; + const Dtype* X_offset = X + 4 * dim * n; + const Dtype i = X_offset[d]; + const Dtype f = X_offset[1 * dim + d]; + const Dtype o = X_offset[2 * dim + d]; + const Dtype g = X_offset[3 * dim + d]; + const Dtype c_prev = C_prev[index]; + const Dtype c = C[index]; + const Dtype tanh_c = tanh(c); + Dtype* c_prev_diff = C_prev_diff + index; + Dtype* X_diff_offset = X_diff + 4 * dim * n; + Dtype* i_diff = X_diff_offset + d; + Dtype* f_diff = X_diff_offset + 1 * dim + d; + Dtype* o_diff = X_diff_offset + 2 * dim + d; + Dtype* g_diff = X_diff_offset + 3 * dim + d; + const Dtype c_term_diff = + C_diff[index] + H_diff[index] * o * (1 - tanh_c * tanh_c); + const Dtype cont_n = cont[n]; + *c_prev_diff = cont_n * c_term_diff * f; + *i_diff = c_term_diff * g; + *f_diff = cont_n * c_term_diff * c_prev; + *o_diff = H_diff[index] * tanh_c; + *g_diff = c_term_diff * i; + } +} + +template +__global__ void LSTMActsBackward(const int nthreads, const int dim, + const Dtype* X_acts, const Dtype* X_acts_diff, Dtype* X_diff) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int x_dim = 4 * dim; + const int d = index % x_dim; + const Dtype X_act = X_acts[index]; + if (d < 3 * dim) { + X_diff[index] = X_acts_diff[index] * X_act * (Dtype(1) - X_act); + } else { + X_diff[index] = X_acts_diff[index] * (Dtype(1) - X_act * X_act); + } + } +} + +template +void LSTMUnitLayer::Backward_gpu(const vector& top, + const vector& propagate_down, + const vector& bottom) { + CHECK(!propagate_down[2]) << "Cannot backpropagate to sequence indicators."; + if (!propagate_down[0] && !propagate_down[1]) { return; } + + const int count = top[1]->count(); + const Btype* C_prev = bottom[0]->gpu_data(); + const Btype* X_acts = X_acts_->gpu_data(); + const Btype* cont = bottom[2]->gpu_data(); + const Btype* C = top[0]->gpu_data(); + const Btype* H = top[1]->gpu_data(); + const Btype* C_diff = top[0]->gpu_diff(); + const Btype* H_diff = top[1]->gpu_diff(); + Btype* C_prev_diff = bottom[0]->mutable_gpu_diff(); + Btype* X_acts_diff = X_acts_->mutable_gpu_diff(); + + cudaStream_t stream = Caffe::thread_stream(); + LSTMUnitBackward // NOLINT_NEXT_LINE(whitespace/operators) + <<>>(count, hidden_dim_, + C_prev, X_acts, C, H, cont, C_diff, H_diff, C_prev_diff, X_acts_diff); + CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); + const int X_count = bottom[1]->count(); + Btype* X_diff = bottom[1]->mutable_gpu_diff(); + LSTMActsBackward // NOLINT_NEXT_LINE(whitespace/operators) + <<>>( + X_count, hidden_dim_, X_acts, X_acts_diff, X_diff); + CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(LSTMUnitLayer); + +} // namespace caffe diff --git a/src/caffe/layers/multibox_loss_layer.cpp b/src/caffe/layers/multibox_loss_layer.cpp new file mode 100644 index 00000000000..62a9b799f59 --- /dev/null +++ b/src/caffe/layers/multibox_loss_layer.cpp @@ -0,0 +1,375 @@ +#include +#include +#include +#include + +#include "caffe/layers/multibox_loss_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void MultiBoxLossLayer::LayerSetUp(const vector& bottom, + const vector& top) { + LossLayer::LayerSetUp(bottom, top); + if (this->layer_param_.propagate_down_size() == 0) { + this->layer_param_.add_propagate_down(true); + this->layer_param_.add_propagate_down(true); + this->layer_param_.add_propagate_down(false); + this->layer_param_.add_propagate_down(false); + } + const MultiBoxLossParameter& multibox_loss_param = + this->layer_param_.multibox_loss_param(); + multibox_loss_param_ = this->layer_param_.multibox_loss_param(); + + num_ = bottom[0]->num(); + num_priors_ = bottom[2]->height() / 4; + // Get other parameters. + CHECK(multibox_loss_param.has_num_classes()) << "Must provide num_classes."; + num_classes_ = multibox_loss_param.num_classes(); + CHECK_GE(num_classes_, 1) << "num_classes should not be less than 1."; + share_location_ = multibox_loss_param.share_location(); + loc_classes_ = share_location_ ? 1 : num_classes_; + background_label_id_ = multibox_loss_param.background_label_id(); + use_difficult_gt_ = multibox_loss_param.use_difficult_gt(); + mining_type_ = multibox_loss_param.mining_type(); + if (multibox_loss_param.has_do_neg_mining()) { + LOG(WARNING) << "do_neg_mining is deprecated, use mining_type instead."; + do_neg_mining_ = multibox_loss_param.do_neg_mining(); + CHECK_EQ(do_neg_mining_, + mining_type_ != MultiBoxLossParameter_MiningType_NONE); + } + do_neg_mining_ = mining_type_ != MultiBoxLossParameter_MiningType_NONE; + + if (!this->layer_param_.loss_param().has_normalization() && + this->layer_param_.loss_param().has_normalize()) { + normalization_ = this->layer_param_.loss_param().normalize() ? + LossParameter_NormalizationMode_VALID : + LossParameter_NormalizationMode_BATCH_SIZE; + } else { + normalization_ = this->layer_param_.loss_param().normalization(); + } + + if (do_neg_mining_) { + CHECK(share_location_) + << "Currently only support negative mining if share_location is true."; + } + + vector loss_shape(1, 1); + // Set up localization loss layer. + loc_weight_ = multibox_loss_param.loc_weight(); + loc_loss_type_ = multibox_loss_param.loc_loss_type(); + // fake shape. + vector loc_shape(1, 1); + loc_shape.push_back(4); + loc_pred_.Reshape(loc_shape); + loc_gt_.Reshape(loc_shape); + loc_bottom_vec_.push_back(&loc_pred_); + loc_bottom_vec_.push_back(&loc_gt_); + loc_loss_.Reshape(loss_shape); + loc_top_vec_.push_back(&loc_loss_); + if (loc_loss_type_ == MultiBoxLossParameter_LocLossType_L2) { + LayerParameter layer_param; + layer_param.set_name(this->layer_param_.name() + "_l2_loc"); + layer_param.set_type("EuclideanLoss"); + layer_param.add_loss_weight(loc_weight_); + loc_loss_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); + loc_loss_layer_->SetUp(loc_bottom_vec_, loc_top_vec_); + } else if (loc_loss_type_ == MultiBoxLossParameter_LocLossType_SMOOTH_L1) { + LayerParameter layer_param; + layer_param.set_name(this->layer_param_.name() + "_smooth_L1_loc"); + layer_param.set_type("SmoothL1Loss"); + layer_param.add_loss_weight(loc_weight_); + loc_loss_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); + loc_loss_layer_->SetUp(loc_bottom_vec_, loc_top_vec_); + } else { + LOG(FATAL) << "Unknown localization loss type."; + } + // Set up confidence loss layer. + conf_loss_type_ = multibox_loss_param.conf_loss_type(); + conf_bottom_vec_.push_back(&conf_pred_); + conf_bottom_vec_.push_back(&conf_gt_); + conf_loss_.Reshape(loss_shape); + conf_top_vec_.push_back(&conf_loss_); + if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_SOFTMAX) { + CHECK_GE(background_label_id_, 0) + << "background_label_id should be within [0, num_classes) for Softmax."; + CHECK_LT(background_label_id_, num_classes_) + << "background_label_id should be within [0, num_classes) for Softmax."; + LayerParameter layer_param; + layer_param.set_name(this->layer_param_.name() + "_softmax_conf"); + layer_param.set_type("SoftmaxWithLoss"); + layer_param.add_loss_weight(Dtype(1.)); + layer_param.mutable_loss_param()->set_normalization( + LossParameter_NormalizationMode_NONE); + SoftmaxParameter* softmax_param = layer_param.mutable_softmax_param(); + softmax_param->set_axis(1); + // Fake reshape. + vector conf_shape(1, 1); + conf_gt_.Reshape(conf_shape); + conf_shape.push_back(num_classes_); + conf_pred_.Reshape(conf_shape); + conf_loss_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); + conf_loss_layer_->SetUp(conf_bottom_vec_, conf_top_vec_); + } else if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_LOGISTIC) { + LayerParameter layer_param; + layer_param.set_name(this->layer_param_.name() + "_logistic_conf"); + layer_param.set_type("SigmoidCrossEntropyLoss"); + layer_param.add_loss_weight(Dtype(1.)); + // Fake reshape. + vector conf_shape(1, 1); + conf_shape.push_back(num_classes_); + conf_gt_.Reshape(conf_shape); + conf_pred_.Reshape(conf_shape); + conf_loss_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); + conf_loss_layer_->SetUp(conf_bottom_vec_, conf_top_vec_); + } else { + LOG(FATAL) << "Unknown confidence loss type."; + } +} + +template +void MultiBoxLossLayer::Reshape(const vector& bottom, + const vector& top) { + LossLayer::Reshape(bottom, top); + num_ = bottom[0]->num(); + num_priors_ = bottom[2]->height() / 4; + num_gt_ = bottom[3]->height(); + CHECK_EQ(bottom[0]->num(), bottom[1]->num()); + CHECK_EQ(num_priors_ * loc_classes_ * 4, bottom[0]->channels()) + << "Number of priors must match number of location predictions."; + CHECK_EQ(num_priors_ * num_classes_, bottom[1]->channels()) + << "Number of priors must match number of confidence predictions."; +} + +template +void MultiBoxLossLayer::Forward_cpu(const vector& bottom, + const vector& top) { + const Dtype* loc_data = bottom[0]->cpu_data(); + const Dtype* conf_data = bottom[1]->cpu_data(); + const Dtype* prior_data = bottom[2]->cpu_data(); + const Dtype* gt_data = bottom[3]->cpu_data(); + + // Retrieve all ground truth. + map > all_gt_bboxes; + GetGroundTruth(gt_data, num_gt_, background_label_id_, use_difficult_gt_, + &all_gt_bboxes); + + // Retrieve all prior bboxes. It is same within a batch since we assume all + // images in a batch are of same dimension. + vector prior_bboxes; + vector > prior_variances; + GetPriorBBoxes(prior_data, num_priors_, &prior_bboxes, &prior_variances); + + // Retrieve all predictions. + vector all_loc_preds; + GetLocPredictions(loc_data, num_, num_priors_, loc_classes_, share_location_, + &all_loc_preds); + + // Find matches between source bboxes and ground truth bboxes. + vector > > all_match_overlaps; + FindMatches(all_loc_preds, all_gt_bboxes, prior_bboxes, prior_variances, + multibox_loss_param_, &all_match_overlaps, &all_match_indices_); + + num_matches_ = 0; + int num_negs = 0; + // Sample hard negative (and positive) examples based on mining type. + MineHardExamples(*static_cast*>(bottom[1]), + all_loc_preds, all_gt_bboxes, prior_bboxes, + prior_variances, all_match_overlaps, multibox_loss_param_, + &num_matches_, &num_negs, &all_match_indices_, &all_neg_indices_); + + if (num_matches_ >= 1) { + // Form data to pass on to loc_loss_layer_. + vector loc_shape(2); + loc_shape[0] = 1; + loc_shape[1] = num_matches_ * 4; + loc_pred_.Reshape(loc_shape); + loc_gt_.Reshape(loc_shape); + Dtype* loc_pred_data = loc_pred_.mutable_cpu_data(); + Dtype* loc_gt_data = loc_gt_.mutable_cpu_data(); + EncodeLocPrediction(all_loc_preds, all_gt_bboxes, all_match_indices_, + prior_bboxes, prior_variances, multibox_loss_param_, + loc_pred_data, loc_gt_data); + loc_loss_layer_->Reshape(loc_bottom_vec_, loc_top_vec_); + loc_loss_layer_->Forward(loc_bottom_vec_, loc_top_vec_); + } else { + loc_loss_.mutable_cpu_data()[0] = 0; + } + + // Form data to pass on to conf_loss_layer_. + if (do_neg_mining_) { + num_conf_ = num_matches_ + num_negs; + } else { + num_conf_ = num_ * num_priors_; + } + if (num_conf_ >= 1) { + // Reshape the confidence data. + vector conf_shape; + if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_SOFTMAX) { + conf_shape.push_back(num_conf_); + conf_gt_.Reshape(conf_shape); + conf_shape.push_back(num_classes_); + conf_pred_.Reshape(conf_shape); + } else if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_LOGISTIC) { + conf_shape.push_back(1); + conf_shape.push_back(num_conf_); + conf_shape.push_back(num_classes_); + conf_gt_.Reshape(conf_shape); + conf_pred_.Reshape(conf_shape); + } else { + LOG(FATAL) << "Unknown confidence loss type."; + } + if (!do_neg_mining_) { + // Consider all scores. + // Share data and diff with bottom[1]. + CHECK_EQ(conf_pred_.count(), bottom[1]->count()); + conf_pred_.ShareData(*(bottom[1])); + } + Dtype* conf_pred_data = conf_pred_.mutable_cpu_data(); + Dtype* conf_gt_data = conf_gt_.mutable_cpu_data(); + caffe_set(conf_gt_.count(), Dtype(background_label_id_), conf_gt_data); + EncodeConfPrediction(conf_data, num_, num_priors_, multibox_loss_param_, + all_match_indices_, all_neg_indices_, all_gt_bboxes, + conf_pred_data, conf_gt_data); + conf_loss_layer_->Reshape(conf_bottom_vec_, conf_top_vec_); + conf_loss_layer_->Forward(conf_bottom_vec_, conf_top_vec_); + } else { + conf_loss_.mutable_cpu_data()[0] = 0; + } + + top[0]->mutable_cpu_data()[0] = 0; + if (this->layer_param_.propagate_down(0)) { + Dtype normalizer = LossLayer::GetNormalizer( + normalization_, num_, num_priors_, num_matches_); + top[0]->mutable_cpu_data()[0] += + loc_weight_ * loc_loss_.cpu_data()[0] / normalizer; + } + if (this->layer_param_.propagate_down(1)) { + Dtype normalizer = LossLayer::GetNormalizer( + normalization_, num_, num_priors_, num_matches_); + top[0]->mutable_cpu_data()[0] += conf_loss_.cpu_data()[0] / normalizer; + } +} + +template +void MultiBoxLossLayer::Backward_cpu(const vector& top, + const vector& propagate_down, + const vector& bottom) { + + if (propagate_down[2]) { + LOG(FATAL) << this->type() + << " Layer cannot backpropagate to prior inputs."; + } + if (propagate_down[3]) { + LOG(FATAL) << this->type() + << " Layer cannot backpropagate to label inputs."; + } + + // Back propagate on location prediction. + if (propagate_down[0]) { + Dtype* loc_bottom_diff = bottom[0]->mutable_cpu_diff(); + caffe_set(bottom[0]->count(), Dtype(0), loc_bottom_diff); + if (num_matches_ >= 1) { + vector loc_propagate_down; + // Only back propagate on prediction, not ground truth. + loc_propagate_down.push_back(true); + loc_propagate_down.push_back(false); + loc_loss_layer_->Backward(loc_top_vec_, loc_propagate_down, + loc_bottom_vec_); + // Scale gradient. + Dtype normalizer = LossLayer::GetNormalizer( + normalization_, num_, num_priors_, num_matches_); + Dtype loss_weight = top[0]->cpu_diff()[0] / normalizer; + caffe_scal(loc_pred_.count(), loss_weight, loc_pred_.mutable_cpu_diff()); + // Copy gradient back to bottom[0]. + const Dtype* loc_pred_diff = loc_pred_.cpu_diff(); + int count = 0; + for (int i = 0; i < num_; ++i) { + for (map >::iterator it = + all_match_indices_[i].begin(); + it != all_match_indices_[i].end(); ++it) { + const int label = share_location_ ? 0 : it->first; + const vector& match_index = it->second; + for (int j = 0; j < match_index.size(); ++j) { + if (match_index[j] <= -1) { + continue; + } + // Copy the diff to the right place. + int start_idx = loc_classes_ * 4 * j + label * 4; + caffe_copy(4, loc_pred_diff + count * 4, + loc_bottom_diff + start_idx); + ++count; + } + } + loc_bottom_diff += bottom[0]->offset(1); + } + } + } + + // Back propagate on confidence prediction. + if (propagate_down[1]) { + Dtype* conf_bottom_diff = bottom[1]->mutable_cpu_diff(); + caffe_set(bottom[1]->count(), Dtype(0), conf_bottom_diff); + if (num_conf_ >= 1) { + vector conf_propagate_down; + // Only back propagate on prediction, not ground truth. + conf_propagate_down.push_back(true); + conf_propagate_down.push_back(false); + conf_loss_layer_->Backward(conf_top_vec_, conf_propagate_down, + conf_bottom_vec_); + // Scale gradient. + Dtype normalizer = LossLayer::GetNormalizer( + normalization_, num_, num_priors_, num_matches_); + Dtype loss_weight = top[0]->cpu_diff()[0] / normalizer; + caffe_scal(conf_pred_.count(), loss_weight, + conf_pred_.mutable_cpu_diff()); + // Copy gradient back to bottom[1]. + const Dtype* conf_pred_diff = conf_pred_.cpu_diff(); + if (do_neg_mining_) { + int count = 0; + for (int i = 0; i < num_; ++i) { + // Copy matched (positive) bboxes scores' diff. + const map >& match_indices = all_match_indices_[i]; + for (map >::const_iterator it = + match_indices.begin(); it != match_indices.end(); ++it) { + const vector& match_index = it->second; + CHECK_EQ(match_index.size(), num_priors_); + for (int j = 0; j < num_priors_; ++j) { + if (match_index[j] <= -1) { + continue; + } + // Copy the diff to the right place. + caffe_copy(num_classes_, + conf_pred_diff + count * num_classes_, + conf_bottom_diff + j * num_classes_); + ++count; + } + } + // Copy negative bboxes scores' diff. + for (int n = 0; n < all_neg_indices_[i].size(); ++n) { + int j = all_neg_indices_[i][n]; + CHECK_LT(j, num_priors_); + caffe_copy(num_classes_, + conf_pred_diff + count * num_classes_, + conf_bottom_diff + j * num_classes_); + ++count; + } + conf_bottom_diff += bottom[1]->offset(1); + } + } else { + // The diff is already computed and stored. + bottom[1]->ShareDiff(conf_pred_); + } + } + } + + // After backward, remove match statistics. + all_match_indices_.clear(); + all_neg_indices_.clear(); +} + +INSTANTIATE_CLASS_FB(MultiBoxLossLayer); +REGISTER_LAYER_CLASS(MultiBoxLoss); + +} // namespace caffe diff --git a/src/caffe/layers/normalize_layer.cpp b/src/caffe/layers/normalize_layer.cpp new file mode 100644 index 00000000000..2168f28dea6 --- /dev/null +++ b/src/caffe/layers/normalize_layer.cpp @@ -0,0 +1,229 @@ +#include + +#include "caffe/filler.hpp" +#include "caffe/layers/normalize_layer.hpp" + +namespace caffe { + +template +void NormalizeLayer::LayerSetUp(const vector& bottom, + const vector& top) { + CHECK_GE(bottom[0]->num_axes(), 2) + << "Number of axes of bottom blob must be >=2."; + buffer_.Reshape(1, bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + buffer_channel_.Reshape(1, bottom[0]->channels(), 1, 1); + buffer_spatial_.Reshape(1, 1, bottom[0]->height(), bottom[0]->width()); + NormalizeParameter norm_param = this->layer_param().norm_param(); + across_spatial_ = norm_param.across_spatial(); + if (across_spatial_) { + norm_.Reshape(bottom[0]->num(), 1, 1, 1); + } else { + norm_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); + } + eps_ = norm_param.eps(); + int channels = bottom[0]->channels(); + int spatial_dim = bottom[0]->width() * bottom[0]->height(); + sum_channel_multiplier_.Reshape(1, channels, 1, 1); + caffe_set(channels, Dtype(1), sum_channel_multiplier_.mutable_cpu_data()); + sum_spatial_multiplier_.Reshape( + 1, 1, bottom[0]->height(), bottom[0]->width()); + caffe_set(spatial_dim, Dtype(1), sum_spatial_multiplier_.mutable_cpu_data()); + channel_shared_ = norm_param.channel_shared(); + if (this->blobs_.size() > 0) { + LOG(INFO) << "Skipping parameter initialization"; + } else { + this->blobs_.resize(1); + if (channel_shared_) { + this->blobs_[0] = Blob::create(vector(0)); + } else { + this->blobs_[0] = Blob::create(vector(1, channels)); + } + shared_ptr > scale_filler; + if (norm_param.has_scale_filler()) { + scale_filler.reset(GetFiller(norm_param.scale_filler())); + } else { + FillerParameter filler_param; + filler_param.set_type("constant"); + filler_param.set_value(1.0); + scale_filler.reset(GetFiller(filler_param)); + } + scale_filler->Fill(this->blobs_[0].get()); + } + if (channel_shared_) { + CHECK_EQ(this->blobs_[0]->count(), 1) + << "Scale size is inconsistent with prototxt config"; + } else { + CHECK_EQ(this->blobs_[0]->count(), channels) + << "Scale size is inconsistent with prototxt config"; + } + this->param_propagate_down_.resize(this->blobs_.size(), true); +} + +template +void NormalizeLayer::Reshape(const vector& bottom, + const vector& top) { + CHECK_GE(bottom[0]->num_axes(), 2) + << "Number of axes of bottom blob must be >=2."; + top[0]->ReshapeLike(*bottom[0]); + buffer_.Reshape(1, bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + if (!across_spatial_) { + norm_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); + } + int spatial_dim = bottom[0]->height() * bottom[0]->width(); + if (spatial_dim != sum_spatial_multiplier_.count()) { + sum_spatial_multiplier_.Reshape( + 1, 1, bottom[0]->height(), bottom[0]->width()); + caffe_set(spatial_dim, Dtype(1), + sum_spatial_multiplier_.mutable_cpu_data()); + buffer_spatial_.Reshape(1, 1, bottom[0]->height(), bottom[0]->width()); + } +} + +template +void NormalizeLayer::Forward_cpu(const vector& bottom, + const vector& top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); + const Dtype* scale = this->blobs_[0]->template cpu_data(); + Dtype* buffer_data = buffer_.mutable_cpu_data(); + Dtype* norm_data = norm_.mutable_cpu_data(); + // add eps to avoid overflow + caffe_set(norm_.count(), Dtype(eps_), norm_data); + const Dtype* sum_channel_multiplier = sum_channel_multiplier_.cpu_data(); + const Dtype* sum_spatial_multiplier = sum_spatial_multiplier_.cpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / num; + int spatial_dim = bottom[0]->height() * bottom[0]->width(); + int channels = bottom[0]->channels(); + for (int n = 0; n < num; ++n) { + caffe_sqr(dim, bottom_data, buffer_data); + if (across_spatial_) { + // add eps to avoid overflow + norm_data[n] = pow(Dtype(caffe_cpu_asum(dim, buffer_data)+eps_), + Dtype(0.5)); + caffe_cpu_scale(dim, Dtype(1.0 / norm_data[n]), bottom_data, + top_data); + } else { + caffe_cpu_gemv(CblasTrans, channels, spatial_dim, Dtype(1), + buffer_data, sum_channel_multiplier, Dtype(1), + norm_data); + // compute norm + caffe_powx(spatial_dim, norm_data, Dtype(0.5), norm_data); + // scale the layer + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, Dtype(1), sum_channel_multiplier, norm_data, + Dtype(0), buffer_data); + caffe_div(dim, bottom_data, buffer_data, top_data); + norm_data += spatial_dim; + } + // scale the output + if (channel_shared_) { + caffe_scal(dim, scale[0], top_data); + } else { + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, Dtype(1), scale, sum_spatial_multiplier, + Dtype(0), + buffer_data); + caffe_mul(dim, top_data, buffer_data, top_data); + } + bottom_data += dim; + top_data += dim; + } +} + +template +void NormalizeLayer::Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* top_data = top[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const Dtype* scale = this->blobs_[0]->template cpu_data(); + const Dtype* norm_data = norm_.cpu_data(); + Dtype* buffer_data = buffer_.mutable_cpu_data(); + Dtype* buffer_channel = buffer_channel_.mutable_cpu_data(); + Dtype* buffer_spatial = buffer_spatial_.mutable_cpu_data(); + const Dtype* sum_channel_multiplier = sum_channel_multiplier_.cpu_data(); + const Dtype* sum_spatial_multiplier = sum_spatial_multiplier_.cpu_data(); + int count = top[0]->count(); + int num = top[0]->num(); + int dim = count / num; + int spatial_dim = top[0]->height() * top[0]->width(); + int channels = top[0]->channels(); + + // Propagate to param + if (this->param_propagate_down_[0]) { + Dtype* scale_diff = this->blobs_[0]->template mutable_cpu_diff(); + if (channel_shared_) { + scale_diff[0] += + caffe_cpu_dot(count, top_data, top_diff) / scale[0]; + } else { + for (int n = 0; n < num; ++n) { + caffe_mul(dim, top_data+n*dim, top_diff+n*dim, buffer_data); + caffe_cpu_gemv(CblasNoTrans, channels, spatial_dim, Dtype(1), + buffer_data, sum_spatial_multiplier, Dtype(0), + buffer_channel); + // store a / scale[i] in buffer_data temporary + caffe_div(channels, buffer_channel, scale, buffer_channel); + caffe_add(channels, buffer_channel, scale_diff, scale_diff); + } + } + } + + // Propagate to bottom + if (propagate_down[0]) { + for (int n = 0; n < num; ++n) { + if (across_spatial_) { + Dtype a = caffe_cpu_dot(dim, bottom_data, top_diff); + caffe_cpu_scale(dim, Dtype(a / norm_data[n] / norm_data[n]), + bottom_data, bottom_diff); + caffe_sub(dim, top_diff, bottom_diff, bottom_diff); + caffe_scal(dim, Dtype(1.0 / norm_data[n]), bottom_diff); + } else { + // dot product between bottom_data and top_diff + caffe_mul(dim, bottom_data, top_diff, buffer_data); + caffe_cpu_gemv(CblasTrans, channels, spatial_dim, Dtype(1), + buffer_data, sum_channel_multiplier, Dtype(0), + buffer_spatial); + // scale bottom_diff + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, Dtype(1), sum_channel_multiplier, + buffer_spatial, Dtype(0), buffer_data); + caffe_mul(dim, bottom_data, buffer_data, bottom_diff); + // divide by square of norm + caffe_powx(spatial_dim, norm_data, Dtype(2), buffer_spatial); + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, Dtype(1), sum_channel_multiplier, + buffer_spatial, Dtype(0), buffer_data); + caffe_div(dim, bottom_diff, buffer_data, bottom_diff); + // subtract + caffe_sub(dim, top_diff, bottom_diff, bottom_diff); + // divide by norm + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, Dtype(1), sum_channel_multiplier, norm_data, + Dtype(0), buffer_data); + caffe_div(dim, bottom_diff, buffer_data, bottom_diff); + norm_data += spatial_dim; + } + // scale the diff + if (channel_shared_) { + caffe_scal(dim, scale[0], bottom_diff); + } else { + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, Dtype(1), scale, sum_spatial_multiplier, + Dtype(0), buffer_data); + caffe_mul(dim, bottom_diff, buffer_data, bottom_diff); + } + bottom_data += dim; + top_diff += dim; + bottom_diff += dim; + } + } +} + +INSTANTIATE_CLASS_FB(NormalizeLayer); +REGISTER_LAYER_CLASS(Normalize); + +} // namespace caffe diff --git a/src/caffe/layers/normalize_layer.cu b/src/caffe/layers/normalize_layer.cu new file mode 100644 index 00000000000..37a78a15336 --- /dev/null +++ b/src/caffe/layers/normalize_layer.cu @@ -0,0 +1,220 @@ +#include +#include +#include + +#include "thrust/device_vector.h" + +#include "caffe/filler.hpp" +#include "caffe/layers/normalize_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +// divid a matrix with vector +template +__global__ void DivBsx(const int nthreads, const Dtype* A, + const Dtype* v, const int rows, const int cols, const CBLAS_TRANSPOSE trans, + Dtype* B) { + CUDA_KERNEL_LOOP(index, nthreads) { + int c = index % cols; + int r = (index / cols) % rows; + if (trans == CblasNoTrans) { + B[index] = A[index] / v[c]; + } else { + B[index] = A[index] / v[r]; + } + } +} + +template +__global__ void MulBsx(const int nthreads, const Dtype* A, + const Dtype* v, const int rows, const int cols, const CBLAS_TRANSPOSE trans, + Dtype* B) { + CUDA_KERNEL_LOOP(index, nthreads) { + int c = index % cols; + int r = (index / cols) % rows; + if (trans == CblasNoTrans) { + B[index] = A[index] * v[c]; + } else { + B[index] = A[index] * v[r]; + } + } +} + +template +void NormalizeLayer::Forward_gpu(const vector& bottom, + const vector& top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); + Dtype* buffer_data = buffer_.mutable_gpu_data(); + Dtype* norm_data; + if (across_spatial_) { + // need to index it + norm_data = norm_.mutable_cpu_data(); + } else { + norm_data = norm_.mutable_gpu_data(); + // add eps to avoid overflow + caffe_gpu_set(norm_.count(), Dtype(eps_), norm_data); + } + const Dtype* scale; + if (channel_shared_) { + scale = this->blobs_[0]->template cpu_data(); + } else { + scale = this->blobs_[0]->template gpu_data(); + } + const Dtype* sum_channel_multiplier = sum_channel_multiplier_.gpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / num; + int spatial_dim = bottom[0]->height() * bottom[0]->width(); + int channels = bottom[0]->channels(); + for (int n = 0; n < num; ++n) { + caffe_gpu_powx(dim, bottom_data, Dtype(2), buffer_data); + if (across_spatial_) { + Dtype normsqr; + caffe_gpu_asum(dim, buffer_data, &normsqr, 0); + // add eps to avoid overflow + norm_data[n] = pow(normsqr+eps_, Dtype(0.5)); + caffe_gpu_scale(dim, Dtype(1.0 / norm_data[n]), bottom_data, + top_data); + } else { + // compute norm + caffe_gpu_gemv(CblasTrans, channels, spatial_dim, Dtype(1), + buffer_data, sum_channel_multiplier, Dtype(1), + norm_data); + caffe_gpu_powx(spatial_dim, norm_data, Dtype(0.5), norm_data); + // scale the layer + // NOLINT_NEXT_LINE(whitespace/operators) + DivBsx <<>>( + dim, bottom_data, norm_data, channels, spatial_dim, CblasNoTrans, + top_data); + CUDA_POST_KERNEL_CHECK; + norm_data += spatial_dim; + } + // scale the output + if (channel_shared_) { + caffe_gpu_scal(dim, scale[0], top_data); + } else { + // NOLINT_NEXT_LINE(whitespace/operators) + MulBsx <<>>( + dim, top_data, scale, channels, spatial_dim, CblasTrans, + top_data); + CUDA_POST_KERNEL_CHECK; + } + bottom_data += dim; + top_data += dim; + } +} + +template +void NormalizeLayer::Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* bottom_data = bottom[0]->mutable_gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const Dtype* norm_data; + if (across_spatial_) { + // need to index it + norm_data = norm_.cpu_data(); + } else { + norm_data = norm_.gpu_data(); + } + const Dtype* scale; + if (channel_shared_) { + scale = this->blobs_[0]->template cpu_data(); + } else { + scale = this->blobs_[0]->template gpu_data(); + } + Dtype* buffer_data = buffer_.mutable_gpu_data(); + Dtype* buffer_channel = buffer_channel_.mutable_gpu_data(); + Dtype* buffer_spatial = buffer_spatial_.mutable_gpu_data(); + const Dtype* sum_channel_multiplier = sum_channel_multiplier_.gpu_data(); + const Dtype* sum_spatial_multiplier = sum_spatial_multiplier_.gpu_data(); + int count = top[0]->count(); + int num = top[0]->num(); + int dim = count / num; + int spatial_dim = top[0]->height() * top[0]->width(); + int channels = top[0]->channels(); + + // Propagate to param + if (this->param_propagate_down_[0]) { + if (channel_shared_) { + Dtype* scale_diff = this->blobs_[0]->template mutable_cpu_diff(); + Dtype a; + caffe_gpu_dot(count, top_data, top_diff, &a); + scale_diff[0] += a / scale[0]; + } else { + Dtype* scale_diff = this->blobs_[0]->template mutable_gpu_diff(); + for (int n = 0; n < num; ++n) { + // compute a + caffe_gpu_mul(dim, top_data+n*dim, top_diff+n*dim, buffer_data); + caffe_gpu_gemv(CblasNoTrans, channels, spatial_dim, Dtype(1), + buffer_data, sum_spatial_multiplier, Dtype(0), + buffer_channel); + // store a / scale[i] in buffer_data temporary + caffe_gpu_div(channels, buffer_channel, scale, buffer_channel); + caffe_gpu_add(channels, buffer_channel, scale_diff, scale_diff); + } + } + } + + // Propagate to bottom + if (propagate_down[0]) { + for (int n = 0; n < num; ++n) { + if (across_spatial_) { + Dtype a; + caffe_gpu_dot(dim, bottom_data, top_diff, &a); + caffe_gpu_scale(dim, Dtype(a / norm_data[n] / norm_data[n]), + bottom_data, bottom_diff); + caffe_gpu_sub(dim, top_diff, bottom_diff, bottom_diff); + caffe_gpu_scale(dim, Dtype(1.0 / norm_data[n]), bottom_diff, + bottom_diff); + } else { + // dot product between bottom_data and top_diff + caffe_gpu_mul(dim, bottom_data, top_diff, buffer_data); + caffe_gpu_gemv(CblasTrans, channels, spatial_dim, Dtype(1), + buffer_data, sum_channel_multiplier, Dtype(0), + buffer_spatial); + // scale botom_diff + // NOLINT_NEXT_LINE(whitespace/operators) + MulBsx <<>>( + dim, bottom_data, buffer_spatial, channels, spatial_dim, + CblasNoTrans, bottom_diff); + CUDA_POST_KERNEL_CHECK; + // divide by square of norm + caffe_gpu_powx(spatial_dim, norm_data, Dtype(2), buffer_spatial); + // NOLINT_NEXT_LINE(whitespace/operators) + DivBsx <<>>( + dim, bottom_diff, buffer_spatial, channels, spatial_dim, + CblasNoTrans, bottom_diff); + CUDA_POST_KERNEL_CHECK; + caffe_gpu_sub(dim, top_diff, bottom_diff, bottom_diff); + // divide by norm + // NOLINT_NEXT_LINE(whitespace/operators) + DivBsx <<>>( + dim, bottom_diff, norm_data, channels, spatial_dim, CblasNoTrans, + bottom_diff); + CUDA_POST_KERNEL_CHECK; + norm_data += spatial_dim; + } + // scale the diff + if (channel_shared_) { + caffe_gpu_scal(dim, scale[0], bottom_diff); + } else { + // NOLINT_NEXT_LINE(whitespace/operators) + MulBsx <<>>( + dim, bottom_diff, scale, channels, spatial_dim, CblasTrans, + bottom_diff); + CUDA_POST_KERNEL_CHECK; + } + bottom_data += dim; + top_diff += dim; + bottom_diff += dim; + } + } +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(NormalizeLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/permute_layer.cpp b/src/caffe/layers/permute_layer.cpp new file mode 100644 index 00000000000..58cd496bf67 --- /dev/null +++ b/src/caffe/layers/permute_layer.cpp @@ -0,0 +1,139 @@ +#include + +#include "caffe/layers/permute_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void Permute(const int count, Dtype* bottom_data, const bool forward, + const int* permute_order, const int* old_steps, const int* new_steps, + const int num_axes, Dtype* top_data) { + for (int i = 0; i < count; ++i) { + int old_idx = 0; + int idx = i; + for (int j = 0; j < num_axes; ++j) { + int order = permute_order[j]; + old_idx += (idx / new_steps[j]) * old_steps[order]; + idx %= new_steps[j]; + } + if (forward) { + top_data[i] = bottom_data[old_idx]; + } else { + bottom_data[old_idx] = top_data[i]; + } + } +} + + +template +void PermuteLayer::LayerSetUp(const vector& bottom, + const vector& top) { + PermuteParameter permute_param = this->layer_param_.permute_param(); + CHECK_EQ(bottom.size(), 1); + num_axes_ = bottom[0]->num_axes(); + vector orders; + // Push the specified new orders. + for (int i = 0; i < permute_param.order_size(); ++i) { + int order = permute_param.order(i); + CHECK_LT(order, num_axes_) + << "order should be less than the input dimension."; + if (std::find(orders.begin(), orders.end(), order) != orders.end()) { + LOG(FATAL) << "there are duplicate orders"; + } + orders.push_back(order); + } + // Push the rest orders. And save original step sizes for each axis. + for (int i = 0; i < num_axes_; ++i) { + if (std::find(orders.begin(), orders.end(), i) == orders.end()) { + orders.push_back(i); + } + } + CHECK_EQ(num_axes_, orders.size()); + // Check if we need to reorder the data or keep it. + need_permute_ = false; + for (int i = 0; i < num_axes_; ++i) { + if (orders[i] != i) { + // As long as there is one order which is different from the natural order + // of the data, we need to permute. Otherwise, we share the data and diff. + need_permute_ = true; + break; + } + } + + vector top_shape(num_axes_, 1); + permute_order_.Reshape(num_axes_, 1, 1, 1); + old_steps_.Reshape(num_axes_, 1, 1, 1); + new_steps_.Reshape(num_axes_, 1, 1, 1); + for (int i = 0; i < num_axes_; ++i) { + permute_order_.mutable_cpu_data()[i] = orders[i]; + top_shape[i] = bottom[0]->shape(orders[i]); + } + top[0]->Reshape(top_shape); +} + +template +void PermuteLayer::Reshape(const vector& bottom, + const vector& top) { + vector top_shape; + for (int i = 0; i < num_axes_; ++i) { + if (i == num_axes_ - 1) { + old_steps_.mutable_cpu_data()[i] = 1; + } else { + old_steps_.mutable_cpu_data()[i] = bottom[0]->count(i + 1); + } + top_shape.push_back(bottom[0]->shape(permute_order_.cpu_data()[i])); + } + top[0]->Reshape(top_shape); + + for (int i = 0; i < num_axes_; ++i) { + if (i == num_axes_ - 1) { + new_steps_.mutable_cpu_data()[i] = 1; + } else { + new_steps_.mutable_cpu_data()[i] = top[0]->count(i + 1); + } + } +} + +template +void PermuteLayer::Forward_cpu(const vector& bottom, + const vector& top) { + if (need_permute_) { + Dtype* bottom_data = bottom[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); + const int top_count = top[0]->count(); + const int* permute_order = permute_order_.cpu_data(); + const int* old_steps = old_steps_.cpu_data(); + const int* new_steps = new_steps_.cpu_data(); + bool forward = true; + Permute(top_count, bottom_data, forward, permute_order, old_steps, + new_steps, num_axes_, top_data); + } else { + // If there is no need to permute, we share data to save memory. + top[0]->ShareData(*bottom[0]); + } +} + +template +void PermuteLayer::Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + if (need_permute_) { + Dtype* top_diff = top[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const int top_count = top[0]->count(); + const int* permute_order = permute_order_.cpu_data(); + const int* old_steps = old_steps_.cpu_data(); + const int* new_steps = new_steps_.cpu_data(); + bool forward = false; + Permute(top_count, bottom_diff, forward, permute_order, old_steps, + new_steps, num_axes_, top_diff); + } else { + // If there is no need to permute, we share diff to save memory. + bottom[0]->ShareDiff(*top[0]); + } +} + +INSTANTIATE_CLASS_FB(PermuteLayer); +REGISTER_LAYER_CLASS(Permute); + +} // namespace caffe diff --git a/src/caffe/layers/permute_layer.cu b/src/caffe/layers/permute_layer.cu new file mode 100644 index 00000000000..c63f4fa75e6 --- /dev/null +++ b/src/caffe/layers/permute_layer.cu @@ -0,0 +1,78 @@ +#include +#include +#include + +#include "caffe/layers/permute_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +__global__ void PermuteKernel(const int nthreads, + Dtype* const bottom_data, const bool forward, const int* permute_order, + const int* old_steps, const int* new_steps, const int num_axes, + Dtype* const top_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + int temp_idx = index; + int old_idx = 0; + for (int i = 0; i < num_axes; ++i) { + int order = permute_order[i]; + old_idx += (temp_idx / new_steps[i]) * old_steps[order]; + temp_idx %= new_steps[i]; + } + if (forward) { + top_data[index] = bottom_data[old_idx]; + } else { + bottom_data[old_idx] = top_data[index]; + } + } +} + +template +void PermuteLayer::Forward_gpu(const vector& bottom, + const vector& top) { + if (need_permute_) { + Dtype* bottom_data = bottom[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); + int count = top[0]->count(); + const int* permute_order = permute_order_.gpu_data(); + const int* new_steps = new_steps_.gpu_data(); + const int* old_steps = old_steps_.gpu_data(); + bool foward = true; + // NOLINT_NEXT_LINE(whitespace/operators) + PermuteKernel<<>>( + count, bottom_data, foward, permute_order, old_steps, new_steps, + num_axes_, top_data); + CUDA_POST_KERNEL_CHECK; + } else { + // If there is no need to permute, we share data to save memory. + top[0]->ShareData(*bottom[0]); + } +} + + +template +void PermuteLayer::Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + if (need_permute_) { + Dtype* top_diff = top[0]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); + const int* permute_order = permute_order_.gpu_data(); + const int* new_steps = new_steps_.gpu_data(); + const int* old_steps = old_steps_.gpu_data(); + bool foward = false; + // NOLINT_NEXT_LINE(whitespace/operators) + PermuteKernel<<>>( + count, bottom_diff, foward, permute_order, old_steps, new_steps, + num_axes_, top_diff); + CUDA_POST_KERNEL_CHECK; + } else { + // If there is no need to permute, we share diff to save memory. + bottom[0]->ShareDiff(*top[0]); + } +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(PermuteLayer); + +} // namespace caffe diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 6611f5b73b8..8dff65ba8c4 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -118,7 +118,7 @@ void PoolingLayer::Reshape(const vector& bottom, // If stochastic pooling, we will initialize the random index part. if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_STOCHASTIC) { - rand_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, + rand_idx_->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); } } diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 57c05d564ac..a87e9bd76ce 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -87,7 +87,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int kernel_h, const int kernel_w, const int stride_h, - const int stride_w, float* const rand_idx, Ftype* const top_data) { + const int stride_w, Ftype* const rand_idx, Ftype* const top_data) { CUDA_KERNEL_LOOP(index, nthreads) { const int pw = index % pooled_width; const int ph = (index / pooled_width) % pooled_height; @@ -97,7 +97,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, const int hend = min(hstart + kernel_h, height); const int wstart = pw * stride_w; const int wend = min(wstart + kernel_w, width); - float cumsum = 0.; + float cumsum = 0.F; const Ftype* const bottom_slice = bottom_data + (n * channels + c) * height * width; // First pass: get sum @@ -106,7 +106,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, cumsum += bottom_slice[h * width + w]; } } - const float thres = rand_idx[index] * cumsum; + const Ftype thres = rand_idx[index] * cumsum; // Second pass: get value, and set index. cumsum = 0; for (int h = hstart; h < hend; ++h) { @@ -190,15 +190,14 @@ void PoolingLayer::Forward_gpu(const vector& bottom, case PoolingParameter_PoolMethod_STOCHASTIC: if (this->phase_ == TRAIN) { // We need to create the random index as well. - caffe_gpu_rng_uniform(count, 0.F, 1.F, - rand_idx_.mutable_gpu_data()); + caffe_gpu_rng_uniform(count, Ftype(0), Ftype(1), rand_idx_->mutable_gpu_data()); // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTrain<<>>( count, bottom_data, bottom[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, - rand_idx_.mutable_gpu_data(), top[0]->mutable_gpu_data()); + rand_idx_->mutable_gpu_data(), top[0]->mutable_gpu_data()); } else { // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTest<< __global__ void StoPoolBackward(const int nthreads, - const float* const rand_idx, const Btype* const top_diff, + const Btype* const rand_idx, const Btype* const top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int kernel_h, const int kernel_w, const int stride_h, @@ -319,8 +318,8 @@ __global__ void StoPoolBackward(const int nthreads, const int phend = min(h / stride_h + 1, pooled_height); const int pwstart = (w < kernel_w) ? 0 : (w - kernel_w) / stride_w + 1; const int pwend = min(w / stride_w + 1, pooled_width); - float gradient = 0; - const float* const rand_idx_slice = + float gradient = 0.F; + const Btype* const rand_idx_slice = rand_idx + (n * channels + c) * pooled_height * pooled_width; const Btype* const top_diff_slice = top_diff + (n * channels + c) * pooled_height * pooled_width; @@ -378,7 +377,7 @@ void PoolingLayer::Backward_gpu(const vector& top, case PoolingParameter_PoolMethod_STOCHASTIC: // NOLINT_NEXT_LINE(whitespace/operators) StoPoolBackward<<>>( - count, rand_idx_.gpu_data(), top_diff, + count, rand_idx_->gpu_data(), top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, bottom_diff); diff --git a/src/caffe/layers/prior_box_layer.cpp b/src/caffe/layers/prior_box_layer.cpp new file mode 100644 index 00000000000..b557a99e879 --- /dev/null +++ b/src/caffe/layers/prior_box_layer.cpp @@ -0,0 +1,224 @@ +#include +#include +#include +#include + +#include "caffe/layers/prior_box_layer.hpp" + +namespace caffe { + +template +void PriorBoxLayer::LayerSetUp(const vector& bottom, + const vector& top) { + const PriorBoxParameter& prior_box_param = + this->layer_param_.prior_box_param(); + CHECK_GT(prior_box_param.min_size_size(), 0) << "must provide min_size."; + for (int i = 0; i < prior_box_param.min_size_size(); ++i) { + min_sizes_.push_back(prior_box_param.min_size(i)); + CHECK_GT(min_sizes_.back(), 0) << "min_size must be positive."; + } + aspect_ratios_.clear(); + aspect_ratios_.push_back(1.); + flip_ = prior_box_param.flip(); + for (int i = 0; i < prior_box_param.aspect_ratio_size(); ++i) { + float ar = prior_box_param.aspect_ratio(i); + bool already_exist = false; + for (int j = 0; j < aspect_ratios_.size(); ++j) { + if (fabs(ar - aspect_ratios_[j]) < 1e-6) { + already_exist = true; + break; + } + } + if (!already_exist) { + aspect_ratios_.push_back(ar); + if (flip_) { + aspect_ratios_.push_back(1./ar); + } + } + } + num_priors_ = aspect_ratios_.size() * min_sizes_.size(); + if (prior_box_param.max_size_size() > 0) { + CHECK_EQ(prior_box_param.min_size_size(), prior_box_param.max_size_size()); + for (int i = 0; i < prior_box_param.max_size_size(); ++i) { + max_sizes_.push_back(prior_box_param.max_size(i)); + CHECK_GT(max_sizes_[i], min_sizes_[i]) + << "max_size must be greater than min_size."; + num_priors_ += 1; + } + } + clip_ = prior_box_param.clip(); + if (prior_box_param.variance_size() > 1) { + // Must and only provide 4 variance. + CHECK_EQ(prior_box_param.variance_size(), 4); + for (int i = 0; i < prior_box_param.variance_size(); ++i) { + CHECK_GT(prior_box_param.variance(i), 0); + variance_.push_back(prior_box_param.variance(i)); + } + } else if (prior_box_param.variance_size() == 1) { + CHECK_GT(prior_box_param.variance(0), 0); + variance_.push_back(prior_box_param.variance(0)); + } else { + // Set default to 0.1. + variance_.push_back(0.1); + } + + if (prior_box_param.has_img_h() || prior_box_param.has_img_w()) { + CHECK(!prior_box_param.has_img_size()) + << "Either img_size or img_h/img_w should be specified; not both."; + img_h_ = prior_box_param.img_h(); + CHECK_GT(img_h_, 0) << "img_h should be larger than 0."; + img_w_ = prior_box_param.img_w(); + CHECK_GT(img_w_, 0) << "img_w should be larger than 0."; + } else if (prior_box_param.has_img_size()) { + const int img_size = prior_box_param.img_size(); + CHECK_GT(img_size, 0) << "img_size should be larger than 0."; + img_h_ = img_size; + img_w_ = img_size; + } else { + img_h_ = 0; + img_w_ = 0; + } + + if (prior_box_param.has_step_h() || prior_box_param.has_step_w()) { + CHECK(!prior_box_param.has_step()) + << "Either step or step_h/step_w should be specified; not both."; + step_h_ = prior_box_param.step_h(); + CHECK_GT(step_h_, 0.) << "step_h should be larger than 0."; + step_w_ = prior_box_param.step_w(); + CHECK_GT(step_w_, 0.) << "step_w should be larger than 0."; + } else if (prior_box_param.has_step()) { + const float step = prior_box_param.step(); + CHECK_GT(step, 0) << "step should be larger than 0."; + step_h_ = step; + step_w_ = step; + } else { + step_h_ = 0; + step_w_ = 0; + } + + offset_ = prior_box_param.offset(); +} + +template +void PriorBoxLayer::Reshape(const vector& bottom, + const vector& top) { + const int layer_width = bottom[0]->width(); + const int layer_height = bottom[0]->height(); + vector top_shape(3, 1); + // Since all images in a batch has same height and width, we only need to + // generate one set of priors which can be shared across all images. + top_shape[0] = 1; + // 2 channels. First channel stores the mean of each prior coordinate. + // Second channel stores the variance of each prior coordinate. + top_shape[1] = 2; + top_shape[2] = layer_width * layer_height * num_priors_ * 4; + CHECK_GT(top_shape[2], 0); + top[0]->Reshape(top_shape); +} + +template +void PriorBoxLayer::Forward_cpu(const vector& bottom, + const vector& top) { + const int layer_width = bottom[0]->width(); + const int layer_height = bottom[0]->height(); + int img_width, img_height; + if (img_h_ == 0 || img_w_ == 0) { + img_width = bottom[1]->width(); + img_height = bottom[1]->height(); + } else { + img_width = img_w_; + img_height = img_h_; + } + float step_w, step_h; + if (step_w_ == 0 || step_h_ == 0) { + step_w = static_cast(img_width) / layer_width; + step_h = static_cast(img_height) / layer_height; + } else { + step_w = step_w_; + step_h = step_h_; + } + Ftype* top_data = top[0]->mutable_cpu_data(); + int dim = layer_height * layer_width * num_priors_ * 4; + int idx = 0; + for (int h = 0; h < layer_height; ++h) { + for (int w = 0; w < layer_width; ++w) { + float center_x = (w + offset_) * step_w; + float center_y = (h + offset_) * step_h; + float box_width, box_height; + for (int s = 0; s < min_sizes_.size(); ++s) { + int min_size_ = min_sizes_[s]; + // first prior: aspect_ratio = 1, size = min_size + box_width = box_height = min_size_; + // xmin + top_data[idx++] = (center_x - box_width / 2.) / img_width; + // ymin + top_data[idx++] = (center_y - box_height / 2.) / img_height; + // xmax + top_data[idx++] = (center_x + box_width / 2.) / img_width; + // ymax + top_data[idx++] = (center_y + box_height / 2.) / img_height; + + if (max_sizes_.size() > 0) { + CHECK_EQ(min_sizes_.size(), max_sizes_.size()); + int max_size_ = max_sizes_[s]; + // second prior: aspect_ratio = 1, size = sqrt(min_size * max_size) + box_width = box_height = sqrt(min_size_ * max_size_); + // xmin + top_data[idx++] = (center_x - box_width / 2.) / img_width; + // ymin + top_data[idx++] = (center_y - box_height / 2.) / img_height; + // xmax + top_data[idx++] = (center_x + box_width / 2.) / img_width; + // ymax + top_data[idx++] = (center_y + box_height / 2.) / img_height; + } + + // rest of priors + for (int r = 0; r < aspect_ratios_.size(); ++r) { + float ar = aspect_ratios_[r]; + if (fabs(ar - 1.) < 1e-6) { + continue; + } + box_width = min_size_ * sqrt(ar); + box_height = min_size_ / sqrt(ar); + // xmin + top_data[idx++] = (center_x - box_width / 2.) / img_width; + // ymin + top_data[idx++] = (center_y - box_height / 2.) / img_height; + // xmax + top_data[idx++] = (center_x + box_width / 2.) / img_width; + // ymax + top_data[idx++] = (center_y + box_height / 2.) / img_height; + } + } + } + } + // clip the prior's coordidate such that it is within [0, 1] + if (clip_) { + for (int d = 0; d < dim; ++d) { + top_data[d] = std::min(std::max(top_data[d], 0.), 1.); + } + } + // set the variance. + top_data += top[0]->offset(0, 1); + if (variance_.size() == 1) { + caffe_set(dim, Dtype(variance_[0]), top_data); + } else { + int count = 0; + for (int h = 0; h < layer_height; ++h) { + for (int w = 0; w < layer_width; ++w) { + for (int i = 0; i < num_priors_; ++i) { + for (int j = 0; j < 4; ++j) { + top_data[count] = variance_[j]; + ++count; + } + } + } + } + } +} + +INSTANTIATE_CLASS_FB(PriorBoxLayer); +REGISTER_LAYER_CLASS(PriorBox); + +} // namespace caffe diff --git a/src/caffe/layers/recurrent_layer.cpp b/src/caffe/layers/recurrent_layer.cpp new file mode 100644 index 00000000000..75ac19c0ba0 --- /dev/null +++ b/src/caffe/layers/recurrent_layer.cpp @@ -0,0 +1,297 @@ +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/recurrent_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void RecurrentLayer::LayerSetUp(const vector& bottom, + const vector& top) { + CHECK_GE(bottom[0]->num_axes(), 2) + << "bottom[0] must have at least 2 axes -- (#timesteps, #streams, ...)"; + T_ = bottom[0]->shape(0); + N_ = bottom[0]->shape(1); + LOG(INFO) << "Initializing recurrent layer: assuming input batch contains " + << T_ << " timesteps of " << N_ << " independent streams."; + + CHECK_EQ(bottom[1]->num_axes(), 2) + << "bottom[1] must have exactly 2 axes -- (#timesteps, #streams)"; + CHECK_EQ(T_, bottom[1]->shape(0)); + CHECK_EQ(N_, bottom[1]->shape(1)); + + // If expose_hidden is set, we take as input and produce as output + // the hidden state blobs at the first and last timesteps. + expose_hidden_ = this->layer_param_.recurrent_param().expose_hidden(); + + // Get (recurrent) input/output names. + vector output_names; + OutputBlobNames(&output_names); + vector recur_input_names; + RecurrentInputBlobNames(&recur_input_names); + vector recur_output_names; + RecurrentOutputBlobNames(&recur_output_names); + const int num_recur_blobs = recur_input_names.size(); + CHECK_EQ(num_recur_blobs, recur_output_names.size()); + + // If provided, bottom[2] is a static input to the recurrent net. + const int num_hidden_exposed = expose_hidden_ * num_recur_blobs; + static_input_ = (bottom.size() > 2 + num_hidden_exposed); + if (static_input_) { + CHECK_GE(bottom[2]->num_axes(), 1); + CHECK_EQ(N_, bottom[2]->shape(0)); + } + + // Create a NetParameter; setup the inputs that aren't unique to particular + // recurrent architectures. + NetParameter net_param; + net_param.set_default_forward_type(tp()); + net_param.set_default_backward_type(tp()); + net_param.set_default_forward_math(tp()); + net_param.set_default_backward_math(tp()); + + LayerParameter* input_layer_param = net_param.add_layer(); + input_layer_param->set_type("Input"); + InputParameter* input_param = input_layer_param->mutable_input_param(); + input_layer_param->add_top("x"); + BlobShape input_shape; + for (int i = 0; i < bottom[0]->num_axes(); ++i) { + input_shape.add_dim(bottom[0]->shape(i)); + } + input_param->add_shape()->CopyFrom(input_shape); + + input_shape.Clear(); + for (int i = 0; i < bottom[1]->num_axes(); ++i) { + input_shape.add_dim(bottom[1]->shape(i)); + } + input_layer_param->add_top("cont"); + input_param->add_shape()->CopyFrom(input_shape); + + if (static_input_) { + input_shape.Clear(); + for (int i = 0; i < bottom[2]->num_axes(); ++i) { + input_shape.add_dim(bottom[2]->shape(i)); + } + input_layer_param->add_top("x_static"); + input_param->add_shape()->CopyFrom(input_shape); + } + + // Call the child's FillUnrolledNet implementation to specify the unrolled + // recurrent architecture. + this->FillUnrolledNet(&net_param); + + // Prepend this layer's name to the names of each layer in the unrolled net. + const string& layer_name = this->layer_param_.name(); + if (layer_name.size()) { + for (int i = 0; i < net_param.layer_size(); ++i) { + LayerParameter* layer = net_param.mutable_layer(i); + layer->set_name(layer_name + "_" + layer->name()); + } + } + + // Add "pseudo-losses" to all outputs to force backpropagation. + // (Setting force_backward is too aggressive as we may not need to backprop to + // all inputs, e.g., the sequence continuation indicators.) + vector pseudo_losses(output_names.size()); + for (int i = 0; i < output_names.size(); ++i) { + LayerParameter* layer = net_param.add_layer(); + pseudo_losses[i] = output_names[i] + "_pseudoloss"; + layer->set_name(pseudo_losses[i]); + layer->set_type("Reduction"); + layer->add_bottom(output_names[i]); + layer->add_top(pseudo_losses[i]); + layer->add_loss_weight(1); + } + + const size_t rank = this->parent_rank(); + // Create the unrolled net. + unrolled_net_.reset(new Net(net_param, rank, + nullptr, nullptr, nullptr, true)); + unrolled_net_->set_debug_info( + this->layer_param_.recurrent_param().debug_info()); + + // Setup pointers to the inputs. + x_input_blob_ = CHECK_NOTNULL(unrolled_net_->blob_by_name("x").get()); + cont_input_blob_ = CHECK_NOTNULL(unrolled_net_->blob_by_name("cont").get()); + if (static_input_) { + x_static_input_blob_ = + CHECK_NOTNULL(unrolled_net_->blob_by_name("x_static").get()); + } + + // Setup pointers to paired recurrent inputs/outputs. + recur_input_blobs_.resize(num_recur_blobs); + recur_output_blobs_.resize(num_recur_blobs); + for (int i = 0; i < recur_input_names.size(); ++i) { + recur_input_blobs_[i] = + CHECK_NOTNULL(unrolled_net_->blob_by_name(recur_input_names[i]).get()); + recur_output_blobs_[i] = + CHECK_NOTNULL(unrolled_net_->blob_by_name(recur_output_names[i]).get()); + } + + // Setup pointers to outputs. + CHECK_EQ(top.size() - num_hidden_exposed, output_names.size()) + << "OutputBlobNames must provide an output blob name for each top."; + output_blobs_.resize(output_names.size()); + for (int i = 0; i < output_names.size(); ++i) { + output_blobs_[i] = + CHECK_NOTNULL(unrolled_net_->blob_by_name(output_names[i]).get()); + } + + // We should have 2 inputs (x and cont), plus a number of recurrent inputs, + // plus maybe a static input. + CHECK_EQ(2 + num_recur_blobs + static_input_, + unrolled_net_->input_blobs().size()); + + // This layer's parameters are any parameters in the layers of the unrolled + // net. We only want one copy of each parameter, so check that the parameter + // is "owned" by the layer, rather than shared with another. + this->blobs_.clear(); + for (int i = 0; i < unrolled_net_->params().size(); ++i) { + if (unrolled_net_->param_owners()[i] == -1) { + LOG(INFO) << "Adding parameter " << i << ": " + << unrolled_net_->param_display_names()[i]; + this->blobs_.push_back(unrolled_net_->params()[i]); + } + } + // Check that param_propagate_down is set for all of the parameters in the + // unrolled net; set param_propagate_down to true in this layer. + for (int i = 0; i < unrolled_net_->layers().size(); ++i) { + for (int j = 0; j < unrolled_net_->layers()[i]->blobs().size(); ++j) { + CHECK(unrolled_net_->layers()[i]->param_propagate_down(j)) + << "param_propagate_down not set for layer " << i << ", param " << j; + } + } + this->param_propagate_down_.clear(); + this->param_propagate_down_.resize(this->blobs_.size(), true); + + // Set the diffs of recurrent outputs to 0 -- we can't backpropagate across + // batches. + for (int i = 0; i < recur_output_blobs_.size(); ++i) { + caffe_set(recur_output_blobs_[i]->count(), Ftype(0), + recur_output_blobs_[i]->mutable_cpu_diff()); + } + + // Check that the last output_names.size() layers are the pseudo-losses; + // set last_layer_index so that we don't actually run these layers. + const vector& layer_names = unrolled_net_->layer_names(); + last_layer_index_ = layer_names.size() - 1 - pseudo_losses.size(); + for (int i = last_layer_index_ + 1, j = 0; i < layer_names.size(); ++i, ++j) { + CHECK_EQ(layer_names[i], pseudo_losses[j]); + } +} + +template +void RecurrentLayer::Reshape(const vector& bottom, + const vector& top) { + CHECK_GE(bottom[0]->num_axes(), 2) + << "bottom[0] must have at least 2 axes -- (#timesteps, #streams, ...)"; + CHECK_EQ(T_, bottom[0]->shape(0)) << "input number of timesteps changed"; + N_ = bottom[0]->shape(1); + CHECK_EQ(bottom[1]->num_axes(), 2) + << "bottom[1] must have exactly 2 axes -- (#timesteps, #streams)"; + CHECK_EQ(T_, bottom[1]->shape(0)); + CHECK_EQ(N_, bottom[1]->shape(1)); + x_input_blob_->ReshapeLike(*bottom[0]); + vector cont_shape = bottom[1]->shape(); + cont_input_blob_->Reshape(cont_shape); + if (static_input_) { + x_static_input_blob_->ReshapeLike(*bottom[2]); + } + vector recur_input_shapes; + RecurrentInputShapes(&recur_input_shapes); + CHECK_EQ(recur_input_shapes.size(), recur_input_blobs_.size()); + for (int i = 0; i < recur_input_shapes.size(); ++i) { + recur_input_blobs_[i]->Reshape(recur_input_shapes[i]); + } + unrolled_net_->Reshape(); + x_input_blob_->ShareData(*bottom[0]); + x_input_blob_->ShareDiff(*bottom[0]); + cont_input_blob_->ShareData(*bottom[1]); + if (static_input_) { + x_static_input_blob_->ShareData(*bottom[2]); + x_static_input_blob_->ShareDiff(*bottom[2]); + } + if (expose_hidden_) { + const int bottom_offset = 2 + static_input_; + for (int i = bottom_offset, j = 0; i < bottom.size(); ++i, ++j) { + CHECK(recur_input_blobs_[j]->shape() == bottom[i]->shape()) + << "bottom[" << i << "] shape must match hidden state input shape: " + << recur_input_blobs_[j]->shape_string(); + recur_input_blobs_[j]->ShareData(*bottom[i]); + } + } + for (int i = 0; i < output_blobs_.size(); ++i) { + top[i]->ReshapeLike(*output_blobs_[i]); + top[i]->ShareData(*output_blobs_[i]); + top[i]->ShareDiff(*output_blobs_[i]); + } + if (expose_hidden_) { + const int top_offset = output_blobs_.size(); + for (int i = top_offset, j = 0; i < top.size(); ++i, ++j) { + top[i]->ReshapeLike(*recur_output_blobs_[j]); + } + } +} + +template +void RecurrentLayer::Reset() { + // "Reset" the hidden state of the net by zeroing out all recurrent outputs. + for (int i = 0; i < recur_output_blobs_.size(); ++i) { + caffe_set(recur_output_blobs_[i]->count(), Ftype(0), + recur_output_blobs_[i]->mutable_cpu_data()); + } +} + +template +void RecurrentLayer::Forward_cpu(const vector& bottom, + const vector& top) { + // Hacky fix for test time: reshare all the internal shared blobs, which may + // currently point to a stale owner blob that was dropped when Solver::Test + // called test_net->ShareTrainedLayersWith(net_.get()). + // TODO: somehow make this work non-hackily. + if (this->phase_ == TEST) { + unrolled_net_->ShareWeights(); + } + + DCHECK_EQ(recur_input_blobs_.size(), recur_output_blobs_.size()); + if (!expose_hidden_) { + for (int i = 0; i < recur_input_blobs_.size(); ++i) { + const int count = recur_input_blobs_[i]->count(); + DCHECK_EQ(count, recur_output_blobs_[i]->count()); + const Ftype* timestep_T_data = recur_output_blobs_[i]->cpu_data(); + Ftype* timestep_0_data = recur_input_blobs_[i]->mutable_cpu_data(); + caffe_copy(count, timestep_T_data, timestep_0_data); + } + } + + unrolled_net_->ForwardTo(last_layer_index_); + + if (expose_hidden_) { + const int top_offset = output_blobs_.size(); + for (int i = top_offset, j = 0; i < top.size(); ++i, ++j) { + top[i]->ShareData(*recur_output_blobs_[j]); + } + } +} + +template +void RecurrentLayer::Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + CHECK(!propagate_down[1]) << "Cannot backpropagate to sequence indicators."; + + // TODO: skip backpropagation to inputs and parameters inside the unrolled + // net according to propagate_down[0] and propagate_down[2]. For now just + // backprop to inputs and parameters unconditionally, as either the inputs or + // the parameters do need backward (or Net would have set + // layer_needs_backward_[i] == false for this layer). + unrolled_net_->BackwardFromToAu(last_layer_index_, 0, false); +} + +INSTANTIATE_CLASS_FB(RecurrentLayer); + +} // namespace caffe diff --git a/src/caffe/layers/recurrent_layer.cu b/src/caffe/layers/recurrent_layer.cu new file mode 100644 index 00000000000..102ba15ebad --- /dev/null +++ b/src/caffe/layers/recurrent_layer.cu @@ -0,0 +1,44 @@ +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/recurrent_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void RecurrentLayer::Forward_gpu(const vector& bottom, + const vector& top) { + // Hacky fix for test time... reshare all the shared blobs. + // TODO: somehow make this work non-hackily. + if (this->phase_ == TEST) { + unrolled_net_->ShareWeights(); + } + + DCHECK_EQ(recur_input_blobs_.size(), recur_output_blobs_.size()); + if (!expose_hidden_) { + for (int i = 0; i < recur_input_blobs_.size(); ++i) { + const int count = recur_input_blobs_[i]->count(); + DCHECK_EQ(count, recur_output_blobs_[i]->count()); + const Ftype* timestep_T_data = recur_output_blobs_[i]->gpu_data(); + Ftype* timestep_0_data = recur_input_blobs_[i]->mutable_gpu_data(); + caffe_copy(count, timestep_T_data, timestep_0_data); + } + } + + unrolled_net_->ForwardTo(last_layer_index_); + + if (expose_hidden_) { + const int top_offset = output_blobs_.size(); + for (int i = top_offset, j = 0; i < top.size(); ++i, ++j) { + top[i]->ShareData(*recur_output_blobs_[j]); + } + } +} + +INSTANTIATE_LAYER_GPU_FORWARD_ONLY_FB(RecurrentLayer); + +} // namespace caffe diff --git a/src/caffe/layers/reduction_layer.cpp b/src/caffe/layers/reduction_layer.cpp index 7f3952dd5cc..b573f27c583 100644 --- a/src/caffe/layers/reduction_layer.cpp +++ b/src/caffe/layers/reduction_layer.cpp @@ -29,8 +29,10 @@ void ReductionLayer::Reshape(const vector& bottom, if (op_ == ReductionParameter_ReductionOp_SUM || op_ == ReductionParameter_ReductionOp_MEAN) { vector sum_mult_shape(1, dim_); - sum_multiplier_.Reshape(sum_mult_shape); - caffe_set(dim_, Ftype(1), sum_multiplier_.template mutable_cpu_data()); + if (sum_multiplier_.shape() != sum_mult_shape) { + sum_multiplier_.Reshape(sum_mult_shape); + caffe_set(dim_, Ftype(1), sum_multiplier_.mutable_cpu_data()); + } } coeff_ = this->layer_param().reduction_param().coeff(); if (op_ == ReductionParameter_ReductionOp_MEAN) { diff --git a/src/caffe/layers/reshape_layer.cpp b/src/caffe/layers/reshape_layer.cpp index f448124f462..1e9a88b96b3 100644 --- a/src/caffe/layers/reshape_layer.cpp +++ b/src/caffe/layers/reshape_layer.cpp @@ -87,7 +87,7 @@ void ReshapeLayer::Reshape(const vector& bottom, CHECK_EQ(top[0]->count(), bottom[0]->count()) << "output count must match input count"; top[0]->ShareData(*bottom[0]); - top[0]->ShareDiff(*bottom[0]); + bottom[0]->ShareDiff(*top[0]); } INSTANTIATE_CLASS_FB(ReshapeLayer); diff --git a/src/caffe/layers/rnn_layer.cpp b/src/caffe/layers/rnn_layer.cpp new file mode 100644 index 00000000000..d4af9e1c99f --- /dev/null +++ b/src/caffe/layers/rnn_layer.cpp @@ -0,0 +1,236 @@ +#include +#include + +#include "caffe/common.hpp" +#include "caffe/blob.hpp" +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/layers/rnn_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void RNNLayer::RecurrentInputBlobNames(vector* names) const { + names->resize(1); + (*names)[0] = "h_0"; +} + +template +void RNNLayer::RecurrentOutputBlobNames(vector* names) const { + names->resize(1); + (*names)[0] = "h_" + format_int(this->T_); +} + +template +void RNNLayer::RecurrentInputShapes(vector* shapes) const { + const int num_output = this->layer_param_.recurrent_param().num_output(); + shapes->resize(1); + (*shapes)[0].Clear(); + (*shapes)[0].add_dim(1); // a single timestep + (*shapes)[0].add_dim(this->N_); + (*shapes)[0].add_dim(num_output); +} + +template +void RNNLayer::OutputBlobNames(vector* names) const { + names->resize(1); + (*names)[0] = "o"; +} + +template +void RNNLayer::FillUnrolledNet(NetParameter* net_param) const { + const int num_output = this->layer_param_.recurrent_param().num_output(); + CHECK_GT(num_output, 0) << "num_output must be positive"; + const FillerParameter& weight_filler = + this->layer_param_.recurrent_param().weight_filler(); + const FillerParameter& bias_filler = + this->layer_param_.recurrent_param().bias_filler(); + + // Add generic LayerParameter's (without bottoms/tops) of layer types we'll + // use to save redundant code. + LayerParameter hidden_param; + hidden_param.set_type("InnerProduct"); + hidden_param.mutable_inner_product_param()->set_num_output(num_output); + hidden_param.mutable_inner_product_param()->set_bias_term(false); + hidden_param.mutable_inner_product_param()->set_axis(2); + hidden_param.mutable_inner_product_param()-> + mutable_weight_filler()->CopyFrom(weight_filler); + + LayerParameter biased_hidden_param(hidden_param); + biased_hidden_param.mutable_inner_product_param()->set_bias_term(true); + biased_hidden_param.mutable_inner_product_param()-> + mutable_bias_filler()->CopyFrom(bias_filler); + + LayerParameter sum_param; + sum_param.set_type("Eltwise"); + sum_param.mutable_eltwise_param()->set_operation( + EltwiseParameter_EltwiseOp_SUM); + + LayerParameter tanh_param; + tanh_param.set_type("TanH"); + + LayerParameter scale_param; + scale_param.set_type("Scale"); + scale_param.mutable_scale_param()->set_axis(0); + + LayerParameter slice_param; + slice_param.set_type("Slice"); + slice_param.mutable_slice_param()->set_axis(0); + + vector input_shapes; + RecurrentInputShapes(&input_shapes); + CHECK_EQ(1, input_shapes.size()); + + LayerParameter* input_layer_param = net_param->add_layer(); + input_layer_param->set_type("Input"); + InputParameter* input_param = input_layer_param->mutable_input_param(); + input_layer_param->add_top("h_0"); + input_param->add_shape()->CopyFrom(input_shapes[0]); + + LayerParameter* cont_slice_param = net_param->add_layer(); + cont_slice_param->CopyFrom(slice_param); + cont_slice_param->set_name("cont_slice"); + cont_slice_param->add_bottom("cont"); + cont_slice_param->mutable_slice_param()->set_axis(0); + + // Add layer to transform all timesteps of x to the hidden state dimension. + // W_xh_x = W_xh * x + b_h + { + LayerParameter* x_transform_param = net_param->add_layer(); + x_transform_param->CopyFrom(biased_hidden_param); + x_transform_param->set_name("x_transform"); + x_transform_param->add_param()->set_name("W_xh"); + x_transform_param->add_param()->set_name("b_h"); + x_transform_param->add_bottom("x"); + x_transform_param->add_top("W_xh_x"); + x_transform_param->add_propagate_down(true); + } + + if (this->static_input_) { + // Add layer to transform x_static to the hidden state dimension. + // W_xh_x_static = W_xh_static * x_static + LayerParameter* x_static_transform_param = net_param->add_layer(); + x_static_transform_param->CopyFrom(hidden_param); + x_static_transform_param->mutable_inner_product_param()->set_axis(1); + x_static_transform_param->set_name("W_xh_x_static"); + x_static_transform_param->add_param()->set_name("W_xh_static"); + x_static_transform_param->add_bottom("x_static"); + x_static_transform_param->add_top("W_xh_x_static_preshape"); + x_static_transform_param->add_propagate_down(true); + + LayerParameter* reshape_param = net_param->add_layer(); + reshape_param->set_type("Reshape"); + BlobShape* new_shape = + reshape_param->mutable_reshape_param()->mutable_shape(); + new_shape->add_dim(1); // One timestep. + // Should infer this->N as the dimension so we can reshape on batch size. + new_shape->add_dim(-1); + new_shape->add_dim( + x_static_transform_param->inner_product_param().num_output()); + reshape_param->set_name("W_xh_x_static_reshape"); + reshape_param->add_bottom("W_xh_x_static_preshape"); + reshape_param->add_top("W_xh_x_static"); + } + + LayerParameter* x_slice_param = net_param->add_layer(); + x_slice_param->CopyFrom(slice_param); + x_slice_param->set_name("W_xh_x_slice"); + x_slice_param->add_bottom("W_xh_x"); + + LayerParameter output_concat_layer; + output_concat_layer.set_name("o_concat"); + output_concat_layer.set_type("Concat"); + output_concat_layer.add_top("o"); + output_concat_layer.mutable_concat_param()->set_axis(0); + + for (int t = 1; t <= this->T_; ++t) { + string tm1s = format_int(t - 1); + string ts = format_int(t); + + cont_slice_param->add_top("cont_" + ts); + x_slice_param->add_top("W_xh_x_" + ts); + + // Add layer to flush the hidden state when beginning a new sequence, + // as indicated by cont_t. + // h_conted_{t-1} := cont_t * h_{t-1} + // + // Normally, cont_t is binary (i.e., 0 or 1), so: + // h_conted_{t-1} := h_{t-1} if cont_t == 1 + // 0 otherwise + { + LayerParameter* cont_h_param = net_param->add_layer(); + cont_h_param->CopyFrom(scale_param); + cont_h_param->set_name("h_conted_" + tm1s); + cont_h_param->add_bottom("h_" + tm1s); + cont_h_param->add_bottom("cont_" + ts); + cont_h_param->add_top("h_conted_" + tm1s); + } + + // Add layer to compute + // W_hh_h_{t-1} := W_hh * h_conted_{t-1} + { + LayerParameter* w_param = net_param->add_layer(); + w_param->CopyFrom(hidden_param); + w_param->set_name("W_hh_h_" + tm1s); + w_param->add_param()->set_name("W_hh"); + w_param->add_bottom("h_conted_" + tm1s); + w_param->add_top("W_hh_h_" + tm1s); + w_param->mutable_inner_product_param()->set_axis(2); + } + + // Add layers to compute + // h_t := \tanh( W_hh * h_conted_{t-1} + W_xh * x_t + b_h ) + // = \tanh( W_hh_h_{t-1} + W_xh_t ) + { + LayerParameter* h_input_sum_param = net_param->add_layer(); + h_input_sum_param->CopyFrom(sum_param); + h_input_sum_param->set_name("h_input_sum_" + ts); + h_input_sum_param->add_bottom("W_hh_h_" + tm1s); + h_input_sum_param->add_bottom("W_xh_x_" + ts); + if (this->static_input_) { + h_input_sum_param->add_bottom("W_xh_x_static"); + } + h_input_sum_param->add_top("h_neuron_input_" + ts); + } + { + LayerParameter* h_neuron_param = net_param->add_layer(); + h_neuron_param->CopyFrom(tanh_param); + h_neuron_param->set_name("h_neuron_" + ts); + h_neuron_param->add_bottom("h_neuron_input_" + ts); + h_neuron_param->add_top("h_" + ts); + } + + // Add layer to compute + // W_ho_h_t := W_ho * h_t + b_o + { + LayerParameter* w_param = net_param->add_layer(); + w_param->CopyFrom(biased_hidden_param); + w_param->set_name("W_ho_h_" + ts); + w_param->add_param()->set_name("W_ho"); + w_param->add_param()->set_name("b_o"); + w_param->add_bottom("h_" + ts); + w_param->add_top("W_ho_h_" + ts); + w_param->mutable_inner_product_param()->set_axis(2); + } + + // Add layers to compute + // o_t := \tanh( W_ho * h_t + b_o) + // = \tanh( W_ho_h_t ) + { + LayerParameter* o_neuron_param = net_param->add_layer(); + o_neuron_param->CopyFrom(tanh_param); + o_neuron_param->set_name("o_neuron_" + ts); + o_neuron_param->add_bottom("W_ho_h_" + ts); + o_neuron_param->add_top("o_" + ts); + } + output_concat_layer.add_bottom("o_" + ts); + } // for (int t = 1; t <= this->T_; ++t) + + net_param->add_layer()->CopyFrom(output_concat_layer); +} + +INSTANTIATE_CLASS_FB(RNNLayer); +REGISTER_LAYER_CLASS(RNN); + +} // namespace caffe diff --git a/src/caffe/layers/scale_layer.cpp b/src/caffe/layers/scale_layer.cpp index e9045f8b779..200ed680d3f 100644 --- a/src/caffe/layers/scale_layer.cpp +++ b/src/caffe/layers/scale_layer.cpp @@ -4,7 +4,7 @@ #include "caffe/filler.hpp" #include "caffe/layer_factory.hpp" #include "caffe/layers/scale_layer.hpp" -#include "caffe/util/math_functions.hpp" +#include "caffe/net.hpp" namespace caffe { @@ -53,7 +53,7 @@ void ScaleLayer::LayerSetUp(const vector& bottom, bias_param->set_num_axes(param.num_axes()); } bias_param->mutable_filler()->CopyFrom(param.bias_filler()); - bias_layer_ = LayerRegistry::CreateLayer(layer_param, 0UL); + bias_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); bias_bottom_vec_.resize(1); bias_bottom_vec_[0] = bottom[0]; bias_layer_->SetUp(bias_bottom_vec_, top); diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index 0c6eb8a8fb7..d7a7c13ba7b 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -42,9 +42,9 @@ void SliceLayer::Forward_gpu(const vector& bottom, <<>>( nthreads, bottom_data, kForward, num_slices_, slice_size_, bottom_slice_axis, top_slice_axis, offset_slice_axis, top_data); + CUDA_CHECK(cudaStreamSynchronize(stream)); offset_slice_axis += top_slice_axis; } - CUDA_CHECK(cudaStreamSynchronize(stream)); } template @@ -55,15 +55,17 @@ void SliceLayer::Backward_gpu(const vector& top, Btype* bottom_diff = bottom[0]->mutable_gpu_diff(); const int bottom_slice_axis = bottom[0]->shape(slice_axis_); const bool kForward = false; + cudaStream_t stream = Caffe::thread_stream(); for (int i = 0; i < top.size(); ++i) { const Btype* top_diff = top[i]->gpu_diff(); const int top_slice_axis = top[i]->shape(slice_axis_); const int top_slice_size = top_slice_axis * slice_size_; const int nthreads = top_slice_size * num_slices_; Slice // NOLINT_NEXT_LINE(whitespace/operators) - <<>>( + <<>>( nthreads, top_diff, kForward, num_slices_, slice_size_, bottom_slice_axis, top_slice_axis, offset_slice_axis, bottom_diff); + CUDA_CHECK(cudaStreamSynchronize(stream)); offset_slice_axis += top_slice_axis; } } diff --git a/src/caffe/layers/smooth_L1_loss_layer.cpp b/src/caffe/layers/smooth_L1_loss_layer.cpp new file mode 100644 index 00000000000..6cfea641e51 --- /dev/null +++ b/src/caffe/layers/smooth_L1_loss_layer.cpp @@ -0,0 +1,104 @@ +// ------------------------------------------------------------------ +// Fast R-CNN +// copyright (c) 2015 Microsoft +// Licensed under The MIT License [see fast-rcnn/LICENSE for details] +// Written by Ross Girshick +// Modified by Wei Liu +// ------------------------------------------------------------------ + +#include + +#include "caffe/layers/smooth_L1_loss_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void SmoothL1LossLayer::LayerSetUp( + const vector& bottom, const vector& top) { + LossLayer::LayerSetUp(bottom, top); + has_weights_ = (bottom.size() == 3); +} + +template +void SmoothL1LossLayer::Reshape( + const vector& bottom, const vector& top) { + LossLayer::Reshape(bottom, top); + CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); + CHECK_EQ(bottom[0]->height(), bottom[1]->height()); + CHECK_EQ(bottom[0]->width(), bottom[1]->width()); + if (has_weights_) { + CHECK_EQ(bottom[0]->channels(), bottom[2]->channels()); + CHECK_EQ(bottom[0]->height(), bottom[2]->height()); + CHECK_EQ(bottom[0]->width(), bottom[2]->width()); + } + diff_.Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + errors_.Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); +} + +template +void SmoothL1LossLayer::Forward_cpu(const vector& bottom, + const vector& top) { + int count = bottom[0]->count(); + caffe_sub( + count, + bottom[0]->cpu_data(), + bottom[1]->cpu_data(), + diff_.mutable_cpu_data()); + if (has_weights_) { + caffe_mul( + count, + bottom[2]->cpu_data(), + diff_.cpu_data(), + diff_.mutable_cpu_data()); // d := w * (b0 - b1) + } + const Dtype* diff_data = diff_.cpu_data(); + Dtype* error_data = errors_.mutable_cpu_data(); + for (int i = 0; i < count; ++i) { + Dtype val = diff_data[i]; + Dtype abs_val = fabs(val); + if (abs_val < 1.) { + error_data[i] = 0.5 * val * val; + } else { + error_data[i] = abs_val - 0.5; + } + } + top[0]->mutable_cpu_data()[0] = + caffe_cpu_asum(count, errors_.cpu_data()) / bottom[0]->num(); +} + +template +void SmoothL1LossLayer::Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + int count = diff_.count(); + Dtype* diff_data = diff_.mutable_cpu_data(); + for (int i = 0; i < count; ++i) { + Dtype val = diff_data[i]; + // f'(x) = x if |x| < 1 + // = sign(x) otherwise + if (fabs(val) < 1.) { + diff_data[i] = val; + } else { + diff_data[i] = (Dtype(0) < val) - (val < Dtype(0)); + } + } + for (int i = 0; i < 2; ++i) { + if (propagate_down[i]) { + const Dtype sign = (i == 0) ? 1 : -1; + const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num(); + caffe_cpu_axpby( + bottom[i]->count(), // count + alpha, // alpha + diff_.cpu_data(), // a + Dtype(0), // beta + bottom[i]->mutable_cpu_diff()); // b + } + } +} + +INSTANTIATE_CLASS_FB(SmoothL1LossLayer); +REGISTER_LAYER_CLASS(SmoothL1Loss); + +} // namespace caffe diff --git a/src/caffe/layers/smooth_L1_loss_layer.cu b/src/caffe/layers/smooth_L1_loss_layer.cu new file mode 100644 index 00000000000..244766c03c1 --- /dev/null +++ b/src/caffe/layers/smooth_L1_loss_layer.cu @@ -0,0 +1,96 @@ +// ------------------------------------------------------------------ +// Fast R-CNN +// copyright (c) 2015 Microsoft +// Licensed under The MIT License [see fast-rcnn/LICENSE for details] +// Written by Ross Girshick +// Modified by Wei Liu +// ------------------------------------------------------------------ + +#include + +#include "caffe/layers/smooth_L1_loss_layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +__global__ void SmoothL1Forward(const int n, const Dtype* in, Dtype* out) { + // f(x) = 0.5 * x^2 if |x| < 1 + // |x| - 0.5 otherwise + CUDA_KERNEL_LOOP(index, n) { + Dtype val = in[index]; + Dtype abs_val = abs(val); + if (abs_val < 1) { + out[index] = 0.5 * val * val; + } else { + out[index] = abs_val - 0.5; + } + } +} + +template +void SmoothL1LossLayer::Forward_gpu(const vector& bottom, + const vector& top) { + int count = bottom[0]->count(); + caffe_gpu_sub( + count, + bottom[0]->gpu_data(), + bottom[1]->gpu_data(), + diff_.mutable_gpu_data()); // d := b0 - b1 + if (has_weights_) { + caffe_gpu_mul( + count, + bottom[2]->gpu_data(), + diff_.gpu_data(), + diff_.mutable_gpu_data()); // d := w * (b0 - b1) + } + // NOLINT_NEXT_LINE(whitespace/operators) + SmoothL1Forward<<>>( + count, diff_.gpu_data(), errors_.mutable_gpu_data()); + CUDA_POST_KERNEL_CHECK; + + Dtype loss; + caffe_gpu_asum(count, errors_.gpu_data(), &loss, 0); + top[0]->mutable_cpu_data()[0] = loss / bottom[0]->num(); +} + +template +__global__ void SmoothL1Backward(const int n, const Dtype* in, Dtype* out) { + // f'(x) = x if |x| < 1 + // = sign(x) otherwise + CUDA_KERNEL_LOOP(index, n) { + Dtype val = in[index]; + Dtype abs_val = abs(val); + if (abs_val < 1) { + out[index] = val; + } else { + out[index] = (Dtype(0) < val) - (val < Dtype(0)); + } + } +} + +template +void SmoothL1LossLayer::Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + int count = diff_.count(); + // NOLINT_NEXT_LINE(whitespace/operators) + SmoothL1Backward<<>>( + count, diff_.gpu_data(), diff_.mutable_gpu_data()); + CUDA_POST_KERNEL_CHECK; + for (int i = 0; i < 2; ++i) { + if (propagate_down[i]) { + const Dtype sign = (i == 0) ? 1 : -1; + const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num(); + caffe_gpu_axpby( + bottom[i]->count(), // count + alpha, // alpha + diff_.gpu_data(), // x + Dtype(0), // beta + bottom[i]->mutable_gpu_diff()); // y + } + } +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(SmoothL1LossLayer); + +} // namespace caffe diff --git a/src/caffe/layers/video_data_layer.cpp b/src/caffe/layers/video_data_layer.cpp new file mode 100644 index 00000000000..fd45c397220 --- /dev/null +++ b/src/caffe/layers/video_data_layer.cpp @@ -0,0 +1,157 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "caffe/data_transformer.hpp" +#include "caffe/layers/video_data_layer.hpp" +#include "caffe/util/benchmark.hpp" + +namespace caffe { + +template +VideoDataLayer::VideoDataLayer(const LayerParameter& param, size_t solver_rank) + : BasePrefetchingDataLayer(param, solver_rank) {} + +template +VideoDataLayer::~VideoDataLayer() { + this->StopInternalThread(); + if (cap_.isOpened()) { + cap_.release(); + } +} + +template +void VideoDataLayer::DataLayerSetUp( + const vector& bottom, const vector& top) { + const int batch_size = this->layer_param_.data_param().batch_size(); + const VideoDataParameter& video_data_param = + this->layer_param_.video_data_param(); + video_type_ = video_data_param.video_type(); + skip_frames_ = video_data_param.skip_frames(); + CHECK_GE(skip_frames_, 0); + TBlob transformed_datum; + // Read an image, and use it to initialize the top blob. + cv::Mat cv_img; + if (video_type_ == VideoDataParameter_VideoType_WEBCAM) { + const int device_id = video_data_param.device_id(); + if (!cap_.open(device_id)) { + LOG(FATAL) << "Failed to open webcam: " << device_id; + } + cap_ >> cv_img; + } else if (video_type_ == VideoDataParameter_VideoType_VIDEO) { + CHECK(video_data_param.has_video_file()) << "Must provide video file!"; + const string& video_file = video_data_param.video_file(); + if (!cap_.open(video_file)) { + LOG(FATAL) << "Failed to open video: " << video_file; + } + total_frames_ = cap_.get(CV_CAP_PROP_FRAME_COUNT); + processed_frames_ = 0; + // Read image to infer shape. + cap_ >> cv_img; + // Set index back to the first frame. + cap_.set(CV_CAP_PROP_POS_FRAMES, 0); + } else { + LOG(FATAL) << "Unknow video type!"; + } + CHECK(cv_img.data) << "Could not load image!"; + // Use data_transformer to infer the expected blob shape from a cv_image. + top_shape_ = this->bdt(0)->InferBlobShape(cv_img); + transformed_datum.Reshape(top_shape_); + top_shape_[0] = batch_size; + top[0]->Reshape(top_shape_); + vector label_shape(1, batch_size); + LOG(INFO) << "output data size: " << top[0]->num() << "," + << top[0]->channels() << "," << top[0]->height() << "," + << top[0]->width(); + // label + if (this->output_labels_) { + top[1]->Reshape(label_shape); + } + this->batch_transformer_->reshape(top_shape_, label_shape, this->is_gpu_transform()); +} + +// This function is called on prefetch thread +template +void VideoDataLayer::load_batch(Batch* batch, int thread_id, size_t queue_id) { + CPUTimer batch_timer; + batch_timer.Start(); + double read_time = 0; + double trans_time = 0; + CPUTimer timer; + CHECK(batch->data_->count()); + TBlob transformed_datum; + + // Reshape according to the first anno_datum of each batch + // on single input batches allows for inputs of varying dimension. + const int batch_size = this->layer_param_.data_param().batch_size(); + top_shape_[0] = 1; + transformed_datum.Reshape(top_shape_); + // Reshape batch according to the batch_size. + top_shape_[0] = batch_size; + batch->data_->Reshape(top_shape_); + + Ftype* top_data = batch->data_->mutable_cpu_data(); + Ftype* top_label = NULL; // suppress warnings about uninitialized variables + if (this->output_labels_) { + top_label = batch->label_->mutable_cpu_data(); + } + + int skip_frames = skip_frames_; + for (int item_id = 0; item_id < batch_size; ++item_id) { + timer.Start(); + cv::Mat cv_img; + if (video_type_ == VideoDataParameter_VideoType_WEBCAM) { + cap_ >> cv_img; + } else if (video_type_ == VideoDataParameter_VideoType_VIDEO) { + if (processed_frames_ >= total_frames_) { + LOG(INFO) << "Finished processing video."; + raise(SIGINT); + } + ++processed_frames_; + cap_ >> cv_img; + } else { + LOG(FATAL) << "Unknown video type."; + } + CHECK(cv_img.data) << "Could not load image!"; + read_time += timer.MicroSeconds(); + if (skip_frames > 0) { + --skip_frames; + --item_id; + } else { + skip_frames = skip_frames_; + timer.Start(); + // Apply transformations (mirror, crop...) to the image + int offset = batch->data_->offset(item_id); + transformed_datum.set_cpu_data(top_data + offset); + this->bdt(0)->Transform(cv_img, &(transformed_datum)); + trans_time += timer.MicroSeconds(); + } + CHECK(cv_img.data) << "Could not load image!"; + read_time += timer.MicroSeconds(); + timer.Start(); + // Apply transformations (mirror, crop...) to the image + int offset = batch->data_->offset(item_id); + transformed_datum.set_cpu_data(top_data + offset); + this->bdt(0)->Transform(cv_img, &(transformed_datum)); + trans_time += timer.MicroSeconds(); + if (this->output_labels_) { + top_label[item_id] = 0; + } + } + timer.Stop(); + batch_timer.Stop(); + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << " ms."; + DLOG(INFO) << " Read time: " << read_time / 1000 << " ms."; + DLOG(INFO) << "Transform time: " << trans_time / 1000 << " ms."; +} + +INSTANTIATE_CLASS_FB(VideoDataLayer); +REGISTER_LAYER_CLASS_R(VideoData); + +} // namespace caffe diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index d99b89b0fdc..065a4b27b86 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -25,12 +25,14 @@ Net::Net(const NetParameter& param, size_t solver_rank, Flag* solver_init_flag, Flag* solver_iter0_flag, - const Net* root_net) + const Net* root_net, + bool inner_net) : root_net_(root_net), solver_(nullptr), solver_rank_(solver_rank), solver_init_flag_(solver_init_flag), - solver_iter0_flag_(solver_iter0_flag) { + solver_iter0_flag_(solver_iter0_flag), + inner_net_(inner_net) { Init(param); } @@ -39,12 +41,14 @@ Net::Net(const string& param_file, size_t solver_rank, Flag* solver_init_flag, Flag* solver_iter0_flag, - const Net* root_net) + const Net* root_net, + bool inner_net) : root_net_(root_net), solver_(nullptr), solver_rank_(solver_rank), solver_init_flag_(solver_init_flag), - solver_iter0_flag_(solver_iter0_flag) { + solver_iter0_flag_(solver_iter0_flag), + inner_net_(inner_net) { NetParameter param; ReadNetParamsFromTextFileOrDie(param_file, ¶m); param.mutable_state()->set_phase(phase); @@ -55,7 +59,7 @@ Net::~Net() { } void Net::Init(const NetParameter& in_param) { - CHECK(Caffe::root_solver() || root_net_) + CHECK(inner_net_ || Caffe::root_solver() || root_net_) << "root_net_ needs to be set for all non-root solvers"; // Set phase from the state. phase_ = in_param.state().phase(); @@ -111,7 +115,7 @@ void Net::Init(const NetParameter& in_param) { for (int layer_id = 0; layer_id < param.layer_size(); ++layer_id) { // For non-root solvers, whether this layer is shared from root_net_. - bool share_from_root = !Caffe::root_solver() + bool share_from_root = !inner_net_ && !Caffe::root_solver() && root_net_->layers_[layer_id]->ShareInParallel(); const LayerParameter& layer_param = param.layer(layer_id); @@ -242,6 +246,7 @@ void Net::Init(const NetParameter& in_param) { << layer_param.name(); } } else { + layers_[layer_id]->set_parent_net(this); layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]); } LOG_IF(INFO, Caffe::root_solver()) @@ -1318,7 +1323,7 @@ void Net::ShareWeights() { gpu_prm_memory_diff_use_ += params_[i]->gpu_memory_diff_use(); continue; } - DLOG(INFO) << "param " << i << " has owner " << param_owners_[i]; +// DLOG(INFO) << "param " << i << " has owner " << param_owners_[i]; params_[i]->ShareData(*params_[param_owners_[i]]); params_[i]->ShareDiff(*params_[param_owners_[i]]); gpu_shp_memory_data_use_ += params_[i]->gpu_memory_data_use(); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 182021850cc..60384239525 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -9,6 +9,7 @@ enum Type { FLOAT16 = 2; INT = 3; // math not supported UINT = 4; // math not supported + BOOL = 5; //math not supported } enum Packing { @@ -60,6 +61,127 @@ message Datum { optional uint32 record_id = 8 [default = 0]; } +// The label (display) name and label id. +message LabelMapItem { + // Both name and label are required. + optional string name = 1; + optional int32 label = 2; + // display_name is optional. + optional string display_name = 3; +} + +message LabelMap { + repeated LabelMapItem item = 1; +} + +// Sample a bbox in the normalized space [0, 1] with provided constraints. +message Sampler { + // Minimum scale of the sampled bbox. + optional float min_scale = 1 [default = 1.]; + // Maximum scale of the sampled bbox. + optional float max_scale = 2 [default = 1.]; + + // Minimum aspect ratio of the sampled bbox. + optional float min_aspect_ratio = 3 [default = 1.]; + // Maximum aspect ratio of the sampled bbox. + optional float max_aspect_ratio = 4 [default = 1.]; +} + +// Constraints for selecting sampled bbox. +message SampleConstraint { + // Minimum Jaccard overlap between sampled bbox and all bboxes in + // AnnotationGroup. + optional float min_jaccard_overlap = 1; + // Maximum Jaccard overlap between sampled bbox and all bboxes in + // AnnotationGroup. + optional float max_jaccard_overlap = 2; + + // Minimum coverage of sampled bbox by all bboxes in AnnotationGroup. + optional float min_sample_coverage = 3; + // Maximum coverage of sampled bbox by all bboxes in AnnotationGroup. + optional float max_sample_coverage = 4; + + // Minimum coverage of all bboxes in AnnotationGroup by sampled bbox. + optional float min_object_coverage = 5; + // Maximum coverage of all bboxes in AnnotationGroup by sampled bbox. + optional float max_object_coverage = 6; +} + +// Sample a batch of bboxes with provided constraints. +message BatchSampler { + // Use original image as the source for sampling. + optional bool use_original_image = 1 [default = true]; + + // Constraints for sampling bbox. + optional Sampler sampler = 2; + + // Constraints for determining if a sampled bbox is positive or negative. + optional SampleConstraint sample_constraint = 3; + + // If provided, break when found certain number of samples satisfing the + // sample_constraint. + optional uint32 max_sample = 4; + + // Maximum number of trials for sampling to avoid infinite loop. + optional uint32 max_trials = 5 [default = 100]; +} + +// Condition for emitting annotations. +message EmitConstraint { + enum EmitType { + CENTER = 0; + MIN_OVERLAP = 1; + } + optional EmitType emit_type = 1 [default = CENTER]; + // If emit_type is MIN_OVERLAP, provide the emit_overlap. + optional float emit_overlap = 2; +} + +// The normalized bounding box [0, 1] w.r.t. the input image size. +message NormalizedBBox { + optional float xmin = 1; + optional float ymin = 2; + optional float xmax = 3; + optional float ymax = 4; + optional int32 label = 5; + optional bool difficult = 6; + optional float score = 7; + optional float size = 8; +} + +// Annotation for each object instance. +message Annotation { + optional int32 instance_id = 1 [default = 0]; + optional NormalizedBBox bbox = 2; +} + +// Group of annotations for a particular label. +message AnnotationGroup { + optional int32 group_label = 1; + repeated Annotation annotation = 2; +} + +// An extension of Datum which contains "rich" annotations. +message AnnotatedDatum { + enum AnnotationType { + BBOX = 0; + } + optional Datum datum = 1; + // If there are "rich" annotations, specify the type of annotation. + // Currently it only supports bounding box. + // If there are no "rich" annotations, use label in datum instead. + optional AnnotationType type = 2; + // Each group contains annotation for a particular class. + repeated AnnotationGroup annotation_group = 3; + // Unique record index assigned by Reader + optional uint32 record_id = 4 [default = 0]; +} + +enum DatumTypeInfo { + DatumTypeInfo_DATUM = 0; + DatumTypeInfo_ANNOTATED_DATUM = 1; +} + // Caffe 2 datasets support message C2TensorProto { // The dimensions in the tensor. @@ -239,6 +361,17 @@ message SolverParameter { optional NetState train_state = 26; repeated NetState test_state = 27; + // Evaluation type. + optional string eval_type = 241 [default = "classification"]; + // ap_version: different ways of computing Average Precision. + // Check https://sanchom.wordpress.com/tag/average-precision/ for details. + // 11point: the 11-point interpolated average precision. Used in VOC2007. + // MaxIntegral: maximally interpolated AP. Used in VOC2012/ILSVRC. + // Integral: the natural integral of the precision-recall curve. + optional string ap_version = 242 [default = "Integral"]; + // If true, display per class result. + optional bool show_per_class_result = 244 [default = false]; + // The number of iterations for each test net. repeated int32 test_iter = 3; @@ -276,6 +409,8 @@ message SolverParameter { // zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power) // - sigmoid: the effective learning rate follows a sigmod decay // return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)))) + // - plateau: decreases lr + // if the minimum loss isn't updated for 'plateau_winsize' iters // // where base_lr, max_iter, gamma, step, stepvalue and power are defined // in the solver parameter protocol buffer, and iter is the current iteration. @@ -304,6 +439,8 @@ message SolverParameter { optional int32 stepsize = 13; // the stepsize for learning rate policy "multistep" repeated int32 stepvalue = 34; + // the stepsize for learning rate policy "plateau" + repeated int32 plateau_winsize = 243; // Set clip_gradients to >= 0 to clip parameter gradients to that L2 norm, // whenever their actual L2 norm is larger. @@ -380,6 +517,8 @@ message SolverState { optional string learned_net = 2; // The file that stores the learned net. repeated BlobProto history = 3; // The history for sgd solvers optional int32 current_step = 4 [default = 0]; // The current step for learning rate + optional float minimum_loss = 5 [default = 1E38]; // Historical minimum loss + optional int32 iter_last_event = 6 [default = 0]; // The iteration when last lr-update or min_loss-update happend } enum Phase { @@ -439,7 +578,7 @@ message ParamSpec { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available layer-specific ID: 151 (last added: cudnn_math_override) +// LayerParameter next available layer-specific ID: 152 (last added: recurrent_param) message LayerParameter { optional string name = 1; // the layer name optional string type = 2; // the layer type @@ -512,6 +651,7 @@ message LayerParameter { // engine parameter for selecting the implementation. // The default for the engine is set by the ENGINE switch at compile-time. optional AccuracyParameter accuracy_param = 102; + optional AnnotatedDataParameter annotated_data_param = 200; optional ArgMaxParameter argmax_param = 103; optional BatchNormParameter batch_norm_param = 139; optional BiasParameter bias_param = 141; @@ -520,6 +660,8 @@ message LayerParameter { optional ConvolutionParameter convolution_param = 106; optional CropParameter crop_param = 144; optional DataParameter data_param = 107; + optional DetectionEvaluateParameter detection_evaluate_param = 205; + optional DetectionOutputParameter detection_output_param = 204; optional DropoutParameter dropout_param = 108; optional DummyDataParameter dummy_data_param = 109; optional EltwiseParameter eltwise_param = 110; @@ -537,10 +679,14 @@ message LayerParameter { optional LogParameter log_param = 134; optional LRNParameter lrn_param = 118; optional MemoryDataParameter memory_data_param = 119; + optional MultiBoxLossParameter multibox_loss_param = 201; optional MVNParameter mvn_param = 120; + optional NormalizeParameter norm_param = 206; + optional PermuteParameter permute_param = 202; optional PoolingParameter pooling_param = 121; optional PowerParameter power_param = 122; optional PReLUParameter prelu_param = 131; + optional PriorBoxParameter prior_box_param = 203; optional PythonParameter python_param = 130; optional ReductionParameter reduction_param = 136; optional ReLUParameter relu_param = 123; @@ -553,7 +699,9 @@ message LayerParameter { optional TanHParameter tanh_param = 127; optional ThresholdParameter threshold_param = 128; optional TileParameter tile_param = 138; + optional VideoDataParameter video_data_param = 207; optional WindowDataParameter window_data_param = 129; + optional RecurrentParameter recurrent_param = 151; // NVIDIA PARAMETERS (Start with 68 because NV is 68 on an old-style phone) optional DetectNetGroundTruthParameter detectnet_groundtruth_param = 6801; @@ -638,6 +786,9 @@ message TransformationParameter { optional bool mirror = 2 [default = false]; // Specify if we would like to randomly crop an image. optional uint32 crop_size = 3 [default = 0]; + optional uint32 crop_h = 211 [default = 0]; + optional uint32 crop_w = 212 [default = 0]; + // mean_file and mean_value cannot be specified at the same time optional string mean_file = 4; // if specified can be repeated once (would substract it from all the channels) @@ -656,6 +807,20 @@ message TransformationParameter { // random number generator would be initialized -- useful for reproducible results. // Otherwise, (and by default) initialize using a seed derived from the system clock. optional int64 random_seed = 9 [default = -1]; + + optional bool display = 22 [default = false]; + optional int32 num_labels = 23 [default = 0]; + + // Resize policy + optional ResizeParameter resize_param = 208; + // Noise policy + optional NoiseParameter noise_param = 209; + // Distortion policy + optional DistortionParameter distort_param = 213; + // Expand policy + optional ExpansionParameter expand_param = 214; + // Constraint for emitting the annotation after transformation. + optional EmitConstraint emit_constraint = 210; } // Message that stores parameters used to create gridbox ground truth message DetectNetGroundTruthParameter { @@ -729,6 +894,142 @@ message DetectNetAugmentationParameter { // desaturation augmentation off. optional float desaturation_prob = 12 [default = 0.33]; optional float desaturation_max = 13 [default = 0.5]; + + // Resize policy + optional ResizeParameter resize_param = 208; + // Noise policy + optional NoiseParameter noise_param = 209; + // Distortion policy + optional DistortionParameter distort_param = 213; + // Expand policy + optional ExpansionParameter expand_param = 214; + // Constraint for emitting the annotation after transformation. + optional EmitConstraint emit_constraint = 210; +} + +// Message that stores parameters used by data transformer for resize policy +message ResizeParameter { + //Probability of using this resize policy + optional float prob = 1 [default = 1]; + + enum Resize_mode { + WARP = 1; + FIT_SMALL_SIZE = 2; + FIT_LARGE_SIZE_AND_PAD = 3; + } + optional Resize_mode resize_mode = 2 [default = WARP]; + optional uint32 height = 3 [default = 0]; + optional uint32 width = 4 [default = 0]; + // A parameter used to update bbox in FIT_SMALL_SIZE mode. + optional uint32 height_scale = 8 [default = 0]; + optional uint32 width_scale = 9 [default = 0]; + + enum Pad_mode { + CONSTANT = 1; + MIRRORED = 2; + REPEAT_NEAREST = 3; + } + // Padding mode for BE_SMALL_SIZE_AND_PAD mode and object centering + optional Pad_mode pad_mode = 5 [default = CONSTANT]; + // if specified can be repeated once (would fill all the channels) + // or can be repeated the same number of times as channels + // (would use it them to the corresponding channel) + repeated float pad_value = 6; + + enum Interp_mode { //Same as in OpenCV + LINEAR = 1; + AREA = 2; + NEAREST = 3; + CUBIC = 4; + LANCZOS4 = 5; + } + //interpolation for for resizing + repeated Interp_mode interp_mode = 7; +} + +message SaltPepperParameter { + //Percentage of pixels + optional float fraction = 1 [default = 0]; + repeated float value = 2; +} + +// Message that stores parameters used by data transformer for transformation +// policy +message NoiseParameter { + //Probability of using this resize policy + optional float prob = 1 [default = 0]; + // Histogram equalized + optional bool hist_eq = 2 [default = false]; + // Color inversion + optional bool inverse = 3 [default = false]; + // Grayscale + optional bool decolorize = 4 [default = false]; + // Gaussian blur + optional bool gauss_blur = 5 [default = false]; + + // JPEG compression quality (-1 = no compression) + optional float jpeg = 6 [default = -1]; + + // Posterization + optional bool posterize = 7 [default = false]; + + // Erosion + optional bool erode = 8 [default = false]; + + // Salt-and-pepper noise + optional bool saltpepper = 9 [default = false]; + + optional SaltPepperParameter saltpepper_param = 10; + + // Local histogram equalization + optional bool clahe = 11 [default = false]; + + // Color space conversion + optional bool convert_to_hsv = 12 [default = false]; + + // Color space conversion + optional bool convert_to_lab = 13 [default = false]; +} + +// Message that stores parameters used by data transformer for distortion policy +message DistortionParameter { + // The probability of adjusting brightness. + optional float brightness_prob = 1 [default = 0.0]; + // Amount to add to the pixel values within [-delta, delta]. + // The possible value is within [0, 255]. Recommend 32. + optional float brightness_delta = 2 [default = 0.0]; + + // The probability of adjusting contrast. + optional float contrast_prob = 3 [default = 0.0]; + // Lower bound for random contrast factor. Recommend 0.5. + optional float contrast_lower = 4 [default = 0.0]; + // Upper bound for random contrast factor. Recommend 1.5. + optional float contrast_upper = 5 [default = 0.0]; + + // The probability of adjusting hue. + optional float hue_prob = 6 [default = 0.0]; + // Amount to add to the hue channel within [-delta, delta]. + // The possible value is within [0, 180]. Recommend 36. + optional float hue_delta = 7 [default = 0.0]; + + // The probability of adjusting saturation. + optional float saturation_prob = 8 [default = 0.0]; + // Lower bound for the random saturation factor. Recommend 0.5. + optional float saturation_lower = 9 [default = 0.0]; + // Upper bound for the random saturation factor. Recommend 1.5. + optional float saturation_upper = 10 [default = 0.0]; + + // The probability of randomly order the image channels. + optional float random_order_prob = 11 [default = 0.0]; +} + +// Message that stores parameters used by data transformer for expansion policy +message ExpansionParameter { + //Probability of using this expansion policy + optional float prob = 1 [default = 1]; + + // The ratio to expand the image. + optional float max_expand_ratio = 2 [default = 1.]; } // Message that stores parameters shared by loss layers @@ -778,6 +1079,16 @@ message AccuracyParameter { optional int32 ignore_label = 3; } +message AnnotatedDataParameter { + // Define the sampler. + repeated BatchSampler batch_sampler = 1; + // Store label name and label id in LabelMap format. + optional string label_map_file = 2; + // If provided, it will replace the AnnotationType stored in each + // AnnotatedDatum. + optional AnnotatedDatum.AnnotationType anno_type = 3; +} + message ArgMaxParameter { // If true produce pairs (argmax, maxval) optional bool out_max_val = 1 [default = false]; @@ -996,6 +1307,95 @@ message DataParameter { optional bool shuffle = 14 [default = false]; } +// Message that store parameters used by DetectionEvaluateLayer +message DetectionEvaluateParameter { + // Number of classes that are actually predicted. Required! + optional uint32 num_classes = 1; + // Label id for background class. Needed for sanity check so that + // background class is neither in the ground truth nor the detections. + optional uint32 background_label_id = 2 [default = 0]; + // Threshold for deciding true/false positive. + optional float overlap_threshold = 3 [default = 0.5]; + // If true, also consider difficult ground truth for evaluation. + optional bool evaluate_difficult_gt = 4 [default = true]; + // A file which contains a list of names and sizes with same order + // of the input DB. The file is in the following format: + // name height width + // ... + // If provided, we will scale the prediction and ground truth NormalizedBBox + // for evaluation. + optional string name_size_file = 5; + // The resize parameter used in converting NormalizedBBox to original image. + optional ResizeParameter resize_param = 6; +} + +message NonMaximumSuppressionParameter { + // Threshold to be used in nms. + optional float nms_threshold = 1 [default = 0.3]; + // Maximum number of results to be kept. + optional int32 top_k = 2; + // Parameter for adaptive nms. + optional float eta = 3 [default = 1.0]; +} + +message SaveOutputParameter { + // Output directory. If not empty, we will save the results. + optional string output_directory = 1; + // Output name prefix. + optional string output_name_prefix = 2; + // Output format. + // VOC - PASCAL VOC output format. + // COCO - MS COCO output format. + optional string output_format = 3; + // If you want to output results, must also provide the following two files. + // Otherwise, we will ignore saving results. + // label map file. + optional string label_map_file = 4; + // A file which contains a list of names and sizes with same order + // of the input DB. The file is in the following format: + // name height width + // ... + optional string name_size_file = 5; + // Number of test images. It can be less than the lines specified in + // name_size_file. For example, when we only want to evaluate on part + // of the test images. + optional uint32 num_test_image = 6; + // The resize parameter used in saving the data. + optional ResizeParameter resize_param = 7; +} + +// Message that store parameters used by DetectionOutputLayer +message DetectionOutputParameter { + // Number of classes to be predicted. Required! + optional uint32 num_classes = 1; + // If true, bounding box are shared among different classes. + optional bool share_location = 2 [default = true]; + // Background label id. If there is no background class, + // set it as -1. + optional int32 background_label_id = 3 [default = 0]; + // Parameters used for non maximum suppression. + optional NonMaximumSuppressionParameter nms_param = 4; + // Parameters used for saving detection results. + optional SaveOutputParameter save_output_param = 5; + // Type of coding method for bbox. + optional PriorBoxParameter.CodeType code_type = 6 [default = CORNER]; + // If true, variance is encoded in target; otherwise we need to adjust the + // predicted offset accordingly. + optional bool variance_encoded_in_target = 8 [default = false]; + // Number of total bboxes to be kept per image after nms step. + // -1 means keeping all bboxes after nms step. + optional int32 keep_top_k = 7 [default = -1]; + // Only consider detections whose confidences are larger than a threshold. + // If not provided, consider all boxes. + optional float confidence_threshold = 9; + // If true, visualize the detection results. + optional bool visualize = 10 [default = false]; + // The threshold used to visualize the detection results. + optional float visualize_threshold = 11; + // If provided, save outputs to video file. + optional string save_file = 12; +} + message DropoutParameter { optional float dropout_ratio = 1 [default = 0.5]; // dropout ratio enum Engine { @@ -1217,6 +1617,78 @@ message MemoryDataParameter { optional uint32 width = 4; } +// Message that store parameters used by MultiBoxLossLayer +message MultiBoxLossParameter { + // Localization loss type. + enum LocLossType { + L2 = 0; + SMOOTH_L1 = 1; + } + optional LocLossType loc_loss_type = 1 [default = SMOOTH_L1]; + // Confidence loss type. + enum ConfLossType { + SOFTMAX = 0; + LOGISTIC = 1; + } + optional ConfLossType conf_loss_type = 2 [default = SOFTMAX]; + // Weight for localization loss. + optional float loc_weight = 3 [default = 1.0]; + // Number of classes to be predicted. Required! + optional uint32 num_classes = 4; + // If true, bounding box are shared among different classes. + optional bool share_location = 5 [default = true]; + // Matching method during training. + enum MatchType { + BIPARTITE = 0; + PER_PREDICTION = 1; + } + optional MatchType match_type = 6 [default = PER_PREDICTION]; + // If match_type is PER_PREDICTION, use overlap_threshold to + // determine the extra matching bboxes. + optional float overlap_threshold = 7 [default = 0.5]; + // Use prior for matching. + optional bool use_prior_for_matching = 8 [default = true]; + // Background label id. + optional uint32 background_label_id = 9 [default = 0]; + // If true, also consider difficult ground truth. + optional bool use_difficult_gt = 10 [default = true]; + // If true, perform negative mining. + // DEPRECATED: use mining_type instead. + optional bool do_neg_mining = 11; + // The negative/positive ratio. + optional float neg_pos_ratio = 12 [default = 3.0]; + // The negative overlap upperbound for the unmatched predictions. + optional float neg_overlap = 13 [default = 0.5]; + // Type of coding method for bbox. + optional PriorBoxParameter.CodeType code_type = 14 [default = CORNER]; + // If true, encode the variance of prior box in the loc loss target instead of + // in bbox. + optional bool encode_variance_in_target = 16 [default = false]; + // If true, map all object classes to agnostic class. It is useful for learning + // objectness detector. + optional bool map_object_to_agnostic = 17 [default = false]; + // If true, ignore cross boundary bbox during matching. + // Cross boundary bbox is a bbox who is outside of the image region. + optional bool ignore_cross_boundary_bbox = 18 [default = false]; + // If true, only backpropagate on corners which are inside of the image + // region when encode_type is CORNER or CORNER_SIZE. + optional bool bp_inside = 19 [default = false]; + // Mining type during training. + // NONE : use all negatives. + // MAX_NEGATIVE : select negatives based on the score. + // HARD_EXAMPLE : select hard examples based on "Training Region-based Object Detectors with Online Hard Example Mining", Shrivastava et.al. + enum MiningType { + NONE = 0; + MAX_NEGATIVE = 1; + HARD_EXAMPLE = 2; + } + optional MiningType mining_type = 20 [default = MAX_NEGATIVE]; + // Parameters used for non maximum suppression durig hard example mining. + optional NonMaximumSuppressionParameter nms_param = 21; + optional int32 sample_size = 22 [default = 64]; + optional bool use_prior_for_nms = 23 [default = false]; +} + message MVNParameter { // This parameter can be set to false to normalize mean only optional bool normalize_variance = 1 [default = true]; @@ -1228,6 +1700,24 @@ message MVNParameter { optional float eps = 3 [default = 1e-9]; } +// Message that stores parameters used by NormalizeLayer +message NormalizeParameter { + optional bool across_spatial = 1 [default = true]; + // Initial value of scale. Default is 1.0 for all + optional FillerParameter scale_filler = 2; + // Whether or not scale parameters are shared across channels. + optional bool channel_shared = 3 [default = true]; + // Epsilon for not dividing by zero while normalizing variance + optional float eps = 4 [default = 1e-10]; +} + +message PermuteParameter { + // The new orders of the axes of data. Notice it should be with + // in the same range as the input data, and it starts from 0. + // Do not provide repeated order. + repeated uint32 order = 1; +} + message PoolingParameter { enum PoolMethod { MAX = 0; @@ -1269,6 +1759,48 @@ message PowerParameter { optional float shift = 3 [default = 0.0]; } +// Message that store parameters used by PriorBoxLayer +message PriorBoxParameter { + // Encode/decode type. + enum CodeType { + CORNER = 1; + CENTER_SIZE = 2; + CORNER_SIZE = 3; + } + // Minimum box size (in pixels). Required! + repeated float min_size = 1; + // Maximum box size (in pixels). Required! + repeated float max_size = 2; + // Various of aspect ratios. Duplicate ratios will be ignored. + // If none is provided, we use default ratio 1. + repeated float aspect_ratio = 3; + // If true, will flip each aspect ratio. + // For example, if there is aspect ratio "r", + // we will generate aspect ratio "1.0/r" as well. + optional bool flip = 4 [default = true]; + // If true, will clip the prior so that it is within [0, 1] + optional bool clip = 5 [default = false]; + // Variance for adjusting the prior bboxes. + repeated float variance = 6; + // By default, we calculate img_height, img_width, step_x, step_y based on + // bottom[0] (feat) and bottom[1] (img). Unless these values are explicitely + // provided. + // Explicitly provide the img_size. + optional uint32 img_size = 7; + // Either img_size or img_h/img_w should be specified; not both. + optional uint32 img_h = 8; + optional uint32 img_w = 9; + + // Explicitly provide the step size. + optional float step = 10; + // Either step or step_h/step_w should be specified; not both. + optional float step_h = 11; + optional float step_w = 12; + + // Offset to the top left corner of each cell. + optional float offset = 13 [default = 0.5]; +} + message PythonParameter { optional string module = 1; optional string layer = 2; @@ -1283,6 +1815,25 @@ message PythonParameter { optional bool share_in_parallel = 4 [default = false]; } +// Message that stores parameters used by RecurrentLayer +message RecurrentParameter { + // The dimension of the output (and usually hidden state) representation -- + // must be explicitly set to non-zero. + optional uint32 num_output = 1 [default = 0]; + + optional FillerParameter weight_filler = 2; // The filler for the weight + optional FillerParameter bias_filler = 3; // The filler for the bias + + // Whether to enable displaying debug_info in the unrolled recurrent net. + optional bool debug_info = 4 [default = false]; + + // Whether to add as additional inputs (bottoms) the initial hidden state + // blobs, and add as additional outputs (tops) the final timestep hidden state + // blobs. The number of additional bottom/top blobs required depends on the + // recurrent architecture -- e.g., 1 for RNNs, 2 for LSTMs. + optional bool expose_hidden = 5 [default = false]; +} + // Message that stores parameters used by ReductionLayer message ReductionParameter { enum ReductionOp { @@ -1487,6 +2038,18 @@ message ThresholdParameter { optional float threshold = 1 [default = 0]; // Strictly positive values } +message VideoDataParameter{ + enum VideoType { + WEBCAM = 0; + VIDEO = 1; + } + optional VideoType video_type = 1 [default = WEBCAM]; + optional int32 device_id = 2 [default = 0]; + optional string video_file = 3; + // Number of frames to be skipped before processing a frame. + optional uint32 skip_frames = 4 [default = 0]; +} + message WindowDataParameter { // Specify the data source. optional string source = 1; @@ -1729,6 +2292,6 @@ message PReLUParameter { // Initial value of a_i. Default is a_i=0.25 for all i. optional FillerParameter filler = 1; - // Whether or not slope paramters are shared across channels. + // Whether or not slope parameters are shared across channels. optional bool channel_shared = 2 [default = false]; } diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 08c0ab5213c..04326dc4590 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -5,11 +5,9 @@ #include #include "caffe/solver.hpp" -#include "caffe/util/format.hpp" -#include "caffe/util/gpu_memory.hpp" #include "caffe/util/hdf5.hpp" -#include "caffe/util/io.hpp" #include "caffe/util/upgrade_proto.hpp" +#include "caffe/util/bbox_util.hpp" namespace caffe { @@ -264,9 +262,13 @@ void Solver::Step(int iters) { // Just started or restored? const bool first_loop = iter_ == 0 || iterations_last_ < 0; if (iter_ == 0) { + LOG_IF(INFO, Caffe::root_solver()) << mgpu_str << "Initial Test started..."; + iteration_timer_->Start(); scores = TestAll(1, use_multi_gpu_testing); callback_soft_barrier(); - LOG_IF(INFO, Caffe::root_solver()) << mgpu_str << "Initial Test completed"; + float lapse = iteration_timer_->Seconds(); + LOG_IF(INFO, Caffe::root_solver()) << mgpu_str << "Initial Test completed in " + << lapse << "s"; } else if (test_and_snapshot || (param_.test_interval() && iter_ % param_.test_interval() == 0 && iterations_last_ >= 0)) { @@ -492,7 +494,12 @@ vector Solver::TestAll(const int iters, bool use_multi_gpu) { for (int test_net_id = 0; test_net_id < test_nets_.size() && !requested_early_exit_; ++test_net_id) { - vector scores = Test(test_net_id, iters, use_multi_gpu); + vector scores; + if (param_.eval_type() == "detection") { + scores = TestDetection(test_net_id); + } else { + scores = Test(test_net_id, iters, use_multi_gpu); + } if (scores.size() == 0UL) { return scores; } @@ -600,6 +607,132 @@ vector Solver::Test(const int test_net_id, const int iters, bool use_mult return scores; } +vector Solver::TestDetection(const int test_net_id) { + typedef float Dtype; + LOG_IF(INFO, Caffe::root_solver()) << "Iteration " << iter_ + << ", Testing net (#" << test_net_id << ")"; + if (!test_nets_[test_net_id]->trained_layers_shared()) { + CHECK_NOTNULL(test_nets_[test_net_id].get())->ShareTrainedLayersWith(net_.get()); + } + vector scores; + map > > > all_true_pos; + map > > > all_false_pos; + map > all_num_pos; + const shared_ptr& test_net = test_nets_[test_net_id]; + Dtype loss = 0; + for (int i = 0; i < param_.test_iter(test_net_id); ++i) { + SolverAction::Enum request = GetRequestedAction(); + // Check to see if stoppage of testing/training has been requested. + while (request != SolverAction::NONE) { + if (SolverAction::SNAPSHOT == request) { + Snapshot(); + } else if (SolverAction::STOP == request) { + requested_early_exit_ = true; + } + request = GetRequestedAction(); + } + if (requested_early_exit_) { + // break out of test loop. + break; + } + + Dtype iter_loss; + const vector& result = test_net->Forward(&iter_loss); + if (param_.test_compute_loss()) { + loss += iter_loss; + } + for (int j = 0; j < result.size(); ++j) { + CHECK_EQ(result[j]->width(), 5); + const Dtype* result_vec = result[j]->cpu_data(); + int num_det = result[j]->height(); + for (int k = 0; k < num_det; ++k) { + int item_id = static_cast(result_vec[k * 5]); + int label = static_cast(result_vec[k * 5 + 1]); + if (item_id == -1) { + // Special row of storing number of positives for a label. + if (all_num_pos[j].find(label) == all_num_pos[j].end()) { + all_num_pos[j][label] = static_cast(result_vec[k * 5 + 2]); + } else { + all_num_pos[j][label] += static_cast(result_vec[k * 5 + 2]); + } + } else { + // Normal row storing detection status. + float score = result_vec[k * 5 + 2]; + int tp = static_cast(result_vec[k * 5 + 3]); + int fp = static_cast(result_vec[k * 5 + 4]); + if (tp == 0 && fp == 0) { + // Ignore such case. It happens when a detection bbox is matched to + // a difficult gt bbox and we don't evaluate on difficult gt bbox. + continue; + } + if (scores.size() < MAX_SNAPSHOT_SCORES) { + scores.push_back(score); + } + all_true_pos[j][label].push_back(std::make_pair(score, tp)); + all_false_pos[j][label].push_back(std::make_pair(score, fp)); + } + } + } + } + if (requested_early_exit_) { + LOG(INFO) << "Test interrupted."; + return scores; + } + if (param_.test_compute_loss()) { + loss /= param_.test_iter(test_net_id); + LOG(INFO) << "Test loss: " << loss; + } + for (int i = 0; i < all_true_pos.size(); ++i) { + if (all_true_pos.find(i) == all_true_pos.end()) { + LOG(FATAL) << "Missing output_blob true_pos: " << i; + } + const map > >& true_pos = + all_true_pos.find(i)->second; + if (all_false_pos.find(i) == all_false_pos.end()) { + LOG(FATAL) << "Missing output_blob false_pos: " << i; + } + const map > >& false_pos = + all_false_pos.find(i)->second; + if (all_num_pos.find(i) == all_num_pos.end()) { + LOG(FATAL) << "Missing output_blob num_pos: " << i; + } + const map& num_pos = all_num_pos.find(i)->second; + map APs; + float mAP = 0.; + // Sort true_pos and false_pos with descend scores. + for (map::const_iterator it = num_pos.begin(); + it != num_pos.end(); ++it) { + int label = it->first; + int label_num_pos = it->second; + if (true_pos.find(label) == true_pos.end()) { + LOG(WARNING) << "Missing true_pos for label: " << label; + continue; + } + const vector >& label_true_pos = + true_pos.find(label)->second; + if (false_pos.find(label) == false_pos.end()) { + LOG(WARNING) << "Missing false_pos for label: " << label; + continue; + } + const vector >& label_false_pos = + false_pos.find(label)->second; + vector prec, rec; + ComputeAP(label_true_pos, label_num_pos, label_false_pos, + param_.ap_version(), &prec, &rec, &(APs[label])); + mAP += APs[label]; + if (param_.show_per_class_result()) { + LOG(INFO) << "class AP " << label << ": " << APs[label]; + } + } + mAP /= num_pos.size(); + const int output_blob_index = test_net->output_blob_indices()[i]; + const string& output_name = test_net->blob_names()[output_blob_index]; + LOG(INFO) << "Test net output mAP #" << i << ": " << output_name << " = " + << mAP; + } + return scores; +} + void Solver::SnapshotWithScores(const vector& scores) { CHECK(Caffe::root_solver()); string model_filename; diff --git a/src/caffe/tensor.cpp b/src/caffe/tensor.cpp index f79d315c0a4..e5dce74d12d 100644 --- a/src/caffe/tensor.cpp +++ b/src/caffe/tensor.cpp @@ -62,7 +62,7 @@ void Tensor::convert(Type new_type) { if (!new_mem || new_mem->size() != new_cap) { new_mem = make_shared(new_cap); } - const bool data_gpu = Caffe::mode() == Caffe::GPU; + const bool data_gpu = is_gpu_head(); if (current_mem->head() != SyncedMemory::UNINITIALIZED) { copy_helper(data_gpu, count_, data_gpu ? current_mem->gpu_data() : current_mem->cpu_data(), @@ -132,7 +132,7 @@ void Tensor::copy_helper(bool use_gpu, int count, const void* p_src, Type src_ty void Tensor::scale(float scale, void* handle) { shared_ptr& mem = mutable_synced_mem(); - if (Caffe::mode() == Caffe::GPU) { + if (is_gpu_head()) { cublasHandle_t cublas_handle = handle == nullptr ? Caffe::cublas_handle(0) : reinterpret_cast(handle); gpu_scal(count_, type_, mem->mutable_gpu_data(), scale, cublas_handle); @@ -143,7 +143,7 @@ void Tensor::scale(float scale, void* handle) { void Tensor::set(float value) { shared_ptr& mem = mutable_synced_mem(); - if (Caffe::mode() == Caffe::GPU) { + if (is_gpu_head()) { void* data = mem->mutable_gpu_data(); if (is_type(type_)) { caffe_gpu_set(count_, value, static_cast(data)); @@ -174,7 +174,7 @@ float Tensor::asum(int group) const { if (!mem || count_ <= 0) { return asum; } - if (Caffe::mode() == Caffe::GPU) { + if (is_gpu_head()) { if (is_type(type_)) { caffe_gpu_asum(count_, static_cast(mem->gpu_data()), &asum, group); } else if (is_type(type_)) { @@ -204,7 +204,7 @@ float Tensor::amax(int group) const { if (!mem || count_ <= 0) { return amax; } - if (Caffe::mode() == Caffe::GPU) { + if (is_gpu_head()) { if (is_type(type_)) { caffe_gpu_amax(count_, static_cast(mem->gpu_data()), &amax, group); } else if (is_type(type_)) { @@ -234,7 +234,7 @@ float Tensor::sumsq(int group) const { if (!mem || count_ <= 0) { return sumsq; } - if (Caffe::mode() == Caffe::GPU) { + if (is_gpu_head()) { if (is_type(type_)) { caffe_gpu_sumsq(count_, static_cast(mem->gpu_data()), &sumsq, group); } else if (is_type(type_)) { diff --git a/src/caffe/test/test_common.cpp b/src/caffe/test/test_common.cpp index c2cafe1ca44..9e07e411539 100644 --- a/src/caffe/test/test_common.cpp +++ b/src/caffe/test/test_common.cpp @@ -52,9 +52,11 @@ TEST_F(CommonTest, TestRandSeedGPU) { Caffe::set_random_seed(1701); CURAND_CHECK(curandGenerate(Caffe::curand_generator(), static_cast(data_a.mutable_gpu_data()), 10)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); Caffe::set_random_seed(1701); CURAND_CHECK(curandGenerate(Caffe::curand_generator(), static_cast(data_b.mutable_gpu_data()), 10)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); for (int i = 0; i < 10; ++i) { EXPECT_EQ(((const unsigned int*)(data_a.cpu_data()))[i], ((const unsigned int*)(data_b.cpu_data()))[i]); diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 905f1b57a5c..0e41c7d942b 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -387,14 +387,14 @@ TYPED_TEST(ConvolutionLayerTest, TestSimple3DConvolution) { top_data = this->blob_top_->cpu_data(); ref_top_data = this->ref_blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { - EXPECT_NEAR(top_data[i], ref_top_data[i], tol(1e-3, 5e-2)); + EXPECT_NEAR(top_data[i], ref_top_data[i], tol(1e-3, 1e-1)); } caffe_conv(this->blob_bottom_2_, convolution_param, layer->blobs(), this->MakeReferenceTop(this->blob_top_2_)); top_data = this->blob_top_2_->cpu_data(); ref_top_data = this->ref_blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { - EXPECT_NEAR(top_data[i], ref_top_data[i], tol(1e-3, 5e-2)); + EXPECT_NEAR(top_data[i], ref_top_data[i], tol(1e-3, 1e-1)); } } diff --git a/src/caffe/test/test_data_transformer.cpp b/src/caffe/test/test_data_transformer.cpp index 31e73f2f990..4824e343e64 100644 --- a/src/caffe/test/test_data_transformer.cpp +++ b/src/caffe/test/test_data_transformer.cpp @@ -38,7 +38,7 @@ class DataTransformTest : public ::testing::Test { int NumSequenceMatches(const TransformationParameter transform_param, Datum& datum, Phase phase) { // Get crop sequence with Caffe seed 1701. - DataTransformer transformer(transform_param, phase); + DataTransformer transformer(transform_param, phase); const int crop_size = transform_param.crop_size(); Caffe::set_random_seed(seed_); transformer.InitRand(); @@ -85,7 +85,7 @@ TYPED_TEST(DataTransformTest, TestEmptyTransform) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); EXPECT_EQ(blob.num(), 1); @@ -108,7 +108,7 @@ TYPED_TEST(DataTransformTest, TestEmptyTransformUniquePixels) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, 3, 4, 5); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); EXPECT_EQ(blob.num(), 1); @@ -132,7 +132,7 @@ TYPED_TEST(DataTransformTest, TestCropSize) { transform_param.set_crop_size(crop_size); Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); TBlob blob(1, channels, crop_size, crop_size); for (int iter = 0; iter < this->num_iter_; ++iter) { @@ -270,7 +270,7 @@ TYPED_TEST(DataTransformTest, TestMeanValue) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); for (int j = 0; j < blob.count(); ++j) { @@ -292,7 +292,7 @@ TYPED_TEST(DataTransformTest, TestMeanValues) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); for (int c = 0; c < channels; ++c) { @@ -331,7 +331,7 @@ TYPED_TEST(DataTransformTest, TestMeanFile) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); for (int j = 0; j < blob.count(); ++j) { @@ -345,6 +345,27 @@ class VarSzTransformsTest : public ::testing::Test { VarSzTransformsTest() : seed_(1701) {} + void VariableSizedTransforms(DataTransformer& transformer, Datum* datum) { + const TransformationParameter& param = transformer.transform_param(); + cv::Mat img1, img2; + const int color_mode = param.force_color() ? 1 : (param.force_gray() ? -1 : 0); + if (datum->encoded()) { + DecodeDatumToCVMat(*datum, color_mode, img1, false); + } else { + DatumToCVMat(*datum, img1, false); + } + + transformer.image_random_resize(img1, img2); + + if (transformer.image_random_crop_enabled()) { + transformer.image_random_crop(param.crop_size(), param.crop_size(), img2); + } + if (transformer.image_center_crop_enabled()) { + transformer.image_center_crop(param.crop_size(), param.crop_size(), img2); + } + CVMatToDatum(img2, *datum); + } + void Run( TransformationParameter transform_param, int expected_height, int expected_width) { @@ -356,12 +377,13 @@ class VarSzTransformsTest : public ::testing::Test { shared_ptr datum = make_shared(); FillDatum(label, channels, height, width, unique_pixels, datum.get()); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); Caffe::set_random_seed(seed_); transformer.InitRand(); shared_ptr transformed_datum = make_shared(*datum); - transformer.VariableSizedTransforms(transformed_datum.get()); + VariableSizedTransforms(transformer, transformed_datum.get()); + EXPECT_EQ(transformed_datum->channels(), 3); EXPECT_EQ(transformed_datum->height(), expected_height); EXPECT_EQ(transformed_datum->width(), expected_width); @@ -407,7 +429,7 @@ class GPUDataTransformTest : public GPUDeviceTest { int NumSequenceMatches(const TransformationParameter transform_param, Datum& datum, Phase phase) { // Get crop sequence with Caffe seed 1701. - DataTransformer transformer(transform_param, phase); + DataTransformer transformer(transform_param, phase); const int crop_size = transform_param.crop_size(); Caffe::set_random_seed(seed_); transformer.InitRand(); @@ -456,7 +478,7 @@ TYPED_TEST(GPUDataTransformTest, TestCropSize) { transform_param.set_use_gpu_transform(true); Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); TBlob blob(1, channels, crop_size, crop_size); for (int iter = 0; iter < this->num_iter_; ++iter) { @@ -600,7 +622,7 @@ TYPED_TEST(GPUDataTransformTest, TestMeanValue) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); for (int j = 0; j < blob.count(); ++j) { @@ -623,7 +645,7 @@ TYPED_TEST(GPUDataTransformTest, TestMeanValues) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); for (int c = 0; c < channels; ++c) { @@ -662,7 +684,7 @@ TYPED_TEST(GPUDataTransformTest, TestMeanFile) { Datum datum; FillDatum(label, channels, height, width, unique_pixels, &datum); TBlob blob(1, channels, height, width); - DataTransformer transformer(transform_param, TEST); + DataTransformer transformer(transform_param, TEST); transformer.InitRand(); transformer.Transform(datum, &blob); for (int j = 0; j < blob.count(); ++j) { diff --git a/src/caffe/test/test_lstm_layer.cpp b/src/caffe/test/test_lstm_layer.cpp new file mode 100644 index 00000000000..a2d8f43aef6 --- /dev/null +++ b/src/caffe/test/test_lstm_layer.cpp @@ -0,0 +1,324 @@ +#include +#include + +#include "gtest/gtest.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/layers/lstm_layer.hpp" + +#include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +namespace caffe { + +template +class LSTMLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + LSTMLayerTest() : num_output_(7) { + blob_bottom_vec_.push_back(&blob_bottom_); + blob_bottom_vec_.push_back(&blob_bottom_cont_); + blob_top_vec_.push_back(&blob_top_); + unit_blob_bottom_vec_.push_back(&unit_blob_bottom_c_prev_); + unit_blob_bottom_vec_.push_back(&unit_blob_bottom_x_); + unit_blob_bottom_vec_.push_back(&unit_blob_bottom_cont_); + unit_blob_top_vec_.push_back(&unit_blob_top_c_); + unit_blob_top_vec_.push_back(&unit_blob_top_h_); + + ReshapeBlobs(1, 3); + + layer_param_.set_forward_type(tp()); + layer_param_.set_backward_type(tp()); + layer_param_.set_forward_math(tp()); + layer_param_.set_backward_math(tp()); + layer_param_.mutable_recurrent_param()->set_num_output(num_output_); + FillerParameter* weight_filler = + layer_param_.mutable_recurrent_param()->mutable_weight_filler(); + weight_filler->set_type("gaussian"); + weight_filler->set_std(0.2); + FillerParameter* bias_filler = + layer_param_.mutable_recurrent_param()->mutable_bias_filler(); + bias_filler->set_type("gaussian"); + bias_filler->set_std(0.1); + + layer_param_.set_phase(TEST); + } + + void ReshapeBlobs(int num_timesteps, int num_instances) { + blob_bottom_.Reshape(num_timesteps, num_instances, 3, 2); + blob_bottom_static_.Reshape(num_instances, 2, 3, 4); + vector shape(2); + shape[0] = num_timesteps; + shape[1] = num_instances; + blob_bottom_cont_.Reshape(shape); + shape.push_back(num_output_); + + shape[0] = 1; shape[1] = num_instances; shape[2] = 4 * num_output_; + unit_blob_bottom_x_.Reshape(shape); + shape[0] = 1; shape[1] = num_instances; shape[2] = num_output_; + unit_blob_bottom_c_prev_.Reshape(shape); + shape.resize(2); + shape[0] = 1; shape[1] = num_instances; + unit_blob_bottom_cont_.Reshape(shape); + + FillerParameter filler_param; + filler_param.set_min(-1); + filler_param.set_max(1); + UniformFiller filler(filler_param); + filler.Fill(&blob_bottom_); + filler.Fill(&unit_blob_bottom_c_prev_); + filler.Fill(&unit_blob_bottom_x_); + } + + int num_output_; + LayerParameter layer_param_; + TBlob blob_bottom_; + TBlob blob_bottom_cont_; + TBlob blob_bottom_static_; + TBlob blob_top_; + vector blob_bottom_vec_; + vector blob_top_vec_; + + TBlob unit_blob_bottom_cont_; + TBlob unit_blob_bottom_c_prev_; + TBlob unit_blob_bottom_x_; + TBlob unit_blob_top_c_; + TBlob unit_blob_top_h_; + vector unit_blob_bottom_vec_; + vector unit_blob_top_vec_; +}; + +TYPED_TEST_CASE(LSTMLayerTest, TestDtypesAndDevices); + +TYPED_TEST(LSTMLayerTest, TestSetUp) { + typedef typename TypeParam::Dtype Dtype; + LSTMLayer layer(this->layer_param_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + vector expected_top_shape = this->blob_bottom_.shape(); + expected_top_shape.resize(3); + expected_top_shape[2] = this->num_output_; + EXPECT_TRUE(this->blob_top_.shape() == expected_top_shape); +} + +TYPED_TEST(LSTMLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; + const int kNumTimesteps = 3; + const int num = this->blob_bottom_.shape(1); + this->ReshapeBlobs(kNumTimesteps, num); + + // Fill the cont blob with <0, 1, 1, ..., 1>, + // indicating a sequence that begins at the first timestep + // then continues for the rest of the sequence. + for (int t = 0; t < kNumTimesteps; ++t) { + for (int n = 0; n < num; ++n) { + this->blob_bottom_cont_.mutable_cpu_data()[t * num + n] = t > 0; + } + } + + // Process the full sequence in a single batch. + FillerParameter filler_param; + filler_param.set_mean(0); + filler_param.set_std(1); + GaussianFiller sequence_filler(filler_param); + Caffe::set_random_seed(1); + sequence_filler.Fill(&this->blob_bottom_); + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + shared_ptr > layer(new LSTMLayer(this->layer_param_)); + Caffe::set_random_seed(1701); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + LOG(INFO) << "Calling forward for full sequence LSTM"; + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + + // Copy the inputs and outputs to reuse/check them later. + TBlob bottom_copy(this->blob_bottom_.shape()); + bottom_copy.CopyFrom(this->blob_bottom_); + TBlob top_copy(this->blob_top_.shape()); + top_copy.CopyFrom(this->blob_top_); + + // Process the batch one timestep at a time; + // check that we get the same result. + this->ReshapeBlobs(1, num); + layer.reset(new LSTMLayer(this->layer_param_)); + Caffe::set_random_seed(1701); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + const int bottom_count = this->blob_bottom_.count(); + const int top_count = this->blob_top_.count(); + const Dtype kEpsilon = 1e-5; + for (int t = 0; t < kNumTimesteps; ++t) { + caffe_copy(bottom_count, bottom_copy.cpu_data() + t * bottom_count, + this->blob_bottom_.mutable_cpu_data()); + for (int n = 0; n < num; ++n) { + this->blob_bottom_cont_.mutable_cpu_data()[n] = t > 0; + } + LOG(INFO) << "Calling forward for LSTM timestep " << t; + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + for (int i = 0; i < top_count; ++i) { + ASSERT_LT(t * top_count + i, top_copy.count()); + EXPECT_NEAR(this->blob_top_.cpu_data()[i], + top_copy.cpu_data()[t * top_count + i], kEpsilon) + << "t = " << t << "; i = " << i; + } + } + + // Process the batch one timestep at a time with all cont blobs set to 0. + // Check that we get a different result, except in the first timestep. + Caffe::set_random_seed(1701); + layer.reset(new LSTMLayer(this->layer_param_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + for (int t = 0; t < kNumTimesteps; ++t) { + caffe_copy(bottom_count, bottom_copy.cpu_data() + t * bottom_count, + this->blob_bottom_.mutable_cpu_data()); + for (int n = 0; n < num; ++n) { + this->blob_bottom_cont_.mutable_cpu_data()[n] = 0; + } + LOG(INFO) << "Calling forward for LSTM timestep " << t; + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + for (int i = 0; i < top_count; ++i) { + if (t == 0) { + EXPECT_NEAR(this->blob_top_.cpu_data()[i], + top_copy.cpu_data()[t * top_count + i], kEpsilon) + << "t = " << t << "; i = " << i; + } else { + EXPECT_NE(this->blob_top_.cpu_data()[i], + top_copy.cpu_data()[t * top_count + i]) + << "t = " << t << "; i = " << i; + } + } + } +} + +TYPED_TEST(LSTMLayerTest, TestLSTMUnitSetUp) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.set_forward_type(tp()); + layer_param.set_backward_type(tp()); + layer_param.set_forward_math(tp()); + layer_param.set_backward_math(tp()); + LSTMUnitLayer layer(layer_param); + layer.SetUp(this->unit_blob_bottom_vec_, this->unit_blob_top_vec_); + const int num_axes = this->unit_blob_bottom_c_prev_.num_axes(); + ASSERT_EQ(num_axes, this->unit_blob_top_c_.num_axes()); + ASSERT_EQ(num_axes, this->unit_blob_top_h_.num_axes()); + for (int i = 0; i < num_axes; ++i) { + EXPECT_EQ(this->unit_blob_bottom_c_prev_.shape(i), + this->unit_blob_top_c_.shape(i)); + EXPECT_EQ(this->unit_blob_bottom_c_prev_.shape(i), + this->unit_blob_top_h_.shape(i)); + } +} + +TYPED_TEST(LSTMLayerTest, TestLSTMUnitGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.set_forward_type(tp()); + layer_param.set_backward_type(tp()); + layer_param.set_forward_math(tp()); + layer_param.set_backward_math(tp()); + LSTMUnitLayer layer(layer_param); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + Dtype* cont_data = this->blob_bottom_cont_.mutable_cpu_data(); + cont_data[0] = 0; + cont_data[1] = 0; + cont_data[2] = 0; + checker.CheckGradientExhaustive(&layer, this->unit_blob_bottom_vec_, + this->unit_blob_top_vec_, 0); + checker.CheckGradientExhaustive(&layer, this->unit_blob_bottom_vec_, + this->unit_blob_top_vec_, 1); +} + +TYPED_TEST(LSTMLayerTest, TestLSTMUnitGradientNonZeroCont) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.set_forward_type(tp()); + layer_param.set_backward_type(tp()); + layer_param.set_forward_math(tp()); + layer_param.set_backward_math(tp()); + LSTMUnitLayer layer(layer_param); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + Dtype* cont_data = this->blob_bottom_cont_.mutable_cpu_data(); + cont_data[0] = 1; + cont_data[1] = 0; + cont_data[2] = 1; + checker.CheckGradientExhaustive(&layer, this->unit_blob_bottom_vec_, + this->unit_blob_top_vec_, 0); + checker.CheckGradientExhaustive(&layer, this->unit_blob_bottom_vec_, + this->unit_blob_top_vec_, 1); +} + +TYPED_TEST(LSTMLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + LSTMLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(LSTMLayerTest, TestGradientNonZeroCont) { + typedef typename TypeParam::Dtype Dtype; + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + LSTMLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + for (int i = 0; i < this->blob_bottom_cont_.count(); ++i) { + this->blob_bottom_cont_.mutable_cpu_data()[i] = i > 2; + } + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(LSTMLayerTest, TestGradientNonZeroContBufferSize2) { + typedef typename TypeParam::Dtype Dtype; + this->ReshapeBlobs(2, 2); + FillerParameter filler_param; + UniformFiller filler(filler_param); + filler.Fill(&this->blob_bottom_); + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + LSTMLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + for (int i = 0; i < this->blob_bottom_cont_.count(); ++i) { + this->blob_bottom_cont_.mutable_cpu_data()[i] = i > 2; + } + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(LSTMLayerTest, TestGradientNonZeroContBufferSize2WithStaticInput) { + typedef typename TypeParam::Dtype Dtype; + this->ReshapeBlobs(2, 2); + FillerParameter filler_param; + UniformFiller filler(filler_param); + filler.Fill(&this->blob_bottom_); + filler.Fill(&this->blob_bottom_static_); + this->blob_bottom_vec_.push_back(&this->blob_bottom_static_); + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + LSTMLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + for (int i = 0; i < this->blob_bottom_cont_.count(); ++i) { + this->blob_bottom_cont_.mutable_cpu_data()[i] = i > 2; + } + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 2); +} + + +} // namespace caffe diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 2dfe9d61269..f30c9117d20 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -819,7 +819,7 @@ class CuDNNNeuronLayerTest : public GPUDeviceTest { LayerParameter layer_param; // Fill in the given dropout_ratio, unless it's 0.5, in which case we don't // set it explicitly to test that 0.5 is the default. - if (dropout_ratio != 0.5) { + if (dropout_ratio != 0.5F) { layer_param.mutable_dropout_param()->set_dropout_ratio(dropout_ratio); } DropoutLayer layer(layer_param); @@ -829,7 +829,7 @@ class CuDNNNeuronLayerTest : public GPUDeviceTest { // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); - float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); + float scale = 1.F / (1.F - layer_param.dropout_param().dropout_ratio()); const int count = this->blob_bottom_->count(); // Initialize num_kept to count the number of inputs NOT dropped out. int num_kept = 0; diff --git a/src/caffe/test/test_rnn_layer.cpp b/src/caffe/test/test_rnn_layer.cpp new file mode 100644 index 00000000000..437e4e0a04c --- /dev/null +++ b/src/caffe/test/test_rnn_layer.cpp @@ -0,0 +1,241 @@ +#include +#include + +#include "gtest/gtest.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/layers/rnn_layer.hpp" + +#include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +namespace caffe { + +template +class RNNLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + RNNLayerTest() : num_output_(7) { + blob_bottom_vec_.push_back(&blob_bottom_); + blob_bottom_vec_.push_back(&blob_bottom_cont_); + blob_top_vec_.push_back(&blob_top_); + + ReshapeBlobs(1, 3); + + layer_param_.mutable_recurrent_param()->set_num_output(num_output_); + FillerParameter* weight_filler = + layer_param_.mutable_recurrent_param()->mutable_weight_filler(); + weight_filler->set_type("gaussian"); + weight_filler->set_std(0.2); + FillerParameter* bias_filler = + layer_param_.mutable_recurrent_param()->mutable_bias_filler(); + bias_filler->set_type("gaussian"); + bias_filler->set_std(0.1); + + layer_param_.set_phase(TEST); + } + + void ReshapeBlobs(int num_timesteps, int num_instances) { + blob_bottom_.Reshape(num_timesteps, num_instances, 3, 2); + blob_bottom_static_.Reshape(num_instances, 2, 3, 4); + vector shape(2); + shape[0] = num_timesteps; + shape[1] = num_instances; + blob_bottom_cont_.Reshape(shape); + + FillerParameter filler_param; + filler_param.set_min(-1); + filler_param.set_max(1); + UniformFiller filler(filler_param); + filler.Fill(&blob_bottom_); + } + + int num_output_; + LayerParameter layer_param_; + TBlob blob_bottom_; + TBlob blob_bottom_cont_; + TBlob blob_bottom_static_; + TBlob blob_top_; + vector blob_bottom_vec_; + vector blob_top_vec_; +}; + +TYPED_TEST_CASE(RNNLayerTest, TestDtypesGPUOnly); + +TYPED_TEST(RNNLayerTest, TestSetUp) { + typedef typename TypeParam::Dtype Dtype; + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + RNNLayer layer(this->layer_param_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + vector expected_top_shape = this->blob_bottom_.shape(); + expected_top_shape.resize(3); + expected_top_shape[2] = this->num_output_; + EXPECT_TRUE(this->blob_top_.shape() == expected_top_shape); +} + +TYPED_TEST(RNNLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; + const int kNumTimesteps = 3; + const int num = this->blob_bottom_.shape(1); + this->ReshapeBlobs(kNumTimesteps, num); + + // Fill the cont blob with <0, 1, 1, ..., 1>, + // indicating a sequence that begins at the first timestep + // then continues for the rest of the sequence. + for (int t = 0; t < kNumTimesteps; ++t) { + for (int n = 0; n < num; ++n) { + this->blob_bottom_cont_.mutable_cpu_data()[t * num + n] = t > 0; + } + } + + // Process the full sequence in a single batch. + FillerParameter filler_param; + filler_param.set_mean(0); + filler_param.set_std(1); + GaussianFiller sequence_filler(filler_param); + sequence_filler.Fill(&this->blob_bottom_); + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + shared_ptr > layer(new RNNLayer(this->layer_param_)); + Caffe::set_random_seed(1701); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + LOG(INFO) << "Calling forward for full sequence RNN"; + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + + // Copy the inputs and outputs to reuse/check them later. + TBlob bottom_copy(this->blob_bottom_.shape()); + bottom_copy.CopyFrom(this->blob_bottom_); + TBlob top_copy(this->blob_top_.shape()); + top_copy.CopyFrom(this->blob_top_); + + // Process the batch one timestep at a time; + // check that we get the same result. + this->ReshapeBlobs(1, num); + layer.reset(new RNNLayer(this->layer_param_)); + Caffe::set_random_seed(1701); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + const int bottom_count = this->blob_bottom_.count(); + const int top_count = this->blob_top_.count(); + const Dtype kEpsilon = 1e-5; + for (int t = 0; t < kNumTimesteps; ++t) { + caffe_copy(bottom_count, bottom_copy.cpu_data() + t * bottom_count, + this->blob_bottom_.mutable_cpu_data()); + for (int n = 0; n < num; ++n) { + this->blob_bottom_cont_.mutable_cpu_data()[n] = t > 0; + } + LOG(INFO) << "Calling forward for RNN timestep " << t; + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + for (int i = 0; i < top_count; ++i) { + ASSERT_LT(t * top_count + i, top_copy.count()); + EXPECT_NEAR(this->blob_top_.cpu_data()[i], + top_copy.cpu_data()[t * top_count + i], kEpsilon) + << "t = " << t << "; i = " << i; + } + } + + // Process the batch one timestep at a time with all cont blobs set to 0. + // Check that we get a different result, except in the first timestep. + Caffe::set_random_seed(1701); + layer.reset(new RNNLayer(this->layer_param_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + for (int t = 0; t < kNumTimesteps; ++t) { + caffe_copy(bottom_count, bottom_copy.cpu_data() + t * bottom_count, + this->blob_bottom_.mutable_cpu_data()); + for (int n = 0; n < num; ++n) { + this->blob_bottom_cont_.mutable_cpu_data()[n] = 0; + } + LOG(INFO) << "Calling forward for RNN timestep " << t; + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + for (int i = 0; i < top_count; ++i) { + if (t == 0) { + EXPECT_NEAR(this->blob_top_.cpu_data()[i], + top_copy.cpu_data()[t * top_count + i], kEpsilon) + << "t = " << t << "; i = " << i; + } else { + EXPECT_NE(this->blob_top_.cpu_data()[i], + top_copy.cpu_data()[t * top_count + i]) + << "t = " << t << "; i = " << i; + } + } + } +} + +TYPED_TEST(RNNLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + RNNLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(RNNLayerTest, TestGradientNonZeroCont) { + typedef typename TypeParam::Dtype Dtype; + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + RNNLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + for (int i = 0; i < this->blob_bottom_cont_.count(); ++i) { + this->blob_bottom_cont_.mutable_cpu_data()[i] = i > 2; + } + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(RNNLayerTest, TestGradientNonZeroContBufferSize2) { + typedef typename TypeParam::Dtype Dtype; + this->ReshapeBlobs(2, 2); + // fill the values + FillerParameter filler_param; + UniformFiller filler(filler_param); + filler.Fill(&this->blob_bottom_); + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tp()); + this->layer_param_.set_backward_math(tp()); + RNNLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + for (int i = 0; i < this->blob_bottom_cont_.count(); ++i) { + this->blob_bottom_cont_.mutable_cpu_data()[i] = i > 2; + } + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(RNNLayerTest, TestGradientNonZeroContBufferSize2WithStaticInput) { + typedef typename TypeParam::Dtype Dtype; + this->ReshapeBlobs(2, 2); + FillerParameter filler_param; + UniformFiller filler(filler_param); + filler.Fill(&this->blob_bottom_); + filler.Fill(&this->blob_bottom_static_); + this->blob_bottom_vec_.push_back(&this->blob_bottom_static_); + this->layer_param_.set_forward_type(tp()); + this->layer_param_.set_backward_type(tp()); + this->layer_param_.set_forward_math(tpmax()); + this->layer_param_.set_backward_math(tpmax()); + RNNLayer layer(this->layer_param_); + GradientChecker checker(tol(1e-2, 1e-1), tol(1e-3, 1e-2)); + for (int i = 0; i < this->blob_bottom_cont_.count(); ++i) { + this->blob_bottom_cont_.mutable_cpu_data()[i] = i > 2; + } + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 2); +} + +} // namespace caffe diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index a1fa436dbed..7990a6c7b10 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -76,6 +76,10 @@ TYPED_TEST_CASE(GPUStochasticPoolingLayerTest, TestDtypes); TYPED_TEST(GPUStochasticPoolingLayerTest, TestStochastic) { LayerParameter layer_param; layer_param.set_phase(TRAIN); + layer_param.set_forward_type(tp()); + layer_param.set_backward_type(tp()); + layer_param.set_forward_math(tp()); + layer_param.set_backward_math(tp()); PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); @@ -119,6 +123,10 @@ TYPED_TEST(GPUStochasticPoolingLayerTest, TestStochastic) { TYPED_TEST(GPUStochasticPoolingLayerTest, TestStochasticTestPhase) { LayerParameter layer_param; layer_param.set_phase(TEST); + layer_param.set_forward_type(tp()); + layer_param.set_backward_type(tp()); + layer_param.set_forward_math(tp()); + layer_param.set_backward_math(tp()); PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); @@ -154,21 +162,22 @@ TYPED_TEST(GPUStochasticPoolingLayerTest, TestStochasticTestPhase) { } TYPED_TEST(GPUStochasticPoolingLayerTest, TestGradient) { - if (!is_precise()) { - return; - } LayerParameter layer_param; layer_param.set_phase(TRAIN); + layer_param.set_forward_type(tp()); + layer_param.set_backward_type(tp()); + layer_param.set_forward_math(tp()); + layer_param.set_backward_math(tp()); PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); PoolingLayer layer(layer_param); - GradientChecker checker(tol(1e-4, 3e-3), tol(1e-2, 1e-1)); + GradientChecker checker(tol(1e-4, 3e-3), tol(1e-1, 1e-1), + 1701, 0.F, 1.F); // it is too expensive to call curand multiple times, so we don't do an // exhaustive gradient check. - checker.CheckGradient(&layer, this->blob_bottom_vec_, - this->blob_top_vec_); + checker.CheckGradient(&layer, this->blob_bottom_vec_, this->blob_top_vec_); } } // namespace caffe diff --git a/src/caffe/util/bbox_util.cpp b/src/caffe/util/bbox_util.cpp new file mode 100644 index 00000000000..4b96925e1d4 --- /dev/null +++ b/src/caffe/util/bbox_util.cpp @@ -0,0 +1,2304 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "boost/iterator/counting_iterator.hpp" + +#include "caffe/util/bbox_util.hpp" + +namespace caffe { + +bool SortBBoxAscend(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2) { + return bbox1.score() < bbox2.score(); +} + +bool SortBBoxDescend(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2) { + return bbox1.score() > bbox2.score(); +} + +template +bool SortScorePairAscend(const pair& pair1, + const pair& pair2) { + return pair1.first < pair2.first; +} + +// Explicit initialization. +template bool SortScorePairAscend(const pair& pair1, + const pair& pair2); +template bool SortScorePairAscend(const pair >& pair1, + const pair >& pair2); + +template +bool SortScorePairDescend(const pair& pair1, + const pair& pair2) { + return pair1.first > pair2.first; +} + +// Explicit initialization. +template bool SortScorePairDescend(const pair& pair1, + const pair& pair2); +template bool SortScorePairDescend(const pair >& pair1, + const pair >& pair2); + +NormalizedBBox UnitBBox() { + NormalizedBBox unit_bbox; + unit_bbox.set_xmin(0.); + unit_bbox.set_ymin(0.); + unit_bbox.set_xmax(1.); + unit_bbox.set_ymax(1.); + return unit_bbox; +} + +bool IsCrossBoundaryBBox(const NormalizedBBox& bbox) { + return bbox.xmin() < 0 || bbox.xmin() > 1 || + bbox.ymin() < 0 || bbox.ymin() > 1 || + bbox.xmax() < 0 || bbox.xmax() > 1 || + bbox.ymax() < 0 || bbox.ymax() > 1; +} + +void IntersectBBox(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2, + NormalizedBBox* intersect_bbox) { + if (bbox2.xmin() > bbox1.xmax() || bbox2.xmax() < bbox1.xmin() || + bbox2.ymin() > bbox1.ymax() || bbox2.ymax() < bbox1.ymin()) { + // Return [0, 0, 0, 0] if there is no intersection. + intersect_bbox->set_xmin(0); + intersect_bbox->set_ymin(0); + intersect_bbox->set_xmax(0); + intersect_bbox->set_ymax(0); + } else { + intersect_bbox->set_xmin(std::max(bbox1.xmin(), bbox2.xmin())); + intersect_bbox->set_ymin(std::max(bbox1.ymin(), bbox2.ymin())); + intersect_bbox->set_xmax(std::min(bbox1.xmax(), bbox2.xmax())); + intersect_bbox->set_ymax(std::min(bbox1.ymax(), bbox2.ymax())); + } +} + +float BBoxSize(const NormalizedBBox& bbox, const bool normalized) { + if (bbox.xmax() < bbox.xmin() || bbox.ymax() < bbox.ymin()) { + // If bbox is invalid (e.g. xmax < xmin or ymax < ymin), return 0. + return 0; + } else { + if (bbox.has_size()) { + return bbox.size(); + } else { + float width = bbox.xmax() - bbox.xmin(); + float height = bbox.ymax() - bbox.ymin(); + if (normalized) { + return width * height; + } else { + // If bbox is not within range [0, 1]. + return (width + 1) * (height + 1); + } + } + } +} + +template +Dtype BBoxSize(const Dtype* bbox, const bool normalized) { + if (bbox[2] < bbox[0] || bbox[3] < bbox[1]) { + // If bbox is invalid (e.g. xmax < xmin or ymax < ymin), return 0. + return Dtype(0.); + } else { + const Dtype width = bbox[2] - bbox[0]; + const Dtype height = bbox[3] - bbox[1]; + if (normalized) { + return width * height; + } else { + // If bbox is not within range [0, 1]. + return (width + 1) * (height + 1); + } + } +} + +template float BBoxSize(const float* bbox, const bool normalized); +template double BBoxSize(const double* bbox, const bool normalized); + +void ClipBBox(const NormalizedBBox& bbox, NormalizedBBox* clip_bbox) { + clip_bbox->set_xmin(std::max(std::min(bbox.xmin(), 1.f), 0.f)); + clip_bbox->set_ymin(std::max(std::min(bbox.ymin(), 1.f), 0.f)); + clip_bbox->set_xmax(std::max(std::min(bbox.xmax(), 1.f), 0.f)); + clip_bbox->set_ymax(std::max(std::min(bbox.ymax(), 1.f), 0.f)); + clip_bbox->clear_size(); + clip_bbox->set_size(BBoxSize(*clip_bbox)); + clip_bbox->set_difficult(bbox.difficult()); +} + +void ClipBBox(const NormalizedBBox& bbox, const float height, const float width, + NormalizedBBox* clip_bbox) { + clip_bbox->set_xmin(std::max(std::min(bbox.xmin(), width), 0.f)); + clip_bbox->set_ymin(std::max(std::min(bbox.ymin(), height), 0.f)); + clip_bbox->set_xmax(std::max(std::min(bbox.xmax(), width), 0.f)); + clip_bbox->set_ymax(std::max(std::min(bbox.ymax(), height), 0.f)); + clip_bbox->clear_size(); + clip_bbox->set_size(BBoxSize(*clip_bbox)); + clip_bbox->set_difficult(bbox.difficult()); +} + +void ScaleBBox(const NormalizedBBox& bbox, const int height, const int width, + NormalizedBBox* scale_bbox) { + scale_bbox->set_xmin(bbox.xmin() * width); + scale_bbox->set_ymin(bbox.ymin() * height); + scale_bbox->set_xmax(bbox.xmax() * width); + scale_bbox->set_ymax(bbox.ymax() * height); + scale_bbox->clear_size(); + bool normalized = !(width > 1 || height > 1); + scale_bbox->set_size(BBoxSize(*scale_bbox, normalized)); + scale_bbox->set_difficult(bbox.difficult()); +} + +void OutputBBox(const NormalizedBBox& bbox, const pair& img_size, + const bool has_resize, const ResizeParameter& resize_param, + NormalizedBBox* out_bbox) { + const int height = img_size.first; + const int width = img_size.second; + NormalizedBBox temp_bbox = bbox; + if (has_resize && resize_param.resize_mode()) { + float resize_height = resize_param.height(); + CHECK_GT(resize_height, 0); + float resize_width = resize_param.width(); + CHECK_GT(resize_width, 0); + float resize_aspect = resize_width / resize_height; + int height_scale = resize_param.height_scale(); + int width_scale = resize_param.width_scale(); + float aspect = static_cast(width) / height; + + float padding; + NormalizedBBox source_bbox; + switch (resize_param.resize_mode()) { + case ResizeParameter_Resize_mode_WARP: + ClipBBox(temp_bbox, &temp_bbox); + ScaleBBox(temp_bbox, height, width, out_bbox); + break; + case ResizeParameter_Resize_mode_FIT_LARGE_SIZE_AND_PAD: + if (aspect > resize_aspect) { + padding = (resize_height - resize_width / aspect) / 2; + source_bbox.set_xmin(0.); + source_bbox.set_ymin(padding / resize_height); + source_bbox.set_xmax(1.); + source_bbox.set_ymax(1. - padding / resize_height); + } else { + padding = (resize_width - resize_height * aspect) / 2; + source_bbox.set_xmin(padding / resize_width); + source_bbox.set_ymin(0.); + source_bbox.set_xmax(1. - padding / resize_width); + source_bbox.set_ymax(1.); + } + ProjectBBox(source_bbox, bbox, &temp_bbox); + ClipBBox(temp_bbox, &temp_bbox); + ScaleBBox(temp_bbox, height, width, out_bbox); + break; + case ResizeParameter_Resize_mode_FIT_SMALL_SIZE: + if (height_scale == 0 || width_scale == 0) { + ClipBBox(temp_bbox, &temp_bbox); + ScaleBBox(temp_bbox, height, width, out_bbox); + } else { + ScaleBBox(temp_bbox, height_scale, width_scale, out_bbox); + ClipBBox(*out_bbox, height, width, out_bbox); + } + break; + default: + LOG(FATAL) << "Unknown resize mode."; + } + } else { + // Clip the normalized bbox first. + ClipBBox(temp_bbox, &temp_bbox); + // Scale the bbox according to the original image size. + ScaleBBox(temp_bbox, height, width, out_bbox); + } +} + +void LocateBBox(const NormalizedBBox& src_bbox, const NormalizedBBox& bbox, + NormalizedBBox* loc_bbox) { + float src_width = src_bbox.xmax() - src_bbox.xmin(); + float src_height = src_bbox.ymax() - src_bbox.ymin(); + loc_bbox->set_xmin(src_bbox.xmin() + bbox.xmin() * src_width); + loc_bbox->set_ymin(src_bbox.ymin() + bbox.ymin() * src_height); + loc_bbox->set_xmax(src_bbox.xmin() + bbox.xmax() * src_width); + loc_bbox->set_ymax(src_bbox.ymin() + bbox.ymax() * src_height); + loc_bbox->set_difficult(bbox.difficult()); +} + +bool ProjectBBox(const NormalizedBBox& src_bbox, const NormalizedBBox& bbox, + NormalizedBBox* proj_bbox) { + if (bbox.xmin() >= src_bbox.xmax() || bbox.xmax() <= src_bbox.xmin() || + bbox.ymin() >= src_bbox.ymax() || bbox.ymax() <= src_bbox.ymin()) { + return false; + } + float src_width = src_bbox.xmax() - src_bbox.xmin(); + float src_height = src_bbox.ymax() - src_bbox.ymin(); + proj_bbox->set_xmin((bbox.xmin() - src_bbox.xmin()) / src_width); + proj_bbox->set_ymin((bbox.ymin() - src_bbox.ymin()) / src_height); + proj_bbox->set_xmax((bbox.xmax() - src_bbox.xmin()) / src_width); + proj_bbox->set_ymax((bbox.ymax() - src_bbox.ymin()) / src_height); + proj_bbox->set_difficult(bbox.difficult()); + ClipBBox(*proj_bbox, proj_bbox); + if (BBoxSize(*proj_bbox) > 0) { + return true; + } else { + return false; + } +} + +void ExtrapolateBBox(const ResizeParameter& param, const int height, + const int width, const NormalizedBBox& crop_bbox, NormalizedBBox* bbox) { + float height_scale = param.height_scale(); + float width_scale = param.width_scale(); + if (height_scale > 0 && width_scale > 0 && + param.resize_mode() == ResizeParameter_Resize_mode_FIT_SMALL_SIZE) { + float orig_aspect = static_cast(width) / height; + float resize_height = param.height(); + float resize_width = param.width(); + float resize_aspect = resize_width / resize_height; + if (orig_aspect < resize_aspect) { + resize_height = resize_width / orig_aspect; + } else { + resize_width = resize_height * orig_aspect; + } + float crop_height = resize_height * (crop_bbox.ymax() - crop_bbox.ymin()); + float crop_width = resize_width * (crop_bbox.xmax() - crop_bbox.xmin()); + CHECK_GE(crop_width, width_scale); + CHECK_GE(crop_height, height_scale); + bbox->set_xmin(bbox->xmin() * crop_width / width_scale); + bbox->set_xmax(bbox->xmax() * crop_width / width_scale); + bbox->set_ymin(bbox->ymin() * crop_height / height_scale); + bbox->set_ymax(bbox->ymax() * crop_height / height_scale); + } +} + +float JaccardOverlap(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2, + const bool normalized) { + NormalizedBBox intersect_bbox; + IntersectBBox(bbox1, bbox2, &intersect_bbox); + float intersect_width, intersect_height; + if (normalized) { + intersect_width = intersect_bbox.xmax() - intersect_bbox.xmin(); + intersect_height = intersect_bbox.ymax() - intersect_bbox.ymin(); + } else { + intersect_width = intersect_bbox.xmax() - intersect_bbox.xmin() + 1; + intersect_height = intersect_bbox.ymax() - intersect_bbox.ymin() + 1; + } + if (intersect_width > 0 && intersect_height > 0) { + float intersect_size = intersect_width * intersect_height; + float bbox1_size = BBoxSize(bbox1); + float bbox2_size = BBoxSize(bbox2); + return intersect_size / (bbox1_size + bbox2_size - intersect_size); + } else { + return 0.; + } +} + +template +Dtype JaccardOverlap(const Dtype* bbox1, const Dtype* bbox2) { + if (bbox2[0] > bbox1[2] || bbox2[2] < bbox1[0] || + bbox2[1] > bbox1[3] || bbox2[3] < bbox1[1]) { + return Dtype(0.); + } else { + const Dtype inter_xmin = std::max(bbox1[0], bbox2[0]); + const Dtype inter_ymin = std::max(bbox1[1], bbox2[1]); + const Dtype inter_xmax = std::min(bbox1[2], bbox2[2]); + const Dtype inter_ymax = std::min(bbox1[3], bbox2[3]); + + const Dtype inter_width = inter_xmax - inter_xmin; + const Dtype inter_height = inter_ymax - inter_ymin; + const Dtype inter_size = inter_width * inter_height; + + const Dtype bbox1_size = BBoxSize(bbox1); + const Dtype bbox2_size = BBoxSize(bbox2); + + return inter_size / (bbox1_size + bbox2_size - inter_size); + } +} + +template float JaccardOverlap(const float* bbox1, const float* bbox2); +template double JaccardOverlap(const double* bbox1, const double* bbox2); +template float16 JaccardOverlap(const float16* bbox1, const float16* bbox2); + +float BBoxCoverage(const NormalizedBBox& bbox1, const NormalizedBBox& bbox2) { + NormalizedBBox intersect_bbox; + IntersectBBox(bbox1, bbox2, &intersect_bbox); + float intersect_size = BBoxSize(intersect_bbox); + if (intersect_size > 0) { + float bbox1_size = BBoxSize(bbox1); + return intersect_size / bbox1_size; + } else { + return 0.; + } +} + +bool MeetEmitConstraint(const NormalizedBBox& src_bbox, + const NormalizedBBox& bbox, + const EmitConstraint& emit_constraint) { + EmitType emit_type = emit_constraint.emit_type(); + if (emit_type == EmitConstraint_EmitType_CENTER) { + float x_center = (bbox.xmin() + bbox.xmax()) / 2; + float y_center = (bbox.ymin() + bbox.ymax()) / 2; + if (x_center >= src_bbox.xmin() && x_center <= src_bbox.xmax() && + y_center >= src_bbox.ymin() && y_center <= src_bbox.ymax()) { + return true; + } else { + return false; + } + } else if (emit_type == EmitConstraint_EmitType_MIN_OVERLAP) { + float bbox_coverage = BBoxCoverage(bbox, src_bbox); + return bbox_coverage > emit_constraint.emit_overlap(); + } else { + LOG(FATAL) << "Unknown emit type."; + return false; + } +} + +void EncodeBBox( + const NormalizedBBox& prior_bbox, const vector& prior_variance, + const CodeType code_type, const bool encode_variance_in_target, + const NormalizedBBox& bbox, NormalizedBBox* encode_bbox) { + if (code_type == PriorBoxParameter_CodeType_CORNER) { + if (encode_variance_in_target) { + encode_bbox->set_xmin(bbox.xmin() - prior_bbox.xmin()); + encode_bbox->set_ymin(bbox.ymin() - prior_bbox.ymin()); + encode_bbox->set_xmax(bbox.xmax() - prior_bbox.xmax()); + encode_bbox->set_ymax(bbox.ymax() - prior_bbox.ymax()); + } else { + // Encode variance in bbox. + CHECK_EQ(prior_variance.size(), 4); + for (int i = 0; i < prior_variance.size(); ++i) { + CHECK_GT(prior_variance[i], 0); + } + encode_bbox->set_xmin( + (bbox.xmin() - prior_bbox.xmin()) / prior_variance[0]); + encode_bbox->set_ymin( + (bbox.ymin() - prior_bbox.ymin()) / prior_variance[1]); + encode_bbox->set_xmax( + (bbox.xmax() - prior_bbox.xmax()) / prior_variance[2]); + encode_bbox->set_ymax( + (bbox.ymax() - prior_bbox.ymax()) / prior_variance[3]); + } + } else if (code_type == PriorBoxParameter_CodeType_CENTER_SIZE) { + float prior_width = prior_bbox.xmax() - prior_bbox.xmin(); + CHECK_GT(prior_width, 0); + float prior_height = prior_bbox.ymax() - prior_bbox.ymin(); + CHECK_GT(prior_height, 0); + float prior_center_x = (prior_bbox.xmin() + prior_bbox.xmax()) / 2.; + float prior_center_y = (prior_bbox.ymin() + prior_bbox.ymax()) / 2.; + + float bbox_width = bbox.xmax() - bbox.xmin(); + CHECK_GT(bbox_width, 0); + float bbox_height = bbox.ymax() - bbox.ymin(); + CHECK_GT(bbox_height, 0); + float bbox_center_x = (bbox.xmin() + bbox.xmax()) / 2.; + float bbox_center_y = (bbox.ymin() + bbox.ymax()) / 2.; + + if (encode_variance_in_target) { + encode_bbox->set_xmin((bbox_center_x - prior_center_x) / prior_width); + encode_bbox->set_ymin((bbox_center_y - prior_center_y) / prior_height); + encode_bbox->set_xmax(log(bbox_width / prior_width)); + encode_bbox->set_ymax(log(bbox_height / prior_height)); + } else { + // Encode variance in bbox. + encode_bbox->set_xmin( + (bbox_center_x - prior_center_x) / prior_width / prior_variance[0]); + encode_bbox->set_ymin( + (bbox_center_y - prior_center_y) / prior_height / prior_variance[1]); + encode_bbox->set_xmax( + log(bbox_width / prior_width) / prior_variance[2]); + encode_bbox->set_ymax( + log(bbox_height / prior_height) / prior_variance[3]); + } + } else if (code_type == PriorBoxParameter_CodeType_CORNER_SIZE) { + float prior_width = prior_bbox.xmax() - prior_bbox.xmin(); + CHECK_GT(prior_width, 0); + float prior_height = prior_bbox.ymax() - prior_bbox.ymin(); + CHECK_GT(prior_height, 0); + if (encode_variance_in_target) { + encode_bbox->set_xmin((bbox.xmin() - prior_bbox.xmin()) / prior_width); + encode_bbox->set_ymin((bbox.ymin() - prior_bbox.ymin()) / prior_height); + encode_bbox->set_xmax((bbox.xmax() - prior_bbox.xmax()) / prior_width); + encode_bbox->set_ymax((bbox.ymax() - prior_bbox.ymax()) / prior_height); + } else { + // Encode variance in bbox. + CHECK_EQ(prior_variance.size(), 4); + for (int i = 0; i < prior_variance.size(); ++i) { + CHECK_GT(prior_variance[i], 0); + } + encode_bbox->set_xmin( + (bbox.xmin() - prior_bbox.xmin()) / prior_width / prior_variance[0]); + encode_bbox->set_ymin( + (bbox.ymin() - prior_bbox.ymin()) / prior_height / prior_variance[1]); + encode_bbox->set_xmax( + (bbox.xmax() - prior_bbox.xmax()) / prior_width / prior_variance[2]); + encode_bbox->set_ymax( + (bbox.ymax() - prior_bbox.ymax()) / prior_height / prior_variance[3]); + } + } else { + LOG(FATAL) << "Unknown LocLossType."; + } +} + +void DecodeBBox( + const NormalizedBBox& prior_bbox, const vector& prior_variance, + const CodeType code_type, const bool variance_encoded_in_target, + const bool clip_bbox, const NormalizedBBox& bbox, + NormalizedBBox* decode_bbox) { + if (code_type == PriorBoxParameter_CodeType_CORNER) { + if (variance_encoded_in_target) { + // variance is encoded in target, we simply need to add the offset + // predictions. + decode_bbox->set_xmin(prior_bbox.xmin() + bbox.xmin()); + decode_bbox->set_ymin(prior_bbox.ymin() + bbox.ymin()); + decode_bbox->set_xmax(prior_bbox.xmax() + bbox.xmax()); + decode_bbox->set_ymax(prior_bbox.ymax() + bbox.ymax()); + } else { + // variance is encoded in bbox, we need to scale the offset accordingly. + decode_bbox->set_xmin( + prior_bbox.xmin() + prior_variance[0] * bbox.xmin()); + decode_bbox->set_ymin( + prior_bbox.ymin() + prior_variance[1] * bbox.ymin()); + decode_bbox->set_xmax( + prior_bbox.xmax() + prior_variance[2] * bbox.xmax()); + decode_bbox->set_ymax( + prior_bbox.ymax() + prior_variance[3] * bbox.ymax()); + } + } else if (code_type == PriorBoxParameter_CodeType_CENTER_SIZE) { + float prior_width = prior_bbox.xmax() - prior_bbox.xmin(); + CHECK_GT(prior_width, 0); + float prior_height = prior_bbox.ymax() - prior_bbox.ymin(); + CHECK_GT(prior_height, 0); + float prior_center_x = (prior_bbox.xmin() + prior_bbox.xmax()) / 2.; + float prior_center_y = (prior_bbox.ymin() + prior_bbox.ymax()) / 2.; + + float decode_bbox_center_x, decode_bbox_center_y; + float decode_bbox_width, decode_bbox_height; + if (variance_encoded_in_target) { + // variance is encoded in target, we simply need to retore the offset + // predictions. + decode_bbox_center_x = bbox.xmin() * prior_width + prior_center_x; + decode_bbox_center_y = bbox.ymin() * prior_height + prior_center_y; + decode_bbox_width = exp(bbox.xmax()) * prior_width; + decode_bbox_height = exp(bbox.ymax()) * prior_height; + } else { + // variance is encoded in bbox, we need to scale the offset accordingly. + decode_bbox_center_x = + prior_variance[0] * bbox.xmin() * prior_width + prior_center_x; + decode_bbox_center_y = + prior_variance[1] * bbox.ymin() * prior_height + prior_center_y; + decode_bbox_width = + exp(prior_variance[2] * bbox.xmax()) * prior_width; + decode_bbox_height = + exp(prior_variance[3] * bbox.ymax()) * prior_height; + } + + decode_bbox->set_xmin(decode_bbox_center_x - decode_bbox_width / 2.); + decode_bbox->set_ymin(decode_bbox_center_y - decode_bbox_height / 2.); + decode_bbox->set_xmax(decode_bbox_center_x + decode_bbox_width / 2.); + decode_bbox->set_ymax(decode_bbox_center_y + decode_bbox_height / 2.); + } else if (code_type == PriorBoxParameter_CodeType_CORNER_SIZE) { + float prior_width = prior_bbox.xmax() - prior_bbox.xmin(); + CHECK_GT(prior_width, 0); + float prior_height = prior_bbox.ymax() - prior_bbox.ymin(); + CHECK_GT(prior_height, 0); + if (variance_encoded_in_target) { + // variance is encoded in target, we simply need to add the offset + // predictions. + decode_bbox->set_xmin(prior_bbox.xmin() + bbox.xmin() * prior_width); + decode_bbox->set_ymin(prior_bbox.ymin() + bbox.ymin() * prior_height); + decode_bbox->set_xmax(prior_bbox.xmax() + bbox.xmax() * prior_width); + decode_bbox->set_ymax(prior_bbox.ymax() + bbox.ymax() * prior_height); + } else { + // variance is encoded in bbox, we need to scale the offset accordingly. + decode_bbox->set_xmin( + prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width); + decode_bbox->set_ymin( + prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height); + decode_bbox->set_xmax( + prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width); + decode_bbox->set_ymax( + prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height); + } + } else { + LOG(FATAL) << "Unknown LocLossType."; + } + float bbox_size = BBoxSize(*decode_bbox); + decode_bbox->set_size(bbox_size); + if (clip_bbox) { + ClipBBox(*decode_bbox, decode_bbox); + } +} + +void DecodeBBoxes( + const vector& prior_bboxes, + const vector >& prior_variances, + const CodeType code_type, const bool variance_encoded_in_target, + const bool clip_bbox, const vector& bboxes, + vector* decode_bboxes) { + CHECK_EQ(prior_bboxes.size(), prior_variances.size()); + CHECK_EQ(prior_bboxes.size(), bboxes.size()); + int num_bboxes = prior_bboxes.size(); + if (num_bboxes >= 1) { + CHECK_EQ(prior_variances[0].size(), 4); + } + decode_bboxes->clear(); + for (int i = 0; i < num_bboxes; ++i) { + NormalizedBBox decode_bbox; + DecodeBBox(prior_bboxes[i], prior_variances[i], code_type, + variance_encoded_in_target, clip_bbox, bboxes[i], &decode_bbox); + decode_bboxes->push_back(decode_bbox); + } +} + +void DecodeBBoxesAll(const vector& all_loc_preds, + const vector& prior_bboxes, + const vector >& prior_variances, + const int num, const bool share_location, + const int num_loc_classes, const int background_label_id, + const CodeType code_type, const bool variance_encoded_in_target, + const bool clip, vector* all_decode_bboxes) { + CHECK_EQ(all_loc_preds.size(), num); + all_decode_bboxes->clear(); + all_decode_bboxes->resize(num); + for (int i = 0; i < num; ++i) { + // Decode predictions into bboxes. + LabelBBox& decode_bboxes = (*all_decode_bboxes)[i]; + for (int c = 0; c < num_loc_classes; ++c) { + int label = share_location ? -1 : c; + if (label == background_label_id) { + // Ignore background class. + continue; + } + if (all_loc_preds[i].find(label) == all_loc_preds[i].end()) { + // Something bad happened if there are no predictions for current label. + LOG(FATAL) << "Could not find location predictions for label " << label; + } + const vector& label_loc_preds = + all_loc_preds[i].find(label)->second; + DecodeBBoxes(prior_bboxes, prior_variances, + code_type, variance_encoded_in_target, clip, + label_loc_preds, &(decode_bboxes[label])); + } + } +} + +void MatchBBox(const vector& gt_bboxes, + const vector& pred_bboxes, const int label, + const MatchType match_type, const float overlap_threshold, + const bool ignore_cross_boundary_bbox, + vector* match_indices, vector* match_overlaps) { + int num_pred = pred_bboxes.size(); + match_indices->clear(); + match_indices->resize(num_pred, -1); + match_overlaps->clear(); + match_overlaps->resize(num_pred, 0.); + + int num_gt = 0; + vector gt_indices; + if (label == -1) { + // label -1 means comparing against all ground truth. + num_gt = gt_bboxes.size(); + for (int i = 0; i < num_gt; ++i) { + gt_indices.push_back(i); + } + } else { + // Count number of ground truth boxes which has the desired label. + for (int i = 0; i < gt_bboxes.size(); ++i) { + if (gt_bboxes[i].label() == label) { + num_gt++; + gt_indices.push_back(i); + } + } + } + if (num_gt == 0) { + return; + } + + // Store the positive overlap between predictions and ground truth. + map > overlaps; + for (int i = 0; i < num_pred; ++i) { + if (ignore_cross_boundary_bbox && IsCrossBoundaryBBox(pred_bboxes[i])) { + (*match_indices)[i] = -2; + continue; + } + for (int j = 0; j < num_gt; ++j) { + float overlap = JaccardOverlap(pred_bboxes[i], gt_bboxes[gt_indices[j]]); + if (overlap > 1e-6) { + (*match_overlaps)[i] = std::max((*match_overlaps)[i], overlap); + overlaps[i][j] = overlap; + } + } + } + + // Bipartite matching. + vector gt_pool; + for (int i = 0; i < num_gt; ++i) { + gt_pool.push_back(i); + } + while (gt_pool.size() > 0) { + // Find the most overlapped gt and cooresponding predictions. + int max_idx = -1; + int max_gt_idx = -1; + float max_overlap = -1; + for (map >::iterator it = overlaps.begin(); + it != overlaps.end(); ++it) { + int i = it->first; + if ((*match_indices)[i] != -1) { + // The prediction already has matched ground truth or is ignored. + continue; + } + for (int p = 0; p < gt_pool.size(); ++p) { + int j = gt_pool[p]; + if (it->second.find(j) == it->second.end()) { + // No overlap between the i-th prediction and j-th ground truth. + continue; + } + // Find the maximum overlapped pair. + if (it->second[j] > max_overlap) { + // If the prediction has not been matched to any ground truth, + // and the overlap is larger than maximum overlap, update. + max_idx = i; + max_gt_idx = j; + max_overlap = it->second[j]; + } + } + } + if (max_idx == -1) { + // Cannot find good match. + break; + } else { + CHECK_EQ((*match_indices)[max_idx], -1); + (*match_indices)[max_idx] = gt_indices[max_gt_idx]; + (*match_overlaps)[max_idx] = max_overlap; + // Erase the ground truth. + gt_pool.erase(std::find(gt_pool.begin(), gt_pool.end(), max_gt_idx)); + } + } + + switch (match_type) { + case MultiBoxLossParameter_MatchType_BIPARTITE: + // Already done. + break; + case MultiBoxLossParameter_MatchType_PER_PREDICTION: + // Get most overlaped for the rest prediction bboxes. + for (map >::iterator it = overlaps.begin(); + it != overlaps.end(); ++it) { + int i = it->first; + if ((*match_indices)[i] != -1) { + // The prediction already has matched ground truth or is ignored. + continue; + } + int max_gt_idx = -1; + float max_overlap = -1; + for (int j = 0; j < num_gt; ++j) { + if (it->second.find(j) == it->second.end()) { + // No overlap between the i-th prediction and j-th ground truth. + continue; + } + // Find the maximum overlapped pair. + float overlap = it->second[j]; + if (overlap >= overlap_threshold && overlap > max_overlap) { + // If the prediction has not been matched to any ground truth, + // and the overlap is larger than maximum overlap, update. + max_gt_idx = j; + max_overlap = overlap; + } + } + if (max_gt_idx != -1) { + // Found a matched ground truth. + CHECK_EQ((*match_indices)[i], -1); + (*match_indices)[i] = gt_indices[max_gt_idx]; + (*match_overlaps)[i] = max_overlap; + } + } + break; + default: + LOG(FATAL) << "Unknown matching type."; + break; + } + + return; +} + +void FindMatches(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + vector > >* all_match_overlaps, + vector > >* all_match_indices) { + // all_match_overlaps->clear(); + // all_match_indices->clear(); + // Get parameters. + CHECK(multibox_loss_param.has_num_classes()) << "Must provide num_classes."; + const int num_classes = multibox_loss_param.num_classes(); + CHECK_GE(num_classes, 1) << "num_classes should not be less than 1."; + const bool share_location = multibox_loss_param.share_location(); + const int loc_classes = share_location ? 1 : num_classes; + const MatchType match_type = multibox_loss_param.match_type(); + const float overlap_threshold = multibox_loss_param.overlap_threshold(); + const bool use_prior_for_matching = + multibox_loss_param.use_prior_for_matching(); + const int background_label_id = multibox_loss_param.background_label_id(); + const CodeType code_type = multibox_loss_param.code_type(); + const bool encode_variance_in_target = + multibox_loss_param.encode_variance_in_target(); + const bool ignore_cross_boundary_bbox = + multibox_loss_param.ignore_cross_boundary_bbox(); + // Find the matches. + int num = all_loc_preds.size(); + for (int i = 0; i < num; ++i) { + map > match_indices; + map > match_overlaps; + // Check if there is ground truth for current image. + if (all_gt_bboxes.find(i) == all_gt_bboxes.end()) { + // There is no gt for current image. All predictions are negative. + all_match_indices->push_back(match_indices); + all_match_overlaps->push_back(match_overlaps); + continue; + } + // Find match between predictions and ground truth. + const vector& gt_bboxes = all_gt_bboxes.find(i)->second; + if (!use_prior_for_matching) { + for (int c = 0; c < loc_classes; ++c) { + int label = share_location ? -1 : c; + if (!share_location && label == background_label_id) { + // Ignore background loc predictions. + continue; + } + // Decode the prediction into bbox first. + vector loc_bboxes; + bool clip_bbox = false; + DecodeBBoxes(prior_bboxes, prior_variances, + code_type, encode_variance_in_target, clip_bbox, + all_loc_preds[i].find(label)->second, &loc_bboxes); + MatchBBox(gt_bboxes, loc_bboxes, label, match_type, + overlap_threshold, ignore_cross_boundary_bbox, + &match_indices[label], &match_overlaps[label]); + } + } else { + // Use prior bboxes to match against all ground truth. + vector temp_match_indices; + vector temp_match_overlaps; + const int label = -1; + MatchBBox(gt_bboxes, prior_bboxes, label, match_type, overlap_threshold, + ignore_cross_boundary_bbox, &temp_match_indices, + &temp_match_overlaps); + if (share_location) { + match_indices[label] = temp_match_indices; + match_overlaps[label] = temp_match_overlaps; + } else { + // Get ground truth label for each ground truth bbox. + vector gt_labels; + for (int g = 0; g < gt_bboxes.size(); ++g) { + gt_labels.push_back(gt_bboxes[g].label()); + } + // Distribute the matching results to different loc_class. + for (int c = 0; c < loc_classes; ++c) { + if (c == background_label_id) { + // Ignore background loc predictions. + continue; + } + match_indices[c].resize(temp_match_indices.size(), -1); + match_overlaps[c] = temp_match_overlaps; + for (int m = 0; m < temp_match_indices.size(); ++m) { + if (temp_match_indices[m] > -1) { + const int gt_idx = temp_match_indices[m]; + CHECK_LT(gt_idx, gt_labels.size()); + if (c == gt_labels[gt_idx]) { + match_indices[c][m] = gt_idx; + } + } + } + } + } + } + all_match_indices->push_back(match_indices); + all_match_overlaps->push_back(match_overlaps); + } +} + +int CountNumMatches(const vector > >& all_match_indices, + const int num) { + int num_matches = 0; + for (int i = 0; i < num; ++i) { + const map >& match_indices = all_match_indices[i]; + for (map >::const_iterator it = match_indices.begin(); + it != match_indices.end(); ++it) { + const vector& match_index = it->second; + for (int m = 0; m < match_index.size(); ++m) { + if (match_index[m] > -1) { + ++num_matches; + } + } + } + } + return num_matches; +} + +inline bool IsEligibleMining(const MiningType mining_type, const int match_idx, + const float match_overlap, const float neg_overlap) { + if (mining_type == MultiBoxLossParameter_MiningType_MAX_NEGATIVE) { + return match_idx == -1 && match_overlap < neg_overlap; + } else if (mining_type == MultiBoxLossParameter_MiningType_HARD_EXAMPLE) { + return true; + } else { + return false; + } +} + +template +void MineHardExamples(const TBlob& conf_blob, + const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const vector > >& all_match_overlaps, + const MultiBoxLossParameter& multibox_loss_param, + int* num_matches, int* num_negs, + vector > >* all_match_indices, + vector >* all_neg_indices) { + int num = all_loc_preds.size(); + // CHECK_EQ(num, all_match_overlaps.size()); + // CHECK_EQ(num, all_match_indices->size()); + // all_neg_indices->clear(); + *num_matches = CountNumMatches(*all_match_indices, num); + *num_negs = 0; + int num_priors = prior_bboxes.size(); + CHECK_EQ(num_priors, prior_variances.size()); + // Get parameters. + CHECK(multibox_loss_param.has_num_classes()) << "Must provide num_classes."; + const int num_classes = multibox_loss_param.num_classes(); + CHECK_GE(num_classes, 1) << "num_classes should not be less than 1."; + const int background_label_id = multibox_loss_param.background_label_id(); + const bool use_prior_for_nms = multibox_loss_param.use_prior_for_nms(); + const ConfLossType conf_loss_type = multibox_loss_param.conf_loss_type(); + const MiningType mining_type = multibox_loss_param.mining_type(); + if (mining_type == MultiBoxLossParameter_MiningType_NONE) { + return; + } + const LocLossType loc_loss_type = multibox_loss_param.loc_loss_type(); + const float neg_pos_ratio = multibox_loss_param.neg_pos_ratio(); + const float neg_overlap = multibox_loss_param.neg_overlap(); + const CodeType code_type = multibox_loss_param.code_type(); + const bool encode_variance_in_target = + multibox_loss_param.encode_variance_in_target(); + const bool has_nms_param = multibox_loss_param.has_nms_param(); + float nms_threshold = 0; + int top_k = -1; + if (has_nms_param) { + nms_threshold = multibox_loss_param.nms_param().nms_threshold(); + top_k = multibox_loss_param.nms_param().top_k(); + } + const int sample_size = multibox_loss_param.sample_size(); + // Compute confidence losses based on matching results. + vector > all_conf_loss; +// ComputeConfLoss(conf_blob.cpu_data(), num, num_priors, num_classes, +// background_label_id, conf_loss_type, *all_match_indices, all_gt_bboxes, +// &all_conf_loss); + ComputeConfLossGPU(conf_blob, num, num_priors, num_classes, + background_label_id, conf_loss_type, *all_match_indices, all_gt_bboxes, + &all_conf_loss); + vector > all_loc_loss; + if (mining_type == MultiBoxLossParameter_MiningType_HARD_EXAMPLE) { + // Compute localization losses based on matching results. + TBlob loc_pred, loc_gt; + if (*num_matches != 0) { + vector loc_shape(2, 1); + loc_shape[1] = *num_matches * 4; + loc_pred.Reshape(loc_shape); + loc_gt.Reshape(loc_shape); + Dtype* loc_pred_data = loc_pred.mutable_cpu_data(); + Dtype* loc_gt_data = loc_gt.mutable_cpu_data(); + EncodeLocPrediction(all_loc_preds, all_gt_bboxes, *all_match_indices, + prior_bboxes, prior_variances, multibox_loss_param, + loc_pred_data, loc_gt_data); + } + ComputeLocLoss(loc_pred, loc_gt, *all_match_indices, num, + num_priors, loc_loss_type, &all_loc_loss); + } else { + // No localization loss. + for (int i = 0; i < num; ++i) { + vector loc_loss(num_priors, 0.f); + all_loc_loss.push_back(loc_loss); + } + } + for (int i = 0; i < num; ++i) { + map >& match_indices = (*all_match_indices)[i]; + const map >& match_overlaps = all_match_overlaps[i]; + // loc + conf loss. + const vector& conf_loss = all_conf_loss[i]; + const vector& loc_loss = all_loc_loss[i]; + vector loss; + std::transform(conf_loss.begin(), conf_loss.end(), loc_loss.begin(), + std::back_inserter(loss), std::plus()); + // Pick negatives or hard examples based on loss. + set sel_indices; + vector neg_indices; + for (map >::iterator it = match_indices.begin(); + it != match_indices.end(); ++it) { + const int label = it->first; + int num_sel = 0; + // Get potential indices and loss pairs. + vector > loss_indices; + for (int m = 0; m < match_indices[label].size(); ++m) { + if (IsEligibleMining(mining_type, match_indices[label][m], + match_overlaps.find(label)->second[m], neg_overlap)) { + loss_indices.push_back(std::make_pair(loss[m], m)); + ++num_sel; + } + } + if (mining_type == MultiBoxLossParameter_MiningType_MAX_NEGATIVE) { + int num_pos = 0; + for (int m = 0; m < match_indices[label].size(); ++m) { + if (match_indices[label][m] > -1) { + ++num_pos; + } + } + num_sel = std::min(static_cast(num_pos * neg_pos_ratio), num_sel); + } else if (mining_type == MultiBoxLossParameter_MiningType_HARD_EXAMPLE) { + CHECK_GT(sample_size, 0); + num_sel = std::min(sample_size, num_sel); + } + // Select samples. + if (has_nms_param && nms_threshold > 0) { + // Do nms before selecting samples. + vector sel_loss; + vector sel_bboxes; + if (use_prior_for_nms) { + for (int m = 0; m < match_indices[label].size(); ++m) { + if (IsEligibleMining(mining_type, match_indices[label][m], + match_overlaps.find(label)->second[m], neg_overlap)) { + sel_loss.push_back(loss[m]); + sel_bboxes.push_back(prior_bboxes[m]); + } + } + } else { + // Decode the prediction into bbox first. + vector loc_bboxes; + bool clip_bbox = false; + DecodeBBoxes(prior_bboxes, prior_variances, + code_type, encode_variance_in_target, clip_bbox, + all_loc_preds[i].find(label)->second, &loc_bboxes); + for (int m = 0; m < match_indices[label].size(); ++m) { + if (IsEligibleMining(mining_type, match_indices[label][m], + match_overlaps.find(label)->second[m], neg_overlap)) { + sel_loss.push_back(loss[m]); + sel_bboxes.push_back(loc_bboxes[m]); + } + } + } + // Do non-maximum suppression based on the loss. + vector nms_indices; + ApplyNMS(sel_bboxes, sel_loss, nms_threshold, top_k, &nms_indices); + if (nms_indices.size() < num_sel) { + LOG(INFO) << "not enough sample after nms: " << nms_indices.size(); + } + // Pick top example indices after nms. + num_sel = std::min(static_cast(nms_indices.size()), num_sel); + for (int n = 0; n < num_sel; ++n) { + sel_indices.insert(loss_indices[nms_indices[n]].second); + } + } else { + // Pick top example indices based on loss. + std::sort(loss_indices.begin(), loss_indices.end(), + SortScorePairDescend); + for (int n = 0; n < num_sel; ++n) { + sel_indices.insert(loss_indices[n].second); + } + } + // Update the match_indices and select neg_indices. + for (int m = 0; m < match_indices[label].size(); ++m) { + if (match_indices[label][m] > -1) { + if (mining_type == MultiBoxLossParameter_MiningType_HARD_EXAMPLE && + sel_indices.find(m) == sel_indices.end()) { + match_indices[label][m] = -1; + *num_matches -= 1; + } + } else if (match_indices[label][m] == -1) { + if (sel_indices.find(m) != sel_indices.end()) { + neg_indices.push_back(m); + *num_negs += 1; + } + } + } + } + all_neg_indices->push_back(neg_indices); + } +} + +// Explicite initialization. +template void MineHardExamples(const TBlob& conf_blob, + const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const vector > >& all_match_overlaps, + const MultiBoxLossParameter& multibox_loss_param, + int* num_matches, int* num_negs, + vector > >* all_match_indices, + vector >* all_neg_indices); +template void MineHardExamples(const TBlob& conf_blob, + const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const vector > >& all_match_overlaps, + const MultiBoxLossParameter& multibox_loss_param, + int* num_matches, int* num_negs, + vector > >* all_match_indices, + vector >* all_neg_indices); +template void MineHardExamples(const TBlob& conf_blob, + const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector& prior_bboxes, + const vector >& prior_variances, + const vector > >& all_match_overlaps, + const MultiBoxLossParameter& multibox_loss_param, + int* num_matches, int* num_negs, + vector > >* all_match_indices, + vector >* all_neg_indices); +template +void GetGroundTruth(const Dtype* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map >* all_gt_bboxes) { + all_gt_bboxes->clear(); + for (int i = 0; i < num_gt; ++i) { + int start_idx = i * 8; + int item_id = gt_data[start_idx]; + if (item_id == -1) { + continue; + } + int label = gt_data[start_idx + 1]; + CHECK_NE(background_label_id, label) + << "Found background label in the dataset."; + bool difficult = static_cast(gt_data[start_idx + 7]); + if (!use_difficult_gt && difficult) { + // Skip reading difficult ground truth. + continue; + } + NormalizedBBox bbox; + bbox.set_label(label); + bbox.set_xmin(gt_data[start_idx + 3]); + bbox.set_ymin(gt_data[start_idx + 4]); + bbox.set_xmax(gt_data[start_idx + 5]); + bbox.set_ymax(gt_data[start_idx + 6]); + bbox.set_difficult(difficult); + float bbox_size = BBoxSize(bbox); + bbox.set_size(bbox_size); + (*all_gt_bboxes)[item_id].push_back(bbox); + } +} + +// Explicit initialization. +template void GetGroundTruth(const float* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map >* all_gt_bboxes); +template void GetGroundTruth(const double* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map >* all_gt_bboxes); +template void GetGroundTruth(const float16* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map >* all_gt_bboxes); + +template +void GetGroundTruth(const Dtype* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map* all_gt_bboxes) { + all_gt_bboxes->clear(); + for (int i = 0; i < num_gt; ++i) { + int start_idx = i * 8; + int item_id = gt_data[start_idx]; + if (item_id == -1) { + break; + } + NormalizedBBox bbox; + int label = gt_data[start_idx + 1]; + CHECK_NE(background_label_id, label) + << "Found background label in the dataset."; + bool difficult = static_cast(gt_data[start_idx + 7]); + if (!use_difficult_gt && difficult) { + // Skip reading difficult ground truth. + continue; + } + bbox.set_xmin(gt_data[start_idx + 3]); + bbox.set_ymin(gt_data[start_idx + 4]); + bbox.set_xmax(gt_data[start_idx + 5]); + bbox.set_ymax(gt_data[start_idx + 6]); + bbox.set_difficult(difficult); + float bbox_size = BBoxSize(bbox); + bbox.set_size(bbox_size); + (*all_gt_bboxes)[item_id][label].push_back(bbox); + } +} + +// Explicit initialization. +template void GetGroundTruth(const float* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map* all_gt_bboxes); +template void GetGroundTruth(const double* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map* all_gt_bboxes); +template void GetGroundTruth(const float16* gt_data, const int num_gt, + const int background_label_id, const bool use_difficult_gt, + map* all_gt_bboxes); +template +void GetLocPredictions(const Dtype* loc_data, const int num, + const int num_preds_per_class, const int num_loc_classes, + const bool share_location, vector* loc_preds) { + loc_preds->clear(); + if (share_location) { + CHECK_EQ(num_loc_classes, 1); + } + loc_preds->resize(num); + for (int i = 0; i < num; ++i) { + LabelBBox& label_bbox = (*loc_preds)[i]; + for (int p = 0; p < num_preds_per_class; ++p) { + int start_idx = p * num_loc_classes * 4; + for (int c = 0; c < num_loc_classes; ++c) { + int label = share_location ? -1 : c; + if (label_bbox.find(label) == label_bbox.end()) { + label_bbox[label].resize(num_preds_per_class); + } + label_bbox[label][p].set_xmin(loc_data[start_idx + c * 4]); + label_bbox[label][p].set_ymin(loc_data[start_idx + c * 4 + 1]); + label_bbox[label][p].set_xmax(loc_data[start_idx + c * 4 + 2]); + label_bbox[label][p].set_ymax(loc_data[start_idx + c * 4 + 3]); + } + } + loc_data += num_preds_per_class * num_loc_classes * 4; + } +} + +// Explicit initialization. +template void GetLocPredictions(const float* loc_data, const int num, + const int num_preds_per_class, const int num_loc_classes, + const bool share_location, vector* loc_preds); +template void GetLocPredictions(const double* loc_data, const int num, + const int num_preds_per_class, const int num_loc_classes, + const bool share_location, vector* loc_preds); +template void GetLocPredictions(const float16* loc_data, const int num, + const int num_preds_per_class, const int num_loc_classes, + const bool share_location, vector* loc_preds); +template +void EncodeLocPrediction(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector > >& all_match_indices, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + Dtype* loc_pred_data, Dtype* loc_gt_data) { + int num = all_loc_preds.size(); + // CHECK_EQ(num, all_match_indices.size()); + // Get parameters. + const CodeType code_type = multibox_loss_param.code_type(); + const bool encode_variance_in_target = + multibox_loss_param.encode_variance_in_target(); + const bool bp_inside = multibox_loss_param.bp_inside(); + const bool use_prior_for_matching = + multibox_loss_param.use_prior_for_matching(); + int count = 0; + for (int i = 0; i < num; ++i) { + for (map >::const_iterator + it = all_match_indices[i].begin(); + it != all_match_indices[i].end(); ++it) { + const int label = it->first; + const vector& match_index = it->second; + CHECK(all_loc_preds[i].find(label) != all_loc_preds[i].end()); + const vector& loc_pred = + all_loc_preds[i].find(label)->second; + for (int j = 0; j < match_index.size(); ++j) { + if (match_index[j] <= -1) { + continue; + } + // Store encoded ground truth. + const int gt_idx = match_index[j]; + CHECK(all_gt_bboxes.find(i) != all_gt_bboxes.end()); + CHECK_LT(gt_idx, all_gt_bboxes.find(i)->second.size()); + const NormalizedBBox& gt_bbox = all_gt_bboxes.find(i)->second[gt_idx]; + NormalizedBBox gt_encode; + CHECK_LT(j, prior_bboxes.size()); + EncodeBBox(prior_bboxes[j], prior_variances[j], code_type, + encode_variance_in_target, gt_bbox, >_encode); + loc_gt_data[count * 4] = gt_encode.xmin(); + loc_gt_data[count * 4 + 1] = gt_encode.ymin(); + loc_gt_data[count * 4 + 2] = gt_encode.xmax(); + loc_gt_data[count * 4 + 3] = gt_encode.ymax(); + // Store location prediction. + CHECK_LT(j, loc_pred.size()); + if (bp_inside) { + NormalizedBBox match_bbox = prior_bboxes[j]; + if (!use_prior_for_matching) { + const bool clip_bbox = false; + DecodeBBox(prior_bboxes[j], prior_variances[j], code_type, + encode_variance_in_target, clip_bbox, loc_pred[j], + &match_bbox); + } + // When a dimension of match_bbox is outside of image region, use + // gt_encode to simulate zero gradient. + loc_pred_data[count * 4] = + (match_bbox.xmin() < 0 || match_bbox.xmin() > 1) ? + gt_encode.xmin() : loc_pred[j].xmin(); + loc_pred_data[count * 4 + 1] = + (match_bbox.ymin() < 0 || match_bbox.ymin() > 1) ? + gt_encode.ymin() : loc_pred[j].ymin(); + loc_pred_data[count * 4 + 2] = + (match_bbox.xmax() < 0 || match_bbox.xmax() > 1) ? + gt_encode.xmax() : loc_pred[j].xmax(); + loc_pred_data[count * 4 + 3] = + (match_bbox.ymax() < 0 || match_bbox.ymax() > 1) ? + gt_encode.ymax() : loc_pred[j].ymax(); + } else { + loc_pred_data[count * 4] = loc_pred[j].xmin(); + loc_pred_data[count * 4 + 1] = loc_pred[j].ymin(); + loc_pred_data[count * 4 + 2] = loc_pred[j].xmax(); + loc_pred_data[count * 4 + 3] = loc_pred[j].ymax(); + } + if (encode_variance_in_target) { + for (int k = 0; k < 4; ++k) { + CHECK_GT(prior_variances[j][k], 0); + loc_pred_data[count * 4 + k] /= prior_variances[j][k]; + loc_gt_data[count * 4 + k] /= prior_variances[j][k]; + } + } + ++count; + } + } + } +} + +// Explicit initialization. +template void EncodeLocPrediction(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector > >& all_match_indices, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + float* loc_pred_data, float* loc_gt_data); +template void EncodeLocPrediction(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector > >& all_match_indices, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + double* loc_pred_data, double* loc_gt_data); +template void EncodeLocPrediction(const vector& all_loc_preds, + const map >& all_gt_bboxes, + const vector > >& all_match_indices, + const vector& prior_bboxes, + const vector >& prior_variances, + const MultiBoxLossParameter& multibox_loss_param, + float16* loc_pred_data, float16* loc_gt_data); +template +void ComputeLocLoss(const TBlob& loc_pred, const TBlob& loc_gt, + const vector > >& all_match_indices, + const int num, const int num_priors, const LocLossType loc_loss_type, + vector >* all_loc_loss) { + int loc_count = loc_pred.count(); + CHECK_EQ(loc_count, loc_gt.count()); + TBlob diff; + const Dtype* diff_data = NULL; + if (loc_count != 0) { + diff.Reshape(loc_pred.shape()); + caffe_sub(loc_count, loc_pred.cpu_data(), loc_gt.cpu_data(), + diff.mutable_cpu_data()); + diff_data = diff.cpu_data(); + } + int count = 0; + for (int i = 0; i < num; ++i) { + vector loc_loss(num_priors, 0.f); + for (map >::const_iterator + it = all_match_indices[i].begin(); + it != all_match_indices[i].end(); ++it) { + const vector& match_index = it->second; + CHECK_EQ(num_priors, match_index.size()); + for (int j = 0; j < match_index.size(); ++j) { + if (match_index[j] <= -1) { + continue; + } + Dtype loss = 0; + for (int k = 0; k < 4; ++k) { + Dtype val = diff_data[count * 4 + k]; + if (loc_loss_type == MultiBoxLossParameter_LocLossType_SMOOTH_L1) { + Dtype abs_val = fabs(val); + if (abs_val < 1.) { + loss += 0.5 * val * val; + } else { + loss += abs_val - 0.5; + } + } else if (loc_loss_type == MultiBoxLossParameter_LocLossType_L2) { + loss += 0.5 * val * val; + } else { + LOG(FATAL) << "Unknown loc loss type."; + } + } + loc_loss[j] = loss; + ++count; + } + } + all_loc_loss->push_back(loc_loss); + } +} + +// Explicit initialization. +template void ComputeLocLoss(const TBlob& loc_pred, + const TBlob& loc_gt, + const vector > >& all_match_indices, + const int num, const int num_priors, const LocLossType loc_loss_type, + vector >* all_loc_loss); +template void ComputeLocLoss(const TBlob& loc_pred, + const TBlob& loc_gt, + const vector > >& all_match_indices, + const int num, const int num_priors, const LocLossType loc_loss_type, + vector >* all_loc_loss); +template void ComputeLocLoss(const TBlob& loc_pred, + const TBlob& loc_gt, + const vector > >& all_match_indices, + const int num, const int num_priors, const LocLossType loc_loss_type, + vector >* all_loc_loss); +template +void GetConfidenceScores(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + vector > >* conf_preds) { + conf_preds->clear(); + conf_preds->resize(num); + for (int i = 0; i < num; ++i) { + map >& label_scores = (*conf_preds)[i]; + for (int p = 0; p < num_preds_per_class; ++p) { + int start_idx = p * num_classes; + for (int c = 0; c < num_classes; ++c) { + label_scores[c].push_back(conf_data[start_idx + c]); + } + } + conf_data += num_preds_per_class * num_classes; + } +} + +// Explicit initialization. +template void GetConfidenceScores(const float* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + vector > >* conf_preds); +template void GetConfidenceScores(const double* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + vector > >* conf_preds); +template void GetConfidenceScores(const float16* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + vector > >* conf_preds); +template +void GetConfidenceScores(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const bool class_major, vector > >* conf_preds) { + conf_preds->clear(); + conf_preds->resize(num); + for (int i = 0; i < num; ++i) { + map >& label_scores = (*conf_preds)[i]; + if (class_major) { + for (int c = 0; c < num_classes; ++c) { + label_scores[c].assign(conf_data, conf_data + num_preds_per_class); + conf_data += num_preds_per_class; + } + } else { + for (int p = 0; p < num_preds_per_class; ++p) { + int start_idx = p * num_classes; + for (int c = 0; c < num_classes; ++c) { + label_scores[c].push_back(conf_data[start_idx + c]); + } + } + conf_data += num_preds_per_class * num_classes; + } + } +} + +// Explicit initialization. +template void GetConfidenceScores(const float* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const bool class_major, vector > >* conf_preds); +template void GetConfidenceScores(const double* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const bool class_major, vector > >* conf_preds); +template void GetConfidenceScores(const float16* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const bool class_major, vector > >* conf_preds); +template +void ComputeConfLoss(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + vector >* all_conf_loss) { + all_conf_loss->clear(); + for (int i = 0; i < num; ++i) { + vector conf_loss; + for (int p = 0; p < num_preds_per_class; ++p) { + int start_idx = p * num_classes; + int label = background_label_id; + Dtype loss = 0; + if (loss_type == MultiBoxLossParameter_ConfLossType_SOFTMAX) { + CHECK_GE(label, 0); + CHECK_LT(label, num_classes); + // Compute softmax probability. + // We need to subtract the max to avoid numerical issues. + Dtype maxval = -FLT_MAX; + for (int c = 0; c < num_classes; ++c) { + maxval = std::max(conf_data[start_idx + c], maxval); + } + Dtype sum = 0.; + for (int c = 0; c < num_classes; ++c) { + sum += std::exp(conf_data[start_idx + c] - maxval); + } + Dtype prob = std::exp(conf_data[start_idx + label] - maxval) / sum; + loss = -log(std::max(prob, Dtype(FLT_MIN))); + } else if (loss_type == MultiBoxLossParameter_ConfLossType_LOGISTIC) { + int target = 0; + for (int c = 0; c < num_classes; ++c) { + if (c == label) { + target = 1; + } else { + target = 0; + } + Dtype input = conf_data[start_idx + c]; + loss -= input * (target - (input >= 0)) - + log(1 + exp(input - 2 * input * (input >= 0))); + } + } else { + LOG(FATAL) << "Unknown conf loss type."; + } + conf_loss.push_back(loss); + } + conf_data += num_preds_per_class * num_classes; + all_conf_loss->push_back(conf_loss); + } +} + +// Explicit initialization. +template void ComputeConfLoss(const float* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + vector >* all_conf_loss); +template void ComputeConfLoss(const double* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + vector >* all_conf_loss); +template void ComputeConfLoss(const float16* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + vector >* all_conf_loss); +template +void ComputeConfLoss(const Dtype* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss) { + CHECK_LT(background_label_id, num_classes); + // CHECK_EQ(num, all_match_indices.size()); + all_conf_loss->clear(); + for (int i = 0; i < num; ++i) { + vector conf_loss; + const map >& match_indices = all_match_indices[i]; + for (int p = 0; p < num_preds_per_class; ++p) { + int start_idx = p * num_classes; + // Get the label index. + int label = background_label_id; + for (map >::const_iterator it = + match_indices.begin(); it != match_indices.end(); ++it) { + const vector& match_index = it->second; + CHECK_EQ(match_index.size(), num_preds_per_class); + if (match_index[p] > -1) { + CHECK(all_gt_bboxes.find(i) != all_gt_bboxes.end()); + const vector& gt_bboxes = + all_gt_bboxes.find(i)->second; + CHECK_LT(match_index[p], gt_bboxes.size()); + label = gt_bboxes[match_index[p]].label(); + CHECK_GE(label, 0); + CHECK_NE(label, background_label_id); + CHECK_LT(label, num_classes); + // A prior can only be matched to one gt bbox. + break; + } + } + Dtype loss = 0; + if (loss_type == MultiBoxLossParameter_ConfLossType_SOFTMAX) { + CHECK_GE(label, 0); + CHECK_LT(label, num_classes); + // Compute softmax probability. + // We need to subtract the max to avoid numerical issues. + Dtype maxval = conf_data[start_idx]; + for (int c = 1; c < num_classes; ++c) { + maxval = std::max(conf_data[start_idx + c], maxval); + } + Dtype sum = 0.; + for (int c = 0; c < num_classes; ++c) { + sum += std::exp(conf_data[start_idx + c] - maxval); + } + Dtype prob = std::exp(conf_data[start_idx + label] - maxval) / sum; + loss = -log(std::max(prob, Dtype(FLT_MIN))); + } else if (loss_type == MultiBoxLossParameter_ConfLossType_LOGISTIC) { + int target = 0; + for (int c = 0; c < num_classes; ++c) { + if (c == label) { + target = 1; + } else { + target = 0; + } + Dtype input = conf_data[start_idx + c]; + loss -= input * (target - (input >= 0)) - + log(1 + exp(input - 2 * input * (input >= 0))); + } + } else { + LOG(FATAL) << "Unknown conf loss type."; + } + conf_loss.push_back(loss); + } + conf_data += num_preds_per_class * num_classes; + all_conf_loss->push_back(conf_loss); + } +} + +// Explicit initialization. +template void ComputeConfLoss(const float* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); +template void ComputeConfLoss(const double* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); +template void ComputeConfLoss(const float16* conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); +template +void EncodeConfPrediction(const Dtype* conf_data, const int num, + const int num_priors, const MultiBoxLossParameter& multibox_loss_param, + const vector > >& all_match_indices, + const vector >& all_neg_indices, + const map >& all_gt_bboxes, + Dtype* conf_pred_data, Dtype* conf_gt_data) { + // CHECK_EQ(num, all_match_indices.size()); + // CHECK_EQ(num, all_neg_indices.size()); + // Retrieve parameters. + CHECK(multibox_loss_param.has_num_classes()) << "Must provide num_classes."; + const int num_classes = multibox_loss_param.num_classes(); + CHECK_GE(num_classes, 1) << "num_classes should not be less than 1."; + const int background_label_id = multibox_loss_param.background_label_id(); + const bool map_object_to_agnostic = + multibox_loss_param.map_object_to_agnostic(); + if (map_object_to_agnostic) { + if (background_label_id >= 0) { + CHECK_EQ(num_classes, 2); + } else { + CHECK_EQ(num_classes, 1); + } + } + const MiningType mining_type = multibox_loss_param.mining_type(); + bool do_neg_mining; + if (multibox_loss_param.has_do_neg_mining()) { + LOG(WARNING) << "do_neg_mining is deprecated, use mining_type instead."; + do_neg_mining = multibox_loss_param.do_neg_mining(); + CHECK_EQ(do_neg_mining, + mining_type != MultiBoxLossParameter_MiningType_NONE); + } + do_neg_mining = mining_type != MultiBoxLossParameter_MiningType_NONE; + const ConfLossType conf_loss_type = multibox_loss_param.conf_loss_type(); + int count = 0; + for (int i = 0; i < num; ++i) { + if (all_gt_bboxes.find(i) != all_gt_bboxes.end()) { + // Save matched (positive) bboxes scores and labels. + const map >& match_indices = all_match_indices[i]; + for (map >::const_iterator it = + match_indices.begin(); it != match_indices.end(); ++it) { + const vector& match_index = it->second; + CHECK_EQ(match_index.size(), num_priors); + for (int j = 0; j < num_priors; ++j) { + if (match_index[j] <= -1) { + continue; + } + const int gt_label = map_object_to_agnostic ? + background_label_id + 1 : + all_gt_bboxes.find(i)->second[match_index[j]].label(); + int idx = do_neg_mining ? count : j; + switch (conf_loss_type) { + case MultiBoxLossParameter_ConfLossType_SOFTMAX: + conf_gt_data[idx] = gt_label; + break; + case MultiBoxLossParameter_ConfLossType_LOGISTIC: + conf_gt_data[idx * num_classes + gt_label] = 1; + break; + default: + LOG(FATAL) << "Unknown conf loss type."; + } + if (do_neg_mining) { + // Copy scores for matched bboxes. + caffe_copy(num_classes, conf_data + j * num_classes, + conf_pred_data + count * num_classes); + ++count; + } + } + } + // Go to next image. + if (do_neg_mining) { + // Save negative bboxes scores and labels. + for (int n = 0; n < all_neg_indices[i].size(); ++n) { + int j = all_neg_indices[i][n]; + CHECK_LT(j, num_priors); + caffe_copy(num_classes, conf_data + j * num_classes, + conf_pred_data + count * num_classes); + switch (conf_loss_type) { + case MultiBoxLossParameter_ConfLossType_SOFTMAX: + conf_gt_data[count] = background_label_id; + break; + case MultiBoxLossParameter_ConfLossType_LOGISTIC: + if (background_label_id >= 0 && + background_label_id < num_classes) { + conf_gt_data[count * num_classes + background_label_id] = 1; + } + break; + default: + LOG(FATAL) << "Unknown conf loss type."; + } + ++count; + } + } + } + if (do_neg_mining) { + conf_data += num_priors * num_classes; + } else { + conf_gt_data += num_priors; + } + } +} + +// Explicite initialization. +template void EncodeConfPrediction(const float* conf_data, const int num, + const int num_priors, const MultiBoxLossParameter& multibox_loss_param, + const vector > >& all_match_indices, + const vector >& all_neg_indices, + const map >& all_gt_bboxes, + float* conf_pred_data, float* conf_gt_data); +template void EncodeConfPrediction(const double* conf_data, const int num, + const int num_priors, const MultiBoxLossParameter& multibox_loss_param, + const vector > >& all_match_indices, + const vector >& all_neg_indices, + const map >& all_gt_bboxes, + double* conf_pred_data, double* conf_gt_data); +template void EncodeConfPrediction(const float16* conf_data, const int num, + const int num_priors, const MultiBoxLossParameter& multibox_loss_param, + const vector > >& all_match_indices, + const vector >& all_neg_indices, + const map >& all_gt_bboxes, + float16* conf_pred_data, float16* conf_gt_data); +template +void GetPriorBBoxes(const Dtype* prior_data, const int num_priors, + vector* prior_bboxes, + vector >* prior_variances) { + prior_bboxes->clear(); + prior_variances->clear(); + for (int i = 0; i < num_priors; ++i) { + int start_idx = i * 4; + NormalizedBBox bbox; + bbox.set_xmin(prior_data[start_idx]); + bbox.set_ymin(prior_data[start_idx + 1]); + bbox.set_xmax(prior_data[start_idx + 2]); + bbox.set_ymax(prior_data[start_idx + 3]); + float bbox_size = BBoxSize(bbox); + bbox.set_size(bbox_size); + prior_bboxes->push_back(bbox); + } + + for (int i = 0; i < num_priors; ++i) { + int start_idx = (num_priors + i) * 4; + vector var; + for (int j = 0; j < 4; ++j) { + var.push_back(prior_data[start_idx + j]); + } + prior_variances->push_back(var); + } +} + +// Explicit initialization. +template void GetPriorBBoxes(const float* prior_data, const int num_priors, + vector* prior_bboxes, + vector >* prior_variances); +template void GetPriorBBoxes(const double* prior_data, const int num_priors, + vector* prior_bboxes, + vector >* prior_variances); +template void GetPriorBBoxes(const float16* prior_data, const int num_priors, + vector* prior_bboxes, + vector >* prior_variances); +template +void GetDetectionResults(const Dtype* det_data, const int num_det, + const int background_label_id, + map > >* all_detections) { + all_detections->clear(); + for (int i = 0; i < num_det; ++i) { + int start_idx = i * 7; + int item_id = det_data[start_idx]; + if (item_id == -1) { + continue; + } + int label = det_data[start_idx + 1]; + CHECK_NE(background_label_id, label) + << "Found background label in the detection results."; + NormalizedBBox bbox; + bbox.set_score(det_data[start_idx + 2]); + bbox.set_xmin(det_data[start_idx + 3]); + bbox.set_ymin(det_data[start_idx + 4]); + bbox.set_xmax(det_data[start_idx + 5]); + bbox.set_ymax(det_data[start_idx + 6]); + float bbox_size = BBoxSize(bbox); + bbox.set_size(bbox_size); + (*all_detections)[item_id][label].push_back(bbox); + } +} + +// Explicit initialization. +template void GetDetectionResults(const float* det_data, const int num_det, + const int background_label_id, + map > >* all_detections); +template void GetDetectionResults(const double* det_data, const int num_det, + const int background_label_id, + map > >* all_detections); +template void GetDetectionResults(const float16* det_data, const int num_det, + const int background_label_id, + map > >* all_detections); +void GetTopKScoreIndex(const vector& scores, const vector& indices, + const int top_k, vector >* score_index_vec) { + CHECK_EQ(scores.size(), indices.size()); + + // Generate index score pairs. + for (int i = 0; i < scores.size(); ++i) { + score_index_vec->push_back(std::make_pair(scores[i], indices[i])); + } + + // Sort the score pair according to the scores in descending order + std::stable_sort(score_index_vec->begin(), score_index_vec->end(), + SortScorePairDescend); + + // Keep top_k scores if needed. + if (top_k > -1 && top_k < score_index_vec->size()) { + score_index_vec->resize(top_k); + } +} + +void GetMaxScoreIndex(const vector& scores, const float threshold, + const int top_k, vector >* score_index_vec) { + // Generate index score pairs. + for (int i = 0; i < scores.size(); ++i) { + if (scores[i] > threshold) { + score_index_vec->push_back(std::make_pair(scores[i], i)); + } + } + + // Sort the score pair according to the scores in descending order + std::stable_sort(score_index_vec->begin(), score_index_vec->end(), + SortScorePairDescend); + + // Keep top_k scores if needed. + if (top_k > -1 && top_k < score_index_vec->size()) { + score_index_vec->resize(top_k); + } +} + +template +void GetMaxScoreIndex(const Dtype* scores, const int num, const float threshold, + const int top_k, vector >* score_index_vec) { + // Generate index score pairs. + for (int i = 0; i < num; ++i) { + if (scores[i] > threshold) { + score_index_vec->push_back(std::make_pair(scores[i], i)); + } + } + + // Sort the score pair according to the scores in descending order + std::sort(score_index_vec->begin(), score_index_vec->end(), + SortScorePairDescend); + + // Keep top_k scores if needed. + if (top_k > -1 && top_k < score_index_vec->size()) { + score_index_vec->resize(top_k); + } +} + +template +void GetMaxScoreIndex(const float* scores, const int num, const float threshold, + const int top_k, vector >* score_index_vec); +template +void GetMaxScoreIndex(const double* scores, const int num, + const float threshold, const int top_k, + vector >* score_index_vec); +template +void GetMaxScoreIndex(const float16* scores, const int num, + const float threshold, const int top_k, + vector >* score_index_vec); +void ApplyNMS(const vector& bboxes, const vector& scores, + const float threshold, const int top_k, const bool reuse_overlaps, + map >* overlaps, vector* indices) { + // Sanity check. + CHECK_EQ(bboxes.size(), scores.size()) + << "bboxes and scores have different size."; + + // Get top_k scores (with corresponding indices). + vector idx(boost::counting_iterator(0), + boost::counting_iterator(scores.size())); + vector > score_index_vec; + GetTopKScoreIndex(scores, idx, top_k, &score_index_vec); + + // Do nms. + indices->clear(); + while (score_index_vec.size() != 0) { + // Get the current highest score box. + int best_idx = score_index_vec.front().second; + const NormalizedBBox& best_bbox = bboxes[best_idx]; + if (BBoxSize(best_bbox) < 1e-5) { + // Erase small box. + score_index_vec.erase(score_index_vec.begin()); + continue; + } + indices->push_back(best_idx); + // Erase the best box. + score_index_vec.erase(score_index_vec.begin()); + + if (top_k > -1 && indices->size() >= top_k) { + // Stop if finding enough bboxes for nms. + break; + } + + // Compute overlap between best_bbox and other remaining bboxes. + // Remove a bbox if the overlap with best_bbox is larger than nms_threshold. + for (vector >::iterator it = score_index_vec.begin(); + it != score_index_vec.end(); ) { + int cur_idx = it->second; + const NormalizedBBox& cur_bbox = bboxes[cur_idx]; + if (BBoxSize(cur_bbox) < 1e-5) { + // Erase small box. + it = score_index_vec.erase(it); + continue; + } + float cur_overlap = 0.; + if (reuse_overlaps) { + if (overlaps->find(best_idx) != overlaps->end() && + overlaps->find(best_idx)->second.find(cur_idx) != + (*overlaps)[best_idx].end()) { + // Use the computed overlap. + cur_overlap = (*overlaps)[best_idx][cur_idx]; + } else if (overlaps->find(cur_idx) != overlaps->end() && + overlaps->find(cur_idx)->second.find(best_idx) != + (*overlaps)[cur_idx].end()) { + // Use the computed overlap. + cur_overlap = (*overlaps)[cur_idx][best_idx]; + } else { + cur_overlap = JaccardOverlap(best_bbox, cur_bbox); + // Store the overlap for future use. + (*overlaps)[best_idx][cur_idx] = cur_overlap; + } + } else { + cur_overlap = JaccardOverlap(best_bbox, cur_bbox); + } + + // Remove it if necessary + if (cur_overlap > threshold) { + it = score_index_vec.erase(it); + } else { + ++it; + } + } + } +} + +void ApplyNMS(const vector& bboxes, const vector& scores, + const float threshold, const int top_k, vector* indices) { + bool reuse_overlap = false; + map > overlaps; + ApplyNMS(bboxes, scores, threshold, top_k, reuse_overlap, &overlaps, indices); +} + +void ApplyNMS(const bool* overlapped, const int num, vector* indices) { + vector index_vec(boost::counting_iterator(0), + boost::counting_iterator(num)); + // Do nms. + indices->clear(); + while (index_vec.size() != 0) { + // Get the current highest score box. + int best_idx = index_vec.front(); + indices->push_back(best_idx); + // Erase the best box. + index_vec.erase(index_vec.begin()); + + for (vector::iterator it = index_vec.begin(); it != index_vec.end();) { + int cur_idx = *it; + + // Remove it if necessary + if (overlapped[best_idx * num + cur_idx]) { + it = index_vec.erase(it); + } else { + ++it; + } + } + } +} + +inline int clamp(const int v, const int a, const int b) { + return v < a ? a : v > b ? b : v; +} + +void ApplyNMSFast(const vector& bboxes, + const vector& scores, const float score_threshold, + const float nms_threshold, const float eta, const int top_k, + vector* indices) { + // Sanity check. + CHECK_EQ(bboxes.size(), scores.size()) + << "bboxes and scores have different size."; + + // Get top_k scores (with corresponding indices). + vector > score_index_vec; + GetMaxScoreIndex(scores, score_threshold, top_k, &score_index_vec); + + // Do nms. + float adaptive_threshold = nms_threshold; + indices->clear(); + while (score_index_vec.size() != 0) { + const int idx = score_index_vec.front().second; + bool keep = true; + for (int k = 0; k < indices->size(); ++k) { + if (keep) { + const int kept_idx = (*indices)[k]; + float overlap = JaccardOverlap(bboxes[idx], bboxes[kept_idx]); + keep = overlap <= adaptive_threshold; + } else { + break; + } + } + if (keep) { + indices->push_back(idx); + } + score_index_vec.erase(score_index_vec.begin()); + if (keep && eta < 1 && adaptive_threshold > 0.5) { + adaptive_threshold *= eta; + } + } +} + +template +void ApplyNMSFast(const Dtype* bboxes, const Dtype* scores, const int num, + const float score_threshold, const float nms_threshold, + const float eta, const int top_k, vector* indices) { + // Get top_k scores (with corresponding indices). + vector > score_index_vec; + GetMaxScoreIndex(scores, num, score_threshold, top_k, &score_index_vec); + + // Do nms. + float adaptive_threshold = nms_threshold; + indices->clear(); + while (score_index_vec.size() != 0) { + const int idx = score_index_vec.front().second; + bool keep = true; + for (int k = 0; k < indices->size(); ++k) { + if (keep) { + const int kept_idx = (*indices)[k]; + float overlap = JaccardOverlap(bboxes + idx * 4, bboxes + kept_idx * 4); + keep = overlap <= adaptive_threshold; + } else { + break; + } + } + if (keep) { + indices->push_back(idx); + } + score_index_vec.erase(score_index_vec.begin()); + if (keep && eta < 1 && adaptive_threshold > 0.5) { + adaptive_threshold *= eta; + } + } +} + +template +void ApplyNMSFast(const float* bboxes, const float* scores, const int num, + const float score_threshold, const float nms_threshold, + const float eta, const int top_k, vector* indices); +template +void ApplyNMSFast(const double* bboxes, const double* scores, const int num, + const float score_threshold, const float nms_threshold, + const float eta, const int top_k, vector* indices); +template +void ApplyNMSFast(const float16* bboxes, const float16* scores, const int num, + const float score_threshold, const float nms_threshold, + const float eta, const int top_k, vector* indices); +void CumSum(const vector >& pairs, vector* cumsum) { + // Sort the pairs based on first item of the pair. + vector > sort_pairs = pairs; + std::stable_sort(sort_pairs.begin(), sort_pairs.end(), + SortScorePairDescend); + + cumsum->clear(); + for (int i = 0; i < sort_pairs.size(); ++i) { + if (i == 0) { + cumsum->push_back(sort_pairs[i].second); + } else { + cumsum->push_back(cumsum->back() + sort_pairs[i].second); + } + } +} + +void ComputeAP(const vector >& tp, const int num_pos, + const vector >& fp, const string ap_version, + vector* prec, vector* rec, float* ap) { + const float eps = 1e-6; + CHECK_EQ(tp.size(), fp.size()) << "tp must have same size as fp."; + const int num = tp.size(); + // Make sure that tp and fp have complement value. + for (int i = 0; i < num; ++i) { + CHECK_LE(fabs(tp[i].first - fp[i].first), eps); + CHECK_EQ(tp[i].second, 1 - fp[i].second); + } + prec->clear(); + rec->clear(); + *ap = 0; + if (tp.size() == 0 || num_pos == 0) { + return; + } + + // Compute cumsum of tp. + vector tp_cumsum; + CumSum(tp, &tp_cumsum); + CHECK_EQ(tp_cumsum.size(), num); + + // Compute cumsum of fp. + vector fp_cumsum; + CumSum(fp, &fp_cumsum); + CHECK_EQ(fp_cumsum.size(), num); + + // Compute precision. + for (int i = 0; i < num; ++i) { + prec->push_back(static_cast(tp_cumsum[i]) / + (tp_cumsum[i] + fp_cumsum[i])); + } + + // Compute recall. + for (int i = 0; i < num; ++i) { + CHECK_LE(tp_cumsum[i], num_pos); + rec->push_back(static_cast(tp_cumsum[i]) / num_pos); + } + + if (ap_version == "11point") { + // VOC2007 style for computing AP. + vector max_precs(11, 0.); + int start_idx = num - 1; + for (int j = 10; j >= 0; --j) { + for (int i = start_idx; i >= 0 ; --i) { + if ((*rec)[i] < j / 10.) { + start_idx = i; + if (j > 0) { + max_precs[j-1] = max_precs[j]; + } + break; + } else { + if (max_precs[j] < (*prec)[i]) { + max_precs[j] = (*prec)[i]; + } + } + } + } + for (int j = 10; j >= 0; --j) { + *ap += max_precs[j] / 11; + } + } else if (ap_version == "MaxIntegral") { + // VOC2012 or ILSVRC style for computing AP. + float cur_rec = rec->back(); + float cur_prec = prec->back(); + for (int i = num - 2; i >= 0; --i) { + cur_prec = std::max((*prec)[i], cur_prec); + if (fabs(cur_rec - (*rec)[i]) > eps) { + *ap += cur_prec * fabs(cur_rec - (*rec)[i]); + } + cur_rec = (*rec)[i]; + } + *ap += cur_rec * cur_prec; + } else if (ap_version == "Integral") { + // Natural integral. + float prev_rec = 0.; + for (int i = 0; i < num; ++i) { + if (fabs((*rec)[i] - prev_rec) > eps) { + *ap += (*prec)[i] * fabs((*rec)[i] - prev_rec); + } + prev_rec = (*rec)[i]; + } + } else { + LOG(FATAL) << "Unknown ap_version: " << ap_version; + } +} + +cv::Scalar HSV2RGB(const float h, const float s, const float v) { + const int h_i = static_cast(h * 6); + const float f = h * 6 - h_i; + const float p = v * (1 - s); + const float q = v * (1 - f*s); + const float t = v * (1 - (1 - f) * s); + float r, g, b; + switch (h_i) { + case 0: + r = v; g = t; b = p; + break; + case 1: + r = q; g = v; b = p; + break; + case 2: + r = p; g = v; b = t; + break; + case 3: + r = p; g = q; b = v; + break; + case 4: + r = t; g = p; b = v; + break; + case 5: + r = v; g = p; b = q; + break; + default: + r = 1; g = 1; b = 1; + break; + } + return cv::Scalar(r * 255, g * 255, b * 255); +} + +// http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically +vector GetColors(const int n) { + vector colors; + cv::RNG rng(12345); + const float golden_ratio_conjugate = 0.618033988749895; + const float s = 0.3; + const float v = 0.99; + for (int i = 0; i < n; ++i) { + const float h = std::fmod(rng.uniform(0.f, 1.f) + golden_ratio_conjugate, + 1.f); + colors.push_back(HSV2RGB(h, s, v)); + } + return colors; +} + +static clock_t start_clock = clock(); +static cv::VideoWriter cap_out; + +template +void VisualizeBBox(const vector& images, const Blob* detections, + const float threshold, const vector& colors, + const map& label_to_display_name, + const string& save_file) { + // Retrieve detections. + CHECK_EQ(detections->width(), 7); + const int num_det = detections->height(); + const int num_img = images.size(); + if (num_det == 0 || num_img == 0) { + return; + } + // Comute FPS. + float fps = num_img / (static_cast(clock() - start_clock) / + CLOCKS_PER_SEC); + + const Dtype* detections_data = detections->cpu_data(); + const int width = images[0].cols; + const int height = images[0].rows; + vector all_detections(num_img); + for (int i = 0; i < num_det; ++i) { + const int img_idx = detections_data[i * 7]; + CHECK_LT(img_idx, num_img); + const int label = detections_data[i * 7 + 1]; + const float score = detections_data[i * 7 + 2]; + if (score < threshold) { + continue; + } + NormalizedBBox bbox; + bbox.set_xmin(detections_data[i * 7 + 3] * width); + bbox.set_ymin(detections_data[i * 7 + 4] * height); + bbox.set_xmax(detections_data[i * 7 + 5] * width); + bbox.set_ymax(detections_data[i * 7 + 6] * height); + bbox.set_score(score); + all_detections[img_idx][label].push_back(bbox); + } + + int fontface = cv::FONT_HERSHEY_SIMPLEX; + double scale = 1; + int thickness = 2; + int baseline = 0; + char buffer[50]; + for (int i = 0; i < num_img; ++i) { + cv::Mat image = images[i]; + // Show FPS. + snprintf(buffer, sizeof(buffer), "FPS: %.2f", fps); + cv::Size text = cv::getTextSize(buffer, fontface, scale, thickness, + &baseline); + cv::rectangle(image, cv::Point(0, 0), + cv::Point(text.width, text.height + baseline), + CV_RGB(255, 255, 255), CV_FILLED); + cv::putText(image, buffer, cv::Point(0, text.height + baseline / 2.), + fontface, scale, CV_RGB(0, 0, 0), thickness, 8); + // Draw bboxes. + for (map >::iterator it = + all_detections[i].begin(); it != all_detections[i].end(); ++it) { + int label = it->first; + string label_name = "Unknown"; + if (label_to_display_name.find(label) != label_to_display_name.end()) { + label_name = label_to_display_name.find(label)->second; + } + CHECK_LT(label, colors.size()); + const cv::Scalar& color = colors[label]; + const vector& bboxes = it->second; + for (int j = 0; j < bboxes.size(); ++j) { + cv::Point top_left_pt(bboxes[j].xmin(), bboxes[j].ymin()); + cv::Point bottom_right_pt(bboxes[j].xmax(), bboxes[j].ymax()); + cv::rectangle(image, top_left_pt, bottom_right_pt, color, 4); + cv::Point bottom_left_pt(bboxes[j].xmin(), bboxes[j].ymax()); + snprintf(buffer, sizeof(buffer), "%s: %.2f", label_name.c_str(), + bboxes[j].score()); + cv::Size text = cv::getTextSize(buffer, fontface, scale, thickness, + &baseline); + cv::rectangle( + image, bottom_left_pt + cv::Point(0, 0), + bottom_left_pt + cv::Point(text.width, -text.height-baseline), + color, CV_FILLED); + cv::putText(image, buffer, bottom_left_pt - cv::Point(0, baseline), + fontface, scale, CV_RGB(0, 0, 0), thickness, 8); + } + } + // Save result if required. + if (!save_file.empty()) { + if (!cap_out.isOpened()) { + cv::Size size(image.size().width, image.size().height); + cv::VideoWriter outputVideo(save_file, CV_FOURCC('D', 'I', 'V', 'X'), + 30, size, true); + cap_out = outputVideo; + } + cap_out.write(image); + } + cv::imshow("detections", image); + if (cv::waitKey(1) == 27) { + raise(SIGINT); + } + } + start_clock = clock(); +} + +template +void VisualizeBBox(const vector& images, + const Blob* detections, + const float threshold, const vector& colors, + const map& label_to_display_name, + const string& save_file); +template +void VisualizeBBox(const vector& images, + const Blob* detections, + const float threshold, const vector& colors, + const map& label_to_display_name, + const string& save_file); +template +void VisualizeBBox(const vector& images, + const Blob* detections, + const float threshold, const vector& colors, + const map& label_to_display_name, + const string& save_file); + +} // namespace caffe diff --git a/src/caffe/util/bbox_util.cu b/src/caffe/util/bbox_util.cu new file mode 100644 index 00000000000..460a222e528 --- /dev/null +++ b/src/caffe/util/bbox_util.cu @@ -0,0 +1,669 @@ +#include +#include +#include +#include + +#include "thrust/functional.h" +#include "thrust/sort.h" + +#include "caffe/common.hpp" +#include "caffe/util/bbox_util.hpp" + +namespace caffe { + +template +__host__ __device__ Dtype BBoxSizeGPU(const Dtype* bbox, + const bool normalized) { + if (bbox[2] < bbox[0] || bbox[3] < bbox[1]) { + // If bbox is invalid (e.g. xmax < xmin or ymax < ymin), return 0. + return Dtype(0.); + } else { + const Dtype width = bbox[2] - bbox[0]; + const Dtype height = bbox[3] - bbox[1]; + if (normalized) { + return width * height; + } else { + // If bbox is not within range [0, 1]. + return (width + 1) * (height + 1); + } + } +} + +template __host__ __device__ float BBoxSizeGPU(const float* bbox, + const bool normalized); +template __host__ __device__ double BBoxSizeGPU(const double* bbox, + const bool normalized); + +template +__host__ __device__ Dtype JaccardOverlapGPU(const Dtype* bbox1, + const Dtype* bbox2) { + if (bbox2[0] > bbox1[2] || bbox2[2] < bbox1[0] || + bbox2[1] > bbox1[3] || bbox2[3] < bbox1[1]) { + return Dtype(0.); + } else { + const Dtype inter_xmin = max(bbox1[0], bbox2[0]); + const Dtype inter_ymin = max(bbox1[1], bbox2[1]); + const Dtype inter_xmax = min(bbox1[2], bbox2[2]); + const Dtype inter_ymax = min(bbox1[3], bbox2[3]); + + const Dtype inter_width = inter_xmax - inter_xmin; + const Dtype inter_height = inter_ymax - inter_ymin; + const Dtype inter_size = inter_width * inter_height; + + const Dtype bbox1_size = BBoxSizeGPU(bbox1); + const Dtype bbox2_size = BBoxSizeGPU(bbox2); + + return inter_size / (bbox1_size + bbox2_size - inter_size); + } +} + +template __host__ __device__ float JaccardOverlapGPU(const float* bbox1, + const float* bbox2); +template __host__ __device__ double JaccardOverlapGPU(const double* bbox1, + const double* bbox2); + +template +__device__ Dtype Min(const Dtype x, const Dtype y) { + return x < y ? x : y; +} + +template +__device__ Dtype Max(const Dtype x, const Dtype y) { + return x > y ? x : y; +} + +template +__device__ void ClipBBoxGPU(const Dtype* bbox, Dtype* clip_bbox) { + for (int i = 0; i < 4; ++i) { + clip_bbox[i] = Max(Min(bbox[i], Dtype(1.)), Dtype(0.)); + } +} + +template __device__ void ClipBBoxGPU(const float* bbox, float* clip_bbox); +template __device__ void ClipBBoxGPU(const double* bbox, double* clip_bbox); + +template +__global__ void DecodeBBoxesKernel(const int nthreads, + const Dtype* loc_data, const Dtype* prior_data, + const CodeType code_type, const bool variance_encoded_in_target, + const int num_priors, const bool share_location, + const int num_loc_classes, const int background_label_id, + const bool clip_bbox, Dtype* bbox_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int i = index % 4; + const int c = (index / 4) % num_loc_classes; + const int d = (index / 4 / num_loc_classes) % num_priors; + if (!share_location && c == background_label_id) { + // Ignore background class if not share_location. + return; + } + const int pi = d * 4; + const int vi = pi + num_priors * 4; + if (code_type == PriorBoxParameter_CodeType_CORNER) { + if (variance_encoded_in_target) { + // variance is encoded in target, we simply need to add the offset + // predictions. + bbox_data[index] = prior_data[pi + i] + loc_data[index]; + } else { + // variance is encoded in bbox, we need to scale the offset accordingly. + bbox_data[index] = + prior_data[pi + i] + loc_data[index] * prior_data[vi + i]; + } + } else if (code_type == PriorBoxParameter_CodeType_CENTER_SIZE) { + const Dtype p_xmin = prior_data[pi]; + const Dtype p_ymin = prior_data[pi + 1]; + const Dtype p_xmax = prior_data[pi + 2]; + const Dtype p_ymax = prior_data[pi + 3]; + const Dtype prior_width = p_xmax - p_xmin; + const Dtype prior_height = p_ymax - p_ymin; + const Dtype prior_center_x = (p_xmin + p_xmax) / 2.; + const Dtype prior_center_y = (p_ymin + p_ymax) / 2.; + + const Dtype xmin = loc_data[index - i]; + const Dtype ymin = loc_data[index - i + 1]; + const Dtype xmax = loc_data[index - i + 2]; + const Dtype ymax = loc_data[index - i + 3]; + + Dtype decode_bbox_center_x, decode_bbox_center_y; + Dtype decode_bbox_width, decode_bbox_height; + if (variance_encoded_in_target) { + // variance is encoded in target, we simply need to retore the offset + // predictions. + decode_bbox_center_x = xmin * prior_width + prior_center_x; + decode_bbox_center_y = ymin * prior_height + prior_center_y; + decode_bbox_width = exp(xmax) * prior_width; + decode_bbox_height = exp(ymax) * prior_height; + } else { + // variance is encoded in bbox, we need to scale the offset accordingly. + decode_bbox_center_x = + prior_data[vi] * xmin * prior_width + prior_center_x; + decode_bbox_center_y = + prior_data[vi + 1] * ymin * prior_height + prior_center_y; + decode_bbox_width = + exp(prior_data[vi + 2] * xmax) * prior_width; + decode_bbox_height = + exp(prior_data[vi + 3] * ymax) * prior_height; + } + + switch (i) { + case 0: + bbox_data[index] = decode_bbox_center_x - decode_bbox_width / 2.; + break; + case 1: + bbox_data[index] = decode_bbox_center_y - decode_bbox_height / 2.; + break; + case 2: + bbox_data[index] = decode_bbox_center_x + decode_bbox_width / 2.; + break; + case 3: + bbox_data[index] = decode_bbox_center_y + decode_bbox_height / 2.; + break; + } + } else if (code_type == PriorBoxParameter_CodeType_CORNER_SIZE) { + const Dtype p_xmin = prior_data[pi]; + const Dtype p_ymin = prior_data[pi + 1]; + const Dtype p_xmax = prior_data[pi + 2]; + const Dtype p_ymax = prior_data[pi + 3]; + const Dtype prior_width = p_xmax - p_xmin; + const Dtype prior_height = p_ymax - p_ymin; + Dtype p_size; + if (i == 0 || i == 2) { + p_size = prior_width; + } else { + p_size = prior_height; + } + if (variance_encoded_in_target) { + // variance is encoded in target, we simply need to add the offset + // predictions. + bbox_data[index] = prior_data[pi + i] + loc_data[index] * p_size; + } else { + // variance is encoded in bbox, we need to scale the offset accordingly. + bbox_data[index] = + prior_data[pi + i] + loc_data[index] * prior_data[vi + i] * p_size; + } + } else { + // Unknown code type. + } + if (clip_bbox) { + bbox_data[index] = max(min(bbox_data[index], Dtype(1.)), Dtype(0.)); + } + } +} + +template +void DecodeBBoxesGPU(const int nthreads, + const Dtype* loc_data, const Dtype* prior_data, + const CodeType code_type, const bool variance_encoded_in_target, + const int num_priors, const bool share_location, + const int num_loc_classes, const int background_label_id, + const bool clip_bbox, Dtype* bbox_data) { + // NOLINT_NEXT_LINE(whitespace/operators) + DecodeBBoxesKernel<<>>(nthreads, loc_data, prior_data, code_type, + variance_encoded_in_target, num_priors, share_location, num_loc_classes, + background_label_id, clip_bbox, bbox_data); + CUDA_POST_KERNEL_CHECK; +} + +template void DecodeBBoxesGPU(const int nthreads, + const float* loc_data, const float* prior_data, + const CodeType code_type, const bool variance_encoded_in_target, + const int num_priors, const bool share_location, + const int num_loc_classes, const int background_label_id, + const bool clip_bbox, float* bbox_data); +template void DecodeBBoxesGPU(const int nthreads, + const double* loc_data, const double* prior_data, + const CodeType code_type, const bool variance_encoded_in_target, + const int num_priors, const bool share_location, + const int num_loc_classes, const int background_label_id, + const bool clip_bbox, double* bbox_data); +template void DecodeBBoxesGPU(const int nthreads, + const float16* loc_data, const float16* prior_data, + const CodeType code_type, const bool variance_encoded_in_target, + const int num_priors, const bool share_location, + const int num_loc_classes, const int background_label_id, + const bool clip_bbox, float16* bbox_data); + +template +__global__ void PermuteDataKernel(const int nthreads, + const Dtype* data, const int num_classes, const int num_data, + const int num_dim, Dtype* new_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int i = index % num_dim; + const int c = (index / num_dim) % num_classes; + const int d = (index / num_dim / num_classes) % num_data; + const int n = index / num_dim / num_classes / num_data; + const int new_index = ((n * num_classes + c) * num_data + d) * num_dim + i; + new_data[new_index] = data[index]; + } +} + +template +void PermuteDataGPU(const int nthreads, + const Dtype* data, const int num_classes, const int num_data, + const int num_dim, Dtype* new_data) { + // NOLINT_NEXT_LINE(whitespace/operators) + PermuteDataKernel<<>>(nthreads, data, num_classes, num_data, + num_dim, new_data); + CUDA_POST_KERNEL_CHECK; +} + +template void PermuteDataGPU(const int nthreads, + const float* data, const int num_classes, const int num_data, + const int num_dim, float* new_data); +template void PermuteDataGPU(const int nthreads, + const double* data, const int num_classes, const int num_data, + const int num_dim, double* new_data); +template void PermuteDataGPU(const int nthreads, + const float16* data, const int num_classes, const int num_data, + const int num_dim, float16* new_data); + +template +__global__ void kernel_channel_max(const int num, const int channels, + const int spatial_dim, const Dtype* data, Dtype* out) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; + Dtype maxval = -FLT_MAX; + for (int c = 0; c < channels; ++c) { + maxval = max(data[(n * channels + c) * spatial_dim + s], maxval); + } + out[index] = maxval; + } +} + +template +__global__ void kernel_channel_subtract(const int count, + const int num, const int channels, + const int spatial_dim, const Dtype* channel_data, const Dtype* channel_max, + Dtype* data) { + CUDA_KERNEL_LOOP(index, count) { + int n = index / channels / spatial_dim; + int s = index % spatial_dim; + data[index] = channel_data[index] - channel_max[n * spatial_dim + s]; + } +} + +template +__global__ void kernel_exp(const int count, const Dtype* data, Dtype* out) { + CUDA_KERNEL_LOOP(index, count) { + out[index] = exp(data[index]); + } +} + +template +__global__ void kernel_channel_sum(const int num, const int channels, + const int spatial_dim, const Dtype* data, Dtype* channel_sum) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; + Dtype sum = 0; + for (int c = 0; c < channels; ++c) { + sum += data[(n * channels + c) * spatial_dim + s]; + } + channel_sum[index] = sum; + } +} + +template +__global__ void kernel_channel_div(const int count, + const int num, const int channels, + const int spatial_dim, const Dtype* channel_sum, Dtype* data) { + CUDA_KERNEL_LOOP(index, count) { + int n = index / channels / spatial_dim; + int s = index % spatial_dim; + data[index] /= channel_sum[n * spatial_dim + s]; + } +} + +template +void SoftMaxGPU(const Dtype* data, const int outer_num, + const int channels, const int inner_num, Dtype* prob) { + vector shape(4, 1); + shape[0] = outer_num; + shape[1] = channels; + shape[2] = inner_num; + TBlob scale(shape); + Dtype* scale_data = scale.mutable_gpu_data(); + int count = outer_num * channels * inner_num; + // We need to subtract the max to avoid numerical issues, compute the exp, + // and then normalize. + // compute max + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_max<<>>(outer_num, channels, inner_num, data, + scale_data); + // subtract + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_subtract<<>>(count, outer_num, channels, inner_num, + data, scale_data, prob); + // exponentiate + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_exp<<>>( + count, prob, prob); + // sum after exp + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_sum<<>>(outer_num, channels, inner_num, prob, + scale_data); + // divide + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_div<<>>(count, outer_num, channels, inner_num, + scale_data, prob); +} + +template void SoftMaxGPU(const float* data, const int outer_num, + const int channels, const int inner_num, float* prob); +template void SoftMaxGPU(const double* data, const int outer_num, + const int channels, const int inner_num, double* prob); + +template +__global__ void ComputeOverlappedKernel(const int nthreads, + const Dtype* bbox_data, const int num_bboxes, const int num_classes, + const Dtype overlap_threshold, bool* overlapped_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int j = index % num_bboxes; + const int i = (index / num_bboxes) % num_bboxes; + if (i == j) { + // Ignore same bbox. + return; + } + const int c = (index / num_bboxes / num_bboxes) % num_classes; + const int n = index / num_bboxes / num_bboxes / num_classes; + // Compute overlap between i-th bbox and j-th bbox. + const int start_loc_i = ((n * num_bboxes + i) * num_classes + c) * 4; + const int start_loc_j = ((n * num_bboxes + j) * num_classes + c) * 4; + const Dtype overlap = JaccardOverlapGPU(bbox_data + start_loc_i, + bbox_data + start_loc_j); + if (overlap > overlap_threshold) { + overlapped_data[index] = true; + } + } +} + +template +void ComputeOverlappedGPU(const int nthreads, + const Dtype* bbox_data, const int num_bboxes, const int num_classes, + const Dtype overlap_threshold, bool* overlapped_data) { + // NOLINT_NEXT_LINE(whitespace/operators) + ComputeOverlappedKernel<<>>(nthreads, bbox_data, num_bboxes, num_classes, + overlap_threshold, overlapped_data); + CUDA_POST_KERNEL_CHECK; +} + +template void ComputeOverlappedGPU(const int nthreads, + const float* bbox_data, const int num_bboxes, const int num_classes, + const float overlap_threshold, bool* overlapped_data); +template void ComputeOverlappedGPU(const int nthreads, + const double* bbox_data, const int num_bboxes, const int num_classes, + const double overlap_threshold, bool* overlapped_data); + +template +__global__ void ComputeOverlappedByIdxKernel(const int nthreads, + const Dtype* bbox_data, const Dtype overlap_threshold, + const int* idx, const int num_idx, bool* overlapped_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int j = index % num_idx; + const int i = (index / num_idx); + if (i == j) { + // Ignore same bbox. + return; + } + // Compute overlap between i-th bbox and j-th bbox. + const int start_loc_i = idx[i] * 4; + const int start_loc_j = idx[j] * 4; + const Dtype overlap = JaccardOverlapGPU(bbox_data + start_loc_i, + bbox_data + start_loc_j); + if (overlap > overlap_threshold) { + overlapped_data[index] = true; + } + } +} + +template +void ComputeOverlappedByIdxGPU(const int nthreads, + const Dtype* bbox_data, const Dtype overlap_threshold, + const int* idx, const int num_idx, bool* overlapped_data) { + // NOLINT_NEXT_LINE(whitespace/operators) + ComputeOverlappedByIdxKernel<<>>(nthreads, bbox_data, overlap_threshold, + idx, num_idx, overlapped_data); + CUDA_POST_KERNEL_CHECK; +} + +template void ComputeOverlappedByIdxGPU(const int nthreads, + const float* bbox_data, const float overlap_threshold, + const int* idx, const int num_idx, bool* overlapped_data); +template void ComputeOverlappedByIdxGPU(const int nthreads, + const double* bbox_data, const double overlap_threshold, + const int* idx, const int num_idx, bool* overlapped_data); + +template +void ApplyNMSGPU(const Dtype* bbox_data, const Dtype* conf_data, + const int num_bboxes, const float confidence_threshold, + const int top_k, const float nms_threshold, vector* indices) { + // Keep part of detections whose scores are higher than confidence threshold. + vector idx; + vector confidences; + for (int i = 0; i < num_bboxes; ++i) { + if (conf_data[i] > confidence_threshold) { + idx.push_back(i); + confidences.push_back(conf_data[i]); + } + } + int num_remain = confidences.size(); + if (num_remain == 0) { + return; + } + // Sort detections based on score. + thrust::sort_by_key(&confidences[0], &confidences[0] + num_remain, &idx[0], + thrust::greater()); + if (top_k > -1 && top_k < num_remain) { + num_remain = top_k; + } + + // Compute overlap between remaining detections. + TBlob idx_blob(1, 1, 1, num_remain); + int* idx_data = idx_blob.mutable_cpu_data(); + std::copy(idx.begin(), idx.begin() + num_remain, idx_data); + + TBlob overlapped(1, 1, num_remain, num_remain); + const int total_bboxes = overlapped.count(); + bool* overlapped_data = overlapped.mutable_gpu_data(); + ComputeOverlappedByIdxGPU(total_bboxes, bbox_data, nms_threshold, + idx_blob.gpu_data(), num_remain, overlapped_data); + + // Do non-maximum suppression based on overlapped results. + const bool* overlapped_results = overlapped.cpu_data(); + vector selected_indices; + ApplyNMS(overlapped_results, num_remain, &selected_indices); + + // Put back the selected information. + for (int i = 0; i < selected_indices.size(); ++i) { + indices->push_back(idx[selected_indices[i]]); + } +} + +template +void ApplyNMSGPU(const float* bbox_data, const float* conf_data, + const int num_bboxes, const float confidence_threshold, + const int top_k, const float nms_threshold, vector* indices); +template +void ApplyNMSGPU(const double* bbox_data, const double* conf_data, + const int num_bboxes, const float confidence_threshold, + const int top_k, const float nms_threshold, vector* indices); + +template +void ApplyNMSGPU(const float16* bbox_data, const float16* conf_data, + const int num_bboxes, const float confidence_threshold, + const int top_k, const float nms_threshold, vector* indices); + +template +__global__ void GetDetectionsKernel(const int nthreads, + const Dtype* bbox_data, const Dtype* conf_data, const int image_id, + const int label, const int* indices, const bool clip_bbox, + Dtype* detection_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int det_idx = indices[index]; + detection_data[index * 7] = image_id; + detection_data[index * 7 + 1] = label; + detection_data[index * 7 + 2] = conf_data[det_idx]; + if (clip_bbox) { + ClipBBoxGPU(&(bbox_data[det_idx * 4]), &(detection_data[index * 7 + 3])); + } else { + for (int i = 0; i < 4; ++i) { + detection_data[index * 7 + 3 + i] = bbox_data[det_idx * 4 + i]; + } + } + } +} + +template +void GetDetectionsGPU(const Dtype* bbox_data, const Dtype* conf_data, + const int image_id, const int label, const vector& indices, + const bool clip_bbox, TBlob* detection_blob) { + // Store selected indices in array. + int num_det = indices.size(); + if (num_det == 0) { + return; + } + TBlob idx_blob(1, 1, 1, num_det); + int* idx_data = idx_blob.mutable_cpu_data(); + std::copy(indices.begin(), indices.end(), idx_data); + // Prepare detection_blob. + detection_blob->Reshape(1, 1, num_det, 7); + Dtype* detection_data = detection_blob->mutable_gpu_data(); + // NOLINT_NEXT_LINE(whitespace/operators) + GetDetectionsKernel<<>>(num_det, bbox_data, conf_data, image_id, label, + idx_blob.gpu_data(), clip_bbox, detection_data); + CUDA_POST_KERNEL_CHECK; +} + +template void GetDetectionsGPU(const float* bbox_data, const float* conf_data, + const int image_id, const int label, const vector& indices, + const bool clip_bbox, TBlob* detection_blob); +template void GetDetectionsGPU(const double* bbox_data, const double* conf_data, + const int image_id, const int label, const vector& indices, + const bool clip_bbox, TBlob* detection_blob); + +template +__global__ void ComputeConfLossKernel(const int nthreads, + const Dtype* conf_data, const int num_preds_per_class, + const int num_classes, const ConfLossType loss_type, + const Dtype* match_data, Dtype* conf_loss_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + int label = match_data[index]; + int num = index / num_preds_per_class; + int p = index % num_preds_per_class; + int start_idx = (num * num_preds_per_class + p) * num_classes; + Dtype loss = 0; + if (loss_type == MultiBoxLossParameter_ConfLossType_SOFTMAX) { + // Compute softmax probability. + Dtype prob = conf_data[start_idx + label]; + loss = -log(Max(prob, Dtype(FLT_MIN))); + } else if (loss_type == MultiBoxLossParameter_ConfLossType_LOGISTIC) { + int target = 0; + for (int c = 0; c < num_classes; ++c) { + if (c == label) { + target = 1; + } else { + target = 0; + } + Dtype input = conf_data[start_idx + c]; + loss -= input * (target - (input >= 0)) - + log(1 + exp(input - 2 * input * (input >= 0))); + } + } + conf_loss_data[index] = loss; + } +} + +template +void ComputeConfLossGPU(const TBlob& conf_blob, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss) { + CHECK_LT(background_label_id, num_classes); + TBlob match_blob(num, num_preds_per_class, 1, 1); + Dtype* match_data = match_blob.mutable_cpu_data(); + for (int i = 0; i < num; ++i) { + const map >& match_indices = all_match_indices[i]; + for (int p = 0; p < num_preds_per_class; ++p) { + // Get the label index. + int label = background_label_id; + for (map >::const_iterator it = + match_indices.begin(); it != match_indices.end(); ++it) { + const vector& match_index = it->second; + CHECK_EQ(match_index.size(), num_preds_per_class); + if (match_index[p] > -1) { + CHECK(all_gt_bboxes.find(i) != all_gt_bboxes.end()); + const vector& gt_bboxes = + all_gt_bboxes.find(i)->second; + CHECK_LT(match_index[p], gt_bboxes.size()); + label = gt_bboxes[match_index[p]].label(); + CHECK_GE(label, 0); + CHECK_NE(label, background_label_id); + CHECK_LT(label, num_classes); + // A prior can only be matched to one gt bbox. + break; + } + } + match_data[i * num_preds_per_class + p] = label; + } + } + // Get probability data. + const Dtype* conf_gpu_data = conf_blob.gpu_data(); + TBlob prob_blob; + prob_blob.ReshapeLike(conf_blob); + if (loss_type == MultiBoxLossParameter_ConfLossType_SOFTMAX) { + Dtype* prob_gpu_data = prob_blob.mutable_gpu_data(); + SoftMaxGPU(conf_blob.gpu_data(), num * num_preds_per_class, num_classes, 1, + prob_gpu_data); + conf_gpu_data = prob_blob.gpu_data(); + } + // Compute the loss. + TBlob conf_loss_blob(num, num_preds_per_class, 1, 1); + Dtype* conf_loss_gpu_data = conf_loss_blob.mutable_gpu_data(); + const int num_threads = num * num_preds_per_class; + // NOLINT_NEXT_LINE(whitespace/operators) + ComputeConfLossKernel<<>>(num_threads, conf_gpu_data, num_preds_per_class, + num_classes, loss_type, match_blob.gpu_data(), conf_loss_gpu_data); + // Save the loss. + all_conf_loss->clear(); + const Dtype* loss_data = conf_loss_blob.cpu_data(); + for (int i = 0; i < num; ++i) { + vector conf_loss(loss_data, loss_data + num_preds_per_class); + all_conf_loss->push_back(conf_loss); + loss_data += num_preds_per_class; + } +} + +// Explicit initialization. +template void ComputeConfLossGPU(const TBlob& conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); +template void ComputeConfLossGPU(const TBlob& conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); +template void ComputeConfLossGPU(const TBlob& conf_data, const int num, + const int num_preds_per_class, const int num_classes, + const int background_label_id, const ConfLossType loss_type, + const vector > >& all_match_indices, + const map >& all_gt_bboxes, + vector >* all_conf_loss); + +} // namespace caffe diff --git a/src/caffe/util/blocking_queue.cpp b/src/caffe/util/blocking_queue.cpp index 0545b430119..696397b28a0 100644 --- a/src/caffe/util/blocking_queue.cpp +++ b/src/caffe/util/blocking_queue.cpp @@ -94,6 +94,7 @@ bool BlockingQueue::nonblocking_size(size_t* size) const { template class BlockingQueue; template class BlockingQueue>; template class BlockingQueue>; +template class BlockingQueue>; template class BlockingQueue; template class BlockingQueue>>; template class BlockingQueue>>; diff --git a/src/caffe/util/gpu_memory.cpp b/src/caffe/util/gpu_memory.cpp index 9464bdd0cea..5c2ab8fda30 100644 --- a/src/caffe/util/gpu_memory.cpp +++ b/src/caffe/util/gpu_memory.cpp @@ -257,4 +257,16 @@ void GPUMemory::Manager::GetInfo(size_t* free_mem, size_t* total_mem, bool with_ } } +GPUMemory::PinnedBuffer::PinnedBuffer(size_t size) { + CHECK_GT(size, 0); + shared_lock lock(GPUMemory::read_write_mutex()); + CUDA_CHECK(cudaHostAlloc(&hptr_, size, cudaHostAllocMapped)); + CUDA_CHECK(cudaHostGetDevicePointer(&dptr_, hptr_, 0)); +} + +GPUMemory::PinnedBuffer::~PinnedBuffer() { + shared_lock lock(GPUMemory::read_write_mutex()); + CUDA_CHECK(cudaFreeHost(hptr_)); +} + } // namespace caffe diff --git a/src/caffe/util/im_transforms.cpp b/src/caffe/util/im_transforms.cpp new file mode 100644 index 00000000000..2f179bc4ff0 --- /dev/null +++ b/src/caffe/util/im_transforms.cpp @@ -0,0 +1,729 @@ +#include + +#if CV_VERSION_MAJOR == 3 +#include +#define CV_GRAY2BGR cv::COLOR_GRAY2BGR +#define CV_BGR2GRAY cv::COLOR_BGR2GRAY +#define CV_BGR2YCrCb cv::COLOR_BGR2YCrCb +#define CV_YCrCb2BGR cv::COLOR_YCrCb2BGR +#define CV_IMWRITE_JPEG_QUALITY cv::IMWRITE_JPEG_QUALITY +#define CV_LOAD_IMAGE_COLOR cv::IMREAD_COLOR +#define CV_THRESH_BINARY_INV cv::THRESH_BINARY_INV +#define CV_THRESH_OTSU cv::THRESH_OTSU +#endif + +#include +#include +#include + +#include "caffe/util/im_transforms.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +const float prob_eps = 0.01; + +int roll_weighted_die(const vector& probabilities) { + vector cumulative; + std::partial_sum(&probabilities[0], &probabilities[0] + probabilities.size(), + std::back_inserter(cumulative)); + float val; + caffe_rng_uniform(1, static_cast(0), cumulative.back(), &val); + + // Find the position within the sequence and add 1 + return (std::lower_bound(cumulative.begin(), cumulative.end(), val) + - cumulative.begin()); +} + +void UpdateBBoxByResizePolicy(const ResizeParameter& param, + const int old_width, const int old_height, + NormalizedBBox* bbox) { + float new_height = param.height(); + float new_width = param.width(); + float orig_aspect = static_cast(old_width) / old_height; + float new_aspect = new_width / new_height; + + float x_min = bbox->xmin() * old_width; + float y_min = bbox->ymin() * old_height; + float x_max = bbox->xmax() * old_width; + float y_max = bbox->ymax() * old_height; + float padding; + switch (param.resize_mode()) { + case ResizeParameter_Resize_mode_WARP: + x_min = std::max(0.f, x_min * new_width / old_width); + x_max = std::min(new_width, x_max * new_width / old_width); + y_min = std::max(0.f, y_min * new_height / old_height); + y_max = std::min(new_height, y_max * new_height / old_height); + break; + case ResizeParameter_Resize_mode_FIT_LARGE_SIZE_AND_PAD: + if (orig_aspect > new_aspect) { + padding = (new_height - new_width / orig_aspect) / 2; + x_min = std::max(0.f, x_min * new_width / old_width); + x_max = std::min(new_width, x_max * new_width / old_width); + y_min = y_min * (new_height - 2 * padding) / old_height; + y_min = padding + std::max(0.f, y_min); + y_max = y_max * (new_height - 2 * padding) / old_height; + y_max = padding + std::min(new_height, y_max); + } else { + padding = (new_width - orig_aspect * new_height) / 2; + x_min = x_min * (new_width - 2 * padding) / old_width; + x_min = padding + std::max(0.f, x_min); + x_max = x_max * (new_width - 2 * padding) / old_width; + x_max = padding + std::min(new_width, x_max); + y_min = std::max(0.f, y_min * new_height / old_height); + y_max = std::min(new_height, y_max * new_height / old_height); + } + break; + case ResizeParameter_Resize_mode_FIT_SMALL_SIZE: + if (orig_aspect < new_aspect) { + new_height = new_width / orig_aspect; + } else { + new_width = orig_aspect * new_height; + } + x_min = std::max(0.f, x_min * new_width / old_width); + x_max = std::min(new_width, x_max * new_width / old_width); + y_min = std::max(0.f, y_min * new_height / old_height); + y_max = std::min(new_height, y_max * new_height / old_height); + break; + default: + LOG(FATAL) << "Unknown resize mode."; + } + bbox->set_xmin(x_min / new_width); + bbox->set_ymin(y_min / new_height); + bbox->set_xmax(x_max / new_width); + bbox->set_ymax(y_max / new_height); +} + +void InferNewSize(const ResizeParameter& resize_param, + const int old_width, const int old_height, + int* new_width, int* new_height) { + int height = resize_param.height(); + int width = resize_param.width(); + float orig_aspect = static_cast(old_width) / old_height; + float aspect = static_cast(width) / height; + + switch (resize_param.resize_mode()) { + case ResizeParameter_Resize_mode_WARP: + break; + case ResizeParameter_Resize_mode_FIT_LARGE_SIZE_AND_PAD: + break; + case ResizeParameter_Resize_mode_FIT_SMALL_SIZE: + if (orig_aspect < aspect) { + height = static_cast(width / orig_aspect); + } else { + width = static_cast(orig_aspect * height); + } + break; + default: + LOG(FATAL) << "Unknown resize mode."; + } + *new_height = height; + *new_width = width; +} + +template +bool is_border(const cv::Mat& edge, T color) { + cv::Mat im = edge.clone().reshape(0, 1); + bool res = true; + for (int i = 0; i < im.cols; ++i) { + res &= (color == im.at(0, i)); + } + return res; +} + +template +bool is_border(const cv::Mat& edge, uchar color); + +template +cv::Rect CropMask(const cv::Mat& src, T point, int padding) { + cv::Rect win(0, 0, src.cols, src.rows); + + vector edges; + edges.push_back(cv::Rect(0, 0, src.cols, 1)); + edges.push_back(cv::Rect(src.cols-2, 0, 1, src.rows)); + edges.push_back(cv::Rect(0, src.rows-2, src.cols, 1)); + edges.push_back(cv::Rect(0, 0, 1, src.rows)); + + cv::Mat edge; + int nborder = 0; + T color = src.at(0, 0); + for (int i = 0; i < edges.size(); ++i) { + edge = src(edges[i]); + nborder += is_border(edge, color); + } + + if (nborder < 4) { + return win; + } + + bool next; + do { + edge = src(cv::Rect(win.x, win.height - 2, win.width, 1)); + next = is_border(edge, color); + if (next) { + win.height--; + } + } while (next && (win.height > 0)); + + do { + edge = src(cv::Rect(win.width - 2, win.y, 1, win.height)); + next = is_border(edge, color); + if (next) { + win.width--; + } + } while (next && (win.width > 0)); + + do { + edge = src(cv::Rect(win.x, win.y, win.width, 1)); + next = is_border(edge, color); + if (next) { + win.y++; + win.height--; + } + } while (next && (win.y <= src.rows)); + + do { + edge = src(cv::Rect(win.x, win.y, 1, win.height)); + next = is_border(edge, color); + if (next) { + win.x++; + win.width--; + } + } while (next && (win.x <= src.cols)); + + // add padding + if (win.x > padding) { + win.x -= padding; + } + if (win.y > padding) { + win.y -= padding; + } + if ((win.width + win.x + padding) < src.cols) { + win.width += padding; + } + if ((win.height + win.y + padding) < src.rows) { + win.height += padding; + } + + return win; +} + +template +cv::Rect CropMask(const cv::Mat& src, uchar point, int padding); + +cv::Mat colorReduce(const cv::Mat& image, int div) { + cv::Mat out_img; + cv::Mat lookUpTable(1, 256, CV_8U); + uchar* p = lookUpTable.data; + const int div_2 = div / 2; + for ( int i = 0; i < 256; ++i ) { + p[i] = i / div * div + div_2; + } + cv::LUT(image, lookUpTable, out_img); + return out_img; +} + +void fillEdgeImage(const cv::Mat& edgesIn, cv::Mat* filledEdgesOut) { + cv::Mat edgesNeg = edgesIn.clone(); + cv::Scalar val(255, 255, 255); + cv::floodFill(edgesNeg, cv::Point(0, 0), val); + cv::floodFill(edgesNeg, cv::Point(edgesIn.cols - 1, edgesIn.rows - 1), val); + cv::floodFill(edgesNeg, cv::Point(0, edgesIn.rows - 1), val); + cv::floodFill(edgesNeg, cv::Point(edgesIn.cols - 1, 0), val); + cv::bitwise_not(edgesNeg, edgesNeg); + *filledEdgesOut = (edgesNeg | edgesIn); + return; +} + +void CenterObjectAndFillBg(const cv::Mat& in_img, const bool fill_bg, + cv::Mat* out_img) { + cv::Mat mask, crop_mask; + if (in_img.channels() > 1) { + cv::Mat in_img_gray; + cv::cvtColor(in_img, in_img_gray, CV_BGR2GRAY); + cv::threshold(in_img_gray, mask, 0, 255, + CV_THRESH_BINARY_INV | CV_THRESH_OTSU); + } else { + cv::threshold(in_img, mask, 0, 255, + CV_THRESH_BINARY_INV | CV_THRESH_OTSU); + } + cv::Rect crop_rect = CropMask(mask, mask.at(0, 0), 2); + + if (fill_bg) { + cv::Mat temp_img = in_img(crop_rect); + fillEdgeImage(mask, &mask); + crop_mask = mask(crop_rect).clone(); + *out_img = cv::Mat::zeros(crop_rect.size(), in_img.type()); + temp_img.copyTo(*out_img, crop_mask); + } else { + *out_img = in_img(crop_rect).clone(); + } +} + +cv::Mat AspectKeepingResizeAndPad(const cv::Mat& in_img, + const int new_width, const int new_height, + const int pad_type, const cv::Scalar pad_val, + const int interp_mode) { + cv::Mat img_resized; + float orig_aspect = static_cast(in_img.cols) / in_img.rows; + float new_aspect = static_cast(new_width) / new_height; + + if (orig_aspect > new_aspect) { + int height = floor(static_cast(new_width) / orig_aspect); + cv::resize(in_img, img_resized, cv::Size(new_width, height), 0, 0, + interp_mode); + cv::Size resSize = img_resized.size(); + int padding = floor((new_height - resSize.height) / 2.0); + cv::copyMakeBorder(img_resized, img_resized, padding, + new_height - resSize.height - padding, 0, 0, + pad_type, pad_val); + } else { + int width = floor(orig_aspect * new_height); + cv::resize(in_img, img_resized, cv::Size(width, new_height), 0, 0, + interp_mode); + cv::Size resSize = img_resized.size(); + int padding = floor((new_width - resSize.width) / 2.0); + cv::copyMakeBorder(img_resized, img_resized, 0, 0, padding, + new_width - resSize.width - padding, + pad_type, pad_val); + } + return img_resized; +} + +cv::Mat AspectKeepingResizeBySmall(const cv::Mat& in_img, + const int new_width, + const int new_height, + const int interp_mode) { + cv::Mat img_resized; + float orig_aspect = static_cast(in_img.cols) / in_img.rows; + float new_aspect = static_cast (new_width) / new_height; + + if (orig_aspect < new_aspect) { + int height = floor(static_cast(new_width) / orig_aspect); + cv::resize(in_img, img_resized, cv::Size(new_width, height), 0, 0, + interp_mode); + } else { + int width = floor(orig_aspect * new_height); + cv::resize(in_img, img_resized, cv::Size(width, new_height), 0, 0, + interp_mode); + } + return img_resized; +} + +void constantNoise(const int n, const vector& val, cv::Mat* image) { + const int cols = image->cols; + const int rows = image->rows; + + if (image->channels() == 1) { + for (int k = 0; k < n; ++k) { + const int i = caffe_rng_rand() % cols; + const int j = caffe_rng_rand() % rows; + uchar* ptr = image->ptr(j); + ptr[i]= val[0]; + } + } else if (image->channels() == 3) { // color image + for (int k = 0; k < n; ++k) { + const int i = caffe_rng_rand() % cols; + const int j = caffe_rng_rand() % rows; + cv::Vec3b* ptr = image->ptr(j); + (ptr[i])[0] = val[0]; + (ptr[i])[1] = val[1]; + (ptr[i])[2] = val[2]; + } + } +} + +cv::Mat ApplyResize(const cv::Mat& in_img, const ResizeParameter& param) { + cv::Mat out_img; + + // Reading parameters + const int new_height = param.height(); + const int new_width = param.width(); + + int pad_mode = cv::BORDER_CONSTANT; + switch (param.pad_mode()) { + case ResizeParameter_Pad_mode_CONSTANT: + break; + case ResizeParameter_Pad_mode_MIRRORED: + pad_mode = cv::BORDER_REFLECT101; + break; + case ResizeParameter_Pad_mode_REPEAT_NEAREST: + pad_mode = cv::BORDER_REPLICATE; + break; + default: + LOG(FATAL) << "Unknown pad mode."; + } + + int interp_mode = cv::INTER_LINEAR; + int num_interp_mode = param.interp_mode_size(); + if (num_interp_mode > 0) { + vector probs(num_interp_mode, 1.f / num_interp_mode); + int prob_num = roll_weighted_die(probs); + switch (param.interp_mode(prob_num)) { + case ResizeParameter_Interp_mode_AREA: + interp_mode = cv::INTER_AREA; + break; + case ResizeParameter_Interp_mode_CUBIC: + interp_mode = cv::INTER_CUBIC; + break; + case ResizeParameter_Interp_mode_LINEAR: + interp_mode = cv::INTER_LINEAR; + break; + case ResizeParameter_Interp_mode_NEAREST: + interp_mode = cv::INTER_NEAREST; + break; + case ResizeParameter_Interp_mode_LANCZOS4: + interp_mode = cv::INTER_LANCZOS4; + break; + default: + LOG(FATAL) << "Unknown interp mode."; + } + } + + cv::Scalar pad_val = cv::Scalar(0, 0, 0); + const int img_channels = in_img.channels(); + if (param.pad_value_size() > 0) { + CHECK(param.pad_value_size() == 1 || + param.pad_value_size() == img_channels) << + "Specify either 1 pad_value or as many as channels: " << img_channels; + vector pad_values; + for (int i = 0; i < param.pad_value_size(); ++i) { + pad_values.push_back(param.pad_value(i)); + } + if (img_channels > 1 && param.pad_value_size() == 1) { + // Replicate the pad_value for simplicity + for (int c = 1; c < img_channels; ++c) { + pad_values.push_back(pad_values[0]); + } + } + pad_val = cv::Scalar(pad_values[0], pad_values[1], pad_values[2]); + } + + switch (param.resize_mode()) { + case ResizeParameter_Resize_mode_WARP: + cv::resize(in_img, out_img, cv::Size(new_width, new_height), 0, 0, + interp_mode); + break; + case ResizeParameter_Resize_mode_FIT_LARGE_SIZE_AND_PAD: + out_img = AspectKeepingResizeAndPad(in_img, new_width, new_height, + pad_mode, pad_val, interp_mode); + break; + case ResizeParameter_Resize_mode_FIT_SMALL_SIZE: + out_img = AspectKeepingResizeBySmall(in_img, new_width, new_height, + interp_mode); + break; + default: + LOG(INFO) << "Unknown resize mode."; + } + return out_img; +} + +cv::Mat ApplyNoise(const cv::Mat& in_img, const NoiseParameter& param) { + cv::Mat out_img; + + if (param.decolorize()) { + cv::Mat grayscale_img; + cv::cvtColor(in_img, grayscale_img, CV_BGR2GRAY); + cv::cvtColor(grayscale_img, out_img, CV_GRAY2BGR); + } else { + out_img = in_img; + } + + if (param.gauss_blur()) { + cv::GaussianBlur(out_img, out_img, cv::Size(7, 7), 1.5); + } + + if (param.hist_eq()) { + if (out_img.channels() > 1) { + cv::Mat ycrcb_image; + cv::cvtColor(out_img, ycrcb_image, CV_BGR2YCrCb); + // Extract the L channel + vector ycrcb_planes(3); + cv::split(ycrcb_image, ycrcb_planes); + // now we have the L image in ycrcb_planes[0] + cv::Mat dst; + cv::equalizeHist(ycrcb_planes[0], dst); + ycrcb_planes[0] = dst; + cv::merge(ycrcb_planes, ycrcb_image); + // convert back to RGB + cv::cvtColor(ycrcb_image, out_img, CV_YCrCb2BGR); + } else { + cv::Mat temp_img; + cv::equalizeHist(out_img, temp_img); + out_img = temp_img; + } + } + + if (param.clahe()) { + cv::Ptr clahe = cv::createCLAHE(); + clahe->setClipLimit(4); + if (out_img.channels() > 1) { + cv::Mat ycrcb_image; + cv::cvtColor(out_img, ycrcb_image, CV_BGR2YCrCb); + // Extract the L channel + vector ycrcb_planes(3); + cv::split(ycrcb_image, ycrcb_planes); + // now we have the L image in ycrcb_planes[0] + cv::Mat dst; + clahe->apply(ycrcb_planes[0], dst); + ycrcb_planes[0] = dst; + cv::merge(ycrcb_planes, ycrcb_image); + // convert back to RGB + cv::cvtColor(ycrcb_image, out_img, CV_YCrCb2BGR); + } else { + cv::Ptr clahe = cv::createCLAHE(); + clahe->setClipLimit(4); + cv::Mat temp_img; + clahe->apply(out_img, temp_img); + out_img = temp_img; + } + } + + if (param.jpeg() > 0) { + vector buf; + vector params; + params.push_back(CV_IMWRITE_JPEG_QUALITY); + params.push_back(param.jpeg()); + cv::imencode(".jpg", out_img, buf, params); + out_img = cv::imdecode(buf, CV_LOAD_IMAGE_COLOR); + } + + if (param.erode()) { + cv::Mat element = cv::getStructuringElement( + 2, cv::Size(3, 3), cv::Point(1, 1)); + cv::erode(out_img, out_img, element); + } + + if (param.posterize()) { + cv::Mat tmp_img; + tmp_img = colorReduce(out_img); + out_img = tmp_img; + } + + if (param.inverse()) { + cv::Mat tmp_img; + cv::bitwise_not(out_img, tmp_img); + out_img = tmp_img; + } + + vector noise_values; + if (param.saltpepper_param().value_size() > 0) { + CHECK(param.saltpepper_param().value_size() == 1 + || param.saltpepper_param().value_size() == out_img.channels()) + << "Specify either 1 pad_value or as many as channels: " + << out_img.channels(); + + for (int i = 0; i < param.saltpepper_param().value_size(); i++) { + noise_values.push_back(uchar(param.saltpepper_param().value(i))); + } + if (out_img.channels() > 1 + && param.saltpepper_param().value_size() == 1) { + // Replicate the pad_value for simplicity + for (int c = 1; c < out_img.channels(); ++c) { + noise_values.push_back(uchar(noise_values[0])); + } + } + } + if (param.saltpepper()) { + const int noise_pixels_num = + floor(param.saltpepper_param().fraction() + * out_img.cols * out_img.rows); + constantNoise(noise_pixels_num, noise_values, &out_img); + } + + if (param.convert_to_hsv()) { + cv::Mat hsv_image; + cv::cvtColor(out_img, hsv_image, CV_BGR2HSV); + out_img = hsv_image; + } + if (param.convert_to_lab()) { + cv::Mat lab_image; + out_img.convertTo(lab_image, CV_32F); + lab_image *= 1.0 / 255; + cv::cvtColor(lab_image, out_img, CV_BGR2Lab); + } + return out_img; +} + +void RandomBrightness(const cv::Mat& in_img, cv::Mat* out_img, + const float brightness_prob, const float brightness_delta) { + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + if (prob < brightness_prob) { + CHECK_GE(brightness_delta, 0) << "brightness_delta must be non-negative."; + float delta; + caffe_rng_uniform(1, -brightness_delta, brightness_delta, &delta); + AdjustBrightness(in_img, delta, out_img); + } else { + *out_img = in_img; + } +} + +void AdjustBrightness(const cv::Mat& in_img, const float delta, + cv::Mat* out_img) { + if (fabs(delta) > 0) { + in_img.convertTo(*out_img, -1, 1, delta); + } else { + *out_img = in_img; + } +} + +void RandomContrast(const cv::Mat& in_img, cv::Mat* out_img, + const float contrast_prob, const float lower, const float upper) { + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + if (prob < contrast_prob) { + CHECK_GE(upper, lower) << "contrast upper must be >= lower."; + CHECK_GE(lower, 0) << "contrast lower must be non-negative."; + float delta; + caffe_rng_uniform(1, lower, upper, &delta); + AdjustContrast(in_img, delta, out_img); + } else { + *out_img = in_img; + } +} + +void AdjustContrast(const cv::Mat& in_img, const float delta, + cv::Mat* out_img) { + if (fabs(delta - 1.f) > 1e-3) { + in_img.convertTo(*out_img, -1, delta, 0); + } else { + *out_img = in_img; + } +} + +void RandomSaturation(const cv::Mat& in_img, cv::Mat* out_img, + const float saturation_prob, const float lower, const float upper) { + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + if (prob < saturation_prob) { + CHECK_GE(upper, lower) << "saturation upper must be >= lower."; + CHECK_GE(lower, 0) << "saturation lower must be non-negative."; + float delta; + caffe_rng_uniform(1, lower, upper, &delta); + AdjustSaturation(in_img, delta, out_img); + } else { + *out_img = in_img; + } +} + +void AdjustSaturation(const cv::Mat& in_img, const float delta, + cv::Mat* out_img) { + if (fabs(delta - 1.f) != 1e-3) { + // Convert to HSV colorspae. + cv::cvtColor(in_img, *out_img, CV_BGR2HSV); + + // Split the image to 3 channels. + vector channels; + cv::split(*out_img, channels); + + // Adjust the saturation. + channels[1].convertTo(channels[1], -1, delta, 0); + cv::merge(channels, *out_img); + + // Back to BGR colorspace. + cvtColor(*out_img, *out_img, CV_HSV2BGR); + } else { + *out_img = in_img; + } +} + +void RandomHue(const cv::Mat& in_img, cv::Mat* out_img, + const float hue_prob, const float hue_delta) { + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + if (prob < hue_prob) { + CHECK_GE(hue_delta, 0) << "hue_delta must be non-negative."; + float delta; + caffe_rng_uniform(1, -hue_delta, hue_delta, &delta); + AdjustHue(in_img, delta, out_img); + } else { + *out_img = in_img; + } +} + +void AdjustHue(const cv::Mat& in_img, const float delta, cv::Mat* out_img) { + if (fabs(delta) > 0) { + // Convert to HSV colorspae. + cv::cvtColor(in_img, *out_img, CV_BGR2HSV); + + // Split the image to 3 channels. + vector channels; + cv::split(*out_img, channels); + + // Adjust the hue. + channels[0].convertTo(channels[0], -1, 1, delta); + cv::merge(channels, *out_img); + + // Back to BGR colorspace. + cvtColor(*out_img, *out_img, CV_HSV2BGR); + } else { + *out_img = in_img; + } +} + +void RandomOrderChannels(const cv::Mat& in_img, cv::Mat* out_img, + const float random_order_prob) { + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + if (prob < random_order_prob) { + // Split the image to 3 channels. + vector channels; + cv::split(*out_img, channels); + CHECK_EQ(channels.size(), 3); + + // Shuffle the channels. + std::random_shuffle(channels.begin(), channels.end()); + cv::merge(channels, *out_img); + } else { + *out_img = in_img; + } +} + +cv::Mat ApplyDistort(const cv::Mat& in_img, const DistortionParameter& param) { + cv::Mat out_img = in_img; + float prob; + caffe_rng_uniform(1, 0.f, 1.f, &prob); + + if (prob > 0.5) { + // Do random brightness distortion. + RandomBrightness(out_img, &out_img, param.brightness_prob(), + param.brightness_delta()); + + // Do random contrast distortion. + RandomContrast(out_img, &out_img, param.contrast_prob(), + param.contrast_lower(), param.contrast_upper()); + + // Do random saturation distortion. + RandomSaturation(out_img, &out_img, param.saturation_prob(), + param.saturation_lower(), param.saturation_upper()); + + // Do random hue distortion. + RandomHue(out_img, &out_img, param.hue_prob(), param.hue_delta()); + + // Do random reordering of the channels. + RandomOrderChannels(out_img, &out_img, param.random_order_prob()); + } else { + // Do random brightness distortion. + RandomBrightness(out_img, &out_img, param.brightness_prob(), + param.brightness_delta()); + + // Do random saturation distortion. + RandomSaturation(out_img, &out_img, param.saturation_prob(), + param.saturation_lower(), param.saturation_upper()); + + // Do random hue distortion. + RandomHue(out_img, &out_img, param.hue_prob(), param.hue_delta()); + + // Do random contrast distortion. + RandomContrast(out_img, &out_img, param.contrast_prob(), + param.contrast_lower(), param.contrast_upper()); + + // Do random reordering of the channels. + RandomOrderChannels(out_img, &out_img, param.random_order_prob()); + } + + return out_img; +} + +} // namespace caffe diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 9ef6c38a108..ebd7dc40932 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -1,3 +1,10 @@ +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -6,6 +13,7 @@ #include #include #include // NOLINT(readability/streams) +#include #include #include "caffe/blob.hpp" @@ -15,6 +23,7 @@ const int kProtoReadBytesLimit = INT_MAX; // Max size of 2 GB minus 1 byte. namespace caffe { +using namespace boost::property_tree; // NOLINT(build/namespaces) using google::protobuf::io::FileInputStream; using google::protobuf::io::FileOutputStream; using google::protobuf::io::ZeroCopyInputStream; @@ -209,6 +218,49 @@ cv::Mat ReadImageToCVMat(const string& filename, return cv_img; } +cv::Mat ReadImageToCVMat(const string& filename, const int height, + const int width, const int min_dim, const int max_dim, + const bool is_color) { + cv::Mat cv_img; + int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : + CV_LOAD_IMAGE_GRAYSCALE); + cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); + if (!cv_img_origin.data) { + LOG(ERROR) << "Could not open or find file " << filename; + return cv_img_origin; + } + if (min_dim > 0 || max_dim > 0) { + int num_rows = cv_img_origin.rows; + int num_cols = cv_img_origin.cols; + int min_num = std::min(num_rows, num_cols); + int max_num = std::max(num_rows, num_cols); + float scale_factor = 1; + if (min_dim > 0 && min_num < min_dim) { + scale_factor = static_cast(min_dim) / min_num; + } + if (max_dim > 0 && static_cast(scale_factor * max_num) > max_dim) { + // Make sure the maximum dimension is less than max_dim. + scale_factor = static_cast(max_dim) / max_num; + } + if (scale_factor == 1) { + cv_img = cv_img_origin; + } else { + cv::resize(cv_img_origin, cv_img, cv::Size(0, 0), + scale_factor, scale_factor); + } + } else if (height > 0 && width > 0) { + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); + } else { + cv_img = cv_img_origin; + } + return cv_img; +} + +cv::Mat ReadImageToCVMat(const string& filename, const int height, + const int width, const int min_dim, const int max_dim) { + return ReadImageToCVMat(filename, height, width, min_dim, max_dim, true); +} + cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width) { return ReadImageToCVMat(filename, height, width, true); @@ -263,7 +315,494 @@ bool ReadImageToDatum(const string& filename, const int label, } } -// tests only, TODO: clean +bool ReadImageToDatum(const string& filename, const int label, + const int height, const int width, const int min_dim, const int max_dim, + const bool is_color, const std::string & encoding, Datum* datum) { + cv::Mat cv_img = ReadImageToCVMat(filename, height, width, min_dim, max_dim, + is_color); + if (cv_img.data) { + if (encoding.size()) { + if ( (cv_img.channels() == 3) == is_color && !height && !width && + !min_dim && !max_dim && matchExt(filename, encoding) ) { + datum->set_channels(cv_img.channels()); + datum->set_height(cv_img.rows); + datum->set_width(cv_img.cols); + return ReadFileToDatum(filename, label, datum); + } + EncodeCVMatToDatum(cv_img, encoding, datum); + datum->set_label(label); + return true; + } + CVMatToDatum(cv_img, *datum); + datum->set_label(label); + return true; + } else { + return false; + } +} + +void GetImageSize(const string& filename, int* height, int* width) { + cv::Mat cv_img = cv::imread(filename); + if (!cv_img.data) { + LOG(ERROR) << "Could not open or find file " << filename; + return; + } + *height = cv_img.rows; + *width = cv_img.cols; +} + +bool ReadRichImageToAnnotatedDatum(const string& filename, + const string& labelfile, const int height, const int width, + const int min_dim, const int max_dim, const bool is_color, + const string& encoding, const AnnotatedDatum_AnnotationType type, + const string& labeltype, const std::map& name_to_label, + AnnotatedDatum* anno_datum) { + // Read image to datum. + bool status = ReadImageToDatum(filename, -1, height, width, + min_dim, max_dim, is_color, encoding, + anno_datum->mutable_datum()); + if (status == false) { + return status; + } + anno_datum->clear_annotation_group(); + if (!boost::filesystem::exists(labelfile)) { + return true; + } + switch (type) { + case AnnotatedDatum_AnnotationType_BBOX: + int ori_height, ori_width; + GetImageSize(filename, &ori_height, &ori_width); + if (labeltype == "xml") { + return ReadXMLToAnnotatedDatum(labelfile, ori_height, ori_width, + name_to_label, anno_datum); + } else if (labeltype == "json") { + return ReadJSONToAnnotatedDatum(labelfile, ori_height, ori_width, + name_to_label, anno_datum); + } else if (labeltype == "txt") { + return ReadTxtToAnnotatedDatum(labelfile, ori_height, ori_width, + anno_datum); + } else { + LOG(FATAL) << "Unknown label file type."; + return false; + } + break; + default: + LOG(FATAL) << "Unknown annotation type."; + return false; + } +} + +//bool ReadFileToDatum(const string& filename, const int label, +// Datum* datum) { +// std::streampos size; +// +// fstream file(filename.c_str(), ios::in|ios::binary|ios::ate); +// if (file.is_open()) { +// size = file.tellg(); +// std::string buffer(size, ' '); +// file.seekg(0, ios::beg); +// file.read(&buffer[0], size); +// file.close(); +// datum->set_data(buffer); +// datum->set_label(label); +// datum->set_encoded(true); +// return true; +// } else { +// return false; +// } +//} + +// Parse VOC/ILSVRC detection annotation. +bool ReadXMLToAnnotatedDatum(const string& labelfile, const int img_height, + const int img_width, const std::map& name_to_label, + AnnotatedDatum* anno_datum) { + ptree pt; + read_xml(labelfile, pt); + + // Parse annotation. + int width = 0, height = 0; + try { + height = pt.get("annotation.size.height"); + width = pt.get("annotation.size.width"); + } catch (const ptree_error &e) { + LOG(WARNING) << "When parsing " << labelfile << ": " << e.what(); + height = img_height; + width = img_width; + } + LOG_IF(WARNING, height != img_height) << labelfile << + " inconsistent image height."; + LOG_IF(WARNING, width != img_width) << labelfile << + " inconsistent image width."; + CHECK(width != 0 && height != 0) << labelfile << + " no valid image width/height."; + int instance_id = 0; + BOOST_FOREACH(ptree::value_type &v1, pt.get_child("annotation")) { + ptree pt1 = v1.second; + if (v1.first == "object") { + Annotation* anno = NULL; + bool difficult = false; + ptree object = v1.second; + BOOST_FOREACH(ptree::value_type &v2, object.get_child("")) { + ptree pt2 = v2.second; + if (v2.first == "name") { + string name = pt2.data(); + if (name_to_label.find(name) == name_to_label.end()) { + LOG(FATAL) << "Unknown name: " << name; + } + int label = name_to_label.find(name)->second; + bool found_group = false; + for (int g = 0; g < anno_datum->annotation_group_size(); ++g) { + AnnotationGroup* anno_group = + anno_datum->mutable_annotation_group(g); + if (label == anno_group->group_label()) { + if (anno_group->annotation_size() == 0) { + instance_id = 0; + } else { + instance_id = anno_group->annotation( + anno_group->annotation_size() - 1).instance_id() + 1; + } + anno = anno_group->add_annotation(); + found_group = true; + } + } + if (!found_group) { + // If there is no such annotation_group, create a new one. + AnnotationGroup* anno_group = anno_datum->add_annotation_group(); + anno_group->set_group_label(label); + anno = anno_group->add_annotation(); + instance_id = 0; + } + anno->set_instance_id(instance_id++); + } else if (v2.first == "difficult") { + difficult = pt2.data() == "1"; + } else if (v2.first == "bndbox") { + int xmin = pt2.get("xmin", 0); + int ymin = pt2.get("ymin", 0); + int xmax = pt2.get("xmax", 0); + int ymax = pt2.get("ymax", 0); + CHECK_NOTNULL(anno); + LOG_IF(WARNING, xmin > width) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymin > height) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmax > width) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymax > height) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmin < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymin < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmax < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymax < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmin > xmax) << labelfile << + " bounding box irregular."; + LOG_IF(WARNING, ymin > ymax) << labelfile << + " bounding box irregular."; + // Store the normalized bounding box. + NormalizedBBox* bbox = anno->mutable_bbox(); + bbox->set_xmin(static_cast(xmin) / width); + bbox->set_ymin(static_cast(ymin) / height); + bbox->set_xmax(static_cast(xmax) / width); + bbox->set_ymax(static_cast(ymax) / height); + bbox->set_difficult(difficult); + } + } + } + } + return true; +} + +// Parse MSCOCO detection annotation. +bool ReadJSONToAnnotatedDatum(const string& labelfile, const int img_height, + const int img_width, const std::map& name_to_label, + AnnotatedDatum* anno_datum) { + ptree pt; + read_json(labelfile, pt); + + // Get image info. + int width = 0, height = 0; + try { + height = pt.get("image.height"); + width = pt.get("image.width"); + } catch (const ptree_error &e) { + LOG(WARNING) << "When parsing " << labelfile << ": " << e.what(); + height = img_height; + width = img_width; + } + LOG_IF(WARNING, height != img_height) << labelfile << + " inconsistent image height."; + LOG_IF(WARNING, width != img_width) << labelfile << + " inconsistent image width."; + CHECK(width != 0 && height != 0) << labelfile << + " no valid image width/height."; + + // Get annotation info. + int instance_id = 0; + BOOST_FOREACH(ptree::value_type& v1, pt.get_child("annotation")) { + Annotation* anno = NULL; + bool iscrowd = false; + ptree object = v1.second; + // Get category_id. + string name = object.get("category_id"); + if (name_to_label.find(name) == name_to_label.end()) { + LOG(FATAL) << "Unknown name: " << name; + } + int label = name_to_label.find(name)->second; + bool found_group = false; + for (int g = 0; g < anno_datum->annotation_group_size(); ++g) { + AnnotationGroup* anno_group = + anno_datum->mutable_annotation_group(g); + if (label == anno_group->group_label()) { + if (anno_group->annotation_size() == 0) { + instance_id = 0; + } else { + instance_id = anno_group->annotation( + anno_group->annotation_size() - 1).instance_id() + 1; + } + anno = anno_group->add_annotation(); + found_group = true; + } + } + if (!found_group) { + // If there is no such annotation_group, create a new one. + AnnotationGroup* anno_group = anno_datum->add_annotation_group(); + anno_group->set_group_label(label); + anno = anno_group->add_annotation(); + instance_id = 0; + } + anno->set_instance_id(instance_id++); + + // Get iscrowd. + iscrowd = object.get("iscrowd", 0); + + // Get bbox. + vector bbox_items; + BOOST_FOREACH(ptree::value_type& v2, object.get_child("bbox")) { + bbox_items.push_back(v2.second.get_value()); + } + CHECK_EQ(bbox_items.size(), 4); + float xmin = bbox_items[0]; + float ymin = bbox_items[1]; + float xmax = bbox_items[0] + bbox_items[2]; + float ymax = bbox_items[1] + bbox_items[3]; + CHECK_NOTNULL(anno); + LOG_IF(WARNING, xmin > width) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymin > height) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmax > width) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymax > height) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmin < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymin < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmax < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymax < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmin > xmax) << labelfile << + " bounding box irregular."; + LOG_IF(WARNING, ymin > ymax) << labelfile << + " bounding box irregular."; + // Store the normalized bounding box. + NormalizedBBox* bbox = anno->mutable_bbox(); + bbox->set_xmin(xmin / width); + bbox->set_ymin(ymin / height); + bbox->set_xmax(xmax / width); + bbox->set_ymax(ymax / height); + bbox->set_difficult(iscrowd); + } + return true; +} + +// Parse plain txt detection annotation: label_id, xmin, ymin, xmax, ymax. +bool ReadTxtToAnnotatedDatum(const string& labelfile, const int height, + const int width, AnnotatedDatum* anno_datum) { + std::ifstream infile(labelfile.c_str()); + if (!infile.good()) { + LOG(INFO) << "Cannot open " << labelfile; + return false; + } + int label; + float xmin, ymin, xmax, ymax; + while (infile >> label >> xmin >> ymin >> xmax >> ymax) { + Annotation* anno = NULL; + int instance_id = 0; + bool found_group = false; + for (int g = 0; g < anno_datum->annotation_group_size(); ++g) { + AnnotationGroup* anno_group = anno_datum->mutable_annotation_group(g); + if (label == anno_group->group_label()) { + if (anno_group->annotation_size() == 0) { + instance_id = 0; + } else { + instance_id = anno_group->annotation( + anno_group->annotation_size() - 1).instance_id() + 1; + } + anno = anno_group->add_annotation(); + found_group = true; + } + } + if (!found_group) { + // If there is no such annotation_group, create a new one. + AnnotationGroup* anno_group = anno_datum->add_annotation_group(); + anno_group->set_group_label(label); + anno = anno_group->add_annotation(); + instance_id = 0; + } + anno->set_instance_id(instance_id++); + LOG_IF(WARNING, xmin > width) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymin > height) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmax > width) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymax > height) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmin < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymin < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmax < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, ymax < 0) << labelfile << + " bounding box exceeds image boundary."; + LOG_IF(WARNING, xmin > xmax) << labelfile << + " bounding box irregular."; + LOG_IF(WARNING, ymin > ymax) << labelfile << + " bounding box irregular."; + // Store the normalized bounding box. + NormalizedBBox* bbox = anno->mutable_bbox(); + bbox->set_xmin(xmin / width); + bbox->set_ymin(ymin / height); + bbox->set_xmax(xmax / width); + bbox->set_ymax(ymax / height); + bbox->set_difficult(false); + } + return true; +} + +bool ReadLabelFileToLabelMap(const string& filename, bool include_background, + const string& delimiter, LabelMap* map) { + // cleanup + map->Clear(); + + std::ifstream file(filename.c_str()); + string line; + // Every line can have [1, 3] number of fields. + // The delimiter between fields can be one of " :;". + // The order of the fields are: + // name [label] [display_name] + // ... + int field_size = -1; + int label = 0; + LabelMapItem* map_item; + // Add background (none_of_the_above) class. + if (include_background) { + map_item = map->add_item(); + map_item->set_name("none_of_the_above"); + map_item->set_label(label++); + map_item->set_display_name("background"); + } + while (std::getline(file, line)) { + vector fields; + fields.clear(); + boost::split(fields, line, boost::is_any_of(delimiter)); + if (field_size == -1) { + field_size = fields.size(); + } else { + CHECK_EQ(field_size, fields.size()) + << "Inconsistent number of fields per line."; + } + map_item = map->add_item(); + map_item->set_name(fields[0]); + switch (field_size) { + case 1: + map_item->set_label(label++); + map_item->set_display_name(fields[0]); + break; + case 2: + label = std::atoi(fields[1].c_str()); + map_item->set_label(label); + map_item->set_display_name(fields[0]); + break; + case 3: + label = std::atoi(fields[1].c_str()); + map_item->set_label(label); + map_item->set_display_name(fields[2]); + break; + default: + LOG(FATAL) << "The number of fields should be [1, 3]."; + break; + } + } + return true; +} + +bool MapNameToLabel(const LabelMap& map, const bool strict_check, + std::map* name_to_label) { + // cleanup + name_to_label->clear(); + + for (int i = 0; i < map.item_size(); ++i) { + const string& name = map.item(i).name(); + const int label = map.item(i).label(); + if (strict_check) { + if (!name_to_label->insert(std::make_pair(name, label)).second) { + LOG(FATAL) << "There are many duplicates of name: " << name; + return false; + } + } else { + (*name_to_label)[name] = label; + } + } + return true; +} + +bool MapLabelToName(const LabelMap& map, const bool strict_check, + std::map* label_to_name) { + // cleanup + label_to_name->clear(); + + for (int i = 0; i < map.item_size(); ++i) { + const string& name = map.item(i).name(); + const int label = map.item(i).label(); + if (strict_check) { + if (!label_to_name->insert(std::make_pair(label, name)).second) { + LOG(FATAL) << "There are many duplicates of label: " << label; + return false; + } + } else { + (*label_to_name)[label] = name; + } + } + return true; +} + +bool MapLabelToDisplayName(const LabelMap& map, const bool strict_check, + std::map* label_to_display_name) { + // cleanup + label_to_display_name->clear(); + + for (int i = 0; i < map.item_size(); ++i) { + const string& display_name = map.item(i).display_name(); + const int label = map.item(i).label(); + if (strict_check) { + if (!label_to_display_name->insert( + std::make_pair(label, display_name)).second) { + LOG(FATAL) << "There are many duplicates of label: " << label; + return false; + } + } else { + (*label_to_display_name)[label] = display_name; + } + } + return true; +} cv::Mat DecodeDatumToCVMatNative(const Datum& datum) { cv::Mat cv_img; DecodeDatumToCVMat(datum, 0, cv_img, false); @@ -301,6 +840,18 @@ bool DecodeDatum(Datum* datum, bool is_color) { } } +void EncodeCVMatToDatum(const cv::Mat& cv_img, const string& encoding, + Datum* datum) { + std::vector buf; + cv::imencode("."+encoding, cv_img, buf); + datum->set_data(std::string(reinterpret_cast(&buf[0]), + buf.size())); + datum->set_channels(cv_img.channels()); + datum->set_height(cv_img.rows); + datum->set_width(cv_img.cols); + datum->set_encoded(true); +} + vector DatumToCVMat(const Datum& datum, cv::Mat& img, bool shape_only) { if (datum.encoded()) { LOG(FATAL) << "Datum encoded"; diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index f46450e59b4..ea1e97fd348 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -346,28 +346,26 @@ void gpu_dot_kernel(const int N, const Dtype* x, const Dtype* y, Mtype* out) { template<> void caffe_gpu_dot(const int n, const float16* x, const float16* y, float16* out) { - float fres; - GPUMemory::Workspace ws(sizeof(float), Caffe::current_device()); - float* res = reinterpret_cast(ws.data()); + GPUMemory::PinnedBuffer ws(sizeof(float)); + float* res = reinterpret_cast(ws.get()); cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) gpu_dot_kernel<<<1, CAFFE_CUDA_NUM_THREADS, 0, stream>>>(n, x, y, res); CUDA_POST_KERNEL_CHECK; - CUDA_CHECK(cudaMemcpyAsync(&fres, res, ws.size(), cudaMemcpyDeviceToHost, stream)); CUDA_CHECK(cudaStreamSynchronize(stream)); - *out = static_cast(fres); + *out = static_cast(*res); } template<> void caffe_gpu_dot(const int n, const float16* x, const float16* y, float* out) { - GPUMemory::Workspace ws(sizeof(float), Caffe::current_device()); - float* res = reinterpret_cast(ws.data()); + GPUMemory::PinnedBuffer ws(sizeof(float)); + float* res = reinterpret_cast(ws.get()); cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) gpu_dot_kernel<<<1, CAFFE_CUDA_NUM_THREADS, 0, stream>>>(n, x, y, res); CUDA_POST_KERNEL_CHECK; - CUDA_CHECK(cudaMemcpyAsync(out, res, ws.size(), cudaMemcpyDeviceToHost, stream)); CUDA_CHECK(cudaStreamSynchronize(stream)); + *out = *res; } template<> diff --git a/src/caffe/util/math_functions2.cu b/src/caffe/util/math_functions2.cu index 2140302efaf..d4a84f45c59 100644 --- a/src/caffe/util/math_functions2.cu +++ b/src/caffe/util/math_functions2.cu @@ -357,11 +357,13 @@ void caffe_gpu_convert(const unsigned int n, void caffe_gpu_rng_uniform(const int n, unsigned int* r) { CURAND_CHECK(curandGenerate(Caffe::curand_generator(), r, n)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); } template<> void caffe_gpu_rng_uniform(const int n, const float a, const float b, float* r) { CURAND_CHECK(curandGenerateUniform(Caffe::curand_generator(), r, n)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); const float range = b - a; if (range != static_cast(1)) { caffe_gpu_scal(n, range, r); @@ -375,6 +377,7 @@ template<> void caffe_gpu_rng_uniform(const int n, const double a, const double b, double* r) { CURAND_CHECK(curandGenerateUniformDouble(Caffe::curand_generator(), r, n)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); const double range = b - a; if (range != static_cast(1)) { caffe_gpu_scal(n, range, r); @@ -390,6 +393,7 @@ void caffe_gpu_rng_uniform(const int n, const float16 a, GPUMemory::Workspace rf(n * sizeof(float), Caffe::current_device()); float* rfp = static_cast(rf.data()); CURAND_CHECK(curandGenerateUniform(Caffe::curand_generator(), rfp, n)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); const float range = b - a; if (range != 1.F) { caffe_gpu_scal(n, range, rfp); @@ -403,11 +407,13 @@ void caffe_gpu_rng_uniform(const int n, const float16 a, template<> void caffe_gpu_rng_gaussian(const int n, const float mu, const float sigma, float* r) { CURAND_CHECK(curandGenerateNormal(Caffe::curand_generator(), r, n, mu, sigma)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); } template<> void caffe_gpu_rng_gaussian(const int n, const double mu, const double sigma, double* r) { CURAND_CHECK(curandGenerateNormalDouble(Caffe::curand_generator(), r, n, mu, sigma)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); } template<> @@ -415,6 +421,7 @@ void caffe_gpu_rng_gaussian(const int n, const float16 mu, const float16 sigma, GPUMemory::Workspace rf(n * sizeof(float), Caffe::current_device()); float* rfp = static_cast(rf.data()); CURAND_CHECK(curandGenerateNormal(Caffe::curand_generator(), rfp, n, mu, sigma)); + CUDA_CHECK(cudaStreamSynchronize(Caffe::curand_stream())); caffe_gpu_convert(n, rfp, r); } diff --git a/src/caffe/util/sampler.cpp b/src/caffe/util/sampler.cpp new file mode 100644 index 00000000000..f04117d37ac --- /dev/null +++ b/src/caffe/util/sampler.cpp @@ -0,0 +1,167 @@ +#include +#include + +#include "caffe/util/bbox_util.hpp" +#include "caffe/util/sampler.hpp" + +namespace caffe { + +void GroupObjectBBoxes(const AnnotatedDatum& anno_datum, + vector* object_bboxes) { + object_bboxes->clear(); + for (int i = 0; i < anno_datum.annotation_group_size(); ++i) { + const AnnotationGroup& anno_group = anno_datum.annotation_group(i); + for (int j = 0; j < anno_group.annotation_size(); ++j) { + const Annotation& anno = anno_group.annotation(j); + object_bboxes->push_back(anno.bbox()); + } + } +} + +bool SatisfySampleConstraint(const NormalizedBBox& sampled_bbox, + const vector& object_bboxes, + const SampleConstraint& sample_constraint) { + bool has_jaccard_overlap = sample_constraint.has_min_jaccard_overlap() || + sample_constraint.has_max_jaccard_overlap(); + bool has_sample_coverage = sample_constraint.has_min_sample_coverage() || + sample_constraint.has_max_sample_coverage(); + bool has_object_coverage = sample_constraint.has_min_object_coverage() || + sample_constraint.has_max_object_coverage(); + bool satisfy = !has_jaccard_overlap && !has_sample_coverage && + !has_object_coverage; + if (satisfy) { + // By default, the sampled_bbox is "positive" if no constraints are defined. + return true; + } + // Check constraints. + bool found = false; + for (int i = 0; i < object_bboxes.size(); ++i) { + const NormalizedBBox& object_bbox = object_bboxes[i]; + // Test jaccard overlap. + if (has_jaccard_overlap) { + const float jaccard_overlap = JaccardOverlap(sampled_bbox, object_bbox); + if (sample_constraint.has_min_jaccard_overlap() && + jaccard_overlap < sample_constraint.min_jaccard_overlap()) { + continue; + } + if (sample_constraint.has_max_jaccard_overlap() && + jaccard_overlap > sample_constraint.max_jaccard_overlap()) { + continue; + } + found = true; + } + // Test sample coverage. + if (has_sample_coverage) { + const float sample_coverage = BBoxCoverage(sampled_bbox, object_bbox); + if (sample_constraint.has_min_sample_coverage() && + sample_coverage < sample_constraint.min_sample_coverage()) { + continue; + } + if (sample_constraint.has_max_sample_coverage() && + sample_coverage > sample_constraint.max_sample_coverage()) { + continue; + } + found = true; + } + // Test object coverage. + if (has_object_coverage) { + const float object_coverage = BBoxCoverage(object_bbox, sampled_bbox); + if (sample_constraint.has_min_object_coverage() && + object_coverage < sample_constraint.min_object_coverage()) { + continue; + } + if (sample_constraint.has_max_object_coverage() && + object_coverage > sample_constraint.max_object_coverage()) { + continue; + } + found = true; + } + if (found) { + return true; + } + } + return found; +} + +void SampleBBox(const Sampler& sampler, NormalizedBBox* sampled_bbox) { + // Get random scale. + CHECK_GE(sampler.max_scale(), sampler.min_scale()); + CHECK_GT(sampler.min_scale(), 0.f); + CHECK_LE(sampler.max_scale(), 1.f); + float scale; + caffe_rng_uniform(1, sampler.min_scale(), sampler.max_scale(), &scale); + + // Get random aspect ratio. + CHECK_GE(sampler.max_aspect_ratio(), sampler.min_aspect_ratio()); + CHECK_GT(sampler.min_aspect_ratio(), 0.f); + CHECK_LT(sampler.max_aspect_ratio(), FLT_MAX); + float aspect_ratio; + caffe_rng_uniform(1, sampler.min_aspect_ratio(), sampler.max_aspect_ratio(), + &aspect_ratio); + + aspect_ratio = std::max(aspect_ratio, std::pow(scale, 2.f)); + aspect_ratio = std::min(aspect_ratio, 1.f / std::pow(scale, 2.f)); + + // Figure out bbox dimension. + float bbox_width = scale * sqrt(aspect_ratio); + float bbox_height = scale / sqrt(aspect_ratio); + + // Figure out top left coordinates. + float w_off = 0.f, h_off = 0.f; + if (bbox_width < 1.f) { + caffe_rng_uniform(1, 0.f, 1.f - bbox_width, &w_off); + } + if (bbox_height < 1.f) { + caffe_rng_uniform(1, 0.f, 1.f - bbox_height, &h_off); + } + + sampled_bbox->set_xmin(w_off); + sampled_bbox->set_ymin(h_off); + sampled_bbox->set_xmax(w_off + bbox_width); + sampled_bbox->set_ymax(h_off + bbox_height); +} + +void GenerateSamples(const NormalizedBBox& source_bbox, + const vector& object_bboxes, + const BatchSampler& batch_sampler, + vector* sampled_bboxes) { + int found = 0; + for (int i = 0; i < batch_sampler.max_trials(); ++i) { + if (batch_sampler.has_max_sample() && + found >= batch_sampler.max_sample()) { + break; + } + // Generate sampled_bbox in the normalized space [0, 1]. + NormalizedBBox sampled_bbox; + SampleBBox(batch_sampler.sampler(), &sampled_bbox); + // Transform the sampled_bbox w.r.t. source_bbox. + LocateBBox(source_bbox, sampled_bbox, &sampled_bbox); + // Determine if the sampled bbox is positive or negative by the constraint. + if (SatisfySampleConstraint(sampled_bbox, object_bboxes, + batch_sampler.sample_constraint())) { + ++found; + sampled_bboxes->push_back(sampled_bbox); + } + } +} + +void GenerateBatchSamples(const AnnotatedDatum& anno_datum, + const vector& batch_samplers, + vector* sampled_bboxes) { + sampled_bboxes->clear(); + vector object_bboxes; + GroupObjectBBoxes(anno_datum, &object_bboxes); + for (int i = 0; i < batch_samplers.size(); ++i) { + if (batch_samplers[i].use_original_image()) { + NormalizedBBox unit_bbox; + unit_bbox.set_xmin(0); + unit_bbox.set_ymin(0); + unit_bbox.set_xmax(1); + unit_bbox.set_ymax(1); + GenerateSamples(unit_bbox, object_bboxes, batch_samplers[i], + sampled_bboxes); + } + } +} + +} // namespace caffe diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 6c0b5d49a63..93ffe768cc4 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -6,10 +6,12 @@ namespace bp = boost::python; #include #include #include +#include #include #include "caffe/caffe.hpp" #include "caffe/util/signal_handler.h" +#include "caffe/util/bbox_util.hpp" using caffe::TBlob; @@ -45,6 +47,10 @@ DEFINE_string(sigint_effect, "stop", DEFINE_string(sighup_effect, "snapshot", "Optional; action to take when a SIGHUP signal is received: " "snapshot, stop or none."); +DEFINE_string(ap_version, "11point", + "Average Precision type for object detection"); +DEFINE_bool(show_per_class_result, true, + "Show per class result for object detection"); // A simple registry for caffe commands. typedef int (*BrewFunction)(); @@ -313,6 +319,180 @@ int test() { } RegisterBrewFunction(test); + +// Test: score a detection model. +int test_detection() { + typedef float Dtype; + CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to score."; + CHECK_GT(FLAGS_weights.size(), 0) << "Need model weights to score."; + + // Read flags for list of GPUs + vector gpus; + get_gpus(&gpus); + while (gpus.size() > 1) { + // Only use one GPU + LOG(INFO) << "Not using GPU #" << gpus.back() << " for single-GPU function"; + gpus.pop_back(); + } + if (gpus.size() > 0) { + Caffe::SetDevice(gpus[0]); + } + caffe::GPUMemory::Scope gpu_memory_scope(gpus); + + // Set mode and device id + if (gpus.size() != 0) { + LOG(INFO) << "Use GPU with device ID " << gpus[0]; + cudaDeviceProp device_prop; + cudaGetDeviceProperties(&device_prop, gpus[0]); + LOG(INFO) << "GPU device name: " << device_prop.name; + Caffe::set_mode(Caffe::GPU); + } else { + LOG(INFO) << "Use CPU."; + Caffe::set_mode(Caffe::CPU); + } + + // Instantiate the caffe net. + Net caffe_net(FLAGS_model, caffe::TEST, 0U); + caffe_net.CopyTrainedLayersFrom(FLAGS_weights); + LOG(INFO) << "Running for " << FLAGS_iterations << " iterations."; + + std::map > > > all_true_pos; + std::map > > > all_false_pos; + std::map > all_num_pos; + + vector test_score_output_id; + vector test_score; + float loss = 0; + for (int i = 0; i < FLAGS_iterations; ++i) { + float iter_loss; + const vector& result = + caffe_net.Forward(&iter_loss); + loss += iter_loss; + int idx = 0; + for (int j = 0; j < result.size(); ++j) { + const float* result_vec = result[j]->cpu_data(); + for (int k = 0; k < result[j]->count(); ++k, ++idx) { + const float score = result_vec[k]; + if (i == 0) { + test_score.push_back(score); + test_score_output_id.push_back(j); + } else { + test_score[idx] += score; + } + const std::string& output_name = caffe_net.blob_names()[ + caffe_net.output_blob_indices()[j]]; + LOG(INFO) << "Batch " << i << ", " << output_name << " = " << score; + } + } + + //To compute mAP + for (int j = 0; j < result.size(); ++j) { + CHECK_EQ(result[j]->width(), 5); + const Dtype* result_vec = result[j]->cpu_data(); + int num_det = result[j]->height(); + for (int k = 0; k < num_det; ++k) { + int item_id = static_cast(result_vec[k * 5]); + int label = static_cast(result_vec[k * 5 + 1]); + if (item_id == -1) { + // Special row of storing number of positives for a label. + if (all_num_pos[j].find(label) == all_num_pos[j].end()) { + all_num_pos[j][label] = static_cast(result_vec[k * 5 + 2]); + } else { + all_num_pos[j][label] += static_cast(result_vec[k * 5 + 2]); + } + } else { + // Normal row storing detection status. + float score = result_vec[k * 5 + 2]; + int tp = static_cast(result_vec[k * 5 + 3]); + int fp = static_cast(result_vec[k * 5 + 4]); + if (tp == 0 && fp == 0) { + // Ignore such case. It happens when a detection bbox is matched to + // a difficult gt bbox and we don't evaluate on difficult gt bbox. + continue; + } + all_true_pos[j][label].push_back(std::make_pair(score, tp)); + all_false_pos[j][label].push_back(std::make_pair(score, fp)); + } + } + } + } + loss /= FLAGS_iterations; + LOG(INFO) << "Loss: " << loss; + + for (int i = 0; i < test_score.size(); ++i) { + int test_score_output_id_value = test_score_output_id[i]; + const vector& output_blob_indices = caffe_net.output_blob_indices(); + const vector& blob_names = caffe_net.blob_names(); + const vector& blob_loss_weights = caffe_net.blob_loss_weights(); + if (test_score_output_id_value < output_blob_indices.size()) { + int blob_index = output_blob_indices[test_score_output_id_value]; + if (blob_index < blob_names.size() && blob_index < blob_loss_weights.size()) { + const std::string& output_name = blob_names[blob_index]; + const float loss_weight = blob_loss_weights[blob_index]; + std::ostringstream loss_msg_stream; + const float mean_score = test_score[i] / FLAGS_iterations; + if (loss_weight) { + loss_msg_stream << " (* " << loss_weight + << " = " << (loss_weight * mean_score) << " loss)"; + } + LOG(INFO) << output_name << " = " << mean_score << loss_msg_stream.str(); + } + } + } + + //To compute mAP + for (int i = 0; i < all_true_pos.size(); ++i) { + if (all_true_pos.find(i) == all_true_pos.end()) { + LOG(FATAL) << "Missing output_blob true_pos: " << i; + } + const std::map > >& true_pos = + all_true_pos.find(i)->second; + if (all_false_pos.find(i) == all_false_pos.end()) { + LOG(FATAL) << "Missing output_blob false_pos: " << i; + } + const std::map > >& false_pos = + all_false_pos.find(i)->second; + if (all_num_pos.find(i) == all_num_pos.end()) { + LOG(FATAL) << "Missing output_blob num_pos: " << i; + } + const std::map& num_pos = all_num_pos.find(i)->second; + std::map APs; + float mAP = 0.; + // Sort true_pos and false_pos with descend scores. + for (std::map::const_iterator it = num_pos.begin(); + it != num_pos.end(); ++it) { + int label = it->first; + int label_num_pos = it->second; + if (true_pos.find(label) == true_pos.end()) { + LOG(WARNING) << "Missing true_pos for label: " << label; + continue; + } + const vector >& label_true_pos = + true_pos.find(label)->second; + if (false_pos.find(label) == false_pos.end()) { + LOG(WARNING) << "Missing false_pos for label: " << label; + continue; + } + const vector >& label_false_pos = + false_pos.find(label)->second; + vector prec, rec; + caffe::ComputeAP(label_true_pos, label_num_pos, label_false_pos, + FLAGS_ap_version, &prec, &rec, &(APs[label])); + mAP += APs[label]; + if (FLAGS_show_per_class_result) { + LOG(INFO) << "class AP " << label << ": " << APs[label]; + } + } + mAP /= num_pos.size(); + const int output_blob_index = caffe_net.output_blob_indices()[i]; + const string& output_name = caffe_net.blob_names()[output_blob_index]; + LOG(INFO) << "Test net output mAP #" << i << ": " << output_name << " = " << mAP; + } + return 0; +} +RegisterBrewFunction(test_detection); + + // Time: benchmark the execution time of a model. int time() { CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to time."; @@ -442,6 +622,12 @@ int main(int argc, char** argv) { " test score a model\n" " device_query show GPU diagnostic information\n" " time benchmark model execution time"); + + std::ostringstream os; + os << std::endl; + for (int n = 0; n < argc; ++n) { + os << "[" << n << "]: " << argv[n] << std::endl; + } // Run tool or show usage. caffe::GlobalInit(&argc, &argv); @@ -449,6 +635,7 @@ int main(int argc, char** argv) { get_gpus(&gpus); if (gpus.size() > 0) { Caffe::SetDevice(gpus[0]); + Caffe::set_gpus(gpus); } LOG(INFO) << "This is NVCaffe " << Caffe::caffe_version() @@ -457,6 +644,7 @@ int main(int argc, char** argv) { LOG(INFO) << "CuBLAS version: " << Caffe::cublas_version(); LOG(INFO) << "CUDA version: " << Caffe::cuda_version(); LOG(INFO) << "CUDA driver version: " << Caffe::cuda_driver_version(); + LOG(INFO) << "Arguments: " << os.str(); if (argc == 2) { #ifdef WITH_PYTHON_LAYER diff --git a/tools/convert_annoset.cpp b/tools/convert_annoset.cpp new file mode 100644 index 00000000000..1429dd57b98 --- /dev/null +++ b/tools/convert_annoset.cpp @@ -0,0 +1,203 @@ +// This program converts a set of images and annotations to a lmdb/leveldb by +// storing them as AnnotatedDatum proto buffers. +// Usage: +// convert_annoset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME +// +// where ROOTFOLDER is the root folder that holds all the images and +// annotations, and LISTFILE should be a list of files as well as their labels +// or label files. +// For classification task, the file should be in the format as +// imgfolder1/img1.JPEG 7 +// .... +// For detection task, the file should be in the format as +// imgfolder1/img1.JPEG annofolder1/anno1.xml +// .... + +#include +#include // NOLINT(readability/streams) +#include +#include +#include +#include + +#include "boost/scoped_ptr.hpp" +#include "boost/variant.hpp" +#include "gflags/gflags.h" +#include "glog/logging.h" + +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" +#include "caffe/util/format.hpp" +#include "caffe/util/io.hpp" +#include "caffe/util/rng.hpp" + +using namespace caffe; // NOLINT(build/namespaces) +using std::pair; +using boost::scoped_ptr; + +DEFINE_bool(gray, false, + "When this option is on, treat images as grayscale ones"); +DEFINE_bool(shuffle, false, + "Randomly shuffle the order of images and their labels"); +DEFINE_string(backend, "lmdb", + "The backend {lmdb, leveldb} for storing the result"); +DEFINE_string(anno_type, "classification", + "The type of annotation {classification, detection}."); +DEFINE_string(label_type, "xml", + "The type of annotation file format."); +DEFINE_string(label_map_file, "", + "A file with LabelMap protobuf message."); +DEFINE_bool(check_label, false, + "When this option is on, check that there is no duplicated name/label."); +DEFINE_int32(min_dim, 0, + "Minimum dimension images are resized to (keep same aspect ratio)"); +DEFINE_int32(max_dim, 0, + "Maximum dimension images are resized to (keep same aspect ratio)"); +DEFINE_int32(resize_width, 0, "Width images are resized to"); +DEFINE_int32(resize_height, 0, "Height images are resized to"); +DEFINE_bool(check_size, false, + "When this option is on, check that all the datum have the same size"); +DEFINE_bool(encoded, false, + "When this option is on, the encoded image will be save in datum"); +DEFINE_string(encode_type, "", + "Optional: What type should we encode the image as ('png','jpg',...)."); + +int main(int argc, char** argv) { + ::google::InitGoogleLogging(argv[0]); + // Print output to stderr (while still logging) + FLAGS_alsologtostderr = 1; + +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + + gflags::SetUsageMessage("Convert a set of images and annotations to the " + "leveldb/lmdb format used as input for Caffe.\n" + "Usage:\n" + " convert_annoset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME\n"); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (argc < 4) { + gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/convert_annoset"); + return 1; + } + + const bool is_color = !FLAGS_gray; + const bool check_size = FLAGS_check_size; + const bool encoded = FLAGS_encoded; + const string encode_type = FLAGS_encode_type; + const string anno_type = FLAGS_anno_type; + AnnotatedDatum_AnnotationType type; + const string label_type = FLAGS_label_type; + const string label_map_file = FLAGS_label_map_file; + const bool check_label = FLAGS_check_label; + std::map name_to_label; + + std::ifstream infile(argv[2]); + std::vector > > lines; + std::string filename; + int label; + std::string labelname; + if (anno_type == "classification") { + while (infile >> filename >> label) { + lines.push_back(std::make_pair(filename, label)); + } + } else if (anno_type == "detection") { + type = AnnotatedDatum_AnnotationType_BBOX; + LabelMap label_map; + CHECK(ReadProtoFromTextFile(label_map_file, &label_map)) + << "Failed to read label map file."; + CHECK(MapNameToLabel(label_map, check_label, &name_to_label)) + << "Failed to convert name to label."; + while (infile >> filename >> labelname) { + lines.push_back(std::make_pair(filename, labelname)); + } + } + if (FLAGS_shuffle) { + // randomly shuffle data + LOG(INFO) << "Shuffling data"; + shuffle(lines.begin(), lines.end()); + } + LOG(INFO) << "A total of " << lines.size() << " images."; + + if (encode_type.size() && !encoded) + LOG(INFO) << "encode_type specified, assuming encoded=true."; + + int min_dim = std::max(0, FLAGS_min_dim); + int max_dim = std::max(0, FLAGS_max_dim); + int resize_height = std::max(0, FLAGS_resize_height); + int resize_width = std::max(0, FLAGS_resize_width); + + // Create new DB + scoped_ptr db(db::GetDB(FLAGS_backend)); + db->Open(argv[3], db::NEW); + scoped_ptr txn(db->NewTransaction()); + + // Storing to db + std::string root_folder(argv[1]); + AnnotatedDatum anno_datum; + Datum* datum = anno_datum.mutable_datum(); + int count = 0; + int data_size = 0; + bool data_size_initialized = false; + + for (int line_id = 0; line_id < lines.size(); ++line_id) { + bool status = true; + std::string enc = encode_type; + if (encoded && !enc.size()) { + // Guess the encoding type from the file name + string fn = lines[line_id].first; + size_t p = fn.rfind('.'); + if ( p == fn.npos ) + LOG(WARNING) << "Failed to guess the encoding of '" << fn << "'"; + enc = fn.substr(p); + std::transform(enc.begin(), enc.end(), enc.begin(), ::tolower); + } + filename = root_folder + lines[line_id].first; + if (anno_type == "classification") { + label = boost::get(lines[line_id].second); + status = ReadImageToDatum(filename, label, resize_height, resize_width, + min_dim, max_dim, is_color, enc, datum); + } else if (anno_type == "detection") { + labelname = root_folder + boost::get(lines[line_id].second); + status = ReadRichImageToAnnotatedDatum(filename, labelname, resize_height, + resize_width, min_dim, max_dim, is_color, enc, type, label_type, + name_to_label, &anno_datum); + anno_datum.set_type(AnnotatedDatum_AnnotationType_BBOX); + } + if (status == false) { + LOG(WARNING) << "Failed to read " << lines[line_id].first; + continue; + } + if (check_size) { + if (!data_size_initialized) { + data_size = datum->channels() * datum->height() * datum->width(); + data_size_initialized = true; + } else { + const std::string& data = datum->data(); + CHECK_EQ(data.size(), data_size) << "Incorrect data field size " + << data.size(); + } + } + // sequential + string key_str = caffe::format_int(line_id, 8) + "_" + lines[line_id].first; + + // Put in db + string out; + CHECK(anno_datum.SerializeToString(&out)); + txn->Put(key_str, out); + + if (++count % 1000 == 0) { + // Commit db + txn->Commit(); + txn.reset(db->NewTransaction()); + LOG(INFO) << "Processed " << count << " files."; + } + } + // write the last batch + if (count % 1000 != 0) { + txn->Commit(); + LOG(INFO) << "Processed " << count << " files."; + } + return 0; +} diff --git a/tools/create_label_map.cpp b/tools/create_label_map.cpp new file mode 100644 index 00000000000..4e16e6f6aa8 --- /dev/null +++ b/tools/create_label_map.cpp @@ -0,0 +1,65 @@ +// This program reads in pairs label names and optionally ids and display names +// and store them in LabelMap proto buffer. +// Usage: +// create_label_map [FLAGS] MAPFILE OUTFILE +// where MAPFILE is a list of label names and optionally label ids and +// displaynames, and OUTFILE stores the information in LabelMap proto. +// Example: +// ./build/tools/create_label_map --delimiter=" " --include_background=true +// data/VOC2007/map.txt data/VOC2007/labelmap_voc.prototxt +// The format of MAPFILE is like following: +// class1 [1] [someclass1] +// ... +// The format of OUTFILE is like following: +// item { +// name: "class1" +// label: 1 +// display_name: "someclass1" +// } +// ... + +#include // NOLINT(readability/streams) +#include + +#include "gflags/gflags.h" +#include "glog/logging.h" + +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/io.hpp" + +using namespace caffe; // NOLINT(build/namespaces) + +DEFINE_bool(include_background, false, + "When this option is on, include none_of_the_above as class 0."); +DEFINE_string(delimiter, " ", + "The delimiter used to separate fields in label_map_file."); + +int main(int argc, char** argv) { + ::google::InitGoogleLogging(argv[0]); + // Print output to stderr (while still logging) + FLAGS_alsologtostderr = 1; + +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + + gflags::SetUsageMessage("Read in pairs label names and optionally ids and " + "display names and store them in LabelMap proto buffer.\n" + "Usage:\n" + " create_label_map [FLAGS] MAPFILE OUTFILE\n"); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (argc < 3) { + gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/create_label_map"); + return 1; + } + + const bool include_background = FLAGS_include_background; + const string delimiter = FLAGS_delimiter; + + const string& map_file = argv[1]; + LabelMap label_map; + ReadLabelFileToLabelMap(map_file, include_background, delimiter, &label_map); + + WriteProtoToTextFile(label_map, argv[2]); +} diff --git a/tools/get_image_size.cpp b/tools/get_image_size.cpp new file mode 100644 index 00000000000..555d3e38a88 --- /dev/null +++ b/tools/get_image_size.cpp @@ -0,0 +1,109 @@ +// This program retrieves the sizes of a set of images. +// Usage: +// get_image_size [FLAGS] ROOTFOLDER/ LISTFILE OUTFILE +// +// where ROOTFOLDER is the root folder that holds all the images and +// annotations, and LISTFILE should be a list of files as well as their labels +// or label files. +// For classification task, the file should be in the format as +// imgfolder1/img1.JPEG 7 +// .... +// For detection task, the file should be in the format as +// imgfolder1/img1.JPEG annofolder1/anno1.xml +// .... + +#include // NOLINT(readability/streams) +#include +#include +#include +#include + +#include "gflags/gflags.h" +#include "glog/logging.h" + +#include "caffe/util/io.hpp" + +using namespace caffe; // NOLINT(build/namespaces) + +DEFINE_string(name_id_file, "", + "A file which maps image_name to image_id."); + +int main(int argc, char** argv) { + ::google::InitGoogleLogging(argv[0]); + // Print output to stderr (while still logging) + FLAGS_alsologtostderr = 1; + +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + + gflags::SetUsageMessage("Get sizes of a set of images.\n" + "Usage:\n" + " get_image_size ROOTFOLDER/ LISTFILE OUTFILE\n"); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (argc < 4) { + gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/get_image_size"); + return 1; + } + + std::ifstream infile(argv[2]); + if (!infile.good()) { + LOG(FATAL) << "Failed to open file: " << argv[2]; + } + std::vector > lines; + std::string filename, label; + while (infile >> filename >> label) { + lines.push_back(std::make_pair(filename, label)); + } + infile.close(); + LOG(INFO) << "A total of " << lines.size() << " images."; + + const string name_id_file = FLAGS_name_id_file; + std::map map_name_id; + if (!name_id_file.empty()) { + std::ifstream nameidfile(name_id_file.c_str()); + if (!nameidfile.good()) { + LOG(FATAL) << "Failed to open name_id_file: " << name_id_file; + } + std::string name; + int id; + while (nameidfile >> name >> id) { + CHECK(map_name_id.find(name) == map_name_id.end()); + map_name_id[name] = id; + } + CHECK_EQ(map_name_id.size(), lines.size()); + } + + // Storing to outfile + boost::filesystem::path root_folder(argv[1]); + std::ofstream outfile(argv[3]); + if (!outfile.good()) { + LOG(FATAL) << "Failed to open file: " << argv[3]; + } + int height, width; + int count = 0; + for (int line_id = 0; line_id < lines.size(); ++line_id) { + boost::filesystem::path img_file = root_folder / lines[line_id].first; + GetImageSize(img_file.string(), &height, &width); + std::string img_name = img_file.stem().string(); + if (map_name_id.size() == 0) { + outfile << img_name << " " << height << " " << width << std::endl; + } else { + CHECK(map_name_id.find(img_name) != map_name_id.end()); + int img_id = map_name_id.find(img_name)->second; + outfile << img_id << " " << height << " " << width << std::endl; + } + + if (++count % 1000 == 0) { + LOG(INFO) << "Processed " << count << " files."; + } + } + // write the last batch + if (count % 1000 != 0) { + LOG(INFO) << "Processed " << count << " files."; + } + outfile.flush(); + outfile.close(); + return 0; +} From c40ff80cf0bd0ada843e9be175209fc973537ed4 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sat, 24 Feb 2018 23:40:28 -0800 Subject: [PATCH 05/42] NVML fix --- include/caffe/util/device_alternate.hpp | 3 +-- src/caffe/common.cpp | 30 ++++++++++++------------- src/caffe/internal_thread.cpp | 2 +- src/caffe/layers/base_data_layer.cpp | 2 +- src/caffe/layers/cudnn_conv_layer.cpp | 3 --- src/caffe/layers/cudnn_conv_layer.cu | 6 ----- src/caffe/solver.cpp | 2 +- 7 files changed, 19 insertions(+), 29 deletions(-) diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 467721baaba..654d8c31d68 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -98,11 +98,10 @@ namespace nvml { struct NVMLInit { NVMLInit(); ~NVMLInit(); - nvmlDevice_t device_; static std::mutex m_; }; -void setCpuAffinity(); +void setCpuAffinity(int device); } #endif // NO_NVML diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 01b83653c35..537e7b224b6 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -525,22 +525,9 @@ std::mutex NVMLInit::m_; NVMLInit::NVMLInit() { if (nvmlInit() != NVML_SUCCESS) { LOG(ERROR) << "NVML failed to initialize"; - return; } else { LOG(INFO) << "NVML initialized, thread " << lwp_id(); } - unsigned int deviceCount = 0U; - if (nvmlDeviceGetCount(&deviceCount) == NVML_SUCCESS) { - for (unsigned int id = 0; id < deviceCount; ++id) { - if (nvmlDeviceGetHandleByIndex(id, &device_) != NVML_SUCCESS || - nvmlDeviceSetCpuAffinity(device_) != NVML_SUCCESS) { - LOG(ERROR) << "NVML failed to set CPU affinity on device " << id - << ", thread " << lwp_id(); - } - } - } else { - LOG(ERROR) << "nvmlDeviceGetCount failed, thread " << lwp_id(); - } } NVMLInit::~NVMLInit() { @@ -548,9 +535,22 @@ NVMLInit::~NVMLInit() { } // set the CPU affinity for this thread -void setCpuAffinity() { +void setCpuAffinity(int device) { std::lock_guard lock(NVMLInit::m_); - static thread_local NVMLInit nvml_init_; + static NVMLInit nvml_init_; + + char pciBusId[16]; + CUDA_CHECK(cudaDeviceGetPCIBusId(pciBusId, 16, device)); + nvmlDevice_t nvml_device; + + if (nvmlDeviceGetHandleByPciBusId(pciBusId, &nvml_device) != NVML_SUCCESS || + nvmlDeviceSetCpuAffinity(nvml_device) != NVML_SUCCESS) { + LOG(ERROR) << "NVML failed to set CPU affinity on device " << device + << ", thread " << lwp_id(); + } else { + LOG(INFO) << "NVML succeeded to set CPU affinity on device " << device + << ", thread " << lwp_id(); + } } } // namespace nvml diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index 64f133e2cb7..8fd09a49946 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -79,7 +79,7 @@ void InternalThread::entry(int thread_id, int device, Caffe::Brew mode, uint64_t << " on device " << device << ", rank " << rank_; if (mode == Caffe::GPU && set_cpu_affinity) { #ifndef NO_NVML - nvml::setCpuAffinity(); + nvml::setCpuAffinity(device); #endif } if (threads_.size() == 1) { diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 8d2ad5ec722..21d88860f80 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -96,7 +96,7 @@ void BasePrefetchingDataLayer::LayerSetUp(const vector& bot const uint64_t random_seed = (psolver == nullptr || static_cast(psolver->param().random_seed()) == Caffe::SEED_NOT_SET) ? Caffe::next_seed() : static_cast(psolver->param().random_seed()); - StartInternalThread(true, random_seed); + StartInternalThread(false, random_seed); } template diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index 8e113aa99e6..ed3ceeabfb4 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -443,9 +443,6 @@ void CuDNNConvolutionLayer::Reshape( // Also used by Test Net but based on shared space taken by Train: FindExConvAlgo(bottom, top); } -// else { -// AllocateWorkspace(bottom.size()); -// } use_algo_seeker_ = false; } break; diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 3da17628437..5a898662692 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -12,9 +12,6 @@ template void CuDNNConvolutionLayer::Forward_gpu(const vector& bottom, const vector& top) { const Ftype* weight = this->blobs_[0]->template gpu_data(); -// if (fwd_count_ < 4) { -// AllocateWorkspace(bottom.size()); -// } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { for (int i = 0; i < bottom.size(); ++i) { @@ -83,9 +80,6 @@ template void CuDNNConvolutionLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { propagate_down_ = propagate_down; -// if (bwd_count_ < 4) { -// AllocateWorkspace(bottom.size()); -// } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { // compute dE/dB = sum_c(dE/dy) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 04326dc4590..fad051fd954 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -418,7 +418,7 @@ void Solver::Reduce(Callback* callback, int device, Caffe::Brew mode, uint64_t r if (mode == Caffe::GPU) { CUDA_CHECK(cudaSetDevice(device)); #ifndef NO_NVML - nvml::setCpuAffinity(); + nvml::setCpuAffinity(device); #endif } Caffe::set_mode(mode); From 53331eec5a72dbde312560338002a10da6506c64 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sun, 25 Feb 2018 03:20:17 -0800 Subject: [PATCH 06/42] BT fix --- src/caffe/batch_transformer.cpp | 2 +- src/caffe/common.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/batch_transformer.cpp b/src/caffe/batch_transformer.cpp index bb3b15a384f..4cb33aca7fd 100644 --- a/src/caffe/batch_transformer.cpp +++ b/src/caffe/batch_transformer.cpp @@ -97,7 +97,7 @@ void BatchTransformer::reshape(const vector& data_shape, if (processed_free_.try_peek(&processed_batch)) { processed_batch->data_->Reshape(data_shape); processed_batch->label_->Reshape(label_shape); - if (Caffe::mode() == Caffe::GPU) { + if (preallocate && Caffe::mode() == Caffe::GPU) { processed_batch->data_->template mutable_gpu_data_c(false); processed_batch->label_->template mutable_gpu_data_c(false); } diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 537e7b224b6..95e53d7737d 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -163,6 +163,7 @@ Caffe::~Caffe() { } size_t Caffe::min_avail_device_memory() { + std::lock_guard lock(caffe_mutex_); size_t ret = 0UL; const std::vector& cur_gpus = gpus(); int cur_device; From c11eef3329b943979739926d4a7f5f0f45919005 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sun, 25 Feb 2018 12:42:31 -0800 Subject: [PATCH 07/42] Default GPU fix --- include/caffe/common.hpp | 3 +++ tools/caffe.cpp | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index ea576f7193d..93702b8fa74 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -437,6 +437,9 @@ class Caffe { static void set_gpus(const std::vector& gpus) { std::lock_guard lock(caffe_mutex_); gpus_ = gpus; + if (gpus_.empty()) { + gpus_.push_back(root_device_); + } } static const std::vector& gpus() { return gpus_; diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 93ffe768cc4..f1cbe3c7205 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -633,10 +633,8 @@ int main(int argc, char** argv) { vector gpus; get_gpus(&gpus); - if (gpus.size() > 0) { - Caffe::SetDevice(gpus[0]); - Caffe::set_gpus(gpus); - } + Caffe::SetDevice(gpus.size() > 0 ? gpus[0] : 0); + Caffe::set_gpus(gpus); LOG(INFO) << "This is NVCaffe " << Caffe::caffe_version() << " started at " << Caffe::start_time(); From f4941902e725674e56cc13393e8d088f48736acb Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 26 Feb 2018 12:22:00 -0800 Subject: [PATCH 08/42] Deadlock fixed --- include/caffe/layer.hpp | 8 -------- include/caffe/net.hpp | 3 --- include/caffe/solver.hpp | 2 +- src/caffe/layers/base_data_layer.cpp | 3 --- src/caffe/layers/recurrent_layer.cpp | 3 +-- src/caffe/net.cpp | 5 ----- src/caffe/solver.cpp | 10 ++++------ 7 files changed, 6 insertions(+), 28 deletions(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index ca71ec08051..552654e33ab 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -54,7 +54,6 @@ class LayerBase { bm_by_user_(false), parent_net_(nullptr), net_inititialized_flag_(nullptr), - net_iteration0_flag_(nullptr), is_shared_(false) { InitMutex(); } @@ -356,10 +355,6 @@ class LayerBase { net_inititialized_flag_ = init_flag; } - void set_net_iteration0_flag(Flag* iter0_flag) { - net_iteration0_flag_ = iter0_flag; - } - /** * Some layers need to be initialized after first iteration * They should override this function and return a flag @@ -444,9 +439,6 @@ class LayerBase { /** Gets set when Net::Init is over */ Flag* net_inititialized_flag_; - /** Gets set when Net::Init is over */ - Flag* net_iteration0_flag_; - private: /** Whether this layer is actually shared by other nets*/ bool is_shared_; diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 4722aa8efff..1349c3c0235 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -33,14 +33,12 @@ class Net { explicit Net(const NetParameter& param, size_t solver_rank = 0U, Flag* solver_init_flag = nullptr, - Flag* solver_iter0_flag = nullptr, const Net* root_net = nullptr, bool inner_net = false); Net(const string& param_file, Phase phase, size_t solver_rank = 0U, Flag* solver_init_flag = nullptr, - Flag* solver_iter0_flag = nullptr, const Net* root_net = nullptr, bool inner_net = false); ~Net(); @@ -428,7 +426,6 @@ class Net { size_t solver_rank_; BlockingQueue reduction_queue_[2]; Flag* solver_init_flag_; - Flag* solver_iter0_flag_; vector layer_inititialized_flags_; NetParameter net_param_; diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 853006c9aa6..30f2395847d 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -239,7 +239,7 @@ class Solver { bool requested_early_exit_; // some layers like Data have to wait for this one - Flag init_flag_, iter0_flag_; + Flag init_flag_; // Timing information shared_ptr iteration_timer_; diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 21d88860f80..050167ea42b 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -130,9 +130,6 @@ void BasePrefetchingDataLayer::InternalThreadEntryN(size_t thread_ batch_transformer_->prefetched_push_full(qid, batch); if (auto_mode) { - if (this->net_iteration0_flag_ != nullptr) { - this->net_iteration0_flag_->wait(); - } iter0_.set(); break; } diff --git a/src/caffe/layers/recurrent_layer.cpp b/src/caffe/layers/recurrent_layer.cpp index 75ac19c0ba0..344d399a9e6 100644 --- a/src/caffe/layers/recurrent_layer.cpp +++ b/src/caffe/layers/recurrent_layer.cpp @@ -110,8 +110,7 @@ void RecurrentLayer::LayerSetUp(const vector& bottom, const size_t rank = this->parent_rank(); // Create the unrolled net. - unrolled_net_.reset(new Net(net_param, rank, - nullptr, nullptr, nullptr, true)); + unrolled_net_.reset(new Net(net_param, rank, nullptr, nullptr, true)); unrolled_net_->set_debug_info( this->layer_param_.recurrent_param().debug_info()); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 065a4b27b86..3dad99374b9 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -24,14 +24,12 @@ constexpr int Net::END_OF_TRAIN; Net::Net(const NetParameter& param, size_t solver_rank, Flag* solver_init_flag, - Flag* solver_iter0_flag, const Net* root_net, bool inner_net) : root_net_(root_net), solver_(nullptr), solver_rank_(solver_rank), solver_init_flag_(solver_init_flag), - solver_iter0_flag_(solver_iter0_flag), inner_net_(inner_net) { Init(param); } @@ -40,14 +38,12 @@ Net::Net(const string& param_file, Phase phase, size_t solver_rank, Flag* solver_init_flag, - Flag* solver_iter0_flag, const Net* root_net, bool inner_net) : root_net_(root_net), solver_(nullptr), solver_rank_(solver_rank), solver_init_flag_(solver_init_flag), - solver_iter0_flag_(solver_iter0_flag), inner_net_(inner_net) { NetParameter param; ReadNetParamsFromTextFileOrDie(param_file, ¶m); @@ -227,7 +223,6 @@ void Net::Init(const NetParameter& in_param) { layer->bm_by_user(bm_by_user); layers_[layer_id]->set_net_initialized_flag(solver_init_flag_); - layers_[layer_id]->set_net_iteration0_flag(solver_iter0_flag_); Flag* layer_inititialized_flag = layers_[layer_id]->layer_inititialized_flag(); if (layer_inititialized_flag != nullptr) { diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index fad051fd954..644e55afbfd 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -95,9 +95,9 @@ void Solver::InitTrainNet() { net_state.MergeFrom(param_.train_state()); net_param.mutable_state()->CopyFrom(net_state); if (Caffe::root_solver()) { - net_.reset(new Net(net_param, rank_, &init_flag_, &iter0_flag_)); + net_.reset(new Net(net_param, rank_, &init_flag_)); } else { - net_.reset(new Net(net_param, rank_, &init_flag_, &iter0_flag_, + net_.reset(new Net(net_param, rank_, &init_flag_, root_solver_->net_.get())); } } @@ -173,9 +173,9 @@ void Solver::InitTestNets() { LOG(INFO) << "Creating test net (#" << i << ") specified by " << sources[i]; if (Caffe::root_solver()) { - test_nets_[i].reset(new Net(net_params[i], rank_, &init_flag_, &iter0_flag_)); + test_nets_[i].reset(new Net(net_params[i], rank_, &init_flag_)); } else { - test_nets_[i].reset(new Net(net_params[i], rank_, &init_flag_, &iter0_flag_, + test_nets_[i].reset(new Net(net_params[i], rank_, &init_flag_, root_solver_->test_nets_[i].get())); } test_nets_[i]->set_debug_info(param_.debug_info()); @@ -195,7 +195,6 @@ void Solver::Step(int iters) { net_->set_solver(this); if (iters <= 0) { - iter0_flag_.set(); init_flag_.set(); return; } @@ -304,7 +303,6 @@ void Solver::Step(int iters) { loss += net_->ForwardBackward(i + 1 == param_.iter_size()); if (i == 0) { if (first_loop) { - iter0_flag_.set(); net_->wait_layers_init(); } } From 70135bf5f58e58a9eb4ac992381195743112185c Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 26 Feb 2018 12:44:56 -0800 Subject: [PATCH 09/42] non-CuDNN path fixed --- src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/image_data_layer.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 53a8005b922..56985a6c73e 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -317,7 +317,7 @@ void DataLayer::load_batch(Batch* batch, int thread_id, size_t que #else vector tmp(top_shape[1] * top_shape[2] * top_shape[3]); CHECK_EQ(buf_len, tmp.size()); - vector shape = this->dt(thread_id)->Transform(datum.get(), tmp.data(), buf_len, + vector shape = this->bdt(thread_id)->Transform(datum.get(), tmp.data(), buf_len, packing, false); if (packing == NHWC) { hwc2chw(top_shape[1], top_shape[3], top_shape[2], tmp.data(), dst_cptr + offset); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 9f4d8caf046..878bb075c75 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -209,7 +209,7 @@ void ImageDataLayer::load_batch(Batch* batch, int thread_id, size_ this->bdt(thread_id)->Transform(cv_img, prefetch_data + offset, buf_len, false); #else CHECK_EQ(buf_len, tmp.size()); - this->dt(thread_id)->Transform(cv_img, prefetch_data + offset, buf_len, false); + this->bdt(thread_id)->Transform(cv_img, prefetch_data + offset, buf_len, false); hwc2chw(top_shape[1], top_shape[3], top_shape[2], tmp.data(), prefetch_data + offset); packing = NCHW; #endif From 50e0180e1085e79dceba71bdc02179daa609e5df Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 26 Feb 2018 18:48:36 -0800 Subject: [PATCH 10/42] Pinned mem fix --- models/VGGNet/coco/SSD_300x300/train.prototxt | 313 ++---------------- src/caffe/util/math_functions.cu | 14 +- 2 files changed, 41 insertions(+), 286 deletions(-) diff --git a/models/VGGNet/coco/SSD_300x300/train.prototxt b/models/VGGNet/coco/SSD_300x300/train.prototxt index 289b4c7a9fa..2fd7179ca3b 100644 --- a/models/VGGNet/coco/SSD_300x300/train.prototxt +++ b/models/VGGNet/coco/SSD_300x300/train.prototxt @@ -141,14 +141,6 @@ layer { type: "Convolution" bottom: "data" top: "conv1_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } convolution_param { num_output: 64 pad: 1 @@ -173,14 +165,7 @@ layer { type: "Convolution" bottom: "conv1_1" top: "conv1_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 64 pad: 1 @@ -216,14 +201,7 @@ layer { type: "Convolution" bottom: "pool1" top: "conv2_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 128 pad: 1 @@ -248,14 +226,7 @@ layer { type: "Convolution" bottom: "conv2_1" top: "conv2_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 128 pad: 1 @@ -291,14 +262,7 @@ layer { type: "Convolution" bottom: "pool2" top: "conv3_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 1 @@ -323,14 +287,7 @@ layer { type: "Convolution" bottom: "conv3_1" top: "conv3_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 1 @@ -355,14 +312,7 @@ layer { type: "Convolution" bottom: "conv3_2" top: "conv3_3" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 1 @@ -398,14 +348,7 @@ layer { type: "Convolution" bottom: "pool3" top: "conv4_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -430,14 +373,7 @@ layer { type: "Convolution" bottom: "conv4_1" top: "conv4_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -462,14 +398,7 @@ layer { type: "Convolution" bottom: "conv4_2" top: "conv4_3" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -505,14 +434,7 @@ layer { type: "Convolution" bottom: "pool4" top: "conv5_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -538,14 +460,7 @@ layer { type: "Convolution" bottom: "conv5_1" top: "conv5_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -571,14 +486,7 @@ layer { type: "Convolution" bottom: "conv5_2" top: "conv5_3" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -616,14 +524,6 @@ layer { type: "Convolution" bottom: "pool5" top: "fc6" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } convolution_param { num_output: 1024 pad: 6 @@ -649,14 +549,7 @@ layer { type: "Convolution" bottom: "fc6" top: "fc7" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 1024 kernel_size: 1 @@ -680,14 +573,7 @@ layer { type: "Convolution" bottom: "fc7" top: "conv6_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 0 @@ -713,14 +599,7 @@ layer { type: "Convolution" bottom: "conv6_1" top: "conv6_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 512 pad: 1 @@ -746,14 +625,7 @@ layer { type: "Convolution" bottom: "conv6_2" top: "conv7_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 128 pad: 0 @@ -779,14 +651,7 @@ layer { type: "Convolution" bottom: "conv7_1" top: "conv7_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 1 @@ -812,14 +677,7 @@ layer { type: "Convolution" bottom: "conv7_2" top: "conv8_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 128 pad: 0 @@ -845,14 +703,7 @@ layer { type: "Convolution" bottom: "conv8_1" top: "conv8_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 0 @@ -878,14 +729,7 @@ layer { type: "Convolution" bottom: "conv8_2" top: "conv9_1" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 128 pad: 0 @@ -911,14 +755,7 @@ layer { type: "Convolution" bottom: "conv9_1" top: "conv9_2" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 256 pad: 0 @@ -958,14 +795,7 @@ layer { type: "Convolution" bottom: "conv4_3_norm" top: "conv4_3_norm_mbox_loc" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 16 pad: 1 @@ -1006,14 +836,7 @@ layer { type: "Convolution" bottom: "conv4_3_norm" top: "conv4_3_norm_mbox_conf" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 324 pad: 1 @@ -1074,14 +897,7 @@ layer { type: "Convolution" bottom: "fc7" top: "fc7_mbox_loc" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 24 pad: 1 @@ -1122,14 +938,7 @@ layer { type: "Convolution" bottom: "fc7" top: "fc7_mbox_conf" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 486 pad: 1 @@ -1191,14 +1000,7 @@ layer { type: "Convolution" bottom: "conv6_2" top: "conv6_2_mbox_loc" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 24 pad: 1 @@ -1239,14 +1041,7 @@ layer { type: "Convolution" bottom: "conv6_2" top: "conv6_2_mbox_conf" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 486 pad: 1 @@ -1308,14 +1103,7 @@ layer { type: "Convolution" bottom: "conv7_2" top: "conv7_2_mbox_loc" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 24 pad: 1 @@ -1356,14 +1144,7 @@ layer { type: "Convolution" bottom: "conv7_2" top: "conv7_2_mbox_conf" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 486 pad: 1 @@ -1425,14 +1206,7 @@ layer { type: "Convolution" bottom: "conv8_2" top: "conv8_2_mbox_loc" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 16 pad: 1 @@ -1473,14 +1247,7 @@ layer { type: "Convolution" bottom: "conv8_2" top: "conv8_2_mbox_conf" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 324 pad: 1 @@ -1541,14 +1308,7 @@ layer { type: "Convolution" bottom: "conv9_2" top: "conv9_2_mbox_loc" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 16 pad: 1 @@ -1589,14 +1349,7 @@ layer { type: "Convolution" bottom: "conv9_2" top: "conv9_2_mbox_conf" - param { - lr_mult: 1.0 - decay_mult: 1.0 - } - param { - lr_mult: 2.0 - decay_mult: 0.0 - } + convolution_param { num_output: 324 pad: 1 diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index ea1e97fd348..f46450e59b4 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -346,26 +346,28 @@ void gpu_dot_kernel(const int N, const Dtype* x, const Dtype* y, Mtype* out) { template<> void caffe_gpu_dot(const int n, const float16* x, const float16* y, float16* out) { - GPUMemory::PinnedBuffer ws(sizeof(float)); - float* res = reinterpret_cast(ws.get()); + float fres; + GPUMemory::Workspace ws(sizeof(float), Caffe::current_device()); + float* res = reinterpret_cast(ws.data()); cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) gpu_dot_kernel<<<1, CAFFE_CUDA_NUM_THREADS, 0, stream>>>(n, x, y, res); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaMemcpyAsync(&fres, res, ws.size(), cudaMemcpyDeviceToHost, stream)); CUDA_CHECK(cudaStreamSynchronize(stream)); - *out = static_cast(*res); + *out = static_cast(fres); } template<> void caffe_gpu_dot(const int n, const float16* x, const float16* y, float* out) { - GPUMemory::PinnedBuffer ws(sizeof(float)); - float* res = reinterpret_cast(ws.get()); + GPUMemory::Workspace ws(sizeof(float), Caffe::current_device()); + float* res = reinterpret_cast(ws.data()); cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) gpu_dot_kernel<<<1, CAFFE_CUDA_NUM_THREADS, 0, stream>>>(n, x, y, res); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaMemcpyAsync(out, res, ws.size(), cudaMemcpyDeviceToHost, stream)); CUDA_CHECK(cudaStreamSynchronize(stream)); - *out = *res; } template<> From 6b0e6621bad8adfd351892ed3e6f43beb48764a5 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 26 Feb 2018 19:18:34 -0800 Subject: [PATCH 11/42] write_json fix --- include/caffe/layers/detection_output_layer.hpp | 4 ++++ src/caffe/layers/detection_output_layer.cpp | 2 ++ src/caffe/layers/detection_output_layer.cu | 2 ++ 3 files changed, 8 insertions(+) diff --git a/include/caffe/layers/detection_output_layer.hpp b/include/caffe/layers/detection_output_layer.hpp index 795f4264c83..a8c7e413bc1 100644 --- a/include/caffe/layers/detection_output_layer.hpp +++ b/include/caffe/layers/detection_output_layer.hpp @@ -3,7 +3,11 @@ #include "caffe/common.hpp" +#if (__GNUC__ >= 5) && (BOOST_VERSION >= 105800) +#define WRITE_JSON_SUPPORTED #include +#endif + #include #include diff --git a/src/caffe/layers/detection_output_layer.cpp b/src/caffe/layers/detection_output_layer.cpp index ebdb235bf3a..0e9b619346a 100644 --- a/src/caffe/layers/detection_output_layer.cpp +++ b/src/caffe/layers/detection_output_layer.cpp @@ -423,7 +423,9 @@ void DetectionOutputLayer::Forward_cpu( ptree output; output.add_child("detections", detections_); std::stringstream ss; +#ifdef WRITE_JSON_SUPPORTED write_json(ss, output); +#endif std::string rv = boost::regex_replace(ss.str(), exp, "$1"); outfile << rv.substr(rv.find("["), rv.rfind("]") - rv.find("[")) << std::endl << "]" << std::endl; diff --git a/src/caffe/layers/detection_output_layer.cu b/src/caffe/layers/detection_output_layer.cu index 4f5024b111b..f7fa5e0f42d 100644 --- a/src/caffe/layers/detection_output_layer.cu +++ b/src/caffe/layers/detection_output_layer.cu @@ -257,7 +257,9 @@ void DetectionOutputLayer::Forward_gpu( ptree output; output.add_child("detections", detections_); std::stringstream ss; +#ifdef WRITE_JSON_SUPPORTED write_json(ss, output); +#endif std::string rv = boost::regex_replace(ss.str(), exp, "$1"); outfile << rv.substr(rv.find("["), rv.rfind("]") - rv.find("[")) << std::endl << "]" << std::endl; From 413bc9dce08e66da16449474a20050b3c8e43c27 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 27 Feb 2018 11:41:39 -0800 Subject: [PATCH 12/42] Workspace stream lifecycle --- include/caffe/common.hpp | 3 +++ include/caffe/syncedmem.hpp | 1 + include/caffe/util/gpu_memory.hpp | 12 +++++++----- src/caffe/layers/cudnn_conv_layer.cpp | 4 ++-- src/caffe/syncedmem.cpp | 6 ++++-- src/caffe/util/gpu_memory.cpp | 9 +++++---- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 93702b8fa74..19ee97f4d54 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -353,6 +353,9 @@ class Caffe { static cudaStream_t curand_stream() { return Get().curand_stream_->get(); } + static shared_ptr thread_pstream(int group = 0) { + return Get().pstream(group); + } static shared_ptr short_term_cublas_phandle() { return make_shared(); } diff --git a/include/caffe/syncedmem.hpp b/include/caffe/syncedmem.hpp index 7c99d5015be..daf8b469daa 100644 --- a/include/caffe/syncedmem.hpp +++ b/include/caffe/syncedmem.hpp @@ -73,6 +73,7 @@ class SyncedMemory { bool own_gpu_data_; int device_; bool valid_; + shared_ptr pstream_; DISABLE_COPY_MOVE_AND_ASSIGN(SyncedMemory); }; // class SyncedMemory diff --git a/include/caffe/util/gpu_memory.hpp b/include/caffe/util/gpu_memory.hpp index b3807cbaccf..4072d2c6da4 100644 --- a/include/caffe/util/gpu_memory.hpp +++ b/include/caffe/util/gpu_memory.hpp @@ -28,8 +28,8 @@ struct GPUMemory { } template - static void allocate(Any** ptr, size_t size, int device = current_device(), int group = 0) { - if (!try_allocate(reinterpret_cast(ptr), size, device, group)) { + static void allocate(Any** ptr, size_t size, int device, const shared_ptr& pstream) { + if (!try_allocate(reinterpret_cast(ptr), size, device, pstream)) { LOG(FATAL) << "Failed to allocate " << size << " bytes on device " << device << ". " << mgr_.report_dev_info(device); } @@ -39,8 +39,9 @@ struct GPUMemory { mgr_.deallocate(ptr, device); } - static bool try_allocate(void** ptr, size_t size, int device = current_device(), int group = 0) { - return mgr_.try_allocate(ptr, size, device, group); + static bool try_allocate(void** ptr, size_t size, int device, + const shared_ptr& pstream) { + return mgr_.try_allocate(ptr, size, device, pstream); } static shared_mutex& read_write_mutex() { @@ -108,6 +109,7 @@ struct GPUMemory { void* ptr_; size_t size_; int device_; + shared_ptr pstream_; DISABLE_COPY_MOVE_AND_ASSIGN(Workspace); }; @@ -134,7 +136,7 @@ struct GPUMemory { void lazy_init(int device); void GetInfo(size_t* free_mem, size_t* used_mem, bool with_update); void deallocate(void* ptr, int device); - bool try_allocate(void** ptr, size_t size, int device, int group = 0); + bool try_allocate(void** ptr, size_t size, int device, const shared_ptr& pstream); void init(const std::vector&, bool); void reset(); std::string report_dev_info(int device); diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index ed3ceeabfb4..db1a8649039 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -235,7 +235,7 @@ void CuDNNConvolutionLayer::LayerSetUp( template void CuDNNConvolutionLayer::AllocateFindExWorkspace() { const int dev = Caffe::current_device(); - shared_ptr ws = GPUMemory::workspace_[dev]; + shared_ptr& ws = GPUMemory::workspace_[dev]; size_t bytes_available, bytes_total; GPUMemory::GetInfo(&bytes_available, &bytes_total, true); bytes_available = std::min(bytes_available + ws->size(), bytes_total / 2UL); @@ -514,7 +514,7 @@ void CuDNNConvolutionLayer::FindExConvAlgo( cudaStream_t stream = Caffe::thread_stream(0); const int dev = Caffe::current_device(); - shared_ptr ws = GPUMemory::workspace_[dev]; + shared_ptr& ws = GPUMemory::workspace_[dev]; const size_t gsize = ws->size() / ws_groups(); CHECK(is_even(gsize)) << ws->size() << " / " << ws_groups() << " -> " << gsize; diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index b7cd6f09f84..9390a442196 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -80,7 +80,8 @@ void SyncedMemory::to_gpu(bool copy_from_cpu, int group) { switch (head_) { case UNINITIALIZED: CUDA_CHECK(cudaGetDevice(&device_)); - GPUMemory::allocate(&gpu_ptr_, size_, device_, group); + pstream_ = Caffe::thread_pstream(group); + GPUMemory::allocate(&gpu_ptr_, size_, device_, pstream_); caffe_gpu_memset(size_, 0, gpu_ptr_, group); head_ = HEAD_AT_GPU; own_gpu_data_ = true; @@ -88,7 +89,8 @@ void SyncedMemory::to_gpu(bool copy_from_cpu, int group) { case HEAD_AT_CPU: if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaGetDevice(&device_)); - GPUMemory::allocate(&gpu_ptr_, size_, device_, group); + pstream_ = Caffe::thread_pstream(group); + GPUMemory::allocate(&gpu_ptr_, size_, device_, pstream_); own_gpu_data_ = true; } if (copy_from_cpu) { diff --git a/src/caffe/util/gpu_memory.cpp b/src/caffe/util/gpu_memory.cpp index 5c2ab8fda30..2446f84c271 100644 --- a/src/caffe/util/gpu_memory.cpp +++ b/src/caffe/util/gpu_memory.cpp @@ -67,7 +67,8 @@ bool GPUMemory::Workspace::try_reserve(size_t size, int device) { if (device != INVALID_DEVICE) { device_ = device; // switch from default to specific one } - status = mgr_.try_allocate(&ptr_, size, device_); + pstream_ = Caffe::thread_pstream(0); + status = mgr_.try_allocate(&ptr_, size, device_, pstream_); if (status) { CHECK_NOTNULL(ptr_); size_ = size; @@ -132,7 +133,8 @@ void GPUMemory::Manager::lazy_init(int device) { static Scope gpu_memory_scope(gpus); } -bool GPUMemory::Manager::try_allocate(void** ptr, size_t size, int device, int group) { +bool GPUMemory::Manager::try_allocate(void** ptr, size_t size, int device, + const shared_ptr& pstream) { if (!initialized_) { lazy_init(device); } @@ -144,8 +146,7 @@ bool GPUMemory::Manager::try_allocate(void** ptr, size_t size, int device, int g shared_lock lock(GPUMemory::read_write_mutex()); size_t size_allocated = 0; // Clean Cache & Retry logic is inside now - status = cub_allocator_->DeviceAllocate(device, ptr, size, - Caffe::thread_stream(group), size_allocated); + status = cub_allocator_->DeviceAllocate(device, ptr, size, pstream->get(), size_allocated); if (status == cudaSuccess && device > INVALID_DEVICE) { if (size_allocated > 0) { if (dev_info_[device].free_ < update_thresholds_[device]) { From 8b3b4f3a23bbafca76f617c1ef49fc03d63dd83c Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 27 Feb 2018 14:18:38 -0800 Subject: [PATCH 13/42] More Affinity --- README.md | 6 ++++-- src/caffe/batch_transformer.cpp | 2 +- src/caffe/layers/data_layer.cpp | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f95295482f3..1032f956245 100644 --- a/README.md +++ b/README.md @@ -13,17 +13,19 @@ Here are the major features: * **Mixed-precision support**. It allows to store and/or compute data in either 64, 32 or 16 bit formats. Precision can be defined for every layer (forward and backward passes might be different too), or it can be set for the whole Net. +* **Layer-wise Adaptive Rate Control (LARC) and adaptive global gradient scaler** for better + accuracy, especially in 16-bit training. * **Integration with [cuDNN](https://developer.nvidia.com/cudnn) v7**. * **Automatic selection of the best cuDNN convolution algorithm**. * **Integration with v2.2 of [NCCL library](https://github.com/NVIDIA/nccl)** for improved multi-GPU scaling. * **Optimized GPU memory management** for data and parameters storage, I/O buffers and workspace for convolutional layers. -* **Parallel data parser and transformer** for improved I/O performance. +* **Parallel data parser, transformer and image reader** for improved I/O performance. * **Parallel back propagation and gradient reduction** on multi-GPU systems. * **Fast solvers implementation with fused CUDA kernels for weights and history update**. * **Multi-GPU test phase** for even memory load across multiple GPUs. -* **Backward compatibility with BVLC Caffe and NVCaffe 0.15**. +* **Backward compatibility with BVLC Caffe and NVCaffe 0.15 and higher**. * **Extended set of optimized models** (including 16 bit floating point examples). diff --git a/src/caffe/batch_transformer.cpp b/src/caffe/batch_transformer.cpp index 4cb33aca7fd..0d3cdd0b1a0 100644 --- a/src/caffe/batch_transformer.cpp +++ b/src/caffe/batch_transformer.cpp @@ -23,7 +23,7 @@ void BatchTransformer::ResizeQueues(size_t queues_num) { if (queues_num_ > prefetches_free_.size()) { resize(true); } - StartInternalThread(); + StartInternalThread(true); } template diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 56985a6c73e..a0557b07815 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -87,7 +87,7 @@ DataLayer::InitializePrefetch() { } } - this->RestartAllThreads(transf_num, true, false, Caffe::next_seed()); + this->RestartAllThreads(transf_num, true, true, Caffe::next_seed()); this->transf_num_ = this->threads_num(); this->parsers_num_ = parsers_num; this->queues_num_ = this->transf_num_ * this->parsers_num_; From ac5a90a9f74bf98bf614f1940e8514a27d700d4b Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 27 Feb 2018 18:05:33 -0800 Subject: [PATCH 14/42] Less Affinity --- src/caffe/layers/data_layer.cpp | 2 +- src/caffe/test/test_convolution_layer.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index a0557b07815..56985a6c73e 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -87,7 +87,7 @@ DataLayer::InitializePrefetch() { } } - this->RestartAllThreads(transf_num, true, true, Caffe::next_seed()); + this->RestartAllThreads(transf_num, true, false, Caffe::next_seed()); this->transf_num_ = this->threads_num(); this->parsers_num_ = parsers_num; this->queues_num_ = this->transf_num_ * this->parsers_num_; diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 0e41c7d942b..356cf83b37a 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -1108,7 +1108,7 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestGradientCuDNN) { convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); CuDNNConvolutionLayer layer(layer_param); - GradientChecker checker(tol(5e-2, 1e-1), tol(1e-2, 5e-1)); + GradientChecker checker(tol(3e-2, 1e-1), tol(1e-2, 5e-1)); checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, this->blob_top_vec_); } From 30bbcb97249a5adab31af3dd1b79c8475bf2311f Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Wed, 28 Feb 2018 11:56:22 -0800 Subject: [PATCH 15/42] 0.17 --- .travis.yml | 2 +- CMakeLists.txt | 4 ++-- Makefile | 4 ++-- Makefile.config.example | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index c7c9c1e5087..6478c866904 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ compiler: gcc env: global: - - NUM_THREADS=4 + - NUM_THREADS=8 matrix: # Use a build matrix to test many builds in parallel # envvar defaults: diff --git a/CMakeLists.txt b/CMakeLists.txt index 64aef17340e..21d9095b7b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ endif() project(Caffe C CXX) # ---[ Caffe version -set(CAFFE_TARGET_VERSION "0.16.6") -set(CAFFE_TARGET_SOVERSION "0.16") +set(CAFFE_TARGET_VERSION "0.17.0") +set(CAFFE_TARGET_SOVERSION "0.17") add_definitions(-DCAFFE_VERSION=${CAFFE_TARGET_VERSION}) # Skip `typedef __half half;` diff --git a/Makefile b/Makefile index b5d72c4208b..94603bad356 100644 --- a/Makefile +++ b/Makefile @@ -35,8 +35,8 @@ LIBRARY_NAME := $(PROJECT)$(LIBRARY_NAME_SUFFIX) LIB_BUILD_DIR := $(BUILD_DIR)/lib STATIC_NAME := $(LIB_BUILD_DIR)/lib$(LIBRARY_NAME).a DYNAMIC_VERSION_MAJOR := 0 -DYNAMIC_VERSION_MINOR := 16 -DYNAMIC_VERSION_REVISION := 6 +DYNAMIC_VERSION_MINOR := 17 +DYNAMIC_VERSION_REVISION := 0 DYNAMIC_NAME_SHORT := lib$(LIBRARY_NAME).so DYNAMIC_SONAME_SHORT := $(DYNAMIC_NAME_SHORT).$(DYNAMIC_VERSION_MAJOR).$(DYNAMIC_VERSION_MINOR) DYNAMIC_VERSIONED_NAME_SHORT := $(DYNAMIC_SONAME_SHORT).$(DYNAMIC_VERSION_REVISION) diff --git a/Makefile.config.example b/Makefile.config.example index 670d1df0ce1..9e1183434f2 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -3,7 +3,7 @@ # cuDNN acceleration switch (uncomment to build with cuDNN). # cuDNN version 6 or higher is required. -# USE_CUDNN := 1 +USE_CUDNN := 1 # NCCL acceleration switch (uncomment to build with NCCL) # See https://github.com/NVIDIA/nccl @@ -18,7 +18,7 @@ # USE_LMDB := 0 # Uncomment if you're using OpenCV 3 -# OPENCV_VERSION := 3 +OPENCV_VERSION := 3 # To customize your choice of compiler, uncomment and set the following. # N.B. the default for Linux is g++ and the default for OSX is clang++ From 40119a57e0ceeaa75ba3149d4ae471fa3c96a77c Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Wed, 28 Feb 2018 15:39:38 -0800 Subject: [PATCH 16/42] Non-cuDNN path fixed --- Makefile.config.example | 4 ++-- src/caffe/blob.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile.config.example b/Makefile.config.example index 9e1183434f2..670d1df0ce1 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -3,7 +3,7 @@ # cuDNN acceleration switch (uncomment to build with cuDNN). # cuDNN version 6 or higher is required. -USE_CUDNN := 1 +# USE_CUDNN := 1 # NCCL acceleration switch (uncomment to build with NCCL) # See https://github.com/NVIDIA/nccl @@ -18,7 +18,7 @@ USE_CUDNN := 1 # USE_LMDB := 0 # Uncomment if you're using OpenCV 3 -OPENCV_VERSION := 3 +# OPENCV_VERSION := 3 # To customize your choice of compiler, uncomment and set the following. # N.B. the default for Linux is g++ and the default for OSX is clang++ diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index c6e1cc443d7..522d981489d 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -1,7 +1,8 @@ #include #include +#if defined(USE_CUDNN) #include - +#endif #include "caffe/blob.hpp" namespace caffe { From bbecbea3de3edb40a503052d6f6dbbd8bf13f8d2 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Thu, 1 Mar 2018 15:09:49 -0800 Subject: [PATCH 17/42] Travis&cleanup --- CMakeLists.txt | 1 - Makefile | 3 --- cmake/ConfigGen.cmake | 4 ---- cmake/Dependencies.cmake | 5 ----- cmake/Summary.cmake | 1 - packaging/deb/templates/rules | 1 - scripts/travis/build.sh | 4 ++-- scripts/travis/test.sh | 2 ++ src/caffe/util/bbox_util.cpp | 14 ++++++++------ 9 files changed, 12 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21d9095b7b7..6e18fd62b39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,6 @@ caffe_option(BUILD_docs "Build documentation" ON IF UNIX OR APPLE) caffe_option(BUILD_python_layer "Build the Caffe Python layer" ON) caffe_option(USE_LEVELDB "Build with levelDB" ON) caffe_option(USE_LMDB "Build with lmdb" ON) -caffe_option(ALLOW_LMDB_NOLOCK "Allow MDB_NOLOCK when reading LMDB files (only if necessary)" OFF) caffe_option(TEST_FP16 "Build Caffe Tests with 16 bit mode included" OFF) caffe_option(NO_NVML "Build Caffe Tests without NVML (i.e. no CPU affinity)" OFF) diff --git a/Makefile b/Makefile index 94603bad356..858886cc775 100644 --- a/Makefile +++ b/Makefile @@ -376,9 +376,6 @@ ifeq ($(USE_LEVELDB), 1) endif ifeq ($(USE_LMDB), 1) COMMON_FLAGS += -DUSE_LMDB -ifeq ($(ALLOW_LMDB_NOLOCK), 1) - COMMON_FLAGS += -DALLOW_LMDB_NOLOCK -endif endif # New place for HDF5 diff --git a/cmake/ConfigGen.cmake b/cmake/ConfigGen.cmake index 1db099279f8..5870984dd5a 100644 --- a/cmake/ConfigGen.cmake +++ b/cmake/ConfigGen.cmake @@ -53,14 +53,10 @@ function(caffe_generate_export_configs) set(Caffe_DEFINITIONS "") if(NOT HAVE_CUDA) set(HAVE_CUDA FALSE) - list(APPEND Caffe_DEFINITIONS -DCPU_ONLY) endif() if(USE_LMDB) list(APPEND Caffe_DEFINITIONS -DUSE_LMDB) - if (ALLOW_LMDB_NOLOCK) - list(APPEND Caffe_DEFINITIONS -DALLOW_LMDB_NOLOCK) - endif() endif() if(USE_LEVELDB) diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index affbde8f316..c55c1116552 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -34,9 +34,6 @@ if(USE_LMDB) include_directories(SYSTEM ${LMDB_INCLUDE_DIR}) list(APPEND Caffe_LINKER_LIBS ${LMDB_LIBRARIES}) add_definitions(-DUSE_LMDB) - if(ALLOW_LMDB_NOLOCK) - add_definitions(-DALLOW_LMDB_NOLOCK) - endif() endif() # ---[ LevelDB @@ -62,8 +59,6 @@ list(APPEND Caffe_LINKER_LIBS ${JPEGTurbo_LIBRARIES}) include(cmake/Cuda.cmake) if(NOT HAVE_CUDA) message(SEND_ERROR "-- CUDA is not detected by cmake. Building without it...") - # TODO: remove this not cross platform define in future. Use caffe_config.h instead. - add_definitions(-DCPU_ONLY) endif() # ---[ OpenCV diff --git a/cmake/Summary.cmake b/cmake/Summary.cmake index 467440761d5..b7505614c89 100644 --- a/cmake/Summary.cmake +++ b/cmake/Summary.cmake @@ -115,7 +115,6 @@ function(caffe_print_configuration_summary) caffe_status(" BUILD_docs : ${BUILD_docs}") caffe_status(" USE_LEVELDB : ${USE_LEVELDB}") caffe_status(" USE_LMDB : ${USE_LMDB}") - caffe_status(" ALLOW_LMDB_NOLOCK : ${ALLOW_LMDB_NOLOCK}") caffe_status(" TEST_FP16 : ${TEST_FP16}") caffe_status("") caffe_status("Dependencies:") diff --git a/packaging/deb/templates/rules b/packaging/deb/templates/rules index defa8e32522..fc8122c2319 100755 --- a/packaging/deb/templates/rules +++ b/packaging/deb/templates/rules @@ -17,7 +17,6 @@ endif override_dh_auto_configure: dh_auto_configure -- \ - -DALLOW_LMDB_NOLOCK=ON \ -DBLAS=Open \ -DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_SKIP_RPATH=TRUE \ diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh index ca459a2531b..980a392ab68 100755 --- a/scripts/travis/build.sh +++ b/scripts/travis/build.sh @@ -5,9 +5,9 @@ BASEDIR=$(dirname $0) source $BASEDIR/defaults.sh if ! $WITH_CMAKE ; then - make --jobs $NUM_THREADS all test pycaffe warn + make -j"$(nproc)" all test pycaffe warn else cd build - make --jobs $NUM_THREADS all test.testbin + make -j"$(nproc)" all test.testbin fi make lint diff --git a/scripts/travis/test.sh b/scripts/travis/test.sh index 24e8ea48b3e..05a35cf7dfe 100755 --- a/scripts/travis/test.sh +++ b/scripts/travis/test.sh @@ -10,10 +10,12 @@ if $WITH_CUDA ; then fi if ! $WITH_CMAKE ; then + make -j"$(nproc)" make runtest make pytest else cd build + make -j"$(nproc)" make runtest make pytest fi diff --git a/src/caffe/util/bbox_util.cpp b/src/caffe/util/bbox_util.cpp index 4b96925e1d4..b634ebea3bd 100644 --- a/src/caffe/util/bbox_util.cpp +++ b/src/caffe/util/bbox_util.cpp @@ -1810,13 +1810,14 @@ void GetMaxScoreIndex(const Dtype* scores, const int num, const float threshold, // Generate index score pairs. for (int i = 0; i < num; ++i) { if (scores[i] > threshold) { - score_index_vec->push_back(std::make_pair(scores[i], i)); + score_index_vec->emplace_back(std::make_pair(scores[i], i)); } } // Sort the score pair according to the scores in descending order - std::sort(score_index_vec->begin(), score_index_vec->end(), - SortScorePairDescend); + std::partial_sort( + score_index_vec->begin(), score_index_vec->begin() + top_k, + score_index_vec->end(), SortScorePairDescend); // Keep top_k scores if needed. if (top_k > -1 && top_k < score_index_vec->size()) { @@ -1994,8 +1995,9 @@ void ApplyNMSFast(const Dtype* bboxes, const Dtype* scores, const int num, // Do nms. float adaptive_threshold = nms_threshold; indices->clear(); - while (score_index_vec.size() != 0) { - const int idx = score_index_vec.front().second; + auto it = score_index_vec.begin(); + while (it != score_index_vec.end()) { + const int idx = it->second; bool keep = true; for (int k = 0; k < indices->size(); ++k) { if (keep) { @@ -2009,7 +2011,7 @@ void ApplyNMSFast(const Dtype* bboxes, const Dtype* scores, const int num, if (keep) { indices->push_back(idx); } - score_index_vec.erase(score_index_vec.begin()); + ++it; if (keep && eta < 1 && adaptive_threshold > 0.5) { adaptive_threshold *= eta; } From 249aa54a4a3319b9bd11cd414fffadb8b8983824 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Fri, 2 Mar 2018 00:37:42 -0800 Subject: [PATCH 18/42] Travis&cleanup --- scripts/travis/configure-cmake.sh | 2 +- src/caffe/layers/axpy_layer.cpp | 90 +++++++++++++++++++++++++ src/caffe/layers/axpy_layer.cu | 94 +++++++++++++++++++++++++++ src/caffe/layers/image_data_layer.cpp | 1 + 4 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/axpy_layer.cpp create mode 100644 src/caffe/layers/axpy_layer.cu diff --git a/scripts/travis/configure-cmake.sh b/scripts/travis/configure-cmake.sh index adafa7eca69..76fb65ad329 100644 --- a/scripts/travis/configure-cmake.sh +++ b/scripts/travis/configure-cmake.sh @@ -19,7 +19,7 @@ fi if $WITH_CUDA ; then # Only build SM50 - ARGS="$ARGS -DCPU_ONLY=Off -DCUDA_ARCH_NAME=Manual -DCUDA_ARCH_BIN=\"50\" -DCUDA_ARCH_PTX=\"\"" + ARGS="$ARGS -DCUDA_ARCH_NAME=Manual -DCUDA_ARCH_BIN=\"50\" -DCUDA_ARCH_PTX=\"\"" fi if $WITH_CUDNN ; then diff --git a/src/caffe/layers/axpy_layer.cpp b/src/caffe/layers/axpy_layer.cpp new file mode 100644 index 00000000000..a672f0ffc4a --- /dev/null +++ b/src/caffe/layers/axpy_layer.cpp @@ -0,0 +1,90 @@ +/* + * Axpy Layer + * + * Created on: May 1, 2017 + * Author: hujie + */ + +#include "caffe/layers/axpy_layer.hpp" + +namespace caffe { + +template +void AxpyLayer::Reshape(const vector& bottom, + const vector& top) { + CHECK_EQ(bottom[0]->shape(0), bottom[1]->shape(0)); + CHECK_EQ(bottom[0]->shape(1), bottom[1]->shape(1)); + if (bottom[0]->num_axes() == 4) { + CHECK_EQ(bottom[0]->shape(2), 1); + CHECK_EQ(bottom[0]->shape(3), 1); + } + CHECK(bottom[1]->shape() == bottom[2]->shape()); + top[0]->ReshapeLike(*bottom[1]); + int spatial_dim = bottom[1]->count(2); + if (spatial_sum_multiplier_.count() < spatial_dim) { + spatial_sum_multiplier_.Reshape(vector(1, spatial_dim)); + caffe_set(spatial_dim, Btype(1), + spatial_sum_multiplier_.mutable_cpu_data()); + } +} + +template +void AxpyLayer::Forward_cpu(const vector& bottom, + const vector& top) { + int channel_dim = bottom[1]->channels(); + int spatial_dim = bottom[1]->count(2); + const Ftype* scale_data = bottom[0]->cpu_data(); + const Ftype* x_data = bottom[1]->cpu_data(); + Ftype* top_data = top[0]->mutable_cpu_data(); + caffe_copy(bottom[2]->count(), bottom[2]->cpu_data(), top_data); + for (int n = 0; n < bottom[1]->num(); ++n) { + for (int c = 0; c < channel_dim; ++c) { + int scale_offset = n * channel_dim + c; + caffe_axpy(spatial_dim, scale_data[scale_offset], + x_data + scale_offset * spatial_dim, + top_data + scale_offset * spatial_dim); + } + } +} + +template +void AxpyLayer::Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + const int count = top[0]->count(); + const Btype* top_diff = top[0]->cpu_diff(); + if (propagate_down[0]) { + int spatial_dim = bottom[1]->count(2); + const Btype* x_data = bottom[1]->cpu_data(); + Btype* x_diff = bottom[1]->mutable_cpu_diff(); + Btype* scale_diff = bottom[0]->mutable_cpu_diff(); + caffe_mul(count, top_diff, x_data, x_diff); + caffe_set(bottom[0]->count(), Btype(0), scale_diff); + caffe_cpu_gemv(CblasNoTrans, bottom[0]->count(), spatial_dim, Btype(1), + x_diff, spatial_sum_multiplier_.cpu_data(), Btype(1), scale_diff); + if (!propagate_down[1]) { + caffe_set(bottom[1]->count(), Btype(0), x_diff); + } + } + if (propagate_down[0]) { + int channel_dim = bottom[1]->channels(); + int spatial_dim = bottom[1]->count(2); + const Btype* scale_data = bottom[0]->cpu_data(); + Btype* x_diff = bottom[1]->mutable_cpu_diff(); + for (int n = 0; n < bottom[1]->num(); ++n) { + for (int c = 0; c < channel_dim; ++c) { + int scale_offset = n * channel_dim + c; + caffe_cpu_scale(spatial_dim, scale_data[scale_offset], + top_diff + scale_offset * spatial_dim, + x_diff + scale_offset * spatial_dim); + } + } + } + if (propagate_down[2]) { + caffe_copy(count, top_diff, bottom[2]->mutable_cpu_diff()); + } +} + +INSTANTIATE_CLASS_FB(AxpyLayer); +REGISTER_LAYER_CLASS(Axpy); + +} // namespace diff --git a/src/caffe/layers/axpy_layer.cu b/src/caffe/layers/axpy_layer.cu new file mode 100644 index 00000000000..04cba231c20 --- /dev/null +++ b/src/caffe/layers/axpy_layer.cu @@ -0,0 +1,94 @@ +/* + * Axpy Layer + * + * Created on: May 1, 2017 + * Author: hujie + */ + +#include "caffe/layers/axpy_layer.hpp" + +namespace caffe { + +template +__global__ void AxpyForward(const int count, const int spatial_dim, + const Dtype* scale_data, const Dtype* x_data, const Dtype* y_data, + Dtype* out_data) { + CUDA_KERNEL_LOOP(index, count) { + out_data[index] = scale_data[index / spatial_dim] * x_data[index] + + y_data[index]; + } +} + +template +void AxpyLayer::Forward_gpu( + const vector& bottom, const vector& top) { + const Ftype* scale_data = bottom[0]->gpu_data(); + const Ftype* x_data = bottom[1]->gpu_data(); + const Ftype* y_data = bottom[2]->gpu_data(); + Ftype* out_data = top[0]->mutable_gpu_data(); + const int count = bottom[1]->count(); + AxpyForward<<>>( + count, bottom[1]->count(2), scale_data, x_data, y_data, out_data); +} + +template +__global__ void AxpyBackwardScale(const int outer_num, const int spatial_dim, + const Dtype* x_data, const Dtype* top_diff, Dtype* scale_diff) { + __shared__ Dtype buffer[CAFFE_CUDA_NUM_THREADS]; + unsigned int tid = threadIdx.x; + buffer[tid] = 0; + __syncthreads(); + + for (int j = tid; j < spatial_dim; j += blockDim.x) { + int offset = blockIdx.x * spatial_dim + j; + buffer[tid] += top_diff[offset] * x_data[offset]; + } + __syncthreads(); + + for (int i = blockDim.x / 2; i > 0; i >>= 1) { + if (tid < i) { + buffer[threadIdx.x] += buffer[threadIdx.x + i]; + } + __syncthreads(); + } + + if (tid == 0) { + scale_diff[blockIdx.x] = buffer[0]; + } +} + +template +__global__ void AxpyBackwardX(const int count, const int spatial_dim, + const Dtype* scale_data, const Dtype* top_diff, Dtype* out) { + CUDA_KERNEL_LOOP(index, count) { + out[index] = scale_data[index / spatial_dim] * top_diff[index]; + } +} + +template +void AxpyLayer::Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom) { + const int count = top[0]->count(); + const Btype* top_diff = top[0]->gpu_diff(); + if (propagate_down[0]) { + int outer_num = bottom[1]->count(0, 2); + AxpyBackwardScale<<>>( + outer_num, bottom[1]->count(2), + bottom[1]->gpu_data(), top_diff, + bottom[0]->mutable_gpu_diff()); + } + if (propagate_down[1]) { + AxpyBackwardX<<>>( + count, top[0]->count(2), + bottom[0]->gpu_data(), top_diff, + bottom[1]->mutable_gpu_diff()); + } + if (propagate_down[2]) { + caffe_copy(count, top_diff, bottom[2]->mutable_gpu_diff()); + } + CUDA_POST_KERNEL_CHECK; +} + +INSTANTIATE_LAYER_GPU_FUNCS_FB(AxpyLayer); + +} // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 878bb075c75..fe47e3cd1c0 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -68,6 +68,7 @@ void ImageDataLayer::DataLayerSetUp(const vector& bottom, const string &source = image_data_param.source(); LOG(INFO) << "Opening file " << source; std::ifstream infile(source.c_str()); + CHECK(infile.good()) << "File " << source; string filename; int label; while (infile >> filename >> label) { From 9f176c41af9bc39efcfbdccca8e5885c1104a2b6 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Fri, 2 Mar 2018 00:58:13 -0800 Subject: [PATCH 19/42] axpy --- include/caffe/layers/axpy_layer.hpp | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 include/caffe/layers/axpy_layer.hpp diff --git a/include/caffe/layers/axpy_layer.hpp b/include/caffe/layers/axpy_layer.hpp new file mode 100644 index 00000000000..908206cbea8 --- /dev/null +++ b/include/caffe/layers/axpy_layer.hpp @@ -0,0 +1,60 @@ +/* + * Axpy Layer + * + * Created on: May 1, 2017 + * Author: hujie + */ + +#ifndef CAFFE_AXPY_LAYER_HPP_ +#define CAFFE_AXPY_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" + +namespace caffe { + +/** + * @brief For reduce memory and time both on training and testing, we combine + * channel-wise scale operation and element-wise addition operation + * into a single layer called "axpy". + * + */ +template +class AxpyLayer: public Layer { + public: + explicit AxpyLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector& bottom, const vector& top) {} + virtual void Reshape(const vector& bottom, const vector& top); + + virtual inline const char* type() const { return "Axpy"; } + virtual inline int ExactNumBottomBlobs() const { return 3; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: +/** + * @param Formulation: + * F = a * X + Y + * Shape info: + * a: N x C --> bottom[0] + * X: N x C x H x W --> bottom[1] + * Y: N x C x H x W --> bottom[2] + * F: N x C x H x W --> top[0] + */ + virtual void Forward_cpu(const vector& bottom, + const vector& top); + virtual void Forward_gpu(const vector& bottom, + const vector& top); + virtual void Backward_cpu(const vector& top, + const vector& propagate_down, const vector& bottom); + virtual void Backward_gpu(const vector& top, + const vector& propagate_down, const vector& bottom); + + TBlob spatial_sum_multiplier_; +}; + +} // namespace caffe + +#endif // CAFFE_AXPY_LAYER_HPP_ From 30f1c080ba261b1518007ef65e2b5955f9f78b2b Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Fri, 2 Mar 2018 16:36:17 -0800 Subject: [PATCH 20/42] Axpy fix --- src/caffe/layers/axpy_layer.cu | 23 +++++++++++++++++------ src/caffe/util/math_functions.cu | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/caffe/layers/axpy_layer.cu b/src/caffe/layers/axpy_layer.cu index 04cba231c20..31bddbe1094 100644 --- a/src/caffe/layers/axpy_layer.cu +++ b/src/caffe/layers/axpy_layer.cu @@ -5,6 +5,9 @@ * Author: hujie */ +#include +#include "caffe/util/half.cuh" +#include "caffe/util/gpu_math_functions.cuh" #include "caffe/layers/axpy_layer.hpp" namespace caffe { @@ -27,14 +30,17 @@ void AxpyLayer::Forward_gpu( const Ftype* y_data = bottom[2]->gpu_data(); Ftype* out_data = top[0]->mutable_gpu_data(); const int count = bottom[1]->count(); - AxpyForward<<>>( - count, bottom[1]->count(2), scale_data, x_data, y_data, out_data); + cudaStream_t stream = Caffe::thread_stream(); + AxpyForward<<>>( + count, bottom[1]->count(2), scale_data, x_data, y_data, out_data); + CUDA_CHECK(cudaStreamSynchronize(stream)); } template __global__ void AxpyBackwardScale(const int outer_num, const int spatial_dim, const Dtype* x_data, const Dtype* top_diff, Dtype* scale_diff) { - __shared__ Dtype buffer[CAFFE_CUDA_NUM_THREADS]; + __shared__ char axpy_buffer[CAFFE_CUDA_NUM_THREADS * sizeof(Dtype)]; + Dtype* buffer = reinterpret_cast(axpy_buffer); unsigned int tid = threadIdx.x; buffer[tid] = 0; __syncthreads(); @@ -71,22 +77,27 @@ void AxpyLayer::Backward_gpu(const vector& top, const int count = top[0]->count(); const Btype* top_diff = top[0]->gpu_diff(); if (propagate_down[0]) { + cudaStream_t stream = Caffe::thread_stream(); int outer_num = bottom[1]->count(0, 2); - AxpyBackwardScale<<>>( + AxpyBackwardScale<<>>( outer_num, bottom[1]->count(2), bottom[1]->gpu_data(), top_diff, bottom[0]->mutable_gpu_diff()); + CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } if (propagate_down[1]) { - AxpyBackwardX<<>>( + cudaStream_t stream = Caffe::thread_stream(); + AxpyBackwardX<<>>( count, top[0]->count(2), bottom[0]->gpu_data(), top_diff, bottom[1]->mutable_gpu_diff()); + CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } if (propagate_down[2]) { caffe_copy(count, top_diff, bottom[2]->mutable_gpu_diff()); } - CUDA_POST_KERNEL_CHECK; } INSTANTIATE_LAYER_GPU_FUNCS_FB(AxpyLayer); diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index f46450e59b4..12563b795e7 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -2,7 +2,6 @@ #include #include "caffe/util/half.cuh" -//#include "caffe/common.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/gpu_math_functions.cuh" #include "caffe/type.hpp" @@ -332,6 +331,7 @@ void gpu_dot_kernel(const int N, const Dtype* x, const Dtype* y, Mtype* out) { Mtype cache[CAFFE_CUDA_NUM_THREADS]; const int tidx = threadIdx.x; cache[tidx] = 0.; + __syncthreads(); for (int i = tidx; i < N; i += blockDim.x) { cache[tidx] += static_cast(x[i]) * static_cast(y[i]); } From 9069d8d020cd3d7851dcecbca6d05f954797b70a Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 6 Mar 2018 19:52:55 -0800 Subject: [PATCH 21/42] SE Nets support --- models/modelBuilder/build_resnet.py | 18 +++++++++++++ models/modelBuilder/layers.py | 40 ++++++++++++++++++++++++++--- src/caffe/parallel.cpp | 11 +++++--- src/caffe/solver.cpp | 3 +++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/models/modelBuilder/build_resnet.py b/models/modelBuilder/build_resnet.py index 27be766dd82..49995df52f5 100755 --- a/models/modelBuilder/build_resnet.py +++ b/models/modelBuilder/build_resnet.py @@ -163,5 +163,23 @@ def main(): fp = open("resnet_50.prototxt", 'w') fp.write(model) + netConfig = numpy.matrix([ + [ 64, 3, 1, 0], + [128, 4, 1, 1], + [256, 23, 1, 1], + [512, 3, 1, 1]]) + model = buildResidualModel(netConfig, name="Resnet101", net_type="large") + fp = open("resnet_101.prototxt", 'w') + fp.write(model) + + netConfig = numpy.matrix([ + [ 64, 3, 1, 0], + [128, 8, 1, 1], + [256, 36, 1, 1], + [512, 3, 1, 1]]) + model = buildResidualModel(netConfig, name="Resnet152", net_type="large") + fp = open("resnet_152.prototxt", 'w') + fp.write(model) + if __name__ == '__main__': main() diff --git a/models/modelBuilder/layers.py b/models/modelBuilder/layers.py index 068d66ef3ee..c07a6bfa7e2 100755 --- a/models/modelBuilder/layers.py +++ b/models/modelBuilder/layers.py @@ -15,6 +15,33 @@ def addHeader(model, name): #------------------------------------------------------------------------------ +def addSigmoid(model, name, bottom): + layer = ''' +layer {{ + name: "{name}" + type: "Sigmoid" + bottom: "{bottom}" + top: "{top}" +}}'''.format(name=name, bottom=bottom, top=bottom) + model += layer + return model, bottom + + +def addAxpy(model, name, bottom_1, bottom_2, bottom_3): + layer = ''' +layer {{ + name: "{name}" + type: "Axpy" + bottom: "{bottom_1}" + bottom: "{bottom_2}" + bottom: "{bottom_3}" + top: "{top}" +}}'''.format(name=name, bottom_1=bottom_1, bottom_2=bottom_2, bottom_3=bottom_3, top=name) + top = name + model += layer + return model, top + + def addData(model, train_batch=32, test_batch=32, train_file="examples/imagenet/ilsvrc12_train_lmdb", test_file = "examples/imagenet/ilsvrc12_val_lmdb", @@ -337,7 +364,7 @@ def addConvBnSelu(model, name, bottom, num_output, #--------------------------------------------------------------------------------- -def addPool(model, name, bottom, kernel_size, stride, pool_type, pad=0): +def addPool(model, name, bottom, kernel_size, stride, pool_type, pad=0, global_pooling=False): layer = ''' layer {{ @@ -346,9 +373,11 @@ def addPool(model, name, bottom, kernel_size, stride, pool_type, pad=0): bottom: "{bottom}" top: "{top}" pooling_param {{ - pool: {pool_type} - kernel_size: {kernel_size}\n'''.format(name=name, top=name, bottom=bottom, - pool_type=pool_type, kernel_size=kernel_size) + pool: {pool_type}'''.format(name=name, top=name, bottom=bottom, + pool_type=pool_type) + + if (kernel_size > 0): + layer += ''' kernel_size: {kernel_size}\n'''.format(kernel_size=kernel_size) if (stride>1): layer += ''' stride: {}\n'''.format(stride) @@ -356,6 +385,9 @@ def addPool(model, name, bottom, kernel_size, stride, pool_type, pad=0): if (pad>0): layer += ''' pad: {}\n'''.format(pad) + if (global_pooling): + layer += ''' global_pooling: true\n''' + layer+=''' }\n}''' model += layer return model, name diff --git a/src/caffe/parallel.cpp b/src/caffe/parallel.cpp index 9dbbfbadb73..fbd56364ab2 100644 --- a/src/caffe/parallel.cpp +++ b/src/caffe/parallel.cpp @@ -160,14 +160,17 @@ void P2PSync::on_start(const vector>& net) { CHECK_EQ(count, nranks_); for (int i = 0; i < net.size(); ++i) { Blob* param = net[i].get(); + const Type param_type = param->data_type(); + const int type_id = solver_->net()->learnable_types()[0] == param_type ? 0 : 1; + reduce_barrier(type_id); NCCL_CHECK(ncclBcast(param->current_mutable_data_memory(true), even(param->count()), - nccl::nccl_type(param->data_type()), + nccl::nccl_type(param_type), 0, nccl_comm_, - comm_stream(0))); - CUDA_CHECK(cudaStreamSynchronize(comm_stream(0))); - reduce_barrier(0); + comm_stream(type_id))); + CUDA_CHECK(cudaStreamSynchronize(comm_stream(type_id))); + reduce_barrier(type_id); } #endif // USE_NCCL } diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 644e55afbfd..126b5d3cd4e 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -206,6 +206,9 @@ void Solver::Step(int iters) { net_->InitializeLearnableDiffSpace(type_id); } } + for (auto b : net_->learnable_params_mapped()) { + b->current_mutable_data_memory(true); + } if (solver_count > 1) { // we need to sync all threads before starting, otherwise some cuda init, From 4d386cdad3db71a5896edc68a353526e76658159 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Thu, 8 Mar 2018 14:58:43 -0800 Subject: [PATCH 22/42] Fix for cuDNN bad param --- include/caffe/layers/cudnn_conv_layer.hpp | 5 ++++- src/caffe/layers/cudnn_conv_layer.cu | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/caffe/layers/cudnn_conv_layer.hpp b/include/caffe/layers/cudnn_conv_layer.hpp index 2a79e127f99..3c0e9689899 100644 --- a/include/caffe/layers/cudnn_conv_layer.hpp +++ b/include/caffe/layers/cudnn_conv_layer.hpp @@ -41,6 +41,7 @@ class CuDNNConvolutionLayer : public ConvolutionLayer { static constexpr int MAX_PARALLEL_GROUPS = Caffe::MAX_CONV_GROUPS; static constexpr int REQUEST_ALGO_COUNT = 1; static constexpr int ATTEMPTS_TO_RESERVE_WS = 3; + static constexpr int REALLOC_COUNT = 3; static std::mutex m_; static ThreadSafeMap> train_mem_req_all_grps_; @@ -107,7 +108,7 @@ class CuDNNConvolutionLayer : public ConvolutionLayer { return fwd_count_ < 2UL; } bool ok_to_release() const { - return bwd_count_ == 3UL; + return bwd_count_ == REALLOC_COUNT; } void FindExConvAlgo(const vector& bottom, const vector& top); @@ -162,6 +163,8 @@ template constexpr int CuDNNConvolutionLayer::REQUEST_ALGO_COUNT; template constexpr int CuDNNConvolutionLayer::ATTEMPTS_TO_RESERVE_WS; +template +constexpr int CuDNNConvolutionLayer::REALLOC_COUNT; template std::mutex CuDNNConvolutionLayer::m_; diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 5a898662692..6727b0e8922 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -12,6 +12,9 @@ template void CuDNNConvolutionLayer::Forward_gpu(const vector& bottom, const vector& top) { const Ftype* weight = this->blobs_[0]->template gpu_data(); + if (fwd_count_ <= REALLOC_COUNT) { + AllocateWorkspace(bottom.size()); + } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { for (int i = 0; i < bottom.size(); ++i) { @@ -80,6 +83,9 @@ template void CuDNNConvolutionLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { propagate_down_ = propagate_down; + if (bwd_count_ <= REALLOC_COUNT) { + AllocateWorkspace(bottom.size()); + } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { // compute dE/dB = sum_c(dE/dy) From 008c3fa089cf0fc46d4a388a17c64c4218f0d2c3 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Thu, 8 Mar 2018 20:15:00 -0800 Subject: [PATCH 23/42] Fix alloc for small batches --- include/caffe/layers/cudnn_conv_layer.hpp | 29 +++--------- src/caffe/layers/cudnn_conv_layer.cpp | 56 ++++++++++++----------- src/caffe/layers/cudnn_conv_layer.cu | 6 --- src/caffe/util/gpu_memory.cpp | 4 +- 4 files changed, 37 insertions(+), 58 deletions(-) diff --git a/include/caffe/layers/cudnn_conv_layer.hpp b/include/caffe/layers/cudnn_conv_layer.hpp index 3c0e9689899..70783ae4b4a 100644 --- a/include/caffe/layers/cudnn_conv_layer.hpp +++ b/include/caffe/layers/cudnn_conv_layer.hpp @@ -42,11 +42,10 @@ class CuDNNConvolutionLayer : public ConvolutionLayer { static constexpr int REQUEST_ALGO_COUNT = 1; static constexpr int ATTEMPTS_TO_RESERVE_WS = 3; static constexpr int REALLOC_COUNT = 3; - static std::mutex m_; - static ThreadSafeMap> train_mem_req_all_grps_; - static ThreadSafeMap> test_mem_req_all_grps_; - static ThreadSafeMap> train_tmp_weights_mem_; + static std::atomic train_mem_req_all_grps_; + static std::atomic test_mem_req_all_grps_; + static std::atomic train_tmp_weights_mem_; public: explicit CuDNNConvolutionLayer(const LayerParameter& param) @@ -167,27 +166,11 @@ template constexpr int CuDNNConvolutionLayer::REALLOC_COUNT; template -std::mutex CuDNNConvolutionLayer::m_; -//template -//ThreadSafeMap> -//CuDNNConvolutionLayer::ws_allocated_( -// CuDNNConvolutionLayer::m_); -//template -//ThreadSafeMap> -//CuDNNConvolutionLayer::ws_released_( -// CuDNNConvolutionLayer::m_); +std::atomic CuDNNConvolutionLayer::train_mem_req_all_grps_; template -ThreadSafeMap> -CuDNNConvolutionLayer::train_mem_req_all_grps_( - CuDNNConvolutionLayer::m_); +std::atomic CuDNNConvolutionLayer::test_mem_req_all_grps_; template -ThreadSafeMap> -CuDNNConvolutionLayer::test_mem_req_all_grps_( - CuDNNConvolutionLayer::m_); -template -ThreadSafeMap> -CuDNNConvolutionLayer::train_tmp_weights_mem_( - CuDNNConvolutionLayer::m_); +std::atomic CuDNNConvolutionLayer::train_tmp_weights_mem_; #endif diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index db1a8649039..a6263167613 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -158,8 +158,8 @@ void CuDNNConvolutionLayer::LayerSetUp( } if (this->phase_ == TRAIN) { - train_tmp_weights_mem_.insert_max(Caffe::current_device(), - align_up<7>(this->weight_offset_ * tsize(tpmax()))); + atomic_maximum(train_tmp_weights_mem_, + align_up<8>(this->weight_offset_ * tsize(tpmax()))); } // Create tensor descriptor(s) for data and corresponding convolution(s). @@ -240,21 +240,21 @@ void CuDNNConvolutionLayer::AllocateFindExWorkspace() { GPUMemory::GetInfo(&bytes_available, &bytes_total, true); bytes_available = std::min(bytes_available + ws->size(), bytes_total / 2UL); - const size_t tmp_weights_size = train_tmp_weights_mem_[dev]; + const size_t tmp_weights_size = train_tmp_weights_mem_.load(); if (bytes_available > tmp_weights_size) { bytes_available -= tmp_weights_size; } else { bytes_available = 0UL; } // 2+ pages => reallocate - size_t req_bytes = align_down<7>(bytes_available > 2UL * PAGE_SIZE ? + size_t req_bytes = align_down<8>(bytes_available > 2UL * PAGE_SIZE ? bytes_available - 2UL * PAGE_SIZE : 0UL); if (static_cast(req_bytes) <= PAGE_SIZE) { return; } int attempts = ATTEMPTS_TO_RESERVE_WS; while (!ws->try_reserve(req_bytes) && attempts > 0) { - req_bytes = align_down<7>(req_bytes > PAGE_SIZE ? req_bytes - PAGE_SIZE : 0UL); + req_bytes = align_down<8>(req_bytes > PAGE_SIZE ? req_bytes - PAGE_SIZE : 0UL); --attempts; LOG(INFO) << this->print_current_device() << " Retrying to allocate " << req_bytes << " bytes, attempts left: " << attempts; @@ -282,20 +282,20 @@ size_t CuDNNConvolutionLayer::AllocateWorkspace(size_t bottom_size for (int i = 0; i < bottom_size; ++i) { if (this->phase_ == TRAIN) { - train_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_bwd_data_sizes_[i]) * ws_groups()); - train_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_bwd_filter_sizes_[i]) * ws_groups()); - train_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_fwd_sizes_[i]) * ws_groups()); + atomic_maximum(train_mem_req_all_grps_, + align_up<8>(workspace_bwd_data_sizes_[i]) * ws_groups()); + atomic_maximum(train_mem_req_all_grps_, + align_up<8>(workspace_bwd_filter_sizes_[i]) * ws_groups()); + atomic_maximum(train_mem_req_all_grps_, + align_up<8>(workspace_fwd_sizes_[i]) * ws_groups()); } else { - test_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_fwd_sizes_[i]) * ws_groups()); + atomic_maximum(test_mem_req_all_grps_, + align_up<8>(workspace_fwd_sizes_[i]) * ws_groups()); } } shared_ptr& ws = GPUMemory::workspace_[dev]; ws->safe_reserve(this->phase_ == TRAIN ? - train_mem_req_all_grps_[dev] : test_mem_req_all_grps_[dev]); + train_mem_req_all_grps_.load() : test_mem_req_all_grps_.load()); return ws->size(); } @@ -449,6 +449,8 @@ void CuDNNConvolutionLayer::Reshape( default: LOG(FATAL) << "Wrong value for cudnn_convolution_algo_seeker"; } + } else { + AllocateWorkspace(bottom.size()); } } @@ -462,14 +464,14 @@ void CuDNNConvolutionLayer::GetConvAlgo(const vector& botto CUDNN_CHECK(cudnnGetConvolutionBackwardDataAlgorithm(Caffe::cudnn_handle(0), bwd_filter_desc_, bwd_top_descs_[i], bwd_conv_data_descs_[i], bwd_bottom_descs_[i], CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT, - align_down<7>(workspace_bytes / ws_groups()), &bwd_data_algo_[i])); + align_down<8>(workspace_bytes / ws_groups()), &bwd_data_algo_[i])); } // Get forward algorithm (if not set by user) if (user_algos_override_[0] < 0) { CUDNN_CHECK(cudnnGetConvolutionForwardAlgorithm(Caffe::cudnn_handle(0), fwd_bottom_descs_[i], fwd_filter_desc_, fwd_conv_descs_[i], fwd_top_descs_[i], CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT, - align_down<7>(workspace_bytes / ws_groups()), &fwd_algo_[i])); + align_down<8>(workspace_bytes / ws_groups()), &fwd_algo_[i])); CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream(0))); } // Get backward filter algorithm (if not set by user) @@ -477,7 +479,7 @@ void CuDNNConvolutionLayer::GetConvAlgo(const vector& botto CUDNN_CHECK(cudnnGetConvolutionBackwardFilterAlgorithm(Caffe::cudnn_handle(0), bwd_bottom_descs_[i], bwd_top_descs_[i], bwd_conv_filter_descs_[i], bwd_filter_desc_, CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT, - align_down<7>(workspace_bytes / ws_groups()), &bwd_filter_algo_[i])); + align_down<8>(workspace_bytes / ws_groups()), &bwd_filter_algo_[i])); CUDA_CHECK(cudaStreamSynchronize(Caffe::thread_stream(0))); } LOG(INFO) << Phase_Name(this->phase_) @@ -594,11 +596,11 @@ void CuDNNConvolutionLayer::FindExConvAlgo( #endif workspace_fwd_sizes_[i] = fwd_results[k].memory; if (this->phase_ == TRAIN) { - train_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_fwd_sizes_[i]) * ws_groups()); + atomic_maximum(train_mem_req_all_grps_, + align_up<8>(workspace_fwd_sizes_[i]) * ws_groups()); } else { - test_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_fwd_sizes_[i]) * ws_groups()); + atomic_maximum(test_mem_req_all_grps_, + align_up<8>(workspace_fwd_sizes_[i]) * ws_groups()); } fwd_pseudo = is_precise(forward_math_) && !is_precise(tp()); break; @@ -625,7 +627,7 @@ void CuDNNConvolutionLayer::FindExConvAlgo( } #endif if (user_algos_override_[2] < 0) { - const size_t tmp_weights_size = train_tmp_weights_mem_[dev]; + const size_t tmp_weights_size = train_tmp_weights_mem_.load(); shared_ptr& tmp_ws = GPUMemory::weights_workspace_[dev]; tmp_ws->safe_reserve(tmp_weights_size); float algo_time = 0.F; @@ -694,8 +696,8 @@ void CuDNNConvolutionLayer::FindExConvAlgo( } #endif workspace_bwd_filter_sizes_[i] = bwd_filter_results[k].memory; - train_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_bwd_filter_sizes_[i]) * ws_groups()); + atomic_maximum(train_mem_req_all_grps_, + align_up<8>(workspace_bwd_filter_sizes_[i]) * ws_groups()); bwd_filter_pseudo = is_precise(backward_filter_math_) && !is_precise(tp()); bftime = bwd_filter_results[k].time; break; @@ -787,8 +789,8 @@ void CuDNNConvolutionLayer::FindExConvAlgo( } #endif workspace_bwd_data_sizes_[i] = bwd_data_results[k].memory; - train_mem_req_all_grps_.insert_max(dev, - align_up<7>(workspace_bwd_data_sizes_[i]) * ws_groups()); + atomic_maximum(train_mem_req_all_grps_, + align_up<8>(workspace_bwd_data_sizes_[i]) * ws_groups()); bwd_data_pseudo = is_precise(backward_data_math_) && !is_precise(tp()); bdtime = bwd_data_results[k].time; break; @@ -843,7 +845,7 @@ void CuDNNConvolutionLayer::FindExConvAlgo( os << "\t(avail " << mem_fmt(available_memory) << ", req " << mem_fmt(this->phase_ == TRAIN ? - train_mem_req_all_grps_[dev] : test_mem_req_all_grps_[dev]) + train_mem_req_all_grps_.load() : test_mem_req_all_grps_.load()) << ")\tt: " << f_round2(ftime); if (this->phase_ == TRAIN) { diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 6727b0e8922..5a898662692 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -12,9 +12,6 @@ template void CuDNNConvolutionLayer::Forward_gpu(const vector& bottom, const vector& top) { const Ftype* weight = this->blobs_[0]->template gpu_data(); - if (fwd_count_ <= REALLOC_COUNT) { - AllocateWorkspace(bottom.size()); - } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { for (int i = 0; i < bottom.size(); ++i) { @@ -83,9 +80,6 @@ template void CuDNNConvolutionLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { propagate_down_ = propagate_down; - if (bwd_count_ <= REALLOC_COUNT) { - AllocateWorkspace(bottom.size()); - } shared_ptr& ws = GPUMemory::workspace_[Caffe::current_device()]; if (use_v7grouping()) { // compute dE/dB = sum_c(dE/dy) diff --git a/src/caffe/util/gpu_memory.cpp b/src/caffe/util/gpu_memory.cpp index 2446f84c271..516f1cd141f 100644 --- a/src/caffe/util/gpu_memory.cpp +++ b/src/caffe/util/gpu_memory.cpp @@ -49,9 +49,9 @@ bool GPUMemory::Workspace::safe_reserve(size_t size, int device) { } size_t gpu_bytes_left, total_memory; GPUMemory::GetInfo(&gpu_bytes_left, &total_memory, true); - if (size > size_ + align_down<7>(gpu_bytes_left)) { + if (size > size_ + align_down<8>(gpu_bytes_left)) { LOG(FATAL) << "Out of memory in safe_reserve: " - << size << " > " << size_ << " + " << align_down<7>(gpu_bytes_left) + << size << " > " << size_ << " + " << align_down<8>(gpu_bytes_left) << " on device " << device; return false; } From 3caaba847b027685cc46038034145f97dc3c116d Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Thu, 8 Mar 2018 23:56:21 -0800 Subject: [PATCH 24/42] SE builder --- models/modelBuilder/build_se_resnet.py | 135 +++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100755 models/modelBuilder/build_se_resnet.py diff --git a/models/modelBuilder/build_se_resnet.py b/models/modelBuilder/build_se_resnet.py new file mode 100755 index 00000000000..623eb778f07 --- /dev/null +++ b/models/modelBuilder/build_se_resnet.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# ref: Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun -- "Deep Residual Learning for Image Recognition" +# https://arxiv.org/pdf/1512.03385v1.pdf +# +# ref: By Jie Hu, Li Shen, Gang Sun -- "Squeeze-and-Excitation Networks" +# https://arxiv.org/pdf/1709.01507.pdf + +import numpy +from layers import * + +#------------------------------------------------------------------------------ +def addSEBlock(model, name, bottom, num_output, reduction=1): + + model, top = addPool(model=model, name='{}.global_pool'.format(name), bottom=bottom, pool_type="AVE", kernel_size=0, stride=1, global_pooling=True) + + model, top = addConvRelu(model=model, name='{}.conv_down'.format(name), bottom=top, num_output=num_output//reduction, kernel_size=1) + model, top = addConv(model=model, name='{}.conv_up'.format(name), bottom=top, num_output=num_output, kernel_size=1) + model, top = addSigmoid(model=model, name='{}.prob'.format(name), bottom=top) + return model, top + +#------------------------------------------------------------------------------ +def addSERes(model, name , bottom, num_output, group, j, fix_dim, dilation = False): + + prefix="{name}.{j}.".format(name=name,j=str(j)) + block="" + block, top = addConvBnRelu(model=block, name='{}conv1'.format(prefix), bottom=bottom, num_output=num_output, + kernel_size=1, group=1, stride=2 if (fix_dim and (j==1)) else 1, pad=0) + block, top = addConvBnRelu(model=block, name='{}conv2'.format(prefix), bottom=top, num_output=num_output, + kernel_size=3, group=group, stride=1, pad=1) + block, top = addConvBn(model=block, name='{}conv3'.format(prefix), bottom=top, num_output=(num_output * 4), + kernel_size=1, group=1, stride=1, pad=0) + + block, se_top = addSEBlock(model=block, name='{}se'.format(prefix), bottom=top, num_output=(num_output*4), reduction=16) + + if (j == 1): + block, res_top = addConvBn(model=block, name='{}skipConv'.format(prefix), bottom=bottom, + num_output=(num_output * 4), + kernel_size=1, group=1, stride=2 if fix_dim else 1, pad=0) + else: + res_top = bottom + + + + block, top = addAxpy(model=block, name='{}axpy'.format(prefix), bottom_1=se_top, bottom_2= top, bottom_3=res_top) + + block, top = addActivation(model=block, name="{}relu".format(prefix), bottom=top) + + model += block + return model, top + +#------------------------------------------------------------------------------ +# [ 64, 3, 1, 0], + +def addResSuperBlock(model, bottom, i, num_subBlocks, num_output, group, fix_dim, net_type, dilation = False): + name = "res{i}".format(i=str(i)) + model = addComment(model, comment=name) + top=bottom + for j in xrange(1, num_subBlocks + 1): + model, top = addSERes(model, name, bottom=top, num_output=num_output, group=group, + j=j, fix_dim=fix_dim, dilation=dilation) + return model, top + +#------------------------------------------------------------------------------ + +def print_netconfig(netConfig): + + header_str=''' +# n: ch\t: s\t: g\t: skip\t:''' + + num_blocks=netConfig.shape[0] + for i in xrange(0, num_blocks): + header_str += ''' +# {i}: {num_outputs}\t: {subblocks}\t: {group}\t: {skip}\t:'''.format( + i=str(i), + num_outputs=str(netConfig[i,0]), + subblocks =str(netConfig[i,1]), + group =str(netConfig[i,2]), + skip =str(netConfig[i,3]) ) + + header_str += "\n" + return header_str + +#------------------------------------------------------------------------------ + +def buildResidualModel(netConfig, name, net_type): + + model = "" + model = addHeader(model, name=name) + model += print_netconfig(netConfig) + print(model) + + train_batch = 128 + test_batch = 32 + model, last_top = addData(model, train_batch, test_batch) + + model, top = addConvBnRelu(model, name="conv1", bottom="data", num_output=64, + kernel_size=7, group=1, stride=2, pad=3) + model, top = addPool(model, name="pool1", bottom=top, + kernel_size=3, stride=2, pool_type="MAX") + + num_blocks = len(netConfig) + for i in xrange(1, num_blocks+1): + num_output = netConfig[i-1,0] + num_subBlocks = netConfig[i-1,1] + group = netConfig[i-1,2] + fix_dim = (netConfig[i-1,3]==1) + bottom=top + model, top = addResSuperBlock(model, bottom, i+1, num_subBlocks, num_output, group, fix_dim, net_type) + + model, top = addPool(model, name="pool2", bottom=top, kernel_size=7, stride=1, pool_type="AVE") +# model, top = addDropout(model, name="dropout", bottom=top, ratio=0.5) + model, top = addFC(model, name="fc", bottom=top, num_output=1000, filler='msra') + + fc_top = top + model, top = addSoftmaxLoss(model, name="loss", bottom_1=fc_top) + model, top = addAccuracy(model, name="accuracy/top-1", bottom_1=fc_top, k=1) + model, top = addAccuracy(model, name="accuracy/top-5", bottom_1=fc_top, k=5) + + return model + +#------------------------------------------------------------------------------ + +def main(): + + netConfig = numpy.matrix([ + [ 64, 3, 1, 0], + [128, 4, 1, 1], + [256, 6, 1, 1], + [512, 3, 1, 1]]) + model = buildResidualModel(netConfig, name="SEResnet50", net_type="large") + fp = open("se_resnet_50.prototxt", 'w') + fp.write(model) + +if __name__ == '__main__': + main() From 000f31fd53164b54f58230bfd6c629823bd47945 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sat, 10 Mar 2018 12:24:23 -0800 Subject: [PATCH 25/42] Queue depth corrected --- src/caffe/data_reader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/data_reader.cpp b/src/caffe/data_reader.cpp index 74005968646..4e23ced613f 100644 --- a/src/caffe/data_reader.cpp +++ b/src/caffe/data_reader.cpp @@ -60,7 +60,7 @@ DataReader::DataReader(const LayerParameter& param, for (size_t i = 0; i < queues_num_; ++i) { full_[i] = make_shared>>(); free_[i] = make_shared>>(); - for (size_t j = 0; j < queue_depth_ - 1U; ++j) { // +1 in InternalThreadEntryN + for (size_t j = 0; j < queue_depth_; ++j) { free_[i]->push(make_shared()); } } From a4497a5ed2980686b7c7b390c0381ee3b90eb925 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Sat, 10 Mar 2018 13:25:13 -0800 Subject: [PATCH 26/42] Tuning --- src/caffe/layers/data_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 56985a6c73e..98447acb675 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -82,7 +82,7 @@ DataLayer::InitializePrefetch() { } else { // in this mode memory demand is O(1) if (batches_fit > 0) { - parsers_num = cache_ ? 1 : 2; + parsers_num = cache_ ? 1 : 3; transf_num = 4; } } From 266096793f1e976734840eb03868a5d1a38fd60e Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 12 Mar 2018 15:26:51 -0700 Subject: [PATCH 27/42] GS enabling fix --- include/caffe/data_reader.hpp | 4 +--- include/caffe/net.hpp | 4 ++-- models/modelBuilder/build_resnet.py | 9 +++++++++ models/modelBuilder/layers.py | 2 +- src/caffe/net.cpp | 1 + src/caffe/util/gpu_memory.cpp | 8 ++++++++ 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/include/caffe/data_reader.hpp b/include/caffe/data_reader.hpp index 9c2fccc48a4..cc53b5c807d 100644 --- a/include/caffe/data_reader.hpp +++ b/include/caffe/data_reader.hpp @@ -122,9 +122,7 @@ class DataReader : public InternalThread { } void free_push(size_t queue_id, const shared_ptr& datum) { - if (!sample_only_) { - free_[queue_id]->push(datum); - } + free_[queue_id]->push(datum); } shared_ptr free_pop(size_t queue_id) { diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 1349c3c0235..d609ed0bcfe 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -281,7 +281,7 @@ class Net { } bool global_grad_scale_enabled() const { - return global_grad_scale_param_ > 1.F; + return has_global_grad_scale_param_ && global_grad_scale_param_ > 0.F; } void update_grad_scale(); @@ -432,7 +432,7 @@ class Net { size_t infer_count_; std::atomic_llong wgrad_sq_; float global_grad_scale_coeff_, global_grad_scale_param_; - bool global_grad_scale_adaptive_; + bool has_global_grad_scale_param_, global_grad_scale_adaptive_; /// Inner net runs on singe GPU (see recurrent layers) const bool inner_net_; diff --git a/models/modelBuilder/build_resnet.py b/models/modelBuilder/build_resnet.py index 49995df52f5..8effdc5e01f 100755 --- a/models/modelBuilder/build_resnet.py +++ b/models/modelBuilder/build_resnet.py @@ -181,5 +181,14 @@ def main(): fp = open("resnet_152.prototxt", 'w') fp.write(model) + netConfig = numpy.matrix([ + [ 64, 3, 1, 0], + [128, 8, 1, 1], + [256, 52, 1, 1], + [512, 3, 1, 1]]) + model = buildResidualModel(netConfig, name="Resnet200", net_type="large") + fp = open("resnet_200.prototxt", 'w') + fp.write(model) + if __name__ == '__main__': main() diff --git a/models/modelBuilder/layers.py b/models/modelBuilder/layers.py index c07a6bfa7e2..6fabb49632f 100755 --- a/models/modelBuilder/layers.py +++ b/models/modelBuilder/layers.py @@ -584,7 +584,7 @@ def addAccuracy(model, name, bottom_1, bottom_2="label", k=1): bottom: "{bottom_2}" top: "{top}" accuracy_param {{ top_k: {k} }} -# include {{ phase: TEST }} + include {{ phase: TEST }} }}'''.format(name=name, top=name, bottom_1=bottom_1, bottom_2=bottom_2, k=k) model += layer return model, name diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 3dad99374b9..e1e7042f770 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -106,6 +106,7 @@ void Net::Init(const NetParameter& in_param) { wgrad_sq_.store(0LL); global_grad_scale_coeff_ = 1.F; + has_global_grad_scale_param_ = in_param.has_global_grad_scale(); global_grad_scale_param_ = in_param.global_grad_scale(); global_grad_scale_adaptive_ = in_param.global_grad_scale_adaptive(); diff --git a/src/caffe/util/gpu_memory.cpp b/src/caffe/util/gpu_memory.cpp index 516f1cd141f..c8c7857f40b 100644 --- a/src/caffe/util/gpu_memory.cpp +++ b/src/caffe/util/gpu_memory.cpp @@ -148,6 +148,14 @@ bool GPUMemory::Manager::try_allocate(void** ptr, size_t size, int device, // Clean Cache & Retry logic is inside now status = cub_allocator_->DeviceAllocate(device, ptr, size, pstream->get(), size_allocated); if (status == cudaSuccess && device > INVALID_DEVICE) { +// if (device == 0) { +// DevInfo dev_info; +// CUDA_CHECK(cudaMemGetInfo(&dev_info.free_, &dev_info.total_)); +// size_t allocated = dev_info.total_ - dev_info.free_; +// size_t pcent = 100UL* allocated / dev_info.total_; +// std::string bar(pcent, '*'); +// std::cout << bar << " " << pcent << "%" << std::endl; +// } if (size_allocated > 0) { if (dev_info_[device].free_ < update_thresholds_[device]) { update_dev_info(device); From 30af06d46510fcbf9a28889a45c89098a13bf11b Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 12 Mar 2018 20:22:56 -0700 Subject: [PATCH 28/42] gil --- python/caffe/_caffe.cpp | 1 + python/caffe/io.py | 2 +- src/caffe/util/bbox_util.cpp | 3 ++- tools/caffe.cpp | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index de733e8dfe6..2c32408314b 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -150,6 +150,7 @@ shared_ptr Net_Init(string param_file, int phase) { // Net construct-and-load convenience constructor shared_ptr Net_Init_Load(string param_file, string pretrained_param_file, int phase) { + PyGILRelease gil; CheckFile(param_file); CheckFile(pretrained_param_file); shared_ptr net(new Net(param_file, static_cast(phase))); diff --git a/python/caffe/io.py b/python/caffe/io.py index 5f933876cc0..dcb24cc31f4 100644 --- a/python/caffe/io.py +++ b/python/caffe/io.py @@ -330,7 +330,7 @@ def resize_image(im, new_dims, interp_order=1): # skimage is fast but only understands {1,3} channel images # in [0, 1]. im_std = (im - im_min) / (im_max - im_min) - resized_std = resize(im_std, new_dims, order=interp_order) + resized_std = resize(im_std, new_dims, mode = 'reflect', order=interp_order) resized_im = resized_std * (im_max - im_min) + im_min else: # the image is a constant -- avoid divide by 0 diff --git a/src/caffe/util/bbox_util.cpp b/src/caffe/util/bbox_util.cpp index b634ebea3bd..5bc50767c3f 100644 --- a/src/caffe/util/bbox_util.cpp +++ b/src/caffe/util/bbox_util.cpp @@ -1816,7 +1816,8 @@ void GetMaxScoreIndex(const Dtype* scores, const int num, const float threshold, // Sort the score pair according to the scores in descending order std::partial_sort( - score_index_vec->begin(), score_index_vec->begin() + top_k, + score_index_vec->begin(), score_index_vec->begin() + + std::min(score_index_vec->size(), (size_t)top_k), score_index_vec->end(), SortScorePairDescend); // Keep top_k scores if needed. diff --git a/tools/caffe.cpp b/tools/caffe.cpp index f1cbe3c7205..48fb6269b5c 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -656,7 +656,7 @@ int main(int argc, char** argv) { #endif return GetBrewFunction(caffe::string(argv[1]))(); #ifdef WITH_PYTHON_LAYER - } catch (bp::error_already_set) { + } catch (bp::error_already_set&) { PyErr_Print(); return 1; } From 4f736fde53587cca0ec31cfa864adaf67c6c3882 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Mon, 12 Mar 2018 21:54:07 -0700 Subject: [PATCH 29/42] Kernel check? --- include/caffe/util/device_alternate.hpp | 3 ++- python/caffe/_caffe.cpp | 2 ++ src/caffe/layers/detection_output_layer.cu | 3 ++- src/caffe/layers/normalize_layer.cpp | 2 +- src/caffe/layers/normalize_layer.cu | 7 +++++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 654d8c31d68..2444bc937c2 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -66,7 +66,8 @@ i += blockDim.x * gridDim.x) // CUDA: check for error after kernel execution and exit loudly if there is one. -#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) +//#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) +#define CUDA_POST_KERNEL_CHECK namespace caffe { diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 2c32408314b..27aeda3743f 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -81,6 +81,7 @@ void set_mode_cpu() { } void set_mode_gpu() { + PyGILRelease gil; Caffe::set_mode(Caffe::GPU); vector gpus(1, 0); initialize_gpu_memory_scope(gpus); @@ -143,6 +144,7 @@ void CheckContiguousArray(PyArrayObject* arr, string name, // Net constructor for passing phase as int shared_ptr Net_Init(string param_file, int phase) { + PyGILRelease gil; CheckFile(param_file); shared_ptr net(new Net(param_file, static_cast(phase))); return net; diff --git a/src/caffe/layers/detection_output_layer.cu b/src/caffe/layers/detection_output_layer.cu index f7fa5e0f42d..1b02185e07f 100644 --- a/src/caffe/layers/detection_output_layer.cu +++ b/src/caffe/layers/detection_output_layer.cu @@ -89,7 +89,8 @@ void DetectionOutputLayer::Forward_gpu( // SortScorePairDescend >); // score_index_pairs.resize(keep_top_k_); std::partial_sort( - score_index_pairs.begin(), score_index_pairs.begin() + keep_top_k_, + score_index_pairs.begin(), score_index_pairs.begin() + + std::min(score_index_pairs.size(), (size_t)keep_top_k_), score_index_pairs.end(), SortScorePairDescend>); // Store the new indices. map > new_indices; diff --git a/src/caffe/layers/normalize_layer.cpp b/src/caffe/layers/normalize_layer.cpp index 2168f28dea6..e11ef1d9795 100644 --- a/src/caffe/layers/normalize_layer.cpp +++ b/src/caffe/layers/normalize_layer.cpp @@ -21,7 +21,7 @@ void NormalizeLayer::LayerSetUp(const vector& bottom, } else { norm_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); } - eps_ = norm_param.eps(); + eps_ = std::max((Dtype)norm_param.eps(), min_dtype()); int channels = bottom[0]->channels(); int spatial_dim = bottom[0]->width() * bottom[0]->height(); sum_channel_multiplier_.Reshape(1, channels, 1, 1); diff --git a/src/caffe/layers/normalize_layer.cu b/src/caffe/layers/normalize_layer.cu index 37a78a15336..fb14c588bb1 100644 --- a/src/caffe/layers/normalize_layer.cu +++ b/src/caffe/layers/normalize_layer.cu @@ -67,6 +67,7 @@ void NormalizeLayer::Forward_gpu(const vector& bottom, int dim = bottom[0]->count() / num; int spatial_dim = bottom[0]->height() * bottom[0]->width(); int channels = bottom[0]->channels(); + cudaStream_t stream = Caffe::thread_stream(); for (int n = 0; n < num; ++n) { caffe_gpu_powx(dim, bottom_data, Dtype(2), buffer_data); if (across_spatial_) { @@ -84,10 +85,11 @@ void NormalizeLayer::Forward_gpu(const vector& bottom, caffe_gpu_powx(spatial_dim, norm_data, Dtype(0.5), norm_data); // scale the layer // NOLINT_NEXT_LINE(whitespace/operators) - DivBsx <<>>( + DivBsx<<>>( dim, bottom_data, norm_data, channels, spatial_dim, CblasNoTrans, top_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); norm_data += spatial_dim; } // scale the output @@ -95,10 +97,11 @@ void NormalizeLayer::Forward_gpu(const vector& bottom, caffe_gpu_scal(dim, scale[0], top_data); } else { // NOLINT_NEXT_LINE(whitespace/operators) - MulBsx <<>>( + MulBsx<<>>( dim, top_data, scale, channels, spatial_dim, CblasTrans, top_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } bottom_data += dim; top_data += dim; From 28d4d0e0420b61d44564dcd0d29302f67c642fae Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 13 Mar 2018 01:20:35 -0700 Subject: [PATCH 30/42] wip --- src/caffe/blob.cpp | 2 +- src/caffe/layers/flatten_layer.cpp | 4 ++++ src/caffe/layers/permute_layer.cu | 6 ++++-- src/caffe/net.cpp | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 522d981489d..e31463d5469 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -75,8 +75,8 @@ void Blob::ShareData(const Blob& other) { return; } CHECK_EQ(count(), other.count()); - data_tensor_ = other.data_tensor_; CHECK(data_type() == other.data_type()); + data_tensor_ = other.data_tensor_; CHECK(is_current_data_valid()); } diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index c5025c27007..18ede195854 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -23,7 +23,11 @@ void FlattenLayer::Reshape(const vector& bottom, top_shape.push_back(bottom[0]->shape(i)); } top[0]->Reshape(top_shape); + bottom[0]->cpu_data(); + top[0]->cpu_data(); CHECK_EQ(top[0]->count(), bottom[0]->count()); + top[0]->ShareData(*bottom[0]); + bottom[0]->ShareDiff(*top[0]); } template diff --git a/src/caffe/layers/permute_layer.cu b/src/caffe/layers/permute_layer.cu index c63f4fa75e6..69c164b91a6 100644 --- a/src/caffe/layers/permute_layer.cu +++ b/src/caffe/layers/permute_layer.cu @@ -32,7 +32,7 @@ template void PermuteLayer::Forward_gpu(const vector& bottom, const vector& top) { if (need_permute_) { - Dtype* bottom_data = bottom[0]->mutable_gpu_data(); + Dtype* bottom_data = const_cast(bottom[0]->gpu_data()); Dtype* top_data = top[0]->mutable_gpu_data(); int count = top[0]->count(); const int* permute_order = permute_order_.gpu_data(); @@ -40,10 +40,12 @@ void PermuteLayer::Forward_gpu(const vector& bottom, const int* old_steps = old_steps_.gpu_data(); bool foward = true; // NOLINT_NEXT_LINE(whitespace/operators) - PermuteKernel<<>>( + cudaStream_t stream = Caffe::thread_stream(); + PermuteKernel<<>>( count, bottom_data, foward, permute_order, old_steps, new_steps, num_axes_, top_data); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } else { // If there is no need to permute, we share data to save memory. top[0]->ShareData(*bottom[0]); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e1e7042f770..abf6bb211c8 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -671,10 +671,28 @@ float Net::ForwardFromTo(int start, int end) { CHECK_LT(end, layers_.size()); float loss = 0; for (int i = start; i <= end; ++i) { + // LOG(INFO) << " ****** [Forward] (" << i << ") Layer '" << layer_names_[i]; // << "' FT " << Type_Name(layers_[i]->forward_type()) // << " BT " << Type_Name(layers_[i]->backward_type()); + + std::cout << " ****** [Forward] (" << i << ") Layer " << layer_names_[i] << std::endl; + + for (int j = 0; bottom_vecs_[i].size() > 0 && + j < std::min(10, bottom_vecs_[i][0]->count()); ++j) { + std::cout << float(bottom_vecs_[i][0]->cpu_data()[j]) << " "; + } + std::cout << std::endl; + float layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); + + for (int j = 0; top_vecs_[i].size() > 0 && + j < std::min(10, top_vecs_[i][0]->count()); ++j) { + std::cout << float(top_vecs_[i][0]->cpu_data()[j]) << " "; + } + std::cout << std::endl; + + loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } } From 3a9fcec91b7918fce80fa87d621774bb05ebf457 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 13 Mar 2018 20:30:34 -0700 Subject: [PATCH 31/42] SSD in PFP16 --- include/caffe/data_reader.hpp | 4 +- include/caffe/layers/multibox_loss_layer.hpp | 12 +-- include/caffe/util/device_alternate.hpp | 3 +- models/VGGNet/coco/SSD_300x300/test.prototxt | 2 +- src/caffe/blob.cpp | 2 +- src/caffe/layers/multibox_loss_layer.cpp | 82 +++++++++++--------- src/caffe/layers/normalize_layer.cu | 71 +++++++++++------ src/caffe/layers/permute_layer.cu | 34 ++++++-- src/caffe/net.cpp | 18 ----- src/caffe/util/bbox_util.cpp | 6 +- 10 files changed, 137 insertions(+), 97 deletions(-) diff --git a/include/caffe/data_reader.hpp b/include/caffe/data_reader.hpp index cc53b5c807d..9c2fccc48a4 100644 --- a/include/caffe/data_reader.hpp +++ b/include/caffe/data_reader.hpp @@ -122,7 +122,9 @@ class DataReader : public InternalThread { } void free_push(size_t queue_id, const shared_ptr& datum) { - free_[queue_id]->push(datum); + if (!sample_only_) { + free_[queue_id]->push(datum); + } } shared_ptr free_pop(size_t queue_id) { diff --git a/include/caffe/layers/multibox_loss_layer.hpp b/include/caffe/layers/multibox_loss_layer.hpp index e6295469189..d7236565a91 100644 --- a/include/caffe/layers/multibox_loss_layer.hpp +++ b/include/caffe/layers/multibox_loss_layer.hpp @@ -57,11 +57,11 @@ class MultiBoxLossLayer : public LossLayer { // top vector holder used in Forward function. vector loc_top_vec_; // blob which stores the matched location prediction. - TBlob loc_pred_; + shared_ptr loc_pred_; // blob which stores the corresponding matched ground truth. - TBlob loc_gt_; + shared_ptr loc_gt_; // localization loss. - TBlob loc_loss_; + shared_ptr loc_loss_; // The internal confidence loss layer. shared_ptr conf_loss_layer_; @@ -71,11 +71,11 @@ class MultiBoxLossLayer : public LossLayer { // top vector holder used in Forward function. vector conf_top_vec_; // blob which stores the confidence prediction. - TBlob conf_pred_; + shared_ptr conf_pred_; // blob which stores the corresponding ground truth label. - TBlob conf_gt_; + shared_ptr conf_gt_; // confidence loss. - TBlob conf_loss_; + shared_ptr conf_loss_; MultiBoxLossParameter multibox_loss_param_; int num_classes_; diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 2444bc937c2..654d8c31d68 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -66,8 +66,7 @@ i += blockDim.x * gridDim.x) // CUDA: check for error after kernel execution and exit loudly if there is one. -//#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) -#define CUDA_POST_KERNEL_CHECK +#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) namespace caffe { diff --git a/models/VGGNet/coco/SSD_300x300/test.prototxt b/models/VGGNet/coco/SSD_300x300/test.prototxt index 56b530e25a1..bd7c91b0041 100644 --- a/models/VGGNet/coco/SSD_300x300/test.prototxt +++ b/models/VGGNet/coco/SSD_300x300/test.prototxt @@ -22,7 +22,7 @@ layer { } data_param { source: "examples/coco/coco_minival_lmdb" - batch_size: 32 #8 + batch_size: 128 #8 backend: LMDB } annotated_data_param { diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index e31463d5469..522d981489d 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -75,8 +75,8 @@ void Blob::ShareData(const Blob& other) { return; } CHECK_EQ(count(), other.count()); - CHECK(data_type() == other.data_type()); data_tensor_ = other.data_tensor_; + CHECK(data_type() == other.data_type()); CHECK(is_current_data_valid()); } diff --git a/src/caffe/layers/multibox_loss_layer.cpp b/src/caffe/layers/multibox_loss_layer.cpp index 62a9b799f59..951b4a54fff 100644 --- a/src/caffe/layers/multibox_loss_layer.cpp +++ b/src/caffe/layers/multibox_loss_layer.cpp @@ -62,12 +62,15 @@ void MultiBoxLossLayer::LayerSetUp(const vector& bottom, // fake shape. vector loc_shape(1, 1); loc_shape.push_back(4); - loc_pred_.Reshape(loc_shape); - loc_gt_.Reshape(loc_shape); - loc_bottom_vec_.push_back(&loc_pred_); - loc_bottom_vec_.push_back(&loc_gt_); - loc_loss_.Reshape(loss_shape); - loc_top_vec_.push_back(&loc_loss_); + loc_pred_ = Blob::create(); + loc_pred_->Reshape(loc_shape); + loc_gt_ = Blob::create(); + loc_gt_->Reshape(loc_shape); + loc_bottom_vec_.push_back(loc_pred_.get()); + loc_bottom_vec_.push_back(loc_gt_.get()); + loc_loss_ = Blob::create(); + loc_loss_->Reshape(loss_shape); + loc_top_vec_.push_back(loc_loss_.get()); if (loc_loss_type_ == MultiBoxLossParameter_LocLossType_L2) { LayerParameter layer_param; layer_param.set_name(this->layer_param_.name() + "_l2_loc"); @@ -87,10 +90,11 @@ void MultiBoxLossLayer::LayerSetUp(const vector& bottom, } // Set up confidence loss layer. conf_loss_type_ = multibox_loss_param.conf_loss_type(); - conf_bottom_vec_.push_back(&conf_pred_); - conf_bottom_vec_.push_back(&conf_gt_); - conf_loss_.Reshape(loss_shape); - conf_top_vec_.push_back(&conf_loss_); + conf_pred_ = Blob::create(); + conf_gt_ = Blob::create(); + conf_loss_ = Blob::create(); + conf_loss_->Reshape(loss_shape); + conf_top_vec_.push_back(conf_loss_.get()); if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_SOFTMAX) { CHECK_GE(background_label_id_, 0) << "background_label_id should be within [0, num_classes) for Softmax."; @@ -106,9 +110,11 @@ void MultiBoxLossLayer::LayerSetUp(const vector& bottom, softmax_param->set_axis(1); // Fake reshape. vector conf_shape(1, 1); - conf_gt_.Reshape(conf_shape); + conf_gt_->Reshape(conf_shape); conf_shape.push_back(num_classes_); - conf_pred_.Reshape(conf_shape); + conf_pred_->Reshape(conf_shape); + conf_bottom_vec_.push_back(conf_pred_.get()); + conf_bottom_vec_.push_back(conf_gt_.get()); conf_loss_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); conf_loss_layer_->SetUp(conf_bottom_vec_, conf_top_vec_); } else if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_LOGISTIC) { @@ -119,8 +125,10 @@ void MultiBoxLossLayer::LayerSetUp(const vector& bottom, // Fake reshape. vector conf_shape(1, 1); conf_shape.push_back(num_classes_); - conf_gt_.Reshape(conf_shape); - conf_pred_.Reshape(conf_shape); + conf_gt_->Reshape(conf_shape); + conf_pred_->Reshape(conf_shape); + conf_bottom_vec_.push_back(conf_pred_.get()); + conf_bottom_vec_.push_back(conf_gt_.get()); conf_loss_layer_ = LayerRegistry::CreateLayer(layer_param, this->parent_rank()); conf_loss_layer_->SetUp(conf_bottom_vec_, conf_top_vec_); } else { @@ -184,17 +192,17 @@ void MultiBoxLossLayer::Forward_cpu(const vector& bottom, vector loc_shape(2); loc_shape[0] = 1; loc_shape[1] = num_matches_ * 4; - loc_pred_.Reshape(loc_shape); - loc_gt_.Reshape(loc_shape); - Dtype* loc_pred_data = loc_pred_.mutable_cpu_data(); - Dtype* loc_gt_data = loc_gt_.mutable_cpu_data(); + loc_pred_->Reshape(loc_shape); + loc_gt_->Reshape(loc_shape); + Dtype* loc_pred_data = loc_pred_->mutable_cpu_data(); + Dtype* loc_gt_data = loc_gt_->mutable_cpu_data(); EncodeLocPrediction(all_loc_preds, all_gt_bboxes, all_match_indices_, prior_bboxes, prior_variances, multibox_loss_param_, loc_pred_data, loc_gt_data); loc_loss_layer_->Reshape(loc_bottom_vec_, loc_top_vec_); loc_loss_layer_->Forward(loc_bottom_vec_, loc_top_vec_); } else { - loc_loss_.mutable_cpu_data()[0] = 0; + loc_loss_->mutable_cpu_data()[0] = 0; } // Form data to pass on to conf_loss_layer_. @@ -208,34 +216,34 @@ void MultiBoxLossLayer::Forward_cpu(const vector& bottom, vector conf_shape; if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_SOFTMAX) { conf_shape.push_back(num_conf_); - conf_gt_.Reshape(conf_shape); + conf_bottom_vec_[1]->Reshape(conf_shape); conf_shape.push_back(num_classes_); - conf_pred_.Reshape(conf_shape); + conf_bottom_vec_[0]->Reshape(conf_shape); } else if (conf_loss_type_ == MultiBoxLossParameter_ConfLossType_LOGISTIC) { conf_shape.push_back(1); conf_shape.push_back(num_conf_); conf_shape.push_back(num_classes_); - conf_gt_.Reshape(conf_shape); - conf_pred_.Reshape(conf_shape); + conf_bottom_vec_[0]->Reshape(conf_shape); + conf_bottom_vec_[1]->Reshape(conf_shape); } else { LOG(FATAL) << "Unknown confidence loss type."; } if (!do_neg_mining_) { // Consider all scores. // Share data and diff with bottom[1]. - CHECK_EQ(conf_pred_.count(), bottom[1]->count()); - conf_pred_.ShareData(*(bottom[1])); + CHECK_EQ(conf_pred_->count(), bottom[1]->count()); + conf_pred_->ShareData(*(bottom[1])); } - Dtype* conf_pred_data = conf_pred_.mutable_cpu_data(); - Dtype* conf_gt_data = conf_gt_.mutable_cpu_data(); - caffe_set(conf_gt_.count(), Dtype(background_label_id_), conf_gt_data); + Dtype* conf_pred_data = conf_pred_->mutable_cpu_data(); + Dtype* conf_gt_data = conf_gt_->mutable_cpu_data(); + caffe_set(conf_gt_->count(), Dtype(background_label_id_), conf_gt_data); EncodeConfPrediction(conf_data, num_, num_priors_, multibox_loss_param_, all_match_indices_, all_neg_indices_, all_gt_bboxes, conf_pred_data, conf_gt_data); conf_loss_layer_->Reshape(conf_bottom_vec_, conf_top_vec_); conf_loss_layer_->Forward(conf_bottom_vec_, conf_top_vec_); } else { - conf_loss_.mutable_cpu_data()[0] = 0; + conf_loss_->mutable_cpu_data()[0] = 0; } top[0]->mutable_cpu_data()[0] = 0; @@ -243,12 +251,12 @@ void MultiBoxLossLayer::Forward_cpu(const vector& bottom, Dtype normalizer = LossLayer::GetNormalizer( normalization_, num_, num_priors_, num_matches_); top[0]->mutable_cpu_data()[0] += - loc_weight_ * loc_loss_.cpu_data()[0] / normalizer; + loc_weight_ * loc_loss_->cpu_data()[0] / normalizer; } if (this->layer_param_.propagate_down(1)) { Dtype normalizer = LossLayer::GetNormalizer( normalization_, num_, num_priors_, num_matches_); - top[0]->mutable_cpu_data()[0] += conf_loss_.cpu_data()[0] / normalizer; + top[0]->mutable_cpu_data()[0] += conf_loss_->cpu_data()[0] / normalizer; } } @@ -281,9 +289,9 @@ void MultiBoxLossLayer::Backward_cpu(const vector& top, Dtype normalizer = LossLayer::GetNormalizer( normalization_, num_, num_priors_, num_matches_); Dtype loss_weight = top[0]->cpu_diff()[0] / normalizer; - caffe_scal(loc_pred_.count(), loss_weight, loc_pred_.mutable_cpu_diff()); + caffe_scal(loc_pred_->count(), loss_weight, loc_pred_->mutable_cpu_diff()); // Copy gradient back to bottom[0]. - const Dtype* loc_pred_diff = loc_pred_.cpu_diff(); + const Dtype* loc_pred_diff = loc_pred_->cpu_diff(); int count = 0; for (int i = 0; i < num_; ++i) { for (map >::iterator it = @@ -322,10 +330,10 @@ void MultiBoxLossLayer::Backward_cpu(const vector& top, Dtype normalizer = LossLayer::GetNormalizer( normalization_, num_, num_priors_, num_matches_); Dtype loss_weight = top[0]->cpu_diff()[0] / normalizer; - caffe_scal(conf_pred_.count(), loss_weight, - conf_pred_.mutable_cpu_diff()); + caffe_scal(conf_pred_->count(), loss_weight, + conf_pred_->mutable_cpu_diff()); // Copy gradient back to bottom[1]. - const Dtype* conf_pred_diff = conf_pred_.cpu_diff(); + const Dtype* conf_pred_diff = conf_pred_->cpu_diff(); if (do_neg_mining_) { int count = 0; for (int i = 0; i < num_; ++i) { @@ -359,7 +367,7 @@ void MultiBoxLossLayer::Backward_cpu(const vector& top, } } else { // The diff is already computed and stored. - bottom[1]->ShareDiff(conf_pred_); + bottom[1]->ShareDiff(*conf_pred_); } } } diff --git a/src/caffe/layers/normalize_layer.cu b/src/caffe/layers/normalize_layer.cu index fb14c588bb1..d880bebedcd 100644 --- a/src/caffe/layers/normalize_layer.cu +++ b/src/caffe/layers/normalize_layer.cu @@ -1,9 +1,9 @@ #include #include #include +#include -#include "thrust/device_vector.h" - +#include "caffe/util/half.cuh" #include "caffe/filler.hpp" #include "caffe/layers/normalize_layer.hpp" #include "caffe/util/math_functions.hpp" @@ -13,27 +13,32 @@ namespace caffe { // divid a matrix with vector template __global__ void DivBsx(const int nthreads, const Dtype* A, - const Dtype* v, const int rows, const int cols, const CBLAS_TRANSPOSE trans, + const Dtype* v, const int rows, const int cols, Dtype* B) { CUDA_KERNEL_LOOP(index, nthreads) { - int c = index % cols; - int r = (index / cols) % rows; - if (trans == CblasNoTrans) { - B[index] = A[index] / v[c]; - } else { - B[index] = A[index] / v[r]; - } + B[index] = A[index] / v[index % cols]; + } +} + +template <> +__global__ void DivBsx(const int nthreads, const float16* A, + const float16* v, const int rows, const int cols, float16* B) { + CUDA_KERNEL_LOOP(index, nthreads) { + const half* ah = reinterpret_cast(A); + const half* vh = reinterpret_cast(v); + half* bh = reinterpret_cast(B); + bh[index] = __hdiv(ah[index], vh[index % cols]); } } template __global__ void MulBsx(const int nthreads, const Dtype* A, - const Dtype* v, const int rows, const int cols, const CBLAS_TRANSPOSE trans, + const Dtype* v, const int rows, const int cols, const bool notrans, Dtype* B) { CUDA_KERNEL_LOOP(index, nthreads) { int c = index % cols; int r = (index / cols) % rows; - if (trans == CblasNoTrans) { + if (notrans) { B[index] = A[index] * v[c]; } else { B[index] = A[index] * v[r]; @@ -41,6 +46,20 @@ __global__ void MulBsx(const int nthreads, const Dtype* A, } } +template <> +__global__ void MulBsx(const int nthreads, const float16* A, const float16* v, + const int rows, const int cols, const bool notrans, float16* B) { + CUDA_KERNEL_LOOP(index, nthreads) { + int c = index % cols; + int r = (index / cols) % rows; + const half* ah = reinterpret_cast(A); + const half* vh = reinterpret_cast(v); + half* bh = reinterpret_cast(B); + bh[index] = __hmul(ah[index], vh[notrans ? c : r]); + } +} + + template void NormalizeLayer::Forward_gpu(const vector& bottom, const vector& top) { @@ -86,8 +105,7 @@ void NormalizeLayer::Forward_gpu(const vector& bottom, // scale the layer // NOLINT_NEXT_LINE(whitespace/operators) DivBsx<<>>( - dim, bottom_data, norm_data, channels, spatial_dim, CblasNoTrans, - top_data); + dim, bottom_data, norm_data, channels, spatial_dim, top_data); CUDA_POST_KERNEL_CHECK; CUDA_CHECK(cudaStreamSynchronize(stream)); norm_data += spatial_dim; @@ -98,7 +116,7 @@ void NormalizeLayer::Forward_gpu(const vector& bottom, } else { // NOLINT_NEXT_LINE(whitespace/operators) MulBsx<<>>( - dim, top_data, scale, channels, spatial_dim, CblasTrans, + dim, top_data, scale, channels, spatial_dim, false, top_data); CUDA_POST_KERNEL_CHECK; CUDA_CHECK(cudaStreamSynchronize(stream)); @@ -163,6 +181,7 @@ void NormalizeLayer::Backward_gpu(const vector& top, // Propagate to bottom if (propagate_down[0]) { + cudaStream_t stream = Caffe::thread_stream(); for (int n = 0; n < num; ++n) { if (across_spatial_) { Dtype a; @@ -180,35 +199,38 @@ void NormalizeLayer::Backward_gpu(const vector& top, buffer_spatial); // scale botom_diff // NOLINT_NEXT_LINE(whitespace/operators) - MulBsx <<>>( + MulBsx<<>>( dim, bottom_data, buffer_spatial, channels, spatial_dim, - CblasNoTrans, bottom_diff); + true, bottom_diff); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); // divide by square of norm caffe_gpu_powx(spatial_dim, norm_data, Dtype(2), buffer_spatial); // NOLINT_NEXT_LINE(whitespace/operators) - DivBsx <<>>( + DivBsx <<>>( dim, bottom_diff, buffer_spatial, channels, spatial_dim, - CblasNoTrans, bottom_diff); + bottom_diff); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); caffe_gpu_sub(dim, top_diff, bottom_diff, bottom_diff); // divide by norm // NOLINT_NEXT_LINE(whitespace/operators) - DivBsx <<>>( - dim, bottom_diff, norm_data, channels, spatial_dim, CblasNoTrans, + DivBsx <<>>( + dim, bottom_diff, norm_data, channels, spatial_dim, bottom_diff); CUDA_POST_KERNEL_CHECK; norm_data += spatial_dim; + CUDA_CHECK(cudaStreamSynchronize(stream)); } // scale the diff if (channel_shared_) { caffe_gpu_scal(dim, scale[0], bottom_diff); } else { // NOLINT_NEXT_LINE(whitespace/operators) - MulBsx <<>>( - dim, bottom_diff, scale, channels, spatial_dim, CblasTrans, - bottom_diff); + MulBsx<<>>( + dim, bottom_diff, scale, channels, spatial_dim, false, bottom_diff); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } bottom_data += dim; top_diff += dim; @@ -219,5 +241,4 @@ void NormalizeLayer::Backward_gpu(const vector& top, INSTANTIATE_LAYER_GPU_FUNCS_FB(NormalizeLayer); - } // namespace caffe diff --git a/src/caffe/layers/permute_layer.cu b/src/caffe/layers/permute_layer.cu index 69c164b91a6..fbb410c42c1 100644 --- a/src/caffe/layers/permute_layer.cu +++ b/src/caffe/layers/permute_layer.cu @@ -1,6 +1,7 @@ #include #include #include +#include #include "caffe/layers/permute_layer.hpp" #include "caffe/util/math_functions.hpp" @@ -9,9 +10,9 @@ namespace caffe { template __global__ void PermuteKernel(const int nthreads, - Dtype* const bottom_data, const bool forward, const int* permute_order, + Dtype* bottom_data, const bool forward, const int* permute_order, const int* old_steps, const int* new_steps, const int num_axes, - Dtype* const top_data) { + Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int temp_idx = index; int old_idx = 0; @@ -28,6 +29,28 @@ __global__ void PermuteKernel(const int nthreads, } } +template <> +__global__ void PermuteKernel(const int nthreads, float16* bottom_data, + const bool forward, const int* permute_order, + const int* old_steps, const int* new_steps, + const int num_axes, float16* top_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + int temp_idx = index; + int old_idx = 0; + for (int i = 0; i < num_axes; ++i) { + int order = permute_order[i]; + old_idx += (temp_idx / new_steps[i]) * old_steps[order]; + temp_idx %= new_steps[i]; + } + if (forward) { + top_data[index] = bottom_data[old_idx]; + } else { + bottom_data[old_idx] = top_data[index]; + } + } +} + + template void PermuteLayer::Forward_gpu(const vector& bottom, const vector& top) { @@ -41,7 +64,7 @@ void PermuteLayer::Forward_gpu(const vector& bottom, bool foward = true; // NOLINT_NEXT_LINE(whitespace/operators) cudaStream_t stream = Caffe::thread_stream(); - PermuteKernel<<>>( + PermuteKernel<<>>( count, bottom_data, foward, permute_order, old_steps, new_steps, num_axes_, top_data); CUDA_POST_KERNEL_CHECK; @@ -52,7 +75,6 @@ void PermuteLayer::Forward_gpu(const vector& bottom, } } - template void PermuteLayer::Backward_gpu(const vector& top, const vector& propagate_down, const vector& bottom) { @@ -64,11 +86,13 @@ void PermuteLayer::Backward_gpu(const vector& top, const int* new_steps = new_steps_.gpu_data(); const int* old_steps = old_steps_.gpu_data(); bool foward = false; + cudaStream_t stream = Caffe::thread_stream(); // NOLINT_NEXT_LINE(whitespace/operators) - PermuteKernel<<>>( + PermuteKernel<<>>( count, bottom_diff, foward, permute_order, old_steps, new_steps, num_axes_, top_diff); CUDA_POST_KERNEL_CHECK; + CUDA_CHECK(cudaStreamSynchronize(stream)); } else { // If there is no need to permute, we share diff to save memory. bottom[0]->ShareDiff(*top[0]); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index abf6bb211c8..e1e7042f770 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -671,28 +671,10 @@ float Net::ForwardFromTo(int start, int end) { CHECK_LT(end, layers_.size()); float loss = 0; for (int i = start; i <= end; ++i) { - // LOG(INFO) << " ****** [Forward] (" << i << ") Layer '" << layer_names_[i]; // << "' FT " << Type_Name(layers_[i]->forward_type()) // << " BT " << Type_Name(layers_[i]->backward_type()); - - std::cout << " ****** [Forward] (" << i << ") Layer " << layer_names_[i] << std::endl; - - for (int j = 0; bottom_vecs_[i].size() > 0 && - j < std::min(10, bottom_vecs_[i][0]->count()); ++j) { - std::cout << float(bottom_vecs_[i][0]->cpu_data()[j]) << " "; - } - std::cout << std::endl; - float layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); - - for (int j = 0; top_vecs_[i].size() > 0 && - j < std::min(10, top_vecs_[i][0]->count()); ++j) { - std::cout << float(top_vecs_[i][0]->cpu_data()[j]) << " "; - } - std::cout << std::endl; - - loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } } diff --git a/src/caffe/util/bbox_util.cpp b/src/caffe/util/bbox_util.cpp index 5bc50767c3f..5c9ce3601a8 100644 --- a/src/caffe/util/bbox_util.cpp +++ b/src/caffe/util/bbox_util.cpp @@ -1070,8 +1070,12 @@ void GetGroundTruth(const Dtype* gt_data, const int num_gt, continue; } int label = gt_data[start_idx + 1]; - CHECK_NE(background_label_id, label) + if (is_precise()) { // round float16 to int? + CHECK_NE(background_label_id, label) << "Found background label in the dataset."; + } else if (background_label_id == label) { + continue; + } bool difficult = static_cast(gt_data[start_idx + 7]); if (!use_difficult_gt && difficult) { // Skip reading difficult ground truth. From 80ffe9d674e1b97a526cc1c06af03fbb70dad2a4 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Tue, 13 Mar 2018 20:36:55 -0700 Subject: [PATCH 32/42] Lint --- src/caffe/layers/axpy_layer.cpp | 14 +++++++------- src/caffe/layers/axpy_layer.cu | 11 +++++++---- src/caffe/layers/permute_layer.cu | 2 +- src/caffe/net.cpp | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/caffe/layers/axpy_layer.cpp b/src/caffe/layers/axpy_layer.cpp index a672f0ffc4a..476af93f5bd 100644 --- a/src/caffe/layers/axpy_layer.cpp +++ b/src/caffe/layers/axpy_layer.cpp @@ -18,7 +18,7 @@ void AxpyLayer::Reshape(const vector& bottom, CHECK_EQ(bottom[0]->shape(2), 1); CHECK_EQ(bottom[0]->shape(3), 1); } - CHECK(bottom[1]->shape() == bottom[2]->shape()); + CHECK(bottom[1]->shape() == bottom[2]->shape()); top[0]->ReshapeLike(*bottom[1]); int spatial_dim = bottom[1]->count(2); if (spatial_sum_multiplier_.count() < spatial_dim) { @@ -40,9 +40,9 @@ void AxpyLayer::Forward_cpu(const vector& bottom, for (int n = 0; n < bottom[1]->num(); ++n) { for (int c = 0; c < channel_dim; ++c) { int scale_offset = n * channel_dim + c; - caffe_axpy(spatial_dim, scale_data[scale_offset], - x_data + scale_offset * spatial_dim, - top_data + scale_offset * spatial_dim); + caffe_axpy(spatial_dim, scale_data[scale_offset], + x_data + scale_offset * spatial_dim, + top_data + scale_offset * spatial_dim); } } } @@ -73,9 +73,9 @@ void AxpyLayer::Backward_cpu(const vector& top, for (int n = 0; n < bottom[1]->num(); ++n) { for (int c = 0; c < channel_dim; ++c) { int scale_offset = n * channel_dim + c; - caffe_cpu_scale(spatial_dim, scale_data[scale_offset], - top_diff + scale_offset * spatial_dim, - x_diff + scale_offset * spatial_dim); + caffe_cpu_scale(spatial_dim, scale_data[scale_offset], + top_diff + scale_offset * spatial_dim, + x_diff + scale_offset * spatial_dim); } } } diff --git a/src/caffe/layers/axpy_layer.cu b/src/caffe/layers/axpy_layer.cu index 31bddbe1094..79ed130745e 100644 --- a/src/caffe/layers/axpy_layer.cu +++ b/src/caffe/layers/axpy_layer.cu @@ -13,7 +13,7 @@ namespace caffe { template -__global__ void AxpyForward(const int count, const int spatial_dim, +__global__ void AxpyForward(const int count, const int spatial_dim, const Dtype* scale_data, const Dtype* x_data, const Dtype* y_data, Dtype* out_data) { CUDA_KERNEL_LOOP(index, count) { @@ -31,13 +31,14 @@ void AxpyLayer::Forward_gpu( Ftype* out_data = top[0]->mutable_gpu_data(); const int count = bottom[1]->count(); cudaStream_t stream = Caffe::thread_stream(); + // NOLINT_NEXT_LINE(whitespace/operators) AxpyForward<<>>( count, bottom[1]->count(2), scale_data, x_data, y_data, out_data); CUDA_CHECK(cudaStreamSynchronize(stream)); } template -__global__ void AxpyBackwardScale(const int outer_num, const int spatial_dim, +__global__ void AxpyBackwardScale(const int outer_num, const int spatial_dim, const Dtype* x_data, const Dtype* top_diff, Dtype* scale_diff) { __shared__ char axpy_buffer[CAFFE_CUDA_NUM_THREADS * sizeof(Dtype)]; Dtype* buffer = reinterpret_cast(axpy_buffer); @@ -64,7 +65,7 @@ __global__ void AxpyBackwardScale(const int outer_num, const int spatial_dim, } template -__global__ void AxpyBackwardX(const int count, const int spatial_dim, +__global__ void AxpyBackwardX(const int count, const int spatial_dim, const Dtype* scale_data, const Dtype* top_diff, Dtype* out) { CUDA_KERNEL_LOOP(index, count) { out[index] = scale_data[index / spatial_dim] * top_diff[index]; @@ -79,6 +80,7 @@ void AxpyLayer::Backward_gpu(const vector& top, if (propagate_down[0]) { cudaStream_t stream = Caffe::thread_stream(); int outer_num = bottom[1]->count(0, 2); + // NOLINT_NEXT_LINE(whitespace/operators) AxpyBackwardScale<<>>( outer_num, bottom[1]->count(2), bottom[1]->gpu_data(), top_diff, @@ -88,8 +90,9 @@ void AxpyLayer::Backward_gpu(const vector& top, } if (propagate_down[1]) { cudaStream_t stream = Caffe::thread_stream(); + // NOLINT_NEXT_LINE(whitespace/operators) AxpyBackwardX<<>>( - count, top[0]->count(2), + count, top[0]->count(2), bottom[0]->gpu_data(), top_diff, bottom[1]->mutable_gpu_diff()); CUDA_POST_KERNEL_CHECK; diff --git a/src/caffe/layers/permute_layer.cu b/src/caffe/layers/permute_layer.cu index fbb410c42c1..dff9ba2bfb4 100644 --- a/src/caffe/layers/permute_layer.cu +++ b/src/caffe/layers/permute_layer.cu @@ -62,8 +62,8 @@ void PermuteLayer::Forward_gpu(const vector& bottom, const int* new_steps = new_steps_.gpu_data(); const int* old_steps = old_steps_.gpu_data(); bool foward = true; - // NOLINT_NEXT_LINE(whitespace/operators) cudaStream_t stream = Caffe::thread_stream(); + // NOLINT_NEXT_LINE(whitespace/operators) PermuteKernel<<>>( count, bottom_data, foward, permute_order, old_steps, new_steps, num_axes_, top_data); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e1e7042f770..1e27a3b5cfe 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -106,7 +106,7 @@ void Net::Init(const NetParameter& in_param) { wgrad_sq_.store(0LL); global_grad_scale_coeff_ = 1.F; - has_global_grad_scale_param_ = in_param.has_global_grad_scale(); + has_global_grad_scale_param_ = in_param.has_global_grad_scale(); global_grad_scale_param_ = in_param.global_grad_scale(); global_grad_scale_adaptive_ = in_param.global_grad_scale_adaptive(); From 466fdd5ddc2c766405f474df4d435167bfbf7412 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Wed, 14 Mar 2018 11:59:13 -0700 Subject: [PATCH 33/42] __hdiv __hmul --- include/caffe/util/gpu_math_functions.cuh | 9 +++++++++ src/caffe/layers/normalize_layer.cu | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/caffe/util/gpu_math_functions.cuh b/include/caffe/util/gpu_math_functions.cuh index 5cbd2ccb694..a1d706aa0ce 100644 --- a/include/caffe/util/gpu_math_functions.cuh +++ b/include/caffe/util/gpu_math_functions.cuh @@ -26,6 +26,15 @@ half hmul(half a, half b) { #endif } +__device__ __inline__ +half hdiv(half a, half b) { +#if __CUDA_ARCH__ >= 530 + return __hdiv(a, b); +#else + return float2half_clip(__half2float(a) / __half2float(b)); +#endif +} + __device__ __inline__ half2 hmul2(half2 a, half2 b) { #if __CUDA_ARCH__ >= 530 diff --git a/src/caffe/layers/normalize_layer.cu b/src/caffe/layers/normalize_layer.cu index d880bebedcd..631bb0f59db 100644 --- a/src/caffe/layers/normalize_layer.cu +++ b/src/caffe/layers/normalize_layer.cu @@ -6,6 +6,7 @@ #include "caffe/util/half.cuh" #include "caffe/filler.hpp" #include "caffe/layers/normalize_layer.hpp" +#include "caffe/util/gpu_math_functions.cuh" #include "caffe/util/math_functions.hpp" namespace caffe { @@ -27,7 +28,7 @@ __global__ void DivBsx(const int nthreads, const float16* A, const half* ah = reinterpret_cast(A); const half* vh = reinterpret_cast(v); half* bh = reinterpret_cast(B); - bh[index] = __hdiv(ah[index], vh[index % cols]); + bh[index] = hdiv(ah[index], vh[index % cols]); } } @@ -55,7 +56,7 @@ __global__ void MulBsx(const int nthreads, const float16* A, const floa const half* ah = reinterpret_cast(A); const half* vh = reinterpret_cast(v); half* bh = reinterpret_cast(B); - bh[index] = __hmul(ah[index], vh[notrans ? c : r]); + bh[index] = hmul(ah[index], vh[notrans ? c : r]); } } From b4bbb36423d75bf3d7eec6728c053db918790094 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Wed, 14 Mar 2018 19:32:47 -0700 Subject: [PATCH 34/42] Adaptive limit --- src/caffe/net.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 1e27a3b5cfe..6b2822af015 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -918,7 +918,7 @@ void Net::update_grad_scale() { if (global_grad_scale_adaptive_) { const float wgsq = wgrad_sq(); if (wgsq > 0.F) { - global_grad_scale_coeff_ = std::sqrt(wgsq) * global_grad_scale_param_; + global_grad_scale_coeff_ = std::sqrt(std::max(wgsq, 1.F / Caffe::solver_count())) * global_grad_scale_param_; return; } } From a505417be499a0e6f394542ef3a1777d9e9181a9 Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Thu, 15 Mar 2018 15:18:55 -0700 Subject: [PATCH 35/42] bad param in digits fixed --- src/caffe/common.cpp | 8 +++----- src/caffe/layers/accuracy_layer.cu | 7 +++++-- src/caffe/layers/cudnn_conv_layer.cpp | 9 +-------- src/caffe/solvers/sgd_solver.cpp | 14 +++++++------- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 95e53d7737d..1d48063a93c 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -144,12 +144,10 @@ Caffe::Caffe() void Caffe::init() { if (mode_ == GPU && curand_generator_ == nullptr) { - CURAND_CHECK_ARG(curandCreateGenerator(&curand_generator_, CURAND_RNG_PSEUDO_DEFAULT), - current_device()); - CURAND_CHECK_ARG(curandSetPseudoRandomGeneratorSeed(curand_generator_, cluster_seedgen()), - current_device()); curand_stream_ = CudaStream::create(); - CURAND_CHECK_ARG(curandSetStream(curand_generator_, curand_stream_->get()), current_device()); + CURAND_CHECK_ARG(curandCreateGenerator(&curand_generator_, CURAND_RNG_PSEUDO_DEFAULT), device_); + CURAND_CHECK_ARG(curandSetPseudoRandomGeneratorSeed(curand_generator_, cluster_seedgen()), device_); + CURAND_CHECK_ARG(curandSetStream(curand_generator_, curand_stream_->get()), device_); } } diff --git a/src/caffe/layers/accuracy_layer.cu b/src/caffe/layers/accuracy_layer.cu index 82fa16a4e74..365d63f09ce 100644 --- a/src/caffe/layers/accuracy_layer.cu +++ b/src/caffe/layers/accuracy_layer.cu @@ -72,6 +72,7 @@ void AccuracyLayer::Forward_gpu( const int dim = bottom[0]->count() / outer_num_; const int num_labels = bottom[0]->shape(label_axis_); const int nthreads = outer_num_ * inner_num_; + cudaStream_t stream = Caffe::thread_stream(); // Since this memory is not used for anything, we use it here to avoid having // to allocate new GPU memory to accumulate intermediate results. Ftype* acc_data = bottom[0]->mutable_gpu_diff(); @@ -83,9 +84,10 @@ void AccuracyLayer::Forward_gpu( Ftype* counts = bottom[1]->mutable_gpu_diff(); // NOLINT_NEXT_LINE(whitespace/operators) AccuracyForwardGPU<<>>(nthreads, bottom_data, bottom_label, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(nthreads, bottom_data, bottom_label, acc_data, outer_num_, dim, inner_num_, num_labels, top_k_, has_ignore_label_, ignore_label_, counts); + CUDA_CHECK(cudaStreamSynchronize(stream)); Ftype acc; caffe_gpu_asum(nthreads, acc_data, &acc, 0); Ftype valid_count; @@ -107,9 +109,10 @@ void AccuracyLayer::Forward_gpu( // NOLINT_NEXT_LINE(whitespace/operators) AccuracyForwardWithPerClassGPU<<>>(nthreads, bottom_data, bottom_label, + CAFFE_CUDA_NUM_THREADS, 0, stream>>>(nthreads, bottom_data, bottom_label, acc_data, counts, outer_num_, dim, inner_num_, num_labels, top_k_, has_ignore_label_, ignore_label_); + CUDA_CHECK(cudaStreamSynchronize(stream)); // get the overall accuracy Ftype acc; diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index a6263167613..d7e17e751a1 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -415,6 +415,7 @@ void CuDNNConvolutionLayer::Reshape( 1, 1); } + size_t workspace_bytes = AllocateWorkspace(bottom.size()); // Ask cuDNN to find the best algorithm // When batch is small and every image is different we don't want to call Find* over and over if (use_algo_seeker_) { @@ -423,12 +424,6 @@ void CuDNNConvolutionLayer::Reshape( // FindEx-backward-filter. The size of buffer is as big as weights. // Get: workspace_bytes is only used as a workspace limit by Get. // (no allocation happens before Get or by Get). - size_t workspace_bytes = 0UL; - if (fwd_count_ == 0) { - // In iteration 0, use a small amount of memory in order to leave - // most of memory for allocating layer blobs. - workspace_bytes = AllocateWorkspace(bottom.size()); - } switch (this->layer_param_.convolution_param().cudnn_convolution_algo_seeker()) { case ConvolutionParameter_CuDNNConvolutionAlgorithmSeeker_GET: GetConvAlgo(bottom, top, workspace_bytes, pad_h, pad_w, stride_h, stride_w); @@ -449,8 +444,6 @@ void CuDNNConvolutionLayer::Reshape( default: LOG(FATAL) << "Wrong value for cudnn_convolution_algo_seeker"; } - } else { - AllocateWorkspace(bottom.size()); } } diff --git a/src/caffe/solvers/sgd_solver.cpp b/src/caffe/solvers/sgd_solver.cpp index 25fff98b0e4..082a45b0fb6 100644 --- a/src/caffe/solvers/sgd_solver.cpp +++ b/src/caffe/solvers/sgd_solver.cpp @@ -243,13 +243,13 @@ float SGDSolver::ComputeUpdateValue(int param_id, void* handle, float rat const string& larc_policy = this->param_.larc_policy(); float local_rate = GetLocalRate(param_id, wgrad_sq); if (larc) { - if (larc_policy == "scale") { - local_rate = rate * local_rate; - } else if (larc_policy == "clip") { - local_rate = std::min(rate, local_rate); - } else { - LOG(FATAL) << "Unknown larc policy: " << larc_policy; - } + if (larc_policy == "scale") { + local_rate = rate * local_rate; + } else if (larc_policy == "clip") { + local_rate = std::min(rate, local_rate); + } else { + LOG(FATAL) << "Unknown larc policy: " << larc_policy; + } } else { local_rate = rate * local_rate; } From 6952299938b8cf44b2f5580420753c305ae23c4e Mon Sep 17 00:00:00 2001 From: Sergei Nikolaev Date: Thu, 15 Mar 2018 18:26:55 -0700 Subject: [PATCH 36/42] SSD fixes, --- examples/faceboxes/SSD.prototxt | 1540 ++++++++++++++++++++++ examples/faceboxes/faceboxes_test.py | 61 + examples/faceboxes/pepper.jpg | Bin 0 -> 504311 bytes src/caffe/common.cpp | 6 +- src/caffe/layers/smooth_L1_loss_layer.cu | 8 +- src/caffe/net.cpp | 2 +- src/caffe/util/bbox_util.cu | 41 +- 7 files changed, 1638 insertions(+), 20 deletions(-) create mode 100644 examples/faceboxes/SSD.prototxt create mode 100644 examples/faceboxes/faceboxes_test.py create mode 100644 examples/faceboxes/pepper.jpg diff --git a/examples/faceboxes/SSD.prototxt b/examples/faceboxes/SSD.prototxt new file mode 100644 index 00000000000..9c61a39d3d7 --- /dev/null +++ b/examples/faceboxes/SSD.prototxt @@ -0,0 +1,1540 @@ +name: "VGG_WIDER_FACE_SFD_deploy" + +default_forward_type: FLOAT16 +default_backward_type: FLOAT16 +default_forward_math: FLOAT16 +default_backward_math: FLOAT16 + +#global_grad_scale: 10 +#global_grad_scale_adaptive: true + +input: "data" +input_shape { + dim: 1 + dim: 3 + dim: 1080 + dim: 1920 +} +layer { + name: "conv1_1" + type: "Convolution" + bottom: "data" + top: "conv1_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1" + top: "conv2_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "conv2_2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2" + top: "conv3_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "pool3" + type: "Pooling" + bottom: "conv3_3" + top: "pool3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3" + top: "conv4_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu4_3" + type: "ReLU" + bottom: "conv4_3" + top: "conv4_3" +} +layer { + name: "pool4" + type: "Pooling" + bottom: "conv4_3" + top: "pool4" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv5_1" + type: "Convolution" + bottom: "pool4" + top: "conv5_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + dilation: 1 + } +} +layer { + name: "relu5_1" + type: "ReLU" + bottom: "conv5_1" + top: "conv5_1" +} +layer { + name: "conv5_2" + type: "Convolution" + bottom: "conv5_1" + top: "conv5_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + dilation: 1 + } +} +layer { + name: "relu5_2" + type: "ReLU" + bottom: "conv5_2" + top: "conv5_2" +} +layer { + name: "conv5_3" + type: "Convolution" + bottom: "conv5_2" + top: "conv5_3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + dilation: 1 + } +} +layer { + name: "relu5_3" + type: "ReLU" + bottom: "conv5_3" + top: "conv5_3" +} +layer { + name: "pool5" + type: "Pooling" + bottom: "conv5_3" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "fc6" + type: "Convolution" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 1024 + pad: 3 + kernel_size: 3 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + dilation: 1 + } +} +layer { + name: "relu6" + type: "ReLU" + bottom: "fc6" + top: "fc6" +} +layer { + name: "fc7" + type: "Convolution" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 1024 + kernel_size: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "relu7" + type: "ReLU" + bottom: "fc7" + top: "fc7" +} +layer { + name: "conv6_1" + type: "Convolution" + bottom: "fc7" + top: "conv6_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1" + top: "conv6_1" +} +layer { + name: "conv6_2" + type: "Convolution" + bottom: "conv6_1" + top: "conv6_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2" + top: "conv6_2" +} +layer { + name: "conv7_1" + type: "Convolution" + bottom: "conv6_2" + top: "conv7_1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1" + top: "conv7_1" +} +layer { + name: "conv7_2" + type: "Convolution" + bottom: "conv7_1" + top: "conv7_2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2" + top: "conv7_2" +} +layer { + name: "conv3_3_norm" + type: "Normalize" + bottom: "conv3_3" + top: "conv3_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 10 + } + channel_shared: false + } +} +layer { + name: "conv3_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv3_3_norm" + top: "conv3_3_norm_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv3_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv3_3_norm_mbox_loc" + top: "conv3_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv3_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv3_3_norm_mbox_loc_perm" + top: "conv3_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv3_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv3_3_norm" + top: "conv3_3_norm_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv3_3_norm_mbox_conf_slice" + type: "Slice" + bottom: "conv3_3_norm_mbox_conf" + top: "conv3_3_norm_mbox_conf1" + top: "conv3_3_norm_mbox_conf2" + top: "conv3_3_norm_mbox_conf3" + top: "conv3_3_norm_mbox_conf4" + slice_param { + axis: 1 + slice_point: 1 + slice_point: 2 + slice_point: 3 + } +} +layer { + name: "conv3_3_norm_mbox_conf_maxout" + type: "Eltwise" + bottom: "conv3_3_norm_mbox_conf1" + bottom: "conv3_3_norm_mbox_conf2" + bottom: "conv3_3_norm_mbox_conf3" + top: "conv3_3_norm_mbox_conf_maxout" + eltwise_param { + operation: MAX + } +} +layer { + name: "conv3_3_norm_mbox_conf_out" + type: "Concat" + bottom: "conv3_3_norm_mbox_conf_maxout" + bottom: "conv3_3_norm_mbox_conf4" + top: "conv3_3_norm_mbox_conf_out" + concat_param { + axis: 1 + } +} +layer { + name: "conv3_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv3_3_norm_mbox_conf_out" + top: "conv3_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv3_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv3_3_norm_mbox_conf_perm" + top: "conv3_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv3_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv3_3_norm" + bottom: "data" + top: "conv3_3_norm_mbox_priorbox" + prior_box_param { + min_size: 16 + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 4 + offset: 0.5 + } +} +layer { + name: "conv4_3_norm" + type: "Normalize" + bottom: "conv4_3" + top: "conv4_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 8 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 2 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 32 + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 8 + offset: 0.5 + } +} +layer { + name: "conv5_3_norm" + type: "Normalize" + bottom: "conv5_3" + top: "conv5_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 5 + } + channel_shared: false + } +} +layer { + name: "conv5_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv5_3_norm" + top: "conv5_3_norm_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv5_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv5_3_norm_mbox_loc" + top: "conv5_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv5_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv5_3_norm_mbox_loc_perm" + top: "conv5_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv5_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv5_3_norm" + top: "conv5_3_norm_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 2 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv5_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv5_3_norm_mbox_conf" + top: "conv5_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv5_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv5_3_norm_mbox_conf_perm" + top: "conv5_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv5_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv5_3_norm" + bottom: "data" + top: "conv5_3_norm_mbox_priorbox" + prior_box_param { + min_size: 64 + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 16 + offset: 0.5 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 2 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 128 + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 32 + offset: 0.5 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 2 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 256 + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 64 + offset: 0.5 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 4 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 2 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 512 + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 128 + offset: 0.5 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv3_3_norm_mbox_loc_flat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "conv5_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv3_3_norm_mbox_conf_flat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "conv5_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv3_3_norm_mbox_priorbox" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "conv5_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} +layer { + name: "mbox_conf_reshape" + type: "Reshape" + bottom: "mbox_conf" + top: "mbox_conf_reshape" + reshape_param { + shape { + dim: 0 + dim: -1 + dim: 2 + } + } +} +layer { + name: "mbox_conf_softmax" + type: "Softmax" + bottom: "mbox_conf_reshape" + top: "mbox_conf_softmax" + softmax_param { + axis: 2 + } +} +layer { + name: "mbox_conf_flatten" + type: "Flatten" + bottom: "mbox_conf_softmax" + top: "mbox_conf_flatten" + flatten_param { + axis: 1 + } +} +layer { + name: "detection_out" + type: "DetectionOutput" + bottom: "mbox_loc" + bottom: "mbox_conf_flatten" + bottom: "mbox_priorbox" + top: "detection_out" + include { + phase: TEST + } + detection_output_param { + num_classes: 2 + share_location: true + background_label_id: 0 + nms_param { + nms_threshold: 0.3 + top_k: 5000 + } + code_type: CENTER_SIZE + keep_top_k: 750 + confidence_threshold: 0.6 + } +} + diff --git a/examples/faceboxes/faceboxes_test.py b/examples/faceboxes/faceboxes_test.py new file mode 100644 index 00000000000..ace7b1c91c8 --- /dev/null +++ b/examples/faceboxes/faceboxes_test.py @@ -0,0 +1,61 @@ +import numpy as np +import sys, os +import cv2 + +sys.path.insert(0, '../../python') +import caffe +import time + +net_file = 'SSD.prototxt' +caffe_model = 'SSD.caffemodel' +test_dir = "images" + +if not os.path.exists(caffe_model): + print("SSD.caffemodel does not exist, see https://github.com/sfzhang15/SFD") + exit() +caffe.set_mode_gpu() +net = caffe.Net(net_file, caffe_model, caffe.TEST) + +CLASSES = ('background', + 'face') + +transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) +transformer.set_transpose('data', (2, 0, 1)) +transformer.set_mean('data', np.array([104, 117, 123])) # mean pixel + + +def postprocess(img, out): + h = img.shape[0] + w = img.shape[1] + box = out['detection_out'][0, 0, :, 3:7] * np.array([w, h, w, h]) + cls = out['detection_out'][0, 0, :, 1] + conf = out['detection_out'][0, 0, :, 2] + return (box.astype(np.int32), conf, cls) + + +def detect(imgfile): + frame = cv2.imread(imgfile) + transformed_image = transformer.preprocess('data', frame) + net.blobs['data'].data[...] = transformed_image + time_start = time.time() + out = net.forward() + time_end = time.time() + print (time_end - time_start), + print ("s") + + box, conf, cls = postprocess(frame, out) + + for i in range(len(box)): + p1 = (box[i][0], box[i][1]) + p2 = (box[i][2], box[i][3]) + cv2.rectangle(frame, p1, p2, (0, 255, 0)) + p3 = (max(p1[0], 15), max(p1[1], 15)) + title = "%s:%.2f" % (CLASSES[int(cls[i])], conf[i]) + cv2.putText(frame, title, p3, cv2.FONT_ITALIC, 0.6, (0, 255, 0), 1) + cv2.imshow("SSD, %d boxes" % len(box), frame) + cv2.waitKey() + # if cv2.waitKey(100) & 0xFF == ord('q'): + # break + + +detect("pepper.jpg") diff --git a/examples/faceboxes/pepper.jpg b/examples/faceboxes/pepper.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c019ed4651b000d83f2b7ca29be742256474a529 GIT binary patch literal 504311 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

=203jp7^N1Kjw52u*KJ3pZW*lUgrMQ>H*VxV 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

XG6BAnKs00Kh#3<_F>_5xr{C!w<|lQ@A* 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�+Wqvt2kL8dznClRhK>@~b+57U5 z>?zHc?v=URsOdxiEnm~%nw1a0AkA|QND21`@=mmo&;r+ihzh@ae1uz>q-N@Vg z&s*%|%OfLK--^{{?Apx!4|&~w>M4Bu;wjCzPL3l0l=bp~Jw)}8tU6);5pd%K9i=uA zZf%yODceJNB_r?kFq7Y4^*cOz9uvcJfR*sXfNR}6Q`}^@02f=?gzp_v$}h>&j8-BU zy)JAxXdkS%6+buO+z%g+aT$7gHFW^lA1^fI%H;zxOht3DE=5b2>(T+*hLYdVV?0im16{ie#E-N?qST31Vo;r(4 zvF6;=twfTZFi`&;BGQYdI#swBcePBZiu61%Ej0G%_TbZ~7YUfvqZSDm){_?zZ=V+Y z6>4={VV+YEnbzU}kTWAQ-k}@L^{Tr8XB4K>VO+Fce2V1S4&-ir{=?`5kScj-e_51t`DThWYjP(mskZ*)D{4%mQ%y1#={{)x^>VGmO= zx#Q^P4uE)(`bhnz!TgMTZA+p|URDYcE|^&m-cXwF$_JxV9LP%k<#0_Mj1YFNZ04O6 zE_O5dAu<{=uUJwEliLY^kmE$gAOBR%m>pd4sV(vil<`fbB0O{cM6<}k)jxD}Q(7>1 zyg^METX2Wf?NaM$Yr{%uL9+L&1idcYJ>4-x+kj9Ck6xRL&wo}V9q!X*y+I=tU};Wk zm6}jUp#T89uO{kgav(a!?w#_Zq15}*014{FBk^A(f~B(e_`Yy z)o|Gg_QPaq-1?11?b-r80gRn+UaYnUT9h$^E1r2Y(2n;qCxQ_klG#3S3K?c^c+jeQ zV(C*?hqFXl5j*z?VV?cmgyKJ#Uaf>KLlMlViCeJ8p8Ba3FzEscmZYEU=7LPuv!1X& zJO!8-z^~RE?deO@<|GQTC^9?cepMSksyQ5IaZRBCOJ1P2XLb1xr&?EZtu81*Q&SJ= zm-hFPuQr@eX~2r}W`e zj%tY;&ArzdwV~dR@tV6;?GcrqkdvYvmywX5trK5D$EQKM8c{ODBsM$aTUG>QnnCoX z=$zdC=VoOtI~y#45;N8J9;mxAR!_Cpyf^2h8>_bDp_`l&{bB*hU$3L ztUg?y(yP2ut7vbRH~g0A@?Qf@uL;%QSZD7K=h$~<_wF??OK_V-LZz*<#*;txYSJ&+ zqx%q3fvp$)cKA-l>B~JHmD`^iR*vNNAu=5&8B2ofLhL9lGMb&jGr6u_U>M2Zxrr!M z(X&ITq^fa}Ei-`uhES8M!r&wA>UZFx5iNv{W>k7P6dQgNjZIq#M%~ScV24rWmmG_W zA)k-R5#o@$0$U)q5enLph>a4DHi9N6wc+K(smtw69sjs<{4;zR2DWA=L|@BI^V)7B z-5LO!eDD#x`ft+7@cnC+>zkV%hYG~KN3ExGfEFO=`R=dvgW#Zaw4+_&zl1yBIuenV zBp24+2eYj{kny%FzVi$5E}3?AFX+J=0D~QrH?djf*G-IpD)CJ*xd&oucC1e)(C?6+Tb2t5?= zjha1wyz_ZKY|%L0L@z6QGyEnxFlQ=|>ldOl7n=OSJzr9)J>PHM34-;_O@m0$vjL{J z8nqq(Q0eTo{E*EkpNo9iE0c%^q*%Qj@wbHlPX&hT%9?n#>_ z-D`NT55UP6&@G3itup&7wGw-PcsvcSwU>FDScZb_tFnq29q6=17ebB1jO zt5`KpsQ}BlR#3~6kOTCxn!x|0h!*y~`Kd66(X5wm;{Hut<8@efow- zXWP;%z`opKEU|HWRZoS0rICxQYpM~+E;{m zq5Lol@J$NlW}lXBI(^6nva&XfZ}{{dBks&`-UW1vwBdd!myHQXi%tv|p4IuZb@9oV z3fB~Pm%&VtxG=uZ@yWZNim|m?TMUX>PsJk zerf6=JODIvH+Iv;Nkn_zdpocT#9tc7&T__uuk4><5ljT1ZQGn z-la_Akdm(ZK9ZwDXy;=(58UN^XK6V5Z6v7CqL| zjh}y!sK)w5wQhz4JVs-P5A_?tH3^y6c6+CErd+0(tWB3KnZs7|8a*=J9mQWU+Uro9S>^mRs@NNRG2z!AYLwB|T{MAsG zX6q&u<1NU-O+e0w%eS@-*iYuI@wX$ZfqdETr;U^abO<;fU~_lb!JesODBf{>ELA3FLvb8~qkk1^E5@{xE~W1=J1iyO-gx=K*gKIt;f++v>jdhu(@3UApTQ}INZWz?eiVpWf zHb6-@OA(m3CbWl!=xN(s{f}gS_wBc`0|PmXHidnTE$|KFH(Duj4!#^Yl{ge@1C1(V zgWki%7xWO8LxJFOxb_Vp6@|{=2F8r26S=^-k9;TvLJB~&tphICyqUNpM6&6Pv(}9$ z+U@cT8^lyk%wJc@uFh|bsw*M~mX#wKO?X}7)n|RzDm}Mq6CJX1a{IpOR?!Fy31>|9EFF5lTh0N}prWloI3CO;4ZK0*8m)Qo-1 z6xU39_|8hY7>@y{4LjCdB((Cdckxxb>aHzOe|I6Tsa!|+7!7LS+qK+`v&*p9DN0?a z&(K8V$;i+;yYx~zw(Fh+8-Tq%Eq_iC9jmaqdKcmhd*aY$1)iSMQS3^rKemyN7&JmW zAlH$WLY@bMr1Ua9O)+z9@9393TR|Vc&iytF05bc^VF9cHY5A6nH?l8~=(>VXvU8K3 z)6I>yO`MYLxGxIkLvswG%watMK@E3|PcA2nUH3=&J?%YXjD!-IvTD0M8>fiBlvnhq zwttnIb{m(xr7?50sV-@FAT*NSIy`(}d2P15ve3_@{%3`19 zr|ZQq7WSqv#mDvNB2Zj4Io&SF)Nv&Tb?0hfri{iFNQh*slV9Ex<@*%pe1_YF@{;>1el2Dt1S~5r zVy0t!;hKr7onq}dZ0s+5`R0{re<#sN&*N`$R{XzT zwr3aLRJiY#bPtXIy~(rpMe$Dy8J%kQh~4zAPF>lKj-p}lEZf9Hc-Vx#^j*vF2%45x zTcRSe2MhBDTQ7Z`D=(tekU%atGgQ=S`OGJ!KyHKW{O*V$8&5Jlm%}bMAAQZvv*J2x z)_`O)(mc$Zt{lyV3~W~+c0R3J9`JpgeE=qWSvGtGo|lz1Yz>8`HWGMIVdtCdux-5u zSKFm>`;FcQy9jv>F-?i6{&tTNCHEa8Kgh~BzWei;(xF!O^vmW4aN|$0y}oKiSPML1%$((qAw$S#K%b(rDvpt)s{CC3*cs_PzxKl5 zCy$^CMIF|ROSDuIn|VxIM5myVTlYVW`ocdItTs_=qQxt6ne>|_D@rm{0_{bZ#qEEX ziEXtenmEfOK>Z^@u0MCTp6$Bv50~eR*1U4Gc5pR@n=k`MVJ5A|-(nDhJ~1CsxIF7$ z66Rl>grHxEjR-Jn6t9Fvj<#+XcqGUjno{h5ZOc~%6DEtp)d>S9$4DUlO{CAN$m%xw zYquR%o{|_Bv$bUY3~SM7|L}5eVEd0+;bTOSCz4Ke%fTdtwH)W+X0`RL zOi1DSKwMPJZJV)odI+sZ=xrPD*!Pz}l`4G&hv`=RVIoGscu=wQPIAQkh=uW#S_gPg zobF8FcVITUm%AHJ_xE|><{1g5Zf*u$^uceP1uZLAy&RF8z7=D@qjnLv_vYvp^JrH2 z9nHM21KV`UF7{p(@osbQi&k*9AOi(K%Moj~*baUU`ja16y>^#QyV+caEy=-`AvAr$ zQZy=6=)6R-$=X%&JVy|pX!1itS`nU^SFjMdgBk}4?YFKn$s+i>0#^n6-F<&(&ZiS>k)GvS zqP(!N>$1|2=q=6NPxgGD!pMGo8QA@mStXleY;>&?5a?fOoz-=9zrS6J5=CzK_(-LK zC<+H>T_D(I+$NNIA2x0>PD`ua6vbUw5q%teqR@YEfRJQ59J$@?^8T=|3AdN=g3pFd`+|K{!;1J9B;! z)Lr1N^wqgIN^M>lF18RMJo^(-wU3b{n!bJcQ0^s#_h6J$7YGpzecpqr`u7age6kO+ z$>^KsG6K?z0gEW4sVZo@Z`)vGdHA$KNC z?4!Imo(MkDXQ+-%EC1KpBX8SF$u*nCK0MbVr;N90Og!R@=#%kYiWZ#Sb3}*(;jNBMsi{cdZ zXPDXNdeo|go-!oq|FzFw58IHm)+*QvkQOO=yBwyk7rbHM{DO^2QQ*aU>#wB-QzLKX zjZRU@!Pf3v4b3GiFAYA%L|pkv@=H(?8mhj*^wvkZl`f3`ux#yV%`4=$CYSH5V9qq< zLl39U8Qb*%{p-6f>>j${VY}wRar$=6H`5x|g_WtrfE2v^*4K`{fm)MZA9vhtE?A1z zMmxy7LsMyBFJ{~i8gRX+Z((WhJ9i!&?X#d!%s#n8Lvg2bQ_L{N3x*ut5ZCs~mb~JS zfzw6jtqYBh(e9dN(w=F7p9d%BUypfBkFQe^fW|+E7X%+3cTG8WgKp$goV%j2VJ82w zeF}qPUvzMlZ2v>f!!HL^dkFI7O%QvBpzz?QI~Ol3CNF&6{jm&L4nV~sb63xw3~^?yL53cxP^@z8|N(ey;*0Ed@#Q zTXgfE$8<(5i!gn3PyM-z^m^>>!-Idr!^gVM$jEu>d%>B)r7F;4=!v#gH zjS8?1M1ao!A6f4mPj&yt4__szj8Y*x3E8r@N+?^#L1t#wu{mZD%HDe<+2e3*=OCHK z-W;5R9D5v&Jr2Lm^}QeW{pkAL|MZ7HJD>M!Jl9LDF6~yv_Z$gvQAz=Qf?{ery+D5d z?oINgMHdxkKfznP16eD4c-nO1PBvds(~pTy%p=B+`KZxWB-;YKHrd7n%w?s!)rtlF ze@CUpg2OdCo-Z;FB$58n?H?nZoX#(eZG=~}$WICZ$L-V>0|pi5+`B4RAG#R(l=P(R z2k3kqA7ol{ESSBK7u{HtW$iuY^wgkt!Y)15s9mMG91VA1w}}EPsf#3MY5qDvUnjo$ z67N-Bh-$^&;!AH=Q7>=@xUt4N{kz6>=QIPrbq|^)HhY8v1+F!D-D>k7$Z=RUR$JT0 zh(bFC>06DRRDc;s>vjkt_KvT=fAISexa771+D^$d_gySEu)UM~ROl`_#l9pBKU`lHoDm9+Rj{jN^Qk-mE$8R2@Z?}?T^83)rHYvRTQaCKYXf1ZTV zwQW{0N#=NcRrr+f1d^}=88bcHKs0sC@kQ+Yz6YG4nzu8E+HZ0+^MQi;Dk=`?LV-Vs z)N~2$I%6UJL+DX!PGJeqezXprLTlT%5+)80@3YH9(TP4uF25#Xpyj%ejO|}apUIvb z>YgDfG!w3LF{J4`8Z83O2gh4Tb^P1=Zf z1f4g*05fvk#(%d5J}IHF@BI+Le@2Yo;BUGofB(oMTsI5knU{Dyad<2xKuK5sg`Fv? zMf_bSF>N_dUs7;9ADmP~q)pe}LG|r8GC){FWi{#3k#WR9!37cV->?tLR}pit%H5|v zd1v4LhQyth;<>lecvP}`(@ue}iHSnyEjnPPeZdj^MQX!W;*N=W)Hi!!P|>(&O4o_qyQ*C$b97(5 zt43b62Onl>Y-$V4*1{DK4H}GrqsCds!ztdF-P$Vu+>JiE)PtAIioQTsl#I=Euk1Rh z;Ex>D@BygplKbS~7`Mj-K3N1f3*^C2Nf!Mhj7PjzX=we}jGGbP42xNN2 zhWL?4w<84+=eqcSrXL2t9229yDND8+&2DI{x74p5X6=rhH0!IEZ%U)wKB#muB<+t} zLp+ACVEQJ#Js1>P(~jSTB&_nCJfB zLc&xisH{G1&f?Ekj7F6y8}zxEaJ=@_T7#+F#zeNSKDjF*J@99^Z`qFnTdExCPvOxS zODs!2O~n?)(uf|rb;}F8(?BQaRI~^Wb^rU&X5-rlP-Hg|`DxU;oa4$rfAhnfzXA26XD6Tb{Qz7bMLEQ&fbywvGA|9F3km5~g5#m(Yr>ij#&X|I6`c4c$g;}mWHbD`3OLNRM_B`39g>mG3;S&)>_ zeNwIfz1N1$A-gg~FefKhF zG3E4rj(NT)RyBJKN!n=KZgMu)FcETp-OO(Rin-5}aVzS*yhZZDN%NwOoK6x$`5%Ij zSNb4^D!JAu)v%_kJGyfIdBIuU-{bU+xBP4O6wUW)TYEkZl!oqxlc>%CO7aWU+w$Ja zLCwz*k5gEq7sB^*l2WO{ho;$R(yq_=&9uFrCJlf^<@!j$5$+$KCt0b7`%i1F){0$ifh;np3 zWa6TIA|L2-ttQRG*4ni%ZI8!X&;xHUSux9Kom8*jDxeXD=*)7U6Wuz6WJtqk{c&77FKNRNGIw>^RPp8il+y1b_999wItOd^)7(_MC^1lpt2ZOl9;;PH z%ky1R^4dg_{QAc22e%$Tzp+nY8EN;|F=2kqKA|HTlaWs)=e}$!0sogy|HMX3tsB;v zooM2I!{%)dXl-lp&mud>*SZLXFjaNh{*5kmA|H9_(@inKcG9eVof`>`?0&I}6Kb2A zhF~j@>-VLmaIdl;FIB^IV*~fa+z%(^p1;BAw=|pSEo=Kj6W^G)_52FGdX+9-lyg9T zi+YB}Uul2MS(g%ZdNrOSVL;ki5$!#-7&Kpg4g?ZL!U&e3?%}aU!4}p_t-2@|IM|obv~(S*-DY<%FE-fYDh0kJIV%V zS(XGN;q94JIfdS4yR*v9aBJ?LjjVMqZv1G-RUkPK(*D?2ur}#o!XF#qmh>B87Z4D2 zq7yt#DH@Wp)kX}f8f(3wI9*>8fN`3kGr3X<6)O)k-nc_J6xXLX`s zO%pTqj?EbtNJIv6ADnL}BU}Jy(}gd|A}W(k%Zwk;xi`*uA5%J*=qhN{35-p_Npr2; zlEpks8~e7?UD&O=cg&M(9)+i~u|=VI>BJ)b5&9_gxB-;Kw!~D*>Hon_+cz|gu7G9U zJj(Z(7Ov~<2k^eEcC*9u4if}ZFS#9=9SW&6WG*rxkiAGo8Dvd;Kcwr~Kb)KPX|7km z|KVCqehMt%ntC_%>Vx`pz=*E2atWR#!K*&?CCOA?hNPsghFl>7R36P<^i4a`B6TfH z;3+m8v2N{pADnalc9%4m=U3@*%suy(Mg0}80m=--^JyP;6N@+#D76F6?Bnko+}%Mp z8?@~L3|@;leOW5BltGb=3q+jVR8_rGy~gK2E$nXS%VcM2vhH}g8HWcp`fe`e>QZl| z+fNQYEf zz!*PVzwIU@A;#D7K3xf8>**V48&l+#J-B1J^oeDN-eUk!om~6IeAuQPbvs9t!O9}2 zm9Cv$5eb)Rr>{Lt;pOS?yNQ3b?Ap;gh}mk+&}QvVk{1$!kOPwgMyeOfZ?w#a!Ysar zjmED+k-KMd!iW}OA%w$Y@IsbV=*=P|9A7viSVG##e>n8&fa6IucLj>gRxfM`2|AQT zr+m2|aQ8v@FYeW2pFO1EV$7k9P;Ugqn{eonoL&7v?TqfHTIfK*2akc`6okEnXFct@ z+A!QVVU;j$X%gl8HQ(PHCFBe~=zMuQOd21?rQDK2o#X$Ggx-7Y9;R4-0l3O2qS7@G zPt6?f3VX_?;Q>v1yb~P0!lKYU5G?3a@Ux+AvtowGK6S$C+T!QCL=0Qies@JdahY2XfdfPpTw&U1FQ>rm8{=RV`zjYE_YU<6ua)i) z@H5ZPnl!bU)0W8@c1CQP4GySaZw|>MP94uVZnT`69dwdv&vI**wlU9E#aJMiq2J!4 zYh72gsJEjO0fJJNdRc-NM+@*px&Jnm=wkU(*pW`;{R%r+(DEy z^e4oeZ=4$ln;))+D8Fn0_AC-)Y1WKKJAEhwF8rDy;_~HMBoC;yjK4_6AEq}gHS(M! zDldDO>tcy}`R>BX+kep}QLr~ll!``sgbTrrC3e}eEBM&l7A@_?J&7@l;eI-ERaCIp6kn(iVx4DxJWo_0L{)^;aVE+pQW*o_dSw6s!}_ ziZ38z9zME^?*jqcu<*3JhwT(4Thr><>FG34r@b&{EJF3|-nF-TovUiw$+CtcbMtnf z+F9MQiZlo&3k#9s^*lcU@>v?qF=})`Vj90x6tTnlC*vK*kD+Bxflr8Ml__rDw~Wh` zS8s4m1)feaC!b;}YV}q*b&#wuPHFNc; z31V#k@ghJ5lkYeonCbB`)twzXu!_Z0)~W>~f0vYLlt+s|-2;;hLpTpQ4>SE{zUuqu z3klV!uIsG9w1a6rDY%=tq&d6Kettns8y>&&O?f8wy z?aDeiIi1Ac0q+7Cui!oS5w3uXtv%)JABRoP%@~fy#s%n?HY2EH>5FBftGlzO7zBbQ z$UlFmJMZQovKXZyS1QTXKI=Xk3laH%H#eMzBz1Z$<>c;xmnyAAL~H-9XE$Enl8j;3 zXdBY%U{L!SeU={4utbmLR%moJ$$q6u?XFGmtyJ09I-#LvY_-3uw7uWAld%DBR5owP z^a@;C-wLdKAV+7su!yJC(aG)xtI1oe0B8#AVXF7Oe)z+2)JP-Dq1b_b`N3d30EHojjx{_(|Dg^Zm><;RN&+N z!Z4AIdmxd@rbm2YTZ|-=j=FWiTVG2E>m1nZxgPs7QGK0P_UdQ$q*VJEU&cmZs1SBT zZZc=P=19v$`g;J8(=k!h`HI_f%(0|6pv?Zm`!g7e&aXn;j`#X@;oT)^LG4fln ziNSN*F|LikkM%-*r|iiR(3b;Xwy)-X8izT*iGgP(YPIN(o@&fLoYX zWdWwm?nn#hA^Lcn`kkngk(WB{9p=ec8ND`(&&#Y67r?M3SFv#ST(PS;@4>ZT7F*$) zkrpk-9>WE9$#G0TT6@opYOi&elcDeWTgLOefD&GSp&)&DvD%e#P4c^?ERZjC$G)1y z#sK7Yt8njcj`*>C(N?oVmlMFFlw1l&40n<98w`F10y3d1y~Mtj-mFz0Bn4h;c};n9 zpsxkUuaXx981H=nF$(;7U^EI!CjS>Ze*jc7^Cepc-}!in1~YOV$wSPDDV@e@FN9+` zpJRCe0xeB%yW-Qg5E;}N7p&^jb4r4C?)uR1a&p>v_D5a0Y+jcT{};rM4pPEoOAZNq z+4;C|>jR?iNPy6I>r<%MME@(?XYP9*k-i>V-r3q5z0de1*;i{LTdqghuiLwQN?_~T zI&r54R&`Ng9`qodEVdMSFN*Xn>t~0?U%6a=1`_=I_ukV^I;5 zt68~4+Mer=eNBbis8HbIZdMzID(Gw696CSE`_LMvhW0 z1~s!kdU6I7lF(@QDsztl?*x{6zAAiFB<=lun%dj($IYiQPnUs_tnvdk4>s*XeQsRu z|HNTQ9Juyz*~P6gNoxW_-A$6F?os z;un+w8TRp(kHh_zKchpFjaJ>#gSAS3t0gDB#V?*Iu{>)rFnLU)oIPIsyx|*a+9)KI z_Oo<|vrijh_B2?gkkiTDRw}+G!YWT(^jXX>2IsiWWh#Fk=h~FkeSks+&oTWIr zheCx(&rH>iNRJ7B%_g18-?ek{T=k(2o@)NMPhWh$2dPA) zOE~0r<$v60&AAQ2j@KC5@TJ}i2pb=4Yb&N~h!bls%Sm%+rESlsix*?WBj8UVN(CM> zv@+awm(J|a&lOj{R=W;&if9Ju5I%bA{TKX=!gaJ0aI&TTB4nwE>KLk}=2U{3+@$XU zRs+QpZo3_{2sby$;V}C4&nM^-6h))3@!X7Kl^I_TA?{@`}rI$-Qp<-956t z({IP_6^D@VS8~4GedQGpgZ=#If6;Wx6K1W4p?<_qj&@7(a`zRpU+McTeaOu;1)5)@ zv7Ht&$ls?e9r}fg-(7^e<1PAunDB^#K`*!*Osg1)LY|q8i^Bgnhp83P4Pm)LT1Api zY07hJog}SqYhS)`!nG;MvO$Uy(7$%i@&FuEsA20Vz4v9BG@3`MVqul*R6^u8uoI;D z!hXeD9A!4Obt`{XsQx0G z(#~~z@hitNxC+d4HkML!?mu?PWqNQajK-bCmu9~uG=jCE>iK@YKvW=vNIgK2++?QyM(5dbc5X(L{Ox^moVuBdS=VsJ2&mvFrK>K*Vp}cC ziw?dcd?-9sV=U(nRUUuG=}>VG13lf>JFV&+VuQ%F$8qtUUUCAHlx^|7`BEizD?lnGLes6PQ;9BzpSeT@{TfS0JE|0sJZ{TL!0B;cu)w7dUkt|SD zGdsz)*+J=rVZ?tRQ8pJD$@)9*R{lJIw7lzRgcNIX{#%(CJfKMJhH>$Hr1mX0J7uKk zm!CV|q+~T6JUfM$4>ijj3Ta-pZXUpqFlySyF`!;{5oVw|>rN*NtjzS7U-41pk-jE% z29G~v8G90^WGz~4_FrJvsX6^$;@5BJXP>k<*m+*RVcWrESi`1;FTiXUge@NOy?pEw zsxHRf&y&g#+y#K@jmnF~1^d`W@dx9n|NjH8$+*qjGfp^SM7P%#Ls?pTm*t=sNJ!i+qXQITx{ zx{o&xs^fHPwq!2ddtPuUHB(8nFTRZd)3uWvP#-G&Ndd%ftsJiY?6oB=;727YDP~EM zPvAjjWSe7Z;t_D6WHE_svGsVGKfeMPrGUWyVo&Ri7b#1zNdS1BH)OWE@n8yk3nfk& zJpZDi=Slrul7(y!=L6LMRtYr+P^fCf{F@MH-Rukz@0c!vd7-98ljRBY;v_k=wiy0C z9)Y~GADZ-HFH*7LV z=X*ko}ssl&pGMeE9{x+gV?V_f-fIy= zWJbW^;1#u|wvRbkoxE9U=&N4Fdrc@%vp44zR%HH*ZPyGnkX^$hkAP}oA?LBBI3J6B zYo81;97GO?J24oVU8PmEj+~mf`hbusMTl#^O9b9~(Sj>3@mQU_TIJ>VJ0a5YzKYAR zc78MZ+hWz38Ei`}*=y|FLoyYtHg}c7adxIfSwsXUwHO!VH%=}TTCmgHmSX%4ll!hNo2j?Br*Mrz-8_ z{YYkq(5B;8K@`0WJijvLz0=DO5(hUbo-OOtpv~TQ)oU~@ss$o5dXWfI`E0Ro@hSOU zOQd9Dkr;8IJLa?AGbu3IcKF~?g;WTabq<9z|G=W)BK>h?S!SB^W!#@IW!Y;h#8bOJ z`O{Sc@;LvQO5e@Uf8wnYdK>{b%&ffIeIka;D55oPcCiyARfdNh*I9E?mAG>6asUb! z4*v7nx6+HuA=gN_afS2(L-fBN{q3^4g{O3*Ji@V3XM6PXNs%$B<-Y1TaH@zOdToc0 zP7{z8d7;Lg_$M3(dJ0J?vI=cBtRl&)J5l#k^<3fX;IIn;bPTH&aW&pv2Oy1qU+Jz( zsMvwImQV)3de3&vlG?r4TH)$|+%a!KSPr9crmkO7Z1FUzMH2U_ZqgjR52fi^aANO* z+oH;oS32KX#}fLIuYpXXgHpI@2rh?EKr?h)Fb1ACKz#z8&D7;#)g;=iRxj>A+}ai& zVyw6|T`|*;U~#BXESKRjzmI5-OJW{X{%?Sy?qxpi$dvRo+gS0_U;}v zo#QCv`Vy&_i=GkGec7WON+S@9uReJ7TyW7ul|KRAt1QZ#>~yzbp8EDpL*d|MfXfk)5O{yhJA~J zLh%|=n}KZ@bpCv0^FJw<@vm3%c5!*9MI4Vj1oCENP;tDPm; zlA6U@Z_Z$QZU)N4arlq3N2G@6J+>FE-@2t>#0nOcxPw6&nj1tU?vQ!FOREAQ+c8G+ zfbijLw+b7zX-vID&ObB5F@rBTZFHr?4p9A0z>n5dfmDBoQagTTBgy(@zsH}Rkh-YG zjLfiWx4+FVfh@Lh3UVWSh<>%3Q)+{Jo~t>?98hXb0!T7$vL)PW?@nHMD4!j-z~xJA zHhg*!9?Z~gaJ#+AuI>2#qxYxBuWd?ep%c05m4|G7yG~#poM-6%PBc~x(57;DrkN49 zZ;oF~d$0WS+Dn2K7SD{8#xIQh1Kx_((UzC7H^;Pg!)>F4$Tk4jbbdry)??{<;|`K* zv2>5(D-oPTWXD|eR|-3%)y(@i4XgHJ6%AYnu|Q@txT?f^g=K@pgkVlABSY-Hrb}V% z5V70tvcUB%rJb(O(=&1aF8!7?xD?tWw@t+!(!(bb&Y8_ZJEgzif^6 zUDplLA@L;#a)RlTMLA|LYHv+ikqm-rHxHA)FJg9uQfZ8|lx1c1AAUHpN3Iid6Vx|> zwI^*cDn;nQir%q?{eR+t;-w#3k|faP#V(R7q3?!eV|$6`-lyz8{H>yq=%#hPg+JeV z@$8Sc^ubR}Ek(Woty_F@+U)3E7@V|Re3fIokEJU6 zE6i4&@ur%(3|IJa_AYv`aGNzBXB-HQNFjt2zau7n zgYaL8i+O4a%A~-{mw`}g>?LHGDgSQGW-yToRD;%(DxUVRovxX83MynasdKRO%hZ ztzsBzl6u{+zzS*oKvrMiMpVrY1Gr=RIRtsGFkw#-9TOJ05?c&8SqHd8ErazT4;#0K z()bZblYwZnS!nxV??W=Sw~tJi&nhz|%!?%dmbl@|<@c{2nT@xR@jql$GQxw%|7GO5 zLasON7HqU_%}5UnEAwdXdau3xY}9X;*_Si^}!Qxkvpk~U|%LJwWk-n1ceI0!7kN9WVZEgnIJ&dEViGKBB^(E=%4ERPe!+5iy zZRix`eq}7y<0%MN5P?-I2B_Zj1AfC=MJ*ViTLd`)vG?#~ue>vlE(eyi1nJZq=4^7hPlid~{PDw!iiz zNzQ)F#*3t18*+}Zc>@5uFNhs7IhQY7wBrGlBx#C?5g@U}z9VOB?Hg_R9wQS>a2jw@ z!C2B_2wV^^&i)LZp^U`Oh^Dk-K{1zbC%-n~ym`gYl!0C1u+0gG+{+Z zB8S=0SG)QO>vxkbemB94B-YR>8dO3N)Og)Y|MQTc;UZs8NHA`~Elxj$;_sh4sKea9 z=kb(YCh)dH3dtdNSXNi^jY3Y4!$g(89OBtCU%?hecC}$ID;N~_lymbXzDX^GzSx5W zt4F!3^6P7e_2D1>xlSB-uzhdso33bD3OVO2XdC)Joud&hG$qr$jn1$}Yr-CKZraCx zXyf{DxIa^yDB*jliO9Rt48N$1Iv=r0>~!K{{?@Zn_#^t0O=HpX6pm)g+0VLeD>`14y&}1OEp;| zCS*YhnWG@aS1&Q{D5_gp8v~jCxrz3+a6{BIM!>QJz=A9L0l+d0nA=|-Rvgz=v}v3f z(U4ES`s7tf^1G2>xdcpJk7Kz3^cYB;l?v9-p&&1}y{Ry}%Jd^UrFw*FAyNgErHTC!b615tiMFfsRbd?%Gm(64M^%Ohiz}urH(R^rrIh9rOx-JkfV|q zVD%v$RvbyY19ipQ%Dr;pf1_@(&=eFE=-CI0F>e+>nkuUCTdvDNuks%&@zEU~bd&xm z68YyEfbP4ryh|*+x5`b-+a8n9AY{)fwXLcu>^aA!gYOxvQS%J_kuA|9{_AG$8wZf~ z>QSfduC#(ZB0v1r9T&fm^pvN;~eQM^Y|uVRvk4RNV6I9p+^mius*pUrLBDV-iO zVD0VY;BCNC9m8cj3@4>FyPe#(qle`>B|fwwb~SH-ZH4Svjn2-*l?%51Nj3H?V?x)YjXt2_=`3zqvCCyhto%qkePqr>HeK1MAB zBF6$*Pw&`RQDgHoPFJrF6%i21j`3nnyu2L>dKb^ay@*MUpVetBX7#kw=XGl(P2`sH zRoVYavAArVB=3IwJ<_+P;9$biE5=5%`WpoP45G~kX(eullf)nU%T;^5#*KNZA7MF9 zP*iMRSd;QmNtqNXP}%SF$FyoJXeWA%##p0Tjg*%V~!DhUFfgIpIQu~T;}}p#hWk2+S=kl+fET~xtF+6 zr%L8gKzt;lbI6okS{jDDLL7I19@0(BEL)ymw`V!N)JRkueWBl=kK2^ZP)h!npm_@D z6<}=l%#8=4fhQk3s~Zn0NJU&IJDK_j$x((+W5A~ak4)$){lVV;@We&qI*0-9eh><7 zd6!S$hME_M^!XWqE z3(QN}Wd%S*BX%>VepX~Vxkb+&T$-h(rzE6kKRri>gAredc)iI{vu*6k(d( zyh*#|t_|MQX*W35L^^W*bot05reb(8Jv=y*RJ^ErEGe?Z6U<}kGjfYwB?4fbPit3U zT;ggazWvDGa~LcwChHBL?-IocO-SKA>y zGv%(X3yfPi8mSzuvtLoVlR(}@@WHPR$H9HuLjS#Cs(Pl@f24jh>P#$eIZzA`JjEIF z+Day{(h!Osin$xzg%a#2|NgyR*1Z(ClLl?n75zdpXc0&y%LX(CAIb9odVE?}~|l#bhW6wpX8r{jmU}5{;IeKAQi!2&e;h-T`@P9|arC z4*4ZgH`qw&3h%H#?t`?789&7h&(rl4(3BkzzFrlpKgSw;myb11W0-EYSEAC_cQpwp z=-0hNiv5G*zd8+E4m9z@blk6H)YFAC8m7cDmQ>p4c1)u&Oon{-sPQH#y*hK*C&ATz*PXXk zD3nt8WwE)dy`6?25#nte;_U(Aqj;KEs|u!Oa33~TF+wskzBZL4S1M&>aG!KnS!GZz zmfp6G<`!KSB2<6IYlw}1T=1NwOKNdU{f0Z1a{<%f4u~j!#vf}t8sz@q0kJq`tv#N1 zSaf@^I{qIxXg1VmHnl0=+pM9>?-p<0eOIA37S^zs-#3`iT<`V} zalKIh*mz6tUClfbgw$d?fBA8*84Dl=!KFnIR9*3p6@@-^LBxSc*=H}a@Od8fhSmN; zx__5g0P`Vev2evkgv}p?8KBMs{8R!wDwiN-rD;vZo_+zs7t)|XR&Y*xQa->NvJ?9-(WBY=i&*Zz1iLQWrG6$NuSyN&r4z-D`q!0C4%@!k9$ryXu zukr>wl+phb43oiq{irzf8*xmM!&v&v%0~=da-g%+Xg(CnA|SakMjN~k6eZh!uDsez zz8_7}-Gln}$%&_Etc8)c#U)Pt&I(~%Q?UiK+Dn}EAZwrUzGuE1FWxta1flFDAQRwJ47yv?oc;C;5SQ6OywT)_9nUl(i$6GXS-Q&>0B`OT`ke8 z7VJh;WSu}Lb?HrB%xzx33op&~3X2yr0RH_Twnshs62CL5 zkHLzHa%dg05A2?K6wo#!OLbAY#IB2R${2InlumCc9(2J!WE*U=9UMpO(K~1rq!iN= zQc2i%7jjppxB3!7r**0=O+X6Kd(1NPLvm0s;+a1ytJLOj?&oIEW@ zAd~X7x{b>@!+oyVPmX@;#n=CsxohIqW^*mK$r|_46lRNWK1Y4lj#};VXI<2t&Ud~+ zhVwh{f6Ck7FrVTh78!ah-@a+;>K@(7r z$x(&^t6OCr=6rv$4Qnn<_}RNR=0b&lrbL@^)llFwx1tF(FxG_|6HyI#!U|Hzk!Y3n zj2jd1Q@|e{24URb^~S{L;8tb8F{JFfb!obCvh8)9vo_tJzgLv#AX? zau^xEL?0fJ35OBg=YuD&1yFH2-{e%~PET7@n-zd|3020lBc!yNi@6*zhz+%N0e%#B zFbG(B*DE74jJ5FcZ2a)}v1xy?0{3F%#CZ*SD<%6;#X7qA0AcYmnDb}GZiZy}_uQ8_ zy(H@KlsML1oLV8kiaKu&fh9ViApZ%7^J0I7*!9eN4QVva zloLe{Hka|&NGACvz=Beg5^2~zw|c_gvSnJ6T-$@UV_}qD92+|{bCu`TW9Ru@>fUSF zaj4NDe{@G_ZwDOIcl0f7@n2^6aXoiWoP6^l`9xMD@q2G1lfLJDYu377@x*7D>n}`% z5mhMow>mEl-hqfuUM}%-DW29(m9$=E2hGzB#)(}*)ohHa6Yf=+UTf~78`r)(dil5> zUNEzog1*%CIvoo)3Te>f?1{ZNHHIKVY(O&({>Gvc_P+h4b%qm;b^lriCe%ZqRyf1- zsVYL(ig7%G+0s`Ra3_%@_{rHhm~cSab|pntv!|?j!-Xt0>ww)$I7S+W@A%VfnLA&8 zZDNz@0}&**2vz*C{)j1_s*?;_c49Xld^bHai*924o-zhnQzJ3J22jJeK{kLKWj@~E zdJko);JH?WrK-`1I#oQpMpSMU3jcH)ag6}bmqXJ0kXdT3*TB}zQ9=v|L)ddNTE((+ zGDoWLw0JgZ_V_aKwW^scyaxH-@HKXm4f9Y8{^zzLWB=@Z{KF3fdNse`29d|45_gyq zoGdN26Ro9=`+heLU-e(kFW-WC^T|~Vf-?Dv7Cq9XFdUvKjPv7uLy5i<se6gtkzPP%1C(}5=9doA}C7`Hr1z;;Yl%Hel) zoY(JRKHyJ^j0xkwePo*6%=P9DHXMyEjzVEqT?hRCrzp<=*hKrpsSBHqVD-t-lgkr= zES9;@xxyu{zK%eB17e%SS$+7*7l z^ZrWn>W3yvZ^gsRGRo{SK4d8s0pmUSaJb-N>_5k&QS%Kek!8NL(omy?Tl7nNCUw8A z-#S%(nfRzj zeFg?@z%s(J0hzzBzXW`xrmT92AKr7 zhWWSQK%d%)Y>9lYqc@V7?EtNUkXk^zl<-I5VbiseSp+kOtOZEgE?Xg>fsbY5G?(|T z{+YS@AZs%{Gc7a3ibev6QYHgL$(irt$!Ko`0QiR~^h&`=d)az>Ah>2!;&TicjxXQm z*dSG`{3)1@9dc}frz1EkImGgjVGijJWw)pM-^AqQ_&pHk;zm~dVTuC|`vDZPWUK66 zxbFspps4*uY=u5+m$v(QflF(08A9x0>kZX$QJHYqVA5mLq`q{(^rGirq4@W58?SEb z2;-GvbSb?<^<>56&O^T={$l+n4$IAck-EZTWKgG)K>FjpuJej@i>bV}ZtRXL)t|G$ zQqA9FPE+dDnU5hhDXqCjQ;B_(iT5IB%!-^ks7*u@mg}!-zh>lbaopHCIA{*9zf!&V zEiDJ(dBSw3yDfI9QrMd&f?EJKT0}bPo>r`t6VR3^8vdu2P!ZAhl00hpiYs z)HIH-N9cZZlMP6EUT0X=kp=f1#l|gVlwh-~lki9pH1$oWS7JWpDtGPUPEE1t?3v+q z2}Nniz+{eV!Z~dZ)6W0L15SmfFEI{gsRIOFWrV1xSTPfzLTYWju+fuvWU{_VPtX|w zVm^FsJ`h519c!k*p+h2?r^mIKGh@RWM%Uu&OAe_Ui(;(3Ck8(shE5%tJP4jOwg;=% zZ>(GvFIqw{=$?HFjhLS$HINj#jD(C;bnvM4qo1VfXi7#@SLxLGfrG_P6do`=$y0SI zaf_ppg1C*n4l(8g#UO9`?388a`i_R7Hx*W7cF5})*Dq{O0GNsEQiI&awbVN#90r5G z!=I8Wtt5fhe0lx`nP4_AzId{UHti){8hkc7c|UdvNUh5h6v@lzgKFZA<-LO`K`rkz zHMy;yh&TL+K9&YE?fPJoS?IRb=y3g@U2))F3*#TYrfKZ;p3(GLe8_A ztOP4p@%+P;3!-Jy$4|t60egUd>`#yWED>>6q z=$Hw5-!hTra}n?A%0v#taUGH~O?ZY>p*hP4%VA7>XmkIknK$5lV_u&YH>;JC>kC;DK$S<#pLEq~5{e z4QI%mY@ojpGcIyGkK`q_hn@2aB>-LjPnd8kMQG|nuGcmh`9h@DM=rGCe(&ck{-d{% zVXaBV`itXhUhwfW1#oJxATIRP8B3*VK4>t6ZW_aaz4Cm-z`U#QfpcS*4Gh@}9}u4; z`bn0Fz!0<;+n`!67tHa``_Ek5y>DTDU*>lf(J+la}b zP2V~t_Z+`uT*7MyU-dRD#t*V7CTGdzI zuA+ax=0Wj^#?#ivw(=Ni6J-z|4{))-j|Xr#p%~wi;!D1%Urh&2evLqiyxsQs%fUWJ z@dQrddSA^h8N+s*2So=w<$Ov9*R_>|Mc1vWeXwx5F9ViTU9rkOp1r;Al(;y-k;(WR zqLiIB6aA)9iAyC$&pEnRdEZWftB{WGaN`iOI8-BpE5U}`MhHDea{HQi{S4n?!4=L_ zb0o5b+|e>VuQeNge%?Agl+)vtkr?>mZw<@ibFvx6V@%(hY_9!>uLcKPUC*4coHhQ6 zMm(>8xzzIIrq(LALYb_XMq5nO82S%k^u4F*NlmM8_Mq;aMzJBls1TaxS(lAAo8t@& zMum;{O*V(9o79D-Y^gcc-?7u6={29`UIdkR1yjR#1E;FtCtt%;RnkZ3-Fz@1;Ci z@A4Zb>Yn(-2O0z@7Y(k?d6kIjQf1u7E2r90Tc7%z-I+-xUGUl9qH*_87v9N695?tB z4ApLz=Fe@<-SMDspFIbbEkU+Uhl`zSw^MxIEBiYIe&7{i4XB%y(e%?!XIaWDqOwu` z;O09dTT0yAx3!&)1bpIIPR}4?KtyDAyx6yFuh~$q7&h>qUiZ{~`}C1bBFO?Y;e0ivUQvQT6=hdede>bQj+G_6Son6w`r}Tt3p9YIxzAt4#?<6tNqH=fQkx7@jaz=fDkKFw9*02LR za`tTqxX>-uO$Fava{}P(B;Q>d*FNu9#i*b+uRo`wf$tqu{OgC~0&0|w>)jN$f6bPF zW--yV;-D^;Tac8jeqqNZG$m@8K*n5(slg+Vjt=SoF*;u&hNjDSAj7XCd|u;_KM17} z12L3vAuFEA7-{*v?k#s}RumN&{H0(ai!MCaF)6})e=C*8Z(l5}L%iHCCzd^=iwCsK zv;KE`Xh62Dx$~tc4)y@q|EQSZ|6GiHBhYiz{NYJVSpoRNJ6a~?Z=~{XD;ZR0${;qb zC#aC7d4O*gVW=u|GyB_}4g(5l`fYaJ0_spx`i>>pC8Lf9M%UgxG%B?%kUIKoa9QxC z(G_hGr1gIDwNjg*dkUiFj@=Ca5GhNLsJZ2n5;afG|9&-@5isbRd$&GX3JG6Ps0Jfd zox1m8(tNiWI*OnsJx~A(KC!d8>nk)WYV8e%UC2sE)nnO7?%)~nFQWFNglKA~5O%$~ z$=PMpmWggH2@k(9PX;m79&47CT92STRZI)j2p&`-97=eA*7%?6`uDbHix{FrJ*A{O zzZm!N^FhVWHK1fl832|J^5&gOzLbJKk$<%2Yloe3Y@F55cG*^&oLgHj zlVyn^J~4jG(;i%3*cx`z`z6jt*nS;-+3^`+w|X-XGm)tfb5_mi?=Qp4}3ktza2GTUT~ctV3zz`Rn`zUrsUYcL!NzC*Dcl+sk&? zrEoVTW|u|}#7UZr+}ng+^YTW{6N>A2v<>5@G(C4d3(9w$niyuXEhW#zJx_qMQVtp|> z`>;}F(xmG!FxFRP){^7@dXm1kJIHPCfxVTp3Kv#6zetE&0OjtXM>iSHkdu4BP*SHZ z8-R7A_V9c%x_*mCAmeIE`ZTWc~V2;^X6`Pd$Okzy; z&$+Iho0nE9U)f&gu-;|&v~uAQ@rfF z0Y0RSxT#W@*04r~_WzLe6%JAMZI>z{NGl=&0wSdngQS#*h)9E!v`BYPkRl}@-QAs% z!VDnYAk6?X)X*?PckJ!^?tc3`yMM!d|E@UaT<3Ut>D?soVcb++eRexP*)((f`H@Ep z1)9*zRjq&e!1;LV`uEY`=m?&%%6ax%6_qwo1NPSrKTke{&SQ5%fTK?;Gh80J9~*^1 zp*mNF!j}O!zm=9sd+i$&!m4LZi;uNqZukc7rlqPU&X*xDZ|3HgcnxtWyZ9mlHY>Ou z?LwoRQ*3{qG&!klS8P_v-l8ur_P8?YY!Ghaf~zI92Vnb|PO})qoVsxpwG95>+&V^1=8QE1W2@HAfa1*yh)S zdyobk*s<1SXaZhZ0KuB=|FU(M~od@AGQ5xD?|4i+Vzd4b2;UmElmh|uxK6_ z@yA^RBqo}#lx|5u$@@MNf`reXH^NEB;dY!jZY0`P9-VV6h-3f19F|bIo3@Kqdwd$kgu^=+7 zI83)RzNqTDbK_Vad| z=*26o=O)?E9!v531-EL4WKzfj(*KBvs(N<0ie!>Jp7R)M6C^BO^zOXRP^~^Q zh59PC{%2Cr7}Wx}%QQb67T4Zd&hY~yod>AwuW867<;Dhdk^phpokuzFAWK9#FJiQB zV*Zw1pST3KMdV7ibTfZ&I0rrkHEoGa&<}9ihOW4Q@mKHW-39NB`CSn-M@L?J*1Tzv zknF;l#Zd3+n3PU534XxcKhluj7x^zymAjyq2Ps?_e=x^sI12xJDm{~wFHWXWr#8M! zyXJ6E^~fH;9|Q!WIbM&{L~->vciES1xsqyv^@gHaS(X)Khr>h78&Ej*4L0e$GI@Yr zOM|fgofn0I0A=hlOm*-655Bf}^G3JJA9gNopU4})38nVx0*uAa#Q#DX&xAQSo;Ntc zP6iyZ(gk2QvkmKjaN`wLT*4#|c2fEFlkpkeg9E>hZ@@oN{-R4-ahDS=;1N+GiTcdu zuV*75hJS8d6fBm0Psvs^%;V{))4TU$pAH^|z=#&wBJ&-Fr_CJm`QVFguMYfden&K0 zos8&DnaAs6HZrNqyP&$6Z)374Vk8QUu5TxYd^J=eBwo6xBu`7a{Lb;HCX!v`mreRr z`Ke3DgVy;Som-8%6Hnduakty=TYeRKp2 z+4C(4Hn{~WrsA;uZ|`$te1-SG29Ewb*6CJL^LySF1h-(|G&+Nd2NytT0p^K!r6c;BaqGyov^r4^ZI@rvgk$I*ij8?AQI&JjzoetmQ2o2U zEB7Y;*5ftD2>hK^dNS9*Tu>d>C9gUs1FHb9(b|4|0yIRtk*5g@9Lp&%z0pnD3kCUo z@D~J~KWw!0r?B|{X0n8aiVtaPSzw`jZGb-ASBpGqGJo7H@Xhq#5Adgk@LsvF5AtNP z!a#n2l!X8!89)!Ozccal9&jUnJfBW|gjRGzJC^&*mcPufXYh#9@3_p2N>`K0PkeUL z`mpDqS@X#KgHF+WiY|By9m)95Sw!-6z&hQa;s@N-giBlsSgAH(U83YmHdHHrK3z+_ z4xsTrKA~Qj{CdOf)t<`{@%3Qk=!ytr(nKrmTRI1Iid|%rc6C7Ei*GIP;@br9$kPw^ zui`G>71`SC-7R~y8aGcx^+TkWu?LB}-Cg`ti|HzRp??MvE&0p={3iv3>^!;(Ug!FY zY{c6(4Lm|Ce=xvRBAabg6X8ynETH_yzjyROlwi&}5~ZO;3FE2Z4YxP|TQczVPJL^4}35Xykt3KY|5MEaA*|8>@szZoQi+iokdADURsSSWY41_ITIz>S$ zhS1k;m758A4sUMNUb!2TKwiiv--}(lA*9?iKJnt;3}b zok~&zyfZPUz|^_zBcuP>SRnZ&;{4+tTi-rbWs42{R^$U(pSBMk7!3=|%!26@8*W+& zDsA4$fA3{0;;jDO9H+Spl)Bkrv2R@K4rr(ZALofHPbdV$0-D0)UAfB?$%kp}IBzON z!c)#$Nagg>YZlp8MWbY`1-qOh)CJM?q*xRSZrM6wM|+SYd#C(+gg zQ2E1O$kx2=?zhdOI-ON=xmOi$lNf1^G%a4RFJ?CHR{UJ(e(r7Uu~fm%`p6Mj;71Hs zz5_;*|E0GIHhzu&J;D~)e&`ygF>bZ(c}Z#ljRt@j!|98=Z8Mg>BsjyN4Q)O?(O3wY zjU#cvl*T~Ny>6y33ud6$F((92!V0pgij(vdO;{fQ0s#=?-=}iIfSiLqu8Di-O}TSb z0K~mW2t9-NuQqjwW~$2womzlaj}^2xIP~h>0ZtswXc~OH+j+#Z4rvF)W6ZU70mVfE zrtt!ClVpoz(}BS>wdXU`G7Y%?y9`JLAh!<&>6weLHgYPxO8L{8e9K+J<`oS};fp~T zarLd%<2W8$b;2+5eEXQLUF_6|469?R2g ztE5h<9DiSY^Y-D;-%RC|ZnZu+hb@jH}@1&9_6aQq=ht^t5F zjRF;$s`7nr^TeO%9?Z(%QF|ICv>-pR) zT&^@?rI*Z_vyqN3jqLC$tqsmJV{d~_#B75}(36e5z)f;H!1=55?!tNF|8&HrdyAE39p>Js`0RT? zBj?saES#wx*PrV&8T5|EVI23|FCo-g2$forh879x!=bWY*JhgBEBe8|@a$9BHNV8S?5Rce?k+i*c`Z3(5&^{Uz zwqep4AE0PML5gGhPG>;QVMW&D*i;U=&bx`OGd5ZN>{p^3*R#(Ew`c%NiKE2df)$Z? zmlswr(Wp;XyXzdUb&4piHAr9_Uc5UAO;jP?i@~E0PCfM3tA+f>-1%JUs5c)jQlcVRe;QZCyL&yd&+Kn z2g}nB&u@jW7YQN7aNPg7^edH|(Xp)Zy#JxLbA{Z$oY};O0z3A*@A-M(*Id(_efCuT zs;o5!|DA}2wTgxU(`w^qpB-_pj)I;kXE2b{Y2k=q;9jg_Zh(>ngf;ZE#rId5|ii1!9v5<=Y>F zzpR{HurVKv@NRYq(_<)?5IC%}26u#(uHOw*d~2TCk4fDxe?%Mtqs|`8T=!Wz+UK;=gMiESz^RR4MiJa=`Vk1up_!F!ONgr$1T9kV&1uEgB^Y}u za|nb}jKrBj7nBJ%z;&m;kBI1~3YS~cUq}lPq(^S1ySw)gO>&WsKKQ0?>LsEsL@oB1 zH|j8R23fZpw^Hu<%HAme7A?2OW)yWS)kCa0`!%)@eKmQBuLXLnNiFGCm-Q^WaxH2- z&vQiZQRTPm)TiNJJVCb*wr!gkwnLlFaO=s@74yEnM4$Lk(AHAix4uv!tf2b zbwz~+Hub#>^6#D`$sP3hlR*qGej^%jOneyy%t0%qs*2X(A zC9~8uV=33wr@NL2{#;_(r#p4~3eizRJBfn z=l4Kp9#PW!r{qU2ueBddikoyTfL=!V)Wx{GLFer_v(tAI1 z%r!P^9v(}yjQbUjV_Mc`?JV~@LkIr+Q~)Ke+Omf)zLcPcU8&_hlV;6eb|LmI;IyP! zXW6WVyNl{IrZW724_!7!pk0$cU)b$0k2yW6(w&24x6O)KrN!6qHxowShcKI{ zik0}91NIyET`js}M^2e{(eg8m=8xyezJHLQ6nGi*pUn6?ip(o=fnPFE^HcbHNF z!ms)ri&@L5b>us*w0^!~q^qkJ(2g{W+$ARGH&Lrk0UkH0UGT5Ctk?VqU9@BnxMs#! zus`e}V1hon9N%(fxM`y8b~gkYWxSNNaDOv7l@u;ir^t^;XR6-1_<`|UB58Ccm}{XV z;|dQzH*n7mo2^SrXvtf?k#(AJg1p?w8~E*YabI-dcR1^3l7>K6f$|zwbvoKTmqpIf zXNr;OMPGN}rDbIgLi)Nq*t} ziQH-mFWY^_v(a%J9-bCYGnGTS&sL97#F(H#Ohck?ilgXTt~MKwf#=aw{;Y=+)L-)A zwWf0~uN~{;jFgKeXdJ#PjDQFUx*&#Bk4V^0!nN4o1|e>|x~$R4}%22zV_i9W;egMt3h;Gv%XZgudDt zv|wQE9dJ?t#=x#oBafS1I?7M0a9#}`BMb~8iYW35h=^&aFnNNYYN2SjFJT_t`ay!| zEJ|5MQRam-K}>5j_0ZeFNn$NtKzI3TJ7e#dpA{MQM4HuNtAUutAnDq6|EPop?Fq=a zAqhfA;Ocm43K5bfM8mev3n&wf&^{S$43#wRMSGr01~l+gRbna{)(C1UU?r68-0!Rj zxjguKyOT9DH&dFty=W?DqOa+w0Q2{y z-#e9f+10WFr^m&}@8Kna&4|JqIBLKGwH(rhv4l>L*sn?ToZH!Kl)7((MweI~fpPHhTjH|55%M6F8Wx2F+u~=Zv74dc z2mUXc;7?$6E3jyInXoV`j@u1wONaK1Lu{7M<}A1>kQ34lnHLZPkAz(Fp{Jp$NB!o+ z=WZ);KtQ9rNA^b;0UV>ELS)fCmYav@^F*pv#@-OGq6e2bu{(#0 ziyYo0fm=Jp`Oi{{BOu0=Z&t^`+5aCt;Ivaar_Gsw&24c(u906x_rAx{ti`4O)GKB7 z1xv}jsJ`Kd&>C)#beH*BPIvMIyk3W=L!gwDb3~Ndx4dJ`)3YQT@;n&%n=1mU4|g?d z8|*Nhv+0-EJuX1V*2JL)mf!8=?e#PV_WXQF&qUyBZ$v2t9saBS@#62Kb6X`txSl-> z^eT)ubzTJi_)2xx@+xDm4jF@a9x37A^&Cvg5N%b@`6`BPHF0xU=9Ojbd*CDqXG!GK zxno{cl^i6`k4QFQ&mB-Wq}4J;yx%bA2=&g3qs~#QO9li=?s`Mh$us);sSH-Gg$n{- z?+I$v>X{agyYl&bhcYJN)2{9e6kr^n z<4+5UJ5=GY3q%VGz4x8i`pfT|ZZ2b7SWmz)DeO`*q>8waW0RB9(GA{z*1K;kKk5k; z{KjEf6KyTA4WszYAHLAX* z+vV!ebLMF3s4#czke~|3U-@@`n)hzYReX`gjqdLs4I-i& z3T>wGuSA-DcN%(^g8BW4Fna-|@!AxM@`1FOWG*`D3u;B_;>{UHPwu6ogp6c@?*T1d!_#L#N3!uW4lyH?`e59Cut63G{!$GulHeo&)Qa&UHn(BfpZp^ zDB_7jXc|^YdGa#8RKnsNfx3TS%-c$}y`p7h8Id2apP6`J1yzYjq@X>GY4HBZbB5f) z+XTJDN~mGiU+}_WR=Sr}iZtS8v?wkGt%r|Qhz_=fPi`ypppc_g*2_H$Z-{DNm$*!!9R8 z=k?EaG8va?b}nJeEjEmp7L&Suv~fo|7{gyu9O-FPzn*9&eIZCRIYw9Z#!idFD4u;2 zldX2icW>vsYT;x#j=|1705S)-X`#4T-Jpx z{)#^B71XLT>NjzKu+OG=Nk&|k)r_owdsj$7^~|N#g09ek#Z9W+kEXFZq8eVlr(^}X z5JVgDLtl!hIK_#lh}GFoIfV%^@On6~yV<<956tiSaGug*MY`fXhNAvG5%Y~56v~rD zeZQ&t$uz;2V@eqMc)PUR9%O@aBR|jF5IFzZ?uJGU?0YE&K)Cwh*D!QT1d7*`k&sLz z?~c)|?H|c7tG$;lzbYRc*qN%D`S0xZX?Df%adasb6u} zQLT8GA)?0hbjS};J`zT&TDm(jmaLk8b)SVuD{y3bYcl>R=b(qpc1x`}0u>;W=8JA6auU^(ojS9M%vwr77$7b?F zbtft!F~OQ?D>?KeVZ`6R0`ht#h4|c>G!&_KH=WW{OTOo(Gs58Lg@vgbB&-%(#r3uG zOozli>I3>uCEtOd!DRm|_o?$nsPhJD>OeG~`SYr!d}VbOr7Muwx<^T^+??{0{etj% z#V6avtApT+kV4xShr(gQ>RQJB&#%B(BPPQ>Fwv(*^-YR;@48y3uAxCEg)QzwuB?H{ zc@zXlfUc`YjoZ2;(w<@I)!zs^C&@)*y`V7Ape+nF^>v%EOytwX?tmi?!wp5!%Q#OY znHy~F1%VXPDKh#cV%vU(eg7`%L^LZM@QKL@w@0|wR?!T#g|Ds!5u9jvI?$U)?JETY z0ZV|QPP3T@3S;>0bWR8ovfr_4zC2!am1`Na0cbN#s*RcQjzc?(&vhiAcP>(4Ev{`~ zz}ZWZpg!&HT+`%)8l-wotM$n|!s?Nul2Sm=^Or8Xf#O?}0zp?U|B{YGgtxUPE*c3K zf~X9hFF97uTtW&K4m(#RIuXF2NR5W!j!+BhEXb6Ep`MeJ9AJ{5+aHqF3%PgQM>7*7 zB3%D*3Tn48u;$SZBz|y|Cw5DLt%X>bOk}E(O!rs{G5FE~j9>!+RK~DAjqQFMFs#Q- zu5|27T>w$S<2P_hEI1)ksE_GTKb?goStEUR)TH=%+{N7`2!80Q_ehYk-j(mxlQc~m zU{RfPZw+_wLpYdarD^=!G^IiwjL=`WZ;h1_RaRZ~1(7}5H@dI`*0K0Re_7oWwzh=3 zfSJ%#0EYE?0jQHFHBJ)=sqe?P+u{Sj%0e6tg1l{XAS>+a>w>G#+D5@e8BP1(!2EpF z__z`t!lnYG`$|Wxmlv^Kl(ipjWhqew<0?20U%2Gy*<43*^}uU3R=fe@X66~VZ4Z32 zalkNoqecmh&`-3GS+v-{*VsEJ8gj0*1%y(I4`1ktg* z4S8_?dj0FaWLk{=O6Y^M0@02l7iSlzXt*cSigxhX%A_Y;fLEN*S-ocQaaj!K#Yg7) zQE%_KJi36lAg}V+U14OoYvn?OC->sFhT%scR(7w3sFC;Y3f0rmqD>jOtiVGcck@=B zi9|ii$5zXm@?lORdZnB)c>aN%Ow8ZszlX%~m9L{tFJD+)O_1PbMR8-glaFH&YJC(- z{$(pdc8A$#%nkR`lwwMKes)ubl77lfBjE%xh&pUCgkgrJxUwzJPy0Cm<c|G^zyRI~d=cDGv| z6ChN8ca33h^;qwWNa*XwyJK_X+eGql8!f91aBa8vmIG|I)^=g9N2Pb>zBbb@^mWGH z?K+p^P1NK8sO?<12ktxsKNZ6n018SuG%%*XU&TS{#Qsjm0QfW$gQ9h)5W~@*kM{8T<9_uC4~IF$ZVy8)KOktt|5c&>a4*aupu zL>zJW2C&fH6V|e1v^2luJ0L}h)46g<-@m@;^Y4#{UxMs?rOYun8dN3xQkjE3Va*`K ze8hFur@2cGm}u8c>Qla#$F6>Cn-Lrnq23Qu5LMC>Q^a~@<+<>im`8o#-bfGqcBuPz z3Kl4O-ZBdY!`_rBM`DwP*I|#+U$fHWghE*cn$uxA*QuA z25H1sLnnF{J;;A?8!3>h93VRR9?J`|eB@hZ#*ct6!i0>Wy80_KVfpI6h({&& z9`0BxjUKJoWly%##?Dx@@Gi7)w2{ZM0`p3kzS!h~Af4Dy%MKuQ-nMi0AgY)tv9^~} zZQ(JjjK9`p${I#-Cp2yvQ4Q$h=+FS7$t{Z>=!8l2~POvJOgGxf4OjEQHVQU5DOx&eOZ&;$&c|EZQOc{N9)A4>SH1U0W}got`qV_l?U{9sqC1sb*h9*l+DbUxH4s z7u$^$sM?xl>^U!`K~wzFXRjw|3_9i${Wf7!#v-qKG1I|kLJ&E*HC2rlTw`pYDHFt! zA}kmua>u?8GZ2lyYbHWYOb@E5`#(2571~zT(O)s6W&tB949wg!%aEo@znCtGPW&*Y zk-80kIBe8&{vhEzf?A1lQ`Z%~v+vFmwYm5*jr+&2o8qe1GQm10#<6QxeVQWn)D!DF z2aghN<yewnq>NWSmo8TI#xk#%6txL5!`)9jy! zO%_l;nm*x)H`xcf0=^d^WW^yP9B*(%x^!#b4U)w%j|jg_)hKGu0r^9Qdw1wTw^Rld zUSECs0pa;fPl8NG@JEriv~4V=zfx5aQ2!G_-VWfXrxqR?+|dZ2QyE4&p1F6ldyD+* z!F9`6(%CJovvd`i_K&}nv1qS56Nt~BG434>%CyrWh^ljN^~iU|#vbH-(@XE8g22;< zO2cMN1HK4uXzM8EGQp)6J+TD+fvLa;S9sJKAf;9t?Yd{9gqS|zYMPq<5SE*m5W>K4 zmAL%#SDTKIAB66j8-TG^Q=K#lUOl*X)})&y7?-+RcM59Iw;kh4qBS;c28KxI0AEO$#?cLyg)ktZEpk`3*G{YHbBx(2<>3_ZTbjwXnjx6=Et$F66}|DWeLVz zYL$Op3Vs+_Y@R#jkq5o7d(|~6J19|*7tMGXa_@tl+p58ZCghAgH6{*wYe33YjNXHt z4X&Y79!V3ZgUnm8_{mpXtDBJxO?>+n9O8FA8-7#A>g5(p*i>AVV_>9BGO8;Q@4fou z$Op0;BDnxc5&zVV;uCx~!vZRizM#*L>b;q$6A*LIPp1|7^QAoT&5OsLvT;h9<_IG9 z(5pLmDeecZt>LyNUa7W*dPf7D7fI}oVZN8DYJ_a6sw@qvH|?nT%Phy=CMAxWPEP{B z7QD~He8ISR5jmre)rcmUku&K#NzZ zw(#ULJ$rI(D0U-2yD<$57LiKi)WbF$rpiT>JyYTeWI~V!{wV28w8Z zw({ajIY~V3fJd_c#gtU%F%vPMbzQ1lUm>?@F>-Y@u(hnsd!@@E?%C+Eh+1n64w?9I zvSj=xo5783%Z!WlpPvn=lPAS#|JiL0QW3`H_NAz;=bX*qw^UvPebUNQX z$n4I2beLaj+85l^nAoccQB^{$H-`|gkpIGE{R0e19q0SjFY+gjyYx{>t{ zE1OJ5ni}u}Jx5x~w%kxd09K;;6)j%E-K#=9TPyBmFNf3AE_b9?dk{C38{ywlc#|Nx zjjkdBe>wULz`OXy@egDycC4#M*v8v+C+}Z8y|>BvFWns|ikRHhqmlo552+V=Qnq|k zuYOVYM+5FaqJIhFq5qN#MWqidNDn_N2hXiob^s*KsheY$JTtN7NQKnmHIt$EU4Ddh z7FdvoHj-0idsF-SFShvitaa)#!Y_Zo#(Tn?J|anTuLst?v^Rg~;3jcLxi0;9iPmTX zPOg->M5X$kl=n#RwZ}1I*CE)#x-#nMOZE+nw$5-lwer5OEH^tX8R>6^OkPJXhxb8-1^!(K%3iL+b2h1-7y+{+7ix5 zm0$6_AZmLf*7s+oQc~Jr(R}^M>QNB+i1StiD#Ld+b=pXVv7YVoPlajuvSKnVLOzaQ zKucnx{?IZRG_&S_KAy_MkRl22T>9+@KmO*g>%)Nljwok_w;u<~Q1gxPoF0D~cn(Yf zBOz9yS}V*;*6ClTgnj?n#yo;{gzu%_aovAazf|M;dc)xRFPrE_VOmQvdSqfYNLUrp z%Xj_7s{?WtmsB22EtqD#;a&0Is7e;@e2*V-{%&!$EL=yQ&?^f678L#6de7T9SFz}E z=qq3gUVewMh&0qvybxEIFeKq)Rv3lj^x)^1;hjz?cpt@Nst&ldd3U>LhE+&2Nj4QzG?T`hs^-mx3lw-bwl%#na@ zVk?hj(WwOn`__GSFmz-0zRsFY2`(lR`P?*S_Ga z3l8evt4h-VRW-AN;A|6pR9RkZTH8oM_UcxK+qN3UyHfd&%2Bq?g{P^JQYxn|2Qzyk zb*L8gmn9zQFZgaBu7ZCIEyDhFiME$}&qFk6Ajr9f_phoz_Px|mZUXyBr}nIa&rlFl z$CCR}upeWW9DZgUsuiZu2Tf5pFR^=l%P@?q-J)FIMr`3a!rt#4jREwaf-*R%?a9GH zQiU`3hQ#$78M1J_Mn8J#E^AXMrjy7UaN-hWQcwZ9LiA?urXT^h#(&mWX$3MSH$N5Wu#2Q^P5c3&w37U7_ zYN9+6@!d(W-Y=3!v1Lhvc`h2m5V_2a^$yMW!nSeZsQ6PP`GFn0tDUAi_c?L1+TCvK z>yNAf$*(P;5)lX-Ipz|u2sto8V@UoFhgOP#(fiz_fUAL>EE6kdd?#9D&qpJ}fMUk0 z-uk0A3&570ivEa=kc|(}t)Xn)4Q|2Sb)5+#BxSBQuP%zIdB>y!Is7ChN76YrFrD|> z-r77?lGmI)cz{0wmw$Qj_}xFtUlY$AgX2BnyTEF;gb_=%2%BacSaN&K-nSwLNH=7P zq!smrR( zE-HqF8XxAr&$Cfer3iD5{58YcUlCdU6IEjUzOCN|NrEd?7Jx4k7>(tmzN^Jv_yiMn{mxQ3LFl)4|_eOxIF^ zj}pGA0jgXLn54^So$zx3db?3`QqaucVCNp&6M!s}Me75h4nkVO>%!8~{LrTEpAu|PiW+6k(EFU!|zA>H%1=g?s@hW`B}HVtEX z*&i0sA!5rEFLhIX6JQNM11i*}MZ``;(tr4~?$wdf0YouaQ|e(x$CnNv;6F?g8fLux zuj!(abvlp~IX(g)e0#6zcQ%k6-|JkfmkY?8;2!j^3}MkPPQcZ9HB9k>yKmF0YW?)^ z#=#3G)L(XguvZ?l^zMwTl?B3dEByM>tlCViE=+fbZz_Q+n_OO5BnG`o#5ePGTSeD@ zqTgq)t*bnRf1F({!nI-)M!B;+mn=1ms&Rq2ZBRUKg@h<)RFe*H}gxuS4)7&Azh zaHq9fYv>|4T=7q*Fyd|?6$;qAoP<@wl+tpe=~akE`u56a(rbT73Vd|8VEbc<0LJ*c zzHrgOPj&N2y!xyFS`SETM%2GaoHIsJO&88=XDmTxP%Gxy^ulK&{H6=x(@|Z_+v?{> zUwd3#z18=?&;ezc>CxC*PVxMerX9GNZ6OhH{p(Nj;sC)(y@E5ls~1HpYa&>Z>HIVu}-%r7;H2efhkT~y8ouUN6RF}a8C5|Qj;FaThz%_XDD-@Ir{ z^XB{842Ef$`=(Ip*4KFu%fSxs(&C_e%H8V4$Ds+2@0%cBndp80WtQ!*dEsi#^6ySll%LxNhzln}(T1idn)dFeK| zGEXCVaeYOnEVtmcB~kZI-izD$*!3PP&o4OA15F0;;C1S8J(R>hnM*!0-^v3+%3Dr7 z8W%j34<}wXO9~R=#cQUT6eQ8}ZQuo@%_Q;eG@YdaIOjU$}dRHc*G@A?*6}< z@I_o4-zdQ8CSs)9h~IpPcQa@ZJ07I`0ktA=1!lZ^`gghh#95|~4Rv)QvB`mB_YpeO zUm`lvLe6>=iKmnjEmod#4~)7oXvJu-DsfPH<=^kduC;K9WL7`~>a49Gu5_tpdGwK< zH^;Ucsk!E~Vsnc9I2+HiH7`tlQKp+iT^a|QD<>Bd zoF%R^ToeEyMw{!eos|iOKgaTDFun3R{r1w%RT1!SOozbr8OitA3Vxo7|C302)wy|N zNE9i-gPar_Nz*1<*IzR)d)7N4hdj}j`TSc@_;+uL#BA%481Bs%B?2c=$SgHDcb**gCe)F8Cd@HHM=jPd;q4BL(VOj&2uS_z8HGvsdq~$tK zNNKfe>V961{*kqY9xEP>$n3sRb$)P`nBQhR6p$3|Fv4lO3j%mMJxj+nm{X zcU1jWkAQ1(asB{4YOv%tjBA7VX#&3c`mOpjPR5Ct2wR4)Su5X)^5bX3pM*%xeH($hYSU_Yju!B`OoMvY#>k~{BgL?b9DF4bY4k@3m#rrp(Gplu1(@B5nVcs zx>(6oQ`QLp>z5hCl}4JZOXu6YFl?p|q2~1+?=WQf7o%p#V0|j537E-ZoS#0M9uEe- zmtI5vDvL+zMSI7{L`$3v*_W?-n?;3n*p7m8KrNRZjrutoI`bRYn*yDo$B~WWc`v`$ zQDo>R8t_s2;EU9ck1tyd`OKF2<#Y9nNd2fQt1)8RFjw1NdHPzg4B~|h1!z$c`)9m@ zH6&FK;A4Wm#VytFGO&w!t&_kCS1jZM%oki%0HQb`88vA_q@u)V{@sN)k8K&L!F23PU|h0Q4Kg-K>wv;1X08-q?*5tBO5v7Mqt)i>d!tp zC6-41@iNmHE_r@hwQ9gk;H#-DprO=AmrM%p@jS)QrnYabrv%1n%_U7q!>Y^A9YLw< z3hktB@kcMJ*rbX)TSCbckyAg+zIXnS9RS3w5hS_As`s|CJ#q?YfGDM#QqXLrPX74gM{1QYFTk*$Aawn8z{uWHu?1Y-I4&<5+!tQjcz zcgkg&t)sG2pETaE1OIU^g9ZTTi>0oOr5E)qM|SZ1*dl3i+&gqwo`;eXySIWh2@+W^ z7*7;`LIz!!wi30)l~ych4k~tPE<(+DH_db?-=m;r;LM_<&fru}=*!%{ zc*h4dptSny$!E7HY6je2F*6q$(1tuuGhpHPE7{&we9vy;GlRe5j*8MsCwmxy`V0Bxf?83lK+Cq&2 z>2Clfas5nW7fQa6S}6`m_Oj>fD|j}jLQP-H&5A3i*K?e4AUNOhjUJCZDW?Fwl9-|N zzc#a16Eb%H(FH5tVOX`42CiiQzC_7Dq-|1)rz#_pQ-*nP_yf=t)$HHLKS^FsGThZ> z8=wHr#dcZdiBL~2(LZuuMS2>8Y6?Sw^>K^57c4iLX!VcC0=ED$e`I4i@a(Njg+=NS zviO#UMUYj?n3m3v322{Pt$fYBaYW zuI>vS7j0aAz6IiNz&a$Shq>g8?!qm5Tlr%%nl=UNsWaOy@BXx&E*@D4WyO(c;LLy+ zOX7W?RysSy3F5pH;!BK4r`Mb$I;;{arr2%G%1@6wD*-x1YWXviZ_NKNRj6R7X37_c zzvFN0``ikVPm3Qwo1PlF6B1=@GsysJo3QZBOg+_@;y^>8$o;9>VKBI}Pf2M78TjPt z@xSa$Pk9rw$1`kTOoFee9U~>|br@FG+P}%0JJ;M_$gR?L>jAkvC*6?4)N$mYe~gek z`N5_8Lqybowx_p)bk$?Pvty1~&fOc-PIRy}BF|Zp~ zK~8n*w;H}I;*4t9=%+Wc1j<_3?f)r zuj%(_>+uZ8{7&2#43(TrQ@|2))p~l6gj=(zS#}z$PLiSl^F+@Tv&gQh(pj`-)WEkt2QWSO4dqWquFdIf?2Us^#~72BVj>_8KkzAP5moz08gr?wqmx$5(C&G$j5{z{0<_H(1n<+OyKpw_F#dmwA zl@xS_x}U!L(5lU@LPca9+wjvg6+pQF!RFEU$xC10wE5@wjVB+_$bwY>L{5*6fcHz$ zwkp;w=@On>tUnuEK-nLCNNA-nDB6-TnzU&b+Lf4G*R^tjVysN-bu9K@yH<(q98cMd zbp&jGZ0p1Jm2ivRj}mD+7ob5G?yPO*-fM}K2wQ9KvQ}QTXs=IM8=hYR_7RgW?R^bM zBxL$T{)Zo)M1l`&ZK*|Q(3pBz1!};d3{<)zqH20Yz!|bV$xHV-DCX(85wz#J-iTyn zr}dcuL<<=$U+BWgOBYrGbxSOHqiO6Erza>1S01~L{I9}?Z;G~g#8ii|iLGzjuF8ka zd$KnX$y;yWqSj~z4Y?}$%07?PFr011EiPXyzEAiGgQojKxo zlWgBhu*aHo`pmc1pmN1;fY-9w4hH?CAEV0sN?kP}llvkU>ryvlL;Pv#w!y>@!s`nz zjs%yqYDye|AtlpWZ#*}y-*GVAy{CBBr#$|lPzqf#ID(JjBvE_pT5GHe?KFw@>FIgl zMfUG8^RfDFd%nY9Kx0X{hL?WFsI1aNJi~D8g@N}<-G+pd@G$6bWZ};Z{n5rpu0tIu zE+#q3j_FIzm7Qg}2XuUou(JCWOFa2hr1nq2YX&@&N8ABSJ@Q95%=LTuM4#mJ1oYJg3a09AFV@M!)NU2C(?5S|B@`KRNZ##I!mXD zeC^P}X9~ZLFXBFLO!T+bPi}_;*H9|MB^TRYKPHrd07O}qo?Gz*SQ&8LI0s9)DM-zV z=-5RPiLv7~oNdjh2xk>l*G8&qmmh!7o0eWgB#A4^D5x(g4btGRgS+>Pe(Jlx#$qnD zYU`|vLkDJ#5W2+sSE559QIKmObIuNO|Fe<7H?H|7GOo3GClL+bWBC9zGL~F$)XVId zMy=x160y%Ofa{*BM2GU3)(|k^>mfbX9q?Tw8OK}Z^_^bmx@C*)u)Q{m*U>-8r8#xJ z+siR~Fd|BMxvKE!p9{KV6U$WpY=Zeq62;6?DK23VVMDF{%EYcB`JUxnk@b^B3YI5N zRyUJFD-d|yqCEpdl`D-`Gb+=MugL}mDt!Q~DV;tlzJSR~Mx*WWO$bfAqq{xVV&6D%!_H5CLa}N%?g@f~{nlntuV$!VwAcKC$M{>9l(kpSE8nJ@j&T2ST2PS&RQ^w@fYl7fWNzcPvGUnt zgqx&4b@p2)D_ylBa{FcoGhsOX^Z6d{TZjo+I3Vr?Dr!Z;v+}bC9=Du6j_Y&pfL$C9 zLm}JkRR8`+x2BHu{}jsGmOvK9e}?R3r<~MEP}2Q2yH{StlOJS>|*L_Qvcc}nm`(HbwEa(RQ* z0jkm{%D?S2Z6CvZgy@>zX#H5a-R0p1dyNd=U0b&$j6~E z2rod55`pe`*!xb(vn@RtxwaL3rNZXr~isCFFwt^bBSwAwa z@`V3jm{L!MZ_c(Qxx_~NFS_0`EXwwY1634I5Ky`i5RgXc79^yVZj@L+x_3zx0qF*b zrMtU!32CG|cj=CWrTaYZiR*gb|2c=xeBl{p?wMcAP#~#&wmoyN=?%#HVfit@wE?1q znbe<@`Q6&l%I@iWz*G3`NU8=-5UHMyagnvIt!}HJ74f*~!HNUPMb{JDKJRTyhRNh<4 z;~9^?X<;BY47=Z32q_yHKINg}2V9^(rPgB^bC8Y!)a3HQ)&eZdqR@O!2uanTthdsO z^SLkt_uQeclk6aGzgeaQ%e?-RG774Dn})5OOUBfb#3pt06%+UHS*AdfhvAHL(zA+0 zk{W-x1zTfby_XI-|DdCj>S?MmW#3|u?0KTPy{XT>t)03e=xi@r6yuy}lVb^92LPy+ z7}btB`?uUvS3v^F&E2)NJjVF0$iR8sbOB!Yu*4VeHW!G|GpR=0>5{ttkoF^v>f&Uq zP1t?Jf$z^j;Gkb#J>)p;+ywv~$7h~-%wE4jscM#A)>;5U9pg0!=fhntPh*=A)1+@F z_OYj*0-GKrC$Wd{PROp=E;laPrhMx$r5RElvbRHWRX5cPQzYc?nL|FegV0HUjx+N~ zQ`MH0iglSbVC!AjZdF4Xt$GTs=-q}hT+6DgNIv;@Q~%st&~ZEg^m^59tEFr6)g{@z zkUrz;wv4a{MC$$Q$VnUFK7y%OO44Pbdd>qIWBRTsa)C*nB`vfqL+fJ`yTp|WWekry zNY)5A$08u@@n-K!zioA*K9{A7DLK5DWb>i%l5iWq1n zJ{^UuuL6B1`Y!Yzl^BGc@gI=Pj0{1%W`a^o=*F(IyTpX5^uw zhE@9WzZ(k*e=NjlGsD055YqK4@xlQ*+8?$_MDS~6PBy;@@l_Dnp zR@bV}a=I-IKJo5q7P%l%;0S#od0jXlJ=5c>4{U1}bVa;GWl3s<;3tNT{r%Z$e8YGI zBKiV;Y1UtBD4Oxp88kI)=$wu7Hwj^6H&h0Q?d{4A{w5Sx{CL~i?idcatX;4V6*WG+ z`P5swcCZ$6t2aFwmq%EUu<^dgyF*v3O^LRw!|twT8KLiRy!q_^ro(1{sVc^U47i;( zdVFwT4rC1I=}ByVjE&-J%QB81z8h%ivRk$V5$oJ-BbWt-bBoWt;+_59Lw%P0v!!q1 zR{6UfSSW(J!dIL1x zn-ZT`HeDFVTZ?0s*UYq+LAd_Q3+49^HP)>h)0wgU9Zaic9} z`y83g2kDvM<$$04RVjPt|0wTQ^q*Yo%NsbmnmT^~Tu|AmLh_8h0=Bv~YoHeny*Dw8 z=9i&>|42`EFtb`jABa~&XwtcAj!g{Euu8N-$x@e6hb|rNCg!a?lC;+MQjCgPPc$@t z#8r7$`KLYes50s>h3k0HMePCzU{+oTX@0Oamq)B|v9l3cpp)oiku z50RPy@0?-IoJqL2Tr(4vc&LP+2kw)X%-Q-4KlqA{>3Q$+<}<2>$1 zrz*n*$B2>zAP?9rL5ro8v|_0q39su)Ws-8CPdi9S6A(blCT4f^LRAhMrTB!uG`!|! zq|5za;p<)^lICxc6so;48r*!%NsdgiP_u&k=7>YAS2e~gP+CXGDZ6Vxk9Neoj^u7b zU6H$nuBmxRgno{`<0arNIQl5y7yE_%-U%K_I%7G9o_-R*L46b}wsGnZ(@wbU1eoPb z({m`FtZy=K%#0D&&!%DIuPuj+tIE$+H%maRrd-<4cSdXoXuBIV=f>#aLw=xBUureM z`F`_OlY^#XDBJzZQY+>KuhDjIrxe_}ioS%6b0$=v_H+$@-!-Iu{`82)K^oYG{{d-^ zdwfu~tU}vogHEdE=OIi~kJ6*J-SM-+6}s{lnEwgIS@7L8_e13b%p${QW)AhK`Eb3L zGbJ>PqB6M#M*9F|y9u|}!X}1;{HB?z=gLlggI)k8v>P`+@AxFg)x8UPL4fgZdh78l zgUg$9+X2{fs`TK-gshrUt{vLsx=pJb@8*khrA=qPm2CdEY1;Y=j`rE%19IZUCK-RQ zE>k&_xFN#G*h4>>sfb1>q7a=iYRlR?(+N{L!hl6j^ zfUWNhkA2zTd9JMwVhqvt62<)+`(vsbqe;JbpS!Dad-ah@qZS0c4ge1lU^J=SD==no zU`zMiOf|4mw7e&HD#_f+uZ>OjUQ$3A5guL+>RGCPt(Ycle& zyFHCll_;ep*|GI<|6OssicLVDT+^X>!|inuVU@=iF;Mq@po(SAvGC;b?2SNGcYtH4 zRbwrm754<{H?~`EyEe;X;twmHJ-umP?dNFr`luJD!)fQ_ULT&6xlF;qBlbS3w5ANw zpXO2P49Wk33@wV#!pSI`w1R}*|F*+d}3P`;GLALdl`uT203d1ZZ| zS*q9q-n!OAc?I-$_=TbPTEuJyTx0P4p6aIbZ|mN(OGW@~;tT^2q>=r7628~tz^@gD zI-gciLw~2H8uCp5>Q|-WOGDC$+vz={|HSe#=3ye)F;~}A@@_`08#=tYVVPQuUEJ6& z1R$hVb6PbM(Whex(Hr4)9S5pra3ond4D#~s6@bW%a&)2Ola0SRPEl73Bq zmj9Sq+)+Jt&C+USFZ5Iwq&nhOZx&VQ2_6c9J|$}a&KE)PBLfnkf1ZRbU>4(U8#Sax zh+KO&&nB+`a#QdiU86pLN+j7Fk+2~;+kHi){BV~UP)V*kT+q)$-O2L6UJE;K^xrY! zdmY9*)o8yQbytTq;Re~rB>o3}Y!|_Mn40APL&;e~HM_+ZY9E*X+BfJyc@>bIBb0Zx z?(XB@+TaqyaR~0u5{COdfBlAX76~s8CBB~QmWo}M(_C}^ZMF|C={}lfj^`y_Z!6H+ zT?g)zDUtv~qVWZZN0lOlE*skXhs{6!e{5lXnK6l_kJtnrq}BUXMcx$J*@zj^4}9zZ z#5I6eEzkv+YLQxuaDHanDTUshG64bqwOVWrXc_(=3rxtbXKqreG$$czRyiJ5sNwDm z0rOIKkZ-NgtL6Wd)Ub2N-F$58cTP4J#zHGyubB$442>#SKP=xm8N@+v_FavqkGyv& z9v|$Ljx2`e$F4bNU4r%T6i5ZKC8o8_Og%^%K;SudxOTVyovuO}e&FF>hu4oB#6o#M z)8e=^LlRfwU#kY@Z-Gk~c}&3L-H%E&C;OQIb?Il!c6rn~6;C@F?AHuV-piwg!uux` zj1edrg5RJy6xmC=(xCe@5}_w#iQ87assJHKynv~B?>SBUKHH|++1Oa;=e5UQ(iNuNlYi5$zU*OnS3e2V& zxNwm9|IcxuYIkx8>&iXG#(4kyELlgsa|vu(%FurovHZ;KQ-b!y247{A1M14lj*t?; zbY6?anGiK8VO^~zlJ>0L!sZpA2nhNcFgv+osG^XjZA$%SKz4N-5paLpp*C%LG%T9u z`EMTb`5OD@?`}WKz%w7Jx_-4<n=b6(sNG> zfVH3w)z??}UK@$ce3*NR4Q&Xt}zWN4N7%IDa{9^}8vN1JO_@3+->yDPa$rE2LT}NRo4wJPAL&b)Xs#38Z z4AV8@F_#tBoq+pQ)Y!7Cs7X>lhNk-nUIT8tqL*4pe&bhhte>4PfzqjaOHqYtDJK-C z-N~To|2R5u(1JIYY6J*59KmNRu7ad>vv?0vWA38PI7Nq5M8W zYpM(ubvjb4t?@e_!J8cueX9yn0Q6k{#q0$^@`_>eT7kB2)m@EQmdE$Iov>VwKH;a3 z6eGj^uicCM^#9hdnGh8RW1RzPcRq1P_#JV2EC9YTC;BrZ$uj>KsyuDXn@6;WaHAPZ zD2%0RGXZdSioD$0)aTVFZ*8BU@&w*$CFjq85rxPvvd{kYW$IpmHn6&-@93pN7BFU; zs{bzAwvhX+HOee$;=gQkHbTz5`_)~gl?v*$X}#4HogEFb35lF+v(fX_cvFv|5o4Lv zB5Z4|dQ$8FIAq_0rQU%pvkqCH?s$Vw0fy#<%BN(8dr?`bzVM=kFRsbITWxX&n_pfS zlCP>fkjuZk$-Y8qUKZkfNv=Bl_O|tAmZ^?=M$_=<6z796FwT0>Lz)HHJm$ORfUzsf zARa)H0L8T@EUdcrINOIBWEAFZm2O7Gc&0dp`-AB}etN!~3QH zv32esouV=2Qmvke!4@cJSKd}DB;xL3RjMZyGoYoxk-fixE^eDsDuV1@n$W>uz%Z+D(TachIz1{4 zfVSOgeVN~pWqQrhfJHs8JRuRPfU!I(n;|kby(Ctx#i%J<` zH9+3dv}~jb*an&|Dhi$>Ow+!(&UF!kt^w}ki*5y*ne9+0rSY>jOgLvsiyTNd!cyMLp+qvddrX3Jz)nShX0J4zO~F%=ySRO-p!Ah+=s>+kl8m;j$Sa27(g(C z0=+^hcT(W^BZ0;07Q=0E`_q)KMS4LNQNT(OK{#5_%aDpUC z-ugJd1DM`-~cudu^BKj(7DH}+5B(_ z>g!oBshnQ3a~D|2MwKBO-D*kp1XaPtA^%o@daJw}qu+buB?2-0l%|cIUzfb_JPHoY z{c|t8nSB78^3wARUP-f;c-u170e=zt!r^e=Dnj+|=BtP!T0X@-tZVz@*s<7JuIrUm zS2N@N*eecb*xpB;K#|M7IbQBOyR|$p12c7GK(_(3aNoz_x5L}xTq@)Unx};HC`M`V zK2XUa?$|XZy*PKRR@pevS;J><(dCOmYEymS)UfhI z-~0>lQf1w7Nb%sL9XT&QY&ET{YZkHdcHG{W&AX=}7t(s@IV(p(FX85kcDti0`3Fuw0`l=2g7;R0 z54$E<-@gMJd7cv`9qa>JzM}s>X{O_o#~f3^E%pu$#&+9((CzQnrQd0JPkOidVa%m? zF<<=|!@BPKVbOl}spI---@N2gFB!-6_RNrWWj86~+EnZS-WdJW+<=)2?+Hn&V{W<6 zD>r)~UaTVcMTx0>ohz-9uN>edwaovorjQ9_=6i*w3xDaF))ZK~+?aL=Y}Qb^OkI;f zu%_W-ym&+;eyn+i+-^-Tj!$hZzqRSQeyY%E&#+4XKiJ%U1({o!eWIAV7O;04P(jf0 zBAjP)*ObvUY0aW6q2!~P?Lb+=hE=Dd=2kASuY)^(@3Whki80HuJq7Y7G5;|97^_bL zM->lus+4+Mi3D3zP!_QA-DxEHQ^+bB9G6oAkvw$uGQWCns1} zp3GO*CLO1@u?gcUO?+-nfkiyk@U4%K#q+6OT&02uU!uTTZ6>?yLw_oT%{eIz@cjlpk6ut1niUQ>y>+#W+9x`1U29^ zNP9HjU-t8rL->(mns$3R;cZFmcM(9N-Q#7Y+%4L=$1IPZ(snI-oJ)=b6CA@vw+mu9 z)LQ-XAL73F?XPSPSRnFNJpj};eZ^)yEAY5{aYXer9?ZSoet$XpQTo;Q5u>I2Z+5NY zev*J>XN;7tj6;F7|NeBPQJxX{u~#hc*q!J-9B-cHeppZhMvGs+zNMtW{f~Z7H>)la z_0WidnK9iLv2)p}b9Q#?)x?&3h9LUKgPr+h*IGi^)1&Lmp|AvOZ&l~z zhk|scW>m&wgy$)r$iDa{ow8j6P4|)W#;^Q2$0UB=}EtUUNyo zWhiqW9!jK7lr)IVs4D;69+&9*7Y*nxb3Xwc^!*+*NQcP!{_MW_oCSe6oh6C+HheIr z{<={2qk>eQvUGh}yMD#DsK;@dPZG2qDlp@5#C`PErVqG%goOS4MI%k2-LmODluED4 zyt=>}E8MuzR3fs0`DyNuUIOtx2vd~oS zmY02a^zYe3!tK#k#NcMei$S4aGGb(DR)1uGQO)o;+TL^11~#8LN%`V7Ahi@Wu{KPol+uW@`YoV9&V8*86?;wgiI@iajVtw$hpKqwN ziOA12m@!4o4ute5T){Kzs=tp^dSsagzhk*s9q5V35OZFF2Q;h_LX|@ta=5q+Fcr26 zR)#?h>~3_1g6xqWjwKQX6wGK+A$Vufr@> zPQ<<`BXAs!@?z<*)sPfbn)NDWDT>e>H+H?y6}YX1{*30=M5;-lwP<=xNt* zGT~#|9;3DNbIoUi!yogHR~cQcbXIMMzQCPu=gT}Iq#%*5R{X3kpvyh*O1+MmPrb&6 z%8o}woIW?nqhjbz?E%zcON90FWB|yb?Cc`|HLmSrDYXR`e-=J>zC8$}kpAxQLj@)w z>aOO3Z_uV-H?h^Vs2>3stohg|oJL*71G|})_Q(%zYYW+QSZ+skM}?gUI2%>{_vJHA zH@7-3=QO!oX(GPWIb>|LazQ;9iH)1mPAAdml4E;8mU7;e*>}Cc7c`&2-tHuACF8Gl0cPRGeO7vWri0Nd>^CaS~ zlAEkzyTFZeW}R-KpnyDQ`eJWBiRZW41Sr?H%JC~fX7+Q({nvif7aU;M0;gB&ia={TeS>%63X%{mUx0DCSRGc+}9~cqh9e6~I!EZ^7+0ZLVx{l6oDoQRR zV*GFn-Asshikg|bT0BoBDf zXuRq^KXI>Ivc;Ct&FwPPD7F8uaB07Q`e)n>LQd_OTX)K6yXA$eA&_lmu0_MuSkZiV z-M4BR;_y%U1@SR|9$E!^%T|h4#x{UW^l~& zf5&8o^{0XWcUt3ZgNC{K6TMT3YV}Udg7Phs)~>oIY)?PgC3bVrSxsbgVf9?MHr}<} z@X{9(Q;^rEiwv?<8@x)LJoXDT*1Vgp|D=hLYYaGTyP(O$(?=jcLzC<+ zl%kyO`h@{KX42YW{`~fa4lJ6orJiHi`-2M}AeY;gGcXqHC!F1IG-0YF?5=S+pu0>{ z>rlc;e1S937MjObMuFE!M*u_D1i4#xS%p;roxlt!aiH7j;?M`hA>q z)1yIF>b#xsl3tXk?*y92!KU zW;a&Nf>uo=P2~cfnVR46WYz0__zP`1qdAd=sz-QizS?+m*#8dAHx$$=CR=}4lYuAw z30|}ByVS-Ve-(LI=E=J}#`m$2l{4~VDVyrXt#R!JZvC1A1@qVCe&dfW90xexTK_DG zDf(`r;D&X9iN~jU5dMV)r937`b1dA@LMUh4sZCt%Oz+Qsi?xec(>A~$7=JR{g%R6{ zBSJ=?ZcR={yC|!8+$y~cefjbHp!i~I&Gh97=;U2&(@4RB-`THkpZ0jQ<^nl%A!;(c z7g(0+`#-6Li5S7J|8(>V4ztkiITUn8{`svbtZ&%r)p8#g0RE8ZCJ39Hwxn@$zc$J^ zw5JeA_fI$+`@V%1CJ@lMO+Ro<0L)8W7BDh#!NRamkh5!0)oE_B4F@HoOynYhf6j89 zn#yVw;Ubszek{|)P2ElhcPQe_4&H8~*V=n6t2M2vTibhWXE%KW;pOI5MXJdl_dy$O z4$h|4n*q~QnE~(%6Q|oUW9`qc2L+d|jJiFMx9z+<0wZ)so;}TU%^v(XC@8%FJ>#NJ z(+!IcYm?>yKdTJ0?C_zut4(r(>-H^MaQ5^a<^gj%9cy*IeU-E}#4h8OJzeRiKEFN^T z!3{XjrYkMM7h9UC9jZv(=THmTu&a8J+TH@TFIr@&iKBkz5>l$muU5Z?{_N8IIN{Jnro4965 zP@c1+&FgkiCs}!`$-bBydyDiwIqSWp&BE0<=OX#Vd$DC7QSzAXQDGip3LAPkncFGB z(Ki}=PYr)>*OhYO*AsZOKC)pf%?v_@Z*AUY6~WG&kpvU-AMZg0&FpS7YPrTbPdZ>p ziE9F0yrk~dOT3ezg%zP7_$pFU;+WhWO(`-=GO=X7fe_(9v2krz#85e{ZqK|-Zjwwq zR_=$4PC#RPuA8|l`N^A||G079D_;@>R+*?KlDu8t`T@y!XxTf^v+RZU@339mDTKo5 z3YwL^&yo*X;tQOlk|k-rI#uQ3EB+mkcb@iSrTNw>pjZ=ZNw`2aBtTy*F*`I;`(^Ss zs=2ZwNeyemv{Sh`t2iR=?JC8BW#S=0vu{PK0^?hqj7lONw(knF=FL3KzX$@?n~o8dHMW7wVyb`|sETu`i_Lrx(V^ zn-3{PQxwTBjm>1sXuWv5$Z7@BLqj|tEY6hviBqVXoR7{HjRQy+D+^)$;9f(BWkLQt zYKOY<+-CJCb*DozJ>mYSfGEg1_LUvmNI6Sxk}sFOR$?oG$|-bEcv6T`M2Y2c+x1dJ zr-f2G1fG&IbE6gD;RZr-GYgnSdo-qdh=Y)m*APi9;DDg%v4|{^csZ_jH_I3Kreq*X zM<3gsgxvhnQ!h<5+2J+G)L*Z5+Pw~@Te#I5G?&_3Q|R4IZ<*+YY1?ttqPWBsjo%W@ z`P7;5g_Oysj9Aji!b8N9?4kxoXYk6hGTU#Ae@Es)i(f^P;@aFfHy5TAcfMVYL7V0i z<-b7H!yWuv<;!b!!tO4_8ZYo70x z77^ME1;ub)*I{XnR747B__4Nvpk;l;9H;L>_qC0N7Eso*i8i(Sfd_~T%l_2#kwf}b zvao>{Pr3fW+N(cv{YC7+OXB7XqBS<5OL7{8)Wj^NL}oMo%;5`-T;S12Ih>MlFPC52 zU#2cDT}ONy+29s}JUR#`giMnnZoY7$mu~ z5P{%Bm9Y*^YY|Tt%E)n`ihyR|US)T+af=M&>wki^B*GGyO4_B%Z+<^rt~FwolmW!~iAACf1^I7C0I?NiGi5_Mhn`C&#xZt(@m ztQ2&dWI*S7W-DFF7WGDZ$ohD`7Ha8I69Z6*23|r+ETT^N!JXWqI|sG1PN-m`FFpXzDJVmI zQ#Y{6{b7{@X?HesPJ8&0{)N&O!Qz%sGPReqy z!y}r!bgE9(7ut&B*EH$&$XnE^GwQ)XC4w~&Mj7O3GUWXMx4^M|VEDNU2x<3w2CfYi zWatUkJ2 z4L3ga=o@AGJjoP>ZpD+wQTeJNufcbau6hByIo=r9mqQ#rEy5o0w8-V)pd4iV&7=XH zr-ev&sk6rSLB`U}u@Vs9hy$UJz}dQ}$$I>_Otj9*l~Js^k8GrID$DYKOXUNoR1emh z!$7dk=lc9!m<5i5>%;TIv;(W>Q-4QUncuRWRk69^40mLD)%5fJO_Vrd>%V=6n16es!!lD9B>=iT7F{u*Ur> zQ*Po(r<8K7*)^#C$hXr|201x}_Ep+3Dh>A_0T}~Rg31_VniXAEl{8&zid0}oF04G? z$)1-a|LbgHe#sw$@!mS~6GU>U{iwe`2h;G1p>#19rGm*%G@`s&otCa=(PCU@z|GDV z%ke@R*Z>4Qp!|J{E!h8F0Q28@QZfFE5O;rpkn5A%97x`w?BD5oKcu3Ai1(49FvDBn?SUdv?Do=x<9X`Aw z(%73*B;@g9ifJ{yW%Pn;O!>1t{uNIB!;4=GTGLxqtbE01Q*6Fs8p%eS$VK(Z%e^$F zDD{&%WXe&TeEC;&SMug?5sA7R5%^pM2pykkKaX?S*d**L-%-}5bK z#_$F^oke&xb7L>!wwOQMIqbqg^HxHXa8* z@kMg{Y5w!)?Mu{ungY>Zt{>he2U^~V{PU21$}DWtG;S}Vl`$MwYOxZN(f9B_nXa}X zihUuDdHN#)M-j?ic>|C>agpp zD?0QO@?$~U=1d%YmK)S8_WYYxPE7VjCcEhNvKpPlp^UDITY;!xT{X8aaN4XxW9P*j zITUay%+6=T`Y4~+_$&2B=m1elD<^vH>Eakfk`QP}&P1k?XHqMNU;@0TAYY_kVQ(lE zIQTo+;IoWKs&h6j=wHD&vMmB&CI!BDU<9ZLlOPOI5Ti8ydo;Ze07RvB=2cc9%Wlo& zd`Rno@kF4hYsXTFej!tuTHKiVGLt%r{%u zll-Ee(S40SOFzIOoj!dU6WvH&_*jH&|mPO;_t`+>(BY27&$FTf8V1nlTI*l5xeEmn&JL-n?&{UtWsE zucr+PW?N>NHlR)vhaLuP1maKXWZ`m)^gEvd&wfMSDGN${13w>E5GmrASSHC->h2OT zWGUWSpE^)Tx*6jQ>SQ`sIT7({4Tm#m8(Ws9rp#Hx1m~1e^y#(1`#>Z?I!X%4H6=48 zbla(r<*zz<8Qp zLZ$QT@w5FT3(SxkcEOY|&BX%Qo(Cf2GR!0^pEcG;cI8LGY{_1;^|1G|TsWv7ej*zw zhKGY3SS)6DeO>P?id&+h@Ab=xleJ{!AZEjt6k|t+e4e9jE80F0s;R{!v4qC6g(=~P)aJ?g zN^ERqI^?46WEZ5#M>Tl>PLU!L0P6g+QDkVu%84Q2+>!d%@eGiFa~>?;awIVcls6`v zvomn-Zw@N2sj$MuSOgs2OQI47;9N2@+swe~uZy;H0#Qc}-YIvbV;gg?;W&@*v&LUI zsW>hXU@Ie3n{LrhK}2`ThHsnC;X)ss+dtjgN)sanA&YeDgyXsWj{AQy<$*hMj=slJ z%Z0&i41aEM-638!e11BjDgeug|1+Cko#U3+TWg}!oGneCJQlaHi%j8rbau>vi7&83 zw@ZC@J^G68JNnVSVV-FE-`#N~p~L4iB*#u=NKew9w<%gP&Hb;>1Pg0;8g{DCRl zJjx^K)Px0XU(+s{?2gXb9xy$GuSQDe!GD!rG#fMW^s&!BJ1LRL7D!wIORfP^&8B%) z&W@+Vi)6*eBQ<~ARjsu5O0{kr^%E?j4jf8=^GLLJMVb$B;ynsA6~!AjjRcP?9CT8P z6K~SB*$PBWAyZzK1@a$tk^tji>?$jb*3)pt!p^r|-Nw_5l9X zsjQ6H$38-PY^~w%^}!WKjpy%SePrzpd=bYEncNAwNf`7%m&xzAh5s{rj_>T>M!7^* z-ULxXT8x`udA9XZ&a+Pf#=q)mdhwHm@)mYL-2&=<0-gGwXgReV_N`*tIkSwl|X(A4&gW?rgF zp!OWN@NmN1PO9hKn`}}F5)AF?$kM~CXnkW)LJnWPE0Siw{Ueyg^ln?%@vT6}1}xn* z`-rd#eQOz+Q7Jl7@O0=-_IP;o_ZY45H~GBL0M}9Zw7d*8#fwp8)GxdqW^#640k$gF zs{4t*PKCw8X$KCN;Kv3|!4naI*=9NAy(NECU~?U_S7U}o+nAep|1dOCiP`b%TllpS zTR8^^u2veA%GoJP)RConhAmc1rVUxpqu`>;i3*{53?!R|Mr183X7n zJ<0|QkXF&>vC>HHT{xA+hLIXCN`UX!_Z2!z2aAEgimH5PnD;VJopLCwVB3}+X*H(p7yLA(dBwuc;{F**yYqETx*)ue#$ob>yR5oJ6dhokAOw!}m6AJ7-e^}K(ROF8zMdk$8waOPinRGwf+ z(BtXh9{-$KYN*Y^VP}V_S<<&pK$~IfW9?phqJCcrGfeM7ZBZad?TSRHi^lXTf~FxW z+N)g6LiPHAZj&1S5Cf#GM)Q*~xv~3WA+y&yww;?ccq`xM!{R_3h=@GO?42P${AN~Z8;t8XEJP_r8o{YC!$@)FrXa6FFASQ zLWZ>w1Pxg2RuqCNU}k$00=vC^I=T$K!Lqod=~Y@fF;v4{wrYaI>)Tv8WAnJs-y#0t z$(BTsBObHfsn;fNmFWzwHe!SR9gzoz2qG0{o#uU@g93(!NgV*mi7*z3I#9K}N@4Vr ziTgd&(hzuYO^VPEoFydn0=H)2o`<>O>blK##ikoQs=$=d`N^vR^$__U_)^`$j`a5$ zh8z>m@-GlQdwsZW@FQY6tnogcw8(1>#GtoL3A~zy*tlls@W#=?0FSc72b3G7g+tz@ zg>oYtQl_(=(XwaeO-FZA2lWg2r3-vLUHY(@%X7>9G*Hn%H4~e(`{L1uX;rZSkG_ zwm9WO^W^j(rY@3Ge!9E4JH*r_H*d0SP$ESkCruzMh9z;s?8_Bq&vgLJe6Z6 z)ys?BRL5#uj`^aLBT*z2>(UyKr^RpG1u|XS1rF52e@oe-`4$M5qBTJng%at(@Orp4bsenOK?5Gmw_M)50?no@cvfOhjj!sRH$6v`ODJO zdJt4{QrjFVa$~bPIuz~2ew=Ep`4&$L`7XD1etLS(`vB{4mxc zn8FUkt!Sm=7NBU~FaP0d9<+dOr*xb$n|^6gTTMLCqwJd}QVAn8;#LmztcN`h8rbd}`eNW5LDtg6_{2B}ZIM6IJVaUbh}4)&dE&p+4ES#rZ_PHPlj|ihxWM zR+@cA#blExzuP7h8G~mg4o*uL+n6iE;mxERwsZ$-TWu7U^IEix^IU zK%CIN3}|~n-f~ef$DF~R5d+@uw+ZqUk6p*I>u2H-Fim7v`A>271y~{Gfmo%Yei7Q{ z6($xyGV66}158NuK7%hY=e9x8(T`HtMOrN5J4N1qr^X?amn<^p6e`Rxr)m}ukrIk+ z1KaU^qZ3yFv?#IP_PxGd{lqefU8pI)tNp!{kh+pQ8AsRm zpvKvrZSU;)BUHe5gV{NMVSR;!7Gf1Y8wn@N939_vzWui5t;WWMa2QDlTXYOfmz%tL zplRtp!UCknXDnbs5vgfRj0#Tj0RFVrf}OJF)bmHD0u!wiUr~xQXBvgmB<;3!L%ZaR zeFHDJudJqjPrq=V54N&t@@Ra=GB~af?4{$rv@qHd1%2IUzcVST5i=Zy2R}G`_ZMi) z!0l!8!?r-tgXH(S?^-a#7L9~C$d`81UCKNT`m{9v0gUlq7J7Sx$6Oy$tk@F*?(h*ll&C?7zrtZfp;N}Fqn zgO@Y8$K-UjmJyC)Ui_uUdB-({?Mg}ssPLJPS?8U3AY|Vake@~6d6O&&)6ad;T&4Cz zb#lv4U2lo%rF6q*QIhg3qzy@3ORfVwvgtQd8LVI8u#?%9bV)>_?HH$A(ZX$HTW>#r z4zpj>;3W;2K?MI`TBhG23*^X*zuW@XN1V#EO?Pbe892+Vp`&OCC$bsuTBivG{+@Nj zK~;pQ8kgt#(BZ9gtcXEmM^trju2n_ZGj}V|;f=3d!jnO22HbATuR%LA2*Q9wmj&<` z6cFMRcToA~sYDdRQEksWu5qG0TmTTD=&)>P;JT|5#DV5IKQ8MTfO$%y@^Mh4ECR4@ zxUM{Hwt9I`3-~z6t-R8--Z&vYk;KYL!lg%pO8;9R52L!&;0x0YnjVdqu{}!i<5ZU$ zh1euNVWUsIy#UM7fk&y+mgY+wZm7BZ^xeOc>T?jGiu3UsjyKQyxZkEc8|c0TNN6Q; zCN89%@OO}}gJz_%cxregC?O%05KegKQzG5V)@;UA#HLQ*@byjA#?qcf^iz+(z>PpF zsLjoM zZ|)KhX}_r^l1gGtL#Li1})2}Yc<+%ex>mXPLtJIw}Fg{s}2FYKPWKi3Hb z#2jUQe#z$mh)FwCIj4`rdt!I@BUW$;`8wLeZgh}t3T+=VcRkAoQtRBMJ|~nc@8RE& z^+Fxa#x{yrr%CB&bTE`Rp2zU6xCJ$rIi0u7yu`PpJ%1K)p8q4cGIn~B?hpGk!me*x z3HMp9?!3j?R%pqMH%XHyQ|bCb2zJ8Ke;Ll1%%~;1%)aV#4%j1%(`aHAF zMphKWJ|z_ME&FZ`dp@Lq97$DEsb=Cl(cl0 zv~+hUB`qx_Af1b@wdn3{Saipt7tQzh|4v@_-X|PzT^umyGshfb+`oIw>^_uq{hXJQ z2Sjhj(@Wx$>NB)GH}Ac*lQZ2BC82mDOSRz;M!@hYzxmMD50>$RD&ZMi&|AtrUhwuJ z$JEaf?3&&*v6GCKCKrL&=hlc%y(k0inD)Hxs2+HuJckq(J%mgi5KYJgb|&uo-w?`T zV6xwiVchboK53tyEuZg6G%W;nDpC6#)4urcL3-wfIw+D5`~w=ArXH1{pf-yOREqIS zbMvCL6bw?PRem+*l;i{)12KXS7jtf+_DQX*jZ@NCnLL~698ZQ|qg4Wk!bVP(`SWrk zw`<_R&4lMtwK3ywaCzJV%V_ZEz#X1KnLm8oYX7$z3Iv`e*?aCSd%-*LAMPzKGC+6Q z1a|V~Z(6ymgGzn;Cu3**?<}6slmh#}SfZNB_j+9_KT_Q+Op2JiCfv%HzNkr>E7;ZA z#3(yHRMO;)A*D;O_<&|?Q<&dmE%)M2IHftA-5!y4!hyE`&OVJczoT0%ry*nW?$LGg znq`vW)p<(Qm4y&>KM{8P@XkjL-K>*12}}2O`VTBf!oiXT`8yMEm-PR)KvO1T;}(1? z^crM6w7A)zBiiI{CG0FCzV#4*vFIIkD<5Q}B%Tw%Pxe$=*@y#QqptP zA5Y2f=8NSxz{&~cCnHSpX=>g3(U#k_z>>pYE(5oVlZ*Pqp2#9Ve7D}-1}<;%ox3mH zeunk+cQ_IqerRU1*N>4bN|T%RBoj+1qqw_#vdLG2jUFD{XxMTmm?Nf&$m2$m{pUF6 zGCn^s6@&%HJTS46#&Y}rBJ?x_OGo+$cLSp4#V23n=p{JqDVFtQ7rVKk0l0GYe#w6> zho1JjZkjr$*mRf2T{d-=Su&V38Cy0R#iY<qY@cfW81=b;kF$_U`!XRn6=lPq>nD; zU(VYi!f_e>zp5K!ZlXUQ`XUaQh^uk}0-y@#j~ z^xzy(YT9VzB#MwYPx}AKH>w(8!^}-c`(_!-l^6?bMhXu-^8p zMBW>KZ~)qtxmQ+x_g>xY(UrhL$J}N6c^X0s*(0u^8SPJ1tHUxSzem$-8GX})_$kA% zx^t!^RA1j^J%%K{=}xfCMsVpibD+lj)%EGig0J?~B|-&nt-+QRXT>zFT8vMoaL#bJ@45DOH@*8In0hvA^lGVW%Ytm;8BR=_A4H}2#EiGS2%lOH;xs2U*<_V_f*-v;0|9_9nvlA2o zg`ganu8O%k_HYI8Ly$ zUSzm4mTD1}tl;;U+m;LASt8b-$t^T__89U~uXRx}F(k`x^hA+Py>5F0}wzvz!`g%#&s zdk^QtlQN&GH_2V{@$dAl^;>DqgI86>y2JQS?jOzAaLMr0j z>4SjZqhe^AWozGP_N7F}cjK5YDG?ie!!q+srlp$fk{1#T&iNuK1vFmftczd$N=Vei zWPKv*_S?_n5)k!F)~H7#&O1?D=iC-`p}3^eF?VX0-j?n^_!e=+7%W9ns;@^Uy)zzL zw_l0m-}IiZ`iH9#M_b$rzXqht03PH8Bqo;BCELQj8M$%1v#T+ogI(`CK(Ki$3U=}K zapRh8!E`*?Fd z7hDq>7OLsf?>mX(;0ITFZfd^$z*c#KE94$!4z0cM6p8Z+WTAxd*YnnU0(7>}S6168 zS1HIKsG%qn4h$9jrkG@?4{%Szv$B97d+eyVKGz-LId(QkW^i9#i6F33-eeF;?0u;M z&=y?`;e^wbgSV$hDQ9}m^XVY!R%w6lT9i*YnRcD=07&yC=h+>?8+nd6Fz+3%ge?-Orz4 zgPVcg|K!WSXB<&8}5kdY$Kbx8iq9j2mz5iZbz zpsspHr?J`_L+|hW0J$ zmFH~oocx_92d<|oI_oHKeBMKLnH%hR(!D?&pEP%Y>_8y%@_tC|aAxqVCJ(?5J&~;z zJHb;Wa+1au_=k&FChfpQbaW2BswV+J_3$nIYII-!?7KGe!Ny7?krok(M*#bNvHafL zhvy&B`Pm8rCtAt?xT`G<$0x8_$=|-~4>Y?c2WYYUO2m$akM?{#AH-`an(2!azVK~3 zQ~99=WMPsK=t5CrDqQrVAmJZ}xN zALdQD`Aa+n9=JDO+(!jFHt-Ak7o}$2Xk(Vf!*@uFRwOkctA~aF#TJXgkifT4MY2qB z-prjgYIfcXTYQKvQG1efaptvYd|*8w%Mk?Y$d^{FXDVs-u@YM`oN4z)v50W#f$NOC zp$B!}rsAIo`4w!&QOJeXW7%f^xy0mmYC7#X{IL-#WqhtZ2-e7e>t+w@#?M8r#8t+- z+q`4G{A0y$KTmW@#_LUK$T~bNhwj4eBKmu;W%up*pKb>@izAHX0CN2J>1o&^>4|Xg zyf%(RTox+n9*|6GD>1ZXiTmPa0e#Y284B9`=eV?CNKDBE*Z#RN`-UecGQh}18Nc01 zOXI4fchoAj46aGTQy6DAUHgpe+h9dQ;QPJ^MIGqv6o3tLx_adN8^BP1EM|wZeER10 z>zvcL&sBBppR>tl$$KAIS8iT%ewC1tL@UY0fvksLUFwq4Lojkfg#%-rv1@pU(49p~ z5!_ctEKygUN)bpKGDrRqF@zAsrgwH6f9s)=WGWwRId0A%L;BLz+ZsQ~K>#_q|DG3a z`XWPP!ymiksZ=aSW9WSttg3Y1Jfk~iOJD9?-iny)x!W_0V~Mrp6|KZFRvPB|IKhmX z_0a{AGA2#UVwg?KpfTKTw9wl6%?+7|D=hA-`NT^fi$b~>2~NQJ0d#yG9yF>p6_q_E z!89Bi+syVgeRnbxuw++g6#IF3L5lk&C9D1%UdPWwpq}P*-dA*P-<$Ahwy7rryAM9{ z9-(6`h_k44L|htjZU9^3o_$k&RVP$yhJ-v%rcoKwUQga#y2NjjCL^@bJIo}l#IzE9 z%L7~g_l{XiH8tf9xy+znhx*2U+AAhVFMHzBST}-t0eAj{fyJi)4n@V^v};2(2)4AU z!8{N67j6iF!XHn6JFdsk%}T>v(*&u!dU>_Ol&32Oif8@L}7NpaEcO@=Z$VPZi0*>TE<6pp3L zm56YAV*-*NS|;qLQ@_AP>dc(8LEG2x$TRZMgdNMj$(Hhm*9ytYSw+{{&|r?N-kri@ z%Yg|QryBMpr;=nc-hyF@komL0Ip#(2$eLw8&CzW}$Zla4*D$_Q;j7@;>CJ{z{V4tT zMqXhZp9h(G8neq~F?9Q{6*D>Kc0nC-v(+s+2ESdQ>hur_Y(*VfbdbrA_`W*|%jF6H zX5jDUdj2J7n*cXcxfOLAQ2~$Y4(qVRl>~BBlAL8ffCFYKCSzDT@^k?om{I{*+<~db z&G#^i-JFo?78kT*#Q#<>0i<$-2X#e;LqDz(Pz9dD!?g~n1eTmWT525Ge{S`G3#ML- zlg|{ANpz+cd?L0tCs%M~;S3c2r4ZgqS$-i>_Qq3bncW2Cw2iCAbC2hH9hkzWiFgNR zsigIIbH3`1Fjv6<4mp;F9R$gw0%Pp}P#qxrd0MSEO zF)+2UI$G|zR50@KtQXf?3A2*NOMxf(?>R(=Q@$}4k7ytcYtp_*rBQ(kS=eW6qPLy`f|abfb{XWgSk$*Yz9Q%Phi>yflRD(oO@2Dds1H~{oDQI9(or`+4Zcmx_hYC z9-%Ej_dnA_EQn4DC^&0ED;eegumD*}jUJDZA^qe7Yh$LZ)`4OUdh&>EHj`hROb&si z=s*JN6vzfPeUij`=w3F$niN!Y3+2>6l$sq}Kn5?ZA=H>Q6((=QNskEC zydQfzqD8c+ud_^BYPgmWd6R=-Ny}EbD}El2k=|)RkUD@7HSnMy9c13Uh8$(T4%#zy zU^te0ViT@U@KQsx?M#!PCG#;t6w5iWSy%obett4dovH2A@?pYqg4p;#24mki?ghsD5%4)u9w%H3jh+(6S=5QPbP=%t3YZ#^w#2} zI=CHJFYNO48WvNsme&97Pe2BGkvdJ&sEQ>^$iWc6f@5f1ws^UsQL!4U1MrIqvn!A& zE46@neGQj^4kuHY_FfK}w;BsI7w8N?znfh8uRaGSdpEP`d{N0lA_KCqjiS2Rgo=h2 z&`#GF;c=o#V4;N-4y*tQK7@=E8D*a_lr{_^_q@rXuK^dA$B#O|rP2JcvF#SmAbp5r zXF>&L$ch5oJuf2nKRYJ|h|xta^L4B)_!WSH^0=?k4Rn*ja85F|n)& z-&X^g#nmqCIa?~AmHFXV9rg9a+E;M181ghuaNQgcx=%-u?j;}pDN6?CEKDOpa(h7E zYpK(F+%|C$G<-6g_lW0rAE4HR3^S?+QRK>bZ`kQ+WpYn7qt_Jg&pYEco4|HfSA|8$#3ztK;Hzd?NSm;Eo39s+*;?`uHFJtT_ zGiW~iJSl^6TTpT5M@@66LTrDhI>=fosLM(})*n8c*j)!rdN$_>fMI~Gm|rYtLE+Kizmt$r~$ji*L(i;?@M3 zD4x?em(vSn<1fCcukN3!1}~ePuX%EE0u38&ewmq~PN4T&XK)*@91C~^)FZ5!lRcIc zNp=--{ohX6>^E-Jq16GZqCTrH62hnD%OZ$+8 zJF%7HP!$jd`%gboM#yWDDW73)IzYtxkg!FVyDLx6$siB{19u{-A<^CpHB`dW&-eW! zw*YQQ$YPVaOEmfznRK*i*OwlqY4gt}T-UFjU4}dG{=WTu9!n|Znk7d1i?~DO%{YSN zuXEb>5aRlW|fHBn~Rb=oU={4Car;9bkSA7y)itWgmEH6imhe+kb#C;u+XRx@WGT7%o*nru~N9 zDO;PyuGEK}k5D1VQQ`jV+%FS98S$UBufSyC^}d{O2U=BQr2zVx&_gTmyx}&fPn=@G z4~&G)s@^gova3&QNx&AquS?tFJ`P77?#;iu*;A2GX!5~^1Z5oVDQ7F zO$*PRq5%NhPSo<8ARU4LmkNVe$9YvM^K3dsV&x7)rg{$0*F4=lvM#WhKb**70JMwm zO_4xU*ZzSFGp<*uiCYjd0XMpmr`l(8 zfi%E^>Dh}1b)SNx)b)3bm2XF8U;!{o*Ni^rt9{^lm7;s3OtO8FFa9v!dYU;>-_)d_ z)!Zl0xZ1f<`wPeC)O+P-EMgqVf5np3&XFq#W-qAGQT&pdgecV~U<7!|jdlgDG5W1z zkf#AFMQ{F9r)tabj0gFnZ?8C2TF-F0&JBM#w$4a-&ccPdw zf(T7$fZ=f;bI^wmKMa6GDkr{cw$#PnI$J4lr1HQG9z~Xoi%-n0vE3st#x0PW_@ozh zFiJNO{aIKkVdxgeI+D=D2Z%1!*%i{V+FBkNG%>HKyy7l$ORy;mkMOTR4=D9OHP5m> z=ZaG4J&WfCB|YYIcr2*H1q%GtmUEww!4d%7)yQPCvtLzF8{|Ea6ncHR*|z5$S9 z18Q6%jH5`BHgUV^_pRFwZgvU{)ANy7hw(C?ph5q{`5JKDWgRtsaL9m@US^2Z=nGB) z&8tGqc#59{9{}||Qt_S(5B~bj&6J;vQnH*Fg!xy|CD$lA$xlv?yeX;>094)Ro8K)L zWB`ppIQ^~1WY<)T%96Bh?dQ4ayVR}%+XdfDGM5066B9i9xHV1thg6LR169e_C0TZ3 zsyxIpiN&OY4xf{nY_k?Dv3D9CO5wdap3(Tpi^mgWBa<@DC1#EMd-IQ12CdZ*&RWu* zS3MI7wbA^H_P>h82~Y3l8ETB_FZotqc)}UISHiRVIF=lrtBv6AjT>G4Q)7J1N_zk5!D4glHKOs%!k3m z)37N8T6Nb+_dp-R`u`RJ&y2h~JbMM7OQ{bPVsnz?{YpT28}nj2Q&~CYQ`3@-6RyAU z9k8u&>q{!Usi?_pThFDwC9Qe0`q~fCod$4gkD?71Q|3U%mjqZP(Zy%Xu8_L^T-O&!bO(!WE+f0#IX`JbwmfTYwh_y(nS(W{q4`w9>>;c6HKABUuIg zj$A9BQ%e{D7LKK`M1se!l}Fn#eko(h^tc$45c!a-pl!+PJ+m(a>325H5ZO49K>iAd|J^zQIc(^O2mNPi} zFXj_A2Fy!P1Art;O2Ld1)dLo;Bb8tRj0oc80!-6qZ-a>ukFFy*iv3FIN5^G@Xoruo zy_eGiJv>xZ-^(q(99ye!8kwAt>{s!>@VMXTBDBtp$I`LpXrm&p&bc*~IR`FlGMXtQW~Bqv_V%vtOw3h7%p* z)QLeI)s^pM7G9>FDM z5{|+9&w`)4;K7ZNrz`S`n9eNHI%$H_o*psymuX_ipHY=@U0c-T`eP(y?K+XHWRX6o#OGSbF$wEz@cbLWhaYK%ot1@+ML+g<0pnYIpi8N>)XAu$08NLrWchB zD;zey@okik8g|4$L+5HOt>f5~1chsq>CeqOe&>R9VK7L#tuUzeOnkU^jL4<%boV?g zwA%4Wb`rOZoP<6Bb2NWK+OgoqCw;>_lhlTnl8s(&pA(ow6Rq*(xOpk8Gv!9J){R~N zaVuZv&$0G>5rgS|!DHE;R-FOhpaPnbfX4ud3r{2?7E0D=Ph6`yp8!Ad&+HuH^RpL@ zRb?Jw|1^%E;X3>S<9j7?l%&D?HGSNa6i*R(n@5RJ{hXBKxa^ew-_gP0lve3Vu;_8u z-`Z3zQuo<5SrI+F%1UK2!s!n772R;P^r>My=Ew%J)Wb^W7=?fTvN$4tQZ^kbViwG&}nD_LT) z1nO4fx!^|i9&+$bkh~Y1z-#t>oLbXDNVfyHYI1?@GG$!{x2bmY$@0X*&|kSsE6UrQ zcAJVrjFZ&sVO13IWs@L4I(t;&33blAe|sQ-`UYzIT!DlpnLWDaXNv*hbj`k`>%hnO z)R0{=D-)08%4ZQGdEZpZX82RX^?K$9bKGoa8*Pr(^x{0y0sgbhP=!h%QIolbq=vj>>jUqdEf$Ka~J;XsG=&~Xa{{=P#< z&Ukb9$Fn9!cAxXci-;d^@dA*NRs2R1$9k>w($1azy^R_^kcV8ZcL4R^_@Rlq`)`+@ z>8~0<|76br>K`&NM|z}pHpJGMHVhtxyb6hQ`~9r>fjcyu$ZXUB8$Zo~)_K6aZhrOm zm}#Ft2%f=wuE0z3xhQyO40WA8>a5>dmbBwOmX=dwzBRmuHExHO|4>huTKj36t?k-BF1tMc!%8oO zbnT%K@lTgh6rRE1X7`R!^JQs(Isy9`xni=}o@pyL`N64x?I3B3lN4z_h9>F>Y5Xao_O-}O zw$obJ#3=P#xn;+)g%;{S&4h=(j#MPMi{qq`iWN{rZs~jXZDD#vFBcB7f5HIT^M_kA z3B`|`>$}^Z{4*Ak?(Y*x)I92my01*6UIp*QIOqzxp$RJ#cJIM=S7b z!iWOhwtXnS13%b5TL^(mj~I%)>)pG!t8MaW$)E~*ix0Qk2qnrM{p{^Ul1yiB1&Ckp z8tVd1fH5`ijIbVY>P0~S7W1#LPXP4QP+WytvW?9bXR;0FpqGNCQq!YSlI0o@AfF=H zJJ|k_yBnHd{{&n7UqA20xI4Ot z(kk6)U75+VDN(pYI_O%LLoOE94I>*=sL%E_`-5uTBk%jA(A+L9s*C-s(@ItwC_^ z`XV1^jyUdtdWWmMwebOaPKX`AhA6yatZUNoQaPU^-_=GCEj6d1TSy^Ra!O$U^W$`z zGyiI{*ejns2=0O44cvgOIsjVx3w z)T0ww&cN`3xIA1#ms;JVvYf0ITa?oDcm|031Lx`7UyoMOOO#RIl}7+2W~IGssqTeE z{V_W!R35dL{iu(xay$;fYH|5 z7ptPVPYgZ2@M!(~Pe5pE{hp9S0LNAmeDh^XjoDV%pbM~JsSBt0@e)v>^~(X1F)8q@ zbSu?&H~x-eBX+LJNKuFz8Q3b_Uh7BssG&VH032*S506;{U|7zI=YkBUFV{lebHEI- zzA)p$%aQ1Qv+(hMiQ6om0nYd#Y~$DjUS4@GI(dpCb2-1pEcm$NSEE*N*gfDvdT3%O}f5m9<&{R}f`r3tV&&BeR*0_=0 z`&#yr=neET-jf5SlLw8GwR!xsuV0^1&$HP=a4h1LF0BPYv z-`E}%dy%X>dTe6{zfGqSAxm%{&l|rWd*N@mboo3YjL82))fT!Dmzhag4U*}>0flCQ zZO08}<>0vXn}pbSDv-@>kC8DW5oF(%pkg0zN986kZ><5`=3+B%^UXE$B#9&KSpQ&MUxhHDGZYaXKL_@zqm zk6RL*<9*CEL7*p=_jW$wwK{rb5%Ed-c$$j9G)0+d%J)om73v&J4`Csp6?{He>HUY zpDx6+XGZxrS`;+j>G5sH|X#lnu02=ZZ! z#WWEZ-*n-6MwwLj){6z5P|^fO1BLIjez*J%02+>JJF(4k(+V40HinP0K$Y}nqd($gx-3_jp z!1pGOS!~Sd<89(2Z5&EVf#Zt6P-N{2$rUohMw=@iy*Kfs8!}lYPp7WPrD6+M?+`L* zk+pw|HMMS;e#_=GWEJO0X~68D)~wfP_1Q^_abDc_`zPc+tK-nxlXIAqBViVxk_vm} zWoCJ1{J#t#khwQJDjbmNFqH(i;mJJ3wzb~&D#1L7qmh@=FKrv^G9*FumxiG@&}mUq z+J%<4J;*8k&xJaLu0u7Xlsmq@kaB&kJ8mNo@#IQh!$o$a-T`iF^38HvZqzaYU_Hfe zfHXiGA_;ZA8l=qmsHWQlYEfw`<|@0@wD;ZJjQZ%sxAN1%N=13cvTy80GVap@hs?@( z5#2{szNR^Jg~Y!^w&Dc9d*d$)XCTz6#K~EMYf`y|{2#(D3l_o;zkaZ-epqwS-lKWY zFFq>QigTZMLh`!5xL&qkvKZ%vO@yCc07Kb>q{UC4EMS6=)KBoIC%A9kQS)N(8$AKE z_qop*QoqZZQxpDO^ZCkm8xYIpht6!SOfAfv)ru1H}JBC6NTwMg+zWIyObE(SPMRPbcT{do?4YAjWqF z(wf`YlzX#kF_U@(`3;GyN0%0okaut$skC#7rCj0sQnWQ4bV2v^pEq0PUrFG!Ycaf1 zL@z-@H9(H#A@aI4Ut68eVTV>sY8zV34tRE+41MM#%|htIVRZn6)vpS(hX=wdiyExe z2R`kN{mBmEqFla(O;n)DAU5uuq3 zNR07@C$o>3y~%xaRL-5~<%&IfaJLyon+0FeP=6o4%%M7b>}(!cr$R$v(aevpDHsLX z*N?k1q3F{VFXMAy#0IM7D#;`zbuWLDUB-An7bYlfnrK(kc`r8NRXER?a)OFW)zJlw z2HvW)&`2KtxHzD((bmCCAZPwk9&fv?z2lCqwwXCkgG<*#A*PItz}5Mj&eg#23_f%A zNLB>a&5W*bKlXy zS3QUCuuSp&Lj;Kmsgmy{qW&4vO#Gs-Dp*A^)m1((^rvm1e$SpZqCE|$9?Mm<^nHpL ze{k~hg{}gVe#>OCoYjb@5M>b!O#u~#Ab36A%i9ifPINLX03I8P#d!cNTRljJmfIj1 z{IE0KOMLL5PS(J9u?@WJc4WFbt?O~uS?#^TcbS-OXDFT1VW;Ncin~roY|Zq63A3$6 z&YDKjO>3M(w{OWpbMA7B*_8$#@4X#?QU%GXkL?G#QJHdiTl!zccjIW2t3@huu6xS6 zmCRLz14khk9O6Hr5Vn`+W8Av=<8t78@(0LJF4Vjn82HG=J*qu36yfs)dcGq|bM~kR zgcM49KM{LHXa*{jNH>3SQ21=Y)nb*y+O@Lw)^KLQ-orOVQs2Dn29kGW{rIl&YZokjEa5-Jo} z;vM3AB}T9+6Ta4M<>G+p^U=xn>3XrZv+^TNgZl9V*^yO}=iU7aUsNxnN2mgw4U*Z~ zQw?Unp@XP584t%I4>J#2yaVxINx#&x&dESlX}iOFxi-&Vc*%Hs=#vW)xBVvC{RNS~ zs-cW1o+@SGF1qz2lnmBn=u3J!&mPX4>%UXxuy?p^f#Id%*ECZC{< zJ>V(Mr&&^Aec)XhV<;S%pQO2$taMw8)e>(s^Wxv-RGf(;vM_v6C64IKYQ9C8&@9fge)vzNv|O{>FW^-SoKl`s@$w7_x~>+Yv!K0BSx_jb5JHE*Q?Ns*dD z!Vg1~mxG#vI5E9^$?o&qrJ|-qf(D0bDC;K8M^@)=NLiuCo1B^DXGARy>B6nwLPMs0Dx+GU$8xNp{r2?2TzHq+*rj(qjiwJ9 zs*ro8;2=RLEu^V4cQu;gra!;5-5#8_S)*NS8RMVF>>8X8sEOEkZ zEa+hY-=o^xeP69M=qa93n_mh%9c4~UKu-f&3+4CsY9`FXhPAu%rCL=aY3V40qMwAZ z{}V;&xyZzxw z<+{RQSq|PccNW3sN~ZttoecUU$y>XbaXz5S$(gRLYRB{5cHydWQhqp;xGZd`Z1&@Y zpDarmK5EHnTSUXjzHQdBb4WJ;jdA?cG>N&qAx1F&6kw8|(IPAI^;5#{TK2r1qSd8{ zlxD@8NS;@+OvPW~i=B&Owm7^WvQDxSqS*7mA)u6w=epQrN1N_fSn_J$qe>~Cc z2eaaR=D1wx@v&tIX_~)1^CakbTey0G4sP*1yzpOFn>G`xTFrUgZywW)xaQJstJ0r0 z-9hoz@MI*Wipt%8hayG48uT#M5kWMQO_EQsxYa*$oL@NO7G_1&)tD|Ua1T=Jc>6d?q1PtxmlB-cWhwFo9I3w!Jeq$D4{ zSP|0MdjSb3+5qgQ*SRDV&frDoZ}{c>&Dx<*;mX5(19B-C|FTu*Ykj@tR=T61H)5ks zWzZ`p;d>(4{_iU+~> zVi?{BB4N`YC&RVV7s>?&420B5!6V8IO2vt(t$xOp7$39AqzPmwWkl0dDL)U#F7s4^ zi32X{M*~h=2WiPUu%g!pL7LiO_IFmLsW|fS4BLSyN_*pzogoN}j=L4KW8O&r-1PYy zUbP#)Rj-OVn^pt4k>vV49Z1AKMxhFOV*J)I~K|j$smE zgbt&RF*!DE+i=7e^jq74hH+2EiF^uA@L&3e_T4%DdUs$v`OT_ug$A`AZKzZ33gv8N z@4}WH8^gdHmn{DTxqxH9Uhy33`!{!=y(_Js_pys$aLj<>*C$XTu(cX>+++{;w%vn4eHIGn>Z}_z z0*4_7*rAkRt6v4%zS`!=2h>#?*x%p;N@< zP`xhiUJGh_^QJSaqH>W-2fs(trk1O6b<>nu^>A_dK6k9L$xH40K>}J+!|!w`_`S^? zQ&BgSqeJ^&;?X6bChBGNEM^+2=|DCt*HZZDCHvQ>&tEuF+HrrKnNAzLUGPaOYUV3! zhL7CULgIApLg{I)p)5$#zV&hn|PA^FRu1&@)Yc2rv%T=fA_v zhnCsai3c^P8lksV2$MqAQu%8`-yGP-j*rdD<^>ks87@1F-(Dn3{-Ps|^Kq%;WivIJ z#j2WojpxP@lQGnK?+3z-7ACTP&#j*P%X-1?l1(g>!7-l2_`4@_9U#`hk#{?EA za>K->nGPM!b?o=JXA(dyhw&Wq&lL zTcBwdoJdW!XU`LF;`-Wi$fdKS53GKCCdEcyP7`Pn(~K^VQ1e|OEfno<;&2e`;1p|H zK5Z%%2_x6y+EbrZl9nn`LN%@EaP;8b=sA4mOWk>*Uy>Ag`1|U1rxo?{RcZ%dfJF>d zdAq6aR27V3ZmIL}&2!wKCOcK60?oN7v!s37q||(C#r#e42zN0v6I)2RCjw zKB_ycz3~IEJynGf!|F8KsW__B^oAmrM~Z9@QyXwRBYSo^b2qbT3wGZ^P+~tgFKJ&t zL*cl)Xi4x>`&qIJ^l73e&HmD?ignQ9>V=(mGW*`J>56&da8Me;k1r#AV7YpG!7GCX z0f#TwHC886-<)UcmA(pdXaduqExx+uYDthO68SM5L@0x5YW|fl_p5R$*C&=I z@d)@Gu=FAE-{joy7(AOBGh^&H3HIs4s7>Iz^Fsy&$|DB}=`Zg`xP2eGw=F;q^TRX~ zVyszpTPuN^#Rmn{_@R9(ySg41-!W%u*veP;`vQ&+EY+Ms&|9KO8rNz*Mcrg;(uYNM~U1Jm-;fT`D-(l@yLp_L|1gaYj?Rd zy!>d)n)uW2$NC44lyXt0=pqc)dRZya)ea_aOON7xlxM~8C#d8rewY&|q-*f+*Qcm= z(`M~SNzXtJ#53xD-Z8;+)&ik?vVBM8T74I1xn=%%wa{9_b*|Pnr?XS67m3^o28fKUw+F1;gO(3=dHTBTvsl9~ z$BBLck8-3WrxXwR@uVgQKe#rB@(@vGzUN!c1N*9BV6e{?Zw_j|`)SJ#Uta@u!FV>V zOzn8A|L`sQvC_(QHM(#E21PXZ88Td{bQzxlALv7A%6Rx*tUn4DDBJNIAK9p#rOGPq zWSm#^a%*Mr3-7$+Bch-p8pw$4JCz*KIi!ymjTWD<_bhR|KAkJ%ZU3s0lF+GE=d(gX z$(-{YmH=w)Qd4)rG%dwhVDU2Xvk7W)7fUewbEV}t!6+}+Qgc9f8mJy$hU9tV$tI!k zA~K27vgu&NwcekEjO}FOcOAm@`7lJgXjU%Gxmj&A7_AtJ)APN)d0u6ikwbh3_A;GN z$l0<@+4qt6mvb2xaQ;+eQ))vLN#1jiUk~Y(IZVM^$e_;qfZZ;!eyaa)6C)(rCv)nz z(Ai;aCUW zI#U_k-RmidPOZi_vldT5Ds8BUH>F-i>>ew@U|9wd&tn(v<9*(mk}_j(S#)}DU%mAA zj(jtuS5Dwq$lDPf!}Q~*j^xUB5=yxr8$*%%yBJF1Mg;?dX6gS4MmNnt@jsUb>_DE| z&9CMLt*`irv;5#gsg8#Vh1qq}j+uzd z+fpi7&nH<-I^#6aOFCw41CI~Y;Obb+nvQZh;wZ>WAmqS8WckIX@}@^Bc9u(?;39pV zIMj&`c}=!UO33gz^|Yav!k^i*oD3|;cpuqGbs{Y65;?Fzn;YLHjCV|1uE)NrqX>Du2=sXJ)9EPp})lbNn2Ih*>&&3 zGY8JbLBN3XQ~>t@E0gWKR?Y){z=Siy@?{Hqcx|*H@815z6$wb#{$W5v*Hk%?GmwJd*160` z(c%ls&8A_}e#S^Ac##;M`Sts5Oi~kin$+=Fyd1W-j*S2)c`<5Jy0@IqMw~PmcA>zk zAnbK2dRF~!-^)gplHQRSjmB~%Fzu>nRWBSHL=QSh^<(M94~im&-2D%RQZb(+N#VPTXOvL zZ8?^o900w$E2pu%H48sNlhbv0V&$AsK{)9y2wbbVUXRLx)oQ48a&@JrPKAPMIp_<1 znt_;+)n^L5Q*Vk=vS!x#HNQd)O&9+5610mM1zvgw?{O|2@!QJ7${~or zuioAc?R++vzIaGBvlZPmv4}k_wnO^CG=x6?_l~f!z12zWX!9>CixKWys%(+HjeQTV z3@zQAGt>am-E|*-&zsBd^9P(apW17$z1BKxvEiLa_%-d0YWZf4rIj~=lh%9-ea`R8 zqG!+=k;S`+IW25S3d4)Eklicb`bM6-M>ni5&$&Mu2r=c?TJu-BuoLa|^}*eL2*SW0 zV!@D7AN=%&G`B@vy@%++(TqhBvcm_NJziSS@UhKxx1^4x<9c-e- zmYxhYws;F!?-Mp565ooS&b0G43Ae``xhSgr8R12%64ZNm+k!H1+qmNv^M#OUrtLZ$ zZzrRi;D!~nU2(bZCP&t@1);w95lg$0j@6>_n9f8m=GtSaF>tON4WvpFW%ehXVz-HJ zRKm5=<5X!)<9_)HVwM`6;*brd$l6#0;Uv@B10=tpV^jLDtkc!(f}^(UQ=3LoevL2Q z;srGnB!c4BWATnIH)7k7_=lzYWgHh}DnHiv7z~*jVF~)dqL;sjRAMJ|gBM9deCT3t ze~11v7f6k-MeD`4&EQjrKn$(bfS|*RBhp&B^CNcC{t{S%hyZnWXXPB6{j9W^p%SGD z$coX@9)~Gc%C(2Qw9m{z-Fnu~R}F4Js$~v2;km0|zkA@*SHik12NDl1FZ-2Rw&;m7 z1Tp_!Y9XoNdc|~@vGBfOIHs?+uOZNDiNJl$bJFn3Qrf%=SpUrIcz;p(X1y~yjC9k<2y^bH)_T*&@JXwQ^ z5&n-FEHH(9s6{mW{w-F{%XK#H`xS_4`16JS1;ilp{(GLat(REJ59J~dalzD*gDlZK zCwp$^sQc8IYw_kbp&hwEW|hs#lPdEcS&9+gB`#i-fF>NOJ%))7_>ymCxVK-KDO4gC zkbd_3FYWtIPXDBJq$;M-_K}d814Y;4aCqKpMT!Ar9k}q3J@qHj>94C+%u{__l(DNk8tU-i4RdcY(Z%yqa1MLdKMqoi*EU zd+A1szYV3X7;qnjPz=Y|7Z6^JrYaq+SKAplfjoWJkK|??-#$7c<6pF~5M*1P!$1@h z8f@la4kKuVB|hhwo$ju1M4-Zlww;H}$mV}otNBcOf7z;|5WjH8rzi|#ol!Hen>YXv z8MN8aa5I|5_KZ|;=sdRe6gMNn_wncp8(pVL`lZw5EqZXyfrw*GYmm3uHq`5ErGGDo zoN%@aC4-S3?iOU(iJ~!*g!ji)1vZeW~4+(PKV20l6CD=>)=A>sgY6G9mYT_dNWfN z9t%2_`MynDpgGYiG0--`=X{<{c>>yi?SIt(l!LpOX#*#nbNj$ab zy7pNU=9}9HK~xHL=6q*&6}f7WwgcOc$?<`=E3}PzIKoRUzg#wr8U)Ewvv6WtU0xcZ zI`ITVMmC+}j1f20W{p8h&Oa+9Z66xE5Gc+nn8ZWXTH!?`LD$LnoIP>!a#a| zP-A%Fr7_3vK>N+J8_`HMnqUK4d>lENXCk&u2lIq|x;v7RI$Bmm{xO>DmoXaL=T_9-e`tE$kY@UFW~ayZ1O^|l*D#?GX15)&Ev9h*a#Zm!gGD>n2d_4R8G9*Q*UStvG*luia&FKGso6%kgX z`f&d;6FJOF!I9(^=$(o4{@nVOc`MHD6XCqhj%tSz0($f_>fIY!u4Amx8G5gAdjm$a zV$YGN3sMfl?fC!S10Mr?dkroQoA5IiV%sGeo$dGFW+mb&S;n;D54Slq-Ggmp7r6szdI9@7`R*5R!OMBJ{q1CojeW=R)|U8}6$D8{hPmv2D62w484@`?rS(sSt?7 z!yr%t4!1vZ((1^?<5C0Ygon1BPy+AJm@YnJ4)!@1a?B-A{Bbj7hdaZ9c5h?R9J-H} zmP-5VsFg3bN=xWBf$GN7@61cW56;lWBu;2t;at$#q~!evn#_0g+>Y0a>DK0U7qMKU zq6lZ>Q>BwXjX5)_Q=fGR)5Kbes|yEzF)kF%>dVwoF&Or7RZqX4_>4aXU3RW+8vJ!X z?2%M?@p*#4ywjDcx54x+i6GZi9m}S`WWs=g)0>eXRrm1yRYzyZC4sR8xB4aWq$KPs zlrg$qE#WBR>cpqA$n+k;-+4=XE8VEbR1JQPv6xU?rY4vlv$5pQR#IT}YEt+pHh3=5 zsP41F087C?CBIiPd}8Xwrhr3aVjzy7BHhDwy%_}6RP+h-jaDx=9_3q@QaF3}jcQ&W zO6+=mEi4$IO=sXg7Ogm8k2>jh5J7tFuFpa4^V>3w5w(=WpSY$NkZK&(AdB-kyoRBS0IxI2e7?-* zPn~SqSk|`tMU=nGXiVyt?pJ-eX5r;}L2M$1)AAuRk*rmL+r`$g_gmPg)klz0QT2xH za!$!(is7GC1TN!0z#FphAoEo9C!QOuW)kXoT2-pA&(S-}t+dS5 zhvpy#_5u-jawpbUF=uF0)AJ4ld!xR$^7x!BBw~9@ZM-a3YbWr#4 zDHm_#spHICp7n6xW{K(4(lJyZnEL&%1gC@ zq;6VN77ciH?a3AcE!i)7yIITQT}$^@k8)65^Xqqx(^~*0wOVyw0`JO699QY%klTC} zAXy0Ua}pV}saw3w+V+jAq4pRFr!uB^a;3&|10T%!^4;yk)R!Ydm5ky4BK%&%=QKta zi}VhW=i9-=Zw}HD;gTg*_65te03o?qepgvTq{yY%+SVFbYZ`Ul{@vjuwiw##6sZIh z2@Vl=s$7U^ig?4-xEl<8%XCiKu4;%5H*bbl=M1XycB*{Osb- z;d(h)xZnf81Z{P$72x$i)_OH%HV*;FGvvF4dHaJ5*ypoh(u07_``E1zj{43*A}>$Ok(2*> zIIyZ@vV6lIO^7C&tsM;{`>5n}lr7DSv8@4QPrIrc@JX|6L-e@k99+f9eQeRsi8TR7 z1y_hvaIZx@}tFQ?0Eb4@e6ED*zr`1;32j&ajCbT5Wj^jeu{S>%Az| zb?Q2gL;;RAqqS-tar@F#-4|LP_0onl z){HOD!sObgG!B93XIbyh`{TEJLCM)qK5voHUL~l3_Rdt#Up-?N)cW93l{ct%=MuUx zp7VhXk=wu3WIPuTkZ>3gY3hO?Sc(T(mEHwQSY}mN_ss?BpU&|ai13*6n?EpR<|p*w zAqRJSnGC9Rr{~+IjkS8B59XIR39gDKXw> zRH(bb+k^cyRb)PHW;{#*=bbDgY=xhk_BoLo#( zg5*tQM#2_#K23ZP?6+*OEo8R8aG{;^E3&lj`2?!mocs&q#l#3-8XlI_NqeQq&GG}y zdwjZFi_KVEMT_oe$&`{XcXh#lQV~tMTvkg020cKCv+P<({>HI&>)6EqOVtSzMn81j z8xUwSSyeNao6aG*C|PC#Sa!aA1)eS}=J`p;fM!w53?Nh7oi|HyxNw`K+o_K&{nXrV z*y6SafS+QwGNtcA=85@!+R47x5C*@67-EUfGkK_uBtCh2F^-=^#b}}ja~UosEUL1g zd_@0t3{?Jl0hSHYxT_yP4)e|th@X@DR@Q)=CC~bN*CxC6w;Hk@|9Nm##F(~KGF&{v zAcKX@DUb%axAmPii51`NjnG~5dyvCmGgbHvU9)>deRZ_U!MNB6{a->Ln%QA|;h0Lc z{UKDoZ1(;Gm>IFo7fX{$Tj4M$8xtD+wxZ=im|}>=HrOe|4zpb7V!=oy>WPfJp}9-* zq$vAU!qO^?c;IQriI9}b%oC8qdRnk-V^K<(NHdDdmmd>G=(+3+j0{&0Db5U= zG*oh#(R|)17>23ySai-}mnq5(0ybU{e87E&Q02R;8_cA77Yy#|+Z;H}<~+w!{nFpw zXcU5fB98x$$SJB7>+Jds&o8&(Qsi>RX3Ow%q>F0E(H77Bv#*b2V7>;o*i~I85eydk zmsN9o#m@iRWg|Ar_k8?jJu)l@Pc>tWi=m+!=KEGc{lcY{J=eR5U74}%4(vPI3g(O{ z&S2iR?0@I`^}Tu?x@P0sH?wLIMKdULyEbG%6Qa#l36qg7 zBj~}f`6&9;CqCJA?pYE2*(a}Mc$g;*=X;9}#&9(nl z>)0+c)x8twl$Za^$ioWK<@V5*o_dnevY=JA2=!dIdx*cu%B=Gm=9O`wk-HI5rvoYm zHnMap#ph17e9oDUHn(D=kK>9|k#5QBU_Kr?!@Wd7|L_;o-FuZi^Iy*H%(Ns42%P?1iWEx)d8AOc6s|U zZY`;|zw97pqI#`V{X?8rC=VtJk3YZ0G7t9DL`BNZy8taey2%I1eUYB09lBD3OZ0k= z`(zd*Rfu3N{2pSI7wW9`4n`XoxF~SvZ6b;#ACyK! zO$qr%prpLMd-r=jUApUUIdiez=MA`}ET9tRttC}1b6AazQ!d8o%dq7pTt@Mnj`Bb% zp=K$v8;yW6%iHDy!bX=!mc--crp6)kheQdr_-MOoJs#HGGWD<3f?z@Jfw7ClmfiAZ zJ+qV*o+}-Kf3_@2^(|BF>4deP^oS!x{?eFcIZ_}Vc7NPl?13Qi6aqEht3Vh!_x*+e z3N}vWy?f?;71kdD5V3}O5T+*jbvF~iE~M>5&uOF!Cgy)EY_2C0idy{dSiMoR+lH4FSSAv z%ld0+SC85i=WMufouITM?;&_5o>tw*Yy#lZjaQfDr-40WRntq6_jjE^O5K-2E z9(`~>->jDsuKoRMWJ>teXxGzMj2`!+^2RZ*DkZ95xG%ILWA3()s zhW_s+wW=_!vzDuj==>>KtAQ?1_FAh;(kY^M94Wc6?nLN^<5F>Vxk1dDVnUpnPdSArt!s7KBLrGxAhJn2xEdjjMIKjP^vz4F1~K{f<2M z{Jl=07X5RXh@k_+!Cm`6h5ox?SzRT|XQ|HWQ}n0%b9jO+*q^v4eqDE9i1`Z9Ren8W zd!^|0>I?+UBRNjC7R~4O`1<_=GPq`@4+a_xpQx#O| zhxFs4-MFT1po7mDCl5C8W+sEgZ$s!HFD_U`Zg{tQXGAU9aLzCWJEg+O=j|T2X`X# zV93qe+s#O7w}XeHG+oM}JZZjICp#CAbsU!WCFasl!rA7A-uDv-L}lf6?>Xo}f;4o= zd2J(frbNWYAcK!%!3;-O@5^o#Hk|_El8NviMSu-R+YG#q!2%5(KzY{wUN(2+E*)QC zxB}XIMDbQYp>@y?pSNR>d+C!n%+v?dye!tGq;*!wk3F~=!iZ(Ccu5OpSK|x$z>W44 z35TbLD-h_q6(;H!E}7)+!?}JT?}eCVtR9HUpHgJHa5512UXT2&%un7O5nI4hkZbP9 zvpq?BtjtguM{G>=?n&WqRMp;+T$Dk{21>%H9D92`agi4q$Ja3%f&ZUc_wDIB?kihI zr=Z51`|lU%bJ&qfn@{umP5}WO02;ekwh^_|^yLexR(7M;@DG(nH?Dl+e0ndcqB=X? z9t2Vu&hak{PJvSW^=W#~#>6(6XWo4N!uU_u7C=H@B9lmY4Vr_kFnwi{k}jSoKni$? zQo0^`ij-e{y0UX$TiP;XNlcEn6d}BZaFRB79~7ktCEa*53809e9&GRmN}Vx;@mOD@ z4vef0%ry^VxS|^N`S++VS^J*PKYR$CAbaaHc24+2r8An!2YSl>n3h|ej&*I>!fefY zx3W8igBP_QivIOkM5wi+Lr<*9i3T;^_cQTnrx4k#0-l$}ic0KzLB!g1dRPtQ?cC|H zZqAMUoT8~4T&i1My7yE1>ZTveDcvJAT$IkjFY}N6430^4dJ3@4+LK`xlyu_!k}c2^ z-nqLLVUMhiyyE3k6??6(XL~;{i2u2#M86KdF-ZfOWaVo4wskFR3#iw1x1nF9&i<%Y z9TmIYwka(8z)mvR)_HL&{8s`*(_3LUt6~QbYgRr6e-b)J9OO6q-=|eTvGHJIHV5pB zxvC+?M{R(J9cYEaCSqO8kL`RS&+=zZOfg@VYeGWban0W|XvW_E(POJ(3S8LO${XRb zaI2e+{ob^nmx%~?Ax7@nBtok@JK9!oCo78&L~_I{M?hUiD4ZhTc4C(YYnVSuFS}aX~gsFkjBz(n@l@ zCm=~9Pvv|iKz@_dt2hnlgB{-&3~3;nc&e=_JtL&cyqs_aDxUv)QfxT2gY5QYxk&?G zJHB@c-gDh6oAv}`kK3D!N29uVPgSnX?iF_wWd@U3V@=V`U0-4%a(;GZw^# z^nSz2S?*;lQY&bmOJi12y#$~OIy{^B@veU~A;NqjY*gkv- z5#lamPVD=-S*d6z)W0k0B8Tb$-{j|h<%gwUjH8{~@_~0tvDvm>bcXZ8N% zrDv>ik*(%gnR@u=$=Bm&IOJ5%XLru~*ma zpOF~an<$j$B-v+BQ%^2*;tY@an3-M=gQ>z!q)Yw8;i}flG`#m*?wuT8%3~@b2s4%X zJOT&HLURKustE3OV;4k1fU#Hrj}zal`|@Ou?7bGy5*B)>AV7aTz0oS7c%yzQLs)}|Ql@87%?1Alt7hp2S_g0Y4R zOl?T?X+$1A3Wu4oxD;x@#o;5r>I34@>nVXhy z=CN@hhuAfcGn~%GD?4E<*so|DZJ=3K*%-K$k?Ul=)n2in*OGR!O!7LC<|Nfte9a;L zN;c-Vuj@Ze;hU&{!1F^0rLLa}#$Uvr56`Ng$}S?cJGU~|+;2vo5P&#=0f`ncDscW(N6{ySPaMN@XlP)_&NS4Dc2Nf0BMol1Kcvj9=Wdg+cOLfU&ncF0z+%E;RS9@43K;jqA*9(M zrO$xU+lSvOY5&>y=n>n&QQJsiRKxX}M1FLd4aWjyC}5P>NFkd+cR0Wy&SA9phSrz+ z`s?>>&a~vhX4B7QBauEnu)0ME6DlSn&oBOBY7=q#4U9Y^!J<7WLi;QtQgGsOAhZ7Q zna{!fs;MpDrmz$073OOE<3;|;h)*@RcPk)Gma&h>BmTDS-}eXY&GeIZSb))s35BEl zE}T4t!`;@b*b%c_>o^5aWd7uDN?s?m4~Wy6))pmAikcI+&LCdSuHK2S6J^=hFiu_> zKJSjSfV}b*QJ=E=)!Z4is@F~j)UMmp@JyV!YzxuelDTNKJpNW`r>%3h<5Nl8Zro|$ z5)TVXGnZ>QxTx6ASQ(3?k!Y^@TUd!0rqA(1Pi19IgJwnyZ~EFaYPQYNS|;&G%epyk z3zn&f^DNpqrpRP!jue!pD^q8_QztdOl&mXW>#a{~>HQhJuNzzR`{%g+tCgqTV1QG- zIn#gdoc(6nT07}k8nkv|PM++3;IFnQSpR52+`R29lccxs`9;M9i~BhCzYAl^hw>B5 zNnn@mI`SgfK&y``9+np{k%~c`Ma2A;1V5q|br0W-AFjb60( z=Ig^#Xcp~_iyPqsfo4l!^T05nsFy*vV8naB%ByuA+$X?5)1Z?xP2~4tOAL>LKYiop z8!^l6YK>!05eh@fVf`hOpfRPZHzlfEn;?IkyB(I@>&vYa`E6X$AFFyFk|#st5P6z$>*j0#j47-%$Ww~|Iy#P^ z6Tnomp9Oq*X4J1W zV_|})pbKvH##WP9g;K;r|)s$I=M+itwN%+_r0XGM?$gY8D3M>LkNWA0g+H{w(x_}P3 zhuE{ei&~*qUMKR$sF?pA9<-|{{ZPBFn$E#%jPVQ!jIHRjl75evGwPbe^CQ?q(gTX2 zP^Ux)D0J*pY-fq(&x%>G-x=Zy0C372^NL|%6EXEMJX3}&B=4>)f3nO*J%0h={ z4xE4VSDAD=^K|eB_Z`M!e-wiWVQk3;KBjo|kJx)`C!>CvYo}BKknfNNIV3mn3VRWR^CQki+81-&{E`=BHQZ+{-@Ha zHYD$pcr7cKw#eka@W2*R+;rgO-euvl<4x` zhX;K5aZKMJr#^7%kMpc0e&&9@%mmrCIJ`5!Y4pGkUV(=aH{NUh8U^g)HC3)Z0SQXE zP3`i60NpG^)BkE-_by(Uk6&_sXnL2-;(fK>B8O76M(>NUTJi|;WWofUqE@@HsOCzu z3j7T0cbH4!*FpdA`&a=acpk$;M9}DgYtfz!afQ@`JQ!`vNw7E#{)n$mST4#~&Fc-q zo@5;AUN#t&p`>wkA>dzT^HBCVa14U8Ra*;&=930^_iQYFT$l>%i7lbY2XsD}cTIrj zz`Ad}_Tv{K6`M=PTYh=&-Hj*uxo{}QLvs0nZGzaTnBLBoIz@^KkURU;i{YHgdM?2i z%CNkm9GIOUE<>!0X?&Dr)&_1j>qu4{-1dR@EUr!_@d~ituYu@}HxF^txjz{@*x9&k zt{BH|pKJs!lxzb|89;$+Q@Ve822H}@yp;WlZNC!!T!&XXs7ntS&yD!%Q9#@jIE2~f zD_=$e=nnvML)3vkIr@L`%vV6DF?MZ0wuO{0M^{v0x9@^&dpkD&YqcibLiHBpk+rt1;_}?Sh}=v ze4AdJBbDEXVyX7Np9-UPL)J{}i#%Ve0qpUH)a6_txm0z#@n1BCz-Rl~GnI!!lcw(sJF>m(IId-p8_Dw)4))dQv{;L%4 zxZr6Qy&mZ?6E8fJgF3bQwp7AuBz@NMWu+V(%5#k_0WTaRX7^#Pl)bhhbxq@`QWl^^ z1VI7Nzi(5@N{l%|?QtzjFRe;2!Y1C`S(vs3zAg=UyXF5bq9N7UB&*livqP|YnjbFYOKAlhb(;2@_=i|TZVonxShq5wnV6*UuzxR;n#1VlRV4+!sj#nn`xEN~ zG*hnle-&|~6hqU8cWGZS!1LWyfVx3LmytpxNH9b?s>F9G-5Mvgu4$(rZ6-YxR)M{5 z>eJv-xe3#UT+!FARTwXe)^w?A2n|}vWc_yECYlqU%n1l%e3%C^+&OMZs=ER z_5+m$`n8KXq$vIIhxs1v1nrMq)2Ll6e-K=O-X>?{bxkb?@SMkN^=Fqp`!b`dxEe?^ z@ecKz0DJSEC)$^5wd-ks#ValIPj;gF^=qs3xRYR1gPx4LDy$FTI<*$n9Y~dh_aTF2&#jfGn;*bS7~3o8-^o(qbewq5+Je;; z5puLa${cH1s>vnMF*Cvj>88q+F=yo`-_7)=z3+YmTZY7`(b)$|MdXqZa} zbrv8$1B4}HzVeCXMHC7Aokf+n2yOD43<TnBxGF$tE}Y8>&XFXjMFN}K(XvexOfjZFTpudu#^SS{2xAs9z9qd z4jpZ%2ZRyj6WZ<88tEbNX)1Q*>40)Rm=|}2B-9;V!^ksboWO~C4rufHtW9An_pxGB zY*S>X7jcp?#s*ER#c{k6o6)hPD>d=34-meOhc4+E6TAUH&(%WlYG(YnkQ8BRbY>f+ zf>l}1h%5iFvc3zrg&;E;=~lo`s`k!B0da?bf?|tLop6*F9btvPwqi%ySe%V}gR#Jt z-}S(1c4!ZfhOn6Z5cVSw=m;!~QVN@Zs9pvAM>62=45%+z0(SSw@@3J!3ACIVT@EAw zgw~lWqGBiw+nl@hBUSl4v*A1;1MVQ$d7fJ@`ojas+>nYY_|w(+UjfeQfvpf{nfT8s z#379MH*9U~^?xvL5H1_6_5)gDBs@WVdGn=FDM|b9652N-z#VJ>i5^3qRTJiM>aji^G zkpe>+#UKo-Lc=2I#6t$Acc#zT+jxt3k}|UU)SLXk@L}7OM(5t%9lueDt)c0!xQf)2 zOC<;X$&hp|P&I~5;Xmur8}e3dw2Ue=@J|+!em`DQ+Nxn?xYnI5?Yw->1}X5WsL8g;63p!|?!;UVU}0jOb)yNk#`UFqnK>JrIV z-lmrF{KZlJ%zZcR5D2;<7E(E0rg5BNG9z;S2xAU^G>1#%z#Cea%bWI2Dyk?wz_HOg zKQc@!NcjZ6oa5z;x9_Ua!$l6QU$@=X&kt?;UD(^3XYY8PFm@m-g!g|Q@0UeLGn26) z?y6)^=jI^-zXkL@0(xhF^h7CHG`kw4uy62NR3^^vb0XkgTwHslW>fT6!f_r;>D2re zp$gFU?lq0^e{EA=^MJI<{0G|M;CSL{J=1dlY|%mRhKV`0O@UeiWq@PI_9EARg`!9e zU)(C+l{l|_?AuxmT!Jmn5~{&AMdvzfq0R239CelIJfP*Aa84n`0RmT|dX~N# zSG+;Y5!GtD_8$1SmwV|HkZJe_$Cx>pYJ8Z4=0K=C76l6BFy1wE1;@}v%?Ef??16eV z*@nwlK7@Y;%`tB8gMKbF>T3^FS~r-TAnX2QP&VJo9+y06YG2~;j0^R=_HAC#7cfrW z8H&^LCvz3d=T!NnkN)k6Om~PB(Kmq{=(L$V;N=DWYy&>|)5U24Eo4skqiB$6L>R_| z)<=Fx7hsvygK?R{C$|o3UmV%A;upf$dPG4p0!s~h{+aDW6cmS?+S*22;vQNZroh&E zS#V{)8v6oP`SsDpVtv*LxMhNM4KP*t8uok=wn^`%GaQO~c_%`OBkcltM0zXrh1z1b z1ZC_GAirZgy<8t`ImbAhISFRO{T6tBL`xX=Qw51MNI1pqSd1xuB%ZB@4!OZ6c%oXZALTV_Cf)K2WV#CU1SG8M@Z@U$dN|qc~xUe74E!TDq`K-U!-hHW9q5Q z(tK6DfT=3^%u{3G_`W~A@=ca(D?=V5|7nq;0#@@4Wqistx-9`RcA%}hm?nh=Dy9tz<+-_`+Q68ZPay>#PcqhJ(k@5y z+lDFsF-y7~AoU2y`nXX^t>E!9W1HDX=Nw+e@+}Z@^;4uz)VJQR#1kU9NbTo=I`F zfoy;3JT&9b7;+5>pMQoWiBAjZy9*-5Y>v2zv+M`q^MFetRpShx z)RAe?`k=B0UU^mWsKZC*Pm4A|K|)fYzl1dP9{-DCdN%^sPg{Bw9m1KUg&>$_t_CW+ zMO${B_w#g$xJn4PT7~O;4r*ysw$;o~*(J^d6i`Y(KadS6IxKu20!`(t?kLN@8pIGO zx4cOEDQg20c^ElXb$98+E@+O3#{PpKonu}3MTF(oIy3j)PH1<_f&moXVoF)18Yn;~YblJlahZVJJ>Gd&p$wIgmTe)OmbAbn<@@gH zWPz}wqw8gHtcz)HuVXzRHvV10%}2*3Fcqi$k*m!4eH?X?G4?{46it70mtLbeHeRAg z0byN1zpW@m{(A7dWkSOt;Gb0fDmX2z{GY<37t(A0c)pm**dr`5b3}7~$283q2&n;r zu9kPmz=OQvQpYm!Mr*%bmj)&%ZCe0?A-bW26EYIh&(lvG=p@o~SppjpaB4h;0ZJyU z7_gOyn8%6L?B&o@p5oN7vAkco3kg{}xY)*d|0o>`GKnyK#DDko@N~25I+T@NWQe<9 zcvAED+I1wE>yk+}JDTS}3eEGpk_Z%llq*;3&;|WTKViSpb^5C55Nr#X5@Oxv9*$@t z&zB|ZNj4#mrp~K_c3GD5igPM8+^r#FcTVbE-DtV%H2vm&jv1^1Mz#{}s!1R|2+-+& z`*U*XBjQodtDa)efu@u5M3OUg$hi(J!LYP~YG5xIFwL2lqbH2LQ30(?s{Nv;vy%F^ z9L=p(RJ{MThpr*-eVrMEY986|F*H1Vt)QYcRz&A5j20a>M**m!Rq;L&b)zbPfrbw0 zBJjjGzBYzu*3ZBH6uW&(T$wD1!hId)uT<|fTtPP`+GSRl=p1{ZiUw*`7%Q2qXH0&y zj*bU=e4+vF-ZBFQ01zPRY9(NOtK2zNLck}dB88x`G895=H}^zAr4i7sacZZgnS?4& znGF@G7`A#jvU9u$7}hITT_!^be$KlEeufDrQ*c>{1vJMCgBqF1Q+e5CRU6xCd>@bO z_=;O>3ZXCEa4}vk=e+CMrgOt?dGcv>Ja9#=`uc&By^5~NdU0)&P}4F&*yR9{ zlEW++_wTa2i6Z?i2!k91snJb5+0{%2+IRxN9@UXu(_Lm+Bpp6dGE@ zbM$hUyA&7JZ}O-^)CWw_{8V^q8{Z&?g7`Rg=T*orMH$@rqIVGSzWzclAHHQDX<(Kc6Y2$C zI~QyCEKaRI^`?D5%CET8*_r)u7=40m`upN~z&lz7Us}-n9JoU$xO|7O)R-3YD5K2BB^VBVkved`Gp zh3Py9#JU;O_}BA>&*lV-Gz(`px*MmGl32~XOHZ3ILqRZf(;2Vy%|W}%D~L5K$gwMIu{i8YjeiAP?whLan)TZrR{;y(3xf zZW4_hQX|us+r~ve5wOT6YRR)X;KCZ9{S>g}v_`1V0W2 z&2;P0N70167=FIWbkKO{_py|F)2ffaa#!T&cBV^SDyzj{zBh^hrtl5P1?Ktpki5Ym z+D70@cyUn!@ZycN_31{iC-&kqv56|=vtSCRfJJtj&% zIYXrsW~0m`37`hEJ~o(t;Rzu|tFX=ukK#~S#Pf*n17>6eOX#?D@6KF8ArAYR5EzQO z4K=`N4n`^H+-g5l^>&Qh(+w58J?1q zNX@SR^BDv8b$rtf@y%;hc9Op2h>6Fb>D>r%<>ffvWFc`s=l9NP+Tpl>__*8&i21w* z@;Dz%4wPXjP3MOPk_QG_7zYQ4>2vmXS*18JUt%cI*s%$aX=qr&Q#g}4M7>!`m32RK z&H6x#fO}-+8YejpKicr(NW7I3D@Oc zgs&am&WW+vd6?!$C5E6gnpFBnb&mH+C4FF# z^cF>A@c$-azXy^ZKs8a&Byg7Tbj`JqWs$C3QFN(G&&8Jh#(YMzv+BVc3jGndoM9|f zN06)9CrRyh8OL;g#S>)LH)OtVbcDp!r+LSB)BP+lZgAJ_i@0$AEq&n=j8pwY62IYs z)XR4UDl%)LtC$? zC>)awvPGVKCg3i4Rd6yMHPw3#%5Ui?bki4WH~alEZZ84r{>t%<-CM@k`@@8K= zqR-C+#i&%4VB?~njjLme+z0f|;)jFh_X9hvEQEP7uBTFEmVO9j{j!+HsZ+WZSZI>& z6rW^S)NLJ-neb1!na_ZIOz=43hCTeVI5ANj(6<^HV{a2CL)Jg+~}TSjN$ddFY#WJ4#O|`{oz@Ohrf;0!;<4TisrL-&jf`Ncs?4C?g0kwQ2VI z;`+>~LFwuo3w2FHGv=tK$idfZ9N7029jQN#`we7nx$WDSq7$3_ASH<)UwFdED^0;w zsHm-i6HD?B<{3u))BGl-v1{D`@i8iV?t>o%3qkojokKphHp|aa)A7wzn)hJTSh0(m z@)ul9Bv@q}v5RWT+%wUKOjMM?dmL`Lo$u!$hhgWwS3}DzAuS!B3LLfv7APfN&41qa z&y-5?pm#2-te@38!sxVO%L>B@0f`}0e7u5e6=jNB`c2I1!we92d?R_9YBoW$Jc^9eW{$pt&QLJNxHMnZSa z$`&PEIuu9wK@;0YgeT|KOjMTQ)0BNoi%?)`R!zRw93Dy)@__t4u9$5?UPP&`#ZJ$i73@M5%XVZ!WZ-t*yl=|lUd`& zrcN0j4E>w*VMaLr_YggLh$pxFbo3naPoq80M@7N#g=5Q*TG_h!8v;pRQkKV#TvfMx z)LG?ob246A^KfhL8JWi3ViIe!x7Y`;JuV=Y~G(<9ir^}<(Rr1abWU%IHG$wO!6J+V5roP>R}`1cW=0$ zT8iSMcq;cPK4SAeGoEBg;qg-;xz3QiZs1)pN?LXHsNum5HQnHoB3oG1Q>8D){_tchl_L_ik&1BOU*zuiHs>cOWXf^AiKwX1CqjbhaUd_1D5of<^bA ztv!nG>EzDeOH}t*cT>n z)`D+3&D{zLgf?;B(iui1o2!e~YwXyi_;5eV!B%IOb&wSof=?1^(*=zlsQGMeEU`d#uu5t4RduRvOBQL{$<$by}zK?Ctwzj zS^BVQZ$_4pzdX;44gN(o=Ww|p%OCS$v&xrKkApfqo9t*lknEf1`-67VT z8$UT5e~S`yoSZJr%0X=^j@Wpq;jw#OZTkvWYCV1*w=eT;z1NW{^*^VkRVtTY?lWg} zxP%8q+1b1c_s;p6m!xCzXFF%3gwr?R>lY+SY%q~wrBh2Yy@@R!WCZfqje+vQkML$f z)o@tnn(!nIypK53-f22lmdx~wb~C|_wO@51wm7<2k==+KfcC2?tOpE8y&^TZePb!= zlBFx?Gi_Pylq})6Ac~sbsIK>f)slfvpA#!mL^ml^1yp-!;9aC3sP?9A0qpwi|B-c8 z0a3Qm+V&F@RFo7DP`VM2E~UGh0Yn-Gkj?=qDFNvQ=^lE>p*ufv7zPIE8oK*`-TTCE z|0kT!;(6Dz*1fKKJzd7#{o5Q$8L=W07o+$olHQuM`?MdyGPNOf#_~ zfA!ac?IVFYxLlRpUWMgc0vr-d0awFrr6szxz&78kNDGU(d)9nT|om?7=`o?F)67N22p4)Nm+c}|5(`~)3ts`-ooZBj} zT=Lu@|Gtf;1UU{*v>n{Lj_ZI@j2aGCtH-Ao=nE%s(l@vbL!|F7hWa1i6X0+>pi)W> zoDF*EbutVB{* z5@8D6Mqj=6;f;g&iQd0r#uBvTr+tjm4=zRh+vA1Fbl@K}YsT`l-ol{Di=wh4luN1>0q7uq78 zCAyh(XtLH+|GC~gSd;HOYKq2<&nxELH(Puegor`{<<#HIeS6};Td07|5yw%gRP#Ke z(D_fd5y?C+K5(9_ugye$S=IRny1!LduRy$eaUZ+eCW?VJu?M5wEfwSqtogPgiv$?LG^P;vkJTl}@sm-juN2wN5U6nX(QB@%6Au$lW)&K>$SvRcr! z$mNZUUWiESUs_f|UaiTAFMbYN>P4S86ZU5*ydypMDE<52s#RKfoos1M1K=qC*oUGq)s z^+$0xM?(@uwWebYWhgk&%j`t=ikQzD&H^AamC8h54y@p_^kn|5Wdw z=vdy>Hf zUX4zu1sE_SaAgO&Ew)eCBil6PPi^f`=JczV1MTQ&5TBE!d&Z9hN#cL}WXvhBqb{g& zk0Kee)a%%^Yql7bQB9d3_*UR;t~kM-79S~)@H35e4p%$Vg4cWH-rIW72yHHpEP>{$ zJ)H{N7J!uYxc3KX|B&4cWFbR2f2!j_MRw+Y-;nfq$bTga6rj5wiysuZeB7ig zX)dnvbuVn{^Y;5A40^<_Y1(A<5Lzb3Q+F&F-xbg`8aFMUvE&Tq7VYX@@cUiX{BDme zufw~`L=3H%Ule$DP|`48fLq1oEL~v0oGKDsMt+OGRLVkANWAvBbYBdeZI5_l!AQPJ zzueI=(Al^PpNc6PFkyG%(Gqy}m<>l)Sakh6~rJR=5x-B)FUN zAj%%7-JRYu+!2sPr^HDUXrI+S=ijy2-5U{+$ZKMHMwBiI`{nm*Y=O4#gnIp--Iv-l z?MeD49+iQO5%|5d4PU#6Vg&v^bNAv1__KJ(<=2=6<5v{Y5r(w7Hp-ZC2Qrr!4g!*O zs#hfLu~x74$@GD19&Ko+KL0i2-)3tf!Y_7-cQrk>K$Y}1!>te7f%O1Nor2%WBEq(T z;TqkY@~{=Ci~o^!%?OcSh?W-p9^}DQ2U}Uv==UD(fzAlNY)R?Jnq)$?czQ?CV!ujBT1uPM5Fv1*ms=u$gw{CTee!C7ED z$g$jg+iO7U+~Ew>e&=IYi8e?p8eo5iRBfid7ea!lrm6sNauymxZDJ4!KPgH zAO#D`q)?f@++Iv_kh_2dc0SYSNa{cYj4WV%_ zA-hB5lXY&g<2-_>WyA0;M2GY1+?o2`<`(t2BHN`$hSlv}pVyGW0zuVx;b@EfyN8QO zYh!0}RHC#25vmsZe2P6kOYel5o0@IU5^@sSleZ-kuX*@B(ORUeb$CM46VBFS2(_E- zcU^29KLCl{d2WMnz`nC+nzJ{fwQd*sb&Gd(+f5#u!}w!TJI?o|xqL~w@{tFw#~2I! z0$W#HljMI(sQMS7%s&CjE>J0}`kxD2s`q1^8C zk#l6`bi=SfXvS!)SKZzI^4-u=m!~(OzMm$==$N9+M!IcqYRwoWTQF?_zo4C3th!r` zR;1t2sO$aB8+WFG$j9%t?b{}g)x@1s!tuXy$J&USYpX7#Wg4(CWa?JgId0q`(UYRw zAs^PVslhO@d&82Z;cu2@l<;aZ6Pe$vOvT@~=uaq7sxjQmzcdK;i=ft@*_`JsO-NhU zqmjG{jMo`PV3*WLb`B)nq!o0?rv7qLhqWG69Sf1+uO5B~V4$|Ue8tfGpXdk>G=4df z?ZByw53V)ziU*^SQ@{zVt+Em$QOuY8?xe60y0OgsmMR5V!s{-#44d@S&$xbn_aZY8 zM^ZUNqN68OCcI)b4W4+z#kY*8S0qK|JE5#TRsGQ*AbB)Z*bq)a!qKgEqYyFMU2B1X z$I&DIf?^Mqt%b-h^vI`VrFb@)JYQIvVXwYWxS9!;1fM&GefOcgfsFB*2E;o3YmsxO z%Y1&2v*1Jd#iVy+nkfq6RAL;PV@Po|PDz4K`i6lnTDDa{))nEMUA4ax$?%RxfNfzD zJ2#V zG`j0i7C74iO$!@&-=1sg49PNR+za{rWbW)gCD`QKn~-&`UM`$rNThZDp;cn~o1&PV zA&CV!a|hazCzYXy6DfBUrvvRKf|qjJ9RpZZ|27U0x4s+OIZfXjal=OVaEXp^=o?zdxv?%tj~md!9|8zg9*_-Vc?1ArKugB9vOZS7l?W z?@|DdX%Zpt?3J}ir6hjU{ww4OnTyi1VdgB%R5=<`KV~$hXS4~p^P7O|l@-({_XL2I z7ERX$E_T}^Pyjq$!?D|N6Kk(wR!Cp+@Vd=>wTrHu?9)mg9FjD2D%c~CS(k6?GgOPfkdkH@$`EN@=)AE*JSPs4eHJL5eMLy{3eTxwQUs5JI>=3g*zS5Y zy`8flYrFxF@Y}PjisdPuD%**+v<@M4)+S?{x8J{MUdjtY1*x>(>8m|ke^CuWRIqdM z19{(T^poq$+apVS&AO(t#62T6kgEirlmEKRliIqC0=&P!#cvCo%Y|ZWr3v5@dR$B4 z>2w2FZ~0oFj6{m6-YONloWa6dSjC}=_)c8{P8~a2ER+-yj9q@tB-gjXHWHs{(lMIa z$6|PWDP+dk#43=O47Z+FH1Jz~3VjsDx8Q#3)-R-UP5$uqUODbNifFlkTV?CRf{h%? zwUn!<4VvZC7pdQg*?fJv}dX{>) z*Fu}Kii|z=mV3L|)36{F_lvLpiZ(Qp0RqHM=c(|j?Q_j^R;&qLsSXoN0nh<~U;dBk z72{UtM)`y(w$r$yAd(0oj{f$h$>Sge9vRph9M_+4v^y}}gS`%oqBW@~*zdeO>!OYNU?8Ib)q7vFL8TIM0;i z>yl6%Zks5?ZRgZkgawFKW6KAnOx}rm4-S3^NBcIiG3hQR>qPD4{&YjiOx1(I4;!JG zZ~fST#5HEh)FWxkJ>p^9It`2N3NCRNlhHtN+8^Y+oUNN3@q8?2x*>~^RYQH#Hi*8FE5GN2YSgq6^R0Ku{B6r4YyiqbB54Cb)ybE0^Nztso zPQ&&M)_#>ESJXsIbtEQlw}0(&i8hpM_hF7oY7ZQJ~wxMr0q zGYUF-6#IA6Y2F6Xq*eqqU;;5yR}EeVRqsK2(=p8BGm5@ zP4wQ-mwP%&&|||Vj4dyx7fV?0a3=-k2Gfw8CO6!kNL-XKl=|T`0X-))UXrpmKj>%a znK&w8JlVSOvv#$LAJU&+lM6N;R2@VX{UhoEL%&fKi`x}63L9$ymYr7&CU!1kaplya zA%ONEx4sL6%ZF{=u%39vaj3pu)o9TYDAR!CG_e3W7*(!vIA&aK-`|j_UumAf+`~U< z0{b1Trf1zb$ta&RrJq{&k3!!yTsx_fG(xHQJ8B)7>ty&34%*t@^g6R`?@l}} zx=A2)XB@m#J|^g$7$|-MJd#*8)N5lPlmEo?eorChAShMDj#M%2BiE(4^;4U zGm3|yuboBIAPv5k0>fQDOTiDA-+Y$~UhHyjeTgsKu^fcR-u_1R72lGOVp_V~i{ zF1SyjY+N*WjUK$dI;!dQLyP$OFm&XV~w7ja1op3vN+*|5NomXtXHSMCL z>+m}Gl2P`)I##q7?yLwO9rxHfF0rat$;E{R2r{9{VUuic^Zp?l9YqWJOW8=`NDPZm z>fY0X(nb+lZa)0UhB9!y4g9L6Du^75H=bjxaWGOgmm~2-$3?vowYo*7XyFO0qOv5W zl<b6!4!q$kja#=&d(+!3-$){&2V%%)z){6G* zRmE8BW4b%hMn5CIN*jW?Zy-WtLO$Huh^cHB6t00Qt-8=cj2HMWElaJ>BbVAKLg#pA zyhB-|fH|!>{T82_jZE1bwlN1>lh{L#fYHJT=*?({>kazX;lCOw+F!56%B+#OPRZMi zXO34q5rS7k;b7=8q3c!lQDfT&GD3@OH7Vmg(F;{$?Wa7}n&iO8+R`yLr}~b5rijrCw$; z&6P)1h@ag@nUlW-#cwgDLC*vUC@)v0(soLy^^jWgR#Oc{h?6b2O}2s--`MY`5covB zsCMpJPeb9QWMSftK)R`hHf5Of(#6u`jNBS7^YZa95^<39kgNRXK1FMa&904!uM$xG z_6-YVBMH1;{~oA1*WYrK^V_+E`-!PH;Cr85%LII23MAJ#s~zqft9TD$Q&Jzj zr2`Xq*?#iRtnOH5UmLA(19bA!Q&^>H$>B^8$dYfB;Be_u$NWiCxBoS4u15c*cX$00 z+PZ5Mc*EZ7&{k6j`CcnmMYkE#A8Esli--TXz|MfM78W#SYSfo#PXw93M(FuzH>E*KMKZG0N)y1Jg$ zr?h8EOwpQFdjfNqU}J37b5pN1B}+b8CDm)NP$`sWwozGGpqxn(x#R$$%qAMjxXGuj zks7O&UIFwBaaZeep~<4+W33=l>{w>4224wu+D!ij>F$_}R)pzo?^r&z^z!L01gjc> zW$gHa=s`U%QQO`3la|d_c4N<(V%y)}6z+}GDn?#%S}eQnwJ#=f7zM)lMfjW`UZd?m z6M*>%6m3l%MfT(v!}2k8NqZ&L=MG`5Ru4V2S)M5@019q>f7acMnRzg6Q^xt)^>w`_ zl3Y=N15cWh!0_*jlR@@ND3~Tg>w7-b%1pj?5CrIY3E)2$E<~~;@TIFP+e&wNw;@XH z(?*$?MnnPi$e?p6$_x!1c(x@V9NU8a$Fnj%%t8>j6G$P-H zcM~*iYZqn-O;F@D$Lg;kT_-PnT3JD~ywldbp!z$#P3ja`;<2q8JYqYKHZxm>Mwfbx zQqY~K47K---+%7Olp@OaY3ya?mg#Rr_U7Njf$a2GE^J(aw!D<{25aE!-$@7KSec?i zYuff*t>b}g5rfC&+{2huV8HwLS%GMT|0R}`;oC^6SviqIWp!I>g!W9g1qN=@VPoDaWQ z>}{2LCDffN5kxD{d*1%im`ltF6S6S66qvmqYTW=NgRixv1o^sf8BJXo!m0lsY^=RI zqRP7rUqc6&Dmp9Vkb@ftCrCsv1&8hY6AW>JuZd7f4)T7C$0QsmOJL8jgTKu zxC0I{>u*z^s;3%njf#>L-0x~GZmA-=x$Ol;ZTF(aV34IMpyU;7o(>+htL9kZM}>Fz zbqC}yz7#d= ziTA0Hw~_*$|9fXFCU2Q3b*_m=WRTqeLWBz5(WjPj?)vN0ZiF!JTfcpYpKhCm8DwSK zX!)l@Wxxh|sH!BpRgTGxy11FrmI~B)gE0?jwE-9I^QEQn5q>%He05vHw6>2-vm!7Y zQEg=O#YX9*i8Jpb24kH8GywUJ;4-X4oM@ctq=e|p7k@{t+XT=Ngi4^MjvbjVZMz+> zzV`A&$ug_ATGX0aQ65vpSAKh`5PLl5^)7?XmyKA>=&pwT>z0w7Q|%mqqR=(|0_Est z1xLpBvV9$JbQ9UKFR%8d;ElJnMV+Ds4KVf~Me1$WDvP%EDt2MVot=feMyOkUOq8f} z)PsB8$whz>GHZ>yH<){cN3)b7O;{H#1TU35d}4~JGScy8k8JxepbUsl9n6Vc*2-WS zNLE#4EiU`+DvSL?Tjw(F3Qzoh%>=qWAV=-IYM$Ax##C_mvjAuEWyn9+f@8lQLbRWdJBc~7STvRHc+z{9l^B_om^d&^rV z@p1Qa*!~Vv-20XH28&aT?BlBM_Fl|Uj?4A{vPN=~B(pvSVyoQ!)I&Niq6P$%3FX0i3TzK9o_HRG8W|J{)@6@6jXfWnucuz@2YeOam%MePOzF>m2Z@0jID(*bnZQc+sB z0?j>j??QOk`dz*Rp-U0vw zb51L33ILYGyU^k4;KnEZS^UEVsLt#Df)4>-+8_Cw&OJf8r;GOjuoh5Q46lQzwIoFC}BXNfJ11GB$&UsT<7Kjm@r)N_q$NWmBhJ zW{PQw7xJuVY+gA${>1WktnS6VJ>KUbGmx98o-;kYidR_aAKZuTnn!?9NX6ZGCgkh1 zgYYOqh^>5B8Y4TaL|u?r_fB%C$bf>Y{vI0|Z?`}+Yd>rcbiq$#q~35&F)VFbB2Qv= zi@ed>17_%D35o)By7YVVkjr~sT6#FB3-}KKhQ)>6yCfQ+in@p_R+F3UfQCt25?eKloD8UJ@&Kj~}u(v($ zn>t=i|8&`XaqyAv1E?6gT&FX7pHFb8QGC6D1KCE8LxO~eRtdr7x}O(YQhpTtPoos~ zw#25=JwdcjQF2)*5b4mL=b#U$W-GWZsRCH^N6%y4Kf3i_9lD=rL@Wy#R0BIwl_^1d z0T~2%Fd9Us?&}lvG@5OlU<8}^E87bJ0+RA=>oFPg^we3r+Nz?4v;AdlZ)3e({Zh#61QN6MiAZAH5LDhQR3(f8 zPTkLv*~MVjCTz}|2c zlj}N9E_@Z7U;fzRT{$}^2On2sw^^}e*}}@d+I*zUsAuCkiLDT1e{--Q zFK$4yLGu|QGWy(CgB$9&TrmMByqv#_arl{k^+!b|qf z0wTaeRUAvZEN!O_FkR-oyX>tETk1W*giMm;8I(9ou@7stLjoid@AJ}8wIs#;yYIe` z?uQHN0jgno;m5!>zNo_GIa7!ejgXdaV|;0oEzND!Lll2#k17dqfQ}Bsry0*G#U=s# zIW)X{2zhRd+GWzlZ#v1mTf-K0_9*k#%iETHgw6hU@ZzY%q*iV+wsxd>OK8KTs-{md zW;j3-F;raye6f;xGcr@z<+ht|KX7j~u0BGW>O~Y}8%3T)m#NJWx44JOo}QSztjb4_z?f{ZjB+46p5v2(YXl!9k%cLyBB^0xr2 zanO<}%{Ed0gW+9oZN?!_Cs5!4-N87r0uVHR&pqGWNnbhDA)W9~u6tlyVj;?2&0Vnj zxh{QP>xDrAPOSK}vTEM~=I@~0i+g!-Zle zZDzh2e}F~xxPFG}x0JcN57^Sq+3U;?D1C!>@~hPm*IV14_$eAyHi2*SLA11sf&Uc-P|t#4|x3!~)`V38H5;%u{qtbNWXngpJ-1boO#{!%wnN1%dvH zAX2BX6OoS;*72ni)N(TJ_K(e_+&ppP$n6TjWrBo_3?iNAv(YG{M$tn6%%kA~zzt@- z?Iy8x**JFDQ5QB&y_@bDziM?XN($}-ezH0b765=Xw_+k@`cE0TjTRM$yje4MT__hn_9m_verD7FnDjurB+BM zh04Qjz6Gyo*R7Ra9P3?=Uq#jKg>vLOQAs#m2ss0avXK2+jJ_S?^6Pg{syiAzyz5r`t493F4Q zCN8esc4pSI=o|DL0&lD5w2XM|Z?WjQ;aCmPZXeI_ov(XHoZ5)G^!c@(`1>WRmi6iZ{p|YUyg*|7 zy!xYELqguT|L+#~%#HsFSw_{WT|X4KMuu%v9$lsvRSWZKm8#l3)|-kC?trHb9UddV z=%BE;HK7_T^_sIKE3*ysXMhqK$oJcW(v4T%m5x1L($##@WUnkwRBY!Rfvd>Iq5pBA z4ZVq-G2RC&tBSt~B}GD`hk64FkeO>(DOcaq3Lo5FhTz)<;o7C)Zr6LJV^CFQh|n87 zWWJzz0|%LoT+z}D^Cheae&L* zt}sZaz!`C(<=|wjG01B7qY@jpaF1bbplL#l4idh=>U1azhEqO?t>pdn6B{hZZf~7K zsTxq$S&?HSdLzL5r5ry*{z){kfu*ZCv(@FHOmcN4@YKQ<=hmF7RfS;UQRep!oWGM9 zZHV6fBKGqy{A7wy$;tR&!KRcFT7BSS_L}k>!k2rW90qsYTe}p_39%Q=z2 z{nBH5dmTfg#)fPekcLSGx?HjvQ3-u}%J!faCydqTb1RC3uP7d)8S~SvOb9V4E*cY)HlT9Mqrtcf@;lS z{gWVH(Q7J2Qem=EWz*uJTN%!~`LX>)Rg=A)Pnmdl#tlJ}Ab0oh$bI!{#4DGjnLc8I zR?PdE(ZS<<6?@IgXp5SI60BUO_1;Z*~m1e z%(`iB$lLZI?OjscGDY@Rf-fZW6c)sY9{e4zI11#3Ky^XN5L*{wvbVeguuDwE z?8GXiTDl2y-L4*vMw^CZ9Alr^Q7yEEQ=m`&h4!iKW7CMr+f{)agkZHzo0NRzFjNi?f20Dg^%9N!R}@es~X?6oj^gme4l zYq)Uwx3QH@12p`9E(0~zR6qhr_lw1R#Y4_}^tv5ryHktj{9NS{ILAcheYoKQ><#fe z0F+nHsu^ROI;ghzr+giqBYn%QaueiL_q+UoWLG)*8N)I#*6WS9J%j;+gRD)=D^GO- zgp^FUC>MAApOVc?9QpB)VZki`ShskO+4i3@K8}}lZH~StEZU>x?o`q;WL0?j!G^}k zb`WFJ%;8HLpmLJgEwF{_vEb{ur(8^o+wY>;=Da?$H-4FNb ztz~VeNO`ug#uBGgeA`-%VWo6r1`QdfYr1@Jyhu^kmq2nx#9 zQrI{dq3{GrCbq(zoiEm9sPKF0iOCo1i4n36K?-Uu5X|Y>g7q97k2Ok&DEf>!>J+X^xgcC7pZYvWm@)}Ek~zUgI?j~~=nu6me{7v6O)1b!_3P%6_Vf5N1(cQ~2 ztBkPf%Io`+4Ii;XJ2H%*Cl<9V`MfH%+U+}}J12;jA}cX>|IqXDZ6Qep4wjJoS1f6yQ8J;h-3hb068dXXE|S>?Ml zPLQ&?)y=_uPEjW(Cswua{>kjV?MIS<5f2;OJS4ajk7P;~TAv|2Z0Ek&GucnsyJBFz zv=>w~!~mcFi&OWB_33C74haYG!)IZ=d5@_n$*nGZ)1Fh-{~&H9JAk{kMqaJc1EVKL z+Zy9o@lm3h-L8$?(U52iEw3BA<49U%kS$#5F8BsdQaPvJFfX4RF>&u#Db5O79 z8P5eNi=kGCcq{!0+_q z*)t(Zql<~-uSnA~O&oF$Ti8P+7UFB4XzNfh+l=u^dX#AI8RV>))#bHZeH*bwc>cgm z$p2l&tm}xxFvfTy9j{apN6gT4$+v&#b!0`(`tPPpAX>B{Q5;v0D)-}fOY_F_|In8s_(!M`3=U>-= z#it8%NtPZj7?u-vqreWy$Q1i{+gVrZ;|vY^e^2OBQ=K)AW1swe>ONB4wZZmhV84!f z8sw4`O0eA6eU~aV`g?$%UDnjFdE7!@P6W88x-A&=`G_Bau5B5g*Lx($mz3nL6%Guz zxfoo*JXnBqADsYt>AJ8~X>j+}Af#Jto%YC_=W^Z&dl;Gk)+E=myH_*q$}=j`I+~tw z#7uI#cy0ad?3?!}_l4_n(T24rM{?N3+O;0KQQ!CamlS7pY~20E38wKR`H1V|AD{y} zKtaxpgZ^f8J*@J(5|uuUtJ}HV*w|&?13e##!ttp4T=_tfhB)`lyGVW;M2H;x6P?QHpXla!R+;(7@8^NFhb~` z`r{6U1X`I0&>bTy!v!7iK_V@6oJ=F@g*6z$V`pnXTw z(w2D!1W4dU%=*?eu~MAY!fQZ9!6ko|I8m7w$CTCzveXJ|;caX3j}R2RXK30j%2?vT zL{yx>^33%;;5jVo_1wAreR+ZPYx46tCz-UvcSE?ZBsJ8Wti{Hi~uanC13=b-{r2l`PU2)?i@#6DRd;NmQ?tb;qvLj zzhn0Mc~|uuefb*csP`Wt8_ud%XFwetSW_iM^^iRnl0MGD^yL#3d!&;?0?jPWg5k8R zR2euWWKKtSIjXn1A$TR!$a>rU#Xk$3D|4W5nra*XAL=jwXrrQ&s>=7%eJf}np*1N} zx>ql^A}Tduz`QVg8&shr*-*N@|wvA)g=_tbPb^M+9$T@#09<(MpbZzM(i{4T;;TFwdk?-6@k6|y$pL?aSoLBBu|aM|Y}UKX4OsIqS1tvLW7?jYHs3j|Pn^(i4lyT@9)@$m(we zu_)i5Sf4cm`vZUiH`kIs{1o)_d8@1TD?K zyY*mb?v~!b0EXPk_E`*g1`UsL)))D}?`3c52sm@3M}44oJTZN!Vz+0M>p6@pGr5@n z!RJGUel--?SW>;LR|jt%-fxc<)?~wPY6Zc4gTfoWjE6MdzV^N$bqCNB@DTppbw;%TOrQCW>&tWRdtH)-bnY&5b%aW5$1WM^tHSx@rft*Q%uU zg=>cjhP%8OA~Ug?dB=XGNW;Z-zxtN6PL~;3Tcy}M>!nY5Bh!cmNaLGSY_g{KS_bX2 zNeQ0&$Qy`%WU|6Jk~t3$zONr0a|{sk}z_EBC?rAQzn4gHxKBYhiFyrC{8azY2xoZk*w1Q8>%z+{}$g4!fDr~PXWzmRCpcSjlpLO8Wt;Rp4UpsS?0rNy6> zXO0XNj@@!ES~%WwV%Zt=iqTljx+@ki__ zJz!i-A_Co_0q3h6z3SSB3Y?RvO)^Bh5dj0SY7w#OP|Zkme}|wqq>qPUB^EnPycd}Q zG_xfjx(Kih|F-ubbyGugg({!SwvT$)h$T$fpYrV8Qq<)YSfh`8$KDH?y{rCxZ&L4<|lmT$~p z6VMDG5IGLKn(_(c!d}SsKWG2ynytJi-{f9_h3qG-n;NFW=Y2YGB7h9EnpXsLG~YKU z^~Lv=0x5vBD6Mg*>d0(4MmzFc(dUWSwF@Yu8R(}d$>$9=!RPR^D_;W8+I+X9W_e zGG#o!2AlHOSzw))|Mw)&+`Ezte=XwgbNJDU>cN1i-s+(pCR_zjfW{ljGF^4JtKbdg zI|qZvsW>JYNecF7j!!t0Fyf1C2K_(#wwqVR24Dc@C$r?Ye*oWk$6t3Is(oO)f?hpj zyDEEe_Y~lemZ>}v-S+gF$}>SrW-a|-yK_91Gc-H)$uy?$S2EUhX22PAb8gMLUkz2A zNNym|@4miZ6pkhJmX3@7vid2q^oe}ID`R3mXj{KEvS!NmI?;4~rSPr-q70P(E9Ggy zFny{($3}W$53GTWwz-H|C>F2{Mjw<90HoktfL0cvO#}}SJu>eR<(t-6o75H{1G0E=Jj$F*#J(w|*K5jU2^n0!M`tK0_a_(oLQ^x^JcBK6}fKw!LkD9gLMjH=TOSV=+ zvX(jHm`EmHQ}tWwOWRbMKDG8;?FG=}0MRR3Ryo!F%qy*j36LMHQbxH%+SA$0qP<%6 zzQxR6tE93E*O`#lp(rg{GC?e(l@?a!TPpkC205SCv-e)^E4?&mjGKfLy@GyqwR>c7 zt%n3u2f!M%E}gh~3H}CQ$>`^Xw}`wz5VrbLiNR-RrYA!AIr0CM?Xiv7G>WNh*1U5I zUR*&W2A=Yk{@i_pYk#0>e|hMG`slv2rBE^5RNids7Noww?Q<)zC;fscRvf#VG(2wk za$*Fys<9tWA+!X@!0WlM;>S~i!sO_TU@Dj=yJ8r)(CZ>_oX5uxN7rt(kkw_&qAt=FSKyd zU(&F43m}6uD?*R-UpKq4p8Xak#wcX2d`iLDkoC5INi9F(X}qh%u25*gtrn{V+d15w zU#kQR@BpW(AxiAs)DarRgpLu5vw3WBEl`)thLiEfzYl=5y%9d|Dleu|spUcj{Z-uM z{l9T4DK;(2s%M5y=ltsd`JYVNq8%_8RwX7Wb^7Ot;dJfMXkscrfMfw;L&3n~ANe)WB`j@yIyI-%*=*J&`bl1ZbSTZt{O{tX)nOJXvUD!&d#fAH7-lpEK zZU?5Ega%5zGrZwzMwb(th?0NMSY6*7$9M#)o!x>F#ZLPD@NJH2>MUk=rhbcuEalzP z1^GDd9_cBBRt%k-0W3CPMv4H>GwB29S^Nw5vfijnQfZUM7HP&YW7az;6OqB(-0u}` zH#rTvmfz?u7ZlJ$d@_qkH53O|$b_#`6|GB&(sBuIA#H+k9Kr{k7c-P|Ibxd!H7C=! zQxnld+Ka4R62x;|;P^Qc2w|BgEJDB@*t#?6iX_70qWbW04%S5*Vi5iw@}G_s0GLm& zB0u8t9?pm?V%y6D>!O{(wAFnNsa6b*WZS;8{sbw zt_@ZK25f7u6mGkT0&*?mjosr+h9{T&3vRc>ID;})Y)?7EaWm(OPG*szpw%kCkRLzt zr#YaxU)-v)aDNf7;1H9)>v&O;g{2MmE%?3aiQ+HXr;b_HJP<(pUd;j{KA_WTj%aja z2K?5cI1gRwRXkI##LR@w%nx`J-xw@u9*bmVkj^;{^}XmT<7^sy?Lx6UFTFr>o-Q+2 zZF&D`t3{dp<)gpPmx@|xKC!*fv8Ft%_(jRBd$<&A2V?DX>ByF$1+)$s!@BNE#~5OW zw?~y}B~5&UC|)M$^;CVT^~##lLK<;ik619_s{!`$R_1PKsYA|(z3ns)*HQPwUxf!i zpQTyV0QIu}Jezp+9ujc@HL`Pm+=g^F~9(P~nAXa+yN?`83SS@%me^pF72;E&PvvZ07r(cTDJdoZe zk^$#|KyuaImvTiXFz}HMKosAg*O6?ige4Dy*m@E*4{qh?F6WN~0qZ$;m151V_5A52 z8-N5e8qXU1Kd!#QEvi50*G54^T0u%cKm?>41nKUjk*=k?RYatlrIGGhnk5vZVG);F z7MAW@e|z4zYd(f3a{=b7)!d}3x+cV}~*c)dZ@^s+AqNJ0k4fhiddoAM3sGwgV4 z{aj8#@J~S3(x$TVoBMboB}QwO8qwy_QQxNZa+@F~O6t|!!=*wjeH|8l5me7#;}^B1-}udJ)$95H z8pT^?UYF>Mp?7~jaBo+%6{z=hUHY?*Ktj&AJh{VvYf&B(BwY}Y63vLP+p>%S*vB1Y z*(;i>NxD7=1;SM%0k0M!20XeO%_WpNIG(& zd!y|)=xN9QT+9lgpNv3NDs#_PUw#-pZpV)X2(tlY8ZXtuXrp*X)!7z>2E$NOz_R=k z$+;g$HX7`_(8<}tOwv>N1DL|gjf>Qe(PKqrKxP>P z3SY`uUWtBrCTnKznqNN_Spe}UY2ZtN05}Ub^F6pSqi`?ESoWA27l1u+9Pzu1Z*Kn8a#?I_XCg<0V)cx zh0-^-1NL?4ujET#n<{vD%2y3r0=ynHyvVbgOuh8st{c>cDT{BbLZ+k(=&Y+%X8bgv1f0 z&+wUAVK9vyLmtmqZQ4M;X9te7kTu!j7+Mk8Dv74bq#hm6YBpHn11a*A8te!ktoI5k zjKi53sIN)L#7z2jF~nM)sRbn@+urk`QLhab06H9){-+{>wfe~~@1V&8Jx!EG=1JS) zlCqn5B7<|Z`tX%Md!=Pxo)AI2*k}fI;_qZ$U{PJIfe`=1mzU%u-C?VlsXCzZd z=cUYs1Iv$wkc#DMF3$y6TnqzVKP+B*tD%-v$(bGSQxPrCS#QLfU{^Pd+xOTe>OpjR5F;> zC@iA21~NB3=)k~mtntVx4;*mh&!?$md8jzJ6{dal=aOUZYWQ>8O+MPe@q7`%RJGRp z5vxjyhBCM6`wt~}6SJPXe-Kkjf2UMOrZoFZAwdW9E^IX ztO-u%D0ADVL;4=dH6T@mQP36ygH1^C5@f%!#rm|13z+qAS~?T&M)T)9!o` z*z&M*NR^Xl6=Uh_`8M5zXrW85?;9o>E$q?+7U57nO-Q3R*yR{j%X1WKOVh-jr^h-$ z+7!O*LxY}(JtMMBB{|sUw4LSi3z|%5tWk=?ksv3N-gu3o^?`IeEosHz+c(#xs8voU z5b*Gj+a0CU$0L9HC5rM5Oni7FRTje9oLkpOvdh-_X|%_{M+Z;Q%-9Oj?hvaiROL}L zS(rm>veX<_Ci&7L#?;bED(qevSD%+6VR+dzdwR66+fvZJmyO}DFg)df70!Fc(d0qc zsCtM-8WMhDkEVdsoJeUpfVfdUjW@a}mqFdID8^h#4)(1x?U3J@J0QlWEw#+SAC&^a zBdIU0jr@=QT+3ZuK&8(2v>rwa!~V{o-#4EgEGlr;pPbem7M35U967oLOWlX=(sihj za<@K99Q+m*9yD)f#R$nzQR3?>^ljdmZZs+Bh$7cyy#Zdb(VBD%5ByQXFlDT=Z%n-e zbmu5GwT0>G9Kj!>gZn6FB}{(=TFf-|&YN$Ja*E=E=8&d_{BFnT(yUBL5?k=A8^VgQ z3Fg%H7I8WIk2k!UN?3)NH7j)eF@s}Iv4DN^kt?0(%_6qlk#%LxvvIQNF$FMUrHtF1 zXQ&hz*+c*H*W;IIWuc?L#^$e<#pY^SRJu-7g1!7dhI^gg3#+yqO&MxHW@87(8RAos zOW7(k?dL|-S7N3iUyMe73>q7UXt!=_`t)A-cvaV+Wxa@ZFg1)5fx3B0-Yr&1hv?eo zdj!PASAzd?@BDAb$!eRsx8`P+1FBYMXOGs`g_S$aqV*-XL(cRaSrQBuTQpY0osVgM zO&pv=H16NUMrTsH$(oQSJ#$@1g5}?o;Mmo_iwZ3hv}DZQePm=4`-TCdQOFv?efpI> zK4oylBW^8YVfXcMCZ0SU274;nF)#iNoTcCa3Y3Rxy6z&qaD1ohsRwU&1p93&gF`G1 z6+68;;xz|e5A}5R#kImRZk$Ax=1=M3bOV~^ob31X>xeusb{P*)9(p9Tj>#ltwM8Cf z>Jvy{)2zFJkJ-m8c@?*WV|U%Ydc3%5u34|shOeqN4n-0OWTz)~ajWXrP;?KynM$`` zc#uxcw>fdY2pTKJYeBnHE5#%15^P&?r2Sp;ctpeneyyS068s+Eie+0Yrnwg8=_`^uMU5g_ zrrV87Iy6>pxw8UBD#I%U8Fp!odXeUuKRmrpgwVvTQm?bX_K9z~TSUjF3s65|C^}yn`^F_G!mp0;0A4&z)03TC;iuCNXdYX-Mf83C`>lQ~ zm9F<+<*Uo7_h0O%wCotEgiJpN|MDzeiV zGoo`AaiHCVCh>a4QOcYCS-ZX7Co+WAN9>I&F+~Pj89lS@(K+Y)3K0SCcCs0p8{YUP zV=X$^oxFIRFgyZ|-ZDgWcaJw;$Eh)ORC*4Q zP%*7VP_L~LmARj zSp$*O-#F-*{y5eH(iRI%6K~rfpRK0=9o{T)ZC`IsWll*sOK6AlZ*^-2@3BB)EH}?U z?Lv<4u(e}_r@B-DOxbPGRTUAJiOxxX|F(~%?`@)2nm*7G)Gz^sl3$JwH(1oV3{swq ztpq#nuN0d2@}s;ZQh7NQq$&E>g3^H>n|G*>Vt)~I@G6UNr)37k>Yv6M@=ITgP9v@R z!+{o>k?}CNt*TanZzqu@48)pRPpv6HW;|E`I>56_;7ApstM3S67&y4z6w013vvbIt z`F?_}^hFM-^tTy@>NM0F3Skjj0y`s^-lx`_>bg=2Zlv${yNXY{NHmci=t8#ix_FN@ zy+KdVVW@`vO&i_9EvgcQn6>235!Hm@nyU|tq3f>-;mU>;F3+bd>Wu~8*Y|}_$p$>y zIFR@K!yQ=AV>z=c^6SKcQW#!mluCu$JDz3)-PZxS5JJLAHQ6qauol0IuQt!EK&&UT z&<+&m>0%azjJn)nA>rRov{-T-WcVjuPFjO8%-{F5U}b_be!N3A=G%n%^rX3Bh3K-_ z&!ey4pT-9HS2BGO9TckUBcn?k{TweRDd74@IrR0uJzpzFkUaZZ(p<5VWQ+j|dy>D# z#?&DWj_*zsG`KAmUo1VOO{{llahdCSsB)FNYWXZN?!}O`164TM?~Vc8cHGsh9ck6( z-Qy6B&Hqd%P?Y_+-}dFzPR&}aKmQ5{LpyY~CBVoU>AZgE5WihD*VYZUtgyJ&<#Q>r zKoq2=)A!50HR~MS~YbqhR{!W%OfU5`Us|R{^-R?U%YU z;T3e&g{Y`E8m`a$DrBvgIrv-nnvp!H8Bd@+=OKu+R9=w!5xdj_t59(PL_@{kS&hZ0 z!m3Q812|9#KYXO@e2?_sWe&Gm-+yL}w~ZrhZOF>-+y4M0x}+f-zZe_KbQL~j#$Kpk zy=g=F8t&=tfp6}g?2Z;)IMYpo3MKbI6Z(B%@qcw$pMZDA3QwMwSQzq##btvuYwC@$ z*r}PPNlX+0p#SI{J09NdSQ@Rx;hEnY+1^NcF^)OdXSyHTcB1WAvWW8p3wjz-QD>yY zww44swi0Ew{nX5e3ZEC&zz*zJR#pcb>^!gg&aP}Qq9?vdwd)vObd;dIk z!raXIsM75OXw%@9>(P%R4pwXYYZDbG zBzk3^g?@AL=#|yy{eIy?b3fmhNx>+TFiUQ#@@`S%wV74PjLyO(sGyTojPBBVd)@Og zX55qaX2TumjDNLTS4veKw0pO_-uDmV`FDfccU(eoG_JM{TjSXh<%-Rmd_`y|H_U*N zVQ_8q_8+o{lKPoH3KCJ&q*ZJrtLpT*4 zL+p-+i)u@E_^)@CI(82=xjcg{5WY&jF-d>8vS*3A+h4wQ6U-*LtCBUBD@3@r*UoR@ zmN?zkS7b1i$LA_+gZi?w6M z4X?(uwXZq7;OvB#{uoB%ZWY4jY(_pvSp_op`bYhe9hr~vwY6N1=X2yrp?ZUm)4+4; zE%kP-eN>Bcz`yCw+#{0&wep#Q07ZGB#9GfQcQU*7LO*5&VZe3&4!L)$v!hFMY~U#s zEvEf_rw_u2BmMMLC>|L)ldTx?wN)C@nyiOiYJU2$NkLJtGN<_mlWV$8ZtnPl)E7a~ z*ve+|+Qgw&_GP1-3w4ZL{|KyarFD!8oQ@$Vpf+xo{9N-c&*G2#NpO3#k+EW4?~CaB zij449CkVe-)we@PZv`SD#JeEItn7WQrW{>O*Q2fj!&Ubf7LbM?%`X9EOHGMtJ(q+9m9l>b#s&0qn$fOMXtCW zzYrd{|7$myDf51Pal`uqi%EPO#}XF~Q9f}Q(`u+k)kscKIgWorQPonAfodWiW6leQ zNZ?>#XSW`av(HQWe)aTcfp7a{swAKx=0BCAiXSbMFLz`!aZASsfcns|rjt`G0kR3$ zurEP~Ip#p$9niUhw)auq$c#Z&FVlSAAYGPUKx+;T1Xf_Ug(bH(lI$CioTDPZ*VRdC zn0m@<**eDoMS@|R?w#9=2~9;(0-_!1IM*NTipVh$L+tMNs`pzth*S!FRUTAT zc1crZWA}6AhuwTarBc#Lz;9URBo<9$YnLix4!SYGXc4S<3}2!G?57l;rHeRc@O_p2_Yu&Mp5VNaBOd|I{+@+S6DK>v&<0_G z4N)Dcj-y}3Gi7K0%j?5$f!9BNoWJ)eS@ZLFwF$dePnP(Z6yKHwLM#Y|-m*EWn>D#e zGy4!EUz#OR8Xc0G57qZqGVg<_)oyJhnT3<*yarM~zN>v6*kf+r5;rEKLt~j6k5skE zQGSh0?KeB+)h8G~kPw)lNum>jR(yETpEP6UdXQpO2O`9x;U13SI$vks0} z4}KQv^JQp)eMvsiEAtWS(_?|DQh_t1x)6<}!N`;~$D}QrWw?AG$8G*4NN0;g0T9>c z*Oa#Gh(lp(*ODS9QrRE~+WcBhsGQDcvbyLL@pDR-1^1cO<8VFWZ(qEVUEgwwc5b=f zRj{xL^v}jTEMWKI_3OQmO|tnom}ic=Lo4-X^lVwqY!g0n)_&M)XDIWvuvU7Bhx%qf z)~P_tJe!N)7E?(Y6`pXhv%j5g*yE8XfK4fLYq-izU^{k9fSaGriK5nS;fG+ z&9ZoQ9oB+EDOdRx+eYyZuJvO|j2$nfp!_WkyE)V+laQ-ZH1ERmWz@>=5ASSS3OEhb z10aefO2>e=S%)j=@Qjj6Su==p!zI4}3L$KUtoKI=IB>&KBIoy+!vFe> zXlaZ4WqQK}MCc?#J7>?7h{!@w>M|WDb&LBIa;xcKaDcW3lXRbRH$jf?lnCt%43eUv zv}v(9)4IRIrryB1-MI2`1#(|Hk+xQruQNMvrEu4%QJV>ML=8imALEQ1c4&xm{9k4d zjiX?-{3SK?VZ}>n ztrZdRbt_@^+o?|*^=r?GvJ6K*D2lcY)Cuq1C;x1)DTEIomu$wv%&B`pUHxkH6m=nA z*z(b%QopzZLk1B&UmaWgEP|YR7Y7Jh$=eUCiU01rKYAgnab0uXrWZl`>J2Z@FRQqlkY^VB@PC9WzNC*k@0w!hd%ok^I;23sJPoSb5n zBYzvdoAQw}ep9H(m=m#5XR1a$0uBr#U|C_yZepw*75|kFE8TYv^rz0xAk@MJq!r{b;sMGP!{ARztXw_}-mZtkx4uJ*O(H`I?B~!HZjFNu z=W-2W&5wbK(B7v#aNBskeN>7eHl?Hq-Pld2QC?ji{i`Tu_T>5#i9y~{ng|6*83rCW z^B>K#nY4`Ir@rUeq|D21Zp0MUS`UBaV@CUC2DThqkV?8RGX7P~8`%TUilNphpkB#B z>(LHopzJt|3?G>@A;kOd|5vO5wanyHZLcNot~;Dy$pqVP*Q{G0*kdY~+&{etu^?3{ zCrfT3Pbv>7P2kU#p#-Obni=_Mm*-g-Ff$#)52}qF@x&>X7T;(W#`{4~1>?7e7@v!` zX3Wl+=e@PAO4_Lc;>CApN&JiPie@J(TV#u+56HvVO`SurqJ2-T1C*#z{L57gN!g^v zp>A=?BuZA%`)3Rx27uJ2ppPdD_F+5O!!9=hjZm--2$)*4S*l@D?|k})?Yq>mXzC;0xb z+hHVgwn;;`m1nkU<@`s`MvXmV zZC=OL2I~Hwr+60h6=yh=FL4!-$2^n?mb+6%aLu3WBQTvQaiEq`G9DNy1Y<1^WLW{y zuq)Vrf6W-)(G>KMy?fI%mVFr^V(cOL1oGt4gxia^;h_TvN$&f`3b%uuC?8h z8;jmxNhXv)vQW`J0o=-GxpwqdBC{V`I&<8gE0~17LoS2ktHJ>lJ0gn&9x8MVD@Bp1 z!GBf4rny9Co5fg{eZi6=C)e284fwAu@WLJTCF+~FaGH5xsc!4lP!ZyA+3q!Knyl*t zs<`VG1Av(&TVvn|*WUb^x-Z4geB%u;F1^wr>Lbco zFcnu_Qx?VCXZ^66HG;Y<9j?{EhUv=H7Wk_{{M5)?`S>a3B`;IxpMyD_{PI80DA$t8 zsr9V&sx2O{*Ynd8_s88#gC_}d5Qss8E$Gv+& zD7?4+jmyWeRdtC6+O5Z-S08`=aRlpp9w_t0l|*wBU$N=v@Av&q8`_ek&%%&=2<&-( z<|hVAACocAbQ1O(Q&@d&sqxIu#Dy2vcF3~nHg~hWg4`;70$Dgpf!#yU6-XL?e1>ad ztfhR|<-NCDu+vAbDpW(xZ{#@PU{!+CJ>Q{*_DXQh@`fF|}S~f(r7GFIFih;?Jvjvp%ui-@?75p7#w%({PC333lVK zIz67Eun0Gp+>-%adU(C%q@RIV4s22a-j>p+md-Xs&FW{QEXeEAuVNzhrGm&-RFJ<- zV5?zP8AT=eODXxywzK1k7M1r7Ah(KITUeP-I>H&?Ds)?MFB5|pH4y5E2P~}+%pB6C zumX-eAXI(yThU>3`QD|%LL;-<`WHFUALD;7t-Dp4uyO~u2pV3JZOk!ssk$jTAu0+C zSN-wZh7?vk1W}-(rp=o()b|Mt854(;Ns`kEB?ekaA)?%Qk+r7a*f*0M&1^DY!J>hm z+W_WXwL*9QzOu=)m|iJx)y@Rlx}(4WMyi3vwBqxH)Y?tOXw~rL3zCE~nH-G;SIOn; zud7|#_bke6vOA18>T6aABSW~BcM9I_0SIww69~I*I%zRrr#n%ndq+cMbrb;2ar{uy z=_e;D|H;`1ayWEdhcEU)?1gIo3DfV|9s)c;}HK`;vE9x2NF4KP? z->AG*;~vPeuYereY&rAbr=wtE#eOQo(avHOdu71B(HaJ(J3p#`cJvk|CAbD-D>*Sk>7=ibw3^V&IJYJo;=HrF!sfm6%K7d|Qau2tqofB(N*^(&?Mm5b5!7#k);S7ix9o;U@6@ z7FgEMDsxRUle+|~o=1G9m%Dx)HL>67#t5Dz$g24kr{;kwTNTsmz`pq)!uG)AG2&7= zF*TRG?ye#)f-|aPSA&FX;EdA29uCJh%DZFauGf}PH^g3sS}#0(*(07WSnnbxUAEqV zf-OqC46yDO)jb|IF*j2m-Y5~F@-||L2+b-VTC)$r%R)N{H3 zNbQq?C32?&+nMjota!xad(gkeiixOJJJ}yKb-GnZ?M$u+K|T$a_lyr2cdwqp4O2wL zDYB`RwTuXyd~9ppKixb5G{Ezu>}8|1Pr#Cp6MXZnEwe2?gYW)fNf|FI1+*R-GZ%Tz z`~72)D~(=hCGrz1J58ZvR79NT>G#jjrUMM0a&w;G!Lv%T__8he8l!zx17+thHpn8o z5!BeqRk4xgv8^Q~<cY7 zNvMtY=UxLerOGi{?TJWH)XPjW@b%T+frMsEW<~a_aarH482MGCCu@9U3L9f#kw(QF8|gu( zy#CkDWa+$J1v)rZ@O1IhI!7|*jCnTgD?6QjB=?N_`Lc3r-bl%5N{C0JaiRCnU|bm> zs8e`dRwfR8yirpMZN1FOnf_sm-f&+!sC0l#)~#g(U&0*V>AOk(X&lw}3V6sNI+N#7 zWZhbP9Awn+UfhHgganfx=Qwfu)I49%8$B@rkER~!tlwC__w=Qk~*FRQe5I`#UN&+!bgU?5#r=%tHPsxU0GYu zfcU<_m36bKL(54Vu4(H;%lR`nlQrmLIw3!4BH6;&ieIqs2r%1n9)~LT0-&tDRBGSv z;YVY;M(yo~;7{%{hLOdoUL}i66o3Cou<0L3eg*^f(_2 zP2v7Dx`zrRYx+%#+#JzI(l-mwvOzEeC8JF2}QB zYJdX!MkiPG*A9m7ZaKC3mRl%&WQ;&6xhgPM1AtKuJW+GYPvulq=VPrQNhG6RmIm= zfe+n4Wm~QL>^2ry7*V^Nudke*VAP;k*gWw^CuIjq_DS zBM)FBE_+vHtySjacKeb6ix^p%ez~(JTiKc3KPhiM`=_)#bRBIFzG{hbU8qe~ph@7d8S~1w7Iq-CF+=D{MI3W$NJK=HcVs;w% z2TpvEO0%%|0HDyxJRc-Ucxa4%SxzdC|K^m%`pmYe6A=(}fui5~Azv|8cwC3=wx8@z zUR9LMZlyCQb{=PYkFL0*gV*Vtxf;0ng~Bk~dagk6)A`%Wm)GCu>TL~&Jyi0PvedW& zlNpUhL-c)S-3EWi7<=nWzpA~k_8il?j(Upx{_F>KqH zzw|h5V5d*lZkdoe;q_O8J1&3XY+$BK%5T=>c@jf?J*Y#0_bF(NT&dsQs$mnkiN2P9 zCe7VV;&`|CffR%AY{ySwc@SPdgOx^&jSrr-MJs()hx9X21c|LD3D zR`*m*fWw{=;=-QJ{8vefYI??9ugZ-1B!I1q%754y*>3F8^5@sa#<%P$U7k0>(!836 z8`}xON|s;SeNphHQPvUp>{lBK;e@``^9?+hu@LV^sL;b6)I?y7vv(E_VO6fVg9gK7 z-=kg-iTs_%zHc(8!sWmh2G|;p`Fynb+^oZ;RKxCp{?$*s?JB_OQBTVw%iMZ%r+ay% zd927}0Q{KXOqi&Qz-QCdOi=dI)L^%iO`sNr6X0R-p22akm0bwAw3nGhoS#W+W z`;fUK%m%*Nm$8Ls!r=1T0sTJ=;N7;9W^w{43D2)EFAyHXar;1*ritknnryxamc7gucqRl5qWxD0m>Dp*KI&RO<7axLyIcw0oO!+9)!&`6q% zd+LMaJ}I-dH~cD8G#WSz(<3G2Sjd{`SBpO(Z;Ejq(2T2U9aMsM4e>^B8a%TvK#71i{%4*MO<^4{<}^fiQ#u4S^lEhoVtDxUF* zd5??S`Yv-KEnnYH-S5~8Jxl|i+?dM@GfMcPC98e*t^A`Kt!{#QS1{xY_#1cQ%F=vT zaJH>z{v`(Eu`UXT4;Kq7V4bGTi3HYWt-=&vJvAtEZ~2{H?$sqeNkD&?a64$>+zUTm zdeFWe@W)J7zCS4=@{wdI<)>gC$2h`qWeA+4pZ?jY=Gu9&IlfnIIf%~z0v5uZXR=^= z5|T@PCL6ftnP8t@oJE$vks2u5DY$6spR=S7{)Wm z3dr!~b%Qil_8+nBDnm~tXAZk=ap(HOy>rou-uwjRKh7MF*2l^e>4&iHKAYia`eh?L za?G3PPYJ3)#=3A;Gw)g-qHiENv;+RY17og3Y`j&(azqKX!yBA99e{l(OjDmVv3JGn z^_yv;I1oZ9&40ej8u-v4^Ccq~Z;dxS^PGHc=MaS~sYojSPhCTNfNefv9zza<@Qo|8 zEc1>2)_1w@jHdx$4JoZ?L%?vQ3seHnSxTj$SP*|@k3fXzcvLrYkoM6;UZ2=poP$d6 z*GUXi_C&IME%En$$kSFNw*ivcc%01`*P4vxk9SQipx{xRsd!OdW(f*URrI(!YeU#i zMR3KsFakt@|18qJrF~!TA>O|1h&91cohEg8$NOFn^m9ws`s%uPRSxo}R9E8jfT1ju z;|0QJJCwr%d*o{xWso~XTN}0en=um*lK@)ki#&p+^=SF{O5xLq-k?jU73XpKlyNob z_s_HbzMBgVRd@KF`%~$+YxS5(v_Ja;j&n9`^nX(5BBpbfRZzNkXWIqa?R5#G5~|YP zvaN7?-XNHcpDlb>9`_8Np(sS>nFilt(74@Lh(h6+Bkz=&W;hqb5Sb@3S|m8C1vrKd zsR)=ypF$*Llh(fq7);M22QB733=?=&O6Mw;&QX4TF=c4}9H1@7q;En?+T6{S zsxFfiZoKd=aM)A^v6U%^w9P2&!iPyH7!gitRC|L?%kdc5g9T)-W|s9^MJ z&XEgn=59m)mR;y+v%B$@W0m$Z#i}5;+C`eCO}bHss2GM*p#q3o37CD9xCQ8*jvNnz zd*`YiD zwAwTlZ%}%MgI+AJEK*1VN%{vRV-x31?z`KE{+tA!ys+r%4!e2OV0B}WxpN?wT6lj& z(~ri2hYqD8XhSLCT%~Bn+?h6EMrGqlx95OZ;dh<=q^F0k!yn-v_QBy|P0qi?tqEeh z2sRySiloVQu+)6>0tRgST*Se`1*DL@PgqNdeYBp7^9Sl7khv}t(y?b)M;s6THR8eU zFHNAo9SFDH)zftv_2+9UB?VY-XN&$+^o`MDN~d5**J%jwJ$&;g<>o#!2jn&0A;Wd7 zj)BrJ^O9sfY=38myt`Y8vpG!@zz+4N*=DLxiB~HsP#e+05qgOHvw;HabvCgUJ^1Hu zD9an@aThA}{S4AUXkNTDkCJW3MCqhrncvU@VA$8Zvo1VAuJUvPhfW_0>is`E#&3xC z7gnKXU(aOv`3X6Sz8oxyC4b)^^}u)!#+<&{vs!1N;x0v}+~9Q~l4RKYGbKPnan+T(y6Sji+$&mP^Sb$_Y?6 za|ugjchs(!84+_+;X#!=@ont5xJ=YEMN?`3SAQ$hgxXZ-i0&1uc zj|-i&f7BysNT*;kM*sElETMc5PHUL47N zo90T8g(K+d$K3N!Ia+xYRcpNxal0fAu-cD>Hw7t^%wQwrnvSt(sg9;=}tNuF?{{%5!yI?(>$6ee%F@Vv*me zn!lMieaa838HMOG?xsw}kEZ-%V@Mj^?Womlu#tzAU3w>TP;>TJIJ~V*wwcdiYNhbS zBikt^NrtJLN7Z-}3Y;NI|Byq)l4n&-{YoXbcoI~vj)WZd1UDJCZg;%js#%|1UBC$* zOkB>8v0Ccrw4>`McJB}OTS6ItZ+So&pW&%}JoL5O?GC=4ebP3$Uo$h!tbV;~oNey8 zVX)8IA~&~^*_Q-h#>+0%o}(+o<>i%U1NbCk$?J}s1CwL3?KN;tq-5K}ZHu*-Wb@4) zMkapt{9eIK*BW5Rh1af9F%j4c5d?WpjEVaRKfSTnqj~%)kdgfJoFXz`wsKEK&eY`F z!}`;KYt;X6l58|tTm=4?q{E7?r5SZsWnS|;{o4VZ1MXW%ngCUSQmq>kEHU)~=%gOU ze%pPTT+yYQAn}tMvHlIU3@W2Bmtp0SF%^2FEm5n>kB9vu`;oqlkM74*VL#jb^9GA$ zzW9N@a9iW`uSiaNDE{$%BZPc;htf}SO}c}DrFBcq`-bE9yEwMAukO1@(TY(0$by`# z$F}bj7tTko+v)L*4ch!u47?lwVfMm95gpC*TmXF%&NoU2BDt{6qY z&8r~box7F2POFOQKOO}(6mnURhDJ4ZCc?b9JAH3Xe<`?>SZ{N0vO|W1^WOuFqnMDx zMu!(uA5~u7z8v#&(*Cwh^E)iV9W*?vcnqVsF%HaPqzc&M2$&aeQbP^_czDV;Hn+bE zvFrof+IiGH4y?R(YyZZQ$+=YHK?A#n9J0jM&#^V5W0=o7@^H-AUjqzG=`5Y7969`t znFSE~)Ejm&HQmNDgI57A6)9x4)MEngG&pt{{!Z&3H}g^kRtH4mHvo^~n9neNd_@iL zu=D`l!KB@|j|5o#7yppH;tHqIml+AIK3iV%9_$95>hbS_r4ckU>v=)V)HfYF;QVl# zyDpOfP;3KN#t1m9k%|)&34=3ju%6XL2#*G5<15zY<=ROXgCHgY>g=;=$^xCXF)QG# z&9bscx?=0H@#Xl7`vFyC$;o&Y8x?2P4=nrI3=B8%4L=n5bm?u$8rSxW8*YIw%vL9C z{DsPuVwe*;Msa0{DP7vX2ByY_>4%%x)n~(P=JJHB;pZ_{`a^#aEYwLwmdq8a=lV-rrI07ao z@H|-s53T@q@?|hYRCE9C?T)+4x7ZljYNN=VmL@*2H^@y1HZ`K)WMSs>%L)83>s9AG zVI2OS)E@{WnZH^%2FMCR;p_11Zc+1W+kysF__TO3ASgpUeP2~QC?4hIDwP_)m{cw_ zs!@+(X~%GY$)xyqZA4s|_-aPH@*4)v7M>5T0IVJ=>I<-F;C_6^0Xq45a&i|x(0w|8 zgA2-n-W92v9p9#+QCpcm8*^^{1R=+Ue_su!Id*E|ra`+*=&ym1J`=5j%5hWxa*;QY zUGytVA(`WIS0%shxcxcp@A&&}miR{SD!ZEm6QPu-VT@o6>9$zCycUDO?M0oj-*mY6 zeTQh0I1?PeButVJtqu#nq>2=hIsH&>kQNZQ&N~6l>sy^zv z-)AdQZTClVfxl!$tRnj{V(WhI5BYZR8yF1GdVNe{mPQYeybY>^;XwsV5ka@1wnTw4 zF66Q@nNsnyCaapDj`R58Srz2Kic#>YRD#GT)0pVOIKD*xbsMvNlNo(%2763LpDJ~f z>XQ-W?R}~$w+5Sxo{^V#!O?uVwMzxnmRVCnY;D|~XyIq+QycYwZaioZCqW^7J~tQSN#N!vB_FTsZWtOOaBQB($kdY`Fu`pFN=susREG%kuqHT`B_?}!4 z!WeQw{*I$trO8lc`4!(S7Bp0rUDD(%cfx$sR|(bzKwj6QOa|G_me;1vQ7p>g4=&CE zMN=f#O(_9y^oqZRz@=Cl3vXZHU2GnpRqlXPYSbN^|FhSi9V}z8^Y0u6$oH;4F|J(NH8+aM3|QMfMQWyog0-!YjO8D<{uvC=qL+*#$1M-2qzmR{8`??qTm|p#*%cY|U95<$@h#`$W)l z?Q9qvVfM!*4=g22-AK|1whFoc%8?bt!%l?nFxmEU2|{AbevnM>pRYn6`+-`TlibmFm^L6E%&G25r z0t(UA+jJTnzdyhD4+w1Vc|N4^EB7r?UaKJxYwF5lAcJh|R*`W1bD{nFYq~faHi(X9 z$YEIh%%W=58iCP&epWBP3g6P@+8J!1u0@w?f~~%HAd5!R_Y)PJ3+B@Me6(N-<4O)( zuft8>P2@=bdr0)Uh2~*M9$>XeXxQS7__lgCu=kp#LtWb={v`Pe&C~Gn&0e7KXkbIz_?qXqWpo<7U$;dP4fi3~{4B-7Z>t zt(ai|Co#%F%w#Ozf9vuGFb-u%{>rwg$I>0&0ft}%(-FIE8tSo9$NT&_`U@A{>ggKa^ z0G4B0*u^SafAt@n>FYYtGXF9@7sz^ZUKX{|`f{22r-IllWlQmKir7ZO&at4oahZ;t z`Q5Ulq04~(hHF;7flNc-FA3c2YYlZXQt;vfj2n2)V|akRV~ot3WI2d&*s}in1W!T^ zb--|v40CJMnbC8Rcfz8l+ku)fMy#l*$Bu4%wiz;%5U=3u-)HtcJKqJ7Un#P`YoMz3V;wB;8k5`InDIWSrh+XZYsVLpKpO0}glJWuam*_m^gQE0S z&EuK2pJaauUn_Zbvj0xY=??bL@ac0mQ5!i03>nIRU!=D(Y1$iH<qd|fOch?||yF0<% z-QC^YEkJO05AN=_$xP0g zyZxBVb{R2k+4L~;W&vg1n5hM~=xXGiXFPMO)4QIkyY1shPqbc8|2L==W7d%SkyBF& z7w*5#my}PMV>=FXQTBGNOW-45z}rq&gd)h^WY|qty$NJ{gz`jh4i{!Itp{g@=n<3C znM4+ym&X~~x@_3r{6Ix%73nAdhlJnda?cIC4!0aS@H5k~x!6A$bzeCt-Z?40%7K1- z&gwPu9891-ZsiO^G1}tDTN>wRggk!xV#G~q*w%UGD`gETRDLPDvEHn7c=arSgi$fr zusq+<#NrA@D0snQk&f8tbVnP!^MU~YHKZ$d&2}Suy&((jeC72`$5{T&ZPZK}%22gF zt1<`qf-U$t?%(|9;r{H|qarv-vk*%4Jlxv0MwC=k<%<$}T!*HQzw5UhALJ<^x5UQ# z5kv4kwDJBQ{E7@mj6%@|!_W*7iu+8wAv>@65=BAVj2BKeDJgwVNhMYIqml zd{RwE3BXbDCBWWp+L`siBC+8nSfft6?nMO=rD5uSpZK~p0kT|4+L~Jwgy>3VtD#(j z5kjDz6RlNe+O6K}b(;Zab%=mfAqGIaUeFkU_!)G*y-UOx$SbD2ZB5$tN6$`^&BY2Q z^Mul&&XmJg)YimAqI=(V}`-?aa+2 zuV97W0Nfgi9Op49^q6W8>irP|)*feW#Tmgd&6@3w3X-6)+QYlDwrSo}?H$SjpLf%C z6v$H=MCy0v!jj1i4VT}J<`u5RxuF(fOUhZrgX+h?_q2nzCM+&yR3)vC6kEcB16Mg! zLb{BZM(FGT8Mw0Pj(7X39GaA`h$*vh4GI~n3(@4qyN2(nT3vq;a^pOzZbKy5m1YOOmwaE z2xu9=Wl{vx{Q5>#APexTk%kqB7o=sX4I<#+K={1@c8TD-(}kdDUp8%0{D6%g6bToE zBCK4X+7eYbB1q13P|A9EY>P3Go5ToP30nu9EH?&aGCSz*d-h@1&ICvS%> za=9Oc7w%a(cnFugiS0PE zuS62tFSgv!SPfz*uZqnPJZ*x53Oqc}3@IStAmO}YoaZ_|2k*P2_1wFz2wl8BDKYyP zUMuvW?L$*{zw3j3?4uPb`y-Y{KJ`?(<;{Qg1M?qlL?9rbmI7ItT3cv=ED4^xF7;F- zV{Zl`pq9|k1wFkJ1!?PRaGTl@DARx|Fw)WyFtO07K7GPtVQTibA8;FiK-z!%iHwE5 z@!x(RpEEh?zxvk*{g-Qgd4bEs z#MBC0)mqc)r&mPuO$-shPSdg?P$r2pGWSEOc}P zstD9P;A&5Pqj`G6ZEB$n9;JUO;Ub`YYPl2wwEzLNAi|TGzqf_%>EAqA`R^8Kn`&7C zOl)3XJ2z!NhK+H$Y-;rElfyh4V=hTtD)W`9Azpw&N zxe(cYbd70$O3Kl8_msJyMlTU&R_n^Wg9-;$lFvAHiEz`d0w*mg>=Cv}PfK*o(ubi>Ren!o67~L&l9&vPV+C)A#2`gYIQ>%C8Qr;ZhEqE$4o$5X905?fx zfV^y!Kl1Pl;_VxlKFhuUTTlpSAqpg&q<8nv`@^mZ;`(B`fT@;8>tV-pN-A@BtO^Eg35y>?9f2ju1c zd4x2yg$n`@=%^4y)n8A}5O6m5zH3CstluRez|d^U4$^bVckh*t*G|Oepyg)>)nS!) zN^JAi7s~*c94?z8Pv+&MyxGi3me#}jmJBUbth@+?=~eHQET7pk@bKB?^W}Ji3Kf74 zDr)&KdPmaCxgta!l{KA8kKNj>(rKC;SZihN?;nHU#|Oloi`f!e!->I8AInEVurABe zFFP5J8I@N$kmHjp2tl+HQxAr@E%-jk?f+rJg!|n|T60BBKpj(fJK&47bjl1Ho+D%$ zSAk$Ep8E&_#DHI&x8rMyDuW{0vczPZBx3+1%eru2t3kk`z$Q@oWU&~oPmN@&~q#b>91ygALlW$)U0$~VdnYK_ypSv^{v_GD(s-dAnLR*QNtq=qS~Y#U@EH1+SwSq!6zay zXhs@&uMbTH}icxeR>u@*W!(#96r zDr;|F{3zYBzC@Gr%=wvaU)E`?@S;Y10lLR-Lc6RCR$W=y;eCPZG+Dr>ogebfA<|d@&at>2O)_xrd+3^_8dX%S9pD zZ9gF-4>w6W*2vYtIw@z4wl*Rd!8Cr4gTDciRYHj>Ga1l2c`0Ov|*AwosGWZ3s~vC&Xp z7@A9mG!%-+VIlNck3o+tHSwYHZBohbII*veoe0{H87>a&zb3@4C}|v4YN9l;fZBrD zy`)fRu{BO#Ad~!l zHeCoGl>Po{ApBb~{wc}z_KS<$SjEQq1Xrr|Ltb>Iwe>zmj7=fdSNt4OjrywjoPD5V z-b~2460X?dBW_-83eHjXf_nvJv~_3y(sXJk&tYUfFuJ6H8gD?(07(;xm$Cj6`|yM=^&Hrzqm z`t@imQm0ziHf+kyu*p1u)9Ae(YZpHAN|U^jK3Q$U$BEV>TPhY37M%|{IG4J#tiNokP)RNQ|d%;;ql;hjx={lnS0lAF6hmTJnY5heHRF}#a;bgbf|OtqQX8yZ$*3d zu*(U1QCYp=eozB#PzNdJ(c<9d`|_x^A5V-P#d`5Zpz-fGT3%lpOjziCeyspVUsn%|cA1~5 za_d`JN`NeQOpVP?X0Pzn}qxI!0B)=HI z1_rpy>G&8|@xey?f*Z~}`~Lp%amkhD>P-(4YGvJXOsJ8~NG^AwrN;~i_|z?WV43S9 zN(EhJt96H$D=GbVt|^q~7fAGFzDhK_n(;@9Zf-01-o_u}u&^>0Gjbm;AL%*2wZYhi zc0IfebF({O4IjOv9sW`ZZSjMNa=uaPw4GJg?j_*XRXixnEzHZy3l&upl4*9N0|PEL zi>B*Y73N~fe~v!7zmBb6PN)ALo&MV}{r|`5%G829Jlq!59P=mRkrvgkG$i;r zV181PKf0nQLit520o?PZ$F#I;k_57Ix9Zaoy)F<2*@j!3{@#K0Y;$0qYaarXOUAYe z?{VK^7L{ZUGWRGFo3+c7^7~kE?vBP&Rn(bjc9)kd7X*U`T=+5p)P%0G^pEN28LDZZ zYAM(^81Q0SK}AeEWUTLz4sgEshYi8UExt8}=oI|?@ozl*ixSZ?{XvuHei0m6`hN}o zU(bQR5Dm*G?gSo@)>fcDk&VA26!d>4D*u2`09l?$6PQoX0cf5$6FnV(i5|=^=;#5o z|CCSsHrM}yGtvKuqnHoLtCsSkihaRQ>jr{+oNB{L~{41~i zuPoHe0%WFP0p_GsT3{-#p>G1Ru>3F7l>T4OgkMkI|CyRH(SWHb9k}CwKdC8@@##Gy z0Ua&FKc=SiKPUHp(r@}-v*#}z2%Z%GZaBCd-PV z1L(j*j+P1RaWGtEXW-1%Q8kp8USt0)Og4f4kWJMdqtg8VDw;L2VwA zK0~C8(LTncfe8h^3Y|wn3grov{_+8~1nTx4C67?ih_UxTf51VPK)`@Ov8%-8N|xc# zPBNhLk^1aMhT6mZ{zgbl%5hXlPQTKR{#{~;_7Mg@Q>*=<$3~SU^=1wNZ(_hBfc9m@-SP4r|aEnL&jyHQB;XFI#>Ge@;om`dJ~{nRgErT zkc3gpQ45o-v6@83&~*f#Qvrx>r=dSsdUxG_LLsJ+rPzAhWs0~^@A63HdbxXP<$8MG z($A^p@);x(knfFLXwhcP#}_a{5!+n*QZeL{Q|S58z0xzG)Cp*C3e80HYpgXLw;lt< zH}Osr;0$)7>ayl_%&R@4uPMYcbm*HNMQGW(WsLyEeL@Tdn3}M{s#lY%Nt3v|GO6|J zT(Um9I(Kr0$ozJ3Up;0Z!!z7p}s>JIoqJ&CMv31qlT)fZZ#7gOyjpSZ)Si9fORY){&hV)2B;Com<|7!Gi& zZtdG`yUCvipPpjh*kI1=ZG&bB0_ITBDSGLWJM!=`&!$4by@$)pq$MxPRtR$p6_#k? zv4^2VW7d=vSPz$UXqWd6&tWy*pi{$`dO`5d=G)pbJ%-lKXxt`MEPxT?-WlzI zpX>qn^v(lBvIQ*`!s_ufH+)nw1;2CoQp=q{qE^0>fM`SrlG3*O0sz*%5xi(7@t*P`1|BiHaC3SZr!df}n6af3BfuA(4 zSsK0d_PrC;$AXP{Nrc#uP@%dy|25f6E81CDbUCtGLpww9kqr~c21LDl_r7-*Osl;Y zy==aRMYEN68yWN2RcP_7?`ONVl`fq`U;7W1$rfaNrhbQ`fpk8bnIxpQmJBb(eK?wW z8cK9sC@3g+2O)iCb6H+%PL7r_UfM$UBOP6_Y|ETw_4x>bFmUFJTI?Vzo$;u)ZzT%$ zm_*2)_v9H?2x(Q&?xgFA)W^uqjmJc!FyMRBFWf{ zXO~~~JdzODvl$E#`os&GJu(P@3P-W!L<7JTHAQ`xD(5Pc+*aG}eykZSNPi2;DI8Y$ zgaE0@96KJUG77QezR`tZ+RDJ$!MQv}>6RoObZ9Bn;d?1-PY6-x0?ZzPAe9;X~U2f#N$XkOES?lxbp{X6}qhTe1KMT)_&?fzvZ{&oeq2Vax0Y^|iN4#BDUxHdTYqrh3wv}4qM+oG zjyJ2>OZ`JiJN!HAuoHI9Ul}vw69N1+P%Lr*4c9x4N+>CL?T(g8ndE~n&*`NHtY>s| zCr;GjB_t7djRN_{+Hh{)aLSD!no4TCpSGm&v7#i7uJIvSAM3hth}UtceU5CLTiwbj zGKEut`!;^Xl8JFaRjrhunWY(UId|3`j((Q8&>L0T$e3eJSF7H1-Aa&g|Q7*`I z0zV5$PsNGx)E^U$z1-AUJ}yhKiq4M21s~5a3VqotJ*kmRUn;DylFi69&>T`;`0(7L z$3RvZl)f*bGZ3MhDuKXKmQjy-={}?FMAw&cnURB;8OE=y%G}HA_akz8$dFWI*FwZ& z&8FMFhKlLMTZLqOW=q7Kv+K<3$;>Iy1{)rm>Vh;6|GC-=g^CUbWG1ymjax8&R$m#nx4TB#Y zo)5#5WhVBCgit%p*5J{tSfS5v<%J%6yL^PesEHc+Pby9SD`uvQ@RRLIA^c>T;FsTm zlRt?I_}y>%#7`*wCmD_IUwrOK-S}S`aQ$6I`)TT5Wwf7w{4WvMpK$zV1eWn%Is)*| zl=l~I|LLFqj@t(m`~8WTkQSCoa^LEO+*NDn)eiC5xOr1@%e{-B9CeF(ROgK*p4-Sb zF}Z<=%g!ZNSB?(OBr5oE%SHXw6=mafg`$fqhZE;rpgdlV29$LzieeErHdJF&*;`k9 zF>xPiri8KZm>g5peD6wLj0&h{`!PA28&f4$R#Cg=z2;;@y3f{*UF=ox3jsW4?Yk<6 ztP^CfH?W)-r+Sv6b5dSRoe@Y-keg>VzDErtW-hlKY8E7-bC;pWaT<#g@(6e=hJ+;y@OB_%5v?ajU2_ z+{asGCM>4-&nEN}U4YoFJ4kYzLyPkZ55KGB5lKdJb?xkpp11u>=qqhhjNg_|rLr$B zTXr4y4uP(AkA~M9M=0bO;QNA9+Yk_EqpWGWt!RjRB#zY}j^!GCE~TM!JA)5kT8tE? zs^NBeA?W? zMuH=ctRm5$sn&+?viM?NQy;{^0jSSTEMVbFSlY3KCoPqJ>E-?@^Js1|C*zw&~6H#hOC6QH)m zxmVR^BtqX)L7&sFq0@b=!HWb*;%{j5-{Q89(gvtvfA~1dprHp7m>SXajnK&sADkKF zy`>0sVeC?FPT;Xu84O{G)W*-6ZZB{=Ny%6s5k4gYsb_Qu6zO^q!&+bg$KtrABq8h` z66zrL`EDZ(!$T8B)e=A5&Q#VvEj2>tSScEoe-wqx8TVW3l-;oVthHf!2S)fP0-63GUdHt-+gDt#_Bg^7KlHIvaue!`p{OZ}fG@JsnTl*E@NmmC zx+Z>KLy<>}dWvK|g5dzoY&-Z)I?jUt$&$ZVC%^IY1$lZc68aWg^YbD$iP{R~ z=h63QKB0B!0jT3M5LEm=t2~xj-~8W{X#?&DR*SR(Wp#opKJLaEx$y=?);i&#W0B8f z3;8!d!(I9tV$oQPWO260)D?=7e_$)d$yb?Wi9+Bo2dKslwJPk52jX<-;%RBjxqq@(P|YRf3_I%7}RjC zx}#ykbO7w^GAcPqZDGY&+?kM~UcHJ_ytrtTCunrCJUiBF>Iv8WRcfk2Y7VS>0qz?}k+N$QbY8 zGK-4njBRt~?B;d1c_=})FRPx(iA3@O2m38Ut3n5rDEm=x<`CI0<@&b4x#s?`k&7tr_YE1zEI!qtDU> z{d(gzHVl$5vG={!`-8!T&Q&7`36ATlR8Hu7qQ?tYUQV8p1`462_Vviy}Y&>zk(D~vn#C~tf-uojqEVY=L z*Ifd!B|>FjXmnIy?!#v$ax!IwQiu9-4iCJhsjEobRY@69QN0vQ(vU%<06UpRmgJZo z`T)DL?<5U3(w4A?%HPS}7V#(Z`KCTIeiz%nV!1#f2D$0)l8kyKjqV zz{}4IOL$jPtY&_k=GWrdO zc4V@i@-0O==eY~xfT$^av@h+_j4{ibLzJUqCLD)trFCbeCv%|lw{IRH>7|tG{&Q&u z%ZI{aj@Kx)%RJ7qpDPKXiVu2>Q#aKSEZ(pUU5VUyCOcg-zEPk(xK< zuTTo*(icCWeqoD%m{oRr#*WU8;rynaYWC5UR4^=j&zxk&2(c0#$x+*H^^}P0@p}1n zz~kGkXbMVB7l*6U73IcRW)u(O4y|t=BlNzn26aE&Y-l*UT-lvhQCizS*h^SfQ_ig8 z6jlKMLn+aRE$ulUn($-dF>zRw5m66gdNw?4f!gwogZl?U39Df*mg(8pA4=I=Pmj(T zwHUv`f1epu>=UljAd5q&TUD2frZh1@Q>)vDQ3E*EM$~MJI(ivNaanM9XNb!3N`aT- zala-)s7xxRAa!k|qmz@5->~QoC>GHca4Vc$zZ&>=i3$tB-ufukDzY)+0?~Y)vvhXF zBhilQ?4yJpze`VZVhq!Z-Y7|lP6^|!)HoJ|<)i{y-#rxF53Vr{rMNuSJ6#@qq+8P| za$m}w0FcUCzehp>>6pJO#|NJbH`#GJi{1&qs&A!6WUM8IFkFDMODXado{`s*s&;yX z+hcQ0d5N~z8_l>PAE#}X590A%bgwa>w)cyor>P~v+(}X z{3|!L+Wl=<+6{&QtQPbSNwY~+g$FU(ckfSqjWgFNq?P6nY#mfo*gg z%XSZP57k_XO{^w-B~9cp+NQU~?|@f)CUk09RYx(EaZ5HOaK|-52-6PTzf` zc>_!XniqK=ksdl0n8-bC81jPLWmu*@72_A#T-Gt?_P_12baGt(mjG>abScJob#TOO$zDL?a2KR7}V|e%$rP ztTsG1m*OybiiLVm!Z>L2ZZI`k$Yp`4j z5R)_31Sfands{_?>6_JpX+qbndbKIBN=IKD6cGsQwkE_9W%nmOQlYOeBfVnVq|Mgf z6b^fJq8(JB&=-&-Zk%Z6dE;O5MNyqwLl--1WO5XbuFGR)rvik*eDJ;;H$;kN+A)gF z6jk=HshAv%;&Q zme!6k1)&#Z?$r?N)1qNFapvcPSkm93B0K6QAwjy2Lo0gSSk+bIB27CHRq-kf;`#$6 zS@B2JYf2GbZ{IAgj=3dEGkmgfpWUzIYe|9?uDVQ*X@0leW%0IAh~}${44p?zM`d{G zS@$l+^Mb)?cMKSkr>cQ5Df1On>8Mf1{(3?^w zhNC_y+)Yg)DkYn&#;-J&56$w3rC{2uaU$6hvIX?jTS6kq+Jz0q*rVM5y9uleOo|#W z&aG%ltFPInB-7EJCaNgLyd(EZMU1V3?I5)0!26LEKG*0@gAMk#c6zT)_MJ^F?`cD3 zB}~t}h?_h_F}8IgQO}usWsUs%A>!QenB_93u{?3BT>WNGB<6JPfE&mZXYG^cAQM>-wC-k6xYrB;}eXYggA5DmEXknfncwhW|GD?v#N zEJ90qe>+jOG|#nnzuSWDG6K6MJ$)u}SPh+2uCTLsm+dk%b#>#n#<-Cf&TF*A*J&P3Dv98OIl2}Dm3-f0@iy?zyfQ85*x zW(tjw26hzl#mozh^xY+C!{zpL=qRg~V&CB-0!AJ8(d)kWjonTJyYI59#G>+)BRBN! zaeTz_klS#yCHlII??yW9W5qd>*Mp>`&Hv>n!B34@a8DM~jhK-N(F@ z)voMR-jTr=GP^9Yy}~X!bO5K%@lZc&UR;y0cP^23u$ZGiaGaOsszPAy7)vr3+1(bC zl=qHE{Q>tj?!NDDK+C_Pvj10rmM1jwSJ3h+x=PDJ&+=s7lb8Vfa|rU!Io$sqa{Z5t zXKPE4#XkzTGW<33&pCYde^t1q4#{Z8k`5Wbi;U6kDMG6BZL`+D{ zw`4z{<+23sArYZ$jNUp>ges3nj|}LeBwTVvM&@D<1nx15qQPkyzJG9f&nfv}U5a+} z$YkFcIJU%z((;0)32(5(XUQaTOa4?Ao$<=q)Uhxvn9L^Rf3Fect z&XhgB&&5z49MrACc9}PLTUS$OH;x|`KSPne(!%kB9rEzv(uSaXE(mJ`4Wi?1WD3Pa zAjGhcr7$HgRqQL-uR~~R#((&tkiX}S&dp~KM`-B&9fDK)z}cHd)ZQ!A3&@97frebc z-W5z2jFthQr#6CaFr@C;##M}Srw@s_LDvGom%TynD6tI$-xF9?7-BFRhc41hiq)lC zwx~x4C%$bl;@P?Sts!jmM|vyKOndCtPX6KYg*(1YA;6Apj-?T^poj+>lb>6xD5P9G zH`aEG_2BtIROw0|3oM(l{Gz$0Hk3@EnJ9_>eVGn>ZqaIlQw&^(;Qiz!@s5~t2hQ^_ z1+%oBm`3Vy69(iy$594B>r9g+#mjn-aoE`01o)or%&QNg&x1UsKlbqK=3b$VtBnZv z^iHzb)Q|1%jD2%Aj{FJ*Dt#8G`^Fh_EtQc$U(k3f3r6*WWzHggfdFHP&U03vPjWEf z$U6b~s1!~^zh$p9bo(tfrS(YaIUU+{FIz5SH0lVJHkQ66e0(z79M!y!gDj z8s>1U@si-^mL{AjxG$Qfhc-_(@5JaGR?E76o~}B31R7LHmAAH1GiI}k;+4IEUvxQ{ zyNVDI(T`5!qfAh-k0tJENW>BIwZk*D3q8A`*s^zIn+7lP6j!>)@0BevTfSBRHpVHX`=lCDWMY+ z`8ZhVBYJN+$3hN5L7S%sfzTdYg{>^gnG1>A`yG|zRY70H5mknB9f5BtXfa~K2YYV| z>Ju4c6 z>WqgAPvsq55lb3c)9)_cy9wI~xFR2gZw=Wm?hlg;*{hSU)(o2r06=T+iER)2H23%r zyxrYzF&n?#sE$6ru<0jVIc0~>aXLI)S`vF}$~iCMFRaATY$6jCDE#uB zB3YJ2e^1TE=G&DL3j9N11mR}OXsM6P>WeYd{2R(A&wJ{UWeZENQZrUeot+;+*H=Sx z=UQJT4KxsSg>}g&%{6-iGI`uxAr!+)YtPI)>*E>sL-&OEZ*nHfxvt>W11sj!Nj2q$ zpkEC8H9|lsD*Mm3R663k7%MhzfDKG|uA4FxHPhTYDaZ>Sz<(Hb9!1nHdF(%9#ZY$6 zs!$_OU|^vL2!Z{(&dy;Bue5~<$cz8BxeIY=W8#hudyCM=eoBoM+qBccuoKG^2 z6|eajA&}Gd=Nu{0G-_-^)tY6KeYy+m)n(xQ;{5AJC?tk8rQl<}&G--X*KBgReUYIF zH}_DLQ2mBOndhtsj_$_c#mVK-sTSH1L#{Q5vJi9NVRr+y7kxEE7!(+}C6h~bUuSso z&sFQ@9$9Ajd1tZNdH|{W4ixM-s%+(6sUIHY9mOqOk+LN*Dam>(ZolLj-x5R);4=gRO|_Z9lG^TKDmoO~4N0HiJd z^Cb6WYb}*z7}nfMKl>S;PpGe^Y7a_oYuIJJtIal%((#`-X4sUxqv2BISj*c1;erpd%OJ#o@mlKAMMBea`3|)efYqRk&FF>beuVFW(Qqboe2?ml>B(=o?hvI{^W5B&Lo)O-n2e8Ot}GPD-k8R&V;? z0(y2*vAXxZzQf29W&xov+)(s+f;uGgXts6bTrEOT@eAIr{Q#7`V0cFRlAkBvjQ3?1 z-4DH(cQjbhJ}S7oGPunu zMA%F(C0KoZyWUZB$s`7$C%)>9i!?F|v43XZoxP~a9gmW%d=P+ajUe!-A*Wf z8EQ5YbY}$2`Br^WW-nsJ{TYSV9YoArysztvO<%1t|0OoF%J5QPfn8CCyQQ3ZLODD-Y|J%k&8O(g&Of zMOG!P*pIRBZdj}+ttbz|p{uV@(oWY?8Igy_AVnk940Pfc1GDX*jIs3yy53Kuh4JTF zj;!7;vwIA(njN@BS!<=mKuo_VW*83V@Rbu2PYZ;zHCakoS26r?S(d^~gNd2z{LJ)Q zgzxZYL{L3AV}zInJ}JRPUsJ1J<&4j0wXY&AF9Z8WRQ6Ha>_FFs;+-KTAGSuBf$p6sLnoT^Zhm#ci)k8RUAnXlWlP11GkZ&i*e)ULjl z28HGLKQmrV5+ay!5~{)Qdu{V@W&n6YK1(LCqEtzj-6fZRcLssh>&fn-f(_@k5`k&n zDXJx_rOjdbUZ3{CKUS;cal6?k7Q~s6PDSawORPoH@!B$~f#cYGWHmK6FjdMJxkPnw;yCEa60|-GEs(Y1zjZk)V3R#}G_c-pVq3n0FI@&(zoL|0~ zm}n7KPM8dZir8Y6+rO6L5Ap*Uk7h9p*DPIs?Uk6^QWR#=JZw|!=`JQPexo{kSt}TA z%Hm71AkXgkJ#ktR*%)?890mbrT+A~kVcjPjYgC@FV|}Co{={bNE20e{(B@K#xkN*5YGY~On|KY<&2wZmwt->?jw%BL#byewWSROOA zGYoXu(Mb+P@H$M*$~6+@xTZDdd2U<028o$vX@1mOy|`;wxl5bw!(4>Lp$+QHI5E5; zsLWHrve!8XpG(!Gq^0a%-+abcT&ekfSAtGhGl|ZbND57s>GseW|IOk-2qHZTmGKd> zjeJHZ^7L+l4LN+JFH!KluC0jZo9$do zV(a!|4$>d-tM2`{eJaIwF_5$$xpI!R-(=AVP+q;Gg<*f)mF<|_RFv~k(!;?v3!!2W zeGKP$pQ$ZBe%$<0lJkpxu>!J>Cs=VXS=2touZ>{}C2Jmvsc2i|3lTb)jJqc{KF!*M zZnI&PVzQ5^08xgF{THF-LRgI`@WthwXY(B$mun@k4&Zn%$Xsf{Rq&JR zoJYE90w16u#p&T~EMv>&-(brByY!)-$nP)u&`;d=Gr@$OhW-!K__zAd(?*q_0ulI^ zA;{wAmU!^l5a9g=)K9X|Z)y180xJEdjaW}r!L@YsjX>&}AWJJMGYbtZEAZwj%fH*& z!ubDEE~00m12EIjgGCue01Y!(E}{i*OaLeBGXR+Y;2k&rNG<|be-g|7Vmsxwbey8!^3k>-MToxunl!oEy-`+k;S+Vrzc-! zK>pBpp*tq2*2mAsze$`Y!&bgz_ld8t=N8hSiz4^M@^`0Z>K0~?7@(ez`V>8#e+aWe z58+r1lunauvjxdOv@Io{tPyuprfGiH_7yr+ip=-YL_`<WbCz< zU4^I}LP#F&L`9*n8@sZvG6T~pEf@qcFn49)Jc1QAwB2z+ljZ8h@<-W>nz@IZLK~;r zJg?_0_`|8j`UIIFd*|i##1}5aja7Yev!FOQ{f6d;2H~-(-9L_UtkVb66ggG)`tTKK zdr%uLdPYLys3)qr%QI5CJ~&>BKG#$*ow_p&YM)jWjXGkA)n`zA0h6rga=(jGfX-iKBc@Dz1+^KpOuRyf`srbAwuYT>usDwKD~ zU5;0Fo^1PEVKtushESGOse$A0(mo?MvgVCq%M|=Lst1V3sQ-OqAankwjTB0m2tsI8 z(0Q@)3@`@YDT-lgY<9fOU%GD8AH-jf7Zy%a?ANlJ*05552DeE!Rcyf4Fcei|;QtYi zdt&0f_9YG_@?{cPUwyiY^;})Lnyj~|n45HT;%FM zZSXcJM@&{!o80o)GysyrO+f$B@W(HVt>P*l+!Vmc0M52s|qlGIn^W( z{8FAe!djiXDHtN2!jQ9EvixKk=lFNyX^WNZ^8weUf~uw<)A`PK_47w_e!jjAZ?WlHV7$oDP_^B5 zvQ;?OxaD}_gcQm@5mm@4VN#FkRlLZ#Hvby&vE|d}I!)156AV(X#4_Q1Bwju9BiUBh-U28MCDKp-JYk`fX`b&$zf@Fud3{k17HTDy$)H%`5tl(qFMsL&;Qp zH6ryn``TpN(@Ov1(LlM#nkOxKPR5P5XS@9Vr6?YIKbEU^ZIMrCsY}{B^?;QenE416 zX~`&A)0E`4^llWIB2frf!sU02rxt^a)H5eYy+|8TYyJa+#U1vg^?fEZQ7kc(PF3 zP@@T0?hO4>iDj@k;b5HD<6#_zPJ-~V3mjAD3XyNZcH}Iee4URV>BDju3Qo4np<@yM z&|hAZW*2e!gGaWBER@O(Wvw&jP2O=8z1!Gp3tetoQ>Vv`AB=JKBzYoT?tdT7U&?wE;^&E~5@0*p-`Ht~B z-a(qbIxrd?Y;!>VRvIz?9M6P2mI+=gzV4D7MuPRmXh25ERGFPclHk0*THm{9uzjR< zFr6j-q@^0yycBaZT_7Ne`o3<)MQ}H&yjAOwXO+2kZcrDawWnf8QY_6iTU_*>-^j1g z+f&87N5FT-JwvSSAa0W*g$H7m4Ov{%WB>a88Wr6G!Fa*y+-7hA3OM!=7!f(qybgyG zTg>}fuVR=b^Mr)FR-W#xY*QH#kDxf;9vM32FG|w}E9*?R%|<+1 zEy1jZhys{DjlPeZDQB^r zkbP)kLCee^sk49eLDvBaYZ1x4XGb`{=*PpBiKH~UI0=hiVtuzqnCn?+)4Ro{V`;8I zod@qCuN#)R*wR6=2sa@!^J0KL9)2_O>9UTOsM$7Ntf?ikT%E+w5Ble!GnuvHrYNbd zQ04^fn1_2(=)AW#WS^F}+l{}0gE|68Gwv#7vhmd`=as8gKFwp_E4{l`ewYsL-{#@e z>SuYGOBN*LaQiKNzD6V3CXP)-_zJ0)_2T8@LB?Bj3TYfhNbl64$ogXamWLbU1eXRri}xq{0$2 z)Pj+x;&Ks&A}dEhBVKKjPJw0>1xMsg%F6Y(a=kNATUi3)W*SOw#y+%XA_&TF%gW9o z4=`KeE_giL-nEmo*cKC9%36aAf zMYWJm?U`An`#+!VaHg^%NJD+zWW!uCF~t`^*vFB$DmN~R1`Z(W+ z_{B#+?1cxe>ME0ZVbnfL3g5jySpj@N4zpec|4)PX6&U|lq@V%u$K(7{+Q9sODQ)=k z9RHd&{P9WuVkZB%q`%B0BOUAC%_Pe|Eb`wQk}Q9E3je#E>Q^6)-2bvui+|avibp^+ zChIKTTFh)mK4m}2Dva*2Pg;KYe4^DGY89E-7}*mQ*+~UBL!lmBp9gtQK1k(GbY6k zykb{Eg+J=CQHS?JJSw}og?}2CJ&%BU*1Gqn7gP9+yfPemMpC}~^^oW8cc0?LMPS{2 zQZP_!;|rantn_XXjOdw0R}tZBWKer5hIcmI1&#fXIynoML3zb~l0M>hJSyoy1-s{b zeGprkr{#PCf*!vSAW0?+h+Lz?e52!RA!a7F@SxpBFjfE2b*V9 z{_6$Y0-SI^o+C}xlJmL@QU;SZ*gz?8Ok-efuC(@kM(If}=KFmKi5orYY~~R+jZj7# zf>MtgMU@A$>-RqMT#j|hZ*?jIy(--W;2yo#eL^UY&kpo^#sp~J6G7ledRS$zABD)G zm)AMwx(@012QXF14f{0w=DtPN_F0<>_x?gcmcv6+6tC+&B}(mLs1r$w$M>uEG>YCg z@UvI@o_&OMogjqs{dxsQUKU1dt$#z!h?haghr1aPJHYkYj$SsUu!#=UL_txXtw9-()mUyC&5tIIZ*aA-80h zT3E#7-OkbnXoK$?TCvJ_B$2F-9o1?)aPS?r;{baPbQik9K?rNDNUAid3k;qDo10%t zbl6S|6Pw^%uB>znk6cM=lo?#SFd+uLg>hY!AyTCohr0fYscT?Fo`b>Po4Uzp%%jcO zsFRCeI6VfL(%^-a1F!JF1!Ey^ONnpraP5#o zo9z*Q(erLZt)GFlD~<={R)#~ShS!dD@^fClHb$y4u8vJs0&=9dI1wD;WB?q^(Z%zi zuJGQ7<$6a~)%v_}ys-61Jzy+fjOu`$gAV9tKh?sUeabpY+pyC)t3Yb{VCgJ#OsFwO z1fKguAG$a#g~upU|PoymI!O>5c99qq91uAOtX#!8A?>nHOqsaJZJ@%g+QWSARG&ZeAd z2ai2%OBkAOeXbSXCGn_{vR-oUyepB!k9^=Hnb{%*w$# zjJn`hTM`bm5s;=pJAuYmv=`1o<@NMZ$4R7G45NC&X+tuFNrg*Gu&s8J9gLR~IGH@@ zSa9Yx4<`_tXaPHAeRBxQDTGSp_smlk0eJwxqcx`MY2e~SQwHQnPK?^B_4HUI_K?*Q zqkgdQRYj2JvMu}k#I~b(n$F6iORxwJ5r@~0IH_NO-MH(@gA=9&fMXbSSw0PvqM?>$ z@C4Fd6mde^;fI4$b6-H}a8dgTNu+bVitj`bm)&1GY3ltefn*98b??9z*5Wmm&M7lX z?TW+-^61LVw7`J7|s=Etu<2$DR=pZ24-7G;7RlPwhtlZ`~rjb+R@ z&5*5=dWZrqTKh&6quOd$gn-vx$ljNv@@g<63L2iGMr-AnA`KB)LU~XYkb*x*2Uv6q za(JP~pkok}w5D3wh;Mjg(o2e0;p#1SiKRemN361A;OZ-*xHzA ze%1BrERu_h4=^&1^zMpBsM?60oR}R^sGDg*trehVSN*vNNLchsBLsG>h}1vt=yY|B z`W~TPj;1F%jJjIg6rn+U=XX{G|6H}kW64#1SZK=EsZ61#;)Bbx9A3WPEUMLET?Pe4 zAeYrmv`7%2^4KiDAd9b2f9c|K3%7(oEfdUYTRjo zsyh`TI{a|TF0f)r%nBEzr8Ko~ZwuZ>Ycwt^0q%33_c(PnAXHyUkD zzZsxt3vQR2_R&XU7y=FhUyt37uo)p>k70HexVZrJ7#ii8MTMqI`VDq4&aqh*;MF{b z$Mvc&ES0~iH~Df~y2VHF^2G#^Oqvp`zJtpC0%2*gs{Z|P)M)aDI#ouFN~;;Tj8|D0JA5KyhKMx1^!3%NX4$X6W`{TFBLa&kks)CqixA{( zBMhNEp-Dbb=M<}HSfHK&v}MMn8sW`24g8zkMltaM`L%k*x4pe8$z70!CKZ!pBX#QF zC7|gOlT%u&&+odmWEB5K#sBT}=fA*p|BoIP|NVC9kL3PWW&XFy4+9Gu-QQv!mVX$K z|DVXIe;eWab7=G*G=3Ss8o%^-46KYaEOhi=eP22nI(9q;Hbxq{FFN9XQuqDy@Bf?p zhV^fj>o3;Rf9E%>e`PxVLA`1G%W#}Ez<;rhk3c2ksJOoycwb~%;w_^mYeg%;{d9m| z`s@@%Ruhs(&{)5%hS!0_DCyU~o@*W2)EUdY-juNqTc-JZxxRS~)Bd=%_4Imv24SZW zroHUEpTsjpmYi6|Y+cIt9qhEb8GVh~$NdU$@)i#Ae=|FGZaegMPC5g((cD`yY;0a> zbWvX09sI;_t1zgz=&TrQ|FCoUbo)7CChG&HdRQpw(gwg7gs8st6SRGL zP9TK5fQ5lwi>`$)KTOaHh^z1zIH=|N&w}3v0KdysEduKmumXYF8gFPPWpzzaMu;9u zv?J!-f#YFINa|eDotE1M)XABf4$8|e3-=IvBA`rdmo#fC;^VVlS+bN+#cbj05s;)J z1xzvYzOs4-sq1=YVRs4)eBZYKSZ5v4wNMt@%_sLCew%;|!%R}?GcF6(s-AupDl=&x zRa&`2UII?P8O8n7_QVYQ+HJc~!3v2BgtIXOd5IEjDyN3;>L#PAC?djB#(2s%uiY{& z9$t7_QXJ3u#&S@cRL&3z8^99$yE594>9?MuWgarc!iwmG65lYy@C=lOo{Mo9Nf^~+ zV`B4=~(c!7nh>78~o+%u^<#4e-yWFb;Lp`u>L>k{|d%LL07o3Gc;KW?u1tFD9 z+UP~}@C_?fgK##?fuiufx)aL$C%Adj+4sU@e@UCl5*d+R@TWr5oJu(7U!Z`PsRl{M z%5)mqIW9&hR-5G#enl8q7c3h`{g_6K*+f%b&3ZvTmi( zD3eq$KC0nLb&lJt*}Xuagu~Lu{l8F!urf{8SeR-DZ48;X$4rol-{HOk1XU_{R5Gb0 z#t?>?NP^F>JWfD)bbBIWlyMWFA= zs*teJ-$tT3V4&<}!og6aj|}7`5QsSC3xK0E#khs1C5u;R1*(9UfItPK?Jzz^u02nJ zhJh+hNn-5yrqOzi);lE&U_oy=JM6gW%0)ZW?8`N%$*sOtZYcrTb`LYfh7@3^nh~*z zt(TPhRHiBy>PnDffND`jESppst@!*_#zKoir>-RH7Ac>Kl_i)!8Z-AG{$3;&lwYN3 zDnXjplWlZ#c8*j`Dh01^rxTDJ^4$Z?H;XQyl02ms0{}2)f*JD{cV%BkMUlANGq1Ow znHj_Sw5f8yj$qE{(2y&mj|{0xNZ>(^wrh0-^EI9q|85k1*S=6khG@=eY;7N~9tIOLgdauLkV8Iizjd2*8} zw=rQH^hW>J1B|o;>{ok8KGRYSKge0J%h0uTg(^a?pRy{16NM5d%qi#RkrrDzV3hkH zxQsA<%gJG?5AyJxzawF3r5b12Tqw3Kd$TFMa*)q`eDl3+^~iYjx&uy)jS2F>CSixCvr<+Re^>Nb7OE+)wC za-K9@K7UTDi?aou_>I2zT*oceCvooPv44ad?Bhg97#u4OvR@RkF_J4WW#h+i!!)IX zz#=5$9t(skTN^~#m6Qm@`Ggl~`yXr9yBnkwUU`vpfMmW`Yu~2hd}Ey=6HDwocA^kJ zT8-6KTZf2aSaiUCEaV&j*9K9{y|b*2S}2ce6UltmB4=@IN6R9bgyL&#FT{3G#^bU->xC4CDd z8z5k~I}tc8&q4Bjldq~WFnqhl(w*<3n}UkNc3?Qo3$8UOd^g{X1|mFSi4E$uPAjoE zhMgj#)jZTg{MrliNHiYYql2Gx;{Nn=1SC(1yfuBw#$y=-ab_kt$nhGN`ilV`Y9d5M zErvNJv_#dZ(>iQEE;S~U)fyVLo$F4^MC%73_Dtf=pd*|L>%vvUZE={@l|gpmQZ<>q(PD&&_%PJO2(B>#Hqi(Q;oT&XmFC#QoRNjT9#W@g(!~mG zyvuM`BokI&M`JP@NBK>4`UX5**EP(=TwJ)Y`x)t4m-LyKEf0Z%2m5{H#GkaHv!aw- zWsh0sg>l**%fP1$vF3n1x%0FYXz-5Y$vKbU``K8jh0X&0^BG;z z-Y~I9F6Xm4Ej{VDt4h_d`!v~Uv~z>$S&HfKKH0-M8ez%N#J%kr9xdwW5B9zuSo$Ni ztR-WrRgLS^T5NH984)gIQPp>%H!90irTSdZufO<^Lj+Ck8Iu=@)t2Y!!{xS#VJ<6M z9!xOi&}u1{7sa_o!O)phbyE!WSw&pjK;3`91bFi&Bf-7ueawaGjbPLP*X({c^o zS6W^|NiY)Xash0|tS>69SJ=5Op7YCn^Ezy7XPed4;b820kNoYKnIjJbfw&iQRvRqt z3(AD-e&~5~K&27NcjSMpFHxYplnt?cyqhYyXt}F5w3jRkvxQEi2)ezgzRe~!L9VWw zpFYQFM#-s$1G6&}#(WIy*pj;ibIjC)?jLr(d+(oj8p(WEqpq*cpNYv7KH8*z9I-(% z$2txQm1|rsi;bqwc*+~2S$ni)u`=yAQ}P|P?9AA&2CbbpSUn(!ff`DtMKP8(u%g?q zzG_a-0OHD6v8{rI>Q~!zPez}RQKn^rF2iI8hUVL%?!K;pUQr(2d`6I5&R`>-mTC6BW>WN;znDlAEv z;@wWlI;d3}0IsNaMJ@b(%cZP?3@B%Bw`o^-^1X>K%hO3y)WMQsQ-v+s59M9%wE*aE zIHcekJ^%z5iZCH`&luR;gUoiS&(_#POcVR4}V z15>1Zk+kVTTPj4v=GYx2J>#;U<$HRCl%bTfg<2@cZS75|20XVcc8Vx7iM1tuw8f%i z)g5wrT=UM-a)g7kGEK0Yge@M6AbY{loen2xJA=Dg4zofjVhd4iCml#_Xzn&f4|!x? zQ6xQZ0M@^1Fy$*$l_2rc!a+BuUp1tNuS!NULg>a}7lZZstYpW1h@RUuU(Z3(q9Hq| zNIzdrLJ}7M#TP)5QTE1>I}WQ^+(WDkXO;0-97`8IcrgC3+>J*+fm<@tX?g?w#)Q9V zQ8l_yC}ymo@Z;n=e>s;0+0X$w?Itmrz%aCjn45oG2#$knAfY;v#3v{S*2m2M^jxfe ztAu?eC;!#d`a3TD>pt-R&Yi}e=lIv;pxuQKa9*DithiO zoQ$hWS>1lIB_37wU?pcCLFtf0)1RtWy*C0g0xgQL8$P{~MPm>wC{0(|u>*Uo4KxtM zVqkG+K2H17?cZNvq)V1&tGqhi?sH|l+B7$`J9M?PDJW9q#pxal>q2ur zbZpt$-(6mwK`R_)R?>er6lN~EuAO`)x%RnIotuku>73S8;-q+@zCeE=uFL0lHyqba zX^R?hgJk)BAnO5~zAF~XMv3;!16Sk;G=^AO(efy@uezH+l%!zs+%0_O4}sO$LCw1>cfZPN;Bi_`UgJK%Sk(QFiTyZGUEUv& zg*9JBuFTY(6}qWTYZo(Oi!%SqNDI;ht-%+&vbzN3 zjX`DU&?!%k~>J-;p$Hl^gy<1QGVGAW=?Rm6mAarvC39;d?C zI)=lux=SZ_5Vbqy?x^fL{M4S-)S6aj4%(uAiqKBXYZe>WU>2IJ+GpTrnvU?E(2fIH z2NGK+A-;24N%iY%+`x?z=nNU=xWHBNX@fk5BTmk$H#z*=(LQA1;S4)j7e(1Tm>*5n z&2-w(;A1@OWcs0dV%kroxu!djHW!j|&*W zUUIf;a|so>6BjoFRY(h~KlLr=y6cErx;DI`ZL|K@o`9Sv+XQ;O(LDH~Z6)z&u|!su zXqZHVeRBZV-0%0m*T}FGE57(jzhn=`NH?HM9DMgE6a4(#GE4E>bt z`b&c$ISn{8;$j}q-)bI3@j~8T4dl^MDIC7J5jE;S+Eiz@cL{KA4pC2v+}iYHR2n%@ zzn6So&AZO)Pw>rtd(p06Ak@NR&3Ox$*dr;Q<&p#*($n|8PzI@2%@wDcKt#SVCNL{b z;aUj#1x}8MnlTiI`CvTd_Pi2u&5N6CUVayj4FtU333pdB#&=|vdFz+CIs25AhMH_p za;z`-F?byS<0LWw{#Z;@EF8Dm2O4!q^KCU)0M*p^*|C8S<42tu)*|-g;7e@OHTQjc z0+1Yvn|^sK+*t*|$NV>;wLpW^hO=SSlN2)|Sf|^ZrWZV)MQFAh zl;*vV?r)+{Tr>N14?FFr>4`r8dN$Qy3N6oWU!C=I4j5t=kKHi((?_Fy4v%ePHNBCS z{Aj8V`Z7t%&KQ}pD(Z{yS6CBbiX|U^kKMv%?I|NwW~^#vW}ya<44#fn{=DARRBkY5 z2Vog5(e4dowDIPOUO;cO@oIGTVW%F(>82cx-tW$L^n7xX=<-hiy!6 z@d-@p!qdfb%8jl;vII+eTR_|U0jt8L>@1SfE{#kgMZSRa9J#IS5WKA{JPNcO$UkB8 zYchU;TyT5>b(zFjDv;n6sB>`ZFbPB~W5K!w@e&^-UfP~XNyNncAU<=xW>8|KvQtK5 zN*?g!1i0MBWxkap!&cI;P7ECym#QhVP*++~Ne~dvXx#9;DwD)st&kx9MseZytsqPi z(i+o3kU+?TAo}-7X$dM@4BCfRbJ~Gr zY~+j;3c&ji>|9;x)J$XMURu{XLt$@;@HXHwW~=d5yk#^?sYIlX|qV z^zVF}*q@M=T&C8CoITlik^)b3zO~phh?{w^Fog~Ee8)Sb)ci#zG~msSS|br&bm5h*Z7ty%m~ECo7*0`UOOYsDmh%fA07!^n+``mkZO!wfcM6o5s3rMcO2mz<61b68DmlGwTSjV zeB1jkp_?>N$Olx73oC?hIjFTz!lOdkeO0*4OEfMGY4tBVM2jv|6a%o0a5{PuUI(0- zdqo)@O09VU-wz6-umQ>aMEixGpq(&_xKZ0}^(5#YxgRU&z|Tk4i7Was9pRlMKb!L* z_>0^!#zl}GL)-_fkf|a%lREhwDHfsY4^sHQgIl`13A6qxvS%R78B_dY) zLco!P_^fOAG*ds+FFi1ktvvEjiHRkilQFK7z!{DrcyW8?=i`#{_`LC$CNW5Vwq%KU;x^Qt($ItG4F+Em_^O5?=4QmH#K}Y<8aB@+7p#bh#Mihu zi+bHU#7G7Qf#ea~7RCWGbG$T(oaZv~Bbakc!Ir!(wR0t#H{LN5NEus>t&hQrOD1dR z6b?+@n!FvOR6%qv8^gm*mnzSo&K$Ghc_ROafux`KorDVLI?0}%eFDQ0>)0HJf&)Xs z2PmEtB5^ZZ=QKIGOTpuigTyh;e^ulhR+ATsUlyMiLG`RWo)8x2S$ zMPg)1BId20E|{%TgDianW{7Hwni|O~VJmAgj&^Pf!EH2H6>dhdMlAt1m7MaI#Rfei zCs9z{4)QMVkHT235qhD_9vd#m%{-DgG{?@3v+ZA-85eL`-_%CCz4BYPQNwT-cp8Io z3D4pnIS6ltNIqw-r)aHRV6|ip!SnXDGpt%l?mAYColjq949lmdrsp=Pb6f~ZTmT#< zW==KJcAt;%!6L9z4P5R|H$F&C)w8m~0x-Sw8_oA+$MX{e#wQCDFHjWfl9jnfxwpD) zmJVINvDURv4Rh0>i|f%V{hmS<*c3y|S|+ZY*#l*O-XolcYrCaN!2zL+H#vz8AgQOr zB9^ruvYSX2$vi`-a$y4N^hqmCvSHNeAeVkS+Jd*CXBydv3-UFX z8I!Pq?l-a;6WGu%Rxxa*wFr-|Hg5H2At#z)pZQ2A*h&){Ol~Q6_ZxyDh`zq z(TL1JtK^Hqc{;Ip?vE|yM<~F3e2e%_C(ndoCQjU!@toP*`nmk%QM z4-1F-)I}o*qw^7Cg}n=#Co2U*>aZ=;vfYP^;{##OQc)QZe30W*L_!jI;_p>EuD8q1O_O8EmxK5*9FZ5)666{X-pP>S$ze zLoMQ-F~U%7y%jmTc()}frY%jQBixYb*WxIecB=);MQa9hSHjI)UCOTw`h-Iz5Ql2V zlJ6OW`JmD{(?6YAKZN@swCtYc$}!v1pj?w}9Pf8F2URKypEKV(1vBXRPdPWVwmQ;3 z0Aort@&3&_{%=9^|B-k6AMC|HZytY2{+3~T-#`>Ep}Po9>jRC$sHBnr^0M8PVAgVVA1 zx|)_o_5K-PRnm2rRb|!L{?5DDrk&J1F?x!?f#@mx*Q-5C~B#n;LxP{p0?!YJ}TD?;dMR z`vE={HjWwGm$t6AlQ$RE2grcIXaC^%F{?;NRIu8!X9=ZK`t9iD{qy#*-m_}5?D8|s z)BQCe-UdUp3%b_PS3lIiPZyX8JZ#AaYA*v@^s&ynuk*QoYcQ~4rPimw9Eww!aw3;M-|+d5!1NHJLNuG9!Q<8BX$cC1X9rDNusp5D(E%6mSj6yidfs z91x3?TI=hpe*sCvE$^dS9p6>L&r+nCFmF3S8(Xg>Vak$2EK^jh@cB6J{qd9jG{~xx zLV!vxYRq#kAbN~6)1=@Jd@$uT1qJ?#vG7{R${{-zqmDT@H|GQN0qtZ>KML{$-3KLP7xnqT>;|@qkNWmOZD!!U_^=zxv$l25AEO^m%dO?c zEXv_(w9A{2XROm2?^5F^V;;g@VmxxB(6|vL8oXdNoXRU{yyCk0QAKhffB{l{Emu{6y40!R9mLHu*54h zqmGf@FgK|bI_eWO@5@QrtUfs*KdLBYrnq;Bhu>#k_1L;*Rr}Cpn=R2AEFxRpVIRLD zz!f@*a>ySpUK!^KqZH0e@RqXVPA{4Yiw=e6?X!S44}QX~r!w@a?-_rY!Aeu39e)w? z+8ybXO+f?MrPYmBDSW}xw1@#_U8F?0h=A`G3tJD7!Xc0ys=Xs?a{o<9y;!h($7*Lc zXnx*OB1{^M^jg9*8k1Q^I0TY;R#-mBv;a&3!>rciXV!{SX4>UXY`_}Kno30FkxY4t=-w&(_oif$Z^I!6 za{N`-3vVlfW#zX{173>uOpEHJ_Eq-wDQ~^xVbvgP1Ec|F?Zw%~&*Ywln$hUxK8j`G?(1lQkEevgXrc|xm zP3$glL@x)^CqVY$U+J7WJL;}=CkA+_=+U)v`Z6{KBqvG%XCm9pHHjEkj@7qNF4u|0 z6#H+}Wp@tbDXO@Ru*_PqmX!Cb-Fd{%vxiq8skvgeF8sK^K2w;0=;6~$PrVIHch&7Q zcNsBmgmStZ)6g%8LYcGH1&7@vq^cHP5lWgH1*72t8Rs_T9}~|?YL922OL8tJXDD!9oMHlSy)K?D)7yR|{tgn0Mkm|p6rmGf1y_4nj zLKvATFOHbA0#~&Z@Lk5&Rh8A9RR z|NbrP!c2W~8{-N?;5P_*%n zQ-DL?a#t!t_BH4;dTX=qau(OQa1r_Hx->Pug~#%9hrH4RP4|A0&QgQu_XqzXpQ6_* z`KBSo?p_+!n!@Ii%MnlMJ|=ELwb=mOSk3L@>(L}~5U&dla6VCN=Wmv3urt`a)l~%W z<(KDTVWOY%F)T(zR~obF4bH%G@rY9_=8$P<(dA_AC{X`?pLD?V`M_^ExGqCyO zCjKmOM=aKn9NRZfV&#~kbB2qe%}|e&#(zyL$vIIRR~C>=D2d+K3wM-tu1RxNcRfCs ztQrF2Gb7#6LOso^}CcquvAQGd~iUdiIaB`;)@XyiOY@` zyw0Z-5m$it-!j~(!t_%Y1<@AX21>F>r1KaU0mY0mU*;A^vt zE)jH1l2`#Miz}WUXXzPWV);-2?g04&b2^pCdO|HG)Uzc&j12%vxQ!hht?pTvrend$F3 z=^qaNpBjaKfg^sJ+M77&|6xY(D@zK{8t54t8~wW)A=^KPUjIprkm;*2_!j_z?$5O7 zUtox@S;W5v8`=NEc|^89Y={5JfnfWGl>NK0|3XdtN22dsT_TF85xV2Cs+gxbRJ8q1 zk1+FFGdemRXm1gbBTVb}Gl>sRvXEF+rIW#MR!q`XG^AhZ#MjRu@q+KR-a@mRL2nS? zNu8b?Z?;pTlR>km+px4G0l;@RFSAF+8OqrTp%YEOc{el#Z)Ps<^>0@h3oFyR$KdJ$ za~RM(FUN!X_cFe+cOwK23=5Lr(|Eg?D5pu66y$95!wMuKpPg4fJ_E%+Zd{)-nTj<- z<%`SY^M<`|nx$qb8{b!cM@XoXLvqmY1sF0W(V%Ot+}20?*p8+U;q`Ann?CE}v6>=? zXPvf!$$Vnw`l6GyB4-IJ%hY0a?0(>ID?gcu`~er=9ne9Ad1 zKr+3DFf;%#{V`_Izx=jpi#cq8(C*=B1?PJd59%v~7kBY|cs&5|o*&q6*EBQvOY@sD z#0fDu02X(0`Vm+^j6D(gXq0n-B1G#U#EMBy%IUz^~thp5GF z(#k-_+h?<@F-vRx@@i~M7JK5{qqx3l_~~1gLnXXg0Va7)Ah6`89a0lW7>?I2Pi3vo zrTt)MWmIB}kCkkmIjwyc(mTU|lMuhce?8iDOVPkI%AC)1X<=XhJBZ1nN*~mAG-+bm z!rU_MX-FRcAHjGBO9X^^!|%H&X}XK`bs|>BKI|jOG+%XZffkhfG<~l{6oy=M&Kj8N zFU~XByiqmS=5Zabu#beA?=8V32Ch9&wa8}?>k32vvpo|@Wvo>Kbkd9!b%;rI&FTF; zncQn~Sy)^8D_x-<3;7F`jfixy2Mi)uEbWmqx#WS>mo9Fr=UNDFSg>U%PfU|Ay7CY! zqI4wvVxlAT;!ZWaG*(NM^q0!ex3+8nUjz67su}dWMkEcImS{`M=)D`mug6u<6f${E zBkpJ0QBHRje`=}aL_L*hDMq@u8a0*$k~~_*sUT~ti`$IvhZeF%R5#+zjhz}nf|YrhWxFw&M^wy4aB|9BUBmb=K}Dps69m{f+qP=f z*-`rTv4nKBO_13(vRChRhaI}57b(ccDwuO?uM zE#vIjMLy}p2lYlfPmWxf?ro@V$*fg;=O$eQ{B0VX_ zbQs|#6AmXy0Pk?(`|mt;UxR(3VKx015NenJ)_vyQO+2T2+#{veh(JbN?>()z+6+^4~Ev8 zvt@P(OMHv9rZ)LX;D*pLBgdxcp3$4G%yK7}48hH_rj0?O>h;5Kmb*Wwn}5~alpV!& zj=RH?@y6p zV7(J`W#;h(>~TREJImBviLkUAH&kan^}h{5hlNy_u%vLRIow3m9z7XC$54hXJ5aiB z@<1cS@QP|g%RN>o6}4G;E&-__R^qB4DQ0_{atl&~WZV5w4O~AZPS{kcb^`n(O4R zO9;gA=vcx`ZwokDl(X@(z%x9(8Vwqobv!5W zLlSd@AT%If{w})`TQ~Zf+=8qz(%I2IQxMD>Sz1rkndvy)%eeb)7lUN7yYIHg5%);v zmsIDG^T_mPGoVq4=~IBnOT?w8G!nOymjjR0hj5xl=kvab`3pAY=eoOW0G!ul5z*w7 z{ADRybVRsk+|ABuy6Z33k#XUY7v(%T=}b45 zvkYKQGZ&-n2KQs*2BuQ1RW$1+>dM{TGxd&s2Jzffg*dptCeEuRMfJr#;01u5E)m6Y zNk0o~3{}P?!>^1|N>I4CvrrG#*l*W30_W5S%qHXw(rz!~vxA&w5R z$;zK$Hw$11q@$%`bUuti#PU4Nx+?we@#V!B%He!NM~ISBajrusVj&_j-QVw`fW?(_ zo*AwSMJ34iijVpf(W$Arkw*C9f~l;9e3fy;)A>?vn+ep&XKpyFzj43L;DG4N+=^kU zZ0uX)Op)CVkI>3sqUGnNU|BlDp0vUe53pO1h~Vlx7DUe#{J22-9MOol#~h}$OWPnF zD|;xiG5XE`ak&=S(1udKzaNt*lr*|APq}2PQN3^EgW^49|CE->-IkRQmei+aiA!%D;^hCqo3tQ=yd?Bb=iub;esKwnpww3whBDL}QA`>nO7@shqs z6IrL(1Fs_FK#3TmdQ^-=P;Unl)K-OQKNsr`i)jDBrkank!y7(^kDyi;5?Pph^c>u7ssI{d z4q>VMmYa6Jh}c?VD}^mxic6+bfp6Nn4|XM+Os`9dpjSd)uhZZ>v7%ID*(+VHy>A$l zDYwWZ+B){lbIjLlt!@>?@i@6I3=gTJs{Ry^7nQ0smq*q*G6p5m0H3i|_!m`}EF|t< zC5_2=eL13M`yWNc;Ztbv5aIj9(!evZq?AJqqm&E&+z|u;Tmp|68_eF={CQgw53!4r z%6r=g>Eo(!`0Dv&GCSsXVpC%26+&>LlnhrM3)~)Hz~~H;9uM4~fu&r%dq+52fcvQn z7p@%lZUsSc$r;zmyro$NQ3D7msob%I6!OaO`To*IGhyUW4By*PHPb|dI^>fsO~-}o z)txUHg_nq!0uI!94X%z{S7dfqW`?k5%XKY)*h*vVodG0xi2#Y&QIam6eWXujELBMi zhKf)Jveo%k8U%mlCa$Qg%ApOGI1vhG*U_sMus+le{=+AO!7YY?roYkygq!?nIkkvMnyDGn;XG(CtR*J1;7?jny4+Ad#f7HEIRGw+ptqlZscXx*ucXxLJ1a}Ya7Tnz}xVyW%ySrO(hh$S# zU0vO~d;EWmu}{A5h?gUtdpy8>t-0n}Gr<+}e!naX!2SX`lQ#3kK zSjegJ%m;w#;y0Nr4om_K)W@64Wnosp(=Iz6k#WI;CnS*P!mF=7b|m1u=Yh@m%87}j zz(hbRqdghvQ#q#FOEt=sfJETj!ve;)Mnz4D^etQwXCdEFwP-u$(>w}VgnKS0$&&sA z2`yN}9dnZc1Iy2bmI9)$_R56ElWOtu4?&7NL!LAjvcRt`c!RsWZ+CZmmrRA!?vt1rc7O*15j1y7q z-FfZ0VfJ9co<`UD<)KoCJ*}f4(nRjGux|^swzjuvY1z#ARY3!Ibty0^;U!00LaL&r z+KaLPBO?*we(wqYj$mIpc#}28N_W>Y@r!M2(>u>(X9Tg zp-K2hyb;sK_%$;pC!vj#m6i5y4e)=ox;g(bIw#R}l0XD4I7q#?%$8_U*@Gl}gc++!DOz&8{zeF|&GWW>(=iwV8;E3Wu& zbn)xRob7y9>>I-5U0qx4f>1YcZSUD4*wdt*gICsgG=00o?nIj3W0YpU$Up z(UipeWDOml$&P>;QTIKOARo<_?@7+psu7TN(AH{?WDj)nWSRbpO zqM7flZm;m^KYIs%u~qp(HC(=DJz;5$Du3DS%WTo*L&pg#wnGLBn9z59x zyS}D$$7I)3mOg|T?3eiMM~GtQ_voZ>WAplIa)41{c1;lU63X%%v~s9#t69^RRc!cM z(c|JqKJc48Ft2o3E<1FlZYEAp?z zNY-TVE>%5zdQfd88~P$I%I6yMzC`A(PRvXeoA=0LZcHa z1=frDt(XWvFXsCO@@Xf)Q*mYlC`>?BPMFMa<>kP7-9ztF7h~6o>Oy|j- zKXpQNS1x(D6Ueh5$RFGdVkYjEAyUuuPD=zE9c6!r+sjaSZa*?m+<#4u!%c_xjlteylclq<-N~-ch3um^ z=H1T=GP8SrQ;6a|PVF=-A#5sgkvRF-4ZP#Wnlr?gM)xI3e%2!^n#I6IUUPjeFE`+)Cjio&$a zfE|L3a-(9yo*`79XF?v5D!d`n6_4Tc7n$G7&StmYo z;Wl`$4l#PpzIt%}2)kQ-RsDGo5sWB8eE5Bgv86@m^Gj;%T1$zm$z|G#wxGj0&}iP2 z;<1D0@y+yUR|c$0pr9@t&jTomfo>Ye*cwutWE`Wv1@QND_fD4hOQU<^_!5>>9cdO3 z22{?)<5I(dA0IC0!IASM=1PuqeCdNXRw6$<1up41nQ%CDGqwGbLfPmU#iQ>b`m@qF zAfiJ^w3AR*d_#Se0iHzE;U&?iTz`)Bq~I^ zX*?9%tr1^p!9S;qMY5NKpJ9KCn{dlj99E{fRb3=xC7fKO3qRTH$D<7693D`ihoo5= z;9nZ>C-C9~3#whVjkG2S;!{D%HH<^E*nJ#cg-XT`fIA5(kZydLs88YDovA>d+-d76 zfo18JE_h4;=|mpav0k?{I+eqgOi0vy~H!C&Rf~>RGj3(bl;q`6f(^)CD}qsdXd=L znw&k|Q5;8A3mb25gQ7;%r;%q0F|jb?sUAh1-C4E>VFQsF{=`w$a$6Y`}M+Mi5jYE~#ASRVa3a&l@gh5z* z!4a_|BI5OfI~5gol5z*cI4hHrD?@+Mlog{v@B2uEPLeG%Jv1aoKFr~{=h_C=b0hwa zTPNKDE*`1+^w*9!?0D|v{awmvQO@Q&?~##_b#D{7Ns-YStkKYba0mO2kN;Bn*6{{x zcQiy9WaJMm9i(>Zg{=fG+w$?71o7q;?9$C8hu#|CdId<>9VqX|m0>FOVX_r7?Ult7 zmjw?TCYTf>EsZSOfai&|gJnjVQ}Y?;Qb&QDF`>1=V%2l%ob(^UV(0`l+K78sD_~L`q#xl;)ZVILWaFjcRGZ zOss`kRZLmIHDS8GXI>$15DkuZ*6T#^!$;h>cA|eloK>Pjv!Q64U*&4wz&aNVY?eG5 z@BE2u85^k=U0vwA2u8!kF$vlW$ z)&u4ky(k*NNs%G%B;ln=Ar+x^)`iW%H#nijVJm+oiiJ3d#5{PP2#dSH@ok}4HDLku zu>s7dk#W)~cqn{2W4sIC+*&ouJZ*whIvI!iV2~jnb2vjoviyl&06(%GzM?KQ7g^fe z4t?+L1oV--U zrtB*3c^DeAOc(ZR(_S>EZsShfa9hi>da91*mmE&VM!m8KB$x6|2`-9T-&M!U6P{#W zUI{*O()0hbM&kU_e4z#XdmW$z&G{QMe|-7FC;QI{?BDB&|M8<7{}9=KKh?jB>>teh z+p+$&y82U3XJX-G`?DAVd~BxrkMipO6Vut4>DfQ5F{~eT5GOkuAv4=YRmAj>Q^Lgg zvDfPVsbT0jQGp=q(kk-BYX`5J~hcv^WxR5vJ8v1#%&n4~{D^1`Dno-X!I=cM3$D%j-9 zE}gkvfcLNNj@BnWQwa=WmN)uC_pV@`EM48%JsouX8>laJ!OQcj`~~WK`4{etHm=!{ zJwcK-A-LXK*NNW3GqP4f@-l$7f3*e9t#GFWp6xPoU z4VzzQXEO)>LFz+w5i#|30|=!exstvKV5+Z4YjHKtO*?D}TH@_ot!$8rqtFnLFwxY! z``Ou5gX+ju!Zf>n_#1 z-oj+N4EMUqT)G2JkG!RB#_0~|`%|sTk6ox3_;i%zWeIMlpBl@}hD2))-o6IAdZl;A zT-H>QU!V;PD@PcS5Ccl8F*L>VAQT|vfT0J6-iTml`;{xh9l&g64()3j+C~p+nIgCi z9N6tr>3qmwJ6Ry6Flqd-@M3>|&AW#jWVPw(#;*VK|Ne!oV85I{%;Fi$KS6)8}z52GfWCd?-mjG!qWSf52^3g>+#K>>l?#VKjN zffdlPl|Z;LG>7zDkHQfdA}YKHk?lmtJ>xj{CUHS#{vqB` zSL;CFArm4Ed{d{%RBcdSbq>ssLhf3T8D=mx+$+a4j@I@n`MI(?oFi}0wE4>%P|;3? zBku-P$N_W5w%#K>Y-$A%36(RwDRsVD$Vy@ww;=^X>vGh5EZjomXi=Gxa7Fu3gCDwO zq_V%_Rw*Bg%(F#x?O(PdV`5YMPT{2lvtYa3Dey{}QY?C9E2VFJ2_Yg4NG90K%w??y zvc6E&ur+BVUw`gYZV6m3yboqmR5L@?U7^zd91kcL)^J2KMT)99p7bImWf@36Hb`c+ zDynYi@>O4jG5T7?>q*xTyi~85kMeTywH@QyZ>3hdNOggFA^UiPVpg=>Gww~NVJ!WpGF&rg(ZXP&V z)oHto25tt*62}syE)uTz`XM32PqMX&=lLL|81o(&=v7YjL{*lxTCT>03ZiuOXTS03 zaC)W+6~qcsN+$B|*(evYME-~vgxXhJsC8G>%Tdq>Q%RFX4?{|j65vi!IdV6kHVwG< z4e^{p6T==$D&uH(j(f9_D%C7p;*(QDiM%I91b;U=YXMa?KP;ccJ?=<~jXW*Go)vD$ zbF>21HuoO72y;m-7;Y+~U7#sJgGyt<8!4XU=0UlS&)AeMNHmL7D^j*-9b7VAYrcO$N4?n9BEf(h2C`aV8#`x7U5` z5$vR2$jS@2Y3_Zf9KoG_ga3kpc2LsaRfH(#@?(;+NWiy%5?SbRXYY0*q1K9dOXf3( zR3Cl<(zb-lsLONqg;VJssz+>9CZqVa$0=h^*-Mrk?|w2!JSbUl6zeiVd-MR9Kgs2u z9^3NGda3ZS4FQ6*B^69BgnW_o%Qy!~%(TqjI&Mig1f2kiJW5-Cn3Xco&v{_5lfYW9 zmeCbR5ER_91xqqVothKAf(tvMX~@A)%qyykH&u7w3=qD|NJf7rzBx>2QvSbb=3RRow)(pFwz>Nf0wZu(0=yw}v3a z^%kDjQ*mqbR2c)!%6mhrkLG**+>8rhTakR9^`I0m)1Y3%g$m;2poHnhoWtYK%ntzE zxw=vkicvD>+kX*$yptxQ1Z`#y*n5cU?ZkPZEXucxt|f z@eXS$6(x*kVyCe{ewaS^i!Us<)}{wKCcnXEegNR?tkwqres(z~v~UxEsotyBc5%Tj zmdsVWA@U*LyKWQX4CA`uFf3Q>B^^5j3J8^y6FC^s`l(VC&0>BcH)~wah%`XGFstD% zvAMGAM<0ucOlT^&(0R~^YQ@LC9^`x$k{!h-{wDy^XP!>Em;PMfm5Ei(8~)hvHse#m z>Xo<0nfJ?~=tHQzf{VVx%YM%w_5AVkhqvy#Ki{j{{m)Nq?|zZLDu4KbElj;9onvW^ zs)qP4e;%=w%JOPY%1X;}SbC~0HyYBYJGlBP?CO=;9aB|P<$j4aG;A2QKP;l8q|Xq6 z68S?wHVy!b)K`S*XM6$buyuH__DfwagsMFxeDtmd0AkqmhU4XkdpL-GGocWwR z^;nJ0Rpf0?LUwdYKj|}3{xuB^O=0lVqaL$_%NL+oAG3+5`TfK6QFOopL6c}Ihy`yH zOk+53ue5>5Yzr^S5QZ*8`+q--4(yWf;>~+7JKAH=X*wZv;OH-9#WW{3Dm-ytR>hW@U znmjt4iz{2Wl59>6?+b9i5iSyD7Gc(>J`5j$v!_FHyz3zT$WjpZCu9nr#+c_ijWNb$ z61P7LAE>-pWBU)Q+@@J&!sZOO-8${`u(h!SYlIGPGTPWibMyN@CJ|!;T`EwFvMoy@17!-L zTGGKze?IQ~x#CqSE@!oD{Ee|*w!*7Rwt~Q|jk^ZbRiv>8V5)a>8sEqqx+1Z5nzn=z z)HL&MW{Io1LRn6tiuoK^s>I;sthk!lHML~P9I??AT#3cbIz&QEnwD4I5y1Ig*LVY& z$k$FUKJdFr%z$V&?Ye81QaiiXEW(f=GLFq}MTP-m!PR@^snH;B1_eP(N)7Uz>a#5~ zU1Dp?LFJES4}k8Rg8vxAmBu8Sd-nmHuePWs4~yaB}#NF1ZKA}f|eqdHln>2NLQ!d`nLm1FT8 zwBm&sHsEi;n%5nf6NSn7!<7h$YdW*x^egBWB%*RuDz%NKarx9{IlFXa?LFnSDOhb> zCN?JrP6f$*8^?*B?y^~j!fBfCce-15dR<=1UpZTk`j^U>jA#6Jx`7m z1JZ%GKu590FzSNc)zvuXgnzn}^G^NP1F6_IWfm2qTaf7;AFqU$r+h6?-EmfP6)+Fga`t zhOS?jl}@>r=YoYe$(g5H+gVxzD%;|OM^;o&dXm7SbQ!DpLLXX%095Z3k}V~TA&p74 z+~6FXo%U?*Gr+3+z$2w4&G_)g<3?w7UgAJ?$#fZba?xhQ54=bEjZ5k?d6@GQfa6gB z0XovM+Ae7Lg2WYH7FW>Nvmi(tSqk{=+xMi`fQE5NBBWIWafo(RozI|XdbpG16z%y)fixL9*(&4AM!)0R=ytfWiccbcsUdFAe` z+se;jxZohHKyuF=WDD2g8iOOd2|xRT6%@{tpg)6Ed)^rNi&b;;r=n;Y+Bdd02o=RC z3o0*a1pTJ>ktr!J&O~_c@;H*_E%m88fUMV(%6iw}0_v%|z!vTXdi=PP&~e?-FB>@s zaBl|PY&~#&RlCJl_{|*nN-af1y_Aypp%mdXC~yuG>gyAv9F-NIobA!MYbIBWi)s*7 z06^RBBF!OnA%c#qviuN0z96_AI{QLvC8iUS9_BXFIzJ@@eWESz9adtn9*cTI;%(BN z;5#h~M5wLE-T}UgeFZ5nZj1a=b1|cYs6Wzrr|`_r1BOP45d7oisGy=28cz7SetmiM zYMQHE$x#sOS551^&zqAztu(9x+s(ipW;^*_VyTg~#}9S=5tKHw``>Wtude$4U}E~` z;MpJ8^MCQtpS^P?Mi#(dQr({d-oMP~0|0;95i4uE_u+_rRlh3L_t_J*Ry5J-% z`Y7TjMNW^sqKl|_YoTp+Tp-1D)05Xd!u`rr*_3Yau{`ygi_@n8h4&5H5^LIIM(ag^> zu2zM>6YaeD)&%`4vbOikLJ_#&vQrd>nhxm244~v@R4*`wlvVfvNS2wVf@nH=!KpR7 znq`&Isb#`5ZMlIVUuR|8f!POG6w){c?6ku7!o7N@ZU0%+* zIEb`Ck}<4GU95noc|+r-LCqgY##5*^W{q-M5{zMY`d7yx0k@N68{w41S^0IX<7^d{+zVF5ZL`v7UU0yLe3O{BMR}ObHK43l`cD5UqEi#2#1y_O$``(S8 z;mI4J5oz(Z^S6<)KgV*J8Nz7`NQS2cwA_1*ZT>=f%u zb^~Fuj(bhzD$&>sFj?D5#>6|LXLq=uCOj`!h_Y$l(4_r`5?=llkGTq4O&q25TfTJYy^S;}XTVZ2KqK-4Ui{d*)+JxS+gzHq&mM}_lhQ{jA`WH$a7^juDw+?_-lDWp~NS^y=U152?N1BtcGjKXS1}&$%k!z>VIc3rvt;wI*s=5@nCEY-qHtX$0Lk0f1 zMBhWDRPq`!uSoUbYKjm2`q*F~ZzQISZ9d%9QF1r7pgJ1tE!SC6TIvvWcjiq&BaYs* zVUAOPr*?3r&}}BaDpoB@E&32*LWuE5l#yXfe9^t->!_;zsJV|gD|-}r8YfMfq|Y}T zhth>8d5KV)_T*yvFBLkV`FY33h`{FFxO5=1qEHfVm;9ij1$+PP^8L$e^}plt{oM!l zuWhnFZq(nz2>=_@KX;%3KD=oE*_#6V*0B0py{VBXTz1%xag=$4h+Hq=2w-=(7_As! zdqz)tgCjkNYKG_c7*tiIrP=hgi)$G}g<|@ouzZQr#C-Kz;~Xw19|TuuNta80hE7_e zN4pw#&9_=+Dn}`2c>)XOvwQ`ng5!uYN7T)N0QHTzqaPm|Z43PS`jGNf6s4@6Vxliw zi?*;uXJE>5Vrxv4ka&#N4Nbis$;*^z)LMj`t~`cJ+toDQAIz`0?+CSWYxz=gWB|9lG=1!hXecC&-sjE7|VJKkxQ1o!Ohj-q4`IrB>cp>S{w+prM&t zruk&&0^M;lK+`dXKfQA3PK=PGA-2N!1q@NY17Acr4hE`0%B588ybHPo?!Y$DAyByb zbG=O$+-9A((FP~5TL6;H1=-?6(pqz271AqL?S4lHaOVB%J7|TPamA51%H)_8)Hx(x zgB`ecaeg8UBvC|?e#|K7B&JA--b=5Om1CU`J{*v*=F#_Kl7yZBeA@YM{zb&bC%xj- zysQ917ROQI?xA-cu&5@iC?&FlImivW7yWF4{8|k@XV_>ye=s-}ZLOHljc$<$VmBdH zUUMO)Qe3sPwG(8|k;i5b$PSLP(WdtU56VxEXu#f8c25DO6+ygLUuw#s&LVg+tH0r+ zMXQ?E(LFIkhT3TkZ!6nh4Zg|g2O9u=WD=P~EO=EXPh5RwrN>yQ4cbo7iM)fOJX%VuK{WRPA+&2 zJF9d(($HD0pk}OZX~N&sUG5HGd!!U(PJvNstF(8&K)9VWmaR2#UotY+IP+btY_SaW z{~WYX*$M}IAwyhmS!z>7&Avdrv8Si-eNpzHL6xHvDmefEZ(88Ygs;v3Yp9n+A{;g% zi>;FGT{$z31IFU4XqIT&ia^=D=PbcWrv*jnex*J}BAa@sp0=hi)= z4Hv|#K*jKxNg?QSW4ZR$b@{M>&SsRv6H{N~g8Qg3Dj(wOTq@rDBF6aUe&$Auk<OCmVmznACIn}8r2@0oz1hTMDJ;;nQpv2Qh+C3V=J7${CxI#f%>S31+FZu)Rt=KO%4Y_7@y{)140G6rRi!)Hs z`bm~s-#C!sIu{YQz!0I!bS7S%TM_TE__-5a;lZSIj0wCiSs2aR$kv=N)S6&B`p}LL ziAxaF^)C$RhoMU=f{PVR-8bEj@UjLrx)Ltm-P8mOW3azjF!9aNnJ^=8fj7t;u1IuZ<7& zMq~^s*_eWNQowW$x7>mg)+%aGc$2TIQ-uYW>@IoR*qp~iVsY!CCXi1;wC+|w9578D z-@iCWJ_*KkvKj=!6+N89Xc@YIMC2d}YU80Vh0M3mqvm7jncw34L`46BZP9OYX}_oe~`#wK9^Q-*Z5%)W-L|JMia`n%5Fw*5c@Q z2z@CDzD>x;8D8QAmPt2uBi}O9Dw*?+-qbu&<1J_^dHT#x`E7@QF;Vl?oM2M#M(aaO zLM1qs_UZbXBRaU%n7}vdrRwzKQAUj~TkT-igq*{Sj){p*y) zfCq7+8Hx9Xr+9*T2qgw{D0@{ZcRde-Sr6GPPwa6%n&M`coNHu?y(;nbL!cu>nkg8I zDPpJ`H_-*mFZUfeQk?+FBgD|Asyy!4CuXEjM^UX&3ZxKvN}_nbg|_e|azyRBr!8?k z^k?A$P**n)m*cp=6b;6`^=R^&$-QqpsJX$zg1)_q^kxtI%sBLBQab?p;o6K=Be^60 zr(YSrAhLl*>;DUt0RA$${I8&r-(ln5C4t{j<990IWc+9HGyw3I*6~kkJK$q5;O|k% z7wO+5fe**bZ<4^*Cq%zMU~XsVJ2e&ogmB)5jk_4s<&L{cm!N!7%|e13t|&_wKVk<` z_~4J8Ni@S`6BeW>KZ572U^xG#$(D&!`*_k+U3M0uE3g!g&xJ0tnxp~|3wp(Lq$3+B zedrPU^>e(^=(gi_d^vt!sL#(IKc07{yyi z5;O-XS!i7}SrdMk45PRIO%ULQfqteQGpKf0F~VAj^!pKY`6{(U2X||*6Z5z86 z(lSxG_v$gn>(a75nxqj;wHl;zWYSej8y)xA`}|_p;`$j$2gg+c$vHpD8!A&vGnw|4 zerRVlE$sQ3OE=|mX1~RkW0w1fZqLlNM;+F{94r@>>V)TOY*mxdA`Q`SZSgM=^*0$O z-Mk?6-}H+I1mMS`l_Lhym-v8RllX)*)MxMLf?Lw7MTqVVIn%le?RD-YykW%{r9S1* z8~Q~nrBz=Pb@)uoicDA3GaogFiiP1y{6g0ylGh-Zv7o25>fq}o9b^4kWxD4o(5ESSGGB5 zpkrXur(izue!)akQlPfQq?$eemp|)hZl2?!t6D8-NkgNLKv^<(5^i6|`?d*3m7pLX zX-K1oRo=TBhTe)cR%x`W_zj@U)zasPT$Dym$KblLR#~;j)zN7y9eS{vlBzW3RDiyT zN#|Uc;EQbT!Bvp(Dou5vrgckCzJF1F`Pj5-+G5-E=rKD!V8>FBS|-IjZ0Z0?zF&ut zmi)DW`2a}OrP!AH$O!5#GXGOgrz`w$_X(BxTrG29zR>kk!hEIuYW%>c_k~iLl_^+}A?ypteTSY%wPOJg8=}^qs%RI+Fr~iV~5b*Aa>&S>!FtOr9H&93XLD1gmc_l4-I6pl2=0yROdpVXp00$9F> zJJ=gK7$~wEAt#Fy4qptY#SZS8RsolGIz^m7uxFzz5EhO0cTKrH2nB&v_s~gM+UfUd z0dC>SRt0&HX*wjq)i#T6TZ<*;%=!#}m{uN@!oGyF)fQZFh?8y7im;*xdmpR=Bd+6r zyxOF9M?_=^Y;MKz#}wtsQ3!2(3FX|DQW55Fh(dQtfjAU76hg=O87x7FtvpfWLdQW+ zL{?AoMaN#@TDqCfib5gS37Ed$`Jxb+MkOb<812oX$pUhDF3By86!IC+pWm-^jA8^6 zCY2l-?ShBDKf#p>8!5={5HSrKxt$|t1tKynj&8@4zRY+k6#T&ILaWb4hGr@z2Q@u2 zS%)R5AGpWFAms@2?J4}UtEjW_b@a7P2vuZ7F+r`FFM9Z%mzik&gb|%%FaZ5P;PwN%*<@VHM1srd0qzP~LhDKMv%g zz^6;t{s~d^xyGq!tsIFX&di)6I+`SI%k|gt71Y&M+t+Fx8Gf&ow;I2brHLQrw?8R6 zGC5@Avrnz1KJ9IH%qhwD0`fW#)aT}sPxc^yrk?;$H9+gYkdg$hPj>DvjY#{j${@CJ zQt)6q!bl$|88ZG`Ys(T=c7JfZwN)}6v1o~0Q|;F020QcmU^xGTifpR|ju zBU2Fv+vH>A>N&}|Sp54_eF5;$bRP3Sa7WPybKE1sDBqQ;<%f!SvZND8z5xfL87Jyd zTP%Wi)2T3x!{D?VGu*o`#e+I1>Pj&kD3&AU@zn+Pa7RB0CIbZpK$u<^zQ?W_RG(-n z;+)d);>&V4Lm~+=_aUL9Yqy?fi?>92RRjX;iB}+GIEWhhQGS3eHHLERYE4)LNm34q zPHQiPSSmf+c}E-|XcG4*%4Zt)UzZB_%G>=fi}2qx^UJnJ*uj=0&B zU_JK-LhA958QKmco>FWh?N0Po(&DIkh{Xlbj*`PftR`zIjHQ7J@Bk^we#9WLI`LfC z6hlay6cv+BYLR{SJ@fn&|1ds$m5Dw;0x@g<%6Ofk9VR!go|OCwYZkFG8_&>4O136p zUd%I8qCM>bQER*gYvj&GsA8o&8CgPmrgzNIEs>N6;T8%QAlZX-c1Rz6jx_+0)phm_ zM)WtlEMRmFOJ1cIS7IJt@)9Z6qZbK)Q6HS{jCzO&#Qha07d_EnT`Mw(uku>Qz!2I8 zRy<5n9O{0zoutrS5o@972)}`)eJdkmk2}Ja3C1KU*6-pne=gv%U*saG83D=*^(xBp zH42ExQ12&wi?Rs<>Xt>Ec^ijQ3(=4Oe%dP}85V0D0HK3obgap5#`S9-P&E>p^MD7Jd4A6!tF9Kcr1~Q*9 zFSIk9XW@~u=%!gi6iwiJOEaTa)rK5C9>h&=JQK_l?i9cS2#Ge|BpVG3jVrHL;G z{R0L`BMvqz$l%WAsF2JV98flDdvIivhZ@&G zblB+AI99w4MCy~Tu8W4+rohwBLWIM#H>aTxR}|f# z+N7ZCU{e-Ku=46{;s*R=E!LCT=}y4^PA0eBcT+>3JX-%{me>xD8PFi{1&_)}p5B(R zrJp@IZ=t(06|Buh%P`hN2bbkh=-QbRgrCC?4XAWhc`QtPy(F)e`retw7v);4{33sBu` z|C@et+m6WO#RNkgT=6>GKGU97Kra_X6p{(JZ!2qWlH~B4u98A~m`4j-$f>vdlrI!f zYAs|t7{SD?7Qpt$O}#1Z8iF|tkK722CUDV8h8FXCm>Tp+3L3T_A6UEnq{0ZlPb!}( zh^ilfSw1YY-`&FIy`#ap**MNL^$CTSb$n{~4a>=x*89#!Ck&4xpM9xWmL}B&6W)w% zUVV6C-8*d^7ZP@yj3W7F+_pKt#Z_htO70@qQU36ngxMm*mODET5*OUxHN&9c@k`l!+=$ zhWG9}%{Wn|Tj4ooP^=WHvP<$hLhC`NP~D+D$qwB|X~NvCk``#@F&^P|=Hf+CX{{wY zg7|13A4oqU#_G?j2iqkGFGlRzz16?D``L&xKm-GtE zt#aNRqlARiML~p-#S%j~7>6#xm6J2eK!US%Tjq3^-_2KLb%-#p0yP=miqPg8@Q$X2 zm?V1r;>%Q&<}`U>%__vt_sHtlejpE}5*`K(>pwppSVQP0iyIv|N-;bk*n8}duP9Rl zmXG675U<_`%5Z2QY^`n_eS% z+3zJ*ws{q$4ewH+{3NE}bWc67 zEdbv$is`vU+6c|aBQKn4|@Vl#*Hi;nFB zy2Gffw6G4o#P5G-k$^Q;FX4AFTXpFfrq zlXe~NGH|_uy|`nACIwwz30u)&@Ynn*3MAEZAnyR$F(eATr3Hj1qsE)z4a1?@7;O}x zn)@)l39%DzEZu30I+cPe$vc zf=T*1>#k1vT4`#)p%gY$l+n*}W8qSK!@Y-gh|*pE#bys7moqfS!7jsvpv8ZE!Ff3l z7>k@+aC5qLInXO<4px2KP@rYboruep@9ZP{xf|QhHSyR3V9HCv#!^!+eq;Vq)t!o5 zGb}y{3bue*u6|c)B%~y!O@!s$DX0sWEx3i^zv14W#)khbxc47ZQ~=k`Pg4>$F)=pvpfW=AQF!q1IpS0^{PYr! zK_VstG@aV7F>g>p#-*q*CSgQdzPB>R4|cgYhGP{H@cr=KI63KR>l^!#ZkoPlba!{7 zTz1&5CU%t3evd+m<~e!C*5R4a=~312;0o5ByGU*hm&EXX_kMR1EvEoI3anN;`GI@l zi~O?mGM8nP4tlW=$iY)no<%Oo1KGOHzeHdxXa*>!7mC%4BB50Zuf>eJCKd~+7$R7? zWIwVSixV}N9g@z>g&-71kXQx!CQi)VP2teYRip^cIw+&3&<}vHzIJ{u|8x*$;srD- zR`8uk8vcN9Nwkjpxhp703>1+6=sB+qJ5eSTi9S&qmYK*P6LXqi<@4!!+Ox; z`ztgNkPeuCb;$9o_3NPu?&kR!9c`>X_Q82XDDXsnc19pnhB|gfzW&Pv|D5~;nB37w zN+1HFAho419m99YWNDhnnuGHCyj7^h2DkweUF$+_p1OqQSOdTivLx`FG!=e-714Z^ z{*-ZQo*TvSx{L++$B%G6nVLUCw=^tg4Y(3!WV6r4t5fCVveEPCWv?`3 zS=(F5>&@q>SXw@x>sVN40%Jdm>Obhi)y?bHRc4(`Rpndr`eEh3io(2sKs<~?qoWVd zsLz1G^tN_m;5hZHU}_pmM>Mr4)lZ_Cka=e|-bu(NfBvz;^`IPj8+&S%-p69M9tfLm zND=FR9hREVJG}w!FrX~rRNpbISV;0hlJL_s_LR*f>}=^7$$<=P)W;V8evddAlAZwDeNGlx^acrjcb#UZ z5~!0q*<_h1MoKY@u(Rqm_fn1u^&$RgfpuNMu-w~^RMwPlJ+|8Z zGTTr+J#@n+CN`5_>6Uka6A+OhEtuPi9Og1s^C&C18z(azJTfKKR-sfU>FQ$ah>gSK zA7R0PR!9}8T~nZ>O7+S5`99lT_vndVlE8_$jbEr4B0_2a52mSP=a4&Rs=4%eYs{s) zltzp>G79^BEgeKWq=YjgGzdfRT)(o)S%~i;hbuCpHEuMd8Xm6V@RI16e502v@>7(kXUUT4iw+l@^*26rn$50}`ZTNLTyC5OOmxrIM|Mh{NwtC+OlPrnPe_~D zE_j-JiJZK)YT-t4i}}FCS_{Zw_X1O$RG`a8OY@j+3vzcnc@Yh#o-<8eMy* z)x*K>6_H!^413N!2|8jCJuox{M@cfNrJ;`-_w??SD;y7-UH)1kdr8LQVPo7is%>G+ zqBE$klbJXfN^S;ZvgpRuDv?(#%<#YK_liD6Lo<`n2;tHIK5iwX9zE*bjJ76Lv2kW@W0ntx#jV zFw(07F*g#lo@(B$`4q5|i=Fb7Y}Y-?(N(qI2_xy_v%XEiz|FRlY_ zpPYnM`z~x$DsvQu71d@>#O^!QPDkdf?;N73qFqwd<#ZQ+%w|V%XN%e-{sqmcZ20@D zF^oq}a@v+keyq8Ac#G{Y33|%h`59Y%+D3t5ool6`u6rckY zYI^224Vj8cWR!uk>i4q8e4VRi#${4zUT&41+0HwoWdHzj~MbA_j*Qzw5y9Gjg_<&nKe-6i0g7VG@Inph@ z_%W1Vd6+sCoew^gDptLTX+ZP&%K{z3&%-LnMvC$sATRG;S1zTjb)vx_)E1lg^rby^ zRRL)ef_0W*u(3q1kxywun4y?%9Rv`;VnVNxbS#)z$SYs6hZj1k%}%X|-fz1IixJDm1ua%8ek}$Dk&Ed&CD1P|^-PVR$_!*S#zl6hKZA7wCu)!nu5#zQ9e(HjE!0$%tjuQ zB=+^N#rMV|BBWdVg#i6Ef5J7Pu#CDJaYgQe1UmT<&;{TNcAa3(K36n2Y^5M z4UCh7Gx8tQBlG`67wYe1@1LUZ-_625CE=gVCl=uf)o&j@cP9C5UF>ab6W^N1gW;WApDf%axGM#VQ8VrF#1C|&y_PmMTnRQUD)I2L zqI1|pD`$pt0Rk?rU93TQYUn3qMiazDufxq}ldqRLMBqF`Ek+Jb-ZW;Np~AloZSS&J zDYa`AOCl6S5`YgrR~W+9Iv-aD>7x?C@!E2PYsU*yU~NzBH{$%8O}-(=?%Fk9R>9gO zkmufa{;a!pviSjD3&KIutEtQ`v&c<2DSAt7pl=mi{7JeUG5<}fyGWVwgLW5rs*FhM zNDwkjG(pBM3S90@XtlQPU{m^!5r#~@Y>F>JPNSeb#IaIG?>pV-HuqL+<5_)SM@eT@ z&w92KYF_IY_r8~ixEye5PWx7`kB&vxEpKgaHg^as=SLHvG4uD3Y`@xCK#1mjo~)A1 z%uBx!!5J%w_{QCy9??ClJLxGW47KKFstzoEt}OJg4Z()o%33dI0kFjd1|`3V8k564 z?y^p&!rP&v<`{Zu!4DF;^4>>qN?e!oFLeMu>b$COhMpn4E zGD>>JnjuWsOhy;VG`oB66oH5df||132Ng_j$KZJsfJ2bu!mq9=l$Ias5DBcN0a`wl!;ixg>12-OSJ8h+bh6f=zlm?(ae*q2D*q93nj zPo)=B7DD7WNe7h{D6f?kU@MmpE1R3ip5)otEwieP^aH3qZZU1xuREFR_~GzeFop#@ z>G5I1N6N>+O?nmn6eS8UIsU^9G#qIM}Zt4tg@iMdpy&UQ<>VtJJ3t%$%TWdbCA z+6r!iC(rxIMaX)CQ#@v2Oscm76F$VOLn)h3i$RUHqjA_?&dTp=yva(<+aR0xW;9%) zCGof0%9l*b(vY!ulxc@XMzSn<)|d3tgL6cZ)G~4N$T+koxZ1&EZ$yg9l5Ly?C!|kj zZh;X^Z6Q~SZ=WtD@(tBk;E-@f;SGQOQ6yK*qXPeF>SMbV7p@!*T-k%eH4tjlar>Gx zGA>knzw}vU{lJeYDsD4bL2>T6eRveD{Fat!$dbWELJVaxUcmIb63-CkbwcbV>o;R5 zFvhXl^diqo$bDmFAEM58ljKqI@3Oy!+bH^TFMcgoy3*@OH$qLI6-P2l#r}nDd0e_@zW6XU%o2+2xott$>~g~DiRCa10J&h38r$hL1BoQXYmMje++a> z%!(t|O}M!h^*9xu@)4vznmdt$RW54~k~p5&(zqmp+JiaOY4d~|My4T{%~r)pfJM#$ zxngLb1Qenl9GuCk>Qs5E=}9Y0YK7m{notgQ=k@uPz%4W-jJc0cC*Fx1#Fx3x;LYSm z$oIN2$7SO$ibQ~#>>z7w>KnWJ+>Ep^IYND!Vg0;{ZieRe=NpA37j%P(396Yt2_#bl z@5(@;4ou?c>Na0xa!wk&2@%QUnLf73>{7TB%?3)1EafL-@@0@lpJ;`-JVwYs@i_XN z{5y4n4CUm*=I$ZhOC#hfSfG&$j%ARfWk(suHi+{g;~N{B;qCTT9A{tkESn-3Pe8C9_T0$hOHg#=PQuMI;Gl)^M?f)eBEqj za*y4O)jm=@GuVGYUNcTIO797#TGLJk6&A13=u7t2^C3yw07w7IlYSLz%D5+AddRwZ z!|sSWbPI^-uxFWders7o-l+0eBqB=YjhIFrnT`b^{e@|DqkwI^Fn5bjY>FIgk^s_E zNw$;{Ip6wOx-7s82Fm%GGW~6#;qGS%NjpwTMC`U!g-A0+qCA1~rTH7Jq!{N@$a$a< zC$3GldvGubEhMw|z5QY^`uQGI3RPV_i{n?|XL*3IZz3NbSm6lWwn1c*H&Hek`e&k! zQCkgkpLK2GC$Bhk9Qg~XxRjTY3?=DS3gB}{Vb9ue!te=GyFZuW2abb5J$W?ibSpz$ zpiY7;V1IRG_-(?MtrXYiKgq1WF+BehX{kTe)BllKf90Z>KZDzU{EL4krsz^1#iLDNw$|{!X}dtBi{# z26urBVv|lK{S4+-BaVcX@M?@@TRmV=&~0e6N1~GxYZQ9$MuZq=(y_CKiKYNy!KDA9 zdm=Nt>)7G{L<_yU-U~$h2>~_OnJJL@RZWH-g1`0*;0MXAp4@wIV!YBz@L(aH?L^B0n~S6KuhO zl1_oll3z*MWof0oAB+9D%fR#2E{8vylZC(;^Mlg|)Lv=&fIKa~@~5J)&5Q3P87tM7 z%2-1?Iw2Hv22EHliN`M}GK1o#?n&U8=+QYqgu0eO;k@ChwW>26>M>P3==b7ow<&j> zV{$Cu13pZZWEk@SX#N2TZ+5+2GcdSe^HQlPsDK*#<)!xOA?UOL9q?4gGr#4P*2 z<|$Slm+w1oL~3#-m-BVRIYiLcrt3@+#|Zt}0q2+$j!2${iLsJPt>Lk&eC0OFs66Nq zqLEm{@hN6Yg9lHjZL%ntI_P?}(w0-e`OC`DzhCf1b)+`l)(fgyNmu=^=mH1G^=R5y z;fVdd-tY{h_IF~f)QX}PX9S3p^;;X?v6^BJIZZ{hrUObiHpdF3Td(cYCaD?_En$nF zUj$ErI0&PcVaHnAb#?nvf}o|fqA>iXP526Js^s5cYkEk?4A14{R>c@5`CFHbqRrH| z)X$(Mv{U4<`F~E!JlNZ2Dki?fI>6C7!ikQ{qL0y(4M2;)i(+x_N&5qpQ@RHI8lvuF zw_Y?Z=8z2`?Zu~8(Y}9L~vXI#HW>g*0&oQ4zZZaDciy09mg%9 zIPp9;e2iL3dr4YU+Q%24Gl^QF<}p@VVe3)z)kduItMRckrZGk$w}3}z_t+XQhc}=P znAnKyryI;OKonWl(|0mM>i2R>i>>43FJiOc0NSEx?bvc#=mno+a{8DumBcHTh_5RA zQS@&s)xTA_8>gSTw;aReqO}giVU5P6Szz7t`|sDW(Zm(BR4qfsa}Bf*uQ5mQBYz_m zKSd!^H4_fl!EwgKL2$YIyF3=jCqV#-aS^4385xM}sgm_=wA0F{sKEg8ppgTY{Y<(n? z?>7|l4j8(U;^4gMj6w>0FD<5@7hW8y&Ba3qr#lnk(!7{tJZoMXN2Vt81{MIJEu~@Kt7=#=Tko_$y#%Bi?dl!Kcyu zEl=Cd`U=5n8JVx&=f<$C^;9d;TSt`hTR6Gw;kmnt;=~;EU^qG_O`$s0XS~}B$1r_n zrh=i;Cdg>`dOdDeyv!D#2|ypxsZnu1mW@i!4FLUQw)Uy#;(?)_1vwsuPy!GY6g#2X zm!GG{RcBH6FdKP2r`Nj=-as(Yi>=`U!(EAYy^bNM0SL;Yr)AP@VeRPKXWDx1mrw8K z=16zv{!XCjSJ39HmE%F}pi)|H9-f#^dBqd)DRA8Dph;4jWMxg?keKcG$mPg9g=H$P zV&@nC(a^5s4#k{V#^u94K8__`)z1|DDq~V{eFXeB53YQpgWt=F}xW-xW3w z7fAy@lo8}s9K#8Un%^ZMTFCmq4Tv~XDwlHQ$RdAL4HTCP$N(=|@M@-N0n&`X@7UYx zXvD?qFBBz}GAVYZ?p|JY!OG z&d(9)bsOm6S%v~dhB`Ys{U2LpMBW2EWQF;7-50gfN4XP zNT1)pQVXHE|4B9d6$ASpIc@$ahW?Lg`YW@>%*g(C#+>DE*X?iB#PUzvzPN?8lZnHp zda^cfG7&W~`fhAO_{p4fbaF5;uz_~_dGU$m*<*+8Jo?1)+uOsYvJ(}P*(Ea6paT?3?uwH2`p3Qn z=WG`UwMydXpowx=w4n}$eT$-0H;JP`ml(=uKXNqh7wDq(DZ*maoGp-NOE?W>l^ik( zcj0~P$gn}Qx2nwvxSo~h)8ro8ZrMow%$SpWGX|E!U6i@W@ef7C`h=2uGiOD!jR<9R z-~Fh8D3nT00{+57&V@DekBqtb>?mI0n7IXUm{`S$wb}5d#+*340xGh;nGjRwq!HEf z%lbZ3t(L?p&n5yh*o-t}B6^l~YdL}XV^OLeS05@DuBfi&P51A@8K?d=t%MH%NYAaj zuc#Jxk*8ilklIbkv-1td%lXj25d-Tz58SUhH$U2v_Nx@*ZvwME&@~u1FfS@2`AsRa zbJJQZ4evG7#zP8qD!z_lZZAv}B6k{(Dn}iQOsBELY>aV9s4W;Fg8AUv@RWiXdodG( zT*CUx^oy4TspZ6sw%^8eiVI`j!z`|6q!{@QdDt^iorRfpdN=Jv)vT~f91WrGc!PN z(dJChrdWVuIlXi^*KrKfhfHK`jQ`3_Co7xrH9dtg@oV~$P<{W*nZojn|9sjSL>4bd z2Qoz9?LDprXz|``qlsC6q42duvoSOMi>bivFH5_l-O~DC-fA=e3&l!z%mb-o(ob&J z_zU5LHvwR!H`~1(WwoTMnhUl?7Z+-z$b0`Wdg>}jG}8L-U$@%nUTj8t=QuGsm;l|c z=PJyfVpoz32VmSQgDQR(NHns0<@*D00E*%&2XbIiRyX6svagx;P)vQp1$eb-+ns8( z^S-#7Yp}FtZ=Y!yglKJ%ifvCivsI*K%4tl8Csb^7vjy4r3B}SZs+^|T5mOOR3E=mDWawTuTXP4tnpH8$W<<)w!SSbzrnnym; zBd8KJ$`|mp#Ht8TyKU^LJ61Zxe=23c(S#dQ>^0TOx#+%ebnDL3ILa)WivjJfl`v}5 z(w8uqeXBmcl*EqaQp7J6-+&ssD$$44Q>`Z6b1w}sX>c}C?`GZNm{hz1FbD}ok>2ZD zCu&KCA9-_?5EtR+kmN5Dy6v1mQkI8%mP?{~nj=V44SX*A5tc1zjTz9f5i?dix(?*N z#BF3573YR^oQ#nlD=Z@s!znU~Ck)+a1GiSeF&F>L#jtdCZv>GNK`{YKzXVRNjUW&m z7!Hh;nIUulFLY3WJ9&U&0g+w~k`9Fm&z<91DlcRAh*@b8gm2npU0}Z2D*1y$mdE4gV;|j6R#%(P*#i^asfamQh6zBTMJg z7b=Q5mXvSlSlU%E+K+QAgBl~50a(hH2+EVvQ`-D-ra3LtIcb7ZsrrR?9FtH}@8eRb ztijnWUicGW6L^TMs&{JX$5}a36I1GY#!gHgse@DMR>s$oEWObz-1lwi{p`G^8M~hL zEbKX=9@B{L9n(-vW_8L*)DH@Sh9a*94fAlBZB$aLNLf{vC9)g789L-Ouq&(Ix5M zo>CI2v>Ff6FQr`zT|YyQDyl19CnREFKYx8dK#cwNj*m&Te|{O8xZ-emUYgjLo7jp@ z+yioPd$sWycem<3{K@+QoB+jd)`FAO2`k`ZR{7us-kH}BTOl?(w)u;d_amPuF~EKp zAugYu$S3UmV!QWxLlXKjaX&M5?@Hn$(Gzn-fPdpXfeo_-wQxFGdO`$@d^q(00qf0Z zmL1MLmv)&|6r~P@KEe1}9kAvPM@sTU3rqu#(9}l(f>leK*g+r=as4@A0v`?%!_&*n zS|z#oRdDqOs_Y=;V)#_UYdFfvHLY%R9Ke|9adNE(2*N`guMODAX?+XhI09brzmsNe<*FD+UIh@o=!P7A z_e#2YzdRD&xx2pF3C;LjJ@L!uZtolKJq*IHr$ZFV+{ccq2;Mu%542lZc8>eDL|47< zr75`#`IfJBHs(h<0P(DvY?~J+u zLiW6{IzLH*Hn^JRv_tC-*V$1}zK*-6HjlITlEeP8L~Qq(rXy0J*mb3BsyXlF|I_$D$i6) zL~6v|A-3VB-jAC2y7Lh9Y}v0T*qZ$2=2UGaP;|9zBdz7pd$yX_i+Ydi{vG+IHB&@m)l|jYB|nT}cHWSZ==$*C(E%ktm6L8vDu# zS)4wX=Pg6Sj`oyv#0a#9XGubhwMGQSxq+oi5G(Ag!M}^UmDQSRH#D!tQ;vjXoR}f+ zA@aAUXI__aPIs|}z?IOIb9Dy~3iz#l@%JsIp92}{XUVSB1PB8`NbF*Ti2d4I+G$!e za*!ZTiA*rE2%oEQ;+o_?u8PO7^O*P4i=lquK204?dZ5e{W$9G^+RNl4^=&%o+*jmy`;Lv?AWxhmQHs-Cb#aIh?i z802Zi-zI>yX3t9TFU_-*R{koOVJS>Z^Eb&h@?|_yb#?h!V(c0#+WbA%?d=%u=^pQu zsv^<{hb6oUO^LZX!q9QtRd%JfQKM>9^KiZGVsuy5ktp5rL5l0{jrQxajKdI6dp+ku zDpHnJ)rJyTD`ZrD!R=PCOpM7MdQ2nv(((%tEUIH2{7N19{?N5BM(}Cww3fz&PLu&> z+EJ1)xG>3+BBZ^{cAVHbaO9HP{=Auz2{v1LfP#_dFYgY=V?q-i>GReFz_K*KXmDa3 zk4^H?C8)s(dme1Vdq2c)dcuUE*oqs1`y;Sw`k6jGGWKlwl)czorq$WbURIJaS;6VC zN`sMH&M&MWm-3Ef`p!WG-2mL5+%tW{m413mT9NsML#Lu9KZV5MQ1gPd^R%CA3ZXYjG!tsJahfam|1}i8C1y)#G5}#88VzgW8 z40Vbza!yEs{R&btRVP6q{g%BKfOf_8?uwY{g!xC#o^JL`q}Za)P&WKmaN$j)Ak;L$ z{?3o`sg}Vl*3pz2knIa)53BfC;vbbrnoD$@dFG{a8d(OnAT>fxBWs+&{yM`-P^M$?mCaP4vb8xV zS8_;cj8s@)A$w9nM<>L_qVOz<-d7Cd*q_?gKZ(7liQ#~Y2q`M*N`0jQae}tk#3_;S zju~Aeo`~}&Emq!qa9$Q!Rft0$M4?|X8KM8?L$if2C61L(IA{}o1ES6b;lZ*lo3VH> zgI8qi@MX!R=xKKH{;^WFP06;nw9|z}r!nKih9_-!@G{6(>FAE2nDse1N;V~QwBh!t z2=bhPUt3@@OiW6-2ye*8t*3wG7h9`W_pyVIz+54dBOJ>W^|)7IN>~B;A;3GHfT^h6 zl4S0{-wBTOih5eI5c1o-QK+%-ufaBQK&6b?KyFGsoesXlQfFaT?e`NE&*aCqBwWs& zF{`|_ca{x-HNZY&#?LsC{bc|u7fH&{hhus&u2@2Cou4g#WQ7i|tESgnGzbO<gJqxGpP>o1w@S{fVbSVPsOUlKdA{OX`_pXdFw>c#u;AbXi#WZ;wd zYhObA8g5Y+tz{%ImRmZY#No6a4`RD&x$iYd6TQT5&5kWp)%))vlSiIqjb?1+xOul2 zO9~@a0jft1kkFgV{e^+F1MQ}3!XQboWt1pqoW9x8dmo0GN6kr?=#sYiJFMS^u-e76 zY&ZogcO#0FX&zA8=x8EC=#q@;ebi{mvCTEw*|TJgd9dY~x80*v$;MUvS5@se&^N8V z=}`GB2>AJVWIifR>4x9B!hl>*-{3YmOrv(DZ%+f~noT)JLagVs=~fw`J@OE&EYqKN zilY^38jIKjm)6#Is*e|JU>IR;)fx*#@^(?}4K8>h*M29{(NmnVqA{wMTmcWg>$x7`JUAtMAXWrJ)2A>2l)=A0rF9j#-_~ zuPC<))Ddf(ZHnzQvalYzHBS99B8cdEz7}|B9xwb4VwB}?P|*Lx_3TfL`G3UdUvVU6 zR>r@VLRkJbxc)_q{&7XpOk#{wk%QB<}E_ zp{Z?>{frjEXbf2@Zk|HgxU)i;V&@93Q+Rgc`_mt6W^YZKE7k8Yt*ttU>m)+l|gzq@^a(zfG;D& zDZ0$glvAys;09yxq<&%LAFZB7sO(aR(wDaxL7`I+$L2q~4TRLogULoTLHolbbxHB$ zwRW^WiHcY!Q@bWn)lkEhd_#5Phz)h2kjlh8q|ix)>5qI(aWyY(2kfzHq;8&GF}$Ky z6zw2QUvg%te1n}d>zY_d$4+|QD}qefQghDZV?)4df-458{IE?#32-9{f*i0vSSR6i zT!rEvVpi~e}_D-D(f6iv>I*Qz=3CqYCTH$+}X<8wY2T zr@h5Nu8AMRwE>QoZfNa%Cn>LPqni+Cs7j zN<{+JzQ}1xb|63Uau>!hk{{eBh+XnD;BG5vWQYtk> zoh527Y?UgAv^7VmC#k$1_Bmi4H(z9U*y&8qTn`EJQ9`CZz;mo_&j{_d8k^TXSoFk` zDI7UPfuGjF4BSK-M}~0-7v{buH8!<^7Dn9@*99_~22lknWS@Sl#4uA@%$u-wGH5Yq zG&_D?Ps4%pi~>>q7Y^RcCcQ=yus$ zW8KeEW8HRYh{+Q-h6Ypg-ne%yJ9|lhTS8h?BW^w3kqeksz%knfeJ*kU&ZmOMy)aKI z0ctA_5JR&87^yts!b4Y7*acll$!}NWe296leTz*>d=oOw{>lJm_NXWvEJQUFWMq6^A2f0+b?QP;rpm--n zw?Me(b+bDk2v08Svh3~LDaKcpndkM7m5HVljDYaD~8Fh>Iqw)?yD!|62A;%kB4ya$Qd`rduL$2U23@lPSIY zxgvjWLkDK%gPgh%1a4^V_{X|XJh%vhmEGE=df&tW6C-rr-rde4#fx8(6wizFb}a)G z%sSSNoWm|X$r(V{M zB)E2#ee|*nWSqi23P^0Np)Xq)d!LA1^@81{c%yP-xNzBEVx*fQ~m@U2VzJXO!k3K2&7(x#~ z)G@yb^RlnslYi*Wy=xz1oYda1uob+^^9%V(n_(h+ckx>E%4LaOS$`)2IvvF$$(wPI+hwXID5*&0;F#FN#$@-q0xuF+&Bp#@~KO z!R?GOm4a~}IN1EEo=A0c7Qohz#>PAgpFN=8x$2LjX9b&^sL`&>MP!B8citYn1RAZCO1uCrfAc54n}5G z{kw|XZCF{KypCZ(5P{sTg0*)DNE7CD7i@A}Un5?In!*~QG*)L$H5{DXy_0N5!~$Lh z=Ydd;|LYkh1+VG;eE?>Pv2){k6RrtII|zGJDvUF9!ugavoX}B@gGnEWA|LKpJiZP2 zR*GBoR!W7M9#T&@nP%BwMsKw&KnTs$L|G6?rfQg>kByk_`cBalO+r*0fvH)I~b27B+UiG#eYpb~)Jh z#K|)*5=0Wcw5A1C()}vvkM;0l$F%dCz_QfEYb^~m`O@z=Nn{W1GJFgSm9)C+3AIH5 z4-=!fl?8p%CSk9L#OX4{i@1wG<8P=L%+WMLiM1fTlFtJz8cgG{7hsl2VZBEFRQ(iF zOfibM3dx7Y5ZLS$v54o+sVF%kR3gWF&efQd;F!tWWn|zFo^V1)qF{}Ieu5G|8W4dT zzOL ze#S9kKVnM(#9lnsuFFkhXRmvPd~F#{pQZLb^7=02bW6jac~angRaeI-0bP#@!BKA@l-CT?< zv!FDI6lU!$dt1M|U7#a>2Z*D9>l;=77tNjnDH-glD_M?icYDA54d&$_za{-Gj^*`H zO#CRZl*G?JO0g}3-KtI8Q3$QHN@UsI>M9qAo%m0(@2|ws|B46shno98vhS~W6f-m1 zzsSD7&DFnUAM1Zho&Nubsbd7%u_sVU5Kb4x`ldW!4@!?yBhO`tHk}@jw#z^pa3DoF@4|kWT^1Gc)bD=sijNdeD^n|`sQ5Wa*u--rbpE0$iM<4+i)rf zIwuR}Ka*1u4%csST{oI0w+P=du7m=3VW0|4(977d$aov2o_ia+BrNt~$$P1>LJ5Uy zImd?6JSeliMHR)*W7qJQH)o+PU z{8pi-7GAB%Nj~ZhYsHtrj2kW|G)P4+&UZkmtNgOD(!WRwf$uc%5p0I3_+XFu$&R9LZA7rhF~RMyz~# zE7eQxiPiCUw>Pd9!T_+vexoJwGa|R;9_+ik6b*)*KO_1wR-JBm2`ppz?y$8%(1fhj zkm*tJRZChX+CKekIX)k%pXz%SI28=^LbfFiv5-RSCKK~<1*PKV4|K8VCu5KXRv}hl zBq}~;e;+(`Ez`?lea&K|c0)5t>L$$Y!FJK%4r5(@BQ4{6>$(az8!XOI<~;tGx|1ZR zUd-uMgfb2R2Cjfm=BCMdyOj~(vHc#hpHND|{u>-_V2 zN576`jIyIUN`CV{rM1FZ85C_P-y2RCXYBkO*VVFfWuhZ!GG%oH z&0EDO7pkYJ9@(EiYev6CKfWUDk=jbDz=7guaK^g|;%H6>k`8LOtGKM(pUPA%NNGY8 zEf|t{c4ts@M^C7V^#zgXd>)auGl*0|LA8$^9GF=!99{>W@Uh&$?}1w#lE>W7o@yvn zAEaC~5*1lc6o?7X_yvTEx}+vz3{NRq%fPiKhoTPYnj<>&x)&OYF&eM)^)Vmo(N_Ts z?5#Ld;Fux4M_|8)yfh9JR)iWxzsVV2);yK-o);){g4kuKx&(~8peP_zBG2t~DUzw( zcP@2S;D8A={NfbTy7(7@Y}+R*=}IeMh!8HXc#j~tCXsAMzKFhv{xAlLI0@cv!Itt!*A6$92wa@Aw_z*H`xmh3hJ%@p5n<^al$& zbk3F_RK^{2II9*(HX4wwKbo45RBrhe7fL$vFx{<*xr~q~()ev{*KXMz z^%lP_9c#Xbn5N{nd}x@aMA^Ip*S*;%TfVdK?Q}f`&P{Y~pV0R8)x98EbFJr4NQLt+ zE^&)C@a6kPN5wGMM&W$nk7sgjUc7jKg6SYz`1&a;D{UlNQfoSNQ$EWW>>qg~MBWzz zl*k6x zGyS~)Mt-jq{XV*~uklKX54Xs+d6PqVRAw0cc_G*C>dGLQ4xC%Q_ofvstqgM2;&QMq z1`HWgwO1ycd&((~wPcttzfn+=;NUV;Mk+IY7SX5WFy)fJECZwfvqa4JxI7wldZ_*! z(eBMzJ(469ic}DeCms;_dDpr<%_uO~tQ7oXWG)WNwylA}3QVunx!*ho0No5Tz&PHi1yO=J|@Xn?JQTrg6L+ zCaV+9_{mbtK-Q@~^-*XLkWDsCON#R)FS86u<4S@5q)-F7OI^X7vT;A0zW4808@zYc)Zo|+rh zXxMib;1bRv;ltwOduAE* zAb91min>~t>IlhF&CYSJ5^UGcR9j1P!ltN1o>edOn^`*9I+qnv?L|NiA64}8&?;eJ z&v>dgV}or+W7dp+X&lbt&m23tKh}A^=mlQ;448`U7-p}6tu(6eR03RXPJ9$#4T-uV zn%hmHP@pBFM_a$6E|&vNup9~(4^b)NwA<2Cx{)BcB*+YmMA^Ir8@RtfX4#ExcEz86jG0}k$~3Ay{$Cv;e!ABn`wB{Y z$BB{e4ztAw$=*GxJr4!;2Eeq{7<^^ugul|if;T9VfJsp^gqSm zKRbFG0H9r>A6FiO@PTnP$azRY|F!0}R_}Vj z8Qq2sD}qe+$rmFieJNmo;RE{Eye22b{q@}bT9XZTS6d@@tOXpWi1FPowPDJ}Ac zY}8lYEbN!)n>*Us&;qi%f4WBi;s(iy6Ikyc$nvoO69drBiVdb$5w?yrxAna4*dP_E z5jza*n*Ua4^s0z>4lN!47z>?{;RMS^rl&`$X07?LuRl81v%_2Tsl(ZSp(Y*ch)h2T zeeJ>-7Fw?*ha0x@_T^}2O3(013~*jCJ+Rn{#We=Sf26chSgFv!@oUbHSAzoeq-mc& z)8fOrW;h+gHbDs!JAcriGrn4%%hm=#MV^?Pm3!-`KhPhmNn)Q}BVF~_v^DvXr=+W- z3FdHO`#XJKeQ9|~GnFJ1=TRfaw8MZ9R?2@Qd|81uS-*y>0-YA;&P^bE#W>t_p=AP< ztpo*|9y`$)=fmw(9A|OU#iReh?Wrofhbq#k+_k3oyo2&q-f-%T3*i!h@*?8*kd<6m zA(LS&ja4@{JeFFBgd|@!>q!394y+0UrG1i4jV=@L<9gbHF=QQ zc9N%}TqZmMtp)g@p8g!Kyw1R$XpT&p{E)hoCi+icle`c0IPxqf>E(d;*a+H6KQ=a$ z1iKlPZ8^PoO>TOp(SiM4*oEjT1* zS`VoG)|xVpBK+?Znc4Au&4b|;H|XYw?K~!MjEc`p^kcg*$d`kQ&V%RBL~y7y9LqUQ zpONBgqTd23`227scpP$`_fv09SH-kDbJtJTZ@UBm+1VIZn@V%p^UqhiQRqS!-d!fg z>6)h+ndCL4aa&34Pmih|w!}30+;CCn^=dY$wwGVNf4gf}m<$7mU#SdrJL2^uhp&%t zihQq>7|*dcyU00HZcfD2MH?2{%7j;V>$nMFn*3GZCW3%yU{^=W#<`QB+CRHa3DKF!Vad{a74y! zn09iCJ1Z6pa}-8U_MS5b7;Jxt9N%xA_s%BkuBIvRjOJ;E{K=moR8>U&C*UZ$dh2CwaIQ>9Zaz;=Jc`uTR;|JBl4PM8%pcNH~qz3TW zIO-|M6Y$R#FX9P7M-{<9TY=#mwVCZR2rP>kB?{i_wLZs!AN+WM>})(F5NrW4LpiNg zrDTJ@_UiS=2ky*4jqX1ws6P#~zMh+#05lEBqGTap3 zLnc)$_8<_9*l>#%Y6xOh?8Frgp8|a02sAILoRy_@g~%JsEvrN(r4}4?Xp(1Dq3Sdn znkHHbmCw|Kbr_AB62m)`FY1;oEBT<5h-4rXB@IOPU@wkE(=by}&|a4=tMSFth8H*z z*z1!$1isVBcHFvzt~#n7fWy0OV3?Cza?G`lBN#$S!NaB4I&l@_aHj%B){#e@QTZM9 zOjH~NE=`;&l=$Puc+>4q&#z@r#H4Cm)QOkdGz2yk4o!AR*yl$Sv(SQJYv_^`(>Mfb zj9=aZo9C^i*A*pM5^PWSBXY};zJT%|Q~Km(xu~~;I-#*TP2W{)uvUu~F|a?eiU{aE z5d)(7=kWn5hQ(2U2t`FceMDKJO2PgQkhk{$*?6Un)i!}JvGdR*A(I+t&! zVBFM5gCZ5?D2XCZTDLP~sl&0>qd5HeNwf2!d<@r$xkB>IcGlXajtXUeMA4QbxM@LZ ziZDhY{k*c|t}PyG6Vjz#*-p;B;lk`KQs2Zq4igB!5I0IPLYXP9suw|hlx%~x&yXld zRitRV-~bbkENQ;R)rpuX+5Q+`-h?-5#J-k zFzoh=|0t=8fLW=D!eE+d{^H=yyvWw<6kS((LsN28!*s>&C~)Zefi0aTT0Hs8kbRR= z&FxE@d_A27S8Y~O%!A^b=#G`pq{^T&zfV8uk%G0GpU!5Z&vFxga8m<5Dr#qsz}T9l zTUOHrG%x7)u}i~Qw4o`_>;oGcQ87Ys%N8fr?`v%@UhOtMITdgp*T; zxyVYnphbMDub95DMr#Y()L3g-MP>%pZS>Flk(GfZAP7L!Cv7Z^4Wm_M=B)W()C;kY7mv#{2d`j@#AT0cKKvhWso5BR}9K07sT zK-st*n2}65<3Zm$@i1NQ=t$zlL4qkn>KO>8kMPRWN^7igdJ1*Z4=S@lYlbWdmT_&g zaa?_Cs*c1*zmfCi{5`wPON_;xBe#%t$zxl ze|Owi|H}7$2JZi+L9qU9CH{+Y`qQubFKUX~6Sg=Uh@EFtkKp5z*V%&l-N_f9GjIQ( zK@@}*e9|D!Ttjd#726W6scOrXg{w8f+Ia3JuHxUVeRXz#?ythXeL8M24CMeCO#Xk) zyrDt_?cD4+WjN;`Duz!s3rT$PAl_}<-kIBdA%UXdzexaff60l$wfit|doM&n?Wj$+ zWnOdwpAi|oP*}{oVYUL`$hztAHJ@Fc&Ly;0}A-Z?q+D zwHM1CDfUA|o=9VnnYi!GLmOeA5MKiYgc*Xw3v4#j#pQxFnpi7`?jMG_;ThZ)wV)kZ!6eQ|vO*x3sj7S<$Y-ggX*9FBo9>o=-0 zp9t>$@;zJ)%jD5C-m}8%aJtYz=dMEtJ}!x5n4Bz3nKl^_y)d7BavD+=TW6a%&PU(O zkFVrM2#^sjuo@!rskT64!Ix}|To=`YMBo@c_m;-X!r7J72Cr|0Fm{rW1*zg#R;@uZ z#3Ezf_Z2PW8~NBDRH0xgL}B7Y5rxbpe)!=OM75Ad?lQS9=@}a5yqcihg&?S?8_9tw z%;a9|(s$Pm-xK{>iAnS@eDhlH8C~;Wj}0KclrDl|e1qi^B@}~FNnpq-!;X+`x$4ZB zT>8H6A(y|%JU1LLOUbNASMt3mZ`31aW)G+1ERBwl6hN8vlfYIl+f z`NF9)l}#i0khoX+T3A2a!w<)_m%-_=DXz(eWl)WEMn}1I8_pQA15Qx6)bL%(B2>`@ zzI9TERU!NQ;JuTPr3BIp?V~r^O9u*aG+q^hT`N8Y$=8#NGa*wX-D`f{OvOP66R(0Q z&_D7U&9N-)JjMGGrc1 zm5f!<$fO+xEg+`H3lee6bxUQb9lL1oxA$a#Z__+J`++AYcrPq`A6#S4yzhMPov)#r zFam&0-<(_li|efgwD6qAmaW@$BkWQ&s_p#c`Qa<+%~v-XK7=?lMx79GmsMz-qEMdR zwXyZgQMQ|f9&|3}?B2UoVJUB9udj&0kvJLuT9?R3zwZQDl2wr$&XZuUOk{`UKxyYH>@@A)T{ zHEYgP&04E6e``GB8N*ww@4eV4^!2C2l}}OE2cnMd3fDosGKOD8SUY#!!BEhLdI&1V zY}n&tz~gc3!WTj=mxvc#w!U|Wxi#ggJIyw`*0&>~VXj`Tej%i_VrO#3qS%xf#o zwi|gWb4pnfYK(SUaB(Fnh_-}CI;m&<-Gq&J#pr1H1lLQ(_FT%2Sc!KggAHwvHnqx2 zU3NNc;TZqQy+B6gzJ$;xOKh4Xedys{QsvD5gpTZcs+2!R z6F-uu{H3o~k~s*TlM5H^%+8jS$m03&KsJUop3${|evmhC0UP@WulOZd`{^6T@riAl`@TSFwy}8486#Y;QZ{+D7kS zzU?ihqPL_zw3|i3eE_NIs>rSXbkl%)Aj4Fio{j9A^z&+_#G%;MgB>Avl9# zI_wLJ9b1}Y>n@%7!hR!@J9OfUW5xa2M>l0Gc#rC4WvrLanI9Y4iX6$kJWeB;siSTz z-?TF8SzLfLd_Y4*<>;`11ri@xVe<#CjW*7;m_c+blm^lahI`9J8{e$Nv7 z2KLyq)#HGnDMsIYgfhF+G|-vU<+MV9!ywX*_wzJd9=!zpn&fCT>2+P>kOHq992SWCcXwV@Kj!HG|eskl_zIeI>%ygv&DzpOb$4{$}PEA3zn!M4Wr$|E@g`84XZgh zGv7vQj*?TTVsfedcy*%}%Tb=By^lf8EC(Y+FOX<>k1W){Vnrh->A+{lw?t!b;bret z{2|BMChc0Xq`s|iisspkZ(LoBQf269q$*OIKiNAnyQb2uf8@V}g5U;H9bkE=aegE~lsQkqY|lD_SU&C6@kQJEe4vO*j z+6bY-r-Ncp(s?q^Ng80Bot)P6z!46E(eMxIy{ht<;>QT*?U8QAT|bq}M-hTM6AfUJ zNY|Fb@E@h@3IE7+AI(}h%}A_wBx^9Lr$?NpWSKKQC%B(LqdP+iApks~Cg0OYEYQ9E zt%tEvL9~Ih&IKVq0tF5M9i_EmqeF%h=u;3xVPA^urdJ03q7z$4)~e0;()k05I%I{c zZHCGFmBj2x;a%~)<>lM!+2Z^wJoyWB;AaJ{FKWW(d(4>`i4#SivK93mygBZB+gzqF z-7*VpV&Db4d7~vCuADX+GP*s+qtdL0)8Nn|W-JbJNeqxjPMWDBXlW8k_P~>32ZTTK zRXkQ-3lJNo!*btB2C9P^$N)}Ai-o!w(bu+uH#0=xV4KOTn*1QOvYX;};LsbW{tb8& zd2?zQ;WrPUx0h;G?IA-J3%2048?PP&I;Dj12K$TI+T61S)s83+RZ1L-4waa~%Ura> z&hB#CR8&y8)^WD4dRip_t$I^}_MDTcJ&34T`&9pgk-BUcvD)4-Rl5k~#s0B0p=qUQ zzYx%TdS?K7P8uF*VDyY{MD@P8Mwk`c5xbzFyCPCUVF~fB`r1$V!=_nAKUB``F{W}4 zOX`xlSt^k!8?aA*Rajx=6;uzvqiUtKbrGw%ZyI6noXS+XoN?i-)IPjs3UET@l{~hU z(O}L8)0(GS-19ExJQ|?IqZL_qw>op{a8c@wWcTf?aHO$DnN1Y-B2L;*8Vx3f)ESsb zu(2gs7go&A@{yF;pWKbM?N)j}6m3SPUFlxZVBd*X4NZsDAr zsd5g<*dkOz=atXK^pZOOXSXtsybO=NOP7>oeu`^en#^LO-}0Or0n>Gn;MKZsTrzsa zu)}LiCfw_{0~~C3ZxD=4D?s;{q2@VF?bBpu7V@M4A1Ch5S?+lWa>3;Xg8?*EX4Pof z$_DtFE&ULkML<4!Y3eNdzCRTP%<4wu+1261%4}dWej$25VR->nOJRrpU9-`6nRGRC zj~SUiF^)P$aBnp7k>&IZ@3}&&uu6JtH~j=_HZexC2s_$KG%xUvv8EtCsRx5Z8*aKpa#kW;oJ2Akq#JoeKoE`<=3dF7hniCc& zj-*Ik9{F`zGH#){lh?}7l%o}hQ`sFKB1qLR^|MJ3TssR28@9z#u)X@{ZSBuRBcKFm ze?Xm~uB=#?Hc~`(z8`3`SEZU;J-{E9+}U76J7>!;Rv85ouKIlNu7qHuNQ$@jzc$Pg1!pCBhCbrKa2%YE)wxp9^L=?-P=sW+B@Z5vf!zE2ZoJZT8Fh&G zrOBG3?ON%v(^Agt57=22(QiLw2bpQ%T}(ZQ-qgUgWXGuoM|F10H{gzSJ z4Grv|ESuWXH5Qc@=%+@W97ll;j?bMj2JU4BHb6m^8#ettUpJkV&^3@JZ>6(gr|!)0 zdQ&37QSx?nv=uiihOOwB;Zd&C2JVBV`4h0@S}5|LVB#_8I2g& znf_jZ{HjL%fA{XP{4rblkH$!UxXzI}PF3#k=*PcY=OCuUGQMkmFwtMpn9gxLOVE8u z@2@44Xla(QGvNaxFFMR_z-2Eu_(dUscoR#Iw=lA72rzkK|E~WjlA5}^`bv1l1YqXQV zGD--SLLgAvtCcLA*k7U3#nv7YUM9-jsU2Jj*pAef%+Tk>5IQ zYj)Qp2%#e53Q8BTE1$@xo)o?9WYJtab5@Oy!f|c@<0&^*nU)zB+%qU*!hTvCM5cMB zY!D}G?5h^rnUE1A$N}H@&RY~bEMxCk#2dS-3gan_}^>-NF^yM;`NoUOWi3$$r+ZclBe;{ z1!4OwE1}5kqfEX{Y(-Ww@YAcaXdQgEegK6vwpLlXLijSE^{FMs$3}c{i5*GU% zzp2}j8P1}uU8FXaIaSVQuiDso`O(XVpyEm#jGED@*2#r`vLnV%hlP7yx^`Uu z$B3s8T{VH!1%u`X_3A;_bKM>$m_`=pGz`gOv>Q4iRYW8k3s&Md`*>ZlV#rF%w!MQW zYf);9iWj^LoOLH27H3WOaLs`pkhX!pKC(UEzD~3pDP<_Uf0;fKuGaqIg6^(=?CWX( zBH4{t%fX{Yo~>8pCP~&37_!Ktf`6*|5B|0nH5dC#u)uB)yihR+_XO=tB7+rNaX4L=k9dlb=5CJ)+8h zX3|24fbxPJ6@NRMI~;3-3s5@8B&=6eQbuQ(Msrk7Rh{pUQ|z9-d^a6sik%8z2akSN zcQJq`f;o&Ob!yj?REPK7;kiAs8qK_qTs0hlYs$W*wS~WuZ?7iw&QXmXOH{FdShHub zVZD#iBVg!?Tb0@-%mkIsf3nCD7}F){X{-xsrrKBSoAl9m7iCSoo}rN%On+RxEc(>g zhS9b088dNtMk#FJ;#@G zUc3W**mwL;^gA+kgeK+rL1_c~bLdwN;wkGvf)$Pd0iGFkM(qS+R0Aa}EWU7yJ?5kG z?wyh2MB#QMH!Nw3tXl15E6-F2_oz%rN4>vwS}WsQ3K&Dsj9j85-`QpWDWl})_^tt0 zR}*Rt%r%usc#oo2k&SAT*YcWSz4w6${Oz)ZZ}m0iFLQjHQ|&ZEDvB0oq`u#tDz(lW z)SD)VbAU!mss&Zs_W^KKoZM??JUcRa>%|AN3 zMK-t3;e~g5Z>shW*EX;x77*zbCrj8$gys+VU4ak@fJJP-V`?- z4=}egF6H^vVeQpZ+#;Eq+WLatsd@4I9rj-dTuxsJT-n&{jgLuRo8;R1eB8nN1#Y1Z zo6JOQ(xG6aJRX@+_tm#ROwGQ-fHk#|B9v!I!a-1u!usah$tJ&=L_>8-UT_(7aDIKT zmXEo-LeP>n8NQPeYlUE$Sl%2IeGJV2Vc48Co!y`se=Fr_`;?&PSUBDXGPKWh^O*9K zV%GVQJA8Y%pRXStOyDg=siUWma~@pVp5+<<=j0#;t_}aT+VJb({O29bw5M7~VRitb zVq~SU1o)#y!^fvAXIn01Tw9KY%_Shl{Y!d%!dWCo34y1FEM|SIp7=B*Oo#L;cBv|HpyE{C{;QmcIqIzjY{<|2$Rw&-9GNKhiS--KDy+f1ZfZ zL~BHY*+bZ`tQ*2JK@)$mqm)8C$*Mh%y9Z}oifAvnMj|;cuR{FM$9pzeS10@(a$U;D z$Me-IVBsd*<7CjKEbE{|@7a!6EC-p*yJ0L8uZeqVCf|2H9}s{jl`blvBM{wk zP20!OyEiW}a?pJk=dV&8$Zh=7OVV$JQGxLt-(nwy;V!@5NKLjz`?&MI`69)usgeVW z6fYPyK+Sc_jAuxCIuseiO8rTR&T{S7wd6hPx@sD`?T}ss7v=qT6!%# z;|d3_y_i7?ylHO6<*tR2CHpD;;uvljJmq%a<8)@)D-=AK3k9?8ffz;EYftPTJ0@bX z2XITr>3~ij`958u3G@!`o`32PbBav3qNw=0H|)~xjI8j=>}Bz8c6;+k)Q9Ws4Vv{G z80*vFDLYV(??McYxuT$Bz9nWH=bd1GeVfP0T96{U{a2*(h7s1v7U1;<%d?srS!-&8 z3Mz0CsUK<>^Ke^cWi2?DS)JOklU8%&J|QupU+HE!8eLv*WxHOZgKJEC4wEFi!6p6V zO!rgbBGA&F^MYa@mV@C`dn4@WJI>Z=dKg^>$uc5dBJquij$EZ^qV z3Qvi5>jLe|8CQ?-z=xYoPv+6aU0P&)sZ%@g1#DiolcpoS+V@FuJKcp8D8hcq;Cfn8 zp21(i9IS_M@sjeA(8tn0Tn*9#Qp{C%_tS)?z6n8rp}>wj1FBM!p<8btVoM5cqvTfkSo6=}e&U z*nUPJ2yP8`f4#-=`0I&*YuZuDZ(wI;|FvQg&w?@Lsks5qy-}h&uETXD9%daEFEst| zgjqdJ7bPV%q0K<+6kro2#j;!?=D$1M)|bIHI8AtQ6j-B;p+`mXuMQKd04rd{r%p&I zdv%#{Bmcn1Tfc=`Gp)(I#k6W?%!bNey4i{ZGiC-GbJR{+DtXve78H~DwQTu$*0Lv9 zjRHnRPB61J#mKdeth_`igYw$#szS%49g`o(Z?G3Q1<<=C<|#l^8ZT65#9`11JZrDXV+P50Dr5no*e^?(U78*M&5W&c!q`mxn zu`C)5zT$6CKn|J>iFMUbM^!vE&?~lqRwrRDX>|LEp46z-Adr-eL{2UB++u*OoiApQ z4#b?W5px=j`EBEe03l`m>rc#z`w_We4q~qK38;{hc%F#`R6gP$ZN2GZTN^yO5`^h< zK$8c(ZGPf_lEC4hiF+GZ)C3C}UTvJIgff>owUEXD3Ceth?e&!6#G&V&3xS>&{Q1-0EJDiTF2EE+1&rsLAT3LHyL z2J;EGFwOk&Zrr5QvP?WHYCGnWe+KdwJb5bnzdCsZ{oIgBUQ0L^NqCPa;wVCOJ^QwT zDK;ErvK1CrCpdvj??F|JTJs~l*hFli-D1CpQ{xCGWkRkKs5h(zl{{+vn5wvWlLqW} z=L7`gt$v@FWXJX{W}^l5y0DENgEKGVWeXZu!?;HBF>k57KHc%!25U60Vs8e~uT2zu zrHyu4ixRCMFv@7*397X{J75fP)7`O+u5CgK21Oa_3|yoZkS6y@#QnJ!WjQP#ZMv81 zTv_R^4E3RSSse#MwuLDF2$M`A#<_$=N@K+b6e2$sBqmdjXqT8mLOVpKti2Of!uMEa zOfI5pT(k*h6G(j4rJUhQQO|{JxpVb8uaqKqll$3?h`P(G1@P$cOgB9mo9RHJiguZn zD65d&GV8vqEs<%n7DpD)ra4pH;JLx87DjK&gEoelN3ivfRhPK$(k7Q*(cbAJq-{Qr zkLR9`O&0daGVdS9n>xp{d|78xTRM#gd$~Zyn#Ejw+Mk~O{*U=D$Lb!74w(TTLWMp7 zs3c3(b9|Q~4cqBd7s`rW8`buO2aYL0sNwECIxo9jO=1c z!YjIo>a_coPIVz0Ra>{quvQh2+j;G3?moGHiPanQ@;!U>MslPjJ6zH^!0YQ?xVUw)R8tfpL6uDM zZb?X=Cl|P_QF!$We|V~& zWslIL83#IN*W7YOi_k0)C;!r#UU%&nK|E*+ZmkmDAi8Y%Wk+Xc8ZI*g@}N39y$>Os z^QO~6`vSv-WRi@AptB4t&LNUiL7+2g(-oV18gLD74Kt$O4AaZEZhi;`={Nk<5PLH% z-VcRVuZs`#ViVGYRhll{pY|3VJG(jApB+qF&1TKHL^`v-AJuxi9$g+^5Abf5C)1*` zijTjWzqvR75*B-1Hd#(ieWkWw_7#eL)vL_T6X*~7t-IVdrGgHtit}Fmm;F3rWyR?0QBalj#c3&!l;oyYcu=7i{Gyy zU(uSQ<+;LJY=XJEdCFrMSXq+AGqktHP4d<>1of&m4PaE-Ar>}Y2%MY?ngEwL4aB34 zj#qO96!o3^=Ab4-YHPe%GVKJ2cZJs7R$BRvyOGXdTFr{=1+hUz=%RqLO;I zIOSQ2>IOy4o&*gt^moBnX>XyFyPL&O$Qj%{ZO;Hp*~kK>^)`-H0n8lgpCNqyuwT%h z6eCl1x0@@;@Ue79L_<%mCu!=_0b;-9>Wr!J;CD6$!5f)zQvXMV&Rui$^)BPk8&IJ(rlEuT%_o_CDG@f?VXX{TY6Rc*z>y(rWM4`=&{n-5s1pFJ(bS$m zLcyUkZ7E4gH~iI~9Xb+Z!^S4U_z;;q^PWEbtVoH`)xbY?e$-1SiiwFFDLoAQgN?FiZO7qTYBJ|v= zIVuO7*g{f4&9eoNefHU%`W3nymlvB(Ql zTjGBA70qXqR2j%)IFy)vJ!d&~CEPC56L@5O8fm?TS=)F*LoP8G{kz>CYSp39xG-U} z2WlVJ4$}b#;+5ccdU&58`n-N_P<98IkU)4+RIE1$E}~_=xj+Mve#s)kWukMBCq1@W zuQv8(2DF(|mh9>q5$=J%f9}{>Nz+3)bHnR`kl(ZdIrzC%GIUz>WA8j|zxJ4u)V+Km(D$idkSD6fGqv9okwKxa<^T zpBRaXj3f^2Rt2ifG{}yimg0`os_!Jd%V5MMAL^rDuL0#xV}Yh?l19WrD;hNOPDI7i z{BomdR9e=*sbxihWTDVVA5Q_Kpu$$n5qk`PrpZ}#0Gb|0 zY;E5&k;zVd2~zlKydfU609vuH4_SFd7$t^kr}nCuY;>5VNZT2~HYzEK$LKqzAe|-C z@e0Q!#AG;%rp2EwXS-4_p@t3`UK_b#>kmN8zH!sK0Y2VD*$S{e1d=&v(?OZ5%DotI z+YH=ZiJ@~7g}BAYi4aX0bJHWozl8F;RY8&cMk4T&>1`i1Ne7N`@_yg4F)5=Q!eLbQ zB9)MruixAmnPr&LJ@OX`Y?!%u<9-sA{K?LCXmYsZs^+8DOabqFa>}Z8L4@?Lwn{DO zG9;7Hy5i{j>2#-MRAZTq7+HdA=4GNouFi`D%QErd*hYiNFM?Vs5gAo-EBtYW3AP-9 zJ-m97k)i}bsE;O9IQ1wn*(~}i@(iS@$V};8`JzdYa2-Ty0}Hej*1BMG6%3nwnvCk& zEBKU)3o<}X0XMI7Z5^N)ms?)bh5ystql~-iwH?WcdhGpoX3NTPF*g*5`P^xB3zqbj z1s0wPDBC;PLH?BJW^(bkTUM9GGTGIO2Z*vz<*Qs)6J)w`TGy#HqOInr8pIR4l8g^u zm|IZ7NUu@S&7HrP2@{R=MDzBZ97olByE(_(mKEU5c;+Dq2fx1s&iHo?Rn2jMPkLg6feIrEJu(=mr9JEBB<3YU35CvUp z(D5ES=j>QoZp!`h1m!)#nfMrdN6<}M$T7J&ry=m{v7O^a_Z^Q5ef!Y`$;T`F2(oql zKjFt;exm;t{P=?^{tZ9=GCwh}v;RHCWc^!X`x`%4|I-Y0^;K))CPc4Al{H5^KNKKK3I6XQoP>)0kE|) zD*=2F`LSBIK8lWyZ8CC>66Wt>Ym7~Uc^NOfYrS9eSOYy6T1*`7KIJdouuN{FzPtDo zp^Y`{iJB#2&4s4mzq4OR=$P+^^t(z_+m!FKhBc* zYl7^dU>|rmXMV65ia7w|erLC6s9mn(1+?4!!`L0E+{}DZ_GRo2JNd)dZQOu6uckgU z?Uo%T2o#UBr>m#(fp5gIe6uQv@oa^(&afTLp)7x(`~9#;o??Nx2)ZXpdNzySGR*7()+_ZpblJiVpxD z@L{n?{zIt?Phbz{arWpqU2>@D6(gxv$1^1mucQ7x-73e{K6@mKnG&q-^Dwo^P#a=iARFcoCjCVPiNX)Gq$ zf<StXt4BRahdMwRu1Krw}0GjDW@TV0f_l{h*Jdsx49~;QA^baX{|P zp0x(js-xf(f|58}&RqFGhw@~u0rCs+b@0+u=1+zZ94k&XCQDYvdua^_lg{^^E9Vuh zR$;Y|QBgU3J8IYf3E@8tr?HdkjD5rPsI+^;G{X=A?dLdL^>kly9xVf`hgWL&AuiFY4-|tF2p0H)JEqsm%}2Fh z;j35JpxN6YPY?ObjZg!bNMW@(z;}H?+b@!X=S0 z$1Q|7fF#yDgpDYMNaueYO%zTPITeG(;GJ9{ASP+dCCnq4J=UZrp}t6PKfS zog-7Y$Z^DrDm-oRKF4oR&zf!sjRr10B8JTI2}*@W23#xiu%M<)tA0fVFoE|GbrO@q z^F5VX$Bs#*Mv}?sspgg}2n<(Uvg+8~MW)_nOmTUL4Xc&?fgE7_Lvl14F1J4Mc%dLv z`Gvd6;a2hm`P3S5O{B&o@Ri{gq z9L)XZJ5kl1x`bP3Ns3Iyd(M7b*5iT$Vgt~M!I5QAoVC!at8SamSa3>~M7jB$r0!Nr zsO~>F&<2J^`n8<-Rw>i1t=%Iq*+Eal-vy%@B{8!sidv9*zLG9c7gZG~wS zNfEkq`|!8#Al0=RZc#HE=tsbea=2N!(lYQ?=Zti*lXlZ-{s*F>m!aW|i086#p-q&j zu0#p&;*@SdRoFWu%lH&nn?~?d63g2y5|dx{IZ@`zP}33RnP9_QMTGlD8Ab)airDAo ziuX1!;j6D&<-4;`>^Tf?4)BB!ndM>}x~@QjuUQs!WVc9dWq7p`!XU&gFuxX-o(9s* zCmV`m{BlkDQYxoygBnw6WxS3+La`;6#3Bew9*8twdyg$ZOcRtigxRNs!DhUDl|8@gnW5J|+*~6(d%i5KH0qyio`T+43E#tE zjNARO_pVz6W7>@RyG{#G(O^K=ia=x(oNDUz@2&-53BWnuIwRKA<{fIo41d&zqm~UO zw1F@8@0KEZWf<8AwNkgdawd!5E_xs!sk(1w zcy$-R;eFR8xl7zaT!ism2#xPpVR<|aC75!!zywOsXr}3=B z4V_<4GX-(XQliPVY6~upZ_=%$c z8zf4Fb#;Ch)g5P_te_j@sm}SP25A%J63hHbTala(4m<_9leE1_9wh<4Lx-X3aJgQo zP|#G%J*;t7!1TkAcktv79w1dAi=pfiP|gZ?H48*$0+qz)#XXq}m}2}ggV$LiVDn&> zz)dALL1eDORzbkjg&A-_RORqPT{++#7(aU%rEw?2>C0*LV2H-S#0EUf=GEZPBXTnK zjEJRvN2W{oD-T@7_C}@IDo^GUP{O-Sg!WdQvMUX=L*32P%^RSc1s@-G5@KJdw zit$f6&H6R|s{T@x^n2y&*Gk?pAIybk%=g)$DUTUG4&CAQPRMNDNPrW=k(|PpLf@B6 z6gk--y`Ii8tG89PZ5CoV8~B7(v#sANp`VhN zZ+-$eF`>Zx6K4M9H2W{X%s=Vze`DsK?D(&VCoB6OxA>>?p7n3}?tftBf8G~hv&)Lm z@v3qJACR$~)8X&43-%B&j7WcU}!drC7u^HAX;UWDTSeWGbC;$?`HPZKA0 z2*eIU;GiJoB%}QUm0siO_YFr~sH_Z|Bpe?+Gx3Ejinx)efdU;>_{5O4_I1wnCekyX zzH#-@fR~VwGlulJb43_M=JmyQ5AoJKw`9zIceZ$7fMNBOL}PGOfW%R|q}Etd%af=R zT=ja-du3NQBsf<$BtL*#CgcN%tZTiYpl0IKio+)hOnpxK8AJk60C$N*CLx%NBi1q|dDrnVg}E z`E~vr~Q+I9{y4D}vJpx`0NEi!e+T7f% zB{7%@n_!U@wN1aw6{a-y3kpzs1>XTG!5 zf}M6CCw$&>+QkjUTV0y{yb)U^@zHoM>u2ew_zSllq7v1*k|6x#1rn$tr>lXHV$e$l z{Z|)4jF^09%Fi9?;M5$5yjPAJ@U=lB`pr-L6nD%}`+HxdN})=Kk}RY(J7Byl4{$#D z7TYyu?_46E!ry#G7+I~ItvV_`iXks{_aDG4@3Ik}LCpg9-TXjb< z@xM2--{$ZH8jGN*KYt|NUEs}N{;1||K|H?GTHK66-)JaSUtgj{tl;X29C&$c3u>6+ zxaY!g(^k5VU0E!L2vU>pHZ0X99dYMGCN4(@{YkcjI2giMF?4eyb?OcH1J~eu#MUhT zNuV@~@L*i;h_4swKqJq)@+zr04u$<2RWWR#NV z`zf9gMpMkQF&3kO2`yY|!IY*_&Tv@6y{CLgwr8-EyqmuWiA_{O#sD$2h8n;jPXPXT z4t1>#74tXn83ohIvMH2!2>q!sG@MlYviy6iZ#ZV%@)Dh7+}=FkhF5o~^;XLm778R! zPpLmhIgNTN+LtaYCid;>l^krT)J#N|h=Z*Hp24ywBC6MO_d1he`|e;+?0-s3Z40nY z;eJx{YMic2C` z6*qCplZTC6E}J83J@Jk&o>Q!4$_gyES?07|5IizIw@0m6K#m!vAWJGhn86(aQfGDN z3*LRjRWXk*HnTZ!2q;?yZY?p3!`Tlr@grI)PA~-M$Q+fEq|@JsX#`AQ8go>sAswS| z;g<4>B;o9Ga8*N&v>4$3VA)}0J2y36RILavf*xoJ47{4MJUHySPPi_$c{7$~Ko$W_$=Nv-XA_i}F2ey+qWv_i zu|pZa1*%KI}X|30&)pt-Gk$DWbT&1{HT1SW@KEWp1g*Q9-!0eEH^b-jM_)SPlEQTM z-$^NBm52A5gcTM0`MpsXZEuWs1cVKS-Q4EO2-%q67HBpbcC-4Cy8PEK+tAKWX+kYe z%Hbk`By|gTX=3We!k~)GMlDD5#P56B){t&@keHFZ6~jV}$ab;EM)z}S z&y+Ohd+_;WMqmb`n24hrRUT-$OSV2Y>}HLOmw&StKxIfzYvL-7@(w)KN7eLhUu|{@ zIdk;>1H7>QovZX;Vb}VTN&XF9{xW8LtquO&&dmD1#Xng+Do(kI1mPOE^vLf7=ajxX$=)4VFa8B1qlWGe02+?d?AE^00D(v z03j&^cL-9y-BfT)qG%vBnUtdg!upYq3XM6!?)IU z`-tcB;q=n8mXT%Q;o?i*_kl{kX|wBzu2s`sEhmcDW(!yio2}4Wz^}SNgQ7$ULt#4 zDYM!P@ZL@aPEDDQfN=d;Sa5y-@2tx;eRg^a0oP)zlI*6;nf5iA@~`4ELrzsVgRh7F zL}cXO7N|O(vG2XKmxT@FyP;hHr|IRuv;hr5VJ5=;Rl4IJreBsjp3`YYVn?RXtco02 z^XxSt@QBN^TreUXB%i?)IBij~<7Aqm*bV_3M6#HgO&G>fVm9sw!BD`{Oh(_dqw*UN z(0%USgQL2y{eDPucTNs%g*9hkk0;nV5Jj(&L!v@d=vd~G9%Tx(I=5^m*H&c58y1th zBH6*APc&O+H$SkElNy0?ZbA@nHh}>QuyGi)XLDa58>Ajd7*jBkv~<|n1}4I4q6;W{DvHc>ra8k<_AXch5?3y(ZAxl7lWBTz1&J{*K_5Q0XEN1gOaoJ} zk{IbL{kSvqxuC zI0Lh2n8kW9wn;UMK5qKPUgq2;KfS?p=(V8yYi~-MM7!>9v&(={1u;S}yR-mK%ozR` zZqw?vYIqm39}#yx7HD4^^@jS)q^#kX^7sRGH&_NO<@_9}$2;d-16 zD06+e3q$$eZguCTB_e5b1&ETxCtoKr^@e z5Pg-pav9DP!W5#n1cfy!b72^CxBO}(x%2z@QKR|>^30M8ElwwQK=0Jt3ngqQ!WgJlOj%fLMSEjs#_Sa*lrqD6-NM`3VGXypnfeMjo z08x{i>2v!5ITCCi7?H8cr>TegE^L)^YvmS;h2N^eaztVoZeZ!^^z?t3fgEONO6(33 zw{NM~2El=cj!&4jnDO9%_?Ou?qwl@scunE3#QDpJ4Re?6!Ip|Hq9xd!van>g2zAEL z&Ntsw!81k9a6w0Ei9{MZ*|(>i4~(2SEsDlet^qjCzH~e{<94gcXrSx>GCW22ITgEc zn^D5OBps`gcUs-s(OIQxa^~`;kz@v;`Pd7vN3ys_w_7G=F4IKrgjQn&gvU`g&@ihO z;I|ycijszrJZ56iYZ)EREQCtyT`Wb2x|&xB+h-EA@7iZ#EjUAIc3rEH$q-nwhrrmA9*KGi(t&@n{L^5=@SY-X$3Y2#71 zdVX>9*B!Yg`0b4@h{2bIWMSFL%oxlxaCulPRW~jI1OMJy2A%3sf%zuC{+`l+=t zJzR2FKBE%Q3F6F zdG){Yf1ZGhji0{bBjArJPjC2P9uW*tSj`BneKoDza|yw@l&mXRQq^Yk`PFP_(QO@kOCO&``vRn-D-R}md|0FYA0xsas?Ku5};3<<2Yat_ntaepkf4TG!g?+M5BXe^2KZUEf7?D@M#AZZ(!@hpz&H;zYzLl^&d;t3v8-^_Df`Z@2JyJFU+$bTgjv^D zXEwCZk{c!sw1;G9pttBvV%5KVbCDmh*O+qg^D+*CVc^sk1uaIJ^Kf#ZZ{xiESHFYt zj@$V>=qFXhen{0S=6hDWz@*IX*O&X00dGna-jdFFyfU95@(Bquctd)`suaFoQ9tze#H+0|YBsR=_+LC#-HWSQRKLjZu zV;t?n42o&FAQLdCB|}Haw?X{x+{kFVYr5=54(OgZkvANUk&rsqZs^V7nS6{enOqRK z7q=-d}+WUB8!_ur-Fs zyhhURE_LE9RFk;}zn2sFJ1k0F*&w1`kcoUFS9}nv{~A!*VbUlIIbzeW>w?fxV}JGR zsx1_&E|PBiNG3m*?T6DUA;BvZyEwg&QUE8k>O-#@REd7lTY4dhe|}UaES#ms20a+I(1r48GhK zIVymLrhhUgz#5cyMf6i%W3ss=z2K$6!bhh8FC#m4mf>1H3~nw?k*IN=aRD_}MUGT^ zkqA7Tj_dj3uLN)r0pq zDUT5HWM|J+T*ypO%@~z*wFq{l-{eBjn2hPVwlQg!8^Vk;Ar-c1d|1QYPJ({w*+sA; zIiMiSVTM)(_H3U~Eoh~-fnY1%k^|a+BDo>|rqU}!xti1V z$vDk~m`lhWUym#Ic^WWq+z+0pp9JqrQCf#%P1saR2*g9P2>2Nxu7W~+1Roq&w|sH|j|zf>Yc@a)P3uXI9=9W5fFU$zKg zrA4Crn)jh}omxWk^qO1)S z_gH%ke!Tdb{`HVP2fYSTg+Fou&^l!9(=cMO(dC7PK(m6j{A4{LD~0s^lJiQ$ki}AB zXJ|xiDk4(Px!cr`IpZ_?aV$i-Zd(gI!kEefrbXHNKm!{YIc160B4=Q|(uk^lAM2mG zU|l9B!}SPWnauq}AOl6O8Q)|uk;X9@Ixt<+p26UR4I@>l9SC`qGG$n~GOtEV3M)h( zkXWSFVz%4`S06MrCommdN|p8wE<}TfHM5^F?!n0`39^}ub!M#pMnb^7t5zP{l7CtU z`;!#_M3f}v?PO7-sPdyAVnG$FMv*H&+kaJu$UzHvJb~I!p`Cox712(H+8_hzjQjtg z?kxlASe8X$EVu@j0D%N|*8m9~+}+*X7X){A5AK@a?(XjH76`82g6w_He&5NxH~0N} zKh~_4n(D6UsjBX(>K;66FX~o+a;*X4as)brIWA*Fjw`8YSqP=m==8=kZRmu59!QYc z?DWn+f6I@#$qyC_iG@5jQOZ@O@3U-K9&Wzvg{O<~?4H>&Jk&+)g(nL;b{hAs@yNRz zY;BGc#5Dw&#(t)5FvHB7^TTH0a?VeQ-U?4jcQLYnRaF;YL9A_zLQ|?x7Q!7aKLgY5 z`W{moPd68~qo?**7X&gG4K;+V)lB<^d@iix>-x7`z$mt?27YeJ_syqGYdgQh6Ig>| zvg?LU`3&2xCkX8`aJhSeviYZTYde}N9>cn)?3~9AeRoSQ7PaGcGfDNGE5xdu;pXWZ zPqX&TWBHvc8dF6|i0f9479_n<@YpHT$r}Lw5C)&F!K)j~{GWGvcI%q={!G!go%ZhO zCBuv+D*^j;W;|0LkS(>zAPG8x=ti$3q%deq8{TZvsIj=A#|pP#r7gE8Rw zVEv#5_;yQh2P^ISJ5Bm`)aU;zCjI~1|IYHaSAw3E<=>y*VEyO*cX=5RLNX&eJ1Y)a zT3u}e1AQ7DeH&AKGks?VV_RcO3mQusLvmPJSwh-pNZ{J^Z^r=Zzl{ceFQ)k{EG+GS zuz#uW+)LV9*)8b$_oLMC=r8a7roLIxH(8g_PeLS{NP8g>Q-LUmZ$ zPe8Ees1~~C%tuQbJ$;*hmhchMzjR#&mR1G!n#d+7g&Hbw?E8a8?+LMBG~7uuNV*=ZPo zhZ`|5G5jxRdvU7#j<$bWG5$SyV|}qw{MJVCJWBtvAe1N!SS)hDFO4YfLS>3(r}3h+ zZX_z(IeLN~XYLm6>W-lqJ$Xn2>3vCGY{J;Q+A3>S$bJmN;RA?275JZLYdg#1iNf zaEC)f*c3ra(OQiXMmF8$c9?_m_*Cz`iIS@&rn)nfKL{M3gJxpUwD5UanokptGjnGIr3vg znn+1W!8nODUn4c^(Gc~bCN)ZEIBIRR68$pLeOE zBD$uv+Zx7ZwxiS|-sZAw4Z>j1XS=_@|8B(jqKTc@cLZUF`to=YYbxW%oEy8dX05tO zQ?Ts%h|US%YWC8Q#;-UU+-6r(5tKshN74s-n;>^?%?1A%u4%x5e{TBtuJ}M3RXTME zDN9{7{byl-@v%MC;FM3BivIP`EL7`rHqejkC~!L~H} zst%fLw{^L`ndLwo>Gb5}L{US1SS2)Uqcvfdvbo9 z`2S)ggjN5y;QMzN;Im~>M&H)b-bPp7mhkyzndhQkhEA!!OqJsLKuP$~(uq*@`9>Cc z20~VL2K5)Cq>ZK3Z!12U>FewLwnomz*!;H@Qrb4p#?F^$#An?U41bLoE09bk z8lc1DkH+k!`@f~@pDOvkrt8=F%zr}H-&UJH9I;IZ2vSA{WpZYh@n3r>^DsN-@S@2gfRoBivM6TI_5uSvX}1vZot@o!|cCdvcI?T z|Bu3h{hxE_zn;_oOcxt)%KPsDV`iuOV-9=i|8EKVGwH$nvN-tXfHBiE(6F*G{-^X{ z|G$zR%q%Q_G1;^5U}k0hV@Bf0d|E2i&B^a5R>Hp@l7utXe zmp|n*_Wx>5&;Dlugyla3BLf>74L$Jf`ww--{=XCOs@)xVUkj4bmD1Rs$UnuzP zu>F|`c~R%U1K0j%R{OsaAq@1tSnYWs#zx2tT$uf-G6U-M-@cCwbbls8{*y2!Cg2kH zH;S5p?tdvo{u(nn))!V|r(vK2vKl?hpR(F73Vt(Y40L}cMSkh|e~uXo-S6ih40Qij zQiO?};TNm@MH}7odisxa^)C{BOWU7`5qj3=;r)Xbl7a4jDMem%8WSt)3!^>1k3b^` z8|$Ak8Ux*bAwz&4cmQ_zd6xV zeprAU!I!~1DSX3fd1^n69(*U6X7V^T5&AJ!0uak;0I|`%+R|K$MEUgOXPI*o{&cew z?*X`Ja0?x|>sby9pAl+H3>hhQ>o9z}3a4Fh2i%0GXH11(o*sD2NT-$%bj4tlRM7zL zZ+Ch;9>m>mH*Rll$NHf@+*p)Io;~!;gs*sY2wf(-0SH#q-v~!+INi)WonEx?xIgT~ z^SE=Xq_TCRrp@j831`)&Z; zGY;N&)R!4QbrWGTzT2>_ z2yai?l!)BUM0br1n0uG?d zLHiwAzJoNaoQV@(F@kf1(9PFzHOxlBRm3`se0wz%PxLLijQV818Zor3*I|$-FDp*K zrkQ48A~*I)=g_(JlCZ_L|Hw#Gkca&Q9UU#Ief^=S5X}z@c*J`ry5FD`i6OAMAPHFx zwj&tF%X3XF%P}^(Pauch&4OX3w@Sg~3HT{V3Fe&wy*`MvB2n!CY6CA}1?oWHmevdl zD=XhMQ+nm@egT)qZLwYsz+08xAT4&)Yw03#g&bP13lg;0X5{EGC6rfl!boY&n+H57g7ra{ugd(apD3slUtKijhKuM>aA-z4a zL3^TCKhIOd5_6Q=B9C`@n%YtwI$2ltxS#ebVp;lrO!}B&F?;bXIc%P{iGa`NA&U*{ z&2`by1`iTXqfWT3BU8A?)xq_p!B}v*OlD&ets~}2IS4AClRQk#6F?J>JJJ*FtQ=xn zcb+n$=A$2m3u7pOhl)J`zOGMlDSrID-e$WKx37H*c_gKlh_5zbF|q@~%=c$qS{*#9 zn&6EaTcR_gAkpnlbFKL!=`T*r2%1_>sxBIx=dbZK*;o7qs~NTiHcWTcpx3Rn*rGU_ zr8TzaLe`)kuLT3YA<3#*WTl*d%Ti^NPyYn;-Y3!Ht@EX_Thr6w52v4iGZuyT2j94H zB`Vs+-o^Gk49Y7_XMUN#sp}0f;YPQj{ZdS@6d}UM%b>!pk<>^Cc^d}f6tP$7M6t@3D_Q}jr&8k+ zjZJL}io_s-F(%9GyRiZHAs}(^6<0tzGA{PX-Oa66Ep#ND6EwO`-DNt zOYiN!-U+r1h95Nh6ok!%M*j%hNF~*E#xt@?6hh}z@Wr2EyIBVkiMn-i3v9V^woa|J z%LbJ=9<~-b5vx|MHH%tj$p$oBBIK_Bm732WTNgZjYQjYtoYT3^1f_vh!ZLlEf;nx6 z0d2$Gir6SqBrCv6a68c6mn&rX(G68D}1>P+Ff zYrvn1n9&03wEagC5x)_OWAutgZ?bwrm*tFn)BVGSXJG#77bmT?3j>X^BhlpC(@iVD z%u;CHbs*0dXf2N!O{jHlLn*N{^F{{<^s?5AG4zGV3~8FLq4D7vQ}4LIlp+kj-$7fA zY4I~KB?k5Q82e=mWittdeqE=!evET+Q2l{P;pRc+?iDmbx9-BQMaKlx0d;Y_(qoeK zKZ8#q`UhRzbXzQtA;jqrR>SWzTo(b&l!? zf;5h11zC^Mi6ul~Q6Tz?%B;yaMHYOZN0BS`ahO7&ljDM0=sxcpHE?+arijj zW{OT7pDHTfIuKE&9n8R#Fl`$b*$h~>+Wabm{)64Gl@;55G@0PgPeTpo5(<&*&_Iy4)SJU zKY6g=*o?lxz@#RZC1Ps|ZqU4Un6YVJG+##vN&>%24JVRCx|*_?JC154C0H1<4|7eX zU?^k9+EsWC!4>^E7ypEIfT9PaF3t#Qb!03Y-ECSYR1MT4VWO3+& zZ+oQ1I*FKs6RenmHb6!?6@nD3@%*^krKJ0qH&lq5K&1O%IM_*DKr^G77G+VN(laun zD3^s+(rAY{lf*yfXd#~GXGU{(Gm*H+jrCQn*KG?*-&6uxWH4hujXmvzWegyts+lPD3| z{zF6z3%f9BH#oF%A#)t_Lohh0_m*3>qkN~AH3h)as|J!;39hM#2oVo*U<|W?Lyw1f zAMC<{&d#Lj9G!p8d>W_&R62c8D#sgMQ$tk9?83<{0kvNR3^aweW#`=3ZZKiXkpc7! zCa8Q3G8KI&IfX;wi!wV-LiWnsS1{CqkX!24Vz)LTqX#h7K?}z*GlB^6Drx!8BUI$~fL(nlS4{<=l(5q0p9_4SV*{q8 z?N#M&iR!g7hnoXR3D*k8Fj1Zx$ed|VkIgO%+ptBLEh44dp4L>l^cgj|(z}wE+~{x= zawuL1I;~G;! z>D8~4m|ccUAs`)YB7{w#zW|%bppd&~mE%gLs(=++AwpG7$^3b)7OVgW9MwO2s6ZB5 zY1}14zMw!CThUc!M4|r^HV=5qA!nNCTsc@_47FfEN4df_Vu1`xX#$0QkrFY-E3Ykv z>cK-eeN?dTF|SpN%do@FMJp7#6;cuTZq)0dszPF&IbBi_+ibA&qBZ5#V<|NUW>=>_ zTK1D{l!j32cac$YyzzR^c-lWFqcF&jH}SUDKQ?#btr81rw1mIbQV1NdIz`DCc+Fv~ z*tLV69J zpvCyGX;TIdXB0=r^g+A9tBwKg#)Y=F-r5nLK9s>+UycrJQsg3Gx~U7jK9mr$zQlqk zVkNO)b3q0PLX0S_AK)8Nr&U9Q-6+MmL$8Y%19ILqhkby?y;^>2PQ|@H z-rg~wV#lMja(OY3qSHJ8QUl2&s`xtE;n; z;)uuQTYg~jf>hz{Lz7jJ)!qr56qBrnrsqq0)l9Ze-$hm+>1shuFzmBHr>bez^8lK& z)MaO6vxTPYtj$;GvvbWfN6lKCp^F+)jZa{&RGPlc*IdlRXUslvV_LPm8S5$2alV>1 zawI6fGtkSgZ&w+i=Ei`P}~~d zNOyNr;}6f)7Y4yBc!xW3rBoPCq03eSZ*M1paPH~APOfoc)9zYR1>$>wtnBK5!Ck~a zGBle9HeT}F_!w>u;wNaEt`6*lY9KI*mmQEvkvD_rQh@e2LM0AadQG7)Yd4Uf~J_pH!adp;qO(AH2lMp4daia-w|h8?eP-EWOb^%)TAuuo(I~*R8TUv{D_-mB`bU|n z_6$Mg;|JDj0N%q$__=usMztig;zGK9QCRZLJEpkugx3g}8u-(B+ex#$)vRCjj2O)m zJQFhlBHogQL&m^Uck3>H@+R{l5`|O`hLna!&jOPP^Rt03=~iUL=|@4UsMHhs#O_BD zeb+nwxr?FC0GRV4(qd826b$Nzdq-<$NhTx(F+`_iMAkD(*xhu1u!W^uE^N&d!!)_{&|M3+wdc_k!_dqucg@_s&b1WQ}10>hyriJACB< z3c#4IDPIn)i`@`#*`-OV%ygRxHJd4_d5)Y6glJZ)1QsKGdmr1p>&a3Eys=7eVh;{t zp;AJVa1lce2)tMf1fGf#$f9)_q<#i&U6|*qW zdoV71TpX-^w_Vh4*1(GesF`zky3k}^IOfqaSU`A8oO1vLQ16l&EWr6_F3&g!A*~Fe z9u`=2Icnmsk>BH$QDIXW=AoYoblM5|rVeIjv5$CBu><%%^g zRxkU(r;DP6^PppPIa8m+eb}t^V+-dMFqf^L>wy(aL#+rIP_A_7Na~4|9MbZWH>4zY zserIONJhkwC7@zGXc6XZ_hlS4BPsvvmo#cc6<}HDV&dC&ow1czJRPG&lTTO+ch!Sv zDB2Z=C&RDls~s(*$)mnJump)lY7Gq)qG?mP)a;^(w8r7e=Lwe|=e|!Rf>C$| zx!f#}BV2xFfF4d)ZE->D(*?_0B=>ICIg1P(1_M+ul_*f@)vjF-1e}!uJB)S(BHbRE zh@CYhg|^w;z9@8X&KKo8;rcn-vTnC3gKb3l%N27EsBd>4%C;I%5x~JDH|`GdEH|`A zQ!A&GG=|%z=N5NkJz9HR(L$P75&Q5b3*8xPkbR$k>TAP`gl<%}R`40;}o{eQ@XmC%DXbBV% z(cI`H*X2gK(GTuV89cxT9pIovg?Gb0ntXSM>@ud_Aq{Yc-!rLlha{eVZQa+i{OQ7^ z+8v_nUNniF0D#q~Gu)H=>0-ae9m2ck(qHXt>`R;Go0$=d@<-0z!Yu)9$$D9t1T+v z%q4V1fq+L`n@r)G<<=`>4jxzS{AkmC@#~NCsrall?~dtJOlMel6?v~7Iq#07Mdqu6 z#^Y5+^D5?8O^dR2mN!JxE%FZoIud`7t-S=s(*>(XQO9sQWX6QmMrlhDC z2y|6lR~S+`+iXrlm1U;-YCGhJvo>@~A8n|pA6N@l12j=o&UTnXz>^1YFK){)w%-Cx zh0jPDYKOkO)vpLu#T~lFTDY=K2L05pL(G~=ata`QzRu?7?lZwCysyumc!ysi(j*b> zWTrA*jJ`~ra&S8aZ_^~-HHtHDdVVk zJQ96H#OMrH#OO-ZU%!gyG^M}D7`1=jEVsYN9JRm5>@!@=ub=MKf1lO`!U_EUVgJ#_ z3;yS}DE<3J|H2P!<6mw4v%SCD(rr?`34wx}`Pt*W@QR{N62f zf|1eM{S9mt1ppVH0L96zlOOPtA0wkd=5GA%+)W@TeGMPdGMuM+808F@LgIvR`I>q+ zfB?dY!`;JDz8OTMjsUJtV~DTAV+p>Oo;i8BoO|(W=jQBO8NDKRj3wqVQN1{YKwyZ} zF4k)$OHu^3BF(>gH_lI@tVHgH*~^G_MEFWPQiIo~h&L_67`>PAdnuT+SCFR_u#Tw= z%-OG6o={S%0`VA_i~}Y|O%y%3K5bA$7#gX+I)gB`0N%p1^y)0ctcdq9L?`rzI^oD@ zBkU&3{^2uBE!-xyvVtd&HUuCLeCTs4_UOH+OxF#(X^}7Ol>po8E{EO3P6A@)iw0ta z5AEKEhcAYqQO==_FbU=W2k&FyqVR2Qtz6Ayq>Hc$mIjvF*aFK$#t&fz?d#v+(FQJVIypLf2^B^bAtGt*@^+w+~!xUiV?)c&hy44$=T|& zWgx>H4cf5w$HhJvn5~!^Vl+v!T;j2H-3oGMorhNF=A}l$AB>M({(`TlB3+;mEjLB>0g!9PQdbTY9~SIH@bKDTpaJ$dq}vl zzK2zs%TF>^pL8(79g-z0s&nh!NpO7|466iCrb!zM%~ir4VskodU|%@Ih!+i}RnCSR zDlDO}oFh2fiM~63<7{yBMt?!wW@NPaeYixRPX*}+S-Y;;N{mn*|0-8c5n6azHXN0)OE~|Bj1NlT>uPMu^j$UxgrW`6t>Zd{TOI2qrC6@ zqbhLReaxZ|AME5*h^#VCC;6O+~N3zw$ z}P&3D&XyBf9GG7UWvUA5g<21&10zF**L1gH2&dne|zS5 z^YjF|iJ|zrU~jg+J+Z)8yO+Q)V5}W5IO5q6OwaZb>;n9MajgOWe?@XVd*NT|Ujin8 zaKO-xU-`e_fWghr`Cne%=l@^$e)$h&{u#sfZ;$!^12KFrkLo3|@Lw@}zg&_3M-1OD zN9412l7*fAU#Av6JFNfqSw55c_l|7l=ghA#n*ZF9%|QR+nSBQNYe%*!t)Q8w0+UcU}aI~SR z(*gSGr)0{RQV<6bKHGQ_kaFgVlOg?gR3ISb-@x7AK|q$F4p%OaTJeo7R62I^AJ%Z;l36-MfW3fV{pglUWs66Dey9ON+Gra7+&YVzT-=7W^t)q;A< zBES?5?I1L|xs1{3&CgG<;=B|EhH5-QoDcL&Ij1 zBuGo^l;*|UO~XYgw@1~?G}-Fw)d#@c<;lX`q65vN$hU`-Ww~N@? z_o&QvW9OT1Pm>CqMa2a~v>waC>av*mWo2dAkSwgzj1!Q12j*~d_N%R)p9t_coUea~ zG=*>SjNe&yOiO|!UV$Ecx#w<(0d3HCIEtLBnnIL{Dz!Z+eRD1UzO{78b$Ow|^63r= z(VbAA(2cCBEseWjW#OCSiL1qEsbw%n_&hm&Q+I;A_Y z;fj+Z9=_(t8bmxU_w~(!i5OD!Wkc$PXn`=`zG5QMY-fN!)O#p!O{e{K6_h9j1%3|ZafB0w7fqu&7vimg=b?yw$+1c~+ooWYB zs0-(v;78B4w;Z}oKJ4^;iAiaR0B+V1O%)9kXn~^jD)Xjnl!^n^>(5Pk*)B)!Cr#WZ zM=R5&Gsm^&kcn59?huPt;c%>%cl^B+2Y{Q$ir}l3B7g($tIcbLVb;o%)l-js$&?Mt zqUx+U5Ah1sC*mP@#Y3c~gfE|5v$e^;2|;SXAeX39gnV5IYW-5`VWXwLcB}uOI=P;g z3q$MpS)*yC2><*#*n1xeM0&h!*m;0^hL!+)vAnv%u^g0_ccvT}y4B%<$;sFCfnhaE zLpNx;LefzP9U-2~`D!~G^n)}K1-g4fUX+k}t%bQQzLXBW+$}X>M$5_m6gLtmGVW^o zh2$lE!>Oftymi5Sn|kW^Al-{ExZ}9FTGlGCWi3mx4smhin&MBG>zY-K>FyMi+ycy; z2%sr5PfU+kS|bnsm>cA+FN#?8KV+!C2EOV~?%~px?Y75W4;!=})DCFt?;~}rSys0!#Nsw0 zWqRTpXbA4kPv(zt6IH+5Fcjp_?iVa1Uw+aAo{xG%J@FkY%LAvm<%iAcU5o0^QW-=I z>l^_vZ_pjGFS5A%baW^EGzCeCcY6uhC!iGl*jI_z2YDC6;A!!(AM#wRtVq$DSJ34+ zqAMQvj+;%dp1K}QFqAJetxYaK#e47^(;Gb>Zh}AMH{;(luWNzq-hNtO(hWxEr4+kr zbxjc3N0}*?PCvXoFT~;dJVYfb#Zol=)a9=kA{0p4Qg?PF_x1hBd1!k(ExqmoE$Gf? z=aa=d~EheI>#Hy%JkY1Tt9pZL&?U~;J_sGqU^HTiz zh~uPcQ28ZA;B?>k{qA_z9>)v;58&F`+a`?$mGjC8>2*oLo~fnk*YBSQXQzCGJ@O## zl1Cxf&<^tqjIBrEjlJLzkS@Y6*@NK`V1gO=l8TO?StBoN`Z!Eva)nz!P=$&pTPlUi z2B+NBKdY&wIN%B6qG0EPLwL7w)VpxFxTwe=mgHZT8xdqHD8&THwYPoaWGKGR`WjjO z!w8G$ux7#6?}_Gs_99B+gX^?dzkv<;_zEcwiZiMwbVY6XkmKb9AwLrl1vHBLWmNQ| zGA98UmD%0A*pBAh)4TQ+(Rr$KJNq`3dR}Vo4dAX8RBmEa05P??E~@&Hqrp@A&4M0h z0rS0ECSWPajVmnCt9w*J?0t<5w zhC+URk87VfIipRrrN=&KOFfw?V90o}z;7GsWFtY~s8@`~;`Bg6GciHpVyUXrLwM3C ztJ6)+%uKCR45jBiz8!%D4V{}lO`4iJdM|h@^j3!`<8j+$Vf?{8-u-mFVZ0=S78gf7 zZdrOoRP(5Km~$PENPFDBmvj@U0^^COcmD+9p?a_d`PBcusGQ8$s@qc5y`mu6qmves z<3#O&WdF_a%H&13PuK08dLX~g@hq9)38 z<_)#Wjo_Lzou7Q~IUAbnGAbSw%6Xs2$iI1Je#icdt0X%jB`G^1tT~^}qze!S zk0|{PngbwT!pbgyVwr^417qgn)ink;#n~0X6_yl@?x!D*Wg#ycyR7oGQ=8|#CFGXX z1&j)K!wJT>wGKeG2GGVmn>lW4_+4zWGz||F*+dkzCxO|u5n|CEXx%Q zkBD(H=b;F8j^)dUEVFGgJUE`&8q3|?oLG&aq4th+R!|2=TBC^5D{YXRPKKpSug^Vi z$H&ZzTf99ou#U7g%;BdO+Bmtiz{y$08JF8u&8b4E0fe)&T2Q#hT3K(*8og_rTUX!U z{{s=HZH*!kwG0At&S@TbsIvGcabj^@@$%eBCf=_kQj)09;}H9%q8rlv5KQASkY#Bx zia6ur0dbHGo=nF%+LWPI#;Zv<*qYNb4O;qk$|fMl&~~S1=-_*mB{V9Y=XPakqb=7( zm`|8vIFAc;k27!Y?tXAu-*Fzr??&Q(eZ&|~y)NtZFlceu8_$aj08t8P=`x&`m^W0v z2aITZ6qeLz`35{s1Mh=84{p&_X^P|ZlS+Z6(YTpN66@Z5nz{(B`^dCSMyudK5FXEz)6Ga%pFut#|HvY%Er_v*Adsd zW!EQwap2?UEsCGv50wPu;Ng4f5wdko8`pszUU-1v8$q`MkG?+kv&U6cdG8Sm{T(+& zPCfgHSGTKkU*`2&@)r`7!|ztY9}BZBy)2b(^=|uTqQ_P7Jg$~o(0gR+s|RTc)-F$$ zE)KvzT|pZ3vh^Pk(gW@^-4z$EF6TOVVt^AZJODB6@~tg>{VQJZN7P152-*ZUocOjB zjGC~--X083&S3B%BR(at!S0F-#+lJj(*syLw3(YK!RxqFuf6yraPXxvSKLa2*Wzg( z)VDBr!824)(s@2N@T4XXunPpN#u(Rb)eIvS>ehhxnbb+Y0*lE=ZA!}M)u#TzaR)s@ zmbx9&V1>UDe-NXfi#s7djxi!N)n27X8yp z^aB68jf=&rKs?2_H}#R>rPjbtqb*-NdPl?U5-8;%TM2=M3ZG|WyAsTB!Pw1{dK9ZI zvo*Gy9`WM}c3>zEkbCQ*4@JNs_Z*t+m>ssw%AE|cHT$?4G&+65|HfrGpWL%UT2IEc zQC3yktFYMYvzKSH)&>_+y>W&@h!r0jFu>&x*B5?9%$0cjQRL~{?!}1ZUW;je)?RUA ze}o$~^mi)W$^O_5N%%>^-9!Vm%z%m4QH#bpCkjD|DX&ToICgCdeJiX z2UU~s#2_kDBAvT%J1k<_dU=bhy_ZB)Aay3Kx!rON6>_m-j#|&TZTpO5L*Yu?i2;o( z45#f=9d^`HCnb|Lzo|2aEF9DVysQ1;h$q_WULT$ByJf}-s<$BV1ir5)&JTIYlZO&; zSt-Fv8{7!Glwa>(q7Imgn^2#GQOT-VZ@=EODp|yt(L^UvYH%uWF>fm3O5#_ ztgCebvWS&)2fvQ<4(HpYs|dz8=f2kpp;6#LrIq&QGQ)18?47`PF_=*%lqYFfi?Mqm ze&-N?Ze-E~Zo1;UXC0<+fZ)1R7(_RS?}i_E_h*UM*Qk1R44Q=GCaV-9PW=@b!1zL8 zOElRU*O?Y2E!_2ohVnZxLl^wb(~K!I`2{t+2-!G1SVIKfT?mo<_d2_iKl7u@ke0uaf-zuzuKpgNL^Jd7O7qhn~TY@3w~&W)Z-v z+|w;gW25HsQn;9}$F|G|_w@oUiGnf^ckN`-(SG`PzN!RWwme z1;6Gj@qqCph?J%&)H8tqKWcT<#(Hpu7{Bb}<4TcZiqfeqi7N&W%ImjX9&bJn`e1Dl zVKi5bjIl|Ep|OPbu`@U6NKO3MC(xcFhns6{dlY$!NW+jFW+usEh!L%;Ffd7cDJr@? zu**0GS`%-SzHA&s(YL5IkB!}#pum_gQH-l&WBjZgK&E)JWl&mm-pvlLjh?p#P#I4# zviVw$6HHl}CaPY3J}AlnqV{O-pH5TFhPOU0t7>&0@j-A>-U<=AL~uh&49p#1Fw+Q` z1ik(~@lDGH`^r+P88))YN9+WjW}~1@COfeX?`iEal}|MwIG4%OmV+m!h4>W>NlTpq zafnO@@LcuR@cy@2lT7XAaCCv6PYh>v8^3py;6~=Bx2JrEzWCvlQUME_5$WtJ3UL~H z9EMiQ#vaW@fP{9ptwWlBTGTtlC?LBV2sSe%CAYpE7{Z0ap3rR;6t9Wm$4ET^58pqB zN^FTwzZ=3A)U&5e=$6S;E%*sxHmOv&j$s%i)V8zg?}DG4R329RmvW^GQm%;yhF0XK+GS)p8Ig*x zzv|T8GS!8wVcR6To34tT{iJR!R~;mvs&(KlJFhSm@bs8e0EkE)F@MO-0cmze3Z zZTeceX)t|Snaf&im!H7gvtmR?vp>*i(afQ-Ra|*^jL$+uMleez(yOu_I2AwrBaBaq z=#tn>&E#{FJl&vDR_KBj!*k zQp@wm(j1LKUam&TOm)+8nX}q;6)4141l3WRU*#eWhU4Ar7Vc&#Rc6k*vx2hjpkPs@ zeY+0n*uzASKT)| zZ9X_Vscg5K^AN$?3s>*G;e%rf&`$;Wo;-%1F_uURjx{cXBx1TTrzB8b&qIFNBy%`^ zBe!5QKy{g;I#rY<#Is+W+ZiadumLSCF$jFFci|7q<98<`&N&i$)B?1#(MIHRKXK=} zc-q{4a(aXfw~0@uUeeuv%`>U`Hcw&J*Pg>DR2f0i-u;TmqJ9RAAI1sxTJ6%BKp;@^ zK$0Q-KI80>m@Bq23?`DyM2mn8DUWM-XtKF_>^e>s7KO(;9{-ep5sIZ5@6N<+yT^Af zbYts`y3T}mPW~0ETP7di4t?bGyw*^kT#XOpbj;=M-FrvtpoKU3%B?O_v-;csR(nCV z8meyc`cem>iuhe=?IXGG?ENG^I2^wG)P*AV*K?>;hL?_K-Vf1C-*={K-dr&j>6={7 zV4+c@d|v@YQ1o;U*=7>AA_lFl|C$`FHX-to%E=plt_22iV5U?&RJ7jQ*il73P3kS0 zCc@05Nzs56HaQuWg2I|RnKNzGIzrFuhlx_j$4$fcpTGt~rAk4KPue{7)QU>#8ybw! z^7R_AOA429M{HEd0$`O#Cd3OUq%M%-b#C+{*W9x9+514ZV_ zND8Bx<8S<^qw@vU@pM{7cZu5W>amcXV+&Su4Pt5mRCc2x%tqFGM=bbztN6U9QI*CB zzJ=#(SuEy?3a6)O31nsj&3D^Irz0U-svO`MlsBD6peD*N8W={zCO@$Fdi9wayz7eX zWoypnBXUW(o%o$AngVqlGP)Jhz8S?+wihEpq|b7}LG|9xF~~TLsBU#}@g(nC^UQeR zr?Z~hW zkO!SSoT8!wfx+|r2`kh4$=ORS#&-W$CUnWGvvRpSNTj-mBh|kda9@8{n_OvgL~Egt z7{j3=2*Vd+2Fl>f!$t9yHW_BXWM&gQXhciFFCY3_Jt{G=dj6NOF`C4&)5tZ6Y6`b3 z)%C%$fS!T{Ha)e6^@Wxtq)GI9Yy(fl92m=h0N@LOoY9>sP78HY_ zIzO4V5I*}WHV)Emn6R@m*JmWuAl%*tTJ9{_wM)(TsF1^am13cf5KUV*e}Z*G1L_R%pBW3^MI3hUnX6S;c9oqoaCt|;6%B38pz|4aS+{a7TmtSBHOkWv*7%A69}po%QTV3@raFG-26>{?2SlCzCPU7z}H#+ z9``meLXXJCQBl)Bze-zHuMLmtPGOZNCZGE0sVAry)P6B0!kn+6p=TQ?j9$oVIls5e z8>Sum;RI&D#}P(gKqTFEYwpcj z_Zna6xM2M{Hq)_rl+lLEyJpF8`(w)Z?B(%CBFHSu?H-4s0kB485KH!!H7l1^-aP#- z-ZvUBPs}D+nd45>eN5WLxnxEUQ$MoDqT>5SH4L}RYvT#iNl{;q*bY$cJB|x$aGqvA zoQN-6!~_sqfNH6J36_*Rl(j1;-Jl8`vypO>tg6IANW>gijguOLb{lgpp<}Xk_H#l? zpN@|~}vMfVq^VnHHzPr2WVpV4J(K_z zPCJSnS#KFP_R)l3A)>L`%k(MWG~;i4cx`-dpu zmkOu5T~DI-Tx8651`?4=CInxy?n)<%bhDZX4mG~Pzy&a*wOs8H%v0)vssH>bD@#8> z*c=i<#xvjy_f=Lt3Sn+(7SFoPliPP8^EuPy=GfFbHkE4||odV8* z{X_=!Zl03z+hzPEF_-;5=V^!#no06GdsKKr)chfxr7H7a;KC~J?(Pz4=HRRdh$^a! z`5lO6);<$SUWr5dFfj_p8#Dl337HtZxz9UOq`Q`lxf#*4Q7}=zoQkO_G%J%%5L7hP z9*@T{vyBruE=GA16Q8f~W5xM>Y=rS)^a8`(Ehjd-(~)mihbEGbBdD1kn)f0bJ%ivk z?t)=Cbo83_**D5lA{H(hQefpR8TJmPgXarDs03sAA}bSQYwh;4TR~YnX;-9{pvP4t z8{fGqoh#*yRliJ1)Wm%mE^?ma<{Ix+;~S=Hp!|6o&ukD<2`iA)4L(&-ZpJ_oe$dq& zreL^NaoeF_-1lgAmAnHawO$3d8q(Rf+5AdZRk9!F5|mO2 zTUBJgJ>L8&50_Yjo@^H2|Kan7)OckGr=A`kFE+LU$ZZgx zVF+u2C(Z>^(t$bBHV;}+t%v1fU&lorj6_y8-N2deUXkqSj5>4x3H;qKVX6KxUo(En zfsG-AnC+A|mzma3g*h{Rs||R}%Zn?QZo^p2fZjgXSi@)x>-_@i&r$>%wvQv4+{U0zc;FIv>naSmZhr2#VJ*3e-XZ;r z=_c&M>=S|ESuz-&Zb>yJqYVzC!cs9OQ}{9%HFJO{IrQc0e;#-P=_*1FR*n)`> zGj<1e;J7%t&}38gD9aDw!cOjvS4+-R?NBh*S2|H)D-~qI-mu}unawP7yIeg}Bbm<{?*J$J`EqehQK9rK@cSKqcesYEB%cB1LgFOpryIS>*r0uizP zKL9sC$iJ#af}?<#ENG1mpTw{;1Nee-`pBLmM)I6~ItB0UkaOKxbtIA&U#vOu1Ts?R z-LjcDqJvnDyY+7m#s7cckW=owJ#5ASl*l} zo#vRhc&jDGw%zg_DxbAPuu!M72@AN~<2C_UGxrmHPos0MMkt)=Nba4i%vH4&Yt=qq zLgi*`6l*od6P|=cnnpp`7H|mtEw(c)laofM?xqFWt*~YK6R!|IcsB3iWDQY8#mCPM z)6hyNI6`0IekOi~B+*13K7v4Ox;#7({whT_n%<>R#yl+n7=UXtoXcPMmU`I*^~o^#u3E&2uCrd8OAzwM#w)@Y zOB6gTwQkh=Yf{MI_{=in{;0I#FzLI7KUEUOR=P7t%x!wuI@`da6;YY6ljx6sKGz)I zwtjN)9%r@H!Z7zMnk2pf1VQ-@4L(!yN-CtUMfg&MV$!wpkNsMWpEg$;WA07P z-k;XV)bBt8TnxWCei_>ehlmN3Im&Tni<8y@PUUlxi9GpzL zBe}WDUP!|l4$1riOl3>!*S3r$U2LtgI$ca#{EK4s(vm#MTr+Ec-j=lKU=T2jl%Sk- zj`5fvt{*WmA>n@5P(ue|%@~%`_iCc+Md(t#9_%gXD)qX(c@08KMYWvJENn2Bk6Pg^ zy71VW2hzq%w0JP#gBJ9ust#zYuCuV~;pR*)9o6fJYpD};)fKTn<1SkOSNe+$C^pWC z4&=paM26?1JaPEkTXATu{q?*ayTvP+(|FAN;MWngmI<#X$TMAh=6Ze!|3oTQDS&K6 z`ws=@?tHpAoU#&I^Fau7cnTb5tv0c0QOubGi|qp=1L|uId&s3T8{r{YkM8B;?;MQf z*Mu3KM~tYLk(m6erkcX#)Ovn7wIGDA*|;~O;`IqE#t0Aa$C z8p*Yk&xy%&kiflfmM%X}OW|?S=Eb1~Q%LJ%;E}ReJsNBct|!Lt&y9uZSQ5=L+9_4k z2^^s@!%3D^Ytjez8zY3uj;eB(=)TE?`VJhb?adl9*M)QiWoeeRon2w;owNBkxY7&q zI_c~WTYxv7kHpKf#K7R<1b#yD4E}^dxvGl(WwIO@sE;GpPYIhvsf;&8ZMTn*KK}e! z`td`?+dsGI*O*1)mvHKGxMazuig*iP^y4{|1#t`D)4vU=|9cQM!yKaX@7>EdsVbSd zU#xBBK>|67#1p+C)5VzO(c?#SRNbwtd&)ad=2$04(o3|BF`MG2@(j7Tscqh;w*V&?Y$6RNPDFdOegxw)=<|;X>zEq1 z_uE9}bY+TrR8)&hM5#R3Qhky^G2_)1;M5DGW!Dw}Ox5!9+X685?~!`z>GBr9N$kA^ z*d!Y8ks?D}UTWqv%0Z4iqS%sv!F{No)EFFb?4Eg>A8E2`^O&P#{rbp}U zMqirs(%7iziu+~=*Fs8GhmX$Ar;*XPLtB82kk*@9fT0@8Ex_%s)pV*wd!d%qqQjs1 z8wyM#w*dC!a>a7CrjTDl-AfIgToo6aEq70)C7I9E8m!@%#T1qWx*CI$X6G(mXkn4Y z7U0&oZ7KW3)_o?h>PY%N2Z>)4dn0&z{q=nB4H?V7Vn48X124PaI$eFJcvO4n=+@?2fQ~A><+_91 z7U0+=(f0*s2Kbl^1RQ#n>L`kI5hG16l$8c}TKx@341a7YILhOu&j1sgIKU?K70~Z}5 z*J$DBtUy80#J1kkb03RpIx0R3_QR4CFqyL&IklEK1CU@p3>}*%UbloVxKs??-EdHO zG3UoynPkpk%4^)6c&AjDlOUI$L#H9s+$In55)OhyIMDT}=37HkKW=R(xMF?j|C-T;X0)YW>1&Taku2&Ny;F(>ZV@zYNFOq=|%=s{=&? zM?e2R>^<>Qowheg9>j7pH1}L8%Hx7iaA~-Ex!y2I7{npS{o-2y07NYs5`h8 z4qxykNsAUyx#mgTNgO`c(1ZAJK+!B3C!NF6ueQUjw0%elbE2E)Qz~-<@2=pz4SwXl zY4;nPT3ayGe8j_7fgrO3a~tu%4y}y75I2$9_%rXC5fx0Wd=h)%hfFic=)!9OYf9|x zY$!xpjwJD^91Tq@-3B9B!u8}(%JXF z{mp`V(xcE$*k`6^nvY3y01er&WjKqStEd^h)LCFaPEkC~5^kPW7J{qum;L%*{W$Oq zlY%&WuR4c-Z2cf<#xPc05E6i=3hf-CjM(E1iYy0D?GuWJ_^srkjbb%}ybUjkZ~Zg3 zqGhZ##H<#^k?!bJw$^6S7;%~VUX5omb(6{APd7CdN3kc2tKzU>s_NZ~11kli^Y~L~ zs7;7?5u%)kzoqsx&cWL0(%zVQ0)OFEwI~gGcMS&;cnOO&raBRv&Ik0?EdXYDE#{U) z^!DGw#PKN&*SLrsWMt&Ug6$ERU8`REE9zCorkX;#;?kr=#8QJ61Oi{hbG?o1NY9xZ4GH&pBySk)5v5mC-@V)^^Q4C}NZerKjdhx??cDn$$E zl|`v7_AYq5c0x^tSU03#N0euKL=HbLOgU$;+1c@`p4rzPjtuo;wj{q_4<$?zItltB zJ>=yIxe!P3+^MyD$ZNR1_rZ}TOdpXA7a`*QchW5b-n!~2o*tgFLH2CCDFgaw-r^!uN4+Z)qA?BD>t+t?&joJ*{QJwV zQEt^PgQMJ4Lx{csIo9AUfd1@3b@#yZISJzsFdvWx0Bq!^-p$WTP33_sACq&7Y7%ql z6EXO%H;$}RAm0{Wjscg?G6Ww;hZ3q}S;H~#+T2Naa6d|TU>%|%3%7M9+%13vC@U+g z21s*Z4J8p*X4#u;x>_*0e}7e&yH=<^Y0P_g@<(?v996LF?qXiWhx_zX>*6tznM|g4 z_Jke}qPM*6jpYJ^`NPU<8&}lt-oT zKL20LZU37vJ2E;nKm|7lV+7&t-S&2c!*8LOK9(=y!4MvqS});nHXDz8Y0DPKe!Kd* zJ}f51-nUiNcet_}7D!WQX%;aUv`ovlJ*f4hmUU;<(6=?-bi92zom$o%x-_x?lDVDw zO5C~*@eSpBG$OYEZFc2DsaUpXtrC&u-U9KF^FW8SNt>Oo0j!j3T!O>%G zBp>^T)7sn<3qIU~KF>X|(HJVY3`2jwER9L2biX0F-JdZGN2Joa1?UgTj^#h3qJrU^ z(Gdc)wH&S1=UpC(C@r0%`|1@2x@w%}gKF$P_v6+8u&77H&<_w4{%>eu6W^abllHG?ewLR13Jozi+!#_#5)4;2Y zKH5oXf~mnITf-BP5Os%88m?710`T z8$);oL=w9O?NmZQ5{~e_e+rHApj1#h3Ipw;#4`i&sgz@+FjH?i$=v2V4CS~y+QH5x z-K%VmFtGrYQ25L!x3xegYZos#v+gQiSnJdQ_pT6AP>hWSm-8Jg+az_Va~30(0(^>A zVtvA%LGD^N1eSaBn%}cq{A+xk$9nU_K_bs0AD6g9g^MT_hAQ}{)Bsda!u7!s({5*S zeZ1HHyLao8oOvPZ@yhBG3JVXC3r1hBcex(y@aUdvXvr#Ezf#PK_FEn#RR?Zz29AKN ziP_Cd3K7&dkUlm+IpXzeNPVZ=8V)kkbq!mtC&CC_p!6QhCi~1BUdc;S(N)B0`tGOJ@g1Q2u9hr1D*2KcQDNaqPxJJ=*H;{0`dSJ0 zReWe8RSqBAVa#Unkexwy$xVoo-evdLvh!=0Y{7LMSkHU|slK}hkG1~J*zGNGRlOiC zDzNJWj3@ZK#=DEP1$Y=*wKsOs^7Hb#?sdO`Ig!h3-XofGg0z|kp|0dA{T$J{WV^At zZj$fYND2ksNvu?IShYwl>3`FtY$-eM@B^4D#+`gxay$pzN)ndBB8DUTi$R>UC~tZ6 z9hN?S=;yi>D}OL-uZmY4D8n99s)v|IRV+Is^`dIx&lAc=&-aTSUB9 z9kVZZRq~m5QLH}>oV%l>qlo2Hbk)FMzRL2T*fB_b?vLvAd!l1zKYHoy=!{b^0Q_M<7M@%S?ARk#$UUfxEOuq zs1CH`smsw^gbuu-F(cWtc~y*rF~|sYE}J_(YM(pTauWw!5$(5eS?Vve{~E3^+aj#~ zJgptA&0a^lNo850pT8>gS3*CZpxRqrl3U0;o>Oj?RkT7f57BQ86w`;OEHw${r_2Ac zH_OLyR`ggSdUL^ko$)->6uk|_L_flXB+a0iZ+7iT&YPu`P?_H+ab#?wz1j2Q?wSE zYtD6BPehVczBA!?6JNEu&mTl~Q!JH!TG;}qtv5;ZP-{aXoh?9Tr~-#4cjrgB;&mCY z^^_9l^s>du9S3uR`HrJXfrE>nxEVN*{Bk4tK$?i>Znx5On!>Y$TR|yT*Xd;QRJx$< zJzJ-&mC-Tpr4S3aSQ7nT<;^S}}SM<)oTR=`$-j zZepISX=3bYS_XZHPz4{L&85?*@gZInYjF?nKX?>65QBTHs$!&7g-7S5TPM0bne6nw zi{S@bwTr5Sd3ou*9Vxdg>#=$D@s54LqlBvC*ky?+HCoj^doF`s zFf&KmuQj{66uuF|1+oH{-Ms>NAP_4#AOP(oi7fI(tL%}~VN@;sEq4D^>U6}M%eBzC z9{A0aVfb9ooDV4p_b9!?%vcwS)nK3F^5s(3t>W^FhVb!uDOjzph_Mq2OT3 zE3^H+nt=0_Hn_B3%lt@a%NL<*zLT*FJO%iDf0Aoy=}6kh9ef4kFdsr-wJ&CtFgo`9 zn1>}rGU zh?b?IK0a8K?gjG_T}qbCoVAFzj7sNdnJ-XY^^C?Ld?>L%)o$~;mMN zwt#1Kt&&j1tm3F|rbXqZY;AX1b}hVL*fKxYFQVezM_ZR>NFE~wS5vDw(aF6p0U zt3Qi3?nQOQ>0FMsP|UkWy8d9iizYzm1aIk#r1T$w9GI7+QES~ zUMpoVe7e`hq56MQT}*gfYgkW#yXF(heWj(9w6Y4Etla`g%W8xC@zGgCh`hb+!^E4A z!I2qX5;!(7kgBbyOvF!1H||a^)vRLhAdY9_|9vzsvI$=_hB%B>WUIJUhs<;uZX7+~ zZat70bC;wn{-Oy-E5*Y+!xyTfXu zNsmNd9Q^wlXnE)3&nAQ|lHWg~lbDm{m{l4N5fPf5rH?`=9FmO9FTSJJ+_kj%12^Pt zl15!EC0g|macFjpe8|qwT^)QG3xg?eOE&gs)RAk{ zlG)?9xq@~3?Det)r>|cxYADJ6ykM_+10KK}=|Z4T_eaUSp5v1IHKC#2=uALznln88 zFwhql!61M2YL!$tDKJhx<8U0SP=*1%Vo(%F&}ILwcwS=DvOCFEyu=)doFd>K&-t431qPA`I2XI$DJ%^afAq4zU~$p^sFqsrQP1H zV1UOWkeL@@yXt5@B77y~Rc9BEQ}3jz1xuS>fFzqP@|bnEy{Yp&OkFOtC03Y>qGI3l zT4${_;fkToY+xIIL=Q>(Of8${Z6J z{ii7TpTI%dIeL;xn|O0@K6(GeK^|L?rd5J9LSxGt)yx7~ONi4orru(8v3cO@>#T?f z_eA`SHx!(ATeN6TcO+OVn2J6)ea|+5NW>0tJn!a)UKvTJBy5X#j+Ma($8m>p*Oca+ zC8$VNCEGz^{feE}qq$_A>pv&^_N6}(y$=EN3e zA3||>3*aBTc*R@DDUc|6*bdAmyiT}2M?MqOK(>A>4pp*9%#kl_#f7mfoQqsk-!SRx zJva+zGJ}O+E;L}}DE#b)5iMaUO4qGnHJEZzS*XJ1fTuKfL&e?|V}(iS21P1bf;Z@f z``yzGt@+gn1S;2Rlk$2C@G1Cpaaus%Txg+5CX6SSQILr7G(%P`x^&R%AuDSe>gZF+ z)@}*+TNPHxHc<9+Q^XFQz>ylsTVG)^V;^Zs%Z_ZLHaTsi-GPg3VvVuFF>)XL~Sn;D|* zD;AAam$*^B1<-im*9GK&;2oR74)8J|5ogn%SJBHqmd08kJ(eq+?MPYexIrHWI_t0L zl&lVy21OI?=X%Tn8WiE%f1|{e4D^6YKa7Hb3l1sjux(#&ucrH_S#ldXo z1RQiy!xb}xgO4sT>a7vj<@JC6hT?w!R?8lY69X+?v%u~}-#$)#guRD&se2=Fm7!?D zcp;9OZmmk$cgTR`Aw3>kE8$E6QgHNBzJeAdWZ7(HQAd0bafkr_pQG6zMq)<=B&N5ueidix0xeBY)9)U*q8bnpWq#ofbaZ%n z$x$Qo2(G2F?0A}&`okQmyG+K2!t7N>hdL;`j^nmgcSpxU?W<|Y^(lk30$j8nU!q=C zyIPd>8u!C0JGf8wWYc0r8w;LmPz4IrHdR~vv0u1cR?9xubohz#4ye>yC1YRa`n%}MNHOF}CLy$eDRa8gA|5UCqPP>3QDR75~U6!oi}Ip_SYna-R!+wZ+D|MdFsZqIYy?|VP@ z%fvoz@=7Bz;65R?U|xS?jA9G$Ys~iM&rJB+A1$^&lj?w>)>m>+%ZcmnWbyGbC0I7M z1qwb#!0KGAtc9-@5R$y_lf{uL5rvZD7czmff4bNn*OFa_{qoIWQZf7}Ix>`J6wYcK z+e84}FRvjWAvKYoJfz=b=2v;j#Tx%hl2;t2s3)}14TGIaR+-v=5HoOsl3Q1+)l##M z^!2+_Gbv~|qO_y~*Gn?u5n7YF-B zb(F=WUiQvI8h)%0*{W9VP_Y-B>n~8-{4CeqXr*-}5%sQa>V3iv0D{c=*1A}gn`G3U z!S~cYOiI#i+!IV`!dPeVbPZJ7OG@QKQopr3m2H}x)|I3}n?^Pd#C=^zee9Id5w2zu zg^NsPi1@ROy57JqqiX>F2{*CG?fKnb&+xzZ7eS*%9*HcSnJMw;sqR9OIyy)>a|8Db z&vVpw*bgd&(JX++Y3bL}bK-%7>`+~bv zx0nzqr+kf3RKd;(N#;bkmanHGp%sf}xp>QQTH>1Ebr14fvx)NNi09R3DYRc-?-ZUm z72kGeOcFOBZugP0WCcPl`LA@->bOViI4{02H4Ex{F}AXHt+of<93?i^r$iHClb2y> z%U~*jkT4FEA<3!Pp;*CMXS&;rf37(Q@@{!~`}tYk#3aM-^rmBw=RUs+TRP6XuG^=r zBGfQn zTKTv3S}e^Pu{|CqbvH9~J*+L{^mh}Ri(*Nl(Urv8%)sV#g_CgoP!?O88@;9tb|#a% ze^{UbCnn?yvlX~~ICjtAq*}G5Biro;dpavs!v4&Uw(d_xR51N>!Y5IVpbAh>oMbET zC=xpr-CO0-A*y$DE@VJNwB15*09Y7TH%6+f0G;$XIykwh0Z8A zlaIo1gjVPi(O+9+m#^5S#2EFrx)AT88)j*3xnG^Pcf11RXl><+t8|gDPRrF5dlCu}-9eQe_Pk@u#ofD|tOVBsSZ}lZtG{Ba)ac2B|dcEJ8 z>dLoQY-RZQDoD}x)UzQE!r2dEo#Y=j;f5%7|yb{YET2d@u zxuR8U*1e2-r4XT;wIr!y)Sf}Pm3@|K+}IXpY=bkiB*T0dHet9iGBLglIM~KfcNX^i zuU<3$)7vc`6@_x3bxhU5#!_qZ7hbTiLi&)1@g%nnaKR`+9ESunP%eD7spr$=`4#Ly zeDfm4`e|0Jp6i59hDTR23k*HBYf#(SoxbTn7V?#thjJTgZ_C)0Rz=HnZFMHNQ7kaautM6?Up2ARPJiLCK3T;c1Dq&Z;=gtTPg3lCAGd9^ivf5t z^Wh{5YugatJQ&+#diu=2ek7p&TW{ZAz{I#LMD(DKI4TyHFlNUO(i-nm4e@y1Q&D}$ z3MXdI;43l#Xi}+tK8IcZ`r$t80y-I|AfiOs2*nco7NG-ySg2UweCL(oa;9n;Xm+7o z$f>Z}Gq5iAN>zJ0hI10MO1E@5bY>BLwF#ZR8q!&)khykV9ej|oL#q?i}j z%Da*#uY&}FGqd%}l0%Dl`|OxZ$n#+e*K&SV>g$-4+2WqmH&5-c{X>Sbv9Y;4y@yI5 z@wtc2gcp|d1-_jlAPW{QF$g#pbheHE>8lFgAxNl;gFU2PO1mb_^zePM@jO0l=&_=8 zk_IP=kmWNH(d(_a%YoDinwcr+k{Hix#M9 znB$e5kb0$4EGtRpBx50oR%i;vkD?>fIYAZTa_~q`3J0D(C8JcUYM4!1$o-{g8T#d{ za}2~6yr21_bsMQ-Dy_S_hKwLlNeQ|;Y|!G^W?`&{dmzRS0Rn@7A6qIMp35lC~qh_w3+RqY^%0f%- z>t8KFDGT~gH9SOg5_y?2Bad3^EHE2NP*oCe??mZRA=3f@2bl^_1*u}EIG_+;F1Iv} z>^T00>BFa8*;Zl@&7d=bL+ySwz1jU{FPFWsx$H69h^%dGX`~kvlt0m|uS3YHM`a|G znEK_9fA2WsLyvpkX5lO5DBbPIq-r##(Nlbmjx75~AI;}8%!u`IfZlP#!^!Y@s<1P& z0u-F?eRRw#3Ina4+PE8(OUp&)K2J(H6RJ3QIco>`F@0nKl|gXili}v!9k&OFe%8R`r3ms+9h_K@=iZ2CAWWmAMv$1`gG!f}I`V zDs6c0$b;<)qf05pdN>F&%yd2W$5ivD$i?)~h=eRDQie6t60EiTeqNA-}KB_M}bjV#D46osC z2PaT8%>0Q}iL;#}Xf^T_c?r(59_saU;oxJ>u5aXB_)RyY-6HpLHfDT28`*sC#Yty7 z?SlK^(DpOIRHQxV8p2PQq0~f7HA5hMet~@}W3%a(H5ezm=SsE9{bIEzrKH#Bn2EZH z7ENX}7c6$7Ji1iD-=m=H=b!(KZO(tEy~XPNAwIdw8vbBr;zu5F;nmEmfz~hjkAXrW zv`lQjj+dX_yL9x|39>qWdx-0&$id-I@21O{+0#>bTOx$1`(?y2ka3le_((raLpM>% zT(7+J8-zNZA;0xt&%nQDyAnU+F0c5oHGifrbBq0G{B^^Lydt6Xv0_#2S9=C^t=O0W z>Lf7aDJZUa2fX09%U{ADZF(jkofwy!zn^)@&ri?ms|S<|Pa>V~D=SP+@1(AUbmIP{ zdN5N3PPcvJx7J+kTrBD&5K$qI8e{pirnBU>D;xscj{yhsta#++&fgTXbL!=L2JgX| z_6$N+Rpr)X^4bO{0TF`Yoh_f7YwhiTa35vyUiA_6M#3ILI(BVna%ZG*-lM+l`7on* z-TJr6xEBzua+?OQeUrd9Lx6f2iLQ;ndQQA1DhvBqj;}9be(=Y;`kPO@ayj;(P^fdm zp25S!;N!7ufI$|43_c7}q6W(Wbrw6&2_I{z#gD`wL6k)S9@eWcizT)vE?5Zfs)oh1rvf@}*lmhJ}SX z%W>?1aBVB{cSZj@>-GQJ{)seM7e26tJX%w^-~@JLv=#&hABnM2TJ}D)TaJJ8T21I! zjw53%=N>(U+C#>T?Gk!ATHP?Evzk=XA^0^n^4-ORTWz;z<}*{S(n`%t&2Lh2OE!pu z=%7c%Qg%*sBLQrEW3Aqin|hM=tM#{y;lm*me5JhDZ+=W}ccBatY~=$cMNF?GFdXUu za#?HMDOFQWG@~KCrcZ9soqWvt>1B&Q1R zM(5{@SQn>|^}<)O4O_4Ub1J-UXxJV3X72s~kAA%OuS`eqj2`jL;_T)((cg?j>+rpad5 zdG&0DdzQ2t*&tp1Ks){U&&??ikucWr@47xx*!`-is{QS? z-J7xdtDXPQ3N{>-x?>=d=7BLy9>K_%(l@21RNf-~*`xxZaV0)>+Rs7$ah27#nekOk z+H=JtkK1;f5ZR1?U@q#B6c9d7aWk(GOi6M9qnt9xw_Ek#IFqC%b{N@dHR4?uuI@cz zIbh{C_%QWYG+F&3F-v!(rbKetE%!)(L-E8w1M|&nJH4rihEBf4fL0dbIB>8ig!Pa| z)~1j1YksVWW#^q9=5<6|-Xg5&0}H~|n@^4Q zxTPw_fy#3~#Of{Hdm#@=QAcn;%sa^>wB*~uQ5dO;59GAEk(Y9=T-DqeD6m65&2cDW zu>&L4d5Mr6NJkNjsoLCz7R!%ZcmUg}V_XrQbD+8@B)vcIY0u|tyHp|-y4N$r@>K6H zxw_ijrz1ufrwZ-I`qVY*^^`uYErE~ugQQWn6@nPw@q`3KIXz8Jx#Ew80hY)kx3^Ld zN@(9KTM_|u;WOOQ`Bn=XM2q|k*9=Gat@}l~dAukTzw4&rYi_fW#w9)>{C=3~yJI4$ zu1Z0O=(9cpQ*735&SfKd0+aR(@_Bs_3k&S1$hIbyI;9Y-@fo_}HU0LIFIfZ1jp@y+ zn*5O!8L!RIs+nl7j5CMa53&OWJKyD=`9Up)y4I|2m1&~R zeBvxITXH-md^kg-)+FTR3$|3nkiOhtQn+t?ay2^1GdTEY>2m?H9-uh5?6+1{#Ke6h zv`;J(#nBYPKJJ$x{qMbF1KHKC<1V;eT#9Zwf(|65)X^} z%+>^644H<_e606Ahs|>>ZFncI2reFa)HxFExlyG3CgMq4qu1!SO5~g5E<5rMD~rin zo%(IhUbpm%p>uJI9Q>w=uMjVY__b{%yN9*XH4aq=R{PTtOanL zJM@~?D=vM5wS^XKNED96H6lIKQX`6{heg}!WZeGI_FtqFVjpXQs)o79<97rY?3$HX z(TdtDi65jk0w`#cUgcW%nvb;V`b@(Gc)alC%z}6d)8D7XQSLV~ll4g_d6Le98iGp2 zJ>O8nrjrV@25p#)4?0xRj}t0{RA&6++8+vw|L}iRf%sO~;z--x0*0g4-<~*pljsN*7stbem1e^zl!gh@`(f0Y+7DrA>V_U#$yRwDBB{xa2g z%fLK~6!1wE$A4!zqh=|Z5Zjk$CSI^@BqBN09Y*3z5T4O{C3vbWt9fuc0yxwj83~9q zJ-MEKF^2a7d)86HFak4^MqTR3#E0T)or5b)A=1(afSF(Y?2*_%q8a(!rQ1#C4*;jR zR~p4veD2AkMjP`Gnj&eE01vAH^XeNG;${ot=ChB6YBRbpXIz+Oa!NUa+})mcM0pR{ z`h2!?D9N&*FQeA$3U{=h7NwnPUP)#o&sS0xR+4;qW_`7pCrI_BYs|oeSMEtr&dfV2?1^y--Nh1DxUE zlairFjkX7(w_$A+euJ7_^|&|hj11`73)%_K_mH2Cb9){CMy|>MPv=<>3VgkNk6cVx zf{!`QzPM+aHTI|xbCzV0jn_DdcuJ>B%kRYh#b~{Qw0sFqu53k%79yq)ZtH2QA(s$I zvD??o5+n7`Aq#fdN=Z?D6eOtslDSYQn9iVW>;v2jmlZ}@vidf4exTS4b&x*H-Bdvo znnITs^<&rNjO>zE)b5htf?(sF8AFpDLPW-WB`&p0A*jj(6`Qx|W+#+p`V9a(Sm;~w zirWzoTD{8Zzh3`BF6k5p7By}&6CF1=y$@;q$9fZX_6*Vq#|Hwm&)&nlLe>AUl>71D z3j}XnUrM6<_+|!>O`#`+)<~VMHNQ132o~p6h&p*>X3^Phy8@^gFPL^{r{ z-h4K%TMFnJlbfE-*<9~PHM=@|n?l_GFQCiJd`53ZvB+8i`Q%7%z=C4Qc>u@$zM{`R znmpcj{H~{VF^a%3ySnJ=SiD_#A+L~lq#5}!(dfl3T3?#mPR=~pC9?y17!gQ&s6&|0 zQo>4Nmn}gHsawN8A&-r_1$o!gq85(mX>i`uvlIZVw`h|1r7oFf#}rW%1FMh71e|G1 zqcU>lO^tMlrt$90k-p+k6IsIxGqm-t!^dZ6c9+?#J2k=gdE`9j+{GPKHyqHP+#(IE zEa^Q-k4k1J)#In!m&wdl(B;|7&&8`dPtXk;*h%yySwMW6qLsk@&ZXtQ0ZuMr7}FMD3V4U*_xUAI)7~T;w(2(v8;2C z3b2$<3kcEGDv(p88CW~eh>g=5xg#{PYWa_Ush<8X$7flYm6w~c!rmvEfu+#>s_eiL zrVsPLc8F&ihWlK4h2l2dU?-vRGakq2E}5TnVMwco?%< ze6{4{%>@BNg35v{*q82>ZPjr%nE`3`#DIi(^{Uik>Fbj4KF{GR!r#r=)u0T+aFy+7 zm2Z>?F!umXuuhOUn&0pYp5!_dJ&Hh2kz-soHa^Hkk0icAB5|Om z2iH69M%AWy`-?8AB3*~(1jSeP3@keGv(2v|MaaZ@+&qFz^^MZ3KnDO`L;))I_;QDb zVkP%R(r4m{bOv~rd`T@1ys{Q}GyOC0_{nb5p8C;|Ll*)C@Ru56=6-U&On#EqwAMJM ziP|%`(*M?y1wfRcYp;3}={x9u_pZR*qpYei7Soo!k!>?D6vJ{kv zrA9olONLGD$Y^ZjUG6pi;?b4bDV9I>yZIa(Ap_=^!~IkP$?hc05`--UBJwO%N=qt;%rXw6r!7Zg9G(4=ww~-+g~4 zM78TxzRD=>S0bTURoa}^J@N6BOm7)QDPFppg_O16IvFix57_38{iLW-BixX)V;~1s zKJHQ=R=M;mG?;*mJp*^3_$VBfT)xQ~mNFe{0B`^?%KBZOonR!(bK7{MMa1JX%GZjm zF1yVDU60RBG9@x(Di9)=a&bu+4lGC1^3|*wJ9;bvp63x{6ZnnT$hh#JDU2+Pj4a{{ zw{!cI`u?lxpPleO55PVklQ4a6)6`%apP&a)xQM3!^T_wf1lSfZ7Gv;_C{E9jNWF_2 zD^VaEo75mL$1+GMXuR!hzF;YrfPQewP2~E~)s$$tKHT>5^z_p)A+Pb-=TuyG*#|K( znUjj?zC4SH81HdAv*PG^omU8pNak&Wb!RUn_a$8~nrDn}J`aI)ci(8F5_~^@fwV}q zGHVD94*et)>gx+NY;S5m4PSzP-k5yrC#ke5nt8ow+|1T!e*i2jKFHVw(Or9>)OuMR zF(D!0O~R5K2A`drm>lrWMI;_?-zRl*ZNcUj!sJHan8xU{XDua?*|Gm9;r?^`(A_*_ z(ZeDF%jRI4!yZ|it3__%)e zD3*!Y7-$Wz|BhG1AtmWjAtPwGd`R_~WM_IRMVR?OprR;0EGI?unh>RpHpdc{mZGtf z0|YGECXlC9lN$$=+rRsJoBjPmk?RW;SLLr8lfBPPm_8LAI`n-E3w&pq3p!RGbBji1mibkh2w2d_W?mZ#QFua-HbrPua%d%HlR-e4ZckW})d*U)h6Vp1&LbH}^> z9qq&@bp&YnbaSURor1H#(pnKaeQ7MR(+WRoRO4w_aH4sLr)tIKPE(4P5wWxmgyObB zkdl~qTg`en4v;bXg6d?#Mq8lGKUWcDJfq`U+1LNG_-bTI1$@7Hde5L}L6-!&&#!kd z?aLP(@e#qbO`x2$+HPPB#S4?!x9j7#@lMwd#6=#_76o5(@LN9tkrwkUBx&o`_vKq6 zOjT1->f&rjJEy0?o}2y8LoQO`&xV%41(qz;bO4R&9`K28=|r<^N-TKM zLWE*9(wdk93yRa+c(rcVZyeOR1L&x+s=tvuy=M@SG={eF$Si)v{-(e>uTUVRv=SQ& zPDs^U?Doms9&diqdRnsRL0S@h1h5;HVb>~ou#|_PzwfJpE2J1-=}pS zO5-1+jijD&o{((nT{!i2bVSmqbJK;(*zpP=ij(~Li@;VZNC;Wi*?Ap;HscRdef;uz*>&9nrFSt0Y6%BQ)v!DVhS z0CGK{#(c)%k0~?Imy7G#h(&0KV1p8Xm0#F12j;O2z{!G#8rgY=3RIt-+Z58 z=MxOLIPM+&PEE+`gC4%crgpbB5X<1m7<2mJPhIGKlzk$l05e58J6-ZzBLZEqW#cP; zZRWGWbf`fB13+Iead9!m&F1_M%lcG(x%-=~f(DvJrSBQc`I&4vIG#CmchGkT_Jd|W zxweu9S1E;xd$ecjzQ$Wk&uJ<+cvT_vYaut?}C*KD(*K}57~~{ze0|BRoN6(u*=t&I5WG4T2_3cjgR+ZA__wO z^Znl&UDf8>|3Gd&Sw1wRY!!BA?Skxwa7|!O69!A2MJR*92^(bfmD`f6=?BKF;%3$D zw(-=IGG8RP{KXd{;DR48oSLx{J)hx5_p};#t)0YV-!xDFd&gT;fi`u)CLu^9*Q%F)Xybz=ANe#19QA z0}pccv0}3oT1U{7#l&6Mpdd;pTSQde^RqU_Pc!ZLxr@ukPll({Tj|Fn@H8e9DA<+`b!T^Qg+&*<~4cYs|8*0 z>v@m_-!4ZkbUVO0JjnP0abxnNAqYqmcrXcl?yTvG2;Eb@byn9$lek3(4YF_$0Z z)5kcenj*34jOoz)xNm55zdm^AbE?1#gIEK{U2n=%<=t+(l_XkO8S74h7raiFrB+L` zc5Oq>irl-8^qsC$NX!&|!PWbq!IFlGVVzNxvWf%EeMD$I-A3{>=y4<5C#18{*0|Bu=s<9LVD7R1M=~bB&7OSV zT*doAk*N7aM{}MGcKgALEy6^-m+Z6TTw~_Es!HPF9VDD4tNezA=1Hk#I5YoB#g5X9 zm=nlkB0=s+mSfnWxebs7X=r}YJSx^phiwtCx$0AhV=g6S2sxeN^|+JMU`3~Vu(J#P zRmj~AIH)7zoMld&6EM%>z|N#g#UnF)c#jT#o=w<+4e%NR9#+I7?{l7ADDv6=^kn59 zX-0iiJLcVp44DIa<<_WV?XJ*;$3tc92S1gOk$DKK>>ME?>#l^LUSQ`$GkoW1AFs{3 zAF;RfMLwL*Ai>_edClselB>rf!Y)P=%l*ph)rI>Vq0k6xK@?hF-08Wl9d1ar9q_xw zBax-{`4X2rqp@7)4v3`Rv))1*d1K^t)rNwoaTS(T@zCDEH(4-qo01rzlj2MOAfPPzf7Wbg%b;R0WeZ;pu0T>g-nOJse+g>TI1p z2FQb8l)*uE0y|QTe&@S8omuW{n&lKJe~SK3TD5`cDFikEav;b;1Pk-ukf^SKtg zF~bo9w!I6;*H!pkP|2hOmb1j$U{{asqX>Y^MZ|;FixT6glMhF?LbrRaa9}o9pG(Xwoq!Cnu0GPMe|7SH@Y^qb7H~U5^YR5@9)TW+LPe zfCC4=N=?rYof*6{yNOl-WCaZ8Rgsu! zx@IL&6Rv)f>`uHF_-;6Zm9n{=sV2%s4=SS(#91y`cX=)vCL=i>uN$A>jq;hTE%}ws zD({4tX3VH)MgjL57EIZ}$V8OC5|v3-ilQnn-kKc1L7~PMUo);BC_R7D3tWx1++TKW z+`Rs0e`k9d9@+H{EMX{DVoPq4pH#|?T-l^@vGD-$iwB9_`!PO)iKX-}=}<2{_cJl6 z#tL^Rzh*mY0Y>UT`DbxHz>qpfH`E+_hXC}8R#{DdUe4A!&bqzegW^z-grd1U-|ZU$ zM<}WXQJ+=n1{#RaY5C{+J%e6`d4|?b8Os(O8Amp2b@m_grS2@XsHD%^IDRW@Ior$K zZaP)7``{HLX)B8mFpBW^!)y6Dv9H?rLzW&Lt!^U)k~OmP<^D6nDej=R$0MDY498`4 z4Fx~h2n$p3#~G+0f5j4C_#(Up!nIRLSmV6NxNk-UCsX4X6<1P&%3vK zU*J{lbCpfe1S6u#X0xuPkpv%`*rX@+Z0SDlae6{^c0YpeTsqvk8@c0baH7l*SLe3 zgh)r;j2n2l&UC_(x~W)_2im1RX|pTfU&_Q&6Fg$6Q=E?7{gA?XxKW%7{_Qd6Eyah? zHtSnI{I|)|KUGX%{;*cy1HP#7614-C{6Z~^2`(b(^Z8DU(#%b9enC)trzWIJQDNd0 z3{$LNzH44HXYtLnB3zP)rf%;n2Y<&#YADOsm+36DJ(~e5Z@4F zlK8XX9o{usKkX0H^VcZDs>|58*jp~^sP9k#=kMZclDmQEj;wT0a2EJ1JboaIF#zXC z*e|Oba!XM{*9F)~*df-kw*@RdXM=+$*g|mNLFTs3Ke^ zIma7q1A!t;PUU{4MrLYlPH;Nf&s-fHV7`0!^s5#kvB2c;$=2hHf_FWl2Z|nVhnjnY zbjiWP`VeyAChGs5KL4pL2nD>+$yd`e++s*@u%UlxU9Gm=%k5(HfkUNVd1uIeP=tfW zLH>D*IZ`(6U9YN++f5hTTF_OOZqt$_%%aCN^ZPk{!4_xkF(}afWHL~t*cf;s1d`Nw zS3BTaHyH@O+q)WQOnW!LuT1p7x%v)cyeIn!P2bdC%J$85;RvSh6#i7R^jVc`MGW;` zz|+NTrtSSs{SkuQN)-wyJ31(9B+V}Yb|T7~6;ZywXtIks0RezWav5=>H6$gD5k~h* zo3RCtkq!*p3X6DW&yvCpPI_^F5}E~;xRKy8uE>5Z9r66@A&7}cX|@b*2fHf{G|v@{ltf@hh4{!V3_A|U}D z+J_cvyJMrPH=m0zUTay!q0xO6Hs!t3&9EZq5WM9Z$cB1g=rx(J%%8K(Ex|)P&FFm( zAe?uEItyq3EG%XBSYBN{Fr@0TTYYi#+*y$)_3@dzf zp4uWRE8-FL=9|eWdFVX@yO&!yHX;prBMIu;bomm-f{;TE8JCu8oKE$`-Qx|*?^yWTn)Hpc-e}awsyzVx6A2uGm zGCNOO;qMuE&YpsMNKZm9>=~?6obV5tQcHi_mbh^YEj|e@o?E~8Mz!SzC$_W@p{8NU zp$lg%HDDg~@$=hc0-8^LE+wm@c$xR?{-WbYYyPGWq3XafQI{gBR7o0%W#<&LK0*CA zi71Gi0Ed3ZqwY#$ZEIRCF_f}<&2WGmi;{3gz;=R5cW}*CKnMAb$o49-cV{7BOXD-8 z6=wjqSClMzQWKdpM_x@^zvQ1HyHD|&o*$bb6zsE;#E7_x@tWxVD6!TJ?Rd>sz{Qze z9IGS+9ef>zGqXMTx0?+ zD#@Dsooo5~YO-pCBuT4=sCXEzHj;BP%(d5115P5%vkKe9^%sUg>I9 zjZ5Gx6HBE%u_j~Ay|=7JFAplV_1?!|m8Bj+q1071d}U*rgB{;Ie1gazlNFoAgQBXA zXr*zw{O)LRbYForKHENcD7sq-HA8${&nd=E>e|Vk8HA2N{7BNc`=uSsdt+R>a>{|e z+##MwC&VxCCi&z0XeiVWfIhh-!I_-DYIA+ZGXxa1kB1ci1!`C@F76@o0JoTFamTiO zGtCh+LdnF~oLi||ZH=C3T`%X2jx&tl{>miL!gXdI`~)gXw0jb%oU98UOv^N?sF12f zwkO)@cswn}UVDyK4(fOl58q7`h7;BXL*F!d?XRQ*(T;0FPH=@tir~{S{W2E;wHeG8 zcS%lV!3|w~_~6q$qX0Pu5?hWFc+zOEwpL?kFn2io6i1Y%bxZ#Oo(9E#T2GXS8*)Hj zQ!Oz)OE3nRhtB^clhA@aD*&7uin2>YyPi7c(zeX2vWxm8@1>Squ1k()qcf*Cy)AD! zLEFcES(J-;Zt&leWq%y$y%>5uZ6s?{INyw_BsZJeANpzl1FhmzTiKoj9cq!eIYAWH zr&$C@U{-P9_k(`Z4(*2CWs_M8;|Mk6kaAldJ&ggJovI(%`4@7} zg^@(bDaGmTOF4w7xO3~d069K}kQ%bV^r}l1=F8hookiQ7%EtSeyRi~8mB_ev591X! z$hZqT$AGD$qCcejWv|zVL%#fxrAexL;{*Lo2X;;2M$zqbv3`hC7YEqYo|H$THfW?M zG7as#oTZv&`h}6kO)jJp91orj*iYh~`#CduKN00R7x6s3y?08o>S>fIo0bbD#?Y*_BycD->T)`~v?&P&b8O_hY*hy4D3 zsW9XpXc)i2D}NRmk8TZSivsf|Mxd!ra^m1F6+X#RprbrmXfv`kK_y68qrQg+WukR0 zNb}&Nj`GT6@aFSzA(cdnwtae4Q}OCIe&gXa4Iokl?n5edQE6L$Z_dRjVJmq+F=F^s zx*GM0I4SIMfIxpgr-@PZCA;;ZQarneJ585DDr1BjYN=q|**VQQeXWzcy11Ay+eD{O z-amNaC^^IiXL2E}@IakxWMrgLt*-tQ@o^J#o3sdU1O|Kh^9kOIumjIt3$rIc1RTP) z@~hC$BdC;!3fexM`n}WR(M)ZMrRTz)!KY7AwFiF1hs-y2iDq92J*(ga#t7s4l{L_F z3YA}2@;KWnV#>NN*xW;~p;JKbf1N(eh>qRQ3!cN=!7JXP*qg0tPc%nKcpzuP|x4fjb-K*LwFpFYt$!5Y+7p%J7 zQ4;DXZgYtlO)c?b&MC5)iVG8sjzL|ju}-EB!{)#YA&4Z{kK}8-{k#q40WB34Da!9E zW=_pT1B9*&pMMg10lp$t9rCGA^M}o%FmA0R0;?w!NA0fqIh0KBQcRw z-qn-S+TxCXx{$JV=r@TdNSHpR&7;+n^K6Y$?t2x{*!-~nTEI7g#*|P)4Onv)Ba<22>o7GwuLb}_|VaMWk&+7$Z zV7OB(OO;rqnXkFSeYj^35>ZZW)>-}4ljPa4oMNbnpH3ZYV)_}yuR8^7>zCG+xzAQM z+d_bO+#TYuZgp{%MIt?{ynE~EJiFo}1`PWctAYFN8Hm?#^)#f3DeVRtg6ewydNx_q zoz|r%SKpo|gsYj|Kg863*F%qTcfL&6ktM`VVMQl#^lg$>oM~HZ9W>&#eVl#o_k^Xg zcguY?V;A;GDYK*d#uiC6NyYj{`sSiQ0V9J!4+`EN|5>@huYO*xaM0c!ICw?KwC0R^ z3-O+D?3B|T+WwE;)R74S&`VJGcJ6|azQEz$wKZOoS4}N;&~GVOurf+8LZM?>H;_V*0=ID zp(Y;}KCsnl0p>;(4`p=c=9t1+#h$@HdE1=S{r$ik=B%TL4nDo1pA>MR3=w{2b#_2J zeSZdE7T_7x(-USx{Gv|w{R4mkrjVj5I)zpd<=bK_-zaT8H&6EJgZ*LqXTXh#TJIaG zGZA7}@@WBhbbsTY;CA45cIp6LfF(pJtvHlv^6{PlSW9*cw(?2SL~zfH_eCk4hY^x- zN$16p+`1BcWGnRi*gl;xp-1e`cjdELCPd0U@PVMvmO?_uYaPz<`-Z4d>-hw7SDo+n z&U<6M&dSXTt~%y~>Buk1s(I-~%Sm;@Y^SLDvWgt-gvuc76aO9dQrG=5x2qa~Q=QlJ zqCBc*!K0#_!QaUwEGJ3S_^;)O9j-6NdQPDck+imuwor%PDncCRx#eq`iRv-BTSu^A zzZvn1|0oRlFSUOnOwi)S&Cca__uQ)*|FMQyek7dMfmGzqfsQbj`1T8f{tZJ8#lIl& zb{$dtm&aj?#NYPxc;$FDN}Al-$O^L?yfw;^8cAnhVqa#!(ujXCw`3?XaeE5%UNyD3 z8(T;Gz{qJO5!c%oy(Ig1Yorr?rdJS=MDZW-P7VDe_;4nN+)FA5g&5~C%77>dX-Xx_=spGeD$NQ)dMTlrdXO6aZCRX*Qy1ychZ8rVA$>`3J^`8AZ_yEVn%n`^wdQ4e-noN z_u8eT&P6-~^@!L!WAw0NLRbl}sFrSn1v?)O#3~@lg-(AsCfLR6!M1AzR%na@o~oVMzMi$h2O zu-L*d;ITZ(wqX;IbgYn>FgxJFA$3$oZ`bB8z|>PB5m!Lrl1X_rQ8PM2Gxcp&e43(R3HtFu#Jt4@LMM&vGiY;7NYvWjVU?t9O!nn*!XH;oWoa3;tK8!>hg?jR7J6%N+CJs>m3MQ&$GmR&3}U_X8O}f z(q|kE0zzKv2`*+iw+A2}tJEr%&%FA_36^=b+TY`9(U_G+0Phh9O;?8OeIGE;rb)I#Q4U3Ha~F037mdc93#_ETaIL{X zGjam7eMdb!?7XcceMuDLW}wHl=Ixj~7dz1>W~-``h*O{_#^Ljn>SNC#p^JN6hTZF1T{Z9i%K~!Mlf(rKout z{Vd5Me!pV^veN0FwVVnQ`h{+dwCS*$4SK30mXIm1UenjdA-rcC;*mmND+zbjQRbZe3bY11=RwG>S;v z7ZAJ4?r6k7M-yC7sVr(4MS`+u6zs$xWe_PvK|vvkV$dL>f}o-wR#l(hd^O!O-RJzi zneUz)PyX=8;a%>1p8G!c-oK;>U+?%SY=+~f{ckTm?dxcXQXileh256A!e?xG7TGm4 z4-%#?vQ;BBcBel8v=F@4Um>=)>u)AT`5b=O63yrp{BOkU@@`U~9B}?_rfzN^-Ko?6? zG27vbs0fuMX*3QxF>3C;XY>@n%INWLmHVTp@c|JK7pv7Z1V6#)91>erF5|OiOQzQt zjGIq(gvrT`eq(Nz7hve3D}LN9{Me4&w931O`n>AfBq+uvJbQ%RlO8bduCJFIw&!7o#;`8r>HpJ4M$?;WGbPW z(cnxY7W-bcoqf1!<;*^{7G_>D4s+Wz#_8^md zs}>TS&|NUdDsphc~HkC3G7* zP^oWQJdr)YEZAzX!N1o0b6{Ys(SK8-{73uvNUZwF#^51;kMaq0LYr=nF}w=S<>1eUcl@6{OW zMnH(*1pxPc3^q6#^kL`qyNF03tlDioiNpL}Z)W8}q|t{I;m#BFD={-m{&@iK^yDN3 z%nAxiqEHVz2GeLw#F(Z;%DRShzP0p_Iw|c*9J*`y)8)blA@?GC+jG@`UEaq*k`p2i z#1ZPpUz8j|blzYa?yj-lV;ORNKQ)SZx>+~YAN$J7%R2HSD`1qW%Ae0^t^<0j7AcfU z+dhGn4-4(Ro7S@y`uQx8L$nD5m4M18XSk?)i^6*9X>c|ProP8rA`e^Ul!KXQQfzh;a)JP{cEhY`SJX!s(`EZl3%~u3gG+z1 z15iO+O3$n7b)nLDQ%X)RPe@IQ=a`0Gn`-Qa0VsD#A z(q>Y6W<7O0QxE0>aehG~@&4^oy-_I-A6{i)R;Q!tqq-@pU>0h`Wo)zQWX-MR$<8Uc z`JR#Q%<ovnz?_sZbolKg7xu$5; zDxjdbxg9icz(*pR%9OFOOTTah-AHt}{mZwAWj_i8 zoLMGZUGG=Ihy7>V`;`C!RnMVv;rM*!jv)G2g2^ME z`LiUF3D1kIbZ`yLtXN?8nBmM}odp7KMjw!64u6wt;Dpnd6gl-r>=w>`rQS!V1AN z3jkDq+H+wHX`TWNo@G~7>X~x%VnAgtqbbK)@}<~0cJev=H(420_AOXDsL5R`xBy&9 z^$Co&9$bl`w?TOBpXfFrhAnw<`PzO*N$Hcw{V{|t(k3t^<#P1?$lIF)Nc^a=v8M1; zW_iKl#K%#(j_M$5S!|&%vec{%6?}JWLb~xR2z@9NfB-(9Oib<@^gZqn@+ErDC?FIp zOF~-x-{=nWpV~k5j_bo;ZD2m3jbwSXn0Bkf_5j)< zYEu@AVmdyhrn$7YkDa{7FSfnNwW@7O>KZ%4&tU`pZ2ZmNo<2P9|0j!SDku$9F{|Qb zRia1nr)1!u3c_RgP=B?}&JBi^tm4j{(bVcE{96Dt4=<7Eqob8u^>2*Sa7%q;f&(rkRZKEbgw~VNuuR2AgH$TZhlHw}CnbDj z@wKYDe6I7AZoa>u0)er`^lwU-1VXx+->#Ev(q(|J{??wokI92aqXi7UEcL5_OJz7v zABX6-V{j|*`JuW!qf{^pB%Wc^v8yT9jBvb=BbXZZLH;Cc1Zc zg@Gc#PDGtV_$rSE`QwjbMaSlK6_n|D$ez(htc&EEs(bmE(}kWeT_^X|^%+jWs~ctI z0%6O_6I?Nus4qR8n!diil9|8uHsffzwj1xz%vU5L>+1>2BGJIjt^Q;%4Ic99-9mpU z#T^(?L*iL`8~k4m!2$h%;Ba|=RG(u)IiIw_r(kF|F{R%aqS5g4#Wvj`KSCH<{xNuF zIX&x`C}G6bju@t5e1Qr0?Hawcl05J=)NNv*5Tx?jNp!$Ep7>#w+IkUM>$Z8k^vGWaj$2#r_FW53PD`N<+;&PptmctD?Bp%e=$h5%=^KW0u7iR3=ig zvN|gZ44@UD6ClfCSwYB*qKi(eHYQkOz@vK1{-<~f3uLSC0xXv&xGDkF(7yV|MIt!h7* zJ6gZwbflTA=;vlWkBxeAzAtknx!LCi#g^VmL~SeT=`GR&RNo$$*f(XX%UPZmpVN;h z`sl@;(FJWt!<;v(Ek{<{DXrPv{-b=)sLhU5aEHnmQDQrQTy$(qI_^yo;7#|;q)a!w z-Ed=kX4!qw8?EX|b8p`)lac|hEv&gGdq!Cy*^F4LzLdt#$W1%v^_lDDu2*r7+h_hb ziqPEs?dH;M&$6fH`TJk%@4UK!w~=F_<`^F@FkK8+>&Tz;N5td6lgSC-bn*nfh2?a* zh>#kbVU4}jo#!yDzQC8n=9nPC_m`Xx3ZGMz?sXZl0Jy3z{h!HET9v>$t)?@m(Q*TS zyV2w|*LUm5P4dW;V9g2R-Tz~U!;?ONL2vc{SF4!+s=X)0`&*@XQFG5oUl55XJA`gM zzI%1{MR^sX$KZkZ-74vRsS#N_b{_|#eU+KnN3?mN64mzuD5xN`bX5d~B%d9QH1*yo zYBQw<&r{kkhfn7)VyE^y?IUOedwV(B{!hy*u*h-$r{nBaW=e?Uo9EzEpD?Ti6TB7l zdQRIM7G8L=hnxX)#zcP9g)`~A-pm-N4mtpfE~xhv{Ib-^IaKR6H1y|;9+k*!qyIj? zzhWJ6n*rQi|APR38iAx8TUaX58XnnuHwJzDT_) zsoMD9<_FQIUe8LU)}J9E|#GI2W&U&*Iu zCZuX*7p<=Q7Fcl~S{4g2t{DPQ^)p<#ENj3 z1a=*h%iFltd^)bp-Pl>=jO-z#X`37`^Y0TNm-#=86K#T6wE_7)=OHne6a0Q-8{@6b z?Z3&44A)d`_FGjP;8ps1{m3xnraTcRM%J=%zj`%j1&z(66zK^l4YT9}(DG2~W*r}p zub9{Q9kw|KyT9PRx-X)Fl4vv%Y+pn*mz2COqPm+QB|s4ZN=71KEuM1SFJKT>ST&rY z7DOy1@#Kvjr_-{XLslYLPOutQW6 zu>^#pu-36OA?T~W)XV+5BfWrg2OzGxE)IpnWJF9ED96ox!GM@gX_+I%=nODbQ+p=z z(0+d&jI}pVcP3tZtjSRg+%)VZpRz@O6t6_J-qr`GZ zjV@?E1`P@edmL@b_Kg1UZp>vn=G+h}!TyV6CcP)5MjPVZ5$|&jkVKu&j6#ssEGA_> zyC?hsO|4ZjmHu&JL-T#yZ$Fa!oQMC#eAlkCO0CvpLk4oihgI1H?~5?4WPExb1Sn80 zq$q5@^)umgL?&nX$NPL;QQ+<(5>3x{MstJE_&%Ognw2*QW<^_aTtb){*yX@6vH!~A zZ#VCP7NuG*9d!ZmOqoeh>dwxAr+K6ODyWb$Ir-$(S4|EDY|}$=aYcRzps+iISaJxF zF~>?c!S_!}R;Yn|!=mI-2(Iv9VN%k}=5$tNLXISkfk=p%mv+zv;tJ?!jDYv(sK6=ZsJ6tcGfZ7nUVRHR_3BhM++8uvz} z3*B^|qpv~Jm`POT;LV6pQg0pfvcU4Z-*kMuCSc_D+aCGdqLFhCMCgRJo_D0)am37= zoyfu+tsWgyUJg6#c!6}BtX>YuR<+riSw_O^z+7TLG zJC}r@XsyrK(o+Q*en!gI&j?DDO~>I`5ndC|Ki57tqL zwSV153^>MaZE|si9k#tq#Fko=Q_IB<2xsO8u)eDcEM3(7{))l{{>;BpdTV>P=duEM z?S;G!+ktO9FV1>`xG*{X%JMujc2b7Sx`jA0ShS)N-%>z1XO%GDs}Quh6Y}*&@7K~z zY5iiBLXC+GVG>7jOxh@(&PNxF2UY9((z`D%;itg^<+_}?lilmuprjf@6m{*}je8i9 zv>!%MwDJES^Z4(u1LohQC97dLjv+W@&TdFcrU~Ad2Ld{2&nURSub|`dYHWHT3!(zn zCQ|1$8Qe6@YK0jAMj%zu+Psj#gdPGW%sU)nM{OoYZo$XvcoIz%I-eZ=-a~9+N;>%7 z6JRYA1X|5+tE(n-MyA%d`P-C9yRALKOXqSjQZjasA48TQvvmD2|FRf>7 zp3?cFP*$uViyp_Gt=O#h8gdpo3qrf39!XTjq1fX&InU!;uA1#)iSCM$P8+$-ARfUAr*i;l zaKu8QT~;pM;?1lKF0c!C{w$$zLUT(~%dZfu($BTQu^cE$h44QON8C*eFs}X;_f5Vq z-oGB#;~-(X_0MIKxb$kWSj_))tr6{UhxstAM_FaJ_{%P1pL%pYan5zPs5OSjBN8xV zxcB6v8dCI2pLmsQY3%z6DP@_^a=ZH(KZ$4T3Yn)fVAbxyA@l6&Q;f{(LlEIiZ+LN8 z?j4OJx#-Pb84UOrQ*m*ojMF0XHQwPvh&&F?9kf4(BO^+{t^z28-3b% zQ3AU1rhy@`;6OgUnL{HN$ew&>R#nmLsH!kP5o)sa(IOZpeXZTD_8Rm!2WUo=mUq$^e2Zd7hlNlC7za5CsTl;T) z`8W1GFf*14ut*dzQFcmO%291tzz45xu#Ht|Jpf&fIzywZN_I|-USy4o&K+)0=;J-& zMHU6VF3d*;IOf5|x$W*x<%`$3CJp(`)yS>m9{0}^i2pLV;jU}HFO-o+4t*x5UyNIW?`&~ z-9x6JUtAr+fx&>!zZ$rx!!2+s)y>|4yO8*CqFgmov&LvylFhJRWZRqL z2)eD1NZ*X96wL4EWa29oeMFy|)MjrfErogrvM^MDO5FT>VS5cy2>niNjflm!?r=9s z0nVX!)3H)Nz4bk5Ca;gj=)2y*a;>u5jcfePs5^mB>U4S%Tg&m`TFaXvdO%YA7390Z zdqZkFL?5i#^7Q)V6OlEtZ2|0GdND(HaulRZ3-eZFd1Zufdk8GP{UD_JaEP|AH#-Aa z{YE%Fz)^2H;yb*CksbpmNPVW9_XGVIK8Y8xa`j1AdJHm*v&qv}2Z_9=VWA$!?W0SJHX23=o2Pz$08V+5P zQD8Q%1XOBd$Me^Ew~}zwtQx}3DgEtr20nCkf(Fa-sMzj9Z?JB@7|fW^?~cS`nIL|n zptrnnW$;M+?YGlK_K&-&vr-Gvn`B*sdqxrKwTbo~zx*!VXFGafRSgy|mv8mO#*eeyxjj8~ydp;M zpExEB9YI-uW?oT4`vc`orSx)sBGZIb{s859a@tEn&DnT%Ln!264lqvW7WPFj_pBZT z)N=?a<$Q_~A~tM}fSk85-{TkWYLb~2s;B^8K%l<@=n2qRlloqGZ3_*3DAq-NozC!w z^Y1tE>GG><7a$opkm$J1I@8h11$gGB>MZ%jxU_|wzrac7#c>P-m@V|H_fTq6i#pFK zcraamJDhd@nsCVrr4aaIK9Vr}9B|jB7r;`M`-XsJM}5H1svT2h9G%9FT=uF9%nFH- zqpTeE8v%B!#z>dJP2fSp@!8;0h^c&v7A;Bs#`$mZoqc=XZaKYqA+IMkzHuY!CNW~| zI0TQAIaucxo+}x0YmVFL0!8;bG*&AHm*Dr=3x&zJM1qbQazsz9~WZLTi%;{Mmu>ZZo+3EthkH;ST4H4dtsgt-vhJobZk>u23ftx zc#a4%X+s60rK^Gi9n{Y>O)dr~;Tiy+AF33v4NjC1J4Hko{t4)^fTri*a=Eod^dIJ2 z!hDbWNZb)s9zyXn8#uz>T}jb#Xq3Y3T3En&{|e8x5Kj`gsjT*;lb*ZWQyU1b(2V(0 zp+-L=1}4zQ2^*KPr?d^Z1AYDA)A1Oe!S)G5`JpgKf3?grZ^XQ zo&LPaJv7#x9rj85dMM{<2)_V9u0_3Fnpc|Y@#s-$4+TShCk{ArTWq~@rEb3f?1zD2 zR*oUrO^N&J$P;6f{i1q$8&DwKD0{avP-*}^`JYQWd_CJ@^GVY7{d}^D05JqtAPcr< zRGj>6!Qa?76GZQJEI+mm;eJ&x+N4C~;mS94?OF-w&e~R1T4-BZ-pm$7{kU&#vkQ)V zZZ1j+gC(L3CjllVD_QZys@x3#%23H9d9@{{>y&9!EfSc$5#YE`(I2 z8BVUN+04AFrlFzzo{h1qhWRzV`T*70(lbR!I$G?L&=wp7LJK;mjh`~hyWH{g&KpB1 z$||Qc><>S-I&bs|4Tm7x=L3ndOLfcW8^dWkxZwJ(kTkL=@9=O>L*j2)+zb15A!jW= zvQ-yi%BpPedWgke>DEI6ug_CSz;X7*7$ab+>)j=Fi^q`K!vz*v7?iXnD)?N==Et4; z+HOMLVUg6o8e(=wrKi1~!$pE@9%O#?qJWcNy*W8P=IL~#Le8)c`oo-CYb#4N=~!~$ zvs|T%jhE|EFp>V70g)2qR)4;$Ow{G z&!L@Bp<~Ippkp9#GJxQz+HCUci!21WhkUtJyJuAWZR0~^0<#c0b`@aNoQPdUg5sfK zJ9^)ipXMG@@vcIj%zGO0>MCNvY|qGhG-(O;MYmIfsO1PTl<{z> zV$bLV-SyAX9oQ*&NC;D-XJ|bYg_|fDhlVI{_!`>SohfaasCm2lY?(2o|IK{ywbg38 zceZn=LP%j_=tDgoBxA2>S@lZ1qZJ!!p;s zbXGg`9Re;7?u;E73Vf&LE0DoU}>bul5 zs2U$V;@3!BT;;n%F5#9oHq92y-JZiMP{7^et3h{ZXCnBUnn$B6i{)V>BlVxSUVR!E zxvakT$x!BKYn3&&*@m?yGF~XTT&?Q(EKlJB>Oq1*kv7ZlXf9yR;Wm~$%)@8hpPb@W zqh@{2K*y4BedvqpqjTFVc+{TJ0EI4+T0cmp*e_4f9WOO)Yge2>6|Bnc7Q3`+7Sy6PC7FxTZX9HRy1RQ*ywDZNvKtq$4l}%J z@h>y9E&a3VHZh`KnhV>W-lQy2?Ed_ptw+R`q}}bgPkD2`U}z{S7JKu1`N|QX-FAJy z0~Qh+;{ql=SS~RkhVh~)L**>-!K<6fN3vxKWQn19Pke(JTGCJ zeey5`l{h+Js+yGP;`wVY2IUd7AyYacw{xyOXRX-}1-}2b5yOAG>!h^@+n*XWGaWFoL*+P^I9B`_h zIhn>T2=5p~8^Y4YM6&pi*<+xzUHU}Btv+_0Lc9zSm{w3a@8x>$8QC7rzGEu#J4;+C zh^znZXD9Ey*m;lKJa_0z)m1y3wMk?6pPsxDpaerUp(z2(@7_fLPE77Q-rqI@-MwK_(IoY>1x8DKpKUwMMU^FtU zplMeINg92t{F4 zr(^;~a8Wd+d1TdT!^DH)|;b7a*8*d6ODa3)tXUIl|*5*ni0<=l1k#TMd z-?C?P5cU=A)hx64DH~;a`gm*UVedp{xgnaGdhgd|`J6Wp;=75I?I@B)yX|*Q$$0m} z_uv$6w$bw2Zf5rfOIf}AnVhaSY9N!+ZS6klt|6awjLoKJ%v0Q5=PIfoQr6cg ziR|QN@($OhtELKikDrOjD)kx8PQG|^19s%Z3Ei1=*t-SBrU(079(B>>^`f$fplGkA z5d8CS(T5!j;W^%Iog&l0U?0>HI!VVm|9+2kjayjNR`MqfkN!*6;i-=`?SK+bH z6)g)e87k26#o~~wkI21OS?HRS{X#?*%F5RIbj;j7fp(k?$(M&s5FBC%5Fp?2GV7*d zD(!AEIh#eOyObukS`-B5{JNp)C`<_8Isehkf7SObpC}OS7KH+! zhY*F&^HWL=IG2N4ifi!(UjTEwK9sUWL|`dOSchh1`9FCUGcvlhW_i2Xq=`0^=@UcV z$i8)bN+jf@beul!63w;?4%Y?d5+I;>{+0tMUVO%w9y;C^e(BbB?4k>PYMfuz9%&gR z@_~COkDn#4a@v%NcL{WtL;}OVubSclW@GQCm&rRK@6E3jmhx+CZN6AL4k-DR3;d^} z59T|UB}Z&nJZoe^ZkP9DX2>7_VbVC2N3-j{;`VHZ2~ibQ^!E%bzygfc7rd$vuK%j;}XVOS{AIg00^rI#tBX?ztW$BiJGVGDIW*P8m~^LGOh?(#dRlw{id1vYkl z0hbK6PvMYA1zVj-oOBJHpwTv+H1NR$C)c~I!8deUyU@FLE2{8WS*KquiYE6#@TJ|4 z`IL%$QnY-aoYDm67F@bR9Bt{JH~QFX?nIRhRrPU-cKG^B0<6h@A06q@yX=O%@t{;~rv%t9$#5NYwvfWT@`6WvH>c>rR#L2o>8s})b z4p3rUU$NEKA`5fkW;yF7!G-S=7BU4(oqbV`kB_A_d+Vbv&JTrr$uRuiH(#Ds%?LJx znh0M4TsUL64kUL9As}d&JMb@KELgO6iH#d61V7Oq3JX~U_CP#UImJG01+1!?NoFCl zb9EL)tF&6i`xX4Tjf~tH zCh-#LMn9~+*PQ6i?P`>;aLIPDR17K}tZ+Z-*7^3eKdsf6pSAV&`~Q*Wt-sT3+$kwn zDb0?+R~&+?aZG#Q@bEB~3D(c_7TcMtx0oEwmRw#Ow!-XtbOyXzpH)}uFY)(}3m9Cu zgF@nPZrV-X{?VDZ@b6Z(N=Fo1aGuC3r~7cgpx?hOS%HKAV0==*qrUXwl|^{wgSxe7 zVxwQ0^$G*#cww*ununHdbT?Rqx!#>%wLE-C#6(Af4u*gSN=)|4=3ODcL|Zx$62IBU zQNqQWoiiu6H@O7^j><;~XJ7hozh!}3bE7DRNK;0D7@M>Qo=@CwEMRQ&V{1G7zx^!P zY3mghY-Ub0CxVi=SoMpR)-bU~#t&bisDcb=7zq)*9Y{D$+kyzsNgvGb8NC-0^K7o6 zBPf%HI(LDpq9RCEib@T>0@&@i&8g>aW$?&I_!wWaGhP=LymV^i&>@Kk>lsYlo2X3}Ar8&cu4W;PHcYzU!_nRDDzVIg!^I#C}-8s_R z3$asYBw2r&s$s0`#$e!yD!=8+fq5N=ViS(NAfUmfp9SVBQ|QXmKfc}_>?J;LsT?3R zjryH(8{)^ENAobguSO2z=1%f3S>JldNU-$JqhHsZ-Cms15i*4}YR&2M$lj}$>VSV( zYEbll;ibofbpzV#^nQattolg(1Pu}j@KbFx-p6 z0ak!8k4O+^RKRR)YAG@8Xr`WEx_l*gaaqblS%DQH*#wA{ELn|T|AX8gEA{p%8GoaF z9wHrBsD{9tM+B$(af2cRS{BX-CA0}%^B|!a5#1D3{+ogF`<+#u*KDGY&&md2jlv>? z@b9f0M$hZQeEvAb9m?E(-iN$R@Lg9xlbR2DO8Z}h5>uJPN=cY+_8kUD%d>KZN3~;T z&hg_P3%B%UA$t2UcQVfdmC>{2@JZRT`6rJtMKf`HAA5K+nB7Ph4O+{|VjikY169Ok|5$+IJ+A=2@}%rr$l zCnL0TZlJEFGZf-Y{{>gwh=^@@YSF!xGN$G>eII)P!u$Q0fr^z+5AuC3gk@z}GNGxW zU&(pSJ;w>v(e_Ht~RP*y=RQa7tuJoOaR6xtI*`77pF`eE44^>K2dtooW6h_Je-3W8^vnPg?;2?3 zeuLDLz7X^S0wkP0wela@D*wM^?|-)3(X!wQgKQkRaN~&~vXsuu%-b#xj3G`nlP6{F zvi|BUJD*U`8RW)L8m$@Dw;Y`a?$~-g$Q7EH`UHwm82Ernz?O%S9ubJ z>hE(Ikmh}2qQf^vrHk**00CM}Pg9|1R1Cl8=Z9KkQkGSpB7J5%6Ci2y=yV36X_Q&vI4JN2&8s&^3W{3xIZB0l{x zL8n*$aogyxhvq2irl!ZLzAxcWm9PQMug3$7K~kPhS>$(-_P{mMohVx)tS$v@@|5{e zi~^0uYkKNzejn|{U_`RbFNYIr)`o84E#w)|Izs18Xs$=1GYaS2%0$xHhLNW4jwoRSIX1b7G$PgHNPS9*Ol`bI!6H|Sh6TF}wa z?8PdlQWUO`1g8)h{&a2ELf=TpRA+b!BLqt!sBEw&t-kru4cQi?N1rQ^<`p0#lj`b= zZHQIL5dTYC8HUB(jS+o)jck^6%|MtK- zWjM>?=q#b__5-{FYcW-ldjq;EBnYr#j2-=SI0wc*tzyCw0e5!@Nay8 zHA%LN{v#~zaH6z(8tG~HMA$)EQzr|NGZ1@a_s(3;VS>zdT-+jH6Vhrjm$L&tY_z3) z^dd>8ZzY9k?#K%2^5=&tPXbD!2Q05MeBLlyN$pd~t~zpF!^4wP9mj)K)^C5&_q&t7 z`+M%8!P&-p{Bd+@z6Yv62AqqkLTrNyQc4ed>mMl*8#jna=+$=MUQLJf1=S7tMZZWv`tp@%{!jpGZsi9Luj(N2AlPN$#qM+-rZ zwTIE84c134Ki^e9wp)>b!dSLLX+@FH#&dc0SZF<;uB=)jUt=y7zG0SHY616(ba1ul zVjwlWD^|0ad*$VW!L2;{h!T=>q_tODSW-DqFe!ZwiJ}rO-8$+jb}Wtjl`gY4hnPA) zBStZIT8>G%Au(NU-<7qWhy2)}M)89LW9*k(M_mJu#>cj%rvG0?s)k#+MSSWxf|+&K zjYMo}ZspGj_)KGH$GN<-oSd^~RYhy>-bv(55XsAXRqhFvF`e<1JGXc7=8tLLtyy@I zH?p5ypArf=Fw2m{LDbQ|yv>vPh#K8!7MJeajXldGmHQ1BZeMM`;F_JsTYfZN`~0MCD=BxS z`fXVC{9+!2=*_YWk6y1SYCn-nYdnmdwOg->E*WdrpXIo~^6qhL;^R>rhV1wqVTWI5XQVhK6uyQ06kKkv)<<*$T1 z6GCDVzt-@}KTV9@*YT9T8;-I|N<3-XH@p)VSR_kUX!eZy*V<%k{I{Kw=YcgFIvwAu1_%5ha9 zYkztJm>fm2+0-X5D&PIIDMyC>zornM%WKuJR>Vm=F)q9GmujG${gJCVPVE8;5-#xg z(7>g1@Y(4peb!it*6VQh!sZsf1{2~9PPSu=@IOw=X>lu&guYtwmj|<;Ult(owDneUuJO#kn>>L3_5A4qeX4z6c)gn9D12O96y=2wP*CFiN1u? zdoY;0^?m93pwGJ`B1E9U777kK3VsEyHG2QQd*~b@U??Zq1s3ugl(g03TwnFT5l!>MbL(%j?7njMN) zRhLMivqkL`8m$NSvRf}4vAP@g@_w^-^uCHjzTe0sk^E!!*T3e+CZ+~f&Q{nAs4Vl| z8@#!?6Grv(_d&migT^5;gk)C2{!5U=E^P{s*0UZDt@ejV+(8KdWlEJ@X73R=cm1Di zeN<|4amLRS81KbMxYad6_Q1^>R6v@ae0c46bK>M&VwZ1H^F>0NPeCh8;pH#Phl&;x z)lEe`eu|1-~86w@s{s@KPHe;GE$Z! zAgE)xI3VH&VFE&Dz*$2$x88Y9rQ`}Reb1;p@L%_g7&6}(Wyt}nSWmTD#XEfPY(+i^ z{6m*Rga5>A?{=+kYW`{}`y*_~{efTu00XnoSVl-S?T-$Z^-**M>?e)p_V2f=PPs(r z&cquQ6JmgdQTLm`bOZO{0r~w`2r#rHApJGn-Z?TJ>VmNH2@Z+qGG$fQQ5l+3myoIc zoY~t@llG{Se@UtQWQZTCRAn>$80FoSYQ>^%5we>hZT>9M+IxSz;Qp}ru^)!b$814> z`yN&$k}782{^U3R>GuM9Ty=AH&e`s}g=Ft0CJ7vGg5Es7f!)&~z+2Yevo+$_T_(3lyJH&28N+29B$^1wl4 zLOf`UE|n#geD4?VI@4l1{*fB_3)Z+V|Km5a`F;IgW)nk)MRqhRGyu4bxIG=8>vfuB z!d@s&g?z1ZUlk8#?HMII7f)WQeeNx{UfVt0aA@rK*10kUqX?DhE3qe4RW12LoC~KE+76P|e*X0D{+`Pjx+JE}dIuahE@nW* z(S=0}+uunuMkKE6w9sZUv!w|`mvt34>(=tWYTB(KFHl^Bt;6a)BU?_UkCltOv7_JP z^(;OayA+BFeGYDxsczPCx=?Hl-Zs3p`8KilvSj-^jwjV^*>5Z!ubT0|2e|Zhk;db$ z_FL)vTNX|__hO+}+uw{b7t&(m|7iPmpta3!8O1Vt%jF>k;u4k2o z>;&BaML+f~?a+LlW!(&XJ{{&unUebXjZRUt`hxb&7x-3pRX$Q6ZejKx!mz@scTY%% z@S&u{0n`se4loA}o^3uILyG7&1XZ-JAq+dj5M1^ZiBY7>e1Cs`>ldyG-?5cjfsurD z{It>Ehw1;v>|R) zYgO>82QcZAOhu5}`F4E{-l|0CByoL;sQV5Df z6@h^0s&+cD7 zyfLL|rQkxYc7C_)#r<}m;Rz^hqvG+jbnwm3lt||?r?H{o$>BkkX_>v^9NvrcU9mSm z0NzWxxl>oixI)LR`_WjRkpWMLsX8OIf_`4+B1 zr2BisPwLt4(qw&$Gc#pZkW$&vTCm^6bqg&?xMNQcic}PQeWlvU=b}P?nZfk236>0BQiCt?R;n)wV zrI1wJ^0H{xOxV*E<#PVhh+1#_sZ1F`wXx#ERI8N+e+xMUSO{&X3%|QO$e&mj2xvRb zl&qxo#PToF%F18u``FwvOj#L*99YDVZ0-j3`{;HHgd2fT`=G;?9EdQ0=0~DmXNq(Qp>A2;Q*ke=6jO2J^ ze*8xs6+vbt_8i*>GC3r%!(ol;=L0&Wk{nu3h<_EmdGS(Re%VMY(2e#~|3z4`9~2f| z7*u>J|Fqd1jd$C(YMAHRnl6Joh;&BvC73>dTAQyIfaq;LbsN)P?7++)4yd*e2^IuQ zIOcl+v#pJA+s?vr8z((MrRxU%{Hw`c=aJPmEz_nGiHt$Y;(&eR$}Ik~kv*edNcN> zB@}whQf!~yC-LHjY^vHGKgEPxux?+n0u6>B><-@Z>&ozjKDLhA9vh9-CEWvRM;d3` zw<2ofvH8nD>Hi5_5-A3<3p8BCVrR;8hYAfQ3yn?UtUt-aPhx!h|NOIphRpPpW!2VH zo;y+TX5cENMF|Pvrh-{vyV2}Q@mUs{UXm0Q;rrsdCkm`L1XZu<}=JHI+ zln{{OV=>mZUM6-*NUe1kT#kpmlrOXkW@xbEGItlzBKLn&_vT?~pXvH|dOFjbX%ln& zrkcg=)HG&NqsAEbZDwL(;@WEC0tOOELkXd7erJR7tBvPoim-edV0=$f7kUrbDrz+A1}}s-p~8I_x-%jd*3G!(XXm~ zHei!G1LERDui@4i1#2D-hw3Q3vXyZTHm0h^ZU$r-ur{;Qy?v3E$cDu&p;$ZOA$e|r z;qxyder{eokgj6PA>WcQ5g#K#TcIu z*WDNC?1?ZHK&X|ksh8?Rrl4wWMC&3Z!#(?BFc>s&zQex2q+JA!Y*K~h6YFM(B+r$O zN{28t{kNfG3vdc2R$>-#gJa0@Wz}UOtxnDJ3Y%onQ}alYp{uuA5@hqxo%FtcgSq98 zY}Lcu++#rhhl^?+TZ?}&TlBgZ`6K)4_VV6+(FAhq?LM1VKUS-L1-9#p-`;3ThMxBpFv77kqyY3id(pyP>$@eIA`|5T#^jX67EZIjsw8+gU|2=~kh4VxP+_b#1QpG(NN z*f*_!kJZ>Vso+q8)O>)Lo0VLX3-gh&z@GogCD@Zf-k2JFJ?HF>3r?^2_4CzI=Ao`6 z{^4>9X!T~Sh@zUeuc)TuEqyaBQ_pw-nz<3lYTfqcx~LG|=%OebkRmwd5|qS!j{WI> zgKv7TVk*qKq7ez02I)aP&p_i@v1F7HKh=fx@Tdc>0fZ$2Qz;HBF9H~C@U?u=qn1j_eKfkyl zY=w29$ygt;wY>ylKl^8ZxP_x~#1{dkd?_;5DO&y@ZOHo1^Y!0Mw^Tr!|GS^RedtXtu%G;aV zDuNPS?KsIc_NaT@mkHsOj9RP!AZ|OJ8PZjG*Am;J+?Z}S6Uuv-X9#q6}KL4W%M@w4fA#W??4Yol!EbBuxmH7etF-iy1yxn(KE|OUU?tCb0o}jFO9=tP? zwf*sEseOg@yWWm)jl#pYf7vLjb8+*gjFRB3P>8iD>iDhC*I2o0u+RTYTD_xlbf#f@ zmTP%nu!-&UuHBW1eei>BtyjpNWa8tZ-F8Gfk z4jfH5DnG9y7Z%76?h#~FCZ8QEZYMa&b=7b8jXu}uQ_yw%uJplMa_P1_| zQyr}}^L!t8fc4Xb1CCs7f>RBBo$t4SMvqko8eJsI;jGGFY(3A$`P_!U`pg;;{l@Lk z{+@NwA@)kdr9)lu+fj_w!N+T5Phr|;*(l1 z>0=)8GN(}LL{1ZpF{0M1zGl;eV1KwFiyhcA4$zsKJ^9~6 zkar_{uC?E>y5;^(BA$PIEY*kv-#X@DA<(z4c5{kxsK3dtup++}vBFom71nOaau|l& z$BIP6_X zKu7owGwX|+Ko%QTc1r2#z~e!WNj8UjfZnEXi8BQHaGVaEc4+sz6hSs2PqGfHAj88o z7{JKRPz_q0Cw*0PIBP>QO#fNa5CcSMtIHjTjY(CBwuJ~U$Sahxq<9I(jF3ObGwU)# zY-``{J85$b6S7JLn=$02+tmIzqx-x9J!3nAS!cIv?XT})*Vr*&xpsTF89kaAQ<>K> z5j9kGDw%RS7B(dmvizLR2H8%rE-Q0|p4^UE+AM`=2a{qH9@l0OqrzUaN(B{UO#~zT zoZ?|q>^pz<(PQTsy8K|(F-(M+8RW9r8*lef7XITr?2~IT!zE=#o$!P$r`6rBUc25> z?sxzoF{as292#&YM4u4RZpN{+i>b1Ty&O_ot_}Lf5yd98p&8QrNc% z!N~fy3U_DIr(^XSqJwmF?Cs5hnONDYsoRp3UH(a_bY|=D%85#)K^~ zCaSz=mj^Z73G@v%Xj+oPryGoq+Cp%aH#ra0yDUa-hW1V?%2E9LLUGPtG*v5&XVTdv ziyjwt!J0h>XL=B>Bo3LRJ$z7+H)SbdA_DZ9wwS=8lII6q}c*z{)TCJ6xWq(Xf;UAOyR+RsW zadKeH@sd(AIHjCsW|S6?dlTA=PeC5d(5xIv37ESxd&;XHi$x`&^Q`RtoncEyjsxY( zGylEf>;G^Zd%F*uoRV4cYG`0`MU+*So)_uFES7nkl8$o>^4quc#Sk;Io}jn;awXgX z_J^T8#RzP%RbftZ$fl@ZVo?va**MRuFBwtXF=c}i0c$2&>|xKDN!6+!-~l($X?Emk z6Y!E1P^@7W7&P^m1mBmPcgpk(%#$UP=arkswUp%K=iNPSVe#JgBVBn!SRk+QCdYxf z`vxvds%~t3rTgekr4}_rMJE{ds9~$_zwf)XN@d${mo&_No+7JmlvpDkW+9hXf||0< zh`5Cs`{EbYYtEa3@4O(6e1r${@9xOHqeKf#b{S>eF0dh?rIEY9CY-YSe|Le+JpusQ zjM;^(|DK49Ta4dqr8y`jvkzj3VmA`nj}?P6@Ypyv-7GRWZB`=6)m(~C2OdkDD4w2| zb&vy*U;x6f#-J)@wYtF>JAf$d2=E_Mu3?x?wOjS}3SO1(8UfXc$Q9G0h_ho34VR0y zFM+@7pxVhQlp#{Ldi)t0kO~=HtAWIW|EuLX`4}NCO)UGf;p&Wc7HL;?p9_VnMtX2BuL$!E5#2y z94AKWy)<%UCGcQJ2T$w~1Jo?bT9%CCnqk)o(kKnD0%BjiWduA1KYVM!*>GY@oXA0fVCsA7D5rFg-nc;z}@*iqxf*DM)jol2U)y57zO&dl7IV1le zlJfqcZ%u%NYA5-y0Bho zjeD(p19Vd)5Q-ZUBHr$^N+UpL(ul1ZN7^}%av4xiph;JCh$0N?C%9*%>ej=Lu9>V= zJb!vA5u@()==tWqYW+K11`&>dy%%0nov) zqhg+Yb7Uvhtvy6T7aX)nk8*K$?N7(ki2UT`>HwRn(>R0o|A+$%qK?N|# z*i01DaAcaajEbs3z@)aqN zS7Fi0R8=*(00OZhFD^zBE;i0_{jL_RF7wmh{c^h1T~7LJv*}l|xmI56)N5^Df%A!~ zw%Djqd#CM;MX-r(VL};!4I?IOfW^vA3;{*dCz%P^S3}dK;qGp4qaFkT*Cl&k$fsQ+ZrC0YS7jfr8{9w;~%S9dv>jUZn5->zpKVxP3%+Y z&8)}!v48Uf&wj`?i}Ou1s6)wOJR7P%NGaP&tw_;PAkCM6ZO-nD`^22r+Oa}b)5FJ{ zm&>vu1#2DznWf4-B`GqlX;qfHIg)~WAM#8J2@VE(1NEvKoVxCSP2#86VOt>`?z8AL zkdTI+rnE~n3{n~aaI<~+q>W_JU5RKY%Bla62y1h4w!AK^|C}$%I|qALLj~&OWZO&p z)9nt`<;@%DWTi5nKu94C<9va1pw*PQrs6R zXr90AV5Ehuh=M4vhUt#RhiGVhUV%7+9v~oLd0EVt2WO@<_k0 zC1|)RQpA{TuChW0<)J-HL#N&V?Qv?t`{tvEh@aLl*Oo->WgtiK-3|HcT>goi1|ARRXJTl_R`hRr_ za-iYRv&o}?{M;&_s(WUjSnq2ICz1~qx zwIQ{07DJJBY59i_>rCbed~C$kqT<|DIwQ)Sa#q5qyK^Rr5tHYh@?6}uSXVdb=AH;! zWbYgD*(kmV}hjJ4Ocn;04S#iVis>)+Fq^ex=mO5~vm2G6H`YEeW$;@z@i}j}_ zQi1$v+R3_{sU#;;N8juzN^LDWUVEBYN5aW*rcPU8fohjcNW<-J(IwV!5i^3yP{2O^ zJ2TT?d0M@k2xy_GY(WFl!rz|iaIZEa0ovrT`g*ww{`k<#>N3y7LxF2`e{?IB7{OQ$0(JX z4?MzJbm**XU= ziRO?F)1&dBZ@O|HRh^hGE=Q$G-tLRWRWQ&O-UESQN9;Rt zwa;%9mmA@@noeJDq!@^rb=+9|_f#_~oBLtn^}{t28H9=aS0kMAG4|;&tha|V zn?#h_;Bp1cyvksM%6SgCpc$M9VKWpH2VHMeVV3qC`HxW_kPU&potRv2ZZRz*CaQ2( zp|oS)U%#i&y717;YiL{jwCW0jFQN9UfWn$~Id2jES&3!hY#Ksuf8NAwntSeI{B{b} zpIA?mD{;oDasa>IuN5K7e($%NjWZ0}AS$IUoX2pTa@Gq?L=QDob;8|5K{u*R58-$! zU`=`mRpX>Pp5}GYfkv-mbfgOlF!=f{RO8K&9&&jo%o#n^`y${oj5;5>>X}FLUZ>)` zZy(2)=1Ux#40-MCg`Uj`7;M^_bUK9?!%$SfY|t609kg6q*x(xOplf)i4e*O!TxjpC z!9pGr0Fjh>Ke51eH=+KhqQ93=BO|iyxtmYgn*`$~t>m7hs0Lq{>IiT_98>X-8(2Da z%1??;yGXCSCJkbcLkiL%YhCi-2V{dm^9}COM;0;lyn%`lE~#{Z39WZ_FUPJcB3ojJ zF`|XI*4!q8ROQtQx9Y-c=NU_~hoXN_$iQeK!iA(76K{>gunX;T46R;#cpeJT-Ysc)_20@ZHwRZTCdgXpmx8_S8OVXQ-6;*{y8IFv3eW> zDx5g^atSgtFd*X6C{2Z!y;_Vf*xFaEh*4G{kjI5cB-cm$cHiNV?p6-1cKmAQLm`DU zU~;xh$mJ!YNJuld(NB=pzEpW6 z@WPw8O*YRmq9Gg}LQpbV zMSgRgkl8iF39lDhNvShUg90<=2mzzQ`VMzkG#AoB^L zY{CGc^Lxh{nP0CTVs8D_OyYoK2vjpMMM-i=tg&cyVb>*2+DPJ=w7bQax+PN-Xn>^;yKKwLO|4cX*{3+Brkve#&t~@Y z_p=uB^bR=HIdbsUzI}TFU&Y16+Kr9Kt1M1BhrEn{j8E#U1tZn|7{k&w3=VXwGkwA| zBd4hP8i+uwWhM4?R~<3ikjkWfa$O|q^oi`eqxXrh==l`u z@}Bj&kFdE4CiCeI>F{&sl%C~E6W2e@VH@jinfd?je?^x2)&Ah*BSwRmQy=jYMl*<3 z2M#|R015CA` z4xH}Iv>HX*aBetf*)J23cbDb{`9E=Cn>`D>s(F6x)p8Lf9RKfrJWpv6TvZQi1N13amkvSgh->b$tb72IXN&+QD{jm>fPaCD30xx^jbr zwSpVS{hVR|-uyDf&+@2$F)N%VRrvunix!)Dk${mFU3jsQ;N>+vI#RS*TSEj(=jd5= zxlKnHH;u=tmwPbE7s@nu#?p|+F=cVhIOK7=*IY3U*8}(Boqw*mx3)S$gNL`r z>GBV4jN%jX)h_CMRD3Yy>=ZEuT&`(;qUo6O7H445pZ@g_=T}IZ-Z!@+;xx9LxoVOb z8x|!N^Wr7~&RkusIIdP;@I?)7VT&GViJ+odAZX|w&;9=f#l4)?y> z>*EVtk?e^5(C5V*_PPcyv2MuDhp#@ueX>P%X@%w4+pkhv{%YJ{HBdi6DKMR@uAgx6 z8f9i!OWQnu_se3iw-Yes*@vFcdJ_n!B$UqBVMHPsp<&NB)hX@lHi$4_Pm5AWWx~WQ zXkCaDNwy;@oA5;|pW?nW%I@CCH2>{*2K_AJ8job=Bg z#BYN%bw+LD7ly=y<0kuS3JLDEgYE80=v-syR{4_!x6f()#5z?x9WK^3-sos8-~&V* zCn9YL<{r;rlNPu0qB85}XJ&}(Ra26DG0|A)UhXK!u*zM!O@A*|qBj>h&Gu}Y+4zoC z=j4R57QK?qT5O#!<`u9FloIPnoQZAFkN1$`2a6UztU7&JNjwcu6JdKA(DfN+(b|k( zkTLM$rQ}sEL64cAuIH^)jQs8&c3JzMiSF|qo2Qer<-R*>-?W`b*J?`>RWOy~)yU1n z)xvvu!JZ~BFtWj7oN>Ej{v!@1+`)eF)PkAq%LGXqsARpr@AYhY_Q9q^I`+54 zbcl4U7&~xHdV$fL6wj+mqbNMWYzly`mnT~?J-?V*cLG_0+Qzbsi2jI(t8(|+Kn5vp zT!FWm9c`MSiSYJ{hXMymRa~yj5m6E0%&{pm*DV!k-0gk-wmsxcT=~j`G7>MmS!KES^6zof_|7o9Uxemmy&O zsX?`Ivzp!|AA)<8S6kCtVblN4}_FJJQkscn%w5ro+ zQTDx8BW%oA#YtIQXuA2ikftN-Cv}Hsva!Q7WIn3Hp~oj>JAhvZjDce)Cr z8p=z>5@dLAK*XcaexwrE(S&KbZY$_9A%!IJjP34gtO#s&*d#n2SNWC-xpy3`?x?f8 zl@d?Fy?Fqbt2Z<#u=SV1P8CXlBJP&Evj0qZKd;Wvj!;RTG+meepM<=*9=pYBpU{(1 zePfbR->K@H2aOW5xgI;qpfxfl0cf|3OfWJmCQMlOgf)luYnXeC4v{`pPyAip?O$3F z|0)F*%37>l6Y(>evp=}A5MVHOdJOilHYewYBV1vFn^U}SBk>l)HnM6J^ynW>bp=Yd zz>^EmlQqK`p)~~WXGw{dCN3x49YalIsuWAfr#^eVSyy1;BjICZq`B<(jM5~014ZT^ zx*-l;8J9&b{3Z?ibm0On7dx5e`FWa&b?pKVE;cz*S>n(ZT1kb;3LY`CUh958RJ2{) z>Mj-|D|-UVKbfMK@1ShTx68+WdgstjbUClmhWyaHq;JAm_tpP`)|I_@pA@DF!F%6! zjS$Y*l&DG;<2R4iFxjVi;Tyr;SP?0P(ztYMTWUZdPgX}rk5pU!fsYnGrYK?uAJvOB zdkwWY#S~&p(Oz;F3!BwBk>l>+Dw{e8F$D%o%JzXn2i}ySMO16>qpF%CCx?$zF>UhR zi^%$F3QBoOW5HFWMn~-gR{67U6gA+)Fa2gPy6{2wOO}o`8CLBtV&W1rE~F!p@t;FU zCx=|K{A)lM*O-+yb-lP*FqOQWJdZOW2BOC)HW=INu1ming#2w+!8>8o$V^DWwjojO z5C6=sbXMr2{$mr*}pOH@#+%%=ANK(p)^h1G|_>+ z#VhC)78fgV$3rQnFMHsaOZc75MJz$+x{Lp_P2HSoBT&l07NzXj#TcI;=J|TBOn{J* zE24=#OuzWK?e6^sknUnD0=4m4yQDO7ytkQ#*mfws4@jw~^Y&2!;ZofqnFfe_hPuJ@ zMX$EI8nx?pDn}7GhlpejXBkpahaKREU4yc$QfZbm{?Xgo+PNl~KERI$gIymI?NXZD zmfP2>;v?B0r9l;>8N){dpb8iuN<$k)`)~D*uM4e9bn`Y6lO=fuiZ}R^E%|*0-0T?rtKrIccSn}cZFSXHINk5=_8Hc~3LZwBfIwy$%Bj-Cbilf~<;}zAsh>+5 z7`opt5VHc-6gvm|XPwRd?7(eKC@Vwe?$F*eI z!7gF^VlNG>3?yN^FhAtH~<*Z}bcDRznl zoMyzbQA87dNGhcb|7~(p%(|Hw*~r9FVDx#(&4mNn8mjfvIVHgDTr5AW+zwmJGzyWX zVN~*mX-4|_qxz~7;NRGN1+-H^18t;7?oTs5n^vXMzB}LeW zM6N~^_Tm@b+tCCkq%-j=M#s)VXKsh4);qh|t-V<9C=GRBB&0NZf7GYhwq{y-X*$tB zD_FMMt%fRg{ANVJ-HKyu7-VSRm5^0eOU&!IYl1mXv>mj-5My#h3lt(u`gY$nIZTW= zKM~j#3adelm+in#I&3!8I%L6A4yw#=smqrupjZ(Nje4U**=YSEuF@#s4G}GM5ozX+ zUl}IkRrcF0`o}&v%3Bkk(|r54;COP{@wu|CIE88<0HB0LN+E&(aqvY&in=Z z>wrD<>nWH*iWZ!*!5eRD7#Om0n6u`O20|t5j9h}-#4 zWzvl%zl^KH!z2Z@5rY!EQ5<2M9BpqUJs}bjqjsbw>Hdni@mX|W>>y=Z^aG|yA`PRZ z6cUda*-~beU!0KWR_LjBA<-DpMY5YQj>|?dtz5*BrzRL38SM`}J>rIPa;KhgPRTvG zx>?ugU=xrlD8|`}OsV*I35k$08WHm89L+hghk47Q)b@23Xt?X{BNmwJKK=bq8V)g_ zb++$KPOQk}Z!a$!5F-&Vz%Ihx$RL+LU}ttLFe*Mvg*nXcm?<$fzk}VX*UpeymlAY= z28`48oDTev$t2>sv~8W^E6aP$D%5#AMaor&PO>+_opYRQSUC$J{cfUjEzay2d7>+} zu!vY`%C{@ndavUVdjNgOM++C6i7m~<)*P#)Xa`Gwl9>BH-DDV2BWO$?j%DPes+(B?ZO_aqR5uV!wCrnG{}O zll{s(!%w>fshN{-udJ@{!bv8PPFo$KtA94+Q9U8GFDOn1K=2}d?L5hd5i zBuhFUN+;~NH)t^aq1<7jR%g^593^$O6RL=0Ndgh(!}^QbM=tA!`!*hyX3KKPhDZE= zqsinCQSBKM&i~6;>OK#f^g${^4%np+Aazl$kbKx-mp<)ooM8ljuzcVExccc%r7C$- z7DX+8FrP1pKzhNZ@2Oh@F45G^9GZ8ecTnO@I0 z``T{0tCjcqet+FGMJ^pPyV4Vgj4l5xyun=xVKh@}QRP}>G#4O%8OAQSrJ7ZBzll+n zrcmAeO%B2VZ6zb^+8d%SAAyNEv{zWPCkh~BC{$7*qgoJmAKH@+_MtZccZnoP!pX7#r1d^UH@Jw4?<);p5Xj&>QY7#B{g+|P^b@{w8UAb-iV6s6t`DK){%|^? zzxShWkfY7*&Zu0E-v!G~;}L+8wHTtgkc0ntW0qgCHba1TT-ha@4p*qY;!HQ9Qv3km z%4dA>Gqdq86wVB%SI&Q@7A<3aSPe>q8TSG8sxK>WI9BYo2$tDVK0bAJenZkcVQt;1 zB<@s9RO_BXvt>;{HR9AP{jS;)fS)Fs*;A=RI{8h;>;}YoD6r?Zc^CMGXHd4XuDg%f zc?Om^Qx~s`wz8_oW+Ke2kV4!|Mw4&MF8_5L?<+o6S!7?i?S}W{`0W_sI-MO;(CA8J{G;OXcX~iZ#p;Y3Gj{PV&JOk&c9ZHUI_)&+;fO*=ze|*H zb6@d*p}PIVLWagcxv^tuWqH)*in=K{PAKZEyQ9}YH3o<`M{4hY!M{G8_uc`gIzVJs zo`LxfQrv*S$E5p~`T*V8IT>o)^u&eWd|7gQOmy_?YHCBnaWy+z&q?khqKgrpEI6K` zz!dCmFAQRg;+M5T{%PZ#kVU=P!8gkl(mBV-#DMoh4GYVi6=Y6=>tXqP{N`}3Si@~9 zk397PUm6CnX4T3k8wb0!q@8;i$jm47eo)?00dbW7#{Ep#zw1$%J63MxMKtJ(~OG`+`{37e5`n2O_%OpJ)pZS|DPIa&mHt z_YSB2tPvHTV5Hs62JLA5-E2T%=NYH%Wdm6@_&ui|vO$AOh=&_-P5c1X(sKWRHe=cQ z>lK>SOB6WP(&O{tE|8RMLUNxyp+`ih#2v234QAdZ#m; z2P;vo&&;d_WnxIG$yck}Z972IF|d^d_0Ie*)m;9$@7y`nLA9QoC|{b+53^TFtbO_O z20F{IO(I&-Q#21IS@;G$!nwYijh{Xj17Y0>dd%l2rb~@88P%9mr;uj|&g~gjg+nzM ziQ&EN$GIYkB9wN74UySHevO2WA|GxUp~KBjSWBfbdC*a=q+|Hugg;CQG5kbe0PT5T z*VP>hzs1EDPsjIL>BN`ZGtk?7BeqbAN_xBRibi3lh?B_pjsyB1vaWvNkHRtYpNhZu zYxm852dR*XZRlB^jfE{N+~77fkqaYRR<3vY-sBaodBz5tARLMm?j1#TZ}$bc;Ir<@ znp;fE<(Ul&^5RMDaqrTAM^w*p5x0uZCt9yEWt}_B&kQL39x-;?p zFM);L&57??{peWJKfb98Jr%NwI$^DTyDxtN_^buUiy;(`mk(SKE9u@QH8XPsR?1rx z^i3g)5^1Rt_xcGI*R%JBB#zaDtR2(2z8NPh0!=J+_6zy8$Ih-8XM#VuIhE8H%CH(T zYF>R7+FNmlJtu{nOuRKP*rK;TZ@&D5_g9mYx?1*|$ow!{FCHmQO_=7Ds5cwu_z#6# z!pWVwn+)Rildi!G%bujvgLkrJ=9*lw#7NRgbR3&;J}?j_nWi=JA2-SoAhII?0P_hc zB5NTmA7OvMXQ^e-Md#v6iCOpE``x_$w`8k*|Hk-zzfx!4mEfkZ#E-s`**C)HO0-*r zCEb_Yjz$Uq(<7t2*y|#;!?Ro5!bb}6c;_Efr-~=U9VYXdfT+?8@8Mz2wXzak`$~r0 z6^1h?a?ON(?q*d&Omw%zti4>69}dHtSZ3_MGl|+MpK{tcoY#5uyb}+e-Zrvhg?!(; z-w&TF8sigA6~Z^7+!|*YtC9u!w;;l8Oupd3V#Bkp$zczqp{gCeRP_5dHEKTe!bF?tGtp0-fkuIC)kK z@dd>cl=81o-0Gt9i%|8Uq`v7<(tV8ugHaY($sgm18T6i=Yq60-1G&>PX&(Ufu&&SzRrT=~rRK=(u~_yD&7=h&?4sjv?kE9%4v%2;@{hf>BRh<5S9YTM}z{ zc}Q~~KOZ&7sP*|>1*#;Oy(#~*g?Nllh^0@6xh0_6D`c;obQiZ+0)(z!9^e1$HLuvL z$^9qh+!ZgBu4b)T-Neb>8_ldn&DKqUjJPh_IUvbQRXjW!O6#zp5TG6&AK*A}G!Qjs zJu7sU$GP5DOybW6B5R;gQo!cpZ579Hq9KpWPg7CpX^G0w^wrEQ@NdWj^5=YSX& zx}I?}v*yq-*hCksWF$ZHbL{BpTEJ|{jF4NLxu{n?_-3bUI!!*JIT3sW+dzzhIDXVo zzIV`WYd|65VUaOcR;p?YJ>7)QrdUZws&%&Q->+;L+%ecm?WMyFOojRFg!zhhTLBBBET12Z;4o;+ehPJQ(dGx24`Q3*nUp8 zr-<=WtZW0AUzjq8QRf4xf&oIvGJyA;kzeRf__gB?o-i%nA!fP?zMe^Kx`cb@#bO4K z&bA~_l2x}M^}vsBo}%GJ&zk*59EGMBU8jAwo=TkE-&mw?gOl&9%c z&LxIq9p)y4W8~;xa5cDe#k-%8bMUW$bn;Y)NMvP~*p2A7iMixlc7HpCSm%08 zl{mGzatq*oap8XdySYMHi_0Z;NV11$DXw_9s8}iH%CzOa=e=i!rjm(>`cWcqsyeVs zbRO+&lQiL-#H{gNS7-09jp4yRER}4vx=K7xaNvRMj1F?z=IYH6zC%gBFG#!6a|V>? zcNO@wWm2(fKWZ^reS{zDy^F;{{pFvN=d6en4Tt$v=BD;?cJH&aVtIt zXi*Njrb<7M8A3-tH5O{VCNV3YBT;UipU(kBJj6A)Dur{FMoy59ay2Rzp;0$g#@F z++P)M^{wwjE=;adEjC&+FO|C$>R|eJqY%a^_o3YVW>~1UPPaT>2e@>NAfcyJo%Hxw zBj)?l8wW6PRaB&J6vwgJDu%kYfa}JPh-@82KYy zRM^>hM*j(NzkbbifH#|WsgTxw=MD=cpYu(rW?RPchi7Oy=`&!nAjm@3(VY5!k~$VM z<>?o)WvemQIrvx=pMwNBq#ev<3*Z9%4?D9v`e3mTWhV)|5`q-lpe=rS1NNQL^n#)G zF&q85?%VE)VMaJ*>rjoYm%223P3U>7SDFbi?Kn(K8)d>S*5;jG><4T)&|g?tuu{qx zmsB4}6^f+P8Y9qAv|oRRy-)y_-o)iJz)f6pBgvBHORA?s)E*{UNbsQzX4qE^x_h#3 zA3yBCs?4S$2;G+u^1dc#M@Q-@2E9qX1lT}Ig)4cNJ_)?*awgBN``Q*y_t2WULCqX| z{hw=n7)#Iqu}ixVp;ZZsjlIDkH#L>3*xBzLxJp@_F*~ax ztBZ4-$w1psgfST&<*bK8BQuEH;XH_V zcJ1OSi@4Pb^Cu4?Nch9Ic30fwQ0JXcpuye<*(6f7N#x!LeWqA>CYC>pu(>MIHH4Cb zF0d~jIQDye|HRUrztu=F-vD{5Q|LfL=aI2d&T;Ya2X=?al!vEY6zmu~O;Nez!c5y6 zRSG*Zlde03JVI6!UGK3Rn;>fdfnmmKD&8!uNF6^RzsA@Rc4aHzVHxAN-zcBe+`isL z%r;~mNM>apw9GU7#Cw;jSjqriS$E0mjf#q4vu>qOrjj3P4Cqn!Um2Ztn43yTQ5fWj z$;!!W6IcXb1g7s72J`7oU48UCgZjnK%+J4A7EVKP!h2mfrBS=HC6T?DDp$y7^3ci6 z+o&nFKD>1mbMb7DMxkETr&p1TyxGEXj4juOC;83S{TFf6YVXJUaj(bh(py zK-{v~P7pE@g1;IXsj6F!cR4~tzMN$vjW^sZbE9a2v1d5IS_D3Lb#1=piu~rVn3r4J z#;xcySrpJMP;wX4xm39u-||Xnx^^*|bLZFc5{x;r0_gi%8|PZnLNq;cPuNgn#(v#! z5OW@@duoAz7h7qVa1o^m%FU{?j=*z}-wA=VF8_?ghu|pv%r>;_JoZf33WS}l=eAd+ z_X{IOR>kkFpxqB1$-cY?#VN$o0PP^7E=;ag{gdkf|1?6<+iRQKJZm;gvobBT>q;-! z!r;I$8ZAL=8}sHh&ImA?Lbbvf`@^yhWTue<4}^s39OuiVhjYad{KMK8$XJ7nA-41eg@;SEGKD1*MG+K{7I zB-Fjqy5DO^jH)f~v>l)*`e(f&%#JW@2RF_En%O>L4P$nfp-~6`Ve@tfIjopcjrQ*2 zuZB96Ogxg%K81%2cf|t1Uv)mTI-Gq;sGC*Q#z|d`ONG>XD|v#TqT0D=PIP8MqFav& zbta^ub21-jyzJA*E<9FY1+umRmrSG#YaB2LUqMj0``dlZLc>_0r9PnhV&snk?Q(s6 zv*5+=ae(CaJWXpBBeWY<^&tw+ z#+KYr+6OPDR*R`_>1`?1evgV9fHye+c-qa*>7nn7>xXil1 z+rMP3YW>f~#N4=7#ti(LH*>r+v&_|>NG79-?&V6v&u(&~OJt3dSMF9X7osK>P3!a1 z()qP9*pzvYkoCPXxtLQU7{lm5M=5nj<&0S1R=}`%0?_SsLl5xSOcK~-88mjI|LJoAK9eR?8E|CNFkkPPfl&V(di>pb4wDV zxVQgNd(QvyfO1TPC8MuVSkrXB$H#6x)?Nom8CEtzmC8G)!TZU+=K zWtxrac%;}j&Ivy(>d{>=V7$BcS;;@#b7$qP-ekxQOxbo;YUg(n|6 zxsdfyuCgk9_I2A~po4Q2MQgJA=2mXMYd6m!t*n?MpRO=&7Bu)>Q;_h7{*)heTjAu* z_~_J`ZHNbD;Z=HIb#t3{jduCnKSYf*-&XUQP&qtCYa!HPR^6?k6=pE4Kj zKQ%(O2cFb|%Q9UL@T28-sjDLt^ApzNjZ)0iY4aG3;I5#c;!@S)jr6T<;joI!CY{r{ux&EwL(v;AQ^ZPRI!m~k96 zCN8(JF=LGyW8AmSG>M7pjkYe}(uk2LAnuBw_GxAkS8OzKUnX&DqDWL0H=wB^HHcJE zP%se1C5VWqETZ7gbnbI+JGXtF`^WQoUbp8T{f8Il`{DaJpYwiy&Uv35BmWH$F;u#U ze^T}hq5;COG^=IPqxmb1jlQEvp(+WNQzUFzBsr$VcN>VHEez+n=5-5WWO`Q{=NpvP z{05@lI5}N<8rnzlTFC6Mhk&G)7&FM(_;~AnQld(R$0J{{+dLj(BvHAH(kIJhrWaUd z=fmG9lV0@*@1`b{nYo31S1p@r=l}$F1K9Y^(1++rUhi~GSIyNJ#2KruwEF+y%$@%Y zRMBq(ao*IfhPDd+8{MOj}YD_Wisz3fxMI4qhZTH?SYOVAUhr-?np>Xl&Nb6 zPKBq4*KUh%PS0?trrodD99pDHO0ZYF)!~Xxk+jIL)uCRve;@2X=esRW*!0OEw<^rG za7l52YY8q|5C@r^xJzBuOAG`0&Pp45^~&eAt~i~U%h<22ow#uiLE~Khk)76sul?+u zvmP29g$=3tOie0j-9&V%bY0lg@oA}4ST1j5344ih$XXDeP`9Egx$&XW?wGe|!`Eq* z)R%Y8v-zrf7VZ1g?3HOc$@D-cHJ&6#SoUH8UH>)y?$Q!)-`xZ{o?nPgpj<9jP7%VL1XawQc` zz|e;Ug^e$z-dAA%R8QHTr@N!jiAouP zx_IWoVogmGD8v+k{fYuVh1drur5DU$%BXLD;`5P|wXoo%O_Y) z#HS@EzeJ?<9(pB|i_0t_m%}VqW>!)+l2&$Wl$iv0m8bTJY^x|3Wp%Ci4_-ExR0BLuch$!2%zN-Ps<`Hc}nnUhlQ1 zay>e3<6l9R49^#A zYpB~p*~~C+w9%#gtaVJz58by&7DyYB>5AKRLINAnj(ueA zPzEnYs}#g$6|5{|Xbl3e&Q?Dh-swE#PXj+E4 zNB|Jc=XH{0s!-7b3<*0@NjM&WN+~-+_&An&tx?l)O=7yL!Z^qQ+k6g=A(aQE*opEK z{<*y^KOOt>=GvZ&?wU~W0gyG3c$Ld#RxDO$$h&#AP-69N5s2m&hofzBG+&N;1}!PG z>{Ftfk`b8VIx%W4UE!4C^FZe5{8e{SR>c^1a>0p>$H^htozOUXV|6MAWN^yIXfz>t zD5*@3_C?omUFVP^ja{eqRW~`UDXbTHO44JGo@hZdkReULV-s#^YZKQqjz}HW@~w(g zih-uR_X5Q6Qe&5ivMKuQNt$q(TZ4$)AzI)KibFXi5zqKIMvl|Fb?0AbWQ!ZB7GP2q z?4I+1&bPlxe7t9=*l7RHcAcp=?K<7He3xgCS1oS}Biki_U;=JGOLN8&dC{wMiYG=R z)#Izlaa7tDZMiW)eYv#^uusXD*J;yFd++AeZh4R(`d@)5_;w+8F5wg+B|B}-ZY}Gx zrPnY0V$=pxyzn%67vG)#V5J`wT3<`DzGLHlWfQW5aoA!R7KiSXc=yx&jp%p~&HuBu z^PjyL%pIBD=0<%pm>c37O6vG$ufMqu*URuV8|l+e3s|<}x=$c|8Xmp=t&}ppv47+g zPw#m;v$g{*$p<>Y+r02TvznRCP|g?~z6+xDx=8rBr5^++wxeeVA5VCs(}l(bgjk2` zwU;M+$$!>9^YkH%E5@eCwNRigZam;wYA&qKB=GR0VgbY2GgeKl4GRf2>-Wnm$sQHL z-ls2(r_>~KRz3V(3_M5Ohf)$&dN)!{&M(lP>JJprnzGfKYHj zkEfjS#0ZGuc_$?QbZI}}SV6W1GhQVFW}Zt}-mXoiE4{^m2Rbf&YHqJ#SDw%4%$TVt z@%A1;;wAZ`3DLqM69+W38%csLb#>jv<{QuQ=mK5~Gr!%?jXjsPq$;}Eis5^i4+WX- zIfwB`8qLtIO)mxSxlhQtxW7W**5jE3p*=3C6q{2Ic4g9!)VaBP;rCmu&<|*6e4AS+ zuGLBp5PX;i<1wH`e9_1ih#uGLjCbAoFREw>yPI^oOn9zaSI@iH3v8j4O>Nbp7;A3+ z9N<7_@9cW#mfjwyf;tkm>T@-DV_V;J@79=LUZ@fWC14&aI$`TVoPXe{o7imSU&P&g{mzzVu63b-?TwbSt)+~J?yKwmPzx~V$P-AmEea3@w zRFrRC&i7!JIk1g4`3V)Dwx&DTbCZE*W5I^e;8c6jD?ADl-m-_UcO7c~_Z3%|*?UDx zu4q5I?nk4E@$=jrxjbvg68%q1;H}}M?pys)lr60_(g9}S4!$ie zoyYCFB#XbGVzKDz3vU!)bxksgVu$Y;SeF@kq+?nB>8%g|+x<#{9 zzmO0A%k3o7pSC0I+6}~y39H)GzPwzA$zD%MK;vKe_R}7UKi9}=`SC+ZZ8-tm;2BK& zX#cZaOV6NHXPgRSTl1=i;ns{Hdf!Y|pcM@PNOtdds~` zTetns%n5$a@zVd~r{Hy)BwK9ViX){6X?`(hrMEE&zF{vo_%~N~SR{b0(!?V@4bXoD z*9bI)Mc_@hMs{AR%t5c*W{(m5F`;a6RuWZ8G2@?_ZnJY~C@lDh;qA5EtSqACg(S^u zsj$dQ8q~y+9F7Y-ewvA@WBFyuW|sy-8|t9X+}ex%P; z<01%;9LU*^_6_hLL+MHZ$p4sDtoY>jKXK~!x@~L6bsxS$1pZ?QYyX707B@?ZMaDP< z%G(HCuGP5FC{o=5o9a}E?XM)~KG{Ax3TG3Dz>NG8q6w13!{_uVO$f)ZGf!&UNPuQ7 zWSdkh1Gw{*OCb=@pBV4}XttAmz^a+A)9wEf7I1+3=j7)XEo8cOX7PmkD9E6*=|sRAuUS?h_7OwKvWX8Qa_oW!*KuR%Z88 z^+_MGh5Tscl52y;E+7Z&DNCJKoQ7tYpS`#8(tWBs2Q)v2ZzkTAS}dzVaPB+~6>YN$PLAdR|pRbot zADO!dE4Ix)--pSG<2?@`84t@$^53Su-kgsnWn^pJW6ZkRPGwfNd8F7cLo%fmPJW16 z%vx=PLp*6~36F(DSo+J1a_bi_r#WjLeDPZXL0j?vQ3DbmkNi=KXr~~r2m2YqlT;dL z_b406DytVabfi>Nm?-I^n4mEM2v3`%Uu)dYC8#3-ILc>24Y8c^p7v zkNGi!k`aR=?3p4i!n4GvIChp(9L#sU@ZEt9+w?kS%G32l+Fr^=-h0vDu;_DZ^8$wb zJs&@l%T!EmL&qY`%YNAxpxl4ZW5i0T;fW?1OX{hs-oa^m5&ha0E^&42MXJ8B4Tg_o zq};w)4|qT`R0u6S=Ildp^u?cp=X}@3Nt<_m4H_Lr8iPW7+nH{C2M5o`XS}u@)R%vU zWt)byPwpQPI1~NAWV_?J$4x>6-si^FfxJnfT&$Nsh$?ycm~TLm-E4zS0>ccx&TC9> zTYa~6a9sYb7=QTbZj<&KFj_*1bM1J-rkbVi*jAS8zr<*+ ziBHQbM*terDWv-;Q{%5D9qv@E*fY9QJp&Sfd*gsPYq$ES#olXV7iJlEcDU9K-#HiW zq86bCKLRG{We%vP`hP<#u#S$$R$SZ1F}6UKnMXRoPjL3}o7S~Zk|b&7pDkWZ%`4!A zuXD1BUWQFJQjL^C+s-xu9p-F`~4-M8wfyN^`s=R^nh{f;>4R>;hVE1gMXsIGapFWQ}*-P z4IZ_R-d^ZBZtER(q_ORTyhwn0R$Q#>BK3CgPjAU;qQEIHUY=GJYMS0hiOllvuln5n zX?O9*`}gwT`3leYd~ibG`TdzilN2ywWoGy zm}@^0E_S9^&%KyEUt&u!m1(Ztd#mXq?AR&04E|F!|3?l?6NEf z#If0OVj@BVtNMs5aPaz55ePf!TbNs~RxXx*{a@N?&A%uq{H9bb{1TqvM6i*(;!sg@ zaGA_EY)DbIh^N?C?`KNF_rB7v!S^38O==o;FyM7cQma}RU?T&x47j*eSh&5EmVc|g z454U_eK{C5Fzg%p5Mu>kKRkqDomU{fZ1=;znMLewGe=C`87~XD^yu@ol`fNg^s;6B zJ)3f;-l<7B9z>NNS8Kf zWV^m{l;%7QtZcHDq@f;?H1ue>6gc{Oh1@EKSt`aFpCO0g7_#`};>XfCv6UX$0jl-+ zQ~wzs>=%_KYuVnJA9JGMvwT6%YG%r`2YGhz!WHBGQ56yBL`L&T=&g z5~=E8%Vu5%wH^kZ107F_;aF5;N0mF;mco&z6<2kV*S1btb6K;qVyhlnz z^p3R6xi8n0pY=^!|G@B5h4l;h5gI=O$)WlDjU#oIO)tnLQK-*aF)_&bBJOPSiPB;l zAxcqp={jK|la5df%IcG<|)u)YR`+`ytDUsv+?^}iv&yMAGLC|qKgSL@Xrhk_5$sf86YIC3Zv(}T7 z)sSMl&(b_UUAw#CKI)aIc%}9;46i0&ePsyAH6{QMpAxs?EEB-JT=$8?M$`mqUGJ@w z|6$~z<7zsW_n#HCK+wGfKjCJ!$12QD#nCI}v@!#m3QNE7D{tVE0>`|4_)NQiJVD1~ zxPT}@`?~n%0!}ruIgZ&hl@qutn0`)7uIRKp7enkzrVO7+^``LnjAZeD#Q5w6GU z>$NjBF?kjD3OHjC7`)3Iv5JxyM9oB;4jnYktHEE;n*S*V4?k+X_0Qq!7P!lKWs{%$ z($c>R$@5O!>T`L@%(Zn(PW8ZwBl}U9Jm;&EN%C5rrT6G6rkO~*cN~OUMo;ad6<*GM zptSP<+1&Bhf5viL4u9wmmGvhD9H*S%o7M1Rq z1U{`4i|*Cuai7N=hZ>ZXfscE6#RYhYDLKAh{A|qk5r#%`G6f)O{hS@5{7u9J?au8fa|zkmXV3a8je;PSw^2)?eoD z&5ufiF{LwYZVGacXYtf-M^M**YKu=fjQgyKO8S(i{S(?o+I%k| zs|EVCS1m&#cMcEqH=Juh1iii~9JyVd93wkvHCv44f*!0W;FmECJn z=Z)V~j8KupzFZ|f!8i0UosP8zjQDfexbZg$H4FkkUcPuD$X@U?=gt#P|Jm(^=&NiI z`RlH0)rtXd@hlEJPt)hmpkvD00%{7Y@vtI+K9EDqdRpJe4|Fbl-DPopan((kI&Vqv z9al~*Cit$b=?2QK7YBL_vmX#XohSwS2Of*S}1P=6QVl16FLR^ zE*IFuS!SNhfLb)UYPu$0RH?MkI!9@4DXCbYbW%Dn06jp$zZ*xXE8evHqR@QH zk3-B6m=8}=gZB>~IX{-rbvjr*Z+Uw6^5PG;ktIPb*IHOtfrpe+d>%SlVZ%v}l@TY% zbB;p6%+&5L;vb!>se1=Hz3FLCcH>6g&Tu={ybhe^DJ~9s7eqlKR!FF!JP6t@|CRJ8 z{eFL}Yf@6Rw^P~MiR`cxVrAKR$j1(aKWOS&i=&mw zOdH60(rOcVVuMP0*}3iIs3JoE_8eUHVo`|7{qoP}RkzCppDn)Ls9M_XZzmDUOf#}E zF~%e%BA1Rd$;4PiDD4bqN$^UXx&!Oa!7i0=Eju`CP1Fs=(e7~~roYgPpU=@%0^qU4 zg%r)A-QIhFu(}r&s~wc`*;JPDJ`WU}>n*C=!TPf3 zoKY^X=>mer>^uDLdq*Efg&ydfor_QY&Q{6Rjv22eanpZ|KY1t2dHi;|QlG*|MKm9| zcej`6!)df~;AdT{If zmlmJ=f3}_ff3Q)t1tmPAEI8-yRm!2z2ZELyTb8Me_vxqSna=btRJHt}vJVZ1G2JmH zlzY@Bz=2NCZD>Js!>b)NtAQ-*ogy@<_o300Dogoe zHa+IgwFy((0wvxzb?9#?1DTA-v^ub@FXXoP@<c#5?SzJFAuk#6u(QqUB)u-st>o)<5nm5j%2;l3Na|a#GdJXqlx+B zeDs1c+^0LgyhfoS?ZZ`A#rEw@2WYkyDP)dAK{7_R#LG$3@B~5KHkGYQmbD&%T5!&M zCfa|t!`Nv{VAh2;KF~q)=ZHj18E!nQGmh9_u_~haS80u~M$OR97bH%|Zyb^3_G9#($k#kIM+-p{Y9<27T9pc%;5}BIR#(ue^h`*4ce$X0k zS252eo%;xc=?RIh>7jzZi;QmEnMkS;dEU<7-(oQ2hA&sZwjB2tTqkE~`J`tL z(g~lDkfTNAsHBctHQ_y$DFfa}M9)%PyhZ0uokgcA`paKqK`+aXKHb{EzUw6HzPfrN z&E2Ihx<)7*<#1QBC|TI@6y6XpCTJBB%hD@?p!?uCK*#e#+?m#Rb~Of~?}Qt_68nbM zaPa=8bZIr`TCfH&vqyd;xy<`=!G`$lj^XM3Mdmg9v$UuHbg$m__sgw#$BX`lapvzd z6ar%O+>bk&mY&7J7EQeGkbY&GYu^Nz%zB;okUFXH?4Sll@Rl6n#=buUODnLt2P?{a zh=oh%fvDkh@UsxtLIaDc%aH&`#zlz>OZ+n?l-;mu?@2n7M_zhgOSXP6cKi+<6+w+zOmK=kBTodL*_4;0Q!4tvXZJST;`TTz3SmsBb*qBJf~$`5qD z(><0i3e2+1;{zg%D#_*)bTrV*ix&Y}#Z%tKB#POVUM0NKrsStI$QkeANvv`6oj^NR z8+0#p4&xn~TS6d2l_+Z(wGnB6-E-Qi-H(3e#=D?Sw+diO4y0<$^qXz0X$NHCxq}>* zw2b>=YP#hzb%>C;wK(h$A-#sTczz%g@1qXyXfnXPt?U88SpFyf!QV{FW{v{>5~4 zee#V?x7Vee2c9G9MTRGASAo2)mt;F`vc0_`cjNnHGy&;A=Ye0<-5=;r?%0m5v-jIS ztdK?C^<`$4^v0L~`Y_&Jqm||+Cu1!^BGMvqsrTM{YWTy3F-el$Jw}D@1AjzF+JjD@ z*~EJO@$TDf7^WkSWnMrS1;o5=Iln5%UGUo5u7ms>NB*b13pZDXG|+32K)?TMi!;2f z?>|Hs{g`){XEFDWhFE$S6k;dqK%mtZg}R`;Y{@a+Ns+M=c=$-;`+Mt2>(PA~$s<{X z#7YQ{!q#A8ObM za|+~Prv);AC#N-Ygaq%#MU9|XRlO_Z z&JNoz%NLrjtwkgKT2*FYO-q*f?^6?&xnt2XU_1##(X;!3G+AL%6Zro{wIu zYMnP+HDD2!5d~XoUYM7R>3xYLnoaE;y8_2N3a{Rxm6fp+$yar?{PV1CNv`4HQI~Ud zcL%-wzSFo*1lMW>`FYEizw$c1ZM4SMAC>LG(%3~LJHLqngvp20Fpx?oW937UEOMg|;ln?sU zgcWk!I)NHNtFZl;!zUsQfm6;s{QG=ROI>^e7;1qn!cP7~d-AK_P&Lxe?f1HHuqO#^ z@##mbub1{X{7xm|ZmFe3+Sk=+zEdmgWX2%35s6624$1-i@eO}0@0CE~4!56-XA5MC z06vHUDenb)ACCdQP&R##oBK$A7!r?LT~6z!Pm^&drli26jqCQ!$7c#Wru_agv0d51>QY1HC*<`!5 z_RHH(Cpi^4ElhXHf<;ie%aqw2`c90dv(1L&4@R<@Job$37qGOIp{zs5wD_?=6qtkG z=c3+4NtCs>mKELppu)1+7)4&CA5bW!)nzt8LKeR-TEM{{Jt{UtBI^+FT+%w}G1ykY zAiXSB7NF%_et{nO=7ApvQ-)uD{BuV}2PWie+I~?}kSIq`vbadPHPa_?tX*YKGRn-~ zr}D`+TtSe$873a%IS3ggk5CsqfY!UrY1>N1_c^^&dy)Cpz2Byp5Pi1>_RVdcmZ8@~`N-Kc3rbbXz+i~^+niG;LAJ1yM74L_ z3|i~a{#G~A9|noTz@P*CP$njExpVjGF*fZ<@tMkzD;ewzg4^Yc`jM&lK8EHD6Z^bP zhyKf}`)9MqaxZ2;`aY+qoits)!8SYEh6mxLRaHwU*&_2&P1F2s;oT*lAa%!GGur(5L!FiZmV5xV~>5GiZoRAAK$MUn(zaH5_j!lQemiUkf9Y3 z{W0e9#K|jswP3awLxwfs`hGhN>;Gc!csqO_H^pxA1aRyuNL8ElnWuxOgw!i-X}1cB zgBIlW)ZTRsEG6 z@To(|YYSs_=V?jWlTVy+q33V_mVvAlsmW4%f0p$&rcU?4x+D~oUrtZ*$vj6vAu>I{ zhC^9W`>24#1$L2Ar5HTW`9lS)A-j6-!R*h)E#Ce}9%xZEx3l*|yu*B#;}K8b#}M(< zwAt+x)ZbS?`&(j-H%tw38|5JaOx&%5gkOUp@|@=ad(OX(FVWw$^eo}$Lyob|g&)(a zY9H{;8~`^Dj`IvT7Vze85bHMtqmU%IFe5D#UJQ!1oD^1_7~wqGS178CT3H^t*RY>u zbP3jN&0=kwSe&tNqCK5&Z7MV}rg3*|$_d2_^r|C?Y&k7EQjNSbDeBTMewEEd=Ac3w zZTw?QG35}`tyMZV{+!bUByN`B?G@3(7mN_E_Qt_VgU`0t5JLiLk0- z48ZRd8tt1piutkZye$RsEWWsXlRH^vV~zi@!zVHwI6Banfrmv7HTv?71;ADV5}|Pt zdm;b-^?rB5Z}r;t{&uI=x4#@S-lIwZp&U{NAecasK(0XEs1ZW^_e1em2F5{V?hWq? z>(ACSQ)tQexheiM>#-3H<-PWD@1xj6g#;zkb(`lZ-Z$TdW7c(ko|1VuU5MpAZvr}6 zSelkZT!^Q^YnQ0Cm9!jyg$f1)5Ds)GQ2J!&ZvH<8P=VvzEH_a3$^bZxE{z-tI@eol zfXr0Mrpb6@UWLBe@#^&-CQZVk)Xgjz5-O1cUVOhS zb@N;kW7&6hASWm%??r%&?Gdzu$H8qzWJ6L@;>eb|I!pC(J>(uFIcc{q7FkmtX!@>!X|{MA^081tDU8FOt)?n=0fi4iuk-HQg6kjpZMY zwyVROnak{Z>T}m7@M`tqtj)q#JFPZ%-gR1cl|f^vO)*ZMCB{$u`_dLjsSEVtvnWxO zS!8ByT&vhVkx!_N?%m1CgNk2qpVx(fb!{4Q>%*RRV;djP?|7Nu@fR29MY6;=T6rZN z?iV&HufdROVqNiwe4p*Od7(XQJFj|q49c6o0?$PUJ+?Tz-wRJ6jFs;yRYC3o+lf{T zbl{=1(QaoQ%*a;@m`a=!b)d5fH=mGoMhz5b9V&#orN;w9ih08%+QwpAZWIPdm95aS zRn<)lU}#=R^;T$2N^}*i5>K)T|N6i2WWQ9s;~f$9G_rDIw95F0dE12H3Hii~s*icC z4v2o$9rAK@*DsWS8A=u*zG%t9V4(_yWcAv^f=&(da!pH^#KiP{BeCt1RnO~l?RgF+ z@gnrS;xH2U-qaik;RQAUxL*wf=GE9Q(z!LFj$%vve)km{*!|NZvK-VoBbv-4^UuT0 zqiYaRA_&cL9LA#iM9#R&h^3)0rtS3tLS!XLBIgHRW`J=pbKn!bYlQtQwM6GPF;?vt z?45iIN?9q3L9DdPPdd~0j5QO|p+?;| zp>HFDTvpU0BZtChUgMYdf##-YHfI=7AR$7PE!wq5N@CXW=Bgl|Wz<;l7H}5~zdy#e zG1G_vET91yDHbhudBSp(vZ7#^`R5Y;7r)}$yIJ4ZK~?x{XlU)qO78^Wdgu7zHx-eU z=W5+AD>O7k;yz89nQ}R3tJ}IBtk8y)FR!i*e+3(svDAS!(8kES)N@+_X&c%_y9jAc zLI{PoGKv7cJQvh#9u@jQaG%IO{f+Dht`%bXMh5yZzCa=bust9Oi5^cw`Ql$;?!~}B z8)^=nb$SK^I`R3=J;!fjaG6`YSA>-9YHZR=O0Fuhrdx=oIDNd_lApn^<(-vBd%sou zc;K=76v>feVi`5wy}dB9)o(Yl<#?bI3Udd@^c8B9cNqy92@!=(b0reQ)r)4 z#zn1B)nb;F3&Pg?>&{F@GYMOcC)xSm&k6e|jLTTaPt=HVg1N=|z<+ro-de3VYahIu z%6~J8qbGXT=FPybExZ(x`5!Z3H0BQ8$B?Yf2sdowswQwABaFF^@6#=%R`%*+Sst0l zFk6XLo`RYLMw$f_hk{@9Mv|Qf=cluBnkmFV?8wf0Cu(Q=^9H!&yQ8RlXJHN;fM-m5 z{CzMeaW_H98up_mbh~b|Of_qlFLimBO)ugusTd}X&s%A0uUOO1gXqOEK+}|)G}G0U z1oQ*+wo;IXO8L%4mC1-5gE{Cy^BSl`4JZZunNnd!ozGsuzcdXSUR!F+Z%tKR`+#l z%I%v&nS^$IKZF>BL#bBgaaxDOGc2>vVYK(a-%IwS1V4!|;a9+qj-JWNN`RTWBVLPP z)PbgcXvtO*6w9PigqqxB5=tah(1qOLybaQEkH|bU0c~7E>$qDT%aTDWJ980m`vV>0 zx{r94*UL!KguO>n!Tq)K*?Z&SuXTT!3_O&iXC|vz$a}b&Bo+WjU%m9^77b*4$4H*9$hEj(>Z4`${6-7QE zyR(U{;>2hIT8@WBvw)YCTbK?nr#)q%L`&DdUicz0`YTZ&z?EMu(#G2u5zh^$@cJ#! zQJ{OL`g*{vZQf;Oh_SMBYB?@bV|XO!^-JlU7AKcuEQh)lw~BAnAe%NMH~+1%xLFSR zK*#IzuC@)5)om5Y$}cx10gwMGw!(gNHuD<6;8}fGz_m1!=;c1$XA6s* z1-D|rLqcSTx6{;8@_2TtNqo+(kls;i2MBYDXpOJQys!>nk9{YiU!QOvH9l+QSOPDR zm$Xk*VTG4oYX=x(@LQt5jw$RLqNQzDb)aJn462=>?PzCTW!i*yO;jSf{43d8gxv71 z@UhiXyQwTcOG~>mu}MF@n*Sfgpf`nRZCWF?QK~w+hic3YB<_gwR;8R4`Be`=Tq22>8{Wcx#(Rc%v zRJo{t`$>X(9bB;ETb~{73scHRi-oPE&eFo?qbXdJk7+Yirh?q@L(e>K?I`k^-Gm6c z&Sx~q0FdxH?i-;Lg*2fG;SfRJy{UJNV+#JmZxu_u6|vNYNb)gyFQ~youQ;m?mnCr- z8p5e&ahDZ@6<_3@K~0NR|3q27pcUb%PN_v?##dCG%UPJ=w6D(bn2AC*n`VybS;0eO z`U^qU)&EBvuQ<@q&*+n!@)3Im{g$YdYD$L<@Jsx=IgRBs9wbDV5SNItu}GHJYH9Nc z=J-{DIT&yz|K5oa%Wwa?6UKJFms6tK)c3y|S1m3-+fjzTUX;k}yF02%mV5k}0(w61 zPqf<-F5gs(Rr6MY<3q~6amjlmvKg)NpBu|eXF!fzhSBgQn5f3@nB<90)`odgt>^`tv8#nPq1Bjnr`JNCx_YAb3_V z$kaYzYX;NJfs{6#@Zd->zE>l|0WSupU)m36WEs@mTXpo-!&ZVU&-bnJcvG`9ukfr( zPO;>i!El&7eMim(PfT{+$4Z zm+;1-l4`_s4v)>3=$+b+`FG%2SCidI@$LO+Xe0k6WEIta@oH2Z>>aAxOIOX9estAn zO!80e;`VEbMz}1!@WPs!#z{SMM2+UmNkO~35wn)pEVsMFv%HI-_@&>1d5TO<7w?Tom`Y(NPq;#dXR=LVb1JY;ydFQ z<*}*pV?4SokgrfDYr*jSWq2;i z*h08Duv2F9a(6HP`Lpr8eDCN9e}l4dT^M|aX#?ZsMrNI;uq6Bq#mGe1br^0)nbhvJ zFmffSog$?ep=7r)x7P z3xlDwN6n@ymRZj5$dfSB$H+aekVe5;Y%kF##K^q8qxJ4N?)3Arch3h|iOG*>4GV#Fd)m#BZ9q3?k0MpEjPro@r$Q`uQ6&3q`ex1*8#87cl8zQf)g6_EhP z>Y_s1psrSteW}56OwAGE+3}p~z4waOO!iQmcGn(GOu-ryPtN1rL`oc{TVUED zO9YUe_A++K5F-48TY_N6TI;Iy(w%6qmpCE>lV=>Dp-shVdi!#PXCb-LFuvSnI% zCBdV53xtRJu~|SiO2j|A_Fa#7+pH{}%rq}cYuFjK1;+6f#T&3xlD@0W26%o7PZ}Q_ zI+nNXlnVsT&(sC_Dr%T@pm-s|MmNSMtYT5I3775lbu@*+qh%F_(9FF6m>%B-hzPTE z&yFz=L9<#9zfAw+Leo(D>nHkmU2`V9YTdv6kDTPK26e;qY1BFYIQF7f*WX!F{rZci&C^k_}xH`Ry!V#hnJc8XXnmt4&8^2#0L}|=v*7gsEW=oii#lzTDNQX zr6SiY>Ag$hrTY2<9lN`+FR`kIy0DO#SbXiR8H^0U`yWXX25{10C-{Nd(cje*~~+a-vj@NgyYk0G+#wZ;OW^ zQ~D)>O=FB#%m6X>G*`2KK~emXN(&4r?+S{avxk0B-Nvq@p3_}vl_Xw8Q|Yh73Y4Q`Vd0N%RA!%b|ATxoL`7`SH*Z_8ffw-TRirq?t;Z`?!H;laYq zNkl`S7g!2}$I~|Au^UpAzjJjHpF^trudaZ5{E7_h`M*C#+SPsZ{41}FKF|Eo6-_L{RK4{4$@R{W5nfENQyLCs5%lSQ}cL#JjQ|LaIgO`%N9_EFES( z27&^4@zZpVj*|nutuE1zY37xb;#Z1`o4}LJ6oJjNTf-LwkMr|AMhB1$xm_GOX`eWLnGLajW7`o2I{A4AI%7qtQJ#z(7zIDwaP&!C zxu|rAb@=c5cUETM36iQx5g?n9490+&;Ns3O-JD?SViE)!<%tWgh3KQeia%Buh|-0> zw{2XrHGi6oNrK#&rwu;pHGM3XMpj>BTf1fuo-w74gyh}Jx1Lwx@p*N$oaic?_}|uS z%a#YS9?Xejf~?T>=!BAn>r}I7%yaopa~IavmK&mhMf2F+vCX}mx-iSC4?EykL*M8cYrg}Xv|1}jEUArHWK|L+ z%+Cr`7<>ocCUyuRq0jzFfP(5#`Tm;VC0B_5(kqSgaMc}Q{-s6cOg-9-S3Qe~w}ooz@%9gZ&?XDHIzxR&x5{H^i1uh z2#aGjRol_lUMCvA6cvhWA171pnp2>>&ea|L4W2FdIG-zX3ByL0y!9e0n0#1iRGzW<_=6Lz1C3j@E$%s=X{ z>>4Fu1oLbraA7E5FtmzT$0=IQ)~2CZ%c_P>;C$AHcLz@my2QuVr0|52+dm$GP(*he z=Hdd~Z;|eMtM$nrKg{VbuACKa30bS%!siekkG=eCgj4zwr}e#62Vgzw&)$2*gvTq3 zwdS5ed@!m~YwPUi#J@%eO6v9xhwxLO&^UaGSiFc9g!=Eo0AY(r1cEuKZ#y)b0*xKJ z<8>a9yxhsMJdf-0M_7C3a4QQj9p0Tm8vm^UUihx{vQW03I&|VKqJ5yZWi}a#`rA#s zlg(&gB7@K^dq_&S7Y6d4>_y?&LjqIC3G&k@Y}1CD=wjcd+Bh8#gLQ=O_74#kMtWbnBE z!gA++pvOZDWddSvEBoYEeu8(A-(a9>_0Uz<>M;h4<*Rkz$|o_f?(diOa+^a8{bP2v zZ`=%Xq!2TXD5iZ-CRa%=41@}QF70qRmoA3vU}TG3m83zRDkZ*dB=@NCGCUu9T|Vkr zdFn^a;ZS@*5&O)4n3uJ=QlhuL^NVwEFGdd(EDrFdHd-XYqJ56V6tJ>TR)2qbC|8K4 zAr5qOJvDCJrl3{gy?pCQ%tdMV&Nle984ww2quOX>&@yZvHf!yik5cZyZC0hSQyFvE z97S!`cGI5=TcuifDRgC|j?f}=Y!7|xnoii8Uu=Vh*lW{C zV9iF${|zRL%fiyVR`RZrK$Gs_+0nQes${wTVfErbRWQY2G>y9>E9t#0ImHtgAI7j7 zP8v1=7T^+Io10f&VW5`Wy!?8ikG1v!c6&WBe!;D&u$nfp!`@fC{9(*<5IpPv(AuGy z%YNdGMJ&;gUSzibnIe*UwLPz)QCD&U!G%2H+w4e>09DdI*e!^CAB3>~5Zb!$2htc0 zkQI#P8P@Yy83=otF8(%yVp>KAmk}Q%Y`e`a&SH)xcgX6oX5TkS&E@T((Waoy{U%omqOHoH zxtr7&8*7sT5fXwRCP6EV+Q~?lgk5aqPU{)i?IYlErPw^=|8V!EVQHRe+jcrlrcIMf z#%MN|X>7EqQEQC5!pvkbiCYsJ7f@*=(I6smS3sDzX=B`=iHQp?G>J-$0yPS_uryI5 zM3E{A3JOtN;(~~Zih_PgXWnJ{P2Zp2ar8TngTFlY^W58cUiW!jcS|CPhN*CR^BL2E zT_Ni%wqGk)H6skTyIRpkTrPRQcU}=XVKPWg4;x*qFSZm40To=|ZZQ)mDIeY-7nc$0 z52&qagnojfwAKLtNSlc?-EROymNl+l#>kR;BeJ?sqWF*FDmm?!+kR77<^PR$cTJ?N zW*?ng^;~c_4^WgZd#4EoFrgm=lB-*H=b!szs)dpe)t-d*bh@~7xU>%brP_b2rY^uk ziy*dpZ4zahsIta+IN~a=iALJ}Xuau6;l&AFiRIji+)^uJ)I44eVU+l<1c2ZO_$NJa7Tk(4OQ ziegT}sOd}f1fBa{)wW6Kg&AYFkU}FWAh$#?Dp;~AC_yQ?Bu%A;WKgU0(L`qz3=tZ>ir&d#c&?j6g)mR4}HzX>6{(CLSw8u21T*}{{4?-)C zO|zd)3V^Wg@?(_pkGD_X8A&a{<0YqN0^AUYnBs+Sz+CFGDKZD zKej4qWs-(Ivsr=+4#T~tV}1q|-LjkF-}B~YYEx|E?<5#-#6ltVsQ)l0~c#$|>PM^tKY|g^$nqEMr{rmB>Cu)?1@9mVF=wu2pt3H`hHZ1BjStR>GMrr`TjK|Hbt>?Rbtb9<-VypidLWQq&x9feO&IpZHR>h%{r%8 zHNo{(J_jHIvLHSO(Tb+-V46 zUU{vO3nH&u%#YtcOm!JLvWcW(h0SPEG zDM9XT{qps-!Yb46PuV&rv)m@ppfY;8P1kbXDg|d+2k$zuLW$#8=E3K$w*EfQ;j0*i zzugR$K6%PBAj)*s+{eq;{|0ffk0eKS7Ad4rH0@Ye5;5xygLjlXH{Z zxAoG!gFe!~EqRUF&02}ZTa5Kx+<>&vxl`f^_`dj8DzE%wo6!C#m8ExAS3prd%7=zw zc1MV{`}Y?o(KwHN26 z?%>6Q;)(kFFiTELEh2NdI&>=#yGF5xD+X(hN6Dysw!T%xubwJHF0VB7D9u_O+T!HH)kZgtPXufQ(j4BE+>Qap zJql#RVf%1Y3ijwfuOK*j)ceet>_;{$cYeDbWq$VgVc~#*U^bI+AgiEaKIGmkyCG@X zC+s3D0m^|KCoC{Lqlh8Fp<-wGlmq0$f%XftdyuDVTcZ7|CYI13pJ>WzQ&0Lbmk_V& z$a9F7q|8szT^BDStg@c=v$yEhV#mGT^2jgJaz0nly&hB2kH1VDXJs%=d1qriqD}Y9 z>Gk>kL4%BovgYnXOLB9bLpJhQzQarPwn>SW`1X@4<*i}sfokr>tib5Iv%4$WEqA?` zT=nvL{MAESph)Mwk|y5`zyBl?Tgt;Y}9gQWClX=t9m% z;}txQrdQpj%gd9IrE18LaZ#R*ns8`QR+eeA4(L^N1Dh5Z& zLmqiG#WjZ%N%@xbKQ6V_(rW?m%SWAG(Vs?V)MLINSPZ+?R|y#^d|OxRGVyHj)!Rfw z$sxC!hi-(eu4779Pa+pv=N@zKDY6!$8BEI;G60V8iaZ$E>N~+D-Oog!;ysv#8Q1PQkmae7_p^QP*s8=HopI zC#NH47bhuXtL%hEeF{9TT54-CNa~IU8)yfr*8|QZA{Vn8mzs)j1-W^uDQ8vL@F1bz zGvVNzaTKma7|a&ebBB0%HWQLQ_HElVr)QD7HM(oG;>1m0Bv}O9{?`#O__TFSej?(Hu z(oJHMQq_F`!8xb!C2fgH zJ`OWR3oaeiw7mXzv4yv;)zLd+#@I2p_RLpvj`)dn!a?=ElA;-51BRXgW}-nlRr<-X zJUO%PJkf7qK{D+0MC*eE_8%!Kx`$J~W=Z1mc=r`K9;L)eHRv^j�+4oL zq9`XuO~r(X=VzC>6R2yI$)c-x&uRQ9KOsWLIDVk!5p;$gH$Id+ z&P*tE87Ia*D{k)2Tj{r@JLVc63pDPh{zq#{{O4rA=1_=KMEo%LUx8qdP#1 zEya;O{Ku_J2{%-u)7ehK;^FjEdrx;y>>Um`U_$iRZAs879w61*vMHF22TKB7^vS7F zt`RxCDa+sj4QhoizmVF5qP;|n&GbZh^P=IsI_^ib{*eSptP_oZV{d7Y4<0o7dN z!gWfW8scWJmo__%`2C|8+1`ivq!}#=B=e$|-f6xn;YFS*7sA6C{%39VPAaPmI?Zrd z(1uP4p&9)Yvy~^-*EW!kGFce+V08>zO`-QLm%^AmNVvQ?Ls0(^f%SH9&}WaNQ(~1x zaN8Gm=6qw0cVZjBF1|JiXesJ1zop8y{}b;XnBF$o_;cD6`8?FP=D!je7?e@(p#NdX zVsu>ks%2MtE;TY7Kt26!N2Va(0q${fGvWua=*DH#&Kg92ly{Cl@&sZTtzTX;o_!HK zh&^2~fjGom1{oiZ)Ou&meaVc^di4yyTH}PKc6&ux2k6chB$dZ4d3~^L5|S!49UO6! z?(BJ0Awyru4_#3QR{9b#a|<(5MA?uVUE_j@IND@t75-GRjw~^o|DFBOnLRa=Esil& zRcT$wl%m?>RmHQBmD*Rc3+^ADIeSvJ#tI<~R7={4s{%~BC0j$qxVgIyhShKQ=g$Fb z>`Vn+2_cd9Wh(t{aFD}-{oRg9uaVou@uCMVW6j3)^=sq@h!xqfFJ5z~lboOG$$pzoVDr4XctNaI!ie2^|!OKjKhR<{d40Rs8f;B6iDy^V4z zYymMbSh4BqCQhj@(Qt-0emR;x(0Ci`f%`iBgc;1oaq)I6Nopq7lGV&amQoRf=kRTl z)oA7Q+~}W3T`3jRHKjS;$HK9Btx6);7p3@HpXn+o#gWQx&(_p^xhZ@8D?|2oMYF)Y zo4AKww0sI?DdA>&Yub!_IT5BZq(49h^Lr(XgG*c1+}C$sE1(;H?XUC{1{#)|j41-n5>1(CAKU?M1&cOO(D`*bkUEvCyqCmOVx8>aGh$t)X z{dytT=5fi?QH3G^ETJA}E~*ysgVk4V%HaJ8q~4H&GIT&l5B-P#=>^5e=d9TI}tEo*_42v`k^z_ z=V_pg?e2o?IUHOrEWW>~aBYZyk*s`%kO8I1{bkM*)x5eQ%ehJa{yuHItO*=CSeBc+ z`BK6Y@VGoD$X}R_Jcz%Fi!LWp@E+bmo^02j*yqqq?WStA2yrp z^(mbxF5ws7@5bwh5X-qYJ8*M49RbdEYv3ywc=5JLSp3Lq`X8QH3f0|M`n)ZQ=*rT+lo z+gd!(6OM$@H?uBF$nfevj^ymkPjSd_ZGzw@okOAKTWq*H9m-4qhf}N+3(ZDAcuIzL z+aynrC!Sc8PMv%uBAhPo2y|c-=fTy`^57#cf{}Nm!o*eS5NW($M!fz;wQ^9w-&Ad*t2x^y z=9QE=Iot=#9h}7L*)$Rz7Tt?|sBR*hzLT3<1^%`p#}&QGe3gdQAcH#tGUYqCV^emz zA=+%?`}jdT%3_L2YxUzI(?lNX+Qh0$V z62EFp<%iGU;-xn(JV&Jj%TnvV{7oMC{wLnsMfLiW9YU*b=O+g58pPOMkk2T->wqX` z6Vgi=RnmB2leYXWK%$`6qXH2N=m-ol-(h7()=$Q`a*_e^-oWAJu{QZFqtd-&t+X}) z7nqb{afLE@Br(D!))R3x4Yu_rOJ=ectB23k@QeCO-MFP9_!w797x6rIu|VAVR`1 z2NfpEewE|%fHLE<57j|=r@bRXlz2K%WRY4e3b% zdcE@bC$@^Z!x5`6?as$N=OVQaU%aYvzpr*H#FQ*Qql0=fg#7u{0(AJ4H)v@5cw^4e zbsl8z$FIKo?+$%;Ns=c)!15%GF0eB7&zG;^UYO0}A&z{yTsu{yYIW*iL;?`IP!9m(f@I##wFkV{q|cKZV>V;4e_a({{Ux4BE24n z#NhE(!33o$JthwFtytD4+P7BWo#}Mzgr9!>8WXu3{xl}J)Vl3RX_lp>$l`Z1djDBSZIwY(emAB?p?4YaJR!n4J9M0W6pwRJ;V zCOwurMycQJQ(E0~?QX)E=|BF@5)<#b>%ww|CsDu*I9?MCuU&@g!gk(cPp#{%K9I=o zREPT1>UB0q(A|h?xh*P8Pz|&_8WR&^YwH~lJbSjt^sd{(4P4patmEF?>C{cEb@5Mw z3O?kMW>sOq6+wchEjO5b>tp#I(6-4QP&5g5zx$(=F7b~V9f8~$YadiPg?MrEi}G}h zILgn{)4?MA5gd}T=M3dZ=8V}VxT^xG;{_e;DBoD0fl z0uezex8!)!hV}FGmY`(%MsgTSZfDwkna)&s6pHMj-TB9m+309}Qm8h&FuT&^y}ge% z`n~SCdr-rIGJ~jNwk=s(@4B`tcTacOzerkrvj|k2(>zFyS3?;WRn&`@*I1A}h zxr*#71Z3d^-Qjr}?)@9j27G<1(AOp1R?bmE??8&TPjrv0)pgZbek@6P>^NG%lnxEG z@x#0I<1^1=VZL@iO}Xk|;m;MEcbc!>CLg0A5IxT2`+Gp_P09Mw8RMa(>*R#eWEH9V zZKPqVN#16vwJ3Sdmq{tVKW@V%*j&t7I($&2wzzGPwlwngTIt1w4>kwX==m{j=F4Ui z?K9F2iA9!fNhP}F5Hqwi&Q6B1eRT)%#@)08N`a3P~_>>GSY+` zZkLeWEMEW+ICRUh615%;-8^T}cydmq#~hJz7y((QT2JgVZQ>&`yD&JMB8DC(mr2S9 zqiVRY?glZ?-~jktHg_0;iu|wg27l361w0r}cU_e8p?5iZoFE$G^hZRZv^n^Oo_AZH ztWPhaBn66JF08F`aCgM(6{v&htpz#~v(0-3etTgyK}v^5i~bi2=QZ{&;L|qMz!tGQAV$!WWQ05hhuR;44-j3eF0PLQ zbM}5zmyiX(*2_i9U^@itUP@A;_22@25|H<5mRdRO6&5=>^`NlI>6oYbeSwRN(M<&I zqtSc~oO1EHwm*$t;fC)Ec0PWvE5xV<{i1r^HOuSr+P2L{UcKCNBzp||J<)_FJh$Uz zbo%;-!`?D_tuHpr{Jf~DPu4=)UoM`h(dpc28_6hIwWq?=A^f2~gYlf1x6B;w6&)xDU+PSD_wiORNI@M`EL)@e=~U3?H?0(;Ozvay)Q9* z3^MpRfmV6+JReHYok^{PVF)`yR}4+H+84_t-RRH~es;m3=5G(JolffoJmE9DmO#a0 zUfi#nznrzI68S!zyG}SrovN&rR8~2~A|i>K2i5ml=I-5RYru2!2{%rxHEdXU&dXTa zCOhdC)}Y0~@|yR(!IbRW0~kN);ce14?qmZy4)FEq6S7aqzfX`1Q(;%^2daY{})9$ z@Z(!0{d?p`y!hl){t+{F%9pGOiTqhs2feOjD-7am({0HCJTZR3I({qu7cbWxT&pk`9}P*^Yr0m^Ctp-iH;FOlt*uWF)@8W(+C0!`(&_1s5mMv|4Q3k zr$Cf^B`WIJ*(0nq#G>`*s^H*m&WA+H?-68M@_-qvfAxeyXkRAbDC zSYgZ;W#Xagv5`Rm@LA(m$}4dOcUrOiY8ekLZ9D&u+5JxRIIwxiM`NQ40H;_V_$rRs zwa3Z&HssK@$!_NILNI?0LMojvQOKzHD#@gZ?V8p!uK-rwR530z;3!C|zOCf(S7}Z) zoj1PhRw@m?DG7Q%IMzN^B9mzh+a}Gif^8F_K2q1zxdGVJ%(wjE*9YClx;%%+;*sDl zpp-Z#zck1@18(c((X!MLJP^H?4@XCQhSbO9^S zEjhr#ff|ic|7S1SZT!QTD)iSxiDWVpf7<2xVv zI#1bEzTR_x0s&*dlMZj7U7UTlO%8QsC6%Y3dd}7(J7=$#hhj&!O%yE%7sb)4W6lbD zo(&uN&EmgkrFXtv0b(oX65C(b`!VaAnsTUKIBQs*$XY1-Eal)2{7D|=agS=XF@`Kw zx@yA775#0?AL-12U#1=Sn{L5_IIhZq%~YYZ=Gv;gbv|j0^Yh?wU#iR90#B`Uy(z&D z2k1Ln(Dc;3qr9zp%rh9qRi0!0R)fI*i4T`48@8io*Ms7|Rxsa_RGa{f*m>v7EYWb@ z+DHld?7{6uzhN>j z5&R{yJo(Q|rcoU~L4Cty{1x|E5I0LaAZMQI#Ib90tX?CQ&g1FY&`bpaU9iSacT2#1dJ>SG3WRzoad4= z+ogqyGQ$Hp4OVH{?l&b70S+_=%*A$Fe&5JSdDYRBW4pWH3t^5!Y+2HE3KG9UVns97 z=~%H`qkU&hnTh^@JJ#yB2h*}Hc$ws?XCAq?oNYXjmb-1jYh40w1|9ClR-Ra0!``W7 zz%**xm8{)C{yWD{J(W6m3y~1wHQqgMeT?w7!t=AqhOLAwdwdMj)zyVwlvv`Vd!kYN>=-~;8c zVpHuApDJX>)%^6WPv_zhJ$^_=^xXU8XqdregYlRDW%LMqoy%07dp~ar8m+U~8?H`1 zoC$Z4@7*_e@OZa&sNPf&OJ_3-2<4nchHZ;RP@ekS^>J_5SW|oGQ1ZtqUusqh45EO< zuu}@0e-OYXnXXk&Uchgg+*@i)RgXiL*q;_*f`f3)3(|ijA7)iQ%ow7s^cyt6*R^*h zJ&c7IcdjrA(TSEtOnC?2hcBp}5#ehjBy&jBzh2kvbgQLF?H`o|7EL)@u0UZKVtM58FE(PrD^7Uz*pc>(-dJoRQ3mX0_AtHhgs zgFhVDXYIUCB^cu+WY+0nS=@qb`R{~=VCQJT0l0aPcER}f-)en;|HLJf{L#&{Xbx3U zr3f;8;(>-h$!+O_V2CMc1I3R-~CDClX2WEuebM8-Vf?fZh{4# zD~@6TJHWyCE~ng%Vm2%G=I{5AoRQcHoYQR<&IU)`D|PFeumutb!_8s6Vl8Y?xL?jw z9EG8buxZ<=V)92{$>gQZ^Ix($g(v;AVcf!*8(N0XgH5rmcc_j;1OZ-K1A@QOc#@%| zV{^-z)e08ZGH6+m(ht<)sX(Cy+K_m;(lFC_@hpL}MatH>f&AR463*0z=)gp3?AlT?m`S2>x0`S z$RCe-0G0D8m;!#U@^}e&|JnwE!n@pdifF)s6U4}mMa$gH(2v7*)*~Ek@DhRIq&Up1 zX-!`?EVNqf=`nH|^e2Ni`yZX{1J9WKTIAH^ZSZuqntv$q&g|>*kPR0}BqAeOy5;oE zbc_LL2P99e=^oQ-?U9G74bcvVWo5H=yNn;b#@3D7Ul5eQZ;x>3N4&!njVc{d}~9*Ic1$?DW?laO>3!zBR(a0s-VgH7|m z*?=j3@Jk1o6V;v__AF)=OPu!ju+hqgc7$GsUsZ3i^Ht5W(|ThXqdvzcD|m|B6Fj_Y zh72sJ^RoYs2{)GNF0XFWtMG<;%ZPrAU%2*ACLUro)r6XdEx={Y$fWk6$D4qy+x)2x z`fcSGf!KU;w>d~@rUqYX%c%FnmQCt5jtp4zAu8C~6>bEC;|P56Sx9q8aQd22LHc}* z{Pp#YB8TZ@@rq3UbS`!Rv6e;{G8TOHbjCcwZ4y|dv7Cwe`#(wOdpLMb_bs=;t-Wr( zmLo-OBFa5RmCLtGk-`2wKtsf~N%)9FD^#+sQ{zSXO2U*gVzSb=!d<1m7}jljyOUoz zW4Sps&~4ecFqg4yQrNK!A*Gj60LSnDY|#mSY%cKz!H_P_(mLN#7E)T(+a?pl;c?}pp~{*4 z;%0FHh9%D^B#;j{=UDV6m~BctvoUETYiq#~S)Uqo)S)r|!=BN#5=Y+!TrSn(z97dR zKRW5#6IxLE6cP`6SRWr+f@R?nF)*>$|RNHqe73B4-F4gC#tEMm^~ZFxWMWaJX4iCO8$Jb3CGS z1KFM0%WLT#tMIi%0jM*t zq<{I9D&fB&yz}lrlxIg;oN3eZ<+jw3zTrGkA(`*^VY9}Ak(MHzd)9Ot`{a5}yFpfx zKgOQPdUcSzZvew5j}((H=oTiKExsc<@r+|jxAnQ`KKb6g1H-nMv{tXn_L1ItU>ehm z6WQu5b_+m*T#Cm%dNT^;<5}4!ybb9K$2)$`7!~+uQz8gQpxyrIf_%5*wF#c^fEFZJ zQe1!wxj&ixu}nJFRuTt&u(Axe7{3@5)~IybHVK*#AT2C_m%tX;D6_3OzkAeA#TJ<{ zg0Z~84s!hh_k^x6rQl|4GiQFOKUG>h<)fXb1%)`;i*0@GQ!hd+AFZ&Rtgf&fqIGmc zM1JTXiKemMdk*xEFMzU6@r}Xyie!egzlX5uIHzryPO*JnMiFIkT^peC$Bk8vJFFgpu>nA()F>jfPGua>obLI*uWiC#T(SpZ-Z} z36ui9OT~z8GZYeL^37O3N+t~ErL)Tp`!*a!uK zQttu|?b8`L4bGMvo6;2$5=xwjio!#_bD7|Xy!#I#Jl!@>NC4VL8WaQuCCB&Md%Crh z68jq`6R-!#%08xMdO)ujEfD^uTCA}UI1 z<|0dG$#+To%B1#$cFO_5E+6beHd;1TrzBZWb11k;rr%VjBA^yriFvsJ9A;84d=RESaFKLY%lV6^ljic z1JY=fZs290*4J~Z(=W8;7jxvK6=&PzFKIY38)o%|lx9bItY_VI+2@mS z395cr5~FmbGIEZ8RYrkrV3z%stHseFzJGgVSGVEveP+TX94|pToRYLmczM$A*yDJO zR(ydr2o73c{9%bKRk0)xa9wX`TPdX__!KReBQ+B23O3!F)WdB$Gsju zeAGt>DQyUbYi?f26Q1%ULKy)?`DWRaVQtM#<;Pu&uAKhSD;;UL1BBwS^f<>utg&Hf zcLcAMpLp5cbH!b!*3GG}(jPIa*J@OJ$0L)x`0MPu_tS#UEP+_H(Tvw0zS-#N@;a9) zqJsv;z1krbo5kV@=T)kYPvMkLTI>16ZtyAzW<2G^#p6Im_2@B)F?h$a}B!51VQY2HX4@5aON!#eWE0bh>Pdhn{)?Oi8y-L$;f zqWw=pZ5cnledj*_kRgD`O!pPoq#!AS(MtjJHRTQFsb5E?xjt4_LZBOL;&PsiW;qqqGpZO9EUa zARXXqV}uE%6zlQo=h?pyyNC9Y_gNeO&h9(|I$GM&o9>m9!(XM%Cw|ZOrc0kiY>xjl z!f&L(vke**Zj4QzIy(qi2hN85P3H^chkc*4u(H>ohoB>U|%DWKZ?XsB*{>(FN72 z^bM|M9qoCQQyx|D-)DuT6o?WB1@8P3M^<+D_zH!-WK7M7+8P-ai7QXn7_H_KPgd%! z4xEsEwh+^>F0y|%&88e-MQ2fH_@s&MlHX^0Iu%)jKppdHbc8cWl~*Y=&!@4fEULTR zcqZWCPbB31arfgc30a>_=7$ca)o!^olJ9LvPzFAo*wO^0Q;LKuTd>;)I|X@Qi#VgS z;&|#IU_ctz?(xg3uW6q*#;7)mM`t=yJnGbo*^pb-g>ceoUluIqe$`4P=j1>~{3JUL zVrk=$)(HPS55NsS3fDFMyq3S4^KIWV0c^T|NTZ&nAwLc13J7b^j|=nqTvR1{E=rF% zSo6>4uCFKEY;Rp27uK+4o&fh_X-xE)vndj|5`we91UI$kaV9W+w{HmZnF$x@xYB3k z5L>GhKg*|x8~rf)S9eVlPZu=n=iz7kgiT}2Rf?lhJHT-w&WCUODPrHXSPl1eK!NLx3t#emhXPG2LT9>q6vHk#K_GLjj?Tt z$bAC>QM9?awiW!{A-l)RKDb@Isd#_k(-p`U%NWN`<=o2kk@nDu7GZ9_9}elZyE|kr zIwLQJxCIK~FkUpozILZ7MlrK(QeO9I~mAXU4xNgj{+TF_y^=S>)Bks^960Q{C(4K{HE%+S?A^d#ye57 z(IsPE?RmnEW#R+bpg^|%G>qd*amd>?No%cX3SX8E@sPx8Mi|hx)}5#4S`HYd z$?Y4X?z4LaTlegQyQZNsXb5m<342PxKQQQ`J4ZEyHbq8$ExVbZqO~_-b;H7(_?yX* zi8)S>>0L{xQuk)}B=8Oiwbw(C{znMas8NX4sSuuV3 zGJ3T(lb}ep^v0vph0CPVyJNUlwBxm_qK91aOW0hpMY>}5s6)>c5rs*)*LpLKm#G1( z*tUJn8^KGZ#OR}a&hO&^8r{HAc(rQJPj8Pk%nGa`t?kx5@guC^rL3S-6S2%IH``iY8WWfa z@X8KUCx+j-cvC*S)P?o_mdHQO4|JXvLh0#?(ZHr;kH@Z zmz>z~Z#HCh^jOAbm#-sh#>m+VpXOUEX9I!F9tM3ZmXrasECS#^=rN{5)BreJs5yHb zE;t@_&eQmTu+_0(vZa?QZU|*8;q9OtBhqD+x9RRS74SfPipw5%b!i6MZrF6TdgH9n^}=@9$I3&m@G}d#0|XO~r0(W;)!UXd&a!u60V0*-Y`OdGG*xuK>2x z+SV-|SuKFKTOQg8F&%j|;TpJyDkyYvA5Lv>CW7|2bCWWKCshJ8Y zuaP!CJ??d@fCR6Y;heLxKE|8Q)s_b$B5`?Q_9MF;3m*;R}VvI@c9sR}0K_xfZTptw-6`HdZ>t`66F zV?vR~f3hHYw|H6x93e`|V}!w<k%j$KYdPI@GAu3@gU&RZ=|{Ut&TgCB$&TCdK~-k=1Lw}B zXDRNBwr01cZ@tm#K-m{hdiiItIfx*q81chm`cm_z zyDB9<#H`-Me=}osy2}Ul;Xruc(U0aDQ)42;VF|+l< zcs*=vqv&GeA*~^J)$!b2?F(&LyR0m&DQi8<5dv?%KEyBo%R42h%;|+Uf6~9$vMJ|$mO^4)sm)c1Thfq65rXcBYfDhq*`j29>Ik!v)^Uci>n?_RrcD& z`NXGgn|yCZzFpfR113Ej&{|zlwSLl&8HSP=+=MauoMG!BS&M zeSh}#^F-14w75e|HqovN_AI#-crAHl+vL-U+TLc6SbscXX~R~X1e)9PC-#MY<6oZz z#z-dCDWj45V0ZG=%H3*m3CjpcMs{`}=99O82Ntku^u zRlz5E<{|kVb?u&jlUVP9@}%~rdq7u*Y)U|@4+8MTGJe|xS>7LcMshSI@9!V{&z7FF z4n3M#5p_)JVR$rpXh2rRToQ91WbR3XbuORUi0huKMfeBv>Qwlcl|?<3_0??RfdiLT z)?9y_TFgrxiJd9{8K+vF#yvw_70CdYA7U%A>Sf-%ItcfAz6zbrv)e)*$Ot;~Hn}q( zAS0JBxFKRYOf{uc?)otS!K;4(ihT%r&jFCSkKTvQbK zOPCoZ&(-;22d& z$e+wqAWwteh+tR!9$@m_5-=QWSA61u5z5NGBJdA|m6%@?JK9UupZ1qfo_za1vOAAV zqTGqE)ke9-7Qej+A}geA8JN{2ueQg-!^$RNj>R^fEoQ(tx$6JzQJE3KcW5v-%E!0*i!K|YRCwK@b8(F9s>8nM@xn@OFP_&GmEalM|!!VSB&UOIz>+&z_N{OZl`>+5C4{B|O&YpQt- z?~Oc0K@OK8fWX^ASow`>&7yA%I;2*8abR*}P&z6R)-~Z6-OIb5B)Y@nLgH4f?TUxf?eS7o##0PdEaod&AZ4+9BTY+H07b<`Q7syO zMf|3Qdr$p?I5;xmJf+}QwC+0(P#yJEUVme4RmRGVM}$e1;JSVLT#&=yG{bd-i@8xb zZ`jOW$ND&_c}S~2iPO@5SeTtloQpmQSHJ3LqTK^XpOGw+$5|O9dZU7|ZG!H;_tUeN zNh3Lj=vJVSV!Y%w4_CFDb;xzu54X&}_mjx?&&na$>+C)5>5?kH8b<4$dlPjxN-NM7 zI|f%4Ri&gSwx^&$2rx$a5(bE3)s8ibP$*_*Kt`S}&o6g=;9o7AChzSUQ0%q)Jk|Zu z>o4=M?pEKlT6qnr7@#GKD>DLEm%ZO0ctTVk3AiMuC(AX<@Ano>JL{YRZ$@qbtwxv! z$jp1qh89M041srb+az)K_uXG9=R%q@!XpmUL`V9zbw8xJ?CbXprYCyu7p-A-ey&fk z@ClCRXO(rgnm7A>Ept$5qx+D#{R)_=e$=@z2AU7mQGcTqLw^l>98VMaCsS857yQC@ ztm3EauMQ8$_>n^{P$rD1w48G#)i+D9D{MF_osM;`pGkA7W-zcvthP-;Q7QgGfmMHU z@Qym&AC6OL@sXWfy#Ax;n zR3vhpo@ri9w5Y$=IF!Ol zU>x-JY>@lwDO6lhE>EBxJ{rSd!{fzTVhAj^qy4M9_(4IwqLvfcc&FCcSZG{t$$gGg zd!x2Z>ihq}q7_07=1}7VH9L@%%~l6C;5^cu16K7EuB*e!WVPIEy35%Ax5)3K?e7Yj zJX15~A}u)g&m@e~GWm`8IKK5qb(3a{Kwtdm*68Bol2o7zEoSu}DOM#Tx*XUi?owXP zWI_C6Vq!~j@%mGYdT`jtz;GTfIjo!Gy*@=A43g-^^(QdJN91x2N5Z-Aj9qgtCV4hN zV$*Fl1*j-hM-P8CMe8d!t3#!i5ihNchG^)^x1Im=EA;WCRT*h0`g@%;7(6pL>$}H^ zvM$R?Z@5lc0eU){uE_LE=P$cmY4FPrHjFRmw#4O+bRXbi(ja6@sFiC6tv7Zi=nWh2 z)*3I-JY1XNn$KWWe(313`bp&B>%wL8CDJZ)iAx@Kt;VZ*I5EU>o>~0M1c(oF?y1F! zA8uOQKNAu{Z9}8Ut8uI_Yc+OJFWH@-oAFB9 z^8nMjCx0rFT0cOE@m8>6MYmVILFiRpA`qIWKc2Y4WvXy^2_=7~vSNdHF;E^5#FPg; zh<{uj0^hM(OI@I=Y#CD=OA3axRGOlqCWNWC=nmj?qva>x{Xdv%{}1uIT#4mQe%ckf z{zLE)AM22$Mz^tzl6)rp#fX_)J}xINu%cALbUY@^0FohDVcHA;9Vi0Iq?QWast1`tgeTjma=6rmLq0N zL27l~n}UDcmc2ia;c7}ANUJ%qjWutxqzSm;RVC*lY;pRRBf65~SVq-M@-6Gr8lnm^ zbg7}VrYHBxqHAJgqgJ1^v1~kY3tJo{2;QjISGp?eu4gKyO<{(L8$le_DiW){mAjv(6{ zrX5Hp+W*O*xH~LV=UQex1kEyt7cnmq^Gyk8&ro-><9m9}d8g72dpBotBEWGO9ls)xkvvQAL8fQFv>Rkrnabl^I3_t%}G_-qa0y|Ye2G> zDweJdvID};2788CjIZ)tR#|&`SB0&KAv(YB2cOezaVZA;s3YZzySFng>_dfoqMOCf zYtrnzJw3ubx}34oTanA)WW?I~xZtjxgdUwiA%9zytnc%c-vO(KJuF!0KK*GTH?{>S z-&GAT%*Jn5QINx4l`T1;`P|;+iTCX{Ze>9L7iMRvaOhf;<@2?uQ@t)l=*jHBB4)E8 zkr8uuaOQI7ZnNJHnI-DCW7S6v`i|_oAYF4|4ZkM$#;+;UVGoZQMEIQ=6lSAA`o6{d zNww`;MPjHIQF1g-xsVNIyDGhyv`?b~S|n2u|I|(5|K0MnJ~`stevTg#69b{Wt2^|) zihXkkUiPLH{%})`!0>GQBatTdZJcxqestWe1$-_qE@rTf@Q*tQg41rUpDaYY5jQ9XAll)Ib776oA z|C+yy)8D&4R;|+39j2q}mc%~3BX$0R=k2JN_CN^er+(k=dCitzLhRV&_5@8CV(pc4 zW>igKY}<&DGxUmgBLbHJ293))Vq1yLdt_|c7%Q>%0!Ib_5Q;nK8|%QFUb`lAZ%w&! z%TM29bM;Z;XnDeoB0_RhK7DX4+rxh>H`2`5w=$OjsO`@|*DO^%;*-n2f?CB#d2eY$ zrX?LTdv{ngRK!4e+~XIuY16TLdNGT9i|nToF2*9!wRQjbMOLi^$HbSLFB>&B-`pPG z=L80pN6rT;^J=(>oy({?-?mCvgIQMlYR*$}?4&YmPtQ7*j^Fg=~vo}gtLJiba$*enaG{aQS0$ z?2h9eAb^)c+F2hN1t`EV^)cYrzilsg|CGve=kW6lOOW72#iAI`8eGdNX5De~X<}{J zAzeV3@`TqD+vZLFJC3Mwgt)r-Lgy0|>wPd`QUAf~*t@7&j3K2YqRsn(E15SVQTXPs zY?7h#dwQHyT@Dx2)NO;;wscU`E}bvksKlF9v^9?qnEr)W-?IS95TaLwh7_4yaF`yx2y1p?sksY4+nki zf=*As13LHgzE>4h)z-Tpnn#Oj){N#oxV)G7$GeWN376320t`FoE3wdNMG|mH=AclpmKg&?IjjxZYWCYt2XZJy#+Tv<8!&61G0d zs5Q|fMNB985A1?My~xu3O3G02?$x$nEODuzMT9>i(7!a4SI;T4yXB3Cds!z|%A-)~ z2D`kML-EDSvi7VoI=xm<8_GhAb_IREfPm-6HRXQJA+qFe!D(scmJ}az_b~$lP=s)! zB+T;Qi-=P!qv0cPFw7YbgdBSdaxQQ5kQFX}ypobbSyP&S`4DtX+8tI!w0*wxQo#Cj z(2faxeiPhL#G-!R!7Mil2;~HXvM*n*1{wBP&}I^|FVDIJp02g=$YYi-B3vL7iU5dZ9i72H+1aV5*-zTsbZR8EuENYZe&&- zpWEg$yo=aeD`r*XS{{3+ue2jil$(4y>FCKiODN8OKKr{)pyzatJ-t6=SU#>ZfuDf9 zTKfGG*!r&6Zp-FL^5E30fW%r!&vK0IgP+(jdCG}}Te#L`+|2;wy+7`7d+B&Jo)B^~ z)%(bh@Z?D{*}#nTfs00-*wvwYyUgd^q^At<>(eRk^r+0|pxbwD*nIRNo>NbF81?^1 zxyNtU2dA2K21QFt%Wvn0$OG%!aOCQaKT|B6BAHfta$>qtIKBo=F1Vnm)9Mbp(9P9a zclZi_<>=XtkBTQxLqdo-LA4VEe_bz(%LDgQ%7v0YgTJ3uddZj zv>_2W_U?f1KVJ?rToY5&XEt^tJ&@Hza^KsCiaD+S%v7DpkVyDyhCQ<+pbo?*aeB^W z&vKH)#*a3w2H&LWKwfYg0;%_Y7djsp>?}Mjh)6OR~KDAEm zYS+9;6r7V+%;3YV$gQEF5R`;oC7%8;Wi%?PUvcv_hqYEQpKT^+J#0VKQ6-#nu|7rp zXgFrb5f|cO+h86bGHkg)K-+<+vukf}zJ2^(xA}SQpBpB6=!XT)?W1+hV^!(yiDb(l zpZA+$XknjVPxJGhe9Q5uWcdqN(+wURz)@qtJ;pDuxKp^vB!jrj ztayyljRZ$PVl=-5eZ~z$G;F<}w+~aj6YK1sLpn|)!m~&yT4uuaq2nn*7+asKYE2hS zFgeLCOHJ94lX|e$-jO|5H<{2U9{%4gJGj~yj(O$T%j4H;UF$c5JWhi8&K>)jOg6E` zGZZ-*TMf0~C*0_V2J<@u$zpHS;)Php5}Wqvs8)v2#j3yNn$b!}U2inkV~XYdhPayI zeWg6VDc6gQwa`EH1d5*QvcQ#OvM{C6IzFvg@&5`t zx=)=soZOwmv=l4|8fKq%jdQ7*gb7Z>V1H96-c;P7A5 zZlh10%zF{+ScuTlgiq;}%-Pp{WG^j#r zH_5&!mmydU$N>MS>);kO0l!KPJ@0)V`QNF5`@=j$5g z_M-C^^sb|$!Cz;!Lsa3vB2s`aGM-%U6jWh^n|c3S@#Ei%K}C`-v1i)tg^g83%GLy| z5E|xVnVC;1i!0I_7>UlzX!`CpG_|5drZT_2; z7Eyb|)D5|1*JAz897)7%Z3gjS>CDhq1UEIru$K*5u#(IRcWt>EL`!IL32DGM;kPskpRiDB^L&A_CpGqmioF3Q`*4IWPqpOqS`pen^s@7xZF#k~%?i_!- zMx@#?vaT6)tO*De;T;-C!5&UyV1pJYEFuhWl)Efx4IFNmCtik2Sg4GlD5BjtO=@js zgpk_b+q8hOHifVeF{Pakgzsyko4ZXx57r^vF0;y{zx3m{MY2xZ!tOm?bZ>(_$(Sc% zf#iw}Mqr6%ew>}Sr}yJ#Y&_c4PLb-029Ub)%33R_(er`@k2FLlHXrqP1m1bJ zk8=v+jO_2AI@e!w(Otj9^&uAeafZuAEUZODAbGxVIYEde5@R+MJ|Fu% zp7u?`ziGWcmvWwvs&k!^z%Fy13d$w;o^8}z%}zQ+O(9>yL3DG~0CSR2ji~2A_xJQ~ zMst0+%m;#b4JT3L<9L;r6(8RJ9MTfDSS*=lHXJ*bSFugmu|HkN%iBKUEtozCCmb;t z4tty(!66K~fge9w8SJ3Lgt@K0h@RtTK)YeCTx`B)q>X>hBcLpO(78CH1hTp0{QB=Q z*x)6Gfn{*|jOVj?rTm2w*_|z&-cETN+n3GfC}(6JvMBXF)##0)n&}S~3tjW_?|Wor z`Q{H^8zC7#A6=iZa@Rj)rQvjO3|uIwH-?%$EnMVIkz-WhYVR3~TMZMr&?VQ4pbjsS zoWP{^Ia^1^m4plnfJIQJ-BC&82^5~%CW(GPW#|8Xd%D%2k#RDo?M`rF6`#!4?BI2j z*Z*XaB}csk2bn5kadT-%o+$&!=!T=^?Vq^AX9nkK{qQ2(!n`-O7zRc~#F0i-B=gNmY{aml;u00=)mvsXtw_}sAta@HhLJN<3 zL%cIIL_}Pt5Xrd4F0=A|G&ByEnRF6K4_xf(u`O@Ij2h48l`W$Wwj{^y)L~tyRs=Zw z-s`T@A%vGo_hlbfW*4D+`8Kg9)M>W1TTLA?fmp#WUvUp=kmkD1OfKd9$YVd>5KBRc z8LnS0pWAVVZ!Ac=V|u?yhK-W_6P2CIk)Fq!66T08owiL@UC+|7Pdq%lqj{07U;vI4 zj`n=g8NcmoN2sZ2iN-8Yr16@Tt8-8c1TDTzPYDp{M_yIiBPTmVb8i~BJ8`|Z2j?Nc zJ-u4jJ-wH^ac675`~vTXf^DjQ5_Hw)@$$ElwOD$FM%+HqD8ajzWXdm!Db3-pwWh3b ztkFPN5Wf{wB`1<1Lvj&V;xcG-{I6BX;YGw|M*~pkh!ZIE9T*Ome_noUyLNX^ui3z0 z%K+u`>^BMX<9m8xdwQ=GkLe$cQ*>vwy#pIZoXchHyRUHYjcxA0x$L#W=Dz7G5B#!^tRtaB&YZ9XL-k2gmu*;-1i4ZWOt!m(fmah-#UaNc6AN_({}(T^rQ zfz6wjdWzc7w}_3q%`w3XF3S*Lf1syKM=#KpE_IIN$yI z7Bl0kImzIM2;`V*4NnEYc5f}f#U}wMva?8wk{V9O` zE0kh3Z{NBZIoy||o;x>Vr1+qw_6`hfolj%m`Y;!Yx{namYjP-zOC70$v{|@mOAT)m-I5?@^AyJJ&En4HdNoP@``S<{8r2yGjr}46 z5SU^P8h|CEq{Phj%;w#1IHVdf910Hs+#%kAe?Xiux~i~rZCpf!(E;f=8q~5&>1gBD zJ6x`+9pILR;dR)mHw;MF&$`Wo%wOcdwh{Ub+>0uA+OhU9OT!oQ?VRMas*@>_qM>|w z-69CAh2L_Kj+MuV|G|B5+`a#17lPMDp*uEYMt>A@wuT=q9uz0I@|C6?I}ILThE4BtVe=qNN)=ha#O zOif-OD(7p%8XoLgtkC6Wal!Y>35XsZQUtv(Z)nn8uy=PsnEo_L(OTFY$+r_VcAe%k z0xB9&cv|R~7$$M<_w+Q`RtBl!zFL`|U*<<0rQ9l5wof>pX^VY9^ZPm>jMZy8cHA+0 z_|hr~7WHOl_fWmL!h+Apy%bckT<6n_=T{DP|fw;K1u8 zcjq=8he`I#x1l`H>-n<)c-9Ba2=U!AFV&iuS{nW|dxk=;SA`L1S$|G~$g-z7^;Jvq z2sLjh$=WWe`Zf_7l?RMKC8z3Kibt{hDc#PKL9?8cS;}Izh3A-qKOu{vLyqluc{xat zgZfTSR9=L}oXH|(5reap$C_@>?1+MK4>^h_V}zaZTZRjES;seqJ>O6ow`T>m@`~3J z2RJYg-#)w~bi@F3Zh#N{E06kLo$4FEAy3b}T@<`+S!DWQDW$J}-IA*L_?(9I)}nEJ zx|Q)USIT6;k-E*^W!%}#T_eVG4}Kh8w|*Zn+;D+lg|qoG07*c$zl~Z=gldw&YSHYO z>s0tdBdT5TCcAP^@4Q`^?E=uZE;sHY?#t+C?{^Hc?sU~$`)})$EKO_!Di~fB#Kp48 z#>Ja!#Kr6yVMohug0R=9Wk(`eP{04_Mxj-^8#?P@8<@`>F%M)XccNr$D^2aB{CSG0 zlM@tJ0LyKjV;WV{LJs_}8zhI_W#u)f%0|{P{$m!{k}Ua#bVusO?w;eQhEL{hJ~==3f*bYtpDLYssE0s5N6~tD+X>8a5h2YaVRz@#>$p|gP7DeX z_m_Ft7L8mp;;1>K^))E5Y9@gaV_PrcAG8@5KMDwZwhwu}TLRb2c~EZ)Uu!uL@|*Io z?PgrGbBvfT#z&iiJ`^7WF;0`kK5+k04G9r_c9GF2^#D|jzwx09>smZR-fqCdW7qKd z@DJ<_SF;Z^=Tf7$;t-(%2Iw`Xi}G(CSbQg%IOo#olNQ<&;rY#;-e*z) z=PH##ZNd)n`>5aZ6(y&$Fu2hThMgGO9Vm9jOlhjhYoleCbi*-mgLb@J|Ci~}j?J%f zkrdCXnS{wV;-{R205kE&5q6m3h17`HPWP8b-IN3Kz3Sl&A_+z9!=)u$BLAa~$Yf71 ze8WM%kwFCv!mlsxlI9-3`ZFwur^L*4u?|)6MY&h(83qa8}iI_;5=a#-~;MnXIp}+*`u%5267oB#aAMOIwHQQs?ZFCj$TLmik%{rl=P977J-v_E%A93r@I=;ejxeWS}6R2fNq($GTTVm)!31oI)xZl}m!o{ymj=2y=Nj@UIO@GBS$ zfj}PW7~Cx<0x!PM^9{lqa5&OcQAIkuMcsbP*}`Bkx7FYl|Muv zqOtWmO{Q7Y@jf`%6J%{qGKZIT#pr|^ELTAj;(B8$gaSjW_7Qx9z5nQlxP$m`u}0Wt zL~M34FxX}+7Uu=!=Z{)5$aiMG{f{h>E#v3(c~!LE`jmrP!(iMfBk7E)il|Jj32l{` zBCc=EwXa<3_rKoQoXtcI0ADh629KM^>ptmAo0f^EU$IQv<%YGW%63sm8PoYT2~)6g zNC{REMrQLr-h4}as$aOL*TX{A|mcb(dECxDQXf)bOJH?y({u zc!!N0)vm49_@h#y^sb}i9owv(t8bpEWc+F7MgH`nX3r1~RHfmgUbf(0fgeC~B_doA;#v6as z`^)~YkTn#XN_nOyr+k%PJzx&w6pRRj2Nuqa^$H?^_$rZjgDeFzO99A z|Al|1#Mpc9jYT>Cnh|D-Es}L^dlgiI*RQh8pDr)Rg*_*5$K<%M*g9Fi&p{pl{#hU% zOMzA8*|pH^by<6QmV&7FO4ioC#tdY@1EH)Lb-{5Z8jkKeD$XPaW+q?T1XOk^zwIw{ zm^vK@C>{hqy;PdQ6{l=mIr{5*t>2XtjXU_rPyBh!&g~uka4XP5d+t1`#NMVOz(lD% zccYJtF&eZ3q9cNNlMX{&y+P{E-LG7Ob!pFI7VD8V3fIos3Q9NVvE0%z2#8^BEG2Ts zCC}p_tr3AwLBBfPU~sN`K*qe2fO#J9rn9LV4dIYSNE+Z1#FiPRloJ>C-Mr^;uWeH~ z1y5n-4}^7GEzPkl*1p9%CRGjUpqT>0VXgtS^|R40&g=c|K=6j(=s4|y;J|Q#0P2^} zyAUbVHXErsRA)58376G~Y2^*Ha($mxFp;BLYG8)3(+H}A`X|*2Q%z9=PVAWTtDyANF%q^N7A7k>fkB1wf`)qtNoLl-S>-^^6cP0N-4Hotd-#Sa&ra% zt@KtVLKkl1UQhPr3HoZvK@vLZp@bGVnxt&WlMM{i&h6=W0QqSKXB}IQJnr%-Sa3!F zTB(4x`;>ghBM(6=$}zQSF2-?{wi2&%?&2V_1^R>jA;wnd`n3E3^`<&FrlGuHW}}Go z7GjzI>>tdD{I&W|1u$vrU$1e?(f3VaxF<_nfOj7D79@tXgle4T+O@B_#pCSaJ-u&W z;hF%w{$EnJHycfqDfBC3Dp!|ZZod!L!x11~8(zjx0`GwN7=;OnhFq?sq(D>KiHf7n zjf)W?qmI_`Taakzhvs#W6CD|9M+t{SzGZc0S=L{6k8!#)b(GJ-8Y+cnLaaR_u%z)z zgx{(?bxA;kPa*XN1X)`}PUYA9?V<}-Db;%sQlFi%xZ zT(HwRs-`Q%Wy`Jax1`)ad%8p=0fS;|3GWX<>U^NZoNy(>n{&Eyy*P9xAdcxyk;kvL zULEq6G!C6xngMFSO>ELopt>{Y(JNi27(csqfn?X5z)FCy%gBae-VUI-&4@&ChZgA6 zY$OMGAX0VYTx|a!qM6S?!@_9g33a_?EZqB-IaxZHpPJkwK#Ri~VT4M4Z<`_W zmIG&uI0fPP`UJQ4)_N>Rpg6Zx!9*Xm&}g_d(bHpcF|sPtc`d}{(1hIL>!A_{Pmo1G zCYlEtpeZY5ypLpA^>#&05*LLFsvqRKp#tMKqhKyveQio z6-I1`wuDW5#A@Vt&ZX58PPJcw_8F+Z}*ur62A zb0T&R)D2lCFrhD&A;p@VEwR0-AAH?A!>LczOYn{Yj|tdAuzi%7O)Uk5Jx=CyHgV!H zgbztJw`M5BqnBr_?BWTv;M1V1!?vb;8~Pv1Z`jzPt%o*8NdHuvLGNGM#?7sssS18b z*;W^LKY>uYn%gebdJ6YJaADk6X=a1Dk>eC-(gyX%?U=46tnodgZ;zLzPRA`)4Ej9W zj*Cpc;C`DBk}$W4zyHtL6Wxi}2LKj_1@|*P$K%#a6Wi zPTB?%&%1ez(YwPQ!@%lQu|%oaJ&>SuA!fBh11i>sjz&Z~1T0@)FsL_&9G>Gi`a`ZN zcs?D=uFfO4^qI%PTI?t0u46Us-Tp1MM?tH#b!i6p^Av;=QT;S&6&K#zG%^h(`(EJ0ZJ`g=52*$7%3vFdR(`Y@sGR`! zQ7KGgY-(n+84u<*-SXmqMw{mJ;*_|)N*kH%MVF(H;mT|cxzD!Oaf4bD7L%8P+%D zXk4~(AS~?e&}?9_fNe#v?9rIhs_2Sr>bfexsO9e8w zx|enC{K&*}$|%2wm$%x4K4-fE%xUfpPN(w}E(|720(2vxT-b%qPvMKc<%Deh{3GTx zgdZYIr{DK-T7E6;$AaGZI@AW^w8rV(m~8TO(j8?i6CuPl&Y|{kKLrNlOykm7;Kb;1 z(#4FydWZVu69Ps{sCuVlY~mChf+TdT>YOg;I|DAyhU@9EaGDW1LM2SI=NNp z+jQ4Irw1iYHQ+t()g2UT_dOAoTQ=n|t$?5IatnNkt*v#C2JxI5iLii4`{>LGatz*z z(CGc;YnwVcW1ee`WK9IDo?8z^HR1g7&5%`iY;`ZC?98%I37Rn^MFiM^ zw5%;zybey!mevr}kdw7&ms@%a2%muBOBN>gPu8EowX6}QFXBXXb44H>cv zW-deot0p(f0k%}eb?t>qOndwR|#fB53xd6VPLAJG*mX#St<Qa`(ug^qSl=g3y@1PHM9zn{TrIUJ3I5@9SSEV>>p_ zRE3saS>7y(hy{w!bv=kPl39`+k46y>cW2ASxfae1r$cMAR#!OzowTMziE0j=JFC}`=i(oQF&2MUvmR;Qb3Cx9$fLY zdujExAmdZmCd7d<^xY-s4#-U@DM?p&3Xxl00)xxLwjDw1mgsR-RBhN0>^2_OaOj@y zHQldx%?$x>)l9xwc|0WS9wC#6Sio)*uvU zxqf2iyZXd{PEtTcV*D7U(wfj>&cBDdZtt78Pei0%rJdcBbpA zhssdS8lSv9J)?S`ljIWratg%Aayn)xA*OwHbjtQ0h`&IO0|i0J=LDBZB!FMA6aQ${ z`o}Y0r#E~wzMauIoEGfjc%D8TRhn7r*=>4d9RvR=scvoQ?OY9i1hHc*Kem69qVf-}usO?L`H~_eVHxYACm~ zdkcz#hD9Tzeemy^;sR^K`pC^~B^J3TP3k#;_34S!^W+5<;w68B4)YJ&(}NW)TSisv zIA1D_8CqxLS9v?$V7;3poeJR;x_I1RVhxwejUvPCj9FNt%Yn@Za0jsoAsST46S(l+ z=6_}Xs!v+9v*)5CVU7bnl^PmlbAa70UR0a!u7u~SAUue%2d*=H46Vp zN3_Y-i@f5y-Zsl^7<|#Msr5K{isz*67B9%((tq8A1=DnyM<&iNi5LIt+>OoQLnG zVmKqyAn#_(o%z(zseAw&kmR&#_9%OK&Fv}pr0w_ikt&+V@Kj6+$S&v$)q%j|sBc&^ zr83QQl0VR9JYu0`Fw(?lq#-QMocuN+?zW~>IGJ*zMjP@X9vYhF)+flrp_YR7^d9FL z7E*J)Dv3JYU-+b(%CRAF`;vX+)j8`b`{PufCz40s3i?r%;jZECaqYXnOJ!}wOo&@= z3u2b?u^>PNe{Wpp+wP|Sm66orWk}qiO=izSoQxff1lphnTN8x#;K}%i=wIOllPTF? z{?~uy{U~t7kUwN7LS(+20LHdNU>hG&niIG@XG-k5aGJG^Hg^r^ugE(9Y1(n0q|bFjG$&G5}dMSl0%R4s(Rhy5UyzR%mPc2z_^8EF) z7cHK&2aJ;Y*4+uKrZ}V9nm*s-auncKa8dt9fSyEalOqSm=;tCfE;_ok=!dvF#( zlhi0#Q${Mxi9>H5@$I*a)15TJph_F4H?XJoo&b!? zq#lNed*8Hpy`Fd5p7}b6p{@j)>9o)Uac@*^4+oIw%8qV|i;Ds-a!rSm1od++ zYLAfSUs&qAhqDhl*Kf!joeC>?B@q6CDmAlsfkm;9D?>Z!y4f`*^7>3(-VU>C+}591 zicb=aO}3o9f{xeSdbxog*0&sY@HI9ufk&P&hYp5WgDdCd-pgoLqT!~SJzK3K!$La& z3G-|NV$0ed*VnTMk|tr{L<8eO5Ei#9CZj!v|zF;;F2gRTMZV&^}zF(OTPT z-FNo%F4pJGX^C?F7EM0`lq-u23zS$+}# zLFcVw9$;whDTy)6h7Tj+`s*w9jkl@5+HBw2!!ZtC6%_J3>)qH@a7T@}O%|jCgc^&= zHjt@&94r-FA&lOIwl&Q85c~C zPV9qiN&)VK$PEzLnKsM5%JAxZ8XQaA_bCAZKrU;@ku|;B{R7Z9Q>W|xhsR-Jr+Y@kj9qUhRTYh-$!Awp9-*Z@DNOp{jB$$`kxjVjvaufmi z;LBl#WGVZ;?R3#uqoE#dGc}E_-?fQnx!#xOGkmun@{lCpDf;EQ6Jt z=GKN*Lrd&!5$4e0bnpuGy`}V+Z3k3u!K`jiFU%}vHpea?Pjh2nEwd#6WPK4| z8GVRKY%VlZCp9MZ0>ZU-;CB8izveE`MJ`vAf16M#erJbU2KeJuMa1Tt)x_p^dY>)o zs@w-{d5s$q^ung>akf3DzHI4jzMFQ}fo#@Fk3FJ^1}kn;kf)N$=Zo0j}`NjQ>tC9*5N0C2h7BoNYj zb*Cq|Gq7A1zukLY^G*k`&aZDN1MmSm*>hwj?B1&h9{s^dSn*`MV`0o)Ct>PxtXl0D zupQ>`S-6Ywp_$PYIJ|NZh03?TiN3!Gqob>2%9lH7Jp-Z%CdDV3M$bx@M8`U5Myu06 zu9S@{j~s{n_VnJ*{j;R&s-on3m8Frx!MmEOe$setu6>?yjM!0P;vNXh`pWEFprXON zEn@emlH4NuL8K@GZcqQ$*){qWz^|e!B{}+l1V#j{5-l#^AhU4Lm2ZbgHFSbjGIaCy zo?e>w#;uUMDoPMHWZAN=&n2T#yW_k-)ACO^*XB&D&e@d50lRwWG*ru!H|uA~cS9Q}?d@u>*fu=%b>; zqA{}7=Vvy2gExE&X#Oe4RG3`g`WWhX<-Xw zWDGOl@XuFkG8j%<-EzeG%pUi?lKI8mI8n zh-$~{EQH7+AjeTSMz;?qF8dfO{xIN@-W7c@b1l`(=P){iXI_fsvR5ahTb?_n<@U?& zT8ESN(74H27!>3py@QfBiyRQyVN=ifoeuYBJ#ZM-i)61#s!bzy*E4iC1ijPjR0uKb ziRE)6IH=V`2(z+oOL$N5QAsGZg+F3Md=Rs54O`xIzQ;hMZM(bs4*0Htza+b%r7qdp zE?w@ZBI6w#T+3c9Y-Hs40N@|)=~?y^cd0T}3KPdz7QCH5Vm>!cy_X81{-^|3vJjyg zbO`-+s+p_ZV$v?_N;l7PXS@r4(anTc?+NfoVV+T(gJ4Pb{8!RDN?B!@c)|v2RMw z6G_~g5aI(hokma>Fnk9gL(m&lY^;dkd41-(tbSM08lM=IR1I5t+l0nDfh$!9kJ$Dm zRWBv^0xqlS>DH5OxuP6sYQ`gB$MkF0-Otw$IbJqaDRb>ImZXv#IVNBXES?)+E=Lq& zzDf53W}pvcYwO&%L)-a6GsZm`uu7837k|yZ|2#&4J902}tN}j{3S~ILI$_S8f;Cr6xk7jZDU} zgYpZOf_#l_`%*oo>I>lbo)cYOb6B~7TN|XoOsHL4i1sp3&T&e51(#7-)i-Kq@KwGy zZ!G!To=@F~3z=EsVExQMKS*QkjZ3{`NA~m%Otku+(#oJ3O*m(^q zv(!`F=<1fs*mdPe&%&eXJ!7k(&I}9DvC^C~!6P^Ou+DiXeB1gf?UN_H5K3F5&*okt%wU9{4KM3P7hH0 zx<-FrV2C-f>g@+Ub*~r010Q*klJ`=?t%(_NZNOn@qN%>+^M(ESkIaNMQ3BWl>w9L7vtw+JmYlO2JZd((34#R5)b1{WmG1ZYb5 zl$1rp-JWMF-_GU+NgUJpE6~Bi4v)qdQD}@5epDQ1q`tgW8wAb51(B?rSBa>#IF?c4 ziFFLp&#!!p`*0`$3SUeN>4${DKlH9cjWy6yXW5`prEXiG4alwR5}8ZjA)`f?qvFus zS4J>aXGW`2z}5R`Gc{NvH*Q?aUfT!AoBs}pck;6}5R@P=&HJOFq>REZ5@wKhM6|aV zeqYYwAbq_~1}56PhDN)xZW_}r0_4zY=HofmxO^FOR??p@+VJ~2-3PRyi+dgdEn4r0 zLjOgkPQ5Nk&052;-g_aXsNG7}#i-9?hhUxy)E;tK%4k(67^^b=amk#$+EbO;4S$jx z)*%R3uiDc)*lQr7&5zJ&$*BkdTKjn{A9tN`WCrx%XW>ai`_gotmMGdZw1vNJVzi)Zc5I9>Hr{OmcR z{80}2K;^_T254Jci_aHlxLy|KGF+RJA(W>ehd;^_Zmw&jf)0k*gQqkBz!9jY@{m;7 zsQ0yj46Lyk#u!!gbau#N3S&aO+CP+HI))2#z<$!~v~rE(AG+)0+rz%hQAUg_gdxZO zDj1G&H0li8%~YXa3I7}Okv`iA88tg{^^M>w+*mDRoZwKoa&TDR@6IHe7uD*Sde=Q8 zEqIKTBcCw}C)za_MGSmXCs_(=+7MZt?UqjJFppwYOo9NB4anU+Q|{xostPTz%(8mW zd*1HF5_1{5*pVQe;3BSxEW#am&SzrS=zU=FXrBas8md`?&{2SWDlG13Tz1*N9vpbM z+eQ`d->;yg?yr8_cgM>u7fIY8j%dXSGPg69*Swi>Q*GPC^Tru-k$fA5mbKw>Z!5PVl;{*O|(my{~v4hJ~^@}brW`k}uAnKxsN zyN;)dKOc9j;CretBFf2RoK3rYNj3Gmume_uDO1Dsd7k%1`SWKpZQa(FV6*Q8LVV+E zu9uvP=tW#7K}YxWzOnZg(5~|r9Y}9Js>1*?Wp#^70W+>&u8XKRXbk2_$_Cf9VTw(F zSF1NR2@X`|Q?PbTNV)TK1TPVgITD&F+rb5tSTy#O}e-y7An@Jo>c~V>!$dA|96~`BuLg zf;m9%427?;%Kd-p7ukCOR7m5^40$$DUMwKS{&A+GTfyt9%>|MgS`q$-fQ2C`9wX+L zn6t#ZYMEP&uzjY#n7p;(7tAXk1du7v1$uHtQ8&kCEoC{Vk(}=%Ibt$Gv5m^*87~c2 zO-m@LLHeL*YYWhKQ$?#ojl)Xnwx4-Dw)%Fz%Mb{9eaQE0AGs2lvrTaG`FR$B{mRnz z*}K72Xt3B_1z(uW8;NH&7(VEtwDGMO*)Az_T+F@;-_%q))Dilw52k#U^{0$;8Ciih z*CrkFOz%EgkZ6e(JkZUw2-j`jPnr`zON7MnO>*dt{DhVqNLaeZELq9i*c^*QVK=?) zmM)+oB1_d(eS;bGCq%2BS?yf(=}0MUUN9t4=1yf!a1$h~3$FqoKTIz-PCu_zl~Fd;;>h;qRSez#5hlD ztqdj+WmOxEpwfsD6%pqF5!$BJI6)(c6N;;eVvQmp3OIo)RU}4`?+tX(E56@f9gc9xjY;rA_zZOOcC>8 z_eDeUYs>vzfiR~}^USAs!9P!cP@W53pj&LSvm+6pbAxWR_83L1H^!Z|y-yd9UVAw@ zu+f_g?oa1<_s!Va^H5=qietRQ@##%%(1T2NGXWUaxC3TZbbU7ddjE^nL;29Zs#Z7h z0}Fc5{=Dr487E9x=hI^qyw(cBKg6tl)gPFIjDMZIKHPpAhB$Ia#5Ino9*)z$@L ze@%1mz^RY96nChfrn%D-*mdv#fZSIzW5N1Rkbm1EGFKxP6rMS^@K%wMWW7qV0fo21 z4%%G@m&ht@Sj+?`4w*Ot0;Br~YZdjUTj~Sx;jnBl!b&zZDdB;P2F<9nIyJT=M5ngi zfwW8Dy;&8$m5tp^!q!UZrV;%jV`Pz=zxK@{3$?Z~E~>3g+oYea9JRBmzuu(JntUQ3 z_KTiPLa;s!nf3xF%s8Lm4J9FfQeS@lx`gN7V3dEgYK>*d+86tuB|=iQSm)D(3zO@yMX2V^OM~D=pSCaxZr$AcZr&IYet?L zHX9B=7wL1`PRvi~Qx`k3x!4>fd5)t$7mffR!!0VCPtLwCJz_So=4czV7B?JuA}X*E z+hhIP;d#|^(5iS=b`C1%zAfzN>h##Bfgxr2L!5_=Lo0}}#Y|Ur2P?rt@0$G?d`c_` z#2<N?tMS0r0fZWYfPqo9m1}| z&RcGJT1Vbzm(gi8z$6(HwNT->fIb@mfQILLtVFHBOJ^254SHiw1Iw{L)52!Mg|bQO zduIgBe83>VswVj-Z)kZjY=Py{y*3BF^j-T4na&p#Ts0MYKTSg_PkWtl)R#eWHp6>E zrV+OnwU8aF%LDs~Uk)YJWDg@@F&o7lKmD)~mHM#o$Bu3>I3Ta7oByqNuU<4~IvnEa zZlF|<1?|bHT>#a}MnorBG$ZlU(LK|Z3uFbq1p1z1-ZkDSWJRhQtYPkcLelR90J5D@ z~m<74MJ z$egO|b3gwFuXxu(2QL(iWH`Hf<*yE$|$%p+L7@-XxFsRfXm$fSn{$l=3HLX~<@8iaNyx6K|ItPaBwN@~Z7y-&O zQDO&(xKkr|D<@{>hxAvg=MCpzR{=QZfM(2TS5*?ne4=L;*NC=$0)B5uI?Mi$^2UU> z^V-|97uyF&Z~eEk4|qzb=q)#AbUSo>%nTY9 z6En$-v-_Jut>osnI@k}j!Am-?k{`BEV^KjZl^Td4Bf(Yn5L6*- zU7azfN7mv-q9<9}vmo9$$<&<@eQYvbmU}45ekF_J1#eD(gxWd){m0tUNN6i)x3^}8 z15wb++QmqT=xK#>u^~lKl6Z5P@qaH-{ZGl+O&-aO<6NREe-(YRCYB!<*H3hcv|0XE zGIb78QJY1E^N|;`so;+;Cq~y_Fc&F<+g@2eU(GnQs)im++H|Ap?;&_%&@w=SDE0Wexs)gkP)=c*1}kgo&X2>SU##*t-7?nAo!*l zZP6C5+j1Sx^T`3*7Of-ftW9nd+I0f9LDe+VJZ}cN*yf+Y%&g&zCwFMNV93 z2!GU#I07{+4Yhm&h)RZEwnNp!k9@SUxb@_gq|G`Kc842vyU9rUcBRexnB!ly$33mj zlH_hYm&nd@1KF&@9PHglW6vi=MXbZ6Iapgf5z)VI36uh`` z`*TY)*jRRKk+InaO?_iB=G5AkxO!7ij{a$bAz_^K`M@E0yFL8OPQc6d*xg`9NsY$a zvZcbI+3XjAdv|HQK!9FE1ce_%OjT4VN*q=Uz1UZv(+Q}&N*(z>TV8_ZEf>Uqc!2;16U zy!QbRN1A6tGerJJ_5c%5AhA}iQ<|Cun^D+hF5?}d|DhW#kvCc@0ra~J1+T=< zaX~(?;P{w4o{7_S)v|<&N6gnLLQZfX}WEBFMNmGj* z%S+qs@o5;LC1WR>-4mILtr7Q?Jy{sG1&zm08Z(aK6Q}b*$|P6H)Dx&pUu5bO(s#d< z;woA>-e`xbZu8wMB|$=fA@w15-BbP6mg>UVkIl5=_>WYFt3r*iHY1`%Gp~2sLu7xD zGqhW9ipwW&mAJ*p5e`^-_Wz2T>aI^8F&7XDl z(VjMDFREO9|FFPBdkNjyiQ&y2y{1XM(YZx;SR$5pVzdwvat<~(BJSAAFjz;P>^=$E z>CW?zJ8?yA5QKP?fD`j7tt6H79F>$s5n4BOaGuBx!ZpZ~Av_4zT%Rg!$S>hqa1K61 z(EJjvkr;>_t91mFwX+E2)~D?OndIutKKxPhq)Jx)TG=9vyDQFQX|Tj9!>up zKT$Esbfv}fiYLY5#$Fof9ymcKPrAiuy+z!jbr0XPR3#Q3G9{Y2~{D+f~S<#LZ`FfgH zg#B~J3cIe9TX$5EM)L8cE?t&`88Fgl04j)&Na&9x?Uk3hN5|JRWPM@uriJrx4d;mt z4_Xan6FD$y@0Rs9^)?xLR!Rr}Z*{`BNsa3K8$R`4X=9IlvvTBE^Y*L{``u?qEyi-0 z>GHB;t8vww`FNR!5j(L2rzUG_c04o)z6H@Myw|Q8?5!LGMG}&mULE-p$9}?Khh~=8 zc(Q{x_Nby-pXFm$^m`*DcOrikURD}Dl(cW@=93oM)Wo^OZyyS!di4?euIe)QNsyD( zr)CkZkb~X+YZ`twSvDN6j>?1d+)ybB9Ba0pNIn_#XQ*>l|I{^I5xSb746FIK+sY$R zbH2C>VDyFLyKm(${U|Ryf04gT@??zi`4n$SAAN4(-A^}fXUAYd?Ss|xqvZ$fQ@Ik* zRZVn+%QoJaJk;{M4dLe7ue&GubI2k4JXIhz$l=iwYyVv<-EGojRdGD#JK?rxP=cmr zJa?^1-O^KN8^2z1OO^#(ON!l{cK&2z|KxmhL|;yk3gtC<591McU!Y3&WDBUa9L|tC;98=Q|gD0cInj zCN4j%@FR}4wqCyKu+?g(Oc zRx>jVclgm`YYDg7CU?_bCqYhcWln5M!B7$}?`COL`^yfvL^ujVqQTC|`_e(n-M&`& zPz3kvgc=*pi3>qS+D(bI=n~e?ji?fPkG-ETn_*svR^z<8(P)w?j6Tq;lb7cHgXXBuqT#0_y{k0Tk zam7$1s62GZoiV~EfS~t=T#5mp@P3zN^G6$$2b-?>+-5mSjD6qv&PsHRsLci+emEu% zR-v5k2t^Ds6qWF@;lvoeO$3Sz=mDHcrjT&Qf`pO`M<5=U9od^WeJQ=ktG%h49jf8@ z53gu%ASEuL=2S9-#m;H-75FfS2g?>FPfYa_#H!`s%^TCdnrJkvo7~WO=zBEDxxqwX%>MZ{&=wyuX4*bHtD-x^*qB%c3Auu&Pc_QzNs?lZ!j4+)NO-eL`+EW}M?8jdXJVelZoz>BovyB@+ z00##Bz~-m@!!x8zyEyyu{u^}F3;*~1N4p5f_Tqa(m4K85e#v{ff6aX8M;QQpuQR4H{P6xF)3kbocjaN{HvVsJd^!mW>1ryR*wOpC} z!!R)ah2NA4SGn?G>kQW~yp+HB}yXv6JU@NAgh8s47z#qTt@wkafaD|da+fh?ejBZ3U`TveP`(9lUk}(_U@%T z$=yilq;~Kg=@ZDr-;SB3eM=RcpIUniiWK3^f1bO**G^OKx>P!U+*47DaBmJCb1@&K zF+kPc*?UqB_l*hQ?F}D8K3uFDDgii>Y_357peofbD!~Jyu|x>~Mr0?XY*>GM1BK742&Fr@$+BwIro^c;$ zT%I6n+ltXr@?0npy33aX0krrH=98fP&U)`zH;T|;7Tx{`-W%Q;;w|!+r2c(zhW?-I zyT#6G$xxK)?EKe?$D#ZqbMRpsYWUkoh_w~nT#sxrAW^*n@nt6wNa(~&?A#pGL_tL08iI! zSG5YIT&hy7eJOy|>|zf*g=;lwJU6cM+fh%z=TN}zAzlm-l`!bi|bn;TMazN81vdpTdJ@3XfkeExC;Yi0i33POP)|5IL_XQ1 zhss$YKg~wLjmugsCpG3Z9G5; z9Ev#XvbxNRS0&{>R?swx#ui^%ph(AFJ@VCY5gKe*BMw*I-R!?dr82d_sJ6l-?eerz zFhtIcrMSe1SmFJ>I({*%8hV+B4;XL9~;K8aU%8xG155mD5Nsg9q$wWxHMd!{UeS7t~^SHPehmV zX7-LgTW<5C%N~c>E9G4$FWy{AS!l$SMHPz^-pUUf4Xh0 zRnl8{xQ`%-6rU_-X}G>pZ}+5$^`V`XTl}@v8Rz>B6fv!+lvcW@5dUEI?X)L&anA9p ze|j_@n$h&0$SOnAt1s~Fz0Q1sj4P^z)||BN2}fQ?CRsAG93<__#nNM{PliELaT6@0 z6*0mH_nY@ct#!TvrOSi=^0Z`rg;L+YRkWl_-PKBtJDOSMTA8ZH?+;a;4>^6LQNIv_ z;frti2Zg}v>7y&39~;>4f%*PGf1Wa9oF&>aVLnhu*QxDgIj1?E*kTcxt|7mlD0Fko z4FxzRN*KR?X21utJ=!k7n|)muKiiyltr;WVU2qB8Qbs@M0N)emU9jE#AnuJx6tb@o zve-nqS}f;Al1&|jHb1OrciM%V3lA$Bz4(XW(wALU_w`#b-h5e(?<*C3IB`+KY&nkd zY%w1)BW$nFxZWEC2#?PPB}-(TK_p35{qR=&-vm#dc@*uJ8JQDUpAq=jD#bSRk;k_2 z!Tlu442D z8Q<*94clbqi6)tG0B8VHK&-zQuCEvC`*%jZ`k(EcVRjRZLnlGehh1I{Thj>|jc*eN z6;Y%H-De|1&j2Ftv5_H@9slgu-X+|K^dSVUrOd4oVfWdS?LV0LHW%K%v%djT5p7Rj z+iKVjPv(Y~4hJsjXsfQwn8}VH6!hZT-vI9c&aT}yXAjIBau}UYzvl1oFG8OolO=E2 zGttlhjD$tdBuea`v*-i-5gdm*iA+?jThz|Roh8qLBiOuuXU%v*_E~=Yr4zYEq48w_dox8 z-nfg6@PhY7`FvXED&hbqw^5|86->QWPS3CVSim#@9K*2aAg;G>0=r;J?Lt6fLkq<8 zwI|VjjkHTE;9w){k&F2I>4{-}dJYvpn~1c_(_oia5PssVHhu5KWu~LVA?SG$yfF^z zXqy>6rwe#+>a^e4=%$q8%gcUDU}_Y+sn}0L3Pa`FAS4aEgx3=CPPmpE!M{OxesRv% zes1>XR^BeZWt)EanL`wC<%4TF)Dxtpwy=HZWp&&92Sc(UembPu(QGZ$*|vS5VqY9z zTAkShkFGEx&cYTl|72(P@_(Rm`k(Fd?iQhxveH|{)&t|@o+{YM_)Po5HM4m4Mv@h{ zJyErwVex4c3H4$f7~dv{VYmr6{6!`ZPJ6Pvb#DG?V~X$9r zphA_jP}PnYpJvR-J>r}fes_E{ zdYjeJE}wc@?tecmhS_34$B7z74z?U+8vhy;s_rCTsjAbG?F%uCN$b;p)fE)J-p>y1 zS`FOk&a0w%cpmYNvjYURd8gHLCPxqIr=D@_xow_{Y`ElkMf;uBYrUg4jJJR#j}YkA zZab2^ip;R95|b}NeuV|vSaLQo*%s@Dp3@}SwU4>X)+PA7U4L!0r8rxG~>{p z#iK%;ZzDqiE;ol@9pdNh(k=&oOQ6(|e0VkS7R?zt_S?7gkfuPOBnBUL>A5lQ*?QiN zb%3%$Z}UO~Ezmeq`GHvL)3*syd33h=kkv8_SKo<`LhlLF*7=az@_{+)p18Yn91 zRw;_Q`%+wxIZpXOnch?Fg|8l;QYJGd>G|B+MfDYK@|cUakKba>f}(>45hyER%-vI4 zEQfw`LB6@&@0oAKP0E%$ILYYZ#m=&4+DXOvtnIx!cZ#a|+23qCyQ+6H+X5jK`zN#N z$A9w&7w4l33=Ct>fsEkRDCr~*RjQP+qUZajwcoRs*-B)FSQcAdKp{UA$?;) zF(Q9E_QvEXG2Aoi!|EpM75l>_RpSKV@zv2y#c3$1znJUix5PhLX`#>Cs%9!p(e*Y) ztzc(7mrD-1`M<&)(}Dd1hs{GgWsvSIpop-%-|<+RT97#4-W?;=&GE+mXxAH)(>>P= zTk4=11@&spjXzw{%(mGC%<@0svX(k{+2>vKZ7-P1GM|Uq#eTe?5PoR>NFoTrR!f^N z2Amm?&2s^@x#-4ctJ%BGzonacGH~rBfHle8MFvl$TfF_>H*SRsfiPOTk0 zi@}yXz#lCqC5$buMoYuThtb0|eVXnFgy#5zn9Z%!?9Ljn=Nl93Lg~frfB5Pjewf(% zaC{DS4eZIgDPR|NtY~XC^8KK}o7J`1qQ%T6i%B16IY!3OA|<-k`NOhL`lh)}8R2;; zy9EEwJFU{)D9#i?(2+-z{Sh782^*QjpVG2422PjNbwS>?@Nh!J_7tz}*kE4-?e`>8 zw>eMV8xtuL5#_&<4cf>{9Y8J4C@Bw$Xla}3ke6(;A)ZR&cw&Ed-xhOjMDQ4Q(s$z) z&qm#Tg;-_|TQ)+QFijyDn8G_kMdm*CH1ZgB3gxnaLe-`d5n&tp+L~!bG;&kW8+Vg} zztFw}U6?eDmIT^g6|JSL z#x*kXyZNs%ZGzHUKKMtw!GIBLK!j#y?>#|mb(@dRX1M^5Z$qf&BaEz;F%<8WuCjM6B-cpT0%5n`O@| zZvIO6n(eVhG&JPxOuqmfcu-hG6uqq;-V(bCP|$#cg3uu&>~?6jzo+tzi9`JZ&)GRO z+2X!KJ=Ng7J6d?==`9*F<{T)DtFKFWVWS_7^i0o3#X4TBD&i1iy3_ZRC9*Nyh1-4a zDat#6nTVs2yTq%>i`7+p_hHDQbV0jRrJ=I)j)Gov%~pS*sx={bCCzIpJHt)4m7#ZB zL#h&%`0X@G-A=A-v{=k9=U!*#jSH=1aP?8p)Mu!hL-h7Si@`$^ET5@#IW^Lg0h4VG zm7GBZ%9*%>axx)#uLt|2jt&C!zrMA&=f1@9a>+Zh?1nq#=skDlnZlqx8R>=$IX0LQv6|G<6ns@$0A@@cVv zfIGF_9>dfuHjEBHt!c2mfdT$}i?BC_nPbqPt$Wn3J(FX znmTID0ZUgEjStuw93F0Cq6vr8xhG}4}F$Tc%Y@0`6k6eqGnK(DFW0SV6l5=Rb7cNAcF#1p2wa6RmGv;el zAi7F=PBi8C?X+(bI@}Qdhf`m@Yp+WW_v?FaP*+gkF#K%O*0pisi#88-Pkjj=-@k#$ zU!7rD87)zjh+g3qrd=m|Ez}(xHeDv0c~0!sw!}S5OPVmWMdg=X7Zd^zI+{kxqUY=d z34-$XqUx-BuM1kb==I@1qKN;}aY`{SVu^lvND(xN^X zR%Phax$G_m?^2)H(`0=WVJa(Um)ZY~U;W$)f9!u_4>Dv4vJ`PfcSb!B3@jiszxq3G zeN0R~uvsHCou=nUjkpR5gbGt%*_1ZCuOKqQ(RHZA&2LY$$WM&s?31&yOj^Y0*S+ft&O8NweasuLV>9MhH$c zxO?q1>F7BbvW>Ff`>O2!)>YN+(MhxXT-x}P1 zIU3#QGBP4!50j%S=Vb`Me(i~w&h*$Stsqa{6!&m2Z5HO*OvK+=Ja6zl%i(Zn*0sXSiMh2R04nY|sM8dNQ)6mEPFMu@E>D~9s&MZtCQStM>K z33+0^z#R-po*4A>y}A-`1tfmdooySDGPT^HI~EW+qezt*>a)LB){3=5xp%6Eaqg~} zOeI)Qu8-sP7Abpj#CM}^)H=1bOQ1aMaR}OpCPBFnW5-G8!)=AO7x ze?0^7uINPPx>h1?6EQh2yer0sylVT*DRwMsvj6w|omqF9j9r_)OfT2bdx|%1d@iSB z=nXMI3{mLLwk>8TL{Vp=2!RDP{BQGSD=p9OHSsP6?VC_TvT<)j>7f=|#MXmSGN^W7zTc4^ zszWy&qc%l{JBMVnLV&B8^Oh~SGjh$yw!G;JO%?piDr7e#7XZs*tBG^9JD%u;$MI-o z8V0jlXw9Z`8rg&{ChH)fxN)&rJ1`qidg92%J(q)^Hg>-E(u12qOz0T^@eDF4o7Rkp zW+X;e5Ja>Ve~@Uhn${9uRaLLp;v0_KUc!W<4+^N{!NVUf4<+r^UqUakHxZR;9b`At zrza({Y$r!POizMjY50MIT+X@Bb3@PVJB%8ZBm9Q?B*J>Di&6Tow!L?5dQ zxZQ$*7pxpIHKzmw+C-IJSDVr~#VGo-M18fE*uN$lEwB?x$F8tfI!^ss-HZRu_RX9O zfGS$-?4A5s;S+N%I>BvX(Gga&@OG+UmX4;9Z|r7e%5Wvo%+k;;zE(Fgi~_WV$qh-@ zwStE=V}2QgG4B((aHg9s4mS@pd2yBzO z4XZl%klBo3{EbP)CI?5#5P4L$>+8Ihe{-t6gft^dgHJ5Sv7YATVP==SF8d~t=9#H! z9&%2G8^Cx=TL)qo&;?`XBVztt9@261?J_>0G;VG*7~6Eyi`(5X3g8Ir1NXtjzLNsv zVrv!^ge5e{1f-w*fWnyc7&^Z6^R1G{VKK_T@E?}wzz=u8M~9J^l74wrm8`qO&d<47 z6H}613z^k>?SG6vJ0KB_K8N$;w;LT7u6#>8y3!Z4h7uPoBYVbbw+6swlaP(U7lB}Y ze$Xyy`*3eKIehA%RvxZlHwcf4CQPyHj|b8v6=O>|b2g#D8!lcu#wk`RZx?lA=$eAo zWC0P0iWU6x!>|QT7^5^5vBCbLfhUX$MVn!>r|r!w?l9x*-im7a%3^RrGvh$tjZI_1 zaK`Kle2}pn|1~dKPpDa58Zu*?u0!WgYkMi*UA1Eey9Zb{vdJyCbMVPR0m--D~$>HH4CGi z1wZ|EI~o7oiuE;hN+gx&*bFrF>|muXmxfhU7st^6$eY768!-aNExIP$0Q!{(vJnIQ znlT%nHp~Bzl>M;#n>dse9~4LMnx?y$`4h$(;Q@IzSIL(#ihj#?mSlxIa+?iXe8^XhpXG1F3#AD@E`w3=f|1-nX zZgnGu%c6fU{N*USq)+BCcZXH)*o+AfNA6}#rlP`U*!KYyRZozHaZMy!L)m)IxtZgy z45rmADYjc-9jPNwSoIjQ!?O-5+-a@y1Vr!|F5l$AEY6Aq^kW2lfAYqe7<6%P>W)n_ z<7x@D8{EmR;b7}{zG#9QUvE0)FyZ`*g# z^FY!ms;*Iafj?Ons$7c1*!&RF=PC>>ugdUxV^TKBp?yP&r+%6lezKtJT;eTNVpz6r zHOUh#hp8-S6`RVvvK8VL5bo(xX7?MD0>1PhewE&n8%u0{PtlZw{-_D--l^`{&FiIp z8gjq>I6a=8Ja_cE7b5-qIw!p4;1IKT_7>6hEt&X_o0ySzlOm8ULyNRd&Rpc(%@DDm zP-BXl;NiAfZ_wYEC`?DM^jS66#ovEpvX6*NR{BgfD%X@+uTJ+2H|9a#n>rYkPmAmr zrPo{S(My~>naJ3iF1lF|`Enxzjg0sgtt*#SO9Vm5%oj!Tb^ZDf~B{2UF zDd_#%^TW|1eo|Q3AyMroy*EX?<7trYzzLg^kF;^}II@*}$gAD7eBemv`fOX{s zzOO8sc?$lVj2TPZ3FBiY#I+p_L#0&4d@FA5(ZGVczK#P^K$L!aXT*D-k7cWg#VeM5 z(2N1lrBtDvVDNVU9xSU%nDp98 zEMd&8pF!wyIMxcK&fez$bmLc9r!c`9TZZux2`F+CCddZ9|FyJ(|DElq zPnBkgkBwjm?R@Un#PZ9T9OuA*1X?rtQweJ)N8$}$q2bK(zBX<@Ut09ILos-?K+x<) zaPNG{a9(aw%$W>(vqDAgKBT)V3pD(}tO;8j}pro{-r za(;OS2j?wRNWMPEW!@HxIjxiOF3&q#D7m8X*(C($Ab~i_J@Jrmgq09^2&Uw$ng&P< zfl;ONUrGCY@Q&96w5AG8BBBBNBLC2QP}Vw*Rl`ef3UeD+&Zb9HWBjO6xDq@Si^Ti$PlR(u)jT$8MSa@cg9;cx6`1C)wFLbC?_YEu9t{ zAiizqn6<4%z$WKE-<-`g=8DMOC#K|E`7V>d${#&GY=v?%b*ytRef=@IZ;Mni?RE}_ zr)>59bjtojFgv}_IxuD@>j|Q9&gf=Jd}9*fGa4)bVv5FQD?hw#8{Zd_@;UA=%I4M? zX8SUWhI*EIuby}adfX+hzNHrj_C5LSiqp|%*VEZwD>^)*5;SU3AlwECCkNbvj}lm= z-P2gyb{0@J94%D*iL}S{EcvHj-a5Yh`B!<%KX{X5IWLgmc0?dQAq^AZ@5j=!0JUa7 zGt(S?O=a;SJ$HQw)>dCr+1l`jSoh5y|M&7<8#5<;=vO2tofeH3pS8Z&(5`LJp zVikt0yVty&SjC+_BdV>U4XTr-?7tZuElf8_j+gGQ^gIiMi4yCJ7-E?MY{oVu+4GjQnu*owVrNI`BJW z;_Ry2}S2=ws7Y^%`s^&Lu$v8S^c%!4`;oRP3quP|VD zCyM6)CG9D?JUhaqId5e#>Y-rkO9&IcVBunN7Tl(wy#-P&DL=Ai`0A+=jN>^js`Y8yze_LZ3^;yJi5jbdx7Jdq%>? ztLs*8Rb5WqZKIzF+;JN!fgj>!b?8%HSkDEHU_;^2^VhL`x6fcTw+t*tDMMrTuYm6V zC_VZj_n-*8P$AiCYH4N&v9sU`zwE{=)Kl&Cju8PZVUoV!2FR^3%pk&jRSP%B`t5kx zz(^#?)O{fMb>6y^w%LUKNu}{?(A?O;BNk89c~5NeZEzkMbm**%4S;O(HdLY>Pc(-mVBph;`rjG7CRq~haQn~nl?LRqo8|Q`uYt2d0#*94E*@21-Naj>!9`< zp-S!Em^k(30+;xp&L^QxXYbSAUK`HXT!VOvHaT%)i6i;fYb1I6gtg7s@Xd$EOv`tC z-Nc5exy7U z^*MjsuPyxt7pT*02$Lcj753K3vnP@XE2Veoyba9QvrEf1!KZP~gW4%AuNP1tIXQMa#^8W1$@@eQ{KkamcRkt^ zX_hhZUmoKB<;>KIXnGs7tw&;Ou!MiAnp||nBHK&)@N?3*_NX#s_TCaJhjo&lV+8mm zpY`G9TXk+4jBpV*Fb~s9vHiU~o917^CI``eV4}tE=jB9?`4J5=a)1a64}iPJ@9yZ#Ua#r#kG3U+aJRz0Mr7qV=&IwYJQ4`n25z=i&qgsC-hT z2z}fjG@!4TVaQ;m8bV)+;iNS9;%?FAaklv}NP znnfBwGrz=XfcdBA_5S-BuXh(d=nj9RT$r#rX8TOakO$RPA&%@HH>e`53Yd@8U*1vA zZ+V|DVwdgYpAW(RCI6@=ez=KL{Go*}n6MT9V}khn)Ui z4h-PMRIk5|tyb-O{b}c~nTVjw;Nzph-DTV7LjH@1$>~N`%D@{FO>o_Amab`qKE}9h z%|-h8Hpcwf^Nk6p+xf?h;3e_V!od3*wN-|;6JnWXQZ5yjzVGsymjgH1zWdzUn z>(7#3OQr~wTd$yXX|y`|`2M*Mm3^VziE$WYt1E{7CrW7W={BYsWfa->4*ETib2z02 z8jM;oD=u~ITe?HrCrXSoAK#V|dUxQDUT)IsZNcDaLUxl6RcijmBq;Uz(1JTfRD5f) z={tYl=Mgs=l*bkdBR>uIsM3tw5PutBI-1hE--}wWWm`XA1t%La+}2THBy?3f5Bxix2K;|+-$@r3Nz1!g6sTsl5h*_@(Y5YO(vzpMnJPIk8z$ql zkhborY(z=0)}KFG>vJW&pBTSUmB3$%WfvSShM)%1EYzl^Eew3ECv9UU6w&WK^V4*m z;cPIfE-HV-(^dcYEp~?M3B1)1T}c#k5IVIkWK1&Ad#S~D=bul*?!Vm6;7DP`^xV2b zU3RmS3J-(oVLhOawLru6y1Jn(m8L`+EAejOJU&##*&H7U`>B&|kI3=`L=pE4xPvsF5s+Fo_JQUYfU6UBo@pA*m1dj!s|$B45GjeCtWCcHV|- zQ*9RicD0;3mDN6i=WA~$qlG!D%~0-N0dcExST_IawaXSLgckGUQw+0(7u~&=DfGQG zW*MjFZ_f#?D!OrEBGsX=R@O|mf#wDvA(AQO6^?Tr&so|XU?xb})%PZ+^wMpguZ)Bb zyW6sFqph(IISCah(v6be>Dk!aQuMiS<5Zogq>#YTnM}Xr{>19?|b4%GsAyPmUm>U6UCvd`*asMGIqF$bcSw& zgSl%Xyt4PV%IEAn>O%+4Grr#+(7~G=&H6I~Ohw%{9!Pz%ugA}nDo%fb6;*k*ofEZ* zMn-qDfBVfnBD3$C$vxtAW&bE!oNqsoZ=EP{Bz@1NbxA2SnyqOt@(wkgorf<8wF+T3 z%xw35@;oN1uc$%xH_yH3e0TzT^v^GM!S9Wv_O>0rL!Jppe}6=#c9C>76E;Zi9pp;T zWaH`#yEx(RlY8g?jlJ`6-%qmX(QOrI+Cv(`EEeM-rw{-~>z2ao_nM~Xo@&4k0oc_A z7}Ckbg^%J}z`k7k6P2W*%D}61#*M*qZ}k_# z&DUSYyrs)J|I28H^{W5dvEqoLHzv@|{H=f=TX7%UUBKlOv9@eseMgyOR+71DX3vsS zIm}G3@nyO#ZFB89S)YyYep8EgY#a)=Uw8uPdJHZYq+nhg7DU$Vr@lrms>(@ben51s zyK1Mkl0LLGpLAd8AEisb^9b~Rz%YKWH~_I@-KiM?fk4?sMLPrh)!*#BQrA3iN@gztunTfs_wHDrQ|7rrQ7$%8t(2z#>z=jfL9 z-}e`1c>1T=KR*XP^8*T{teN3FaHb#?*1LhgR#Z}|-*9@7)E_?n>YVe+&ZBMrmIr$m zmQrpuToe|pjCgdD%W6bpGw)lsjuqaOuZPv`T(+uC%QpJR+Bf|hr4QF#%vW$k z9kGh;k1?JfN8^61M>iQxez~|j%&yE4V8Z*pof&3an*;iGL$|{{>VY%*-?o*?3w5v` zJWI!#t(N@k?-tz|;_2Q$+iSD$JvtIollDb_31GP|r;U{~C)bV&vx@#}Hf}pR=b|zZ z!#xQ0YGJnxCX6T1S7TdJpAA^HH#B)nfp9)Z!- zsZs_ew(%_`{ogvys<-4C_*K;w(BfYe*bYK}PF4816vHMupHM$a3>J4R4h<$rAE!MWA>rJpVS_+gV^VYKEv`!j{y(@*ICjihEvU~21mo`u{g zoBiB(ztxQ_?06A*gY@NpUhzNSU`^Y>_R9VVD%ojkeQrw{JiYa%%Ku< ze8GJpiv>VXZ=@Wwq}dUhI&|4UI_AxuSY02-ef`hlSA;yoH9y z?cC-#lvnV}nJjP71jqT80k?xJTTey)0&M_+z}lUb;{zG(vsn)JHj?tzie#AEx0fFe z@;@Bb^s;QEVSTneboPRozLeRYH-Bhgw2ZMxa}L~UY?<%1ix_oQ2K;fu6Op+4exK#D zfIRqO=SjuOt<+e`Jh!wKrBhZqD;4b}&iM7Mi*HQ+)V=j>z0-Z&$?Uvn4z)Kt^3}p} zLV1jL7<-8+55Lz>@cU79ZL#lL5x|XkDybpZXWF_&`W@o9EMKT=J5=n|KM{Q-h67g4 z8BiDy&k+6XVygCT`6)Z^g_m1zOg?;`vt?{il;cVUz~ZYL<#ON1SAGHhFWWbOPt*K9 zkE}(6tR|&EbLhUSDrxRVH$}{)NhUTmDb~1890k5-|EUUH(tW?=v$m}Kyg(ZdmzM{J z(~p%Du^vmWI6HMN)X7n-QV{LDAuOVh6Nj&yd;NC~v;B1@lm0xu_&AuW=lX0@u@9Wh zEciJ^Dw55$?Zy6bhJJ`J!O7cm`_`T4^3(2kdircEcq^NUMcF!jPdTh8P1x2_%p}kc7by zLkJ{c4j)$cefoCy*Z20<=lM>5_pbl)Bu}2-Z|%L;de`3jU9UEFfcl#pZXB5aE2_u4?v(UJ1X{Qiwp3x?wh7dboK-pqqfn{;rBnuN(1>^}!jOpT3--@28vL z3!!(DuT`nF5pGXz@=$Uydg9oC)}`YbZbN1jw z0c=vSlWVVFk7w@+K=^m0U4oa?twle5*H5cpC)dpHeUB_Jn$T{Y{-zf+9-BlzS&s!3BUst9(J5_t!sNutHrsUeF3X0 z0 z!_Ax=WZOQhd#U7OR^6z#;8QgkF*b`5cz*-?EX)aKJAwTq7|nU++q$C7v2dbr7UmJK zetpq8%02UW|F+SedEc%)=J%t|vBSZ@32oL-u4%!-vVCO@E1fI#D?zE|<2FeUUr1+f z9nrEXlRl$vOlaWHrvT$6ubC;mXZb8>)kz>TMvhF9Y(Ta942jp(ohzz!$WKiJQxMg zfKP~KN1xAWm<=B^!ix>`Y^kq3AasbCFjTT%;wZBIIcY(Y60cd(=UCcgG1r9-5c~6= zfPAG^W!#HH$sI8?1?IHhE0?=6C=i|$nvMT*-MqSzV>W`e9E>d4AC)lKMW!bZ>F}V& z>*9(nzmCZN+byJmt-te%{kz(3;}!D;F0=^Tp&d9tJP}@_9mv~~L2dS|&bB|lafgJ> z$v@_>p0x$|**-KFaa-k1#$fT}$%6^?zEFroCT?|E-)wvyW*I6cEN-}|_p5Kd2s!g$ zX!?<+u{8I+vjiIIV!LaWx@`nXN}ML8#jMpxGs!IthKyZfjs-aQd{19nksLb*o19%G-mMCoJ8kdh1u9ntgZIX< z6Zmxy3on*mQ0#hXcUd><;s~RsPMhQ4xC3C`jBzNS{_tZkY5Oh7+&g}rt{J|AgtnxK zSGJAbo2lEo#{Xl_{FcPi`uQ(Q)B4l-AG1q7@0UQ`0Hjscvd=86Ju*Z5VJpcwyo2D2 zOV{5QPdN8yWcl~^*0-&ro~$SuT`QJUB_Ti33@6GNhQ_bSKiJX}&v}J*gAcY;Z5#25 zV{DDvmQkM$D=pImgSA2h;>(KStc;M9|W{kZ+-Wsrs#l1vP0+^?Qb3bVPDoOpv8H#XLV z(btDmMtd*LGzWUTkg=EP7jzsKh2NK)2H#rv4Sp9N@s1xlyHu6k8msRmMXouZg*aDq z?h}$aiQx*uSREsAHga6xey`rqfVcac@1_;qy0jB+BU+bV#5m2D5gM$m#RDq@cMz10OKs1-|x zpuV_4hoY#>*in+nX*vgatp*NP@M_K3!nRb| zXm6qKo>qRoj~&4{$!%xCKc6m`w2aKLgF(4Fg<+VM33p+}4OYt{=uem*C)amJDQOw#lBLztrp zErl*9^jVuP!fFu&xh)3;)(<|;rMHb=#v|_mSee<}RuM2~WBN50br!o=_b0J;DgGEP z_1$|JAH>I9>KRCtv2*Yis|Y#4IHX}ImJ^`QdgRs?wRiI#1)U|FXz24j6Y}}IT3#b{ zl0eM{12KM&ZnYW8PT%4n^j^>gV{{E%%wU1do@PduidZ=T4;v^*N_Z-CW*d+?o5i1nm z&F)3S5K+8mB6Y;$pZ^2T9Nrh5PPTr^PG%|q-d3|GGc@4aMhx4tzDmd)AM!e{ew8DF- zF(tL6S=OkhD+h-Kdv5T`Y|Zg8!e#@$to`X>C)ITpQkn+eHah!Gov>618qc?C`Bh5O zdH%gp`m2;?&J`{5*QO6O0uw1s<#dvRtSykdGmgt@ZUY1oCY)al%ne&sbY0{f^PQf@L7P|JziT@%T2MoU1N`z%Osifn$ckhHdK6yQNd{5aztWR(W>3qH>u zDI+M>L1=bdNLf2KC942)aG1$%kr$PXv^KjAhzCQP=|Sa__5mjgwMFtk`Cj5{>+g!D zwH|l(28R|(x|tmH_2#~MDU(6jDTi;D69>Ry(yLtD2x(DD>n&~N23(c$zW6&%^ZyRB z&T1nW2Xt$YBis_RK|q0cl(rax(YR+)KoyIdoXzM9g_-z2*Kq&Al-<2Nj>s7v-V*CFGga2UL! zk16W)oU2-l`BL@AFF{!yWslQU9`HUCC9(opSeMeX;e?kEu~|4y;&s+>!+b72b~CoK zJ1r9OWl9Hwy|**}M>*YYj@(x68w?CJWL4PjvrnTBfbko0Mrd%m0{QdRe-URR> zai=l}rfeIf#oCk(^+UIf`sa>dNBhjb{$64DNrtSwGd#N*)RC;&XkF?pWt-K>K6lZ>bn$9S z3@tG0aX%VVO2y7&-Ya1XU-KI2kP+E!8(?rIzO=}>E1iA~zI6zPr$<(ug zgnuHPxBLxVGCo|#u%X?i!c7h~^#p=!yaEFQL$cqm|0bFp@^v>VR_2=N9;vTr6@~mF z_HfYSv3GgkM6fJwzB>xd<^j9s^!ZMl%~W(c;%mIYatfA2yRDY+{0^5+-rFR< zec_K?7rQG3%iBhu4A(WR(r#?1f7(ztWE6cNn+LdaqcDG|Sj{DbB+8~6Bi&zsb(_8_ zL`i^m)@oCzUzOqhmI=iv{=;Od6ORA!j*L=F>QxE zj*f6fyj__Xr&wlfp9jm!6c#iOTH#TyRZT4QW9-wSze4gJr+e~l*Z9F~f`TTJsM4vN zT#Tl@JGIT0)vTvBCS{h_Z9-iSG3_aZgC)plr`fuqdi9ZwL6=9tDcEYCo1RxM%o|tE zuDdX&oC=YzxZnm9PJN1+u8e2@v-_)9{_L@eK}n_8Pb zcO?Z7(W6X@bR5Y{*V{X}lrN5s@PpqFLbHA^;elZvbqXBKx3-OZfM_>PvCi>(<=%xe zzUm9QSZ`z$La?go(|fLpAXTqxMnv<*&VBZ{^^L2V>L&LXzuhe`D9w9+;uPobaIP&c zUF1v^RsW`tpA~a->*|mT5fSi=su>{Vk}fo5j?7zJr3IF!LF?G2Icy}v6<*|BkV;sr zvIS00rH`fG>2vIJy3^OcT!bh@h$ubY*>@&5RM3`;m@Jx#iFG{mUa?Ld0yOw%of)n%x8Udh>KDFYUnrepXORR7l#B2GJ^Wg0FU=MHZOh9P_gUYBeAq6uh=jlltKWv&krU*W4?sh!^>mJ}%-kq{Cytms z$*^a3rB-@3Kkhj@J2b|raRSA}+EunvN%=s;K%q-QDZ3XkbMkLEA>DVPjS|O6il7J_ z?KyWf({-s(W*j}6>HrQK**1b>Lx%nsDj3x@@bf0bQ!1%&)7Knhi({&M!w4x7SK5hO zxqRao)nWhS{I$P^`^Be${4C1M%tve0?Y{)Qh&~#7l%+mg^QOhB*R>ig$z@;izk$O8 z`<9#&6)G98w0d(fq|~7)mt|OJPLz-KZW|E`o)`NkYa+9(<*O5c5$cQU&Vj)`RcTgE z?z9vT;ShVn@)CCB(>N)cl7HoFxL<7QdQ?Nv42e?UD~_CiQ-dcAP)maqBFie#aE-tE z62G{K#&EpKu6U(+N6!JSZAz}$?*P>OldXa8=flRH_w;iH2b-DphSLW>HLj}FaE9f_G~nFxB)L;7tFLpRcfMc{v0id^63v} z!sb?Zy-U6>t?yI7x}`2ko{mkQTM*J7zlXg~Pj`!u&#U$pz!N76=6%gi$7k5?CNR@9 zjPJuH$d|+dSbQ=nYv5r`tZtwH2(h0$7!e%-iPX|<@mL7i^Z0$v$YwAQk>$?_g*3W@ z^fZh)@~Bs^2(bhw% z)UE(WK)AmRE<*&@DcWYkd<8%MBj}k#I(@}pXbv1pn1di$S!$C7By}j%sl@E?eE2?` zS6`%aenUs&K~JGCB2P~@WuM0LB15B?jaRldfh7Rz>jzuXB}b-OCoSquwIISnuEkl{ zKFhW4hx;FcPjwNFQb`93!o%ZSR8y{t_&nVAbDnA6 z%tt}GmdAth9Z0(D&@8Ye_&QZS&tgS1#R_>&+eYSObOg$OE)Fun_Y@B(K8$!EQxje{cBOt-$cIA*swkdNlR@ z)QUD%pxGaM=1Lmu9JY|>t<-ND?Ze(*uvm3X5xKIGA~cZM_FL2Sk(sLo^C4l=&evi5 zh!2MoJK0ZQvi{IHecR}8$*~rgjLS)qsHwd(tUPeYBt{=PJ{&u3==#Bm@ys-fJ>BHpy89@DHi9qO1@Am5ji%f))(%V`AdZ~ewX$aykhM=FDb#HNHqYo)D$hLP93ZiI~8Rt4}w z%KnsL>Wf%X%za7Mf^>xgQ$e6#O|4-%VZhbu@51QTv$5;#ga z*h@TkN%TR!DMO^4RsLFL}jd3|qxLo|8*(XRrJ*AYE$E+m;g4SARkwB8xlNS)zy(`(CAX^?J z`Uo~!BtOdBV6d>1nLEv1H$~h;aYkk>z^;Z$jV*s6a6FN<$AgkI)lDInS>~cw6~tX= zSCS^StCWI{NV)M?Os@~jBt1n+`gEg3_*F=M=6PI_M^j1dj z-fD*l@FFv`TkNu)-{4BVCV4%2y9r|rp*CnDV>u5}6Bc9yC>N)_!;rK}wf~<$z#nYS zT$Pso*rU2)`guZ}Vj(0s zOR(D$%2Jd`KUn5&XdGsn<4>%p+=SCAlfKz*XSwPIZSd2Z%j7(}HPush4@di=Srj|7Ji13rPic&oqxQuX{@L9*3OPIlY`3~^Fwp1Ad^x;gJ1RfgEFk@ke`slYO2koJLj~P;9!u0YDc0<+dxLgqpjxl5? zZ~-xErz8zI7HbY3)@Ndbv|zt1pN$xU+JOX8-RNq6)Xp-;&07Mq@@A+B?VQv@4&TLn zWH>rpQFvulWp&m0Iu~@atF#0h!@G2o)R-uYz+Oo6F7r=2yd)3T%b<+# zYPlwavzJ*ZTx{^-Tp8(�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⪼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