From 8bbee310ba157f5b84ec76a8ab3ae827306fa3c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E5=88=9A?= Date: Mon, 25 Nov 2024 18:05:08 +0800 Subject: [PATCH] bakeup --- __pycache__/event_time_specify.cpython-39.pyc | Bin 6293 -> 6846 bytes __pycache__/imgs_inference.cpython-39.pyc | Bin 12367 -> 12354 bytes __pycache__/move_detect.cpython-39.pyc | Bin 6246 -> 6420 bytes __pycache__/track_reid.cpython-39.pyc | Bin 17208 -> 15877 bytes bclass.py | 50 ++++ contrast/__pycache__/config.cpython-39.pyc | Bin 1546 -> 1604 bytes .../__pycache__/feat_inference.cpython-39.pyc | Bin 10314 -> 11741 bytes .../__pycache__/one2n_contrast.cpython-39.pyc | Bin 9971 -> 11615 bytes contrast/feat_analysisi.py | 160 +++++++++++ .../__pycache__/config.cpython-39.pyc | Bin 0 -> 1620 bytes .../__pycache__/inference.cpython-39.pyc | Bin 0 -> 12007 bytes .../checkpoints/resnet18_0515/best.rknn | Bin contrast/{ => feat_extract}/config.py | 8 +- .../inference.py} | 219 +++++++++++---- contrast/{ => feat_extract}/model/BAM.py | 0 contrast/{ => feat_extract}/model/CBAM.py | 0 contrast/{ => feat_extract}/model/Tool.py | 0 contrast/{ => feat_extract}/model/__init__.py | 0 .../model/__pycache__/BAM.cpython-38.pyc | Bin .../model/__pycache__/CBAM.cpython-38.pyc | Bin .../model/__pycache__/CBAM.cpython-39.pyc | Bin .../model/__pycache__/Tool.cpython-38.pyc | Bin .../model/__pycache__/Tool.cpython-39.pyc | Bin .../__pycache__/__init__.cpython-310.pyc | Bin .../model/__pycache__/__init__.cpython-38.pyc | Bin .../model/__pycache__/__init__.cpython-39.pyc | Bin .../__pycache__/fmobilenet.cpython-310.pyc | Bin .../__pycache__/fmobilenet.cpython-38.pyc | Bin .../__pycache__/fmobilenet.cpython-39.pyc | Bin .../model/__pycache__/lcnet.cpython-38.pyc | Bin .../model/__pycache__/lcnet.cpython-39.pyc | Bin .../model/__pycache__/loss.cpython-38.pyc | Bin .../model/__pycache__/loss.cpython-39.pyc | Bin .../model/__pycache__/metric.cpython-38.pyc | Bin .../model/__pycache__/metric.cpython-39.pyc | Bin .../__pycache__/mobilenet_v1.cpython-38.pyc | Bin .../__pycache__/mobilenet_v1.cpython-39.pyc | Bin .../__pycache__/mobilenet_v2.cpython-38.pyc | Bin .../__pycache__/mobilenet_v2.cpython-39.pyc | Bin 5856 -> 5858 bytes .../__pycache__/mobilenet_v3.cpython-38.pyc | Bin .../__pycache__/mobilenet_v3.cpython-39.pyc | Bin 0 -> 6592 bytes .../__pycache__/mobilevit.cpython-310.pyc | Bin .../__pycache__/mobilevit.cpython-38.pyc | Bin .../__pycache__/mobilevit.cpython-39.pyc | Bin 0 -> 8228 bytes .../model/__pycache__/resbam.cpython-38.pyc | Bin .../model/__pycache__/resbam.cpython-39.pyc | Bin 0 -> 4248 bytes .../model/__pycache__/resnet.cpython-310.pyc | Bin .../model/__pycache__/resnet.cpython-38.pyc | Bin .../__pycache__/resnet_face.cpython-38.pyc | Bin .../__pycache__/resnet_face.cpython-39.pyc | Bin .../__pycache__/resnet_pre.cpython-38.pyc | Bin .../__pycache__/resnet_pre.cpython-39.pyc | Bin 13897 -> 13899 bytes .../model/__pycache__/utils.cpython-38.pyc | Bin .../model/__pycache__/utils.cpython-39.pyc | Bin .../{ => feat_extract}/model/fmobilenet.py | 0 contrast/{ => feat_extract}/model/lcnet.py | 0 contrast/{ => feat_extract}/model/loss.py | 0 contrast/{ => feat_extract}/model/metric.py | 0 .../{ => feat_extract}/model/mobilenet_v1.py | 0 .../{ => feat_extract}/model/mobilenet_v2.py | 2 +- .../{ => feat_extract}/model/mobilenet_v3.py | 2 +- .../{ => feat_extract}/model/mobilevit.py | 5 +- contrast/{ => feat_extract}/model/resbam.py | 7 +- contrast/{ => feat_extract}/model/resnet.py | 0 .../{ => feat_extract}/model/resnet_face.py | 0 .../model/resnet_pre.py | 2 +- contrast/{ => feat_extract}/model/utils.py | 0 contrast/{ => feat_extract}/model/vit.py | 0 .../resnet_vit/.idea/.gitignore | 0 .../resnet_vit/.idea/contrastInference.iml | 0 .../resnet_vit/.idea/deployment.xml | 0 .../inspectionProfiles/Project_Default.xml | 0 .../inspectionProfiles/profiles_settings.xml | 0 .../resnet_vit/.idea/misc.xml | 0 .../resnet_vit/.idea/modules.xml | 0 .../{ => feat_extract}/resnet_vit/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin .../__pycache__/config.cpython-38.pyc | Bin .../__pycache__/config.cpython-39.pyc | Bin .../__pycache__/inference.cpython-39.pyc | Bin .../{ => feat_extract}/resnet_vit/config.py | 0 .../resnet_vit/inference.py | 0 .../resnet_vit/model/__init__.py | 0 .../model/__pycache__/__init__.cpython-38.pyc | Bin .../model/__pycache__/__init__.cpython-39.pyc | Bin .../__pycache__/resnet_pre.cpython-38.pyc | Bin .../__pycache__/resnet_pre.cpython-39.pyc | Bin .../resnet_vit}/model/resnet_pre.py | 0 contrast/genfeats.py | 93 +++---- .../__pycache__/mobilenet_v3.cpython-39.pyc | Bin 6590 -> 0 bytes .../__pycache__/mobilevit.cpython-39.pyc | Bin 8213 -> 0 bytes .../model/__pycache__/resbam.cpython-39.pyc | Bin 4264 -> 0 bytes contrast/one2n_contrast.py | 14 +- contrast/one2one_contrast.py | 7 +- contrast/one2one_onsite.py | 250 +++++++++++++++++- contrast/说明文档.txt | 0 event_time_specify.py | 66 +++-- imgs_inference.py | 13 +- move_detect.py | 16 +- pipeline.py | 37 ++- time_devide.py | 110 ++++++-- track_reid.py | 114 ++++---- tracking/module_analysis.py | 14 +- .../__pycache__/bot_sort.cpython-39.pyc | Bin 7149 -> 7196 bytes tracking/trackers/bot_sort.py | 19 +- .../utils/__pycache__/plotting.cpython-39.pyc | Bin 12924 -> 13489 bytes .../__pycache__/read_data.cpython-39.pyc | Bin 10496 -> 11930 bytes tracking/utils/read_data.py | 100 ++++--- tracking/说明文档.txt | 0 109 files changed, 1003 insertions(+), 305 deletions(-) create mode 100644 bclass.py create mode 100644 contrast/feat_analysisi.py create mode 100644 contrast/feat_extract/__pycache__/config.cpython-39.pyc create mode 100644 contrast/feat_extract/__pycache__/inference.cpython-39.pyc rename contrast/{ => feat_extract}/checkpoints/resnet18_0515/best.rknn (100%) rename contrast/{ => feat_extract}/config.py (94%) rename contrast/{feat_inference.py => feat_extract/inference.py} (71%) rename contrast/{ => feat_extract}/model/BAM.py (100%) rename contrast/{ => feat_extract}/model/CBAM.py (100%) rename contrast/{ => feat_extract}/model/Tool.py (100%) rename contrast/{ => feat_extract}/model/__init__.py (100%) rename contrast/{ => feat_extract}/model/__pycache__/BAM.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/CBAM.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/CBAM.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/Tool.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/Tool.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/__init__.cpython-310.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/__init__.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/__init__.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/fmobilenet.cpython-310.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/fmobilenet.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/fmobilenet.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/lcnet.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/lcnet.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/loss.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/loss.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/metric.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/metric.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/mobilenet_v1.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/mobilenet_v1.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/mobilenet_v2.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/mobilenet_v2.cpython-39.pyc (74%) rename contrast/{ => feat_extract}/model/__pycache__/mobilenet_v3.cpython-38.pyc (100%) create mode 100644 contrast/feat_extract/model/__pycache__/mobilenet_v3.cpython-39.pyc rename contrast/{ => feat_extract}/model/__pycache__/mobilevit.cpython-310.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/mobilevit.cpython-38.pyc (100%) create mode 100644 contrast/feat_extract/model/__pycache__/mobilevit.cpython-39.pyc rename contrast/{ => feat_extract}/model/__pycache__/resbam.cpython-38.pyc (100%) create mode 100644 contrast/feat_extract/model/__pycache__/resbam.cpython-39.pyc rename contrast/{ => feat_extract}/model/__pycache__/resnet.cpython-310.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/resnet.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/resnet_face.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/resnet_face.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/resnet_pre.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/resnet_pre.cpython-39.pyc (53%) rename contrast/{ => feat_extract}/model/__pycache__/utils.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/model/__pycache__/utils.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/model/fmobilenet.py (100%) rename contrast/{ => feat_extract}/model/lcnet.py (100%) rename contrast/{ => feat_extract}/model/loss.py (100%) rename contrast/{ => feat_extract}/model/metric.py (100%) rename contrast/{ => feat_extract}/model/mobilenet_v1.py (100%) rename contrast/{ => feat_extract}/model/mobilenet_v2.py (99%) rename contrast/{ => feat_extract}/model/mobilenet_v3.py (99%) rename contrast/{ => feat_extract}/model/mobilevit.py (98%) rename contrast/{ => feat_extract}/model/resbam.py (97%) rename contrast/{ => feat_extract}/model/resnet.py (100%) rename contrast/{ => feat_extract}/model/resnet_face.py (100%) rename contrast/{resnet_vit => feat_extract}/model/resnet_pre.py (99%) rename contrast/{ => feat_extract}/model/utils.py (100%) rename contrast/{ => feat_extract}/model/vit.py (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/.gitignore (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/contrastInference.iml (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/deployment.xml (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/inspectionProfiles/Project_Default.xml (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/inspectionProfiles/profiles_settings.xml (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/misc.xml (100%) rename contrast/{ => feat_extract}/resnet_vit/.idea/modules.xml (100%) rename contrast/{ => feat_extract}/resnet_vit/__init__.py (100%) rename contrast/{ => feat_extract}/resnet_vit/__pycache__/__init__.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/__pycache__/config.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/__pycache__/config.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/__pycache__/inference.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/config.py (100%) rename contrast/{ => feat_extract}/resnet_vit/inference.py (100%) rename contrast/{ => feat_extract}/resnet_vit/model/__init__.py (100%) rename contrast/{ => feat_extract}/resnet_vit/model/__pycache__/__init__.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/model/__pycache__/__init__.cpython-39.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/model/__pycache__/resnet_pre.cpython-38.pyc (100%) rename contrast/{ => feat_extract}/resnet_vit/model/__pycache__/resnet_pre.cpython-39.pyc (100%) rename contrast/{ => feat_extract/resnet_vit}/model/resnet_pre.py (100%) delete mode 100644 contrast/model/__pycache__/mobilenet_v3.cpython-39.pyc delete mode 100644 contrast/model/__pycache__/mobilevit.cpython-39.pyc delete mode 100644 contrast/model/__pycache__/resbam.cpython-39.pyc delete mode 100644 contrast/说明文档.txt delete mode 100644 tracking/说明文档.txt diff --git a/__pycache__/event_time_specify.cpython-39.pyc b/__pycache__/event_time_specify.cpython-39.pyc index f810d6490fcd8da36b92059c382e225dd7b902a8..dd446796863f33e44dfb74b56c496309ece42f97 100644 GIT binary patch delta 1875 zcmb_dU1%Id9H0N}?(N6j?QQP%?sC_pNmC1kP;AnQP$D9hQbg)Q#RqK(A#;~pV$x)9 z`vtR}zfNR_y3;X z%>UzFAN=Y;do-Q42z~=SJH{{fe{2^hl*Jb6gDcL{uc3SK8RaU#eTzx$X9adG{$U&g z*db=E$xJtT8Mq$9RsW8P6^k`|I;nA$C#sYwOg&A*1WMEv1V)VnCN9g@IdF|BMbf0Z z$O0UQf+SCJ=p;cZ_Eva`C+BI2Fil1X(!RmdO$cmmhh~ca;r67piyZhQ$neZ$az726 zpu6NxC?qGLN6lpMrVw@gdhxFT0N9!!W=VN@*XFA!b?qH%9I*&tB>}7 z9Na#4FN41iUVyn1bFXqUbXx@PyazK?4mMzp6`B7km6gFLX1I%&c^BSb146^Z4U@PI zblxS-rE(cMcNAaLsM39;-#qk#_$c*c!|KH^-u8^nuv;&GzWl=R+c(a~5~U)hZf(4QAQ=_kZ&dZ;%!ftW^oZ***`9+|cJNZlXxYh#gC^DEQ! z{%&zOz4Lx)vk&E!$efN%ch^{?ODPiGR*V>_HFk8H_%*$CW296E2XPx3!XWG@((kK;6m_8tWvU|YfGL)c9 zNzrnfaukX>7i~6D?|F+0pZ;=Z$_RpjLI<&FBiTP|wDj7+hKW z)_DN(1#bdhI?|6+YU2}rJI2sL{Rz7bz$w?nx2OZGzmTZHa$sEWS)IXERg&G*Ca z;-~!fp3l&E4AHbq|JJ@8Q%+$?oWD`rShuW zPT>}rM`|-8M{3NUh%fBDB8A$Re{8nmJuaCxJZ3)l-T zvINu|O(`lCw~a-P3oOOEF3uFY;G+1TIM6*Wos!cB4_8K5#jlL{9u_i*l=`u{_n!Ez nIPA#6kKuapO|FYaIv*~{-oj2XOhY#u<56R;HDvS{IRpLz1I^PK delta 1400 zcmZ`&-)me&6rOYD{+N4r_wMf9O*gx?))u3zp;!$nNCZVuky0NDKG@0q`QpCUhfvk`Ae7<(nu8)4kPVLPkPr;x*dw83(M{Z zq+4f$KBUDXU7}?;bb+*_in=%~>Cy=3*JTP`*5V`Bg5<0!=<)!xu(nyY+BlHvY#1Nh zj2_%cu6-RyKFOrt!C98+Whucby<0t{#jrABRLk3xd7M_L2i$h0gCsc;srsspb(NB- z3@Cg1F6)!8s~wcw_Gjo>-w~w#7W5MBUtmpf<(&DY@UHnRI*HAyxgDKzc>BZk?c$7Z zyJ~)Ay*Xhn6km>3R5I6IezPl+GX#&hT|8r;^kV<2#cGxg#vRCmgLxE?$0{_?!I(|~ z!V4kqgwAO=4H4#{gbgf_gmhL(d)!YHy>D|H<#1Ul__Q-BG>|a~DW~mdCJ7DL#b!6gpIWwJC&oZD3m!Hi<m6t-n#NMTIj%dyL~kFsZENVQM3-8_LYl}VB< zIX^EgGhLJM7N1*cVo9-QUP)?ET4HkQW?q&sCT?q>F`q$ZRjE%FB>79|87=PdB?=fz{tQ*#0VmoHcP1s zGqOS0lZ`b@7@0O_Xb3ZM{|CCJ2&|52bDO3yBR5zHL}2m}EoBIw1!Bf0EgMG0uF3j3 zzKpz+Yjsk&c|qb_AmZ=jw>pxHJd@dVRYlhW1&YC8#>B?R0ft2alO1)%8QCUB>Si*s zZa%CV&*&=y46Kr(#NraYG+S7dd~m= delta 480 zcmZ{gy-Ooe6vcBUV-lUo1U4uxt{)h~Iw6xNX4xjLu(5Co1qBsjF$u{t4r(G#L2R^G z*zK0U-O64Nw2@bBqYzx!POJp~1PdEG3F>@c>3eXv_s8Mh%W0LaOIkS^?Fu+=x!qH1 zn&(;r@jL=mRJF~?t#8FC1X!L;i6)rT8(m=Lv{~O}e63tzI_^T1Mt#k$2~A#-kRuj4 z!x#DxzQqLHhyTD7hmo5gX2ra^0vw3b=qKPO{nz%&i@wHp; z#GWV*v}6=%BvHUMttbAXErv%PB<01qlLz1kMBnE)LViuT(HtP`(KwW6*W&pge(4iX zJc|$LUn=4EL4U?$Di8divGgodI!H4`b$O>NZF)$5ghCM`X`DD<#|udcA>w@=bC@p8 zal_fCn|EQ$sx~T?#XG2I*pS7QVPQ47%gdDwyI#w91>-vz&g`lumi?9^A9Q9E``_{U n3G*S>)8*!0@FJ(}?4Z(iAop&L(NT6$kyNNs1Ttiap0YEq+5&>Y diff --git a/__pycache__/move_detect.cpython-39.pyc b/__pycache__/move_detect.cpython-39.pyc index 2565888b5810c8b9bd1a557d0b6cd0e2e69958a3..02e5739f093cbb913593a6f50d283b07b050a86c 100644 GIT binary patch delta 1210 zcmY*YOK2Nc6n*c_N28H6vZP3|lLlI1LX?kjl#n)U@uD?#TRS17t0-|~*;kfEvNHCY zF>YW)Tk7uGLi*B0p%l9mN^CbKmdI zo&P4USDi*CV>5iRsgtcA_g!=DoS(x{lhrt|nt(kZK-=Us4T@lZiA;wCSevY7KnZL} zp<+TBGN>fLfh8-Cu0s>i8f7;JWM^LTka*WJGYjx54wCT$!bvyM9uc*27nZo~7 zw3cYcmyfM}O~3J(2w8`L1`NbkVp)u_z7}es7-fAu;2p80g*xythNzFRWwFis#;$I> zqMN(=FyGwCPweW${Fk~F8X>QCnfH5WhCGgmooG?)C-G>ye+$uoM3-?ECb9mOx|(@i z{gfHc9K)Mb?D)>|ZS{BNx^;pSF6UI;IX&_|4&;Xfvji8^O}{EYb#(bzt_ zfb=d68weFcx)>tcUtg>Tva!_lC6yscwHsGpM~Tw0Q}20!>s`Sq)NAoP*;Bvd-z-rh zGhu2DPt&VgJS|MFp5)(3O;c)ojgQqtVU+(hm?=EtAH-i^4|(*{%4LH1?>I>;ZfSGa z(#hf8F8H#IUZe+g7bLZ`oT2L)Eu{abABumBcSwA-WKr^6zZoofz16A5xvRk_7+_+ig9Y{~a}C%8Nf<)K zgcPJvvA}_0j5cIo1Y-iSr`Tk^|0#bWO0MY#7rj~-8GaD9+OFjX(yuRvZr{?cYJ6A! zSL+WkK8|}!hp>Yn2wB2TL}dK9>`6~fsQt;4Q+s0taJ6z|HWy{X1G$Mx_rykBwyv}z z0im2$z2yJ-2~;O_St8S_x0hN!d4c>={X2A>kE;`@d8f+JdjBL;FZJ2ayu(%)Xuv>R z6E#s{UC|L8USwS@uA7B45^n`P2A#LeM2`s(2Wg!P;ai+n;ZI|{=IH>@R-XD z*1FR%z>1@}9xaMp8$V4C9v}^{8;rA#jc1)uzofVEvid7MVNc<|OeSPWJx$-_Gpgwv z%p5{Veor_;IIUh53;oB=ea?5NYngdoQO`1`934Fx-{A<3sQn{j;~hTBE;wEM-!*K9 zTb#4Y+d&7h%ES%V4a~j{gE#!F&5f4?nIBMRhJ8F zd6<;CY8DFz9>yjDFQ|qgN(NV!DxqAgHUfEwgj77KG+UwHy0m_cvZjvbzR0G~XTsDR zp3-a_S95A4n^V2q*w8oV$jyW~^*mSP|MlPGUh{Ys4k(S6^)ZW-UEEtfL)uxwIl@*#lW>VZ+efJ&Tnznc(+ihdAbq;x gtt<8 diff --git a/__pycache__/track_reid.cpython-39.pyc b/__pycache__/track_reid.cpython-39.pyc index c565e610257314fffd4bdb229253c7b00cda1a61..47bda467f70165b05197cdc949ff37edbf5a9c88 100644 GIT binary patch delta 4894 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 delta 6135 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 delta 588 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 delta 4619 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 thresh[0]) + indices = list(zip(rows, cols)) + + + if len(indices): + savepath = os.path.join(savepath, barcode) + if not os.path.exists(savepath): + os.makedirs (savepath) + + + for idx1, idx2 in indices: + if len(imgpaths) == 1: + img1 = cv2.imread(imgpaths[0][idx1]) + img2 = cv2.imread(imgpaths[0][idx2]) + elif len(imgpaths) == 2: + img1 = cv2.imread(imgpaths[0][idx1]) + img2 = cv2.imread(imgpaths[1][idx2]) + + + + simi = matrix[idx1, idx2] + + H1, W1 = img1.shape[:2] + H2, W2 = img2.shape[:2] + H, W = max((H1, H2)), max((W1, W2)) + img = np.ones((H, 2*W, 3), dtype=np.uint8) *np.array([255, 128, 128]) + + img[0:H1, 0:W1, :] = img1 + img[0:H2, (2*W-W2):, :] = img2 + + text = f"sim: {simi:.2f}" + org = (10, H-10) + cv2.putText(img, text, org, fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.75, + color=(0, 0, 255), thickness=2, lineType=cv2.LINE_AA) + imgpath = os.path.join(savepath, f"{simi:.2f}_{barcode}_{idx1}_{idx2}.png") + cv2.imwrite(imgpath, img) + + + +def feat_analysis(featpath): + savepath = r"D:\exhibition\result\stdfeat" + + InterThresh = (0.4, 0.6) + + featDict, features= [], [] + for filename in os.listdir(featpath): + file, ext = os.path.splitext(filename) + if ext != ".pickle": continue + + filepath = os.path.join(featpath, filename) + with open(filepath, 'rb') as f: + bpDict = pickle.load(f) + + feat = bpDict["feats_ft32"] + + featDict.append(bpDict) + features.append(feat) + N = len(features) + + simMatrix = [] + intra_simi = np.empty(0) + low_simi_index = {} + for i, feats in enumerate(features): + matrix = 1 - cdist(feats, feats, 'cosine') + + simMatrix.append(matrix) + + '''提取相似矩阵上三角元素''' + rows, cols = np.triu_indices(matrix.shape[0], k=1) # k=1 表示不包括对角线 + upper_tri= matrix[rows, cols] + intra_simi = np.concatenate((intra_simi, upper_tri)) + + '''保存相似度小于阈值的图像对''' + barcode = featDict[i]["barcode"] + imgpaths = featDict[i]["imgpaths"] + # save_imgpairs(barcode, [imgpaths], matrix, savepath, InterThresh, "intra") + print(f"{barcode} have done!") + + Matrix = np.zeros((N, N)) + inter_bcds = [] + inter_simi = np.empty(0) + for i, feati in enumerate(features): + bcdi = featDict[i]["barcode"] + imgpathi = featDict[i]["imgpaths"] + for j, featj in enumerate(features): + bcdj = featDict[j]["barcode"] + imgpathj = featDict[j]["imgpaths"] + + matrix = 1 - cdist(feati, featj, 'cosine') + + inter_bcds.append((i, j, bcdi, bcdj)) + Matrix[i, j] = np.mean(matrix) + if j>i: + bcd_ij = bcdi+'_'+bcdj + # save_imgpairs(bcd_ij, [imgpathi, imgpathj], matrix, savepath, InterThresh, "inter") + inter_simi = np.concatenate((inter_simi, matrix.ravel())) + + print(f"{bcd_ij} have done!") + + fig, axs = plt.subplots(2, 1) + axs[0].hist(intra_simi, bins=100, color='blue', edgecolor='black', alpha=0.7) + axs[0].set_xlim(0, 1) + axs[0].set_xlabel('Performance') + axs[0].set_title("inter similarity") + + axs[1].hist(inter_simi, bins=100, color='green', edgecolor='black', alpha=0.7) + axs[1].set_xlim(0, 1) + axs[1].set_xlabel('Performance') + axs[1].set_title("inter similarity") + + + + + + print("Done!") + + + + + + + + +def main(): + stdpath = r"D:\exhibition\dataset\feats" + + feat_analysis(stdpath) + + +if __name__ == '__main__': + main() + + + + + + + + + \ No newline at end of file diff --git a/contrast/feat_extract/__pycache__/config.cpython-39.pyc b/contrast/feat_extract/__pycache__/config.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd9fad2fc819917bc8ce6607dbd2215d2120ab2c GIT binary patch literal 1620 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 literal 0 HcmV?d00001 diff --git a/contrast/checkpoints/resnet18_0515/best.rknn b/contrast/feat_extract/checkpoints/resnet18_0515/best.rknn similarity index 100% rename from contrast/checkpoints/resnet18_0515/best.rknn rename to contrast/feat_extract/checkpoints/resnet18_0515/best.rknn diff --git a/contrast/config.py b/contrast/feat_extract/config.py similarity index 94% rename from contrast/config.py rename to contrast/feat_extract/config.py index 4864cdb..3bb15c9 100644 --- a/contrast/config.py +++ b/contrast/feat_extract/config.py @@ -10,6 +10,8 @@ class Config: embedding_size = 256 drop_ratio = 0.5 img_size = 224 + + batch_size = 8 # data preprocess # input_shape = [1, 128, 128] @@ -58,7 +60,11 @@ class Config: testbackbone = 'resnet18' # [resnet18, mobilevit_s, mobilenet_v2, mobilenetv3_small, mobilenetv3_large, mobilenet_v1, PPLCNET_x1_0, PPLCNET_x0_5] test_val = "D:/比对/cl" # test_val = "./data/test_data_100" - test_model = "checkpoints/resnet18_0515/best.pth" + + # test_model = "checkpoints/best_resnet18_v11.pth" + test_model = "checkpoints/zhanting_cls22_v11.pth" + + train_batch_size = 512 # 256 test_batch_size = 256 # 256 diff --git a/contrast/feat_inference.py b/contrast/feat_extract/inference.py similarity index 71% rename from contrast/feat_inference.py rename to contrast/feat_extract/inference.py index 613a620..70ff84a 100644 --- a/contrast/feat_inference.py +++ b/contrast/feat_extract/inference.py @@ -3,30 +3,140 @@ @author: LiChen """ - - +# import pdb +# import shutil +import torch.nn as nn +# import statistics import os -import os.path as osp -import pdb import numpy as np -import shutil from scipy.spatial.distance import cdist import torch -import torch.nn as nn +import os.path as osp from PIL import Image import json -from config import config as conf -from model import resnet18 +import matplotlib.pyplot as plt +from pathlib import Path +# import sys +# sys.path.append(r"D:\DetectTracking") +# from contrast.config import config as conf +# from contrast.model import resnet18 + +from .config import config as conf +from .model import resnet18 # from model import (mobilevit_s, resnet14, resnet18, resnet34, resnet50, mobilenet_v2, # MobileNetV3_Small, mobilenet_v1, PPLCNET_x1_0, PPLCNET_x0_5, PPLCNET_x2_5) +curpath = Path(__file__).resolve().parents[0] + +class FeatsInterface: + def __init__(self, conf): + self.device = conf.device + + # if conf.backbone == 'resnet18': + # model = resnet18().to(conf.device) + + model = resnet18().to(conf.device) + self.transform = conf.test_transform + self.batch_size = conf.batch_size + self.embedding_size = conf.embedding_size + + if conf.test_model.find("zhanting") == -1: + model = nn.DataParallel(model).to(conf.device) + self.model = model + + modpath = os.path.join(curpath, conf.test_model) + self.model.load_state_dict(torch.load(modpath, map_location=conf.device)) + self.model.eval() + print('load model {} '.format(conf.testbackbone)) + + def inference(self, images, detections=None): + ''' + 如果是BGR,需要转变为RGB格式 + ''' + if isinstance(images, np.ndarray): + imgs, features = self.inference_image(images, detections) + return imgs, features + + batch_patches = [] + patches = [] + for i, img in enumerate(images): + img = img.copy() + patch = self.transform(img) + if str(self.device) != "cpu": + patch = patch.to(device=self.device).half() + else: + patch = patch.to(device=self.device) + + patches.append(patch) + if (i + 1) % self.batch_size == 0: + patches = torch.stack(patches, dim=0) + batch_patches.append(patches) + patches = [] + + if len(patches): + patches = torch.stack(patches, dim=0) + batch_patches.append(patches) + + features = np.zeros((0, self.embedding_size)) + for patches in batch_patches: + pred=self.model(patches) + pred[torch.isinf(pred)] = 1.0 + feat = pred.cpu().data.numpy() + features = np.vstack((features, feat)) + return features + + def inference_image(self, image, detections): + H, W, _ = np.shape(image) + + batch_patches = [] + patches = [] + imgs = [] + for d in range(np.size(detections, 0)): + tlbr = detections[d, :4].astype(np.int_) + tlbr[0] = max(0, tlbr[0]) + tlbr[1] = max(0, tlbr[1]) + tlbr[2] = min(W - 1, tlbr[2]) + tlbr[3] = min(H - 1, tlbr[3]) + img = image[tlbr[1]:tlbr[3], tlbr[0]:tlbr[2], :] + + imgs.append(img) + + + img1 = img[:, :, ::-1].copy() # the model expects RGB inputs + patch = self.transform(img1) + + # patch = patch.to(device=self.device).half() + if str(self.device) != "cpu": + patch = patch.to(device=self.device).half() + else: + patch = patch.to(device=self.device) + + patches.append(patch) + if (d + 1) % self.batch_size == 0: + patches = torch.stack(patches, dim=0) + batch_patches.append(patches) + patches = [] + + if len(patches): + patches = torch.stack(patches, dim=0) + batch_patches.append(patches) + + features = np.zeros((0, self.embedding_size)) + for patches in batch_patches: + pred = self.model(patches) + pred[torch.isinf(pred)] = 1.0 + feat = pred.cpu().data.numpy() + features = np.vstack((features, feat)) + + return imgs, features + + + + + + -import matplotlib.pyplot as plt -import statistics -embedding_size = conf.embedding_size -img_size = conf.img_size -device = conf.device def unique_image(pair_list) -> set: @@ -102,38 +212,38 @@ def featurize(images: list, transform, net, device, train=False) -> dict: res = {img: feature for (img, feature) in zip(images, features)} return res -def inference_image(images: list, transform, net, device, bs=16, embedding_size=256) -> dict: - batch_patches = [] - patches = [] - for d, img in enumerate(images): - img = Image.open(img) - patch = transform(img) +# def inference_image(images: list, transform, net, device, bs=16, embedding_size=256) -> dict: +# batch_patches = [] +# patches = [] +# for d, img in enumerate(images): +# img = Image.open(img) +# patch = transform(img) - if str(device) != "cpu": - patch = patch.to(device).half() - else: - patch = patch.to(device) +# if str(device) != "cpu": +# patch = patch.to(device).half() +# else: +# patch = patch.to(device) - patches.append(patch) - if (d + 1) % bs == 0: - patches = torch.stack(patches, dim=0) - batch_patches.append(patches) - patches = [] +# patches.append(patch) +# if (d + 1) % bs == 0: +# patches = torch.stack(patches, dim=0) +# batch_patches.append(patches) +# patches = [] - if len(patches): - patches = torch.stack(patches, dim=0) - batch_patches.append(patches) +# if len(patches): +# patches = torch.stack(patches, dim=0) +# batch_patches.append(patches) - features = np.zeros((0, embedding_size), dtype=np.float32) - for patches in batch_patches: - pred = net(patches) - pred[torch.isinf(pred)] = 1.0 - feat = pred.cpu().data.numpy() - features = np.vstack((features, feat)) +# features = np.zeros((0, embedding_size), dtype=np.float32) +# for patches in batch_patches: +# pred = net(patches) +# pred[torch.isinf(pred)] = 1.0 +# feat = pred.cpu().data.numpy() +# features = np.vstack((features, feat)) - return features +# return features @@ -283,6 +393,7 @@ def compute_contrast_accuracy(content_list_read): npairs = min((len(same_folder_pairs), len(cross_folder_pairs))) + Encoder = FeatsInterface(conf) same_pairs = same_folder_pairs[:npairs] cross_pairs = cross_folder_pairs[:npairs] @@ -292,8 +403,8 @@ def compute_contrast_accuracy(content_list_read): images_a = [osp.join(conf.test_val, img) for img in same_pairs[i][0]] images_b = [osp.join(conf.test_val, img) for img in same_pairs[i][1]] - feats_a = inference_image(images_a, conf.test_transform, model, conf.device) - feats_b = inference_image(images_b, conf.test_transform, model, conf.device) + feats_a = Encoder.inference(images_a) + feats_b = Encoder.inference(images_b) # matrix = 1- np.maximum(0.0, cdist(feats_a, feats_b, 'cosine')) matrix = 1 - cdist(feats_a, feats_b, 'cosine') @@ -324,8 +435,8 @@ def compute_contrast_accuracy(content_list_read): images_a = [osp.join(conf.test_val, img) for img in cross_pairs[i][0]] images_b = [osp.join(conf.test_val, img) for img in cross_pairs[i][1]] - feats_a = inference_image(images_a, conf.test_transform, model, conf.device) - feats_b = inference_image(images_b, conf.test_transform, model, conf.device) + feats_a = Encoder.inference(images_a) + feats_b = Encoder.inference(images_b) # matrix = 1- np.maximum(0.0, cdist(feats_a, feats_b, 'cosine')) matrix = 1 - cdist(feats_a, feats_b, 'cosine') @@ -407,28 +518,28 @@ if __name__ == '__main__': # Network Setup if conf.testbackbone == 'resnet18': - # model = ResIRSE(img_size, embedding_size, conf.drop_ratio).to(device) - model = resnet18().to(device) + # model = ResIRSE(conf.img_size, conf.embedding_size, conf.drop_ratio).to(conf.device) + model = resnet18().to(conf.device) # elif conf.testbackbone == 'resnet34': - # model = resnet34().to(device) + # model = resnet34().to(conf.device) # elif conf.testbackbone == 'resnet50': - # model = resnet50().to(device) + # model = resnet50().to(conf.device) # elif conf.testbackbone == 'mobilevit_s': - # model = mobilevit_s().to(device) + # model = mobilevit_s().to(conf.device) # elif conf.testbackbone == 'mobilenetv3': - # model = MobileNetV3_Small().to(device) + # model = MobileNetV3_Small().to(conf.device) # elif conf.testbackbone == 'mobilenet_v1': - # model = mobilenet_v1().to(device) + # model = mobilenet_v1().to(conf.device) # elif conf.testbackbone == 'PPLCNET_x1_0': - # model = PPLCNET_x1_0().to(device) + # model = PPLCNET_x1_0().to(conf.device) # elif conf.testbackbone == 'PPLCNET_x0_5': - # model = PPLCNET_x0_5().to(device) + # model = PPLCNET_x0_5().to(conf.device) # elif conf.backbone == 'PPLCNET_x2_5': - # model = PPLCNET_x2_5().to(device) + # model = PPLCNET_x2_5().to(conf.device) # elif conf.testbackbone == 'mobilenet_v2': - # model = mobilenet_v2().to(device) + # model = mobilenet_v2().to(conf.device) # elif conf.testbackbone == 'resnet14': - # model = resnet14().to(device) + # model = resnet14().to(conf.device) else: raise ValueError('Have not model {}'.format(conf.backbone)) diff --git a/contrast/model/BAM.py b/contrast/feat_extract/model/BAM.py similarity index 100% rename from contrast/model/BAM.py rename to contrast/feat_extract/model/BAM.py diff --git a/contrast/model/CBAM.py b/contrast/feat_extract/model/CBAM.py similarity index 100% rename from contrast/model/CBAM.py rename to contrast/feat_extract/model/CBAM.py diff --git a/contrast/model/Tool.py b/contrast/feat_extract/model/Tool.py similarity index 100% rename from contrast/model/Tool.py rename to contrast/feat_extract/model/Tool.py diff --git a/contrast/model/__init__.py b/contrast/feat_extract/model/__init__.py similarity index 100% rename from contrast/model/__init__.py rename to contrast/feat_extract/model/__init__.py diff --git a/contrast/model/__pycache__/BAM.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/BAM.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/BAM.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/BAM.cpython-38.pyc diff --git a/contrast/model/__pycache__/CBAM.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/CBAM.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/CBAM.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/CBAM.cpython-38.pyc diff --git a/contrast/model/__pycache__/CBAM.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/CBAM.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/CBAM.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/CBAM.cpython-39.pyc diff --git a/contrast/model/__pycache__/Tool.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/Tool.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/Tool.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/Tool.cpython-38.pyc diff --git a/contrast/model/__pycache__/Tool.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/Tool.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/Tool.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/Tool.cpython-39.pyc diff --git a/contrast/model/__pycache__/__init__.cpython-310.pyc b/contrast/feat_extract/model/__pycache__/__init__.cpython-310.pyc similarity index 100% rename from contrast/model/__pycache__/__init__.cpython-310.pyc rename to contrast/feat_extract/model/__pycache__/__init__.cpython-310.pyc diff --git a/contrast/model/__pycache__/__init__.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/__init__.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/__init__.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/__init__.cpython-38.pyc diff --git a/contrast/model/__pycache__/__init__.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/__init__.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/__init__.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/__init__.cpython-39.pyc diff --git a/contrast/model/__pycache__/fmobilenet.cpython-310.pyc b/contrast/feat_extract/model/__pycache__/fmobilenet.cpython-310.pyc similarity index 100% rename from contrast/model/__pycache__/fmobilenet.cpython-310.pyc rename to contrast/feat_extract/model/__pycache__/fmobilenet.cpython-310.pyc diff --git a/contrast/model/__pycache__/fmobilenet.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/fmobilenet.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/fmobilenet.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/fmobilenet.cpython-38.pyc diff --git a/contrast/model/__pycache__/fmobilenet.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/fmobilenet.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/fmobilenet.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/fmobilenet.cpython-39.pyc diff --git a/contrast/model/__pycache__/lcnet.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/lcnet.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/lcnet.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/lcnet.cpython-38.pyc diff --git a/contrast/model/__pycache__/lcnet.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/lcnet.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/lcnet.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/lcnet.cpython-39.pyc diff --git a/contrast/model/__pycache__/loss.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/loss.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/loss.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/loss.cpython-38.pyc diff --git a/contrast/model/__pycache__/loss.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/loss.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/loss.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/loss.cpython-39.pyc diff --git a/contrast/model/__pycache__/metric.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/metric.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/metric.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/metric.cpython-38.pyc diff --git a/contrast/model/__pycache__/metric.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/metric.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/metric.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/metric.cpython-39.pyc diff --git a/contrast/model/__pycache__/mobilenet_v1.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/mobilenet_v1.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/mobilenet_v1.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/mobilenet_v1.cpython-38.pyc diff --git a/contrast/model/__pycache__/mobilenet_v1.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/mobilenet_v1.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/mobilenet_v1.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/mobilenet_v1.cpython-39.pyc diff --git a/contrast/model/__pycache__/mobilenet_v2.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/mobilenet_v2.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/mobilenet_v2.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/mobilenet_v2.cpython-38.pyc diff --git a/contrast/model/__pycache__/mobilenet_v2.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/mobilenet_v2.cpython-39.pyc similarity index 74% rename from contrast/model/__pycache__/mobilenet_v2.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/mobilenet_v2.cpython-39.pyc index d782cd04277a09eb12cb2f0ab368a6060c2127af..1680304e89ae4ba85670c8ad1a614b004b48537a 100644 GIT binary patch delta 337 zcmaE$`$(5Jk(ZZ?0SJ7}Y|^bJ@>(BFF_V-GTvg!%X`TPVMTf03+MvOfh3Nc93R{$&1A700yZ`qyPW_ delta 359 zcmaE)`#_gBk(ZZ?0SLDH8#A6a09}6-uy=0pFjmcj2s{v5l#VY36 z`YBJ>?~F;#&nqcPEG~)9OD!o$-R#dS$jHdCIgw=n6OdwJFJ)q6+g!o9gT;sgsI3S@ zXtEU9f!H=6LKsc-r2|mlB@0+|auT05Bgf=EzDgj;!5;uLDUyFLGmsJ&mSU1;2Py(O zm7}02KfNfmxY!NIVJj{v%1kcN*#Q99 CGgfl| diff --git a/contrast/model/__pycache__/mobilenet_v3.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/mobilenet_v3.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/mobilenet_v3.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/mobilenet_v3.cpython-38.pyc diff --git a/contrast/feat_extract/model/__pycache__/mobilenet_v3.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/mobilenet_v3.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30ed788d23e86b4c6cefaefae584040cfb1a0c65 GIT binary patch literal 6592 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 Bc$WYG literal 0 HcmV?d00001 diff --git a/contrast/model/__pycache__/mobilevit.cpython-310.pyc b/contrast/feat_extract/model/__pycache__/mobilevit.cpython-310.pyc similarity index 100% rename from contrast/model/__pycache__/mobilevit.cpython-310.pyc rename to contrast/feat_extract/model/__pycache__/mobilevit.cpython-310.pyc diff --git a/contrast/model/__pycache__/mobilevit.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/mobilevit.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/mobilevit.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/mobilevit.cpython-38.pyc diff --git a/contrast/feat_extract/model/__pycache__/mobilevit.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/mobilevit.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dc81724e73dcdb60ad814f19620a5dbf3623631 GIT binary patch literal 8228 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 Q{iB17t84zpQabegUq&*3rT_o{ literal 0 HcmV?d00001 diff --git a/contrast/model/__pycache__/resbam.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/resbam.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/resbam.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/resbam.cpython-38.pyc diff --git a/contrast/feat_extract/model/__pycache__/resbam.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/resbam.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55f08d730d584e9152221d12dea4a7bc21f49df3 GIT binary patch literal 4248 zcmZ`+TW=gm6|U;r^z>Y8j~(Z-*(~g`z$_53gH~u2mfYANl#I~ENN6xLov!j^#yvfg z>UJ*HSc)`}mKP(QctkdD`4c?wGwPKW{Khj#S-w-Zv47IT^5x;-7FzZX5WxgbShwi;(CS*82}{_CJ+!;F;hn@8x?PX6`%JjP zd(DI=twCjKcYR1I!iU5!B~?hOB7h_)C4s1k`fJv$$+~FlTk7wUois#KtcX>ydg^qW z?>w)(^Smkpu{P!1HMu66az(DSC#=Zu54xpwZ}x&08meP2F| zX=M3w%7^R|Fp_n-U|mb_t}Xnp*d7;-a9>xuj_^bUYj(e44(odOMpXxQMtPpdRL1*f zG>fu8I4?_3Pzjhn8kn5 zc6F_vhVhdqO=Xhl`sg5EJk|E4f;i0jhf;f4uKGf1=W##E&S-;ePgT$<+OVn;sSzR9 z)0J@~L_h7d-6b6wDRfAC=MC4DemYK~ShiQRn;nd$(ta5B(|#U?+DcRH-5sURwuN?M z^jo@iC(7d|osk+sWpk-G;m=*9%UdQcx?OS!;;uiWAZ}P+Sg@aw6 z9Yah`HoNH5soh1(UW34)Sjb>DiBS*%Cw4eua0eE3G1_w$$P8rG$NI!tX6d7sEdBA1BJ5vcb-+P3-t zo#rpJjbm3I(|{r0CUIqNq@G7gkZN`ngmKRba9+Xr8>boY!`9Ntl`pofB0k#{@~Jc$ zO88U|hA_@SLVP_8pB_X>F`_Qx3&v3Dd*F1Vv~?_#Bn+1p_YvvQ3KhjVd2~i->T}0x zHjOOCo0~ zII51R6n*%Nh!>@R!eyk@&IzX zl&_WY70B%+d8?GKLT)X|*RjS8v1Xk8LcTeL!-t!YT@ z*zbOGLT8m%I$ z89+LF1>G}b6A*l&^l|eZA|^^hiX@7-wxu0{Aze>LY0^(+q!61ujNtnB&)OfVRWQck zb+E_)szuUuA|`?_5NE=eLa>Nscp1}93~U3;f^O;R!|27YMxz9vTp30$#$a_V97g*x zOrn?*vjr2S+S-fp9TUbG z7N7OgERWI{sfjX&Zth3@A@Dd%ktd==d(UOR_axWV`)YJBrsSckfNFXt4~+?sqzn|f zkCRcnudAjD(*r1i6riv9P?^}DLzFqZAK@@EifaZK@^CxcD(?UKUK5~BfYsuc%Dc{e zz5x&;x%IUN*k9#`D@9b#A>WwuTvRB>!Y(luO>a!H12uN-yeoIB@m+~sIx z&iQk$I_H9d%WEff!crKF=5CbZRQy`SVYi#_Cf!?DrTQt6J49&Z>K>7w6ZxFTFF>@L zk5v2w_>n|;E>rbO2!Sl-$lIi4Tz=vAlpueLR;J~7LN=)wPe{{&@%zJOd8o6L%nO9` z)%R)I9}u}t#3e#ik|JZ746J@g+~Uh7_KZC#h1qu@p5G#T-NbQhfMC2nPi=(GA8l#!L zGr$OHpY_FZ=Md64R|gP$(7Nx^o3}tH(AD+1-vTP&!BimPp9Gu@&cok=JMs4HN95_I zs6^PK3|Z{TDwg;MOjt&!wq9(ZZKK`L738AvLB2I(wr31*zZhCFudysS)&W{Z84>j! zc4uz5(_w3AmveX8f%A88y6?D?@g$n;|2q+xVuY5FllZ*pDw4!Vtn-U_a!hk-gjHni zqG+4o2l*H$)3!Tm3nQ=_VUseDM8-q-kV_iJZu7#P3tu*y4Ke--EhA)MT+uUCs>2BB zI5f3gQP#bJg8B(Y+Z$@vD4BS@o~A{%Cd+DP2T51aW{Q~h9-91EM3z~KaX$KpIW2>% z0zX*z0V5j~Jux3SpVD~wSTk7!=KY(89eZL9r>;9wmxp% PYOVQ>j|_*~hn)WpN-~*z literal 0 HcmV?d00001 diff --git a/contrast/model/__pycache__/resnet.cpython-310.pyc b/contrast/feat_extract/model/__pycache__/resnet.cpython-310.pyc similarity index 100% rename from contrast/model/__pycache__/resnet.cpython-310.pyc rename to contrast/feat_extract/model/__pycache__/resnet.cpython-310.pyc diff --git a/contrast/model/__pycache__/resnet.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/resnet.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/resnet.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/resnet.cpython-38.pyc diff --git a/contrast/model/__pycache__/resnet_face.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/resnet_face.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/resnet_face.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/resnet_face.cpython-38.pyc diff --git a/contrast/model/__pycache__/resnet_face.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/resnet_face.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/resnet_face.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/resnet_face.cpython-39.pyc diff --git a/contrast/model/__pycache__/resnet_pre.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/resnet_pre.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/resnet_pre.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/resnet_pre.cpython-38.pyc diff --git a/contrast/model/__pycache__/resnet_pre.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/resnet_pre.cpython-39.pyc similarity index 53% rename from contrast/model/__pycache__/resnet_pre.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/resnet_pre.cpython-39.pyc index d99c1c87f5a8833257e4f699687df3f56d51da98..e2b72422ce681ac992e04ea14759ba3b356a82de 100644 GIT binary patch delta 3289 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 diff --git a/contrast/model/__pycache__/utils.cpython-38.pyc b/contrast/feat_extract/model/__pycache__/utils.cpython-38.pyc similarity index 100% rename from contrast/model/__pycache__/utils.cpython-38.pyc rename to contrast/feat_extract/model/__pycache__/utils.cpython-38.pyc diff --git a/contrast/model/__pycache__/utils.cpython-39.pyc b/contrast/feat_extract/model/__pycache__/utils.cpython-39.pyc similarity index 100% rename from contrast/model/__pycache__/utils.cpython-39.pyc rename to contrast/feat_extract/model/__pycache__/utils.cpython-39.pyc diff --git a/contrast/model/fmobilenet.py b/contrast/feat_extract/model/fmobilenet.py similarity index 100% rename from contrast/model/fmobilenet.py rename to contrast/feat_extract/model/fmobilenet.py diff --git a/contrast/model/lcnet.py b/contrast/feat_extract/model/lcnet.py similarity index 100% rename from contrast/model/lcnet.py rename to contrast/feat_extract/model/lcnet.py diff --git a/contrast/model/loss.py b/contrast/feat_extract/model/loss.py similarity index 100% rename from contrast/model/loss.py rename to contrast/feat_extract/model/loss.py diff --git a/contrast/model/metric.py b/contrast/feat_extract/model/metric.py similarity index 100% rename from contrast/model/metric.py rename to contrast/feat_extract/model/metric.py diff --git a/contrast/model/mobilenet_v1.py b/contrast/feat_extract/model/mobilenet_v1.py similarity index 100% rename from contrast/model/mobilenet_v1.py rename to contrast/feat_extract/model/mobilenet_v1.py diff --git a/contrast/model/mobilenet_v2.py b/contrast/feat_extract/model/mobilenet_v2.py similarity index 99% rename from contrast/model/mobilenet_v2.py rename to contrast/feat_extract/model/mobilenet_v2.py index d62f0cd..eec44d4 100644 --- a/contrast/model/mobilenet_v2.py +++ b/contrast/feat_extract/model/mobilenet_v2.py @@ -1,6 +1,6 @@ from torch import nn from .utils import load_state_dict_from_url -from config import config as conf +from ..config import config as conf __all__ = ['MobileNetV2', 'mobilenet_v2'] diff --git a/contrast/model/mobilenet_v3.py b/contrast/feat_extract/model/mobilenet_v3.py similarity index 99% rename from contrast/model/mobilenet_v3.py rename to contrast/feat_extract/model/mobilenet_v3.py index d69a5a0..953db51 100644 --- a/contrast/model/mobilenet_v3.py +++ b/contrast/feat_extract/model/mobilenet_v3.py @@ -7,7 +7,7 @@ import torch import torch.nn as nn import torch.nn.functional as F from torch.nn import init -from config import config as conf +from ..config import config as conf class hswish(nn.Module): diff --git a/contrast/model/mobilevit.py b/contrast/feat_extract/model/mobilevit.py similarity index 98% rename from contrast/model/mobilevit.py rename to contrast/feat_extract/model/mobilevit.py index f371ee9..c4a0824 100644 --- a/contrast/model/mobilevit.py +++ b/contrast/feat_extract/model/mobilevit.py @@ -2,7 +2,10 @@ import torch import torch.nn as nn from einops import rearrange -from config import config as conf + +# import sys +# sys.path.append(r"D:\DetectTracking") +from ..config import config as conf def conv_1x1_bn(inp, oup): diff --git a/contrast/model/resbam.py b/contrast/feat_extract/model/resbam.py similarity index 97% rename from contrast/model/resbam.py rename to contrast/feat_extract/model/resbam.py index 21395c3..15a88e6 100644 --- a/contrast/model/resbam.py +++ b/contrast/feat_extract/model/resbam.py @@ -1,7 +1,10 @@ -from model.CBAM import CBAM import torch import torch.nn as nn -from model.Tool import GeM as gem + +from .CBAM import CBAM +from .Tool import GeM as gem +# from model.CBAM import CBAM +# from model.Tool import GeM as gem class Bottleneck(nn.Module): diff --git a/contrast/model/resnet.py b/contrast/feat_extract/model/resnet.py similarity index 100% rename from contrast/model/resnet.py rename to contrast/feat_extract/model/resnet.py diff --git a/contrast/model/resnet_face.py b/contrast/feat_extract/model/resnet_face.py similarity index 100% rename from contrast/model/resnet_face.py rename to contrast/feat_extract/model/resnet_face.py diff --git a/contrast/resnet_vit/model/resnet_pre.py b/contrast/feat_extract/model/resnet_pre.py similarity index 99% rename from contrast/resnet_vit/model/resnet_pre.py rename to contrast/feat_extract/model/resnet_pre.py index 5e52ad9..3ea6441 100644 --- a/contrast/resnet_vit/model/resnet_pre.py +++ b/contrast/feat_extract/model/resnet_pre.py @@ -1,6 +1,6 @@ import torch import torch.nn as nn -from config import config as conf +from ..config import config as conf try: from torch.hub import load_state_dict_from_url diff --git a/contrast/model/utils.py b/contrast/feat_extract/model/utils.py similarity index 100% rename from contrast/model/utils.py rename to contrast/feat_extract/model/utils.py diff --git a/contrast/model/vit.py b/contrast/feat_extract/model/vit.py similarity index 100% rename from contrast/model/vit.py rename to contrast/feat_extract/model/vit.py diff --git a/contrast/resnet_vit/.idea/.gitignore b/contrast/feat_extract/resnet_vit/.idea/.gitignore similarity index 100% rename from contrast/resnet_vit/.idea/.gitignore rename to contrast/feat_extract/resnet_vit/.idea/.gitignore diff --git a/contrast/resnet_vit/.idea/contrastInference.iml b/contrast/feat_extract/resnet_vit/.idea/contrastInference.iml similarity index 100% rename from contrast/resnet_vit/.idea/contrastInference.iml rename to contrast/feat_extract/resnet_vit/.idea/contrastInference.iml diff --git a/contrast/resnet_vit/.idea/deployment.xml b/contrast/feat_extract/resnet_vit/.idea/deployment.xml similarity index 100% rename from contrast/resnet_vit/.idea/deployment.xml rename to contrast/feat_extract/resnet_vit/.idea/deployment.xml diff --git a/contrast/resnet_vit/.idea/inspectionProfiles/Project_Default.xml b/contrast/feat_extract/resnet_vit/.idea/inspectionProfiles/Project_Default.xml similarity index 100% rename from contrast/resnet_vit/.idea/inspectionProfiles/Project_Default.xml rename to contrast/feat_extract/resnet_vit/.idea/inspectionProfiles/Project_Default.xml diff --git a/contrast/resnet_vit/.idea/inspectionProfiles/profiles_settings.xml b/contrast/feat_extract/resnet_vit/.idea/inspectionProfiles/profiles_settings.xml similarity index 100% rename from contrast/resnet_vit/.idea/inspectionProfiles/profiles_settings.xml rename to contrast/feat_extract/resnet_vit/.idea/inspectionProfiles/profiles_settings.xml diff --git a/contrast/resnet_vit/.idea/misc.xml b/contrast/feat_extract/resnet_vit/.idea/misc.xml similarity index 100% rename from contrast/resnet_vit/.idea/misc.xml rename to contrast/feat_extract/resnet_vit/.idea/misc.xml diff --git a/contrast/resnet_vit/.idea/modules.xml b/contrast/feat_extract/resnet_vit/.idea/modules.xml similarity index 100% rename from contrast/resnet_vit/.idea/modules.xml rename to contrast/feat_extract/resnet_vit/.idea/modules.xml diff --git a/contrast/resnet_vit/__init__.py b/contrast/feat_extract/resnet_vit/__init__.py similarity index 100% rename from contrast/resnet_vit/__init__.py rename to contrast/feat_extract/resnet_vit/__init__.py diff --git a/contrast/resnet_vit/__pycache__/__init__.cpython-39.pyc b/contrast/feat_extract/resnet_vit/__pycache__/__init__.cpython-39.pyc similarity index 100% rename from contrast/resnet_vit/__pycache__/__init__.cpython-39.pyc rename to contrast/feat_extract/resnet_vit/__pycache__/__init__.cpython-39.pyc diff --git a/contrast/resnet_vit/__pycache__/config.cpython-38.pyc b/contrast/feat_extract/resnet_vit/__pycache__/config.cpython-38.pyc similarity index 100% rename from contrast/resnet_vit/__pycache__/config.cpython-38.pyc rename to contrast/feat_extract/resnet_vit/__pycache__/config.cpython-38.pyc diff --git a/contrast/resnet_vit/__pycache__/config.cpython-39.pyc b/contrast/feat_extract/resnet_vit/__pycache__/config.cpython-39.pyc similarity index 100% rename from contrast/resnet_vit/__pycache__/config.cpython-39.pyc rename to contrast/feat_extract/resnet_vit/__pycache__/config.cpython-39.pyc diff --git a/contrast/resnet_vit/__pycache__/inference.cpython-39.pyc b/contrast/feat_extract/resnet_vit/__pycache__/inference.cpython-39.pyc similarity index 100% rename from contrast/resnet_vit/__pycache__/inference.cpython-39.pyc rename to contrast/feat_extract/resnet_vit/__pycache__/inference.cpython-39.pyc diff --git a/contrast/resnet_vit/config.py b/contrast/feat_extract/resnet_vit/config.py similarity index 100% rename from contrast/resnet_vit/config.py rename to contrast/feat_extract/resnet_vit/config.py diff --git a/contrast/resnet_vit/inference.py b/contrast/feat_extract/resnet_vit/inference.py similarity index 100% rename from contrast/resnet_vit/inference.py rename to contrast/feat_extract/resnet_vit/inference.py diff --git a/contrast/resnet_vit/model/__init__.py b/contrast/feat_extract/resnet_vit/model/__init__.py similarity index 100% rename from contrast/resnet_vit/model/__init__.py rename to contrast/feat_extract/resnet_vit/model/__init__.py diff --git a/contrast/resnet_vit/model/__pycache__/__init__.cpython-38.pyc b/contrast/feat_extract/resnet_vit/model/__pycache__/__init__.cpython-38.pyc similarity index 100% rename from contrast/resnet_vit/model/__pycache__/__init__.cpython-38.pyc rename to contrast/feat_extract/resnet_vit/model/__pycache__/__init__.cpython-38.pyc diff --git a/contrast/resnet_vit/model/__pycache__/__init__.cpython-39.pyc b/contrast/feat_extract/resnet_vit/model/__pycache__/__init__.cpython-39.pyc similarity index 100% rename from contrast/resnet_vit/model/__pycache__/__init__.cpython-39.pyc rename to contrast/feat_extract/resnet_vit/model/__pycache__/__init__.cpython-39.pyc diff --git a/contrast/resnet_vit/model/__pycache__/resnet_pre.cpython-38.pyc b/contrast/feat_extract/resnet_vit/model/__pycache__/resnet_pre.cpython-38.pyc similarity index 100% rename from contrast/resnet_vit/model/__pycache__/resnet_pre.cpython-38.pyc rename to contrast/feat_extract/resnet_vit/model/__pycache__/resnet_pre.cpython-38.pyc diff --git a/contrast/resnet_vit/model/__pycache__/resnet_pre.cpython-39.pyc b/contrast/feat_extract/resnet_vit/model/__pycache__/resnet_pre.cpython-39.pyc similarity index 100% rename from contrast/resnet_vit/model/__pycache__/resnet_pre.cpython-39.pyc rename to contrast/feat_extract/resnet_vit/model/__pycache__/resnet_pre.cpython-39.pyc diff --git a/contrast/model/resnet_pre.py b/contrast/feat_extract/resnet_vit/model/resnet_pre.py similarity index 100% rename from contrast/model/resnet_pre.py rename to contrast/feat_extract/resnet_vit/model/resnet_pre.py diff --git a/contrast/genfeats.py b/contrast/genfeats.py index 2e889ee..ddaa509 100644 --- a/contrast/genfeats.py +++ b/contrast/genfeats.py @@ -6,26 +6,33 @@ Created on Sun Nov 3 12:05:19 2024 """ import os import time -import torch +# import torch import pickle +# import json import numpy as np -from config import config as conf -from model import resnet18 as resnet18 -from feat_inference import inference_image +from PIL import Image +from feat_extract.config import config as conf +# from model import resnet18 as resnet18 +from feat_extract.inference import FeatsInterface #, inference_image IMG_FORMAT = ['.bmp', '.jpg', '.jpeg', '.png'] -'''======= 0. 配置特征提取模型地址 =======''' -model_path = conf.test_model -model_path = r"D:\exhibition\ckpt\zhanting.pth" +# def model_init(conf, mpath=None): +# '''======= 0. 配置特征提取模型地址 =======''' +# if mpath is None: +# model_path = conf.test_model +# else: +# model_path = mpath -##============ load resnet mdoel -model = resnet18().to(conf.device) -# model = nn.DataParallel(model).to(conf.device) -model.load_state_dict(torch.load(model_path, map_location=conf.device)) -model.eval() -print('load model {} '.format(conf.testbackbone)) +# ##============ load resnet mdoel +# model = resnet18().to(conf.device) +# # model = nn.DataParallel(model).to(conf.device) +# model.load_state_dict(torch.load(model_path, map_location=conf.device)) +# model.eval() +# print('load model {} '.format(conf.testbackbone)) + +# return model def get_std_barcodeDict(bcdpath, savepath, bcdSet): ''' @@ -42,9 +49,9 @@ def get_std_barcodeDict(bcdpath, savepath, bcdSet): '''读取数据集中 barcode 列表''' stdBarcodeList = [] for filename in os.listdir(bcdpath): - # filepath = os.path.join(bcdpath, filename) - # if not os.path.isdir(filepath) or not filename.isdigit() or len(filename)<8: - # continue + filepath = os.path.join(bcdpath, filename) + if not os.path.isdir(filepath) or not filename.isdigit() or len(filename)<8: + continue if bcdSet is None: stdBarcodeList.append(filename) elif filename in bcdSet: @@ -59,7 +66,7 @@ def get_std_barcodeDict(bcdpath, savepath, bcdSet): for barcode, bpath in bcdPaths: pickpath = os.path.join(savepath, f"{barcode}.pickle") if os.path.isfile(pickpath): - continue + continue stdBarcodeDict = {} stdBarcodeDict[barcode] = [] @@ -89,6 +96,7 @@ def get_std_barcodeDict(bcdpath, savepath, bcdSet): pickpath = os.path.join(savepath, f"{barcode}.pickle") with open(pickpath, 'wb') as f: pickle.dump(stdBarcodeDict, f) + print(f"Barcode: {barcode}") # k += 1 @@ -115,32 +123,37 @@ def stdfeat_infer(imgPath, featPath, bcdSet=None): stdBarcodeDict = {} stdBarcodeDict_ft16 = {} + Encoder = FeatsInterface(conf) - '''4处同名: (1)barcode原始图像文件夹; (2)imgPath中的 .pickle 文件名、该pickle文件中字典的key值''' - + '''4处同名: (1)barcode原始图像文件夹; (2)imgPath中的 .pickle 文件名; + (3)该pickle文件中字典的key值; (4)特征向量字典中的一个key值''' k = 0 for filename in os.listdir(imgPath): bcd, ext = os.path.splitext(filename) - pkpath = os.path.join(featPath, f"{bcd}.pickle") - - if os.path.isfile(pkpath): continue + filepath = os.path.join(imgPath, filename) + if ext != ".pickle": continue if bcdSet is not None and bcd not in bcdSet: continue - filepath = os.path.join(imgPath, filename) + featpath = os.path.join(featPath, f"{bcd}.pickle") stdbDict = {} - stdbDict_ft16 = {} - stdbDict_uint8 = {} - t1 = time.time() - try: with open(filepath, 'rb') as f: - bpDict = pickle.load(f) + bpDict = pickle.load(f) + for barcode, imgpaths in bpDict.items(): # feature = batch_inference(imgpaths, 8) #from vit distilled model of LiChen - feature = inference_image(imgpaths, conf.test_transform, model, conf.device) + # feature = inference_image(imgpaths, conf.test_transform, model, conf.device) + + imgs = [] + for d, imgpath in enumerate(imgpaths): + img = Image.open(imgpath) + imgs.append(img) + + feature = Encoder.inference(imgs) + feature /= np.linalg.norm(feature, axis=1)[:, None] # float16 @@ -162,7 +175,7 @@ def stdfeat_infer(imgPath, featPath, bcdSet=None): stdbDict["feats_ft16"] = feature_ft16 stdbDict["feats_uint8"] = feature_uint8 - with open(pkpath, 'wb') as f: + with open(featpath, 'wb') as f: pickle.dump(stdbDict, f) stdBarcodeDict[barcode] = feature @@ -174,21 +187,10 @@ def stdfeat_infer(imgPath, featPath, bcdSet=None): # if k == 10: # break - ##================== float32 - # pickpath = os.path.join(featPath, f"barcode_features_{k}.pickle") - # with open(pickpath, 'wb') as f: - # pickle.dump(stdBarcodeDict, f) - - ##================== float16 - # pickpath_ft16 = os.path.join(featPath, f"barcode_features_ft16_{k}.pickle") - # with open(pickpath_ft16, 'wb') as f: - # pickle.dump(stdBarcodeDict_ft16, f) - return - -def genfeatures(imgpath, bcdpath, featpath, bcdSet=None): +def gen_bcd_features(imgpath, bcdpath, featpath, bcdSet=None): ''' 生成标准特征集 ''' '''1. 提取 imgpath 中样本地址,生成字典{barcode: [imgpath1, imgpath1, ...]} 并存储于: bcdpath, 格式为 barcode.pickle''' @@ -198,11 +200,12 @@ def genfeatures(imgpath, bcdpath, featpath, bcdSet=None): stdfeat_infer(bcdpath, featpath, bcdSet) def main(): - imgpath = r"\\192.168.1.28\share\展厅barcode数据\整理\zhantingBase" + imgpath = r"\\192.168.1.28\share\数据\已完成数据\展厅数据\v1.0\比对数据\整理\zhantingBase" bcdpath = r"D:\exhibition\dataset\bcdpath" featpath = r"D:\exhibition\dataset\feats" - - genfeatures(imgpath, bcdpath, featpath) + + + gen_bcd_features(imgpath, bcdpath, featpath) diff --git a/contrast/model/__pycache__/mobilenet_v3.cpython-39.pyc b/contrast/model/__pycache__/mobilenet_v3.cpython-39.pyc deleted file mode 100644 index e1fc34a455261c76ebf1c6ba4abf8318f28ea6b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6590 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 diff --git a/contrast/model/__pycache__/resbam.cpython-39.pyc b/contrast/model/__pycache__/resbam.cpython-39.pyc deleted file mode 100644 index 65a91de9b93032701e54d2f976887fa14bcb20f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4264 zcmai1&2J<}6|d^=>G`ld_If|ENtPraCV(Y-;Xr_7Ka%W$-660>3XMancdG5}aZk@| zb$dUou@q@m3Kt^|h$FJO?I~BdaNy6VD+1vg7fy%`zgOM!;l0qUdiDC%>*}g{@BQBE zsM+)xu0P!!?EZI^vA@y7;^pAs23r1C5Wxgb*?V#Ho+-IGYGwg$PxUz2Fx_Pe)#=H~X z>ydErvZ{ytT`(~VxM0{S4@}{G!FIXcS}m~34F&cW%wmCq>1)crH7trW&f?zw8O?IW zLApJ=nvgo;Jv0+7|2;^-ChUZtGR_L4Z;tsGpTcbj^VlA<&?<}*du*I?@Q&6npkWDP zY(mREb|7~bbiAp~nDuLGuo-6J!qId2rCvFrXRJfJAza}d)BMe`1=mYmNg=EBII?- z9YsPU*3&SK!iZE10mMQ1nlmp1j2iayhutofqs>M%7QI;petQ21-@pWbWEWZ15Wyv@_P`(&G$?|A0 zN@Hx@%Hwo5s3lpo|G>xgD_(CSs6oF}$6{+?*h`~455pJi-{d_XzPIy_FMs#AQ!BE8Mj*RmM(O_frOs+tkwx3@CVTRAwc>}lgm1i_~n;Yocyu}Y! z=RUSEJ&B${?^G8ZJhj_s`EwBX6bl)w4o5!V^6D7=Hs;#?ke(RC9~t0G@-xj@Gfw-S zmN_%oeAJ!Eyo$p-eRh$Zn+37=f_D)g9^4}b>+aP z;AAf>*}zni0OyRpt{;V+?AnrlF(Nzg`6e{5o`1+Aqq01u$nxXd7L9uo*HSMnC* zKICR4U#a9vkedtgb|qhi+*pvWVvTEJMLYY2VtoRK57!~PD3-^(e`$@4%~R|xybSlh za>_nrpM82{6|apg+V#ZvEtl_ryV`$!Z1vv|ZLuoWj!i&yso`Mk&0S++$d{yba!qSp zI5nU#eg2xz&yQYeSY7X)-I&_qjH338yyN3@K&e4cqh*s+2{N~33pAn3p&b@+p%t{M z)}l<);Tn_9J_mn>gaU$3R6efXL&QW`NRdPl*D;huFr*sUFiVpxjwE7p4yGX=tA4BMuUGwd)yho~jf&)PeDm?%bfW0-o}S3uiwDZNtGA$|R2jQH zd`E|Ij>YFmmKRahLw2I%p<4S<8(vx36lt3$p_#f|R(g_&{ExGnhe?KD_Thlv7+Yz>tI6;zoJ@$8%Z$bpot5 zzf|1~?(sE%7|D&V9KilEKU^xKdItI0oaZVFO0wh>x6$%HfCzSEk1fIX%^aBDXJa6J zpRcifQ{F`-U?TS;)aG&oA%!>Uj;c=3+Nb=~II{QHku!D>?g(i8hBdY))+s8h>8uDM zR=AkMoEQkB^&@vte*%!;?9o_PC(duE!my?l#-cBivv)lCeRL(-lCLTMe*EZwGDnn_ zen&2+oM<$PGo*eQWqUE+BKydn(2zUL(Vvh=M+s#dWtXnT7r|QN^!ph7F-OUtx$CT{UHWRR&5=5Bi~^^(^UwrUgn8Vpbc=@&^A$5tj?&6O#aWGMKmQESH8 zGY-dHjk+_=n{l-n=a*bjKWPw_!eBIavl{0(Y@^%g2q!H?uOx}SI$fA$@8>FROe(v{_AU{Q`(()`J>r{*rZCa4jMZd`2l%!Mh5pSGNqR4I9 zF7jb`+$P_7BPEO+SmMuxrqf|S+h^Gom zpBiBmS-ULS#`x(x#>sTduH3)~>_*rmH6)So5I*FR+Od(kN%ZPwcOW}L%MB35B|TH6 zI*5>tLtWdIW!>jckl({-=R)A?UyBX;$CdP+{Dpo?2k=Ig>GVBS+D00dWcD)3oqIZC zma(Q6r`?f0tItnkt-xOw{>sQ|Wsh8~pRWgYf#1PG3i_Zuk_rBKv|r8%*-&{uEHm@_ cbbJ~iDCgmK$83MSeWShNSsrp8ZjYq@1AhIU`v3p{ diff --git a/contrast/one2n_contrast.py b/contrast/one2n_contrast.py index 57feea7..7ad3cb3 100644 --- a/contrast/one2n_contrast.py +++ b/contrast/one2n_contrast.py @@ -325,7 +325,7 @@ def one2n_deleted(all_list): -def one2n_return(all_list, basepath): +def one2n_return(all_list): corrpairs, corr_similarity, errpairs, err_similarity = [], [], [], [] for s_list in all_list: @@ -410,7 +410,7 @@ def test_rpath_return(): savepath = r'D:\DetectTracking\contrast\result' all_list = read_returnGoods_file(return_bfile) - corrpairs, errpairs, _, _ = one2n_return(all_list, basepath) + corrpairs, errpairs, _, _ = one2n_return(all_list) for corrpair in corrpairs: GetoutPath = os.path.join(basepath, corrpair[0]) InputPath = os.path.join(basepath, corrpair[1]) @@ -435,7 +435,7 @@ def test_one2n(): savepath: pr曲线保存路径 ''' # fpath = r'\\192.168.1.28\share\测试_202406\deletedBarcode\other' # deletedBarcode.txt - fpath = r'\\192.168.1.28\share\测试_202406\returnGoods\all' # returnGoods.txt + fpath = r'\\192.168.1.28\share\测试_202406\1108_展厅模型v800测试' # returnGoods.txt savepath = r'\\192.168.1.28\share\测试_202406\deletedBarcode\illustration' if os.path.isdir(fpath): @@ -476,9 +476,9 @@ def test_one2n(): plt1.savefig(os.path.join(savepath, file+'_pr.png')) # plt1.close() - # plt2 = showHist(err_similarity, correct_similarity) - # plt2.show() - # plt2.savefig(os.path.join(savepath, file+'_hist.png')) + plt2 = showHist(err_similarity, correct_similarity) + plt2.show() + plt2.savefig(os.path.join(savepath, file+'_hist.png')) # plt.close() @@ -486,7 +486,7 @@ def test_one2n(): if __name__ == '__main__': # test_one2n() test_rpath_return() # returnGoods.txt - test_rpath_deleted() # deleteBarcode.txt + # test_rpath_deleted() # deleteBarcode.txt # try: diff --git a/contrast/one2one_contrast.py b/contrast/one2one_contrast.py index 289d4fd..1d61aed 100644 --- a/contrast/one2one_contrast.py +++ b/contrast/one2one_contrast.py @@ -49,7 +49,8 @@ from datetime import datetime sys.path.append(r"D:\DetectTracking") from tracking.utils.read_data import extract_data, read_tracking_output, read_one2one_simi, read_deletedBarcode_file -from genfeats import genfeatures, stdfeat_infer +from config import config as conf +from genfeats import model_init, genfeatures, stdfeat_infer IMG_FORMAT = ['.bmp', '.jpg', '.jpeg', '.png'] @@ -546,10 +547,10 @@ def test_one2one(): - + model = model_init(conf) '''==== 1. 生成标准特征集, 只需运行一次 ===============''' - genfeatures(stdSamplePath, stdBarcodePath, stdFeaturePath, bcdSet) + genfeatures(model, stdSamplePath, stdBarcodePath, stdFeaturePath, bcdSet) print("stdFeats have generated and saved!") diff --git a/contrast/one2one_onsite.py b/contrast/one2one_onsite.py index a11769e..94c8c3e 100644 --- a/contrast/one2one_onsite.py +++ b/contrast/one2one_onsite.py @@ -7,7 +7,12 @@ Created on Wed Sep 11 11:57:30 2024 """ import os import numpy as np +from pathlib import Path import matplotlib.pyplot as plt +import sys + +sys.path.append(r"D:\DetectTracking") +from tracking.utils.read_data import read_similar def read_one2one_data(filepath): simiList = [] @@ -85,7 +90,7 @@ def plot_pr_curve(matrix): pass -def main(): +def test_compare(): filepaths = [r"\\192.168.1.28\share\测试_202406\0913_扫A放B\0913_1\OneToOneCompare.txt", r"\\192.168.1.28\share\测试_202406\0913_扫A放B\0913_2\OneToOneCompare.txt", r"\\192.168.1.28\share\测试_202406\0914_扫A放B\0914_1\OneToOneCompare.txt", @@ -99,10 +104,251 @@ def main(): plot_pr_curve(simiList) +def one2one_pr(paths): + paths = Path(paths) + evtpaths = [p for p in paths.iterdir() if p.is_dir() and len(p.name.split('_'))>=2] + + events, similars = [], [] + + ##===================================== 扫A放A, 扫A放B场景 + one2oneAA, one2oneAB = [], [] + + ##===================================== 应用于展厅 1:N + tp_events, fn_events, fp_events, tn_events = [], [], [], [] + tp_simi, fn_simi, tn_simi, fp_simi = [], [], [], [] + + ##===================================== 应用于1:n + tpevents, fnevents, fpevents, tnevents = [], [], [], [] + tpsimi, fnsimi, tnsimi, fpsimi = [], [], [], [] + + for path in evtpaths: + barcode = path.stem.split('_')[-1] + datapath = path.joinpath('process.data') + + if not barcode.isdigit() or len(barcode)<10: continue + if not datapath.is_file(): continue + + try: + SimiDict = read_similar(datapath) + except Exception as e: + print(f"{path.stem}, Error: {e}") + + one2one = SimiDict['one2one'] + one2n = SimiDict['one2n'] + + barcodes, similars = [], [] + for dt in one2one: + barcodes.append(dt['barcode']) + similars.append(dt['similar']) + + if len(barcodes)!=len(similars) or len(barcodes)==0: + continue + + ##===================================== 扫A放A, 扫A放B场景 + simAA = [similars[i] for i in range(len(barcodes)) if barcodes[i]==barcode] + simAB = [similars[i] for i in range(len(barcodes)) if barcodes[i]!=barcode] + + one2oneAA.extend(simAA) + one2oneAB.extend(simAB) + + + ##===================================== 以下应用适用于展厅 1:N + max_idx = similars.index(max(similars)) + max_sim = similars[max_idx] + # max_bcd = barcodes[max_idx] + + for i in range(len(one2one)): + bcd, simi = barcodes[i], similars[i] + if bcd==barcode and simi==max_sim: + tp_simi.append(simi) + tp_events.append(path.stem) + elif bcd==barcode and simi!=max_sim: + fn_simi.append(simi) + fn_events.append(path.stem) + elif bcd!=barcode and simi!=max_sim: + tn_simi.append(simi) + tn_events.append(path.stem) + else: + fp_simi.append(simi) + fp_events.append(path.stem) + + + ##===================================== 以下应用适用1:n + events, evt_barcodes, evt_similars, evt_types = [], [], [], [] + for dt in one2n: + events.append(dt["event"]) + evt_barcodes.append(dt["barcode"]) + evt_similars.append(dt["similar"]) + evt_types.append(dt["type"]) + + if len(events)!=len(evt_barcodes) or len(evt_barcodes)!=len(evt_similars) \ + or len(evt_barcodes)!=len(evt_similars) or len(events)==0: continue + + maxsim = evt_similars[evt_similars.index(max(evt_similars))] + for i in range(len(one2n)): + bcd, simi = evt_barcodes[i], evt_similars[i] + + if bcd==barcode and simi==maxsim: + tpsimi.append(simi) + tpevents.append(path.stem) + elif bcd==barcode and simi!=maxsim: + fnsimi.append(simi) + fnevents.append(path.stem) + elif bcd!=barcode and simi!=maxsim: + tnsimi.append(simi) + tnevents.append(path.stem) + else: + fpsimi.append(simi) + fpevents.append(path.stem) + + '''命名规则: + 1:1 1:n 1:N + TP_ TP TPX + PPrecise_ PPrecise PPreciseX + tpsimi tp_simi + ''' + + ''' 1:1 数据存储''' + PPrecise_, PRecall_ = [], [] + NPrecise_, NRecall_ = [], [] + + ''' 1:n 数据存储''' + PPrecise, PRecall = [], [] + NPrecise, NRecall = [], [] + + ''' 展厅 1:N 数据存储''' + PPreciseX, PRecallX = [], [] + NPreciseX, NRecallX = [], [] + + Thresh = np.linspace(-0.2, 1, 100) + for th in Thresh: + '''============================= 1:1''' + TP_ = sum(np.array(one2oneAA) >= th) + FP_ = sum(np.array(one2oneAB) >= th) + FN_ = sum(np.array(one2oneAA) < th) + TN_ = sum(np.array(one2oneAB) < th) + PPrecise_.append(TP_/(TP_+FP_+1e-6)) + PRecall_.append(TP_/(TP_+FN_+1e-6)) + NPrecise_.append(TN_/(TN_+FN_+1e-6)) + NRecall_.append(TN_/(TN_+FP_+1e-6)) + + '''============================= 1:n''' + TP = sum(np.array(tpsimi) >= th) + FP = sum(np.array(fpsimi) >= th) + FN = sum(np.array(fnsimi) < th) + TN = sum(np.array(tnsimi) < th) + PPrecise.append(TP/(TP+FP+1e-6)) + PRecall.append(TP/(TP+FN+1e-6)) + NPrecise.append(TN/(TN+FN+1e-6)) + NRecall.append(TN/(TN+FP+1e-6)) + + + '''============================= 1:N 展厅''' + TPX = sum(np.array(tp_simi) >= th) + FPX = sum(np.array(fp_simi) >= th) + FNX = sum(np.array(fn_simi) < th) + TNX = sum(np.array(tn_simi) < th) + PPreciseX.append(TPX/(TPX+FPX+1e-6)) + PRecallX.append(TPX/(TPX+FNX+1e-6)) + NPreciseX.append(TNX/(TNX+FNX+1e-6)) + NRecallX.append(TNX/(TNX+FPX+1e-6)) + + '''============================= 1:1 曲线''' + fig, ax = plt.subplots() + ax.plot(Thresh, PPrecise_, 'r', label='Precise_Pos: TP/TPFP') + ax.plot(Thresh, PRecall_, 'b', label='Recall_Pos: TP/TPFN') + ax.plot(Thresh, NPrecise_, 'g', label='Precise_Neg: TN/TNFP') + ax.plot(Thresh, NRecall_, 'c', label='Recall_Neg: TN/TNFN') + ax.set_xlim([0, 1]) + ax.set_ylim([0, 1]) + ax.grid(True) + ax.set_title('Precise & Recall') + ax.set_xlabel(f"Num: {len(evtpaths)}") + ax.legend() + plt.show() + + '''============================= 1:1 直方图''' + fig, axes = plt.subplots(2, 1) + axes[0].hist(np.array(one2oneAA), bins=60, edgecolor='black') + axes[0].set_xlim([-0.2, 1]) + axes[0].set_title('AA') + axes[1].hist(np.array(one2oneAB), bins=60, edgecolor='black') + axes[1].set_xlim([-0.2, 1]) + axes[1].set_title('BB') + plt.show() + + '''============================= 1:n 曲线''' + fig, ax = plt.subplots() + ax.plot(Thresh, PPrecise, 'r', label='Precise_Pos: TP/TPFP') + ax.plot(Thresh, PRecall, 'b', label='Recall_Pos: TP/TPFN') + ax.plot(Thresh, NPrecise, 'g', label='Precise_Neg: TN/TNFP') + ax.plot(Thresh, NRecall, 'c', label='Recall_Neg: TN/TNFN') + ax.set_xlim([0, 1]) + ax.set_ylim([0, 1]) + ax.grid(True) + ax.set_title('Precise & Recall') + ax.set_xlabel(f"Num: {len(evtpaths)}") + ax.legend() + plt.show() + + '''============================= 1:n 直方图''' + fig, axes = plt.subplots(2, 2) + axes[0, 0].hist(tpsimi, bins=60, edgecolor='black') + axes[0, 0].set_xlim([-0.2, 1]) + axes[0, 0].set_title('TP') + axes[0, 1].hist(fpsimi, bins=60, edgecolor='black') + axes[0, 1].set_xlim([-0.2, 1]) + axes[0, 1].set_title('FP') + axes[1, 0].hist(tnsimi, bins=60, edgecolor='black') + axes[1, 0].set_xlim([-0.2, 1]) + axes[1, 0].set_title('TN') + axes[1, 1].hist(fnsimi, bins=60, edgecolor='black') + axes[1, 1].set_xlim([-0.2, 1]) + axes[1, 1].set_title('FN') + plt.show() + + + '''============================= 1:N 展厅 曲线''' + fig, ax = plt.subplots() + ax.plot(Thresh, PPreciseX, 'r', label='Precise_Pos: TP/TPFP') + ax.plot(Thresh, PRecallX, 'b', label='Recall_Pos: TP/TPFN') + ax.plot(Thresh, NPreciseX, 'g', label='Precise_Neg: TN/TNFP') + ax.plot(Thresh, NRecallX, 'c', label='Recall_Neg: TN/TNFN') + ax.set_xlim([0, 1]) + ax.set_ylim([0, 1]) + ax.grid(True) + ax.set_title('Precise & Recall') + ax.set_xlabel(f"Num: {len(evtpaths)}") + ax.legend() + plt.show() + + '''============================= 1:N 展厅 直方图''' + fig, axes = plt.subplots(2, 2) + axes[0, 0].hist(tp_simi, bins=60, edgecolor='black') + axes[0, 0].set_xlim([-0.2, 1]) + axes[0, 0].set_title('TP') + axes[0, 1].hist(fp_simi, bins=60, edgecolor='black') + axes[0, 1].set_xlim([-0.2, 1]) + axes[0, 1].set_title('FP') + axes[1, 0].hist(tn_simi, bins=60, edgecolor='black') + axes[1, 0].set_xlim([-0.2, 1]) + axes[1, 0].set_title('TN') + axes[1, 1].hist(fn_simi, bins=60, edgecolor='black') + axes[1, 1].set_xlim([-0.2, 1]) + axes[1, 1].set_title('FN') + plt.show() + + + + + print('Done!') + + if __name__ == "__main__": - main() + evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1120_展厅模型v801测试\扫A放A" + one2one_pr(evtpaths) diff --git a/contrast/说明文档.txt b/contrast/说明文档.txt deleted file mode 100644 index e69de29..0000000 diff --git a/event_time_specify.py b/event_time_specify.py index 8a421da..b0f1568 100644 --- a/event_time_specify.py +++ b/event_time_specify.py @@ -11,13 +11,10 @@ import numpy as np import matplotlib.pyplot as plt from move_detect import MoveDetect - import sys sys.path.append(r"D:\DetectTracking") # from tracking.utils.read_data import extract_data, read_deletedBarcode_file, read_tracking_output, read_weight_timeConsuming - - from tracking.utils.read_data import read_weight_timeConsuming def str_to_float_arr(s): @@ -118,7 +115,14 @@ def extract_data_1(datapath): def devide_motion_state(tboxes, width): - '''frameTstamp: 用于标记当前相机视野内用购物车运动状态变化''' + '''frameTstamp: 用于标记当前相机视野内用购物车运动状态变化 + + Hand状态: + 0: 不存在 + 1: 手部存在 + 2: 手部存在且处于某种状态(静止) + + ''' periods = [] if len(tboxes) < width: @@ -131,28 +135,22 @@ def devide_motion_state(tboxes, width): state = np.zeros((fnum, 2), dtype=np.int64) frameState = np.concatenate((frameTstamp, state), axis = 1).astype(np.int64) + handState = np.concatenate((frameTstamp, state), axis = 1).astype(np.int64) mtrackFid = {} + handFid = {} '''frameState 标记由图像判断的购物车状态:0: 静止,1: 运动''' for idx in range(width, fnum+1): - lboxes = np.concatenate(fboxes[idx-width:idx], axis = 0) - + idx0 = idx-width + + lboxes = np.concatenate(fboxes[idx0:idx], axis = 0) md = MoveDetect(lboxes) md.classify() - # if idx==60: - # print('a') - ## track.during 二元素组, 表征在该时间片段内,轨迹 track 的起止时间,数值用 boxes[:, 7] for track in md.track_motion: - if track.cls == 0: continue - - - f1, f2 = track.during - - - + # if track.cls == 0: continue idx1 = set(np.where(frameState[:,0] >= f1)[0]) idx2 = set(np.where(frameState[:,0] <= f2)[0]) idx3 = list(idx1.intersection(idx2)) @@ -164,7 +162,25 @@ def devide_motion_state(tboxes, width): frameState[idx-1, 3] = 1 frameState[idx3, 2] = 1 + + for track in md.hand_tracks: + f11, f22 = track.during + idx11 = set(np.where(handState[:,0] >= f11)[0]) + idx22 = set(np.where(handState[:,0] <= f22)[0]) + idx33 = list(idx11.intersection(idx22)) + '''手部存在标记''' + handState[idx33, 2] = 1 + '''未来改进方向:is_static 可以用手部状态判断的函数代替''' + if track.is_static(70) and len(idx33)>1: + idx11 = set(np.where(handState[:,0] >= f11)[0]) + idx22 = set(np.where(handState[:,0] <= f22)[0]) + idx33 = list(idx11.intersection(idx22)) + + '''手部静止标记''' + handState[idx33, 2] = 2 + + '''状态变化输出''' for tid, fid in mtrackFid.items(): @@ -172,16 +188,11 @@ def devide_motion_state(tboxes, width): fstate[list(fid), 0] = tid frameState = np.concatenate((frameState, fstate), axis = 1).astype(np.int64) - - - - - - - return frameState + + return frameState, handState -def state_measure(periods, weights, spath=None): +def state_measure(periods, weights, hands, spath=None): '''两种状态:static、motion, (t0, t1) t0: static ----> motion @@ -269,15 +280,16 @@ def main(): '''====================图像运动分析====================''' win_width = 12 - periods = [] + periods, hands = [], [] for ctype, tboxes, _ in tracker_boxes: - period = devide_motion_state(tboxes, win_width) + period, handState = devide_motion_state(tboxes, win_width) periods.append((ctype, period)) + hands.append((ctype, handState)) print('done!') '''===============重力、图像信息融合===================''' - state_measure(periods, weights) + state_measure(periods, weights, hands) if __name__ == "__main__": diff --git a/imgs_inference.py b/imgs_inference.py index ed314f3..69d903f 100644 --- a/imgs_inference.py +++ b/imgs_inference.py @@ -39,13 +39,20 @@ from tracking.trackers import BOTSORT, BYTETracker from tracking.utils.showtrack import drawtracks from hands.hand_inference import hand_pose -from tracking.trackers.reid.reid_interface import ReIDInterface -from tracking.trackers.reid.config import config as ReIDConfig +# from tracking.trackers.reid.reid_interface import ReIDInterface +# from tracking.trackers.reid.config import config as ReIDConfig +# ReIDEncoder = ReIDInterface(ReIDConfig) + +from contrast.feat_extract.config import config as conf +from contrast.feat_extract.inference import FeatsInterface +ReIDEncoder = FeatsInterface(conf) + -ReIDEncoder = ReIDInterface(ReIDConfig) IMG_FORMATS = 'bmp', 'dng', 'jpeg', 'jpg', 'mpo', 'png', 'tif', 'tiff', 'webp', 'pfm' # include image suffixes VID_FORMATS = 'asf', 'avi', 'gif', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ts', 'wmv' # include video suffixes + +'''================== 对图像进行旋转 ================== ''' class LoadImages: # YOLOv5 image/video dataloader, i.e. `python detect.py --source image.jpg/vid.mp4` def __init__(self, files, img_size=640, stride=32, auto=True, transforms=None, vid_stride=1): diff --git a/move_detect.py b/move_detect.py index 4701fdb..7103ed6 100644 --- a/move_detect.py +++ b/move_detect.py @@ -138,7 +138,7 @@ class TrackFrag: return False - def is_static(self): + def is_static(self, THRESH=50): box1 = self.boxes[0, :4] box2 = self.boxes[-1, :4] @@ -148,7 +148,7 @@ class TrackFrag: ptd2 = np.linalg.norm((ptd[2], ptd[1])) ptd3 = np.linalg.norm((ptd[0], ptd[3])) ptd4 = np.linalg.norm((ptd[2], ptd[3])) - condt1 = ptd1<50 and ptd2<50 and ptd3<50 and ptd4<50 + condt1 = ptd1=3] + def draw(self): diff --git a/pipeline.py b/pipeline.py index e013fd6..354563c 100644 --- a/pipeline.py +++ b/pipeline.py @@ -16,12 +16,6 @@ from tracking.dotrack.dotracks_front import doFrontTracks from tracking.utils.drawtracks import plot_frameID_y2, draw_all_trajectories from utils.getsource import get_image_pairs, get_video_pairs - - - - -std_feature_path = r"\\192.168.1.28\share\测试_202406\contrast\std_features_2192_ft32vsft16" - def get_interbcd_inputenents(): bcdpath = r"\\192.168.1.28\share\测试_202406\contrast\std_barcodes_2192" eventpath = r"\\192.168.1.28\share\测试_202406\0918" @@ -49,8 +43,7 @@ def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): outputs: ''' - SourceType = "image" # image - + # SourceType = "image" # image # eventpath = r"\\192.168.1.28\share\测试_202406\0918\images1\20240918-110822-1bc3902e-5a8e-4e23-8eca-fb3f02738551_6938314601726" savepath = r"D:\contrast\detect" @@ -71,16 +64,14 @@ def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): event_tracks = [] - for vpath in vpaths: - + for vpath in vpaths: '''事件结果文件夹''' save_dir_event = Path(savepath) / Path(eventname) if isinstance(vpath, list): save_dir_video = save_dir_event / Path("images") else: save_dir_video = save_dir_event / Path(str(Path(vpath).stem)) - - + if not save_dir_video.exists(): save_dir_video.mkdir(parents=True, exist_ok=True) @@ -112,6 +103,11 @@ def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): for CamerType, vts in event_tracks: if CamerType == 'front': edgeline = cv2.imread("./tracking/shopcart/cart_tempt/board_ftmp_line.png") + + h, w = edgeline.shape[:2] + nh, nw = h//2, w//2 + edgeline = cv2.resize(edgeline, (nw, nh), interpolation=cv2.INTER_AREA) + img_tracking = draw_all_trajectories(vts, edgeline, save_dir_event, CamerType, draw5p=True) illus[0] = img_tracking @@ -121,6 +117,11 @@ def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): if CamerType == 'back': edgeline = cv2.imread("./tracking/shopcart/cart_tempt/edgeline.png") + + h, w = edgeline.shape[:2] + nh, nw = h//2, w//2 + edgeline = cv2.resize(edgeline, (nw, nh), interpolation=cv2.INTER_AREA) + img_tracking = draw_all_trajectories(vts, edgeline, save_dir_event, CamerType, draw5p=True) illus[1] = img_tracking @@ -177,18 +178,14 @@ def main_loop(): def main(): eventpath = r"D:\datasets\ym\exhibition\175836" + + eventpath = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1120_展厅模型v801测试\扫A放A\20241121-144855-dce94b09-1100-43f1-92e8-33a1b538b159_6924743915848_6924743915848" + SourceType = 'image' stdfeat_path = None pipeline(eventpath, stdfeat_path, SourceType) - - - - - - - - + if __name__ == "__main__": diff --git a/time_devide.py b/time_devide.py index 28d4d65..c035bd6 100644 --- a/time_devide.py +++ b/time_devide.py @@ -14,18 +14,14 @@ import glob import numpy as np import copy - import matplotlib.pyplot as plt from imgs_inference import run_yolo from event_time_specify import devide_motion_state#, state_measure from tracking.utils.read_data import read_seneor - - # IMG_FORMATS = 'bmp', 'dng', 'jpeg', 'jpg', 'mpo', 'png', 'tif', 'tiff', 'webp', 'pfm' # include image suffixes # VID_FORMATS = 'asf', 'avi', 'gif', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ts', 'wmv' # include video suffixes - def filesort(p): ''' 需将图像文件名标准化 @@ -104,7 +100,7 @@ def rerename(filePath=None): os.rename(os.path.join(filePath, file), os.path.join(filePath, newname)) -def state_measure(periods, weights, spath=None): +def state_measure(periods, weights, hands, spath=None): ''' 数据类型 后摄: 0, 前摄: 1, CV综合: 2, 重力: 9 @@ -120,7 +116,7 @@ def state_measure(periods, weights, spath=None): 0 1 2 3 4 5 6 7 单摄状态1:基于运动轨迹的起止点确定的运动区间 - 单摄状态2: 基于滑动窗口的起止点确定的运动区间 + 单摄状态2: 基于滑动窗口的起止点(窗口终点)确定的运动区间 重力(t0, t1): 重力波动的精确时间区间,基于重力波动的起止点,而不是仅依赖重力稳定时间 重力(t0', t1'): 根据加退购对重力波动窗口进行扩展,扩展应该涵盖购物事件的发生过程 方案: @@ -131,6 +127,7 @@ def state_measure(periods, weights, spath=None): # BackType = 0 # 后摄数据类型 # FrontType = 1 # 前摄数据类型 CameraType = 2 # CV数据综合类型 + HandType = 3 # 手部类型 WeightType = 9 # 重力数据类型 WeightStableThresh = 7.5 # 单位:g,重力稳定状态下的最大波动范围 WeightWinWidth = 10 # 单位:重力数据点数,该值和采样间隔关联,重力稳定时间设定为500ms = WeightWinWidth * 采样间隔 @@ -166,7 +163,8 @@ def state_measure(periods, weights, spath=None): '''对重力波动区间进行标记,并标记最新一次重力稳定值的索引和相应重力值''' if wmax - wmin > WeightStableThresh: weights[i2, 4] = w_max - elif i2==0: + + if i2==0: i0=0 wi0 = weights[i0, 3] elif i2>0 and weights[i2-1, 4]==0: @@ -207,6 +205,10 @@ def state_measure(periods, weights, spath=None): state1 = frstate_1[:,2][:, None] state11 = frstate_1[:,3][:, None] + + + + @@ -268,10 +270,7 @@ def state_measure(periods, weights, spath=None): if ctype != ctype0 and state !=0 and state0 !=0: time_stream[i, 7] = 1 - MotionSlice = [] - - motion_slice = [] - + MotionSlice, motion_slice = [], [] t0 = time_stream[0, 7] for i in range(1, len(time_stream)): f0 = time_stream[i-1, 7] @@ -285,14 +284,65 @@ def state_measure(periods, weights, spath=None): motion_slice.append((t0, t1)) else: print(f"T0: {t0}, T1: {t1}") + + + + + '''===================== 4. Hands数据综合并排序 ==========================''' + BackType, hdstate_0 = hands[0] + FrontType, hdstate_1 = hands[1] + n0, n1 = len(hdstate_0), len(hdstate_1) + idx0 = np.array([i for i in range(0, n0)], dtype=np.int64)[:, None] + idx1 = np.array([i for i in range(0, n1)], dtype=np.int64)[:, None] + ctype0 = BackType * np.ones((n0, 1), dtype=np.int64) + ctype1 = FrontType * np.ones((n1, 1), dtype=np.int64) + hstamp0 = hdstate_0[:,1][:, None] + hstamp1 = hdstate_1[:,1][:, None] + state0 = hdstate_0[:,2][:, None] + state1 = hdstate_1[:,2][:, None] + + '''序列索引号, 相机类型,时间戳, 单摄手部状态、手部综合状态、保留位2、综合数据类型、综合状态 + 0 1 2 3 4 5 6 7 + ''' + hstream0 = np.concatenate((idx0, ctype0, hstamp0, state0), axis=1) + hstream1 = np.concatenate((idx1, ctype1, hstamp1, state1), axis=1) + hstream = np.concatenate((hstream0, hstream1), axis=0) + hstream = np.concatenate((hstream, np.zeros((len(hstream), 4), dtype=np.int64)), axis=1) + hstream[:, 6] = HandType + hstream = hstream[np.argsort(hstream[:, 2]), :] + + for i in range(0, len(hstream)): + idx, ctype, stamp, state = hstream[i, :4] + if i==0: + hstream[i, 4] = state + if i>0: + j = i-1 + idx0, ctype0, stamp0, state0 = hstream[j, :4] + while stamp-stamp0 < CameraTimeInterval and ctype == ctype0 and j>0: + j -= 1 + idx0, ctype0, stamp0, state0 = hstream[j, :4] + + '''两摄像头状态的或运算. 由于前后摄图像不同时,如何构造或运算,关键在于选择不同摄像头的对齐点 + i时刻摄像头(ctype)状态state,另一摄像头(ctype0 != ctype)距 i 最近最近时刻 j 的状态state0 + ''' + if ctype != ctype0 and state0==2: + hstream[i, 4] = state0 + elif ctype != ctype0 and state0==1: + hstream[i, 4] = state0 + else: + hstream[i, 4] = state + + + + - '''========================== 4 结果显示 ================================''' + '''========================== 5 结果显示 ================================''' frstate_0[:, 1] = frstate_0[:, 1]-tmin frstate_1[:, 1] = frstate_1[:, 1]-tmin tstream[:, 2] = tstream[:, 2]-tmin - fig, (ax1, ax2, ax3, ax4, ax5) = plt.subplots(5, 1) + fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(6, 1) during = np.max(time_stream[:, 2]) ax1.plot(weights[:, 2]-tmin, weights[:, 3], 'bo-', linewidth=1, markersize=4) @@ -318,7 +368,12 @@ def state_measure(periods, weights, spath=None): ax5.plot(time_stream[:, 2], time_stream[:, 7], 'gx-', linewidth=1, markersize=4) ax5.set_xlim([0, during]) ax5.set_title('Cart State') - + + ax6.plot(hstream[:, 2]-tmin, hstream[:, 4], 'gx-', linewidth=1, markersize=4) + ax6.set_xlim([0, during]) + ax6.set_title('Hand State') + + plt.show() if spath: plt.savefig(spath) @@ -352,12 +407,18 @@ def splitevent(imgpath, MotionSlice): def runyolo(): eventdirs = r"\\192.168.1.28\share\realtime\eventdata" savedir = r"\\192.168.1.28\share\realtime\result" - + + k = 0 for edir in os.listdir(eventdirs): + edir = "1731316835560" source = os.path.join(eventdirs, edir) files = filesort(source) for flist in files: run_yolo(flist, savedir) + + k += 1 + if k==1: + break def run_tracking(trackboxes, MotionSlice): pass @@ -367,8 +428,8 @@ def run_tracking(trackboxes, MotionSlice): def show_seri(): - datapath = r"\\192.168.1.28\share\realtime\eventdata\1728978106733" - savedir = r"\\192.168.1.28\share\realtime\result" + datapath = r"\\192.168.1.28\share\realtime\eventdata\1731316835560" + savedir = r"D:\DetectTracking\realtime" imgdir = datapath.split('\\')[-2] + "_" + datapath.split('\\')[-1] @@ -378,7 +439,7 @@ def show_seri(): datafiles = sorted(glob.glob(os.path.join(datapath, '*.npy'))) - periods, trackboxes = [], [] + periods, trackboxes, hands = [], [], [] win_width = 12 for npypath in datafiles: CameraType = Path(npypath).stem.split('_')[-1] @@ -386,8 +447,9 @@ def show_seri(): trackboxes.append((CameraType, tkboxes)) - period = devide_motion_state(tkboxes, win_width) + period, handState = devide_motion_state(tkboxes, win_width) periods.append((int(CameraType), period)) + hands.append((int(CameraType), handState)) @@ -401,23 +463,19 @@ def show_seri(): '''===============重力、图像信息融合===================''' spath = os.path.join(savedir, f"{eventname}.png" ) - tmin, MotionSlice = state_measure(periods, weights, spath) - - - - + tmin, MotionSlice = state_measure(periods, weights, hands, spath) + # 第一次运行时用于更改图像文件名 # rerename(imgpath) # rename(imgpath, tmin) - # splitevent(imgpath, MotionSlice) def main(): - # runyolo() + runyolo() show_seri() diff --git a/track_reid.py b/track_reid.py index 3e687be..9ccf665 100644 --- a/track_reid.py +++ b/track_reid.py @@ -60,53 +60,57 @@ from tracking.trackers import BOTSORT, BYTETracker from tracking.utils.showtrack import drawtracks from hands.hand_inference import hand_pose -from tracking.trackers.reid.reid_interface import ReIDInterface -from tracking.trackers.reid.config import config as ReIDConfig -ReIDEncoder = ReIDInterface(ReIDConfig) +from contrast.feat_extract.config import config as conf +from contrast.feat_extract.inference import FeatsInterface +ReIDEncoder = FeatsInterface(conf) + +# from tracking.trackers.reid.reid_interface import ReIDInterface +# from tracking.trackers.reid.config import config as ReIDConfig +# ReIDEncoder = ReIDInterface(ReIDConfig) # tracker_yaml = r"./tracking/trackers/cfg/botsort.yaml" -def inference_image(image, detections): - H, W, _ = np.shape(image) - imgs = [] - batch_patches = [] - patches = [] - for d in range(np.size(detections, 0)): - tlbr = detections[d, :4].astype(np.int_) - tlbr[0] = max(0, tlbr[0]) - tlbr[1] = max(0, tlbr[1]) - tlbr[2] = min(W - 1, tlbr[2]) - tlbr[3] = min(H - 1, tlbr[3]) - img1 = image[tlbr[1]:tlbr[3], tlbr[0]:tlbr[2], :] +# def inference_image(image, detections): +# H, W, _ = np.shape(image) +# imgs = [] +# batch_patches = [] +# patches = [] +# for d in range(np.size(detections, 0)): +# tlbr = detections[d, :4].astype(np.int_) +# tlbr[0] = max(0, tlbr[0]) +# tlbr[1] = max(0, tlbr[1]) +# tlbr[2] = min(W - 1, tlbr[2]) +# tlbr[3] = min(H - 1, tlbr[3]) +# img1 = image[tlbr[1]:tlbr[3], tlbr[0]:tlbr[2], :] - img = img1[:, :, ::-1].copy() # the model expects RGB inputs - patch = ReIDEncoder.transform(img) +# img = img1[:, :, ::-1].copy() # the model expects RGB inputs +# patch = ReIDEncoder.transform(img) - imgs.append(img1) - # patch = patch.to(device=self.device).half() - if str(ReIDEncoder.device) != "cpu": - patch = patch.to(device=ReIDEncoder.device).half() - else: - patch = patch.to(device=ReIDEncoder.device) +# imgs.append(img1) +# # patch = patch.to(device=self.device).half() +# if str(ReIDEncoder.device) != "cpu": +# patch = patch.to(device=ReIDEncoder.device).half() +# else: +# patch = patch.to(device=ReIDEncoder.device) - patches.append(patch) - if (d + 1) % ReIDEncoder.batch_size == 0: - patches = torch.stack(patches, dim=0) - batch_patches.append(patches) - patches = [] +# patches.append(patch) +# if (d + 1) % ReIDEncoder.batch_size == 0: +# patches = torch.stack(patches, dim=0) +# batch_patches.append(patches) +# patches = [] - if len(patches): - patches = torch.stack(patches, dim=0) - batch_patches.append(patches) +# if len(patches): +# patches = torch.stack(patches, dim=0) +# batch_patches.append(patches) - features = np.zeros((0, ReIDEncoder.embedding_size)) - for patches in batch_patches: - pred = ReIDEncoder.model(patches) - pred[torch.isinf(pred)] = 1.0 - feat = pred.cpu().data.numpy() - features = np.vstack((features, feat)) +# features = np.zeros((0, ReIDEncoder.embedding_size)) +# for patches in batch_patches: +# pred = ReIDEncoder.model(patches) +# pred[torch.isinf(pred)] = 1.0 +# feat = pred.cpu().data.numpy() +# features = np.vstack((features, feat)) - return imgs, features +# return imgs, features @@ -127,6 +131,7 @@ def init_trackers(tracker_yaml = None, bs=1): return trackers +'''=============== used in pipeline.py ==================''' @smart_inference_mode() def yolo_resnet_tracker( weights=ROOT / 'yolov5s.pt', # model path or triton URL @@ -237,7 +242,9 @@ def yolo_resnet_tracker( '''================== 1. 存储 dets/subimgs/features Dict =============''' - imgs, features = inference_image(im0, tracks) + imgs, features = ReIDEncoder.inference(im0, tracks) + + # imgs, features = inference_image(im0, tracks) # TrackerFeats = np.concatenate([TrackerFeats, features], axis=0) @@ -499,7 +506,8 @@ def run( tracks[:, 7] = frameId '''================== 1. 存储 dets/subimgs/features Dict =============''' - imgs, features = inference_image(im0, tracks) + # imgs, features = inference_image(im0, tracks) + imgs, features = ReIDEncoder.inference(im0, tracks) TrackerFeats = np.concatenate([TrackerFeats, features], axis=0) @@ -681,32 +689,17 @@ def main(opt): optdict = vars(opt) p = r"D:\datasets\ym" - p = r"D:\datasets\ym\exhibition\153112511_0_seek_105.mp4" + p = r"D:\exhibition\images\153112511_0_seek_105.mp4" + + optdict["project"] = r"D:\exhibition\result" files = [] - k = 0 if os.path.isdir(p): files.extend(sorted(glob.glob(os.path.join(p, '*.*')))) - for file in files: - - optdict["source"] = file - run(**optdict) - - k += 1 - if k == 1: - break + optdict["source"] = files elif os.path.isfile(p): optdict["source"] = p - run(**vars(opt)) - -def main_imgdir(opt): - check_requirements(ROOT / 'requirements.txt', exclude=('tensorboard', 'thop')) - optdict = vars(opt) - - optdict["project"] = r"\\192.168.1.28\share\realtime" - - optdict["source"] = r"\\192.168.1.28\share\realtime\addReturn\add\1728978052624" run(**optdict) @@ -745,7 +738,7 @@ def main_loop(opt): # break elif os.path.isfile(p): optdict["source"] = p - run(**vars(opt)) + run(**optdict) @@ -754,7 +747,6 @@ if __name__ == '__main__': opt = parse_opt() main(opt) - # main_imgdir(opt) # main_loop(opt) diff --git a/tracking/module_analysis.py b/tracking/module_analysis.py index 03a5579..4c653f2 100644 --- a/tracking/module_analysis.py +++ b/tracking/module_analysis.py @@ -24,7 +24,7 @@ from tracking.utils.drawtracks import plot_frameID_y2, draw_all_trajectories from tracking.utils.read_data import extract_data, read_deletedBarcode_file, read_tracking_output, read_returnGoods_file -from contrast.one2n_contrast import get_relative_paths, one2n_new, read_returnGoods_file +from contrast.one2n_contrast import get_contrast_paths, one2n_return from tracking.utils.annotator import TrackAnnotator W, H = 1024, 1280 @@ -362,10 +362,10 @@ def main_loop(): saveimgs = True if os.path.basename(del_barcode_file).find('deletedBarcode'): - relative_paths = get_relative_paths(del_barcode_file, basepath, SavePath, saveimgs) + relative_paths = get_contrast_paths(del_barcode_file, basepath, SavePath, saveimgs) elif os.path.basename(del_barcode_file).find('returnGoods'): blist = read_returnGoods_file(del_barcode_file) - errpairs, corrpairs, err_similarity, correct_similarity = one2n_new(blist) + errpairs, corrpairs, err_similarity, correct_similarity = one2n_return(blist) relative_paths = [] for getoutevent, inputevent, errevent in errpairs: relative_paths.append(os.path.join(basepath, getoutevent)) @@ -412,13 +412,13 @@ def main(): SavePath: 包含二级目录,一级目录为轨迹图像;二级目录为与data文件对应的序列图像存储地址。 ''' # eventPaths = r'\\192.168.1.28\share\测试_202406\0723\0723_3' - eventPaths = r'D:\datasets\ym\exhibition\识别错' - savePath = r'D:\contrast\dataset\result' + eventPaths = r'\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1120_展厅模型v801测试\扫A放A' + savePath = r'D:\exhibition\result' k=0 for pathname in os.listdir(eventPaths): - pathname = "放入薯片识别为辣条" - + pathname = "20241121-144901-fdba61c6-aefa-4b50-876d-5e05998befdc_6920459905012_6920459905012" + eventpath = os.path.join(eventPaths, pathname) savepath = os.path.join(savePath, pathname) if not os.path.exists(savepath): diff --git a/tracking/trackers/__pycache__/bot_sort.cpython-39.pyc b/tracking/trackers/__pycache__/bot_sort.cpython-39.pyc index 0c57999b7bb2d7a75e689366864b8680e53649ed..20786958ba5701b4494fcfa9853d373acbad5cd0 100644 GIT binary patch delta 795 zcmZvaPiPZC6vp>$Hk(a0yG?f6h9=Tj#FkuIi}o+AJrpa7wWYQdLN!gZleo4U%WMiF zDHiHM5Rvk(f))>6M3B9Sr(C3jO9!j7Hx8Ea1=B zeOSaTy#cd08UF#x!GIA0aB#$Y2dO}9*#Nbvlx|haxRn^R*Tr%D!$Zratbr!03hpJI z!Cmx{{bodDRq;-etBNm@=@avH>1N20H-OLA!(x>97|lFY>Pj7U#lqi(g#IIETzKPz-Dg1dG{ zChU5}3drKV=Dn9PpnbvJ#^-Tduj)MXgXkY~g_8HKRY>#7YoA3x< zw>97zZnkGfuM0mf5RSM=E)$Luii944T$HCMULln5Q+v-K6Jg$D-b%r7{hD9!ivB8h zDBt-9SrIk$3akD0^zY*7)GM@7w#vsvt`QuhW&rkZx}&bUw9F<{sa|2K*FJvh==!r#T*li(7wcfvXK#h_=_J0?(lw09Ceep6r&rC$ZafqvltG@uD6ur&> delta 746 zcmY+CO=uHQ5XW~mn`D#CZj)@9*c4iOs<~L|M;j|v!BPomQ>!AbwrQI861Hv9@;2$A z#)Gwpcq{MX!Gq$xAnQdCk%D+oya+wii_)7S=uL0V1P^uL{pRcc<_*I>&i@#-%BC4r z@GGyqsDA3(vfR-C)0fS<Ue>*S((C2^DCINDOcPIgHOb&+kA@3Xd5Wu*9I`Rr&O8$;MfTFx> z>_9IU z*e%qHS;7Gog>!_%gc4y8k&ASu67!TO%l-6Vs)DX#@%loExn9#N)yv+J{FzBvdq#~n z|0RbX$#a?KFprzCgJE7(VCB$Ii}vji%;WnSE&N8o4V)9~uR96(L1IwN$1ace4+xGZR^yX)jh0 zB0(AOCIY=Fx{So1&{fd=l2H&56@AxD1-QzZ{TciafrJG^IZRhkwLc* z9PP-KTcFFW#V)#%T1lZpIrkAjiTIjFB&|?U=TZFn z8gRPDq*kGO$%#A1nQ!=}r%993G=cqyG=aZ4X_QYA-}0lr?Z^CxA0H=0${E*2EotpV zVFH>GT*oF=8CVsWs?FbQBxH;1xb7$Yl<)X8QlHU56;XZh3YA1gxY0<`M5biT7?Vlq zjIrV>mL^4QmQr$Q+ocw%!(6SNdraUg#o^#x$1Zv=*pypSzXKT23hcGjr9rRPz1%-^ zz7(`Kx0a6qnK48jJJiJPV%3H461QrrI!N8BsVs2Cd)#>iP>6)5xS|_YRYSQ_)xab1 z6ba3PY7W)U)UtnwSG9{?XO)fQtL!SgBT$#Gc8awqdWWzMm9am+(9NO04Zso#-YSP3 z8fOi(mTse)nfMMnOYDsTsqEFE`#<)U$%&^+{q=M;aE1e)F=o+9OL;y$X@KRS;c>7$ z!8NeSuFzYAqhVkbRx-woTl#I&Ps%tq&oVLXVSZqjM=H!u4QHhdye{TXD}g5Fl>iP} z6xg20t*}<9!V6}}s7jS1tuqnnKn7AgHlcy}`=vEw%@UQHXqX#WQ)DU_VJzYg7B=pq zOuPvmcbsezZ(&5?$kp(1?qWT_so+3vt7R|7A-Iv-P!3ZdKA_|y!e0sK8y?1Rs04^l zxcM1j0RclGz99S#f%uBc>j-6pZwOBi{)xacF8Z$Ys>B6d`Dko6#-I&^Bo-XZw>JNT uDnolRRH*n;b`5Wn8@FDo_KvGt>~D^!?igbmb- zU>)eCRFa=i8t~R%;c3w#Uc`%E2QT&DJDcJQ^S;mXKJPp;40F)>OENXrbr8gz!c6n$ z^_|Q(?(bA~C-cN6P6yu`CIylvE}#)oBw3OJG)nLy@`eunY?pB?wkq@OFJM5gL8`0L z>okf`ZCJ7wq%lGS6QzT=+C*Fn5yKIt<4l#6YtYj}%(MtEpylKH3OBeJD$FEm34v~f zDnra7+9)cauGW)1o0%}X`$liCAnx!KPji=BJVSKYn2PWoA_gFLfLNNCd)mIiv&<#d znnK@&at>5tM+(n9DYF#xHF}ijDm_Yc@Hy3;P$$j+Z=(h#DU$A3%vnIu9OijuKQdUJ zWm%56uT_jTmYCf&dx#g9-nHN$E5fYMP`ccvenSRMMDFt!6I^>>%D+bd*kz-}VMs;fB1h9v1 ed6?c!Q1X+!lIU0WjpS#Yh}!H0JRx4qPW=OfzptbK diff --git a/tracking/utils/__pycache__/read_data.cpython-39.pyc b/tracking/utils/__pycache__/read_data.cpython-39.pyc index 3fc17b0bdd9470de7512b5136a42488f7e6f1529..5f04eaadea8f70a44167fc9f558f2b3920ffbd5a 100644 GIT binary patch delta 3918 zcma)9eQX>@72nz0+uPgwwC`f)9DmyhzI+%vO%oD1r3#LN(>8>}Bxz`}y4n zXts{a^mVIoK_ZeVAD6OiGYVP!>u1XC{_oC}Uw`x9?oN{^9j2e|!5) z9T}{PF3sg#!_2w4p6q>7`aaulAj5bsGQbRKhFz0~2xlM2J5nh)14qM?kaZFbqzSEOje(z} zTB`IU*+_IkGbx9fIBUDXJ^@Xb&!tWsA{lo-0V=!GdjC7eNqoj8U%Q zitw(h2s8xUEaY9_5t*MDz-uj_T!zkh~ zLU0Wt*op$Y!HLDw&)hsiJ5%jqXbiTx$rlJ;atawShPi7A_bmjc)1t0!39hJ)ng zm6IC=Nzx5^$pvCIjZ4=E{n7L>cC(?sylI)3;f%CQh%|i+I6?~qMnCaFo@(j?5>Pat z$TaF{K#2%SSWsHMFi@g`q6D5{{Gf_^+BEvaS#)=9$3GCk!fOCTLrJSnlq z8tYPaAEXHUKM9YgK&ohF#l}nVb(V)6v+vX&=%#tx`xrt2;Q@z!mz~}CX!&Uz9S7h+ zYu2(|uDEkk7M(x}+3K4E4Kp9;-)9TM&_0|}M1}~p+!<;gDi%$L+DM)P7@^w$KOy_G zVc*lHaYR_G>T|+kyQT9mB76>gFk43{vN{OE2y+NC2rj}b!Ucqj09+Ru8xsY`g@^~W zMN@;ClV|{D zQUxHZQV6R`YPrYY!nQg!V4UkGt-{!OcM!AQJ$ClP6`4Zg*4%|6HK~Wa;4I!#>s+{u zi36Pvt}RFCyB!pA8h|Phl_ZHq;)rsb#O1WSU8XO>NR643Kv*+#5;QM>k;mY~O)?;f zw+!KlNkW(yk_5T>M`3odES16Tsu`-}poB}hr!NJ- z7x1l^;blUf@pMx%_2*>p2_2S?c)IfzgJhS9Cl`e{aTo6)N<2h5mOlu|^L;>Usobg-{VQ3W*0*i>^_UKna<3ForE0i+NEm zV%Ec%XkM(mK%kQvki6hh*n@>3C!X*$ii-HtRz=3wC{;mm;7NmM9rm4o{UspRZViZ$#I`Vx{ zl{vygMcdj54-aC)7Ez{Gu37LQOt$+zMVJk)M$CLoDTQ%X&dNhW)j;AJEHqO5l5L6P zo0Ug~xGG3CFpl^sSVShKZXT)>Wqwx1#7mz+_!>ePAglkMBwXH&tQey-gn;Qdn-rOt zYsaDFdqAx6D4qs9e)83^XIB#O5R@lIzgz6*;nk*H&B5Ls(M>OjtLZsLHmA$$ ztIYiv(x-t#f=W_@V6GQot;-t07SxbL2`CWeNoZ?ChF}MTz{j=8(5r{> zB+S)F1N5RGZKq7X4bs=8g_Vyt9VCObd9<1Yx$37bEKF>tNO`1E^o|rJEgm`QSHRez zUF>4Zp*DI2_xE*#2VB35-EH}N5$hUyPr9tNM>fJkSacnQI_w4D=DNQ;9wSezTlF3@ ztz}dH0{jLpt3?75^K9n{2Fl^yW9Q()Jd})6PaaX{yu_G9Mi3+ z)81nL?$}JaSV!kMz{{N{&*JW~#5Zp(@9$PUe#9>#UIET|y$8={U;Ct!<$>WRzLHHr zk?dNNj$Z^|87`_%>es4lZ`T0X&t|)JHsIFjcM)C%;K2(no;v$YS5vRJB%+R+a|?Mx z)bl)M&e^%iwXS*rDslHbm+cFjsog!D;&AYGr{XH9o0=%Pc$I)zjr=7-7dE}W*(ufmImuuw4z zls<($<>_LZ{7+tNYaXaCr8tIX>}l&r=d zhCh82r^)d3gNpen!G!y@*6Vl>MfHD-YN{~7k1Ki`T3j;>95jqOBQ*x+_avXQkbXKQIC z-(A-~tVf=@FfFv$;Q}okAT}W-32DlVr&9`n@WKNRz!S`{4?F;Nnhs1l!wW-s;GC;O zb{M45x95EK=bU@a*>m;AnT1pFOifKhfX_dNJI5bBd?DUKZd`ceVw2fqv`mQfn%TH0 z5Wx_K1$EcdJHmxK?d9B*ojsT`XIz@ey1J2ZGif!FO1=N~&)1i}of@)AX5O;R)cW#^ z8&_7>zxUehH(uQM)=xHGy>a*EE9>9AlA>nD&`bBG@%7!M*}FGix^wmV#&_7pmw$Bk z=F6~V{o>DVuP*%Ur(a#a@yfT4o2{s^7WECrFY+2u-eaO9>g4JrOCB&#+sO{iKzB7)g>k7LG3N z(&QY?6inR@=FE)i3}|6I=!9jD>mwSw8vTKcrf8CVF4i311EMcal^_Zxt!Fba^(d_8 z3$++uXVS6ajOkQ0KIR8GNjvy*w=zR^`54`Y+qbj#V`^EGkn)3;ZJ0B#F(`UYlkFlc zz_a$A0iE-Pm33(&ZWwSa!w=*T#wgPx0aV#na#r3fW!&@hab$TwB;@E3_M1dEd7b?$(M3+J?W?`@p!E;yh8uBrKSa$^ zK9e=CiZqN{9AR%Io5(NNWc?SKQb-VlRsdffHYfWns!`C%+ZELVrt<23Fn zcN+bxc-n&!y06A7?hb*wKFQI;>}12Bj3Ec37aNX|ciEkWlO)eRwS8AZUK9jZ@C1Vx zq7isCuq-YOu=CrWA}_4n*xpZ=*wj`km~LO<#H-?WdCi(P2FED8jQm+8?lACl8l3 zB)$mX2hHbA+w~=Pwq(-N$dHao9#Wvp1$qwJJR|fGQ0Z9!ElN#yirPnuMZ=+Ikk$c4 z{!JcJ!xVl@dOXqDOF+h43801p9k)xBOQSozpC}<9Hc*O@uU%#y}mZe0P%$kvcFTi)DBJ zgN2E`=}GuGzXPy@d9t-Smafc;p149*h53LX%}cK61r|xaaOQ>6;(Tyk_T-fSjNwx< zf{;#mLZE|QS#ky^(_2W9o-;!85^xgzKJY<9!O2hsxEwNnkAbQKDN?CFKBl-bR+~q> z&>=`Yg>euoc zr)ZnK@Y5aGst=Omw85AlN+dxPxJ(f1h)Cifi;@I#3yFyeX%p$xTDf(Y^gnn$nu68* zWWGFVTI1(k4cd$C6sZ<1(PGwgoDr*FYSE!hg|@QBy+Z)Ewxg|!jIw9i9wpw| zH`@M0Dh*p@llxvKud$Ez<(ucxd>Nq{HW~xd%8X7fE9j4yFo@ss)an{JdHZx0!1eoJw!q19SLQKr0sq`(^qN`84|| z-FtQhhh`Dx0Q}&zi{T7T;~x$`=%5A{I95>@yS)FF=aZ{@?X6;O&s>;)F zk3tAVds<^(Q`42!y};g6camB52lW`a#2)H+YLACTF9E2MAI7-r{DRuz5c^6;YTLV5 zL=sFBplImjwRbu`K|a}v%M^M79)1X0ieXVYh??|V(X#1D5Gl{@ag;6tsFKD~oy|Lb zhy)L5HLku?$XNDGHr&}tuCb}k-#5@HoYjZRMEHk-j%h5{wY%@P=#31#00pcNdL1NR z(RJKF*VUvS(siSl)!~1QJyj^p@__pyHR%a=0: + Flag_1to1, Flag_1ton = True, False + continue + if line.find('oneTon')>=0: + Flag_1to1, Flag_1ton = False, True continue - # if line.endswith(','): - # line = line[:-1] - if flag: + if Flag_1to1: barcode = line.split(',')[0].strip() value = line.split(',')[1].split(':')[1].strip() - SimiDict[barcode] = float(value) + Dict['barcode'] = barcode + Dict['similar'] = float(value) + one2one_list.append(Dict) + continue - if flag and not line: - flag = False + if Flag_1ton: + label = line.split(':')[0].strip() + value = line.split(':')[1].strip() + + bcd = label.split('_')[-1] + if len(bcd)<8: continue + + Dict['event'] = label + Dict['barcode'] = bcd + Dict['similar'] = float(value.split(',')[0]) + Dict['type'] = value.split('=')[-1] + one2n_list.append(Dict) + + if len(one2one_list): SimiDict['one2one'] = one2one_list + if len(one2n_list): SimiDict['one2n'] = one2n_list return SimiDict diff --git a/tracking/说明文档.txt b/tracking/说明文档.txt deleted file mode 100644 index e69de29..0000000