From afd033b965061dbe8364d413ca6a830b8301d7c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E5=88=9A?= Date: Tue, 10 Dec 2024 19:01:54 +0800 Subject: [PATCH] modify at output data format --- __pycache__/track_reid.cpython-39.pyc | Bin 15846 -> 15744 bytes contrast/one2one_contrast.py | 176 +----------------- .../utils/__pycache__/event.cpython-39.pyc | Bin 4048 -> 6124 bytes contrast/utils/dotest.py | 155 +++++++++++++++ contrast/utils/event.py | 160 ++++++++++++---- pipeline.py | 138 ++++++++++++-- track_reid.py | 38 ++-- .../__pycache__/dotracks.cpython-39.pyc | Bin 15442 -> 15710 bytes .../__pycache__/dotracks_back.cpython-39.pyc | Bin 6632 -> 6963 bytes .../__pycache__/dotracks_front.cpython-39.pyc | Bin 5345 -> 5679 bytes tracking/dotrack/dotracks.py | 26 ++- tracking/dotrack/dotracks_back.py | 23 ++- tracking/dotrack/dotracks_front.py | 24 ++- .../__pycache__/read_data.cpython-39.pyc | Bin 11945 -> 12153 bytes tracking/utils/read_data.py | 95 +++++++--- 15 files changed, 545 insertions(+), 290 deletions(-) create mode 100644 contrast/utils/dotest.py diff --git a/__pycache__/track_reid.cpython-39.pyc b/__pycache__/track_reid.cpython-39.pyc index 736b8a3cfe5184de400d9a2d724b78b8d6c170c1..e5287f59e3c7e3a12e8be7bb88e90d3b75ce183c 100644 GIT binary patch delta 3220 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 delta 3439 zcmZvee{ft?702IwZ-1mon}#;OHtCNv&F{_Tce+WMv<*$#CQXYD2(+}U+uTjqO}a_% zJ|Knr*uu7@R8vx}wrHvBYC)@@13?A+0rEo>1p!gysf;4yh{KG({?QpnJm0q=V8>+k z^UgW<+;h)8_q@A%k0iL^>o@S8@#EMglyD2Rus>rVS$bOB+HCIw|X(@wg@fEGw z982`HP{#P*Lmyhwpd~kvR7w+LW{K3zQrVbdF<-gH^Z3$PJ+AX*R;jFz0a?PA@%&lC zYIOqtZ`^w>iMyQQR?$|@XN4QzMN~vbe~qN1vRV1TrE2=E`8=2SxI$RK}mK}RoYW*F6k1(=Gu== zlI@%db4(|$Jf@FP7}-JPGtw0l;*zmm&0HtjopC)~nbFegDUA)XE?p%z$c~I|1!# zO7kGI*Kgm~7pne46tIr#_v%aCQ{ z_9EBfrLvr)*QF89mj*oL<$TRK*LlMlq;TE|_nb@Q$gNJ9NiqZ3C_FEvTifDIi$0Bx zk3rszj!%Co$rhY)%>ZAUm1SqFNp6vYavQIhrFUb_ICNBYrkkA>!%}H#B-e*;LW)`2 zol{*$`*MjRayzf2^moJyNLnwuDB;TU1}tVvx|Qbbpo5|Apd;}l>Bai6C0ydgOGEQ2 znm81%GuM2uV2Y*N`1%Yrl}~d`^ zRD3jSM&k5QBPFl0-D*wg4Q#)zWh%#rkH)HV)8 zx$T-cJagFAAyJZJwlO-Hu#GX&-IL)1kx7wIU1dpw6)^R9S#YJt#qht16|*(0l9lNz z4CN^waOE4~o%xaS_m&Jkfh0W6+{9J&y6v3~i%8r|2n+~(--#W-FwhTN0pL``$AK#e z>O^&A@)OXmCTtVeLc9*xN4Q1rsSpa<^*{(X0E_}0m;fTc7!U&v0=+;Sm;$DOLx2EG zpc-h<=pkw#-UQqX%m9ahTYy^$Dq3T+88uMb%#JCu_F*=wD(iN5&SU(fnyxENUIVcN zFn|#td$^F60v_NtAPL}yf#?P*fg`}}z#Rmt?bK+P4#_nUIh+umhCKxw1&#p&z;@uc zrX@9TC&UxLUBC+9Q^02kws$;YhD}olA54Y7DWDv<8<+!51NQ(<~t0eAp-5co2Hw^w`x zxTyYCzgOMSP?&6i`Z3@U;89>d;8bHC(qq6kfo}od1|A2V1il080rmpUexHE!UEq7b z_W`P@CI$igh!figv@P{kL!jyFFgyiZa>}i+Jq`Q-cm}wry8WBo;#rc_G5?mNcn(%n zN&FCa0r(Lx1iT0Q7KTnS0RH*P)>7ul%4$nn2lLP0*tU}8)nU}}^UtgHc9!S3 zWDV-oj`dkR;KWexcU)lCsSBMQ>t?a)Spbc1=h6j~h=jsoJdy2>6Y5``BkYvgw&4oa zrOs?Pxq`mhHQRM_cyc0Je-~42!998F5V;ztP-lYcYoFBV$9e(9)aVNIutJtY*WyxE z%0xdo-Qw-b{;4;DPvziJ%dM!WP!DuHn|z3r><#xdNVSCB^|>M+N)zID0qp=%$-XM? zXo5$D6I#@e)%HXaW6{Y-y+;J0dZ(sM+~s05G&hD4Hk-&M?3CXDl|P3zcQ71{zo7oo z?Qa@}drl|>ODI&Y?{@O3-)(zCAwD%43W;WT7^8`sC>yn-r=lpI4B1=Y2vW|4no?HJ z>VkI{x8PL$`T4K*oMh}x)!Exn0: - # bboxes, ffeats, trackerboxes, tracker_feat_dict, trackingboxes, tracking_feat_dict = extract_data(datapath) - - ''' 2.2 读取 0/1_tracking_output.data 中数据''' - if dataname.find("_tracking_output.data")>0: - tracking_output_boxes, tracking_output_feats = read_tracking_output(datapath) - if len(tracking_output_boxes) != len(tracking_output_feats): continue - if CamerType == '0': - event['back_boxes'] = tracking_output_boxes - event['back_feats'] = tracking_output_feats - elif CamerType == '1': - event['front_boxes'] = tracking_output_boxes - event['front_feats'] = tracking_output_feats - - if dataname.find("process.data")==0: - simiDict = read_similar(datapath) - event['one2one'] = simiDict['one2one'] - event['one2n'] = simiDict['one2n'] - - - if len(event['back_boxes'])==0 or len(event['front_boxes'])==0: - return None - - '''2.3 事件的特征表征方式: 特征选择、特征集成''' - bk_feats = event['back_feats'] - ft_feats = event['front_feats'] - - '''2.3.1 特征集成''' - feats_compose = np.empty((0, 256), dtype=np.float64) - if len(ft_feats): - feats_compose = np.concatenate((feats_compose, ft_feats), axis=0) - if len(bk_feats): - feats_compose = np.concatenate((feats_compose, bk_feats), axis=0) - event['feats_compose'] = feats_compose - - '''2.3.1 特征选择''' - if len(ft_feats): - event['feats_select'] = ft_feats - - - '''================ 3. 读取图像文件地址,并按照帧ID排序 =============''' - 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 - - 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) - - frontIdx = np.argsort(np.array(frontFid)) - backIdx = np.argsort(np.array(backFid)) - - '''3.1 生成依据帧 ID 排序的前后摄图像地址列表''' - frontImgs = [frontImgs[i] for i in frontIdx] - backImgs = [backImgs[i] for i in backIdx] - - '''3.2 将前、后摄图像路径添加至事件字典''' - - - bfid = event['back_boxes'][:, 7].astype(np.int64) - ffid = event['front_boxes'][:, 7].astype(np.int64) - if len(bfid) and max(bfid) <= len(backImgs): - event['back_imgpaths'] = [backImgs[i-1] for i in bfid] - if len(ffid) and max(ffid) <= len(frontImgs): - event['front_imgpaths'] = [frontImgs[i-1] for i in ffid] - - - '''================ 4. 判断当前事件有效性,并添加至事件列表 ==========''' - condt1 = len(event['back_imgpaths'])==0 or len(event['front_imgpaths'])==0 - condt2 = len(event['front_feats'])==0 and len(event['back_feats'])==0 - - if condt1 or condt2: - print(f"Event: {evtName}, Error, condt1: {condt1}, condt2: {condt2}") - return None - - return event - - - def plot_save_image(event, savepath): cameras = ('front', 'back') @@ -286,9 +144,6 @@ def save_event_subimg(event, savepath): else: boxes = event.back_boxes imgpaths = event.back_imgpaths - - - for i, box in enumerate(boxes): x1, y1, x2, y2, tid, score, cls, fid, bid = box @@ -491,8 +346,8 @@ def one2one_simi(): ##============================================ float32 stdfeat = stdDict[stdbcd]["feats_ft32"] - evtfeat = event.feats_compose - + + evtfeat = event.feats_compose if len(evtfeat)==0: continue matrix = 1 - cdist(stdfeat, evtfeat, 'cosine') @@ -585,28 +440,9 @@ def gen_eventdict(sourcePath, saveimg=True): 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 - - - # 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) + event = ShoppingEvent(source_path, stype="data") eventList.append(event) with open(pickpath, 'wb') as f: pickle.dump(event, f) @@ -624,9 +460,7 @@ def gen_eventdict(sourcePath, saveimg=True): for line in errEvents: f.write(line + '\n') - - def test_one2one(): bcdList, event_spath = [], [] diff --git a/contrast/utils/__pycache__/event.cpython-39.pyc b/contrast/utils/__pycache__/event.cpython-39.pyc index 25c22c07d5c721eacb599659cfbae011c51ad973..113c3dd7cbefe2001f63bae9ff967b9692dff1d6 100644 GIT binary patch literal 6124 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 QRm~s0: + # bboxes, ffeats, trackerboxes, tracker_feat_dict, trackingboxes, tracking_feat_dict = extract_data(datapath) + + ''' 2.2 读取 0/1_tracking_output.data 中数据''' + if dataname.find("_tracking_output.data")>0: + tracking_output_boxes, tracking_output_feats = read_tracking_output(datapath) + if len(tracking_output_boxes) != len(tracking_output_feats): continue + if CamerType == '0': + event['back_boxes'] = tracking_output_boxes + event['back_feats'] = tracking_output_feats + elif CamerType == '1': + event['front_boxes'] = tracking_output_boxes + event['front_feats'] = tracking_output_feats + + if dataname.find("process.data")==0: + simiDict = read_similar(datapath) + event['one2one'] = simiDict['one2one'] + event['one2n'] = simiDict['one2n'] + + + if len(event['back_boxes'])==0 or len(event['front_boxes'])==0: + return None + + '''2.3 事件的特征表征方式: 特征选择、特征集成''' + bk_feats = event['back_feats'] + ft_feats = event['front_feats'] + + '''2.3.1 特征集成''' + feats_compose = np.empty((0, 256), dtype=np.float64) + if len(ft_feats): + feats_compose = np.concatenate((feats_compose, ft_feats), axis=0) + if len(bk_feats): + feats_compose = np.concatenate((feats_compose, bk_feats), axis=0) + event['feats_compose'] = feats_compose + + '''2.3.1 特征选择''' + if len(ft_feats): + event['feats_select'] = ft_feats + + + '''================ 3. 读取图像文件地址,并按照帧ID排序 =============''' + 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 + + 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) + + frontIdx = np.argsort(np.array(frontFid)) + backIdx = np.argsort(np.array(backFid)) + + '''3.1 生成依据帧 ID 排序的前后摄图像地址列表''' + frontImgs = [frontImgs[i] for i in frontIdx] + backImgs = [backImgs[i] for i in backIdx] + + '''3.2 将前、后摄图像路径添加至事件字典''' + + + bfid = event['back_boxes'][:, 7].astype(np.int64) + ffid = event['front_boxes'][:, 7].astype(np.int64) + if len(bfid) and max(bfid) <= len(backImgs): + event['back_imgpaths'] = [backImgs[i-1] for i in bfid] + if len(ffid) and max(ffid) <= len(frontImgs): + event['front_imgpaths'] = [frontImgs[i-1] for i in ffid] + + + '''================ 4. 判断当前事件有效性,并添加至事件列表 ==========''' + condt1 = len(event['back_imgpaths'])==0 or len(event['front_imgpaths'])==0 + condt2 = len(event['front_feats'])==0 and len(event['back_feats'])==0 + + if condt1 or condt2: + print(f"Event: {evtName}, Error, condt1: {condt1}, condt2: {condt2}") + return None + + return event \ No newline at end of file diff --git a/contrast/utils/event.py b/contrast/utils/event.py index e28f56e..fa0757f 100644 --- a/contrast/utils/event.py +++ b/contrast/utils/event.py @@ -5,6 +5,7 @@ Created on Tue Nov 26 17:35:05 2024 @author: ym """ import os +import pickle import numpy as np from pathlib import Path @@ -15,9 +16,9 @@ from tracking.utils.read_data import extract_data, read_tracking_output, read_si IMG_FORMAT = ['.bmp', '.jpg', '.jpeg', '.png'] VID_FORMAT = ['.mp4', '.avi'] -class Event: +class ShoppingEvent: def __init__(self, eventpath, stype="data"): - '''stype: str, 'video', 'image', 'data', ''' + '''stype: str, 'pickle', 'data', ''' self.eventpath = eventpath self.evtname = str(Path(eventpath).stem) @@ -35,37 +36,115 @@ class Event: 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.back_yolobboxes = [] + self.back_yolofeats = [] + self.back_trackerboxes = np.empty((0, 9), dtype=np.float64) ##和类doTracks兼容 + self.back_trackerfeats = {} + self.back_trackingboxes = [] + self.back_trackingfeats = [] - 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) + self.front_yolobboxes = [] + self.front_yolofeats = [] + self.front_trackerboxes = np.empty((0, 9), dtype=np.float64) ##和类doTracks兼容 + self.front_trackerfeats = {} + self.front_trackingboxes = [] + self.front_trackingfeats = [] '''=========== 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) + self.back_boxes = [] + self.back_feats = [] + self.front_boxes = [] + self.front_feats = [] + if stype=="data": self.from_datafile(eventpath) + if stype=="pickle": + self.from_pklfile(eventpath) + + self.feats_select = [] + self.feats_compose = np.empty((0, 256), dtype=np.float64) + self.select_feats() + self.compose_feats() + + # if stype=="image": + # self.from_image(eventpath) + + def kerndata(self, ShoppingDict, camtype="backCamera"): + ''' + camtype: str, "backCamera" or "frontCamera" + ''' + yoloboxes, resfeats = [], [] + trackerboxes = np.empty((0, 9), dtype=np.float64) + trackefeats = {} + trackingboxes, trackingfeats = [], [] + + frameDictList = ShoppingDict[camtype]["yoloResnetTracker"] + for frameDict in frameDictList: + yoloboxes.append(frameDict["bboxes"]) - if stype=="video": - self.from_video(eventpath) + tboxes = frameDict["tboxes"] + trackefeats.update(frameDict["feats"]) + + trackerboxes = np.concatenate((trackerboxes, np.array(tboxes)), axis=0) + + Residual = ShoppingDict[camtype]["tracking"].Residual + for track in Residual: + trackingboxes.append(track.boxes) + trackingfeats.append(track.features) + kdata = (yoloboxes, resfeats, trackerboxes, trackefeats, trackingboxes, trackingfeats) + + + tracking_out_boxes, tracking_out_feats = [], [] + Confirmed = ShoppingDict[camtype]["tracking"].Confirmed + for track in Confirmed: + tracking_out_boxes.append(track.boxes) + tracking_out_feats.append(track.features) + outdata = (tracking_out_boxes, tracking_out_feats) + + return kdata, outdata + + + def from_pklfile(self, eventpath): - if stype=="image": - self.from_image(eventpath) + with open(eventpath, 'rb') as f: + ShoppingDict = pickle.load(f) + + self.eventpath = ShoppingDict["eventPath"] + self.evtname = ShoppingDict["eventName"] + self.barcode = ShoppingDict["barcode"] + + '''=========== path of image and video =========== ''' + self.back_videopath = ShoppingDict["backCamera"]["videoPath"] + self.front_videopath = ShoppingDict["frontCamera"]["videoPath"] + self.back_imgpaths = ShoppingDict["backCamera"]["imagePaths"] + self.front_imgpaths = ShoppingDict["frontCamera"]["imagePaths"] + + '''===========对应于 0/1_track.data =============================''' + backdata, back_outdata = self.kerndata(ShoppingDict, "backCamera") + frontdata, front_outdata = self.kerndata(ShoppingDict, "frontCamera") + self.back_yolobboxes = backdata[0] + self.back_yolofeats = backdata[1] + self.back_trackerboxes = backdata[2] + self.back_trackerfeats = [3] + self.back_trackingboxes = [4] + self.back_trackingfeats = [5] + + self.front_yolobboxes = frontdata[0] + self.front_yolofeats = frontdata[1] + self.front_trackerboxes = frontdata[2] + self.front_trackerfeats = frontdata[3] + self.front_trackingboxes = frontdata[4] + 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] + + def from_datafile(self, eventpath): evtList = self.evtname.split('_') if len(evtList)>=2 and len(evtList[-1])>=10 and evtList[-1].isdigit(): @@ -127,21 +206,21 @@ class Event: '''========== 0/1_track.data ==========''' if dataname.find("_track.data")>0: - bboxes, ffeats, trackerboxes, tracker_feat_dict, trackingboxes, tracking_feat_dict = extract_data(datapath) + bboxes, ffeats, trackerboxes, trackerfeats, trackingboxes, trackingfeats = 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_trackerfeats = trackerfeats self.back_trackingboxes = trackingboxes - self.back_trackingfeats = tracking_feat_dict + self.back_trackingfeats = trackingfeats if CamerType == '1': self.front_yolobboxes = bboxes self.front_yolofeats = ffeats self.front_trackerboxes = trackerboxes - self.front_trackerfeats = tracker_feat_dict + self.front_trackerfeats = trackerfeats self.front_trackingboxes = trackingboxes - self.front_trackingfeats = tracking_feat_dict + self.front_trackingfeats = trackingfeats '''========== 0/1_tracking_output.data ==========''' if dataname.find("_tracking_output.data")>0: @@ -152,26 +231,37 @@ class Event: 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) + for feat in self.front_feats: + feats_compose = np.concatenate((feats_compose, feat), axis=0) if len(self.back_feats): - feats_compose = np.concatenate((feats_compose, self.back_feats), axis=0) + for feat in self.back_feats: + feats_compose = np.concatenate((feats_compose, feat), axis=0) self.feats_compose = feats_compose def select_feats(self): '''事件的特征选择''' + self.feats_select = [] if len(self.front_feats): self.feats_select = self.front_feats - else: + elif len(self.back_feats): self.feats_select = self.back_feats - + +def main(): + pklpath = r"D:\DetectTracking\evtresult\images2\ShoppingDict.pkl" + + evt = ShoppingEvent(pklpath, stype='pickle') + + +if __name__ == "__main__": + main() + diff --git a/pipeline.py b/pipeline.py index 4faba3f..71fa31b 100644 --- a/pipeline.py +++ b/pipeline.py @@ -45,7 +45,7 @@ def get_interbcd_inputenents(): def pipeline( eventpath, - savepath, + savepath = '', SourceType = "image", # video stdfeat_path = None ): @@ -53,47 +53,120 @@ def pipeline( vpaths = get_video_pairs(eventpath) elif SourceType == "image": vpaths = get_image_pairs(eventpath) - + ''' + eventpath: 单个事件的存储路径 + + ''' + '''======== 函数 yolo_resnet_tracker() 的参数字典 ========''' opt = parse_opt() optdict = vars(opt) + + + optdict["weights"] = r'D:\DetectTracking\ckpts\best_cls10_0906.pt' optdict["is_save_img"] = True optdict["is_save_video"] = True event_tracks = [] + + ## 构造购物事件字典 + evtname = Path(eventpath).stem + barcode = evtname.split('_')[-1] if len(evtname.split('_'))>=2 \ + and len(evtname.split('_')[-1])>=8 \ + and evtname.split('_')[-1].isdigit() else '' + '''事件结果存储文件夹''' + if not savepath: + savepath = Path(__file__).resolve().parents[0] / "evtresult" + save_dir_event = Path(savepath) / evtname + + + ShoppingDict = {"eventPath": eventpath, + "eventName": evtname, + "barcode": barcode, + "eventType": '', # "input", "output", "other" + "frontCamera": {}, + "backCamera": {}} + for vpath in vpaths: - '''事件结果文件夹''' - save_dir_event = Path(savepath) / Path(os.path.basename(eventpath)) + '''相机事件字典构造''' + CameraEvent = {"cameraType": '', # "front", "back" + "videoPath": '', + "imagePaths": [], + "yoloResnetTracker": [], + "tracking": [], + } + if isinstance(vpath, list): - save_dir_video = save_dir_event / Path("images") + CameraEvent["imagePaths"] = vpath + bname = os.path.basename(vpath[0]) + if not isinstance(vpath, list): + CameraEvent["videoPath"] = vpath + bname = os.path.basename(vpath) + if bname.split('_')[0] == "0" or bname.find('back')>=0: + CameraEvent["cameraType"] = "back" + if bname.split('_')[0] == "1" or bname.find('front')>=0: + CameraEvent["cameraType"] = "front" + + '''事件结果存储文件夹''' + + if isinstance(vpath, list): + save_dir_video = save_dir_event / Path("images") else: save_dir_video = save_dir_event / Path(str(Path(vpath).stem)) - if not save_dir_video.exists(): save_dir_video.mkdir(parents=True, exist_ok=True) + '''Yolo + Resnet + Tracker''' optdict["source"] = vpath optdict["save_dir"] = save_dir_video + yrtOut = yolo_resnet_tracker(**optdict) - tracksdict = yolo_resnet_tracker(**optdict) + CameraEvent["yoloResnetTracker"] = yrtOut - bboxes = tracksdict['TrackBoxes'] - bname = os.path.basename(vpath[0]) if isinstance(vpath, list) else os.path.basename(vpath) - if bname.split('_')[0] == "0" or bname.find('back')>=0: - vts = doBackTracks(bboxes, tracksdict) - vts.classify() + # bboxes = np.empty((0, 9), dtype = np.float32) + # for frameDict in yrtOut: + # bboxes = np.concatenate([bboxes, frameDict["tboxes"]], axis=0) + trackerboxes = np.empty((0, 9), dtype=np.float64) + trackefeats = {} + for frameDict in yrtOut: + tboxes = frameDict["tboxes"] + ffeats = frameDict["feats"] + + trackerboxes = np.concatenate((trackerboxes, np.array(tboxes)), axis=0) + for i in range(len(tboxes)): + fid, bid = int(tboxes[i, 7]), int(tboxes[i, 8]) + trackefeats.update({f"{fid}_{bid}": ffeats[f"{fid}_{bid}"]}) + + + '''tracking''' + if CameraEvent["cameraType"] == "back": + vts = doBackTracks(trackerboxes, trackefeats) + vts.classify() event_tracks.append(("back", vts)) - if bname.split('_')[0] == "1" or bname.find('front')>=0: - vts = doFrontTracks(bboxes, tracksdict) + CameraEvent["tracking"] = vts + ShoppingDict["backCamera"] = CameraEvent + + if CameraEvent["cameraType"] == "front": + vts = doFrontTracks(trackerboxes, trackefeats) vts.classify() event_tracks.append(("front", vts)) + + CameraEvent["tracking"] = vts + ShoppingDict["frontCamera"] = CameraEvent - + # pklpath = save_dir_event / "ShoppingDict.pkl" + # with open(str(pklpath), 'wb') as f: + # pickle.dump(ShoppingDict, f) + pklpath = Path(savepath) / evtname+".pkl" + with open(str(pklpath), 'wb') as f: + pickle.dump(ShoppingDict, f) + + '''轨迹显示模块''' illus = [None, None] for CamerType, vts in event_tracks: @@ -182,14 +255,39 @@ 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" + evtdir = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\比对测试\1209永辉超市测试" + evtdir = Path(evtdir) - parmDict["savepath"] = r"D:\contrast\detect" + parmDict = {} + parmDict["savepath"] = r"D:\contrast\detect\pipeline" parmDict["SourceType"] = "image" # video, image parmDict["stdfeat_path"] = None - - pipeline(**parmDict) + + k = 1 + errEvents = [] + for item in evtdir.iterdir(): + if item.is_dir(): + item = r"D:\exhibition\images\images2\images2" + + + parmDict["eventpath"] = item + + + try: + pipeline(**parmDict) + except Exception as e: + errEvents.append(item) + + + # k+=1 + # if k==1: + # break + + errfile = os.path.join(parmDict["savepath"], f'error_events.txt') + with open(errfile, 'w', encoding='utf-8') as f: + for line in errEvents: + f.write(line + '\n') + if __name__ == "__main__": diff --git a/track_reid.py b/track_reid.py index 76ddb95..06c33e1 100644 --- a/track_reid.py +++ b/track_reid.py @@ -196,8 +196,8 @@ def yolo_resnet_tracker( tracker = init_trackers(tracker_yaml, bs)[0] dt = (Profile(), Profile(), Profile()) - track_boxes = np.empty((0, 9), dtype = np.float32) - TracksDict = {} + # trackerBoxes = np.empty((0, 9), dtype = np.float32) + yoloResnetTracker = [] for path, im, im0s, vid_cap, s in dataset: with dt[0]: im = torch.from_numpy(im).to(model.device) @@ -245,24 +245,23 @@ def yolo_resnet_tracker( tracks[:, 7] = frameId - + # trackerBoxes = np.concatenate([trackerBoxes, tracks], axis=0) '''================== 1. 存储 dets/subimgs/features Dict =============''' imgs, features = ReIDEncoder.inference(im0, tracks) - - # imgs, features = inference_image(im0, tracks) - - # TrackerFeats = np.concatenate([TrackerFeats, features], axis=0) - - imgdict = {} - boxdict = {} featdict = {} for ii, bid in enumerate(tracks[:, 8]): - imgdict.update({int(bid): imgs[ii]}) # [f"img_{int(bid)}"] = imgs[i] - boxdict.update({int(bid): tracks[ii, :]}) # [f"box_{int(bid)}"] = tracks[i, :] - featdict.update({int(bid): features[ii, :]}) # [f"feat_{int(bid)}"] = features[i, :] - TracksDict[f"frame_{int(frameId)}"] = {"imgs":imgdict, "boxes":boxdict, "feats":featdict} - - track_boxes = np.concatenate([track_boxes, tracks], axis=0) + featdict.update({f"{int(frameId)}_{int(bid)}": features[ii, :]}) # [f"feat_{int(bid)}"] = features[i, :] + + frameDict = {"path": path, + "fid": int(frameId), + "bboxes": det, + "tboxes": tracks, + "imgs": imgs, + "feats": featdict} + yoloResnetTracker.append(frameDict) + + # imgs, features = inference_image(im0, tracks) + # TrackerFeats = np.concatenate([TrackerFeats, features], axis=0) '''================== 2. 提取手势位置 ===================''' for *xyxy, id, conf, cls, fid, bid in reversed(tracks): @@ -314,11 +313,8 @@ def yolo_resnet_tracker( # Print time (inference-only) LOGGER.info(f"{s}{'' if len(det) else '(no detections), '}{dt[1].dt * 1E3:.1f}ms") - ## track_boxes: Array, [x1, y1, x2, y2, track_id, score, cls, frame_index, box_id] - TracksDict.update({"TrackBoxes": track_boxes}) - - - return TracksDict + + return yoloResnetTracker diff --git a/tracking/dotrack/__pycache__/dotracks.cpython-39.pyc b/tracking/dotrack/__pycache__/dotracks.cpython-39.pyc index c349263b65eb5db5c0029614a7d36f53fa3d876c..212091fa379816d7aa21aa630af6aa1890f2723c 100644 GIT binary patch delta 3717 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 delta 3423 zcmZuzTWlOx8Q!zAJ3C(Q`c}Jf5?|vu&L(MGukEzCNu)_!n}#%vH@B0P?d;6No_Kd= z^UtikcAYv+OM%iB&}ktQQKjkw7*vI7)6nu%5S1vGfDpWl5Kp`ykWgNrZ}9(THg;%P zX}>w=znt@*|NNKpm!&^coAh)#8NuHN*}j>7o_n{6DQs1=C_7kZZNGAcu}&dkbLwW4 zfKCyMXSef)qN|&pulp8HJC#y?eVU}H?HD@vuu1%E;6AodK>R(e7qwRtFeHZ6Nw!&3 z)j>8O-c;Xcd6W=A6xfLFN)OAgdi;>j$a6gH~N|x>fN@-!1 z#}0v|2T8*Pr|jB}?{RhBo3$_afua{s=k?Thi*yR@36B#@iy*a`b=CfrdLcS-j3_+> zUm)m4_?t%1fRKrURHIE{3&9fv=ZK}i`m*Pw4^P$p*nFJrpv8^@tpN!FhOo+lm|nHL z%zdzpXtVXujm!M2=2_ax}0XxfMKIj*Dg0N^gTrK;i?fF3r zEW_ss!u-N4w3C*E4jP@VjkKMPUX;tkZO62#U=#gQdz~a&AHi9KKyFg9o%%qpaxI73 zPT-AY8s))*m~B=^U;(9hW8I{D2?fQS_V(TL|4X(Vo+25tH;>DPGdx5dC_2SxhpRq~ zDuyDOS~_bVc08)A$cv6I%vxXpM_!eiPFF}Fy>9$u)LrV=it*6{V_soRtXjf03lFoFK%>{#;Zhlh~S9$ zPZ!Ux#Rxo2L>*xwmuZ6`n(ZUlPjGrVGC)tHzgC4Hy(TBp2^93CR*9`rYXNOEuk|S483GQZV}UNE$4!0)d-@C z24rdLQGzjoaRlBJZsi>`N6ZjI@lnIe38O#GS#;6VO63tpshPR4-tp z86+{gjXCd#ZTO!qAY}F{EE4fZFcMXxJ*+31WGSUKv#mY4BI_rz!_v9be4=RSp4Df} zTE<*|e}ASSG)>06tn=R{S+W$KAy`HT6wmTyYS-P&8?ag!b9vkJ;5#UQr4PrjTgqaT ztlQWKvdUdU&RZg$*|(zND2D&T`1f`pEJrRzE=Ok~mzCw{k;qe>mt#I#jxDq2qnG2$ z%Jt}S{4K^JmztK9=?H8<1#}GU32_3dH+7@nO(ICvcWFc+j$uRLx^7QbXwMtSyG2e* z;UL0P7GoMqit9VxX_5z4<@r3=CeH8deu!FMMym&yEk*bB zVJVgAx|O74d!kbZ>AU?oG=r`zNa&u-lOS;cUlaal7G5DGnbl_^E98(eU>BAxJ<}?W z1m7o-9}s*EfhX_+EibR%9TbA7qvIdbmUh&`Pa!PJ51>Y%6l{~X)}3Pei`Zv;u&X>F z<@2R*P{{Y}G$h#$4#=0B3qxF53wu#$gJ>vA( z!~-9b{4Io4CL3{>Hu<`pGCRn`9;qrm9vd6{1!;UlAfE}prV+^nNv~3<`((4&GJYc` z;|b3e$t1$!67yVqGQLh4>lrQcn2wE7n~6o00=|V1s2AjA16`v`U$`y?_w=$YwWE8! z9PRx)ksAnpNI*Nuf)++?ulW1JkL@P6%UHnkrDpYcD{tXL%D2qW`n3b*!ULLnzj#XS zFYTkCg(AW42!;@X#)9oH*q()5*ALs|7UEI#2Mrc>L5m(GVIoklz#zdhV#B^8D?4bo zli&pcdDjWMv;a10+(1&MTe^TJAD_3NsF#mp&y(idCiwvbj$U4Sd`rK`X}vt36%ZFmCT ziM~}TV^J-YN3du5q$g+DKtUSEcjA;;4H8qB$Q9EH9sPT>y)}%J2HT??N7gP;+<)QB zOLXvNXrv=j!GknG7r`|Gs)n#iKxqi?5&Rq>NMY~AZd|hbS=WSL68$#>^0NL+&G67` zIDZ)f!`p-djcM&#hnCdR$qkyO^+j2-3ID2=1d_{iKofp~I9_6TF>EqJ;_89tIu0Ni Us5QX-1k_vMHC%s#7(O`sU)j873jhEB diff --git a/tracking/dotrack/__pycache__/dotracks_back.cpython-39.pyc b/tracking/dotrack/__pycache__/dotracks_back.cpython-39.pyc index c72f837c8589de247efebe9d10f67e146be659f7..c920469d02e604a94aeea59c0984818f2168bafb 100644 GIT binary patch delta 1516 zcmZ8h&2Jk;6yLXBUhn!Var_mWHYgRXQyP)4mQo<02}w~}Cy+`+D=K3=8+RSAZD!Y$ zM9zmuByxgAb14U;ggXM{BRz0I;)29^{{lD_&Pa$i>r{m7Xn*sYH@|uN=DnHyeX@H! zR*pt>0iOwJt!j)M#q#j@=<49ESeH$i0Fmm7qnauR$mM#-(M&DiNiB=zQQf3N-MS+BgejpIt>fe{l zG!a*Yg0VHB&mBGe1_&#``~4(I1`Y%>^0^=jW)$aB>?imeUSLnfCGeRh-HI3TtSIFn)7_BX10#pq@@3npj{EEvc}mIPc!Ytn0JGgY$~5SQ!m)88915if+g2Ie zV0|H1eHm4BjJ;@Nn4t}_A4Au*F*Fr`=GdAx&BnCXVTSz{PO&|01_B|>osMO;r-#`y z{UtUWPDK5%?Ur1x?Aeu`Ls&ScyF56_U5j)YJJUe$1T$bc#a|c#Lq`hfpj;X__q<)eC;K(rm2T)F}mN z^}}<$p+yQBrr-x-W#mo1DhTB@&Uie&R;ia=*IwV8z>zz_E=4AHRoF_A=4~v_eO@7V z?75}_D0==VNMwBH@OAGZ5Mdh#Y>OSCCd>;DMzhR+|r|mzFcXxHhqm) zR*N%K1_^(Q%R?w9w(I#yFB_smdOQEG60@j#gs(e*Ab^Zb$ELw09U`Izs<<`y|16x% zZ?_S-D8Vc2i}*0&ckx-c#{P__z+`IT-c`zzf&td;7QMx(T5h$h2Jt1&CWQ;VKwrfP zdXw!W4zKu1nOf!XUN_-OcC&px+#9HV+#Tzyh}t_y@mw#luaf!fG9QRRuKrNDM_!5| zEwW#eIb)3*Rye%N{z_&S?sGbi;A{NawW;OORc`x$+d^epb(_?qVQzW@!8B@3yU{yQ zZXwx=dxotHOeVQ2UkNU+4>n!IA$u}VgP*%nDhII4hSJwYvuG{IzFuk4MhiW8ZV-(x zxosyn@z0C4$h`EFGLG_R?A!E5YEa2VmdcF4KkQ~^$=JoIUP|`Zmzj&A1nm3F-E-zN z8_I^UbU2ka_>~NbUx=~g>}Y}iM(Ax0vmAIn>8Bj{SLtUQ_BkA|ud_qNJg32p<-b{e ziGy>ZK_sHZwYRmLHm!{!Q#6HgMIqydN+r^)luEwRXgjUVUfzdsj?Od4)slXw(x$Dl i_s~~cSnh^LN7znoCC`&2D;l0W^d7W+WU7>ai1aUu7-WwC delta 1167 zcmYjRO>Ep$5cXUDuDzS=Pn`8Gp(#mK;Uul{y9iQ5)HF>?)2d35P@gKTjO{F5*1P7} z8x&N;AxKmLfx=u6C%7Rl2=>mEON4p>sTLA9R6qzWJ#k^4HwxI&H}hsbe{bHK*&Q|? zuZ%gxqAuX`fjZs3_{`DR6nSto-*{K-N})_;B6!4;x=N^0HS^`J7UpT52!7tz56S1o z7ec4tk-9*O7%3hSw8hRC9rqMZ?UuqaEr%6a!EY5$>sG@FIzfbO!OMI4dxEF?WJJ7-#A~pgFBNG%h+A>uB!PP(vW2

by{9axgfIb0{I)L&6LksMWf}r2FJ3_oj45 zV3{h(R8NFjd^dx~*%F7WzA=}(WrSO{!Ax+Bwq$E~nqQ6EvoG*mwpo*Ve8*ICyG|Sj zdk0)2UWB`a75J!N4Zkj)5y=Jkp>!7UuhIsYgT=B*Qn*^aIiHGQ&`Tw^8$|3muA(?m z0Iwklsl`p@ut?KLI4qYms^v*Zuhw{92= zQ=?mn;nJ>efr8K-Nz2p`tx&hZ}ryTpOtG3#>R zWv~H_GGHIT3+96wNkk^ x2&02hC#K=$MyE# zRVp^Y^|$ePCp&-OHbyxjMts76DGB&cYQ(S0)j!LWCh@G@MSF!G96f+l zF$2q0Ho=^S#HWvlMtlni74Zf912f{T^2qfoZQkldt8tjG$C-Gl%)-=(sWt!_;$`gv z1Z~X%`!O7vN8~XCRHV89PpC$2yn+>SPwW}fuqeQ)iyw`*@JQloh;NG9X5$oJM||tt zYZ%}u{3@zqBF=&~kD^}sAUaL*9+F-Vlk_`SL+hgWh0ayV5GX@VS+``W3F+ro{`-N= zGU9t{aeSe3S01@2Hatr_vDVHNl`!qMW8MpL-U_!0Yh?^0CKhZ~zb5$(ih_noE6d{c z&P#~01#xU&8iAu2u=^rQKjdjY-;@cmE6;c#Ao1DK(a>oHt?H67u= zD%4)wFB~kW%cC&Qf^Y5@T9^)Y3d*8rAT4B0Ba^=?=_b-yoaKc+?t#){oXXQu$m;n! zDDL6Trce;j@Uy|QfueF03Wl^aq6=^#=J)p|_K?mHVRW&Vet!b(bsrhNNg=5)b&Y_|=^;me9f9 z5P!Od`XZWJCkK;v6e=6-0pAdRoNdh9kzjn$Q$x}}MzO&^5p&i0=u7EnO0kKeFv}~K z77HutZ}%eJ$|GKm&YC=>?WmP+^C;t=$%vqgXz@;#@|>5cuS?fNH;wz_vC6#KxZmaT zIGC{$vGKeVR+=#Jb9J^RFTi3kcUC~mZzB}HSG(|o__WppTO8M}j#klGJ_eU%@&g%C z34(Iw!YE0C;JKHpOG^2CCR#PznM4#EN=^DEb?NI|o_N*53<8#h7(I)amsRRm`CzAP lN?{IK`TZpRN_;f61oL7vwLT*ULDMNt0OnJwC=JCy>t9idF$w?x delta 840 zcmYLHOHUI~6rMBhPN$thskKl9SuqU(HKG6oYC zs0q1oYjCeIrd$63ap&r;G;zbif1uHG$0klP-}%ntJLlZF^Kt6Copw_xL%`>gHdgyw zI8GPC5Is+D1P?qh1P5X(IucqblpBhpfZ!{>dH^TdJE5+7P!OC1MiK{rHc>a6q$hhy zXf{$#3Iyb8m~L2(1;U2lX`cQ<@N_?QAUT=ix6k1!9fu|3P>=;j-xcg64d6HAX-zy# zGUEYpD^H@ephAC%qmbK;P^0W#pS9WE!h&k<6lD$sj6MiSIXBPyK#}>sXbeQ~D9CBb%U2HA{c$W-69J zEbCWp@_uIAkIejEVK8ezxQsAz1^is2P5^Pq{q^h)SPQBdtppcj?s zH=`tprbMk|p*LrW5=_xWYaDUUx{o&u%k41w!5RZbzgSBtCN+X4 zlPh7+Cd+gnb6#EGqZa8*=0urC`l$Ccb6?cgklH}j>2$XE><)KC0%*=u1hRp!LvHi1 z#ReX`kza23q~@19@wJeLyl9KVHUiV)HRk77!f) mindist: + mindist = copy.deepcopy(md) + Confirmed = copy.deepcopy(track) + + if Confirmed is not None: + return [Confirmed] + + return [] + # def merge_based_hands(self, htrack): # gtracks = htrack.Goods @@ -122,6 +139,8 @@ class doBackTracks(doTracks): # btrack, bfious = gtracks[1] + + def associate_with_hand(self, htrack, gtrack): ''' 迁移至基类: diff --git a/tracking/dotrack/dotracks_front.py b/tracking/dotrack/dotracks_front.py index a61e39a..48f54f8 100644 --- a/tracking/dotrack/dotracks_front.py +++ b/tracking/dotrack/dotracks_front.py @@ -5,6 +5,7 @@ Created on Mon Mar 4 18:38:20 2024 @author: ym """ import cv2 +import copy import numpy as np from pathlib import Path @@ -16,8 +17,8 @@ from .dotracks import doTracks from .track_front import frontTrack class doFrontTracks(doTracks): - def __init__(self, bboxes, TracksDict): - super().__init__(bboxes, TracksDict) + def __init__(self, bboxes, frameDictList): + super().__init__(bboxes, frameDictList) # self.tracks = [frontTrack(b) for b in self.lboxes] self.tracks = [frontTrack(b, f) for b, f in zip(self.lboxes, self.lfeats)] @@ -84,11 +85,24 @@ class doFrontTracks(doTracks): tracks = self.sub_tracks(tracks, static_tracks) freemoved_tracks = [t for t in tracks if t.is_free_move()] - tracks = self.sub_tracks(tracks, freemoved_tracks) - - + self.Residual = tracks + self.Confirmed = self.confirm_track() + + def confirm_track(self): + Confirmed = None + mindist = 0 + for track in self.Residual: + md = min(track.trajrects_wh) + if md > mindist: + mindist = copy.deepcopy(md) + Confirmed = copy.deepcopy(track) + + if Confirmed is not None: + return [Confirmed] + + return [] def associate_with_hand(self, htrack, gtrack): ''' diff --git a/tracking/utils/__pycache__/read_data.cpython-39.pyc b/tracking/utils/__pycache__/read_data.cpython-39.pyc index f761704a062314a504e5128db570d0bcb6841d19..3bc17c616271afbe93469b93c820499e8cd35560 100644 GIT binary patch delta 2743 zcma)7Z){sv6@T~nJ^RIp9Xoa0IDcQ7c8RmZO@p6MP&TAYy zx$mWI!ZS&6s;yerMqC(Lw^b>OiEgy4b3dff2w%o0#EOtW@TfKb%{s-~k~NTSjpR?3#yc z6X8KY^GSjv6kJ5e*7OSV(v0~|k3jhMdBF7)A8nGNX*z3#?FO#R3rEF#U0#O7pciP> zm#+qKs#%?iNg72J7kBsK+Px+=pL}$P)Go%%>ajqzuHY}eBEWfFm`89$nKT| zYwNr`HBE$k3lXMOt4?dN1xTgZEs#noKy8D<^H5d3<=ZV;Z~3=J=n-sUi*VQ>yTNWs zxt|lFt&>o*;8o$%v$Hp0(d6)GOiMD4H#D>Ivs;mf2NauhRs&@q}g!Tk6X7%XcrlcW=2+T3lLv z^;T*57v~EEilL%|9N_9wPj#`d; zGHXms>W({UT2tdX-GoCa8CQ5w2Q-s;ef`ILoYR^hX55{kV+Z<8#|1(D}Aw%)* z*P#-vDu6$**)6Z_Ll#a2)stGr$m%BDf?-aGQ$rSIJ~6bAWYk|Kg`GeT;^G<1aY zv+JP)I8A2Dp@CIGRPsv42Hk!GD8kVts;K14r){+3xy5a;o^<`g+p# zzZKZeZZ}Mmo$Q&$juT&nD~I|pwF^N4h`OnWHt&{43gbn1=>WtX@1Sm^M=X5lA1w%9 z1>OaYXH=g$m7^Lkzti|w>t5K-#Hc{r(5k>4QS?I%A+bxOcCoGLRq_9*;hXGE%g_uS zV%%dIV@4)PDL*wl7&?JqAy9y*chg#U%WWJImPYX!;>{Ng@RN!w&q4A{N{m@ z+S`C9dRRkW&PfOWPGliA{h)=x|^K1ZRTyyM9$)z7uWY+ ze=~o>F1G)fOtJBfNbuv&T4I2LCD1eMQb%(w?_s=B`87eymkRrJM<3b6ywN8rr!n*$ zgaX?i-9d6}EE;cm2?uZ&CpezTSqW3m!d;yho}?%B8>|#PK;C7s&VAeFaNfHBQOT*m zyC%Uep#M(#{Z6&|0k#kJr~r*auN6P+>?6^`;5wcR{O@Q6rAN?{PUMU%{Ti4whVU%H zH5Tn^>H8^~4~y?eV@V_Xcg$S}Q338#3Gz$Omi5q__$bh-^nEth^%v5|M!Fvl%J7Pq z?zPzvyUE__R=uc-BT}6nW*>Dw`Q;ygOM?iQx6EP?t#O1?2sXkj!ny?X8oKWz+++u1 pJw4bFQUy{_NEJRV#j7aFjNnsRl`dtU5>%d4wkcm!WU$7%Q6vt=QyY|}gN1VoKY{yMflBQ16HYp#1CWMBzpnd`UkfNHlTi3fumN;v7 zc9S+?-4q2-5fX|R2~icKRIPwi0u{`Gj|&IH$AJSUU=L6Ufy4nJxD+Z5yf+S}lpcuX zpWnQB^WNM4%xwNRwtO_2k3>QQ{;nV2H~!?#x1;@XGy_BQZHKSDRNX5N_~zZ9+pH&t zh#P|6)DUrEj^Fhy&;`1K9DTZya2j2oo6zH9Qj#ptl~MX%qqf?}MKS+S z1@fxoHqX#SAG@rtF^Neb|B4@~{cR6GT76BDEXCbcSB63nJ@Sl%2~B#DQnKhfxqF<9 zV``<6)Y~g5zF+O052FQhzqzSJnQe8$ON!ock?QKC0^{{KYc)9yZg_!KVy?0jaATP5 zUvWP6o8DPT!Q(0m6jn{R$)$ipmQ+`{C~A*GO{_6W^oUGkvf!h{Y8oJm^1S_QKcV7t z7+6nn<<=A?sify#bDG?w(DUUZQYBGQTm`f}SBZg|F+IMbYfMkqtv0l7(sQlbBJ@my zo(gNy=WBwd^_2+_v~Jh+ge}nTa9d%auP*nB+HPxIU-{(6i}K0$Mv1jmCeErwW%dP1 zDs7a^bvVs>mrEc^x7!9;%x+`sG+N_Ws!QXz;Ph9Fsa88=tq?;b|A0*jz z)7^w$3-(lh2$iYfg&cFru$}x=+4j^imY*_q>Gn?nIEO!}fSh0WG*1~b@{avbF6gj) zVbZk5wL>|-ur-frbNw&r1t#N zWj*g0Y!wcIJ5LvkvSXGkPbo9gaw@)14LVNMJ(yGJwb-sgX8H%~D9>m!f;(l1x>q zg6}TcNSkP%kJDJsYVb-hR_S`--2v>C*zW2`>|;vb)2n6NpLvd1_PqM=)({k0?#ByHS~|=}~G| zkEc`g*5{=I{MEKOx`nr9*3*0WNGA0tip`EA{^?kB7h;cs*9(mr=JFTeUm!$u+u#;cuI5Cfk=K{7lWft>{35iifHial7 zEI>B&e-y=b8Qy9@<8`SI?M0w zzK@=*mb$;CG|M09d5*r%zwRj}pTd|0gxLNDw8DT7_|f&(=rkYBCgYz`a7Ms+h=D~| zg->MHB*gK;mzB7rtahdOh3pXQ_t)7i4Kp}(1~JbQz1?(@5BBCVPoo2?c=2+vz2$=F^T$xoC_i|qrGiEFbPtz~|_uRZk!nzz)D zr}C!tE$`phN#EiJHhxbB`8}I94E}=E{18tlz7*M2usl`MFj~{HNiU#jda0nne+z4R zsyr+7@+4-kJ^YnTgAZ~n6-TrpL=y+lDk5yeX@rY7i$HPMGU6@7Ri513zo{2YIS4Oh f_=NH6Q$uP{wbf3wPkmU8tApxVby!uv@~hHchxJ5L diff --git a/tracking/utils/read_data.py b/tracking/utils/read_data.py index 32032d2..36b05a6 100644 --- a/tracking/utils/read_data.py +++ b/tracking/utils/read_data.py @@ -34,10 +34,12 @@ def find_samebox_in_array(arr, target): return -1 - def extract_data(datapath): ''' 0/1_track.data 数据读取 + 对于特征,需要构造两个对象: + (1) tracking输出 boxes,依据 (fid, bid) 找到对应的 feats, tracker_feat_dict 实现较为方便 + (2) frameDictList 中元素为 frameDict,输出同一接口 ''' bboxes, ffeats = [], [] @@ -45,9 +47,7 @@ def extract_data(datapath): trackerfeats = np.empty((0, 256), dtype=np.float64) boxes, feats, tboxes, tfeats = [], [], [], [] - timestamps, frameIds = [], [] - with open(datapath, 'r', encoding='utf-8') as lines: for line in lines: line = line.strip() # 去除行尾的换行符和可能的空白字符 @@ -102,16 +102,17 @@ def extract_data(datapath): assert(len(bboxes)==len(ffeats)), "Error at Yolo output!" assert(len(trackerboxes)==len(trackerfeats)), "Error at tracker output!" - tracker_feat_dict = {} - tracker_feat_dict["timestamps"] = timestamps - tracker_feat_dict["frameIds"] = frameIds - - for i in range(len(trackerboxes)): - tid, fid, bid = int(trackerboxes[i, 4]), int(trackerboxes[i, 7]), int(trackerboxes[i, 8]) - if f"frame_{fid}" not in tracker_feat_dict: - tracker_feat_dict[f"frame_{fid}"]= {"feats": {}} - tracker_feat_dict[f"frame_{fid}"]["feats"].update({bid: trackerfeats[i, :]}) - + ## 生成帧为单位的特征列表 + tracker_feats = {} + frmIDs = np.sort(np.unique(trackerboxes[:, 7].astype(int))) + for fid in frmIDs: + idx = np.where(trackerboxes[:, 7] == fid)[0] + boxes = trackerboxes[idx, :] + feats = trackerfeats[idx, :] + + for i in range(len(boxes)): + f, b = int(boxes[i, 7]), int(boxes[i, 8]) + tracker_feats.update({f"{f}_{b}": feats[i, :]}) boxes, trackingboxes= [], [] tracking_flag = False @@ -137,18 +138,41 @@ def extract_data(datapath): if len(boxes): trackingboxes.append(np.array(boxes)) - tracking_feat_dict = {} + # tracking_feat_dict = {} + # try: + # for i, boxes in enumerate(trackingboxes): + # for box in boxes: + # tid, fid, bid = int(box[4]), int(box[7]), int(box[8]) + # if f"track_{tid}" not in tracking_feat_dict: + # tracking_feat_dict[f"track_{tid}"]= {"feats": {}} + # tracking_feat_dict[f"track_{tid}"]["feats"].update({f"{fid}_{bid}": tracker_feat_dict[f"frame_{fid}"]["feats"][bid]}) + # except Exception as e: + # print(f'Path: {datapath}, tracking_feat_dict can not be structured correcttly, Error: {e}') + + # tracker_feat_dict = {} + # tracker_feat_dict["timestamps"] = timestamps + # tracker_feat_dict["frameIds"] = frameIds + + # for i in range(len(trackerboxes)): + # fid, bid = int(trackerboxes[i, 7]), int(trackerboxes[i, 8]) + # if f"frame_{fid}" not in tracker_feat_dict: + # tracker_feat_dict[f"frame_{fid}"]= {"feats": {}} + # tracker_feat_dict[f"frame_{fid}"]["feats"].update({bid: trackerfeats[i, :]}) + + trackingfeats = [] try: for i, boxes in enumerate(trackingboxes): + feats = [] for box in boxes: - tid, fid, bid = int(box[4]), int(box[7]), int(box[8]) - if f"track_{tid}" not in tracking_feat_dict: - tracking_feat_dict[f"track_{tid}"]= {"feats": {}} - tracking_feat_dict[f"track_{tid}"]["feats"].update({f"{fid}_{bid}": tracker_feat_dict[f"frame_{fid}"]["feats"][bid]}) + fid, bid = int(box[7]), int(box[8]) + feat = tracker_feats[f"{fid}_{bid}"] + feats.append(feat) + trackingfeats.append(np.array(feats)) except Exception as e: - print(f'Path: {datapath}, tracking_feat_dict can not be structured correcttly, Error: {e}') + print(f'Path: {datapath}, trackingfeats can not be structured correcttly, Error: {e}') - return bboxes, ffeats, trackerboxes, tracker_feat_dict, trackingboxes, tracking_feat_dict + # return bboxes, ffeats, trackerboxes, tracker_feat_dict, trackingboxes, trackingfeats + return bboxes, ffeats, trackerboxes, tracker_feats, trackingboxes, trackingfeats def read_tracking_output(filepath): ''' @@ -236,8 +260,6 @@ def read_returnGoods_file(filePath): lines = f.readlines() clean_lines = [line.strip().replace("'", '').replace('"', '') for line in lines] - - all_list = [] split_flag, dict = False, {} barcode_list, similarity_list = [], [] @@ -318,14 +340,15 @@ def read_seneor(filepath): def read_similar(filePath): SimiDict = {} SimiDict['one2one'] = [] + SimiDict['one2SN'] = [] SimiDict['one2n'] = [] with open(filePath, 'r', encoding='utf-8') as f: lines = f.readlines() clean_lines = [line.strip().replace("'", '').replace('"', '') for line in lines] - one2one_list, one2n_list = [], [] + one2one_list, one2SN_list, one2n_list = [], [], [] - Flag_1to1, Flag_1ton = False, False + Flag_1to1, Flag_1toSN, Flag_1ton = False, False, False for i, line in enumerate(clean_lines): line = line.strip() if line.endswith(','): @@ -334,18 +357,26 @@ def read_similar(filePath): if not line: if len(one2one_list): SimiDict['one2one'] = one2one_list + if len(one2SN_list): SimiDict['one2SN'] = one2SN_list if len(one2n_list): SimiDict['one2n'] = one2n_list - one2one_list, one2n_list = [], [] - Flag_1to1, Flag_1ton = False, False + + + one2one_list, one2SN_list, one2n_list = [], [], [] + Flag_1to1, Flag_1toSN, Flag_1ton = False, False, False continue if line.find('oneToOne')>=0: - Flag_1to1, Flag_1ton = True, False + Flag_1to1, Flag_1toSN, Flag_1ton = True, False,False + continue + if line.find('oneToSN')>=0: + Flag_1to1, Flag_1toSN, Flag_1ton = False, True, False continue if line.find('oneTon')>=0: - Flag_1to1, Flag_1ton = False, True + Flag_1to1, Flag_1toSN, Flag_1ton = False, False, True continue + + if Flag_1to1: barcode = line.split(',')[0].strip() value = line.split(',')[1].split(':')[1].strip() @@ -353,6 +384,14 @@ def read_similar(filePath): Dict['similar'] = float(value) one2one_list.append(Dict) continue + + if Flag_1toSN: + barcode = line.split(',')[0].strip() + value = line.split(',')[1].split(':')[1].strip() + Dict['barcode'] = barcode + Dict['similar'] = float(value) + one2SN_list.append(Dict) + continue if Flag_1ton: label = line.split(':')[0].strip()