From a9a07ae9a9e1a46f7a2b5060c07c259fe424282a Mon Sep 17 00:00:00 2001 From: Alexey Khorkin Date: Tue, 27 Apr 2021 00:30:49 +0300 Subject: [PATCH 01/29] initial commit --- notebooks/202-facies-segmentation/README.md | 90 +++ notebooks/202-facies-segmentation/demo.png | Bin 0 -> 214888 bytes .../202-facies-segmentation/facies_demo.ipynb | 567 ++++++++++++++++++ .../202-facies-segmentation/requirements.txt | 16 + .../user_ie_extensions/CMakeLists.txt | 20 + .../user_ie_extensions/cpu_kernel.cpp | 135 +++++ .../user_ie_extensions/cpu_kernel.hpp | 31 + .../user_ie_extensions/extension.cpp | 73 +++ .../user_ie_extensions/extension.hpp | 31 + .../user_ie_extensions/op.cpp | 42 ++ .../user_ie_extensions/op.hpp | 28 + 11 files changed, 1033 insertions(+) create mode 100644 notebooks/202-facies-segmentation/README.md create mode 100644 notebooks/202-facies-segmentation/demo.png create mode 100644 notebooks/202-facies-segmentation/facies_demo.ipynb create mode 100644 notebooks/202-facies-segmentation/requirements.txt create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/op.cpp create mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/op.hpp diff --git a/notebooks/202-facies-segmentation/README.md b/notebooks/202-facies-segmentation/README.md new file mode 100644 index 00000000000..078b82418c9 --- /dev/null +++ b/notebooks/202-facies-segmentation/README.md @@ -0,0 +1,90 @@ +# Facies segmentation Python Demo + +This demo demonstrate how to run facies classification using OpenVINO™ + +This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays. + + +## How It Works +Upon the start-up, the demo application loads a network and an given dataset file to the Inference Engine plugin. When inference is done, the application displays 3d itkwidget viewer with facies interpretation. + +## Running + +### Installation of dependencies +First of all, you need to create the required CPU extension, just follow the instructions below: + +Steps to create CPU extension: + +```bash +$ source /bin/setupvars.sh +$ export TBB_DIR=${INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/cmake/ + +$ cd ./user_ie_extensions +$ mkdir build && cd build +$ cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc --all) +$ mv libunpool_cpu_extension.so ../../ +``` +### Setup virtual-env + +Step 1: Install [pyenv](https://github.com/pyenv/pyenv) +```sh +$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash +``` + +Step 2 Install python 3.6.9: +```sh +$ pyenv install 3.6.9 +``` +NOTE: If you get an error when trying to install python, run the following command: +```sh +$ export PATH="$HOME/.pyenv/bin:$PATH" +``` + +Step 3: Create virtual-env in this directory: +```sh +$ cd notebooks/202-facies-segmentation +$ ~/.pyenv/versions/3.6.8/bin/python -m venv facies_demo_env +``` + +Step 4: Activate env: +```sh +$ source facies_demo_env/bin/activate +``` + +Step 5: add your env to jupyter: +```sh +$ ipython kernel install --name "facies_demo_env" --user +``` + +Step 6 (Optional): You can install the required packages now with the following command, or later, inside the jupyter demo notebook: +```sh +$ pip install -r requirements.txt +``` + +### Download model: + +Step 1: Create model folder and download a model: + +```sh +$ cd notebooks/202-facies-segmentation +$ mkdir model && cd model +$ wget -O facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1 +$ wget -O facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1 +$ wget -O facies-segmentation-deconvnet.mapping https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1 +``` + +### Run notebook + +Run Jupyter notebook with demo +```bash +$ cd notebooks/202-facies-segmentation +$ jupyter notebook +``` + +## Demo Output + +The application uses Jupyter notebook to display 3d itkwidget with resulting instance classification masks. + +Markdown Monster icon diff --git a/notebooks/202-facies-segmentation/demo.png b/notebooks/202-facies-segmentation/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..c16f89d547878364a2fa25ef69d49f42f7c3b11b GIT binary patch literal 214888 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
)BxD;Jy5K&l52IH@QY0kskH5TSgH!^&Z{^U% zYT;hY-4usJ?rX07AQEzwob>QmB5h7PovFT*rqomnr@7nLYkjw3rOBs_;se=5g0xr& z4Yz0OX-&s=c4r$Gj7y5m|9ISxjAh#X%UCE&6NinecN_V8j h|FeEnR7Dnx$4;J~ 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�Ozg5NxCcd0Dv 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

hH(fu3k6I-FV!R>dJDWypj45+8^c3Dq_;sl!-L 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 z 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

#n*oP4B+?_l~+E(4D`}nD@OIEcIhZ- zk!2!_#G#R8&q?vioTEWJeocC0F#l|~2|>7svakRNn_cK%QMh*saZLmL*rb@9Bs0G@eEy5Gys`qT zWKv^@v?zIp5-4KRlE@f7cJlM1IXm9z27CocWKxnWMC2wfS?X^Z1Zk`~(nkF(-)j71 zeg|!SqHVP*F%jV6Xp8W(xrq=u7-o4pg#QR+-3;bQ>jFrDQqf1*&GI!=2D!bb96KOH z4AhCNad%tg{81_quN)iKoU-&P9NQz3>$-G=Q9z!3JHp+MHg(T(=(y*m5FSotS!x`KZm`N}VpLoM1XC!~#!+Ab;>*^Zh|SqZ;Dx2il6> zzpG8NPb`m=;>2YR`}NDN>#BZld*x7d z;9LQ|`Gkt{=hZz2Vui{AH$5w;Nj5(~2`|n@9l1g3v9~oNCW_A|3r7!rQ z|2F8XG5BWdp;7A+{sdy>X)a^h$FHyFqTWm%u}OZJ)nMc&<=-e#XS`*q$CJhnm?$HI zhHA72UUBI=#-H0qIZBeqN7^734T*4=iV^poID+Bd$r@P^Eu>^8m+z zf&q`rEkNQpj8kdsK*HhLNZ5+e-BRN3ztFe?Qf3bXx_XpO4;>t@p&uh;b(e+e!vhsI z&+Me{>31d-DIkC8o-gt*i>nlB^Yn@Q-`x>8<=TAB?0j8sFJmykc5@mgNFb+urd(hx z8yVDJ-&;d=MjDpCfO!56jlu;u+CL+t|1v?{{BLQGYID86&fgWEGrF>?RG>6y7L&KE z!(I}*CayADR8&MaR2?LH5Ezq(j|t=t4`W22SV`EPG z^!YOmz>RF2j=1bV2w)QwvPUz=E|3tnli&*%PkKlx^NFbg6WO;K2tqqf3bPIsI3ymU zf-_Akt(C?fp0}1c;yGu;i;9YxtiNQBu4-wChfAWEIbNQHuadjF_`*ZCqfR5>aq|pM z$W|TgX6te`OI@XMe;wuRr0(T?KMeC$Q`7(t`}6W&TZGgB z6P21D4Cq>%Zu0!|^NRGlDU$#d^TbwakoMdbI-)=kgIP@NFyPc11GRR1yYKEorwH9i zfYjSeeG13h;eB>N*#)5{F@_=yQ9G~fVguhcz3g^Q@R09Ba#GkaT>9C^m7>fFCdSGo zdAY0iKYubxnnn|N@===uVZU?d4&++nzd3}lJ||3`s4^`+wRP~yO=Rb^)gosl-CiG* z+J94VLrDb5WNtK{$M}ZVp-kT3hqt8>B7WVo=$C$AYr3YltLxW{SifwPfMo~uL8DFy zpH>+7D#=E#6QmA>t%X<5U`J;~WMsuf>uLFK7f$%U5deK)s<=&TQ{r6FK z68yyp({}!TBOTa3%EMzOzMukDSY-$pR#$6)3OCSpA`4j`Cn{mxIEN6>; zQEGK;&evux*5>xAtXIi%{`+@QD3>$)_42GvCf}+061ZZ=pZ^NbK{1VpzdqhSK`=f_`uf$VYRI^F#yOogrxFcCb1${y_sX01GqP4fANWn|Hd3rOzFH?fYRZ z#?OYKX(^>B`d{zYqgDc=r;z78uXI0`am3#IKuVUF1{)Z*B`5&-&_Fx9W)5m87N4~A zOGs$R=RX@AMG9pN;C_l(6q|peq2O6AL)^^|N677G8}^FMh-;$>|33T+dT!YT@re6s z&ob%s0;k0&w_dWr3?BZEa}{J$Rfja<8ZEc5(wHsDt-{>91CZCe0}t$2Bhg+-s-`arvK9Q&5mG;n?l77f9=@fupZ zoS3bEW)y4W1`YH~0MxjE0d+Sq6HZ(|?8yhf$PM`>V+O&>Km9L4=CJ=6swU_O>KOhL zl&mZ&sP-Z88%X{kEwAfQJJtqGkr99k;33#CfLO0@YAVl`^a)7!*!cL6y^wJSOJKNA z2InZx=`;SA0BD$c`!J#kII?ARBmf=|z<>d-#B@cldh7A_OuEsRam&ic^g2eLE$UA{?1g~-Y$TTYNYFPnNC_1A z&5msLMPn)3PU3avUs%yyT6x809S?F{^Ij5`4)PlQ#8rH2u3K$yhSz>Vugk8ymZ7Xx z7-j-1bRF#@e@slY0jf9V;rL3`8%X!R*e<6sIXGv>#{!76#KOxLfsaQULzQ1R{c9`P29gbN;``)SQI${uExXD7HVqTXJplJ?D6g#Ov3F0v>?Iq;?PwNXC-=})u2 z6K(!)LHhw_T{6C*9;Iy)H`utt8I^ftMv%$sbn2WbY~cM2A(cCL_aEPBI{yzLH~=5P zmc+p!dhNHIL9b(|56m7DKewTBFD3+4*$qOI3rV?utz|CPqVZq#%Pp}eN+s4MeHM`;TZ@WBA~}Emc-g=tS3v*yxdxUN{}# z-fqsdGJ?etnTHSM477rY>1o-IrrmC0vTrq^uEF>w57t8Y{POp)2Ta4{WMj^F&RN)~ z-Ce_@2b+rnGU2_MroTB(5v!O(@%=P&C=4TdPS5^@$ED zVhWksVGg%TG9CU2y&r37cTBVq;?&7<3sn4|vQ(}(<;-@M(wmOBDhqQ6?tj}jbesQt zd4)Qd8xwc~`d~&%Q#!u!2dofYn3zO{;q7jKq~GXrvi9FkdXsfWlq>gpVYe4c!}zxK zqdLbdVUDc=^qMDK)T2EAcl zH`IGgo^6rSuGdv^(wujPxU2+LgfGw6taGyPBb65a?l+wZ_OcQnK|q+E&W>5vMe0l` z7iz1Q*9AF*En5s9P~9uup$ZAhH5bVOR4fN7pgEr#K|l(f+16ujkS1g>(nKgg>2({M zr54{kX7D1J2?}q#l)ezd%yl$(ak&N^y|*zVznc7Cq~1e`+a>-eyqWkCSIr|a*Q;Nl zFTgR3VSJ-bBh}o6zN5oK@kdcyRl#pryG;;ivyZ{*vWd%MSN@}(5DAe8g$}GYa4cYw zRtJb}CZ~x|5gqHJ4a=968Tpa8YUZlZkaRI_Vk;Fe2bsC>h&@JQm zE-~rkRk)Ru6O2V5^F>?_$5zMu)hl<`bbKEN2LeGsL6D?)R;ZC0PbEjWB(_TphL4hz zZ%3Wj3wcCm#fyX3H|i+P4AR=l>@%RDtgINYz<=-OY;w;3O!XK}4Hh3RjtxqMX^auiV zOeyLXV$^Ke|DKgc+M@dmAB1#d_ARZiqgBej*y(bnMD5sssSFAz@b3IHJEZ z!%qyEJ^}%s^%0JM!&0+O5IFa?pS0d&Je%kS`0-InENO%cd1WNK;9chA&@q?FX&v|6 z@;xP`3|Y1SbOsCKZjv-s{7=nm`MpugT=IMZm!zspius}&`bfMb=nvjY7Dqa;{V_YM zH){u(Lme*IgR?*k?lMadrfi<60Pa*_>%iz8eH(ko@4MI4{CQs{N90wM#M)n!|7B+d zhu_&15iK{3MYH~lH=yEo#!#kFnRpuZ9n37eqbqU8s8gtRRZUG%Ky^TQZ8mlh3g&#* za2~`66H2-KlQ{U`w8{^S(Yc*Nmf@)awF4wPFqqw^c`M)t>>9FtMI6+HD@0HJ@999k z(JbLcFQ6)@E4y)z11@2vGXVLTJ)1pVfEI1KtN0U9xCVuNnWdXWO8Pj~y{Utbm4X|` z9i(q(aNH*0pQ~@+eriH42e*VYdzM3{QBZK&c~S3xkN^4?#G|BgyD!eq z++l{KIpAfvbCkb)YYls}ah|666i4>pa%PF84aJ9f^Qr!l0y!kVxl#FdKW)#~oF?OF zMRab;V>LDsSr;A8xV>hymhx%cWB)QxFGd|%dnnEdi=4k+x*EIjPKhtWGY%mMcZW>T zP?_q{7h|iEF|yNr^29E&J5$seq<=BFt9U_DTrH+jMC@Fo$b zEu*-^(Yx6s%_NwQ8e^mtWx0M<6P*bIqXeu%zsY5}!+Ax+AO6h`_kCtyNZUHZC zw|u?gu*0|5qG*yc)V}5TmHRU8-`TZQHk0igp8D{32bHfojt_F0jBP4;tDad6Z!8j*TY{==B_-4b-#~UcPwDuegoqbASXc? zzzTuUzgw7^xbi!6=-I^a<+i8&r2Ne^Q)&T;O@oaz8rs!t2{M+6N~&izQ;pIZ%=s_czXlv3CRBn#Pi%K4RAd9Zl$FRqDBhb%4G0K?Q1%N_?%3nw1FfN~{&v4LZHDddi4 zK}XCoccNe-MWTG-efq1T^odp`w~_s;PK8#wD*^OW1L+9g%!Juu*91+2TtVcAG8%*2 z$_+)F;v!3xJ|U-|+DTcs{UCI+o<92!r_UR5W^fNj5uNl?r4G0*;jz4}7~g;(fdZ^P zfD_Pu5ZNsbBD{1K&v^kf-o$`LEMJ(f@1xuKqMZpNrGYrg#ml=0XT0O!z>E2lJ-J*| zqR8KE7R#{AYVxB@CEL4au}WcI?J7o&4yO^h%o4>$IE91tTlT>VVtC95)fE404}x#G zew#KIenNTvPQNEhHg?DzP@%$02Ja~24DZ$%*Sn1ToR(lNf(#C_*8{q4p7QYJJ?+|j zQpQA9cCCP^*JmEZL~DEim9vScMoqrgP~QW#i;VbWR_P?q%Yt z1s9o7oe6{X3UJ)Q!J!w06mm$Q1G)A6=Q&SLPq>LA^Lh$DX$A`&g-53&!?9vBG{qUz z+R*#fbC-;gvt(7rf6SJKe=L7YRXHrOmART$@iCBU)Yu`4KG$W=!6iZ}0C*rs~4?Zb01O&+>;lFZeM{Bfr z9z8MpuI2shb;0`+U0SNL5Nk%PSPq5hHsOi(=O7A6Ipl_ zXwiK7`Um=o)bKmjNaw8eY~)Ah%UB=H)KCW-%p_pt#Op%6wX-cWNL#i>=epC~){fbI zoZ`U!&h%hvG2k~%woc~Vlg<`M!d-^UAgs1V@Tm?~8yHw_+tcFEDKj0gKY(!>jD0__ z(x+Oprx!=xM1Pk5gq;*vR%Y3CR<@=ybyRP&(^%B6WGiSk=a=i+BK5iWW-YSaGWINP zEzq!ZX#6?_ziS=L&BIvrKoTKnVRBQ*;k#_FwgPYlEYc#SYgp#Ej8VAbiL$C^&h$s# zK>>*A%pu>{UzaD;8A^AqPAz%bTMlbKbavWom%;7G7khwHi5DM!uIb5|+x|p>LMDD( zDyGi{f>CZ_UeCyMxeuRTCuqQv<};E?su#%oo*B0&=F|CkvQjKQC$IPWBcbq}0}HnQ zbL<{F+&lR85c75=NXlVW1v4mUTiRcRGFf*bcS{)Zg9&ZqZ4)m(COO&+$c1q#`b&m% zyjVT^n#=um*r_bTQ=2hx%g_=ZF)Uu9Y?ZfQnnO53-~@1k5+z_Usaf2R;d& z(_xTC)#-4o&%EQA{ACFfdVm-R&@?+7$nmLLR9`<^H?!Vxir*<0hOeaWyRkxEmwJ#+B7C;g~x8w+Grm zGQlLM7yj%m0)hDxH}~fnNNLBpM_*3roCl&IWH@^70A=xLYiKbkkGZ@l#zjNBXre{3 z!ev#y0v#{^chb&rZqs&Ku#&AmGqNH3j~Xt+locVaiuK4b42=W?YzY`1YH@X{Spl!{ zp09c%Rb?85Xdi8fIpGNzi zj~FAU!C(&KYK)kQ6*@YtXn`eAv%d}DN6s6HN z`9nP%+V5=<*e!-}=-9Q)J1X4b|DOdo!T*R(RbJS9D!cSzf5GU^p@~lITjY9xQ^8K$ z5%P>*Nxa_CVZkJNz9&Jl+r6rS-SY+LyT>0Onvi@)-W0TE*`ZX9KQMz9a}7eqiNLSk znH(vUGvy@_=fx&zd&K(5$k>>up5xLH5g;I6oyCqQvUmS3&M+^vSorq#q3_hx?2F?M zE0T~<0ebt+v3lD{Sm#GB%{&zIOKpr=B~@9ulEqc)!w8#xw8fZgZ?14<3L0@V*^-+Q zw)M+yxkbD8!tpBy!*D^ll=giEALKVIv0(m0zElazfp!2s-xK)sD3s_%sl0z&`AJS8 zkyd*nDe@&cO*v8QdTH3&(+9Ubvn*x0D_WdH`bIuev0FwpZav?TI5MF>$T-T85 zsI!O(&Jbk6L4Vd0xe{_GLpF(0)B!DMNS(D4kvcSVvPif0?)138{FL> zM*$^TV`fvr6K^$ELE?>a!5#Q2y5Zjop{7j`^}ziR62Zjnp8+GBB^UEvCx@BTkLRK7 z6=SqP`|R%gjbQ3R?Oqjp5fKp|ub+o5mPsO#PmM+EKnLtmDZ>4NR+JKaCCub7r>pfF zW#{~G@T@1p^|h3T4M8Wu!#=n2<~ucFM+!kF()#%GOuaG)_I~gBEvIVJ=0&9%TwPTa z0%?XzA%aQ*EO$pmh2?5YINcyl|8`_eg8%;WZbfpTx%7(q(^do7A>ZqQfvFWaNR;mk z!qRpi?@`7`{YVH_MR=tzytFolFjZarP-jKz{)baZIg4e3b}3i%iv+8L}%O zYyA2w9@11Ua>pOv?Ue>owvG^W#-+2d%PR=fxcc}|W~k!*4^7t{P4)l(k%|VnD4E5* zNQmrpMb^Fcxc1(=>^)OPMy|b*%_S?cM_CEU&dQ3L6|!C9_qu()zjORi&Z%?mz3=;a zJ)e&Wj;R6};Ar{wDF`qwF7$Yi;Ab&7uFbyBu_}UN3#eWSc!pf%2r{n~UCR~yoAKl#f83UABcLKTb$m6KzQfEZ@}52a%BQPfkgnXWO>H^Cin~#HUPq+eR}TP z6VJ?jdq78XxK!N(=-_6u9e8e+-zM)%#t)svv(9nLX2UrDuL(|?3oOQBX*sMh;Te*H z1~BF6p>_YkwEVxvC&E#6Us7Qqp4@H}OhNvSj!8ATvJ!?oq56c(ktENgfwoxCx7alQTucYvI@tI9$0^U1@fb60VPd287)f8?Ied)QmSf$(vrv9?Q) zNBdV5^M}1%e&%U~DG9!C=g7KeK2ENVl1R_K+ez_{VbN`W`>*81A2&VM4Z6FcfiN+{ zxsenfX%5tLkc(B<7g~!JaYNa*X!`>VQ)*_WTy~(w?>Id@?G*GcaP|MSqJPpnV*P&C zQpn_|!x;B$G}ql-3hq+NV%j@B)5pbS<~ePpuDO9az}tcM8W7E zaR1Vax|0Ab7{IHY0Ks7~Z=A$}MT(3qidlyvlCCW_E~CzRjxFb&&q!ePK@J1umZpYO zm%`RvvX2h3n6yNSY)>P9YgL#ZP>)2gVPAf@mI2#5cx8!z@7p8@Rvi>()}7MvN=eT{d1@t7d0s1EAC$77e7GqFH2ka;)XfBjZl+U;qXf z=xtb5wCZ&;-e4&CHcNfp1mxb0AzRp>qf8!-#-D2dT$IT_iO^&IBtr1NaCN9@O_O57vT-Iwq;ODf1nE?B7wwQPjiV^(sJhL(~8@bkZF!K71#-ZJL}!@VE5z zy)wznbEC=u)504+9)kJ6RQ27&`U04a{<$;&D~$&_e-Gsy4a}V?r(FMXUWC(V0|%}b z)aiDsnR?7`}DvxBBb?d@nzoVenf0OBV- zC4&=lN$t;ft^Pc4ZY{(0Lge@EWMpRpK)n+bLskOI6re=D(hZ5c75Qo_t#!HkL|az< zR|JIe)39SVJDfusstQGoQ>|uDnu>WpNq95NnGT!+tfCnQq4}XslUlb`s1qz&z4~m@ zKW;(WXpX;N^{xgmWXM^bC`HiTNANvjVJUgF1Ba~$YPP}lli&TVN6T@f`vd!lGhXdy z^lv=Gs}FL*89(F66u<${i?|Xqo&A=deYK7wI%P%RdJW>#rFKfpZzm|Eq69q~f4+Uj zPs`ocmJUM=&AT~fXp?@xa@`+3UlUiJ%GdI!w7Al(oGD7~JEyW+h<#sOY%v2+GDg3R zDj5M{WfX{fH4FfuOn)G)=wiGa2ONw*4>`9b7TOt;(UqH46uox4Hx&}@D7YS_Ee3ifLGfn1(^bw!Ity3W>u1))YM&vwe;(;iuP4sy zQ74{#Z=-`r(tiM3Wrn!C^!uTY314XDT=vCAZIwB)CjNTS-`e)Y^R5$A{F3KDl+X@3 zTnGs8)uwo=HH9s4(OAE&X0BYugt2I9d8u`hv7vvwd>RDEp&MyTeL8^ zXhm|wBo@7`YZX&THl*#dcbqec6=tUID1fK_GLeBrTXR|$vQ>d0&Lf1zJ_<@|(Rj&v zh7Gai*`(s5J_5}~@ZIjErhYhJBvRRH$yIj%gDkRN0RH zI>LaXHmOrQ8Zf-Qk$~mpYx&*NiU@=b-$%4fSGXW;VIl)>iy15^_3$F4= zXdYPdl|uEI!vpQoy`n9ZP~11KR8E|X@?>3tzxaklJ{O*|$BZbb3~WC`@hWzw4V&}N z7+)_%pZs(&x)V?_I``T^)oi`WY1un;dS)Dw$qJv2&!Um^ZcyJToT{YZY9jKsSZ zKQi`x1`#ic|A2(wIpN!*nyPs3SvVQPXK+3^1C>1C_OqV}U&6^Je6u8k0M2l*p=YzW zleWwna21`l7P1qT+?kIn3;o5SjMogZa<2bp_h-ynxYbhm5w}VL~waJ+eHn zSl;S`_(-TMS|RcdI$9MQf6}+5vwD#2Pky|~P$3{|08zex(-GYIk9D0-2b9+~-hve` z&-e)(2H>yH0iXh`sq=?{TZfSBnTjO;)u8-Vhs|S$hVofwJi=^ooa)&)0l5)acQJ(X ze_rPME?_L?JNg~iM}fL$9&DTz9(3;^mmP7Ys~6RIL90w8C@#Lmruw!M$dj^O-WDqF*{SkhqJLckIdGFr5yxZ8U9i=34&3^ zJO{KSP=pz_`rid6k0-#uZFf!h3S1}aVv-!55cm{e%Ye8|t4;kITBrN%F0$k8l4|dKu6Fu&gJJspkbbJOWIf zrU3yA_%j9&hC5(47moL)u5S!o7CS&DR%N|SLKXm_%1)`t*|iqqXPokBD_h z9ees9XT(;rl|`MZVZa3OIv~YJKg#_pg(s{jIihOL{#vcus%CBCsNw6+>rJuw2t-Qk z%SydH)c&yN*o5*K?XiEB{K4Fzp`tn0LjD%RgtYQVbo5vvni34@2-x z1C*D%JLj?GEh6k|m3^oPa#*4Lw?#hm291yqhfj5{$)+KDNiK&)WGng>?2WM%C!?x` z*`NVRckuX2H3MB6YXR$!&$!E)z@J8Uj(ANK(j<)LfjHKvCuf!SNGz!EaS4<&DmP4( z&TU+F=wol{|88o(gcs^@apHeT@KuH2(Z)wqSXo`(@||ev7Nlb;sm31R#=a>t+a|o_ zTNO_5t0ucIr0+}wXD$lJ*u$wzoB`~oqOpbwSdSFj55K%N5FZT7XaCl zlarm+)>|1h&dAs@+PpK<3$FMKeq)$b0!cAyfWG(j>EOH1L#yuKZGdF335^4Xs(tM> zf=J)k^xn5ySFswD@veC*E+;g4MS(c(_2zB32{-RYDGjS$;_1a&q(aTt-~gfb%)c_c zB%CLtgAR`~9~`e#(d_7k8gEvhg{I3lUj)(&v1`FT9Gs1kKSX{UZ7yCfvbICpu@ZgU z?ekJzHwL6GE74uQ1YoeF#Jd1vnIvPEdg6eB&f?K579@^z9RK;vHkI<1-Y>Qi>v;F}+l>7BWB>Nx-uSR))i&HouiK0g&}IW~ zRv7r$??*9X-IXYBWF>5#*qLzZ?Ph7ZWj+h^Cw3UFFZ-I~=9oR09Z*XuKu!~h`X|>> zNF8CN(DZnNm2=GQa^NJ?K!4h2o&4Uc@7W>%3x}B>FrX6ZQKUWc6NtQ0=k)7O5&&p!uRBpvU zV^-u&2p@=ihwBnO(abra*6WJ37;Cskx+H2lvI-ckE+iICO>lp`fG7xw`prcdFS)%q? z>ibOIInq69bKe*6%iKM0V4PEAs7qY_jwnJV($TGi*h#lX%cd%#iFu6$Ck!xQry;-{pUFjoM`09*$Q@7(%i3gs!PA|LY8=*pcdn}x)ZE}KWk zGl{ySAYsj5<;Lq3EbdcSOyA&K(BHJwMnUrPyV0r#FDK#_DHewWAEe84FAA?>3kE?q zgh64e)~{S$BgwoSDr!vV1N9NF_CsS`=_Rpl&-V{phA#+3i|oxWqYF~Ou_?FnWjS_) zocyG&Q!werq`>fuE3(s_EcH@sVJ{F0DHwcuM~*Z8jr$}BY9b+`Iq^J)7C|%(~Y5SPtN()H873J@#C7SF*o?IEmi2@n~F>QFvdPBL)Pme>$*Mdx zQ_S{A|CVnBTI8nbyQp^!<&KiYjyrIZHDVauZThQ-yl;eO&cd&NWgLh)gvwnTq5(zH z-P5q)E}EL24h+9?C0eeex(GS0$b!c1-|`$j&?Nm!>Hz~~t9>?CYGm$HI}K*1tB)D> zxRXsK!_3vGM3@T$Qhz<9X1NlUXLnJyCZoh`elpwIl$<~1_ugDS^jf=Yhdu73yh$YD zwEWh`EnvD_9sQ`;_N{@#eEjqaiGeAI^XZvpX~NO zW4oD$$5`56@XoO0_%AEe4LT3GE_KP{($504F`2Z56sBN}r?4>4`pzGB8;5}#&>{+D zV(E&UgW-IsDEmF%*)XS8PBe_w+DdGEt0x&#<+NUi+>Z;CRGRv#oP^2dun^rMb^G;t z>ATP07}cz^Ja#=kjo#A1!@k3By3&g{JsdA7m{gm@E4FffTHx#=lUnZ}qn$2TTUfNy zvoesHLly(5 zVGo8lROW^Phm)Y16lv6%9+qFK`&NVWn!kxVJ$!KqSK02RIj2|}wZrHjr)7n5D>?4Z zg69@lXx66g4lZfgCQ$+L$BkE)Zd{%Inu_);U2~m9d3@x^{YJ5M`J+bO_SU0&rgdO{ zeG+^X5Da*0?(=$7#drBHS`;HU2a8D9DK32sh$(&*A3><_<`K-o{wGuqk2BQVq>V3@ zeJ`-^fS_)tiUG!^EmbX}6wvTH;b~}3tMvyx8(&M)tICMIGqWkeS*n0|&oGX7t!cTu zc*P$`Y1ug;*n{-AuN>0)kK)~=iL84{Fi~jH^_0S211H-+Ga;>vPOjNG&G)(QzZSPi zIXx^WEaV?|R9@w@nSwIiJmQxgIhiU!Dl!*Z>gAR0Z%H%kH~i_RwoVc{GpJdy-(-@! z0W=MQpABek@el%x~?$z zw3)~l`EC7OJ}lRcVRXjQ{w#L)=o|a-_+k3oUG~py*MH`H;@UHT#%n{09P&EVF322R z4*!QY5sCp}AQ?DsoQ}rlx;e2Ci~r%GYgiR9yQD z)o^_z#F5GU1!qcMq@gk<7pU!YcH<)j$9kf|)LAIljs^87*|BPh46D`yp2E&CU$oGD z5oV}s2-+m?;_NJxej*93KfE!v)$Mk&x3Wg>=qW#@Pouv{LEPZ~ zEOZ5levN45^Gv8MgbPr(epq;w$8o)_K4-0)c%$q~Nr$))^X%_3pQJVe0i}Qv|0o)4 zfi7p`#)Y<3o=+X{rU=usj&i~c80ti_rye=1SVclhw@X}eSp}UxuK8Ijqt=AK@e=j2 zce6)zugU5Qyr%OFo$>xjIq=?Q?oO$x9i4Bq+U36Y57D1!Hd0hkBgbGf&ReLT)R^Nl z75gHEbMA54!ip8h^q*Yjn4H+7(qD;MPXH$CxSYVs`ypBvPf_-EuL`FL2PUN$t^*NK z(*>hc(a7W`H?h(ajwI>2=`OtLwiuHU!>W22oz{_LSaKpQAAq`1Y)weBYoy`!8bUT} zYx~#|Lz-?jDw97HwZ?ZPI)!ji05jhOjOJD#)o0=@S_@Joci4t?~tYBEkIlUZzytFDPPd+}ElnI|MOR z^b`@yo=bs=`T7s_J%MU`Z9yj-&zKVHLJE&=Hr(8z=0%C%Cz3GoTB{?PohIgf* zQ`0R<)N9yFQMoCu zLLH1DWVz{cQ|K{Dtp0%=@%?GF9-CS3lIoJLT@Hy#!!|wX8byVL01lu(UU=0PxYG)P zKfsFv`Dw)JJ>_&CPb~E0-C$R=5cOnGbI!Q@2NWB8iMJk2U)}27qg8K~8Q_G_|&=k(>p!{sA@Z-8>Kb7|Wht9s(u0u{b`rM#P<3*2>rns?} z+b;(eFLt?MEH${6aDYH%at13g_yHneK%D@&mjKKX%rNl}6$!j01`-G|-6Ro(vy}oi=^Rnxzb@aa%K5Mb&7~JZLEs%2MfIAb zO@2HjwpLqlx$4E-x8H%Ll-z_e2skye&%(Y&S$K#+ zKopW6{gtJ3wa_HWA+;QHm#+ndt&Q%~_O2R>a?&!gWxAZAnuRarejXE19o;Z4?UV}G zQ0T00So6@a_%voX_I4F+c;1 z$C*@$fJPsL*BCvhpXd7zPhrFxjF*vL*nuMoSo7)8lz%7yc#ls&;=3zki;7bSEqg{& zX{3q%*59a3e&vNseG3OAzq|(NB5Uy=m`=rQ^Ubw*PugWiC~LNO}5hb{O(MR`5WBT zKV81BNQnZewjo@rY}}NPO+(o=g|%h!iSziVqonZ@A2*Z+5{EVqRoZZ;or&VBS8v8Z zS28tc$FyL`&W)3ji@bAX^_NzRO~AYhA_ilHGL+p#v#Q$g;@*GxnCesu+Y22QJ*8tD z-?Am+y1Kd?FjB|IgF%eIF!$E`-07JgUF+YZisszb)+BZA6g>C_utDsNe&sM^6o-;$ z!tjg64M4#Z}ktsgv;CdPaHXxCW!=u(@-r<9d;KrjZ8J*@^!zK460UsQAxt% z0<<9oXG`@8$y^9cU3pKZxz9F&qc)&_<$Ys(l?myGt%z?00&Z(w0v`%TR^N}_VN57N zt+@wq-d)Q4D>2e`6=S7Ue{^0shhh9nUt#5HCZ|Yt<&uqd(G+k8&{J4k_&ZSEs-(lO zF~KS5>)5^35xn4w^=;eXPd}6Q&Mj6_ZZOIeOk6@7Nl6fmkbRMDv+Y;QbLf8Df^|aQ za^|C(1J>hvhyvu8@cI*{faXy|_F&P2L{yGBD1?lYJZ# zCqnO>F!ok?I%Dp|#Qo?TFc|`2)?e*aaSoAj8;;4vU4eAffP=)-;%wRq^=!8FFM}3H zOyZZG9ZwgR?9lFyS}-k*yh1}DF=UF(B`IMSkc;M$s@_TsoIDf<@Acw)pRT>Lg*me6 z(YgI+mwrSk*ql&ue9`K~N1SEv8dbJh|IgHL096_L>g^wJJ0|do*QP<&G)K(r9}Ob> z5w2ZIntjJZPTNB&Yct8QxPm%3Y!#j1o}>0$Cb~zU?RH#=$ju)I%lG|d`mHlTLC@YE zKgeohwktbGIeZXeG2}ce{J!E%`ZfV{MI|!zQLaXB9EX#r@q3TrU#ir?nCHHdsCHl; z17~~eX{5N}E3IlL7Vju#vr$Q4dr?H*qTw3cky^rksKZ37i2=k~Y5xUG2f)2uuD$Cu{E9r9ymeY+Lm0=ga-K|mG_?p&_@LSjed^!MLf+?mN+vCugB=7@{K zi{oSN0}fI-9niRVWz*BI-|I^{%~-gC@{1X$f`9!&!abk`lHaShi;q}+^)z&z`HG3S zyzWb+5TIfnGU)?DZ-0L@AL1_@^k&QSLzHLB_R}^p#=Etctq_^2cXvZ%o18Kp5c0kKl%LW`mO{Sp)8_)(K_ z-quRK$b`#!fT4lOyWm0k_xUNTM?l-!o3X}1nvP};c*PN}PZ*N_9w^H{SpGBOsj$b< zdgsJmAZ?%W{}1_*25Vn}Qeuw~+2VQ6#E=8Z1p78NFT_qfwySDs?qn>`-*Q!NMz?%Z zy5bc0DuqEyuCv#YGU$nY5fgLs6aaWCfR61Q5@yb{f(UdyTq zc>oKszY=}R$<7R^5W%-|1IO4oqlb$M)s(3mBU3q2#^sfg zN&t&`Jx!8X( zG(->2C@0n)7N*K{vQkvzvUPh@=_V{#YPYQR&rq^AOr?W09Tr-S-XD6JO#C6~tc&3gG7!BVTkOyX);wn|)znuc4ZhZ^>SfZ7wBt)vzZ2L?>I!Dahx$ZA?m zlD#K!tnoa4h5=u4wfM&wN%M`L1#G#CL(Sa_A5mQ+n1@sjiz`(ZomogGzKIt;{Fhi< zGwq~v6I6+t^3wusMSWw!#%r|hLAJHWNuToL5Rgjn7NioynF5&9LS-V#koyolHFCkf z-$c&jJ0ZT^skfJ|+MI9GeA`xL#GBsBdysm9v5P#Y-m5>6umWF94{-Kwr3g5)HN$+; zJC{5gH5njJrz#vDrAA^P6fa9GrS(2zZ3nZnd>;7@^>88O($`Y`1C8NUuQ%5{;MszT z^=0N)Ory)xvb3f1LT-%5n_v}38bQ3^ufHOPL3gq??jlMsRM_4X+Yx_{S?7r{u>wge zV5I^sNaC0!i<*3lgQ23b1SCSY-58(7Ljn%Eiu#y5`M5=J?jNND9p53K!36@#e3jpy zR2=mmZ%KlUmz~uNr*o90q*nt8jXkU#eBEi4qH?>~v)6vC@HoW(t0V z#>3?cOcy&$UQO34XfEcOvO7!k?@Ag?Bb{6h&s$QaKAQuc8#q@6B`?I&2MVWu@H<@= zl7gZ7X}|py0}8`Tg=pQ;o7t8GKUl9}6n;?M(YjjGE+iz55~znP^=|Fr;{o2(SzTMCGH`d_l%uC&Sc(&eLY^LWtY;1U{>WwO3n2sF$Xx%*yvu>FT_1o#{7C#%K-b)cZcEE#%O4uNM=Q491|6jtVZf3SenQ zTnVOMHamTCbpD-OR)V(LRXbLoG0WQY=to*7xt~OU>5^Zc8sXf%(F8Lmn3*c>?U(<^ zN%1!xCf%EXw!b_f7j$(#l(4L$1@&cv&m*v`(I)a8j$x;hxB}V!<0>kRUo>f}I-M?L zlX-3kM$x?Ig-(OP!2 zm%>bu2a%_Kuge)*qJ|lT_2*MSeyK!~;VjS6{3{FPOEEEW)1=PtpQU=tunrY)l$jF&&bok#2c1&_?`ICTX4OHvxiNVqY{FrDy-Y;+ zmk)zf{UWsjta-LgkjqINt+<1yFVT+Wq>4205g?N^GWCiT&rapHM`uJ0-5@TYfsCg| z@17;0A0Zx(Y>ooqFY&1+b$@liS|(JwHj*y)WLho$x4S6FVFof5(gL}$`>dwR zuM|EoN78(VzJwTI5K>QPy?b2P>aaHN%(7CpH42RFLEo<~S~4iX*u;)`j{V;RJH3n= zoEJ#`Rg5mQ&r6=p;mBR3OT5P}@)2Q~WJ|b&u=Nt%+GWeIOs{dPrc|$F)o|b*6VYZ1 z5YUuY|MeG`JsfvmO?o2gkM2t;TB{q4?NJ=es(;S!eUWw!;z7;8a6|qGK(P2zEp;@k z3wcDMoIJC>Z&(7A`>r8%9Vin2rC$W=+y#dkKJyoN39{Eb5>|>_xvuBSq6wi2x3jkN z98`s9IBc{qAR7mysARU?6!OT3&paHm1OdjB`|O0#R;xA_A(p;Ziaa}~mtT0RoP8YC zAyt5o!OX>bZobWEkQh7|JC*V1Tp|C^^#x_6nNSGfMSU)t>bil0kL0J%3ERM#S6Gy% zeySXDBsNbu9DjhBi}rXL&7{Y^ijZHjSn|0dSuCPM3OetS|7gIXcT)!}DLpu9yP?X< z-~<6-;NX*cpbs72tE=I-Lp=&~ZA7*}xW@8xBLfqIAKm_0m94<34^ju_oH*8Ozr`RZ zH82UH%95U%d0VOD38SK^(Z(5X-^vwexLB*f9yW(VqX)t8qH;5@@!f=hX0mfJlD_O& zszf;}f1nO!>i+#|57x~>#N$GlG7!J2nPxp(7pOl@9%qf+aZ{=&ko0(e}AIZ9EQg z&;`aDSH3;tjkUlQOP*Xz`h8$(DBtyUA2al@-)P9#{SK9lWVS;lQyZw5)74Kz#HR@R zkUl2i32kP5)bOZHlBNBo>GjHxX5#Gto=}1+is?w^o>t}_$b2k@Yk=HwJy_CN1 z$z{KBxLrTDZQ0+k#L^CCc(4P5+F$FSWxl_mZhMKg+adF4J~)pDcRrm4(!vcicWl7+ z!{Xbk6cc)Ee8QKNV4?csZq$j0Rw&BJ@Gls1VOq|0>`YT>{m%W@Nb~4s-$mVt)V)PK z&eglW?#J)^l#bzt-6}ev1?lcQ>H27RFEEnk(EgEYS8bDDdC$GXTe|^Jv(w}J!fSl> zN*$>iEL36f~h9J!6GErT;|9G}3W5-IaJLYGSRw!tWV!` z_uqoN3Xn4p*!B!l4N(c~J`&m9uFwAO72;!3f$!R);0cC_v#K(Ys8jjR2?2`;b6Rdi zG~CbEFpqcv8HC3CV#|1>n!l}GVK zo<7)t*$qYWo6gj{!xj7WuDj4Zs2Sl0YHO1(EE&D&fB9){lqr=Td(7y}K0K#rAH1@= zsn7|sb)&kN34q!mcgR*({7NKj;8Zj$bAV$d@%q-W6xfl#OCAUI zRjq3vfl0Ak!dL7YFcqU^me#n!ga-aTX)iB1uRcoO7d1IJCnh<;*Q<7s@g)`K z#+9JVtn=rDnzlxi9D1CYlcQx(|kZpVF!7XR~_qf?wQslob#olJC4@isXv?B!|Rm;FVb|6Xz&&kf2a zP2nos1Ozo5{KJ#CbIll6!-Ue{#i?0YU7#nke@R9*lw1XTHpG!%pXR7lo<8yvSNWS6 zf6Ch~kkXfSH5`V3_a_Fgy0{ya7p*&6AqJMK!;k%7&4>a->!9+umxMWiIW$xzdYPkz z6~^alB>onC?Is;+_;-1{FnGY1GjN=1U@co?sP?H=l!#Q>yoDnbw{6~YMOkzue>h)}(VW;h^jbc-O5Ldpb77cE1sVqQ=e)2WKZ>#z#u>j7{ zL33IpPE1TpuJdRY5Q69L;ucJ8vl5XTHF@auTp}gPHnE_@U*8jWwdfTYHgwuamwrWkkK1aX;1P>L^{H28A;<0L~1F4p73nWIZ7&r5uB ziF*eAxRNG8K&pRv9AdZKuwEwGBK?S9oaAyH|7!9;@k;$q_VT`$ew;ABazLzyl-oUG zF1%mc7{t9ZRNG)>3)@Nf+D@x1Rjp{kB6eGkHdE$v{a`s0d9bpVT4=Tc)Nx*j01W2f zOV6TmI`eVb$$(D6LHvp&xwB7Jg<0BLzrN=d``3KuQhNe}FR1=dZsgPH4jT1jye5b` zH6xlHpm0vC$VqZ+1Np5RpjZ2S>jnF^c1zgB*4lml^#Kd-Qsa{^gI;ahi?1Io;4pd~Oc@Fyeu^twd6LTbv(Zfp2=kV667J$QK&2>Edo95Bh7ebHh}4)g|%J&?$- zg6)eTrZWnHPGpL|@UGNG>;>T;&L9pcf^K9iJaPYiMJrEA&9>S5Kq1&o?z>C8M{pQv zd1OY98{$S}AtVf(qz>s5wN03je009ULH1r-EwoplVcFjJgUY3OkK$`9f=X%+EJwm) zTZZ46U`+Qk<82>AVvVbOWVSMliv-`=>VciG`~1uIi-9?>CL=KIgCD?T`vuXw8oyj- z^g+wy*ynkY`ex1O?snWQNF$=;jFIv1y7Ap1q97~O@SBcixVU7IKR}C_0YxH!?iDBw7V}I{S(jl)IQKQdgIcjIbev;Q& zXbygITR+EOqkFIp^%MQ+7B_AjzPxJ-3T8y#fDDD@b8sj>1NV?B*q;7oiD2i{h0I#^80jk1n)aM-8Z?|XJ`Y-YQjE$p~iv7Rse(t$r<9O+a2}3`y6{-Wxx7|NRc^I`{;1U{wRhN)X5h?Eo_#KKDLndULUM z!ngzERK>O(y>8*1l{6bp8xHURfr4e)eYL4maJKtEtY>g8Yc4ESV*6v;QPJGp`~RzHjS*CE2D(J6TplyB5?s_ zmfP>!-)aaHSQ%3<$dinQromi{U-*8i_neh451Hs#DhVxF&j|v(O%_zK-`8V5bnM05 z_U#;P>$a#|(ip2@pJJ%!9Hj1u7cd$0>lQz_Bo3bZ;^oh?3a^XS$q|EL&Z;i=N+6?1n!rLwR-KeqzLVp@3MbHUuW82X723nVxQtuo!?d6ga6ps zA_N}D=bKZtsZ7?7@cN!RZAUKyBqO6ih^C{HliuN7#VC;O2w0VFp|)e?hit}efedxe z=DK$WCF4MVWm}iz*@&c>pC28FMX1@xPcil-&Bo1O!Ey7?XuWQ7fw#S#FEE`GM#>NY zLH`AKCSKat+Q0Z};?Yev{L_w$tlid_VvD=mJvFaxlg4izot@A1t=S z7A&?~b)eCy6{2aiCNFtHflo967vaA?01%yfi9oK?dA9K-2+8kE6yA?`K;hPl_MNOj zJXxZj8O|%c)|x%%QnBaTAjFLrdb~0#s({+mu)XvW%?~qAzgzV5rx8kJ@F^sp_+=G) z-Vpn3)*JJ&wGZuF5k8=rzPxwH)^ho|@ztacTJ~OoYoI)(ZbX3SH<<&rO%Z&I6Eoxx z-t){gV9|(^wP9a9uoI)$heh0(_S~hm zu?5MYqn@Bs`DTz9ULSxH1mFd@*JOdddveRfceOz5YqGy72SBy}r{`F*2v9nZJ^^%g zVA_;jcqlz`pvLUW>$Yv{2UnS@gmX2$jpbuXUg$LFt}0v})u#bfZ! z;)B(6za?TM6B>^b`+pzLg*$13GU~PN_h7~Yl;gey&nO`$Kq^oN;AYF1gmq%dvG2a8i|3RDi0v zcfh=-%c<|Pif;yJyTG+A;g1Laj`yc@hX4NdjqDse=G4F=5Bv#~N!$XfrPn@B*cvC5 zMp2ZTyx#J%5Nn*}1_6h6H9H7sC@emNCaWjS7u!EZbd9VK!OX)TymieDI_E!(Wul+Y zg#{N%uS@8HN(jGVhicEtgKduBVbO8BhGmuXJKy@R5YS za|*|YmLIcUmfYU=Q?L*!K_OMax_>C+a?TO0$ue0DzRl#(17LIn4INbh^A61>{T6NQ zVCfPU@wlXVPDo%0pO0@ml6+LwbK{g?JBZ2f)5`*qC&!lPOCG>)#H- zcR;KU{z;SqQKXDPK=ll@8I3v6eM#IKK@ zDeOcM6kKq%*|}M#8Z?VQE;zNC+wN59kO z?~E>rCO;g&wd4o9-rx5yZ1JTAxYN|(Y6zhz0~%ih=7KwLIz7coUac%usB}{b(DL7c zs-jE1ckY*2c5@+!T)LE!?$vSDrqHgSufBwo`@^5vrx}!MYIH7@nlaFL+1Z;nD|WiK z_;O(|o3biC1AZ+gk*TzMvn!WouNsS0IH0rpK>oNZt(ny0&Hy#^adnlUv_U)sX;_no4dqq3?iDhd(#|1sh*kGxOO;54gk)NtkdByahpGwf=;&f>tM&mcXyAz zR~g#*5*@&K#l##)7p4er%f=^p{+=^yCO|mpG%x{e!U> zZQre0_Y(WtHc!zcc5b1`P&&N#X13D7ciP*y4gqWjG^BZhF~}_3Rl*5n*|C;3Fs)yD z8x7`6oBzUWQm?&Z3DJd^>nuPol6^xGYw8OR=~v@o7dn*~6^glx*nbQ=~ zRWT#0K&h2+4e6>vRKP(!k*WZFqwrH?X_$-dLrqU4nL5pVWb7sVgx>rlE`gI5$jRrz z{2gtvE9N7So}#Yf&_ii4o?|^?Q%cyC7a=hMi^iT!Ml8Dg>sO^rXVKu0itRlc#ua3% zqEd~R^1^%0g4rx^1U<0~9b=_B68CXo7JwiFdDhAAzLkG=6m(dzF+C+vXMyuZK55{X z%>R8gK&{Crft%DViK)CdfS~btfNp30%WC7@is6~KD}N(}DK=?&*Kyp5vlC5U>6_c!hh{*i^4QzlkenUcs0nkrthTAx19|k-9_*^WUtA zAw;lIXeK}svsBm$U#-qNZ@zPHarQNFZ);$~uyar>1-Uh3dN8js{%$Flh+en*SG%dL zGNJKsi^ZfuCff9FvX$n(`_PxcbrA9lG>qU!d+L{iLg$R6iuc)!;+a>Kj(>P~PfHk^ z1tTMl1n(ZgPv`h(aiGLyECbUec)egsZ+Bj~tH{fVBHV$b!V`^9*CQV4LFu^DT;0k? zM>;Kd#-At#B3nryx8TuiNh~NAH>S$HyXp+Sk}}crFMhzxW|&eeOE4>#fIqFaD|Z2l z`AByk=aXIw4jsCt3U ze&N~V#P|qSG~;zhe(CLNoIJB!F7Z9j7)MG$eC@;W~(EGz9PL74HDW6Z!NT5ce1hjqWuc9l)97fM{ zWK)6^>c3{{{I~t>ZvU_WJ$(3nke>mEMqnVl^dq1W^mT&i9`A?aq0!yAd?o`XBp&*E zX%Su`9P!WlLZK40G^Jr7P}vtZJDv+!CX?H7ZLW5_A(z@Ow3{#S{X8?AvknO9G37C= z!y&VI7&;q)y>H0(e>7bOIF{}Eeo023tjb>TA}f23BH^`n2-&l2vXUr!lRU7<)4)wPED(n^R6q^)nL*u`{BzUWR{kPvhTg^hc*VG_kIU8 z(%t^gv(?RnHgm*&`mYiA2*SrDbpusDC{AZV9lrVVXG$;@k?ED_;R9c7vxUC~#~=^wTX<&bEOEt~-57m#lco-|!W7R8}RvKB4{dsA_J3;)?#bN$rgus{q3{1=py` zF{Tw36g2J?qxu6T*-x7~c{#Zvh8o>4v-vvtW))l_Ytk^x;mu?uAD#R0B4^gEE`b5L zp+ZNx&I{+mZV(f^wN5KA-F>}vqTM(529;`DRDAI4&r_8GHF6N?`#mvhkH&fiW+|uE z$AV-&aGl{TA6wXO=23KB6BPgUm7zf)X^_`yvmkt8nI)PO-!5%N-vja+DkQ%dF9MdH zxW^K4xmly5;~AzwfEpkUjXVu}|NeG&Pkww~^s+v#mEh9h%bJYn%rw*n^BqU)BKO%6 z3l&+DCu&kc2a;^p0$g_*6?4gqe2U4RU#ZDf=hA$W#mlDQh`t|@e!G06_Dy7}D&f@L ziZW9Q{b2r#a~&97k%wCFi&y331Zx=KDQHzN&0!LjG3 z*tPM@BdL3$OjskRJ+_p&lKz0qA#4XHwb@#@dX55?cYHxt7$#A<)twRuH}kmcHd0dWI?<~MjT-B@c!Sh@3U^C-?~!6I%PXp#GJnsq?on#_s7aS1`d&0=8s)J zRAok9Qmo~V3qh%NN~&IKT6#C16xyeJe}P>(%$^KCU&kZaW!1j3Dy_yQk6T-cFt22go72jlCpJt*E;JOFk4z%hJ_dLYj=k3E6($X6^r{8!P z8HR_+D)l5~_Jr{-Us~7Jc;Fw`EkHjaevKnuV@hI;u0A0EhIGs&EJ{Mj0|pxuy&o_; zcIF0Z(+rJWnRV-NksedfdD0b9yPFCr#<5k&=ar*__fr~}TWRk40!^LzZOWk-SFiH? zWSP+*jqMM7BJWpg>lan^1xz2NiE93w)SGYRkG4s6xPf1hHlJE!0Zx}~(SLx8z?uXrXXjw@B())G9OJWeh4{+aKs{iO;Ty(i#nRdbTj;rhmTfnSFz4__YAjQ70V-?B+y|REL+kj>*34ZmvU` z!6n&7vrPKu*5UpgI)bXTelEhHavl?gqG;`5uVTwWHj6Rpfo-&mSxM~5w8OCC#hU`T zgw2W~4jcs=o51&YJ0;4Jtj2D21QC`T4+jPUo-|h9#wrkBzni?2KX7O5)zfIr>))6d z?lK}X#7GMYri$NZKMaHf9uG<2rBU^+v$&uMwe@FbzzTp3SSV;Cj8HK&6TchlOQofo zO-g*B)GM;MX%j#&w?zroqpqWT$24Qj9xs+Th;Kwa(ZXKTU132HP0GC(30q1o)#LOa zdY0A6d!)XdQ9PtjA48yG{X&$h3f1xGExMnF4a?&oULO0?f=0_@u|}2eWx~+6)8mVNl*U?GqRPBY-J96-`9*&0cwN=@-dw&y zf8UVu+*wvjB&UT*csKB#_3>HbK(3Unpl@JER3CUO37KbFIaB~L--Gu5eDLIoA@^po z{Dp%P?ll_EQ-2P7yHJnyEo~vxS^5qaosCvVSVUWhD`N1Wv`%v5WBqGp#xi!husgk6 zwI@wdX-I}3f~?1(xqhu@sKV?*%z|@+80g|_U15$_Zj&}Ner>&?we#NO4t>Rw%rL!# z)Y0~6zRZIceJH<88HM_t)Ir zY2C%Gye0`o^TEu`Tl1Y;U>}DllR|!X{`8|U8yXw8TE)qPf|W~#ZWMC;bh?NOg0{{JDz6fav_}oMh z4W{|0-DOwQfcjd-K54CTvbdY13tJjlOr;)Y)dAG};sqZCvY=GQg6=4aq_^bK#|_DY zCPIxzetY{WZIc>WG6Xq&=Tr=Qh?~rWDkm*g5B<1A9xpwtN|Wz#JM`$#;Q!^RL!|$} zx@272ZMeFI_IpD)lp=Q>tb)ugVDi`xls<`HNnW1!f_w}bl1FQts1X0{`SuHJjyxL52$yZ{{? z-TdV_3&}!-O6y`3inx}rt4Ta#&&q9XuvrLWUX==^sj!^uJV!Z8yRf@l-nxio`KICC zp1tyrqwzDFv&vP|3-3xEmy8G+hTN57LO({>Ta{fH2zY_xEozTnW&;*!k(xj7%SCKKP+K zK0V#h(SZ*MIz$yj?VFz%bd}d}`Uz;69E}56h~`3`lG@kZEyAp`2-+i0WTm__*G})n5exqtoL8%ll4S8{B#K7Zm%D z(zrL=-J&se_U@8?|NZ7XtzOy4$b+%@Ws2|c-$3=)&`FU>7gefbSm)+;s7I(J+dS^GBi@(sPckKO61 z;4n=+aXz?so#$TG1zM=(;0NTA&p?0ML9T}0B2kUa>PBncmFn?x{rPL&Z!ZvW>x+9k zZIj~Od-tvO1+5~56g^4IWT|5*SNd1`oF*yJE6{(SA%~Bo^=~6aDlz)vZ8ja1b25NP z6;#>1$7te!=6Et2!89qx{eb#nY$4|f?VDnoCQNrc^dmEURf2xmmH2Uze~n69-#x-q zEbnsqexfKX@$*0Eub15wsfs3u?y*5*c;rg%#IXq%&LjkEjibGdlZSP#Jk%To2f25Y z`U_y!bkh)6U%DEYm#IMmRxzPgiwSOI^m9{=wU+0ZCWV4uaTv{6Qx$UEHh$x+e#A4i zz0=ZhF;HVlP;4)4j2;gM`XB25Jy0A8VjF`dwwTFx{e@?42deVnNe>^1xjf3 z1V*0r^~QXG9``fd{w%^YrxT-#Ao|dg_3{P9-^H9yY8Zqx*lc>Vd z@xV=YW2&}c>M2@DvM8ZbD_6z-0!oS&)5dYdFKuo7PeUE13A_maOB4W`opD(4y;7hJ?fn1)R#Qx9akUsT54vd@9s+!K{ zM4!n%kF%3$*a~feKgVbmWU%0uonzLm-JW~sL8r^gc$4lqW^YS`(r*;zl&6;#=#s*S z4LQZ`c0*=J2_vW5ry*e}kpuseXH6CS#C>^+?n+NoMmfAqm)s?!?iUS56q{@`ZSTm> zZA=#_uvpxfIcTuFWec;SZ>L^gW8A0F5z)!JuGg}->;vp%MDYhMD44}+nVGv27uI?5 z2!SC;#rv~lqVCT;paQ~(f!VoW6bi(YDqp<{f$1-1!lx=lPn+wbJNiXO=(iE1vGy>s7BcdWG2`ocbl6h!tk7xX@{i{6hlQMn zJfEsw0V1?&y}y`f7f#_r?hn z0f0FH6k&2Nw!1&}tcdiMwFKEem=+b^o+Z?#PKyKH)8%+&qz@-)QagH&_|rBw9W$tH zxPjjcB6A7@+nbwA(U9?+L;PAHJS30SnFZ^wvi7@ zTqe!+i6x)NCrNGZ;P4MAR6jqk0J)TR2EFrh5+I8KIZaZc*ZMD$_;5~(`PG_+;IVG@ zpcZrUZb}ryCxuVqO)QbQhJLcDPc5incmjNdE(5)(ztqNL9gmHCBrUBZ-0iQjxsl4t zQAY%j1{q}tZ?rL?W$OBdbqOhZiT?fHBcrJJ5Pj(?elv)HC+pqL zK+8CmoRf=@{`0e*MO3uz)(W5QrSR@(+OM@4q||YGU!oqb+q}6?l%9TM>RyPqa!k9g zFQZ*u%$243x`s|m)f-KNW>BF}^SVGvUAdZKS(I<<75^PrHLJ8EjdSTMtX5;WSO(rF z+kU~!*CjJWU6_?P9m3EU7NPF?O&(4llLPjwpl!{HP24XgcUShG)fW0BR5hCvSN+v8Y<>J!5}T$R*(Zu+TKY z`7z#X`Y!-k%IB82ELDCbj&rum4w$&4CQBzxLZpDsMd+=^gdr!*ig=KD%7$9lFQ~{^ zNIR3^K?$YUI@yn*SXT2+F=V@dVdc@Q^7*@OMsdYEaC;Ixwzk%5`|7n>R)U$>t;J`; zIdZR-ebhmg8HU#pcHKYMNAP3?A6DMT0)x`a#5Vw4SXH*6Cmd@#Qpq-~)j|FzL<{mm z7^y$Y(pJ@@zi5A-05!yAnIp>w7u<9-%S?z+(C`y&Hd2i%*6R*d#SriF+Zw6%V2uww zJU*BVEnw-fJiG#Lh>o2J3K%{3w(;BaS-H4MDyxW>{Koeiu|gXeCnk-qXw60UiJ`@> znW8!?7u_eG9aN8yDzbG=@zuRl&Zg8?F3~Y?zS*km$(~Skl*fg|n(oH99j_T$rb|u`qx?y)DOpgbQ*>5KCS9AhJHe65 zI{_0U$o*#_1cgEf3PVB=6Dwk+2BO3@HNWBOqbe6Xxo)7j11g;+h=MpTHH&u#DJY#k zRIv}L$1QM-perod^mt(L`1b3OYV?>5nk7@7Ju@P$amt58-`OONBCe>=L;q`yun|n` z7VGht2J%xgr%^B0#s5KB)kY{NMZ~55FjAc69#B_(B;22%;6za7_sz$7{qe{)>s~W2 zX6I1ku}G!{7zmvEXRE1LG~5D$!C*BFTMLG{yB7t4sRaHDWg?L*QGYl8zx zTrS|X2ap@+^diwVFHSbHp`n5FgtQ&X)0R_GEe(Px0sJsNXe&ETgZi?$*EfI{{XzMF z%+?|5Tts~3o}|E|`Z(1H>Vcy90AY$7UHCI+CNVX7G8y@g$)&v|6BOAQG>?`gJq_~x zT1{A%vNRKRjAZkeqOFzR5~fYv{JHmzk*yG|2e@8%YVyLb$sb*;4i;_reQVOmg%hP* z#S5`}a+d_TEGGHV4`F~8-Up0G-9YjYypve@*+%}K3-Iwcic$JhfTx`E#&8UH1soowmGx|~>uB6EFg zC-R55D>`GAm|I3FCt&IvQe?z?RF5m|ng*RbJTCa%@jQJEK;_>k-OJ zE`|)$b!@M57w`|@*Fh+vm+`v@9pU!5xjBLZyV=>Qidh6e>Lh!==l?zo2*vNVI_PY% zAdU~2g29_euVRc~qhB5S!P`kgqIJa)iUcfgUoP&3M%!9Awde3-NsArrJZWBvW zqix9@h{}&(>i}OTcr9q+!&w352@CQ4&MV+zj*w3vg9aHgpaTIeAbACYKT&{@hlu}F zc`bIW1bhSm{`vje`!4+jj3GE2fr&cw&k!;X3^BqQHEs?xg>{AyBH*WNp}5-|UiqE( zv3`xRRrJc+&rb?~4$X*WE`MHZIZwep#?-;bds~CWvJE|x>hyaIA0IRHDOGjhq9`^J{-|khFdZ#+&6&bG{Nq?XxIO& z1z>EmfUTRTN&+UPKhA+EQY;Y**JF+x?-G!)-qyZ&IZdU5FlLopxBB{Ind%UmMnbSH zCWyKvM?vlFl_?#Lr0ZEqAGDJcKG`jnm^Y70EqkY6QCq6Vo|6QA6_Z2Ol9|)H%Z>Mm z&wDLOV%orKz`;byioZII2kt%+M(J>f&JLgLE)GQJSuxMT1K$hf`F^HOjf2ZlIJ0QjfmKA0uZBBrfyH1>wFq=cn{35t zEyby)<*u8sh(@HU2bY+uv>Dm_E=Yx$dc-;c>#!ZyVznuB5Eig@$_4f=~tF7pZqoIGdzz*PtIJqSCScfZrl@hn54%6dUcG1R zD%7hy;#v9HHnqy6^QuDO5?FC^?{4`y_!Y^wd%)#q1r7{Qqerq#Ha(z&24+J5Nt!1< zxODg&ET(J$6^|CuLP>UL5wqy z?~ak5j{iYwgUC376*jb}Zr3@(7;sy-H5uNOB$X={&ry?v!7VRrIlk^~#hPBv0q+aY z5@ZX%L+0c58}eAZfun?I(!%Zem*LtXR41aR_X*y&;-W11($QA16*_HD8}QU-T0bK7 z!7@<%hb7Z@eGzJ(7$UXvNu>GAeUc-Cou<{*A&be4XKECReWSP?G{$JlX9q79f`24> z^KP4Ltkx@`HSj9p#tL&vEiU3}n~01Yrz!mSWsLb*Biu{!2_BxGm^V2%pZC;t#|q9Q z(Eh-`97wi6{sZnSc(fvnR0vcc+wNdd@&zaTRAjb=+5*q~#=xry9++b-gVFhn_t9Hm z7c?DfS~|M6qrlR+M|JKjo}9Twxvc)od;;<5>AZ}Hej^2?+t~mgK`e8o2Hotr;ATCv zzUhnHhS?mw7n8A=ZyMVLZEC8iSIJogK9ygm9TRcY&md1+_<4x!vW|Y~Ao28$aMw<~ zO7KWULB59i3C~ms%SWp-;YnHz_*nkqtg#Yw+)+>QIcPPcF$Nujl1eV{yuebljyejY zpMk}MY+UF8!KSPBfWF(y^74*9t}50IjIq3P%a>DnklYT|0S>BnwqY`qBOo0o$kOYy zzIOz{3O+D0;1AaZQZoaN@qn7i4T=#;q-G9~cLf(T_#I&wv0Z0~#_M{)%?CysK8(8< zoOuFqrqAUS%EvkZGGqgnhsTPGRC>HoYMSEbe}a)?n#qcEg+AEgd)R|UlV=g{3%E&O zU;*k705#w~xy><9uosV3D>`3EUrc_vy!)ff`Ct?jUei58jv%|VTh^Fz|30A9(w@IB z_YU;^-C%Nrp(vt%`*9Z8j}VeH1Gg{0O>~YTr<8;N=y=N|SvdSN006A~z1zcQ3Y4jQQwFRHDj{aaA_+ zy~|xgW=JIN#hx8S@V7!F%s!K+Hgze4#{^=8R8YDT05uPwyxQO!cx6fs_ zVZQmF5FmbK>2*$=GaX#9B{v^aP?$fHDV!}jG!{#ULMz6ssRS8*ajg4V<<2=Xz_%Mz zoRhs;bf_@&w9oe5`VTK%mg3cK4Xg^vmh|y0yY)1V?*hFqRHI+oT<5|>lUs1)ea-w> zjn*##XaQ0fh?%z|YP7DT`soAlpsj9fwLMo#dBH@!bZ@X+gch1<4`$7(f2rKm#MIDH z60c$F;QBWA^_^HU^7HXI4TKSGU@iDk5A&BAL!eJuV##yIA>}gDkY2goB@fjElx1YJ zZBqQR;;_ibbE+NypaHc5n&Ax2HK7y&GFKxEf%TU3pKsZk$%5a#ta;a`H!%*T80Il07VO4k=aQRvPfLl8f7r)lISb>Z(6z~&w zaj8r7p^X}PuXIl}%x9-bAizLM*7y7mj(kVOq_}e|aS2`4mXWOQ4J~D$_X^>I#)H4L7V)Z7Fp>o_ zjGnZfMRz2Q19S{o6Tnrz%O>p!k!)Q#86E~e9>^;U4fKA<2+1?(`0o>58-*Z#_4Lp@ zp8FWjy8o-_S_~){0#_VJ(uQ1;Ol`!+)@BCcv`V7(cFa9?~5uk zicPgy1zqu{Pr4=?55=UUqM(#!&FGs0rwnK^`SJWRkYax1W`$D`KTK7>`75tr*Z~qJ z-OIJT|3yFW{xYjF#~2Fe(>vdG=+Y%U0(W1|N05>s(j|=t=Kem?LI1v0v=Y;UkvBhI zzkbbgExIj?jc-gWzlsVih{yB=ZKslJLQ(iF$fZPx_Djj;F!n`xSIpaGJni@?%u`T+HNU`HLGRLH=GhaJNi^@2O}d zX(h=k>cF(gs)@}Q*WRNaplAZ(eL#o;DykwGUcK)QJ2EERU^yw4l^sdDcVC#cef#62 z>zxwE^tn4+NtM;rmM20CuN3Awtvm>Q0Mb0wpLwmJqTdz}3T2o}D1sa?B3Ui4R(>9D zK4b!h28=Rw2lDi|J&sAfSc`{|Z)*tsarxEIxc><^mMWQz=Cw*KK@d6H*d0ae2Lf55 zG^}j$yf}ZxCsK5RUcC=JR#X3Y{FAai217}llmz2~|{6lXUX;~6vBYil7LZ%X+a+?QAP34BXdjI_pbA57FPLB(d z5?0#h_tE!Zu_2`N=V@P*rXt(p;nZfq42ozy$c27XbR?EbM$%n5Pm22ZIcu0OotnO! z{tsdEWJlwRHpf_9D}?eno7_sn4};r+j^+6e3PUih+;ituX`>!eS%mQ)RuKOJ*J%J7w%djAuC@KTAeS`n-D=-CuJ^zKM`+L^95=>$I2AkMwo=_T1Mks97@la-n$o zWItZ(S_am(^jch=Fc$!fu+P^ZZZi{ZtSrNskUIsU7zF~r*j=Gw?889dZz0wzv};{M zZ2Y42rA1Ms&a!_*e3A;@_%%9n#dpZPh|f~EDaGc6UzqVm^JcU{q&7+VOu=I=j+ zK!k2VN5i>dxjNp}b+qXHhO2AnNO^{FPi2pQ+W%8fl_mh+7646wN(1l&f(FO{Zec)5 z*|1Iq~ua!%I)tKuqIr!1pW5z0wMj z-Z8MdA&uHu*Duuv3JwT_ytT#NP*ibs5kh+5l}EXZ(lJfuOSBac6He*33XiPh>Nd$G zO8n>v0|75W^!2A-Y|d`s{O{Qj(gPyAAEjho%uR^PEZ=Ki0Yyi25GS^4D$%z;d12r? z!SKbvz?H4y>kYDe>+a|-aQ78G_ffy#qDrfB;=T~}H6b~+7>$jvj>g+Q{uK`LEIp&S zKR}tns?eLQvgBP^dAX&P6|3z}P%wgD`#TW7%3Tu%+2hsmcViXvs3+znliIfJq_5p6 z%6v|%DnHlf&Jp1N-Y)^2NO#Ew2Nx|^P2?AuWTb!Jn>H`j{lP(z<=U>kD?`AgWBRFFYU!&lQ zxg2i$woTD+l~?se)thntg#{QkvvbL8DapxTMM(Zk(yQAp98zz>(f3o3f$(?_2#KTR8eVSpHf!EgSWqzO;}*v^hL7+igZ5_7#)RO%i^_3;m0RwJFc z0&N;%S6<2}#b9B@;8pXKY?60NPAm7KT0f33Q^+<_o}{oD>93D7V1gB1$@E0>yw}Nu zloUL(Tfm172-g5Y0TotF-Kx{BV(itb)l2;0gB6@SzStu*3gtmh;ILJ_dUc^Egf$Iq zWHV-W@up~MX6Ia%dpRN&1&~_*GYMpf2_{Y+CNfEp#%W$W-7xzx`!Gu!1sMS1^E5s& zA$K+971}rXAjoGq-`r6!EU)IYL_W%PQMyl}p za=7!U1Y9?N)Xfcy7AeZNG3y_`wtvC#$;t>@cmnDZA&nB~cT>)E+B$y?$ncWmfC~ar z770Yk_HU=keLpMH`;vYaP%RpU{qN1F&)uNd=R7Yl*$?E#FPA{iTx`#gr9tOcKx$|d^3N|RbFKF~oUT&%JOL@HYFoC$f zrAj3gmC91UxsRq3E>HN$Pv!;O-OtI%$}6116RCI^xGyYM(u*m#_5ye#=(~tVxy^3L zX4g4?0I(S5eMS?n7mhhmT#JbF)+$Nw9CJEzMl}kxHaRf?Vbpb3c=2Psm{`}{EgCH=>wM+JP<6cu;RSe71tXv4j`^-KBFjivsVXzkozvDGhDO7#8>Ze zJ>M>5%}U%~d4^g4smB)MMj9OeuPx>>-3C#D9PiOOQCGoNOm{g(6vx$GvghfF=NJ6w z1hQ=(wXYR=TuTCwd;u_0<*bTuse7xrSXH5k1n=P$(%;*Q82urpXV80jfCcg z&uU4`OC)`ZS12heg)7(2jsR-Z*V=k&19lGaC6qnbXPOw??%k~bTJIi3T(fJHx4Sc8 zwgl-m0;bs8+Z!;##6U_)`tPtY5o*dFprM<0vi$Ib0JvShgNlkG+4#@fo;5!(f~+y2 zZ!$;W)8lM4_A+6kVm(x|C1dWD>Xvz0#}aKy;rUV)#otD)FKxBG8gP@Fd7rLBUjq1`fQhE`DB6Rmp|`g; zL{_L`Dr;+Pmi_{^-HDc42vB4Hqsw4boUkASZ4Q|JA(i<>7Rw-I>%TTT>$dqXYa-~d zlii_#R?u>mKMC|f6qyaZ^ZfE&UBS>oXFZo+P*)0*>Pq5gZ2nUQgW3=eUVg*xJ2k*+Bc^h&AJfNaMQ}x^O}HwXO@qxEb_f9E&~Sy|1{UP}?q?8vYpYTh2JArD@ioyMsgb23pP!xML3 zAVlCxFteFs{Tl!<)7t4UfV8Zz^zMi*(v#U}SdO;V-ePfpTjjS5CcQrkoim8H&rBHY z11uQf40ZT{nkQF^E*dn~DbYk*_KwdT>0PqIBr0fNsC)9EmaB7~s%}U`yYNtLb7yK~ zUM!w)ft(O&O9Ji% zpn&J*wJT7H2_Rq?tmzyuBEavhz2eT1NN7k-+M0-2Fc+jq^Gu$hY@>7(Re*#ys`L&HzStWF8*bOPO=_-EwPMX(U3&X=O`fwy6V^3S#@*)z@VfaWL z-BrI{xVfWdRBfV5jDZ!9&6a>!&9Y9H?czz|W4tvlohs1bM0~15LHL0TI5?+pu;2H~ zNZ$PW6g>U8uZ6^CWHn&{eRlf9Aoi=-ut?~9kRINjs`0mVfXN5ohS6OZu@_e3)rm{R zlJ~n)C8 z!gPfhfjKF57*Zqum$(hOft-a&y(C;!TGCL+d%f80R3F<|fQ%uO(OsrxE&7SpH|-8e|1 zLUEpiX<*TPDaz8G>sYH};D;>n*9DV=SqeP_!8} zR32>Fv^oj3$+@9|8e4^i?5mw>9_X}N8rjp{?YXLq6~t;J-|SheUXSq(O9oW!jc`iY z*eVT^9<6-}jd)5yiuww)dibw-|rcqvuQuuGY@4VGHnVzs; zY1)@9BVtPuuoq!;Hw}CcEiaeTUQxBt=wuVP_7Xgk;q&|KP2J~B4|ar%d`;(_*D594 zW<0M$RwuuF5u8(AjAO-q=N@)A`_AAbt0U0tR->5`fD*FVVnZFZ9=VU`KICM+&}*xo zfpc{9-)V9akbmk%1aXz>P5?P5KL8H=Po-6l5mohQM(wAaFP7^<7v5WPBZGw_rP+GC zkFg5tl_QsD(NEBp0H6Xj-=%Sv5;7y8pr{$mQy0Qr05D!-V+@=mR)1-xop<(Gx8yPU zQISj$=q}c=xzM_4Xum)+?{h;J$)Km?y+swQYM&k~G{PK86S8xKJ(z*|HalDO_h0l^ zibW6@=%N-rh0##h^1u(a^7H$m;)uQw-3)*}Wil-u4(PpqS@-U}e^ZlMsF$KkfyX9G zg}l)bWvRdeBU{F0fRN1fiOnFE*g&@{;03^Yfb0Z&UBHEU?7!xV0{6uwhY!;R zXI4CWZ*+VoF7bxcHdk1AgPJ{~XHhN5iomYQQ25L>f>1Y@iH->m1;7+QDM;S}iU=UZflP9|xc4JLi)%3E|K?_U zsUDZnjvTbQJ$ASwS)9}$d4mp5E~nw4HP^LQeTJ>pBWL4a9tr3N2-yHmcngv<5}eLk z_)H2({~oup7tKJ#av*2nA@ug}7}m>%)?iq46{*_H@}z2s%38DMJg;(F>TA+wm4rW* z6K;?Nfcq+xlF%*)r`atkLQ+yFZxE=5HStBSz(WufU&p>tqYXFbG9|;KTu>>{kYbcr zc*b@+*&?9}4H=SgnE{VewBsbGoj}F_vm=(&p_f6cz!k1hBo0A~?#(r^2`C@x{sEzT z#4zZDNIr-7HO2xl1OROaq4~oOLX95HqEcjO3Ke+))by$@`T*JYg)T6=V#Q*7wEm9m zuAbsWaLq659E{)Xf~yhc1Z|LvHqZu804tfE^k?EQRL>(7t$r5O+e;dqL7DoLlvy;l zc+_zgfW+GChJIZyVzosU_K;!>3I@a-kmu^v>1;a4RkoxM<`X31kzjZ+3kFs`FgXZw zO~5jJ*<0V(c#oV!t@l>;n7wedr=OxF;83cib`eh%)Ce43NgI_JApQ|`(|*XB%8}s} z=2xMO!H1#C`tEhHOJy*;px|`xUSFb=`Q%yJoAF)>SYm9@mZUgi1e*~Be}_2?DuRR5 zC1`{|vH)DUHyDhTuS}OU1?U$e9IYFqGLH`q4*Ua@WB}N?avJXImrtu*2+?1hDvXR} zhWBZ-Thy*X4kBF!Yjcho^wOuK*kd9fFruSo}kfQ35d=(*(WW_MeN~JLlngk1G8}3l12N143*#k3#sJfOMCR z3VOvA|AAR*5Yu*a><*_Ui1zpKkv9Byj+(xCWFOH32My75f&$@7Y_CrIVC< zKL(EIbt*e5hS5*0=Xc-XrTiJ!blxHiu!|{1%*CX?h;FgFL11Yi{rCW zkODeQBHTCJ`Nb{?czd~1pgfwy-62|bhPrq-TLa_zseZ@ZpGUK<_6t#FVj$eZl@yt_ z3-8;?FI=E@sTqhj=S-+Wk%@O?{s~0Fk35EH@^~swqF>~AP) z9)bP3=t(%EP_k9=J2zMHOG2?0#&Gf20QmxdKs@jp4d<|gClWecs46~aHY3j0&Yv9Q;c0-CbAO+l3jW<|;Cp>v5u zvDq-D4p1xD9OK=F+b#Uxb==f4H^&0)+z9YBFnJ$1MGWnSFM~hfy9ZVPR5{Ic*Z`z9 z5U6xJ*tW?ygCR8ne6-g1CSZn3ONBR;QT!~5m!u8utO9(Ux;f4Dj*x2u}~-8aD#@Cgvd| zh(WF}XRv^TQ+SyWH?e2Y@W2JGc~Cn*mM8C1c+%hf>ARwItd_mvFj-9aVG!S4Q&Tg8 z<@KvqRuh)QDeCMA2IbaS)H|)p^{JU1J~8~n_g=FraSJFU=jAB(re5}j3lx#FhsN9oP8pUY#~tRqrPlO#NhW9p-GT0yCFQD93pdms;F3bd~L z`MW;l@0z&SvbVMAO!5{Z+J)bG`H?vx5n320n3+OR?mt$Yg2>EHZQ~#Nk!MSLt)dD% z2a8o?24%qjob{fzmhJN)a&o!FvjVkTbGldL3-oX#67GslJht{2Z`?a(-SoagX_o`IAzJbBq&cWJK>)3mW?|Vn`iA-~}K4t~ut#R|Je>=0L z-rcAF+%_|{xKUYEl~qV60genXO|$Krc3IqMIHMyzUb^>Ze=EPBpz7XNQCK4Rn>U|K z9oTU3_XZ~04m%6EFKzi$^7NFK@IR^MrJ8;_<*cKtyWUL%lP@!yoy$8DvwiE%<-PV2 zhc>v`E7WJ!xTX6JMTIQ!$92;R_1`a2Y6u7jc&>hqdG?I{+<*UFYEzJ;c_KjGFc(8D z5F8qc@6TXhYRd5FdNbo$p_?z4A{B*3;kr@Q*H4;Sa8WF2o#prP@)FO~z$PTz=6$|* z5P*k^AREK+;1JC6` zJlpe?Ir910Ss3I417$&@?#&xX`5dxjn+ZB+|3)+aH`j_Alr!$632+b9zd-d{(yqD^2Z?nHrQ?|>e^s}yaY~@(OMt? zV^S~D0xOi!^8D2Kg@vK6;%dgm>Bsa!!M3l(1@mqfa?aFz&)7D&(1vn!a#}BCRww%p zKjgQYTDZ_^TW`8x#h9vr0p)|E-)v%Hx8M)Epo{!rtbBZNU%nW7Z%kr*eI-UmM}6Qu zyDMJ5{_H#;Cf7S+AuKBT<<@m}4vzUPpPxR`Wr~ApK`P41l_5~aXUg1k3^tUP4`!(8 zl@xx3zqTMF)OX1L%7B-iBms++cXqxCv~+7*+b=B|3X&Y~HCMDkiD`mujMm1hLO{LP z--+c_cvDVJ%ZVgAJAO~~i;9Y(H*eBi#qYXEW<7m+ou9hq_HN&c6r*dD7cN*))n!Su z*uJ(_QBytYZ2cfeM#Q1j*wK;8$jE46X$c!2pTo?~a?XlnXp5LZa%B2F zK!dPq>gq8Je#W6W>FKnzbaY!j(%#hnJ(1VDb!&KJ#Ck6%jsFsSm-f9v`qzuERoN>= z;Jt5ON!zt5RO-c(^Z1jRO8w4^4=k@u{MT#YkNNVID?)j>5ZNp`7z`1rprAm{z~D>m zMcdnXiHR5e;~(nkCN%ODjIGxCxAi_j6$ZBANeuJaD%Plpr5RZ*c}lK(IoR^43h6s4 zwyUK6R;$XQ&`=pBG#meAi`FO$&vqsmNed`A=evrk7 z5;nfsm7M2re*c%Os*2pws$~{cCv_o=b;&*Rjq+Q;M|bBtVt#vL3J-IOizCeW?OiCd z($iH^u9~`v)BpahSV(fFa+SSz?t$)SKXiMWrZ$xe)pG1Z-mXaPi8I;iUOD zCKFl0sP_9A&3pImm8!qJT`u5cbk0ffH3bC)9EHd7mvJAV^!4>0f3SEvKC0#d>9Fpd zJDPXzzGRq2&QW)FZe`_DkafB8{x*v{+feWmk}H3E_`15gEL8uVjBHM+wpD-sJ9UER z6rzPXJACfr8;Ph3UL0%7paE)lvikneb-i}<;-yDl&x=h~>dL8=pM%{SO)oLD@l)`Y z3e=QCwNAI-4gPPz#*{2e#+%gf_QqQzOsqJnDRT zUg(x(I`ij>JJ%wkqAs<4Xo%Lyjfgs{eYu*zgZm;PBHlz>4X|&&Qq}GspBU_=ZSwZy!dv$( z+Za*)1zpy)y?OZo^?o&rmm#!&MsJ~a*Lz;SlO}oCNX6ZU`(OAO!60elV{aL$rqO`SpV--N8=w-^oI&3ggd;Iw8KGT|AmTzb$qd##_7^C0Erm1%X zgYWv?+rr6z6JR|is%`#r8Y^F{>SVOq{V_@v;OuUjUbxn*xHi?pAt7OM-->ZJ#DT<$ zgqhs_@b8^7>gt__jee+Cwxd7$rG5^n4!*rl+G?RR(r=pIxVtfx0k>0kPmhH6T56+N zuV+}Ay8-vz34fLJYb@ZY0rY&nX0co9>4Abm1rEXET~301>#(KkzN%N4HGUiz;DB%o za#y@-z4rG&Q%6S!p-H7(dnjvTV`G@y4&t$z8X6j< zGws0p^aXM{?3CU#p)j*XKb%U>6&+-9+T<#g$5QWXf~KrRcOoZBEn7Adz`v@8e*=?w zZ+F0Y`mUDM{X7Ubb(#v0MVK2vt!S8!l?soDXj$IT*3xP|+I&9{_wbJuOkTFQ1n$rU z9`xKX`#JFN>%BTR_4#V=$L_ z%MNCI9z1B2IY&lCW#^)8{hHsg!InorAbx+}$NxBm(@~^_S5)-#2Axox2=pz$3HT)s zJ}IM`g+)&AxNoZL14-al*|t6=x;t4P?<(H=cC)DmKo4K|0yyF7{M zAO~m4>mntkW6d{d-$t{*qpvgDfRR_)e`4|1_4!cEW80VB4!l?uIk`uTwq1WVo=e#K zOEVt+Uhjdoz%i_`k7sb!;9z4r+q@AYq|Z)7M1;Z%krNaY43CMi`MoxQ@)j3c1>T|< zBCPTv8-^u*LS>RjBV;>1`~@b}7Z+3REP?p$t}lZV^kmm28-`Ds7X2%o#;(GY&PSM2 z>4XFGHK3PMxA5nW(h5PB>330*ViGb>s!H4L@2y*%bWZ%4VS7sbNbn(zjg7>}2zsz~ zHAOu0@bT45CAiVyL$`HyeqC))(=MG@`}*q%WCXZ1Uz7x|UhNMory-Aui>td~=;tTt zTu0Ya9Uc{x2Vv&d>R22(t0KR7Gs-_-{fje1oZe>=3DDUTa-I~Qo1aH^)K({x-Nt0Y zZ^~Oe$-GXNgdygpNqDdW013}pY1w{G6#D8X$43)&E=(&cE58YC_^B75inSdpH|@>7 z_P1u)4Zgd8$C8@COGBLI2YXYUZ@gBo@bWH#ysXW^_98Kp>@x_wz<8p6e$aYG$kH?C zWWV!TwM`FYGLKQKQ$=IPP=RU#U>7t}-aG(LTEZ2x?DdY$<3VfZxC``&aHxDND$fEytFn zD2j2AV(f7&krA3KLrR1Zlk8+Sc1PL9jPHKGbA5k&*Y*AL`DdQD%!&mRT@MQi3eJQaJ9kCt6plSyi>a(Ph@okkWIY??MVOm& z4LaxO{KmCMvVNm(8UIVpHslvyd3pKzv3Jv?Q%=6Wf@dcN%}xtT&%96OVW{Vwr71{m zZZiLMeBxB8=e^>4H*w_g=`_!Lz*r<8T?*U>lyh&dbf80hGW+4+)MH1Eu-Wz6K$w9` zNx3{)A0i))VnoA~@fV~GxCf^7f27~l_hKP$eSZ6TW(?f019v267|PHo-)E}( ztL&gN#+Q#zl-rnUAsWDcE0a%t+RqbgjYFJ*5Y?~6p zY`F;^M0v(V?M_5QNV^0lr0IF>hL$|xxWvcz&CFChU8g|ap@kbHWTE&3XeJcq$%uG6 z&m-K|CY=??K>;o`$m-FhlK|IdN9xqDSS*5-=eT)svH7y!!xfdbw|dI{FtN!XkJNd{ zE0CJ0KbaD~CpD8wqZi6HaGA-UcBiL}aT(+pD)mBIhT)qc$uG___qM=rMl!RoCZwlx z1uGc1xJtISr1E*x-Ef4+qmKDq+Z0++F&ROszO&Z=Wi8HeJ$?pO!w2qLlNOqGiFNtglLuwjEE??+v`%pUny`7oABItb;gCFBG&vj)1a*Oa1+RoZ zA0LnW`0@S%4OJWPVDha)QBiSAKPl5lLc(`nDf6S;PZ8Z)Tteq#x^l1lnUth$V!{hn zZ2f00RYc)va2jja^ENEBaM(NrkMD@#IVGUtl~r`MlnKf=D2HuRG6i76M4)vSlD0yd zhXB`!oZdgj`0_;;!neW23(QOJCJrJzu>bN%2d7M}-RKBGFl?kY@U_KSuHTSe*SL&x zf$Vo?^XsCSVHu4b$~A%8E;6I^rIX|1iH0F|ybhxY23w6RrkBw-AFv6qM->&FH53|zKJz!>r0z+W=KkR zxA8O?ucspH1eK(uZoXm4>|{G1UvGd{O=deDobbCQJ?X$vr4`tx76mDg6)qGpCcq!w zED7V(#vew!&v9Gis=GU1 zirFXJDZ!s}Q(|(fvYh;;JJAEsKh`gxHzQ8;;VqyRr&(sZodn zgmWcybae^6k1Fqu2N11b9L84fUo|w$2WxKS)1ipi(%RZuld4OJv#VRd2)2UlL_Tfj zs^55xUE-IvYN^{8X@hKqMTy!%lLBKaE3O70t@Zu<6u(~JqXWWChqM!UFvWn51_sO2AR-RPNc(-8A7Bj)%=cmM9f*&*Dre^!S!hRB^#v= ziyz)faWg0jWFGyJjvEI)b=`V`CeR~2^Qz!k&8#4C$Bx@@# zOh2sJY4^q|a3*UO=1@ujs!`8311-`B z2#E-b@~eN;t$zrnl%P7E(!k6EAd!sm;|6GQ1c+#MNH?7!t1UZ#-z>2rCIZg^lvH6! zi350Fgn@v#f%OhUokkBuATcmK$kLD}iLL~Gc>*SJvb1Jt9IDpOWJezx&j?z=EY4R| zhHGLl{iPQ%M8PmX!BUo0ac~}rv5}FzXPX&7qsoaYXP6tj&?YtyIk8*~rj)cly6Ia_ zPk$_}fqxE0%U&PY-(ThWOVieAw<{LY+&a)5XKP{cWofu3 zaHWwg_m81<*VW~#(g7@_52-P}t`K1&&6gqV9Ab+9{M+^G{B+tz0SK&-h8oXf>%!mm zGcoP^prd`!l+``@G|+c|&=B5*Ld`2FiGv6RLIUT2#K$pKt_V#+eU+Ej=hh6^%*|F# z41EuChnW<^o{*NN7aCe0(Pt*b&E9uIJ440$L%k5;6;$k711A5~ur1A4aiy*2qP@Ph zw(3JbVrBj^-yt-C0lqLL$HK~m@T8s_z4fLCcJBFI6X4~+8QKHZ_IIlvT`qtj04$S< zz!bOdQdz_<4GC%*dJ)XQH46(}06a*!{F$}YufL(>Za2rB%?Y2#q!C7-g8)QT>VGv_{ zg`nDllsO@4Kd%_5M1@nwIGq3R3UmOZJ&Q__PE#h)9wdQ>Nzz!?VBEf zACcbNg8p=u`@WR*C&=51RF8JY4}P8@ggDd84D<5ewJa3Mio!44DTT%75);QC$NCu` z;i?>zQ~2ZlY}dKM;b&)%@u)UbkgtN*E)3g#svyz!wz*E^lyknJdfKiuCuW;++P>8fjtiV?t2mPWw_H~ z4kZ4Yjivp9d~19AY1n@@P;e6Iu7H8b6A%+^9HOT&R}aJD!~eK6s)?41ZVGQ2yR+Pc z{M<@Tf5aueJr^ejZN`ba_R3CssXz*qkRV7tuK1-OpIiJ;?mz0VHtDNcR_pR5#iziq zz)2INY;tbOSJiSKA$GsxVwH$-+X*Lg{%F+kW`Yzg40m;J17kO(6VV`IcWV1B!jo3a zxyYMAaS7JG0tzx7)B2Xr;wpD+{w=4fiIj)sDa;F#C;YRsORSYSJOd9oMYZoOPsuib zUgzbiP#R2vdMw}S3AhC&iUq&m)u6=mwRZ9$PftvDQ7Us}ujw=2.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.8.1)\n", + "Requirement already satisfied: cycler>=0.10 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (0.10.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (1.3.1)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.4.7)\n", + "Requirement already satisfied: pillow>=6.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (8.1.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.3.3)\n", + "Requirement already satisfied: ipython>=4.0.0; python_version >= \"3.3\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (7.16.1)\n", + "Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.5.1)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.4.3)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.1.2)\n", + "Requirement already satisfied: six in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.15.0)\n", + "Requirement already satisfied: ipydatawidgets>=4.0.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (4.2.0)\n", + "Requirement already satisfied: scipy in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.5.4)\n", + "Requirement already satisfied: zstandard in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.15.1)\n", + "Requirement already satisfied: colorcet in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (2.0.6)\n", + "Requirement already satisfied: decorator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from traitlets>=4.3.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.4.2)\n", + "Requirement already satisfied: ipython-genutils in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from traitlets>=4.3.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.0.14)\n", + "Requirement already satisfied: pickleshare in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.5)\n", + "Requirement already satisfied: pexpect; sys_platform != \"win32\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.8.0)\n", + "Requirement already satisfied: setuptools>=18.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (46.0.0)\n", + "Requirement already satisfied: pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.7.4)\n", + "Requirement already satisfied: backcall in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", + "Requirement already satisfied: jedi>=0.10 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.18.0)\n", + "Requirement already satisfied: notebook>=4.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.2.0)\n", + "Requirement already satisfied: jupyter-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1.11)\n", + "Requirement already satisfied: tornado>=4.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1)\n", + "Requirement already satisfied: jupyter-core in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.7.0)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.0)\n", + "Requirement already satisfied: traittypes>=0.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipydatawidgets>=4.0.1->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.2.1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pyct>=0.4.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from colorcet->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.4.8)\n", + "Requirement already satisfied: param>=1.7.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from colorcet->itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.10.1)\n", + "Requirement already satisfied: wcwidth in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.5)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from pexpect; sys_platform != \"win32\"->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jedi>=0.10->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.8.1)\n", + "Requirement already satisfied: nbconvert in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.0.7)\n", + "Requirement already satisfied: argon2-cffi in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.1.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.9.2)\n", + "Requirement already satisfied: pyzmq>=17 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (21.0.2)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.5.0)\n", + "Requirement already satisfied: jinja2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.11.2)\n", + "Requirement already satisfied: prometheus-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.9.0)\n", + "Requirement already satisfied: pyrsistent>=0.14.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.17.3)\n", + "Requirement already satisfied: attrs>=17.4.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.3.0)\n", + "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", + "Requirement already satisfied: jupyterlab-pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.1.2)\n", + "Requirement already satisfied: testpath in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.4.4)\n", + "Requirement already satisfied: bleach in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.3)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.8.4)\n", + "Requirement already satisfied: defusedxml in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.6.0)\n", + "Requirement already satisfied: entrypoints>=0.2.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.3)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", + "Requirement already satisfied: cffi>=1.0.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.14.4)\n", + "Requirement already satisfied: MarkupSafe>=0.23 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.1.1)\n", + "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.7.4.3)\n", + "Requirement already satisfied: zipp>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", + "Requirement already satisfied: packaging in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.8)\n", + "Requirement already satisfied: webencodings in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", + "Requirement already satisfied: nest-asyncio in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", + "Requirement already satisfied: async-generator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.10)\n", + "Requirement already satisfied: pycparser in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.20)\n", + "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1 is available.\n", + "You should consider upgrading via the '/home/akhorkin/.virtualenvs/python_demo_env/bin/python -m pip install --upgrade pip' command.\u001b[0m\n" + ] + } + ], + "source": [ + "# install prerequinces for the demo\n", + "import sys\n", + "!{sys.executable} -m pip install -r requirements.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-04-27 00:06:26-- https://zenodo.org/record/3755060/files/data.zip\n", + "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.139\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.139|:912... connected.\n", + "Proxy request sent, awaiting response... 200 OK\n", + "Length: 1051449986 (1003M) [application/octet-stream]\n", + "Saving to: ‘data.zip’\n", + "\n", + "data.zip 100%[===================>] 1003M 2.07MB/s in 8m 22s \n", + "\n", + "2021-04-27 00:14:49 (2.00 MB/s) - ‘data.zip’ saved [1051449986/1051449986]\n", + "\n", + "Archive: data.zip\n", + " creating: data/\n", + " creating: data/train/\n", + " inflating: data/train/train_seismic.npy \n", + " inflating: data/train/train_labels.npy \n", + " creating: data/test_once/\n", + " inflating: data/test_once/test1_seismic.npy \n", + " inflating: data/test_once/test2_labels.npy \n", + " inflating: data/test_once/test1_labels.npy \n", + " inflating: data/test_once/test2_seismic.npy \n", + " inflating: data/.dropbox \n" + ] + } + ], + "source": [ + "# Download dataset\n", + "! wget https://zenodo.org/record/3755060/files/data.zip\n", + "! unzip data.zip\n", + "! rm -rf data.zip data/train" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "import numpy as np\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import ipywidgets as widgets\n", + "\n", + "from tqdm import tqdm\n", + "from itkwidgets import view\n", + "from collections import defaultdict\n", + "from openvino.inference_engine import IECore" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define useful functions" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def get_config():\n", + " config = defaultdict(str)\n", + " config.update({\n", + " \"model\": 'model/facies-segmentation-deconvnet.xml',\n", + " \"data_path\": 'data/test_once/test2_seismic.npy',\n", + " \"name_classes\": ['upper_ns', 'middle_ns',\n", + " 'lower_ns', 'rijnland_chalk',\n", + " 'scruff', 'zechstein'],\n", + " \"cpu_extension\": 'libunpool_cpu_extension.so',\n", + " \"edge_one\": (0,30,0),\n", + " \"edge_two\": (500, 199, 244),\n", + " \"device\":\"CPU\"})\n", + "\n", + " return config " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def normalize(data, mu=0, std=1):\n", + " if not isinstance(data, np.ndarray):\n", + " data = np.array(data)\n", + " data = (data - data.flatten().mean())/data.flatten().std()\n", + " return data * std + mu\n", + "\n", + "def load_data(config):\n", + " data_format = config[\"data_path\"].split('.')[1]\n", + " assert not (config[\"data_path\"].split('.')[0] == '' or data_format == ''), \\\n", + " f'Invalid path to data file: {config[\"data_path\"]}'\n", + " if data_format == 'npy':\n", + " data = np.load(config[\"data_path\"])\n", + " elif data_format == 'dat':\n", + " data = np.fromfile(config[\"data_path\"])\n", + " elif data_format == 'segy':\n", + " import segyio\n", + " data = segyio.tools.cube(config[\"data_path\"])\n", + " data = np.moveaxis(data, -1, 0)\n", + " data = np.ascontiguousarray(data, 'float32')\n", + " else:\n", + " assert False, f'Unsupported data format: {data_format}'\n", + "\n", + " data = normalize(data, mu=1e-8, std=0.2097654)\n", + " print(f\"[INFO] Dataset has been loaded, shape is {data.shape}\")\n", + " print(f\"[INFO] Dataset mean is {data.flatten().mean():.5f}, std {data.flatten().std():.5f}\")\n", + " \n", + " x_min = min(config[\"edge_one\"][0], config[\"edge_two\"][0])\n", + " x_max = max(config[\"edge_one\"][0], config[\"edge_two\"][0])\n", + " y_min = min(config[\"edge_one\"][1], config[\"edge_two\"][1])\n", + " y_max = max(config[\"edge_one\"][1], config[\"edge_two\"][1])\n", + " z_min = min(config[\"edge_one\"][2], config[\"edge_two\"][2])\n", + " z_max = max(config[\"edge_one\"][2], config[\"edge_two\"][2])\n", + " x_lim, y_lim, z_lim = data.shape\n", + " assert x_min >=0 and y_min>=0 and z_min >= 0\n", + " assert x_max < x_lim and y_max < y_lim and z_max < z_lim, \"Invalid edges\"\n", + " sub_data = data[x_min: x_max , y_min: y_max, z_min: z_max]\n", + " return sub_data" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def reshape_model(net, shape):\n", + " index_of_minimal_dim = np.argmin(shape)\n", + " input_data_shape = list(shape)\n", + " del input_data_shape[index_of_minimal_dim]\n", + "\n", + " input_net_info = net.input_info\n", + " input_name = next(iter(input_net_info))\n", + " input_net_shape = input_net_info[input_name].input_data.shape\n", + " \n", + " print(f\"[INFO] Infer should be on {input_data_shape} resolution\")\n", + " if input_data_shape != input_net_shape[-2:]:\n", + " net.reshape({input_name: [1, 1, *input_data_shape]})\n", + " print(f\"[INFO] Reshaping model to fit for slice shape: {input_data_shape}\")\n", + " else:\n", + " print(f\"[INFO] Use not reshaped model\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def infer_cube(exec_net, data):\n", + " index_of_minimal_dim = np.argmin(data.shape)\n", + " predicted_cube = np.empty(data.shape)\n", + " size = data.shape[index_of_minimal_dim]\n", + " for slice_index in tqdm(range(size)):\n", + " if index_of_minimal_dim == 0:\n", + " inp = data[slice_index, :, :]\n", + " out = exec_net.infer(inputs={'input': inp})['output']\n", + " out = np.argmax(out, axis=1).squeeze()\n", + " predicted_cube[slice_index, :, :] = out\n", + " if index_of_minimal_dim == 1:\n", + " inp = data[:, slice_index, :]\n", + " out = exec_net.infer(inputs={'input': inp})['output']\n", + " out = np.argmax(out, axis=1).squeeze()\n", + " predicted_cube[:, slice_index, :] = out\n", + " if index_of_minimal_dim == 2:\n", + " inp = data[:, :, slice_index]\n", + " out = exec_net.infer(inputs={'input': inp})['output']\n", + " out = np.argmax(out, axis=1).squeeze()\n", + " predicted_cube[:, :, slice_index] = out\n", + " return predicted_cube" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def discrete_cmap(N, base_cmap=None):\n", + " \"\"\"Create an N-bin discrete colormap from the specified input map\"\"\"\n", + "\n", + " # Note that if base_cmap is a string or None, you can simply do\n", + " # return plt.cm.get_cmap(base_cmap, N)\n", + " # The following works for string, None, or a colormap instance:\n", + "\n", + " base = plt.cm.get_cmap(base_cmap)\n", + " color_list = base(np.linspace(0, 1, N))\n", + " cmap_name = base.name + str(N)\n", + " return base.from_list(cmap_name, color_list, N)\n", + "\n", + "def show_legend(N, cmap_name):\n", + " base = plt.cm.get_cmap(cmap_name)\n", + " color_list = base(np.linspace(0, 1, N))\n", + " print(color_list)\n", + " \n", + "def show_legend(labels, cmap):\n", + " N = len(labels)\n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])\n", + " cb1 = mpl.colorbar.ColorbarBase(ax1, cmap=cmap,\n", + " ticks=np.arange(0, N, 1)/N + 1/(2*N),\n", + " orientation='horizontal')\n", + " cb1.ax.set_xticklabels(labels, fontsize = 20)\n", + " cb1.set_label('Legend', fontsize = 24)\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get config and load dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO] Dataset has been loaded, shape is (601, 200, 255)\n", + "[INFO] Dataset mean is 0.00000, std 0.20977\n" + ] + } + ], + "source": [ + "config = get_config()\n", + "data = load_data(config)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "ie = IECore()\n", + "if config[\"cpu_extension\"] and config[\"device\"] == \"CPU\":\n", + " ie.add_extension(config[\"cpu_extension\"], \"CPU\")\n", + "net = ie.read_network(config[\"model\"], os.path.splitext(config[\"model\"])[0] + \".bin\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO] Infer should be on [500, 244] resolution\n", + "[INFO] Reshaping model to fit for slice shape: [500, 244]\n" + ] + } + ], + "source": [ + "reshape_model(net, data.shape)\n", + "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run model" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 169/169 [00:27<00:00, 6.11it/s]\n" + ] + } + ], + "source": [ + "predicted_data = infer_cube(exec_net, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize original and predicted data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Prepare origidal data viewer" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "viewer_orig_data = view(data, shadow=False)\n", + "count_of_greys = 100\n", + "viewer_orig_data.cmap = np.array([[i/count_of_greys, i/count_of_greys, i/count_of_greys] for i\n", + " in range(count_of_greys)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Prepare predicted data viewer" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "

" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cmap = discrete_cmap(len(config[\"name_classes\"]), 'jet')\n", + "show_legend(config[\"name_classes\"], cmap)\n", + "viewer_interpret_data = view(predicted_data, shadow=False)\n", + "viewer_interpret_data.cmap = cmap\n", + "widgets.link((viewer_interpret_data, 'camera'), (viewer_orig_data, 'camera')) # link widget cameras\n", + "pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Run render" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9527b1f16c7e4d679578ce31500bdf85", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Viewer(cmap='Custom matplotlib 1619471729.525269', geometries=[], gradient_opacity=0.22, point_sets=[], render…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "viewer_interpret_data" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "55627b27883a492bbea91ad0a88eb637", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Viewer(cmap='Custom NumPy 1619471729.313006', geometries=[], gradient_opacity=0.22, point_sets=[], rendered_im…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "viewer_orig_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py_demo_env", + "language": "python", + "name": "py_demo_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/202-facies-segmentation/requirements.txt b/notebooks/202-facies-segmentation/requirements.txt new file mode 100644 index 00000000000..b11b1c6b340 --- /dev/null +++ b/notebooks/202-facies-segmentation/requirements.txt @@ -0,0 +1,16 @@ +numpy==1.19.4 +matplotlib==3.3.3 +ipywidgets==7.5.1 +tqdm==4.39.0 +itk==5.1.2 +itk-core==5.1.2 +itk-filtering==5.1.2 +itk-io==5.1.2 +itk-meshtopolydata==0.6.2 +itk-numerics==5.1.2 +itk-registration==5.1.2 +itk-segmentation==5.1.2 +itkwidgets==0.23.1 +segyio==1.9.1 +imageio==2.9.0 +ipympl==0.5.1 diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt b/notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt new file mode 100644 index 00000000000..ee2c9d7f4b0 --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (C) 2020 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# + +# [cmake:extension] +set(TARGET_NAME "unpool_cpu_extension") + +find_package(ngraph REQUIRED) +find_package(InferenceEngine REQUIRED) +find_package(TBB REQUIRED tbb tbbmalloc) + +file(GLOB_RECURSE SRC *.cpp) + +add_library(${TARGET_NAME} SHARED ${SRC}) + +target_compile_definitions(${TARGET_NAME} PRIVATE IMPLEMENT_INFERENCE_EXTENSION_API) +target_link_libraries(${TARGET_NAME} PRIVATE ${InferenceEngine_LIBRARIES} + ${NGRAPH_LIBRARIES} + ${TBB_IMPORTED_TARGETS}) +# [cmake:extension] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp b/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp new file mode 100644 index 00000000000..73e40a0c4d6 --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp @@ -0,0 +1,135 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// +#include "cpu_kernel.hpp" +#include "op.hpp" +#include
+#include +#include "ie_parallel.hpp" + +using namespace TemplateExtension; + +//! [cpu_implementation:ctor] +OpImplementation::OpImplementation(const std::shared_ptr &node) { + try { + auto castedNode = std::dynamic_pointer_cast(node); + if (!castedNode) + THROW_IE_EXCEPTION << "Cannot create implementation for unknown operation!"; + if (castedNode->inputs().size() != 4 || castedNode->outputs().size() != 1) + THROW_IE_EXCEPTION << "Cannot create implementation for operation with incorrect number of inputs or outputs!"; + if (castedNode->get_input_partial_shape(0).is_dynamic() || castedNode->get_output_partial_shape(0).is_dynamic()) + THROW_IE_EXCEPTION << "Cannot create implementation for op with dynamic shapes!"; + if (castedNode->get_input_shape(0).size() != 4 || castedNode->get_output_shape(0).size() != 4) + THROW_IE_EXCEPTION << "Operation supports only 4d tensors for input and output."; + if (castedNode->get_input_element_type(0) != ngraph::element::f32 || castedNode->get_output_element_type(0) != ngraph::element::f32) + THROW_IE_EXCEPTION << "Operation supports only FP32 tensors."; + inShapes.resize(4); + for (int i = 0; i < 4; ++i) + inShapes[i] = castedNode->get_input_shape(i); + outShape = castedNode->get_output_shape(0); + + mask.resize(inShapes[1][0]*inShapes[1][1]*inShapes[1][2]*inShapes[1][3]); + } catch (InferenceEngine::details::InferenceEngineException& ex) { + error = ex.what(); + } +} +//! [cpu_implementation:ctor] + +//! [cpu_implementation:getSupportedConfigurations] +InferenceEngine::StatusCode OpImplementation::getSupportedConfigurations(std::vector &conf, + InferenceEngine::ResponseDesc *resp) noexcept { + std::vector inDataConfig; + std::vector outDataConfig; + InferenceEngine::SizeVector order = {0, 1, 2, 3}; + // Allow any offset before data + size_t offset((std::numeric_limits::max)()); + + // Input shape + for (const auto& shape : inShapes) + { + InferenceEngine::DataConfig inpConf; + inpConf.desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, shape, {shape, order, offset}); + inDataConfig.push_back(inpConf); + } + + // Output shape + InferenceEngine::DataConfig outConf; + outConf.desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, outShape, {outShape, order, offset}); + outDataConfig.push_back(outConf); + + InferenceEngine::LayerConfig layerConfig; + layerConfig.inConfs = inDataConfig; + layerConfig.outConfs = outDataConfig; + + conf.push_back(layerConfig); + return InferenceEngine::StatusCode::OK; +} +//! [cpu_implementation:getSupportedConfigurations] + +//! [cpu_implementation:init] +InferenceEngine::StatusCode OpImplementation::init(InferenceEngine::LayerConfig &config, InferenceEngine::ResponseDesc *resp) noexcept { + try { + if (config.inConfs.size() != 4 || config.outConfs.size() != 1) { + THROW_IE_EXCEPTION << "Operation cannot be initialized with incorrect number of inputs/outputs!"; + } + + if (config.inConfs[0].desc.getDims().size() != 4 || config.outConfs[0].desc.getDims().size() != 4) { + THROW_IE_EXCEPTION << "Operation can be initialized only with 4d input/output tensors!"; + } + + if (config.outConfs[0].desc.getPrecision() != InferenceEngine::Precision::FP32 || + config.inConfs[0].desc.getPrecision() != InferenceEngine::Precision::FP32) { + THROW_IE_EXCEPTION << "Operation supports only FP32 precisions!"; + } + } catch (InferenceEngine::details::InferenceEngineException& ex) { + if (resp) { + strncpy(resp->msg, error.c_str(), sizeof(resp->msg) - 1); + resp->msg[sizeof(resp->msg)-1] = 0; + } + return InferenceEngine::GENERAL_ERROR; + } + + return InferenceEngine::OK; +} +//! [cpu_implementation:init] + +//! [cpu_implementation:execute] +InferenceEngine::StatusCode OpImplementation::execute(std::vector &inputs, + std::vector &outputs, + InferenceEngine::ResponseDesc *resp) noexcept { + const float* poolInp = inputs[0]->cbuffer().as(); + const float* poolOut = inputs[1]->cbuffer().as(); + const float* inp = inputs[2]->cbuffer().as(); + float* out = outputs[0]->buffer().as(); + + std::vector poolInpDims = inputs[0]->getTensorDesc().getDims(); + std::vector poolOutDims = inputs[1]->getTensorDesc().getDims(); + std::vector inpDims = inputs[2]->getTensorDesc().getDims(); + std::vector outDims = outputs[0]->getTensorDesc().getDims(); + + const size_t batch = poolInpDims[0]; + const size_t channels = poolInpDims[1]; + const size_t height = poolInpDims[2]; + const size_t width = poolInpDims[3]; + const size_t outHeight = outDims[2]; + const size_t outWidth = outDims[3]; + const size_t poolOutHeight = poolOutDims[2]; + const size_t poolOutWidth = poolOutDims[3]; + std::fill(mask.begin(), mask.end(), false); + memset(out, 0, outputs[0]->byteSize()); + InferenceEngine::parallel_for(batch*channels, [&](size_t d) { + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + int poolOutIdx = (d * poolOutHeight + y / 2) * poolOutWidth + x / 2; + int poolInpIdx = (d * height + y) * width + x; + int dstIdx = d * outHeight * outWidth + (y * width + x); + if (fabs(poolInp[poolInpIdx] - poolOut[poolOutIdx]) < 1e-5f && !mask[poolOutIdx]) { + out[dstIdx] = inp[poolOutIdx]; + mask[poolOutIdx] = true; + } + } + } + }); + return InferenceEngine::OK; +} +//! [cpu_implementation:execute] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp b/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp new file mode 100644 index 00000000000..c80ac80f1c0 --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp @@ -0,0 +1,31 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +namespace TemplateExtension { + +//! [cpu_implementation:header] +class OpImplementation : public InferenceEngine::ILayerExecImpl { +public: + explicit OpImplementation(const std::shared_ptr& node); + InferenceEngine::StatusCode getSupportedConfigurations(std::vector &conf, + InferenceEngine::ResponseDesc *resp) noexcept override; + InferenceEngine::StatusCode init(InferenceEngine::LayerConfig &config, + InferenceEngine::ResponseDesc *resp) noexcept override; + InferenceEngine::StatusCode execute(std::vector &inputs, + std::vector &outputs, + InferenceEngine::ResponseDesc *resp) noexcept override; +private: + std::vector inShapes; + ngraph::Shape outShape; + std::string error; + std::vector mask; +}; +//! [cpu_implementation:header] + +} // namespace TemplateExtension diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp b/notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp new file mode 100644 index 00000000000..f4b8bef4216 --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp @@ -0,0 +1,73 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// +#include "extension.hpp" +#include "cpu_kernel.hpp" +#include "op.hpp" +#include +#include + +#include +#include +#include +#include +#include + +using namespace TemplateExtension; + +//! [extension:GetVersion] +void Extension::GetVersion(const InferenceEngine::Version *&versionInfo) const noexcept { + static InferenceEngine::Version ExtensionDescription = { + {1, 0}, // extension API version + "1.0", + "template_ext" // extension description message + }; + + versionInfo = &ExtensionDescription; +} +//! [extension:GetVersion] + +//! [extension:getOpSets] +std::map Extension::getOpSets() { + std::map opsets; + ngraph::OpSet opset; + opset.insert(); + opsets["extension"] = opset; + return opsets; +} +//! [extension:getOpSets] + +//! [extension:getImplTypes] +std::vector Extension::getImplTypes(const std::shared_ptr &node) { + if (std::dynamic_pointer_cast(node)) { + return {"CPU"}; + } + return {}; +} +//! [extension:getImplTypes] + +//! [extension:getImplementation] +InferenceEngine::ILayerImpl::Ptr Extension::getImplementation(const std::shared_ptr &node, const std::string &implType) { + if (std::dynamic_pointer_cast(node) && implType == "CPU") { + return std::make_shared(node); + } + return nullptr; +} +//! [extension:getImplementation] + +//! [extension:CreateExtension] +// Exported function +INFERENCE_EXTENSION_API(InferenceEngine::StatusCode) InferenceEngine::CreateExtension(InferenceEngine::IExtension *&ext, + InferenceEngine::ResponseDesc *resp) noexcept { + try { + ext = new Extension(); + return OK; + } catch (std::exception &ex) { + if (resp) { + std::string err = ((std::string) "Couldn't create extension: ") + ex.what(); + err.copy(resp->msg, 255); + } + return InferenceEngine::GENERAL_ERROR; + } +} +//! [extension:CreateExtension] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp b/notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp new file mode 100644 index 00000000000..e74c6c4354d --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp @@ -0,0 +1,31 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +//! [extension:header] +namespace TemplateExtension { + +class Extension : public InferenceEngine::IExtension { +public: + Extension() = default; + void GetVersion(const InferenceEngine::Version*& versionInfo) const noexcept override; + void Unload() noexcept override {} + void Release() noexcept override { delete this; } + + std::map getOpSets() override; + std::vector getImplTypes(const std::shared_ptr& node) override; + InferenceEngine::ILayerImpl::Ptr getImplementation(const std::shared_ptr& node, const std::string& implType) override; +}; + +} // namespace TemplateExtension +//! [extension:header] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/op.cpp b/notebooks/202-facies-segmentation/user_ie_extensions/op.cpp new file mode 100644 index 00000000000..7ea78d774ae --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/op.cpp @@ -0,0 +1,42 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// +#include "op.hpp" + +using namespace TemplateExtension; + +constexpr ngraph::NodeTypeInfo Operation::type_info; + +//! [op:ctor] +Operation::Operation(const ngraph::Output& poolInp, + const ngraph::Output& poolOut, + const ngraph::Output& inp, + const ngraph::Output& shape) : Op({poolInp, poolOut, inp, shape}) { + constructor_validate_and_infer_types(); +} +//! [op:ctor] + +//! [op:validate] +void Operation::validate_and_infer_types() { + auto outShape = get_input_partial_shape(3); + auto poolInpShape = get_input_partial_shape(0).to_shape(); + outShape[0] = poolInpShape[0]; // Use only spatial dimensions from shape + outShape[1] = poolInpShape[1]; // and restore batch and channels + set_output_type(0, get_input_element_type(0), outShape); +} +//! [op:validate] + +//! [op:copy] +std::shared_ptr Operation::clone_with_new_inputs(const ngraph::OutputVector &new_args) const { + if (new_args.size() != 4) { + throw ngraph::ngraph_error("Incorrect number of new arguments"); + } + return std::make_shared(new_args.at(0), new_args.at(1), new_args.at(2), new_args.at(3)); +} +//! [op:copy] + +//! [op:visit_attributes] +bool Operation::visit_attributes(ngraph::AttributeVisitor &visitor) { + return true; +} +//! [op:visit_attributes] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/op.hpp b/notebooks/202-facies-segmentation/user_ie_extensions/op.hpp new file mode 100644 index 00000000000..97a5aa3c612 --- /dev/null +++ b/notebooks/202-facies-segmentation/user_ie_extensions/op.hpp @@ -0,0 +1,28 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include + +//! [op:header] +namespace TemplateExtension { + +class Operation : public ngraph::op::Op { +public: + static constexpr ngraph::NodeTypeInfo type_info{"MaxPoolGrad", 0}; + const ngraph::NodeTypeInfo& get_type_info() const override { return type_info; } + + Operation() = default; + Operation(const ngraph::Output& poolInp, + const ngraph::Output& poolOut, + const ngraph::Output& inp, + const ngraph::Output& shape); + void validate_and_infer_types() override; + std::shared_ptr clone_with_new_inputs(const ngraph::OutputVector& new_args) const override; + bool visit_attributes(ngraph::AttributeVisitor& visitor) override; +}; +//! [op:header] + +} // namespace TemplateExtension From 3aef79fd28f4ad939e9755533ef52beee7cc13f2 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Tue, 27 Apr 2021 18:20:15 +0300 Subject: [PATCH 02/29] Replace README info inside jupyter notebook --- notebooks/202-facies-segmentation/README.md | 84 +---- .../202-facies-segmentation/facies_demo.ipynb | 356 ++++++++++++++---- 2 files changed, 284 insertions(+), 156 deletions(-) diff --git a/notebooks/202-facies-segmentation/README.md b/notebooks/202-facies-segmentation/README.md index 078b82418c9..939c10e180b 100644 --- a/notebooks/202-facies-segmentation/README.md +++ b/notebooks/202-facies-segmentation/README.md @@ -2,89 +2,9 @@ This demo demonstrate how to run facies classification using OpenVINO™ -This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays. - - -## How It Works -Upon the start-up, the demo application loads a network and an given dataset file to the Inference Engine plugin. When inference is done, the application displays 3d itkwidget viewer with facies interpretation. - -## Running - -### Installation of dependencies -First of all, you need to create the required CPU extension, just follow the instructions below: - -Steps to create CPU extension: - -```bash -$ source /bin/setupvars.sh -$ export TBB_DIR=${INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/cmake/ - -$ cd ./user_ie_extensions -$ mkdir build && cd build -$ cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc --all) -$ mv libunpool_cpu_extension.so ../../ -``` -### Setup virtual-env - -Step 1: Install [pyenv](https://github.com/pyenv/pyenv) -```sh -$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash -``` - -Step 2 Install python 3.6.9: -```sh -$ pyenv install 3.6.9 -``` -NOTE: If you get an error when trying to install python, run the following command: -```sh -$ export PATH="$HOME/.pyenv/bin:$PATH" -``` - -Step 3: Create virtual-env in this directory: -```sh -$ cd notebooks/202-facies-segmentation -$ ~/.pyenv/versions/3.6.8/bin/python -m venv facies_demo_env -``` - -Step 4: Activate env: -```sh -$ source facies_demo_env/bin/activate -``` - -Step 5: add your env to jupyter: -```sh -$ ipython kernel install --name "facies_demo_env" --user -``` - -Step 6 (Optional): You can install the required packages now with the following command, or later, inside the jupyter demo notebook: -```sh -$ pip install -r requirements.txt -``` - -### Download model: - -Step 1: Create model folder and download a model: - -```sh -$ cd notebooks/202-facies-segmentation -$ mkdir model && cd model -$ wget -O facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1 -$ wget -O facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1 -$ wget -O facies-segmentation-deconvnet.mapping https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1 -``` - -### Run notebook - -Run Jupyter notebook with demo -```bash -$ cd notebooks/202-facies-segmentation -$ jupyter notebook -``` - -## Demo Output - -The application uses Jupyter notebook to display 3d itkwidget with resulting instance classification masks. Markdown Monster icon + +See details in `facies_demo.ipynb` diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index c18fcbce19e..2a9fab1eb6d 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -1,9 +1,142 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Facies segmentation Python Demo\n", + "\n", + "This demo demonstrate how to run facies classification using OpenVINO™\n", + "\n", + "This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Demo Output\n", + "\n", + "The application uses Jupyter notebook to display 3d itkwidget with resulting instance classification masks." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## How It Works\n", + "Upon the start-up, the demo application loads a network and an given dataset file to the Inference Engine plugin. When inference is done, the application displays 3d itkwidget viewer with facies interpretation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Installation of dependencies" + ] + }, { "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "import numpy as np\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import ipywidgets as widgets\n", + "\n", + "from tqdm import tqdm\n", + "from itkwidgets import view\n", + "from collections import defaultdict\n", + "from openvino.inference_engine import IECore" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create the CPU extension\n", + "First of all, you need to create the required CPU extension, just follow the instructions below:\n", + "\n", + "Steps to create CPU extension:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[setupvars.sh] OpenVINO environment initialized\n", + "env: TBB_DIR=/opt/intel/openvino_2021/deployment_tools/inference_engine/external/tbb/cmake/\n", + "-- The C compiler identification is GNU 7.5.0\n", + "-- The CXX compiler identification is GNU 7.5.0\n", + "-- Check for working C compiler: /usr/bin/cc\n", + "-- Check for working C compiler: /usr/bin/cc -- works\n", + "-- Detecting C compiler ABI info\n", + "-- Detecting C compiler ABI info - done\n", + "-- Detecting C compile features\n", + "-- Detecting C compile features - done\n", + "-- Check for working CXX compiler: /usr/bin/c++\n", + "-- Check for working CXX compiler: /usr/bin/c++ -- works\n", + "-- Detecting CXX compiler ABI info\n", + "-- Detecting CXX compiler ABI info - done\n", + "-- Detecting CXX compile features\n", + "-- Detecting CXX compile features - done\n", + "-- Found InferenceEngine: /opt/intel/openvino_2021/deployment_tools/inference_engine/lib/intel64/libinference_engine.so \n", + "CMake Warning (dev) in CMakeLists.txt:\n", + " No cmake_minimum_required command is present. A line of code such as\n", + "\n", + " cmake_minimum_required(VERSION 3.10)\n", + "\n", + " should be added at the top of the file. The version specified may be lower\n", + " if you wish to support older CMake versions for this project. For more\n", + " information run \"cmake --help-policy CMP0000\".\n", + "This warning is for project developers. Use -Wno-dev to suppress it.\n", + "\n", + "-- Configuring done\n", + "-- Generating done\n", + "-- Build files have been written to: /home/akhorkin/Repositories/openvino_notebooks/notebooks/202-facies-segmentation/user_ie_extensions/build\n", + "\u001b[35m\u001b[1mScanning dependencies of target unpool_cpu_extension\u001b[0m\n", + "[ 20%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.o\u001b[0m\n", + "[ 40%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/cpu_kernel.o\u001b[0m\n", + "[ 60%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/extension.o\u001b[0m\n", + "[ 80%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/op.o\u001b[0m\n", + "[100%] \u001b[32m\u001b[1mLinking CXX shared library libunpool_cpu_extension.so\u001b[0m\n", + "[100%] Built target unpool_cpu_extension\n" + ] + } + ], + "source": [ + "openvino_install_dir = '/opt/intel/openvino_2021'\n", + "! source {openvino_install_dir}/bin/setupvars.sh\n", + "INTEL_OPENVINO_DIR = os.environ['INTEL_OPENVINO_DIR']\n", + "# set ENV:\n", + "%env TBB_DIR= {INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/cmake/\n", + "! mkdir ./user_ie_extensions/build\n", + "! cd ./user_ie_extensions/build && cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc --all)\n", + "! mv ./user_ie_extensions/build/libunpool_cpu_extension.so ./" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup virtual-env\n", + "\n", + "Step 1: You can install the required packages with the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -25,73 +158,73 @@ "Requirement already satisfied: segyio==1.9.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 14)) (1.9.1)\n", "Requirement already satisfied: imageio==2.9.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 15)) (2.9.0)\n", "Requirement already satisfied: ipympl==0.5.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 16)) (0.5.1)\n", - "Requirement already satisfied: python-dateutil>=2.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.8.1)\n", "Requirement already satisfied: cycler>=0.10 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (0.10.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (1.3.1)\n", - "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.4.7)\n", "Requirement already satisfied: pillow>=6.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (8.1.0)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.3.3)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.8.1)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.4.7)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.1.2)\n", "Requirement already satisfied: ipython>=4.0.0; python_version >= \"3.3\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (7.16.1)\n", - "Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.5.1)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.3.3)\n", "Requirement already satisfied: ipykernel>=4.5.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.4.3)\n", - "Requirement already satisfied: nbformat>=4.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.1.2)\n", - "Requirement already satisfied: six in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.15.0)\n", + "Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.5.1)\n", "Requirement already satisfied: ipydatawidgets>=4.0.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (4.2.0)\n", + "Requirement already satisfied: colorcet in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (2.0.6)\n", "Requirement already satisfied: scipy in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.5.4)\n", "Requirement already satisfied: zstandard in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.15.1)\n", - "Requirement already satisfied: colorcet in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (2.0.6)\n", - "Requirement already satisfied: decorator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from traitlets>=4.3.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.4.2)\n", - "Requirement already satisfied: ipython-genutils in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from traitlets>=4.3.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", + "Requirement already satisfied: six in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.15.0)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.0)\n", + "Requirement already satisfied: jupyter-core in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.7.0)\n", + "Requirement already satisfied: ipython-genutils in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.0.14)\n", - "Requirement already satisfied: pickleshare in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.5)\n", - "Requirement already satisfied: pexpect; sys_platform != \"win32\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.8.0)\n", "Requirement already satisfied: setuptools>=18.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (46.0.0)\n", - "Requirement already satisfied: pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.7.4)\n", + "Requirement already satisfied: decorator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.4.2)\n", "Requirement already satisfied: backcall in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", + "Requirement already satisfied: pexpect; sys_platform != \"win32\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.8.0)\n", + "Requirement already satisfied: pickleshare in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.5)\n", "Requirement already satisfied: jedi>=0.10 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.18.0)\n", - "Requirement already satisfied: notebook>=4.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.2.0)\n", - "Requirement already satisfied: jupyter-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1.11)\n", + "Requirement already satisfied: pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.7.4)\n", "Requirement already satisfied: tornado>=4.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1)\n", - "Requirement already satisfied: jupyter-core in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.7.0)\n", - "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.0)\n", - "Requirement already satisfied: traittypes>=0.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipydatawidgets>=4.0.1->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.2.1)\n" + "Requirement already satisfied: jupyter-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1.11)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ + "Requirement already satisfied: notebook>=4.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.2.0)\n", + "Requirement already satisfied: traittypes>=0.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipydatawidgets>=4.0.1->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.2.1)\n", "Requirement already satisfied: pyct>=0.4.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from colorcet->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.4.8)\n", "Requirement already satisfied: param>=1.7.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from colorcet->itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.10.1)\n", + "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", + "Requirement already satisfied: pyrsistent>=0.14.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.17.3)\n", + "Requirement already satisfied: attrs>=17.4.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.3.0)\n", "Requirement already satisfied: wcwidth in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.5)\n", "Requirement already satisfied: ptyprocess>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from pexpect; sys_platform != \"win32\"->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jedi>=0.10->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.8.1)\n", + "Requirement already satisfied: pyzmq>=13 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (21.0.2)\n", "Requirement already satisfied: nbconvert in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.0.7)\n", "Requirement already satisfied: argon2-cffi in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.1.0)\n", "Requirement already satisfied: terminado>=0.8.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.9.2)\n", - "Requirement already satisfied: pyzmq>=17 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (21.0.2)\n", - "Requirement already satisfied: Send2Trash>=1.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.5.0)\n", - "Requirement already satisfied: jinja2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.11.2)\n", "Requirement already satisfied: prometheus-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.9.0)\n", - "Requirement already satisfied: pyrsistent>=0.14.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.17.3)\n", - "Requirement already satisfied: attrs>=17.4.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.3.0)\n", - "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", + "Requirement already satisfied: jinja2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.11.2)\n", + "Requirement already satisfied: Send2Trash>=1.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.5.0)\n", + "Requirement already satisfied: zipp>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.7.4.3)\n", "Requirement already satisfied: jupyterlab-pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.1.2)\n", - "Requirement already satisfied: testpath in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.4.4)\n", - "Requirement already satisfied: bleach in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.3)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", "Requirement already satisfied: mistune<2,>=0.8.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.8.4)\n", "Requirement already satisfied: defusedxml in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.6.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", + "Requirement already satisfied: testpath in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.4.4)\n", "Requirement already satisfied: entrypoints>=0.2.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.3)\n", - "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", + "Requirement already satisfied: bleach in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.3)\n", "Requirement already satisfied: cffi>=1.0.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.14.4)\n", "Requirement already satisfied: MarkupSafe>=0.23 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.1.1)\n", - "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.7.4.3)\n", - "Requirement already satisfied: zipp>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", + "Requirement already satisfied: async-generator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.10)\n", + "Requirement already satisfied: nest-asyncio in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", "Requirement already satisfied: packaging in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.8)\n", "Requirement already satisfied: webencodings in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", - "Requirement already satisfied: nest-asyncio in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", - "Requirement already satisfied: async-generator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.10)\n", "Requirement already satisfied: pycparser in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.20)\n", "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1 is available.\n", "You should consider upgrading via the '/home/akhorkin/.virtualenvs/python_demo_env/bin/python -m pip install --upgrade pip' command.\u001b[0m\n" @@ -104,25 +237,119 @@ "!{sys.executable} -m pip install -r requirements.txt" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download model:\n", + "\n", + "Step 1: Create model folder and download a model:" + ] + }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "--2021-04-27 00:06:26-- https://zenodo.org/record/3755060/files/data.zip\n", - "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.139\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.139|:912... connected.\n", + "/bin/bash: line 0: cd: notebooks/202-facies-segmentation: No such file or directory\n", + "--2021-04-27 17:37:10-- https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1\n", + "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", + "Proxy request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/dl/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin [following]\n", + "--2021-04-27 17:37:11-- https://www.dropbox.com/s/dl/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "Proxy request sent, awaiting response... 302 Found\n", + "Location: https://uc5c9819d023d7f0bcdf3f8f89d8.dl.dropboxusercontent.com/cd/0/get/BNZw3-ECMZatW9yusRW-pGBgDtltUrULzh_JgZOQhNp-4zsv7kw_EL-NrH0oQTfcT0d1uVau7n2bC-ASaXpycxCwnodDOudiDb5n9qte8n5wUs_vWYNHTsIVtIOQJcLuQwxVB081a51FrhZ1-RfkIEee/file?dl=1# [following]\n", + "--2021-04-27 17:37:11-- https://uc5c9819d023d7f0bcdf3f8f89d8.dl.dropboxusercontent.com/cd/0/get/BNZw3-ECMZatW9yusRW-pGBgDtltUrULzh_JgZOQhNp-4zsv7kw_EL-NrH0oQTfcT0d1uVau7n2bC-ASaXpycxCwnodDOudiDb5n9qte8n5wUs_vWYNHTsIVtIOQJcLuQwxVB081a51FrhZ1-RfkIEee/file?dl=1\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", + "Proxy request sent, awaiting response... 200 OK\n", + "Length: 335991832 (320M) [application/binary]\n", + "Saving to: ‘model/facies-segmentation-deconvnet.bin’\n", + "\n", + "model/facies-segmen 100%[===================>] 320.43M 2.11MB/s in 2m 58s \n", + "\n", + "2021-04-27 17:40:11 (1.80 MB/s) - ‘model/facies-segmentation-deconvnet.bin’ saved [335991832/335991832]\n", + "\n", + "--2021-04-27 17:40:11-- https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1\n", + "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", + "Proxy request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/dl/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml [following]\n", + "--2021-04-27 17:40:12-- https://www.dropbox.com/s/dl/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "Proxy request sent, awaiting response... 302 Found\n", + "Location: https://uc8028a8848a9b43e638f0b88149.dl.dropboxusercontent.com/cd/0/get/BNZkRZhAZQuCfpKeupqABfRfU819NSWH_T52vWpMUW1fFUcnQN8XOFfODeW6Dpm3e9gMNG_AuOTQaiAWIonLsD8QNxUfyRSUdSJTysGNbHoKo2I7FoNWFEC7IkOs_uHitg1K4n6a80hu_Fv7AvpmiCin/file?dl=1# [following]\n", + "--2021-04-27 17:40:13-- https://uc8028a8848a9b43e638f0b88149.dl.dropboxusercontent.com/cd/0/get/BNZkRZhAZQuCfpKeupqABfRfU819NSWH_T52vWpMUW1fFUcnQN8XOFfODeW6Dpm3e9gMNG_AuOTQaiAWIonLsD8QNxUfyRSUdSJTysGNbHoKo2I7FoNWFEC7IkOs_uHitg1K4n6a80hu_Fv7AvpmiCin/file?dl=1\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", + "Proxy request sent, awaiting response... 200 OK\n", + "Length: 80558 (79K) [application/binary]\n", + "Saving to: ‘model/facies-segmentation-deconvnet.xml’\n", + "\n", + "model/facies-segmen 100%[===================>] 78.67K 273KB/s in 0.3s \n", + "\n", + "2021-04-27 17:40:15 (273 KB/s) - ‘model/facies-segmentation-deconvnet.xml’ saved [80558/80558]\n", + "\n", + "--2021-04-27 17:40:15-- https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1\n", + "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", + "Proxy request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/dl/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping [following]\n", + "--2021-04-27 17:40:16-- https://www.dropbox.com/s/dl/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "Proxy request sent, awaiting response... 302 Found\n", + "Location: https://uca01a6aa1ee425b20421e7a915e.dl.dropboxusercontent.com/cd/0/get/BNaxHiAJJHARHCp8Ti516LzU4RqX2Pp9JhcuUX-Nq0kU9w_cn6Gs5BzQS5-1lYSQCqRQCBdg-OSvkcBQQXSZwYgoUd2l2Kt3I96oLuLFCHSUtZZ01rXJXg_SVLpU4UuxABLVbWD4VRS__lTCeul3cyuy/file?dl=1# [following]\n", + "--2021-04-27 17:40:17-- https://uca01a6aa1ee425b20421e7a915e.dl.dropboxusercontent.com/cd/0/get/BNaxHiAJJHARHCp8Ti516LzU4RqX2Pp9JhcuUX-Nq0kU9w_cn6Gs5BzQS5-1lYSQCqRQCBdg-OSvkcBQQXSZwYgoUd2l2Kt3I96oLuLFCHSUtZZ01rXJXg_SVLpU4UuxABLVbWD4VRS__lTCeul3cyuy/file?dl=1\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", + "Proxy request sent, awaiting response... 200 OK\n", + "Length: 12158 (12K) [application/binary]\n", + "Saving to: ‘model/facies-segmentation-deconvnet.mapping’\n", + "\n", + "model/facies-segmen 100%[===================>] 11.87K --.-KB/s in 0s \n", + "\n", + "2021-04-27 17:40:18 (123 MB/s) - ‘model/facies-segmentation-deconvnet.mapping’ saved [12158/12158]\n", + "\n" + ] + } + ], + "source": [ + "! cd notebooks/202-facies-segmentation\n", + "! mkdir model\n", + "! wget -O model/facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1 \n", + "! wget -O model/facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1\n", + "! wget -O model/facies-segmentation-deconvnet.mapping https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-04-27 17:40:18-- https://zenodo.org/record/3755060/files/data.zip\n", + "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", + "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", "Proxy request sent, awaiting response... 200 OK\n", "Length: 1051449986 (1003M) [application/octet-stream]\n", "Saving to: ‘data.zip’\n", "\n", - "data.zip 100%[===================>] 1003M 2.07MB/s in 8m 22s \n", + "data.zip 100%[===================>] 1003M 675KB/s in 32m 53s \n", "\n", - "2021-04-27 00:14:49 (2.00 MB/s) - ‘data.zip’ saved [1051449986/1051449986]\n", + "2021-04-27 18:14:24 (520 KB/s) - ‘data.zip’ saved [1051449986/1051449986]\n", "\n", "Archive: data.zip\n", " creating: data/\n", @@ -145,25 +372,6 @@ "! rm -rf data.zip data/train" ] }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "import numpy as np\n", - "import matplotlib as mpl\n", - "import matplotlib.pyplot as plt\n", - "import ipywidgets as widgets\n", - "\n", - "from tqdm import tqdm\n", - "from itkwidgets import view\n", - "from collections import defaultdict\n", - "from openvino.inference_engine import IECore" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -173,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -195,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -240,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -263,7 +471,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -292,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -334,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -360,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -379,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -405,14 +613,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 169/169 [00:27<00:00, 6.11it/s]\n" + "100%|██████████| 169/169 [00:27<00:00, 6.18it/s]\n" ] } ], @@ -436,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -455,7 +663,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -489,18 +697,18 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9527b1f16c7e4d679578ce31500bdf85", + "model_id": "6bcba087455c4a948f673a818661c5c3", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Viewer(cmap='Custom matplotlib 1619471729.525269', geometries=[], gradient_opacity=0.22, point_sets=[], render…" + "Viewer(cmap='Custom matplotlib 1619536503.683635', geometries=[], gradient_opacity=0.22, point_sets=[], render…" ] }, "metadata": {}, @@ -513,18 +721,18 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "55627b27883a492bbea91ad0a88eb637", + "model_id": "c56327e34b414c058918011e8be4892d", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Viewer(cmap='Custom NumPy 1619471729.313006', geometries=[], gradient_opacity=0.22, point_sets=[], rendered_im…" + "Viewer(cmap='Custom NumPy 1619536503.454224', geometries=[], gradient_opacity=0.22, point_sets=[], rendered_im…" ] }, "metadata": {}, From 5716f362ce2a8a461305e616e97d8eac6ed7a844 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Tue, 27 Apr 2021 19:40:17 +0300 Subject: [PATCH 03/29] change jupyter kernel --- notebooks/202-facies-segmentation/facies_demo.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 2a9fab1eb6d..cd24e95c297 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -753,9 +753,9 @@ ], "metadata": { "kernelspec": { - "display_name": "py_demo_env", + "display_name": "Python 3", "language": "python", - "name": "py_demo_env" + "name": "python3" }, "language_info": { "codemirror_mode": { From fc660aa67acc6f6214b78abbbc845ed43632640f Mon Sep 17 00:00:00 2001 From: Alexey Khorkin Date: Thu, 29 Apr 2021 19:03:10 +0300 Subject: [PATCH 04/29] clear notebook cells output --- .../202-facies-segmentation/facies_demo.ipynb | 376 ++---------------- 1 file changed, 38 insertions(+), 338 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index cd24e95c297..8c4728e400a 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -66,53 +66,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[setupvars.sh] OpenVINO environment initialized\n", - "env: TBB_DIR=/opt/intel/openvino_2021/deployment_tools/inference_engine/external/tbb/cmake/\n", - "-- The C compiler identification is GNU 7.5.0\n", - "-- The CXX compiler identification is GNU 7.5.0\n", - "-- Check for working C compiler: /usr/bin/cc\n", - "-- Check for working C compiler: /usr/bin/cc -- works\n", - "-- Detecting C compiler ABI info\n", - "-- Detecting C compiler ABI info - done\n", - "-- Detecting C compile features\n", - "-- Detecting C compile features - done\n", - "-- Check for working CXX compiler: /usr/bin/c++\n", - "-- Check for working CXX compiler: /usr/bin/c++ -- works\n", - "-- Detecting CXX compiler ABI info\n", - "-- Detecting CXX compiler ABI info - done\n", - "-- Detecting CXX compile features\n", - "-- Detecting CXX compile features - done\n", - "-- Found InferenceEngine: /opt/intel/openvino_2021/deployment_tools/inference_engine/lib/intel64/libinference_engine.so \n", - "CMake Warning (dev) in CMakeLists.txt:\n", - " No cmake_minimum_required command is present. A line of code such as\n", - "\n", - " cmake_minimum_required(VERSION 3.10)\n", - "\n", - " should be added at the top of the file. The version specified may be lower\n", - " if you wish to support older CMake versions for this project. For more\n", - " information run \"cmake --help-policy CMP0000\".\n", - "This warning is for project developers. Use -Wno-dev to suppress it.\n", - "\n", - "-- Configuring done\n", - "-- Generating done\n", - "-- Build files have been written to: /home/akhorkin/Repositories/openvino_notebooks/notebooks/202-facies-segmentation/user_ie_extensions/build\n", - "\u001b[35m\u001b[1mScanning dependencies of target unpool_cpu_extension\u001b[0m\n", - "[ 20%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.o\u001b[0m\n", - "[ 40%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/cpu_kernel.o\u001b[0m\n", - "[ 60%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/extension.o\u001b[0m\n", - "[ 80%] \u001b[32mBuilding CXX object CMakeFiles/unpool_cpu_extension.dir/op.o\u001b[0m\n", - "[100%] \u001b[32m\u001b[1mLinking CXX shared library libunpool_cpu_extension.so\u001b[0m\n", - "[100%] Built target unpool_cpu_extension\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "openvino_install_dir = '/opt/intel/openvino_2021'\n", "! source {openvino_install_dir}/bin/setupvars.sh\n", @@ -135,102 +91,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: numpy==1.19.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 1)) (1.19.4)\n", - "Requirement already satisfied: matplotlib==3.3.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 2)) (3.3.3)\n", - "Requirement already satisfied: ipywidgets==7.5.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 3)) (7.5.1)\n", - "Requirement already satisfied: tqdm==4.39.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 4)) (4.39.0)\n", - "Requirement already satisfied: itk==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 5)) (5.1.2)\n", - "Requirement already satisfied: itk-core==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 6)) (5.1.2)\n", - "Requirement already satisfied: itk-filtering==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 7)) (5.1.2)\n", - "Requirement already satisfied: itk-io==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 8)) (5.1.2)\n", - "Requirement already satisfied: itk-meshtopolydata==0.6.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 9)) (0.6.2)\n", - "Requirement already satisfied: itk-numerics==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 10)) (5.1.2)\n", - "Requirement already satisfied: itk-registration==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 11)) (5.1.2)\n", - "Requirement already satisfied: itk-segmentation==5.1.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 12)) (5.1.2)\n", - "Requirement already satisfied: itkwidgets==0.23.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 13)) (0.23.1)\n", - "Requirement already satisfied: segyio==1.9.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 14)) (1.9.1)\n", - "Requirement already satisfied: imageio==2.9.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 15)) (2.9.0)\n", - "Requirement already satisfied: ipympl==0.5.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from -r requirements.txt (line 16)) (0.5.1)\n", - "Requirement already satisfied: cycler>=0.10 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (0.10.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (1.3.1)\n", - "Requirement already satisfied: pillow>=6.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (8.1.0)\n", - "Requirement already satisfied: python-dateutil>=2.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.8.1)\n", - "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from matplotlib==3.3.3->-r requirements.txt (line 2)) (2.4.7)\n", - "Requirement already satisfied: nbformat>=4.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.1.2)\n", - "Requirement already satisfied: ipython>=4.0.0; python_version >= \"3.3\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (7.16.1)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.3.3)\n", - "Requirement already satisfied: ipykernel>=4.5.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (5.4.3)\n", - "Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.5.1)\n", - "Requirement already satisfied: ipydatawidgets>=4.0.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (4.2.0)\n", - "Requirement already satisfied: colorcet in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (2.0.6)\n", - "Requirement already satisfied: scipy in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.5.4)\n", - "Requirement already satisfied: zstandard in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.15.1)\n", - "Requirement already satisfied: six in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.15.0)\n", - "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.0)\n", - "Requirement already satisfied: jupyter-core in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.7.0)\n", - "Requirement already satisfied: ipython-genutils in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.0.14)\n", - "Requirement already satisfied: setuptools>=18.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (46.0.0)\n", - "Requirement already satisfied: decorator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.4.2)\n", - "Requirement already satisfied: backcall in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.0)\n", - "Requirement already satisfied: pexpect; sys_platform != \"win32\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (4.8.0)\n", - "Requirement already satisfied: pickleshare in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.5)\n", - "Requirement already satisfied: jedi>=0.10 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.18.0)\n", - "Requirement already satisfied: pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.7.4)\n", - "Requirement already satisfied: tornado>=4.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1)\n", - "Requirement already satisfied: jupyter-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.1.11)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: notebook>=4.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.2.0)\n", - "Requirement already satisfied: traittypes>=0.2.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from ipydatawidgets>=4.0.1->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.2.1)\n", - "Requirement already satisfied: pyct>=0.4.4 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from colorcet->itkwidgets==0.23.1->-r requirements.txt (line 13)) (0.4.8)\n", - "Requirement already satisfied: param>=1.7.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from colorcet->itkwidgets==0.23.1->-r requirements.txt (line 13)) (1.10.1)\n", - "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", - "Requirement already satisfied: pyrsistent>=0.14.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.17.3)\n", - "Requirement already satisfied: attrs>=17.4.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.3.0)\n", - "Requirement already satisfied: wcwidth in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.2.5)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from pexpect; sys_platform != \"win32\"->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.7.0)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jedi>=0.10->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.8.1)\n", - "Requirement already satisfied: pyzmq>=13 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets==7.5.1->-r requirements.txt (line 3)) (21.0.2)\n", - "Requirement already satisfied: nbconvert in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (6.0.7)\n", - "Requirement already satisfied: argon2-cffi in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.1.0)\n", - "Requirement already satisfied: terminado>=0.8.3 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.9.2)\n", - "Requirement already satisfied: prometheus-client in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.9.0)\n", - "Requirement already satisfied: jinja2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.11.2)\n", - "Requirement already satisfied: Send2Trash>=1.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.5.0)\n", - "Requirement already satisfied: zipp>=0.5 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.4.0)\n", - "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.7.4.3)\n", - "Requirement already satisfied: jupyterlab-pygments in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.1.2)\n", - "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", - "Requirement already satisfied: mistune<2,>=0.8.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.8.4)\n", - "Requirement already satisfied: defusedxml in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.6.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", - "Requirement already satisfied: testpath in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.4.4)\n", - "Requirement already satisfied: entrypoints>=0.2.2 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.3)\n", - "Requirement already satisfied: bleach in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (3.2.3)\n", - "Requirement already satisfied: cffi>=1.0.0 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.14.4)\n", - "Requirement already satisfied: MarkupSafe>=0.23 in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.1.1)\n", - "Requirement already satisfied: async-generator in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.10)\n", - "Requirement already satisfied: nest-asyncio in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (1.4.3)\n", - "Requirement already satisfied: packaging in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (20.8)\n", - "Requirement already satisfied: webencodings in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (0.5.1)\n", - "Requirement already satisfied: pycparser in /home/akhorkin/.virtualenvs/python_demo_env/lib/python3.6/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets==7.5.1->-r requirements.txt (line 3)) (2.20)\n", - "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1 is available.\n", - "You should consider upgrading via the '/home/akhorkin/.virtualenvs/python_demo_env/bin/python -m pip install --upgrade pip' command.\u001b[0m\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# install prerequinces for the demo\n", "import sys\n", @@ -248,74 +111,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/bin/bash: line 0: cd: notebooks/202-facies-segmentation: No such file or directory\n", - "--2021-04-27 17:37:10-- https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1\n", - "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 301 Moved Permanently\n", - "Location: /s/dl/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin [following]\n", - "--2021-04-27 17:37:11-- https://www.dropbox.com/s/dl/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin\n", - "Reusing existing connection to www.dropbox.com:443.\n", - "Proxy request sent, awaiting response... 302 Found\n", - "Location: https://uc5c9819d023d7f0bcdf3f8f89d8.dl.dropboxusercontent.com/cd/0/get/BNZw3-ECMZatW9yusRW-pGBgDtltUrULzh_JgZOQhNp-4zsv7kw_EL-NrH0oQTfcT0d1uVau7n2bC-ASaXpycxCwnodDOudiDb5n9qte8n5wUs_vWYNHTsIVtIOQJcLuQwxVB081a51FrhZ1-RfkIEee/file?dl=1# [following]\n", - "--2021-04-27 17:37:11-- https://uc5c9819d023d7f0bcdf3f8f89d8.dl.dropboxusercontent.com/cd/0/get/BNZw3-ECMZatW9yusRW-pGBgDtltUrULzh_JgZOQhNp-4zsv7kw_EL-NrH0oQTfcT0d1uVau7n2bC-ASaXpycxCwnodDOudiDb5n9qte8n5wUs_vWYNHTsIVtIOQJcLuQwxVB081a51FrhZ1-RfkIEee/file?dl=1\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 200 OK\n", - "Length: 335991832 (320M) [application/binary]\n", - "Saving to: ‘model/facies-segmentation-deconvnet.bin’\n", - "\n", - "model/facies-segmen 100%[===================>] 320.43M 2.11MB/s in 2m 58s \n", - "\n", - "2021-04-27 17:40:11 (1.80 MB/s) - ‘model/facies-segmentation-deconvnet.bin’ saved [335991832/335991832]\n", - "\n", - "--2021-04-27 17:40:11-- https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1\n", - "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 301 Moved Permanently\n", - "Location: /s/dl/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml [following]\n", - "--2021-04-27 17:40:12-- https://www.dropbox.com/s/dl/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml\n", - "Reusing existing connection to www.dropbox.com:443.\n", - "Proxy request sent, awaiting response... 302 Found\n", - "Location: https://uc8028a8848a9b43e638f0b88149.dl.dropboxusercontent.com/cd/0/get/BNZkRZhAZQuCfpKeupqABfRfU819NSWH_T52vWpMUW1fFUcnQN8XOFfODeW6Dpm3e9gMNG_AuOTQaiAWIonLsD8QNxUfyRSUdSJTysGNbHoKo2I7FoNWFEC7IkOs_uHitg1K4n6a80hu_Fv7AvpmiCin/file?dl=1# [following]\n", - "--2021-04-27 17:40:13-- https://uc8028a8848a9b43e638f0b88149.dl.dropboxusercontent.com/cd/0/get/BNZkRZhAZQuCfpKeupqABfRfU819NSWH_T52vWpMUW1fFUcnQN8XOFfODeW6Dpm3e9gMNG_AuOTQaiAWIonLsD8QNxUfyRSUdSJTysGNbHoKo2I7FoNWFEC7IkOs_uHitg1K4n6a80hu_Fv7AvpmiCin/file?dl=1\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 200 OK\n", - "Length: 80558 (79K) [application/binary]\n", - "Saving to: ‘model/facies-segmentation-deconvnet.xml’\n", - "\n", - "model/facies-segmen 100%[===================>] 78.67K 273KB/s in 0.3s \n", - "\n", - "2021-04-27 17:40:15 (273 KB/s) - ‘model/facies-segmentation-deconvnet.xml’ saved [80558/80558]\n", - "\n", - "--2021-04-27 17:40:15-- https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1\n", - "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 301 Moved Permanently\n", - "Location: /s/dl/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping [following]\n", - "--2021-04-27 17:40:16-- https://www.dropbox.com/s/dl/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping\n", - "Reusing existing connection to www.dropbox.com:443.\n", - "Proxy request sent, awaiting response... 302 Found\n", - "Location: https://uca01a6aa1ee425b20421e7a915e.dl.dropboxusercontent.com/cd/0/get/BNaxHiAJJHARHCp8Ti516LzU4RqX2Pp9JhcuUX-Nq0kU9w_cn6Gs5BzQS5-1lYSQCqRQCBdg-OSvkcBQQXSZwYgoUd2l2Kt3I96oLuLFCHSUtZZ01rXJXg_SVLpU4UuxABLVbWD4VRS__lTCeul3cyuy/file?dl=1# [following]\n", - "--2021-04-27 17:40:17-- https://uca01a6aa1ee425b20421e7a915e.dl.dropboxusercontent.com/cd/0/get/BNaxHiAJJHARHCp8Ti516LzU4RqX2Pp9JhcuUX-Nq0kU9w_cn6Gs5BzQS5-1lYSQCqRQCBdg-OSvkcBQQXSZwYgoUd2l2Kt3I96oLuLFCHSUtZZ01rXJXg_SVLpU4UuxABLVbWD4VRS__lTCeul3cyuy/file?dl=1\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 200 OK\n", - "Length: 12158 (12K) [application/binary]\n", - "Saving to: ‘model/facies-segmentation-deconvnet.mapping’\n", - "\n", - "model/facies-segmen 100%[===================>] 11.87K --.-KB/s in 0s \n", - "\n", - "2021-04-27 17:40:18 (123 MB/s) - ‘model/facies-segmentation-deconvnet.mapping’ saved [12158/12158]\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "! cd notebooks/202-facies-segmentation\n", "! mkdir model\n", @@ -333,38 +131,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2021-04-27 17:40:18-- https://zenodo.org/record/3755060/files/data.zip\n", - "Resolving proxy-chain.intel.com (proxy-chain.intel.com)... 163.33.7.140\n", - "Connecting to proxy-chain.intel.com (proxy-chain.intel.com)|163.33.7.140|:912... connected.\n", - "Proxy request sent, awaiting response... 200 OK\n", - "Length: 1051449986 (1003M) [application/octet-stream]\n", - "Saving to: ‘data.zip’\n", - "\n", - "data.zip 100%[===================>] 1003M 675KB/s in 32m 53s \n", - "\n", - "2021-04-27 18:14:24 (520 KB/s) - ‘data.zip’ saved [1051449986/1051449986]\n", - "\n", - "Archive: data.zip\n", - " creating: data/\n", - " creating: data/train/\n", - " inflating: data/train/train_seismic.npy \n", - " inflating: data/train/train_labels.npy \n", - " creating: data/test_once/\n", - " inflating: data/test_once/test1_seismic.npy \n", - " inflating: data/test_once/test2_labels.npy \n", - " inflating: data/test_once/test1_labels.npy \n", - " inflating: data/test_once/test2_seismic.npy \n", - " inflating: data/.dropbox \n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Download dataset\n", "! wget https://zenodo.org/record/3755060/files/data.zip\n", @@ -381,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -403,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -448,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -471,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -500,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -542,18 +311,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[INFO] Dataset has been loaded, shape is (601, 200, 255)\n", - "[INFO] Dataset mean is 0.00000, std 0.20977\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "config = get_config()\n", "data = load_data(config)" @@ -568,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -587,18 +347,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[INFO] Infer should be on [500, 244] resolution\n", - "[INFO] Reshaping model to fit for slice shape: [500, 244]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "reshape_model(net, data.shape)\n", "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" @@ -613,17 +364,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 169/169 [00:27<00:00, 6.18it/s]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predicted_data = infer_cube(exec_net, data)" ] @@ -644,7 +387,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -663,22 +406,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "cmap = discrete_cmap(len(config[\"name_classes\"]), 'jet')\n", "show_legend(config[\"name_classes\"], cmap)\n", @@ -697,48 +427,18 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6bcba087455c4a948f673a818661c5c3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Viewer(cmap='Custom matplotlib 1619536503.683635', geometries=[], gradient_opacity=0.22, point_sets=[], render…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "viewer_interpret_data" ] }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c56327e34b414c058918011e8be4892d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Viewer(cmap='Custom NumPy 1619536503.454224', geometries=[], gradient_opacity=0.22, point_sets=[], rendered_im…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "viewer_orig_data" ] From 41fe1f8d57fcf52e936e3e5cdebbbffcd81475f3 Mon Sep 17 00:00:00 2001 From: Alexey Khorkin Date: Thu, 29 Apr 2021 19:03:59 +0300 Subject: [PATCH 05/29] remove common requirements --- notebooks/202-facies-segmentation/requirements.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/notebooks/202-facies-segmentation/requirements.txt b/notebooks/202-facies-segmentation/requirements.txt index b11b1c6b340..fb7d2ab46d5 100644 --- a/notebooks/202-facies-segmentation/requirements.txt +++ b/notebooks/202-facies-segmentation/requirements.txt @@ -1,6 +1,3 @@ -numpy==1.19.4 -matplotlib==3.3.3 -ipywidgets==7.5.1 tqdm==4.39.0 itk==5.1.2 itk-core==5.1.2 @@ -11,6 +8,5 @@ itk-numerics==5.1.2 itk-registration==5.1.2 itk-segmentation==5.1.2 itkwidgets==0.23.1 -segyio==1.9.1 imageio==2.9.0 ipympl==0.5.1 From 8125e8ac7fdbc500228dab795809902acce72bc0 Mon Sep 17 00:00:00 2001 From: Alexey Khorkin Date: Thu, 29 Apr 2021 19:30:12 +0300 Subject: [PATCH 06/29] fix readme --- notebooks/202-facies-segmentation/README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/notebooks/202-facies-segmentation/README.md b/notebooks/202-facies-segmentation/README.md index 939c10e180b..b90c1ef79ab 100644 --- a/notebooks/202-facies-segmentation/README.md +++ b/notebooks/202-facies-segmentation/README.md @@ -2,9 +2,6 @@ This demo demonstrate how to run facies classification using OpenVINO™ - -Markdown Monster icon +![img](demo.png) See details in `facies_demo.ipynb` From 19a5ee77645b5d4f450508b47616b6c24e62f989 Mon Sep 17 00:00:00 2001 From: Alexey Khorkin Date: Tue, 11 May 2021 20:24:01 +0300 Subject: [PATCH 07/29] use openvino-extensions as pip package --- .../202-facies-segmentation/facies_demo.ipynb | 97 ++++++++++--------- 1 file changed, 51 insertions(+), 46 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 8c4728e400a..9c428c41ac1 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -35,33 +35,13 @@ "## Installation of dependencies" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "import numpy as np\n", - "import matplotlib as mpl\n", - "import matplotlib.pyplot as plt\n", - "import ipywidgets as widgets\n", - "\n", - "from tqdm import tqdm\n", - "from itkwidgets import view\n", - "from collections import defaultdict\n", - "from openvino.inference_engine import IECore" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Create the CPU extension\n", - "First of all, you need to create the required CPU extension, just follow the instructions below:\n", + "### Setup virtual-env\n", "\n", - "Steps to create CPU extension:" + "Step 1: You can install the required packages with the following command:" ] }, { @@ -70,23 +50,9 @@ "metadata": {}, "outputs": [], "source": [ - "openvino_install_dir = '/opt/intel/openvino_2021'\n", - "! source {openvino_install_dir}/bin/setupvars.sh\n", - "INTEL_OPENVINO_DIR = os.environ['INTEL_OPENVINO_DIR']\n", - "# set ENV:\n", - "%env TBB_DIR= {INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/cmake/\n", - "! mkdir ./user_ie_extensions/build\n", - "! cd ./user_ie_extensions/build && cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc --all)\n", - "! mv ./user_ie_extensions/build/libunpool_cpu_extension.so ./" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setup virtual-env\n", - "\n", - "Step 1: You can install the required packages with the following command:" + "# install prerequinces for the demo\n", + "import sys\n", + "!{sys.executable} -m pip install -r requirements.txt" ] }, { @@ -95,9 +61,16 @@ "metadata": {}, "outputs": [], "source": [ - "# install prerequinces for the demo\n", + "import os\n", "import sys\n", - "!{sys.executable} -m pip install -r requirements.txt" + "import numpy as np\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import ipywidgets as widgets\n", + "\n", + "from tqdm import tqdm\n", + "from itkwidgets import view\n", + "from collections import defaultdict" ] }, { @@ -162,7 +135,6 @@ " \"name_classes\": ['upper_ns', 'middle_ns',\n", " 'lower_ns', 'rijnland_chalk',\n", " 'scruff', 'zechstein'],\n", - " \"cpu_extension\": 'libunpool_cpu_extension.so',\n", " \"edge_one\": (0,30,0),\n", " \"edge_two\": (500, 199, 244),\n", " \"device\":\"CPU\"})\n", @@ -319,6 +291,29 @@ "data = load_data(config)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Install OpenVINO extensions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! pip install openvino-extensions==0.0.2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -326,6 +321,16 @@ "### Load model" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from openvino_extensions import get_extensions_path\n", + "from openvino.inference_engine import IECore" + ] + }, { "cell_type": "code", "execution_count": null, @@ -333,8 +338,8 @@ "outputs": [], "source": [ "ie = IECore()\n", - "if config[\"cpu_extension\"] and config[\"device\"] == \"CPU\":\n", - " ie.add_extension(config[\"cpu_extension\"], \"CPU\")\n", + "if config[\"device\"] == \"CPU\":\n", + " ie.add_extension(get_extensions_path(), \"CPU\")\n", "net = ie.read_network(config[\"model\"], os.path.splitext(config[\"model\"])[0] + \".bin\")" ] }, @@ -453,9 +458,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "openvino_env", "language": "python", - "name": "python3" + "name": "openvino_env" }, "language_info": { "codemirror_mode": { From 33d1e51f720bb518a363679cc74c3b0afb8b87d1 Mon Sep 17 00:00:00 2001 From: Alexey Khorkin Date: Wed, 12 May 2021 01:17:15 +0300 Subject: [PATCH 08/29] remove .cpp files and some demo fixes --- .../202-facies-segmentation/facies_demo.ipynb | 84 ++++++----- .../202-facies-segmentation/requirements.txt | 1 + .../user_ie_extensions/CMakeLists.txt | 20 --- .../user_ie_extensions/cpu_kernel.cpp | 135 ------------------ .../user_ie_extensions/cpu_kernel.hpp | 31 ---- .../user_ie_extensions/extension.cpp | 73 ---------- .../user_ie_extensions/extension.hpp | 31 ---- .../user_ie_extensions/op.cpp | 42 ------ .../user_ie_extensions/op.hpp | 28 ---- 9 files changed, 47 insertions(+), 398 deletions(-) delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/op.cpp delete mode 100644 notebooks/202-facies-segmentation/user_ie_extensions/op.hpp diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 9c428c41ac1..b1248259e8e 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -61,7 +61,6 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", "import sys\n", "import numpy as np\n", "import matplotlib as mpl\n", @@ -102,6 +101,13 @@ "### Download dataset:" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset is used from here: https://github.com/yalaudah/facies_classification_benchmark" + ] + }, { "cell_type": "code", "execution_count": null, @@ -109,9 +115,8 @@ "outputs": [], "source": [ "# Download dataset\n", - "! wget https://zenodo.org/record/3755060/files/data.zip\n", - "! unzip data.zip\n", - "! rm -rf data.zip data/train" + "! mkdir data\n", + "! wget -O data/test2_seismic.npy https://www.dropbox.com/s/sbj2atyukpjgssx/test2_seismic.npy?dl=1" ] }, { @@ -131,11 +136,11 @@ " config = defaultdict(str)\n", " config.update({\n", " \"model\": 'model/facies-segmentation-deconvnet.xml',\n", - " \"data_path\": 'data/test_once/test2_seismic.npy',\n", + " \"data_path\": 'data/test2_seismic.npy',\n", " \"name_classes\": ['upper_ns', 'middle_ns',\n", - " 'lower_ns', 'rijnland_chalk',\n", - " 'scruff', 'zechstein'],\n", - " \"edge_one\": (0,30,0),\n", + " 'lower_ns', 'rijnland_chalk',\n", + " 'scruff', 'zechstein'],\n", + " \"edge_one\": (0, 30, 0),\n", " \"edge_two\": (500, 199, 244),\n", " \"device\":\"CPU\"})\n", "\n", @@ -193,10 +198,13 @@ "metadata": {}, "outputs": [], "source": [ - "def reshape_model(net, shape):\n", - " index_of_minimal_dim = np.argmin(shape)\n", + "def reshape_model(net, shape, axis=None):\n", + " if axis is None:\n", + " index_of_dim = np.argmin(shape)\n", + " else:\n", + " index_of_dim = axis\n", " input_data_shape = list(shape)\n", - " del input_data_shape[index_of_minimal_dim]\n", + " del input_data_shape[index_of_dim]\n", "\n", " input_net_info = net.input_info\n", " input_name = next(iter(input_net_info))\n", @@ -216,22 +224,25 @@ "metadata": {}, "outputs": [], "source": [ - "def infer_cube(exec_net, data):\n", - " index_of_minimal_dim = np.argmin(data.shape)\n", + "def infer_cube(exec_net, data, axis=None):\n", + " if axis is None:\n", + " index_of_dim = np.argmin(data.shape)\n", + " else:\n", + " index_of_dim = axis\n", " predicted_cube = np.empty(data.shape)\n", - " size = data.shape[index_of_minimal_dim]\n", + " size = data.shape[index_of_dim]\n", " for slice_index in tqdm(range(size)):\n", - " if index_of_minimal_dim == 0:\n", + " if index_of_dim == 0:\n", " inp = data[slice_index, :, :]\n", " out = exec_net.infer(inputs={'input': inp})['output']\n", " out = np.argmax(out, axis=1).squeeze()\n", " predicted_cube[slice_index, :, :] = out\n", - " if index_of_minimal_dim == 1:\n", + " if index_of_dim == 1:\n", " inp = data[:, slice_index, :]\n", " out = exec_net.infer(inputs={'input': inp})['output']\n", " out = np.argmax(out, axis=1).squeeze()\n", " predicted_cube[:, slice_index, :] = out\n", - " if index_of_minimal_dim == 2:\n", + " if index_of_dim == 2:\n", " inp = data[:, :, slice_index]\n", " out = exec_net.infer(inputs={'input': inp})['output']\n", " out = np.argmax(out, axis=1).squeeze()\n", @@ -291,22 +302,6 @@ "data = load_data(config)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Install OpenVINO extensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! pip install openvino-extensions==0.0.2" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -338,9 +333,8 @@ "outputs": [], "source": [ "ie = IECore()\n", - "if config[\"device\"] == \"CPU\":\n", - " ie.add_extension(get_extensions_path(), \"CPU\")\n", - "net = ie.read_network(config[\"model\"], os.path.splitext(config[\"model\"])[0] + \".bin\")" + "ie.add_extension(get_extensions_path(), \"CPU\")\n", + "net = ie.read_network(config[\"model\"])" ] }, { @@ -356,7 +350,7 @@ "metadata": {}, "outputs": [], "source": [ - "reshape_model(net, data.shape)\n", + "reshape_model(net, data.shape, axis=1)\n", "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" ] }, @@ -373,7 +367,14 @@ "metadata": {}, "outputs": [], "source": [ - "predicted_data = infer_cube(exec_net, data)" + "predicted_data = infer_cube(exec_net, data, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the inference of the model is running. Slices along the axis 1 are fed to the input and the result is combined into an output cube (`predicted_data`)." ] }, { @@ -448,6 +449,13 @@ "viewer_orig_data" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now see a visualization of the interpreted and raw seismic data. You can interactively use your mouse to rotate or zoom in and explore interpretated data." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/notebooks/202-facies-segmentation/requirements.txt b/notebooks/202-facies-segmentation/requirements.txt index fb7d2ab46d5..2adf8e3d4be 100644 --- a/notebooks/202-facies-segmentation/requirements.txt +++ b/notebooks/202-facies-segmentation/requirements.txt @@ -10,3 +10,4 @@ itk-segmentation==5.1.2 itkwidgets==0.23.1 imageio==2.9.0 ipympl==0.5.1 +openvino-extensions==0.0.2 diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt b/notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt deleted file mode 100644 index ee2c9d7f4b0..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (C) 2020 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 -# - -# [cmake:extension] -set(TARGET_NAME "unpool_cpu_extension") - -find_package(ngraph REQUIRED) -find_package(InferenceEngine REQUIRED) -find_package(TBB REQUIRED tbb tbbmalloc) - -file(GLOB_RECURSE SRC *.cpp) - -add_library(${TARGET_NAME} SHARED ${SRC}) - -target_compile_definitions(${TARGET_NAME} PRIVATE IMPLEMENT_INFERENCE_EXTENSION_API) -target_link_libraries(${TARGET_NAME} PRIVATE ${InferenceEngine_LIBRARIES} - ${NGRAPH_LIBRARIES} - ${TBB_IMPORTED_TARGETS}) -# [cmake:extension] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp b/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp deleted file mode 100644 index 73e40a0c4d6..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -#include "cpu_kernel.hpp" -#include "op.hpp" -#include
-#include -#include "ie_parallel.hpp" - -using namespace TemplateExtension; - -//! [cpu_implementation:ctor] -OpImplementation::OpImplementation(const std::shared_ptr &node) { - try { - auto castedNode = std::dynamic_pointer_cast(node); - if (!castedNode) - THROW_IE_EXCEPTION << "Cannot create implementation for unknown operation!"; - if (castedNode->inputs().size() != 4 || castedNode->outputs().size() != 1) - THROW_IE_EXCEPTION << "Cannot create implementation for operation with incorrect number of inputs or outputs!"; - if (castedNode->get_input_partial_shape(0).is_dynamic() || castedNode->get_output_partial_shape(0).is_dynamic()) - THROW_IE_EXCEPTION << "Cannot create implementation for op with dynamic shapes!"; - if (castedNode->get_input_shape(0).size() != 4 || castedNode->get_output_shape(0).size() != 4) - THROW_IE_EXCEPTION << "Operation supports only 4d tensors for input and output."; - if (castedNode->get_input_element_type(0) != ngraph::element::f32 || castedNode->get_output_element_type(0) != ngraph::element::f32) - THROW_IE_EXCEPTION << "Operation supports only FP32 tensors."; - inShapes.resize(4); - for (int i = 0; i < 4; ++i) - inShapes[i] = castedNode->get_input_shape(i); - outShape = castedNode->get_output_shape(0); - - mask.resize(inShapes[1][0]*inShapes[1][1]*inShapes[1][2]*inShapes[1][3]); - } catch (InferenceEngine::details::InferenceEngineException& ex) { - error = ex.what(); - } -} -//! [cpu_implementation:ctor] - -//! [cpu_implementation:getSupportedConfigurations] -InferenceEngine::StatusCode OpImplementation::getSupportedConfigurations(std::vector &conf, - InferenceEngine::ResponseDesc *resp) noexcept { - std::vector inDataConfig; - std::vector outDataConfig; - InferenceEngine::SizeVector order = {0, 1, 2, 3}; - // Allow any offset before data - size_t offset((std::numeric_limits::max)()); - - // Input shape - for (const auto& shape : inShapes) - { - InferenceEngine::DataConfig inpConf; - inpConf.desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, shape, {shape, order, offset}); - inDataConfig.push_back(inpConf); - } - - // Output shape - InferenceEngine::DataConfig outConf; - outConf.desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, outShape, {outShape, order, offset}); - outDataConfig.push_back(outConf); - - InferenceEngine::LayerConfig layerConfig; - layerConfig.inConfs = inDataConfig; - layerConfig.outConfs = outDataConfig; - - conf.push_back(layerConfig); - return InferenceEngine::StatusCode::OK; -} -//! [cpu_implementation:getSupportedConfigurations] - -//! [cpu_implementation:init] -InferenceEngine::StatusCode OpImplementation::init(InferenceEngine::LayerConfig &config, InferenceEngine::ResponseDesc *resp) noexcept { - try { - if (config.inConfs.size() != 4 || config.outConfs.size() != 1) { - THROW_IE_EXCEPTION << "Operation cannot be initialized with incorrect number of inputs/outputs!"; - } - - if (config.inConfs[0].desc.getDims().size() != 4 || config.outConfs[0].desc.getDims().size() != 4) { - THROW_IE_EXCEPTION << "Operation can be initialized only with 4d input/output tensors!"; - } - - if (config.outConfs[0].desc.getPrecision() != InferenceEngine::Precision::FP32 || - config.inConfs[0].desc.getPrecision() != InferenceEngine::Precision::FP32) { - THROW_IE_EXCEPTION << "Operation supports only FP32 precisions!"; - } - } catch (InferenceEngine::details::InferenceEngineException& ex) { - if (resp) { - strncpy(resp->msg, error.c_str(), sizeof(resp->msg) - 1); - resp->msg[sizeof(resp->msg)-1] = 0; - } - return InferenceEngine::GENERAL_ERROR; - } - - return InferenceEngine::OK; -} -//! [cpu_implementation:init] - -//! [cpu_implementation:execute] -InferenceEngine::StatusCode OpImplementation::execute(std::vector &inputs, - std::vector &outputs, - InferenceEngine::ResponseDesc *resp) noexcept { - const float* poolInp = inputs[0]->cbuffer().as(); - const float* poolOut = inputs[1]->cbuffer().as(); - const float* inp = inputs[2]->cbuffer().as(); - float* out = outputs[0]->buffer().as(); - - std::vector poolInpDims = inputs[0]->getTensorDesc().getDims(); - std::vector poolOutDims = inputs[1]->getTensorDesc().getDims(); - std::vector inpDims = inputs[2]->getTensorDesc().getDims(); - std::vector outDims = outputs[0]->getTensorDesc().getDims(); - - const size_t batch = poolInpDims[0]; - const size_t channels = poolInpDims[1]; - const size_t height = poolInpDims[2]; - const size_t width = poolInpDims[3]; - const size_t outHeight = outDims[2]; - const size_t outWidth = outDims[3]; - const size_t poolOutHeight = poolOutDims[2]; - const size_t poolOutWidth = poolOutDims[3]; - std::fill(mask.begin(), mask.end(), false); - memset(out, 0, outputs[0]->byteSize()); - InferenceEngine::parallel_for(batch*channels, [&](size_t d) { - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - int poolOutIdx = (d * poolOutHeight + y / 2) * poolOutWidth + x / 2; - int poolInpIdx = (d * height + y) * width + x; - int dstIdx = d * outHeight * outWidth + (y * width + x); - if (fabs(poolInp[poolInpIdx] - poolOut[poolOutIdx]) < 1e-5f && !mask[poolOutIdx]) { - out[dstIdx] = inp[poolOutIdx]; - mask[poolOutIdx] = true; - } - } - } - }); - return InferenceEngine::OK; -} -//! [cpu_implementation:execute] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp b/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp deleted file mode 100644 index c80ac80f1c0..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/cpu_kernel.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#pragma once - -#include -#include - -namespace TemplateExtension { - -//! [cpu_implementation:header] -class OpImplementation : public InferenceEngine::ILayerExecImpl { -public: - explicit OpImplementation(const std::shared_ptr& node); - InferenceEngine::StatusCode getSupportedConfigurations(std::vector &conf, - InferenceEngine::ResponseDesc *resp) noexcept override; - InferenceEngine::StatusCode init(InferenceEngine::LayerConfig &config, - InferenceEngine::ResponseDesc *resp) noexcept override; - InferenceEngine::StatusCode execute(std::vector &inputs, - std::vector &outputs, - InferenceEngine::ResponseDesc *resp) noexcept override; -private: - std::vector inShapes; - ngraph::Shape outShape; - std::string error; - std::vector mask; -}; -//! [cpu_implementation:header] - -} // namespace TemplateExtension diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp b/notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp deleted file mode 100644 index f4b8bef4216..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/extension.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -#include "extension.hpp" -#include "cpu_kernel.hpp" -#include "op.hpp" -#include -#include - -#include -#include -#include -#include -#include - -using namespace TemplateExtension; - -//! [extension:GetVersion] -void Extension::GetVersion(const InferenceEngine::Version *&versionInfo) const noexcept { - static InferenceEngine::Version ExtensionDescription = { - {1, 0}, // extension API version - "1.0", - "template_ext" // extension description message - }; - - versionInfo = &ExtensionDescription; -} -//! [extension:GetVersion] - -//! [extension:getOpSets] -std::map Extension::getOpSets() { - std::map opsets; - ngraph::OpSet opset; - opset.insert(); - opsets["extension"] = opset; - return opsets; -} -//! [extension:getOpSets] - -//! [extension:getImplTypes] -std::vector Extension::getImplTypes(const std::shared_ptr &node) { - if (std::dynamic_pointer_cast(node)) { - return {"CPU"}; - } - return {}; -} -//! [extension:getImplTypes] - -//! [extension:getImplementation] -InferenceEngine::ILayerImpl::Ptr Extension::getImplementation(const std::shared_ptr &node, const std::string &implType) { - if (std::dynamic_pointer_cast(node) && implType == "CPU") { - return std::make_shared(node); - } - return nullptr; -} -//! [extension:getImplementation] - -//! [extension:CreateExtension] -// Exported function -INFERENCE_EXTENSION_API(InferenceEngine::StatusCode) InferenceEngine::CreateExtension(InferenceEngine::IExtension *&ext, - InferenceEngine::ResponseDesc *resp) noexcept { - try { - ext = new Extension(); - return OK; - } catch (std::exception &ex) { - if (resp) { - std::string err = ((std::string) "Couldn't create extension: ") + ex.what(); - err.copy(resp->msg, 255); - } - return InferenceEngine::GENERAL_ERROR; - } -} -//! [extension:CreateExtension] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp b/notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp deleted file mode 100644 index e74c6c4354d..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/extension.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -//! [extension:header] -namespace TemplateExtension { - -class Extension : public InferenceEngine::IExtension { -public: - Extension() = default; - void GetVersion(const InferenceEngine::Version*& versionInfo) const noexcept override; - void Unload() noexcept override {} - void Release() noexcept override { delete this; } - - std::map getOpSets() override; - std::vector getImplTypes(const std::shared_ptr& node) override; - InferenceEngine::ILayerImpl::Ptr getImplementation(const std::shared_ptr& node, const std::string& implType) override; -}; - -} // namespace TemplateExtension -//! [extension:header] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/op.cpp b/notebooks/202-facies-segmentation/user_ie_extensions/op.cpp deleted file mode 100644 index 7ea78d774ae..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/op.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// -#include "op.hpp" - -using namespace TemplateExtension; - -constexpr ngraph::NodeTypeInfo Operation::type_info; - -//! [op:ctor] -Operation::Operation(const ngraph::Output& poolInp, - const ngraph::Output& poolOut, - const ngraph::Output& inp, - const ngraph::Output& shape) : Op({poolInp, poolOut, inp, shape}) { - constructor_validate_and_infer_types(); -} -//! [op:ctor] - -//! [op:validate] -void Operation::validate_and_infer_types() { - auto outShape = get_input_partial_shape(3); - auto poolInpShape = get_input_partial_shape(0).to_shape(); - outShape[0] = poolInpShape[0]; // Use only spatial dimensions from shape - outShape[1] = poolInpShape[1]; // and restore batch and channels - set_output_type(0, get_input_element_type(0), outShape); -} -//! [op:validate] - -//! [op:copy] -std::shared_ptr Operation::clone_with_new_inputs(const ngraph::OutputVector &new_args) const { - if (new_args.size() != 4) { - throw ngraph::ngraph_error("Incorrect number of new arguments"); - } - return std::make_shared(new_args.at(0), new_args.at(1), new_args.at(2), new_args.at(3)); -} -//! [op:copy] - -//! [op:visit_attributes] -bool Operation::visit_attributes(ngraph::AttributeVisitor &visitor) { - return true; -} -//! [op:visit_attributes] diff --git a/notebooks/202-facies-segmentation/user_ie_extensions/op.hpp b/notebooks/202-facies-segmentation/user_ie_extensions/op.hpp deleted file mode 100644 index 97a5aa3c612..00000000000 --- a/notebooks/202-facies-segmentation/user_ie_extensions/op.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#pragma once - -#include - -//! [op:header] -namespace TemplateExtension { - -class Operation : public ngraph::op::Op { -public: - static constexpr ngraph::NodeTypeInfo type_info{"MaxPoolGrad", 0}; - const ngraph::NodeTypeInfo& get_type_info() const override { return type_info; } - - Operation() = default; - Operation(const ngraph::Output& poolInp, - const ngraph::Output& poolOut, - const ngraph::Output& inp, - const ngraph::Output& shape); - void validate_and_infer_types() override; - std::shared_ptr clone_with_new_inputs(const ngraph::OutputVector& new_args) const override; - bool visit_attributes(ngraph::AttributeVisitor& visitor) override; -}; -//! [op:header] - -} // namespace TemplateExtension From 10aa3a771dca431c1c6a102147843f76e6ab3bb8 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Mon, 17 May 2021 15:52:32 +0300 Subject: [PATCH 09/29] replace openvino_extensions and itk* pip requirements --- notebooks/202-facies-segmentation/requirements.txt | 13 ------------- requirements.txt | 8 ++++++++ 2 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 notebooks/202-facies-segmentation/requirements.txt diff --git a/notebooks/202-facies-segmentation/requirements.txt b/notebooks/202-facies-segmentation/requirements.txt deleted file mode 100644 index 2adf8e3d4be..00000000000 --- a/notebooks/202-facies-segmentation/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -tqdm==4.39.0 -itk==5.1.2 -itk-core==5.1.2 -itk-filtering==5.1.2 -itk-io==5.1.2 -itk-meshtopolydata==0.6.2 -itk-numerics==5.1.2 -itk-registration==5.1.2 -itk-segmentation==5.1.2 -itkwidgets==0.23.1 -imageio==2.9.0 -ipympl==0.5.1 -openvino-extensions==0.0.2 diff --git a/requirements.txt b/requirements.txt index 79586e7b554..d73bea56c89 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ openvino-dev==2021.4 matplotlib<3.4 gdown pytube +tqdm # ONNX notebook requirements geffnet==0.9.8 @@ -27,3 +28,10 @@ jupyterlab ipython==7.10.* jedi==0.17.2 setuptools>=56.0.0 + +# 3D visualization +itk==5.1.2 +itkwidgets==0.23.1 + +# openvino extensions +openvino-extensions==0.0.2 From 56c1bdc0f366b42ef76e0940150a153874cb110a Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Mon, 17 May 2021 15:56:46 +0300 Subject: [PATCH 10/29] add 2d visualization before 3d --- .../202-facies-segmentation/facies_demo.ipynb | 195 ++++++++++++++++-- 1 file changed, 181 insertions(+), 14 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index b1248259e8e..51badb8f301 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -44,17 +44,6 @@ "Step 1: You can install the required packages with the following command:" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# install prerequinces for the demo\n", - "import sys\n", - "!{sys.executable} -m pip install -r requirements.txt" - ] - }, { "cell_type": "code", "execution_count": null, @@ -87,7 +76,6 @@ "metadata": {}, "outputs": [], "source": [ - "! cd notebooks/202-facies-segmentation\n", "! mkdir model\n", "! wget -O model/facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1 \n", "! wget -O model/facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1\n", @@ -140,6 +128,8 @@ " \"name_classes\": ['upper_ns', 'middle_ns',\n", " 'lower_ns', 'rijnland_chalk',\n", " 'scruff', 'zechstein'],\n", + " \"slice_no\": 101,\n", + " \"slice_axis\": 1,\n", " \"edge_one\": (0, 30, 0),\n", " \"edge_two\": (500, 199, 244),\n", " \"device\":\"CPU\"})\n", @@ -341,7 +331,184 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Prepare model" + "### Run model on a single slice" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's define function for decodig class labels into a color" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "LABEL_COLOURS = np.asarray([[69, 117, 180], [145, 191, 219],\n", + " [224, 243, 248], [254, 224, 144],\n", + " [252, 141, 89], [215, 48, 39]])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def decode_segmap(label_mask):\n", + " \"\"\"Decode segmentation class labels into a color image\n", + " Args:\n", + " label_mask (np.ndarray): an (M,N) array of integer values denoting\n", + " the class label at each spatial location.\n", + " plot (bool, optional): whether to show the resulting color image\n", + " in a figure.\n", + " Returns:\n", + " (np.ndarray, optional): the resulting decoded color image.\n", + " \"\"\"\n", + " r = label_mask.copy()\n", + " g = label_mask.copy()\n", + " b = label_mask.copy()\n", + " for ll in range(0, len(LABEL_COLOURS)):\n", + " r[label_mask == ll] = LABEL_COLOURS[ll, 0]\n", + " g[label_mask == ll] = LABEL_COLOURS[ll, 1]\n", + " b[label_mask == ll] = LABEL_COLOURS[ll, 2]\n", + " rgb = np.zeros((label_mask.shape[0], label_mask.shape[1], 3))\n", + " rgb[:, :, 0] = r / 255.0\n", + " rgb[:, :, 1] = g / 255.0\n", + " rgb[:, :, 2] = b / 255.0\n", + " return rgb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Function for plotting output from the model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def show_facies_interpretation(input_slice, output_labels_slice):\n", + " from matplotlib.colors import LinearSegmentedColormap\n", + "\n", + " res_image = decode_segmap(output_labels_slice.squeeze())\n", + "\n", + " color_list = LABEL_COLOURS / 255\n", + " cm = LinearSegmentedColormap.from_list('custom_cmap', color_list, N=6)\n", + " \n", + "\n", + " fig, axs = plt.subplots(2, 1, figsize=(15,15))\n", + " fig.suptitle(\"Facies classification results\", fontsize=22)\n", + " \n", + " axs[0].imshow(input_slice, cmap='Greys')\n", + " axs[0].set_title('Input data slice')\n", + " \n", + " im = axs[1].imshow(res_image, cmap=cm)\n", + " axs[1].set_title('Interpretation of the slice')\n", + " \n", + " cbaxes = fig.add_axes([0.81, 0.2, 0.01, 0.6])\n", + " cb = fig.colorbar(im, ax=axs[0], cax=cbaxes,\n", + " ticks=[0.23, 0.36, 0.5, 0.65, 0.78, 0.93])\n", + " cb.ax.set_yticklabels(['upper_ns', 'middle_ns', 'lower_ns',\n", + " 'rijnland_chalk', 'scruff', 'zechstein'],\n", + " fontsize=9, ha=\"left\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Prepare slice for 2d visualization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "seismic_data = np.load(config[\"data_path\"])\n", + "if config['slice_axis'] == 0:\n", + " inp_slice = seismic_data[config['slice_no'], :, :]\n", + "elif config['slice_axis'] == 1:\n", + " inp_slice = seismic_data[:, config['slice_no'], :]\n", + "elif config['slice_axis'] == 2:\n", + " inp_slice = seismic_data[:, :, config['slice_no']]\n", + "else:\n", + " assert False, 'Invalid slice_axis, it must be int 0, 1 or 2'\n", + "\n", + "seismic_data = normalize(seismic_data, mu=1e-8, std=0.2097654)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Prepare model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "reshape_model(net, seismic_data.shape, axis=config['slice_axis'])\n", + "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Infer model on a slice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "out_slice_from_model = exec_net.infer(inputs={'input': inp_slice})['output']\n", + "out_labels_slice = np.argmax(out_slice_from_model, axis=1).squeeze()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Show output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_facies_interpretation(inp_slice, out_labels_slice)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run model cube (multiple slices)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Prepare model" ] }, { @@ -358,7 +525,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Run model" + "#### Run inference (multiple slices)" ] }, { From 89f5ed74a74177e1290c2c86701c314efab85226 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Fri, 21 May 2021 01:15:16 +0300 Subject: [PATCH 11/29] update readme --- notebooks/202-facies-segmentation/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/notebooks/202-facies-segmentation/README.md b/notebooks/202-facies-segmentation/README.md index b90c1ef79ab..a34dcbaba0e 100644 --- a/notebooks/202-facies-segmentation/README.md +++ b/notebooks/202-facies-segmentation/README.md @@ -2,6 +2,14 @@ This demo demonstrate how to run facies classification using OpenVINO™ + +--- +**NOTE** + +For now the 3D visialization does not yet work in `Jupyter Lab`, please use `jupyter notebook` instead. + +--- + ![img](demo.png) See details in `facies_demo.ipynb` From b3f9d4dc5ad44cdfb7dc8e48dbf548fd9d6ea607 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Fri, 21 May 2021 01:15:44 +0300 Subject: [PATCH 12/29] add some fixes --- .../202-facies-segmentation/facies_demo.ipynb | 233 ++++++++++++------ 1 file changed, 152 insertions(+), 81 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 51badb8f301..8ee8fea6374 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -11,6 +11,20 @@ "This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "**NOTE**\n", + "\n", + "For now the 3D visialization does not yet work in `Jupyter Lab`, please use `jupyter notebook` instead.\n", + "\n", + "You can simply run `jupyter notebook` from `Jupyter Lab`. Select **Help** -> **Launch Classic Notebook**\n", + "\n", + "---" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -51,14 +65,14 @@ "outputs": [], "source": [ "import sys\n", - "import numpy as np\n", + "from collections import defaultdict\n", + "\n", + "import ipywidgets as widgets\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", - "import ipywidgets as widgets\n", - "\n", - "from tqdm import tqdm\n", + "import numpy as np\n", "from itkwidgets import view\n", - "from collections import defaultdict" + "from tqdm import tqdm" ] }, { @@ -77,7 +91,7 @@ "outputs": [], "source": [ "! mkdir model\n", - "! wget -O model/facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1 \n", + "! wget -O model/facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1\n", "! wget -O model/facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1\n", "! wget -O model/facies-segmentation-deconvnet.mapping https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1" ] @@ -122,19 +136,27 @@ "source": [ "def get_config():\n", " config = defaultdict(str)\n", - " config.update({\n", - " \"model\": 'model/facies-segmentation-deconvnet.xml',\n", - " \"data_path\": 'data/test2_seismic.npy',\n", - " \"name_classes\": ['upper_ns', 'middle_ns',\n", - " 'lower_ns', 'rijnland_chalk',\n", - " 'scruff', 'zechstein'],\n", - " \"slice_no\": 101,\n", - " \"slice_axis\": 1,\n", - " \"edge_one\": (0, 30, 0),\n", - " \"edge_two\": (500, 199, 244),\n", - " \"device\":\"CPU\"})\n", + " config.update(\n", + " {\n", + " \"model\": \"model/facies-segmentation-deconvnet.xml\",\n", + " \"data_path\": \"data/test2_seismic.npy\",\n", + " \"name_classes\": [\n", + " \"upper_ns\",\n", + " \"middle_ns\",\n", + " \"lower_ns\",\n", + " \"rijnland_chalk\",\n", + " \"scruff\",\n", + " \"zechstein\",\n", + " ],\n", + " \"slice_no\": 101,\n", + " \"slice_axis\": 1,\n", + " \"edge_one\": (0, 30, 0),\n", + " \"edge_two\": (500, 199, 244),\n", + " \"device\": \"CPU\",\n", + " }\n", + " )\n", "\n", - " return config " + " return config" ] }, { @@ -146,39 +168,44 @@ "def normalize(data, mu=0, std=1):\n", " if not isinstance(data, np.ndarray):\n", " data = np.array(data)\n", - " data = (data - data.flatten().mean())/data.flatten().std()\n", + " data = (data - data.flatten().mean()) / data.flatten().std()\n", " return data * std + mu\n", "\n", + "\n", "def load_data(config):\n", - " data_format = config[\"data_path\"].split('.')[1]\n", - " assert not (config[\"data_path\"].split('.')[0] == '' or data_format == ''), \\\n", - " f'Invalid path to data file: {config[\"data_path\"]}'\n", - " if data_format == 'npy':\n", + " data_format = config[\"data_path\"].split(\".\")[1]\n", + " assert not (\n", + " config[\"data_path\"].split(\".\")[0] == \"\" or data_format == \"\"\n", + " ), f'Invalid path to data file: {config[\"data_path\"]}'\n", + " if data_format == \"npy\":\n", " data = np.load(config[\"data_path\"])\n", - " elif data_format == 'dat':\n", + " elif data_format == \"dat\":\n", " data = np.fromfile(config[\"data_path\"])\n", - " elif data_format == 'segy':\n", + " elif data_format == \"segy\":\n", " import segyio\n", + "\n", " data = segyio.tools.cube(config[\"data_path\"])\n", " data = np.moveaxis(data, -1, 0)\n", - " data = np.ascontiguousarray(data, 'float32')\n", + " data = np.ascontiguousarray(data, \"float32\")\n", " else:\n", - " assert False, f'Unsupported data format: {data_format}'\n", + " assert False, f\"Unsupported data format: {data_format}\"\n", "\n", " data = normalize(data, mu=1e-8, std=0.2097654)\n", " print(f\"[INFO] Dataset has been loaded, shape is {data.shape}\")\n", - " print(f\"[INFO] Dataset mean is {data.flatten().mean():.5f}, std {data.flatten().std():.5f}\")\n", - " \n", - " x_min = min(config[\"edge_one\"][0], config[\"edge_two\"][0])\n", - " x_max = max(config[\"edge_one\"][0], config[\"edge_two\"][0])\n", - " y_min = min(config[\"edge_one\"][1], config[\"edge_two\"][1])\n", - " y_max = max(config[\"edge_one\"][1], config[\"edge_two\"][1])\n", - " z_min = min(config[\"edge_one\"][2], config[\"edge_two\"][2])\n", - " z_max = max(config[\"edge_one\"][2], config[\"edge_two\"][2])\n", + " print(\n", + " f\"[INFO] Dataset mean is {data.flatten().mean():.5f}, std {data.flatten().std():.5f}\"\n", + " )\n", + "\n", + " x_min = min(config[\"edge_one\"][0], config[\"edge_two\"][0])\n", + " x_max = max(config[\"edge_one\"][0], config[\"edge_two\"][0])\n", + " y_min = min(config[\"edge_one\"][1], config[\"edge_two\"][1])\n", + " y_max = max(config[\"edge_one\"][1], config[\"edge_two\"][1])\n", + " z_min = min(config[\"edge_one\"][2], config[\"edge_two\"][2])\n", + " z_max = max(config[\"edge_one\"][2], config[\"edge_two\"][2])\n", " x_lim, y_lim, z_lim = data.shape\n", - " assert x_min >=0 and y_min>=0 and z_min >= 0\n", + " assert x_min >= 0 and y_min >= 0 and z_min >= 0\n", " assert x_max < x_lim and y_max < y_lim and z_max < z_lim, \"Invalid edges\"\n", - " sub_data = data[x_min: x_max , y_min: y_max, z_min: z_max]\n", + " sub_data = data[x_min:x_max, y_min:y_max, z_min:z_max]\n", " return sub_data" ] }, @@ -199,7 +226,7 @@ " input_net_info = net.input_info\n", " input_name = next(iter(input_net_info))\n", " input_net_shape = input_net_info[input_name].input_data.shape\n", - " \n", + "\n", " print(f\"[INFO] Infer should be on {input_data_shape} resolution\")\n", " if input_data_shape != input_net_shape[-2:]:\n", " net.reshape({input_name: [1, 1, *input_data_shape]})\n", @@ -224,17 +251,17 @@ " for slice_index in tqdm(range(size)):\n", " if index_of_dim == 0:\n", " inp = data[slice_index, :, :]\n", - " out = exec_net.infer(inputs={'input': inp})['output']\n", + " out = exec_net.infer(inputs={\"input\": inp})[\"output\"]\n", " out = np.argmax(out, axis=1).squeeze()\n", " predicted_cube[slice_index, :, :] = out\n", " if index_of_dim == 1:\n", " inp = data[:, slice_index, :]\n", - " out = exec_net.infer(inputs={'input': inp})['output']\n", + " out = exec_net.infer(inputs={\"input\": inp})[\"output\"]\n", " out = np.argmax(out, axis=1).squeeze()\n", " predicted_cube[:, slice_index, :] = out\n", " if index_of_dim == 2:\n", " inp = data[:, :, slice_index]\n", - " out = exec_net.infer(inputs={'input': inp})['output']\n", + " out = exec_net.infer(inputs={\"input\": inp})[\"output\"]\n", " out = np.argmax(out, axis=1).squeeze()\n", " predicted_cube[:, :, slice_index] = out\n", " return predicted_cube" @@ -258,20 +285,25 @@ " cmap_name = base.name + str(N)\n", " return base.from_list(cmap_name, color_list, N)\n", "\n", + "\n", "def show_legend(N, cmap_name):\n", " base = plt.cm.get_cmap(cmap_name)\n", " color_list = base(np.linspace(0, 1, N))\n", " print(color_list)\n", - " \n", + "\n", + "\n", "def show_legend(labels, cmap):\n", " N = len(labels)\n", " fig = plt.figure(figsize=(12, 6))\n", " ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])\n", - " cb1 = mpl.colorbar.ColorbarBase(ax1, cmap=cmap,\n", - " ticks=np.arange(0, N, 1)/N + 1/(2*N),\n", - " orientation='horizontal')\n", - " cb1.ax.set_xticklabels(labels, fontsize = 20)\n", - " cb1.set_label('Legend', fontsize = 24)\n", + " cb1 = mpl.colorbar.ColorbarBase(\n", + " ax1,\n", + " cmap=cmap,\n", + " ticks=np.arange(0, N, 1) / N + 1 / (2 * N),\n", + " orientation=\"horizontal\",\n", + " )\n", + " cb1.ax.set_xticklabels(labels, fontsize=20)\n", + " cb1.set_label(\"Legend\", fontsize=24)\n", " plt.show()" ] }, @@ -312,8 +344,8 @@ "metadata": {}, "outputs": [], "source": [ - "from openvino_extensions import get_extensions_path\n", - "from openvino.inference_engine import IECore" + "from openvino.inference_engine import IECore\n", + "from openvino_extensions import get_extensions_path" ] }, { @@ -327,6 +359,19 @@ "net = ie.read_network(config[\"model\"])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use `get_extensions_path` function to to set up our own CPU extension to infer this model. This is necessary because the model uses the `MaxUnpool2D` layer, which is not yet supported by OpenVINO â„¢.\n", + "\n", + "If you want to run inference on another device, such as a `GPU` or `NCS2`, you must specify the `net` variable as follows:\n", + "\n", + "```\n", + "net = ie.read_network(config[\"model\"], f\"HETERO:{args.device}, CPU\")\n", + "```" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -347,9 +392,16 @@ "metadata": {}, "outputs": [], "source": [ - "LABEL_COLOURS = np.asarray([[69, 117, 180], [145, 191, 219],\n", - " [224, 243, 248], [254, 224, 144],\n", - " [252, 141, 89], [215, 48, 39]])" + "LABEL_COLOURS = np.asarray(\n", + " [\n", + " [69, 117, 180],\n", + " [145, 191, 219],\n", + " [224, 243, 248],\n", + " [254, 224, 144],\n", + " [252, 141, 89],\n", + " [215, 48, 39],\n", + " ]\n", + ")" ] }, { @@ -401,24 +453,26 @@ " res_image = decode_segmap(output_labels_slice.squeeze())\n", "\n", " color_list = LABEL_COLOURS / 255\n", - " cm = LinearSegmentedColormap.from_list('custom_cmap', color_list, N=6)\n", - " \n", + " cm = LinearSegmentedColormap.from_list(\"custom_cmap\", color_list, N=6)\n", "\n", - " fig, axs = plt.subplots(2, 1, figsize=(15,15))\n", + " fig, axs = plt.subplots(1, 2, figsize=(15, 12))\n", " fig.suptitle(\"Facies classification results\", fontsize=22)\n", - " \n", - " axs[0].imshow(input_slice, cmap='Greys')\n", - " axs[0].set_title('Input data slice')\n", - " \n", + "\n", + " axs[0].imshow(input_slice, cmap=\"Greys\")\n", + " axs[0].set_title(\"Input data slice\", fontsize=15)\n", + "\n", " im = axs[1].imshow(res_image, cmap=cm)\n", - " axs[1].set_title('Interpretation of the slice')\n", - " \n", - " cbaxes = fig.add_axes([0.81, 0.2, 0.01, 0.6])\n", - " cb = fig.colorbar(im, ax=axs[0], cax=cbaxes,\n", - " ticks=[0.23, 0.36, 0.5, 0.65, 0.78, 0.93])\n", - " cb.ax.set_yticklabels(['upper_ns', 'middle_ns', 'lower_ns',\n", - " 'rijnland_chalk', 'scruff', 'zechstein'],\n", - " fontsize=9, ha=\"left\")" + " axs[1].set_title(\"Interpretation of the slice\", fontsize=15)\n", + "\n", + " cbaxes = fig.add_axes([0.95, 0.15, 0.02, 0.65])\n", + " cb = fig.colorbar(\n", + " im, ax=axs[0], cax=cbaxes, ticks=[0.23, 0.36, 0.5, 0.65, 0.78, 0.93]\n", + " )\n", + " cb.ax.set_yticklabels(\n", + " [\"upper_ns\", \"middle_ns\", \"lower_ns\", \"rijnland_chalk\", \"scruff\", \"zechstein\"],\n", + " fontsize=12,\n", + " ha=\"left\",\n", + " )" ] }, { @@ -435,14 +489,14 @@ "outputs": [], "source": [ "seismic_data = np.load(config[\"data_path\"])\n", - "if config['slice_axis'] == 0:\n", - " inp_slice = seismic_data[config['slice_no'], :, :]\n", - "elif config['slice_axis'] == 1:\n", - " inp_slice = seismic_data[:, config['slice_no'], :]\n", - "elif config['slice_axis'] == 2:\n", - " inp_slice = seismic_data[:, :, config['slice_no']]\n", + "if config[\"slice_axis\"] == 0:\n", + " inp_slice = seismic_data[config[\"slice_no\"], :, :]\n", + "elif config[\"slice_axis\"] == 1:\n", + " inp_slice = seismic_data[:, config[\"slice_no\"], :]\n", + "elif config[\"slice_axis\"] == 2:\n", + " inp_slice = seismic_data[:, :, config[\"slice_no\"]]\n", "else:\n", - " assert False, 'Invalid slice_axis, it must be int 0, 1 or 2'\n", + " assert False, \"Invalid slice_axis, it must be int 0, 1 or 2\"\n", "\n", "seismic_data = normalize(seismic_data, mu=1e-8, std=0.2097654)" ] @@ -460,7 +514,7 @@ "metadata": {}, "outputs": [], "source": [ - "reshape_model(net, seismic_data.shape, axis=config['slice_axis'])\n", + "reshape_model(net, seismic_data.shape, axis=config[\"slice_axis\"])\n", "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" ] }, @@ -477,7 +531,7 @@ "metadata": {}, "outputs": [], "source": [ - "out_slice_from_model = exec_net.infer(inputs={'input': inp_slice})['output']\n", + "out_slice_from_model = exec_net.infer(inputs={\"input\": inp_slice})[\"output\"]\n", "out_labels_slice = np.argmax(out_slice_from_model, axis=1).squeeze()" ] }, @@ -497,6 +551,17 @@ "show_facies_interpretation(inp_slice, out_labels_slice)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Output explanation**:\n", + "\n", + "Different facies are identified as output classes. A facies represent a body of rock with specific characteristics that differentiate it from others.\n", + "\n", + "More details on the dataset can be found at this link: https://arxiv.org/abs/1901.07659\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -566,8 +631,12 @@ "source": [ "viewer_orig_data = view(data, shadow=False)\n", "count_of_greys = 100\n", - "viewer_orig_data.cmap = np.array([[i/count_of_greys, i/count_of_greys, i/count_of_greys] for i\n", - " in range(count_of_greys)])" + "viewer_orig_data.cmap = np.array(\n", + " [\n", + " [i / count_of_greys, i / count_of_greys, i / count_of_greys]\n", + " for i in range(count_of_greys)\n", + " ]\n", + ")" ] }, { @@ -583,11 +652,13 @@ "metadata": {}, "outputs": [], "source": [ - "cmap = discrete_cmap(len(config[\"name_classes\"]), 'jet')\n", + "cmap = discrete_cmap(len(config[\"name_classes\"]), \"jet\")\n", "show_legend(config[\"name_classes\"], cmap)\n", "viewer_interpret_data = view(predicted_data, shadow=False)\n", "viewer_interpret_data.cmap = cmap\n", - "widgets.link((viewer_interpret_data, 'camera'), (viewer_orig_data, 'camera')) # link widget cameras\n", + "widgets.link(\n", + " (viewer_interpret_data, \"camera\"), (viewer_orig_data, \"camera\")\n", + ") # link widget cameras\n", "pass" ] }, @@ -620,7 +691,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "You can now see a visualization of the interpreted and raw seismic data. You can interactively use your mouse to rotate or zoom in and explore interpretated data." + "You can now see a visualization of the interpreted and raw seismic data, also it is possible to interactively use your mouse to rotate or zoom in and explore interpretated data." ] }, { From 60ab78445cae6555a09a6e311eedceeb7554b035 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Fri, 4 Jun 2021 12:42:43 +0300 Subject: [PATCH 13/29] update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d73bea56c89..e6b1c80eeaf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,4 +34,4 @@ itk==5.1.2 itkwidgets==0.23.1 # openvino extensions -openvino-extensions==0.0.2 +openvino-extensions==0.0.4 From 1f2941d2a17763daa0a5f6a4cccaf8267ed682a9 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Mon, 7 Jun 2021 12:34:42 +0300 Subject: [PATCH 14/29] remove package version to install latest --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e6b1c80eeaf..9d1ba95406b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,4 +34,4 @@ itk==5.1.2 itkwidgets==0.23.1 # openvino extensions -openvino-extensions==0.0.4 +openvino-extensions From e1e763db572f12357c5723bfb9fecb24ac9f37a9 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Thu, 1 Jul 2021 21:02:02 +0300 Subject: [PATCH 15/29] use curl instead of wget --- notebooks/202-facies-segmentation/facies_demo.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 8ee8fea6374..175c948df48 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -91,9 +91,9 @@ "outputs": [], "source": [ "! mkdir model\n", - "! wget -O model/facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1\n", - "! wget -O model/facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1\n", - "! wget -O model/facies-segmentation-deconvnet.mapping https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1" + "! curl -L -o model/facies-segmentation-deconvnet.bin https://www.dropbox.com/s/x0c7ao8kebxykj1/facies-segmentation-deconvnet.bin?dl=1/\n", + "! curl -L -o model/facies-segmentation-deconvnet.xml https://www.dropbox.com/s/g288xdcd7xumqm7/facies-segmentation-deconvnet.xml?dl=1/\n", + "! curl -L -o model/facies-segmentation-deconvnet.mapping https://www.dropbox.com/s/a7kge25hfpjnhvf/facies-segmentation-deconvnet.mapping?dl=1/" ] }, { @@ -118,7 +118,7 @@ "source": [ "# Download dataset\n", "! mkdir data\n", - "! wget -O data/test2_seismic.npy https://www.dropbox.com/s/sbj2atyukpjgssx/test2_seismic.npy?dl=1" + "! curl -L -o data/test2_seismic.npy https://www.dropbox.com/s/sbj2atyukpjgssx/test2_seismic.npy?dl=1/" ] }, { From 1974773b6e4130dd5675a1dd25a3c62d0ccb6242 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Thu, 1 Jul 2021 22:23:48 +0300 Subject: [PATCH 16/29] use os.path.join for cross-platform purposes --- notebooks/202-facies-segmentation/facies_demo.ipynb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 175c948df48..591da011c57 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -64,6 +64,7 @@ "metadata": {}, "outputs": [], "source": [ + "import os\n", "import sys\n", "from collections import defaultdict\n", "\n", @@ -138,8 +139,8 @@ " config = defaultdict(str)\n", " config.update(\n", " {\n", - " \"model\": \"model/facies-segmentation-deconvnet.xml\",\n", - " \"data_path\": \"data/test2_seismic.npy\",\n", + " \"model\": os.path.join(\"model\", \"facies-segmentation-deconvnet.xml\"),\n", + " \"data_path\": os.path.join(\"data\", \"test2_seismic.npy\"),\n", " \"name_classes\": [\n", " \"upper_ns\",\n", " \"middle_ns\",\n", From 9d4de50b6a5f540a3df566dc334acf60b73c07c1 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Fri, 2 Jul 2021 10:53:53 +0300 Subject: [PATCH 17/29] add credits --- notebooks/202-facies-segmentation/facies_demo.ipynb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 591da011c57..30e79b149f3 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -695,6 +695,18 @@ "You can now see a visualization of the interpreted and raw seismic data, also it is possible to interactively use your mouse to rotate or zoom in and explore interpretated data." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "#### Thanks to the authors:\n", + "\n", + "A machine-learning benchmark for facies classification / Yazeed Alaudah,\\\n", + "Patrycja MichaÅ‚owicz, Motaz Alfarraj, Ghassan AlRegib // Interpretation. 2019. T. 7, â„– 3.\\\n", + "C. SE175-SE187.\n" + ] + }, { "cell_type": "code", "execution_count": null, From d29e6abae0322f10b5e645d622a2ccb29c58316e Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Tue, 6 Jul 2021 19:53:52 +0300 Subject: [PATCH 18/29] Replace openvino imports Rewrite markdown note about GPU and NCS2 --- .../202-facies-segmentation/facies_demo.ipynb | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 30e79b149f3..ed427136294 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -66,14 +66,19 @@ "source": [ "import os\n", "import sys\n", - "from collections import defaultdict\n", "\n", + "import numpy as np\n", "import ipywidgets as widgets\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", - "import numpy as np\n", + "\n", + "from collections import defaultdict\n", + "\n", "from itkwidgets import view\n", - "from tqdm import tqdm" + "from tqdm import tqdm\n", + "\n", + "from openvino.inference_engine import IECore\n", + "from openvino_extensions import get_extensions_path" ] }, { @@ -152,8 +157,7 @@ " \"slice_no\": 101,\n", " \"slice_axis\": 1,\n", " \"edge_one\": (0, 30, 0),\n", - " \"edge_two\": (500, 199, 244),\n", - " \"device\": \"CPU\",\n", + " \"edge_two\": (500, 199, 244)\n", " }\n", " )\n", "\n", @@ -339,16 +343,6 @@ "### Load model" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from openvino.inference_engine import IECore\n", - "from openvino_extensions import get_extensions_path" - ] - }, { "cell_type": "code", "execution_count": null, @@ -364,13 +358,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We use `get_extensions_path` function to to set up our own CPU extension to infer this model. This is necessary because the model uses the `MaxUnpool2D` layer, which is not yet supported by OpenVINO â„¢.\n", - "\n", - "If you want to run inference on another device, such as a `GPU` or `NCS2`, you must specify the `net` variable as follows:\n", - "\n", - "```\n", - "net = ie.read_network(config[\"model\"], f\"HETERO:{args.device}, CPU\")\n", - "```" + "We use `get_extensions_path` function to to set up our own CPU extension to infer this model. This is necessary because the model uses the `MaxUnpool2D` layer, which is not yet supported by OpenVINO â„¢.\n" ] }, { @@ -509,6 +497,22 @@ "#### Prepare model" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you want to run inference on another device, such as a `GPU` or `NCS2`, you must specify the `net` variable as follows:\n", + "\n", + "* for `GPU`:\n", + "```\n", + "exec_net = ie.load_network(network=net, device_name=\"HETERO:GPU, CPU\")\n", + "```\n", + "* for `NCS2`:\n", + "```\n", + "exec_net = ie.load_network(network=net, device_name=\"HETERO:NCS2, CPU\")\n", + "```" + ] + }, { "cell_type": "code", "execution_count": null, @@ -516,7 +520,7 @@ "outputs": [], "source": [ "reshape_model(net, seismic_data.shape, axis=config[\"slice_axis\"])\n", - "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" + "exec_net = ie.load_network(network=net, device_name=\"CPU\")" ] }, { @@ -584,7 +588,7 @@ "outputs": [], "source": [ "reshape_model(net, data.shape, axis=1)\n", - "exec_net = ie.load_network(network=net, device_name=config[\"device\"])" + "exec_net = ie.load_network(network=net, device_name=\"CPU\")" ] }, { @@ -630,7 +634,7 @@ "metadata": {}, "outputs": [], "source": [ - "viewer_orig_data = view(data, shadow=False)\n", + "viewer_orig_data = view(data, shadow=False, annotations=False)\n", "count_of_greys = 100\n", "viewer_orig_data.cmap = np.array(\n", " [\n", @@ -655,7 +659,7 @@ "source": [ "cmap = discrete_cmap(len(config[\"name_classes\"]), \"jet\")\n", "show_legend(config[\"name_classes\"], cmap)\n", - "viewer_interpret_data = view(predicted_data, shadow=False)\n", + "viewer_interpret_data = view(predicted_data, shadow=False, annotations=False)\n", "viewer_interpret_data.cmap = cmap\n", "widgets.link(\n", " (viewer_interpret_data, \"camera\"), (viewer_orig_data, \"camera\")\n", @@ -717,9 +721,9 @@ ], "metadata": { "kernelspec": { - "display_name": "openvino_env", + "display_name": "1234", "language": "python", - "name": "openvino_env" + "name": "1234" }, "language_info": { "codemirror_mode": { From b2d7ba6dd751bc66a506c6a3612c70c34cad3f0e Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Tue, 6 Jul 2021 19:55:54 +0300 Subject: [PATCH 19/29] remove itk --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4a6b7adee13..d5fa744e301 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,6 @@ jedi==0.17.2 setuptools>=56.0.0 # 3D visualization -itk==5.1.2 itkwidgets==0.23.1 # openvino extensions From ef77dac854bc6107182789195c466de9f69b0493 Mon Sep 17 00:00:00 2001 From: Alexey Khorkin <32435805+alexeyhorkin@users.noreply.github.com> Date: Tue, 6 Jul 2021 19:58:01 +0300 Subject: [PATCH 20/29] Update notebooks/202-facies-segmentation/facies_demo.ipynb Co-authored-by: Ryan Loney --- notebooks/202-facies-segmentation/facies_demo.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index ed427136294..6ecfc67c9e0 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -6,7 +6,7 @@ "source": [ "# Facies segmentation Python Demo\n", "\n", - "This demo demonstrate how to run facies classification using OpenVINO™\n", + "This demo demonstrates how to run facies segmentation using OpenVINO™\n", "\n", "This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays." ] From 7051a3554ad552b02dea99d22edbb0feaaa8d6f8 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Tue, 6 Jul 2021 21:46:44 +0300 Subject: [PATCH 21/29] change kernel --- notebooks/202-facies-segmentation/facies_demo.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 6ecfc67c9e0..339ba957624 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -721,9 +721,9 @@ ], "metadata": { "kernelspec": { - "display_name": "1234", + "display_name": "openvino_env", "language": "python", - "name": "1234" + "name": "openvino_env" }, "language_info": { "codemirror_mode": { From 31ea8122d683b7b67d51fdcfdaa5ff14a716dd4c Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Tue, 6 Jul 2021 21:55:54 +0300 Subject: [PATCH 22/29] code formatting --- notebooks/202-facies-segmentation/facies_demo.ipynb | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 339ba957624..a81224f244a 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -66,19 +66,16 @@ "source": [ "import os\n", "import sys\n", + "from collections import defaultdict\n", "\n", - "import numpy as np\n", "import ipywidgets as widgets\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", - "\n", - "from collections import defaultdict\n", - "\n", + "import numpy as np\n", "from itkwidgets import view\n", - "from tqdm import tqdm\n", - "\n", "from openvino.inference_engine import IECore\n", - "from openvino_extensions import get_extensions_path" + "from openvino_extensions import get_extensions_path\n", + "from tqdm import tqdm" ] }, { @@ -157,7 +154,7 @@ " \"slice_no\": 101,\n", " \"slice_axis\": 1,\n", " \"edge_one\": (0, 30, 0),\n", - " \"edge_two\": (500, 199, 244)\n", + " \"edge_two\": (500, 199, 244),\n", " }\n", " )\n", "\n", From 3adbeaba7d71bead4f4278f5e06354307bbecf53 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Mon, 19 Jul 2021 17:41:51 +0300 Subject: [PATCH 23/29] add more info and remove NCS2 mention --- notebooks/202-facies-segmentation/facies_demo.ipynb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index a81224f244a..9a83bb2bbd3 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -8,7 +8,11 @@ "\n", "This demo demonstrates how to run facies segmentation using OpenVINO™\n", "\n", - "This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays." + "This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays.\n", + "\n", + "See the source repository to learn more about the model architecture and training method - https://github.com/yalaudah/facies_classification_benchmark\n", + "\n", + "The `IR` model was created with OpenVINO™ [Model Optimizer](https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html)" ] }, { @@ -498,15 +502,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If you want to run inference on another device, such as a `GPU` or `NCS2`, you must specify the `net` variable as follows:\n", + "If you want to run inference on another device, such as a `GPU`, you must specify the `net` variable as follows:\n", "\n", "* for `GPU`:\n", "```\n", "exec_net = ie.load_network(network=net, device_name=\"HETERO:GPU, CPU\")\n", - "```\n", - "* for `NCS2`:\n", - "```\n", - "exec_net = ie.load_network(network=net, device_name=\"HETERO:NCS2, CPU\")\n", "```" ] }, From 1cc782f45db800f7dae01d5b17d78ee5d0557c52 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Mon, 19 Jul 2021 17:43:07 +0300 Subject: [PATCH 24/29] update README --- notebooks/202-facies-segmentation/README.md | 1 + notebooks/202-facies-segmentation/demo.png | Bin 214888 -> 210044 bytes 2 files changed, 1 insertion(+) diff --git a/notebooks/202-facies-segmentation/README.md b/notebooks/202-facies-segmentation/README.md index a34dcbaba0e..1043efb132a 100644 --- a/notebooks/202-facies-segmentation/README.md +++ b/notebooks/202-facies-segmentation/README.md @@ -2,6 +2,7 @@ This demo demonstrate how to run facies classification using OpenVINO™ +See the source repository to learn more about the model architecture and training method - https://github.com/yalaudah/facies_classification_benchmark --- **NOTE** diff --git a/notebooks/202-facies-segmentation/demo.png b/notebooks/202-facies-segmentation/demo.png index c16f89d547878364a2fa25ef69d49f42f7c3b11b..41067402dcb4671774b363fc22e865a42a06f8e4 100644 GIT binary patch delta 66553 zcmb@tbyQSe_&17TP$CUVNq09AihwlIHGtHBbci%Zq(M4{Mp{}xx?5miL_}f;X%Xq} zyZQd!yVkw;pS#|*Ue_9Bje5>Ldq44s=lqF&aPbE(RvSpQb7{%w0MC^5ssYwg@? zzNG%Bq+-s%KDhB_1UVB0 zhMH9ntH=AK%F@7zh?Y;L`JeYi^VNO4n_SyaTW8oh-o~?inRnT8rc*335MRP1o$dDb zbLn4W|3ls44fMPVBVE0(uiE+K(p2A``bgA-d~hz|Kz0x+dkTRlpe01r0}IP z-xyA+QSsS>Pv=d1x$wa1hW7s5rVrSh95d@f#jJz;&wEpHS;5wL-eVu#PprT4D8~uMOe|VdYK5E2)Kj75L7ct39jQ^S?|8M zC{_+@!Zh;Q$uCA9k2B--y}%2}`$)sFr0>t3tXeUdUu0d!6dS@uDyP9$$T}$Zl77*( zADu?UCFlt+l&`UYIwN?y>td9?M(X4c@Rf$WNV+FXYA*Xvybkv&J5m4mgwM5>#^mI8 zKWn*$hiweE;-n{a4MUgNld}C;=$D5^i@m0V2d-ew+J)Rbl(hZ9*5=}j$ zmO8nVZW?LH~ZXS{A`I$nC zWF?o840mttc_eYV=Edc63gxGFvM9~}h$D*bUkl|Gb4*R|Gsw@p(AQs{C2cWjj@mtQ zKeXu0>)cmSe7> zkrdl;-MQULZo3}gI@0*J zZJ~jB#{J20-S*3(NoQDbaGu}=oI{zw6K#U#(br!V`fWv3 z)Wx;U-7|!AGYsmIe8t)McGiknw@5qmdjRXMc1qvt;J>fK4d-48Z4x*nKEfO3 zrN9|OD7Zr73RJXaM=@jyddidUV&h0}HRWcu8AjxCzSRC`90W69*T4@wEwV{W$GPhp zhc)UU&vxZYSP|0GuGYb7X@ZOmW5PH=T=OeRWiN<8#Ajz6?hAdCMJ`lP2v&0G?UTk^ zb@p!vPM;@HpKp--AZue#&H6aoss6#k)r(6Bfy#kU!7{^idS9GBSluq=Y;p+wwu>e9 zSmi0{XOTa90mQ*Dr(l&bh0c<(j9o2hLi(QvHMzg?P2Q_WVe~R{c>9%^j-m>6$O13% zb7Hd%%N1Fd`>Q#Luo2Hbjp-?BB(6lfqiRv`dRZIjd3No7Qx7ab2lj@<{y>s0`- z>F3kn6F1Y#k8;aketFOO{jd+^wDXNYk;a>~n?)Mi^pgFeTl!h~uT*!A!Bg{As>TJJbQC)2|(;do&t>NqE&(z-O_K&~fzk>8LN#BINtx+p%S7E(%ZXtxz_IRPXJMFXF zuL;W;)55spQ9Zl_+zHWN#wRN(m=twxRaTzR?iAZrb`%0^NOj#!pw=3B!GzPZ0G&u%I zsbx7o+N_NKQ&Pi+6A+)>xnvfdw9%6FnP{_ejQq>z`^K7`k9B96aP%dGZhNKM@F@st z(*Fx|9kps&Ub38e*-_PK>-S!VgFZ;+tW+DUaBdB#7 z@pY+{6^I;vE3o)!j={f!2$BM~$+})2OesfK&b<|8o|xcNF~YvBlEt15 z>`B2zok735g}U%ba@HNgFVE_rBAL2-!7ibir0keX!n!YDyJNRPsx`d3{0D`;k;0YZ z$4Nos8UAE8s2qlQ-yG(q8ek(hgwP)-8mN&>T^@Ox_6*TvF=&*a%Aj$j+WOqZI?%e% z7WtFw-qGL%;sEVG^$8}dP`kup2K0mC$piyToE*Q%+$<2NHvEJ!m zHym16qgD*9LM*AYKc+XRQWPiizt1jk3n#QIQSHu~pB>mTPkwdKI>pz1;#ttEy4(Xm@0$kSySV*Sl&nGl=g}5dwYNJyI(k@&@2+&?tzT=hX&$7hFwtadGi7NzycdQ($JxM3RHyxYF%!~I)juBR(H{6gtVwc^3@#OM$3k^B8G zP9mjd6atyKiz8wZQOugojsL=ihfitdn)wH^}@^9}v zkrsPvnpya@1fMTmbG!?uxu@CggbOj$zZ7J$-dn8G;G!H@`YU){4f*azy#sEx@Hp6E zs+{=&ayFhe3TV}Dn`7Uo{jTY?H%))4#cdbrcs(Y??W_kHeE}3TIm(wb8gmh{FUa(c z&l@Z(61KMv6SDv2io~)kY8Nk4+X~<>2L@fL(w|~+ba5{<$nh@{;5X zpJ?=qYm}yz#`f-%rp*O48yZf}& zS5AZbIcS%%7e9D{Px?gI^EI7MSL8T3T7Dl*(ZXA^rDIiGt(d#d-=`v+BV31b7tZu)UG<>#`l-6ypmCxniy zcYbQ^Tpg2FZ3YMHKfV60t9qK6MMLxYU139R3+ehswU=pjOouwr&wht{xmJB{Y-+0< z2Y5%-ZS$+uLSL#;^aQWy00=(qPD@R7nMdA&P4q(U#%aUMQSyQEdCyx-tUWzXVC5Pb zBr7d(LptA<|B^%sQDqOQl*kmXS}gT321@!86Z61309%y0Lv?Jw+~esQ22 zsvbEx4iUGA$ZaVI?+?^ZmeZS2fAZVHnKxqIX-QOy6re~Lf%ZqXh`nSMGTiU>!Y;Z8ntWyjoG9W4*krbwA9CLk zkb*nid`T^PLq5O{O85V}#{cF&gZ>X*?jlokJxkK(q&&Oq{_lhU=uZz333v)QjaAE` zWGLaRfdwP2A7}eQ(Y4uZ3Qf^G%|L~$?cWB#IgtdyXYiLQzgfk2rf?591>qD#D%^%Q=6T$D8wu-&1*s9PXS$w|~d9T}fnL9AE#Dy#7;vyfZo9)+a3`gaf^I zFtXey^*>k)cdOeXH}MQ$$@bkVJEo#}~BJPu$ ztx%3v77n;Jg=_?#dQdN9L2eH)pq+8+b+r%*O4NP_)Zj9AsayVWKZIrd^az|2vWdznEd1~`C{98n8s$;&A{dnmFSdGP*L3+a?7TJQ=UoX zep01x@Nw(5-$k$K#odaHy;BsFrBkZwGVgax7$vV*py_*9YAU(eG7nv>ig;ZfPE>J5 z-lz4AmCx&}yqvBaotWsKuC?=;XrAj8Y1@4ubvmG4?R{t)O(QwDeSNiE1AZn7zmt86 zv{rk%N_#m<8>duovIbpQW3-*mZtwl8LB*riPP@q4Iyfp@x)Ri-6mwqv{$=E}(nsmE zTo0YsW8Vw3pZpS_4*4z;Tf3KoCIG0E^MJU;rb?00MIXzYngrRCgz}8tt6IYZ@^{%! z9zWRmUT-47<;(V#=|dS+MC;TF_uvDOnGO)QUaP6r`t^>wCw_Yg*^KGKw|8dTP<&ES zBj@wi{#l-j*uN@GQ8g&3q3z4L?cKd09syq74n*4llhg^+`Op0ZNa~QSqUkStMf;UE>XFaE=*v^^ zABT9Z_jpk2)8n>6NB^d}F&|3&ZjE+8*SYkP>b>GdOf|Z()X%u$PMAWH$8$bBBC~Ia z>m1ym^UZnz2?=C<`{kyazr)QwtjO#o6IxV-VZL9gFCI^~ZfRedw1>?Pqf7<9jXQ0u zorGUxpvx&fR#|CnryFi)Hk|z}JzZCa2IsFf=l9}be3!qj0mK&=7~rl#dka*?xx`^$x9?J1je0Hwovi-rnFliId-f|E6j}D}7fu?9p{m0|SchHm7@|sh>Jig;rJZ-E6|{VkA$s)exD~ z*=Wq32(&LEak`v9B?b9gqnC#CIY9R4TW zw64dq9{bJh=gl`Mm=!C49V{bDPk8nF;njOkH*USRM~#Ztj#`I7quj+Y*K%7jL81ER-dURcMjfCEwc1Xzn$ODFZ`wb+i9~= zp{TX)ItR|7v@u`(u$zi#fAa0V$gOm;8D=Ue_kr8DXpgVYO+`_q-fnN*-MLO$mPGe) z(r7RLyv)~R+rCnMsqQK_>mUaR{&-yZj`K>*7N^t*TavRpW)%* zeeu|y6Y-;Z^S9)`OE%^~?d|OrYr1^z0`wbQS02?Dyt=u_%8!@biT`!4|G)mO`dg1g zP7DPehMAdJfjI#WAOD@V7>ImxsE6-ieaW8ynJ0RE~D7 z9odI``cA&JUZ-BK`Bc8*oDgr#XUa1#>$ab58c*M8`@Xs91o;#pN>~RUy<$(Ipr*D$ zWl2&=dM9eL_fAeypd^o}P*Ufd2?+@|qyTnsvC}WTBrSDe4ClXF_=9P2^vU(b!Mv-z zZ`$sQ;_F>zG5>YShUiT=Yh~FQz>R^d^?|*MF zn#}1+YVWmQ1bFORZ+Qj`{VHFMKIY~Le9@~PdOAJP_G=wL4%cXBV}wjjM-S9<$HKw_ ziA2Vt)&|!0f7%M!qYFoEem8M9!lF}CAN^Ptq!e*vq>1tHJ_Yx7nL5(}4ez0eL`Pk~ zi=QT!+c4psQmV|LBLA;3==pQEf71M&$52c5RZ#ZJtF;>6WA*LLgKG7gn|qzD7oA=m zx3~X!cT;>t=6&~1O`+IaR%^Ld6P9e0fVlWzXW)IsqOmN@Up9h3ZOBHwtTiln#rk{y z6zk6Ik1;V?oMa$c&BjY~GW{P#xN3}&KCE$3<%y9#7kJz);Jd~m-T$I}kHO^g6%Nlf z?Gi`!6&7v#HQ`L*5bf0p_ttsOd86;_t0IKoWA;9AWWV&43xrQA)$-?EcXv0H_}f1h zJPI0#0&qAyB!NYpUr0z!JhM=nJ#J{_vuD3ePJW`czNHedWy5xJkD22y;wU} zvlyV}-BaI=GCPp1Mn~?(h_~XZ+z18=JWXyyv2H1db?)YW{0;#*tjZmL?mKs{{PSPG zUJA!#kZ^t(m=)koCAIqy@9>?=@*l#8BykZ3V`xZAnr5Yn#dL9Y!uZ#^Rdz^36~5d4 zut@25&BVx9dtqhvBy(TijP><5JXGsV+)?tF;8a>oj)M$*g5QEaiOzyu8&$+JnbU^> z4Mo&|!k@fGDkql7QD?uHh5qIGvn`HmyD16A-G68#Qsw;#>|vizMRUf+d|kX!IW$0w zy838auGV2-vS;m8zRLBjNc!@Pi9g^^^=MG?po@OU_m*xx>!7)cii-1M5B5!>7ii8c zfdB=|%NzYPYV)de{PQ^6hkB|m%E~}6T~+<75cus&k`j}z6zziZB<>qE6_qb$-S_U@ zOSZNFXcZIl(r@Op^xd@ z>TIL&tfX}J+`3@oCA2&1dq6%vyPz`?1#d6>4qGY{84D zwg;H>&h1;b128};v>g0UPE@w4b3n`2>aIy&6>Ym(O7tS24TiGE`Yr8i!T)itLHY~{ zulVlJhY6^)Rugm3s~HjoJb@fttCTm|QRe`gD9|m{sGMkB>!q&Qoa$tu@4-;dFi2jR z^`N@nKCfOg#h8tP+)j4PG>b{nMV#QCo(&cgG8)O0i-PJX6=J-5yXTiPuKQdt_Z1z9 zGgDeCPfv=c8OuD^S6;A*6_)duQVK0KYjg7tFGBG(ILV&20{OHKKmvJrd2XAA3d3@5 zuh(ExRG43YcAKQ+b!|Fq>6>zC9_w5%gZR#fjNsLJ3r*E+irLjUEQ#WW%YLvC{3~X+ z;+hKb4McRNT7pu+(L)7n$&V_HyOPmZn&?={E6 zJJ`E_e8uz6e^Ye(tWh=7Wbe&q3Zr}f(DkTuT(8DhrGh_OTU!VGB)xh1oYm0v6)tlh z2oES#B?RE8!lEKJvdBawCa@JNu8%OXQ4{oS)7QaTP_1&9rYr)BFGY3h`1~@c+YI3T zIE5a!vA>5+Yt8=%~JDUF1+0Tj?v~PuT z06eOn+*|4U$J>A9MW)H-%+2yRArZQJJD1x~cDiGe;@v5x4nSZ5m&pfhc}&@BOu=gL zlsRF5myfS=dD(Kvcfh<#p-TTCC^3w2;J$#7KE~WqwPXAIHWP6-8zD2DV!umRueofV zM&)z+0?iz70_`j%<0TVl&h%kTRuT#t8fFSSlUTbv)}aUeE;qm#GNNf-+~W}cnpX1y zNVt8b*N3J)((|rETnER;0%BqVBbiTI`?s4mD#VVtNO1nmwWfobS8KSEYMr(4g4S?4 zoA9CJ0l|wGFJ@f&sg;PWb=B=tC*2J_$NY^;7zr^v!hf{NJlvMNo5Y6*@NF~}Kc|6ly-*(6)>^Rf# z=g8;iUyezo0AMveJ+eb?n3$NjIA4t%8}Giit7z;?&#|pD=abe#;DCq&ee(u$#4)@~ zNlo32UoRbJPg3gLC^Rh{Z^2P=Y3FYRHh=kW*S@=Uc4A`LPqAYM&_B@KiUUGZ%yLtPu|>RjNd;C--{($(;sac zzsmR9Y|hWm4M1M!<>l==nzE93E{3x-EJkolf=a3`v3o~k#u<}$L!R@Or|U$8v3_zb zWXZ?8kOj~TfB?miHC+Fx1hP;SxBp;_G_sW~a*)z+b%ia`^1HcTuA;=3oyMXevhy+P zdZ#(PRoN%10~NQOSw$6**nF>43G9N%q?~&DOB=C*#r5lYv&y>l3p!Wz!-K|P&hx%f zDDt+QyC82ZXwNAgN}W8}^~~V$--RM^aV9!DpDPu_uQg#6Ye#^_%l$X`a+mhnWoUQ1 z_1I+ZRN{u`lFe+J=j)cbT%5Sv?CtV0BLH1lSn-s|2s)SYWxn5E>qz5YGH)TYjSQ3J zcqw{ZsBQVCF!mvWwmARPJmy8w;^DA4#->?Vjrj*5m4!|5WJ zo^*p?2LmwgHylmdtx3)U`2Xnf&yo<^ z_Ln*LX(SQZGPeZfGVuOGelfB2!-vEXL#4$)v)aFjOmmzn zb-%w_J?4Di)J(6>CT>l(`JK0z{{zxPL34BZ)s_EE^I>LTc|=XU0+QMSvb40E;~4{u ztD<>Je7kKqqSu@+npV2)69u};;y$2!wCxAV?LB}9CNuWs)2p&~|479v7U`KZ*D0`L z?q6487JCycmKdxuZqAC+z017P)En@zx38kHJ37=&*vLCAaU-M7NiSbkFwFuEcjOaI z!{Mc(&8J~?`!VopM+f>-(N9sv%$iJX!eIbQ&M-n!b4)X0atFMRQJO6bkBpN0uE%0r z;#T&WPcVkV<9Ej`^D2s)y}sFZl*B$B8uX4x(+hfZz0+Dp0Opz;BNs_Xi?&Q6Xy+g( z7P>=Iv$6_bu>ySEn(s^aEWVNn`y9Sv=|jusgtQ(!a_K#^N>rIZ4d{o9}ib zWq|T@LxMN!=SRRts>lLPPj72!*+Xm&>Vt))W&Xb9^UF zk-oNT!C1PRp2KRt{${cM$z$#x<4N=ctQy70ZO6=MkuGP6pe3hxj&n~TYcB6OnF7TE zN5YE6gAl)-+rq`JfmJF|nozkSLIB#Dys5SQQb&9kSzfD;UJG;LeQ`hwZ#AxEDa%tC zD*%ZaWc!Wm21=`IW5$}q00je~$uN9ugZ5rIoubQE1x29P<(1zueMB(={_HjW%`sL|G(tk)Xy8O0~G%dv{QSguhcen za4;)bWKl-dTkl_we3q^>&&%%)TAit9^*A-RNC~jv>V2m8G1jra!%^NT?KigqmQ}rc_xeO|(^2N)jJGyO7y3nmsqXhWX?EuKLGp+IC%KZ8|C#QK5f)b-vKf8p(oT2D#X(m z>8l0=T97tNfH_*9eMQWwK*U>gIMfcUKO9UvhoJQTOJXPdfILk#-F7$^W~W&q%sP>N zQhwT-67*!)j_cT>YBHB@5VR4sEQzUj1~M#UpDel3V*5(6(W?6lnYW`DLzEUr5)Ps4#!0%5W?Ocb2CU$_P2~e=tPUn4f9}`&Ism(*xG`gYQ z*k5EoNzMnA&&a9Oea>|52CMM2U+_PD_wRQd+R>sPilzpr3^a_>vx)Y$*KyAoiEijE zkgT*=Nm`7mUcDavJC0ki+f$;`Q*E%=2#aLhN0V{nss7?5pz~XMmC!AgzALk_RI$N; zP>w~Rr0Ff%{1C2lrc@QYY5O%So3B0#vrT-0m5&kI^Z!7<_R9@#e&!K%pT_h3`F4AD zKSbm65s0K!b`#vWqc)ME=`mMVS7Uc3K!0UX&srYjs07U$Vd|d>pfPqEIKNk{BxEzz zjqyV(qW%{R6CC!guJIuDgHH!nsu8qsUAD9wB>`F$*;rA1-VJ!L44rvZ3gRKNqdqIi zULP|++e~NaHJozDfu(9Px9<&5#>*03ba%m?KH!qBqY=Hih~MolOY*v9`lA6J&omNG zU-8x98GIIZEdCfB?Oidc8BBp}G6F#1MqZC}^Z^jT6@0vphi%(?fl832FQJuIrz)Jv zn5{rC1iz(E>0vGATU2U1LaAKd$_ujrP-B(JnrV(=f>0jZ8@HUxne-u8h zPhKgIcC6)MhK_iQnX^i%xTWc@#LULdiIC4%AJ#5Szwvj z+C~70^R;k3YmNlAoKgy^EMCwjI8`T+DE{F5lFL!|3Bjk*(nuRYCBer`6nNf?6{9v^ zN$!0;Cd6#HR}JmeU_JX})!^yVmNr8^I>G&|M~H(glIrQZj{s_OBP=e@4kK3s*&|%d zz5rcfqzr9Exu-mIu~BYP$s_vh-TBd`1nd$6L)~9+53U9&?f?bB!yB86v!F61_iaSF zQ=8WSTIr9ExA(N2w^8LpYHDiED^^c0-PHyxnL5H;IKBIEDKZ-jItG5w0n35*Gf zw*xxL#?IwQ^Tl{uT0>JZj7FU5I%8{7@)GW(TC?G&USubIDV6|GAbQDDI??!(j1U~Y70pk&rCt_M`Mmjt z<(d$P^1&AZ9?E-PWJzl0F)B4mwbc!iSD1eFoAXsp0+q!_Csy+it4Jn7lM~~sVCaL; zZa{)y6Ned36@QD&Rvj%Y(vvY=u$f}Paq+WJYuM6?2kJ#*Fd!h{UhS3vxAWzVL5Ls$ z9;Z@47ZB~1mX_vTZ-d>H%0BLaVzBsJN|8JHY+XoROAw=X053ftI?NkoH8wT|0zS_& z+hv#R$JE>r_t|9LA}S6ld>_9qK)zV&RLGG?9%4NttQ3o9A1+)lyy9vyXT+R9hZy3M zlpH=g+)!j*L#1kytX%vzq^2CA&Ay_eP^ifUl-^pyVPg6B6VOW)DqfdvWk7|Q%Wnu<&15b&q+R50XN1D%g=fju`vfmzx zOwgMV5<1dTQTOlOF)h~KbNvYxtdqa~78Fe3H+lMU>lpvdlQO2Hr7i9(bOR+VVZgG5 zPexM%V*Ma@&o|x6jNVeVAx!HYhzzN06tOZ`f-L=Wb@hjUYZAY_VK37UzkU?H-Ew8| zo`vKVDw9}GSvDz%zd$54^(ixI;3}S&xl7f=&c~{7xnW>exgcIoHEnoU7iNo#C)fDp zf5r#pLq=$UcAEDx2Dnpz@0yrUK;IV`L3e&Ud@pLXY?7$IxHT&HpS8F-*q+j~e}Dhd zgPs*G`-OApY2^Vs@dC3sCkYNA5Y;&&wb|v0wQaF!BNX_b9xGoVNFIExuZ(q964mU< z2zs`1dPK#K?U9zN{cGwoO4r{J@c2=&DljHPsr``)6A10`%_AIxMo_9ke(jkzQ2dBl z)SUO06#+JFUG{Y;%0C;e=5(54z}Whyx>tz|srWG{Gs9ZLlCmTUQUv%OhB6893C#2= zU0L*fjAHGY#h!lC`G>(}on;;TZWBl)E|-3!Fojfh%xm61<-PVrX3RT7;>(9A^j|^v zOMYih!T|_T1!C?7aRNlm-8;qqWAqQbkBcM3rxwruprSzrTK3n2LP|xm6N_8C(oUa)vqhlnkBJ3-#bnD=p6AKX;4c=(p>ZhP$_2X$Y-X?F1krmoN)>^2|^jyxS0fP4C z700v{fB%nC!2`qcl=%!U$DSk+z+e|wN5Y#fy?T5uSw(?$r^R77V9~!FnkUxrZ_fsM z6ijXPu7IsYwk)+9IUIdSPk^2k(MpVXm9S$~;A;E3!~s3$Zd_|Se%B|PbfrA#W0txqph#Nb=XZ&*QdWpLl{;b&{f&zLMZ$m>m0has7wKmm5u2&zQ)|s0TcV zLs9=i;bd%BtGhkV6PCb)LzTWIsH;X0DAP7J3P!J42gSe~8vko^b1)wV6g_yg*MCNj zccU47hULBdsoy`TdL9%_%cVF{e2+hIq*0%SWC2;q9sNA<5TG<3b>!PzMs0S#uAW;% zmiz#cZBxa6bb2>~5K_WV!Q#_;R?D)I9y7ENzcjERWLiJ9ZO`rUODgzTg;~z4of56{ zvornHZ+Hek;EcXGHb7Pz&bOMMwtn<_L_@Q>pMBjTVx!-90F)?ZnwWjc_FYOS(`2v( z@8Lr?z_f^Qf?MuY{K%n!_a?ISEW_!$dNM??i{x=ru`dFib)-LM<4y|WcZmW4wf5dD zz{)65xoG;$w+tmh+r_5Fh7;;`J=xbG{Hhvn(C>x}H=@KFiV7`L)Mzt^Y&GMi_*G^c zK1Avfd^ZuYjrNH51G%z(umZV?fwl(VD`4Zvo)Z4t^KdyY3ouU9Sj{oAL7Mtn&J?zDahscdHtE5`Ctc8{lOq7j{rlu1J0dGs}f3#y5*? zk4hA#axitt^)V>kEfh5bVW!UsjH_cqOQ5i*hlPIzRRr=b-xBg5)kE6T(TQ2sS!tF2 zk_celNSF~Md`V=IQK~BU6s}%yrNc#-X^M zpI@4CA*&M+sl{NtLeUskd&@9SRiopo>FT~i&Ckv0>~uSH?~yd^hW_7a?j9krv0BR- zga2Gn2uw5#aL^d2RTPQx7i$j=4cu-q(Wm#6MW$FpsN6DJ)lH?7AQarI6tun@2IjPH z1F?+-0Q4@Eo}{3EvO9`DTE!yy;}pJ+kFSKkAT$S#QMv9L;qDojE4smuYulBOiKUB1um0|TADQQ7s(MzH~H{4wtsm5)S07wCW1gi#OeUtkJ z*1bUT-(xwf2paajWIoX1%k-;0AWXcAS9T9KCNPU&n5X=p9siqcMm(St2HwOCxR|o% z7ZnXdtu1}ed2#1fRF=Ip10G5DuY>onw?y$jtodFq;qe0T%xTM>=`kbqcPeLEk_PHB7`Ht)^_21OZ zrs0_A=xW<>cAkYx;2bl7y+ETQH<|#1LZU@dRrZ!>uPHhx%`=BqSV?fW8ja&WIj!mr z{B|Vdgl8o{Fs*%xI=>Q!AS^!Y-rgmbu7xjpk~XUj0I43{OZYorTl=?BNs|>AVxu;R zZEaG3imtz%rtBrbx+5`4hIbFx_9vHD$x?9o3n1sJ)~~nXgCnZ_5?k_83s$SAghMa0 z;wNNeI$1ZX89X)j_(inENE-57X$sRo_fyJDcD1LH<<_QR)bZ%T z5WS%knvPO@!MkDFq5!|O;s+IGrTyQt1TGDXW$;y%&SKOTs_q#Rc`Acs(7gA$J`zE~ zA7$xJe5ESsN(426wK6Yzjg=UQfPxIF0!B-|-=kv2nA%EH7?*)jtFF@|)s{u)^tkb%hy827}U#51XEsHn0sM#%0Lu=3oeFTto4Q{|d(gWP_2eej*k#)n9* zG%~l$k-j(l+o<5)AJL5|VTL$+D@~t71?%j{;pxH-i^1e3ulHAn-DphjnPeY5o+rQ^ zw;eC#&j3)XC!Dwp)))^?Z|`iQQmb_Q4*)bkx^bKp2YOF|X1KE`gaj&a%i1m73fRDC z-pc`a4KVR4l{94{;Pt2Sc?*pi3(gHpw9025;Y$|cD)0t1lTa#UD&9vrjE)(2w;zUf zo8;*gFWaLU<1K(00HAodY}e3p;!gSs{c_#?Un~y1`G`~!!j!IW_VRWWrdOnEYI9Ee zt!YDS2}|Gh;gFV*8%ct_b%>M|7bpPcReyr*3R38kl&U_ za0RlL`eRU2e`VV4nCYerAPl(?c3yM;E+oao6ou2R4*!m;sH@k{WT&MW?oE%#Dzr|0 z`K<}76mVY{Il8CpHk{lALvyXZ=j!n_x2w1ucJP6`y-yOPPZOBRr)1l{Vgki>#RN?4 z)G$D@3R88edV1tQ$_A$XkJ;HxYzZx@@IZK7DM1cfZVw(pF`DB04_z7W@TodK!;vJ| zL$UfW`qMyW(A%MJDT|zBk)Zu{P}W=OK8qM)9k|GOg*B9xsq-ca4IDB$DFG@rwPXlO z{nUPFgH*$IHF?0zSxGx))(wM1R&RE~Y3$Wkx@xIwA%zz@A+%1qmpw=WutwYpS+RD^3#9fLD21=(^Oik`1 zFGHhG=Tf)JA885(|A0AG*xUJ&El&>$rIaF4Pp^Npm{jX_!UAFBH7RBQwcX&~Z{Nah zkmg;miyy^2cb?pTNOQ2&4%Dm;d-Jb1Nzs~386~gWCDgIJyxejukcy0-aI2$V9d@jb zB@m|_nUFyvYs*7VmxwZ}Pg91*4gbEwU5VgI0%j_Zw9q*(|m8G2jQV+}~fKrEj;LMIFH4aP7 zectwOn2c<3@mVQB!UWg3a$CBfJ1HI9B=0pZh{;{qS73fDC`HuTm5ML`u9Mf`vzOse z4+%Ra$$u%FBs616%2_>OCRBvur}{dgo7aY{8zn8->_~E0v&pp@QYQvD6M3bL;FDvp z!1cCp4(9FJ78asH>c@}isqov^QE|C2CBX8MW%*MjSm>IL)>ettt=T(P(f3n4vTIzv zkrBO##4ZmW5tu*1r>;_Ot0|v|Q1>*-q`^OHRwQNgOF+#h35Q0>E9KDq1;euv z?V%NZ5EKBE0UQLJJ-i1GGRLhIG`Qu!z_BuYoWjmd_d}n?H%?Z_mOSOVZ`@tmVi`S( zlkKxv-r%s=P;W5gV%iX@eOMp)Dk4N0N0<9ND3D4ygGNl9m*PM+b}ARsus0e@a7?3Q zVuJ+d?zU)kdxH#7n&2!uG%(9Q!6sAQI;atpSXOJS9sYFOM1yUj+t;^Zg7G}H6(5NQ3iuqg+qn5woblk_r-oKsoW zOy`RGTKg%58%!H~6J`-&`@Z|Np9v6OTFrmFtwQePuzf+EuU4UnPgHZPOr%|YA$N)m zJS{5bk*XXdINGH;IKj6&Uw?O_1hyxb(ExA)0J3vtDbfhnU0@QW?%d4qWtx1*%@_mk ze{D1^yNXp$mFcm)Sq)XxFO_^mYbY1Wrlvv%5BWWfvI}|Asv+a_ee08=j30<%qT}ub z-pLW$HOp#QQUe_utV-g{!k5xoep|ma~s}d5~6W=ymB4$1C#@G$991%P8ZY@Z- zg2||Kxxy9Hx||C+ESjFdeS(9#Y^(2Sg$nUNm^lukQ|6yNAcm5SuwkG}u z)fpEmy-}NgLz9`Tp#oi;#Up~m zb4VMHqn|?t9PDLaK^=fIJB;!B>^*o{Yz#}2L6wm?cnl-S$mye}jRggQ-r(?wRcI%s zou`Po(Raw?5LEcs(tnuR(Wz)|r0I7tWPeeBB{Ra}H+eI?sL(^XR0q1A6TCRLMdxO{ zqDJ721H@x^it?ATsW?+Oe*>GREC~R^^q*uI6(a9KW4qOyrB>e??0L*ffQDiw==Q8$ zTSGWq^+V^ADt#oS`<)`0fM=0LjJfi^ETYr-IqX!|hLQILUVJEwv}wya+R68dTK&rh z4|%N0$NKFsZa?L=UQp?b?9AQUx4F16mPd^|gD7m1J0*-AUDx{k4S>jd zXUk_P6KEJh)R*Xp^p?$P^?;o~cb03ZE_5@r1qOn^)Brf{UlqosQRYeYcmC(~Z<~jv zO8wq%SlKI5uT%E)IXm7Sb|(+nxI@D7Lm&ec+CINDuH?~vi1YdP01t; ztEw@6rZRa;` zJ$Tn;RHA4dD{WDIgyBPjX7N|i1bTnHN)uIH3SR+QYB_^nH$tA3!I;UEHS=7$j0zQp z%e$W7IDg5mMm0n_q^mj(m`>|eTQB}M~JCUyU2q6HwKU*$&qsv@&L z*H>5v@Aj7U5%;9V-75$9+^whQO`LN<&=ds5Q$##|w4@qu^%4RBVea+YF*AV|F`A^0 zu;}A2xzmq1{<02@Z0|Q$Y3p_B687sKzmVU5iLvP#+@|p!_;`dF1Tati@cZ z+*7_Tk#>6sX`JA&;upIV@q)P`2Y^NZMZ5I7GT@j-HKB%M4nN97j7*AJ+BA!y9^kZ4 z3fsR1KKKYK7{ugcq*LzO59Fr4aUSjGvl7QMZeS8-9}Lv*Zh5q)gYT=xl(iD~qfePO ze~4R;ZXf$Bg|H_@ATGGNo^=`VTM&s36AC2!3rMzo{>YF!Iv$Ip#;c5R8x!;$b*u;@ zM(nG252g=&_S@h6VOk%d+GBcRl~4jT9s*wDs-xIKFZ_M|!aVrMg}t<%508)w*)WcB zY6(G<{QBl5n07*BWzlS3@}rHv;&Qj6wy|r$WB{OlXFm(Z-T>)zsvVN9Y}t!YyRE@3 z_VbZZ$jz)Q4|F;tv5yphxsU72ErGwrp}pD(J?)mhc)T(;XZK$qf;jEtm8c3_( z2s?7E?ePPN2lTK1Z1Hc+P6o+{CCiW>vQNJGx%A2&r22iI<{*?4y-wii0k<)Ssn3umPeuxtf5FZ)Y)cwKMzr9F@6a#66eA z9#Z1_3L`?{u(;f z6CBU821Y=EBn;~Jhg=x9PtM@hmLs5|r@nKzED=wcymY_}W@%8FHakXEB(q~m7=3Ya z;*J#<03?BM2qSx2<}Bgg2zQQz=IGJ&)E~FA}gyr&TaD^W@A#NJWxYI6Fpfv+n&Go>Di4&`)(F|w`z%T)| zep(NVAXZMJ{?YTCD-{%CWdTtQ5I-=Y*)^zg6#9#9b*~Bi6g^bSR~gWl33;imHTk<8 zQrdZ-k+DTB+;0TTOpd){?7>uPG=Ct=Bm0-Yt$9#thOys#p4`0+z!z}2gwqR5Dt*R?Ez!=RDy$@i%L(PI zLl1%46bsD3RLBWBM_>G{yaK(-VQIIYcCGDv3-dSX>L04%bT$2H^Rt!sq8r1a*0Lgh z>UyxODV@hg zOTfMX`vex|bQz~`XTlv!nVXP%623q5o~5+mf;QZ!LMtk`K^77d6LXzE+fY%#&HWrm`uA6It3oTb;~&I_2O)nTws+yD-Uc3w$;{s;U$ zDIoR>0&WI04rDlJ{cvVQx(mk)Un+mp5EnhL;~ZOiC7;1^zsJAfVdyj4H?>D>{7Gst zdNo$(1&SUB7ym^(VRIqJZ+zLfy1LroW@V)tQjKA`d5_}CVmm1Sx5cA?gM)^czfP%f zAQAK!q;Cq95tN-vPUYraHTrjX5tA91(O+IYBB{OS#Lh(-Pz`g%I!tv@B#)0!cRy$n z8Z!#!vZMTJA^9@q13Pkm(jE|XHDUTZpr3&rX;Ev)0FiRWp&-Y#BwjhN7XSix$$VI2a)NF^A}pa#Q}RAV=uA=+$!O1K4J@J+BC9{rnq zSx4Jbc5LgFjx8&*)0unO*d+u4x(b1Pt2@NzUF;qAeeV-+kp(6qbbaFr6yGWy8T~m- z^jN%0iEqlqkNTr?gC!87YeI5yf1=OV;f^`O;O#Jym%qG=?8Z0Kwz8}?jaGD;UQCTU zZnVgk{*q4g-v6ZoduY9%6K}IqxV*tbtiJREI6jY^qY##IU?u5CE^$mu|(_Q;-W@Y zG-_)tni^5^g#)Y01A_avx;**WR3rg@tY-RsspC;$Hj<$r*G(kB5Qt%75TKiZTQ=~d z&unAT{u)TV`z?jEX40h1(QI1e%0*#1W3|(pW}cpOC~DIeFX&s0F7ux)%Z06c`s!GR z1K3nlRd3!fsbh_*Gz^jYRZlo~^6lU^4zI>(M5K4KE=y=yv`iA@-%Ih8 zzdkx=MxD(qjKThS5_O-T?N7{&`*&!y2a`no*=4a@Yhi8g-UT*owN6tAxE)&Zm4MKE zNF87~b9Z;qnucNZFe28>!5jm=CIg+uBQbjNlG0KMH{~2A8! z^c76LFr64Qdr;Wf*}(;cTTt)1N_mM<+}EzWWuN?CI1y2EJn0kr#3fLVPH2^*s+HSQ zF_8%5@BXJgRI`pW#z&uZ0K{q;HheMM-v83udv=uNiT4978xP*L^}+T}%ZBCSPWu~r zY0}>GiF}3+vL4;bdi2cg#=*v9z|oN>PCE?bKpEcd-@kXjUvNc^qV;&RJYR!}lY($Q zMA3yX102)R3dP061DMdxKwH%Y1F(*rKT) zJ>q<;UrOMs?9_p1+7&_Ew1`^=%pZJ@Y5#6|Uzu!WPtT)EL3&JHrtGM!#0WqG&t0R8@LVzOL$G zLX2zvbsJ%N>l%G7mSjY5G4qRAxABD(yRyl#IfZ-e)4}&X5fGI53t0`o*=7l0Y5x8G z!WO6CCt-@PN19eI&St=3^LJ-(>3dIXS@U3N-M5fIpZ#i_9piPMi7iX@Ty$=~bCHX$ zGTXhZOKZY9F+acfW!M^&YP$sMkJ{_-Tr)g>fl`H%Wvm*pFl=BP_9gel2P-~4J~Kzh zO935t@LY8L`BQbPKd#?0(Jz3224mhJ@T6+h?TeiQfnEw{4buhh{P65N=R7VpT9Xb= z1MVluD(n`-1;;%i=}Ae?Fy_)RMY3ZN!FHC)%3n#UCha9h!-KsO6A}!R!hC&aeeZp8 z7XX2D2v9X<4i4lXo2=g%kaB_^_RF>In_IodcJ}m*v9Ymd;JcXdKA6Qw%@mK5I39*+ zn8)2f668$d1ej@(Zs*}1LJz?GmF8#i1bK!6IYE`!na2Z>5o!QaY<1Lqc;=F+{MmQN1L#YJI1%I68`3VtR!C0K0 zI}_UKZ}ftO5IR~PC}`;XqlZSX6Y zSy+5bzQ1$SyndnjGiJK-goWKEVJG>v!}c@d*4vwH(hB4H<&{2`V??EI%jq+VjN6H! z1@%UF*|huTQ)T_>ZuoJEc(uElW22E{75`*aoH)Qw`9`m3lB{TAZ{Bj~PP;2B+)b#h zx`u{wrP>dRN8j&_8@KH-tHFW5Jux>yaUB8UAYJAOW@crk5`?dR`{(|WpPkPAV**=Z z7jNB6Rlr@Z17GB=(2v1EH^f5EZefub8rw)AP*PnG!}4zJ@|d0+V5ibZq=G z=IZd1I#+G0Qn`G4+^<_VEtjX^w01E7PgfHaJHs7a!>%Mfo$^X+vdY3o@u%=$5?kF` zVY%8-tHijXI>Wn;BMpBlIff!RKBMNJ+1HXq!8DMk@)4onx>na2wWH1~wV6q7_Er*m zX4V|(ps`9QN<}lwqhzM`2cD(}&J!44!vNeB!7W9LIIn%niuBobkxFJ2YX!h9M*C~>$P`|$Gcm^e96 zfLg8I>&ThgES4zx)Z)E{bbze?*CK464aRjtQs%GWRUTv8i-shr<*NN*h;sXYz*jym z5W@5wSX2Z;6OkH*zVrN78tZl+!>9ex%WC8AQ;huHC6BSU{O~BDk|7gW89k=AeH>Oc zBAJoZ?a}UdA9KUJ=?b(GC>%If8|dzrBijC*Zgt_j{E5??^QB!tRx!~%0@(J>zrQ=U zuj>9*XPQv?2yaSU{sdn#C3>$LMpIR6Uv0`rd&0oG}qo#@BUXO9tYPXY_W82Nj~R9KphK9Ln~D1n%ek!ZshMsAJU49US_j z`9DrgO-XSNjylRW&AJyc@BlFYWwr5Ek8a)cN7(oMadvgUo(`8}&dj~Ovobpo*~jg) z3`X`ESq(mw`(pnxC&OZ^Ad)sX$qij_`ARuBPLeV*K7Ie58*2MRLznW-dXlxS;Unx0F^?)hZFh`7Qfl8#V?qwhf-gPpEJXkUDNvbM!)ox zj*+LuxcDDt31_0nyZf}b-T^Td3mqiPt^*5?CC<_K5&VCif9^5KZ&WUF@Tmf7hl?8h zX*Z4SDLlXtKXqkTj$7qWfe*5L!GH*5RNTc03Q@tZ)05zi^9VBpKDNGSxL%n`03-Tp za#9b*RjG4t7$i=T23Itdz*YVxmR50|G%#h@UV@p8ma#y-X6mTYQbwz0BPGUqNVw-@ zL`Jn-rz&?n>&#eNgiuta3uZOGJq2nxT{xPDhxM8iOX9>kQ_fy%{0ed^C!Ghi!>f1` zD#aaVb^{U*POzOSc20tx_F0%m_Zke~9~^3zKZEM{3ReqokcStHNT1qHr`r~&G7keo z^SuriUOO%K(c#=zbE|xb4!)>G>dkR#$q{p0@;Sq9x-+t$Osc1&ELkJ!-k4z^3Es!8?WP z4`WodNGH(sKS_Qn(-)%>+|wtn1?L>6aY<;;@w21TGcw%S&97Tw!-&X^Tl%TFRj7;C z@_aBH!c4Ed%Yq_wdTarOkJnh7d);b3IJW%y3cHv56jk)}Bta`L%Bt1v@8V?Iy?rg2>An$l_ z=SlusPa0uV%zj9KJw?V4IZ?7IiRQ36U?dcr7%zL%RO#xV@%&QiY-!fz-Hk>?%CYO@xdwf$IovVK-^HP50@mLa+rqKi7p^QzRInF6?m{ z?Fu*ldS)%CyGJv8vME_f{x}m8z4QG7!80zFMIwP$Ogma4BYR&n<8NRk$2Z*pTVcGv zJi}$0NB_~S2I*WXVR$-FQr*I4jnGB7Z!ip}-#&+IF(UCrJMH}6EJ{Fd2fD~aZMSZv zZf8#{$DE*GZDV7|KgciX+!>UKWN@s<&;0wH16726)ptv}`sTdZ^Y*z2u0OVxO6!>X zmC-oi5k8jkWQ~)qH%g9U^d4ZN5)cv!06wA5+=Q8x#dyp znt4-lGPfmuU2! zLwY+{tmZPPEjm72mI*T|e+|e44S0r}FD>P$_>2knnCA>kI)&LjFMe4zc6sx|C)L#P zFb&KMS_EbGP*9tbI*k(4*lFcMpFf|+4K2<{r&dMnxTw&1T}@&0!XYWYo3I2$BXb!&uz}w&efWS zEVrObJ$QS`K00j-xkvrAb`*}mJmOs)u@+9FYnZfee7~SF-|H@Jl!;9Lo-7;cooi;R ztQZ|uxd|JW7oJN)nr4Ui3apq%UOt?WdiUDZSfVO@@d5yTaa8W|4h5ak+Ur(|N9SH{ zf264dL>WSbGN1YINk5SFHx)C?LK!$t#O=MV~1WRWif>||Ki{3Rpk%n>&0r(C@x+I^540f z6G@k&N=SEMf|v9O&yDu^qm|4#!Mq?`0tg6iwi`q1HP6|>X@=|ZyJ66qFVA03i%4-L z`wsSHvV zno)_-(oa&%-lz2YstVn>dflk^EXw{_81`ATIOmZi1AVg1G;LnK&10o@*9>^3vN0Y> zq}dC!=v&FPfiAgRa!Ky~*yMfn9J@`a5_UcL9Kjm0@z zl^p@25+x2)AZ?uGgYLG@xKtMaH4=1TZR~>D<>TPo-DdXKpR{rUW7Is9e9q55oIhU_ zKHu2j{NWFm;R_WpvzMFN7)!b0TD{mIZET8kS2QWo!L%!P^A?@v&ei@$0O-KUliL=M zRNpdff*!ExE)}1_5@8OwH=q#`6B6qCVs3glDvpqj2s%c#~+=_j&%ZwouO+RS3mh!q6TO8JjW((gL zTv;1LBqGr8oDUBV^IoJW!JT6Ng?cUr44o`#P%_L$9qeJc(rvJ1##v`eOl|@b2N?6`3u} z8lC>1+~qWsZK9*1G^Oxoq|b-|GuKWL#S4S-VQD@88mB9)y*F)AMc>DKrb@3I9~(>C z@u8M0D}iZ$8Yn ze9v*{q#J6OwkIitV$Z1Q7e+eUOf`C}$0+BPL*~X`LPZMwfdz$+$nIHWMw0>{}9d4@r%Xi0yehYAeAadiU<;H@^;(dFp;# z)&I>-Ohk%9lz<9qD|;CUt0iEY=081P?SxUt8z@2QQCrMa90@2OAt8Z&JMDvS^WHr2 z$mbwApC@|i64&&ar18rfbaiQ8PM}t}uyINX6G=dLn#q3%D-|9i%Gnkv8o)`_@J9hg z4A>r$ufbs{Ygnc?0FgKjzk(c&7cJMJMnI9QXlz{TCLAq?VwOSPp4=|XLOG#=;lv@2 zj^&{+NFc697>#}}fB58TDp9y+E1GU6T4;U6Vmy3hRH3)5!04oham8c){PC$Y6pczuDW_7XmvrQCfqFsr1Z0T(hWIX;0`<&KBr=EhyTs=B>JBHH1$FZ8BFhM`cJ(tnasP)RVeA|!)wCVm7Z2Ml z)8BJWaVoq6z|65=om!xu=wHS`GfCaI7q@`Gf~x}NrQ&i-H+^WjT2~RTuuk>6NXd_} zzCZ8SGzNLxHh7~y`T(mYiNPA-r=n8s6s%`$5s&w?pVc^EmzvzLI@$RhRP>eI-O78O zOWxSl8hu_UNoKIg1A)V*!_c33zRaO~{9&aoW5~BB=flJ!C=?i6+V`Lt|6(%DbpQnu z^y(?hX6=s6V?#sLepa&F&8wdir3#9e_5CG76lQ~ASKrL%}a}h4ae-34c!kGb7 z2v=fX5fId}+}AFuTIO!Dp-jNjtNO9?cxZ0ZZE6r@`57hK_q^1h*N8@r;u;MNuHy#< z1)<$NQ`h{viV7b|H=Q{Qr((KxzhEIovqnvEsQ(||= zHr>D4)@XbWIn~eW`DLz!Y%y=sn8fz3#fP;9Js@#q85RJj^`@WZ%zE;P=TvA#r1!A>`j zvKv3SbHu}K1}i?`!KFa9J#3mK#-lm1)x@OU?kCPM8y_Ek{q3W#Z~A}Z)x;q+X1Oof z!D5z!H~`=0plQw&$dd~fE_lrQk=zy&d)?F16K(k*bBhL3%l%rNV&~K`>mX7|*`(i2 zy88PlHUCQ=^g#898^iU#4{amZ%tWnduCf}JDzTwe^zLWNE1Uv__fg`R7(KZT28W%( zFxAkR3o|w7*(n54SVo_R*^-Z{ot4}tL}<}36z`g9mey;`C8#k5HcHo{J;859Gq)^ z*+(hRL^rMK71uCWM;ED4DIfj7EDou1VliDO6Pb9D44^5%d67Xu=irp+h^LLiR0|=L zxX;`ckn-S1BEU09W@R%Hej1$?T@oc6L$sz__$!KWU9!kb-uM<%j^xUEz4a$V$8gxL zv|DK4=i{`ZMT`FKV=qGmN^y~^k2Ui3c2fJ<0R#c_k7n2Ib;?I&=1|WkCUm(UO7CET zemFBUbSM^r873hy5j^NH&_60dGm;fNP3ga&Ffktrw;1p( z{1a$@L8KCm2v)Ys@@yX2DC~Uw1gRw@63&&iP@`0Vj<15a@z0XI#gw8-PMQy_HEkwp zM!#2{r@Xt~Hz?}u*%&t;O**>n266~I`Ugp_D4>bBzjhV`kUv{mI-71X%1jB7X0H&qu%f(*n=~!FC-uip@ z?%iE>J)-;v`*-1k??ku=+q~X8^F44B(5Yk%;&s5}Zv6D{K6E z<)y#v&xX{Qy`J>0a0rLsO^TKrf0wet9I!EIk!+%{sp@%7n2z&`2l(w#&Yk22v6y3) z`JV@JBF?ZGpB!v;ZEWyB{0`QA>G-&@_-12s^M28@2(l}A8$HIA6*>a>QDb`W=uffP6#c|V|;0~ zAd?s`O~QrPY9Q@CU*ZQq*KrwE4Zl59K>yGrSmv^ALm}T)RHrjoL;gfed+BxM++-5V@pkoHp#%u4B{VX(hgQ)dT zZg5Oq1W^5Wxhk>rctAn(VnBJ?OplOnVeXx_bmOJudgGPfT~$JPj@45fs}BAh`71oT>(S4M~QE!WQBHgB|)eo&6h zixEG$j%rwFJ{(i>9v`u{j+dOHUwxV5J?aytp@u2dPkE6@DenAa(223+*5@=+fN1ZQ zKjIYs5fYsUWgqp<^n9zwHVbsVub=^VV8qKHcU5&oG_{{aDuGGxBxb(9zdvXy4!?;Q zHpJ!}r|;bqH~`QC@@@V*7#>UEhhJVx2f{6kkB=|Dw*IXwdFZTbRiyfe(32SKxc zHzb0zGUd6V+yLI?54105H&?Id=Gy=Vf-s$zfQ_M_0~ zz{(K{yXy(P7Ksso4Oqp+!q&oJX}p5MFAZtlv~phP7IaLflP;Ue+y%+xX=*A-_dUaE zRQ|Qrdlbse4$NNTm0N3tPlGYpdpaY}ADkfBs`N`6zjs4bzv^Z6n*h0!r=0j35<*NY zEY3lx4o?q^KYOuzcbH&(pxn`3b9U(kc9G^v1;Z71`lT-MH~%JR1tJMo{cw#KmxAiG zU!CcO()~*`XD$57R=yR*c@wyMzF^J;p(6@+^MmNZ(!NN{<5T<5OS5-MjT0j)Y%tW) zK?CCvZ0~FvwX)xnYm;RU@Lr7q)D55!1agsO$vPi!Yd$|~#x9^++$~)2>SK_?Hcqkm zk~u+@M?ThcOzAQM6p_U;No;14#@cz=!4a3%?&Rm{_6M%LYl}Bq*F?Fc@A_!TX~m<@ zsh;GnW8Sw`IGh-q^$jWD8N8r~S%-~!Id9S)*RR1j4kV=;MJys9&A2R&JHR%f?}=cy zY%1nqioyQk$50@3m{U^!H{WiNrinWd{D+8-XsSa@#KLmw(@z{SM@W#m^54|e)0-Uf z8?OrvpW5AUn*B01KCbE66NfR;yV_$#T*Z#qOyyRR-V1a1>B%fH+&`>P#*;-WcWHCS zjj)dFL8+OgYW7&A@lFVMXB4J%Ti+C2O#0=&%5Q09Rasw8iZ_7h3EM!=jZpWv7qwdm zCdX+Mtasv(UuQ*q@iK25Tl;58A@@O|Z&$C;T{~~lE$2*DOb zp&PfZ=+cOKI@M+@cOv#)45QFXpGsYoqX4dCGhv6OS+#gK4GwQR=K|Y&KWZ9&qfRhj zy&7YMj)0r}Fcso1%NKD`&Wk_4<`j;v*F!$fvwx=tIN@l|r4I60%em`$d=75kV)*4? ztFE48OxATqV@_(fV7k{n9a%@$psI7(oW_o(72bKRMMytPuXnrT%D8>w+nZlaRolgw zYi%PJKZYluYh4-j%aFZ+q*S9%dgKU(dhtHfw8`aW?r5-+aM8*<#59C&Hn zlP0Y&SQ)ARh-u;xLQfv)61;i}%W%Us%wqlMfaibF-fn8itr_Xrik~j_{Z~5qFd_jVt#xvZueA3{It&gol_L3%@)D(E&s*-ZDj(k5|He zVK2I_xYgjYf`cdlOwAfz6*p503aue4k`%xUx2BLxa-@9yd1atgz?7>$36OeVCgo(Y zkx6WnX@n*pjJY!h3qt%AP;s9fEKln;?&uE{W0N9(Pu(Nhj2#r~!#clE(X^j9=q#(& zx?1{_v4_>WIjoAGhAj=TT9EKx?fKJ7bLc}R7 zb8lphb7Y(wd^a$S<$LQ;d>_Y%UYL_;NY8CQQcPNJ1v zZNsm~J&~Ylv49qkSbkaOm2Y#R_9qlx2$13SWxUcxHh(a%kRnESM^G@vmUc_i%u#6X zvBpy}?#Npbf=Aoq0ClfDL7v}V$E z@nWjD+x6Yn(q+}b#}=rrdf*j|&;BG9*^;JULAcX5Dh6Z=-@>in&%i4Jatd1mZn#y% z%+%}gqf-;|#qXb=$FCMXyj%X&N%!CFbi&8GY2TH!6eDJ7 zg0V_B$CI}{6tPZ-8tNxhD_8oitz~)~j5~5}%z>(*9&-F*joUW?lW=Xtu9Q*@RYKO&p<~(1A zL@x)or{&`xdO_Ox>eE|>5Rrc^*P?F2@o04SX2^SPF8tdtr&D2Nlv3ctfbx2A3B}mW zDeg#V8Q~K~g+QwM5t5w0p@o58!#?)yBE}LG`3#-?Xl+9fWaf>8mNOj4HCIVBPt-6X z6Df49=jzp4{f6?+a@i0)`O7&DUr}ODXwRSWFwszST5y9d%#?uqt6Y;_EmAjg+t4{$+DV6^?Z2YJ@ zwVb#3%_OOe*z4#y>b202bMtQ?QOzZJSa0!-!VWBntD-iwAG&)%lp-FXiIk5;Ad`t| zWG|f#32y;Uf(2y6qM+lLZNSEct_9>`1jP|Fr7do?Lf$Ifj}k z3mWJcUH&MRfx1uB7_E`_*%DJ7@up_l!Bvt8L|H%x!8DoJnV9MdUpCkvxyt{mr=(A9 zsk9j|Vu}7+;!45zAf?#H zDCA_0{nWvgd)&wIo!Te)ot`5nS)XYmi)_XQa<;s6@*?r^-8aQCiBtRQs0KoUZ}voj z*M2wtZkjv21euQFxNK3#VYygcU5#t9(m;aYgdM(^o$GSaUK79E_Ge6Px33Ntqz89d zB{1wUDOzDkUQy{&=KQKY9}_8T*zEB&xxQrSZ(-$Rt%piHp)&pKDVcBg7U44Mvza@k ziSL09^7wqYHZoXt9krqcv{-QWYw$$PWC!3!0<3J^#O?OrXo5(YF+NW}6!fZlD ztO`Frbk5^Wl-G9_s#A(Tep&R7uB+H3%a0UAoyUEl!eQ^!tW7wngYr`Gy|uZ}NW|q9 z8o__lM<-RXMv<`|dP9Y$69>lcB)?!WQW@ZiSeM02?jz~^(qA=1 z0dt#}U1?^<;_KGNZmjPRoT>ddeKuUge~)J6i)HasrFD<(n{G~Z-!@Kd#o&?6&hIt2 zFYP;wiKhGe9PHghQtDg^9{loCV_hm9fmE7>u@@Mu9_?fGM;gi_xA2TS|PkWByaL8YO5 z*`JorPXs~d_HgIQl?o~-V(p>ObAiyggbNsbw)+!>%bhPH>VGZs*A%P+1QSzM>$WR( zF8%J)c)mE{F!cN))#Qma&9+Ec`<2#_Q`GTuW{Rrw7(Mpbj$|P#oOCCy_s57gJ(&%X z`Q%5aNp&u2g*Ubb@9XW!A=StIa?&pBk&zl5?=C0sSYzyEYSht6c=h4&mQ9=?U>^tv zLjj1ku7gNhp=}Ptcq&|iDWZO|Dm~XL?z_`EAcyIZw4uRvlh?IAh)ZMdZ?KxGetyA! zg2|HY+fNTPoO4PLt_n$FdyH@$W3-WB3}bOcq~>&A?|L{_;aHc7RcYVaKfOuE7Q7^~ zzm>Z4_R*-$oVpfSX=GAaIyM8;;jpd11p-x}kh5N&ym8o!N zGy}jC#JkDgc(O(WoXkBz#DXf-7LbvV$$cBH@xgUxhk}VY`dpOr+d9uIukQo7hg(Kl3YH2N{LeZl4D857#cl@)3_vb+Abq(mlJg#}#Lj#Q4nU&0;$}#!XP&ueT zR%2$LFQkYfo8#U-+aZbie9n^WLL20FRhh45{}hdhLfltPNI-Kq9UILxPgB$EKlCfh z^I3iQ-fDXOGFvr5RLNsAWo?Q(`Nwl|6%;}FvX}R3hk3u_Hq_N&*BkA`04c@h>OWuv zQ~@_LZ<)Qr==0(*wf`O?=!ZP~{O148PC+oz3A=R)41Ow_*?F;Sy7R$~p z%)gheO|w~y7SdrX0ZJYv5>L>Nb1JST@1}Dc!2pO;n;96$HW;WmbT&$?=4T+8%hQ2=(fIf#SX?BX=oFiDw{6yO2@WghyZC1Pye(tw z^SklpDGP>n74i^B%7Rx=suj-SzSz8Do{Q!TnOQE+{n*;e$15kgMA{T%sN6a6R3vDs zVYf(M$+kA<_i-7kjmA)(`Az$4-dZj14ENkL+vKH8Wv_X z7x_Up4H7}%p;%>}ocoV)-Y^V=LuQrfeGONSaULn$Ap=yROJv+20LRN0{>q8G7baOZ z>b+lYMvbJ~D*?(7r>Q6@sV|hY(^#l^%%$hfx+C%MvHf1A=yb&r`j2_!I)~4-KScncULg1z3%pZ>ElymSM<7y#_QLslF@1sY-p_7 zjNZ&lTgdh1-v>3e?1 z3Q3Ep`yMU}86UV8mdR1e0k8l|Z0E=b+E%FgAY5OJO+h>St53zhgzj+q@|Y?V(FoQu z;=A0L)uRQdx^N+s95QBfffKE)ttG}QO1xD|AWcZr^C;22mVg%nUFGF#Q!xABlKgQC z61;l@NIr8=iG#%NBksK^)S(}C<299D`0mtL{zWn6o=@XCgU6(uM_8Z@a41t`~S$KIwn1 z*6##+=r%!;VUL*AZveii^9)QGj37+L zjl$dCW7QXNW(}O%1ZFO&t!654up|!D5%6%AmepC_ZyBh=$N%uvG|Lp3vfX};MwimDKNVrtNPK*K@_TK>%zOOI zdi@)cyDz{lha)^s59YSc%-7wUz>ve@TYL+hfaYAdVf_n*VUzsm-h?p(@}hz9VM2wq z6q@|q?@Fz6UWi9+k&>2!EeYnfj+5te&~Hl1nD*?MlZVZONO{D{I z!n4v^!D4PQ4GoNW568*-^(BNn<^f}G! z{4L+DmWsen&%-wLH5Uv25xT04cAn2w7Jy%%6S?8swfdUm^s!m0(#8h8jiUr$t|Wc< z3d2v>W085KCSP8A^Y5OTqym8gx&N{n#2e>{1oufIF#O)D%7?vef0YlIEy1Zrp@w>Q zv!}W&Q=}B02~ktk=AKLk?$GCiFk`7@N{4F~$4ma2en%?8p(jKo#_aGgXUElLTs6Jt zR!x2e+a2t6f>b%Iw;z!<8A^tS&9GVRs`94PRn=J!Btelr0_hJ5#$}wI4lYHeRC;-{A0*3L*w&b#VBGvi)nRH($gH+y0U~J{JT$qL>tRE-5kwbldleBLd zSB~~4x)PCpT8*U=2zj&m{N$H@jO|uU2oo7M9u0Z%=6chww|R zT*1E4+hJw3_fu8yzHWtS)1nwVx_*%u2e2C%sj;ntw3-W+iz_CO)EA^(9E3yacIa*! z9CxKOmxP$+3>1p5abUFSf#0!BlJ_m*ijfU-K;0j{qrXvnY;S`|rj&3@Ys5e9Gtn;k zy6#3*dsL;Ekdzd^soTc<82hQVG?jZ)=J@os%`Gu4tPchow%T0K7p?OtYv(&drsRnN zs?jnxMkjMCaVxztu=AjL-<&$`&7`}h(VSdM*Zwf&EpPrf+Uc|K7YZeUMM@0QLkD^? zXihrji^M-&C4YUOxT;YcGj%YxA2j&HIPM9_|6x6(zj5+y&~Aszn=4aA&sy)^5tFh@ z$o0oq#Ky$DDQe6^MPPqhTg&th(UW)eD~d^_;v0(Hbquui`6HpbQ~#}aykhG=aSa*p zkMLKyE|JI+9`lNcmCM4{pbI{09E9R%TS7+COsoz$9YohkmrMqKcg`cs@8av5S-m>al z`L+TpnO#L+xVe7qz4&?gn08kzUVv>=d-O+R@tVDsY&z?=3--D43vS57%P1mX+~CE>2l(Bzy!!6Y*BWq9_QN~ zyzCWvg0-S}C^U`vj=x9ESC%&z3?yHto4Bt@>5WNpzb7VVoXeD@gcz+Ak1%|%P04-S z%7y&uh1RARdJ&vPMR{9FO-n0oM6XSl?djO-!GfVHwlVK=!&emgFDz(c>@z14YC9Sh zUUohYcd%zLnq#es1D+D*=M;9di7* zfTHn}J*ZJ{e7>mgTYpDrg?G>3Vj^D~0oR59kQDsKIHiB0SsQ^cE#zzz8K`2j-{A=5 z=wQ*&u8=?!D}_R0SsMW_MYu-K$X}#xPMKj$BjJ8?a8(J{-Y5eJt2N&gkF$( zJe5eLQ?=F{M#v7U(d86Dp{O7rj}k`n4`KCYzG!~`w3A`&c=x1L_nh+d7xO@FT}Q*{ zOP@^Iys#+)3NeT`Bp)o5y$5~!Z;)&@G1awXZpBdwtkV=eF&@^mPQF#9E}H5l{pz^m z6_Lj2WvwD`PdkzbTamc&!1%Cn)8#XIDQrl>8yy zpy>F4g16SiLQ8zwKZ(2@1T=yd6Y&>Cu=8M6TeEO)G91r{K~q)&#GqCX0OUG=FIFiv zdZS17Y~onFKeXcn?NN#T9Rxg>kv;5?!)V#Q--;Xg-osbn_i6?;&1_Ul7y~GcwL&+& zPX3Y}U1CQrs(k%xlCx5nT{L)O)bfm6sGP}V&dKZl{5K$c^aFx_#I}Z-j_?)h&s{*~ zYkxi|`%XIHdcENMy;0xjSIw^&lCexPal-yl4uwnAj?L&v^p8amj1v25wYh2$?lyyU z^zX9|7HuBJO|$YKYXCj5f1&v}`Qy{dlAH!gLM+07gi;_uVJMDtpHAsb9J&aTM0t*# zI*&`M-?UXg_d%J}3&3FMc) zw&AZ2C-&GU>|hAy31raQixOIbMG4!dZz;Pji$QyV4|vwW@dI%L(&s{DVWac7KnPzG zTw)t@ZOs2^zZu#skIxq?a#CoT<)+sA*joAUn#7Xgrw$yU*x$dEp>_Vl5xjJ|7FU9b zzn2oISJUmdJj00mWUT~&{4jz?80ZnSW7cgli00Eykb;}9N+pKTsCVrActzyt-W(J^ zCW>Ny(`g%qWQW^tDT&LOAe3hkJEkkbAYdI+kNS~s&f3{v>%VQ+jX6bX^bJPr* zTsr292oKLP;FDTZqk8cOm=2sCh;)J-$I#Z+z5<9NH}UHSP~0qu%g;nI-A85KZqZSV zx!33w&7Ts*kV;9adZRdB3VRjAlzGLEVq+=AC|S78;J=aud4>NB(7bK8`mN7)Y0X@L z(c!97ym|;EJ-8%5+sKDjju{FC8ij~3!lUxL{_)2IZmTG+w|Aa!Q zT)m^Lv6(itzlk{kcWmRO7p2m31u5M4+IhOC?T6Q6-rD$^IVjIjk$0QiBfGjR9sw`i z14IDSeqh)DkCOpc{k+gM9N#~|*HLNSWk5zJ2eU=ZxDi7P)h|jO9-jX!vvgwCT9JzW zB~NK9^fY4z`WjIX7mu!Q;ieK+&>&l6FC0w#(MdqTu5Jw38d zqM)(3NC~?2p5{M=)70$qy?5M!!h$Ftrl+E*uy`>aOOcXJ*boWUDns%ExW%WkmcT9T z0dG78(P>>NeH<=d0^SbL6TR{jf)TuSQs=xLV!XY@aOz6%rhuJ&fG#POG@e>3X@fnl zp$#o@gTnm&b2eKv`Jo(}Z2H><(;*%u=j_jvVmD~+as;Y+Pk8{zr~u{{Rd2l+$P;l{doEIKSv?t^=<HD+7GNMZiZ%Z}2Llv*o8Ih;aVYWZd|J#L%oG~`Zaa>seXTe9{NxO=7r9^wZ?{QL z{PBt4Au$j-53=SH`MRKKaP(L@Ic55PsztM*HFEL|K%vDPkxiP+DI^=ld%tQc$!GGQ z8H6&6rJf&mPZ#DcO^?j&JtdrYqiA(Z#odkW0f|HUQQDUOo(P-+B+Pdex16%IJA`^Q zt#>~?+saU`ubi4#<;%M*BLgWYHF1NXlB~szZwL03L`TNYWA1%+?NM#i<&k9hw3K2T z+BK2}^TeMk(kzxj1H(4npnC;1VZ5;RN$*Kqd!==qW7?RGqN)d;hD(8L9}TMLyF$Du zQ~8)A`cJ`mMlJD{Ol}jnDNqj;{vS=>0gYw<|8FHq;g%xVHz8S(Jwmw6%p#kTk<79$ zAtNidO~_s$;mHVpxW6 z@`KByefVd;1V$S8g&P_d5F2cmVN!*HHWE4G)mjM{k^Tjy2#a{XS7-k0pR7x2Ipu9; zNFjJ5NzkYqeR;x=iz-llOI)@l7b*0Lm}vRZw}*Qdo1p!Rgiw2z`9ns6ll9i3z5Q3B zyN54~#eC21q%@o!OY<(9mh_pr%)pSV$Np20SJ3+qP4D0V!B#cD#vnQ=Qdtni%SR?( z4oN`lMbIQX=4e+$T3zY}E1ADl6kM z7rSg^l6H`78D766bYLHm*rwcQR1<=~<5%MX9v^`TC5ywOD}305E3v!1^VcP zp2qjb#&pnl3Pd6mk5|7bt}K2o8YTVdj&r^N7OX0#g7Vb?`NtvAY@}DYWe`?63Ny7# zsSJ5W854o~R(kT2Zx@Ru6=emvlKKk#GcVonW{7-x7irvL(B&O;$uCHZ%tF~kI~U`# z3Fh__X#gJc9`LRl2VJ3{;OFeJJ`$@=0YF}k7k>}NMut2%2^q+D($sVtl@4@@epKiE zf0ZvO+()&VZ+_U7{)-aa1FFjW@ycBi_H#dHKAhZB=219v4zHokb|hxueOf2}#dzZm zI16A7?P=)UnxQH{*kSX#%ccm_zFz! z(2oD=pTC{vt=8>!qbHbsjcjEHNxfm@b1qWyKhN(m_|M3JsjjD|7pNKxX94|q>^sLy zt9$Z*IZ)^P7@$@z(4u^m=pw8CZSF~TT8cYw_2ks$Y*sZ_RViuSw2w_Y+hS=N$!vyt z{Dge+dU@(M(tBlyms(3Uv#pH;63I4ReLk!YRo@BA($RgrY3W>UU01D+zSRz0_} zFgCR!jqf}9=D~CNQ@3fY_Lq!!Qtq9iBXu!&H0ohBbU11T&b|n!<{�_3wY*XLlQ@ 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ߪm|&|o7N98XmxN#cfJW0T-&J;=aSNP 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 G@BS|c%_*b+ delta 71519 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�!)}zkHWi6ThY| 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 rXa60lySw)ntmLjRXD Date: Mon, 19 Jul 2021 18:07:26 +0300 Subject: [PATCH 25/29] Add edits from Ryan --- .../202-facies-segmentation/facies_demo.ipynb | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 9a83bb2bbd3..8393b9a2bd5 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -6,9 +6,9 @@ "source": [ "# Facies segmentation Python Demo\n", "\n", - "This demo demonstrates how to run facies segmentation using OpenVINO™\n", + "This Jupyter notebook demonstrates how to run facies segmentation with seismic data using OpenVINO™ Toolkit.\n", "\n", - "This model came from seismic interpretation tasks. Fasies is the overall characteristics of a rock unit that reflect its origin and differentiate the unit from others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays.\n", + "This model is used for seismic interpretation tasks. Facies is the characteristics of a rock that reflects its origin and differentiates a unit from the others around it. Mineralogy and sedimentary source, fossil content, sedimentary structures and texture distinguish one facies from another. Data are presented in the 3D arrays.\n", "\n", "See the source repository to learn more about the model architecture and training method - https://github.com/yalaudah/facies_classification_benchmark\n", "\n", @@ -22,9 +22,7 @@ "---\n", "**NOTE**\n", "\n", - "For now the 3D visialization does not yet work in `Jupyter Lab`, please use `jupyter notebook` instead.\n", - "\n", - "You can simply run `jupyter notebook` from `Jupyter Lab`. Select **Help** -> **Launch Classic Notebook**\n", + "Currently, only 2D visualization is supported in `jupyter lab`, for 3D visualizations please use `jupyter notebook` instead. To switch from Jupyter Lab to classic Jupyter Notebook, select `Help` from the menu bar and then `Launch Classic Notebook`.\n", "\n", "---" ] @@ -35,7 +33,7 @@ "source": [ "## Demo Output\n", "\n", - "The application uses Jupyter notebook to display 3d itkwidget with resulting instance classification masks." + "The application displays 3D visualization inside the Jupyter notebook using itkwidget with resulting instance classification masks." ] }, { @@ -43,7 +41,7 @@ "metadata": {}, "source": [ "## How It Works\n", - "Upon the start-up, the demo application loads a network and an given dataset file to the Inference Engine plugin. When inference is done, the application displays 3d itkwidget viewer with facies interpretation." + "At start-up, the demo application loads a network and a given dataset file to Inference Engine plugin. When inference is complete, the application displays the 3D itkwidget viewer with facies interpretation." ] }, { @@ -59,7 +57,7 @@ "source": [ "### Setup virtual-env\n", "\n", - "Step 1: You can install the required packages with the following command:" + "Step 1: Import the required packages" ] }, { @@ -86,9 +84,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Download model:\n", + "### Download the model:\n", "\n", - "Step 1: Create model folder and download a model:" + "Step 1: Create a model directory and download the model:" ] }, { @@ -114,7 +112,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The dataset is used from here: https://github.com/yalaudah/facies_classification_benchmark" + "The open source dataset used in this demo is available on GitHub: https://github.com/yalaudah/facies_classification_benchmark" ] }, { @@ -132,7 +130,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Define useful functions" + "### Define functions" ] }, { @@ -502,8 +500,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If you want to run inference on another device, such as a `GPU`, you must specify the `net` variable as follows:\n", - "\n", + "If you want to run inference on another device, such as a `GPU`, you must specify the `net` variable like the examples below:\n", "* for `GPU`:\n", "```\n", "exec_net = ie.load_network(network=net, device_name=\"HETERO:GPU, CPU\")\n", @@ -559,7 +556,7 @@ "source": [ "**Output explanation**:\n", "\n", - "Different facies are identified as output classes. A facies represent a body of rock with specific characteristics that differentiate it from others.\n", + "Different facies are identified as output classes. Facies represent a body of rock with specific characteristics that differentiate it from others.\n", "\n", "More details on the dataset can be found at this link: https://arxiv.org/abs/1901.07659\n" ] @@ -608,7 +605,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now the inference of the model is running. Slices along the axis 1 are fed to the input and the result is combined into an output cube (`predicted_data`)." + "Inference is now running on the model. Slices along axis 1 are fed to the input and the results are combined into an output cube (`predicted_data`)." ] }, { @@ -622,7 +619,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "* Prepare origidal data viewer" + "* Prepare original data viewer" ] }, { @@ -693,7 +690,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "You can now see a visualization of the interpreted and raw seismic data, also it is possible to interactively use your mouse to rotate or zoom in and explore interpretated data." + "You can now see a visualization of the interpreted and raw seismic data. It is also possible to use your mouse to interactively rotate, zoom and explore the interpreted data." ] }, { From 899b444c7760d4563fae0149e6f2f94c30a730e3 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Thu, 22 Jul 2021 04:04:06 +0300 Subject: [PATCH 26/29] remove itkwidgets from req.txt --- requirements.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index e9229bdfaa8..06ecb2784f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,11 +23,9 @@ ipython==7.10.* jedi==0.17.2 setuptools>=56.0.0 -# 3D visualization -itkwidgets==0.23.1 - # openvino extensions openvino-extensions + Pillow==8.2.* ipykernel==5.* pygments>=2.7.4 # not directly required, pinned by Snyk to avoid a vulnerability From 947f48535539ea09d882edf1bddae76cc6b02b0a Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Thu, 22 Jul 2021 04:04:22 +0300 Subject: [PATCH 27/29] Add note about converting the model from ONNX to IR Remove itkwidgets import from top and put it into try; except statement --- .../202-facies-segmentation/facies_demo.ipynb | 82 ++++++++++++++----- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/facies_demo.ipynb index 8393b9a2bd5..f64c48e5332 100644 --- a/notebooks/202-facies-segmentation/facies_demo.ipynb +++ b/notebooks/202-facies-segmentation/facies_demo.ipynb @@ -12,7 +12,16 @@ "\n", "See the source repository to learn more about the model architecture and training method - https://github.com/yalaudah/facies_classification_benchmark\n", "\n", - "The `IR` model was created with OpenVINO™ [Model Optimizer](https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html)" + "The `IR` model was created with OpenVINO™ [Model Optimizer](https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html)\n", + "\n", + "To convert the model from ONNX to `IR`, we used the `mo_onnx.py` script with the `--extension` flag as shown below:\n", + " \n", + " ```bash\n", + " python3 /opt/intel/openvino/deployment_tools/model_optimizer/mo_onnx.py \\\n", + " --input_model model.onnx \\\n", + " --extension openvino_pytorch_layers/mo_extensions\n", + "```\n", + "Where `openvino_pytorch_layers/mo_extensions` is python code from [openvino_pytorch_layers](https://github.com/dkurt/openvino_pytorch_layers) repository" ] }, { @@ -74,7 +83,6 @@ "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", - "from itkwidgets import view\n", "from openvino.inference_engine import IECore\n", "from openvino_extensions import get_extensions_path\n", "from tqdm import tqdm" @@ -565,7 +573,35 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Run model cube (multiple slices)" + "### Run model cube (multiple slices) for 3D visualization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "is_visualize_3d = False\n", + "try:\n", + " from itkwidgets import view\n", + "\n", + " is_visualize_3d = True\n", + "except ModuleNotFoundError:\n", + " print(\n", + " \"[WARNING]: itkwidgets is not installed,\\n to see 3D visualizations, please install itkwidgets by uncommenting the following cell \"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# %pip install itkwidgets==0.23.1\n", + "# from itkwidgets import view\n", + "# is_visualize_3d = True" ] }, { @@ -628,14 +664,15 @@ "metadata": {}, "outputs": [], "source": [ - "viewer_orig_data = view(data, shadow=False, annotations=False)\n", - "count_of_greys = 100\n", - "viewer_orig_data.cmap = np.array(\n", - " [\n", - " [i / count_of_greys, i / count_of_greys, i / count_of_greys]\n", - " for i in range(count_of_greys)\n", - " ]\n", - ")" + "if is_visualize_3d:\n", + " viewer_orig_data = view(data, shadow=False, annotations=False)\n", + " count_of_greys = 100\n", + " viewer_orig_data.cmap = np.array(\n", + " [\n", + " [i / count_of_greys, i / count_of_greys, i / count_of_greys]\n", + " for i in range(count_of_greys)\n", + " ]\n", + " )" ] }, { @@ -651,14 +688,15 @@ "metadata": {}, "outputs": [], "source": [ - "cmap = discrete_cmap(len(config[\"name_classes\"]), \"jet\")\n", - "show_legend(config[\"name_classes\"], cmap)\n", - "viewer_interpret_data = view(predicted_data, shadow=False, annotations=False)\n", - "viewer_interpret_data.cmap = cmap\n", - "widgets.link(\n", - " (viewer_interpret_data, \"camera\"), (viewer_orig_data, \"camera\")\n", - ") # link widget cameras\n", - "pass" + "if is_visualize_3d:\n", + " cmap = discrete_cmap(len(config[\"name_classes\"]), \"jet\")\n", + " show_legend(config[\"name_classes\"], cmap)\n", + " viewer_interpret_data = view(predicted_data, shadow=False, annotations=False)\n", + " viewer_interpret_data.cmap = cmap\n", + " widgets.link(\n", + " (viewer_interpret_data, \"camera\"), (viewer_orig_data, \"camera\")\n", + " ) # link widget cameras\n", + " pass" ] }, { @@ -674,7 +712,7 @@ "metadata": {}, "outputs": [], "source": [ - "viewer_interpret_data" + "is_visualize_3d and viewer_interpret_data or print(\"3D rendering disabled\")" ] }, { @@ -683,14 +721,14 @@ "metadata": {}, "outputs": [], "source": [ - "viewer_orig_data" + "is_visualize_3d and viewer_orig_data or print(\"3D rendering disabled\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "You can now see a visualization of the interpreted and raw seismic data. It is also possible to use your mouse to interactively rotate, zoom and explore the interpreted data." + "You can now see a visualization of the interpreted and raw seismic data. It is also possible to use your mouse to interactively rotate, zoom and explore the interpreted data. If you don't see rendering, just restart this jupyter-notebook." ] }, { From b9781942f8c0b2cbe65f0be48ddb2e3df393ba19 Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Thu, 22 Jul 2021 04:10:20 +0300 Subject: [PATCH 28/29] rename demo notebook --- .../{facies_demo.ipynb => 204-vision-facies-segmentation.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename notebooks/202-facies-segmentation/{facies_demo.ipynb => 204-vision-facies-segmentation.ipynb} (100%) diff --git a/notebooks/202-facies-segmentation/facies_demo.ipynb b/notebooks/202-facies-segmentation/204-vision-facies-segmentation.ipynb similarity index 100% rename from notebooks/202-facies-segmentation/facies_demo.ipynb rename to notebooks/202-facies-segmentation/204-vision-facies-segmentation.ipynb From 721ad522ccc5da101c77fe066ad91f84612fdfcb Mon Sep 17 00:00:00 2001 From: "Alexey, Khorkin" Date: Thu, 22 Jul 2021 04:12:15 +0300 Subject: [PATCH 29/29] rename demo folder --- .../204-vision-facies-segmentation.ipynb | 0 .../README.md | 0 .../demo.png | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename notebooks/{202-facies-segmentation => 204-vision-facies-segmentation}/204-vision-facies-segmentation.ipynb (100%) rename notebooks/{202-facies-segmentation => 204-vision-facies-segmentation}/README.md (100%) rename notebooks/{202-facies-segmentation => 204-vision-facies-segmentation}/demo.png (100%) diff --git a/notebooks/202-facies-segmentation/204-vision-facies-segmentation.ipynb b/notebooks/204-vision-facies-segmentation/204-vision-facies-segmentation.ipynb similarity index 100% rename from notebooks/202-facies-segmentation/204-vision-facies-segmentation.ipynb rename to notebooks/204-vision-facies-segmentation/204-vision-facies-segmentation.ipynb diff --git a/notebooks/202-facies-segmentation/README.md b/notebooks/204-vision-facies-segmentation/README.md similarity index 100% rename from notebooks/202-facies-segmentation/README.md rename to notebooks/204-vision-facies-segmentation/README.md diff --git a/notebooks/202-facies-segmentation/demo.png b/notebooks/204-vision-facies-segmentation/demo.png similarity index 100% rename from notebooks/202-facies-segmentation/demo.png rename to notebooks/204-vision-facies-segmentation/demo.png