From bfe7bc0fd58c3b44256045f65069459a427aaee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E5=88=9A?= Date: Tue, 14 Jan 2025 19:00:59 +0800 Subject: [PATCH] box select in a track and feat simi modify in tracker --- __pycache__/track_reid.cpython-39.pyc | Bin 15754 -> 16286 bytes .../__pycache__/config.cpython-39.pyc | Bin 1619 -> 1619 bytes .../__pycache__/inference.cpython-39.pyc | Bin 12007 -> 12007 bytes pipeline.py | 66 ++++++++++++---- track_reid.py | 33 ++++++-- .../__pycache__/dotracks.cpython-39.pyc | Bin 15710 -> 17627 bytes tracking/dotrack/dotracks.py | 71 ++++++++++++++++++ .../__pycache__/bot_sort.cpython-39.pyc | Bin 7196 -> 7205 bytes .../__pycache__/byte_tracker.cpython-39.pyc | Bin 14648 -> 15012 bytes tracking/trackers/bot_sort.py | 2 +- tracking/trackers/byte_tracker.py | 7 +- 11 files changed, 157 insertions(+), 22 deletions(-) diff --git a/__pycache__/track_reid.cpython-39.pyc b/__pycache__/track_reid.cpython-39.pyc index 8dad08455f154116127627cf8339ed6dbec4d810..a0d5b2d3f7eb2af1dc85748b7adc6b6858df9ebd 100644 GIT binary patch delta 5756 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 diff --git a/contrast/feat_extract/__pycache__/config.cpython-39.pyc b/contrast/feat_extract/__pycache__/config.cpython-39.pyc index 2571d7d46b564eda471424625e6e75f2e6a90666..2141ac1fd9880a3189b0f076deb666f72ec63284 100644 GIT binary patch delta 164 zcmcc2bD4)bk(ZZ?0SJ7bwQS^G$jEqW^IFDyMn;3lvdqqmw8 opO==IUIftr)&?T1Kyn;5x%nxjIjMGxKwdE$kl<*cuRXYj-_HEs|Gk-=H@nro)$WjT za0(l^G6O2a??qkM%DkPu`4ufBs6gd_SBZ$BwQop5XSIp{vnva zLQfDFhCQcX(oA@o0OIDa-Oe=k12WAK<_V85yYMh1%+|sw$eQMgz_aj2Q6ns(x3~ck z*jDWE-R6OiUGMFaV-cApOQf=?#2k(n$6?*vF^RI6#OK)(Q0-mQ7+z8WP-=vrCqYJ|>HuO2l9?kA-#`vTle>(+mr`Sd=8EuBb}4 z#Jq~3$U1vQbreE~!^%+9Xak$UwURnmz;7k*v#5`PjZK;>zIlMxc-&tE!zlZ!VHEH9 zgWg`sEvH;paT;ODit2a1TjaN^(x9UDsi`wqq&ja1OK1~>Qj>RJKam3SkXT2xSm5HNgQM>JWQQctLnccxA@-oB_U_pEYeD;{Mteu<&y2UjDtS zwe_%so3*XM4sy~jz*GW#xRrTYj_DdpU0b?@Rz~vl$H_54NcJt+vII@nF%~F*^LQf= rgb;oX2=EsF1S-lFcrcVY!6?)Edc;e*7PGRtlx{gDsWJ;=bKUYkKS%>0 delta 924 zcmYL|OH30{6ox&8(n?!sgc=?NNFs> zBs6js8YC(SA)-QxV|<}5Omt&(LEJb&I1IAU)$4fCP5--x@`B5ljQXn+yCRa4L~&gHMlR6Za!~HT#m&jyOiA9_$O~R(O&j~QuLnZQ5pJIDsvKkXvBofmhzye(ISyd&Z z1SRHFVv4M?=Tv8q&_xN^N@$>oE#P`t11#b9vJYnJqhMsy+N1LO0B`V=s{}?-cGbcJ z&bhqKDCJgBZhm^PJ}K5eD5}bs%o5tJYc(5^xZs}QZg=(VTr>L>Wc7h zwKwM(@W2GF*Er!WeyTYHJ@d6yuz>E`_vJHG-4v2Wlu$gBIfG@Y^OmrJMnR}}O2dcb zGplk;91SWV_L#I)!Wy0yDnZvGf(0DZA@+jslJJV~T1y_d0DL>Y>N=qZ4}03dhvS}u z{Cl5x8es*uJsn<&ob(H@Ab~zy&p9uL)di^QYiB{dS(%>gAShoz9rL~LtV{Rd?30;~W4 diff --git a/pipeline.py b/pipeline.py index d24f78d..a2600e7 100644 --- a/pipeline.py +++ b/pipeline.py @@ -10,6 +10,7 @@ import cv2 import pickle import numpy as np from pathlib import Path +from scipy.spatial.distance import cdist from track_reid import yolo_resnet_tracker from tracking.dotrack.dotracks_back import doBackTracks @@ -19,13 +20,45 @@ from utils.getsource import get_image_pairs, get_video_pairs from tracking.utils.read_data import read_similar -def save_subimgs(imgdict, boxes, spath, ctype): +def save_subimgs(imgdict, boxes, spath, ctype, featdict = None): + ''' + 当前 box 特征和该轨迹前一个 box 特征的相似度,可用于和跟踪序列中的相似度进行比较 + ''' + boxes = boxes[np.argsort(boxes[:, 7])] for i in range(len(boxes)): - fid, bid = int(boxes[i, 7]), int(boxes[i, 8]) - if f"{fid}_{bid}" in imgdict.keys(): - img = imgdict[f"{fid}_{bid}"] - imgpath = spath / f"{ctype}_{fid}_{bid}.png" - cv2.imwrite(imgpath, img) + simi = None + tid, fid, bid = int(boxes[i, 4]), int(boxes[i, 7]), int(boxes[i, 8]) + + if i>0: + _, fid0, bid0 = int(boxes[i-1, 4]), int(boxes[i-1, 7]), int(boxes[i-1, 8]) + if f"{fid0}_{bid0}" in featdict.keys() and f"{fid}_{bid}" in featdict.keys(): + feat0 = featdict[f"{fid0}_{bid0}"] + feat1 = featdict[f"{fid}_{bid}"] + simi = 1 - np.maximum(0.0, cdist(feat0[None, :], feat1[None, :], "cosine"))[0][0] + + img = imgdict[f"{fid}_{bid}"] + imgpath = spath / f"{ctype}_tid{tid}-{fid}-{bid}.png" + if simi is not None: + imgpath = spath / f"{ctype}_tid{tid}-{fid}-{bid}_sim{simi:.2f}.png" + + cv2.imwrite(imgpath, img) + + +def save_subimgs_1(imgdict, boxes, spath, ctype, simidict = None): + ''' + 当前 box 特征和该轨迹 smooth_feat 特征的相似度, yolo_resnet_tracker 函数中, + 采用该方式记录特征相似度 + ''' + for i in range(len(boxes)): + tid, fid, bid = int(boxes[i, 4]), int(boxes[i, 7]), int(boxes[i, 8]) + + key = f"{fid}_{bid}" + img = imgdict[key] + imgpath = spath / f"{ctype}_tid{tid}-{fid}-{bid}.png" + if simidict is not None and key in simidict.keys(): + imgpath = spath / f"{ctype}_tid{tid}-{fid}-{bid}_sim{simidict[key]:.2f}.png" + + cv2.imwrite(imgpath, img) def pipeline( @@ -177,15 +210,18 @@ def pipeline( yolos = ShoppingDict["backCamera"]["yoloResnetTracker"] ctype = 0 - imgdict = {} + imgdict, featdict, simidict = {}, {}, {} for y in yolos: 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) + save_subimgs(imgdict, track, savepath_pipeline_subimgs, ctype, featdict) else: - save_subimgs(imgdict, track.boxes, savepath_pipeline_subimgs, ctype) + save_subimgs(imgdict, track.slt_boxes, savepath_pipeline_subimgs, ctype, featdict) '''轨迹显示模块''' @@ -243,14 +279,14 @@ 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)) + # try: + # pipeline(**parmDict) + # except Exception as e: + # errEvents.append(str(item)) k+=1 - if k==1: + if k==2: break errfile = os.path.join(parmDict["savepath"], f'error_events.txt') diff --git a/track_reid.py b/track_reid.py index 59acd33..9a3f029 100644 --- a/track_reid.py +++ b/track_reid.py @@ -38,6 +38,7 @@ import glob import numpy as np import pickle import torch +from scipy.spatial.distance import cdist FILE = Path(__file__).resolve() ROOT = FILE.parents[0] # YOLOv5 root directory @@ -222,8 +223,20 @@ def yolo_resnet_tracker( 这里,frame_index 也可以用视频的 帧ID 代替, box_index 保持不变 ''' det_tracking = Boxes(det, im0.shape).cpu().numpy() - tracks = tracker.update(det_tracking, im0) + tracks, outfeats = tracker.update(det_tracking, im0) + simdict, simdict1 = {}, {} + for fid, bid, mfeat, cfeat, features in outfeats: + if mfeat is not None and cfeat is not None: + simi = 1 - np.maximum(0.0, cdist(mfeat[None, :], cfeat[None, :], "cosine"))[0][0] + simdict.update({f"{int(frameId)}_{int(bid)}":simi}) + + if cfeat is not None and len(features)>=2: + mfeat = features[-2] + simi = 1 - np.maximum(0.0, cdist(mfeat[None, :], cfeat[None, :], "cosine"))[0][0] + simdict1.update({f"{int(frameId)}_{int(bid)}":simi}) + + if len(tracks) > 0: tracks[:, 7] = frameId # trackerBoxes = np.concatenate([trackerBoxes, tracks], axis=0) @@ -239,7 +252,10 @@ def yolo_resnet_tracker( "bboxes": det, "tboxes": tracks, "imgs": imgdict, - "feats": featdict} + "feats": featdict, + "featsimi": simdict, # 当前 box 特征和该轨迹 smooth_feat 特征的相似度 + "featsimi1": simdict1 # 当前 box 特征和该轨迹前一个 box 特征的相似度 + } yoloResnetTracker.append(frameDict) # imgs, features = inference_image(im0, tracks) @@ -247,8 +263,15 @@ def yolo_resnet_tracker( '''================== 2. 提取手势位置 ===================''' for *xyxy, id, conf, cls, fid, bid in reversed(tracks): - name = ('' if id==-1 else f'id:{int(id)} ') + names[int(cls)] - label = None if hide_labels else (name if hide_conf else f'{name} {conf:.2f}') + name = ('' if id==-1 else f'id:{int(id)} ') + names[int(cls)] + if f"{int(frameId)}_{int(bid)}" in simdict.keys(): + sim = simdict[f"{int(frameId)}_{int(bid)}"] + label = f"{name} {sim:.2f}" + else: + label = None if hide_labels else name + + + # label = None if hide_labels else (name if hide_conf else f'{name} {conf:.1f}') if id >=0 and cls==0: color = colors(int(cls), True) @@ -489,7 +512,7 @@ def run( ''' det_tracking = Boxes(det, im0.shape).cpu().numpy() - tracks = tracker.update(det_tracking, im0) + tracks, outfeats = tracker.update(det_tracking, im0) if len(tracks) == 0: continue diff --git a/tracking/dotrack/__pycache__/dotracks.cpython-39.pyc b/tracking/dotrack/__pycache__/dotracks.cpython-39.pyc index 212091fa379816d7aa21aa630af6aa1890f2723c..ce553675900457d6277aa93ad2d305a7ce6d22fe 100644 GIT binary patch delta 5846 zcmai2eQX@Zb>G>q+uQphDN-aQidw~%tcxg$JW;kxNp|#MT5=rOmf6@@$3E@dEXgJB z%d>kF$=vzkQg&;gNUTg!1V!DDMvTBtTGwC-G>Mbih5v|?z;O$=O*ggcqCgD80a6D= zoIe62@68@Rq{PSp_uKbo-n^N8^SY zQIjSv6T9nni6&|4vP4tMvb_zsG|d2)0j?Xk4%!J^CvZJfzE{d_d*Sm?^} ztzgEryh`9Q-z^4SwPIE0U1k-k3pvYSu47Gm^KJ$CQOl`NF)?hNsxG)b&cjk`VRUhH zA-9;brmC#$1jDA-;Ut^(#|4G^iS_#{wc(b-n6sE2w@zA>dbzd;N`SYjQ&k6P55_k6sQ!lJe0vg)vP#+`ENrNBp-QTO0YZDU^$ zn{ToAhuWldwW-V3nEH=+L-Z!+8G!)FY9W~n>yXQ+8f-wfvvoUszAJWf~5x$`B)oy~J2l&(aUk=@g>QRDy0$~yXPrl`~V%2(p ziVK{^zT9!`0-iJmh{v8mrb^7A!K{iG2#e=ASkCv>_mm@~4b`L7^48 z9)clPvI&)JNNu)4`}og{J)B+Us}dlO>mG!1*b!=Fib2gbq`OgJ zHzfKV8prM6Y4%HySEc;+pjYq-F>c~}QFC&T&@8dI(V*~0b1r0

@8-c*fs6a4Hpx!lE!}~_O0nd#qx^%!{w~`% z3+cx{SFPLH?bRyvZ9bYjatPfsRLibY0e8JLW2+}IG|Xa^RcciT8Q<3D{TXj62o*K6s=tL(bkEJGBUBJfSE2`sbaI4c&lLXQVm~vL8 z5|!5L;3{dtP0z{=xXmWq+N>fdHBbYsp)8YSaz=WRJb1aOQK_lJy~2~qkI7g=gNPS2 zm^tD^b!~013JNZhDHTd{tSQPds8Hu*_FRLk#M%nsI4HMDi1hIBXk$QinanBdmB66d zvX~LldLJDBnj_%Y)?>6ZibLWo8%M#Bt;b0;lg(5!9mE?kv@3lmOF?6IH`OD%7jHMxf{4XWvOeDImNl* zt--wZvDCOcaS=4J!w3$7uy7rycQKl>TJ%~NzwAbYX@n|HDUk()8LOg(%)#&*Yd^`{ zLGD9^=b5-9ycTg&&k`t!3!b0d#?azIOLQlC$%8IqI#esrpM@&*rl!~uh=hs{HCut2 zEo=`psnPks4q^BwQNtC4FCcJ)FY@<0_YK-HhWYB!%(d1lfz1D|9qGCt&wdfeQ1dF( zU0{EKORrHkgJVY!DkvEXm@^AywoNz-wgKjxoq#*aCWIM6)uRie>?x486DSSdl!tTM z{Qd53^4DDNxlhgzp6@xWqj8H0Pj~dKz0`BN(h|8*yENl6m(_5~MFf0(VJ7ffd|_Lo zZjfKJQ}<4uoIH0rKY8}TZTFrHb>>v2T}YqexnQTU+zL>j&MK!?STEz)h@vvgPDoRY!^F*BIgnALbw~@ z9t89ZwiCfa_#A?8p3egnri#!d2l-01g1w^6|8dt~%TAq!COYr==R`YVC+^MK}jwr=zVZr@up_y5qPQl5xu>5m_L!`9!oxv}YzKgg8{uC5Rh|ME)34k+eZ)-Er z2up0F687gP_5?sS9mUcB4(vi$2CzjE$b~V?BqfL0kkTqNaBQU(Ko$WQ6_^uvSm0P& zs1RyG7-E1A?&&8hYe)CYlJeuAb`o563e_h)AB#1b)GKbrd8mQU6z5n2&mn?C1j5E) z*~2iA)g!l;7e>I^Bep&Rn(qIUZQ>IR=RyP5dEJ1G6PPXpIZ zz=I_bQV3~;Q3OnNYz_g#mVFiBIfTDQ_y+`r9pVk21`@+YG|&e0%;s@ppOG$?6Ca{WdLfi#5ub2|goE8fF(H*(k${F{4^lUe@$-aZm?bKk&vS3R`P z((rWux^~aLkIJo!xEyPc$eK%;yGyPEzq7C&&F$Hn4pu`Y6ujJ?gXXp@0g(L9xb2>=A^GcALL;ovwWshTh{^_UEmQ%pHgRz4f&4;btfkC-b=083#N-nLDp+`vc)|i*rs|cdli10&KU&115vAiIydEZ)+ z$1U(W5s|_gw-9x8{^QKVUz>qy8ti5ABtY$ZL-tY7zOA%;nKb_q+u& zAracQDt{Y>&&jape}I7EFN~(tsx_wKKy;bxpMegeed#3nvCn?We=s^BpOAT1?gJe! zo-Ogr;r;r5BY6iuadummTxUmzW1D z(EGEygb8f(F8DL9gem?GR~F0J delta 3950 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 XkEQ5;mbDueGmVUu*^y~bk=pe?>tX&u diff --git a/tracking/dotrack/dotracks.py b/tracking/dotrack/dotracks.py index dc1790f..4e53b08 100644 --- a/tracking/dotrack/dotracks.py +++ b/tracking/dotrack/dotracks.py @@ -22,6 +22,37 @@ class MoveState: FreeMove = 3 Unknown = -1 +def bbox_ioa(box1, box2, iou=False, eps=1e-7): + """ + Calculate the intersection over box2 area given box1 and box2. Boxes are in x1y1x2y2 format. + + Args: + box1 (np.array): A numpy array of shape (n, 4) representing n bounding boxes. + box2 (np.array): A numpy array of shape (m, 4) representing m bounding boxes. + iou (bool): Calculate the standard iou if True else return inter_area/box2_area. + eps (float, optional): A small value to avoid division by zero. Defaults to 1e-7. + + Returns: + (np.array): A numpy array of shape (n, m) representing the intersection over box2 area. + """ + + # Get the coordinates of bounding boxes + b1_x1, b1_y1, b1_x2, b1_y2 = box1.T + b2_x1, b2_y1, b2_x2, b2_y2 = box2.T + + # Intersection area + inter_area = (np.minimum(b1_x2[:, None], b2_x2) - np.maximum(b1_x1[:, None], b2_x1)).clip(0) * \ + (np.minimum(b1_y2[:, None], b2_y2) - np.maximum(b1_y1[:, None], b2_y1)).clip(0) + + # box2 area + area = (b2_x2 - b2_x1) * (b2_y2 - b2_y1) + if iou: + box1_area = (b1_x2 - b1_x1) * (b1_y2 - b1_y1) + area = area + box1_area[:, None] - inter_area + + # Intersection over box2 area + return inter_area / (area + eps) + class ShoppingCart: def __init__(self, bboxes): @@ -90,6 +121,7 @@ class Track: self.boxes = boxes self.features = features + self.slt_boxes = self.select_boxes() self.tid = int(boxes[0, 4]) self.cls = int(boxes[0, 6]) @@ -138,6 +170,43 @@ class Track: self.HAND_STATIC_THRESH = 100 if self.cls == 0: self.extract_hand_features() + + def select_boxes(self): + + slt_boxes = [] + idx = np.argsort(self.boxes[:, 7]) + boxes = self.boxes[idx] + features = self.features[idx] + + for i in range(len(boxes)): + simi = None + box, tid, fid, bid = boxes[i, :4], int(boxes[i, 4]), int(boxes[i, 7]), int(boxes[i, 8]) + + if i == 0: + slt_boxes.append(boxes[i, :]) + continue + + if len(boxes)!=len(features): + print("check!") + continue + + box0, tid0, fid0, bid0 = boxes[i-1, :4], int(boxes[i-1, 4]), int(boxes[i-1, 7]), int(boxes[i-1, 8]) + + # 当前 box 和轨迹上一个 box 的iou + iou = bbox_ioa(box[None, :], box0[None, :]) + + # 当前 box 和轨迹上一个 box 的 feat similarity + feat0 = features[i, :][None, :] + feat1 = features[i-1, :][None, :] + simi = 1 - np.maximum(0.0, cdist(feat0, feat1, "cosine"))[0][0] + + if iou > 0.85 and simi>0.85: + continue + + slt_boxes.append(boxes[i, :]) + + + return np.array(slt_boxes) def compute_cornpoints(self): @@ -415,6 +484,8 @@ class doTracks: self.DownWard = [] # subset of self.Residual self.UpWard = [] # subset of self.Residual self.FreeMove = [] # subset of self.Residual + + def array2list(self): diff --git a/tracking/trackers/__pycache__/bot_sort.cpython-39.pyc b/tracking/trackers/__pycache__/bot_sort.cpython-39.pyc index 20786958ba5701b4494fcfa9853d373acbad5cd0..b02abbde4e06511db66045f83d534ef82372b030 100644 GIT binary patch delta 106 zcmbPZvDAV)k(ZZ?0SLq;+BS0gi1D*zv(&Puu+}iwu-h=Cuue`BQ!tnXIbsz|j8T(CB~LTvPJSr)kFjv_1F6-FwCk(ZZ?0SMIWZ8viJi19OKv(&Puu+%Wuu-h=CuuM)9Qxs(_iUq1D;s+Ax zvu1+8O?$u1OT{Xf7;jCMlRV9sH#uHdd@`fdbH<{{FQry9Mope7tqLS}OJ@N9|9BlP diff --git a/tracking/trackers/__pycache__/byte_tracker.cpython-39.pyc b/tracking/trackers/__pycache__/byte_tracker.cpython-39.pyc index 9a16c8c168fc1dc1d082c37dc68182f08239a4c0..18b2f8f7290258d366b3dbc9f5b1d7db752f2c2a 100644 GIT binary patch delta 813 zcmb`EUr1AN6vywmcbm?1n6p*1B17Enb<;VU`r<<&5kW&3_#i|r_opP8{_ZYBPNbIh zkO_6fSWuA_WZ|H0ny)<+(TgPnb)}%Uz^KO{2s-DEh~E3b`P_5P@0{QLp5Jd(+%r7M zy1E*PRuxQV-^U+&*8HAU4#^ZUecs&k=NzF_L&|kgDoDdMeNqu7)RfnbtL;cD1Pf|G z+b(6~grqi_Cz=dpatNsX&yvaEBNJr0M#$1x$M#J?0fr^vAhIWuDP$ZwGtR5>m?I$x zHW?W(v86+Ri`f6E+t6=Le*PAo2vsJ`s+o}?2-8hriE#>q`)^0NgT8iKs zbmxq`JyOSCH;Nwud*K!S47_wI_25zPdGIUDU|DU08~9Oeh6^Zb%TO{`wIIN4{M>qY zTZvU%XVfz08F%?=oR`VHi36dxuzzMe%tjAUQ90TIZ}45Tch3?P zi86y9S3G6ZGp-R{n32xiGFTXom0$zE#Ae_d8eK>I%e1M2f#qO!j`6oG04bIO8`BMBE}m?rKaX(%nC}AQubli=e~_C(Zp76HORCzAOd7Z(IyZf03!N<#DUFoOk|lDuTI`&Hk0w% zHn)@ 0.9) + emb_dists_mask = (emb_dists > 0.8) iou_dists[emb_dists_mask] = 1 emb_dists[iou_dists_mask] = 1 diff --git a/tracking/trackers/byte_tracker.py b/tracking/trackers/byte_tracker.py index a4f8541..bca8aca 100644 --- a/tracking/trackers/byte_tracker.py +++ b/tracking/trackers/byte_tracker.py @@ -374,8 +374,13 @@ class BYTETracker: for x in first_finded if x.first_find] output = np.asarray(output1 + output2, dtype=np.float32) + + + out_feat1 = [(x.frame_id, x.idx, x.smooth_feat, x.curr_feat, x.features) for x in self.tracked_stracks if x.is_activated] + out_feat2 = [(x.frame_id, x.idx, x.smooth_feat, x.curr_feat, x.features) for x in first_finded if x.first_find] + - return output + return output, out_feat1 + out_feat2 def get_result(self):