modify at output data format
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -394,21 +394,24 @@ class Track:
|
||||
|
||||
|
||||
class doTracks:
|
||||
def __init__(self, bboxes, TracksDict):
|
||||
'''fundamental property'''
|
||||
def __init__(self, bboxes, trackefeats):
|
||||
'''fundamental property
|
||||
trackefeats: dict, key 格式 "fid_bid"
|
||||
'''
|
||||
self.bboxes = bboxes
|
||||
# self.TracksDict = TracksDict
|
||||
self.frameID = np.unique(bboxes[:, 7].astype(int))
|
||||
self.trackID = np.unique(bboxes[:, 4].astype(int))
|
||||
|
||||
self.lboxes = self.array2list()
|
||||
self.lfeats = self.getfeats(TracksDict)
|
||||
self.lfeats = self.getfeats(trackefeats)
|
||||
|
||||
'''对 self.tracks 中的元素进行分类,将 track 归入相应列表中'''
|
||||
self.Hands = []
|
||||
self.Kids = []
|
||||
self.Static = []
|
||||
self.Residual = []
|
||||
self.Residual = []
|
||||
self.Confirmed = []
|
||||
self.DownWard = [] # subset of self.Residual
|
||||
self.UpWard = [] # subset of self.Residual
|
||||
self.FreeMove = [] # subset of self.Residual
|
||||
@ -435,15 +438,22 @@ class doTracks:
|
||||
|
||||
return lboxes
|
||||
|
||||
def getfeats(self, TracksDict):
|
||||
def getfeats(self, trackefeats):
|
||||
lboxes = self.lboxes
|
||||
lfeats = []
|
||||
for boxes in lboxes:
|
||||
afeat = readDict(boxes, TracksDict)
|
||||
lfeats.append(afeat)
|
||||
feats = []
|
||||
for i in range(boxes.shape[0]):
|
||||
fid, bid = int(boxes[i, 7]), int(boxes[i, 8])
|
||||
key = f"{int(fid)}_{int(bid)}"
|
||||
if key in trackefeats:
|
||||
feats.append(trackefeats[key])
|
||||
feats = np.asarray(feats, dtype=np.float32)
|
||||
lfeats.append(feats)
|
||||
|
||||
return lfeats
|
||||
|
||||
|
||||
|
||||
|
||||
def similarity(self):
|
||||
nt = len(self.tracks)
|
||||
|
@ -6,6 +6,7 @@ Created on Mon Mar 4 18:36:31 2024
|
||||
"""
|
||||
import numpy as np
|
||||
import cv2
|
||||
import copy
|
||||
from tracking.utils.mergetrack import track_equal_track
|
||||
from scipy.spatial.distance import cdist
|
||||
from pathlib import Path
|
||||
@ -19,9 +20,9 @@ from .track_back import backTrack
|
||||
|
||||
|
||||
class doBackTracks(doTracks):
|
||||
def __init__(self, bboxes, TracksDict):
|
||||
def __init__(self, bboxes, trackefeats):
|
||||
|
||||
super().__init__(bboxes, TracksDict)
|
||||
super().__init__(bboxes, trackefeats)
|
||||
|
||||
self.tracks = [backTrack(b, f) for b, f in zip(self.lboxes, self.lfeats)]
|
||||
|
||||
@ -113,6 +114,22 @@ class doBackTracks(doTracks):
|
||||
# self.merge_based_hands(htrack)
|
||||
|
||||
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 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):
|
||||
'''
|
||||
迁移至基类:
|
||||
|
@ -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):
|
||||
'''
|
||||
|
Binary file not shown.
@ -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()
|
||||
|
Reference in New Issue
Block a user