# -*- coding: utf-8 -*- """ Created on Sat Jul 27 14:07:25 2024 @author: ym """ import os.path import numpy as np from scipy.spatial.distance import cdist import matplotlib.pyplot as plt import sys sys.path.append(r"D:\DetectTracking") from tracking.utils.read_data import extract_data, read_deletedBarcode_file, read_tracking_output from tracking.dotrack.dotracks import Track from tracking.contrast_analysis import performance_evaluate, compute_recall_precision, show_recall_prec def compute_similar(feat1, feat2): if len(feat1)==0 or len(feat2)==0: return 0 similar = 1 - np.maximum(0.0, cdist(feat1, feat2, metric = 'cosine')) smean = np.mean(similar) return smean def update_event(datapath): '''一次购物事件,包含 8 个keys''' event = {} # event['front_tracking_boxes'] = [] # event['front_tracking_feats'] = {} # event['back_tracking_boxes'] = [] # event['back_tracking_feats'] = {} event['back_sole_boxes'] = np.empty((0, 9), dtype=np.float64) event['front_sole_boxes'] = np.empty((0, 9), dtype=np.float64) event['back_sole_feats'] = np.empty((0, 256), dtype=np.float64) event['front_sole_feats'] = np.empty((0, 256), dtype=np.float64) event['feats_compose'] = np.empty((0, 256), dtype=np.float64) event['feats_select'] = np.empty((0, 256), dtype=np.float64) '''读取当前事件的 data 文件''' for filename in os.listdir(datapath): # filename = '1_track.data' fpath = os.path.join(datapath, filename) CamerType = filename.split('_')[0] # if os.path.isfile(fpath) and filename.find("track.data")>0: # bboxes, ffeats, trackerboxes, tracker_feat_dict, tracking_boxes, tracking_feat_dict = extract_data(fpath) # if CamerType == '0': # event['back_tracking_boxes'] = tracking_boxes # event['back_tracking_feats'] = tracking_feat_dict # elif CamerType == '1': # event['front_tracking_boxes'] = tracking_boxes # event['front_tracking_feats'] = tracking_feat_dict if os.path.isfile(fpath) and filename.find("tracking_output.data")>0: tracking_output_boxes, tracking_output_feats = read_tracking_output(fpath) if CamerType == '0': event['back_sole_boxes'] = tracking_output_boxes event['back_sole_feats'] = tracking_output_feats elif CamerType == '1': event['front_sole_boxes'] = tracking_output_boxes event['front_sole_feats'] = tracking_output_feats '''事件的特征表征方式选择''' fs_feats = event['front_sole_feats'] bs_feats = event['back_sole_feats'] '''1. 如果前后摄均没有轨迹选择输出,返回''' condt1 = len(fs_feats) + len(bs_feats) == 0 if condt1: return event '''2. 构造综合特征''' feats_compose = np.empty((0, 256), dtype=np.float64) if len(fs_feats): feats_compose = np.concatenate((feats_compose, fs_feats), axis=0) if len(bs_feats): feats_compose = np.concatenate((feats_compose, bs_feats), axis=0) event['feats_compose'] = feats_compose '''3. 构造前摄特征''' if len(fs_feats): event['feats_select'] = fs_feats return event '''4. 从前摄输出轨迹中选取特定轨迹对应的特征''' ftrboxes = event['front_tracking_boxes'] ftrfeats = event['front_tracking_feats'] condt2 = len(ftrboxes) + len(ftrfeats) == 0 condt3 = len(ftrfeats) != len(ftrboxes) if condt2 or condt3: return event bprops = [] for boxes in ftrboxes: track = Track(boxes) bprops.append(max(track.trajdist)) index = bprops.index(max(bprops)) box_select = ftrboxes[index] tid = int(box_select[0, 4]) feat_select = ftrfeats[f"track_{tid}"] feats_select = np.empty((0, 256), dtype=np.float64) for fid_bid, feat in feat_select['feats'].items(): feats_select = np.concatenate((feats_select, feat[None, :]), axis=0) event['feats_select'] = feats_select return event def creatd_deletedBarcode_front(filepath): # filepath = r'\\192.168.1.28\share\测试_202406\0723\0723_1\deletedBarcode.txt' basepath, _ = os.path.split(filepath) MatchList = [] bcdlist = read_deletedBarcode_file(filepath) k = 0 for s_list in bcdlist: getout_fold = s_list['SeqDir'].strip() day, hms = getout_fold.strip('_').split('-') ''' 生成取出事件字典 ''' getout_event = {} getout_event['barcode'] = s_list['Deleted'].strip() getout_event['path'] = os.path.join(basepath, getout_fold) getout_event['feats_compose'] = np.empty((0, 256), dtype=np.float64) getout_event['feats_select'] = np.empty((0, 256), dtype=np.float64) InputList = [] barcodes = [s.strip() for s in s_list['barcode']] similarity = [float(s.strip()) for s in s_list['similarity']] for i, barcode in enumerate(barcodes): ''' 生成放入事件字典 ''' input_event = {} input_folds, times = [], [] for pathname in os.listdir(basepath): if pathname.endswith('_'): continue if os.path.isfile(os.path.join(basepath, pathname)):continue infold = pathname.split('_') if len(infold)!=2: continue day1, hms1 = infold[0].split('-') if day1==day and infold[1]==barcode and int(hms1)