From 1e6c5deee4c5f35c16b3f3f9825a1b7fadaddc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E5=88=9A?= Date: Thu, 5 Dec 2024 10:23:03 +0800 Subject: [PATCH] =?UTF-8?q?modify=201:1=20=E6=AF=94=E5=AF=B9=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/track_reid.cpython-39.pyc | Bin 15877 -> 15846 bytes contrast/__pycache__/genfeats.cpython-39.pyc | Bin 4373 -> 4304 bytes .../__pycache__/config.cpython-39.pyc | Bin 1620 -> 1618 bytes contrast/feat_extract/config.py | 2 +- contrast/genfeats.py | 2 + ...feat_select.py => input_getout_compare.py} | 0 contrast/one2one_contrast.py | 584 +++++++++++------- contrast/one2one_onsite.py | 77 ++- .../{feat_similar.py => seqfeat_compare.py} | 0 .../{feat_analysisi.py => stdfeat_analys.py} | 0 .../utils/__pycache__/event.cpython-39.pyc | Bin 0 -> 4048 bytes contrast/utils/event.py | 179 ++++++ pipeline.py | 82 +-- time_devide.py | 11 +- track_reid.py | 156 ++--- .../__pycache__/read_data.cpython-39.pyc | Bin 11930 -> 11945 bytes tracking/utils/read_data.py | 16 +- 说明文档.txt | 17 +- 18 files changed, 728 insertions(+), 398 deletions(-) rename contrast/{feat_select.py => input_getout_compare.py} (100%) rename contrast/{feat_similar.py => seqfeat_compare.py} (100%) rename contrast/{feat_analysisi.py => stdfeat_analys.py} (100%) create mode 100644 contrast/utils/__pycache__/event.cpython-39.pyc create mode 100644 contrast/utils/event.py diff --git a/__pycache__/track_reid.cpython-39.pyc b/__pycache__/track_reid.cpython-39.pyc index 47bda467f70165b05197cdc949ff37edbf5a9c88..736b8a3cfe5184de400d9a2d724b78b8d6c170c1 100644 GIT binary patch delta 5858 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 SkGfi19+&PabTxW_`TqbRH}gXP diff --git a/contrast/__pycache__/genfeats.cpython-39.pyc b/contrast/__pycache__/genfeats.cpython-39.pyc index ca68b228770637386fbf48ea72be2c30d6a4d406..fefdfa9ed0c460c0039b0433aa30a6efa96da7b5 100644 GIT binary patch delta 2319 zcmZuzTW=dh6rP#g^{&_UdhJ}Cgf^t*)(D8=wkj!VB?#q`3QAFds!>|k^=w=xv6GCq z5md8S-~xHzQdlY>l}fgdkl+DmK|)BpA@P8C=<_}RQq@X@f4~Fcn~ei)#ja-NTxQOG zbLKl^U)X+i+k@py#wK{)di_v!ew2`FO1bsXpge}weCvY;?;kKY<=RrBZqAyNK-QP6 zdh&zD&=fbhb&kwB+~rAbpQE!`p5rN=hUD@Lci_u;d7fQl;tem?CRojmknwz|)BP=D zre3ak<1|WCmK*c6DkSGAuk1Hx8onpy%N1{2KdVois;{75SgD>h(0f%VD~)PJA>4e1 zASBV0t?4jAswB{S(xL05OAnCavw`lD1=i8liPXC+FqGEn=+fv?;Yht>bct~Mgw)%V z(?uetR~^YXJ43|FQtOylL@9wymuw9)Z?(Nm=8+t(pR=TPfV63l;6`8qfF%BGWRtj{tpA+A;d8b6SuIoFI#! zE;psKhOpvbFJOk7*ilaHR_5aQQ$fDx%gH=^eX(ZCzAgon{$M~3_^CD8LXaJ+e@Pen zgA4onOMQBnbkfpQI>l#JKWR+MEK<1d-=LZQ2|BnL6fs}Jszd)pjkVk2uKpYYTGnn! zhRQ`ornuE+?{5hTzSGG9OrgstISS6`L?>;Hl19D=P|aT_0ZzTg(0p)DCG`?(t4*v! zw{etKn{L`-&ZWM&tbI-sH!X1FP&jLRO819<8#CcEiS0BOE+&Tijark}L}aR=TJs}q z$!mn|#PcKLLn4D!k<~1(c`IfAbd)$%;YU0_3U4OvaUu)aVVIi{U5vsJ^LZMD3+8iM z?^ASq5gp0s)WJJO8MSCyH7)$v9HVylr#aGMu92r=FXr9G>bqb_p*?}toB*rA4-E}m z_9=*lstgi7SS@3gpJ&Id!1UPy=q%0ntgRp!>j_C6;z1OM=YV$hV};bsW)1;P}aoEuAh6vN#~^-ve@sr1{0I z$0M_yRF{B3AA@{ukOPVHep=?*sxY^}*7s1*?`Jxe>_@NxneRAqAg1G0X@CWJSO?{x z?=IvP@^UcDB?k)7JAJUI6$M%7`3lO{g3ir;68jM+7+U?|C}}*Z6MyhLef2|1f?-O| zj`;;{NfR4Q%3<&Xg|C=)3|k3?UmI@N8{;IIB+`{>Zto*9hcSh55Mvr+0b>T^5Jm?T zi#q06Cnm7U4$RUCe@hmg_~W*G3`$M9@p4^_z3h$vkSkpP%E=L#86rG?QRjV^jF{A; z-|V%2qFak#LS)aYJF+zI@7npFT-+0dThhBv=xTeKt)qn}xQsZQ2ketgEObZ$3&^EiO`(W1mQZ zi%nD4l}{nD4VhE?@UgJ&jK09)T90Fm>oM&3ei28od?SAeCB>ZsDRQe`ql7G#dfRFK z2x~Kjp{F%*GQ8$I{>%y3=H`lfcTN=dOidIgc23PTPnU%^cjLm>H{Shn?)rCEu7CN? zjrH@J`sEAP-+QyCtQ99F=WcxU(ei&##Do#RTfbpF>Ii`+8H!Nx~yg1b~OKVo%nz3K9 Jla_7Ke*pEUI!gcm delta 2381 zcmZuyON=8&8LsNL+x_rs?Agt3GT9)&Y}o89t7NsBM34*zHtc{Dp=DdMa%@+Rr)TW8 zU9K6Cp&BE35jhY@(#mPID;qc?MJpjBB9Q~)6onvh>MKOz%rPhazdetQMBDX0>hahA z_^Rr&XFs@fx$U|(f$#7A=X=*K67nxpp8O0@z71{i&-X5Wb*eGSl)fGqz}3DvFawJc zkhOkcU;2-u2^>m#gc-l3fg4(TUf?q`@I!k><|WX}3mO!{!n_iyd)3g#9%j9x zEGQ+=TU!v|E37cD!$@O6XVA}VR=j?n1gosd9OmAq!8ulA9`ivu&q}NeV^4(_SY=<~ zpM_7&zywp?AkCHc{`m6L=nmtZsMn;K#luM)iuD^H`%%0T@-Xg(t!U8hg-z{9yV4nq zfbNZYM>^232g)e!9X+#ob36RWZq$iHG>o^q`y;V^wA+qF6!)%-#4ea~2JKO+KkT+~ z#*x<_w%OWX$in{G^ry*MS9v0>4Uh}aRLtzBlt8W$MUXjtn=I%ixpyH^1=&;P>f1!B z3nkH{GS@(YJdC|xk{yb5xNk{ilgwzMGc_^5f+_V)@-Dr%x2+^rQdnA$R9e#qglP{I zFl6VQy0jORAC7NDBq{cYEJ|yG!1jhL!q_Yr;CD{6FK5qz{q607UW;ZhVf+3(`lO!Y1SG z_*Lma1~yJjI{(MyN^)!w+ z@thY}oi6(!sFRHD2kF0!AJ8DZZr-jwjo7&bgt!{@sHZwg`p8_PR{9t7{FIjT3gy>e zw2L4+`Bp(FLVFF`qy&%z1gOy9U?+NB(HwvPqW>nwan_8yie_Tvx(0wUA&W|mrzOaA z#0}pX*QLVL1Ipi&Q&TEX?>EQw<3&Uo2tNcIGzXe1jJdHOiFfoTVL~Z1D8>227uFIF zNeK#}o))6CP9}eNvJA2`w-*GEatIJB1LTUbBAh)}ctCw`rX^Kb6{WrMUPV^Z7YZv4 z(C64wThJUn%dr}cAwZc~Bl-9WjIWG8zC+@h8WHt(>05%5q)y4vnrJ}n4T!!V>ribC z5pV}k0SB=DvwCbV`Bie2$g(UldxOXd@FMUka0hq|xC?v*xCf`slm!OvA`CJ1Re+(N z{-e-%?UOG>Ta~IT=gT$Z$GK~OLvZB4p|Wg9ZNzy)k1yMQqZcnjtpj@} zY>P>2M||trnY{jDkb2JbjtMjP3K9#+IV5;JalEH8O+G|cC87w@E(z)}}^Ut6Ogl%&*Frz^aQ5{(57)qG|Kz}0? z{A(~Hc;Br}`B!kkB_Np!WBdgiFh=`$IQVm@SQEiIn^9K;?ui5;LRj9ZdJx6pMy7~$ zzMe1djBq~3L%=aJnTZY@@Gx+Wg{1{|Cw<>tU+=(_(^IDD8ZE)Erg%UV#Zxp2KgCiM z>d>##l2W1R7w)sK`uufR*Tv+Vd?@SC@{@>P3TH~eEBzg~a~Or&Lrw2_ zPyd+m@502UlAq(;WK-kcgs$V80v*nifzvoX)l1@mlofj+Ja2hulRrbpB=<(MRen4D z#QP52NIiem{rtlZKL7PEI&I#Cmn!{{f46cQ<~G%{ZTR=okNwr@U(p1@gJ8%IG~WU_ zvs$e|JBnMaCf&mS#msEA*s$Ab@f=kz;UrxQd3Se-9z8x7jNam}KtIPPk>5nJfdntA z%tN1Br!R93Fn*rw!;qZ=EJsyf=d6X%Lve@vWnAkcGFubT7GaBFm2Y6L79O_y9Kn|v z2+X#~9JJJFclSHPI6TWP$JqH+`t#D&E8hT7(=B@PbD+YGYN-a*R8Ofxe@U@6?Ynlt HDp>S?k0v}e diff --git a/contrast/feat_extract/__pycache__/config.cpython-39.pyc b/contrast/feat_extract/__pycache__/config.cpython-39.pyc index dd9fad2fc819917bc8ce6607dbd2215d2120ab2c..3792f4c16a4b880bdacb8e8388a2a75cb7d335c2 100644 GIT binary patch delta 589 zcmYjPv2N5r5VbG4JI8ky=#v6P6cizl?#iGP2qc=*_14;+*vol$tl0_CrMZ8=;tyyj zC=h>wpqZ9F`~qwHK;B|BGyCSv%-j7r|1n>v#Uc*;`QzRd+i#0c;Y=a|XMr!5^8ITV zh38MQ60%K=+Om6bUnrWmCmj*(1WWOs~<@=s==1uE9DanXI6z zKVB)Dqgf%h6jo-}SRqZ{YGxp5ejPmD$s;DEZQ`wUH%NX62FHUq?g50za@5@o+)6w4 z6m3O8cv~m$UE61%i%h*9j0CdSJBh&@Dw(%cyZ=f=9mxk(N!)oo=yBhCuyNmPkQhUa zSt&Bel2Ju6ttfE}wM5>@AyZqK-+?Yl-baTOIwv2;Cl?aeUH}6IX)7~(Ymz&p y4Um(#->IGFOF&otGtgD@X8bukYaYhW&Q98df8anS8QL3N>>(YlHLsfGin)5SDDmR%FRxpr8o_KLrJtQ7Q^ZlOi*e#?>|&{cNPex?9cOIhlka524`= zXegM0;Z1-_9X$^~$w@MUuh`k$`}W)2Z@&jWgD?q0-?8uU+t*`_9;jDB%bCdvp^#95_JPU6cbTGpl%&d71ZGuLsT`89gtLNgto--4GW z*(N20?Np*+k-;QO6A25HDdu@cqs0w^pEK1lCq@u>LJry1PZN`sJ)(8jFgqhzlSc5? zv__?gVY;rO_U?S#oF9C2?=`;=0 and cls==0: + color = colors(int(cls), True) + elif tid >=0 and cls!=0: + color = colors(int(id), True) + else: + color = colors(19, True) # 19为调色板的最后一个元素 + annotator.box_label(xyxy, label, color=color) + + im0 = annotator.result() + spath = os.path.join(savepath, Path(imgpath).name) + cv2.imwrite(spath, im0) + + def save_event_subimg(event, savepath): ''' 功能: 保存一次购物事件的轨迹子图 @@ -224,160 +279,92 @@ def save_event_subimg(event, savepath): 子图保存次序:先前摄、后后摄,以 k 为编号,和 "feats_compose" 中次序相同 ''' cameras = ('front', 'back') - k = 0 for camera in cameras: if camera == 'front': - boxes = event['front_boxes'] - imgpaths = event['front_imgpaths'] + boxes = event.front_boxes + imgpaths = event.front_imgpaths else: - boxes = event['back_boxes'] - imgpaths = event['back_imgpaths'] + boxes = event.back_boxes + imgpaths = event.back_imgpaths + + + for i, box in enumerate(boxes): x1, y1, x2, y2, tid, score, cls, fid, bid = box - imgpath = imgpaths[i] + imgpath = imgpaths[int(fid-1)] image = cv2.imread(imgpath) + subimg = image[int(y1/2):int(y2/2), int(x1/2):int(x2/2), :] camerType, timeTamp, _, frameID = os.path.basename(imgpath).split('.')[0].split('_') - subimgName = f"{k}_cam-{camerType}_tid-{int(tid)}_fid-({int(fid)}, {frameID}).png" + subimgName = f"cam{camerType}_{i}_tid{int(tid)}_fid({int(fid)}, {frameID}).png" spath = os.path.join(savepath, subimgName) cv2.imwrite(spath, subimg) - k += 1 # basename = os.path.basename(event['filepath']) - print(f"Image saved: {os.path.basename(event['filepath'])}") - - + print(f"Image saved: {os.path.basename(event.eventpath)}") -def one2one_eval(resultPath): - - # stdBarcode = [p.stem for p in Path(stdFeaturePath).iterdir() if p.is_file() and p.suffix=='.pickle'] - stdBarcode = [p.stem for p in Path(stdBarcodePath).iterdir() if p.is_file() and p.suffix=='.pickle'] - - - '''购物事件列表,该列表中的 Barcode 存在于标准的 stdBarcode 内''' - evtList = [(p.stem, p.stem.split('_')[-1]) for p in Path(eventFeatPath).iterdir() - if p.is_file() - and p.suffix=='.pickle' - and (len(p.stem.split('_'))==2 or len(p.stem.split('_'))==3) - and p.stem.split('_')[-1].isdigit() - and p.stem.split('_')[-1] in stdBarcode - ] - - barcodes = set([bcd for _, bcd in evtList]) - - '''标准特征集图像样本经特征提取并保存,运行一次后无需再运行''' - stdfeat_infer(stdBarcodePath, stdFeaturePath, barcodes) - - '''========= 构建用于比对的标准特征字典 =============''' - stdDict = {} - for barcode in barcodes: - stdpath = os.path.join(stdFeaturePath, barcode+'.pickle') - with open(stdpath, 'rb') as f: - stddata = pickle.load(f) - stdDict[barcode] = stddata - - '''========= 构建用于比对的操作事件字典 =============''' - evtDict = {} - for event, barcode in evtList: - evtpath = os.path.join(eventFeatPath, event+'.pickle') - with open(evtpath, 'rb') as f: - evtdata = pickle.load(f) - evtDict[event] = evtdata - - - '''===== 构造 3 个事件对: 扫 A 放 A, 扫 A 放 B, 合并 ====================''' - AA_list = [(event, barcode, "same") for event, barcode in evtList] - AB_list = [] - for event, barcode in evtList: - dset = list(barcodes.symmetric_difference(set([barcode]))) - idx = random.randint(0, len(dset)-1) - AB_list.append((event, dset[idx], "diff")) - - mergePairs = AA_list + AB_list - - '''读取事件、标准特征文件中数据,以 AA_list 和 AB_list 中关键字为 key 生成字典''' - rltdata, rltdata_ft16, rltdata_ft16_ = [], [], [] - for evt, stdbcd, label in mergePairs: - event = evtDict[evt] - ## 判断是否存在轨迹图像文件夹,不存在则创建文件夹并保存轨迹图像 - pairpath = os.path.join(subimgPath, f"{evt}") - if not os.path.exists(pairpath): - os.makedirs(pairpath) - save_event_subimg(event, pairpath) - - ## 判断是否存在 barcode 标准样本集图像文件夹,不存在则创建文件夹并存储 barcode 样本集图像 - stdImgpath = stdDict[stdbcd]["imgpaths"] - pstdpath = os.path.join(subimgPath, f"{stdbcd}") - if not os.path.exists(pstdpath): - os.makedirs(pstdpath) - ii = 1 - for filepath in stdImgpath: - stdpath = os.path.join(pstdpath, f"{stdbcd}_{ii}.png") - shutil.copy2(filepath, stdpath) - ii += 1 - - ##============================================ float32 - stdfeat = stdDict[stdbcd]["feats"] - evtfeat = event["feats_compose"] - - matrix = 1 - cdist(stdfeat, evtfeat, 'cosine') - simi_mean = np.mean(matrix) - simi_max = np.max(matrix) - stdfeatm = np.mean(stdfeat, axis=0, keepdims=True) - evtfeatm = np.mean(evtfeat, axis=0, keepdims=True) - simi_mfeat = 1- np.maximum(0.0, cdist(stdfeatm, evtfeatm, 'cosine')) - rltdata.append((label, stdbcd, evt, simi_mean, simi_max, simi_mfeat[0,0])) - - - ##============================================ float16 - stdfeat_ft16 = stdfeat.astype(np.float16) - evtfeat_ft16 = evtfeat.astype(np.float16) - stdfeat_ft16 /= np.linalg.norm(stdfeat_ft16, axis=1)[:, None] - evtfeat_ft16 /= np.linalg.norm(evtfeat_ft16, axis=1)[:, None] - - - matrix_ft16 = 1 - cdist(stdfeat_ft16, evtfeat_ft16, 'cosine') - simi_mean_ft16 = np.mean(matrix_ft16) - simi_max_ft16 = np.max(matrix_ft16) - stdfeatm_ft16 = np.mean(stdfeat_ft16, axis=0, keepdims=True) - evtfeatm_ft16 = np.mean(evtfeat_ft16, axis=0, keepdims=True) - simi_mfeat_ft16 = 1- np.maximum(0.0, cdist(stdfeatm_ft16, evtfeatm_ft16, 'cosine')) - rltdata_ft16.append((label, stdbcd, evt, simi_mean_ft16, simi_max_ft16, simi_mfeat_ft16[0,0])) - - '''****************** uint8 is ok!!!!!! ******************''' - ##============================================ uint8 - # stdfeat_uint8, stdfeat_ft16_ = ft16_to_uint8(stdfeat_ft16) - # evtfeat_uint8, evtfeat_ft16_ = ft16_to_uint8(evtfeat_ft16) - - stdfeat_uint8 = (stdfeat_ft16*128).astype(np.int8) - evtfeat_uint8 = (evtfeat_ft16*128).astype(np.int8) - stdfeat_ft16_ = stdfeat_uint8.astype(np.float16)/128 - evtfeat_ft16_ = evtfeat_uint8.astype(np.float16)/128 - - - absdiff = np.linalg.norm(stdfeat_ft16_ - stdfeat) / stdfeat.size - - matrix_ft16_ = 1 - cdist(stdfeat_ft16_, evtfeat_ft16_, 'cosine') - simi_mean_ft16_ = np.mean(matrix_ft16_) - simi_max_ft16_ = np.max(matrix_ft16_) - stdfeatm_ft16_ = np.mean(stdfeat_ft16_, axis=0, keepdims=True) - evtfeatm_ft16_ = np.mean(evtfeat_ft16_, axis=0, keepdims=True) - simi_mfeat_ft16_ = 1- np.maximum(0.0, cdist(stdfeatm_ft16_, evtfeatm_ft16_, 'cosine')) - rltdata_ft16_.append((label, stdbcd, evt, simi_mean_ft16_, simi_max_ft16_, simi_mfeat_ft16_[0,0])) - +def data_precision_compare(stdfeat, evtfeat, evtMessage, save=True): + evt, stdbcd, label = evtMessage + rltdata, rltdata_ft16, rltdata_ft16_ = [], [], [] + matrix = 1 - cdist(stdfeat, evtfeat, 'cosine') + simi_mean = np.mean(matrix) + simi_max = np.max(matrix) + stdfeatm = np.mean(stdfeat, axis=0, keepdims=True) + evtfeatm = np.mean(evtfeat, axis=0, keepdims=True) + simi_mfeat = 1- np.maximum(0.0, cdist(stdfeatm, evtfeatm, 'cosine')) + rltdata = [label, stdbcd, evt, simi_mean, simi_max, simi_mfeat[0,0]] - tm = datetime.fromtimestamp(time.time()).strftime('%Y%m%d_%H%M%S') - ##================================================ save as float32, - rppath = os.path.join(resultPath, f'{tm}.pickle') + + ##================================================================= float16 + stdfeat_ft16 = stdfeat.astype(np.float16) + evtfeat_ft16 = evtfeat.astype(np.float16) + stdfeat_ft16 /= np.linalg.norm(stdfeat_ft16, axis=1)[:, None] + evtfeat_ft16 /= np.linalg.norm(evtfeat_ft16, axis=1)[:, None] + + + matrix_ft16 = 1 - cdist(stdfeat_ft16, evtfeat_ft16, 'cosine') + simi_mean_ft16 = np.mean(matrix_ft16) + simi_max_ft16 = np.max(matrix_ft16) + stdfeatm_ft16 = np.mean(stdfeat_ft16, axis=0, keepdims=True) + evtfeatm_ft16 = np.mean(evtfeat_ft16, axis=0, keepdims=True) + simi_mfeat_ft16 = 1- np.maximum(0.0, cdist(stdfeatm_ft16, evtfeatm_ft16, 'cosine')) + rltdata_ft16 = [label, stdbcd, evt, simi_mean_ft16, simi_max_ft16, simi_mfeat_ft16[0,0]] + + '''****************** uint8 is ok!!!!!! ******************''' + ##=================================================================== uint8 + # stdfeat_uint8, stdfeat_ft16_ = ft16_to_uint8(stdfeat_ft16) + # evtfeat_uint8, evtfeat_ft16_ = ft16_to_uint8(evtfeat_ft16) + + stdfeat_uint8 = (stdfeat_ft16*128).astype(np.int8) + evtfeat_uint8 = (evtfeat_ft16*128).astype(np.int8) + stdfeat_ft16_ = stdfeat_uint8.astype(np.float16)/128 + evtfeat_ft16_ = evtfeat_uint8.astype(np.float16)/128 + + absdiff = np.linalg.norm(stdfeat_ft16_ - stdfeat) / stdfeat.size + + matrix_ft16_ = 1 - cdist(stdfeat_ft16_, evtfeat_ft16_, 'cosine') + simi_mean_ft16_ = np.mean(matrix_ft16_) + simi_max_ft16_ = np.max(matrix_ft16_) + stdfeatm_ft16_ = np.mean(stdfeat_ft16_, axis=0, keepdims=True) + evtfeatm_ft16_ = np.mean(evtfeat_ft16_, axis=0, keepdims=True) + simi_mfeat_ft16_ = 1- np.maximum(0.0, cdist(stdfeatm_ft16_, evtfeatm_ft16_, 'cosine')) + rltdata_ft16_ = [label, stdbcd, evt, simi_mean_ft16_, simi_max_ft16_, simi_mfeat_ft16_[0,0]] + + if not save: + return + + + ##========================================================= save as float32 + rppath = os.path.join(similPath, f'{evt}_ft32.pickle') with open(rppath, 'wb') as f: pickle.dump(rltdata, f) - rtpath = os.path.join(resultPath, f'{tm}.txt') + rtpath = os.path.join(similPath, f'{evt}_ft32.txt') with open(rtpath, 'w', encoding='utf-8') as f: for result in rltdata: part = [f"{x:.3f}" if isinstance(x, float) else str(x) for x in result] @@ -385,12 +372,12 @@ def one2one_eval(resultPath): f.write(line + '\n') - ##================================================ save as float16, - rppath_ft16 = os.path.join(resultPath, f'{tm}_ft16.pickle') + ##========================================================= save as float16 + rppath_ft16 = os.path.join(similPath, f'{evt}_ft16.pickle') with open(rppath_ft16, 'wb') as f: pickle.dump(rltdata_ft16, f) - rtpath_ft16 = os.path.join(resultPath, f'{tm}_ft16.txt') + rtpath_ft16 = os.path.join(similPath, f'{evt}_ft16.txt') with open(rtpath_ft16, 'w', encoding='utf-8') as f: for result in rltdata_ft16: part = [f"{x:.3f}" if isinstance(x, float) else str(x) for x in result] @@ -398,42 +385,145 @@ def one2one_eval(resultPath): f.write(line + '\n') - ##================================================ save as uint8, - rppath_uint8 = os.path.join(resultPath, f'{tm}_uint8.pickle') + ##=========================================================== save as uint8 + rppath_uint8 = os.path.join(similPath, f'{evt}_uint8.pickle') with open(rppath_uint8, 'wb') as f: pickle.dump(rltdata_ft16_, f) - rtpath_uint8 = os.path.join(resultPath, f'{tm}_uint8.txt') + rtpath_uint8 = os.path.join(similPath, f'{evt}_uint8.txt') with open(rtpath_uint8, 'w', encoding='utf-8') as f: for result in rltdata_ft16_: part = [f"{x:.3f}" if isinstance(x, float) else str(x) for x in result] line = ', '.join(part) f.write(line + '\n') + +def one2one_simi(): + ''' + stdFeaturePath: 标准特征集地址 + eventDataPath: Event对象地址 + ''' + stdBarcode = [p.stem for p in Path(stdFeaturePath).iterdir() if p.is_file() and p.suffix=='.pickle'] + + '''======1. 购物事件列表,该列表中的 Barcode 存在于标准的 stdBarcode 内 ===''' + evtList = [(p.stem, p.stem.split('_')[-1]) for p in Path(eventDataPath).iterdir() + if p.is_file() + and p.suffix=='.pickle' + and (len(p.stem.split('_'))==2 or len(p.stem.split('_'))==3) + and p.stem.split('_')[-1].isdigit() + and p.stem.split('_')[-1] in stdBarcode + ] + barcodes = set([bcd for _, bcd in evtList]) + + '''======2. 构建用于比对的标准特征字典 =============''' + stdDict = {} + for barcode in barcodes: + stdpath = os.path.join(stdFeaturePath, barcode+'.pickle') + with open(stdpath, 'rb') as f: + stddata = pickle.load(f) + stdDict[barcode] = stddata + + + '''======3. 构建用于比对的操作事件字典 =============''' + evtDict = {} + for evtname, barcode in evtList: + evtpath = os.path.join(eventDataPath, evtname+'.pickle') + with open(evtpath, 'rb') as f: + evtdata = pickle.load(f) + evtDict[evtname] = evtdata + + + '''======4.1 事件轨迹子图保存 ======================''' + error_event = [] + for evtname, event in evtDict.items(): + pairpath = os.path.join(subimgPath, f"{evtname}") + if not os.path.exists(pairpath): + os.makedirs(pairpath) + try: + save_event_subimg(event, pairpath) + except Exception as e: + error_event.append(evtname) + + img_path = os.path.join(imagePath, f"{evtname}") + if not os.path.exists(img_path): + os.makedirs(img_path) + try: + plot_save_image(event, img_path) + except Exception as e: + error_event.append(evtname) + + + errfile = os.path.join(subimgPath, f'error_event.txt') + with open(errfile, 'w', encoding='utf-8') as f: + for line in error_event: + f.write(line + '\n') + + + '''======4.2 barcode 标准图像保存 ==================''' + # for stdbcd in barcodes: + # stdImgpath = stdDict[stdbcd]["imgpaths"] + # pstdpath = os.path.join(subimgPath, f"{stdbcd}") + # if not os.path.exists(pstdpath): + # os.makedirs(pstdpath) + # ii = 1 + # for filepath in stdImgpath: + # stdpath = os.path.join(pstdpath, f"{stdbcd}_{ii}.png") + # shutil.copy2(filepath, stdpath) + # ii += 1 + + '''======5 构造 3 个事件对: 扫 A 放 A, 扫 A 放 B, 合并 ====================''' + AA_list = [(evtname, barcode, "same") for evtname, barcode in evtList] + AB_list = [] + for evtname, barcode in evtList: + dset = list(barcodes.symmetric_difference(set([barcode]))) + if len(dset): + idx = random.randint(0, len(dset)-1) + AB_list.append((evtname, dset[idx], "diff")) + + mergePairs = AA_list + AB_list + + '''======6 计算事件、标准特征集相似度 ==================''' + rltdata = [] + for i in range(len(mergePairs)): + evtname, stdbcd, label = mergePairs[i] + event = evtDict[evtname] + + ##============================================ float32 + stdfeat = stdDict[stdbcd]["feats_ft32"] + evtfeat = event.feats_compose + + if len(evtfeat)==0: continue + + matrix = 1 - cdist(stdfeat, evtfeat, 'cosine') + matrix[matrix < 0] = 0 + + + simi_mean = np.mean(matrix) + simi_max = np.max(matrix) + stdfeatm = np.mean(stdfeat, axis=0, keepdims=True) + evtfeatm = np.mean(evtfeat, axis=0, keepdims=True) + simi_mfeat = 1- np.maximum(0.0, cdist(stdfeatm, evtfeatm, 'cosine')) + rltdata.append((label, stdbcd, evtname, simi_mean, simi_max, simi_mfeat[0,0])) + + '''================ float32、16、int8 精度比较与存储 =============''' + # data_precision_compare(stdfeat, evtfeat, mergePairs[i], save=True) + print("func: one2one_eval(), have finished!") + + return rltdata + -def compute_precise_recall(pickpath): - - pickfile = os.path.basename(pickpath) - file, ext = os.path.splitext(pickfile) - - if ext != '.pickle': return - if file.find('ft16') < 0: return - - with open(pickpath, 'rb') as f: - results = pickle.load(f) - +def compute_precise_recall(rltdata): Same, Cross = [], [] - for label, stdbcd, evt, simi_mean, simi_max, simi_mft in results: + for label, stdbcd, evtname, simi_mean, simi_max, simi_mft in rltdata: if label == "same": Same.append(simi_mean) if label == "diff": Cross.append(simi_mean) - - + Same = np.array(Same) Cross = np.array(Cross) TPFN = len(Same) @@ -480,115 +570,135 @@ def compute_precise_recall(pickpath): ax.set_xlabel(f"Same Num: {TPFN}, Cross Num: {TNFP}") ax.legend() plt.show() - plt.savefig(f'./result/{file}_pr.png') # svg, png, pdf + + rltpath = os.path.join(similPath, 'pr.png') + plt.savefig(rltpath) # svg, png, pdf -def gen_eventdict(eventDatePath, saveimg=True): +def gen_eventdict(sourcePath, saveimg=True): eventList = [] - # k = 0 - for datePath in eventDatePath: - for eventName in os.listdir(datePath): + errEvents = [] + k = 0 + for source_path in sourcePath: + bname = os.path.basename(source_path) + + pickpath = os.path.join(eventDataPath, f"{bname}.pickle") + if os.path.isfile(pickpath): continue + + # if bname != "20241129-100321-a9dae9e3-7db5-4e31-959c-d7dfc228923e_6972636670213": + # continue - pickpath = os.path.join(eventFeatPath, f"{eventName}.pickle") - if os.path.isfile(pickpath): - continue - eventPath = os.path.join(datePath, eventName) + + + # eventDict = creat_shopping_event(eventPath) + # if eventDict: + # eventList.append(eventDict) + # with open(pickpath, 'wb') as f: + # pickle.dump(eventDict, f) + # print(f"Event: {eventName}, have saved!") - eventDict = creat_shopping_event(eventPath) - if eventDict: - eventList.append(eventDict) - with open(pickpath, 'wb') as f: - pickle.dump(eventDict, f) - print(f"Event: {eventName}, have saved!") + # if saveimg and eventDict: + # basename = os.path.basename(eventDict['filepath']) + # savepath = os.path.join(subimgPath, basename) + # if not os.path.exists(savepath): + # os.makedirs(savepath) + # save_event_subimg(eventDict, savepath) + + try: + event = Event(source_path) + eventList.append(event) + with open(pickpath, 'wb') as f: + pickle.dump(event, f) + print(bname) + except Exception as e: + errEvents.append(source_path) + print(e) + + # k += 1 + # if k==10: + # break - # k += 1 - # if k==1: - # break - - ## 保存轨迹中 boxes 子图 - if not saveimg: - return - for event in eventList: - basename = os.path.basename(event['filepath']) - savepath = os.path.join(subimgPath, basename) - if not os.path.exists(savepath): - os.makedirs(savepath) - save_event_subimg(event, savepath) + errfile = os.path.join(eventDataPath, f'error_events.txt') + with open(errfile, 'w', encoding='utf-8') as f: + for line in errEvents: + f.write(line + '\n') def test_one2one(): - eventDatePath = [r'\\192.168.1.28\share\测试_202406\1101\images', - # r'\\192.168.1.28\share\测试_202406\0910\images', - # r'\\192.168.1.28\share\测试_202406\0723\0723_1', - # r'\\192.168.1.28\share\测试_202406\0723\0723_2', - # r'\\192.168.1.28\share\测试_202406\0723\0723_3', - # r'\\192.168.1.28\share\测试_202406\0722\0722_01', - # r'\\192.168.1.28\share\测试_202406\0722\0722_02' - # r'\\192.168.1.28\share\测试_202406\0719\719_3', - # r'\\192.168.1.28\share\测试_202406\0716\0716_1', - # r'\\192.168.1.28\share\测试_202406\0716\0716_2', - # r'\\192.168.1.28\share\测试_202406\0716\0716_3', - # r'\\192.168.1.28\share\测试_202406\0712\0712_1', # 无帧图像 - # r'\\192.168.1.28\share\测试_202406\0712\0712_2', # 无帧图像 - ] - bcdList = [] - for evtpath in eventDatePath: + bcdList, event_spath = [], [] + for evtpath in eventSourcePath: for evtname in os.listdir(evtpath): evt = evtname.split('_') + dirpath = os.path.join(evtpath, evtname) + if os.path.isfile(dirpath): continue if len(evt)>=2 and evt[-1].isdigit() and len(evt[-1])>=10: - bcdList.append(evt[-1]) - + bcdList.append(evt[-1]) + event_spath.append(os.path.join(evtpath, evtname)) + bcdSet = set(bcdList) - - - - - model = model_init(conf) - - '''==== 1. 生成标准特征集, 只需运行一次 ===============''' - genfeatures(model, stdSamplePath, stdBarcodePath, stdFeaturePath, bcdSet) + '''==== 1. 生成标准特征集, 只需运行一次, 在 genfeats.py 中实现 ===========''' + # gen_bcd_features(stdSamplePath, stdBarcodePath, stdFeaturePath, bcdSet) print("stdFeats have generated and saved!") '''==== 2. 生成事件字典, 只需运行一次 ===============''' - - gen_eventdict(eventDatePath) + gen_eventdict(event_spath) print("eventList have generated and saved!") '''==== 3. 1:1性能评估 ===============''' - one2one_eval(resultPath) - for filename in os.listdir(resultPath): - if filename.find('.pickle') < 0: continue - if filename.find('0911') < 0: continue - pickpath = os.path.join(resultPath, filename) - compute_precise_recall(pickpath) - - + rltdata = one2one_simi() + compute_precise_recall(rltdata) + if __name__ == '__main__': ''' - 共6个地址: + 共7个地址: (1) stdSamplePath: 用于生成比对标准特征集的原始图像地址 (2) stdBarcodePath: 比对标准特征集原始图像地址的pickle文件存储,{barcode: [imgpath1, imgpath1, ...]} (3) stdFeaturePath: 比对标准特征集特征存储地址 - (4) eventFeatPath: 用于1:1比对的购物事件特征存储地址、对应子图存储地址 - (5) subimgPath: 1:1比对购物事件轨迹、标准barcode所对应的 subimgs 存储地址 - (6) resultPath: 1:1比对结果存储地址 + (4) eventSourcePath: 事件地址 + (5) resultPath: 结果存储地址 + (6) eventDataPath: 用于1:1比对的购物事件特征存储地址、对应子图存储地址 + (7) subimgPath: 1:1比对购物事件轨迹、标准barcode所对应的 subimgs 存储地址 + (8) similPath: 1:1比对结果存储地址(事件级) ''' - - stdSamplePath = r"\\192.168.1.28\share\已标注数据备份\对比数据\barcode\barcode_500_1979_已清洗" - stdBarcodePath = r"\\192.168.1.28\share\测试_202406\contrast\std_barcodes_2192" - stdFeaturePath = r"\\192.168.1.28\share\测试_202406\contrast\std_features_ft32" - eventFeatPath = r"\\192.168.1.28\share\测试_202406\contrast\events" - subimgPath = r'\\192.168.1.28\share\测试_202406\contrast\subimgs' - resultPath = r"D:\DetectTracking\contrast\result\pickle" - if not os.path.exists(resultPath): - os.makedirs(resultPath) + # stdSamplePath = r"\\192.168.1.28\share\已标注数据备份\对比数据\barcode\barcode_500_1979_已清洗" + # stdBarcodePath = r"\\192.168.1.28\share\测试_202406\contrast\std_barcodes_2192" + # stdFeaturePath = r"\\192.168.1.28\share\测试_202406\contrast\std_features_ft32" + # eventDataPath = r"\\192.168.1.28\share\测试_202406\contrast\events" + # subimgPath = r'\\192.168.1.28\share\测试_202406\contrast\subimgs' + # similPath = r"D:\DetectTracking\contrast\result\pickle" + # eventSourcePath = [r'\\192.168.1.28\share\测试_202406\1101\images'] + + stdSamplePath = r"\\192.168.1.28\share\数据\已完成数据\展厅数据\v1.0\比对数据\整理\zhantingBase" + stdBarcodePath = r"D:\exhibition\dataset\bcdpath" + stdFeaturePath = r"D:\exhibition\dataset\feats" + resultPath = r"D:\exhibition\result\events" + # eventSourcePath = [r'D:\exhibition\images\20241202'] + # eventSourcePath = [r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1129_展厅模型v801测试组测试"] + eventSourcePath = [r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1126_展厅模型v801测试"] + + + + '''定义当前事件存储地址及生成相应文件件''' + eventDataPath = os.path.join(resultPath, "1126", "evtobjs") + subimgPath = os.path.join(resultPath, "1126", "subimgs") + imagePath = os.path.join(resultPath, "1126", "image") + similPath = os.path.join(resultPath, "1126", "simidata") + + if not os.path.exists(eventDataPath): + os.makedirs(eventDataPath) + if not os.path.exists(subimgPath): + os.makedirs(subimgPath) + if not os.path.exists(imagePath): + os.makedirs(imagePath) + if not os.path.exists(similPath): + os.makedirs(similPath) test_one2one() diff --git a/contrast/one2one_onsite.py b/contrast/one2one_onsite.py index 94c8c3e..16ecdbe 100644 --- a/contrast/one2one_onsite.py +++ b/contrast/one2one_onsite.py @@ -106,7 +106,9 @@ def test_compare(): def one2one_pr(paths): paths = Path(paths) - evtpaths = [p for p in paths.iterdir() if p.is_dir() and len(p.name.split('_'))>=2] + + # evtpaths = [p for p in paths.iterdir() if p.is_dir() and len(p.name.split('_'))>=2] + evtpaths = [p for p in paths.iterdir() if p.is_dir()] events, similars = [], [] @@ -120,14 +122,19 @@ def one2one_pr(paths): ##===================================== 应用于1:n tpevents, fnevents, fpevents, tnevents = [], [], [], [] tpsimi, fnsimi, tnsimi, fpsimi = [], [], [], [] - + other_event, other_simi = [], [] + + ##===================================== barcodes总数、比对错误事件 + bcdList, one2onePath = [], [] 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 - + + bcdList.append(barcode) + try: SimiDict = read_similar(datapath) except Exception as e: @@ -150,13 +157,17 @@ def one2one_pr(paths): one2oneAA.extend(simAA) one2oneAB.extend(simAB) - + one2onePath.append(path.stem) ##===================================== 以下应用适用于展厅 1:N max_idx = similars.index(max(similars)) max_sim = similars[max_idx] # max_bcd = barcodes[max_idx] + if path.stem.find('100321')>0: + print("hhh") + + for i in range(len(one2one)): bcd, simi = barcodes[i], similars[i] if bcd==barcode and simi==max_sim: @@ -172,7 +183,7 @@ def one2one_pr(paths): fp_simi.append(simi) fp_events.append(path.stem) - + ##===================================== 以下应用适用1:n events, evt_barcodes, evt_similars, evt_types = [], [], [], [] for dt in one2n: @@ -197,9 +208,13 @@ def one2one_pr(paths): elif bcd!=barcode and simi!=maxsim: tnsimi.append(simi) tnevents.append(path.stem) - else: + elif bcd!=barcode and simi==maxsim: fpsimi.append(simi) fpevents.append(path.stem) + else: + other_simi.append(simi) + other_event.append(path.stem) + '''命名规则: 1:1 1:n 1:N @@ -228,9 +243,12 @@ def one2one_pr(paths): 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)) + # PRecall_.append(TP_/(TP_+FN_+1e-6)) + PRecall_.append(TP_/(len(one2oneAA)+1e-6)) + NPrecise_.append(TN_/(TN_+FN_+1e-6)) - NRecall_.append(TN_/(TN_+FP_+1e-6)) + # NRecall_.append(TN_/(TN_+FP_+1e-6)) + NRecall_.append(TN_/(len(one2oneAB)+1e-6)) '''============================= 1:n''' TP = sum(np.array(tpsimi) >= th) @@ -238,9 +256,12 @@ def one2one_pr(paths): 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)) + # PRecall.append(TP/(TP+FN+1e-6)) + PRecall.append(TP/(len(tpsimi)+len(fnsimi)+1e-6)) + NPrecise.append(TN/(TN+FN+1e-6)) - NRecall.append(TN/(TN+FP+1e-6)) + # NRecall.append(TN/(TN+FP+1e-6)) + NRecall.append(TN/(len(tnsimi)+len(fpsimi)+1e-6)) '''============================= 1:N 展厅''' @@ -249,9 +270,12 @@ def one2one_pr(paths): 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)) + # PRecallX.append(TPX/(TPX+FNX+1e-6)) + PRecallX.append(TPX/(len(tp_simi)+len(fn_simi)+1e-6)) + NPreciseX.append(TNX/(TNX+FNX+1e-6)) - NRecallX.append(TNX/(TNX+FPX+1e-6)) + # NRecallX.append(TNX/(TNX+FPX+1e-6)) + NRecallX.append(TNX/(len(tn_simi)+len(fp_simi)+1e-6)) '''============================= 1:1 曲线''' fig, ax = plt.subplots() @@ -262,8 +286,8 @@ def one2one_pr(paths): 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.set_title('1:1 Precise & Recall') + ax.set_xlabel(f"Event Num: {len(one2oneAA)}") ax.legend() plt.show() @@ -286,8 +310,8 @@ def one2one_pr(paths): 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.set_title('1:n Precise & Recall') + ax.set_xlabel(f"Event Num: {len(one2oneAA)}") ax.legend() plt.show() @@ -317,8 +341,8 @@ def one2one_pr(paths): 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.set_title('1:N Precise & Recall') + ax.set_xlabel(f"Event Num: {len(one2oneAA)}") ax.legend() plt.show() @@ -338,16 +362,23 @@ def one2one_pr(paths): axes[1, 1].set_title('FN') plt.show() - - + # bcdSet = set(bcdList) + # one2nErrFile = str(paths.joinpath("one_2_Small_n_Error.txt")) + # with open(one2nErrFile, "w") as file: + # for item in fnevents: + # file.write(item + "\n") + + # one2NErrFile = str(paths.joinpath("one_2_Big_N_Error.txt")) + # with open(one2NErrFile, "w") as file: + # for item in fn_events: + # file.write(item + "\n") print('Done!') - - + if __name__ == "__main__": - evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1120_展厅模型v801测试\扫A放A" + evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1129_展厅模型v801测试组测试" one2one_pr(evtpaths) diff --git a/contrast/feat_similar.py b/contrast/seqfeat_compare.py similarity index 100% rename from contrast/feat_similar.py rename to contrast/seqfeat_compare.py diff --git a/contrast/feat_analysisi.py b/contrast/stdfeat_analys.py similarity index 100% rename from contrast/feat_analysisi.py rename to contrast/stdfeat_analys.py diff --git a/contrast/utils/__pycache__/event.cpython-39.pyc b/contrast/utils/__pycache__/event.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25c22c07d5c721eacb599659cfbae011c51ad973 GIT binary patch literal 4048 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 BI1c~- literal 0 HcmV?d00001 diff --git a/contrast/utils/event.py b/contrast/utils/event.py new file mode 100644 index 0000000..e28f56e --- /dev/null +++ b/contrast/utils/event.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Nov 26 17:35:05 2024 + +@author: ym +""" +import os +import numpy as np +from pathlib import Path + +import sys +sys.path.append(r"D:\DetectTracking") +from tracking.utils.read_data import extract_data, read_tracking_output, read_similar + +IMG_FORMAT = ['.bmp', '.jpg', '.jpeg', '.png'] +VID_FORMAT = ['.mp4', '.avi'] + +class Event: + def __init__(self, eventpath, stype="data"): + '''stype: str, 'video', 'image', 'data', ''' + + self.eventpath = eventpath + self.evtname = str(Path(eventpath).stem) + self.barcode = '' + self.evtType = '' + + '''=========== path of image and video =========== ''' + self.back_videopath = '' + self.front_videopath = '' + self.back_imgpaths = [] + self.front_imgpaths = [] + + '''=========== process.data ===============================''' + self.one2one = None + self.one2n = None + + '''=========== 0/1_track.data =============================''' + self.back_yolobboxes = np.empty((0, 6), dtype=np.float64) + self.back_yolofeats = np.empty((0, 256), dtype=np.float64) + self.back_trackerboxes = np.empty((0, 9), dtype=np.float64) + self.back_trackerfeats = np.empty((0, 256), dtype=np.float64) + self.back_trackingboxes = np.empty((0, 9), dtype=np.float64) + self.back_trackingfeats = np.empty((0, 256), dtype=np.float64) + + self.front_yolobboxes = np.empty((0, 6), dtype=np.float64) + self.front_yolofeats = np.empty((0, 256), dtype=np.float64) + self.front_trackerboxes = np.empty((0, 9), dtype=np.float64) + self.front_trackerfeats = np.empty((0, 256), dtype=np.float64) + self.front_trackingboxes = np.empty((0, 9), dtype=np.float64) + self.front_trackingfeats = np.empty((0, 256), dtype=np.float64) + + '''=========== 0/1_tracking_output.data ===================''' + self.back_boxes = np.empty((0, 9), dtype=np.float64) + self.front_boxes = np.empty((0, 9), dtype=np.float64) + self.back_feats = np.empty((0, 256), dtype=np.float64) + self.front_feats = np.empty((0, 256), dtype=np.float64) + self.feats_compose = np.empty((0, 256), dtype=np.float64) + self.feats_select = np.empty((0, 256), dtype=np.float64) + + if stype=="data": + self.from_datafile(eventpath) + + if stype=="video": + self.from_video(eventpath) + + if stype=="image": + self.from_image(eventpath) + + def from_datafile(self, eventpath): + evtList = self.evtname.split('_') + if len(evtList)>=2 and len(evtList[-1])>=10 and evtList[-1].isdigit(): + self.barcode = evtList[-1] + if len(evtList)==3 and evtList[-1]== evtList[-2]: + self.evtType = 'input' + else: + self.evtType = 'other' + + '''================ path of image =============''' + frontImgs, frontFid = [], [] + backImgs, backFid = [], [] + for imgname in os.listdir(eventpath): + name, ext = os.path.splitext(imgname) + if ext not in IMG_FORMAT or name.find('frameId') < 0: continue + if len(name.split('_')) != 3 and not name.split('_')[3].isdigit(): continue + + CamerType = name.split('_')[0] + frameId = int(name.split('_')[3]) + imgpath = os.path.join(eventpath, imgname) + if CamerType == '0': + backImgs.append(imgpath) + backFid.append(frameId) + if CamerType == '1': + frontImgs.append(imgpath) + frontFid.append(frameId) + ## 生成依据帧 ID 排序的前后摄图像地址列表 + frontIdx = np.argsort(np.array(frontFid)) + backIdx = np.argsort(np.array(backFid)) + self.front_imgpaths = [frontImgs[i] for i in frontIdx] + self.back_imgpaths = [backImgs[i] for i in backIdx] + + + '''================ path of video =============''' + for vidname in os.listdir(eventpath): + name, ext = os.path.splitext(vidname) + if ext not in VID_FORMAT: continue + vidpath = os.path.join(eventpath, vidname) + + CamerType = name.split('_')[0] + if CamerType == '0': + self.back_videopath = vidpath + if CamerType == '1': + self.front_videopath = vidpath + + '''================ process.data =============''' + procpath = Path(eventpath).joinpath('process.data') + if procpath.is_file(): + SimiDict = read_similar(procpath) + self.one2one = SimiDict['one2one'] + self.one2n = SimiDict['one2n'] + + + '''=========== 0/1_track.data & 0/1_tracking_output.data =======''' + for dataname in os.listdir(eventpath): + datapath = os.path.join(eventpath, dataname) + if not os.path.isfile(datapath): continue + CamerType = dataname.split('_')[0] + + '''========== 0/1_track.data ==========''' + if dataname.find("_track.data")>0: + bboxes, ffeats, trackerboxes, tracker_feat_dict, trackingboxes, tracking_feat_dict = extract_data(datapath) + if CamerType == '0': + self.back_yolobboxes = bboxes + self.back_yolofeats = ffeats + self.back_trackerboxes = trackerboxes + self.back_trackerfeats = tracker_feat_dict + self.back_trackingboxes = trackingboxes + self.back_trackingfeats = tracking_feat_dict + if CamerType == '1': + self.front_yolobboxes = bboxes + self.front_yolofeats = ffeats + self.front_trackerboxes = trackerboxes + self.front_trackerfeats = tracker_feat_dict + self.front_trackingboxes = trackingboxes + self.front_trackingfeats = tracking_feat_dict + + '''========== 0/1_tracking_output.data ==========''' + if dataname.find("_tracking_output.data")>0: + tracking_output_boxes, tracking_output_feats = read_tracking_output(datapath) + if CamerType == '0': + self.back_boxes = tracking_output_boxes + self.back_feats = tracking_output_feats + elif CamerType == '1': + self.front_boxes = tracking_output_boxes + self.front_feats = tracking_output_feats + self.select_feat() + self.compose_feats() + + + def compose_feats(self): + '''事件的特征集成''' + feats_compose = np.empty((0, 256), dtype=np.float64) + if len(self.front_feats): + feats_compose = np.concatenate((feats_compose, self.front_feats), axis=0) + if len(self.back_feats): + feats_compose = np.concatenate((feats_compose, self.back_feats), axis=0) + self.feats_compose = feats_compose + + def select_feats(self): + '''事件的特征选择''' + if len(self.front_feats): + self.feats_select = self.front_feats + else: + self.feats_select = self.back_feats + + + + + + \ No newline at end of file diff --git a/pipeline.py b/pipeline.py index 354563c..4faba3f 100644 --- a/pipeline.py +++ b/pipeline.py @@ -5,11 +5,19 @@ Created on Sun Sep 29 08:59:21 2024 @author: ym """ import os +import sys import cv2 import pickle +import argparse import numpy as np from pathlib import Path -from track_reid import parse_opt, yolo_resnet_tracker +from track_reid import parse_opt +from track_reid import yolo_resnet_tracker +# FILE = Path(__file__).resolve() +# ROOT = FILE.parents[0] # YOLOv5 root directory +# if str(ROOT) not in sys.path: +# sys.path.append(str(ROOT)) # add ROOT to PATH +# ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # relative from tracking.dotrack.dotracks_back import doBackTracks from tracking.dotrack.dotracks_front import doFrontTracks @@ -35,38 +43,27 @@ def get_interbcd_inputenents(): return input_enents -def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): - ''' - inputs: - eventpath: 事件文件夹 - stdfeat_path: 标准特征文件地址 - outputs: - - ''' - # 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" - - opt = parse_opt() - optdict = vars(opt) - optdict["project"] = savepath - - eventname = os.path.basename(eventpath) - # barcode = eventname.split('_')[-1] - - +def pipeline( + eventpath, + savepath, + SourceType = "image", # video + stdfeat_path = None + ): if SourceType == "video": vpaths = get_video_pairs(eventpath) elif SourceType == "image": vpaths = get_image_pairs(eventpath) - - + '''======== 函数 yolo_resnet_tracker() 的参数字典 ========''' + opt = parse_opt() + optdict = vars(opt) + optdict["is_save_img"] = True + optdict["is_save_video"] = True + event_tracks = [] for vpath in vpaths: '''事件结果文件夹''' - save_dir_event = Path(savepath) / Path(eventname) + save_dir_event = Path(savepath) / Path(os.path.basename(eventpath)) if isinstance(vpath, list): save_dir_video = save_dir_event / Path("images") else: @@ -78,8 +75,7 @@ def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): '''Yolo + Resnet + Tracker''' optdict["source"] = vpath optdict["save_dir"] = save_dir_video - optdict["is_save_img"] = True - optdict["is_save_video"] = True + tracksdict = yolo_resnet_tracker(**optdict) @@ -138,6 +134,7 @@ def pipeline(eventpath, stdfeat_path=None, SourceType = "image"): '''前后摄轨迹选择''' + if stdfeat_path is not None: with open(stdfeat_path, 'rb') as f: featDict = pickle.load(f) @@ -171,22 +168,29 @@ def main_loop(): stdfeat_path = os.path.join(bcdpath, f"{bcd}.pickle") input_enents.append((event_path, stdfeat_path)) - + parmDict = {} + parmDict["SourceType"] = "image" + parmDict["savepath"] = r"D:\contrast\detect" for eventpath, stdfeat_path in input_enents: - pipeline(eventpath, stdfeat_path, SourceType) + parmDict["eventpath"] = eventpath + parmDict["stdfeat_path"] = stdfeat_path - -def main(): - eventpath = r"D:\datasets\ym\exhibition\175836" + pipeline(**parmDict) - 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) - +def main(): + ''' + 函数:pipeline(),遍历事件文件夹,选择类型 image 或 video, + ''' + parmDict = {} + parmDict["eventpath"] = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1120_展厅模型v801测试\扫A放A\20241121-144855-dce94b09-1100-43f1-92e8-33a1b538b159_6924743915848_6924743915848" + + parmDict["savepath"] = r"D:\contrast\detect" + parmDict["SourceType"] = "image" # video, image + parmDict["stdfeat_path"] = None + + pipeline(**parmDict) + if __name__ == "__main__": main() diff --git a/time_devide.py b/time_devide.py index c035bd6..1836112 100644 --- a/time_devide.py +++ b/time_devide.py @@ -204,11 +204,6 @@ def state_measure(periods, weights, hands, spath=None): state1 = frstate_1[:,2][:, None] state11 = frstate_1[:,3][:, None] - - - - - @@ -428,8 +423,8 @@ def run_tracking(trackboxes, MotionSlice): def show_seri(): - datapath = r"\\192.168.1.28\share\realtime\eventdata\1731316835560" - savedir = r"D:\DetectTracking\realtime" + datapath = r"\\192.168.1.28\share\个人文件\wqg\realtime\eventdata\1731316835560" + savedir = r"D:\DetectTracking\realtime\1" imgdir = datapath.split('\\')[-2] + "_" + datapath.split('\\')[-1] @@ -475,7 +470,7 @@ def show_seri(): def main(): - runyolo() + # runyolo() show_seri() diff --git a/track_reid.py b/track_reid.py index 9ccf665..76ddb95 100644 --- a/track_reid.py +++ b/track_reid.py @@ -64,6 +64,9 @@ from contrast.feat_extract.config import config as conf from contrast.feat_extract.inference import FeatsInterface ReIDEncoder = FeatsInterface(conf) +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 + # from tracking.trackers.reid.reid_interface import ReIDInterface # from tracking.trackers.reid.config import config as ReIDConfig # ReIDEncoder = ReIDInterface(ReIDConfig) @@ -141,6 +144,9 @@ def yolo_resnet_tracker( name='exp', # save results to project/name save_dir = '', + is_save_img = False, + is_save_video = True, + tracker_yaml = "./tracking/trackers/cfg/botsort.yaml", imgsz=(640, 640), # inference size (height, width) conf_thres=0.25, # confidence threshold @@ -153,18 +159,15 @@ def yolo_resnet_tracker( save_csv=False, # save results in CSV format save_conf=False, # save confidences in --save-txt labels save_crop=False, # save cropped prediction boxes - nosave=False, # do not save images/videos - is_save_img = False, - is_save_video = True, - - + update=False, # update all models + exist_ok=False, # existing project/name ok, do not increment + classes=None, # filter by class: --class 0, or --class 0 2 3 agnostic_nms=False, # class-agnostic NMS augment=False, # augmented inference visualize=False, # visualize features - update=False, # update all models - exist_ok=False, # existing project/name ok, do not increment + line_thickness=3, # bounding box thickness (pixels) hide_labels=False, # hide labels hide_conf=False, # hide confidencesL @@ -179,6 +182,8 @@ def yolo_resnet_tracker( model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data, fp16=half) stride, names, pt = model.stride, model.names, model.pt imgsz = check_img_size(imgsz, s=stride) # check image size + + # Dataloader bs = 1 # batch_size @@ -203,8 +208,8 @@ def yolo_resnet_tracker( # Inference with dt[1]: - visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False - pred = model(im, augment=augment, visualize=visualize) + visualize = increment_path(project / Path(path).stem, mkdir=True) if visualize else False + pred = model(im, augment=augment, visualize=False) # NMS with dt[2]: @@ -273,19 +278,27 @@ def yolo_resnet_tracker( annotator.box_label(xyxy, label, color=color) '''====== Save results (image and video) ======''' - save_path = str(save_dir / Path(path).name) # 带有后缀名 + # save_path = str(save_dir / Path(path).name) # 带有后缀名 im0 = annotator.result() if is_save_img: - save_path_img, ext = os.path.splitext(save_path) + save_path_img = str(save_dir / Path(path).stem) if dataset.mode == 'image': imgpath = save_path_img + ".png" else: imgpath = save_path_img + f"_{frameId}.png" cv2.imwrite(Path(imgpath), im0) - if dataset.mode == 'video' and is_save_video: - if vid_path[i] != save_path: # new video - vid_path[i] = save_path + # if dataset.mode == 'video' and is_save_video: + + if is_save_video: + if dataset.mode == 'video': + vdieo_path = str(save_dir / Path(path).stem) + '.mp4' # 带有后缀名 + else: + videoname = str(Path(path).stem).split('_')[0] + '.mp4' + vdieo_path = str(save_dir / videoname) + + if vid_path[i] != vdieo_path: # new video + vid_path[i] = vdieo_path if isinstance(vid_writer[i], cv2.VideoWriter): vid_writer[i].release() # release previous video writer if vid_cap: # video @@ -293,9 +306,9 @@ def yolo_resnet_tracker( w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) else: # stream - fps, w, h = 30, im0.shape[1], im0.shape[0] - save_path = str(Path(save_path).with_suffix('.mp4')) # force *.mp4 suffix on results videos - vid_writer[i] = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h)) + fps, w, h = 25, im0.shape[1], im0.shape[0] + vdieo_path = str(Path(vdieo_path).with_suffix('.mp4')) # force *.mp4 suffix on results videos + vid_writer[i] = cv2.VideoWriter(vdieo_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h)) vid_writer[i].write(im0) # Print time (inference-only) @@ -344,6 +357,9 @@ def run( vid_stride=1, # video frame-rate stride data=ROOT / 'data/coco128.yaml', # dataset.yaml path ): + ''' + source: 视频文件或图像列表 + ''' source = str(source) # filename = os.path.split(source)[-1] @@ -355,6 +371,9 @@ def run( if is_url and is_file: source = check_file(source) # download + + + # spth = source.split('\\')[-2] + "_" + Path(source).stem save_dir = Path(project) / Path(source.split('\\')[-2] + "_" + str(Path(source).stem)) @@ -440,8 +459,7 @@ def run( - p = Path(p) # to Path - save_path = str(save_dir / p.name) # im.jpg + s += '%gx%g ' % im.shape[2:] # print string # im0_ant = im0.copy() @@ -552,28 +570,33 @@ def run( # Save results (image and video with tracking) im0 = annotator.result() - save_path_img, ext = os.path.splitext(save_path) + + p = Path(p) # to Path + save_path = str(save_dir / p.name) # im.jpg if save_img: + save_path_img, ext = os.path.splitext(save_path) if dataset.mode == 'image': - imgpath = save_path_img + f"_{dataset}.png" + imgpath = save_path_img + ".png" else: imgpath = save_path_img + f"_{frameId}.png" - cv2.imwrite(Path(imgpath), im0) - if vid_path[i] != save_path: # new video - vid_path[i] = save_path - if isinstance(vid_writer[i], cv2.VideoWriter): - vid_writer[i].release() # release previous video writer - if vid_cap: # video - fps = vid_cap.get(cv2.CAP_PROP_FPS) - w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) - h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) - else: # stream - fps, w, h = 30, im0.shape[1], im0.shape[0] - save_path = str(Path(save_path).with_suffix('.mp4')) # force *.mp4 suffix on results videos - vid_writer[i] = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h)) - vid_writer[i].write(im0) + if dataset.mode == 'video': + + if vid_path[i] != save_path: # new video + vid_path[i] = save_path + if isinstance(vid_writer[i], cv2.VideoWriter): + vid_writer[i].release() # release previous video writer + if vid_cap: # video + fps = vid_cap.get(cv2.CAP_PROP_FPS) + w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + else: # stream + fps, w, h = 30, im0.shape[1], im0.shape[0] + save_path = str(Path(save_path).with_suffix('.mp4')) # force *.mp4 suffix on results videos + vid_writer[i] = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h)) + vid_writer[i].write(im0) + # Print time (inference-only) LOGGER.info(f"{s}{'' if len(det) else '(no detections), '}{dt[1].dt * 1E3:.1f}ms") @@ -672,40 +695,25 @@ def parse_opt(): print_args(vars(opt)) return opt -def find_files_in_nested_dirs(root_dir): +def find_video_imgs(root_dir): all_files = [] extensions = ['.mp4'] for dirpath, dirnames, filenames in os.walk(root_dir): for filename in filenames: file, ext = os.path.splitext(filename) - if ext in extensions: + if ext in IMG_FORMATS + VID_FORMATS: all_files.append(os.path.join(dirpath, filename)) return all_files -print('=======') - -def main(opt): - check_requirements(ROOT / 'requirements.txt', exclude=('tensorboard', 'thop')) - optdict = vars(opt) - - p = r"D:\datasets\ym" - p = r"D:\exhibition\images\153112511_0_seek_105.mp4" - - optdict["project"] = r"D:\exhibition\result" - - files = [] - if os.path.isdir(p): - files.extend(sorted(glob.glob(os.path.join(p, '*.*')))) - optdict["source"] = files - elif os.path.isfile(p): - optdict["source"] = p - - run(**optdict) -def main_loop(opt): +def main(): + ''' + run(): 单张图像或单个视频文件的推理,不支持图像序列, + ''' + check_requirements(ROOT / 'requirements.txt', exclude=('tensorboard', 'thop')) - + opt = parse_opt() optdict = vars(opt) # p = r"D:\datasets\ym\永辉测试数据_比对" @@ -714,28 +722,22 @@ def main_loop(opt): # p = r"D:\datasets\ym\实验室测试" # p = r"D:\datasets\ym\永辉双摄视频\新建文件夹" # p = r"\\192.168.1.28\share\测试_202406\0723\0723_2\20240723-112522_" - p = r"D:\datasets\ym\联华中环" + # p = r"D:\datasets\ym\联华中环" + p = r"D:\exhibition\images\153112511_0_seek_105.mp4" + # p = r"D:\exhibition\images\image" - k = 0 + + optdict["project"] = r"D:\exhibition\result" if os.path.isdir(p): - files = find_files_in_nested_dirs(p) - - # files = [r"D:\datasets\ym\广告板遮挡测试\8\6926636301004_20240508-175300_back_addGood_70f754088050_215_17327712807.mp4", - # r"D:\datasets\ym\videos\标记视频\test_20240402-173935_6920152400975_back_174037372.mp4", - # r"D:\datasets\ym\videos\标记视频\test_20240402-173935_6920152400975_front_174037379.mp4", - # r"D:\datasets\ym\广告板遮挡测试\8\2500441577966_20240508-175946_front_addGood_70f75407b7ae_155_17788571404.mp4" - # ] - - # files = [r"\\192.168.1.28\share\测试_202406\0723\0723_2\20240723-095838_\1_seek_193.mp4"] - - + files = find_video_imgs(p) + k = 0 for file in files: optdict["source"] = file run(**optdict) - # k += 1 - # if k == 10: - # break + k += 1 + if k == 1: + break elif os.path.isfile(p): optdict["source"] = p run(**optdict) @@ -744,10 +746,8 @@ def main_loop(opt): if __name__ == '__main__': - opt = parse_opt() - - main(opt) - # main_loop(opt) + main() + diff --git a/tracking/utils/__pycache__/read_data.cpython-39.pyc b/tracking/utils/__pycache__/read_data.cpython-39.pyc index 5f04eaadea8f70a44167fc9f558f2b3920ffbd5a..f761704a062314a504e5128db570d0bcb6841d19 100644 GIT binary patch delta 3095 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 E58pyJ!T= 0 and line.find("output_box:") < 0: + if line.find("box:") >= 0 and line.find("output_box:")<0 and line.find("out_boxes")<0: box = line[line.find("box:") + 4:].strip() # if len(box)==6: boxes.append(str_to_float_arr(box)) @@ -122,7 +119,9 @@ def extract_data(datapath): for line in lines: line = line.strip() # 去除行尾的换行符和可能的空白字符 if not line: # 跳过空行 - continue + tracking_flag = False + continue + if tracking_flag: if line.find("tracking_") >= 0: tracking_flag = False @@ -176,8 +175,10 @@ def read_tracking_output(filepath): boxes.append(data) if data.size == 256: feats.append(data) - - assert(len(feats)==len(boxes)), f"{filepath}, len(feats)!=len(boxes)" + + + if len(feats) != len(boxes): + return np.array([]), np.array([]) return np.array(boxes), np.array(feats) @@ -331,7 +332,6 @@ def read_similar(filePath): line = line[:-1] Dict = {} - if not line: if len(one2one_list): SimiDict['one2one'] = one2one_list if len(one2n_list): SimiDict['one2n'] = one2n_list diff --git a/说明文档.txt b/说明文档.txt index 00b3ee9..37d2026 100644 --- a/说明文档.txt +++ b/说明文档.txt @@ -38,7 +38,7 @@ 需分 2 步运行模块: (1) runyolo() - 该模块调用 imgs_inference.py 中模块 run_yolo + 该模块调用 imgs_inference.py 中模块 run_yolo, 该模块重新定义了类 LoadImages, 对图像进行了旋转。 后续工作: 1). 将run_yolo模块与track_redi.yolo_resnet_tracker模块合并 2). 图像文件名标准化 @@ -126,14 +126,14 @@ ./contrast - feat_similar.py + seqfeat_compare.py similarity_compare_sequence(root_dir) inputs: root_dir:文件夹,包含"subimgs"字段,对该文件夹中的相邻图像进行相似度比较 silimarity_compare() 功能:对imgpaths文件夹中的图像进行相似度比较 - feat_select.py + input_getout_compare.py creatd_deletedBarcode_front(filepath) (1) 基于 deletedBarcode.txt, 构造取出事件和相应的放入事件,构成列表并更新这些列表。 MatchList = [(getout_event, InputList), ...] @@ -145,6 +145,9 @@ precision_compare(filepath, savepath) 读取 deletedBarcode.txt 和 deletedBarcodeTest.txt 中的数据,进行相似度比较 + stdfeat_analys() + + genfeats.py get_std_barcodeDict(bcdpath, savepath) 功能: 生成并保存只有一个key值的字典 {barcode: [imgpath1, imgpath1, ...]} @@ -207,6 +210,7 @@ one2one_contrast.py + 已修改,未更新。 共6个地址: (1) stdSamplePath: 用于生成比对标准特征集的原始图像地址 (2) stdBarcodePath: 比对标准特征集原始图像地址的pickle文件存储,{barcode: [imgpath1, imgpath1, ...]} @@ -283,6 +287,11 @@ (3) featpath:调用 inference_image(), 对每一个barcode,生成字典并进行存储 - +time_devide.py + runyolo() + 执行 imgs_inference.py 中的 run_yolo()模块,该模块重新定义了类 LoadImages, 对图像进行了旋转。 + + show_seri() + \ No newline at end of file