diff --git a/__pycache__/track_reid.cpython-39.pyc b/__pycache__/track_reid.cpython-39.pyc index d4143c9..b351d96 100644 Binary files a/__pycache__/track_reid.cpython-39.pyc and b/__pycache__/track_reid.cpython-39.pyc differ diff --git a/contrast/__pycache__/genfeats.cpython-39.pyc b/contrast/__pycache__/genfeats.cpython-39.pyc index fefdfa9..a63d7a8 100644 Binary files a/contrast/__pycache__/genfeats.cpython-39.pyc and b/contrast/__pycache__/genfeats.cpython-39.pyc differ diff --git a/contrast/event_test.py b/contrast/event_test.py index 449349a..c4eb5a0 100644 --- a/contrast/event_test.py +++ b/contrast/event_test.py @@ -171,16 +171,6 @@ def calc_simil(event, stdfeat): return Similar - - - - - - - - - - @@ -345,20 +335,6 @@ def main(): simi_matrix() - - - - - - - - - - - - - - if __name__ == "__main__": diff --git a/contrast/genfeats.py b/contrast/genfeats.py index 2bb391b..ad3d0fd 100644 --- a/contrast/genfeats.py +++ b/contrast/genfeats.py @@ -136,8 +136,8 @@ def stdfeat_infer(imgPath, featPath, bcdSet=None): continue featpath = os.path.join(featPath, f"{bcd}.pickle") - # if os.path.isfile(featpath): - # continue + if os.path.isfile(featpath): + continue stdbDict = {} t1 = time.time() diff --git a/contrast/one2n_contrast.py b/contrast/one2n_contrast.py index e04571c..83458ba 100644 --- a/contrast/one2n_contrast.py +++ b/contrast/one2n_contrast.py @@ -24,10 +24,15 @@ def init_eventdict(sourcePath, stype="data"): # bname = r"20241126-135911-bdf91cf9-3e9a-426d-94e8-ddf92238e175_6923555210479" source_path = os.path.join(sourcePath, bname) - if not os.path.isdir(source_path): continue - - pickpath = os.path.join(eventDataPath, f"{bname}.pickle") - if os.path.isfile(pickpath): continue + if stype=="data": + pickpath = os.path.join(eventDataPath, f"{bname}.pickle") + if not os.path.isdir(source_path) or os.path.isfile(pickpath): + continue + if stype=="source": + pickpath = os.path.join(eventDataPath, bname) + if not os.path.isfile(source_path) or os.path.isfile(pickpath): + continue + try: event = ShoppingEvent(source_path, stype) @@ -86,20 +91,28 @@ def simi_calc(event, o2nevt, typee=None): feat1 = event.back_feats feat2 = o2nevt.front_feats + '''自定义事件特征选择''' + if typee==3: + feat1 = event.feats_compose + feat2 = o2nevt.feats_compose + + if len(feat1) and len(feat2): matrix = 1 - cdist(feat1[0], feat2[0], 'cosine') simi = np.mean(matrix) else: simi = None - - - return simi - - -def one2n_pr(evtDicts): +def one2n_pr(evtDicts, pattern=1): + ''' + pattern: + 1: process.data 中记录的相似度 + 2: 根据 process.data 中标记的 type 选择特征计算 + 3: 以其它方式选择特征计算 + ''' + tpevents, fnevents, fpevents, tnevents = [], [], [], [] tpsimi, fnsimi, tnsimi, fpsimi = [], [], [], [] errorFile_one2n = [] @@ -111,22 +124,30 @@ def one2n_pr(evtDicts): barcode = ndict["barcode"] similar = ndict["similar"] typee = ndict["type"].strip() - - o2n_evt = [evt for name, evt in evtDicts.items() if name.find(nname[:15])==0] - if len(o2n_evt)==1: - o2nevt = o2n_evt[0] - else: - continue - - simival = simi_calc(event, o2nevt, typee) - if simival==None: - continue - + evt_names.append(nname) evt_barcodes.append(barcode) - evt_similars.append(simival) evt_types.append(typee) - + + if pattern==1: + evt_similars.append(similar) + + if pattern==2 or pattern==3: + o2n_evt = [evt for name, evt in evtDicts.items() if name.find(nname[:15])==0] + if len(o2n_evt)==1: + o2nevt = o2n_evt[0] + else: + continue + + if pattern==2: + simival = simi_calc(event, o2nevt, typee) + + if pattern==3: + simival = simi_calc(event, o2nevt, typee=pattern) + + if simival==None: + continue + evt_similars.append(simival) if len(evt_names)==len(evt_barcodes) and len(evt_barcodes)==len(evt_similars) \ and len(evt_similars)==len(evt_types) and len(evt_names)>0: @@ -205,30 +226,25 @@ def one2n_pr(evtDicts): def main(): '''1. 生成事件字典并保存至 eventDataPath, 只需运行一次 ''' - # init_eventdict(eventSourcePath) + init_eventdict(eventSourcePath, stype="source") '''2. 读取事件字典 ''' evtDicts = read_eventdict(eventDataPath) '''3. 1:n 比对事件评估 ''' - fpevents = one2n_pr(evtDicts) + fpevents = one2n_pr(evtDicts, pattern=3) fpErrFile = str(Path(resultPath).joinpath("one2n_fp_Error.txt")) with open(fpErrFile, "w") as file: for item in fpevents: file.write(item + "\n") - - - - - - + if __name__ == '__main__': - eventSourcePath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images" - resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result" + eventSourcePath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\ShoppingDict_pkfile" + resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\contrast" eventDataPath = os.path.join(resultPath, "evtobjs") similPath = os.path.join(resultPath, "simidata") diff --git a/contrast/one2one_contrast.py b/contrast/one2one_contrast.py index ce9fea5..8ccc34e 100644 --- a/contrast/one2one_contrast.py +++ b/contrast/one2one_contrast.py @@ -194,6 +194,7 @@ def simi_calc(event, stdfeat): if len(evtfeat)==0 or len(stdfeat)==0: return None, None, None + evtfeat /= np.linalg.norm(evtfeat, axis=1)[:, None] stdfeat /= np.linalg.norm(stdfeat, axis=1)[:, None] @@ -305,8 +306,8 @@ def one2SN_pr(evtList, evtDict, stdDict): barcodes, similars = [], [] for stdbcd in bcd_selected: stdfeat = stdDict[stdbcd] - # simi_mean, simi_max, simi_mfeat = simi_calc(event, stdfeat) - simi_mean = calc_simil(event, stdfeat) + simi_mean, simi_max, simi_mfeat = simi_calc(event, stdfeat) + # simi_mean = calc_simil(event, stdfeat) ## 在event.front_feats和event.back_feats同时为空时,此处不需要保护 # if simi_mean==None: @@ -629,10 +630,8 @@ if __name__ == '__main__': stdBarcodePath = r"D:\全实时\source_data\bcdpath" stdFeaturePath = r"D:\全实时\source_data\stdfeats" - eventSourcePath = [r"D:\全实时\result\pipeline\pipeline"] - resultPath = r"D:\全实时\result\pipeline" - - + eventSourcePath = [r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\ShoppingDict_pkfile"] + resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result\contrast" eventDataPath = os.path.join(resultPath, "evtobjs") similPath = os.path.join(resultPath, "simidata") if not os.path.exists(eventDataPath): @@ -640,7 +639,7 @@ if __name__ == '__main__': if not os.path.exists(similPath): os.makedirs(similPath) - test_one2one() + # test_one2one() test_one2SN() diff --git a/contrast/utils/__pycache__/event.cpython-39.pyc b/contrast/utils/__pycache__/event.cpython-39.pyc index 8d46fdf..ab0537d 100644 Binary files a/contrast/utils/__pycache__/event.cpython-39.pyc and b/contrast/utils/__pycache__/event.cpython-39.pyc differ diff --git a/contrast/utils/event.py b/contrast/utils/event.py index beda525..df25689 100644 --- a/contrast/utils/event.py +++ b/contrast/utils/event.py @@ -76,7 +76,7 @@ def array2list(bboxes): class ShoppingEvent: def __init__(self, eventpath, stype="data"): - '''stype: str, 'source', 'data', ''' + '''stype: str, 'source', 'data', 'realtime', 共三种 ''' self.eventpath = eventpath self.evtname = str(Path(eventpath).stem) @@ -167,20 +167,22 @@ class ShoppingEvent: def from_source_pkl(self, eventpath): - with open(eventpath, 'rb') as f: ShoppingDict = pickle.load(f) - - + self.eventpath = ShoppingDict["eventPath"] self.evtname = ShoppingDict["eventName"] self.barcode = ShoppingDict["barcode"] - + + if len(ShoppingDict["one2n"]): + self.one2n = ShoppingDict["one2n"] + '''=========== 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") diff --git a/events/evt_rename.py b/events/evt_rename.py new file mode 100644 index 0000000..d350773 --- /dev/null +++ b/events/evt_rename.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Jan 9 14:34:41 2025 + +@author: ym +""" +import os +def read_deletedBarcode_file(filePath): + with open(filePath, 'r', encoding='utf-8') as f: + lines = f.readlines() + + split_flag, all_list = False, [] + dict, barcode_list, similarity_list = {}, [], [] + clean_lines = [line.strip().replace("'", '').replace('"', '') for line in lines] + + for i, line in enumerate(clean_lines): + if line.endswith(','): + line = line[:-1] + + stripped_line = line.strip() + if not stripped_line: + if len(barcode_list): dict['barcode'] = barcode_list + if len(similarity_list): dict['similarity'] = similarity_list + if len(dict): all_list.append(dict) + + split_flag = False + dict, barcode_list, similarity_list = {}, [], [] + continue + + if line.find(':')<0: continue + label = line.split(':')[0] + value = line.split(':')[1] + + if label == 'SeqDir': + dict['SeqDir'] = value + dict['filetype'] = "deletedBarcode" + if label == 'Deleted': + dict['Deleted'] = value + if label == 'List': + split_flag = True + continue + if split_flag: + barcode_list.append(label) + similarity_list.append(value) + + if len(barcode_list): dict['barcode'] = barcode_list + if len(similarity_list): dict['similarity'] = similarity_list + if len(dict): all_list.append(dict) + return all_list + + +def event_rename(path): + for filename in os.listdir(path): + fpath = os.path.join(path, filename) + if os.path.isfile(fpath): continue + flist = filename.split("_") + + if len(flist)==3 and flist[-1].isdigit() and len(flist[-1])>=8: + print(f"{path}: renamed!") + return + + dpath = os.path.join(path, "deletedBarcode.txt") + alist = read_deletedBarcode_file(dpath) + + input_events, getout_events = [], [] + for filename in os.listdir(path): + fpath = os.path.join(path, filename) + if os.path.isfile(fpath): continue + flist = filename.split("_") + + bcd = flist[-1] + if len(flist)==2 and flist[0].find("2024")==0 and len(bcd)==0: + bcds = [dt['Deleted'] for dt in alist if dt['SeqDir'].strip()==filename] + if len(bcds)==1: + getout_events.append((filename, filename + bcds[0].strip())) + + if len(flist)==2 and flist[0].find("2024")==0 and len(bcd)>=10: + input_events.append((filename, filename + '_' + bcd)) + + events = (input_events, getout_events) + for evts in events: + for name_old, name_new in evts: + path_old = os.path.join(path, name_old) + path_new = os.path.join(path, name_new) + try: + os.rename(path_old, path_new) + except Exception as e: + print(f"发生错误:{e}") + + + + +def main(): + + path = r"\\192.168.1.28\share\测试视频数据以及日志\测试_202406\0910\images" + event_rename(path) + + + +if __name__ == "__main__": + main() + + + + + + + + + + \ No newline at end of file diff --git a/pipeline.py b/pipeline.py index 4cbafa3..d24f78d 100644 --- a/pipeline.py +++ b/pipeline.py @@ -5,67 +5,48 @@ Created on Sun Sep 29 08:59:21 2024 @author: ym """ import os -import sys +# import sys import cv2 import pickle -import argparse import numpy as np from pathlib import Path -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 from tracking.utils.drawtracks import plot_frameID_y2, draw_all_trajectories from utils.getsource import get_image_pairs, get_video_pairs +from tracking.utils.read_data import read_similar -def get_interbcd_inputenents(): - bcdpath = r"\\192.168.1.28\share\测试_202406\contrast\std_barcodes_2192" - eventpath = r"\\192.168.1.28\share\测试_202406\0918" - barcodes = [] - eventpaths = [] - for featname in os.listdir(bcdpath): - barcode, ext = os.path.splitext(featname) - barcodes.append(barcode) - - input_enents = [] - for root, dirs, files in os.walk(eventpath): - input_enent = [os.path.join(root, d) for d in dirs if d.split('_')[-1] in barcodes] +def save_subimgs(imgdict, boxes, spath, ctype): + 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) - input_enents.extend(input_enent) - - - return input_enents def pipeline( eventpath, - savepath = '', - SourceType = "image", # video - stdfeat_path = None + savepath, + SourceType, + weights ): - if SourceType == "video": - vpaths = get_video_pairs(eventpath) - elif SourceType == "image": - vpaths = get_image_pairs(eventpath) ''' eventpath: 单个事件的存储路径 ''' - '''======== 函数 yolo_resnet_tracker() 的参数字典 ========''' - opt = parse_opt() - optdict = vars(opt) + if SourceType == "video": + vpaths = get_video_pairs(eventpath) + elif SourceType == "image": + vpaths = get_image_pairs(eventpath) - - optdict["weights"] = r'D:\DetectTracking\ckpts\best_cls10_0906.pt' - optdict["is_save_img"] = True - optdict["is_save_video"] = True + optdict = {} + optdict["weights"] = weights + event_tracks = [] @@ -76,21 +57,35 @@ def pipeline( and evtname.split('_')[-1].isdigit() else '' '''事件结果存储文件夹''' if not savepath: - savepath = Path(__file__).resolve().parents[0] / "evtresult" + savepath = Path(__file__).resolve().parents[0] / "events_result" - save_dir_event = Path(savepath) / evtname - - pickpath = Path(savepath)/"pickfile" - if not pickpath.exists(): - pickpath.mkdir(parents=True, exist_ok=True) + savepath_pipeline = Path(savepath) / Path("Yolos_Tracking") / evtname + + """ShoppingDict pickle 文件保存地址 """ + savepath_spdict = Path(savepath) / "ShoppingDict_pkfile" + if not savepath_spdict.exists(): + savepath_spdict.mkdir(parents=True, exist_ok=True) + pf_path = Path(savepath_spdict) / Path(str(evtname)+".pickle") + + # if pf_path.exists(): + # return ShoppingDict = {"eventPath": eventpath, "eventName": evtname, "barcode": barcode, "eventType": '', # "input", "output", "other" "frontCamera": {}, - "backCamera": {}} + "backCamera": {}, + "one2n": [] + } + + + procpath = Path(eventpath).joinpath('process.data') + if procpath.is_file(): + SimiDict = read_similar(procpath) + ShoppingDict["one2n"] = SimiDict['one2n'] + for vpath in vpaths: '''相机事件字典构造''' @@ -115,16 +110,20 @@ def pipeline( '''事件结果存储文件夹''' if isinstance(vpath, list): - save_dir_video = save_dir_event / Path("images") + savepath_pipeline_imgs = savepath_pipeline / 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) + savepath_pipeline_imgs = savepath_pipeline / Path(str(Path(vpath).stem)) + if not savepath_pipeline_imgs.exists(): + savepath_pipeline_imgs.mkdir(parents=True, exist_ok=True) + + savepath_pipeline_subimgs = savepath_pipeline / Path("subimgs") + if not savepath_pipeline_subimgs.exists(): + savepath_pipeline_subimgs.mkdir(parents=True, exist_ok=True) '''Yolo + Resnet + Tracker''' optdict["source"] = vpath - optdict["save_dir"] = save_dir_video + optdict["save_dir"] = savepath_pipeline_imgs yrtOut = yolo_resnet_tracker(**optdict) @@ -164,13 +163,30 @@ def pipeline( CameraEvent["tracking"] = vts ShoppingDict["frontCamera"] = CameraEvent - # pklpath = save_dir_event / "ShoppingDict.pkl" - # with open(str(pklpath), 'wb') as f: - # pickle.dump(ShoppingDict, f) - pf_path = Path(pickpath) / Path(str(evtname)+".pkl") + with open(str(pf_path), 'wb') as f: pickle.dump(ShoppingDict, f) + + for CamerType, vts in event_tracks: + if len(vts.tracks)==0: continue + if CamerType == 'front': + yolos = ShoppingDict["frontCamera"]["yoloResnetTracker"] + ctype = 1 + if CamerType == 'back': + yolos = ShoppingDict["backCamera"]["yoloResnetTracker"] + ctype = 0 + + imgdict = {} + for y in yolos: + imgdict.update(y["imgs"]) + + for track in vts.Residual: + if isinstance(track, np.ndarray): + save_subimgs(imgdict, track, savepath_pipeline_subimgs, ctype) + else: + save_subimgs(imgdict, track.boxes, savepath_pipeline_subimgs, ctype) + '''轨迹显示模块''' illus = [None, None] @@ -181,24 +197,23 @@ def pipeline( edgeline = cv2.imread("./tracking/shopcart/cart_tempt/board_ftmp_line.png") h, w = edgeline.shape[:2] - nh, nw = h//2, w//2 - edgeline = cv2.resize(edgeline, (nw, nh), interpolation=cv2.INTER_AREA) + # nh, nw = h//2, w//2 + # edgeline = cv2.resize(edgeline, (nw, nh), interpolation=cv2.INTER_AREA) - img_tracking = draw_all_trajectories(vts, edgeline, save_dir_event, CamerType, draw5p=True) + img_tracking = draw_all_trajectories(vts, edgeline, savepath_pipeline, CamerType, draw5p=True) illus[0] = img_tracking - - + plt = plot_frameID_y2(vts) - plt.savefig(os.path.join(save_dir_event, "front_y2.png")) - + plt.savefig(os.path.join(savepath_pipeline, "front_y2.png")) + if CamerType == 'back': edgeline = cv2.imread("./tracking/shopcart/cart_tempt/edgeline.png") h, w = edgeline.shape[:2] - nh, nw = h//2, w//2 - edgeline = cv2.resize(edgeline, (nw, nh), interpolation=cv2.INTER_AREA) + # nh, nw = h//2, w//2 + # edgeline = cv2.resize(edgeline, (nw, nh), interpolation=cv2.INTER_AREA) - img_tracking = draw_all_trajectories(vts, edgeline, save_dir_event, CamerType, draw5p=True) + img_tracking = draw_all_trajectories(vts, edgeline, savepath_pipeline, CamerType, draw5p=True) illus[1] = img_tracking illus = [im for im in illus if im is not None] @@ -208,64 +223,25 @@ def pipeline( H, W = img_cat.shape[:2] cv2.line(img_cat, (int(W/2), 0), (int(W/2), int(H)), (128, 128, 255), 3) - trajpath = os.path.join(save_dir_event, "traj.png") + trajpath = os.path.join(savepath_pipeline, "trajectory.png") cv2.imwrite(trajpath, img_cat) - - -def main_loop(): - bcdpath = r"\\192.168.1.28\share\测试_202406\contrast\std_barcodes_2192" - eventpath = r"\\192.168.1.28\share\测试_202406\0918\images1" - SourceType = "image" # video, image - - barcodes = [] - input_enents = [] - output_events = [] - - - '''1. 获得barcode标准特征集列表''' - for featname in os.listdir(bcdpath): - barcode, ext = os.path.splitext(featname) - if not barcode.isdigit() or len(barcode)<=8 or ext != ".pickle" : - continue - barcodes.append(barcode) - '''2. 构造(放入事件,标准特征)对''' - for filename in os.listdir(eventpath): - '''barcode为时间文件夹的最后一个字段''' - bcd = filename.split('_')[-1] - - event_path = os.path.join(eventpath, filename) - stdfeat_path = None - if bcd in barcodes: - 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: - parmDict["eventpath"] = eventpath - parmDict["stdfeat_path"] = stdfeat_path - - pipeline(**parmDict) - - def main(): ''' 函数:pipeline(),遍历事件文件夹,选择类型 image 或 video, ''' - evtdir = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images" - evtdir = Path(evtdir) + parmDict = {} - parmDict["savepath"] = r"D:\contrast\202412测试" + evtdir = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images" parmDict["SourceType"] = "video" # video, image - parmDict["stdfeat_path"] = None - - k = 0 - errEvents = [] + parmDict["savepath"] = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result" + parmDict["weights"] = r'D:\DetectTracking\ckpts\best_cls10_0906.pt' + + evtdir = Path(evtdir) + k, errEvents = 0, [] for item in evtdir.iterdir(): - if item.is_dir(): - # item = r"D:\exhibition\images\images2\images2" + if item.is_dir(): + # item = evtdir/Path("20241209-160201-b97f7a0e-7322-4375-9f17-c475500097e9_6926265317292") parmDict["eventpath"] = item # pipeline(**parmDict) @@ -273,10 +249,9 @@ def main(): pipeline(**parmDict) except Exception as e: errEvents.append(str(item)) - - # k+=1 - # if k==1: - # break + 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: diff --git a/track_reid.py b/track_reid.py index 72d886d..59acd33 100644 --- a/track_reid.py +++ b/track_reid.py @@ -62,6 +62,7 @@ from hands.hand_inference import hand_pose 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 @@ -139,12 +140,8 @@ def init_trackers(tracker_yaml = None, bs=1): def yolo_resnet_tracker( weights=ROOT / 'yolov5s.pt', # model path or triton URL source=ROOT / 'data/images', # file/dir/URL/glob/screen/0(webcam) - - project=ROOT / 'runs/detect', # save results to project/name - name='exp', # save results to project/name save_dir = '', - - is_save_img = False, + is_save_img = True, is_save_video = True, tracker_yaml = "./tracking/trackers/cfg/botsort.yaml", @@ -154,19 +151,9 @@ def yolo_resnet_tracker( max_det=1000, # maximum detections per image device='', # cuda device, i.e. 0 or 0,1,2,3 or cpu - view_img=False, # show results - save_txt=False, # save results to *.txt - 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 - 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 line_thickness=3, # bounding box thickness (pixels) hide_labels=False, # hide labels @@ -208,7 +195,7 @@ def yolo_resnet_tracker( # Inference with dt[1]: - visualize = increment_path(project / Path(path).stem, mkdir=True) if visualize else False + # visualize = increment_path(project / Path(path).stem, mkdir=True) if visualize else False pred = model(im, augment=augment, visualize=False) # NMS @@ -242,15 +229,16 @@ def yolo_resnet_tracker( # trackerBoxes = np.concatenate([trackerBoxes, tracks], axis=0) '''================== 1. 存储 dets/subimgs/features Dict =============''' imgs, features = ReIDEncoder.inference(im0, tracks) - featdict = {} + imgdict, featdict = {}, {} for ii, bid in enumerate(tracks[:, 8]): featdict.update({f"{int(frameId)}_{int(bid)}": features[ii, :]}) # [f"feat_{int(bid)}"] = features[i, :] + imgdict.update({f"{int(frameId)}_{int(bid)}": imgs[ii]}) frameDict = {"path": path, "fid": int(frameId), "bboxes": det, "tboxes": tracks, - "imgs": imgs, + "imgs": imgdict, "feats": featdict} yoloResnetTracker.append(frameDict) diff --git a/说明文档.txt b/说明文档.txt index a47428f..f338693 100644 --- a/说明文档.txt +++ b/说明文档.txt @@ -26,12 +26,56 @@ 4. 整体流程仿真 pipeline.py - SourceType: "image", "video", yolo+resent+tracker模块输入数据类型 + 需要指定是个变量: + (1) evtdir: 保存各个事件的文件夹 + (2) SourceType: "image", "video", yolo+resent+tracker模块输入数据类型 + (3) savepath: 结果数据保存位置 + (4) weights: YoloV5 模型权重 + + savepath + (1) Yolos_Tracking + eventname文件夹,保存yolo+resent+tracker模块输出,包括: + (1) images 或 {videoname} + (2) subimgs + (3) trajectory + (4) front_y2.png + (5) trajectory.png + (2) ShoppingDict_pkfile + 保存 ShoppingDict 字典的 pickle 文件,可用于构造 ShoppingEvent 对象。 + + (3) contrast + 保存1:1、1:SN、1:n数据 + + (4) error_events.txt + + 事件字典结构: + ShoppingDict = {"eventPath": eventpath, + "eventName": evtname, + "barcode": barcode, + "eventType": '', # "input", "output", "other" + "frontCamera": {}, + "backCamera": {}, + "one2n": [] + } - 保存为 pickle 文件,该文件可用于 ShoppingEvent 对象构建。 - - - + 相机字典: + CameraEvent = {"cameraType": '', # "front", "back" + "videoPath": '', + "imagePaths": [], + "yoloResnetTracker": [], + "tracking": [], + } + + yoloResnetTracker,列表,元素 "frameDict" 为有关帧数据的字典结构 + frameDict = {"path": path, + "fid": int(frameId), + "bboxes": det, + "tboxes": tracks, + "imgs": imgdict, + "feats": featdict} + + +