From 64248b155779dacac1ed45b1e593da1ff0e55886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E5=88=9A?= Date: Tue, 21 Jan 2025 18:22:56 +0800 Subject: [PATCH] =?UTF-8?q?pipeline.py=20=E7=AD=89=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/event_test.cpython-39.pyc | Bin 6863 -> 6863 bytes contrast/event_test.py | 3 - .../__pycache__/config.cpython-39.pyc | Bin 1619 -> 1626 bytes .../__pycache__/inference.cpython-39.pyc | Bin 12007 -> 12152 bytes contrast/feat_extract/config.py | 3 +- contrast/feat_extract/inference.py | 23 +++++-- contrast/genfeats.py | 14 +++-- contrast/one2n_contrast.py | 51 +++++++++------ contrast/one2one_contrast.py | 13 ++-- contrast/onsite_contrast_pr.py | 2 +- .../utils/__pycache__/event.cpython-39.pyc | Bin 12493 -> 12477 bytes contrast/utils/event.py | 8 +-- pipeline.py | 59 +++++++++--------- track_reid.py | 2 +- tracking/module_analysis.py | 5 +- 15 files changed, 106 insertions(+), 77 deletions(-) diff --git a/contrast/__pycache__/event_test.cpython-39.pyc b/contrast/__pycache__/event_test.cpython-39.pyc index 0118aa4b36b63f1e8f0cfd0f00cc318b9e5510b6..4f87a3f2fc68501313223070f8bc043767caec17 100644 GIT binary patch delta 46 zcmX?adft>bk(ZZ?0SNSh+tYnF@@7gfuG?HL!O6(zy}41+m66keqn<&IgN=g`02a&& AZ2$lO delta 46 zcmX?adft>bk(ZZ?0SJD}<)%O0$eSs_xO;QC1Scb7#O6jxS4K`(j(P?;4iOGU06Pl{ Awg3PC diff --git a/contrast/event_test.py b/contrast/event_test.py index c4eb5a0..8346eb8 100644 --- a/contrast/event_test.py +++ b/contrast/event_test.py @@ -169,9 +169,6 @@ def calc_simil(event, stdfeat): Similar = None # 在event.front_feats和event.back_feats同时为空时 return Similar - - - def simi_matrix(): diff --git a/contrast/feat_extract/__pycache__/config.cpython-39.pyc b/contrast/feat_extract/__pycache__/config.cpython-39.pyc index 2141ac1fd9880a3189b0f076deb666f72ec63284..d04ca1396a17b1d0dca54409854bfddbf9b7ddce 100644 GIT binary patch delta 621 zcmYjPy>8S%5Vr5v@%at}1r10bQKaDSB8mt>gcKws%Ht%Y5t6mGC%)ypJJ#+TQPSiQ zC@da;l7b?l;3epwa!JnvK*ib)%55?FX6O6nZ}&%3M^iDKhMqg0o`1-{oligd69^1i zjXd9nuV4JYf4rNnFkP1ybh>GKE2!2n91#31(T7%*s=QFf&xfMzACZr0Q<#FcF-tT1M?J zVSGrcB#RI%X^GmBfzbk6{cIt0MruLaq|h)qq=L-&m1IT()zAL@Gq}P=NF6(??GYK* z1f%6GKkNvGh+(IVZNWlXb}1S~ZfH}+?`%_NYd`ha?S;u8OfNvJD8mAxMm7Jx2?*LG z??nM&i#pQPuK4A|P@NBM%wdO0mdfqO)V;#MxG=G0EFo|p!&IC=bc`}z@r76Y8QggW zVd*ASsK}haL~m4lOlFP7LfAFm6#nd)o9^{n^LPH@$=eJWQ|9W;(Da9cLG^uj+rM7@ r9_}7oYk2N~y?T_AK9c#RvO~9;Sn$-1vMKPu{Q}R9oC*A>KYRTTTU6Ad delta 643 zcmYjPJ&)5s5Val0@i`w{O)5@TfW(19g-!w;x|5KQXrhz|%U;hVOT0VQ?B1P1lZJm_ z@gpcG5I==(=#l8Ds94)~B)i(to7tH+J5S4_AER+L9w(k#Z-0GSZoZ8_`$LWij0QV< z&fmZKv48SFtU#^0DuET>lP^eXb|H*ISPBOssR% zz>xw=QgA5pOz{L%4n-mLGBxrea8eLfDP>k7$5P!z^UR7>m*FpXaE_`%0~{}K0oovO zG>5i+GS75@YL2#{&^$cH5^3;8S_{PW&)&(F?^(*EPMy`}63IQnHk0i9q)Q+~%Lnb< z9xSD?j-shp5?)p52h;S~6NU#)6pI8rz6Ghm0!kh=Ronkc#4X8nR&vs!F6ppqzBh5# zY%kD<3dM>Ku(DD))rf-CzVq`fkN8w zP+zI^25AjsIO&FJ9`wbdGxr@@^LKV}`tAZO2)n4?_vyG7_Cr4m+}Z8me&Yw^et`EV fqNDmx|KZWJp=cr;3DlQzxg+h+tNLX$_2>Tp&v)vm diff --git a/contrast/feat_extract/__pycache__/inference.cpython-39.pyc b/contrast/feat_extract/__pycache__/inference.cpython-39.pyc index 7a0a3ca913dd9d738c7887281192be1948150080..d37e16741354ee12c403ca3f3e72e094aa7d9089 100644 GIT binary patch delta 2824 zcmZ`*eQZDMG@_7lcCFbt!`^3y@Tlwp$~tQSXuW?AXLka{U5H zd7f3!M*k=jdfIA5Q|ELa6$o`jk6j5YiRgm zwdLPC_ndRjz4x5oxzB$+@UO?hMkwT$@bky9r?Z>)T?~)Os%hEQv~9zF*$Kzcq~Pz1 z_$xW^XZhaBJ74vb)w1SjRe43CXI?=~UD{aN$TXyrw*f6C9-)bs{SagQ%tw$58qDCdpI}dH7a4mTzzrQ#G}dp0eV|=&6ur zRw^qCTkUm@a-5xJeB)>N*{s@Vsu-~;GwH$I`5bvnI&dF`lB#hERgRiLz~=kBxl+)t}@ zK|Mhm!Tki=3BEu;-N)kuI|!)Ad?&#u0rjL_&)4I_m2(9HH}EBr*>0Cjxh&0hlh+X-PqFqkQyJ$sPzNgDaE?8E#)^4UeOkKiFV)7#*`3&n%@D~&*Fu#;)9Ggt^bOm?#H z9&&;k!5AA{{V14Z>;U{H)X83e)^H-UfF8PskCEdvjE28GD9-aJjrS8!8gxZCxbi{6 zo}Q`Y&C9J4pMXH5n|&WPN8%8RrtUq*_MVdk<+*ix@>;6S)xy;BX_H-?%#$m?pVl?O zKO%v|tEeqeswJeahSb$q5Gl-$!tTiaAU{HrmI#(%DZ0MnH5C7!yMy}iX&L?*Y+n6! zG~{8E@Nuk{eE?cRhJBs#k$M7MKB7p+5b%IUNft$>(z3Sc}&2x&UYqcy9 z8>pde!3I~hxq)mEbryxO;lqYDb`AdBuz{U`&UH?uj5GG)5)@@^34WZ0pYlUj*TVB} zkV%m3o1Z#~;5{@H(2J5A$XJHG$nk1O56cX55k##Npq{7ifQLVc7gMrvOry-{K0XZD z#`{A_a-};c^)0yI@>DY z%`i7-yDY{p<}G zYPVZOA>`Ut*0v`$bq`!_--FE2I@Ys!80bi_>oDGNh4sM`{mszc+0T9k6P+zeg_fFx zd}lkp2T?o*r#g3zilQARQ#b7*BDO6WR=hj-2{J_p#1$pjMa$x=$CzEjV_b*&uBrG0 zd5n=>&hoj%dHxtFu0f@%4?E|4R~LJK^+wm5UiKWE-7urvAnRM=8hRVW7i;_3(6e}l zrGYHp5f<{M>pBI$>@n_e@srEt+GINHe|z*hti5Etayvlw>KI`CEbO zy<3_2%*Jk3g$*0ej*AP7c+52d%1e#g;&P-05as8mQF2v$TjvUkg&IN5lkw*S7eLna zoj)S+74p+cmYrUn%@z1X(*2NNm7o(r@8<8}Bc&AQjT|rW-;&{X2rkU&pTib9r@z}s zEayKVxJ+<`;HU6(-!MA`SNni{0$=Gb+;RK}9se%euDGlC+wiyk31-5!ff2vpHc>bQ zM+Y_|KQ0VxVi(}Ufd|rA3cEnS35Xf4@@1=7n&Y+0&LNFY5M6KsuZmkOBD&)e4X+Zs zL2#YmeS%L2z6K`-$C(Rn4aQAk3x5Z}RRm>9{1>G84MBu}DC8=O^Z19y;%}1Xb%K{k mUE`^km(G{wimsN)&00mHV2QSNeKh3n!JeUAY#GiBJ^DZC!N8;d delta 2629 zcmZ`(eQXrh5#PDn+ub|gmwmR+#*RP0!JLh8oR|bKG>{q+N<`8ms)-xtSiI}wjPK5V zyH0`b)dg3TqCi4BRU`~i&r~R-N-9~d(vO5%O+y+g(Ijf6(nYN*RV_lQls_A_f3!32 zLhOHP>wf#*%x~t+o0&JCK7V^GZpLB}h5p(;`BrY|;8J`zqz~J!J?=h(&xX8slvEo1 zzDPf(2mcn@Hh22DKv^#vo>2)cD)dzJ7+6zyHd2a>ILM1}X za527CRt|ewrN#>{0w|tt1=9+#qm7EC9t(&;H#QmfG)uKYX9H!;3lUReW=@$aYcqpx z!qetK-28tu7b;0hC5N>W0SZm^Lc_|~Hgcp?>ex{^VrgE)ja5=!WD#~MUZhgLs7y9g z8Y$2kvQB%dS5vi}`KPBotz`7s?UaK^2OiV63(v88Y~?(F{@ip>Y7a z!}mQjNJK@ALK2LC3Mzjg0&%Dh!~+qiqg4d7fWhCuU0ocKxDeh7f5DH!_ro9tBOe@c zYd9s8Q2ki&9EesgHW_1yWl&1v6lsi7x<*!xd3we0Vlt)S&r+J8lmex6vzwf(r9^`j z#{Whd=IT6s9?0vrSLKvyor+?3I(u-HO3DH{uU_VX%0W5YK@6qRz>IRjig*b(S!whV zGKYyunsV4wX{N}MWWCOdd&#QpIha}S3@<(rpiI^r6rjv0${m%`Btist0t`Xkh8Z#p zJq*1JeFT{n(N7;geD@v9NLrQGsWcj|}`dwHkk3#r_I*vINU439EAh6CNH$N(*$rJu7Km!chk zU=mM;JMfd}lQsL9#A>mTnK%}!gRbT2SPQ@io{4wB%lKxzIW|R%Oh9~riO=Kj;}`qn zr4I7`X$DS9Mw0|Tbi{PWkBTQqD_@{)`fB3G=YMQQ8t*dD* zv0h#)kS~ZKoJzLCW$dd>T|e(+>|TCl&2QN1)5+Yc6PR~Fk3 zxx%DokhPP^E@7em9=M7x)!z%JajD*$J5Ck{=?M0+dW84}Z$GbjMqhO=zR4=tOQ$|3 zN#`4RE1{cKe$9k!y0e11G&}Hb5;#0im6`}m0RG<`5c7(HZ!`=WoTrQ``tj3-U9lt( zl^=xy;zfL<@zr+O{JQCwLYOCnEGC!LR|~dT6i?#68v9`wyVF~t9>>z1@CweQZ$cj) zYPtpeIM_UrJWq7-8pHP)7V$!JJ8ZzWn>%4?`OnQ~z&Jl$L#tHmj z$(a`Gcq^Zkd{Jk3`yzup?iF6W!ys=SlK0Le{b)6zcGk*|yTT^IXxOzKH!Dgd*M|v_ zV^P$}7xGi4XwAEMYU-b|pFG1T0YAUo{o(>X+_nWSVX>_X9!G5Jh4*l!&25#12vtK_ z4NnI36h6_uAKu0D?Hjj0~o78mgVVpI6-Ove@D!TKPJS@qA&nP;H0Hto$Xz>-cIWvuBx?SD0rwwwpaM zMWg2pmi>s~#|#|=nJ#gIKBHQ3+RO__e8h^6S@PYU?et!D^nBdFEiHb=@NyX1Am*Irx7|QeTtp;)oTd{Ei{P!0qE}v(uL8+Tu4X`8C5Og3)SMO1tc&Q!4t# cM1IOHngv@NCcUrnR@^{;%cD@l_5EM@A9>1)NdN!< diff --git a/contrast/feat_extract/config.py b/contrast/feat_extract/config.py index 2fc5c78..bfc5af4 100644 --- a/contrast/feat_extract/config.py +++ b/contrast/feat_extract/config.py @@ -61,8 +61,9 @@ class Config: test_val = "D:/比对/cl" # test_val = "./data/test_data_100" - test_model = "checkpoints/best_resnet18_v12.pth" + # test_model = "checkpoints/best_resnet18_v12.pth" # test_model = "checkpoints/zhanting_res_801.pth" + test_model = "checkpoints/zhanting_res_abroad_8021.pth" diff --git a/contrast/feat_extract/inference.py b/contrast/feat_extract/inference.py index 70ff84a..5c75ed8 100644 --- a/contrast/feat_extract/inference.py +++ b/contrast/feat_extract/inference.py @@ -61,8 +61,17 @@ class FeatsInterface: batch_patches = [] patches = [] for i, img in enumerate(images): - img = img.copy() - patch = self.transform(img) + img = img.copy() + + ## 对 img 进行补黑边,生成新的图像new_img + width, height = img.size + new_size = max(width, height) + new_img = Image.new("RGB", (new_size, new_size), (0, 0, 0)) + paste_x = (new_size - width) // 2 + paste_y = (new_size - height) // 2 + new_img.paste(img, (paste_x, paste_y)) + + patch = self.transform(new_img) if str(self.device) != "cpu": patch = patch.to(device=self.device).half() else: @@ -107,10 +116,12 @@ class FeatsInterface: 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) + # if str(self.device) != "cpu": + # patch = patch.to(device=self.device).half() + # patch = patch.to(device=self.device) + # else: + # patch = patch.to(device=self.device) + patch = patch.to(device=self.device) patches.append(patch) if (d + 1) % self.batch_size == 0: diff --git a/contrast/genfeats.py b/contrast/genfeats.py index ad3d0fd..8c4a6f6 100644 --- a/contrast/genfeats.py +++ b/contrast/genfeats.py @@ -158,6 +158,8 @@ def stdfeat_infer(imgPath, featPath, bcdSet=None): feature /= np.linalg.norm(feature, axis=1)[:, None] + feature_ft32 = feature.astype(np.float32) + # float16 feature_ft16 = feature.astype(np.float16) feature_ft16 /= np.linalg.norm(feature_ft16, axis=1)[:, None] @@ -173,7 +175,7 @@ def stdfeat_infer(imgPath, featPath, bcdSet=None): ##================== float32 stdbDict["barcode"] = barcode stdbDict["imgpaths"] = imgpaths - stdbDict["feats_ft32"] = feature + stdbDict["feats_ft32"] = feature_ft32 stdbDict["feats_ft16"] = feature_ft16 stdbDict["feats_uint8"] = feature_uint8 @@ -202,9 +204,13 @@ def gen_bcd_features(imgpath, bcdpath, featpath, bcdSet=None): stdfeat_infer(bcdpath, featpath, bcdSet) def main(): - imgpath = r"\\192.168.1.28\share\数据\已完成数据\展厅数据\v1.0\比对数据\整理\zhantingBase" - bcdpath = r"D:\exhibition\dataset\bcdpath" - featpath = r"D:\exhibition\dataset\feats" + imgpath = r"\\192.168.1.28\share\数据\已完成数据\展厅数据\v2.0_abroad\比对数据\all_base_二筛" + bcdpath = r"D:\exhibition\dataset\bcdpath_abroad" + featpath = r"D:\exhibition\dataset\feats_abroad" + if not os.path.exists(bcdpath): + os.makedirs(bcdpath) + if not os.path.exists(featpath): + os.makedirs(featpath) gen_bcd_features(imgpath, bcdpath, featpath) diff --git a/contrast/one2n_contrast.py b/contrast/one2n_contrast.py index 83458ba..fdc6789 100644 --- a/contrast/one2n_contrast.py +++ b/contrast/one2n_contrast.py @@ -92,9 +92,9 @@ def simi_calc(event, o2nevt, typee=None): feat2 = o2nevt.front_feats '''自定义事件特征选择''' - if typee==3: - feat1 = event.feats_compose - feat2 = o2nevt.feats_compose + if typee==3 and len(event.feats_compose) and len(o2nevt.feats_compose): + feat1 = [event.feats_compose] + feat2 = [o2nevt.feats_compose] if len(feat1) and len(feat2): @@ -109,15 +109,18 @@ def one2n_pr(evtDicts, pattern=1): ''' pattern: 1: process.data 中记录的相似度 - 2: 根据 process.data 中标记的 type 选择特征计算 - 3: 以其它方式选择特征计算 + 2: 根据 process.data 中标记的 type 选择特征计算相似度 + 3: 以其它方式选择特征计算相似度 ''' tpevents, fnevents, fpevents, tnevents = [], [], [], [] tpsimi, fnsimi, tnsimi, fpsimi = [], [], [], [] - errorFile_one2n = [] + one2nFile, errorFile_one2n = [], [] for evtname, event in evtDicts.items(): evt_names, evt_barcodes, evt_similars, evt_types = [], [], [], [] + + if len(event.barcode)==0: + continue for ndict in event.one2n: nname = ndict["event"] @@ -149,6 +152,13 @@ def one2n_pr(evtDicts, pattern=1): continue evt_similars.append(simival) + ## process.data的oneTon的各项中,均不包括当前事件的barcode + if event.barcode not in evt_barcodes: + errorFile_one2n.append(evtname) + continue + else: + one2nFile.append(evtname) + if len(evt_names)==len(evt_barcodes) and len(evt_barcodes)==len(evt_similars) \ and len(evt_similars)==len(evt_types) and len(evt_names)>0: @@ -166,7 +176,7 @@ def one2n_pr(evtDicts, pattern=1): elif bcd!=event.barcode and simi!=maxsim: tnsimi.append(simi) tnevents.append(evtname) - elif bcd!=event.barcode and simi==maxsim and event.barcode in evt_barcodes: + elif bcd!=event.barcode and simi==maxsim: fpsimi.append(simi) fpevents.append(evtname) else: @@ -187,7 +197,7 @@ def one2n_pr(evtDicts, pattern=1): TN = sum(np.array(tnsimi) < th) PPrecise.append(TP/(TP+FP+1e-6)) - PRecall.append(TP/(len(tpsimi)+len(fnsimi)+1e-6)) + PRecall.append(TP/(len(one2nFile)+1e-6)) NPrecise.append(TN/(TN+FN+1e-6)) NRecall.append(TN/(len(tnsimi)+len(fpsimi)+1e-6)) @@ -202,23 +212,23 @@ def one2n_pr(evtDicts, pattern=1): ax.set_ylim([0, 1]) ax.grid(True) ax.set_title('1:n Precise & Recall') - ax.set_xlabel(f"Event Num: {len(tpsimi)+len(fnsimi)}") + ax.set_xlabel(f"Event Num: {len(one2nFile)}") ax.legend() plt.show() ## ============================= 1:n 直方图''' fig, axes = plt.subplots(2, 2) axes[0, 0].hist(tpsimi, bins=60, range=(-0.2, 1), edgecolor='black') axes[0, 0].set_xlim([-0.2, 1]) - axes[0, 0].set_title('TP') + axes[0, 0].set_title(f'TP: {len(tpsimi)}') axes[0, 1].hist(fpsimi, bins=60, range=(-0.2, 1), edgecolor='black') axes[0, 1].set_xlim([-0.2, 1]) - axes[0, 1].set_title('FP') + axes[0, 1].set_title(f'FP: {len(fpsimi)}') axes[1, 0].hist(tnsimi, bins=60, range=(-0.2, 1), edgecolor='black') axes[1, 0].set_xlim([-0.2, 1]) - axes[1, 0].set_title('TN') + axes[1, 0].set_title(f'TN: {len(tnsimi)}') axes[1, 1].hist(fnsimi, bins=60, range=(-0.2, 1), edgecolor='black') axes[1, 1].set_xlim([-0.2, 1]) - axes[1, 1].set_title('FN') + axes[1, 1].set_title(f'FN: {len(fnsimi)}') plt.show() return fpevents @@ -226,14 +236,14 @@ def one2n_pr(evtDicts, pattern=1): def main(): '''1. 生成事件字典并保存至 eventDataPath, 只需运行一次 ''' - init_eventdict(eventSourcePath, stype="source") + init_eventdict(eventSourcePath, stype="data") '''2. 读取事件字典 ''' evtDicts = read_eventdict(eventDataPath) '''3. 1:n 比对事件评估 ''' - fpevents = one2n_pr(evtDicts, pattern=3) + fpevents = one2n_pr(evtDicts, pattern=1) fpErrFile = str(Path(resultPath).joinpath("one2n_fp_Error.txt")) with open(fpErrFile, "w") as file: @@ -243,15 +253,16 @@ def main(): if __name__ == '__main__': - eventSourcePath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\ShoppingDict_pkfile" - resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\contrast" + eventSourcePath = r"\\192.168.1.28\share\测试视频数据以及日志\海外展厅测试数据\比对数据" + resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\海外展厅测试数据\testing" eventDataPath = os.path.join(resultPath, "evtobjs") - similPath = os.path.join(resultPath, "simidata") if not os.path.exists(eventDataPath): os.makedirs(eventDataPath) - if not os.path.exists(similPath): - os.makedirs(similPath) + + # similPath = os.path.join(resultPath, "simidata") + # if not os.path.exists(similPath): + # os.makedirs(similPath) main() diff --git a/contrast/one2one_contrast.py b/contrast/one2one_contrast.py index 8ccc34e..db02389 100644 --- a/contrast/one2one_contrast.py +++ b/contrast/one2one_contrast.py @@ -626,12 +626,13 @@ if __name__ == '__main__': # eventSourcePath = [r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1129_展厅模型v801测试组测试"] - stdSamplePath = r"\\192.168.1.28\share\数据\已完成数据\比对数据\barcode\all_totalBarocde\totalBarcode" - stdBarcodePath = r"D:\全实时\source_data\bcdpath" - stdFeaturePath = r"D:\全实时\source_data\stdfeats" + stdSamplePath = r"\\192.168.1.28\share\数据\已完成数据\展厅数据\v2.0_abroad\比对数据\all_base_二筛" + stdBarcodePath = r"\\192.168.1.28\share\测试视频数据以及日志\海外展厅测试数据\testing\bcdpath" + stdFeaturePath = r"\\192.168.1.28\share\测试视频数据以及日志\海外展厅测试数据\testing\stdfeats" - eventSourcePath = [r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\ShoppingDict_pkfile"] - resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\contrast" + eventSourcePath = [r"\\192.168.1.28\share\测试视频数据以及日志\海外展厅测试数据\比对数据"] + + resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\海外展厅测试数据\testing\evtobjs" eventDataPath = os.path.join(resultPath, "evtobjs") similPath = os.path.join(resultPath, "simidata") if not os.path.exists(eventDataPath): @@ -639,7 +640,7 @@ if __name__ == '__main__': if not os.path.exists(similPath): os.makedirs(similPath) - # test_one2one() + test_one2one() test_one2SN() diff --git a/contrast/onsite_contrast_pr.py b/contrast/onsite_contrast_pr.py index 5786d93..f774d4f 100644 --- a/contrast/onsite_contrast_pr.py +++ b/contrast/onsite_contrast_pr.py @@ -495,7 +495,7 @@ def contrast_pr(paths): if __name__ == "__main__": - evtpaths = r"D:\全实时\source_data\2024122416" + evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images" contrast_pr(evtpaths) diff --git a/contrast/utils/__pycache__/event.cpython-39.pyc b/contrast/utils/__pycache__/event.cpython-39.pyc index ab0537de9e451cbf283468af36ba093d3558ef58..4627a1a0b19c5f30f7191daa3ccce5697fd9461e 100644 GIT binary patch delta 3168 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 diff --git a/contrast/utils/event.py b/contrast/utils/event.py index df25689..4cb7367 100644 --- a/contrast/utils/event.py +++ b/contrast/utils/event.py @@ -202,10 +202,10 @@ class ShoppingEvent: self.front_trackingfeats = frontdata[5] '''===========对应于 0/1_tracking_output.data =============================''' - self.back_boxes = back_outdata[0] - self.back_feats = back_outdata[1] - self.front_boxes = front_outdata[0] - self.front_feats = front_outdata[1] + self.back_boxes = back_outdata + self.back_feats = back_outdata + self.front_boxes = front_outdata + self.front_feats = front_outdata def from_datafile(self, eventpath): diff --git a/pipeline.py b/pipeline.py index a2600e7..7a7d3c9 100644 --- a/pipeline.py +++ b/pipeline.py @@ -103,14 +103,16 @@ def pipeline( # if pf_path.exists(): # return - + + + '''====================== 构造 ShoppingDict 模块 =======================''' ShoppingDict = {"eventPath": eventpath, "eventName": evtname, "barcode": barcode, "eventType": '', # "input", "output", "other" "frontCamera": {}, "backCamera": {}, - "one2n": [] + "one2n": [] # } @@ -121,7 +123,7 @@ def pipeline( for vpath in vpaths: - '''相机事件字典构造''' + '''================= 1. 构造相机事件字典 =================''' CameraEvent = {"cameraType": '', # "front", "back" "videoPath": '', "imagePaths": [], @@ -140,21 +142,21 @@ def pipeline( if bname.split('_')[0] == "1" or bname.find('front')>=0: CameraEvent["cameraType"] = "front" - '''事件结果存储文件夹''' - + '''================= 2. 事件结果存储文件夹 =================''' if isinstance(vpath, list): savepath_pipeline_imgs = savepath_pipeline / Path("images") else: savepath_pipeline_imgs = savepath_pipeline / Path(str(Path(vpath).stem)) + if not savepath_pipeline_imgs.exists(): - savepath_pipeline_imgs.mkdir(parents=True, exist_ok=True) - + savepath_pipeline_imgs.mkdir(parents=True, exist_ok=True) + savepath_pipeline_subimgs = savepath_pipeline / Path("subimgs") if not savepath_pipeline_subimgs.exists(): savepath_pipeline_subimgs.mkdir(parents=True, exist_ok=True) - '''Yolo + Resnet + Tracker''' + '''================= 3. Yolo + Resnet + Tracker =================''' optdict["source"] = vpath optdict["save_dir"] = savepath_pipeline_imgs @@ -162,11 +164,8 @@ def pipeline( CameraEvent["yoloResnetTracker"] = yrtOut - - # bboxes = np.empty((0, 9), dtype = np.float32) - # for frameDict in yrtOut: - # bboxes = np.concatenate([bboxes, frameDict["tboxes"]], axis=0) - + '''================= 4. tracking =================''' + '''(1) 生成用于 tracking 模块的 boxes、feats''' trackerboxes = np.empty((0, 9), dtype=np.float64) trackefeats = {} for frameDict in yrtOut: @@ -179,7 +178,7 @@ def pipeline( trackefeats.update({f"{fid}_{bid}": ffeats[f"{fid}_{bid}"]}) - '''tracking''' + '''(2) tracking, 后摄''' if CameraEvent["cameraType"] == "back": vts = doBackTracks(trackerboxes, trackefeats) vts.classify() @@ -187,7 +186,8 @@ def pipeline( CameraEvent["tracking"] = vts ShoppingDict["backCamera"] = CameraEvent - + + '''(2) tracking, 前摄''' if CameraEvent["cameraType"] == "front": vts = doFrontTracks(trackerboxes, trackefeats) vts.classify() @@ -196,11 +196,12 @@ def pipeline( CameraEvent["tracking"] = vts ShoppingDict["frontCamera"] = CameraEvent - + '''========================== 保存模块 =================================''' + '''(1) 保存 ShoppingDict 事件''' with open(str(pf_path), 'wb') as f: pickle.dump(ShoppingDict, f) - - + + '''(2) 保存 Tracking 输出的运动轨迹子图,并记录相似度''' for CamerType, vts in event_tracks: if len(vts.tracks)==0: continue if CamerType == 'front': @@ -215,16 +216,14 @@ def pipeline( imgdict.update(y["imgs"]) featdict.update(y["feats"]) simidict.update(y["featsimi"]) - - + for track in vts.Residual: if isinstance(track, np.ndarray): save_subimgs(imgdict, track, savepath_pipeline_subimgs, ctype, featdict) else: save_subimgs(imgdict, track.slt_boxes, savepath_pipeline_subimgs, ctype, featdict) - - '''轨迹显示模块''' + '''(3) 轨迹显示与保存''' illus = [None, None] for CamerType, vts in event_tracks: if len(vts.tracks)==0: continue @@ -279,15 +278,15 @@ def main(): if item.is_dir(): # item = evtdir/Path("20241209-160201-b97f7a0e-7322-4375-9f17-c475500097e9_6926265317292") parmDict["eventpath"] = item - pipeline(**parmDict) + # pipeline(**parmDict) - # try: - # pipeline(**parmDict) - # except Exception as e: - # errEvents.append(str(item)) - k+=1 - if k==2: - break + try: + pipeline(**parmDict) + except Exception as e: + errEvents.append(str(item)) + # k+=1 + # if k==100: + # break errfile = os.path.join(parmDict["savepath"], f'error_events.txt') with open(errfile, 'w', encoding='utf-8') as f: diff --git a/track_reid.py b/track_reid.py index 9a3f029..0c1843a 100644 --- a/track_reid.py +++ b/track_reid.py @@ -216,7 +216,7 @@ def yolo_resnet_tracker( # Rescale boxes from img_size to im0 size det[:, :4] = scale_boxes(im.shape[2:], det[:, :4], im0.shape).round() - # det = det.cpu().numpy() + det = det.cpu().numpy() ## ================================================================ writed by WQG '''tracks: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index] 0 1 2 3 4 5 6 7 8 diff --git a/tracking/module_analysis.py b/tracking/module_analysis.py index 4c653f2..8318163 100644 --- a/tracking/module_analysis.py +++ b/tracking/module_analysis.py @@ -2,7 +2,10 @@ """ Created on Thu May 30 14:03:03 2024 -现场测试性能分析 +轨迹分析现场测试性能分析: +(1) 读取 data 文件中的轨迹数据,绘制轨迹图 +(2) 读取本地运行 Yolo+Rsenet+Tracker+Tracking 的数据,绘制轨迹图 + @author: ym """