From ef7c0f3741e9287a4d963a8918484ce539b2779e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:36:44 +0000 Subject: [PATCH 01/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20CFL=5FID1230=5Ffor?= =?UTF-8?q?=5FTensorFlow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From f249a662775dd1329fd95d6162030fc1cf120356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:43:14 +0000 Subject: [PATCH 02/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From ceae71a56b24d7fe63aeb24df57336ae815d4ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:44:05 +0000 Subject: [PATCH 03/33] =?UTF-8?q?=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg | Bin 0 -> 58909 bytes .../CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg | Bin 0 -> 8377 bytes .../Image/p1_CM_test.jpg | Bin 0 -> 705 bytes .../CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg | Bin 0 -> 14667 bytes .../Image/p1_EM_test.jpg | Bin 0 -> 1269 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM_test.jpg create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM_test.jpg diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..847ffea102877e9fd0d6e6925c8cc441419945aa GIT binary patch literal 58909 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 literal 0 HcmV?d00001 diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89f8e6b2e63dd53f4c8e66605e1128c9660d8337 GIT binary patch literal 8377 zcmeHKdpMM78y{z(G-Zk@6g7;I$P6XXi9zH%lbPWwg1J0Dy?#2bk#u8~{j5N=iveNJ~jctym!~Bd4%ZPF7YX$aNU)q}&~sv5iY?A&3jqYvLP^9w*$S`;8Im=*|_sRyVECYKPI zy#Rk)BBEmA5|UEVD`aE^28`7JQ4ujQQE@Q|32||O^%=qc0CAwin$3FqB-h#>lTtgW zu;Y8`b!qkeCAA=j$HQCn-2=|8kXg50Q3<>iqM-@Zf+GwJckVJeaL~*gX<=#Q=;Vw- zA92CpJv_aDuoc-GU~_niOYW&gm)=-Bwgo41qire-<-(n8uy0q;Ii zG&7dRG6TyDEHkjoz%m2N4E&XWJOl9lGB)(zDw29;3ib;J*7T^)nT~UZ%-wkQy=oci z3LXE-dj1MeFDBhLNnmF=T4XI!h#0v>KGgX1#*c_pXQiJ99kv?0@e z%nqzfk92=@AD1>%eC;l!iRw>Ow_M;XbhrE|`Sz*U#24w%^c}_LU=7B52RwYxYlFym zCv4$oQQAQ}ZFK5vV3riCIjA^?3)yYQI|$M@9xqsEjvvR?LV^qA1*m&6{GP=iEBy7P z@q=-QcccvF@VL8ZumA=b!ba&%Vn)vpyVP%jn!0opd5(*~=5FgL>Fa&)ffUz@7}52k zRS%+S#*~;vz9IL)bi!wt6Sy%i^ZZTXP32TW;?*_-Bj>PfR&VIVN+6&@f)J#YghdpM zpVs>zr^og}5g!2m-nYS0j&GGiT%nKn#5|Pv-%0!yfJ{KSv^HRsy;GAf1@OZJw z2qd;d>K*Am;_}hhF0`J}vlwT1f?%19oC^VFLE$zPA#O0vv|(036&W+0s=6|B|Eh<) zq{7KF>M^%4qgPh<_dtAM-`%=QqBWgtMlKP)8Cl5M{5NmSr1^}Y39o%`>2;*T=-1$f zOfJTHnwJQF9>u4ZH1Aj_?KGP8=eB2WW|2m6_$8*NW__K5W>E8gZ7;r30~T2nWeg0c zmZl@E##BL%l;j2KoM@FaXU#^??1T=KQmJkb_ho_jWw+bUEHgLgQzl}J27rLRpaQ?u zUG?rhK)3BZQFf(0)g1dx%mRWD*L)$m**Dpe>BSVPmwL_aMzg=T0upFxBLZa9doJ@s+H{3h!7Fx@@x>? zCITCN>e012+W1OY%xLg5?@32!uJ&HP4gefAG*1LUcS3_xXA7@FG zXE!Tl&N~0gz?*62;ZK9vGYhF;rQ2Fa5*R#a@iJ6u$tQ&)IC;;t}VI5cwJ$pCjEN!U5KE!{y%V z!-g6y8HA|U_WE8ln>lIOuB0S-s@GWP$QP>P)^=wQR^&D=nTo%Vn|VykOgJ;Ed2U5B z1qXigW19ZL4E@#9|M{VgCJQp}VV2?&xp&^=iwzQF{BhiKYJ}7A{nmO^>rZ`(9ke#^ z@M!bq12!-l*8INz1olmD94O&BHm>K|m>W?)fbl!uGjylzN`e>vv9e zPo0ggpPcekh<&IFRn81f@|7y~kGwkOYLb`} zR#1&Tl|AXxl-c(IhVhdDssxi0n@C{brI7nLlk0@%B|RmcIPh$`w$nO@qjAd0yOAIs zfwn72bz9JI=&=<2(s6oH_r~Mg>BM^j7((Qa*O;A=o^)NsFNUw0B|M)plAB zdg->I936D8*mIblvY~+~T8S-G+w4oWXIHnf45YswmI(dGlt%l);wlscotH3jHStcKm6Raaf8JAz>N;e90t9$mu4IUG4r}9u*fWF9vOIBlN*A5Uiod&ug3m+9d|0X>D!G) z@~d18>%F$B?jauPiNg!q0cH#ur|-=#GME~CfN#d%YexX*_Mv?u0&8?enD$?dyOJ6^ z$Iv8FPhpA3?FqV3PE>Whsp+8G*#aV&;74Q1GDGy}asf-0r9Ehb`%c;5d`pi9Mvfh| z-}O6ZmBTvdmF}5piyQzd8EnNXRd%*FcF0$`#CIxaP_hOitUs5oMYB+~`F35P*O=7< z+P7Jb%Jz}(d51}S^2C12L*VadCxr3g_&v+zqI*su5ldXDva1l@g4^DWP?)OP`JNXa z7>r9N86g{UqZVUY80r2XqV!E5wvzmVpraq~sWxV7zSDZ}5$tLG`v+JWHz;Bq8N)9s ze6yD2UHOz7^fyP^n}No+m?%Ju1;!dq!|hSFjZ;^6 z`1KOoHNZpsA2EagLKbIEtUyfkVKKD5!LS$&e=UvIMZH51!dOjgK8 z6;8b%kL15hSG83C&o##OYJR{x*9T>DJ%Jwpv7X zUP%ZlBGrd`5H=i@87W?a)!O|Oo&KBVD$=&8rE9-1!3ZkSCtNsTb((+t^nUI};*ct) zofEkV#-84;C28GS78=gqyrz%R&h@>ntAex|Jqv19`YjrLm1Hd!gDaZ>g!1qUHI42J z?&xy|7_Lfep1h2X>GjbqRvA(5sJe}K@%EuC?E$&0>2K?P#UpgUpJe{fwE$N77-0%c zqK%)>sJ{cZzg4C)?F3dc{K&XNs%%ZG;uo88eNQ(Sw`?hlw_C(fHQn14s44>Uq`c7R zrkoc=Fh{O2JFF-;%utX1r^~+r-ux%ok~y(9H_C?mtUUs;s431SRfG+s;`iI+pM57F z@ump;BR%&pdO_eKr>UZ=#AvDRTraN6ZAvM>Vp})8)Pw6K6vnrX95G=G=ldhW9sLDI zj)e3HpwD7Klvm9ewD5o=W8o=FY4ppW%=V&Qi{u}QX0y__?`wI6Wd@cRSY}|Efn^5% J?+nbe{|{2;AlCo@ literal 0 HcmV?d00001 diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM_test.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM_test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a38729ed5bdcf6bdff8bbf9f2f1acf82c26c5eff GIT binary patch literal 705 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<Jq?U}9uuW@2GxWo2Ojs;&jfGq4D<3Mm>o zvIz$!vMUve7&T5@$f4}C@t|nX#SbdRNkvVZTw>x9l2WQ_>Kd9_CZ=ZQ7M51dF0O9w z9-dyoA)#U65s^{JDXD4c8JStdC8cHM6_r)ZEv;?s9i3g1CQq3GGAU*RJ2VdF$b$$4{OPfBE|D z`;VW${@-HY00o;p!_R+R8jG-@wY>f=S4`@)-(EY@8+Vm>4TI`Jv?3e7^fxA7dRlGmI{7PVB$5^N>NIt4PTC%t8@O?L)7n|6bE_ zu=i@~VprQGFZ%l0tgmPHT)UQZ=eU6T@sILR&sQw!DwufHt4%>}f!vl`Q}xvP%z9N) z-F~0qXIr$Wi}B#u(p}H{)|u|-&b%dk%TX$_!RD&GaYE8gEzJ{7JJc7L+`=BVi}wG& F2>_en9%%po literal 0 HcmV?d00001 diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b7145db1588c3bf9af3e10f5c1467f2887653fc GIT binary patch literal 14667 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 D93`WQ literal 0 HcmV?d00001 diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM_test.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM_test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637e3aeddb35160e1f4f1a11df30f1885cc96873 GIT binary patch literal 1269 zcmVgv=4-_35A08bV92_7dE+-%&EF&BoC^soAFflYVG#@89JvcHvE;BST|G)qX2mn9; zfB^v!0RO}Q9{>OW1pxs80RaI300000000010s{mE1_uZU3Jd?l0JRVR0s#X90t5pE z1q1{D00Dgg0s{a95d{(Xb($mz{*4NnC+Tr5kHzm+W-gbtcq>ZiPbApZczu~r9xwbTCqEN#K`H*o|10HIT6@IQ$nLgPxB zRUP0WU;PA{qif;KYWC~w*7{xB%sQ`>Mn1XeT5aHcLfn6+Ug>si{mHKraQp!@!{H?- z3$N(Rf9vNT(wg22)rvFQ8%xAqrrPBnABJ;Qymxzdb*Wmd#IDG;>QPDHXWF?+D6I`E zT-5YSfi|0aHM{rN+&9#8KaF-4x~7HV%PZ@RcSrKCtzq*`)}4sF-f{DNT;JE+(aMz zdbYHm25W=E`qjGGq?ZyRZHXpUauu?00p_?_;F{WIhIpPSP~nl(sR!H|j*2Uz)>%)4 zd^`cm0Y2gB^Vc~=DuT=a?_IU-x8bi7ykk^`=S{ecb}iHZNThb$y?-j9{{RS$todsn z6KN91+s=`pWB4$t?cq6*u-c}Q2ls{AkyfJc{{V+=6U@~-PaBcXlVJl&$J=qh6)O0* zPSC+$3~4I_-9FuWiDvq!`>Xh7xxGhJzSZv9>rlIz=634xv19Zef~sWt)UaI7YdTMF zG?7Y&D(J;XKEzj0zCFFWg<#igY_*8MzLG8gXz1P zZ`eE-K4YxvB!6^TjQ;>SdR=%P$L38xRMcc0ruBEE%-@O4mJAB@PGEG>tcb;yFuwN>S*{1qWX6)Bp=j1c&M7OEz)u fisWdbiYTIrD58oeqKYV@iYTIrD58oeqKg07c7RX7 literal 0 HcmV?d00001 -- Gitee From a598ec26de565ba429f0a79e1135a5f207e133b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:44:15 +0000 Subject: [PATCH 04/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/Image/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 7a7841e2a583292ab569e1fb373bb6c6fb2b4da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:45:36 +0000 Subject: [PATCH 05/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From e40962454b3e98903fb138efce153a2cdf8ee7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:46:27 +0000 Subject: [PATCH 06/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20Models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From d16f2840c865fe5ba8c6d542f291d07ea3d718e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:46:42 +0000 Subject: [PATCH 07/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 8117c519501ce79d87ca1cb05614c7aa6cf8ac68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:47:09 +0000 Subject: [PATCH 08/33] =?UTF-8?q?=E5=85=A5=E5=8F=A3=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/train_full_1p.sh | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/train_full_1p.sh diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/train_full_1p.sh b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/train_full_1p.sh new file mode 100644 index 000000000..030e50c4d --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/train_full_1p.sh @@ -0,0 +1,191 @@ +#!/bin/bash + +########################################################## +#########第3行 至 100行,请一定不要、不要、不要修改########## +#########第3行 至 100行,请一定不要、不要、不要修改########## +#########第3行 至 100行,请一定不要、不要、不要修改########## +########################################################## +# shell脚本所在路径 +cur_path=`echo $(cd $(dirname $0);pwd)` + +# 判断当前shell是否是performance +perf_flag=`echo $0 | grep performance | wc -l` + +# 当前执行网络的名称 +Network=`echo $(cd $(dirname $0);pwd) | awk -F"/" '{print $(NF-1)}'` + +export RANK_SIZE=1 +export RANK_ID=0 +export JOB_ID=10087 + +# 路径参数初始化 +data_path="" +output_path="" + +# 帮助信息,不需要修改 +if [[ $1 == --help || $1 == -h ]];then + echo"usage:./train_performance_1P.sh " + echo " " + echo "parameter explain: + --data_path # dataset of training + --output_path # output of training + --train_steps # max_step for training + --train_epochs # max_epoch for training + --batch_size # batch size + -h/--help show help message + " + exit 1 +fi + +# 参数校验,不需要修改 +for para in $* +do + if [[ $para == --data_path* ]];then + data_path=`echo ${para#*=}` + elif [[ $para == --output_path* ]];then + output_path=`echo ${para#*=}` + elif [[ $para == --train_steps* ]];then + train_steps=`echo ${para#*=}` + elif [[ $para == --train_epochs* ]];then + train_epochs=`echo ${para#*=}` + elif [[ $para == --batch_size* ]];then + batch_size=`echo ${para#*=}` + fi +done + +# 校验是否传入data_path,不需要修改 +if [[ $data_path == "" ]];then + echo "[Error] para \"data_path\" must be config" + exit 1 +fi + +# 校验是否传入output_path,不需要修改 +if [[ $output_path == "" ]];then + output_path="./test/output/${ASCEND_DEVICE_ID}" +fi + +# 设置打屏日志文件名,请保留,文件名为${print_log} +print_log="./test/output/${ASCEND_DEVICE_ID}/train_${ASCEND_DEVICE_ID}.log" +modelarts_flag=${MODELARTS_MODEL_PATH} +if [ x"${modelarts_flag}" != x ]; +then + echo "running without etp..." + print_log_name=`ls /home/ma-user/modelarts/log/ | grep proc-rank` + print_log="/home/ma-user/modelarts/log/${print_log_name}" +fi +echo "### get your log here : ${print_log}" + +CaseName="" +function get_casename() +{ + if [ x"${perf_flag}" = x1 ]; + then + CaseName=${Network}_bs${batch_size}_${RANK_SIZE}'p'_'perf' + else + CaseName=${Network}_bs${batch_size}_${RANK_SIZE}'p'_'acc' + fi +} + +# 跳转到code目录 +cd ${cur_path}/../ +rm -rf ./test/output/${ASCEND_DEVICE_ID} +mkdir -p ./test/output/${ASCEND_DEVICE_ID} + +# 训练开始时间记录,不需要修改 +start_time=$(date +%s) +########################################################## +#########第3行 至 100行,请一定不要、不要、不要修改########## +#########第3行 至 100行,请一定不要、不要、不要修改########## +#########第3行 至 100行,请一定不要、不要、不要修改########## +########################################################## + +#========================================================= +#========================================================= +#========训练执行命令,需要根据您的网络进行修改============== +#========================================================= +#========================================================= +# 基础参数,需要模型审视修改 +# 您的训练数据集在${data_path}路径下,请直接使用这个变量获取 +# 您的训练输出目录在${output_path}路径下,请直接使用这个变量获取 +# 您的其他基础参数,可以自定义增加,但是batch_size请保留,并且设置正确的值 +batch_size=16 + +if [ x"${modelarts_flag}" != x ]; +then + python3.7 ./test_CFL.py \ + --dataset=${data_path}"/Datasets/SUN360/test/" \ + --weights=${data_path}"/Weights/StdConvs/model.ckpt" \ + --results=${output_path}"/results" \ + --network="StdConvs" +else + python3.7 ./test_CFL.py \ + --dataset=${data_path}"/Datasets/SUN360/test/" \ + --weights=${data_path}"/Weights/StdConvs/model.ckpt" \ + --results=${output_path}"/results" \ + --network="StdConvs" >${print_log} +fi + +# 性能相关数据计算 +StepTime=`grep "sec/step :" ${print_log} | tail -n 10 | awk '{print $NF}' | awk '{sum+=$1} END {print sum/NR}'` +FPS=`awk 'BEGIN{printf "%.2f\n", '${batch_size}'/'${StepTime}'}'` + +# 精度相关数据计算 +train_accuracy=`grep "Final Accuracy accuracy" ${print_log} | awk '{print $NF}'` +# 提取所有loss打印信息 +grep "loss :" ${print_log} | awk -F ":" '{print $4}' | awk -F "-" '{print $1}' > ./test/output/${ASCEND_DEVICE_ID}/my_output_loss.txt + + +########################################################### +#########后面的所有内容请不要修改########################### +#########后面的所有内容请不要修改########################### +#########后面的所有内容请不要修改########################### +########################################################### + +# 判断本次执行是否正确使用Ascend NPU +use_npu_flag=`grep "The model has been compiled on the Ascend AI processor" ${print_log} | wc -l` +if [ x"${use_npu_flag}" == x0 ]; +then + echo "------------------ ERROR NOTICE START ------------------" + echo "ERROR, your task haven't used Ascend NPU, please check your npu Migration." + echo "------------------ ERROR NOTICE END------------------" +else + echo "------------------ INFO NOTICE START------------------" + echo "INFO, your task have used Ascend NPU, please check your result." + echo "------------------ INFO NOTICE END------------------" +fi + +# 获取最终的casename,请保留,case文件名为${CaseName} +get_casename + +# 重命名loss文件 +if [ -f ./test/output/${ASCEND_DEVICE_ID}/my_output_loss.txt ]; +then + mv ./test/output/${ASCEND_DEVICE_ID}/my_output_loss.txt ./test/output/${ASCEND_DEVICE_ID}/${CaseName}_loss.txt +fi + +# 训练端到端耗时 +end_time=$(date +%s) +e2e_time=$(( $end_time - $start_time )) + +echo "------------------ Final result ------------------" +# 输出性能FPS/单step耗时/端到端耗时 +echo "Final Performance images/sec : $FPS" +echo "Final Performance sec/step : $StepTime" +echo "E2E Training Duration sec : $e2e_time" + +# 输出训练精度 +echo "Final Train Accuracy : ${train_accuracy}" + +# 最后一个迭代loss值,不需要修改 +ActualLoss=(`awk 'END {print $NF}' $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}_loss.txt`) + +#关键信息打印到${CaseName}.log中,不需要修改 +echo "Network = ${Network}" > $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "RankSize = ${RANK_SIZE}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "BatchSize = ${batch_size}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "DeviceType = `uname -m`" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "CaseName = ${CaseName}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "ActualFPS = ${FPS}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "TrainingTime = ${StepTime}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "ActualLoss = ${ActualLoss}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log +echo "E2ETrainingTime = ${e2e_time}" >> $cur_path/output/$ASCEND_DEVICE_ID/${CaseName}.log \ No newline at end of file -- Gitee From 0dd37663f43d275e34f854b494696dea2617b710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:47:36 +0000 Subject: [PATCH 09/33] =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/CFL_StdConvs.py | 257 +++++++ .../Models/__init__.py | 29 + .../Models/network.py | 708 ++++++++++++++++++ 3 files changed, 994 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/CFL_StdConvs.py create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/__init__.py create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/network.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/CFL_StdConvs.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/CFL_StdConvs.py new file mode 100644 index 000000000..f2e5c53a0 --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/CFL_StdConvs.py @@ -0,0 +1,257 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from npu_bridge.npu_init import * +from .network import Network +import tensorflow as tf + + +class LayoutEstimator_StdConvs(Network): + def setup(self): + feed_dict_test = {} + feed_dict_train = {} + self.nname = "edge-estimator" + with tf.variable_scope(self.nname): + (self.feed('rgb_input') + .conv(7, 7, 64, 2, 2, relu=False, name='conv1') + .batch_normalization(relu=True, name='bn_conv1') + .max_pool(3, 3, 2, 2, name='pool1') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res2a_branch1') + .batch_normalization(name='bn2a_branch1')) + + (self.feed('pool1') + .conv(1, 1, 64, 1, 1, biased=False, relu=False, name='res2a_branch2a') + .batch_normalization(relu=True, name='bn2a_branch2a') + .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='res2a_branch2b') + .batch_normalization(relu=True, name='bn2a_branch2b') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res2a_branch2c') + .batch_normalization(name='bn2a_branch2c')) + + (self.feed('bn2a_branch1', + 'bn2a_branch2c') + .add(name='res2a') + .relu(name='res2a_relu') + .conv(1, 1, 64, 1, 1, biased=False, relu=False, name='res2b_branch2a') + .batch_normalization(relu=True, name='bn2b_branch2a') + .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='res2b_branch2b') + .batch_normalization(relu=True, name='bn2b_branch2b') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res2b_branch2c') + .batch_normalization(name='bn2b_branch2c')) + + (self.feed('res2a_relu', + 'bn2b_branch2c') + .add(name='res2b') + .relu(name='res2b_relu') + .conv(1, 1, 64, 1, 1, biased=False, relu=False, name='res2c_branch2a') + .batch_normalization(relu=True, name='bn2c_branch2a') + .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='res2c_branch2b') + .batch_normalization(relu=True, name='bn2c_branch2b') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res2c_branch2c') + .batch_normalization(name='bn2c_branch2c')) + + (self.feed('res2b_relu', + 'bn2c_branch2c') + .add(name='res2c') + .relu(name='res2c_relu') + .conv(1, 1, 512, 2, 2, biased=False, relu=False, name='res3a_branch1') + .batch_normalization(name='bn3a_branch1')) + + (self.feed('res2c_relu') + .conv(1, 1, 128, 2, 2, biased=False, relu=False, name='res3a_branch2a') + .batch_normalization(relu=True, name='bn3a_branch2a') + .conv(3, 3, 128, 1, 1, biased=False, relu=False, name='res3a_branch2b') + .batch_normalization(relu=True, name='bn3a_branch2b') + .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='res3a_branch2c') + .batch_normalization(name='bn3a_branch2c')) + + (self.feed('bn3a_branch1', + 'bn3a_branch2c') + .add(name='res3a') + .relu(name='res3a_relu') + .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='res3b_branch2a') + .batch_normalization(relu=True, name='bn3b_branch2a') + .conv(3, 3, 128, 1, 1, biased=False, relu=False, name='res3b_branch2b') + .batch_normalization(relu=True, name='bn3b_branch2b') + .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='res3b_branch2c') + .batch_normalization(name='bn3b_branch2c')) + + (self.feed('res3a_relu', + 'bn3b_branch2c') + .add(name='res3b') + .relu(name='res3b_relu') + .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='res3c_branch2a') + .batch_normalization(relu=True, name='bn3c_branch2a') + .conv(3, 3, 128, 1, 1, biased=False, relu=False, name='res3c_branch2b') + .batch_normalization(relu=True, name='bn3c_branch2b') + .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='res3c_branch2c') + .batch_normalization(name='bn3c_branch2c')) + + (self.feed('res3b_relu', + 'bn3c_branch2c') + .add(name='res3c') + .relu(name='res3c_relu') + .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='res3d_branch2a') + .batch_normalization(relu=True, name='bn3d_branch2a') + .conv(3, 3, 128, 1, 1, biased=False, relu=False, name='res3d_branch2b') + .batch_normalization(relu=True, name='bn3d_branch2b') + .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='res3d_branch2c') + .batch_normalization(name='bn3d_branch2c')) + + (self.feed('res3c_relu', + 'bn3d_branch2c') + .add(name='res3d') + .relu(name='res3d_relu') + .conv(1, 1, 1024, 2, 2, biased=False, relu=False, name='res4a_branch1') + .batch_normalization(name='bn4a_branch1')) + + (self.feed('res3d_relu') + .conv(1, 1, 256, 2, 2, biased=False, relu=False, name='res4a_branch2a') + .batch_normalization(relu=True, name='bn4a_branch2a') + .conv(3, 3, 256, 1, 1, biased=False, relu=False, name='res4a_branch2b') + .batch_normalization(relu=True, name='bn4a_branch2b') + .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='res4a_branch2c') + .batch_normalization(name='bn4a_branch2c')) + + (self.feed('bn4a_branch1', + 'bn4a_branch2c') + .add(name='res4a') + .relu(name='res4a_relu') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res4b_branch2a') + .batch_normalization(relu=True, name='bn4b_branch2a') + .conv(3, 3, 256, 1, 1, biased=False, relu=False, name='res4b_branch2b') + .batch_normalization(relu=True, name='bn4b_branch2b') + .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='res4b_branch2c') + .batch_normalization(name='bn4b_branch2c')) + + (self.feed('res4a_relu', + 'bn4b_branch2c') + .add(name='res4b') + .relu(name='res4b_relu') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res4c_branch2a') + .batch_normalization(relu=True, name='bn4c_branch2a') + .conv(3, 3, 256, 1, 1, biased=False, relu=False, name='res4c_branch2b') + .batch_normalization(relu=True, name='bn4c_branch2b') + .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='res4c_branch2c') + .batch_normalization(name='bn4c_branch2c')) + + (self.feed('res4b_relu', + 'bn4c_branch2c') + .add(name='res4c') + .relu(name='res4c_relu') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res4d_branch2a') + .batch_normalization(relu=True, name='bn4d_branch2a') + .conv(3, 3, 256, 1, 1, biased=False, relu=False, name='res4d_branch2b') + .batch_normalization(relu=True, name='bn4d_branch2b') + .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='res4d_branch2c') + .batch_normalization(name='bn4d_branch2c')) + + (self.feed('res4c_relu', + 'bn4d_branch2c') + .add(name='res4d') + .relu(name='res4d_relu') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res4e_branch2a') + .batch_normalization(relu=True, name='bn4e_branch2a') + .conv(3, 3, 256, 1, 1, biased=False, relu=False, name='res4e_branch2b') + .batch_normalization(relu=True, name='bn4e_branch2b') + .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='res4e_branch2c') + .batch_normalization(name='bn4e_branch2c')) + + (self.feed('res4d_relu', + 'bn4e_branch2c') + .add(name='res4e') + .relu(name='res4e_relu') + .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res4f_branch2a') + .batch_normalization(relu=True, name='bn4f_branch2a') + .conv(3, 3, 256, 1, 1, biased=False, relu=False, name='res4f_branch2b') + .batch_normalization(relu=True, name='bn4f_branch2b') + .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='res4f_branch2c') + .batch_normalization(name='bn4f_branch2c')) + + (self.feed('res4e_relu', + 'bn4f_branch2c') + .add(name='res4f') + .relu(name='res4f_relu') + .conv(1, 1, 2048, 2, 2, biased=False, relu=False, name='res5a_branch1') + .batch_normalization(name='bn5a_branch1')) + + (self.feed('res4f_relu') + .conv(1, 1, 512, 2, 2, biased=False, relu=False, name='res5a_branch2a') + .batch_normalization(relu=True, name='bn5a_branch2a') + .conv(3, 3, 512, 1, 1, biased=False, relu=False, name='res5a_branch2b') + .batch_normalization(relu=True, name='bn5a_branch2b') + .conv(1, 1, 2048, 1, 1, biased=False, relu=False, name='res5a_branch2c') + .batch_normalization(name='bn5a_branch2c')) + + (self.feed('bn5a_branch1', + 'bn5a_branch2c') + .add(name='res5a') + .relu(name='res5a_relu') + .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='res5b_branch2a') + .batch_normalization(relu=True, name='bn5b_branch2a') + .conv(3, 3, 512, 1, 1, biased=False, relu=False, name='res5b_branch2b') + .batch_normalization(relu=True, name='bn5b_branch2b') + .conv(1, 1, 2048, 1, 1, biased=False, relu=False, name='res5b_branch2c') + .batch_normalization(name='bn5b_branch2c')) + + drop_out_d = tf.placeholder(tf.float32, name="drop_out_d") + feed_dict_train[drop_out_d] = 0.5 # 0.5 + feed_dict_test[drop_out_d] = 1.0 + + (self.feed('res5a_relu', + 'bn5b_branch2c') + .add(name='res5b') + .relu(name='res5b_relu') + .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='res5c_branch2a') + .batch_normalization(relu=True, name='bn5c_branch2a', dropout=drop_out_d) # def + .conv(3, 3, 512, 1, 1, biased=False, relu=False, name='res5c_branch2b') + .batch_normalization(relu=True, name='bn5c_branch2b', dropout=drop_out_d) + .conv(1, 1, 2048, 1, 1, biased=False, relu=False, name='res5c_branch2c') + .batch_normalization(name='bn5c_branch2c')) + + # ------------------------------------------------------------------------------------ + # decoder EDGE MAPS & CORNERS MAPS + (self.feed('bn5c_branch2c') + .upconv(None, 512, ksize=5, stride=2, name='d_2x', biased=True, relu=True)) + (self.feed('d_2x', 'res4f_relu') + .concat(axis=3, name="d_concat_2x") + .upconv(None, 256, ksize=5, stride=2, name='d_4x', biased=True, relu=True) + .upconv(None, 2, ksize=3, stride=1, biased=True, relu=False, name='output4X_likelihood')) + (self.feed('d_4x', 'res3d_relu', 'output4X_likelihood') + .concat(axis=3, name="d_concat_4x") + .upconv(None, 128, ksize=5, stride=2, biased=True, relu=True, name='d_8x') + .upconv(None, 2, ksize=3, stride=1, relu=False, biased=True, name='output8X_likelihood')) + (self.feed('d_8x', 'res2c_relu', 'output8X_likelihood') + .concat(axis=3, name="d_concat_8x") + .upconv(None, 64, ksize=5, stride=2, biased=True, relu=True, name='d_16x') + .upconv(None, 2, ksize=3, stride=1, relu=False, biased=True, name='output16X_likelihood')) + (self.feed('d_16x', 'bn_conv1', 'output16X_likelihood') + .concat(axis=3, name="d_concat_16x") + .upconv(None, 64, ksize=3, stride=1, biased=True, relu=True, name='d_16x_conv1') + .upconv(None, 2, ksize=3, stride=1, biased=True, relu=False, name='output_likelihood')) + + self.fd_test = feed_dict_test + self.fd_train = feed_dict_train \ No newline at end of file diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/__init__.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/__init__.py new file mode 100644 index 000000000..d90e902da --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/__init__.py @@ -0,0 +1,29 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from npu_bridge.npu_init import * +from. CFL_StdConvs import LayoutEstimator_StdConvs diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/network.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/network.py new file mode 100644 index 000000000..945d5a4de --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/network.py @@ -0,0 +1,708 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from npu_bridge.npu_init import * +import numpy as np +import tensorflow as tf +import re +import math +from config import * +from npu_bridge.estimator import npu_ops + + +DEFAULT_PADDING = 'SAME' +DEFAULT_TYPE = tf.float32 + + +def include_original(dec): + """ Meta decorator, which make the original function callable (via f._original() )""" + + def meta_decorator(f): + decorated = dec(f) + decorated._original = f + return decorated + + return meta_decorator + + +summary = True + + +def ActivationSummary(layer): # tensorBoard (jmfacil) + if summary: + TOWER_NAME = 'tower' + tensor_name = re.sub('%s_[0-9]*/' % TOWER_NAME, '', layer.op.name) + tf.summary.histogram(tensor_name + '/activations', layer) + + +@include_original +def layer(op): + def layer_decorated(self, *args, **kwargs): + # Automatically set a name if not provided. + name = kwargs.setdefault('name', self.get_unique_name(op.__name__)) + # Figure out the layer inputs. + if len(self.inputs) == 0: + raise RuntimeError('No input variables found for layer %s.' % name) + elif len(self.inputs) == 1: + layer_input = self.inputs[0] + else: + layer_input = list(self.inputs) + # Perform the operation and get the output. + layer_output = op(self, layer_input, *args, **kwargs) + # Add to layer LUT. + self.layers[name] = layer_output + # This output is now the input for the next layer. + self.feed(layer_output) + # Return self for chained calls. + return self + + return layer_decorated + + +class Network(object): + + def __init__(self, inputs, trainable=True, is_training=True, bs=16): # ,reuse=None): #cfernandez + self.inputs = [] + self.batch_size = bs + self.layers = dict(inputs) + self.trainable = trainable + self.is_training = is_training + self.setup() + + def setup(self): + raise NotImplementedError('Must be subclassed.') + + def load(self, data_path, session, ignore_missing=False): + def transform_names(k): + if k == 'mean': + return 'moving_mean' + if k == 'variance': + return 'moving_variance' + if k == 'scale': + return 'gamma' + if k == 'offset': + return 'beta' + return k + + print(data_path) + data_dict = np.load(data_path, encoding='latin1').item() + for key in data_dict: + superkey = self.nname + "/" + key + with tf.variable_scope(superkey, reuse=True): + for subkey in data_dict[key]: + try: + nsubkey = transform_names(subkey) + var = tf.get_variable(nsubkey) + session.run(var.assign(data_dict[key][subkey])) + except ValueError: + print("ignore " + key, subkey) + print(superkey, tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=superkey)) + if not ignore_missing: + raise + print("Loaded weitghts") + + def feed(self, *args): + assert len(args) != 0 + self.inputs = [] + for layer in args: + if isinstance(layer, str): + try: + layer = self.layers[layer] + print(layer) + except KeyError: + print(list(self.layers.keys())) + raise KeyError('Unknown layer name fed: %s' % layer) + self.inputs.append(layer) + return self + + def get_output(self, layer): + try: + layer = self.layers[layer] + except KeyError: + print(list(self.layers.keys())) + raise KeyError('Unknown layer name fed: %s' % layer) + return layer + + def get_layer_output(self, name): + return self.layers[name] + + def get_unique_name(self, prefix): + id = sum(t.startswith(prefix) for t, _ in list(self.layers.items())) + 1 + return '%s_%d' % (prefix, id) + + def make_var(self, name, shape, initializer=None, trainable=True, regularizer=None): + return tf.get_variable(name, shape, initializer=initializer, trainable=trainable, regularizer=regularizer) + + def validate_padding(self, padding): + assert padding in ('SAME', 'VALID') + + def filler(self, params): # chema + # print "Filler: "+str(params) + value = params.get("value", 0.0) + mean = params.get("mean", 0.0) + std = params.get("std", 0.1) + dtype = params.get("dtype", DEFAULT_TYPE) + name = params.get("name", None) + uniform = params.get("uniform", False) + return { + "xavier_conv2d": tf.contrib.layers.xavier_initializer_conv2d(uniform=uniform), + "t_normal": tf.truncated_normal_initializer(mean=mean, stddev=std, dtype=dtype), + "constant": tf.constant_initializer(value=value, dtype=dtype) + }[params.get("type", "t_normal")] + + @layer + def conv(self, input, k_h, k_w, c_o, s_h, s_w, name, rate=1, biased=True, relu=True, padding=DEFAULT_PADDING, + trainable=True, initializer=None): + """ contribution by miraclebiu, and biased option""" + self.validate_padding(padding) + c_i = input.get_shape()[-1] + convolve = lambda i, k: tf.nn.convolution( + i, k, padding=padding, strides=[s_h, s_w], dilation_rate=[rate, rate]) + with tf.variable_scope(name, reuse=False) as scope: # cfernandez reuse + + # init_weights = tf.truncated_normal_initializer(0.0, stddev=0.001) + init_weights = tf.zeros_initializer() if initializer is 'zeros' else tf.contrib.layers.variance_scaling_initializer( + factor=0.01, mode='FAN_AVG', uniform=False) + init_biases = tf.constant_initializer(0.0) + # kernel = self.make_var('weights', [k_h, k_w, c_i, c_o], init_weights, trainable, + # regularizer=self.l2_regularizer(cfg.TRAIN.WEIGHT_DECAY)) + kernel = self.make_var('weights', shape=[k_h, k_w, c_i // 1, c_o], + initializer=self.filler({"type": "t_normal", # cfernandez + "mean": 0.0, + "std": 0.1 + }), + regularizer=self.l2_regularizer(args.weight_decay)) # 0.0005 cfg.TRAIN.WEIGHT_DECAY + + if biased: + biases = self.make_var('biases', [c_o], init_biases, trainable) + conv = convolve(input, kernel) + if relu: + bias = tf.nn.bias_add(conv, biases) + output = tf.nn.relu(bias) + output = tf.nn.bias_add(conv, biases) + + else: + conv = convolve(input, kernel) + if relu: + output = tf.nn.relu(conv) + output = conv + + return output + + @staticmethod + def rotation_matrix(axis, theta): + """ + Return the rotation matrix associated with counterclockwise rotation about + the given axis by theta radians. + """ + axis = np.asarray(axis) + axis = axis / math.sqrt(np.dot(axis, axis)) + a = math.cos(theta / 2.0) + b, c, d = -axis * math.sin(theta / 2.0) + aa, bb, cc, dd = a * a, b * b, c * c, d * d + bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d + return np.array([[aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], + [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], + [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc]]) + + @staticmethod + def equi_coord(pano_W, pano_H, k_W, k_H, u, v): + """ contribution by cfernandez and jmfacil """ + fov_w = k_W * np.deg2rad(360. / float(pano_W)) + focal = (float(k_W) / 2) / np.tan(fov_w / 2) + c_x = 0 + c_y = 0 + + u_r, v_r = u, v + u_r, v_r = u_r - float(pano_W) / 2., v_r - float(pano_H) / 2. + phi, theta = u_r / (pano_W) * (np.pi) * 2, -v_r / (pano_H) * (np.pi) + + ROT = Network.rotation_matrix((0, 1, 0), phi) + ROT = np.matmul(ROT, Network.rotation_matrix((1, 0, 0), theta)) # np.eye(3) + + h_range = np.array(range(k_H)) + w_range = np.array(range(k_W)) + w_ones = (np.ones(k_W)) + h_ones = (np.ones(k_H)) + h_grid = np.matmul(np.expand_dims(h_range, -1), np.expand_dims(w_ones, 0)) + 0.5 - float(k_H) / 2 + w_grid = np.matmul(np.expand_dims(h_ones, -1), np.expand_dims(w_range, 0)) + 0.5 - float(k_W) / 2 + + K = np.array([[focal, 0, c_x], [0, focal, c_y], [0., 0., 1.]]) + inv_K = np.linalg.inv(K) + rays = np.stack([w_grid, h_grid, np.ones(h_grid.shape)], 0) + rays = np.matmul(inv_K, rays.reshape(3, k_H * k_W)) + rays /= np.linalg.norm(rays, axis=0, keepdims=True) + rays = np.matmul(ROT, rays) + rays = rays.reshape(3, k_H, k_W) + + phi = np.arctan2(rays[0, ...], rays[2, ...]) + theta = np.arcsin(np.clip(rays[1, ...], -1, 1)) + x = (pano_W) / (2. * np.pi) * phi + float(pano_W) / 2. + y = (pano_H) / (np.pi) * theta + float(pano_H) / 2. + + roi_y = h_grid + v_r + float(pano_H) / 2. + roi_x = w_grid + u_r + float(pano_W) / 2. + + new_roi_y = (y) + new_roi_x = (x) + + offsets_x = (new_roi_x - roi_x) + offsets_y = (new_roi_y - roi_y) + + return offsets_x, offsets_y + + @staticmethod + def equi_coord_fixed_resoltuion(pano_W, pano_H, k_W, k_H, u, v, pano_Hf=-1, pano_Wf=-1): + """ contribution by cfernandez and jmfacil """ + pano_Hf = pano_H if pano_Hf <= 0 else pano_H / pano_Hf + pano_Wf = pano_W if pano_Wf <= 0 else pano_W / pano_Wf + fov_w = k_W * np.deg2rad(360. / float(pano_Wf)) + focal = (float(k_W) / 2) / np.tan(fov_w / 2) + c_x = 0 + c_y = 0 + + u_r, v_r = u, v + u_r, v_r = u_r - float(pano_W) / 2., v_r - float(pano_H) / 2. + phi, theta = u_r / (pano_W) * (np.pi) * 2, -v_r / (pano_H) * (np.pi) + + ROT = Network.rotation_matrix((0, 1, 0), phi) + ROT = np.matmul(ROT, Network.rotation_matrix((1, 0, 0), theta)) # np.eye(3) + + h_range = np.array(range(k_H)) + w_range = np.array(range(k_W)) + w_ones = (np.ones(k_W)) + h_ones = (np.ones(k_H)) + h_grid = np.matmul(np.expand_dims(h_range, -1), np.expand_dims(w_ones, 0)) + 0.5 - float(k_H) / 2 + w_grid = np.matmul(np.expand_dims(h_ones, -1), np.expand_dims(w_range, 0)) + 0.5 - float(k_W) / 2 + + K = np.array([[focal, 0, c_x], [0, focal, c_y], [0., 0., 1.]]) + inv_K = np.linalg.inv(K) + rays = np.stack([w_grid, h_grid, np.ones(h_grid.shape)], 0) + rays = np.matmul(inv_K, rays.reshape(3, k_H * k_W)) + rays /= np.linalg.norm(rays, axis=0, keepdims=True) + rays = np.matmul(ROT, rays) + rays = rays.reshape(3, k_H, k_W) + + phi = np.arctan2(rays[0, ...], rays[2, ...]) + theta = np.arcsin(np.clip(rays[1, ...], -1, 1)) + x = (pano_W) / (2. * np.pi) * phi + float(pano_W) / 2. + y = (pano_H) / (np.pi) * theta + float(pano_H) / 2. + + roi_y = h_grid + v_r + float(pano_H) / 2. + roi_x = w_grid + u_r + float(pano_W) / 2. + + new_roi_y = (y) + new_roi_x = (x) + + offsets_x = (new_roi_x - roi_x) + offsets_y = (new_roi_y - roi_y) + + return offsets_x, offsets_y + + @staticmethod + def distortion_aware_map(pano_W, pano_H, k_W, k_H, s_width=1, s_height=1, bs=16): + """ contribution by cfernandez and jmfacil """ + n = 1 + offset = np.zeros(shape=[pano_H, pano_W, k_H * k_W * 2]) + print(offset.shape) + + for v in range(0, pano_H, s_height): + for u in range(0, pano_W, s_width): + offsets_x, offsets_y = Network.equi_coord_fixed_resoltuion(pano_W, pano_H, k_W, k_H, u, v, 1, 1) + offsets = np.concatenate((np.expand_dims(offsets_y, -1), np.expand_dims(offsets_x, -1)), axis=-1) + total_offsets = offsets.flatten().astype("float32") + offset[v, u, :] = total_offsets + + offset = tf.constant(offset) + offset = tf.expand_dims(offset, 0) + offset = tf.concat([offset for _ in range(bs)], axis=0) + offset = tf.cast(offset, tf.float32) + + return offset + + @layer + def equi_conv(self, input, k_h, k_w, c_o, s_h, s_w, num_deform_group, name, num_groups=1, rate=1, biased=True, + relu=True, + padding=DEFAULT_PADDING, trainable=True, initializer=None): + """ contribution by cfernandez and jmfacil """ + self.validate_padding(padding) + data = input + n, h, w, _ = tuple(data.get_shape().as_list()) + data_shape = data.shape + offset = tf.stop_gradient( + Network.distortion_aware_map(w, h, k_w, k_h, s_width=s_w, s_height=s_h, bs=self.batch_size)) + + c_i = data.get_shape()[-1] + trans2NCHW = lambda x: tf.transpose(x, [0, 3, 1, 2]) + trans2NHWC = lambda x: tf.transpose(x, [0, 2, 3, 1]) + # deform conv only supports NCHW + data = trans2NCHW(data) + offset = trans2NCHW(offset) + dconvolve = lambda i, k, o: deform_conv_op.deform_conv_op( + i, k, o, strides=[1, 1, s_h, s_w], rates=[1, 1, rate, rate], padding=padding, num_groups=num_groups, + deformable_group=num_deform_group) + with tf.variable_scope(name, reuse=False) as scope: + + init_weights = tf.zeros_initializer() if initializer is 'zeros' else tf.contrib.layers.variance_scaling_initializer( + factor=0.01, mode='FAN_AVG', uniform=False) + init_biases = tf.constant_initializer(0.0) + kernel = self.make_var('weights', [k_h, k_w, c_i, c_o], init_weights, trainable, + regularizer=self.l2_regularizer(args.weight_decay)) + kernel = tf.transpose(kernel, [3, 2, 0, 1]) + ActivationSummary(offset) + + print(data, kernel, offset) + dconv = trans2NHWC(dconvolve(data, kernel, offset)) + if biased: + biases = self.make_var('biases', [c_o], init_biases, trainable) + if relu: + bias = tf.nn.bias_add(dconv, biases) + return tf.nn.relu(bias) + return tf.nn.bias_add(dconv, biases) + else: + if relu: + return tf.nn.relu(dconv) + return dconv + + @layer + def upconv(self, input, shape, c_o, ksize=4, stride=2, name='upconv', biased=False, relu=True, + padding=DEFAULT_PADDING, + trainable=True, initializer=None): + """ up-conv""" + self.validate_padding(padding) + + c_in = input.get_shape()[3].value + in_shape_d = tf.shape(input) + in_shape = input.shape.as_list() + if shape is None: + h = ((in_shape[1]) * stride) + w = ((in_shape[2]) * stride) + new_shape = [in_shape_d[0], h, w, c_o] + else: + new_shape = [in_shape_d[0], shape[1], shape[2], c_o] + output_shape = tf.stack(new_shape) + + filter_shape = [ksize, ksize, c_o, c_in] + + with tf.variable_scope(name, reuse=False) as scope: + init_weights = tf.zeros_initializer() if initializer is 'zeros' else tf.contrib.layers.variance_scaling_initializer( + factor=0.01, mode='FAN_AVG', uniform=False) # cfernandez + filters = self.make_var('weights', filter_shape, init_weights, trainable, + regularizer=self.l2_regularizer(args.weight_decay)) # cfg.TRAIN.WEIGHT_DECAY + deconv = tf.nn.conv2d_transpose(input, filters, output_shape, + strides=[1, stride, stride, 1], padding=DEFAULT_PADDING, name=scope.name) + # coz de-conv losses shape info, use reshape to re-gain shape + deconv = tf.reshape(deconv, new_shape) + + if biased: + init_biases = tf.constant_initializer(0.0) + biases = self.make_var('biases', [c_o], init_biases, trainable) + if relu: + bias = tf.nn.bias_add(deconv, biases) + output = tf.nn.relu(bias) + output = tf.nn.bias_add(deconv, biases) + + else: + if relu: + output = tf.nn.relu(deconv) + output = devonv + return output + + @layer + def reduce_max(self, input_data, name): + return tf.reduce_max(input_data, axis=1, keep_dims=True) + + @layer + def reduce_mean(self, input_data, name): + return tf.reduce_mean(input_data, axis=1, keep_dims=True) + + @layer + def argmax(self, input_data, name): + return tf.argmax(input_data, axis=1) + + @layer + def bilinear_unpool(self, input_data, mul_factor, name): + _, h, w, _ = tuple(input_data.get_shape().as_list()) + return tf.image.resize_bilinear(input_data, (h * mul_factor, w * mul_factor), align_corners=True, name=name) + + @layer + def mul_grad(self, input_data, mul, name): + return (1.0 - mul) * tf.stop_gradient(input_data) + (mul) * input_data + + @layer + def relu(self, input, name): + return tf.nn.relu(input, name=name) + + @layer + def max_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING): + self.validate_padding(padding) + return tf.nn.max_pool(input, + ksize=[1, k_h, k_w, 1], + strides=[1, s_h, s_w, 1], + padding=padding, + name=name) + + @layer + def avg_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING): + self.validate_padding(padding) + return tf.nn.avg_pool(input, + ksize=[1, k_h, k_w, 1], + strides=[1, s_h, s_w, 1], + padding=padding, + name=name) + + @layer + def roi_pool(self, input, pooled_height, pooled_width, spatial_scale, name): + # only use the first input + if isinstance(input[0], tuple): + input[0] = input[0][0] + + if isinstance(input[1], tuple): + input[1] = input[1][0] + + print(input) + return roi_pool_op.roi_pool(input[0], input[1], + pooled_height, + pooled_width, + spatial_scale, + name=name)[0] + + @layer + def psroi_pool(self, input, output_dim, group_size, spatial_scale, name): + """contribution by miraclebiu""" + # only use the first input + if isinstance(input[0], tuple): + input[0] = input[0][0] + + if isinstance(input[1], tuple): + input[1] = input[1][0] + + return psroi_pooling_op.psroi_pool(input[0], input[1], + output_dim=output_dim, + group_size=group_size, + spatial_scale=spatial_scale, + name=name)[0] + + @layer + def reshape_layer(self, input, d, name): + input_shape = tf.shape(input) + if name == 'rpn_cls_prob_reshape': + # + # transpose: (1, AxH, W, 2) -> (1, 2, AxH, W) + # reshape: (1, 2xA, H, W) + # transpose: -> (1, H, W, 2xA) + return tf.transpose(tf.reshape(tf.transpose(input, [0, 3, 1, 2]), + [input_shape[0], + int(d), + tf.cast( + tf.cast(input_shape[1], tf.float32) / tf.cast(d, tf.float32) * tf.cast( + input_shape[3], tf.float32), tf.int32), + input_shape[2] + ]), + [0, 2, 3, 1], name=name) + else: + return tf.transpose(tf.reshape(tf.transpose(input, [0, 3, 1, 2]), + [input_shape[0], + int(d), + tf.cast(tf.cast(input_shape[1], tf.float32) * ( + tf.cast(input_shape[3], tf.float32) / tf.cast(d, tf.float32)), + tf.int32), + input_shape[2] + ]), + [0, 2, 3, 1], name=name) + + @layer + def reshape(self, input, shape, name): + return tf.reshape(input, shape=shape, name=name) + + @layer + def spatial_reshape_layer(self, input, d, name): + input_shape = tf.shape(input) + # transpose: (1, H, W, A x d) -> (1, H, WxA, d) + return tf.reshape(input, \ + [input_shape[0], \ + input_shape[1], \ + -1, \ + int(d)]) + + @layer + def lrn(self, input, radius, alpha, beta, name, bias=1.0): + return tf.nn.local_response_normalization(input, + depth_radius=radius, + alpha=alpha, + beta=beta, + bias=bias, + name=name) + + @layer + def concat(self, inputs, axis, name): + return tf.concat(axis=axis, values=inputs, name=name) + + @layer + def flatten_data(self, input, name): + return tf.reshape(input, shape=[input.shape[0], -1], name=name) + + @layer + def softmax(self, input, name): + input_shape = tf.shape(input) + if name == 'rpn_cls_prob': + return tf.reshape(tf.nn.softmax(tf.reshape(input, [-1, input_shape[3]])), + [-1, input_shape[1], input_shape[2], input_shape[3]], name=name) + else: + return tf.nn.softmax(input, name=name) + + @layer + def spatial_softmax(self, input, name): + input_shape = tf.shape(input) + # d = input.get_shape()[-1] + return tf.reshape(tf.nn.softmax(tf.reshape(input, [-1, input_shape[3]])), + [-1, input_shape[1], input_shape[2], input_shape[3]], name=name) + + @layer + def add(self, input, name): + """contribution by miraclebiu""" + return tf.add(input[0], input[1], name=name) + + # The original + @layer + def batch_normalization(self, input, name, relu=True, dropout=None): # , is_training= True): #, is_training= True + # jmfacil/cfernandez: dropout added based on pix2pix + is_training = self.is_training + # is_training=False + if dropout is not None and is_training: + temp_layer = tf.contrib.layers.batch_norm(input, scale=True, center=True, is_training=is_training, + scope=name) + if relu: + temp_layer = tf.nn.relu(temp_layer) + # output = tf.nn.dropout(temp_layer,dropout) + #return tf.nn.dropout(temp_layer,dropout) + return npu_ops.dropout(temp_layer, dropout) + + """contribution by miraclebiu""" + if relu: + temp_layer = tf.contrib.layers.batch_norm(input, scale=True, center=True, is_training=is_training, + scope=name) + # output = tf.nn.relu(temp_layer) + return tf.nn.relu(temp_layer) + else: + # output = tf.contrib.layers.batch_norm(input,scale=True,center=True,is_training=is_training,scope=name) + return tf.contrib.layers.batch_norm(input, scale=True, center=True, is_training=is_training, scope=name) + + # ActivationSummary(output) + # return output + + @layer + def batch_normalization0(self, input, name, relu=True, is_training=True, dropout=None, scale_offset=True, + decay=0.999): + is_training=self.is_training + shape = [input.get_shape()[-1]] + with tf.variable_scope(name, reuse=False) as scope: + if scale_offset: + scale = self.make_var('gamma', shape=shape, + initializer=self.filler( + {"type": "constant", + "value": 1.0} + ) + ) + offset = self.make_var('beta', shape=shape) + else: + scale, offset = (None, None) + + pop_mean = self.make_var('moving_mean', shape=shape) + pop_var = self.make_var('moving_variance', shape=shape, + initializer=self.filler( + {"type": "constant", + "value": 1.0} + ), + regularizer=False) + + if is_training: + batch_mean, batch_var = tf.nn.moments(input, [0, 1, 2], name='moments') + train_mean = tf.assign(pop_mean, + pop_mean * decay + batch_mean * (1 - decay)) + train_var = tf.assign(pop_var, + pop_var * decay + batch_var * (1 - decay)) + with tf.control_dependencies([train_mean, train_var]): + epsilon = 1e-4 + output = tf.nn.batch_normalization(input, + batch_mean, batch_var, offset, scale, epsilon) + else: + epsilon = 1e-4 + output = tf.nn.batch_normalization(input, pop_mean, pop_var, offset, scale, epsilon) + # jmfacil/cfernandez: dropout added based on pix2pix + if dropout is not None and is_training: + # temp_layer=tf.contrib.layers.batch_norm(input,scale=True,center=True,is_training=is_training,scope=name) + # if relu: + # temp_layer = tf.nn.relu(temp_layer) + #output = tf.nn.dropout(output,dropout) + output = npu_ops.dropout(output,dropout) + + """contribution by miraclebiu""" + if relu: + # temp_layer=tf.contrib.layers.batch_norm(input,scale=True,center=True,is_training=is_training,scope=name) + output = tf.nn.relu(output) + # else: + # return tf.contrib.layers.batch_norm(input,scale=True,center=True,is_training=is_training,scope=name) + return output + + @layer + def scale(self, input, c_in, name): + with tf.variable_scope(name, reuse=False) as scope: + alpha = tf.get_variable('alpha', shape=[c_in, ], dtype=tf.float32, + initializer=tf.constant_initializer(1.0), trainable=True, + regularizer=self.l2_regularizer(0.00001)) + beta = tf.get_variable('beta', shape=[c_in, ], dtype=tf.float32, + initializer=tf.constant_initializer(0.0), trainable=True, + regularizer=self.l2_regularizer(0.00001)) + return tf.add(tf.multiply(input, alpha), beta) + + @layer + def dropout(self, input, keep_prob, name): + # return tf.nn.dropout(input, keep_prob, name=name) + is_training=self.is_training + if is_training: + return npu_ops.dropout(input, keep_prob, name=name) + else: + return None + def l2_regularizer(self, weight_decay=0.0005, scope=None): + def regularizer(tensor): + with tf.name_scope(scope, default_name='l2_regularizer', values=[tensor]): + l2_weight = tf.convert_to_tensor(weight_decay, + dtype=tensor.dtype.base_dtype, + name='weight_decay') + return tf.multiply(l2_weight, tf.nn.l2_loss(tensor), name='value') + + return regularizer + + def smooth_l1_dist(self, deltas, sigma2=9.0, name='smooth_l1_dist'): + with tf.name_scope(name=name) as scope: + deltas_abs = tf.abs(deltas) + smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) + return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ + (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) + + -- Gitee From e5629d8e1c0111837b91e4dd1abfb43877e0f3e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:47:44 +0000 Subject: [PATCH 10/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/Models/.kee?= =?UTF-8?q?p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Models/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 958447486a19496ac5b14d834477a70350e93ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:48:02 +0000 Subject: [PATCH 11/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/test/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 3557da0645bbeb39437a3632a5a2b3b3a907b053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:48:51 +0000 Subject: [PATCH 12/33] test --- .../cv/CFL_ID1230_for_TensorFlow/config.py | 89 +++++++++ .../modelarts_entry_acc.py | 63 ++++++ .../cv/CFL_ID1230_for_TensorFlow/test_CFL.py | 179 ++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/config.py create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelarts_entry_acc.py create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/config.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/config.py new file mode 100644 index 000000000..e4a138d0c --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/config.py @@ -0,0 +1,89 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +from npu_bridge.npu_init import * + +## PATHS: Please, change this before execution if needed. + +# Creates a directory in case it doesn't exist +def check(dirname): + if not os.path.exists(dirname): + os.makedirs(dirname) + return dirname + +# The project directory +CFL_DIR = os.path.dirname(os.path.realpath(__file__)) + +# --------------------------------------------------------------- + +## Configuration of CFL + +# Mean color to subtract before propagating an image through a DNN +MEAN_COLOR = [103.939, 116.779, 123.68] + +parser = argparse.ArgumentParser() + +# The dataset you want to train/test the model on +parser.add_argument('--dataset', required=True, type=str, help='Path to dataset folders. It must contain RGB/, CM_gt/ and EM_gt/.') + +# CFL architecture +parser.add_argument('--network', default='StdConvs', choices=['StdConvs','EquiConvs'], help='CFL architecture') + +# Path to weights +parser.add_argument('--weights', required=True, help= 'Path to weights (eg. weights/StdConvs.ckpt') + +# Path to results folder +parser.add_argument('--results', default=os.path.join(CFL_DIR, 'results/'), help= 'Path to results folder. It will generate the folder if it does not exist.') + +# GPU to be used +parser.add_argument('--gpu', default="0", help= 'GPU to be used') + +# Ignore missing params +parser.add_argument('--ignore', action="store_true", default=False, help= 'Ignore missing params') + +# TEST config +parser.add_argument("--im_height", default=128, type=int) +parser.add_argument("--im_width", default=256, type=int) +parser.add_argument("--im_ch", default=3, type=int) + +# TRAIN config +parser.add_argument("--weight_decay", default=0.0005, type=int) + +# Modelarts +parser.add_argument('--platform', default='modelarts', help='runtime platform, linux or modelarts') +parser.add_argument('--chip', default='gpu', help='device identifier -- gpu, tpu or npu') + +parser.add_argument('--logdir', default='/tmp/data', help='directory for summaries and checkpoints.') +parser.add_argument('--obs_dir', default='obs://eric-mt-net/log/g', help='device identifier -- gpu, tpu or npu') + + + +args = parser.parse_args() + diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelarts_entry_acc.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelarts_entry_acc.py new file mode 100644 index 000000000..13077b10e --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelarts_entry_acc.py @@ -0,0 +1,63 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import argparse +import sys + +# 解析输入参数data_url +parser = argparse.ArgumentParser() +parser.add_argument("--data_url", type=str, default="/home/ma-user/modelarts/inputs/data_url_0") +parser.add_argument("--train_url", type=str, default="/home/ma-user/modelarts/outputs/train_url_0/") +config = parser.parse_args() + +print("[CANN-Modelzoo] code_dir path is [%s]" % (sys.path[0])) +code_dir = sys.path[0] +os.chdir(code_dir) +print("[CANN-Modelzoo] work_dir path is [%s]" % (os.getcwd())) + +print("[CANN-Modelzoo] before train - list my run files:") +os.system("ls -al /usr/local/Ascend/ascend-toolkit/") + +print("[CANN-Modelzoo] before train - list my dataset files:") +os.system("ls -al %s" % config.data_url) + +print("[CANN-Modelzoo] start run train shell") +# 设置sh文件格式为linux可执行 +os.system("dos2unix ./test/*") + +# 执行train_full_1p.sh或者train_performance_1p.sh,需要用户自己指定 +# full和performance的差异,performance只需要执行很少的step,控制在15分钟以内,主要关注性能FPS +os.system("bash ./test/train_full_1p.sh --data_path=%s --output_path=%s " % (config.data_url, config.train_url)) + +print("[CANN-Modelzoo] finish run train shell") + +# 将当前执行目录所有文件拷贝到obs的output进行备份 +print("[CANN-Modelzoo] after train - list my output files:") +os.system("cp -r %s %s " % (code_dir, config.train_url)) +os.system("ls -al %s" % config.train_url) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py new file mode 100644 index 000000000..b9743f9fc --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py @@ -0,0 +1,179 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import numpy as np +import tensorflow as tf +import scipy.misc +from scipy import misc +from matplotlib import pyplot as plt +import imageio +from PIL import Image +import glob +import time +import math +import os.path +import Models +from npu_bridge.npu_init import * +from tensorflow.core.protobuf.rewriter_config_pb2 import RewriterConfig + +from config import * + +def preprocess(img): + mean_color = [103.939, 116.779, 123.68] + r, g, b = tf.split(axis=3, num_or_size_splits=3, value=img) + bgr = tf.concat(values=[b - mean_color[0], g - mean_color[1], r - mean_color[2]], axis=3) + return bgr + + +def evaluate(map): + if map == 'edges': + prediction_path_list = glob.glob(os.path.join(args.results, 'EM_test') + '/*.jpg') + gt_path_list = glob.glob(os.path.join(args.dataset, 'EM_gt') + '/*.jpg') + if map == 'corners': + prediction_path_list = glob.glob(os.path.join(args.results, 'CM_test') + '/*.jpg') + gt_path_list = glob.glob(os.path.join(args.dataset, 'CM_gt') + '/*.jpg') + prediction_path_list.sort() + gt_path_list.sort() + + P, R, Acc, f1, IoU = [], [], [], [], [] + prediction = Image.open(prediction_path_list[0]) + for im in range(len(prediction_path_list)): + # predicted image + prediction = Image.open(prediction_path_list[im]) + pred_W, pred_H = prediction.size + prediction = np.array(prediction) / 255. + # gt image + gt = Image.open(gt_path_list[im]) + gt = gt.resize([pred_W, pred_H]) + gt = np.array(gt) / 255. + gt = (gt >= 0.01).astype(int) + + th = 0.1 + tp = np.sum(np.logical_and(gt == 1, prediction > th)) + tn = np.sum(np.logical_and(gt == 0, prediction <= th)) + fp = np.sum(np.logical_and(gt == 0, prediction > th)) + fn = np.sum(np.logical_and(gt == 1, prediction <= th)) + + # How accurate the positive predictions are + P.append(tp / (tp + fp)) + # Coverage of actual positive sample + R.append(tp / (tp + fn)) + # Overall performance of model + Acc.append((tp + tn) / (tp + tn + fp + fn)) + # Hybrid metric useful for unbalanced classes + f1.append(2 * (tp / (tp + fp)) * (tp / (tp + fn)) / ((tp / (tp + fp)) + (tp / (tp + fn)))) + # Intersection over Union + IoU.append(tp / (tp + fp + fn)) + + return np.mean(P), np.mean(R), np.mean(Acc), np.mean(f1), np.mean(IoU) + + +def predict(image_path_list): + rgb_ph1 = tf.compat.v1.placeholder(tf.float32, shape=(None, args.im_height, args.im_width, args.im_ch)) + rgb_ph = preprocess(rgb_ph1) + + net = Models.LayoutEstimator_StdConvs({'rgb_input': rgb_ph}, is_training=False) + + saver = tf.train.Saver() + config = tf.ConfigProto(log_device_placement=False,allow_soft_placement=True) + custom_op = config.graph_options.rewrite_options.custom_optimizers.add() + custom_op.name = "NpuOptimizer" + custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision") + config.graph_options.rewrite_options.remapping = RewriterConfig.OFF # 必须显式关闭remap + config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF # 必须显式关闭 + with tf.Session(config=config) as sess: + + print('Loading the model') + + saver.restore(sess, args.weights) + + print('model loaded') + + # Obtain network predictions + for image_path in image_path_list: + + name = str(image_path) + filename = os.path.basename(name) + + img = Image.open(image_path) + img = img.resize([args.im_width, args.im_height], Image.ANTIALIAS) + img = np.array(img).astype('float32') + img = np.expand_dims(np.asarray(img), axis=0) + + fd = net.fd_test + fd[rgb_ph1] = img + + prediction = net.get_layer_output("output_likelihood") + pred_edges, pred_corners = tf.split(prediction, [1, 1], 3) + + tt = time.time(); + emap, cmap = sess.run([tf.nn.sigmoid(pred_edges), tf.nn.sigmoid(pred_corners)], feed_dict=fd) + print("sec/step :", time.time() - tt) + + + # Save results + imageio.imwrite(os.path.join(args.results, 'EM_test', filename + "_emap.jpg"), emap[0, :, :, 0]) + imageio.imwrite(os.path.join(args.results, 'CM_test', filename + "_emap.jpg"), cmap[0, :, :, 0]) + + + + +def main(): + + t = time.time() + + if not os.path.exists(os.path.join(args.results, 'EM_test')): os.makedirs(os.path.join(args.results, 'EM_test')) + if not os.path.exists(os.path.join(args.results, 'CM_test')): os.makedirs(os.path.join(args.results, 'CM_test')) + pred = predict(glob.glob(os.path.join(args.dataset, 'RGB') + '/*.jpg')) + elapsed = time.time() - t + print('Total time in seconds:', elapsed / 1) + + ## Give metrics + P_e, R_e, Acc_e, f1_e, IoU_e = evaluate('edges') + print('EDGES: IoU: ' + str('%.3f' % IoU_e) + '; Accuracy: ' + str('%.3f' % Acc_e) + '; Precision: ' + str( + '%.3f' % P_e) + '; Recall: ' + str('%.3f' % R_e) + '; f1 score: ' + str('%.3f' % f1_e)) + P_c, R_c, Acc_c, f1_c, IoU_c = evaluate('corners') + print('CORNERS: IoU: ' + str('%.3f' % IoU_c) + '; Accuracy: ' + str('%.3f' % Acc_c) + '; Precision: ' + str( + '%.3f' % P_c) + '; Recall: ' + str('%.3f' % R_c) + '; f1 score: ' + str('%.3f' % f1_c)) + + print("Final Accuracy accuracy EDGES:"+str('%.3f'%Acc_e)+";CORNERS:"+str('%.3f'%Acc_c)) + # latex format + latex = [str('$%.3f$' % IoU_c) + " & " + str('$%.3f$' % Acc_c) + " & " + str('$%.3f$' % P_c) + " & " + str( + '$%.3f$' % R_c) + " & " + str('$%.3f$' % f1_c)] + print(latex) + + + +if __name__ == '__main__': + main() + + + + -- Gitee From c48a2df41e1a1056c463e94d14f616fe2cae3a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:49:58 +0000 Subject: [PATCH 13/33] =?UTF-8?q?license=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/LICENSE | 674 ++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/LICENSE diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/LICENSE b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. -- Gitee From 361e99f37f26f0de0da09c70f8bf0f22a55c60d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:50:27 +0000 Subject: [PATCH 14/33] README --- .../cv/CFL_ID1230_for_TensorFlow/README.md | 262 ++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md new file mode 100644 index 000000000..f85158466 --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -0,0 +1,262 @@ +# 基本信息 + +**发布者(Publisher):Huawei** + +**应用领域(Application Domain):Computer Vision** + +**版本(Version):1.1** + +**修改时间(Modified):2022.03.09** + +**大小(Size):117KB** + +**框架(Framework):Tensorflow 1.15.0** + +**模型格式(Model Format):ckpt** + +**精度(Precision):Mixed** + +**处理器(Processor):昇腾910** + +**应用级别(Categories):Research** + +**描述(Description):基于Tensorflow框架对360°全景图片实现3D布局恢复的测试代码** + +# 模型概述 + +CFL模型是CFL: End-to-End Layout Recovery from 360 Images论文的Tensorflow实现,该论文的核心思想是使用StdConvs模型和EquiConvs模型分别在360°全景图片上实现3D布局恢复,并生成边图和角图。需要注意的是,此脚本是使用了StdConvs模型。 + +- 参考论文 + + [Corners for Layout: End-to-End Layout Recovery from 360 Images (cfernandezlab.github.io)](https://cfernandezlab.github.io/CFL/) + +- 参考实现 + + [GitHub - cfernandezlab/CFL: Tensorflow implementation of our end-to-end model to recover 3D layouts. Also with equirectangular convolutions!](https://github.com/cfernandezlab/CFL) + +# 默认配置 + +- 测试数据预处理(以SUN360测试集为例,仅作为用户参考示例) + - 图像的输入尺寸:128×256 + - 图像的输入格式:jpg +- 测试超参 + - Batch size:16 + - Test epoch:1 + - Test step:72 + +# 支持特性 + +| 特性列表 | 是否支持 | +| :------: | :------: | +| 分布式 | 否 | +| 混合精度 | 是 | + +# 混合精度 + +昇腾910 AI处理器提供自动混合精度功能,可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升系统性能并减少内存使用。 + +脚本已默认开启混合精度,设置precision_mode参数的脚本参考如下。 + +```python +custom_op = config.graph_options.rewrite_options.custom_optimizers.add() +custom_op.name = "NpuOptimizer" +custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision") +``` + +# 环境准备 + +- 硬件环境准备请参见各硬件产品文档"[驱动和固件安装升级指南](https://gitee.com/link?target=https%3A%2F%2Fsupport.huawei.com%2Fenterprise%2Fzh%2Fcategory%2Fai-computing-platform-pid-1557196528909)",需要在硬件设备上安装与CANN版本配套的固件与驱动。 +- 宿主机上需要安装Docker并登录[Ascend Hub中心](https://gitee.com/link?target=https%3A%2F%2Fascendhub.huawei.com%2F%23%2Fdetail%3Fname%3Dascend-tensorflow-arm)获取镜像。 + +# 快速上手 + +模型测试之前的准备工作:模型使用SUN360数据集和CFL模型训练得到的ckpt文件(见参考实现),数据集和ckpt文件请用户自行获取。 + +# 模型测试 + +- 单击“立即下载”,并选择合适的下载方式下载源码包。 + +- 启动测试之前,首先要配置程序运行相关环境变量。环境变量配置信息参见:[Ascend 910训练平台环境变量设置](https://gitee.com/ascend/modelzoo/wikis/Ascend 910训练平台环境变量设置?sort_id=3148819) + +- 单卡测试 + + - 配置参数 + + 首先在脚本test/train_full_1p.sh中,配置data_path、output_path等参数,请用户根据实际路径配置data_path和output_path,或者在启动测试的命令行中以参数形式下发。 + + ```python + batch_size=16 + data_path=./data_weights + output_path=./output + ``` + + - 启动测试 + + 启动单卡测试(脚本为test/train_full_1p.sh) + + `bash test/train_full_1p.sh --data_path=./data_weights --output_path=./output` + +# 测试结果 + +- 精度结果对比 + + - EDGES + + | 精度指标项 | 论文发布 | GPU实测 | NPU实测 | + | :--------: | :------: | :-----: | :-----: | + | IoU | 0.575 | 0.588 | 0.583 | + | Accuracy | 0.931 | 0.933 | 0.931 | + | Precision | 0.789 | 0.782 | 0.818 | + | Recall | 0.667 | 0.691 | 0.661 | + | f1 score | 0.722 | 0.733 | 0.730 | + + - CORNERS + + | 精度指标项 | 论文发布 | GPU实测 | NPU实测 | + | :--------: | :------: | :-----: | :-----: | + | IoU | 0.460 | 0.465 | 0.457 | + | Accuracy | 0.974 | 0.974 | 0.974 | + | Precision | 0.887 | 0.872 | 0.885 | + | Recall | 0.488 | 0.498 | 0.484 | + | f1 score | 0.627 | 0.632 | 0.624 | + +# 离线推理 + +##### 模型固化 + +执行get_pb.py文件,将model.ckpt固化为cflnet.pb(路径需根据实际情况修改): + +`python get_pb.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` + +get_pb.py的工作逻辑为: + +- 定义输入节点:input +- 定义输出节点:edge-estimator/output_likelihood/edge-estimator/output_likelihood +- 调用网络模型生成推理图 +- 使用tf.train.writegraph将上述推理图保存成model.pb +- 使用freeze_graph将tf.train.writegraph生成的model.pb与model.ckpt文件合并,生成用于推理的pb图文件:cflnet.pb + +##### 模型转换 + +使用ATC工具,将cflnet.pb转换为tf_cfl.om文件。 + +- 工具:请按照[`ATC`工具使用环境搭建](https://gitee.com/link?target=https%3A%2F%2Fsupport.huaweicloud.com%2Fatctool-cann502alpha3infer%2Fatlasatc_16_0004.html)搭建运行环境。 + +- 命令:`atc --model=./CFL/cflnet.pb --framework=3 --output=./CFL/tf_cfl --soc_version=Ascend310 --input_shape="input:1,128,256,3"` + +- 参数: + + ``` + --model pb模型文件 + --framework 源pb模型使用的框架 + --output 生成.om文件的路径及名称 + --soc_version 使用的芯片类型 + --input_shape 输入的形状(batch_size,height,width,channel) + ``` + +##### 离线推理 + +- 工具准备 + + 请参考https://gitee.com/ascend/tools/tree/master/msame,编译出msame推理工具。 + +- 数据处理 + + 通过调用jpg2bin.py文件(路径需根据实际情况修改),将模型测试集中的第一张p1.jpg图片文件转换为p1b.bin文件。 + + `python jpg2bin.py --dataset=./data/test ==weights=./data/StdConvs/model.ckpt` + + 下面展示的分别是p1.jpg原图及其边图、角图的ground truth。 + + pano_0b9db1eaf8b73158dd047b8f810cf0cc + +
+ + +
+ +- 执行命令 + + 在编译好的msame工具目录下执行以下命令,会生成预测出的tf_cfl_output_0.bin文件。 + + `./msame --model "/root/CFL/tf_cfl.om" --input "/root/CFL/data/p1b.bin" --output "/root/CFL/result" --outfmt BIN --loop 1` + +- 结果评估 + + - 为了检查评估离线推理的效果,需要将tf_cfl_output_0.bin转换成.jpg文件,通过执行bin2jpg.py文件实现(路径需根据实际情况修改)。 + + `python bin2jpg.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` + + 下面展示的是边图和角图的预测结果。 + +
+ + +
+ + - 生成图片之后,调用evaluate.py文件,对结果进行精度评估(路径需根据实际情况修改)。 + + `python evaluate.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` + + | 指标 | IoU | Accuracy | Precision | Recall | f1 score | + | :--: | :---: | :------: | :-------: | :----: | :------: | + | 均值 | 0.589 | 0.963 | 0.919 | 0.628 | 0.741 | + +- 中间文件 + + 离线推理过程生成的中间文件可在百度网盘获取https://pan.baidu.com/s/1TSK8yJLm32jhE1SBbcPDvQ,提取码:14uq + +# 高级参考 + +##### 文件说明 + +```python +|--Image //存放图片 + |--p1.jpg + |--p1_CM.jpg + |--p1_CM_test.jpg + |--p1_EM.jpg + |--p1_EM_test.jpg +|--Models + |--__init__.py //网络初始化 + |--CFL_StdConvs.py //网络构建 + |--network.py //网络结构 +|--test + |--train_full_1p.sh //单卡全量启动脚本 +|--License //声明 +|--README.md //代码说明文档 +|--bin2jpg.py //.bin文件转.jpg文件 +|--config.py //参数设置文件 +|--evaluate.py //评估推理结果 +|--get_pb.py //模型固化 +|--jpg2bin.py //.jpg文件转.bin +|--modelarts_entry_acc.py //拉起测试文件 +|--modelzoo_level.txt //网络进度 +|--requirements.txt //python依赖列表 +|--test_CFL.py //网络测试代码 +|--output //测试结果存放路径 +|--data_weights //数据集和ckpt文件存放路径 + |--Datasets + |--SUN360 + |--test + |--CM_gt + |--pano_0b9db1eaf8b73158dd047b8f810cf0cc_CM.jpg + ... + |--pano_azzfywvfwnlpcl_CM.jpg + |--EM_gt + |--pano_0b9db1eaf8b73158dd047b8f810cf0cc_EM.jpg + ... + |--pano_azzfywvfwnlpcl_EM.jpg + |--RGB + |--pano_0b9db1eaf8b73158dd047b8f810cf0cc.jpg + ... + |--pano_azzfywvfwnlpcl.jpg +``` + +##### 脚本参数 + +```python +--batch_size 每个NPU的batch size,默认:16 +--data_path 数据集路径,默认:./data_weights +--output_path 结果输出路径,默认:./output +``` -- Gitee From 6eaa8d2d92bd794f37df94a96baf9688276c0a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:52:05 +0000 Subject: [PATCH 15/33] =?UTF-8?q?.bin=E6=96=87=E4=BB=B6=E8=BD=AC.jpg?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/bin2jpg.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py new file mode 100644 index 000000000..c8a939995 --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py @@ -0,0 +1,46 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +from numpy import * +import os +from config import * +import glob +from PIL import Image +import tensorflow as tf +import imageio + + +with tf.Session() as sess: + prediction=np.fromfile("tf_cfl_output_0.bin",dtype=float32).reshape([1,64,128,2]) + pred_edges, pred_corners = tf.split(prediction, [1, 1], 3) + + emap,cmap = sess.run([tf.nn.sigmoid(pred_edges),tf.nn.sigmoid(pred_corners)]) + + imageio.imwrite("p1_EM_test.jpg",emap[0,:,:,0]) + imageio.imwrite("p1_CM_test.jpg",cmap[0,:,:,0]) -- Gitee From 40e074f262d42e427556d67ff56bf91244c20519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:53:15 +0000 Subject: [PATCH 16/33] =?UTF-8?q?=E8=AF=84=E4=BC=B0=E7=A6=BB=E7=BA=BF?= =?UTF-8?q?=E6=8E=A8=E7=90=86=E7=B2=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/evaluate.py | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py new file mode 100644 index 000000000..6acc51817 --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py @@ -0,0 +1,86 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +from numpy import * +import os +from config import * +import glob +from PIL import Image +import tensorflow as tf +import imageio + + + +def evaluate(): + + prediction_path_list=[] + prediction_path_list.append("p1_EM_test.jpg") + prediction_path_list.append("p1_CM_test.jpg") + gt_path_list=[] + gt_path_list.append("p1_EM.jpg") + gt_path_list.append("p1_CM.jpg") + P, R, Acc, f1, IoU = [], [], [], [], [] + prediction = Image.open(prediction_path_list[0]) + for im in range(len(prediction_path_list)): + # predicted image + prediction = Image.open(prediction_path_list[im]) + pred_W, pred_H = prediction.size + prediction = np.array(prediction) / 255. + # gt image + gt = Image.open(gt_path_list[im]) + gt = gt.resize([pred_W, pred_H]) + gt = np.array(gt) / 255. + gt = (gt >= 0.01).astype(int) + + th = 0.1 + tp = np.sum(np.logical_and(gt == 1, prediction > th)) + tn = np.sum(np.logical_and(gt == 0, prediction <= th)) + fp = np.sum(np.logical_and(gt == 0, prediction > th)) + fn = np.sum(np.logical_and(gt == 1, prediction <= th)) + + # How accurate the positive predictions are + P.append(tp / (tp + fp)) + # Coverage of actual positive sample + R.append(tp / (tp + fn)) + # Overall performance of model + Acc.append((tp + tn) / (tp + tn + fp + fn)) + # Hybrid metric useful for unbalanced classes + f1.append(2 * (tp / (tp + fp)) * (tp / (tp + fn)) / ((tp / (tp + fp)) + (tp / (tp + fn)))) + # Intersection over Union + IoU.append(tp / (tp + fp + fn)) + + return np.mean(P), np.mean(R), np.mean(Acc), np.mean(f1), np.mean(IoU) + +if __name__ == '__main__': + P,R,Acc,f1,IoU=evaluate() + print("P:",P) + print("R:",R) + print("Acc:",Acc) + print("f1:",f1) + print("IoU:",IoU) \ No newline at end of file -- Gitee From 26d9b42d40c8fd1e0dcc7034a381d80288205467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:54:10 +0000 Subject: [PATCH 17/33] =?UTF-8?q?ckpt=E8=BD=ACpb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/get_pb.py | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py new file mode 100644 index 000000000..aa8e6d2cd --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py @@ -0,0 +1,74 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tensorflow as tf +from tensorflow.python.tools import freeze_graph +from config import * + +# 导入网络模型文件 +import Models + +# 指定checkpoint路径 +ckpt_path = "./data/StdConvs/model.ckpt" + +#预处理 +def preprocess(img): + mean_color = [103.939, 116.779, 123.68] + r, g, b = tf.split(axis=3, num_or_size_splits=3, value=img) + bgr = tf.concat(values=[b - mean_color[0], g - mean_color[1], r - mean_color[2]], axis=3) + return bgr + +def main(): + tf.reset_default_graph() + # 定义网络的输入节点 + inputs = tf.placeholder(tf.float32, shape=(None, args.im_height, args.im_width, args.im_ch), name="input") + inputs = preprocess(inputs) + + # 调用网络模型生成推理图 + Models.LayoutEstimator_StdConvs({'rgb_input': inputs}, is_training=False) + + with tf.Session() as sess: + # 保存图,在./pb_model文件夹中生成model.pb文件 + # model.pb文件将作为input_graph给到接下来的freeze_graph函数 + tf.train.write_graph(sess.graph_def, './pb_model', 'model.pb') # 通过write_graph生成模型文件 + print("begin") + freeze_graph.freeze_graph( + input_graph='./pb_model/model.pb', # 传入write_graph生成的模型文件 + input_saver='', + input_binary=False, + input_checkpoint=ckpt_path, # 传入训练生成的checkpoint文件 + output_node_names='edge-estimator/output_likelihood/edge-estimator/output_likelihood', # 与定义的推理网络输出节点保持一致 + restore_op_name='save/restore_all', + filename_tensor_name='save/Const:0', + output_graph='./pb_model/cflnet.pb', # 改为需要生成的推理网络的名称 + clear_devices=False, + initializer_nodes="") + print("done") + +if __name__ == '__main__': + main() -- Gitee From af80fe76a5ba35fa08fab9bc33a07e86caf4b29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:55:19 +0000 Subject: [PATCH 18/33] =?UTF-8?q?.jpg=E6=96=87=E4=BB=B6=E8=BD=AC.bin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/jpg2bin.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py new file mode 100644 index 000000000..33a462b42 --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py @@ -0,0 +1,45 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +# Copyright 2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +from numpy import * +import os +from config import * +import glob +from PIL import Image +import tensorflow as tf +import imageio + +pred = "./data/test/RGB/p1.jpg" +name = str(pred) +filename = os.path.basename(name) +img = Image.open(filename) +img = img.resize([args.im_width, args.im_height], Image.ANTIALIAS) +img = np.array(img).astype('float32') +img = np.expand_dims(np.asarray(img), axis=0) +img.tofile("p1b.bin") \ No newline at end of file -- Gitee From 98c7c9284555db93c90b874f0bb5971e19c08db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:56:00 +0000 Subject: [PATCH 19/33] requirements --- .../requirements.txt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/requirements.txt diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/requirements.txt b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/requirements.txt new file mode 100644 index 000000000..4b8d744da --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/requirements.txt @@ -0,0 +1,34 @@ +absl-py==0.7.1 +astor==0.7.1 +certifi==2019.3.9 +chardet==3.0.4 +cycler==0.10.0 +Cython==0.29.6 +easydict==1.9 +gast==0.2.2 +graphviz==0.8.4 +grpcio==1.19.0 +h5py==2.9.0 +idna==2.8 +Keras-Applications==1.0.8 +Keras-Preprocessing==1.0.9 +kiwisolver==1.0.1 +Markdown==3.0.1 +matplotlib==3.0.3 +mock==2.0.0 +numpy==1.16.2 +opencv-python==4.0.0.21 +pbr==5.1.3 +Pillow==5.4.1 +protobuf==3.7.0 +pyparsing==2.3.1 +python-dateutil==2.8.0 +requests==2.21.0 +scipy==1.2.1 +six==1.12.0 +tensorboard==1.15.0 +tensorflow-estimator==1.15.1 +tensorflow-gpu==1.15.0 +termcolor==1.1.0 +urllib3==1.24.1 +Werkzeug==0.15.0 -- Gitee From 32998415695639ed97c1087e188dc895ea9a8f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:58:15 +0000 Subject: [PATCH 20/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md. --- .../cv/CFL_ID1230_for_TensorFlow/README.md | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md index f85158466..4ee7784a8 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -86,15 +86,15 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec ```python batch_size=16 - data_path=./data_weights - output_path=./output + data_path=./data_weights/ + output_path=./output/ ``` - 启动测试 启动单卡测试(脚本为test/train_full_1p.sh) - `bash test/train_full_1p.sh --data_path=./data_weights --output_path=./output` + `bash test/train_full_1p.sh --data_path=./data_weights/ --output_path=./output/` # 测试结果 @@ -126,7 +126,7 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec 执行get_pb.py文件,将model.ckpt固化为cflnet.pb(路径需根据实际情况修改): -`python get_pb.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` +`python get_pb.py --dataset=./data/test/ --weights=./data/StdConvs/model.ckpt` get_pb.py的工作逻辑为: @@ -164,16 +164,14 @@ get_pb.py的工作逻辑为: 通过调用jpg2bin.py文件(路径需根据实际情况修改),将模型测试集中的第一张p1.jpg图片文件转换为p1b.bin文件。 - `python jpg2bin.py --dataset=./data/test ==weights=./data/StdConvs/model.ckpt` + `python jpg2bin.py --dataset=./data/test/ ==weights=./data/StdConvs/model.ckpt` 下面展示的分别是p1.jpg原图及其边图、角图的ground truth。 - pano_0b9db1eaf8b73158dd047b8f810cf0cc + p1 + p1_EM + p1_CM -
- - -
- 执行命令 @@ -185,18 +183,18 @@ get_pb.py的工作逻辑为: - 为了检查评估离线推理的效果,需要将tf_cfl_output_0.bin转换成.jpg文件,通过执行bin2jpg.py文件实现(路径需根据实际情况修改)。 - `python bin2jpg.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` + `python bin2jpg.py --dataset=./data/test/ --weights=./data/StdConvs/model.ckpt` 下面展示的是边图和角图的预测结果。 -
- - -
+ + p1 + p1_EM + - 生成图片之后,调用evaluate.py文件,对结果进行精度评估(路径需根据实际情况修改)。 - `python evaluate.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` + `python evaluate.py --dataset=./data/test/ --weights=./data/StdConvs/model.ckpt` | 指标 | IoU | Accuracy | Precision | Recall | f1 score | | :--: | :---: | :------: | :-------: | :----: | :------: | @@ -204,7 +202,7 @@ get_pb.py的工作逻辑为: - 中间文件 - 离线推理过程生成的中间文件可在百度网盘获取https://pan.baidu.com/s/1TSK8yJLm32jhE1SBbcPDvQ,提取码:14uq + 离线推理过程生成的中间文件可在[百度网盘](https://pan.baidu.com/s/1TSK8yJLm32jhE1SBbcPDvQ)获取,提取码:14uq # 高级参考 @@ -229,7 +227,7 @@ get_pb.py的工作逻辑为: |--config.py //参数设置文件 |--evaluate.py //评估推理结果 |--get_pb.py //模型固化 -|--jpg2bin.py //.jpg文件转.bin +|--jpg2bin.py //.jpg文件转.bin文件 |--modelarts_entry_acc.py //拉起测试文件 |--modelzoo_level.txt //网络进度 |--requirements.txt //python依赖列表 @@ -257,6 +255,6 @@ get_pb.py的工作逻辑为: ```python --batch_size 每个NPU的batch size,默认:16 ---data_path 数据集路径,默认:./data_weights ---output_path 结果输出路径,默认:./output +--data_path 数据集路径,默认:./data_weights/ +--output_path 结果输出路径,默认:./output/ ``` -- Gitee From 9fe5f2266c1852eaf8c52d4a3a7e64f4e8cb5c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 11:59:36 +0000 Subject: [PATCH 21/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md. --- .../cv/CFL_ID1230_for_TensorFlow/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md index 4ee7784a8..910336760 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -86,15 +86,15 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec ```python batch_size=16 - data_path=./data_weights/ - output_path=./output/ + data_path=./data_weights + output_path=./output ``` - 启动测试 启动单卡测试(脚本为test/train_full_1p.sh) - `bash test/train_full_1p.sh --data_path=./data_weights/ --output_path=./output/` + `bash test/train_full_1p.sh --data_path=./data_weights --output_path=./output` # 测试结果 @@ -126,7 +126,7 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec 执行get_pb.py文件,将model.ckpt固化为cflnet.pb(路径需根据实际情况修改): -`python get_pb.py --dataset=./data/test/ --weights=./data/StdConvs/model.ckpt` +`python get_pb.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` get_pb.py的工作逻辑为: @@ -164,7 +164,7 @@ get_pb.py的工作逻辑为: 通过调用jpg2bin.py文件(路径需根据实际情况修改),将模型测试集中的第一张p1.jpg图片文件转换为p1b.bin文件。 - `python jpg2bin.py --dataset=./data/test/ ==weights=./data/StdConvs/model.ckpt` + `python jpg2bin.py --dataset=./data/test ==weights=./data/StdConvs/model.ckpt` 下面展示的分别是p1.jpg原图及其边图、角图的ground truth。 @@ -183,7 +183,7 @@ get_pb.py的工作逻辑为: - 为了检查评估离线推理的效果,需要将tf_cfl_output_0.bin转换成.jpg文件,通过执行bin2jpg.py文件实现(路径需根据实际情况修改)。 - `python bin2jpg.py --dataset=./data/test/ --weights=./data/StdConvs/model.ckpt` + `python bin2jpg.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` 下面展示的是边图和角图的预测结果。 @@ -194,7 +194,7 @@ get_pb.py的工作逻辑为: - 生成图片之后,调用evaluate.py文件,对结果进行精度评估(路径需根据实际情况修改)。 - `python evaluate.py --dataset=./data/test/ --weights=./data/StdConvs/model.ckpt` + `python evaluate.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` | 指标 | IoU | Accuracy | Precision | Recall | f1 score | | :--: | :---: | :------: | :-------: | :----: | :------: | @@ -255,6 +255,6 @@ get_pb.py的工作逻辑为: ```python --batch_size 每个NPU的batch size,默认:16 ---data_path 数据集路径,默认:./data_weights/ ---output_path 结果输出路径,默认:./output/ +--data_path 数据集路径,默认:./data_weights +--output_path 结果输出路径,默认:./output ``` -- Gitee From d05291e43b4de362a185db4fa076a5a02cbeddc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 12:05:10 +0000 Subject: [PATCH 22/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md. --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md index 910336760..e5abc256d 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -76,7 +76,7 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec - 单击“立即下载”,并选择合适的下载方式下载源码包。 -- 启动测试之前,首先要配置程序运行相关环境变量。环境变量配置信息参见:[Ascend 910训练平台环境变量设置](https://gitee.com/ascend/modelzoo/wikis/Ascend 910训练平台环境变量设置?sort_id=3148819) +- 启动测试之前,首先要配置程序运行相关环境变量。环境变量配置信息参见:[Ascend 910训练平台环境变量设置](https://gitee.com/ascend/modelzoo/wikis/%E5%85%B6%E4%BB%96%E6%A1%88%E4%BE%8B/Ascend%20910%E8%AE%AD%E7%BB%83%E5%B9%B3%E5%8F%B0%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E8%AE%BE%E7%BD%AE) - 单卡测试 -- Gitee From b84a076a4de49eccf93763fee00f0b165a8e573e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Sat, 2 Apr 2022 12:12:07 +0000 Subject: [PATCH 23/33] modelzoo_level.txt --- .../contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt new file mode 100644 index 000000000..5dc8dd84c --- /dev/null +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt @@ -0,0 +1,6 @@ +GPUStatus:OK +NPUMigrationStatus:OK +FuncStatus:OK +PrecisionStatus:OK +ModelConvert:OK +QuantStatus:OK \ No newline at end of file -- Gitee From 7d9bc38109c591b7834f21bc5b5cc17bd6b5c7c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:46:57 +0000 Subject: [PATCH 24/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/Image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg | Bin 58909 -> 0 bytes .../CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg | Bin 8377 -> 0 bytes .../Image/p1_CM_test.jpg | Bin 705 -> 0 bytes .../CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg | Bin 14667 -> 0 bytes .../Image/p1_EM_test.jpg | Bin 1269 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM_test.jpg delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM_test.jpg diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1.jpg deleted file mode 100644 index 847ffea102877e9fd0d6e6925c8cc441419945aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58909 zcmbTcby!qw^ftO_X@Q|jngQvQ7Nv7$kQhJ-MTQbYS_GtI=!T)Y1VM)uK_o?#7(fA~ zK|-WE&c^q5&Udc!*ZIETV)pDk&yHuUd)@0^>zT{%m$SfiT}>TL01poU@W4OdatgQu zTq7nXAtt&;LPA1HdX0<%LP9kW(;GQZh+$v2jWMZ@(@(0Gey~03kqt#|_}q;1ST^ zU3LMS;Byk;{d)ob^TNX?AS5CtxkgGx4i2cl4&dVv5a1IM5D^g)f};b$?*T#@B3dqq z+r)G*TM}*$h-64&!8IQBx{vhm;VoV%yQeQn$ru=!m|6Jv1q7i&(lWAg^0yT3+||(3 z($>*MnA|fpGq*t6KYZly*b(LA`OM4P$Jft4G%P$K@>LW%DLExIEj=R>Q&?17Qd(AC zQTg^Aw!WdUskx=|Q&)FSZ(slCkx|^(_{8@glXLS6i%ZKZzgO3`cXs#o4-SuxPp;;L z2hQ{Ve*HJG|IfT=zl5)u%ST+Is)-v|6BpdlpUk|3tN4I{DjpyQSdxdu^BEU5cP z$|D8eqPKfGOvb<~J;%3wHMM^;`~Nqwm;XmI`+p|(zveXwP!QmO&Lf}!RDr*;u-dU$ ztSbcXfo+j(#Q|FO)R>T!l9ke^A>A>b?9_46DG=+Le@&J}mL<=X3H*SOWyx|Com9JB zJ6wx9Mad2kDjKjF7&OFU@u)^MM-g_(uHxL2;Ca?qy9657B3C`MzA<5d;}qO327#|! z8e29}+|3UK21}D&buGKwH4|Gn!1Zi3w+5MUaH_WJjZ6vUIzga(m8gTX=A6u>Td zyQH`n?`T*90>E@I`a=X2l2EC?nvQtWux=@7hhWZbX2_QjhhW~m;=WS1BAFIr>4EsX-`ZH))2HwsA zDgn1kh5$dY8QrQ7I9^6ExUmanMuVgI1@W>Rr~cO#JlnMx+=l>z*o+FOgc?OR(?J=H zjv6UiA5kt1Ob5Vi5arzjtZ02QFYsgu9mCQgF3KyXXTva1L7-R~rcc;kBn?v|)kZmX z-=K{d)*zr5fe)hrUHy@HG+^{KS$a)Ejj}K;DY%wJ7b)1Z!N;eN6dnFDSsLr9J7+7U z!BiL>9*U9DfNV05K?O_PYaL>Sbu>CVH;ZolH7LyK{Pa!}g*9ei$4D6zNni64MWuj< z!bs_V6&wUqr3)&RhSg}7Q)Dzi9}>1!_?TFf5DpP$9+V7fCF`2@@(VIug$;PYWXRe-T%Cx6fmYnDg9cIHdv)0m?Q7eb(4!&<@CAnU z7VNn4@jnoPCvIH1Sg>0m0S&k^m4HJ=z~BV^IG=zHvCZcg+hT2(twb8N#on4L&%VT zJ||K_PlEw;nw}o|CO&*Vh0F?O!-}?o&!|OrmX1#x)LC_feypM@gy`rE`*_P6@om0#o7ha##{{} z08NMT_zU8LA9@7ZTnb{B2U?pzLI<6E<$2J7wSwFsG2Kky6Z|_2dJ7x`x&#c-A_#a7 zSAHli1(=50WupYy!@%oY?ZMC<#s40xLXZjEK`I*K!!#g7FO#m~DFr^PZ3pfK>%$Qh zV03D0C?s#^6OWpQGxOqYqL$w-Pw&Xid*rjt1OIO3}t3YD6Gd;0iR}pviQJ0Qk_2Zc#z-SVl<+ zema=p;Pcr;O!x1j-R49GDuhVDYLR2GE6~z(53H3-Ake zLyYlhbo8_x$w_r?7bbu#DZ+6AG8!6Bg9@_8jIvVUMj}VB zt5Cc&v#I^!$v{e{>&ispJ!MB)OKRp{Zp8H@Vf7_0foIeu;!_3toUsIg^9f@;_3T-@ z^sLC*-&!kb^skEOh1J$^oS!qXLj)3PyliN1N~RJUUcF4lqo|WzQ`!yA_f3cNMvztm z0Cn>fc(G8!*B#mw3pu@an*3Qri9TE5P(qD$WwbCBrwuZXT1hv4 zj+zz7o<#Cwfc_Q7H02X^i$c{(@RLCf0%>Pg`yZcZaK(a$QBWYG_$u-xz*t`}$R`5B zyC(rRZI7Z4 zX<53Iim#xaIvRMkC=ftEaY=DLVIdks5~T=Nz8xGs0+Kun;tDdLEMuTWBXvn^uc(#i zic~zn(F(OUeP0Mhv1HWUu6Z z$<6_K4a7XmhKD-~oel{{;n6_Co%G=}YBV$k+$G!?4T5G4=(UP#rSl1WeUMasXfeoi znpZOe^CQaGKlnvGKPWP;W3Tz+tEAFda&&QyRL>{V-+)WduR&+U)Fn*o^d$(?u0set zV5uwU`r5dvrT`C^g4n$$N2If(O%V}15zH4}f?d%ui}%bDVR{k()pBL^UNYyNp5LQO zz=g8v7-RSeH%?x=Qg7XuB&jwn%)um9k|6!T#K}K+DSn6kovX{MuqXY>-=1`ay);t4 z==&krL9=f0w34@2K(|SR&+$M@VZOi_TFCrNet+Fkn5i`Z50h$|!Vm30;N31G&?ZtM zyGm5S@FD!=bm>W${+$XBZKzX1D432*=(WLIf0g<(BH$xnTDU=+O?dTlFNc*KRQ zHN}_)-4kLLO6fXw zLptv0=ov@@S6~9uY-T<%!UBa-fb^rQcEwDfS^_1X1|$W5gFFXHrxYvO+l6SeEBr(U zgWSgmTp?2M9}|M&0i-ODo{(0cCL)v2(=nU{V@(VKW=$Q#LNNWRL-$hfm?2>%86b3M z68{4e*Yqp2x)2;%;>gSZYTEf^2*uSyqb1Z{ZEFe{T$MlDYV`b*##o}h&e8i2k6o%j zr{@UE5RDq)%-tUyAMYioQ2CXW_YySPA|#WWa9YX?@0P}Tf zda4n_2Xh<$0~PSg+~NTUl1Kz@Eo@f~J#cc$eVj){V(%gzw7oH2SC`$&epjKi<8FfR zu(`ZNd0SMqq<`+u_M?TM&Z=b)QZoex}!~f zWTV;@uSyd&I-(&XLh8`c=-@9118r0>0xzR5RL4M^Ar1%D7t+(CvC>2MEc!#B@?_GS3^08QI(`UriJ(H$9OQK#436*2KhgNW)O6As)4k-q=PK^3utfrLMTj*E?R ztAgP%`;PJ|g+s<|l95clk{lzeio=TA^W_wy!)3y4 zT}r1R1rZM1fXoV(K!7l@(Ma&3Q7v1;*!3?1X7*Pm=WGUZzwjt^t7q zSH<#`fCI%SXeMb_>8`GB$R8|G=?(n+gv}?mh+C5%_DTH95BaSl79fl2y)*SpRT8~* zerx`tO-V#*RUw8YAl~oT!SvA3SD?y-zPh7>MnVff#=gfz4pwZXTsSxkV`pDM7OLq8 z>C&_%DT7pzZhF8+Mz5nQi$aV*d3g;K2)fYVHKb!182~ecOu9=0h1t-;Y(czvaFdqM zi$*?ig25%`(-IKj+zHsi*-05!;;%5^HLbkB4 z2|EzM`H0}k>%s8(v=l^bST`7yIbaE6m!lz!$BeYKGWlLAC3yOUNbe4pFf6s~{dQcY z>g{_ETX{C~IT6MiNRG~;M}wwGn}{>DKq6DWhxP+?XDD;WmJX_7vZ!3Hv5DQ+hwklu z!6%rS!-oEG-^eox#1c6s!cl7*9W%)JX4OKZ(n8EK>`c;0>a}_Nv5V0eAsAKgS61UF z`#*V~vz7%4UWZnjUjpAWRk!GLWvayfHlFXGcEShY>jpQk{k6CRCdadv`u-dm5SYEa z1ajMtRxbgvo5JZ)9N5mlwOZUp)`eyH$)ZWLpUY2ym`k7|T#;%q4C7{?Bq^s(J@T?> zB!T8HPd$fC83eJeZMP>4kZ@pUmkT81%9ivM({X{0wG4+RBQGgUXcNb?`R<>=nVlh{ zFj8uJjPLXP3LD}CT&MUa^leV*;K)2(E0%06U7ljt160YRQ*XLfx*GkqhSAa~LjM^> zGz9S(p^H)D1Et?p`-17J7H|+OgCp=FlE6xnDP`19I^~)x1emand>k)wUBMk;Y=tQ9d~nM;K_+8saP`bNpl z8d6IC?tN>qbU2z-(U90szBKH!6ov6*IGZK4*Ukp@qx=pc z6yCIcHvZW}U3ibvMe;uVj>1(mK0dreP@MO{TrsNTj#*iL;@y ziqw!TXq6GY9DAf-S%?8-+i+I9G+T(sKS7y~OIlAung!nBB~#MRfQ}jXtx5;eQOF-? zBEV&n89I93WFTmhDCxa@Jnqu+nlvY@`GARD-PP3LYe%`VKPK0q*B-Sba1=jhQu^WL z&COK2lf{cv^ouFq7xyr*4Jy^n>=u!!OW?Icm+GWTUZ2TSQ-9g`tkoZ?OW<~h#i;XJ zn$sqep!c3;T9Jj9Kw6{WufF^srO}>PTMpHy56%w-_EwELW}#nY%g|DtQ9UzIyr5Yx8aI!eHQK8w;!ZdhY$a#w+uAr^iN83{+b)Zz z)+af8E^vOTx?s)V*jMIW_brFaO)IAX|U@lf!`o_zHWk%AOE?cv_jJE~tR2Z}6odJ`DWJI#*a zgy0TsJ zP^wU($TQ@~MA8zhO)tE@E*QUEdDsW6y^kM7zk5>iMc!NMBz_HQ?vSZNR|i>YdL(a~ z2>bNfvQNbw(cq89QZNz-e*U$Fl1S2!e(L_FKHgp(X~^o4y;4giaUny140?7!oOa7i zkd_gKvuH3PHF_5g4#2YA#F)CPTV;XwDg2^DRT%L4;J&u|dC=MnGn9T|8t_;kt%S zvdqe;0vZl%%1+oJB#XKpcGHzl)!v`_YqE3Dv(f9LS`eBIl$8E$9X%bBFg}PwvWz;J zE>ub_{Hj&2PXfa@I1b`pwSNcs*L=un9n!rtT9Um)ZFiF0N@ngI4u2@ieqIv0_u+Bd zJ<0Gj4+A+tD)RVJlxKWO3vbDc$%~P;)NfaGk9>gT=#Q_$gDcUtR+HtDdQ!A5a_4SgcFY#rE#d-$-q<+yhBI*L_JevMjQaTeIisB~T*h-D`H% zdj$KUg3vL?g*3fhOl*ID36vd~tZiuh@;D9(HxfVA3#rtQ$y<^9jJ9}X6F~L73M$aP zs+Vy~&j~eO^*VD?$au!+YgvXjA7s`^X(aToPTx&^N+p&zE!iyT@~@G^#fW=%aM64+ z64GWC6F9`hcoc5;w=g+8XD(O9w8M6)+JL~F(zC~9>?3lyqs3u$Cw@HlO|B;~R>yLMhHa4d)DI?tv!~fXD$d?~D@uIVhaD8!!XS#1{3Z#2Jl(V4egRhYRicaFUT*2f&iH^1*H51$NJ zFw{l)-BOLUIu*JEeD^US=79-o*g%Cx*u3sR_x;V9d!TnuDtEMW(Uq5;mk#tyq)DY~t{ko3+`R~=bZwu7$?eIsqUI?THiFZI zs?UF@AWlZ^aescc*utE4(!JDr>{(%_8lmyACikWeZG*}d38V+j`fBTUTp12u$QLI> z#7+X4;(hL}5oeDu4Tj5~RYF#chzknhg$=lKStl@XJbFqBbj(Ntk>*2!wi}%K_WDxj zsFFc~+5;InIKv>M^CMb97wTcSP{$0(sF2WUh(>okgxi%&X-?W`HKd5u>ojCDM29fU zIH{+C>t^sKdNkanN>RCd=e)d$-W&F|`dDBjy#X4AXB z{FKS!$1&Dft(?7_pHnm|{e)CXbIGU{&l%59)aq?t_pzD7X1=kncpulBY+V8wCzM&t zdYk&2Jj{#Z;R9md-2lWzMN6Jj(Ok2h?-QdZP?L zY;um8nH)enA#al&xrcVn zd>?*Xlkd1srM%WfvPk~`=8f_FR8B+!n~_nn60D4IL-?CFMAUS6nq1#C`_qDMH6O&# z#E@l^)jWfb)p z{AC~XZlnUsAdnJbvXpV}mRK(0w~+Eu3nm54kCK8(IbaO9WKh?nbh6=a1kJ$F>?P2Z zsk;7VPiCQ|@8`3N*&v|4>6=rdT$y`c$Hl#F*!{ZSFz+HyG0o^f zQBGB{64$^?wZGP8FZYB=Uwn6{kNu%*)3{(AJoIelc)RfuXt!%qfF06&gcmM9PLP&Y zM$r@dPt>xL8(so=tWQq&pqi0oLEpj~&rcp~l?aKTWs;Oi`5-@Vcs3SEfL#M>7(k7X&6H;zStPM{#0Qj+}_2XWeGo`Lm*9wv!~_Bb@$R*5#xT( zC!F4?TFcG~>vvpKR$!i6yXH{@AEg=D0*9uIMoHqw--=>gH9tjHK^F+B{`8&oa#jZn zH(J@{2N1dKM}Mm8r9H`|M^)VakvDDCf;Xka`Kja?!+nY77{S&?TCv0A&s6fWA7mmM+xVuT^QHjcy5GlK@mpj z`>U2@x0y+9>~X*U)Fo?_Ki$>no|Dc@gMEA>5f@-)H2WAO9hH&Ro2y2+!ba9)l02fF zIf^!mR>*g1JD+>oNJlg+2WWb9>whVa*-)>HNeUp-ND_Y4$irJ#yLQdS89|F>JUA>m zd;;3BWtv6jUbkt>ux&zmql(@>5IA$uICpRS;LwO$@q0|-GpbwXK|LjfiI3i`Ycq|# z`ob9XfrJF-Lr>RbysKT@O=(D6#0=TiCJ8lye1wCm@QPr2s56+(v5W{pfe3*RMe^zz z$)H4NB9Rd{iudU~V6x}i$D?=k)OqZ3Vgh84A&m}QvO2{?Qo)O4 zzkG5F6nY=c;?uuJ@8t9NtI@1bGMZMp^@itf31jgp3L$d zpT-90HGDnA+9?VQo>erY%_awMA3?T+GxB=I9j9FXl%(Wly)t$VGHh{PXR2YwXJnqF z@)(r=D(S878CF;`>`0bC<_Osm+IZyAfvD34TQb4$VGZdUkU1S)YDfnX>@7(RN}8`h zn~S9T+4T&F(`B@Y3X`RqE7ieHu6s$DotqTcZnZ*agL&)~+Lm4d(g`*9;o>f`MI^#% zD?Hdge-UD+60Nt`wU9eMN()paApgw>D$}zr*%*jp%;JcPkOY*H>$1RQ8JOF zeRQjWuEa}Sfw@09O2WuMt@9}a6YYj7RT|sjzJ>N5`_lNehR%%<1uWMUjQlNo@>7G0 zQ+KTzyWf<0Cy6+~%#7u=Mf{eFAC$`}1JnP+bhUTxH@(o<%ugpw91&QQYbhE_2hQhr~_HY2iU3RH`K zbfJkoGpMj|VwoR&v7tC?=zZX~ zb!+ptE7^I~wnw*yAHFAKOTE)^GGRC>xZylnIvE=;RDIl+Hmv28pjN2>C(jn|GgkKT zG?eo=iT_&BpjODYm*16fip_Hk^WqL`jfAiyF2CbmQh7Y?yPaSso&t$sgp9{ ziu;0RChj|{*9_Gp8wq|m{S8Ux;QV%2YJWnu_}gy8%f*d} z1Sgt@4D5FUZ`Zgj|1}?}N0l}tX%A;hW-l3ParWUl;X2mSBhTjeH>&MtmPhd0vmSB1 zyggM1wlMDESOl&+NkH62@IKa%bY7_9mZBLe*vf>8v&LNTAPXkSpp1>E|F^lNVBAB;qm|yDG0|K0Gh z$A0Q}nWs)GNo8E?ovQ+~77||=`@w~7Wg4QD`Gv<+yUlpAIrf*L=6&w(yNNN>{yiDf zEYf`X=|EZIAzWc}htjWhJ3s1a*EtEoa`HvJ@`m=pq8V^HzSi!^sII-XL&T+Y&)LrW z;jU?&rN*vsM!g-j=iSOJC4^Vo(*d1MD_#1&KEjaR1uM}v3*%^6XUnH%`7S|m!fDmo z6_yoax?zhoX_2-9>ISe=eOldNEg`A$0io>qCh|dh<5n^^F;hOFQ9wh5fcu@YYL&7E<)X?&{-H9X6cpy($edZc#fNAmrrWoH-k%_K25OFB~d zg7aWaFYHq8F}C6`slsm}6xiGFQojb1p59GRQr^{`P&`CMq&5WWKjWgtDm)PtX&h*vRL@FG=G zLn8xI|4xTCg|(r{#ecpWJ6fw~*X?G|cdN2fBDC9PPgaZh@#`5UMlPlDg$K9n*UV>E z&V-9caht6=+MaBuCW%8Xi1;sovhEAwSx?8t&LO6i+_ z$77oyYGlmk4ttMp>?xhm=uICc?6%&fFTbFR_(CT%Wf0IMgcgnhcquYAa^4V@sQ~Q?* zNlX_>XwwV&`h4qNPvzdUA9##P0T{Mq^(Dt#E$(?+u%@My8dRw#!u?L4ATxg)q<=~l zJxJ1Kp{)1P#U%RHekK0xbtBrxZCn^V_dqAFW|jJsw*k2Ara{2vj<6ge#B{iiyW9er zS}SyH5QA4B6F|^b<8e|Mu@z&%xiftU{9dqB0APid3p2-<9^BEEe}Li4iTrp?u+ag8 zqg`%S<|FLI>C#Eg&;`l2Jpqr?QG}*^c`;{O#R8j|tMt>sB%-qL5~P*sbg7xhcj_5} z?_i_WLN@ZzeOglkCnWCC5jBIdaDV-=*!=bmr3!J<(w~Ev>ni#WbG6^xYjVHMTtnWS zw)=g}TZOy+)xd#LNtZLO$3G8;t1oc>)yrOf33Qsekz0K?XdH%Ryl@_`;9J_zX9yq) z_n~O~PNnwk@EdpAV8vB*4V5=@wkaW<{MthEv6GM z|9ZzhFi2lQ73`)OJ;kF?g&p5(k8};g4S7FPJ)yT{@$r}l$f358j=W{p5MOJVmsyZlsHo^r+0Ix)VS2!LR} z`muqA(-#!(sXy=2bQX!>eZ~ecx_*`?sfAys^WMC03gkE1D_c22oQyABBr3;8Z2lE{ z<*K=6g7WCQoeK#X7u7Fj4DZ~&UWw5LC z4O|5)FqvW8`;M)CIxgs0U!B;zze}k%FHBJS(;Rwh*A?suEsXUebCMhH3>CoSIHlUR zaCzJO4VQp-;~fvHiHN)l-h)eE6I>^m(VS0J4X1$xe5u34-8UIc8GTStP4QKrYntc; zr$UojxXqta*YNIZrBPkQd*fR%k2z)TZ52@;=}Nyr;V|fPN=KJ(&r)+$e70B7JMFLN z_`bG7Jb?i=p3qIt`~M&OK*OeA>H4L(T+4_iC)H+I~{H!w&bAg$=jcBbOqW z7`&rW@8K&wUY(K|aQ?veR)woYd*N}cxj+Vlo>%Z&o8LheSD@36pw+@438OKYdvD)2 zXV+}}R9M)3Eo3n9GAtcYC~d20s8?4sZ`t?c&7X&jJWgG=dq@=9sz#JJsb(lFJa7`1 zKyR#XcS-N$59^MfdE0Nix4IOS#B8*CH+^0dkMAvfE`r!1^-LR@T0RGLrJY_hse-bu z&x=`tRn)IXAz-4`iE{b(#N%-R&Jy3v3apXPi3IbRQ^_`+(cE#u{ax4QNJU^_)vEif zC8wr9TvO$athfAh6VK2ofwjiOH%FD=poRKSFCR}=KS?*An7YooX^GX)yd7s|MP4ri zSl--c;zaF&tB#3DMO>03i~eSoa|7N6o(2hQV(L;C{eP@xBJlk9U0;P4{SGDA8GQDO zgV$NXMnF}OdT5yP!TzEUM&R5>;naB`T+xs@kZC+P@JPPfK~2SJ$gr^04lDm~;DZ{0 z{CvoDWhtwJ>Un0>clGji;Yk56>=P~HSldgaeIu49J~8;GBt(^F{CV^f>&2t2T$MU* z^;PcsFKLJQ;+7owhUrWSy`X1aMUB92D{4bm8KhBw2W4NM2^QEr+I*7wRs?=oCc0}3>#mscRlKTk3s%Qi2`i!+3lZJ zow{GY#3QnM^Zk+txORcX(+R#n5B8BiH1vl*F@N~#Eq^Nf`Y}M1GWA9+TfrC#9-8sYjRSdGn z&=pz}gs1TwVK5?8TTj)+51cB_t6x-iCCH7dUbLAJ6EOCW9;TLxYK@>s|?^>u*ROC`+@e6>w2=I@&p(g)Q1bEPnANBHjt<|b1{YKq|M z*wC_(*1zwROh4;y_%3opw6V!(u1@btNaLKOQG2IQiuW&h06GpqcyDt*VKr{?pH zc9w17#7t|U=DCjBt$F&@i+xXp0?H>?DY~Y>1T&G=n}>4t3i5jGp=E z{)MK$mcJ+#f95^BsQ+fEcM*BbL7pb=z4v}i{KrrD8}SFK)z$)jg~GxJ2f~W1tlmBE z3+xOyZfQ)+Z;+!kOcLMNLUv($qyJWqgbft(QQxwI)WQ6#U`D zgv41@BRQY&R6%c4G}>&v!YM5Yy>W|Z5E#{&50?f`z+c*0;ipR@3;?2v=3@InJ~$ma zMja)kZ6E=X=_~64SGc>8n*W6O;U!?#$K&qS?BXgjvi`Ml&3w*t(66R^lzfF&*e~G2 zom`1ORxS~*)cLOrUClNnMTz;b`sz!7;gYQcR;C=_QvgiEWHD58pylyh* z)Jvw#)!nTqiH3?PCbabi#jeF@Oxt^tfFl3xSOr8f(jvj2%1M02Qd4Y`(51%OCwD5S zr6Jo}+^h|iUVBUCR-oBND^3?Ts2CUYn#09Y=%J8)`QPVbK zIa>*9lzy<5N`0rmY|X*n=t%wkQ1ZF$h^5XqZmuBY7a{*$%5Z_0n9=TmJx_*906Jw@TUmf_>DFv!wnKEHSgWO)eS#=5E4LWbB@wB%Z@*Q2$;$$&kk?4xn?IPJGQdL`E9a^9URho9w>J4a%_!* zEukjMU3GQSXi*51yrlBIDAo1+m92)D_MOd@b!fTeCl;}@lf2WTnFS==;2W}Llw}>J zMJ)vd)s|FI(65=R7`$HqYdpW>oB-9Z$$ScS>vIkpdO11P<;YAB3C5 zyfD!H8F{Mv>CAb^bnygNxLh!-S=pYsY_Qd84%fA|Xylv$<@H;f(bjsGu6UKptPd?1 z1#e6(6OB&QpYakH|4ys&%T;?$Juhf9Xk*Df3{Dt1x^<8oR5IXou#UPRTGi;g{xYbi zO?B}8qA5rF4V3LiLRZzV>F*j!Jg0Ztp8i^Tvy!BUvLNM@SHC^$^V(FhM|1I+$}IXI zhp2u2KB&G2?wo}?wrB}Zp+B9M5J#!cG3Q>J7f*;%HAjaAtU(GmCy}3lqB={lX z_0*YC?aRPR0F`$4tFHX|v0aG@Nz@|;^md|7pLJ&Mx(-yp{du+dVm$-pZ2qS*4A|k~ zVHw}r{u)Yp_+;5x(X!!GAgrX3vh{Q3gi2G&*d;(2)JH6Kn0Gu*_uxbGDD~_a*ezSk zTMr`3RY@hto4NODy(VhFIQv-{6*kzz2*1U}{;BU*A@}KfHoj$>ue0^^pGC^R)vn1X zvf;!=Ft22vDny1&3YWGIxfz82SV{=0N?ucZQCL{N?b2XI{%BrU^KJIlyO4~TnW?S5 z6Eo|3Z*Eq<`7`-zlMutdRwH%n&tjNU9~Ul^K7!2ko6mZ(VSpU9e2bTF=L5NAsyVxR zl=sCXk8+vXtFrvoY2?0>TYcGw;I}Ba_Q>zUj#uQ_8GIX3tGTLd2Q_k9 zR@QeDx!AS7JPi_6Wm#xM93HM{4XGu8%a_$n7fg|!dF#jb z&KW;7w8%c{Z))>69f(rMv;7UdU>+(O!urlnQho_m`a9iNHuS7I#>~WKrcLClg@Ks2 zBHLl~C9rru>wNFRYXu1dQ~Z->57zI;E&xGuY}xT(6D~~nE7s#8duCH?S0-%YZ{n!I z#Zqq7*3gTSOW?fg!lCupCcsIew2u~bXeP3+V9~d zFdS>W7ovaLpJnbjS<_a1qH<~aC7>ze)yT+Y#Wrylfnt+Pd$p|^w?^Dv2GUs`C}4{y z6?^ZpRE4ed3Fi>803&j(BY4d8-EzI&{JS(Sk?76E$^Fue{To-_`JwO z>E_~5krAu=o!w)W;cdr{(VV|zvgYjQy1dbx*tDy=z7P&|8GtrdV7XZzSk>nx)CBpJ%FC?dQM`WQ+U+sUr z>Ns4(V?Hptf9uw>qrE@+Q(f%$JU$he{>5=P|B^Px_x0}w?IgOUs=Gr?+rzURKCL75 zmB+o{XQQ0qa@#v2Ys{m{6ZOzN`k#ghQ*Y&k+P#?NOqX7}**-{rD$enPe%WBo&&>_P zkgE4CLFfMQ$;6xc)IV<>$n;K8A7NH5Fd!B7R7+1bmyp#!zprq1C`3iu_*!`%zfzX4 zFw3KosbJ3`)KZ$Q51=JW5uth+&;ai?ROIz-$SH8b(0_^^aAUp(FXP7UvHGPWM+Y=D z`&oS!ormicALX)lJxb2&d|O>as<8bl+wsTmp7mW3*nQ46v(fTO@w}|A(lX;j|hB*%x7_a#mK ztYYfRNJov)dcN;}T;Ke$j!rhFt6$u)(pu79@zCEJ^h>+niYcBcY_oO5?h@z8c z>tN=@W#t%AW<>}0^|e>O1RCC)tvxFAJ<|-x#*_nBU(i zZzkY(`199XQBS9l0Kf6M+RV1XhuNTNkc0Ukev1orf2=Bga75$2DTazNw^Iq1Z56(Y zPSR2JsW_QX84g*sHVPe;u;%o-s5kgY<4jt#Td1o|n7Me|n#+Kd@wmvLKKG0XS}1(C z2QF|#2~+i;RFlTe?Jrb84)az$Cw}Wc{W~sAnQ?A?#UPvNgAHeiKl>=2bFjbN`-Qn# zVdtmRXM2bfGaugWLg7Ew@{gUom8RisrhY+j(|I)c1ib3mFZi3Cdz1SWCmg56B`hzL zgO19Nl8n3?WyD7dn-PX1psePvja|NHj7f`FvN zq!~y_Nq0<8x}+PVyBmbjNH<7#j2Iyu(%mg7J-R#Qf4}EAo_9NT@7Rm&-sd{6v)0D` zI;-D1_l*4pMkT1-^V4`r%XuTmz8dez_BqA?Zwo&{vqUB4m$e7{Y5cjoIuy;VSgcO) z#byk}KidV*!*N%|OA)fAOoE(mo!R!H3DG{8^g`-COYH}kJT@}+5_uK+7q+PsW<38C z{sU0K%DYT@@E-R%M_Lqp->(}V{d!o`vEVev_y;hCq}T_p`&Sb zuofb}e)uN$TG$?gTQ!uIpYq3#vX#gh&AfP5#Wx9LOfp3k5~hkYJoVwloD_>clEvml zxmcp+PNVU$+{9bL^h7rNSYQ|O^-igu!%$7y{~=GexCmbSF0D^46cy>{2kU_TAa*$6w- zKu5WP<(kT4&Xvonu}Yb0QDrd=OdCb`s&po@?0;O)HgR@j_)>J@pcN~;$XRyi>C%)n z0|QC{ecY?g2oDyW=?biN=u)~-m?kd|^tTU)V8H>WUv3azNL|oHBbA|eH1v$8(6%bmgcmz zu)@jIZ2}-YTWAALRk7NkV5Fp@pJ9D~i@sD$=7$vurRp;Hi3xM`&-4l^GVwGVy!fNJ zR~0?_N`{%!0}}=>Ua{yKtSNk!+3X@20046yvl9JsgrltS--l{YqK~ZNTI*>ysWg&g zujZg}j=QUM&2?nC3(#j8(<>^e87-#n4xbw9S*m_&c5M{+2Wa>2%=VnFK27_Bxj|El zzjb>a)=Y~TTx5#GlJVbz4^_ygi#$#IdK6MfA_`Q9_>G)w;x^ZDcmia81L8<~0Tf*9{ri8{djJ151HeB( zo<4G$TkV{wz&THdx$lJa$4FhWuxPfXc_JN;m|Whs<*BX3#hd1_`a(C-W=^nw5_ic>LLWN1sgmscRqmn^)G zt&BOmhf6RmIlssv>;#euRe52Tx48p3l!kOBYbExXe-=wzmF1^auYu!)E=m#^E**o_ zVqvX<_@fgOnJ4AKWXdP>-GI$DO$vyW0~U~I+itgs_<3BJnJl@L9OY}g=i}Uw7p2s( zMNN1{cr?B$%aF3d*R8N(TC+9#yK??JDz}K^&V@{3N*4%O82rTs>CJ&;n`+Rbxf!p( zrDD_Ece*w>LG9on%|sg=ksOwv5vwdGB94flB4RE$Ndbq_2UX~Y;Xj9qU*+PBq=S@6 zU}B<*^8BZ8`%3kc=!67KE!7{eS>O=k!n-oJ?Wq}F%ejNp7d>?2ZeA<7B1_&$tT`+G z&7g!Vd%@?{*|1WA?*+oKqVH|SyUCd=_fb%kP&F}a%6z1eWRSmZ<;McN=elO(J|$J$ z*YI`gyTVGlsBhfEJ@Q77Cd=%B3lTxiIv5jBG{IzdOox*)s^00!Vu} zd*ymh6NRz2&(WG+K=PToi!jL+u$4BIwy%S^xxllOZCHKsUW?KpzEkj?=qN?jj3z_e zmY(nvwZmTQ!X;;;SFtdL@m%yRbQ5V_aQ36j;^rQv1xjIf)S`%hjto{W{FE5qd<-=r z4)`vJToV5SmsJZ*%~5`WKSex``+)z4gY{aGI}p-!Z0NgbMFrRXPzZhx*_Udu71mHV zEUY4a@emd6dDjhZCPB4B&#iJF7@?CG3kck2Nw4)dKXqUT+mcMSdqolz?{oQDCvD(u zy+ZD{xrbBMdP}1Hb;Ww~`~I)`I>)NS=+P!EGsT9(9gYPEMcv1VUugL}F621c z-ru7AqOTqo=zfj+dYU?#7ay93uDWn0{wc%c&Nb4Fs5rEh!)5ajvi`Bx;O2FlE7Owt z$m?Zd0(Ty?8G5(KPwcGc?MRf^IM2m|A~0DjOJ97O031jw17?uVTgK#xz&N{y9yL`n zVpe#+y3|Q6)z;6l&XALYXl{QjeL) zqyGS?3WbQr3ZMQf!+!uvBsrey1O)wr>E00TH5uKb`(f~o?jm1wCc?^HBzgZ2z->T= z2^V3UNB|*MWNrg4%t#|lpixXB8(K0Zj;$$!^ZLgJUD{Jf$~UW~H`e9!eN|7*T^3!F z&IahwzmEk@l`ml$0iX;)!$lcZw3<2siyADFnYuAc1+Vwoe;*vf9M5v> zB}go-^?xAy4D8p)MTKt1ZTE!=`+XU5TQmjncR%)0zil}Q5<~7btBRe+h8ljJv4df2XN(_^#Ua_wtuvF+C^g z5?tSZ0OsDA;>Ji)K7C?WQUEijAXr?JjsACAn;HdIy(tFSmo9L&v8AiG0h>xG@VAJ> zJ|X#<5mj4&9YSz&+vrnIoBg(tB+7L)byy#yr;o1>QgNw8wZ${;OF}|YtrU5eaV;`3 zaR78k;^+kR*hYn>@V=vqr9(8V%WxCMY4F0Ghm4#5GXN$tk)L}rf^;X}&XJks!P5Wq zb%&!;_>k2IX@22 z5hPG4kz=qh`MF=U<)S}+GO?Qd_bTRic;D8QTGW^}^^c^M^p_4FWD%1mueuGrM+}C~ z{QZOZEm~I^Do(ku z$DhYl!>Mcu_ib*Wj-CuqAI$|1Gz(gM!W`uWRXw&Z7q{d&xmW$2JuOP31%)*OQs_$a z^Y>tod8^}X+T$XJ+qg_!ps9<0eA7Kr$-rXyDRS?~wi_ad%@5-OfM0A%3+N9uYnO8< zr6=T-KMa<>(Y#T9z|vzn+r@kKC|RVgscmSA?ER)du&Ly4cXzi{cBBAld@ndKO^Ot9 zBrW~M3#;Ok&*i*5Jkeijz;cIoSz4qU!ogx`f)2ku1RpVvK3^CR`J*~58ns*gyg%E! z;9JjaQ9jb2?|B{CA}Xz-hYw>8XZzWBlqt4l_15 zW}s~n6*8DIjjW!4FmDtleP|g}>IJTQk-(K(!Pip|=1TqxjDGgDWH!hSx${v=X9{B| z`m=04<9z2etwKHIK5g>G^ie$rIo9X{K$??#ww~n*y%y8$XinCOSY1Sg#in$+mf$VW zjVj(9B-{PA_uVw48JyxmMboW@Jo$lty1>q$r@{x#pKS0$DQ+ttTx1Q0Y^*f~Y&!sH z5=HhVP!|oz5?n>r(UyGqDOh3C$@bYCNT-ik)|<5uGP+zYWK#a#+=VGby^^W9;!E9o zCXB73ei|dW0-gT*L9m&f`zkowxm;6wO~1l{gt?~!rSDN=?dCVz7T5P)YWysJ-VtyZ zufm4*FD6Qt{}Ap68xMZLQ66)bwOONYOH$@T&)1{OZtGUP1>)l~!%;me>JHNIhctP( zK01*=bX)Qdgkq9adqwL5-(VLdT#FuAv%zYS+r=@CH)*KgBq2k}V#1;M4H3tMvhHfp0Js>kivM4YEK z{{dNkDtxImTt`XSm=|m_gh#}<)5PA+ZI9dfSh+csQdw+xx&h{NlMg5h!|g}`Uq$^O zDXIXrUT)Ee;x=PEwmw~9{0t1dx`y^{nqo$b*o=;y4eYr<#RpOZU3u*_ zyUm$1Wd_jr{)_9$510NjPq4=&67Ojz8rRfdrRU|S6~?Pr;{*T;B6-T0IH@_HH$L7y z(8qr{OV37L4W5lT8>z&uOv`mh6Ds`MNbZyf38(dkr`Y$HE6>Z}jERt9cj|Bd=?jb` zWXOGl7pBdmh&h@Cf?{X5`X*5es*=P=tzM&^68agqS&M7 z>U!ChS-;pQaTbe0s&HXmyeu(jyNpdKdw?`M?pX zyp4Z8p>)Km(>NuTfi#pMlmP#UO`eoBAI>W^z3a@c`ad)@T+r`+tw5Ne``$;(XTOY~id(d^@S} z5Aa)&JxvU<$oO&&8OSR3JCq!}Q)G#G&l_d}S^R*+W^<$V41&#|yKzws*OAR*k%#z+*1N4g?in;U-MY!5cm{iV7X|yR^wdYc{ z?4|fJ%u+QO4jCalrIXR7e>8@!B~Ai`36Ec^&o*G`*?P*BYWVG(?BoQ`6t!H?y-ViN0;h4Sx-d`I%2%f|J=k*1b{%7O>)fbw>gF4jsQwnwk) zDWfqw@XTQ6Ph1*jc7&>`ymw|D5dqIe`u+-Sw~f~4#~HnzF+tUNz3(2 zl5UqQ>w{qK2AJzQ2l8&hSo_=f_XR^M_nuKTthZ0_r!#Xw+|&MI-u);-GHMd(r`?xm zH(WPGD?|w%8UUl{lN5Uw@A!}yZT>o7VH0=U=G2Rs$ch(b)(Sh0rSZAKd*cH}Tl`~wW(=}u*au*T}n&8Ane6+hupJN893m2|b57u_{Y zBv7~*1Yi`-EsA{C+QKQ$l8H>Dwvi=VZS;|TMHr(?Q zCii2!|L+zU=A2&1L1~2$t!kQ3vYLu0dLP+B5^rcvW#z{&cKL-QBC+9fS{bQ;MCQi) zGA#KpV&a6KX7` zH>R^`AnT5B0~rd98N)-a@|RnpkSXh;g)nK_ZHZTUJ2#9ET9m1#JjS=@oM)4AC+#}+ zqRV2PI*_^_3|oOA4PgF^w3X3Yrl-B-h# zjc2GN0;lmyw04aNa&R!zh%Gs@n6CwaloT0P^kr+)&%@c;7TTBkb*I+S)JR&`h-+7t zRt^%ldD}Uw?;;!^WPj`1W{<~YX};{g`tZ~laA4?Ja7ex8eKAgC{6>oamppDaW8v4l zN!aQ7o-d@nFSg_>xp6$UlfVYvLd(uhllaZBz@hKEbW>}#F)bFy^!e~Jp!c()`%Sl% z5fM+esv1royIHqRupo9R#dfUgNn|PXSu=|_yZl|RD=}q;2bFk{tR#ywmSN?Z$Gp+aiURAf=v@!DoSS!q2n8VyUmKOY!e0zp^#FroXaHw%l)*M3_VoDVj6n+WK~p z(sVZ-$T_=2VDP1hP(D;LunT1_8lpScXuS7o?X|OFzudGi^h(yZzpZ8EBr?86L%Xiq zPZm6dH|It+)XPf8nBZ) z5l+gdt}AnVjqycOFI~Wmw}j|Dxv4b7mlqmk5AfK+-^dO2P1~|*ou$b0Lb~Ukx{Vpf21SCN z*XB(!|AB?FYKNagolQ)c)Dz|1AF~B~64Xt{j*&;kXCZ-eG~yMWm8H$5AKu~EG639$ zCgRYuuWua+;4ew~lhJP8*ORrY?U9>z(kVmThu|vje*kqTNz;dY_ew=U*$+b}Jox_r z1W5MwFXRPd)v7l?pii1VKuWLA7m>;}QZdj|sfoF4T%}65YO{Kn*wX^7o)z9ti zqd?jXvNptp2%OtoKEAaSOT44${8$rrvlh zxDPl`cQ0M5ECa16zW_8I?Cp!1w6#Z^`s+AzoKH?XDOd4H z!;Bn(t86Mt)}P@ibA7OQk^vAR#@#g6KLnXX(5XtDc1sD8G6H*7CgKkqUwu%yjozTR zRzdI<7J|SU4Tkx8-k?v)SN*1BNij0rTyQypka8Z2`#s0|@}i?YmFq_>ev#l&l1Wyf zg|rxl?hEzO($gu|>q=P*HWE4}@^I>#DvR9uW@y9lv6a+c>PJ7@sqb(80jMh){{c#J zXWG{cB41|XO7FD_y>NaNtbrbphjQI?7y?-l*UMccI9u`$5Qv;Ryo{l)FA)y1lk3CJ zifRpMWNwACo`_)0cGlh}vj2`D=~e3WGQ)$K6QN4Pxi((k%KNVSKj9&15VBP6cvd{~<|?cG^2x#6FDC2=JxL?dmN===44MsQx2nC1tg+CwKq)RHyNu zA{JGXnaP|5UvbUC{vCFv_uoA-%f7o8wNmT{{c?+A^Yrl zP}V3!)e`#39!^7TTPcz8Z@i-xfpNwc4<0ky(1Z->D@?wxFkI0|-C}QR)OQkIRa>cQ zi3hv5rRR?e9X(yO!J?}wwMVfMk7fw>6jyH|6LrfWjh(^8DTvT?qq&uyD=+Ll7jvc+ zt||MS;J)&8#n(}y3#sNNnQ#r4ytsQDvyqFcWf?5XlELWe{rZ$->*#7J$+T>*`bIIY2 z28HFFAM@|p)ai8Re*o5`>ZgIC*%HnkZtTjSZQ*H82)Y6;L@vdCQT-REBsI=%+44q( zlk5hCMbZL_uFO@`Si^HLW0P{R&rR+7nO8C>qlTr+EyU*vTKojUYx*oX7?J?IzIi{J zL%cV8a~~_dt8%C(wa8vG8uuIHTJas*i|IztP0R=nW!13PRM_`=-cc2#(@%vV_j`SS@i&pMCs348VRVxWKJpO$mq%DLLIKOl+re|)Jq}|*R2l~(^8DBl! zI{zfgBV8AHsEb&s{XF*YEPX!{_f{M4!8T*}S)53SVw$xvf+I~>cijYIusq&bC&8xC zJb+IP=39S=e#pY8s#RNFOs-#Bt&~QFR>e$FsIMUXawofSi^TZkkVOkbit6Q;v>x50 z!8`1kcz(*?D%Ddd3E3Zb>P#a0~p0XETwwM zAOV!VJN&Y^4gRdVSs~u0-)@M4FY79BunV1Kf=a6C1V9rtM334pBl?jo(z>59afrgA zUJoRV)8x%q1g_$E?+#u5X4Y%ED;nGj>%dsdv1J^&Pb+PztVI+8$0L^6$0-HuciPkU zc{-r{AqpD=%07{TV|C5jR)A>Vg_9#w)cTf~t&3djzsQ)=HH{$!oH+gp;cB?M_4nbO zW9KSpOe@%sZ{;T<{9zG|<^IQ64+JNt<2+|q>ucM`F2esvMG?-1(A%NbH$=InMr;Rn zzbc4i4PFIFEzm-Ng)hZkg;6boFZJMUUA4sBIe4{V%Q}3DY)j8(S#cm!bS}Q%sf~2g z2}Bi;bpu1&?rlPVrg1Yj52zCvJQCKoROu4pV8rNv|L(Q2DV3fm4E0e?SRgT)sgDQU ze?0{shXx<#uLf&5LuPjOrkeap+g%3S$%|9(UKhooSQ$gXgiA|8QL!!+HM@cc^m5BJdEl@dIe<*ISUbVsY^r!q*fg>ATd^~*2EU0u-S z8FGeMK4MNdezs!wrYhZlxtae1cz0&Ii@WOQ25Cb~*`H3HkD$_Hd0LVr>lnMR6Fx2r zj5ovE)j-*5T89|LPG$ycSwa24Ntm#fF#Rku=QR=Rq4J$(OD*sEjY*^trL+DnBF~JS zyvxJQemfGr(w{^>6bV=Mw*TxjEk>t&o3_xTR8eBIfAaos&ls-Au)fp*;`|2Tu4FXQ zKm0tj>&R*x`LKqG<*ju(NHXGspn8D$Y`Mi6zlLFd%U-nWxAGN{EvFV8vnt0M=~iDw0Zv|psG=Zgg?Y+&u+FYPY;cCrvaedKp<57X_4ZC zoWfMo!tbSb_G7ZnZ-w*C2Qxa?K_|G|v-{SqZf_0bUD*bPy7ldiQe+sLOZp2cU0=<- zhKsn^Dp8VAqo3A+mq|b=_)sPAD`C@cTdlk(PfMH1)FC?f=>T``V6mgMP?qyDO#;j~ zO^~y{3*nwlUm%Xcu@UW5xL&Vj_6b!(8Lp!lQqCg(xjZYGa-sNW&Cs{a`AyttKs;%7 zlOSn%8oNWPLjuzNAx1Pb$SO$rTAGgxC2J#I6i;{0o?Yarm+p#kU%ijJ>mm6q`c%fx znZ{mt%j~`X5}a#^HLtao70SRx8AviD+5&`b2#(rfo6*P48|SonxK&~_=(s^0&e(KN zw{+gJFzhh@p`#L~h;$5hhhDEVpV2hvMUe762;W-n(N+r_vY4AgGgWN{r3>z1qw=%V zjm@#!F)MNJD z+yy4nTvOFE|E#Y!jDG+0LvhnH-aW_+(v@9`bO2UJyi8tb8bvT(wF{QfHc`og`dq*% zgwXMK;Yyj&vn&T0zxp>bu`+$zTo9VWY`gI|{j&PeIqjO}@W`E(bX5G6-T{i$ceG;t z;xD%2rgORkBQ$hqqOV1cTyW$0cWgt|tB6kv|Hc}GCp$8odMu~?;KkCeDwcJN&=m~H zr1i%7_R2-N*u=)4zhkjSXDHQTH5+-7HFKN{SGsjZo(`&c=QBCuRPf-s2-3X*)2jFd zji4icHm%mCEUCBvk&7$&sL*ravD#)z;1Y{lG59SHF^8s#hI9jq<+cH2i3Cy z?~0bt2s(3Z?UemDWhY8cGFdJ3$rRT`BEt~KpJ{Ao{cOWsi%Rq(*4Hd@ zhw`i`giA>u`Ylt2URo_qZvQ*J6WP}3d+laJdH18qg}P9Na@XPPKN-meRJzif+YFPD zj6;({S^mHfm=Kewlz3Gx@zqvltn+0lIMg_M8#+k~Y+K!l>#>#SgLo^k%!r`=nSym5 z`d8{Rjq=1{EK`8ON3AE3#$6`jPVZyX%Y&guhHKJ>1{AN@7x{8g033`}3cqIqG*E{pcX z5H1_15*F;)Ud;U@!5KQEVr8;-qRc$q@2e$(nhzD%hh|M=*m|*3v2LKte{Ie;X1Ai4 zlsUhbG)99ymi3RSM)hV?UYOJ?=a}MxRLS}*_5b7 zQD~;e+63F|`>?3tmLi5>p|ni2a!I_IFGYg|GY~651lhDqSd2N(@q+Zq&UN9*Y- z%FA^0ioc4v$_{&eE^@}gSm;eHzPdn!)BqHF)mb@e;??<}K4yl_xJE?{jGTgGyJ4(U zS{Rx$vUp8aaql$Jh9M>MUh&J_*LN;R@sr+0gE3F>A8}%ogkt z0~B2reBvUu(8u^=$A_`=;`|FsbsOL|W6F<&jn0d&n%5-Rl0>Bgv&2@7#zv;h#&3}n zFgxx481(~t`;5c2C6|8o62F#>M~fC)87-yO1UhTeY_oOMFZ)hjNI|JVFN3dCMCn|P zsOR_!EiMdOW^!}fkjy!*b*#3TdE#Sny)FV3@m^MJQiS@yhWSw`+}U_#c-Of3UztF6 zfO9=_PCJ}M&)>eaK03}L@UJr#BT6+23>}g?AVx-VW)BR*W)7(4x>teL8w!iYF(^&|%y0 zCexswk8^Zjayk5&edg+@B$dm!+W_kgNyFUDuN8C+rs@pHm9*^y-P8C>LINE7)^Hv^dq46JNAR+F1<7GQ-l*)o@lUBbvo z?5XpP#i<%3pY?dVtW@RIFw0aIam%#OMc(=#h|y~7Po)$9P^)+#>HaA|Nr-q~2H4A`ZbQ>-VR`i5Mx1=p;102xa zJWIOp8nkc*`Et86~D)L_L|Dk{R_SeNdn`;x@L<$CvTN;AtBHBTB zQ6qVU*{ms>6ovF!RFr99`DMMzl6aZDnlb%tdXs`jQcf3z`nwFHFh|%QNoSG75fYq) z8i2ppyzLXe+{~?xIOX+kWA?k`w?gi`npf`+tWDJ3IZeQ1Nm1ihecYk%6ES2hqdeA~ z#s|0KF3QCWval6&75_M%dBbsTFeD9vY{x5T8ba-xv3oeiM1Pwoc@>-FgzlGGx8wPr z0(FX$H>Ci3m0rC609%Ueq72|64XGr@Fm}y@=OmF+qPk1h*iXRR65Fo_@8TTosyQrI z4Hei01_6GeHa2pc8TQ#;cJwxLxpY41!U6q?2~E_yzoyhYq&CbY6+DW(z5;-KIpOmS z&>1f+eWcGoi_1H*U7Eo~`iY@6&}nFC+?h-zl8s;-xei^)($-uLqk!)w4-9-8)j1F} z88_!mPP>j~x$EDh_&8%MX6o9ET>0!zLm~w$3*svc7{9h4v~l4#h*2_OwR77TgBr>_>~sf4#c;xSp*%Q{C;7#u-72S95Kl z%6&b_Yu$f57KNk86EdsQl^?^Y=)D*Paow(BHq7k^fg?~~`%rDzPKtPWcm>O+O&5Zb z7C*9VbY=*hclI?UiN4O>y=nfeH-9-9n9(N$wUR3!>T#&BLY$ub>A02qoZ_c^&&|Z!pZCdHSB8Q@! zSU(}iWY!g0^dA$(CiMxwerx0+d9nE+lX2?R zOBs{Af$hhP+8%@Hph@E`Kr~2V_um6%*rz{TnqYC6syF8G`hP3SFx0rd;qTjeXl^V} zUZMOiVUXQ?Sj%%^Wy!I;bxB1$75M= zsJYQ=Ji~cPG#mNo#JI-hEM-fl3PfEV@pc^NbysU^*FUnE#v5^tG#2Pruw!j zEdh7emDlciDvBFYF9#|!CLKB}8*G3!K_^bivmMHHhQ(JMsi9m^l=sVdcBq4{tKJQ#0hVGTq2ESuFc5!b&=MLfnI%d`Pi>l!F0%q z5#6bo6PnqZC_PQwzkE9Bt*4}evw@HEdZZ+W_yqw(h0M{WuVoM^4ewIi`ATv6V#_0f zoQDMjL1VMB4JLZB*}U=2TTJFMKR>gzhS_~{K!4^mAW}7MUBGtD9(0_kEE*FWSLIAC zm9QAuN*jClM4?ID>O3_Yx|8P)wX-H?p}DF2`&I!h&@Yvi6Zm|O?DTX<@x8jP1Q8u_ z4HuC_bXgjr`=nkoNvnYsX6qm7%V4~`ZS`>uUq%VJnkU!UhEP^s1>0^yGe>4mVQ28e zcW7#HQ0o6Q?cWC<*Ro9~o{fG5GJY@Eo<;}#dfTJ;kb{WKh?i_$Sc^~iMM z=q|(XUgV2YUJ%hYs!n)^q^-AbI35ePG+Ei|5;b!G`etNDwa#apXWuuGg2=zI*zxmq z+p5((nrQVViZw-&+vxG&VW`di0>SQ|=8TZBLe572+!q@%glWPrkZ#!`6Zw|D8D9FY zjL2=Zm@O7td~zvWSv1#Uz`+gA9QmJW>(^5`dPj+La7ekX>H6x)gR`TR#F}td<)R z5xt^AZhi5x)o`yL0V$Z#oI#wS6ge)g>m|P62Cv2qj1|R1E7Y1}_ix(Y2rqAWlZ=VB z+|5u;8gvH^{p4mgI6vbaKLsym&J9~#bGkq24Kc7oSI|{CZ-0avRXa}9Y|nnbU9&-0 zQN-tZ`Ds<}8phCZ3z&J1r@pV^1b}8=}wj_Nw9^6L^!Rq*i-C{ zot3B24bp6}|GwoZu3^R4U07TQ7xkzY@BS^Kp=EQl4a3edj6BC6DkR?Cc!2Xv4bMHc zx`Q$rkDJV{_a*7M91-}DC(}6Vd+EahPon)SvfDuUvf`02xMT%cB9H8-vYbI!tl7E8 z^PhH-wUJ|UOxg_n^7#2&BC3NF(}v-S)D9jDL1)^?<8EHua@dys#vYmxe4Xje_jzP(#_&N<4lQ zf82GEtcXCg@2!A0EpwuiQ;XQ|cC}~mDjc!lbZzg+%REHGh?Uld+osVr?(_n-NrAmc zeiv!^(7YAC#n;>?FU$(xkyi7YvaiqCzL3udAcr7i@Nuy+p{pO{d5*|^@$sVAZiG}L zBRz#AT?ex((>9X-keL|{3Ur9$LGGT-r(l7T*+Q%f@Gi)7K#9T{;zl3hC&>h@bNh*dc1 zRZjcD4l4nl=`*vUiQY)t)qsD)G)Wb%x9nQsc)P4S9Ep%0U;70kUI7p(KOc|8d7S(5 z8}nCXPBPN^6*CvgJO2xSH}-oj>*|W;`NOTV#BHLVl0O)8NpfagOtgF%NpZ=(=OwuY zmdi4N*sIV5z|3m95_{$!u746G)H_Gku^LMd5f^_JRU0_cA7mMQgs9A58Me(815ucxLX;A9mUNyBhyia*^=C{FErIbof=xrAr za#0K-+g1vK0(Zth17vrl;+G;P|N7HtyyAo<%;Xx8xe|(Ad}Fy zcf``88QS8QOIF$&Ih|pWT4HZwagKR;{0a*tdU~gIpWUkbNrMy(GOAgfx zbO&h?djuA(unz@|N*k1Gqj(6G_??@<10CxgX zM;2MIZ=Vs(&W}Zn=XAot6+$9Lr2Dwmw#2|_jh6MVg~4h$yNJi5vqX^G5Ix`8(zn6p z>&Z=xv*N^MFvH&$-X@>Z_hZj$W%x zF%u$C)tAlkNWNkgnB@z1YJ017dyxfeZ5aw9bdc^TqcXaPDtXIgtO#YCRhH~p1777# zkg{{?H%Bvynm{(HD$9Y-FIqloV_L4f^LS=_u@3IHr&^GJbK}OMk&8>pP*H57R?FVwapK{R@+Z4e` zle|;+LW(A48QZGuIodKdc{UhV`%kIC6*CE?}y{w-?JIhQJM|SAi7|&l+{vFciKc1 z-*+yOP9S_e^ZAhQ8ib<3)>yO`?+!v>ZdUbzSx2hx$9ypMIo~bSi)|XQqorx}8;G^* zg2pBHkt!PObGPpJL}}4bngd#oK!h>?8;lgT6F6I-cBAOAr zcnNGgM_JDIk}f7DjoM+Zi|@emY3yaTu{HsaS%}F^Sk!R22O=Unr4Sk}RBlg5atO)L z<&`gYA=A9d_r#ablL@yYWQPSfzr|@PxQbySoD8c3TQxtLI-IaHp z(Ze@D+1c(;j42EbjtqMU>Uq;u64eENJ208UZ~E$&Z^od>oXv<5d9|t#!c8RMlb8jv zXS+j-N%*7T*Qgg{Zh=fal4n;PnMcOonI2`}+4>QZsO&F?lgoI4yL4S4fr?7{CZTir z;6cNT_T&VKQp!OSl>nUxCyCf#k&N*wJFA>vM~o+Kf8^7n6N3Lq)A_vEr0fh)bHMnW zLxEy5_guO6IG_EZr;P)_J|8a_rPXw^!R>K(yIV&~Oeci}H>Dir+@ zn)EU!%QcR6g$)F9bapLR(by(!QJLTN{iH=%G8gO^Ggj>IPwfwV0{dSVGHvMa4RczP zP?Q5+Ro`b+J7c?`F(4a`#Tq&&3m;5fLU|Tzqz<{&LtS%%h{DOyN1G{p=YJY}IYh{K zNH~$_30_ydo8jkRVi=>i9#^JHB+y~F;%A{a8Q_##juFMkOE?8_eRG{+Gis}=3M{ZDMeNj2H3lroNLLU z?XD=7W>oE(_JbjnFp!&ho*k09%qh)4!c4X?lm(dIni3| z!^cRb{466GGS-dlSE0nR@zu{4Pr6kt|d6iorUG3Cbb9 zk8@lEI-FQBZ5*n_@x-^LMdi;{idNHyr~PO4A#>um%)Yc4{YaB~rle(_hM2ha!9wzN*T??9@>AldU!;UM9bMM-fn2CZ zaXUZss{h6~e^&FVTN9~6mRi)B_@9l~G6F|UmE0O?_uo|3sI)Xs2;D)+HONWRYs$Hl z^I*hAi|;f00kx>iv%{*kPwe}Ln8 zp+>zR*V zSroE_JlR-Ld!e*Pk4^XL!DZ+N&z(K_6xEwA$brV-oOA;oo5g>hnoJ# zLNstXXZdd5pggLy#r1+qAXO@~O`c$*J!|PZWu@@Tvf)E8-VXDdGvh`zy1D}DVfsuG zQe;ZwQ}j6T2f8N4y_hk}+|QA7X?v7ND1&@E7Y{?adV9HBTlWkvx+FJ6GQZiMkO-r9`rA@-@v%vJ8QF!u}oQ)kcXcNv&eOGJ=EOClEd z)^?TinL@}3Q`Zk1~jmIIB6gE0EBufy;4rQUof+6)Jc0*C)v-=$$z11py# zFvu~+eMVQ_V6dmr259dU^2tF$w0QQR@;|SkdxSCUX7kfKhe=Y+UTfqfq%yoFOLt0n z38U`S8d37nB6+k2Do2JC4b9VVt9;4U2<(KqXo|q0XDJ*1$`d#9n_^!cDw5S!VFI!1 zD$U(d!EKrp9!{wNsP(6evj2Jk3v z9YX5^-FD_zB;M(8_+PSF^;O>fIqh;qY-@cv-LA_W1dbipM^$imjRin<_+bf)bkBpp zVPO6u{~11aqqq3OtU{Jc_;o1RT$5oZbrUyj1ia2~#l6YI$`quh2J$-H`Ghkqu< z7_>S#`UhAjHVzU>MjaRwd09@;&Wg`*t*QS9`cU2c4T#rHD5k#N_6NJ-e@=sjKuKzs~8P@~WPdjF#yx-2Xx z5%*xD1leFwn5&Km2uDu@i2BYg(^<&NhNIm5&OMHFKgs*!4NB41YW)ErWd6e_|sFwr9Z$uvfVjmp#lZ zbeto&Qsi`}C?zxK;1^Tn_63{#;{(AHwk@Opv+eMD!pXE~j6#m?Fwcru$^9uNBC8oai=EtlpgV?0_a)PQJL56rzgS zga^csOVUb(iO;2t+5Wzl?TQoq#6JqVn>L*oa4>$~vFyojvPUa`?k3~ysp^F>iDtUN=+g~I1`JD50zYt=_^lL|Fb3Z@@ zJDlH*dSjRQn>Cr&KdrYs0WEmW{*Izp{j;*-i_QzsL& zt*o9;ojFtSR|(BXHKE^CuGT@5+;#&R1TgC!0_Ws-U%nZ6p`J!|aLAA1?wzXKwzYQ))P8tW0; zmJ$p8wh(J2JCmfB6R9dzxxG^1ZuknE%XQ1(53bqMQv-y4TAEkCUV76AKCoDjY;Y&f zXum=Lae+l&Jxg%*p&Q8Rr_$HgXP}>Rw&Wa$zi`cpB;ovr^>s!~kE(YmYxbM|0}1Q~ zSXGIDll9+HZ!g1cI*U92&*!E@vWrqA!Z?cyhX(U~Y!j6LjkS;*5eG8#Udu??*PvxLB)V>?kp2i;=c zdPxULnU|&THIX|EFQ;Q>OaXwI8I}!-ibtkc_R|*5gjQys$4$B)W+C_wa#5F4IWii} zKaQ|+-t$XDJ02k$oXV_kSN_RrO}A0$ zdrs)-+Gq}T4z##mvvCrDduQ^!hJoW;W6-oFP zE$Q!jubvzT^@HxD!(Ah}$ceHt!db_SJ$^bc2tP;O*a{-{t-TG0U%jcPCqJ3P__I6} zvtPZ#Bt3TeSm4Hd0M5PUr6re`#pop7=(ixerFkPHi5wvANJmV=Gu=TMvBj&)3KGt@ zs2>legfV-cX+W$KN+ar5(%LhsneKaT@E-z5y`S?uV+ne1IJ1k*_%~?DFHWwBu>=q zRo@OEPlWnGxPF>!jH%g7e-xjrv?Tumcoq0w*Y9eha{(qo6Ry^#b+Jts|GY1^SFhaG zp*UasdGmc~2ch3|IlY`Wg8YTfyj$xM4s-X?z}-4p+2~OIF*Sc~1@_=ybdt3o7N3=DWy9P_m*_7EkD29c zhn{Scfw`G6H$oj5#k651iiq+_9|ii1Pk-1XvGwytMFXd)DxTblOKR%}jd3v_#JYU* zyVugQ_AS)rl3!<3bLLpYND_FJB+L9IqqHj%)Ye_3sU3MG?Git=8p}VXte3}|b@~1L z3sxbC1p5;%8B@0zc#Z9N!q+em0h%~Al{)Ma@fI`j1iJKDGxhQP3Ww_LO^K`jcU1+% zsO>WOj0f=x-8cMS(Zhep577KHidM+A=T7*VNAgV)J7#B_?vdy0BOiW1rFb zAoa#0-?8`qHzaF+Tf^5ylJm8nr5~_*Y-1UX)gV(fk&;exfouBXQ1)oOjBQI*XHZ)8xxq9 z8&$RNlP|e&gY9bJA5H197HYMS7hTu92T|DBcwLO0_Y(8%NS!#v$`!!`nM@hRN%)?W zy)a#(jHNETA|f+SUDFirEE7LiJ$}`?M~S$9)W36-#Tz-I^XpBsO8}YjA{;tcYol}2 z2k=sB@b&Zu+}X|RqU18Nka-6K6uowOBL&@_3>k8v*MYKFmCDt7I)4ZI`?>hxo#R9Y zO58uhx>2dIBBRhE^R?p|pkjVreZ4cSM4Ppt)b@|2 z#;s|d{rA|(O1Ezk6n!qnT2kX&f@c?}eNGe%x-H8~6Y99ZDnc6fLUi_3dF+wqr?02k z>vm*0N%*86?JwbNx>rbIW$q--l15?7Y7vUM!&Z^bq!a&yOlo98WuA#Uk=~{5N;i>!? zk?K^_ELwR>Yvz0{=wX7ev-b*MJM))vGB0F$P&^RbPEQ*u(~Mz8^e?!xdSAU-|C*B^ z`hfYhB41rMOoX3FD*)Z8E-?dh0NEfQ7GW{R@(aqDgx)h3d$N+0PwvEI`ulfw1-P%# zZyF0?o?&1Eg_?&%)lh&!_)-~PaCKu6eQ$LREPnbu?Em9v(4?^N&V6P{wU5i$X8&Pf zBhS$+&RI3Uc@H*gurbtsSRyuM-^GjPHry_poNhAHovQ=gL!l?}+Sst13k*y!UW0f< zP27Il@~>z&>*Ab5YU**yl8o|o;$2jY6N`M*S)9h5wm2zZNdnzLKe##7e>>-$PQ-17 z`f~qPz<^dR5XtN%E(izm9+kOXr5Y{&hS|}-{V~-2&Sy<3uqxDno~m5uFIzLK7PaGW zyioQoA&qZw!TP`^{qGqQFy3@5MUh|f(Vo)p7FkI-AmeSOPOm1ZtMbUOlcM8dh@&=9 z9wchP1oLF2l#^{9ejgqnuvkhamR5Kf_}KMsCGtzYH_t`=$H7Ui&G;4TJ1=Omm91d; z&B*->+ap}*0xW;f&X`_z^Yr@=#ET^E_6%*TqrEW^A|RI4BumePofamx$7po6H!WP- z{i9PXz#F81LbO+B8{XcmH8#_h^b#HP+S*Y1H*Ck?)M77w3kaDkI^D$GB7E*4F<(;r z+TCSrZqPwaH+kcX-VU%f;``|0S9$_Y{b@^io#A0iLRG|0^-hQEjq%;&Xt)cQbJ&)m z{=VE)XFUnln3k_uY$s0_gYVUDZu?J^{ZQb5V-J|FvfQc$o2P53;G0;NiP_SWjtTxr z=+jLj8Zz@wKW~})mRKDefrL!Ck4*Jdn`V0k!-8AW z`R!U0^AU5$qUIJE{5W-w=HssvP`7@Q@H-2~0@QY%=C>%RR&H1OzyALY#6XV6O9vn9 zYh5P|2mZry;Dhb*|NKtG*;1!1S|Ale%SS3-PmQ_;ws$$h^3W!78b`L>NyxS|!K`(U}cg7Z1<>#g-G%9o~G}i-VQ-`k=j>Na;S*^)KkQs1f1r%r3)^XmU@&)?i23uw)lQIbH5O zX8CaT;@rl(X8<%NrpoiTQwE&n44bbZLRk-C&N(ni1sdY6P0asc`A-Se0h2TS#yzBr zgn#4=cxwxBz;>-$=xh|v8P*KW$9C!H6pX2-hx#mBRL)A=7Z0;ZV4S)t*qk4w>IRdc zl4E6oI#S!mkydxx>E117JXgP)hxRw8hh0q$**&mXT=o>Vv+Ix2X z-@`gh0&L1lV-(OBK}8b0xk~vwT77<~m+%I!Fe0hg3|nX_IW@_`h}&t(3e9RK(HTV* z@6rKz{A5BO096jAb?bF0b$Wb;%1FnYeKYSa(Y+SRRy(8(BrGqaC!=GZaH98m&)f3k zC$y|e=550?2`36m{IwaH;iN9>RC3B*;&$(OI<%&7B)5{hVwKN|4VqhpBX(hn;xBWG zFSsDW7SdbCQqKMNg(|+s(7_Zsmqev^CTmPT(>j0lXg^=foRxD(jJ0DJ6qXJrU)Abu zO`p%GNl}Owkru7+M>ytM;HBtgECpSu~WT{5n}gfe@@i}i+X(-;S^QWQRSG%1l_L?`k}0L zz<*-7z;fnQ%_j|(G85Td>E~u@Y|EL+BV*W2$CZyTrx?vy1s)e>8+r}eau-8Y8<9)A z0XzD#wi6$po%3Rm*aFvuEOUVq2rR}%fp~yWqf$zqdScrV>EpAm$gucg)_P|Gn%=Uc z-Z!oYihquXm-a~vLTP>W#f^4j8x%>htU%`Jza3%)GFOjK5(O{!%Yq{kg^~%?_$91vE)lL!8wW<-7A=AL06yqiIn6_}es3upnzjSs! zNlT&W@g^h?gma*Kb2lm~OWxNWbKL2-r{hQ|jrt|FPXs#9{pcT~;RkPPPdV0#&lEWR z6YZyEaoGEwegg!e5DwPb5_&X%`Vp`DBh5>;=4MM1-Cx1ncSNk_`T6=gRpLVq@mE$K zD}H){5S%@2Qsy{k&TXdA6{#z|-s;2$awcO@wI_svjY2S0J!?0HQ|=2PbAn6qeb(6q zINi;=mHSFCMwb(rw(tL3q+mG2f$=7y(?wbANaci%s}R`8cntNY?xT`Seu9|<{$EyP z2hUAb8%U|}HI74PJ}#P|5yjXH6gW5Xq8EghrJR(R#P`J_06r|y}1f)TzU4PM}DaV&P7z*eXK)A>EB+XukN+ z{yVm<{|}3PR~F2p??cml1J%p+)L3){jS^A$!Hun}$=uC4D$Q3@5=)SuiIl(23>a)M z2IJOygE=yd`~R494kqESei1PDt8{Yd3GLE_dL@tc`$l| z9J?@<1B-mUf=)g9MUl!k>tq#C?4vFZ#NAO}43PKvW8On~d`WW3$a6Z`06d6ZC%n2NY%@!uw zV+gm+_T3ETvf__7?Upkx9~4}eg=YoUJvf(6Xec}}IhfWxh;i90PD?q_OVm&DO%0)^ z6xaXXTwbZo-zvjnxMSmNeKYu>}c--R5)z=oq7dkTmuB!!4E85Sezn3 zjOPLv>4Fe*#%ARyVs&Y**CM}n&Zw04AFI8%QeK0K!_I&XMQwVr*gl961zewQa18I0 z)sJSGR%a++m8`)1qE%I+H#8n=lHPZNnjrSil;;B%6yN)5Ky>3`>A$$0?1EI$w!8oT_>xyP<-;cQ2MUuT@4c}AT>G3IMVwP)G5-}B4wX>GifuQWY=r)) z8lR4EM!EpsoddWdk!}=&i-BXPp0&8>%@BMNyf(XQv*t1zC?W*AtINqNmE@|xWDpjR zFMf8bT1*Q#zxRXN_I&UvUZj7G2s68H(LR;~Jd3Umt}0Wl$Z352gG)FSwv-?znUImscynpuIK|1UjwvwjZekMdcnM77uO|-UqoK~?r%3b*ZdbbXJbA3NGxfhTk-KR$qjMOUK z#Gg_jQH_te=&`2b^6OlhPY~pwB6&h)z6)t)*Vv6eW_iV^n1>D2)EA~+>Vg*jxV!W( zn^z2Zq(^^delQJue7QLNTnV>11X5y5=qzQhgmF~=B{DTt!fi>vdhsvC=r9GuyfTb;p9hM`pabQpHQ=C2QD=?I;oa#H~cgbK^f5X`mfN&iRiDEBCuZ`z)xx1+3GZf}xj^ zhdlwjRn_N4kqJG}ZCKEF1L6{0%1|eoS{Yj5GN&FeEEH9&5{eT(b@?5!6O$)x+%o#u zVNQ4KNfy3rh+r-*<%;YlYW(=T!C2OGRkh^NP`-jeA55{0%d7lZw(@=P9qJ>TUm_xQ z;>+$j>1+C1G0haKKvaVkxnKM%EKA^!k*1L{S=^N}7_eQ|f0>{j{U9T+M5DrdX}+>g zUKV%&#qwO*yM#`p#eKhiLb2=$z8_dQJ3?u>H>TI-|NK}Q&CK$Y`c#IO;JS6`Pxzb! zHl8u*3n|4M)B0mYFW2~r?sSJL+cx8XqcN!ZIAzy|>+e_Tr028N_^}+m#);Y)f11ks z{2Cu?>^RDa*edW>K%U5L8GUTMqx|vOPXu34Ur~0eHf0;Tj4g(l+AQ=*ouh-!KQaT^ zc>kNjVP$&X_10huH$NPLhH_kElK`)~JN&WfwN^mc!yvoU^sFAC82u}RSR(3>mvOP` zTBiZ;Xv;?H{h7HeGH~b*4obswk8hUM_J#w2%y_j*wM%3)nEQ9ys@l6~0b(^8gSQ&H zI&1hNUJl#G>{-1rz*Qi19CEGY-%|{hCoPQ6-j|-dtSEyLE*J=FKXo4t&T8|yqqRM} zbM9Q%paKcU+VHR;>3739oqp$B+^Vb8z08^ktLMY-?18a#kTr|VWKl+I%=MF#wYGAY zC2&SnM@Gf+ZbYTYDA`F`B14N7dYSY*St7_uae`NZWldG*i&iH#Ap8Tl_-c}P{A7A| zvRhv&gTnJDDj1AxO~leAKKJ;G$Sji6CXLk)k2sRjaDL{*k?%G5V`o4eq-c$Iq_2o~ zSu(#!`z?;#=_yhk!3$3nJ#v>`U_3ti)M!{tT4ge~@vf#NaGQT9S2$?OpXHf%l@*m) zP(k#|@HjK5*q4=*T=$ZB-ci|-gzsKFA?aEIL;lpSo^!G-S4=d})#(JHKHX`Kq#h|m zd!d>6)Q+V~K=NMl-?s1OCm-yL?;fT9>6j_<-)pj$`T1uQXdc{6NB@k0JQ?}kp|m_4 z>M7LUk5ulN74h@uos3yCH(Gnvw{lh*IK;T1 zNhYm*(5Uo%NvHS;GHN)?Maj8slicVk0veVa?)pi81oPqc_6jC1I}~t`vd0KSBYdfa zZK5_z`<<`9bu`hEI|d3=nkELS&An)&edzpEachD(J#C54^9M!gystGkK7n_>4>n^> zBrjecLtuboF&sZ%EUw@s$8JGW3r}PsWuWriPwJO*_xLbY$P1#E%o~e-_*h#Smx~7j z0PH6f>fCi9fRl0(yRn?n5@H-1M0z7aw92fJRVqWxym4^IjE75{dAb1~TmJs&`QTbE zh0xcfOy8GBS2v|M=fswq$728ucN#|NaUVp9yvgy%F1QcA`D@O;Q8=G|KAQ-J`6)9OCx_8dHH6Dph)Ewvh~~>2Z%# zqLQEEE~eR9lxP*{Tm=gJPYDP}}YQ zVf9dIcKodGqkqIm>$toj;xBkNLssD7_IKz^DHw3El5B6<+r~KxmRb-#^HHEM-hgst z=fv2`;OF8>H~0CvJn&;YxOxXH2kg&fj3ztJD;+g_mANu@W97bbZuQ(dGDO#GdE5KB zt)SG+CwTF4T!#n(Kb$es1SJ2%6Wg%9oEORwJ33H%_j3pIt>@HV`Q}$}gQ(=#$E<=d z%*a&V?nsHxQwScaTll7MdPdB{;aQKFM}TG+(Go+4vf`u}u7F{I=o+jCL)P!TKL`7* zYQAbL2VU!fpqUUdDH(ByneCE%7XU_P3nikWe**_PZI$)uTV^$G*(ziPKw4L%@(VsN zwT%ODWeY~Zf?KMYCGR}kST-yQr+*lIYAG}D4BglFVzKi4PLo4-dd2!cWd0I!8ejOMhogiIzut=p9)@Gu`lE6FLS)`*3RAqj&2!=gr* ze8(2eqJtuC5KU`otzSo1;<`?hqXP$9Fif++t6X87Z@DQQe<(I4HMV*6@kd~n6~r4H zw8)HO$(A_7<$KpOQ#@+nbh848W$z|cUvuEyaHmUBjv%T}Cy{MSNM>XN z5SD&(d?jV-Y(d`{qb!CZ4(y4m$am4I^7!BU;1_^ceo_o}Ejw~VbT71I#t;zr zXsv2zT3J?mlvjFeRsDdS-AmT2(s=puu17Kd#u)dsE=M@4?2TV1ph$lA$kMBgCB`lt zm@Y`qx4GZz96dd7-WX28Fb3UfjV9*H6!(1{FmFzd-S!cnpBYSaurXuQ)Xi_qD*R&$ znlm_-h6ek%K}yG@Uu?Q73owNP_$ z8=J8NVk$6X-%ZxvE0HohHTO_$hPMMU1;U!G$Qzjtsg;E#WBkt23c}Ec3g8N=UZS@yQjsWl~vz*?Swzj9!M?fx~{tF zT;AZ2b$opH&dc2#1y+5n@Id6u1@pAn6E!%Rh;p&Hex{9^)GVefVT0^>3f-m2tNv%>x~oDn#!kWKZcc*X}4p&l11<1Q)XrYNcL*Zf!uUVSjpf{ z!FJ5_@U53l_MLxXEtr#wuTlW~V2{z9cww!krY-JLS4SG1ZlmXW+54810B%#79@A>@ zPr>QUplqA$bs3uQ3b&A0In|&z8_*}bb+Tg>w&)k(^3^DiCypjqZ$-U$c_XEju%z4| zzNJsuxV*zPgX=c#H}&2Ukg#-=Hib6wd?7X7G2R#H9JHq&)nO0 zGxXAZT&$uq$3k-N!Ymgkv-+0;@*6W`f?B%()vlf3&7ZpZ_#q2&Epa?8N2p#ng`=L! zzZ&zF=3nr^MhOB?Sn@5spXLyg8ky`mnB_)9?uys*Im_oKS+)L;jbbNw`d*Wls`^C^ z==I0Gku8g)#}bvc2)MaW~!yIYfR4o-#mOGvjYzr z`Vp?@jO9Cy4e%!7$2wT~gzzmlKJ~JWF#MHvWp*aAm4Mj$TBb#3V?8MnP5rr^$V^;& zyf=%QlJd75+t6sBnkzTHFxN6wB4yf4Pf?>*nQ{nG(|`17GjXEY@vE4tnGi7@=r-vU z>n-KZvB$F?uJ00b9|;g8HlbOcYG~JfjA6L40-8RSQOo+M5HD)>fQDeN$}xfS3_R`| z2>mOx9Y>#~6GtdovRdJcE%B?=mOslH# zYo0Lg%B|`1mhxc>h}8k$S3Rt#IdDRr=Nd-g;5Y#lvnhHkIl> z>!#Mc>lg<;IZ;Wma_G)vC;buXkp>zA3SwzOZ=ADAS1M!fOlsp_i?n`BeYX1x`3V*( z^5~QJmFmi?FIO@+`K{bPL&H>CEwXO;G4(~CB1l9JDK@dnIA?A46yUU2!j zs5@nm1+~CZINRu5{RnOD%|Dorc;S!)$}CB)!p{)ooL*ZkX)@{yXXS1p=ct@LHqX+U z!Qhmm`RrNkT?15nLI{)-MqGSEM>{HA`|XR8GI!$Cbs@Z52D;+-vo?MInrqG*<|#%2 zZ#h^F_VCUKO!%;r6@23lH@ti(lp28ODnX1g3K;=~2SCrG4;F!_-gMqwB{`l*pKbpn zjTnVsz@uR;9q*cygW4e`LY`Lz^O7Q&F)1ovZpThE+{Z3?nEzC%-XpJ%ZnfTKA9z}{ zz^~VXyf;g4DsYyYw#|bI z%*C{cQ}X#6G?lKrI08xQkQpq3U;XCcX|Gzs+ukhv2HCKd%QG4T&Pc5Fn6o-Rx^&R{ zyJG*7Rm3IJ%9_${2DiWB=bzR2XRneW4*I*DFX21d8&ii%uI#Ij*EB#Qdz%p> zt-G!kvBbrfo#oQUtvl+eN2wlj^Pa{^J%x)t3oC@<1%!INv}{*D{?|WWMurZAXxYRj3pW z9H8ylj}E>t1|s6syig4i_PfdcD203$2fhaI_G}xApQUMJ#qF*U%LGSfD?xvZ!{9}L zQG%1&Nl%=<)VKGl-s)GBoue9FT+K)xf6L6Qvqp%vGd}LbEF9$BQ*-9qPg-$;N*7_SUA{ zAIjaq5)FNY7I-fo)EqeJUy!m?b#5Q~V#umqe|OZt<@g<7V1;W2;_Yu3>^tuo?E?q> zM`C9~j#{tmE*hl`Zou+ubSbVzroUHV9^YRs1ocYZWu~0JvHQ$&{T0E3D*cu3QrJqf zde-pQ0f8(3$>3$;WU+54hI48&lERSZ`T1$qBT-bPSOe*g53Ty9{+b2>G|zcHA4btl z(E%Nu*46x~$!KuTREx$jFQtEM?!jH=Ie*HXL!lME=Z1(c{#g2*uB4*yX6Cm(8ODRD z8DYNkozw~Xs^B56esXXZWzONp%Kb?leSYfWAND??Yqok$>+$jmhxvBjZy`~Zb|E?g ztHDUIJte!{&Dx6}K9OJKy87HS87J*6v|h)S^uUHFZZ=L?A8eQ54!DgIx}_pL5|8Cp zPyPP(S5}m`wF&KV`HM5Fv}-evd4g`LuaM2qiFo_U2D(@CNAzOjUk`2*nFY{F6T_ zJ3qL!WV=U)r1egh3uu2-Ehu}CD8G28Ykpry91EkSye7Xw*qf2)?P>Gk7&=KgH@QJvqy4AL12(LFd^DST+oagan!?4zM zMu_p|OUiCla*2ag>#a~~f80Rvl${Zw>rAM;_<5R@)3;+gdIt!bj}VOLk z1H(bQgB62ciP4^+UfaH1{+?;ninpb{8$tZSpDpylCkoKCu5V7>hzxjsGwoNeor8-_ z-Im>!l>hSFCcFeN|K==|8@u-X535Uo=s-0GZ+EAt{X6C`Mrq=8s{~nC!g+!1-@^=k zo#l5?Z1-eqog}tGZB(p^2L-(}(_PTB{nJPlf1^?i<7wIR)ungg3PAu#$L9O$2&Xje zk59f&0jJpt_CHD@{X6x`MIJPwtW>6*-2ZxNUmm3NX`g~)T$VY*KR0p2yp8ML{H6=` zR8m$y_)>Ffn6lz?44?VGq=uI3?|UBONSjXk_+z03Mu8GUfVP`F-;NfK@CVn&GdUKy4Z{l!d}a)Fp*%89YxA{5?4cU5O+0SFBanck zMYx{9S+M>KhI3Ewg{+0S|eLp{O)do;t8R%;7uV5 z7NQz!BPu!yD>R&!!XSH^Z*fvqG>HIi3@T#B5)mlszDxhS9!Oa4ep9qjL47sCiC;EC zojAgh{WL!{+&FvcQ4|PNMS8fMnp%+Va#e_CR^<9bJ=rqCEj-zRq*lS&5MkkBMj`dY z+s)lRjn8{Z@mMip$0kJq1J7OL(oII*V8bYpvw)Q@tuq+3XxczoVq5aA+6Cwnk$o^t z*?F_}N~M@M!TY$G=CKsFWT`wd6P%{(TLXJ(ue}qyUMfc=9~622hc`MuT@b>Trdfn7 zBSkLVjg_;d+OHcWx9iEvTB1_qlFZMujsw9-?2{2W;MNZ&B&$g%1_u?(=6!A2_oY?| zAC4%Yk+F5Hyp>&zm&L^)!Iqnsag!xhrBJ56n;c@FW^CfsIzMK$vWyS&+{F1*sgocj zjeE*BquSg&^;6&O-J-A1wO+zR-^~~6xs#^Go3%pPe@7=@0&c~Wkb`*l!Bd%l#Z=()+_%rCUxIKR z3ZkcWBXGX1<_g63aUsXeKxD1sJH8<w zw@kl2ar-6i%poFxoz>|oM|Tx>_=(7=YqGhV|3fNhB#|d=Z!W-n{Ud9fC_0xA;HZ3l zoE$sZNQ#u0J?DwY^-sgwOhCdh4X>XOB?>tb-5aY75<0?G8S>Z&0N=(R^Vx?4KOm4} z!u70PlXGl6lh_h+7ohMjv{)YI156mAIX0Tn%%y`CA(#~Fp@<|5NgnPVtX%El9;C8?$s~!)#B12f( zeqH+fPQ=_8+-r2Xg-SGgnlyw@-mk>GeuhOA*oAgOuF9M<#Pt-jd^)&shW=QBhVom? zZ4FVQhbYfQ%O*0Tbh)DNg9cRFiAsb&tSPP6fD^(&*8F{fXQ&I5T7=mSF+z9;Ff|rH z?`=kt;2CpX;Izn~pOv7Q_VZ%-tWKzt(a2#NgRl7rERtL-!DL|~1c34;xs&fL;GiC% z`wJ+#H#41O7hwdhP)e0&F9UV1_=Vu>f8ymgs-vDz(SVk_`@tu~vwKm#mHN>M%Q-%s zY%iEps9LKHA2b63R}SAFq~@d`X$TMR$KoP7yH(wm;QSW5j%P#&Q2 zV4T`P+ss^#p0hYmA(!B}$|b^-|LW^y<1R8!N1`1?Qx8QBbj0eIM}O})gM z!i$BY8rZ&*I?zXB2c?+xfjZaX)unj;~Ucjctg}e{(K%xT%frvWpM?4_7@vm9>(Ds5!_tCNi8r>>m zgFj#X{1sj4?4Z6&zTRpAZs2EZppGZ9fh5s_;TV52^oZ_v*%bP>q>nLsrZSs$g~VvLQYW^`L9D8pj)^oaoZf6_|w>FLF&9?jXOh?ifWVDi4fD|XyK?Ym34{A(e&IupOuEgixp6NMMi}-xGb$cgO+aLuoJ9CoYKxmXy-a8+ zv8X)knRTIm4}Ke|Y!*LQzWhb-a#3{k4n2PJV9(%3fe(?5A4&FJHK}6%m3Vu>x$wq# zHWk#h&v{i9kk(U^l)~#hXIw_`jWvEs_))=fzj+haznXo-#fME;Uz@dQ3qhtYtue!A z+LmJR3Ky2X?=6w5kG`N`&ngt2&)273z6g4-EB-4CDYTBQ?IuoHbq59ohz93YY(=+@ z$LhQD@l*)@bGKuvsxa{j4V4VZ9d$WSZ;UMbh;BUu8fX2O2Ej{Ex|fmBVDr(dXK5ZR zm7%7c``fMXhkv$W14wLEPO`z+GCI305N*8~h}! zw~KQ!4pXr|M5A$uOW`}p|9T83EW9S!GfmpXV7JuT;0-E>Wqi{DJNs~ym`$wb#kjU* z&&CPCgB`0%y+Y9f1G&a%rh%T+B!ZXz-_ULay|c7${N&!3>`2(w%A5D+pZPE%Wlwe# zW0yy?IIz^42{dNjZ_C8=&=wpRJU_3iVRsl4TVy7*jR{?CY0!O&LK2GX&-{nwyQijT z&^Kc?(BCWF_rv+7kbj?aCon^rVyA*B*VHNs$9IzZM2Ub?-L+h( zg1l=xqm8Gnxoe;hdp#~XTcDRo%{Qk@HPc1b?DN;nIOSdDn0SDnkn)q(8k@^siZeVQ z>6$uN(H1KLarHBqmjQ}z^Ap#?Z9Y{-SOY1-E$c%ah4r0U4K5$>NQ7yQ2nVsMYTP_| zo_n*ygUvkBkbxlIAYFN{d`6jv|5zw@bDWg$Kdd75zYiOqDzV~6ZKhIbFI#@TC6a&C z2f8TgFMv!0Vhdas=Ur`5TJKFHWvXBeHFUJ8%aJ~PG$^o9b6K)TW=~t6I$pS5U`bma z5qWLUF@C@QFo2n?5-a!TY)qtEFiy06&;{U75$j~sz8 zR~5CpITVXeDrXnuqV4n*Py4xwmJ8Q?ntyL>895Z6_}dlMPBMPxo`Ki-5o){| zLQ1_D#-%V=F3)+8ijz9&m!xmy|6!@I97}}(ju(HxY~XCer)Eddlt11)wgP(jE-&xm zq{v5S;=O3&dpK5dd_DE}4l=@SAjW9#{56xo@~1JdnI;Gu3LzV)?Oz7PqR4? zcE5_v6)>}8lr8r>6R)<$fDW%-VD%~TusS*?{WCypuvP0>TqI~(1TvNNQjqbhX;;CW z|GSU*R^QtfK$5S(YoE1V4g+(P!#-b78D9WYx+3GY?eDA?F+=?as43N~nM4L(>MNk| zS6`N1z+KJe7jC*$b*}aalH~r{{uMrnW|~`RZ=%5cdIl_dB!Rdv4>?|Vv)E4C8Cjz6 zI+~AE;c54%064P9WzLVEKdS|_m8=96ReYm{7cENe_A(Z;i2tlKp37_~&SVOFN=n*A zEWp6G{jr-L4Fm{)=EOLbVFckSY^fK>Z3|2G`GVL%v?lX1_s#dytk^p@RV`syT2u!9SgSK;3yL@& z|EmEn(8jMkQDJu`?IO zor%N%vVy+uY_mQUfBg#CG^TZq;Vg8v8Cq^T_31Y%T;rYi@tm?KZ^b{4B_4}#CV{o6 z$AdjJ@r-4bf~pJliS+869;N**jU)%|Hs%C8J}JN1WD*gIF}WXUcZ6~=UDMcJHI&Id zGe6v&0B4-5_m^p1zm45dWqq?HyHIyVV<)GAU9Qh~`wkL+1dKz^CvD5TD4UC2{%0Ef zMuqhJwJ>ycqWriElo-_KFN7$uY7U!!oxUy=^%hfI)1`i3=(i4~FxV$#bC0iOCZtbm z=0`HlX(eVFH*iP4Q{A<>E$fBYH&TAhsOB5sYBKC(f)3BVv~h?SY?QNP@5u&aY2_@| zM^leA2Q-g;6BnoZ*RjkmEBO|4cw+05G~?nI`bw$5Vh36Un&haKlCDKtP4#rF982eq zIG?Qvy}QAB@jm-Dn*pS8{|v;JGu2ZVE_pdrm2mibRq4ec*U+Yx$o6rtTLkN9gx1h6Dk(b9=Ej70_;(IDHu?y)GazJ}XxBO7Qu3OrS%%xnI=9 z?WU(kOcQpOw9ULVf3E@#I5fXraF%i%q-6O(9ZG$)W5z z@I8&yv;r21m%B26R@YvC1^&UQzuZ@pf2@OPbbn0TLTSE2er8_yJ2>S@kBH1?j6r&B zqo4=kiFoBkE)p7t2<;f@8csy#9A*+trf0L_(NSMqt~W$$OWmZ&E0^6zNKI8m9OdB& zy#kM`r*v;R+;F`T4fzi%j%Ch5tN{y|yB?jwU*YrNjGNu>D-*F<#MdYw{-84E)JpHB z%Az;GG1dumhY`{u%orVn_)hlJX}b$*vbs|H{L=wSjXY9Vv!b4iv_)ok@Ryb}r>Zcy z02$1>msSUoZcwnzEveXAgs0)fP=R7${#ql$OLJB>%NsAf7y} zdo^9%`F7t;iHW%aOsX3?K2|R};WldXb6wfj1s-%&FhnY9!b*&)lyOmQF=d%Re)hgC zvef)*XpJ8FNF%#lljk1!ErjJ@Y9|aB^}TCiv?lW0c;(aSk}*N%22RKS0&51PHCjlccd*q z2u&p|CltVGq^Dr#idQx;+>FJYxL}WDY@eS zQ+e)b4#6Uo>-ZXooK&02f(Xi<)W%GVp~(G3A&|2Z+cgt0J$R{D8iB#V?MP--{C~bI zJC4QHw1!+a_ z@^b!Wsc=&~tYDCb@#=p{+wfJKF>66sQIRIK9cjvn7ei%*3_7OMn(3o!lJ{5qe;rdx7UvZFW$JJkGx{sL>MYe>uC6`DcZ zAC!Iut4m=U%0nogL)tU5AB8uEWUA=E5iF8?p=N(k`>?--IIiaf{{Vd_L*_0Oe-T=f z+2944_b}-TCm)!o-p%75IB4T;k-+=2_*QO|k)o)XL@O8hLrp03Ahx9&p*&*xFf%H~8sHu4orvmd<0Ljm+6kw`*f zfybDB^qY$R06Kq`8Foe%ILBEX3X}MX6f}UvZ;+qF!a#HR(O|gEf=}E+2~o?w)o;{M zv`WG?J7G?z<^cZyI&q7C?qNf)edjS`{$i1UIJbqBRDI?Q%bGw6!fAZQVdcm7L2>;> zB!BYK<&+-4oRKRM6iqV{@4I$&@Bl^JFird5c0Hb$hFgMVnK0b{0KG{PG?tP_w34SIo2c{@k-G)VhdE)ekCFx;d0Q{aze@z1UluR={EU&a?wgc55la78-V&lCH@Qq3ml_L3J^8-$O3jP2GtmB4ksw zmAa39D`g;#B~)*o2K&G4n&j>LS7~NMHw@BA5h%?V+#P**r`&k=OSck71X9hr?yHTM zKhN}`PLy_F<5ovulaPe|@di=7MRU6MjWoR$HU>d7?myI_=-%hI^R7Qo@jkDqf}7SD zfWoA0jE{5I@T{1u5uGG;4(f6V91p^xb=%SfMuJ+*(7n~Q9d1E$c-tdCavsa?k6Mlx z00#pAoS#$msS+-7a#;7P3V}M~K7;z!7V6EfrI3jb10>*oI+P8^r6Q>(H7c*QF#^ZW zPAX+jr3wu_c%Wj1_NRad!4!-1sXI~~#_Zyax%R0rF-T9f0K@|w>3V)NWK!f~tuY7* z_M)4PO)f{FqTyk{;9{D?-k0*A=Na^-A%U^MrQeEDJ?b;Ny%zyXA6jEh7pbHu&Ct|s zZX2mIxtQ#X{c`L+l{9F_aRZ>wdgBs6!ZedRvCA(N-oBiz*Epy@uyp5QUJsc2o@+Xk zz6y(%+Gy7Z%fws@dD0=C#czxV=u8&N4>qH!|CioTf%bdK%G+_9w>w0Fe6i2Dy7}LgPw7 zZ+C3cKzar{m+&<_nyrSy@EPN8`Q}$}KaFb&jw^F1Qc`;zbZQu7NF&r#p>xz`xl4Ua zU^H@L{nPy`Qr}pA;tMCZ>-kpjuNS$`IuctOVFBl-)|4n8?H_8V7NG>+$Aj)&6^8;S{AoS&LC;R!)Lbk-w`w`26OUiSP#AjC zxU4>tI6ky)2Ai696@|~WDH*2c9CV;H7YhMVNWfC$_vuaGoKrw49Vx5^dQ+U?@###@ zezZ1(t|%PRGSS|KJZ7flSc^MNRn(yK;|`-ND#M;>q5B${q|s2iXFO(;A!KsfN61fa zYPS@n!m_^CUO^PPji%CMQSve8AHr&!YEW)TRFU_P@JG|uxaAjft};haXL`2@gN2oT z^8Wx)S3_4P9mYz$ZMH?|Yi`R>TamG_vW~0k?kJ4!qZ^M?Pj+cT;-TDqX+|^26=dj5 zkkk@;aZzs{jW{>A=RgtUns|QMsJC&=C^UeV%=f2nT+}6+F!n7z@P z!^v#U?V?3*nVMO<0z(1#8jedi$@4BkGaiT(ukx;H)8Yo0V&xt=4^xr-aBEW6#QHp` z<_oOIf4-zusnVBH9BRj*d8~|!x<+{69T6l4^fenH07x6M79r{1@~ZYwmc;v6t<0yi-TR0HN~5dgmo(Oa;vZ+W++6i#lp5GB z&c0k3RPJ(r#-b%69$ZQt&r(1?(v!o)rHE!*+r6Y-TC9dv>+-8pO{uehmyG$X*`cjL z6mWdHN<`m*jntQj#|c@Q+RDBRrxM#7TT9f{YFMsFk5oM}Fmv zFP9rx461bW{{RzD>d2q08INYyR^Xh2jDqt206|g5U~VBO;yvrolEl{4kP8vO0|&4b zECXm~$sdWP=tN%LMkThI(xXD-r*(@apB9|T#@c3bhwkzgwjl}&$VXpZf2~J1%F(#s z=e0FPC{DDlP=iiHkijaespwdi$K_UGvPdL0@BXd2e4u|ilKSEpogP_{5BqJ8=TtAe zOQc)66MY#Y`-x86U}7C>V2 z9fz(LKiBlEyN`$$mr{ncu~@+9SQbChrPijlDN?BSJpwfWn%%}h`=`BDxW2Wvw{^R? zjy;_VH$UTEZ+Wh3cgJ(xOAtLkJAaldJljm?CPU9s21)!)X7L}&jTRsIncUy_?@hJ{ z(B@ZOtjA)X#Pj-BE2wzF?^H=6EwUFmF~m4OQh7B+bjbH^WCgujlU5eOJ_#+yL7Y}H zoaMVUj3FJ7los-N3ZW3h4_&!q^zB!z>{c>P4)fL6<&Wc6OjD0%(bmdc2h+~xq1TF{A^GdPv(v)P>i$DU7*r@>a zqz0eIN(KWMr;2F6rvg5d0P%{GBBC60JW}8j??4iceW?%ONIr&?gGhD*gH6s21Rq*W zw5~A;$@in5T2i^AX~$XsIpdmMcV{$#PCC-ygTbaDamdF5wINa5nsDi~@+nBiQJ;FE zNU#9noCwA!$jSL>H}l0XAB^^0f|5TdR@n%s!a)vT%jcMP~BNs-;du#^Y(S% z{&i&Fj8h78#W%|(W`wSt(T6ULd1|NZ&bJVrvA6gh4P;AeYVs9ylFnaD62Fn;eihhm zbUXrmsFTW_Hctx3zKktzjxtTd&mGHKO#t=sh8dbq#HO z6aN6QDFFU-{{ZysQM=21qxg{S6^|{Inw(8-b!Oh9=3m$RX@^ZNxVF?{aDRoE#(%^0 zqnY&nzVX?AOZ<+89ckAEh(A$^yB4zx51B~!2Q|kgov7OU-)EWAzm!7{(=?BEsByMb zanw44{IF`3X|2h0Y0G21k5IOLlBo7>D!`C9$}+dm=DhkHNecycboUBKtylw1g9X$q zeH$o$TGAMX`Wa6Qms73;j=WL7-}A0@UsZ?htb~8DAR?q1rlB9-hC}}JS*?A#>WsaE z=+V3nx9LYYtR?Xd2@e!`9YzQ>GWdcM_o4&n{{Z4Cs_=bDbSAnRI34pzfsUkBTI-gL z#@8S4H8mjBtxw)E55OPmR;oqyCDNMcUgM^JN>%DIe@dn=?MTRyLG?pR_S;fF*MH-t znyDV-x^nDTByQyOppZM&Z?;=w{d)fZ-zWSje%EdP06o|8KjBNBJ;tFf#QT8nM+9b| z`(?NM_Fu^V0EHpEwjc7_{{S5{bH}*(CD@Vij$@j!pn|uE$8EeWd>YI*LtJH5f&}^a>WSZY6&4W@uIqjaMW@imUT8D`B8AAU6cX7w-QYVPKL2vgSC(rkY2l-XA z2>R0u1KOIp*^5r7ia!+V%O>WA+0Xk}t7FCbqmX5?jj`AsKb==L{{ZgN8-GA5l&9RD zSiXhnJa2vFh5pZ6bi%O)mOmX!8enO=N$yzx0EK6Ll==!j%a7rw?J9Q{vxj3qc-UkX zux34e@&5qgYQXW_EQCIvDwF8o{{TwI7RURhl-oCDH2tMc;q2-5HCM+lMh+|{C+Y|E zsHXAk3_%)v+4LE2=lyl;jrEbL z-<9q^3Ouh<`c%8U%2rz=AlOdrxu;@&pW;ILcKXZjau?g_eD5Dan_xMa=OI5mYx&oQ+XuQyqaPl+9^VV&;k0@ zkrIy7@f!M21znlzP7xlpXUi1exTG?;kMO66>TW$K;P#*h_F|7}lWi`+KoNyB>=922 zG2WaOfEkJclTQgw0~}BSD&n7xds2!y$4US(o}5vSS~(|*cWOhp+z-N?fk*~@DM=XM z&=&(nDWe(cPvcGm8UR8lz%+7tQUyM=0EZ*F#W*joHp9 zB%f-b48R$s1bWi2ILTa(QBjfUPU0V&^rYR2W*Bzjj!zvZxDs%BwI%@R%{QecPpvcp zkUWY753-UoU@MMtxTO$+vu>h5Gqr(B=)nstoc>GB`b z6;e$)G57SFsQuxWKhHJL^VrjuaPLs)MfE9GlIi)JskOFW`D>^{{``6W019uGgYIh> zK8}pP%Qe>rVNGqV_v2Rjs5L)V?Ee6-yuYkJ>;4$yKeM+vWWKa!Jm<_{e^FD%XL!9n z%`g4EfA&JUX129|y=e*m0DuaKwCe`{0GBAo&|;U>+8@?C{{UZ+&%LIie&v||0Dw*p z^)(Q;)njgS=W*|o{HvilR-8}#dlB?={xpAM*pu?4tMri4cxL|qulNI4mHjXHCQMUG zgZJ7*{{Zj+^&z~s9dyk=f8Sr>T3^`~p!~AjuhLpSvf=}atFiQwsZpBJ-Hx_*UokWO(BK^Zx!&bj8Mg-+TW6e<^z@{{U7R ztp)u*^Eq>Meq50h`*Xn9+*7>k<^y%D(fT2-llv_X{J&nG`)Nu2l@aT8c7N@qB|=4g zVkb1sc7Ns0=kW%ci=)A{oc#rK-`Mbz%-27Q(fy4F{P(#30KVw<5BmQAh7YVS>;4?( z8VmOOmNy@WKjBSFT}?86$|EPcs6WoShS6=9VW+u2@H&Y2e!%_ZnZB-R`v?6$_yYFp z`u_ljIh%;@itn08M$dF#&{JWV$j(rot#se;jp@Jh!H?C=ME)GI&+gEn_B2X_p0^0s ziqPX`ac_2a+z?-!C>RycXqt*!T*oPPU=Kl8Kj9jPHhFKYS%*b}5($VBDjhb9_KB+< zY;vrqtgHwlBBlIm8VOz?6bu2|6>%=}fZSE7cQSG8FbsC5hB@g*!g{c!RRh22T3C)@ zLGOxiYHm|KNu|gg7xOe&Ifw4_r3dk-_aE-9FPPZtMS|p`ccwo|20cOgR9Vk_{Y@K> zwE#L#&wgn$KmnxZ)`Dp$0djq4 z%{2QHMm^{OOE>v6o6ROittVOlaesPD`_pkp(ts4;_on0PM%>YldH^;LN^ZeR&#fH# z&;v?Sb`Pyd&#fmuqJSgVJt@9dwN3d^`A`HNO)r!?ikgt)-hd%7EgnGh{VHsqN=%vn zj75r39ZAg}H>jWngcQD5J!!)}w7k=}4f2$n;)4o$3V6*fGuoZRL*#+lk1SNXDBDN~ ze6dO8k4luOqi#FU1b$fbr1Hf}wv2nwGCiPnqaM{JKD32>=>Wi^(w76$or+#)0hps6 z^!yqJ6adT`U8bL!IP{zvYtrjC?n9kW0W&om!;k8tlxxPBA>{ETs$O~7@{HzU@H0A0ZJr)LA2 zXFk;7nm`lMv;Y(JqcpgpfDk@CX$eAk9QyR7$F(L0dH^>1 zH|Ivv{m_1fjmjxEj>doxeiYCXOfo&M9(zX*i_g-hdZ( zy&H#eX)rzMFg@r2;m55Tl=l?O3Nb(r1*(ZAZ0k3mVtp!}!-+l3h(^xw*ofE|(V zNyR5LWc$zp(T{penq9_#4Zif9DR)tt078AKG4!S4j8FlOYA`)0{3!e=0KoL6#V6rM z;Xn(wJ?Pp!X*297`~?6m-+E1+^nL=5z)%6V-i@M<%8CFs(qfnLq`>x|1>5gSjCZEs zdr^VyKn~`PeQCdy8TwPW55*MB{V31Ui-m{n&u`Y7u=-MFmvt8l2HbT9j4z?1eJ=6o zKna1`kIt8WwH{}+8UWrs>2XWudkRhG&{3cU549UlwHwVIVf3Rw3<@^-VwcSS0Ax|- zf3he6Hu{l9ew4e%_eC3rr5XSpoEkxzcIEV?+`g0m+y046C%9jM&Cly6@{Oa(r+K+PywH6T>UA#ho|XFy??t%1M;TR zx38rhVD$Yc0Y3^(eW~7Ox9LZj{&7GJ+w`MgJ-8@O z9<*%~0Nv-*epGpf+wv6cqK&KRKn?Q`p#K2AMH~IUK~C7dl%8790lVq>3Q*p|@}%;X zk1SDk0`5MG`A}H;Ehm;e>2?o#H5i+l&{FPi@+meCdR>$NZfZ9_ts8x*aqU10mi07z n-`+o+Cp5hO0Fyuf2jBCh%_l$P(T{2X4n1fXqXL%#fIt7)+=uY^ diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM.jpg deleted file mode 100644 index 89f8e6b2e63dd53f4c8e66605e1128c9660d8337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8377 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 J?+nbe{|{2;AlCo@ diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM_test.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_CM_test.jpg deleted file mode 100644 index a38729ed5bdcf6bdff8bbf9f2f1acf82c26c5eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<Jq?U}9uuW@2GxWo2Ojs;&jfGq4D<3Mm>o zvIz$!vMUve7&T5@$f4}C@t|nX#SbdRNkvVZTw>x9l2WQ_>Kd9_CZ=ZQ7M51dF0O9w z9-dyoA)#U65s^{JDXD4c8JStdC8cHM6_r)ZEv;?s9i3g1CQq3GGAU*RJ2VdF$b$$4{OPfBE|D z`;VW${@-HY00o;p!_R+R8jG-@wY>f=S4`@)-(EY@8+Vm>4TI`Jv?3e7^fxA7dRlGmI{7PVB$5^N>NIt4PTC%t8@O?L)7n|6bE_ zu=i@~VprQGFZ%l0tgmPHT)UQZ=eU6T@sILR&sQw!DwufHt4%>}f!vl`Q}xvP%z9N) z-F~0qXIr$Wi}B#u(p}H{)|u|-&b%dk%TX$_!RD&GaYE8gEzJ{7JJc7L+`=BVi}wG& F2>_en9%%po diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM.jpg deleted file mode 100644 index 7b7145db1588c3bf9af3e10f5c1467f2887653fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14667 zcmeHt2UJs8_iq%Ws;G1jV+E;FMKqED1Ox??K#)F)ln@cA6A*}sf>K1P5`{>w0cj#l zrG_G+KoY?M2?7EZLXiL=c_+;H&5YxG?|W~3Z>|4ZYcT8NntRW^=j^-p@9gvYZT2hn zFl3Xdk%81$n<4BL2o&6W z-I~=u$ZvmZ)^c&L~Z;E17-@lg{~ zgq1bY=9I0S%UM@9cMp`OpMOB$FPNa<@T=D%BCp?wN=QsfPPu(26_=Tnos*lFUr<pgE zA&ac2y_x@f{;|M67Wl^k|5)H33;e&bfPACGoXC82e64%|vdxVpj8I8Dgyk=|edG=s z0=}AOp;UPC;gCb}EUrbXDQbbmG_(`XhVZpKc>_;YtJm7g`F#U*z!?0F3xR7d2#uc9 zjZ_Dn^Pxx6uvhz)^PW9v@|1lTA6$_C?A*a{v&R4Sx)$8h{lfbC$32OexCWkUuse$z zJnb<^cVatMVW4W-AvUHBt3auqKI8+YWZECzD4>?KqQDH>cq2H!h@Wa7FqxUdhFlFK z85?H!ANna+`IM9)?q;;f%3as=XjA{_{W4-j4-l2C5q+Vd70)@R{aan9^r4b% zJ}IJELea`YMFLO68r)UXk%Syl3>)$`Z-1K0g#&_C=R@SZR1aAp*DYL5uBhT2b?9b8 zE~l+pZ_GPHUh@d+Bg;C{C)+rCE?4oUeCP9Nz+cUM@$6J-2v{J(!_V zr@@A7E-WoHA8PRwdknmAbFOrO1zpM;FSii8Be{nzWueA~)T54+z_0f%&R{XU(W%CC zsd#TUXp5&+|ClpP%k8kQKWmrGX}VHJ+&xx6ffsEN0j-CpdD~*B6v@Q-k^~}A;nn() z*^-F9*1*0?k||Z0^<{NVfwL!jG6voj42t8%tDxM5+xKh=vu^WDU+4b@3GaQh%!aJ* zSp(m}EE2fLe@0Hhvp~PWaR1+8jhZTXe%Jl(58-uxprwmFd!{Sa4^gnSd)x*cxw=3Lr(uRe^&qF)9sK zeFE`=3BQeZb#!@z`q-Cd#~%u7Pvg=wgI+VtY|YjJTtf;s`$31{$>xv6lh_b&=O&CL zf(=pX8MVYV$;mNi;mOeHC=)gW)-wu5lYs4k_r@`fyk|qw-Dk4Bf1OC-7b=PabVW}h za-mN-qlALdk=$RpJ5#kB=O%75%=F3SrPf-Kv5_ZGk20g`c<`FV5QO8#yHr$(L>Tbs zw;n8Rw?R92Z(W0S)BdlWg832zU!`-x3{3G|Hbm6kUS6Q9)mI9C^J%-y3Oc?YhE}>t zGgzc(|3Whvl^chrxgIO%-Z2`BMBk7ul8PxiY_{k3kg&XB931>?>SgSy=#x0z7_{l@ z7U33S;DbXC=rLuRQ-#JI15-!JRi!M*bux$A#AYwaTsu$na|yZkX)J#TbB6rM#2SI4 zRmH7Yp~bV38z<8@;nu#2VOe**MfpB8w<2FO>I@PY{6S=8#vsW1&tEAvKCP4{Li(U7 z|DFTC{T?~$M-ZmS=2S;kVl$+fB4Y~ z^Dc8Sq{+%4nt0~P+kA^x6--V12j`D3S=U(IP;k)KZwvk0-y|pwZ8rWIkeD8A<|Xjl z{IX}|W3h)}Q3^@#Hr%M)Tl^Z&6%O$D)PfVA&pqQMq%tKu=QvGc5qY>LA}@~P?kZlg z9vzEjRu@sig}CblGKPCZ&ZL)B_=~~<)jM9AIfWaf8!T+_e2qb()BvD9B!r0Xash}? z^@+LhjT^kT%8R)vOVYGAx^X(sS`-D-@J#y&ESeR1?RL%|U+?}{N%uOF#qiX&-?1_n zy&|}RgTHt(khixS{_`bY!ZmEkuSo~_J(u&EK=5iBNM@Ow^#w~PK=vD9g98Vr)Gw_!D5gKbJr{5@S!eZ&XykN(VHvs`QFYHEam~>D9i$_qTXdQLQ=|` zMCQ(%JI^~!LNRqv2Nw0o%Hvng+>*&xy!&K&*ZNO!b0ue%8~Y6J8DSO1Kl}63mCp+vatM_ZfQ8Oy1q%S|U%kiPwqb?5?*^2A(7|D4Gd_{NN zwMScaisuA5M}?ey*h+#*lq!;#E=nI?0mtfiJ0)yRR6*;E{Q^ro`4>mwcqxKxmi5xMw4RX33br*JvvYT7{z@d z8+HwIGRTjbLtHx{w!EW`%GHrx%2wwETWwKFUcA$ETZ)rxWi_{=vLEH0w&8P%=yNB= z=uIEFsZ-)%YRMffk+a1?Of!vffa305gy(EXi)YcKhBjU5MoEr0O|w}8Pt$z+@gmNQ z*#9zd$|TXqOj5H(xAMFJJAE#ok_tPi)^5{}^Lf7RiMzlcZnp>O* zt#%)=6_x~ceEEtol{>zI&MK!TZ5h@OcoTlAyq0TEP(gZA8yzFqeFER8>ToZU3-5VN zcN9W+9_kQWD?vG#%_u>;IkaOB&c$*OfBs~XIA8ix8JVCZap_E+mb29~iNJJ? zw;HSOX>sE5=u$Ucvbj4MEJ7|BFlas9A!u~L(D)CJIg@i#rUyb!&W+W4e|kf}LFaI{ zJDhFD=gPRX5RrOpPM}zrWM$+$!+z2GMOCZMGx(Y6pqRvj(@EMssYR7W=lPP2 zY)D%|yZLT-nqRfk?sUsAzeV!d+U#Cvy=T^&qbsNSU2jaH{|Tl0wCAUiET#2)E{+j5Xp4ja zJ>X4~PEdO7@xt;0%&AI~bMvRLR}&Od=)6~GkBmHCY+bfVoMLTC8F+QQXVk%(d{7bB-} zsPa2l{_N$g;8aBKNv7=GuR-uy6n&s`T-pr%%0u{#>Y~u7V@cd_&>jUljYS)5He=^r z>tpvzQe<>H8+8QKtV>~rD7S3Iy{$fj)i+7MaAV1jLM_@7I#+Ed9=1LGOqido<uh*ha7i>R`XYnmc)8nS$OBoMeI&D>y@c0}ft}S*!shsy4M*6F!cCJyL@zJEP2toH z&^HAx(`Uv%lQM>1JzdVc#n9iu+?mMQEb*jPzPV{Lo+=VI+_LMM=t-tT&2nYq@KbC= ze7z{~&5FY2;Rv^<7QI!KY)E9xM}Cl~5Y48K@4qCuY5hgyyVuGG;Z$y`*P^gR!`3Q0)%;m5&ICuw(mnEI)5 z(HUG3qSp0}Vqw#{*d|Bug=?niD$#I^bvFGRw{KH8E!vN%pA56`PR}IB-B3Q|i>%Uo z>(m?cQzzvAp)zH?XpQ&fzX%`k)+i}!5km0wcOqy&w zCUrF-7-#x7k(V95;!DZLXn#=-#EmmC&>T$ObvUJ({2>2FZU*4{jyIF1{&p*ND*aI+ z`ENIct53_m(b=wgk&=T^pE;7Oqcv$0oRyol5NA5GZwtD-xF_OpC_33I*oA47b+CWv zoo1x%-Q~7BgOx-^tm>p6*zjUe-IFMzJXO{%OO;a4nzIJL6-j7>5KT*Ast>d;7}%CA zsgyBrrvXhbH=_qowFw7kY=FEieoX6qHKOj>fNW9X-%dVC;V7J<92^-QHbX&`V2PKP zY@#sXD;Go20za6U;)Kv*1RL@c-4SBLs+qcR_y@~~^h7drtaKlK#m~zBFLAqy?!a>`^;k9N zewg$^N}ZV>3ntWCk7$8Ty`DN{^@A?XN3qYe0Wch+J^9}PgUCs9i^sZEAHp^PtWKWL zWSw=%lEXa$7;8VHy5?UKLxT7uAg zms7^@P<_=P8c!b%OQxl72QweCYx+^2B?H#!C(}~@Sukcs`G(TxOAV$Ym-51i$>t4gdIx5Q$&n z2*J>+aB@zt85_b3k6W%9aRRR51nfWhE&i%Q;H-wQs!zdCCPpa7Cro|0+sPTeG?xG2 zN0wW){Qp@@Ckn1E9VRqVOOJ!zcMJPpp7B4%)_tmwL3aQ}__ob7_foib{hu?E|G5M2 z4YWwpo-S3RM=nuHVc5s0%0D{AUygNj8B3H*#=-q4#M*{~U&%&&7~UMr(2e4pS^Vf> zbkhFvII3nJcR0gr#|`2%&MbDN&!}xq^R7ik7H@A1)O0`I;87l@D2M`aYd0{}5tT>enJ z!MB&8_!4ef_)gIKb6B#S1Lw@D( z1gSdwYzPvoPyr2p51;9oE5K4WCbEK9Nkzj8a-fIf#&9Z+iB-~<38&Ir4AwPe|JPDo z`jg1Bd)f`0H1a2W8#P?bT-8NkQGek?zL`o?`O&j3r-I@3nGVO4`bQ7orgZ2gEV21- zmXZ%sLW{gY3+V28XI9lz5A+M3@b?TW2gojInQ&c=ZK3 z;gsRxjm~HRbk7d$FQ53PUh+mr>!)hJRO;jmWS{?C=Og|@1bRnXTT zZ%kIHI}T_spq!40u|DaCwc@Ech_moIL@`+b9+8>wwH+InCI0oNdAkM_!M5q?l`0bI zv3#W~e}ku^zMvUWBQ{TK+-du?dPfb1(ouGA(y*^M12SVdzr15yVEZhqpBMk5Je9Mm zDqPe{B{%pr9@Vv*gdL@xi|egFcc=K*^85Ja1AyokIEelqdejO22^-~e zXVWeTm<87IUUjVrkOdkPwzXl@^43>}f@}%3^ez!)#UH zWa#rahAD>=j+_N#Q3rfHgE=AHnlQ3*nmJj=$V4#RIIjWc`~?T6%H6?AGABRXjvk9` zoCVD5SolbDvXI=AQ*<6Cg3MBtNg7KF%^39DoB&9(a7qZ@#<8P-UYI4=Hz9sCv9e!o z7uVK;!s9W2YvN*CHiX!;f~LSEE)>~6mc!0z%#{k0Z=M$-m*@XCY@BnG=hm>myWTne zlC&^`MVnlV_tVy>3gVJY-bAfTNh+V4HMc+k0h9i&N!IFTH766Ag%s@LWck)m^z+hr z9TkTJBCgv_DQJ~riNUFRbY#hbta`n%X|;FgZY8h*G>@m%5K^%iuoDjzB>sF2?8Hkx zcR5x*iQ#e8$y_$5c%pA5-+f_;a#^%m1h8gY*3c)%}QBw);y}`(y_qgr`BSR_}pZv=$R^N-o(bS%`mCBl_d8e;wQ9Ryl zObN6Eq;Rm?wc)eZ6_19`l=KQJDyu8qx*yd>4sl#}?_B=ynfmG$-Tet}KbJ$F*R#Ni zkTTk#6jc1sm$>`;CCax3(O49?boD`egw{)deYmw8{=_>Q^Xaw+3U2pl?u*3hH+wfW zJxrNwn-5a#M$}Dz%IQrgtfwdzFeIh-oCvdSA7aS#1EIl2JBVtM$suxGEHZl};X4W~ zTonQkC+@5oU8Vp);%}eU14ckeQ?Tn?5g|SDPkp~@RI30@O&#UvkN(JQ0x9|&^|q)l zgpWs1Zo)C_F7+7Nvbd8+v9#~AQsq3Cf*Nw4mc8Pm&hvJoRWdxi3w!kMQRKjQwro@c1T2ZaR^lNsvE#n6Zc``pEbZTL~y6C6>m!A9k(+^R*-}f^0cB0 z7-z_I6GH@UxC*}}{!unI=K>CYHTM#S-5&ewUyuQ`#pssyAd$}BZSb2hlGX+b;11dD zhRGA`4+{jfa|oF8@xujf3dh}NO7&jWuaCc`0$y?(;(f;^!2{IwQ0mdCNK3jq} zqi6rBjHRTGJossY+?1nXX|!?)WPMX*!erY=ziM1Ws8r|sEo)~_-A>k zLpdasE>U~I4C(?nsU+Lu*sFbQX@In{T&=q(+Wf%}2$$935o6v!tn|>M%G*Qh;K^t^ zh6>QnRult!o)TjK_!_tm=O+R=f0RQ(KYb$}RlhDalMN9PwH$8=OnG`uvDL3O?q>WN z0iXz*FB22Q4gt2nI-H2$9YZWq%yKca2RKu8#Dl4d@SL_g7T^-7^SavxZ&+T#yC$gE zzK2&&HZZ>=Z1!n0M@iET;|t*EQBvbgTXH#5eRj7Qv12)MrqI#@v2PkzGH5l$l+E*{j%gX#0Arv8=k6N?%SS z3-~#t7Y(1i&eMUNCUv(_PB;_REsQJ*ZMI z7wrYlO5C1%X=_RHA^Xm)h*(R8?BM^9S!go+s>e{&+=53X>=W20^Lem7L8l|)KC_ar zO;Yf>C9505tvzpx;u&g(@{4>hx|>OcPSH)|4w9imoL)s-zFlPsQWfNC_^)>*;B_au zXo3ff*P+#?+Ag$hB#U0YI8ssv_~rAn?%x$|)fkQqr;^!3y6;DTB~sN}J28lX>38U3ZiTi~V}N@FuGXdfVWgqWdKM^gxd zm6#C*Y8$!D`!mVJUr{G`T_FO499Y_0xP@_0_CscV_i)R{%);t$p0H6h<|++Y#83?f zRHlEJ;O>>q^2Y*P3q2OI8>k1(t9p*QY`PJ3xp+Q zq7}WDcOClRc6`faH92su&DZuvr zuJ!1=KA5v6H|Hh!WMgJOM}V}Zlh~Rsn#>kZ9GOD zR?uYMg?GHGk(ORJ9rH4g69_QYwsdunds$0r7W6U9Y|uJ33^SvjZv`OC_BNMg4~ELC zdSphaq5|;-=9_C+!scQ#+J;){s988b60sYHfV@eN#;!m9J|uF6PzUERea}JjW2c8L zeQM#owReTqHH!&uCoG5V?0l)W15>bvq*P3~Qf~tV5I_&?ft3}uey9^~qk@L_rKDK>vu=~C`|?%E+j8v4hc<#?VKv6DH5YSkucC}QvU4MAncnpw#)i49*>hr#E$s@rJ3fK^;(&fl^BKvN9>R4_n z&I3GdfZfIhkBfx8^mUmFc4q-IEW?*C6y-&v3%D>Ii*8jd?8Wq|y}V|5w~etCK4p7* zo3`IQlO?hvF(&66Ynm01>_aQSuL?n-fkE&XlDrl_zDTO1?@)m39h1Wodoz>NWH#7F zd_5Jn9(|^#1<}N*^_ZCZBGo0yQ2{BacZawkJxdg0H0?F&>6@lX#EG(+t;u5v#{_{m z>xAAv(kxa!E>IQkH{5>rz)4%}ZG2m)it66n4>(w_>&$Z$K8l~PdOrg~MQ&S0}79=*6<2fZeX(4;|amr{;MK{g}vr6ZRrWwjT%!(C7BO&f> z>i8T`OtHsEJ-Nb*%D1b{3YmRS^q!19sp^>YX(r4HfqoeHbhuPB_TtE?Gu(;-qg7Cu zvUVT?ysr`x@0RC?jXjQN#Bp;6^0~zN$OKPylkZg9@A3+DRO2guSsXeoR8p7=ldDQBuuBUl(m9x% z7y7W3INf*bRrP|$CeV1wD;38rc&fR85=TT%PC^_tM;;X1UQ^HdkrWVgV6W?-F z!#)277ruK@|KWd69Q|T$>lmz7knq*&Lt8Pih$9t03ubb3V~W%V%D*?sfmmh9~tNKsrzKna}R{zrNo;9sjYwKNk4M0{>Xx|0fGPVGsN- D93`WQ diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM_test.jpg b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/Image/p1_EM_test.jpg deleted file mode 100644 index 637e3aeddb35160e1f4f1a11df30f1885cc96873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmVgv=4-_35A08bV92_7dE+-%&EF&BoC^soAFflYVG#@89JvcHvE;BST|G)qX2mn9; zfB^v!0RO}Q9{>OW1pxs80RaI300000000010s{mE1_uZU3Jd?l0JRVR0s#X90t5pE z1q1{D00Dgg0s{a95d{(Xb($mz{*4NnC+Tr5kHzm+W-gbtcq>ZiPbApZczu~r9xwbTCqEN#K`H*o|10HIT6@IQ$nLgPxB zRUP0WU;PA{qif;KYWC~w*7{xB%sQ`>Mn1XeT5aHcLfn6+Ug>si{mHKraQp!@!{H?- z3$N(Rf9vNT(wg22)rvFQ8%xAqrrPBnABJ;Qymxzdb*Wmd#IDG;>QPDHXWF?+D6I`E zT-5YSfi|0aHM{rN+&9#8KaF-4x~7HV%PZ@RcSrKCtzq*`)}4sF-f{DNT;JE+(aMz zdbYHm25W=E`qjGGq?ZyRZHXpUauu?00p_?_;F{WIhIpPSP~nl(sR!H|j*2Uz)>%)4 zd^`cm0Y2gB^Vc~=DuT=a?_IU-x8bi7ykk^`=S{ecb}iHZNThb$y?-j9{{RS$todsn z6KN91+s=`pWB4$t?cq6*u-c}Q2ls{AkyfJc{{V+=6U@~-PaBcXlVJl&$J=qh6)O0* zPSC+$3~4I_-9FuWiDvq!`>Xh7xxGhJzSZv9>rlIz=634xv19Zef~sWt)UaI7YdTMF zG?7Y&D(J;XKEzj0zCFFWg<#igY_*8MzLG8gXz1P zZ`eE-K4YxvB!6^TjQ;>SdR=%P$L38xRMcc0ruBEE%-@O4mJAB@PGEG>tcb;yFuwN>S*{1qWX6)Bp=j1c&M7OEz)u fisWdbiYTIrD58oeqKYV@iYTIrD58oeqKg07c7RX7 -- Gitee From ce24c783026d4fcd62c72973bab7c9a558e1f807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:50:27 +0000 Subject: [PATCH 25/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/evaluate.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/evaluate.py | 86 ------------------- 1 file changed, 86 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py deleted file mode 100644 index 6acc51817..000000000 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/evaluate.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================ -# Copyright 2021 Huawei Technologies Co., Ltd -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import numpy as np -from numpy import * -import os -from config import * -import glob -from PIL import Image -import tensorflow as tf -import imageio - - - -def evaluate(): - - prediction_path_list=[] - prediction_path_list.append("p1_EM_test.jpg") - prediction_path_list.append("p1_CM_test.jpg") - gt_path_list=[] - gt_path_list.append("p1_EM.jpg") - gt_path_list.append("p1_CM.jpg") - P, R, Acc, f1, IoU = [], [], [], [], [] - prediction = Image.open(prediction_path_list[0]) - for im in range(len(prediction_path_list)): - # predicted image - prediction = Image.open(prediction_path_list[im]) - pred_W, pred_H = prediction.size - prediction = np.array(prediction) / 255. - # gt image - gt = Image.open(gt_path_list[im]) - gt = gt.resize([pred_W, pred_H]) - gt = np.array(gt) / 255. - gt = (gt >= 0.01).astype(int) - - th = 0.1 - tp = np.sum(np.logical_and(gt == 1, prediction > th)) - tn = np.sum(np.logical_and(gt == 0, prediction <= th)) - fp = np.sum(np.logical_and(gt == 0, prediction > th)) - fn = np.sum(np.logical_and(gt == 1, prediction <= th)) - - # How accurate the positive predictions are - P.append(tp / (tp + fp)) - # Coverage of actual positive sample - R.append(tp / (tp + fn)) - # Overall performance of model - Acc.append((tp + tn) / (tp + tn + fp + fn)) - # Hybrid metric useful for unbalanced classes - f1.append(2 * (tp / (tp + fp)) * (tp / (tp + fn)) / ((tp / (tp + fp)) + (tp / (tp + fn)))) - # Intersection over Union - IoU.append(tp / (tp + fp + fn)) - - return np.mean(P), np.mean(R), np.mean(Acc), np.mean(f1), np.mean(IoU) - -if __name__ == '__main__': - P,R,Acc,f1,IoU=evaluate() - print("P:",P) - print("R:",R) - print("Acc:",Acc) - print("f1:",f1) - print("IoU:",IoU) \ No newline at end of file -- Gitee From ad9ff5eacd76b3ea0379e342ac11d855e6173c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:50:34 +0000 Subject: [PATCH 26/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/bin2jpg.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/bin2jpg.py | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py deleted file mode 100644 index c8a939995..000000000 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/bin2jpg.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================ -# Copyright 2021 Huawei Technologies Co., Ltd -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import numpy as np -from numpy import * -import os -from config import * -import glob -from PIL import Image -import tensorflow as tf -import imageio - - -with tf.Session() as sess: - prediction=np.fromfile("tf_cfl_output_0.bin",dtype=float32).reshape([1,64,128,2]) - pred_edges, pred_corners = tf.split(prediction, [1, 1], 3) - - emap,cmap = sess.run([tf.nn.sigmoid(pred_edges),tf.nn.sigmoid(pred_corners)]) - - imageio.imwrite("p1_EM_test.jpg",emap[0,:,:,0]) - imageio.imwrite("p1_CM_test.jpg",cmap[0,:,:,0]) -- Gitee From 447dc5bc38e071ed4c122e171d64f185f11eb658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:50:40 +0000 Subject: [PATCH 27/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/jpg2bin.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/jpg2bin.py | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py deleted file mode 100644 index 33a462b42..000000000 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/jpg2bin.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================ -# Copyright 2021 Huawei Technologies Co., Ltd -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import numpy as np -from numpy import * -import os -from config import * -import glob -from PIL import Image -import tensorflow as tf -import imageio - -pred = "./data/test/RGB/p1.jpg" -name = str(pred) -filename = os.path.basename(name) -img = Image.open(filename) -img = img.resize([args.im_width, args.im_height], Image.ANTIALIAS) -img = np.array(img).astype('float32') -img = np.expand_dims(np.asarray(img), axis=0) -img.tofile("p1b.bin") \ No newline at end of file -- Gitee From 805beab454423ada4c8a0f0c57ac89709e3b3381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:50:50 +0000 Subject: [PATCH 28/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20Te?= =?UTF-8?q?nsorFlow/contrib/cv/CFL=5FID1230=5Ffor=5FTensorFlow/get=5Fpb.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/CFL_ID1230_for_TensorFlow/get_pb.py | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py deleted file mode 100644 index aa8e6d2cd..000000000 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/get_pb.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================ -# Copyright 2021 Huawei Technologies Co., Ltd -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import tensorflow as tf -from tensorflow.python.tools import freeze_graph -from config import * - -# 导入网络模型文件 -import Models - -# 指定checkpoint路径 -ckpt_path = "./data/StdConvs/model.ckpt" - -#预处理 -def preprocess(img): - mean_color = [103.939, 116.779, 123.68] - r, g, b = tf.split(axis=3, num_or_size_splits=3, value=img) - bgr = tf.concat(values=[b - mean_color[0], g - mean_color[1], r - mean_color[2]], axis=3) - return bgr - -def main(): - tf.reset_default_graph() - # 定义网络的输入节点 - inputs = tf.placeholder(tf.float32, shape=(None, args.im_height, args.im_width, args.im_ch), name="input") - inputs = preprocess(inputs) - - # 调用网络模型生成推理图 - Models.LayoutEstimator_StdConvs({'rgb_input': inputs}, is_training=False) - - with tf.Session() as sess: - # 保存图,在./pb_model文件夹中生成model.pb文件 - # model.pb文件将作为input_graph给到接下来的freeze_graph函数 - tf.train.write_graph(sess.graph_def, './pb_model', 'model.pb') # 通过write_graph生成模型文件 - print("begin") - freeze_graph.freeze_graph( - input_graph='./pb_model/model.pb', # 传入write_graph生成的模型文件 - input_saver='', - input_binary=False, - input_checkpoint=ckpt_path, # 传入训练生成的checkpoint文件 - output_node_names='edge-estimator/output_likelihood/edge-estimator/output_likelihood', # 与定义的推理网络输出节点保持一致 - restore_op_name='save/restore_all', - filename_tensor_name='save/Const:0', - output_graph='./pb_model/cflnet.pb', # 改为需要生成的推理网络的名称 - clear_devices=False, - initializer_nodes="") - print("done") - -if __name__ == '__main__': - main() -- Gitee From 4ba4073b0a304dc9923293a49a6d701e4ab2120d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:51:28 +0000 Subject: [PATCH 29/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt. --- .../contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt index 5dc8dd84c..e34a41192 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/modelzoo_level.txt @@ -1,6 +1,4 @@ GPUStatus:OK NPUMigrationStatus:OK FuncStatus:OK -PrecisionStatus:OK -ModelConvert:OK -QuantStatus:OK \ No newline at end of file +PrecisionStatus:OK \ No newline at end of file -- Gitee From 1bfa7ebe207d3bea4b2f73b00d6cdc5b5c4a6aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:55:21 +0000 Subject: [PATCH 30/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md. --- .../cv/CFL_ID1230_for_TensorFlow/README.md | 92 ------------------- 1 file changed, 92 deletions(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md index e5abc256d..d1cf3a4a1 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -120,101 +120,13 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec | Recall | 0.488 | 0.498 | 0.484 | | f1 score | 0.627 | 0.632 | 0.624 | -# 离线推理 -##### 模型固化 - -执行get_pb.py文件,将model.ckpt固化为cflnet.pb(路径需根据实际情况修改): - -`python get_pb.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` - -get_pb.py的工作逻辑为: - -- 定义输入节点:input -- 定义输出节点:edge-estimator/output_likelihood/edge-estimator/output_likelihood -- 调用网络模型生成推理图 -- 使用tf.train.writegraph将上述推理图保存成model.pb -- 使用freeze_graph将tf.train.writegraph生成的model.pb与model.ckpt文件合并,生成用于推理的pb图文件:cflnet.pb - -##### 模型转换 - -使用ATC工具,将cflnet.pb转换为tf_cfl.om文件。 - -- 工具:请按照[`ATC`工具使用环境搭建](https://gitee.com/link?target=https%3A%2F%2Fsupport.huaweicloud.com%2Fatctool-cann502alpha3infer%2Fatlasatc_16_0004.html)搭建运行环境。 - -- 命令:`atc --model=./CFL/cflnet.pb --framework=3 --output=./CFL/tf_cfl --soc_version=Ascend310 --input_shape="input:1,128,256,3"` - -- 参数: - - ``` - --model pb模型文件 - --framework 源pb模型使用的框架 - --output 生成.om文件的路径及名称 - --soc_version 使用的芯片类型 - --input_shape 输入的形状(batch_size,height,width,channel) - ``` - -##### 离线推理 - -- 工具准备 - - 请参考https://gitee.com/ascend/tools/tree/master/msame,编译出msame推理工具。 - -- 数据处理 - - 通过调用jpg2bin.py文件(路径需根据实际情况修改),将模型测试集中的第一张p1.jpg图片文件转换为p1b.bin文件。 - - `python jpg2bin.py --dataset=./data/test ==weights=./data/StdConvs/model.ckpt` - - 下面展示的分别是p1.jpg原图及其边图、角图的ground truth。 - - p1 - p1_EM - p1_CM - - -- 执行命令 - - 在编译好的msame工具目录下执行以下命令,会生成预测出的tf_cfl_output_0.bin文件。 - - `./msame --model "/root/CFL/tf_cfl.om" --input "/root/CFL/data/p1b.bin" --output "/root/CFL/result" --outfmt BIN --loop 1` - -- 结果评估 - - - 为了检查评估离线推理的效果,需要将tf_cfl_output_0.bin转换成.jpg文件,通过执行bin2jpg.py文件实现(路径需根据实际情况修改)。 - - `python bin2jpg.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` - - 下面展示的是边图和角图的预测结果。 - - - p1 - p1_EM - - - - 生成图片之后,调用evaluate.py文件,对结果进行精度评估(路径需根据实际情况修改)。 - - `python evaluate.py --dataset=./data/test --weights=./data/StdConvs/model.ckpt` - - | 指标 | IoU | Accuracy | Precision | Recall | f1 score | - | :--: | :---: | :------: | :-------: | :----: | :------: | - | 均值 | 0.589 | 0.963 | 0.919 | 0.628 | 0.741 | - -- 中间文件 - - 离线推理过程生成的中间文件可在[百度网盘](https://pan.baidu.com/s/1TSK8yJLm32jhE1SBbcPDvQ)获取,提取码:14uq # 高级参考 ##### 文件说明 ```python -|--Image //存放图片 - |--p1.jpg - |--p1_CM.jpg - |--p1_CM_test.jpg - |--p1_EM.jpg - |--p1_EM_test.jpg |--Models |--__init__.py //网络初始化 |--CFL_StdConvs.py //网络构建 @@ -223,11 +135,7 @@ get_pb.py的工作逻辑为: |--train_full_1p.sh //单卡全量启动脚本 |--License //声明 |--README.md //代码说明文档 -|--bin2jpg.py //.bin文件转.jpg文件 |--config.py //参数设置文件 -|--evaluate.py //评估推理结果 -|--get_pb.py //模型固化 -|--jpg2bin.py //.jpg文件转.bin文件 |--modelarts_entry_acc.py //拉起测试文件 |--modelzoo_level.txt //网络进度 |--requirements.txt //python依赖列表 -- Gitee From 14a8933ab8ad6851bdbcf5b3295283b32ba10f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:58:45 +0000 Subject: [PATCH 31/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md. --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md index d1cf3a4a1..a172cf456 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -67,6 +67,8 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec - 硬件环境准备请参见各硬件产品文档"[驱动和固件安装升级指南](https://gitee.com/link?target=https%3A%2F%2Fsupport.huawei.com%2Fenterprise%2Fzh%2Fcategory%2Fai-computing-platform-pid-1557196528909)",需要在硬件设备上安装与CANN版本配套的固件与驱动。 - 宿主机上需要安装Docker并登录[Ascend Hub中心](https://gitee.com/link?target=https%3A%2F%2Fascendhub.huawei.com%2F%23%2Fdetail%3Fname%3Dascend-tensorflow-arm)获取镜像。 +- 安装必要的python依赖'pip install -r requirements.txt' + # 快速上手 -- Gitee From 7de1cb3d59cdf756eccbc9c10df71d720e849e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 06:59:38 +0000 Subject: [PATCH 32/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md. --- TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md index a172cf456..307afcd65 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/README.md @@ -67,7 +67,8 @@ custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_prec - 硬件环境准备请参见各硬件产品文档"[驱动和固件安装升级指南](https://gitee.com/link?target=https%3A%2F%2Fsupport.huawei.com%2Fenterprise%2Fzh%2Fcategory%2Fai-computing-platform-pid-1557196528909)",需要在硬件设备上安装与CANN版本配套的固件与驱动。 - 宿主机上需要安装Docker并登录[Ascend Hub中心](https://gitee.com/link?target=https%3A%2F%2Fascendhub.huawei.com%2F%23%2Fdetail%3Fname%3Dascend-tensorflow-arm)获取镜像。 -- 安装必要的python依赖'pip install -r requirements.txt' +- 安装必要的python依赖 +`pip install -r requirements.txt` # 快速上手 -- Gitee From 79de46494636eee05e92b40c27166a70fa600a94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=81?= Date: Fri, 8 Apr 2022 07:23:40 +0000 Subject: [PATCH 33/33] update TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py. --- .../contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py index b9743f9fc..959d338fd 100644 --- a/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py +++ b/TensorFlow/contrib/cv/CFL_ID1230_for_TensorFlow/test_CFL.py @@ -163,7 +163,7 @@ def main(): print('CORNERS: IoU: ' + str('%.3f' % IoU_c) + '; Accuracy: ' + str('%.3f' % Acc_c) + '; Precision: ' + str( '%.3f' % P_c) + '; Recall: ' + str('%.3f' % R_c) + '; f1 score: ' + str('%.3f' % f1_c)) - print("Final Accuracy accuracy EDGES:"+str('%.3f'%Acc_e)+";CORNERS:"+str('%.3f'%Acc_c)) + print("Final Accuracy accuracy :"+str('%.3f'%Acc_c)) # latex format latex = [str('$%.3f$' % IoU_c) + " & " + str('$%.3f$' % Acc_c) + " & " + str('$%.3f$' % P_c) + " & " + str( '$%.3f$' % R_c) + " & " + str('$%.3f$' % f1_c)] @@ -172,8 +172,4 @@ def main(): if __name__ == '__main__': - main() - - - - + main() \ No newline at end of file -- Gitee