This commit is contained in:
王庆刚
2024-12-17 17:32:09 +08:00
parent afd033b965
commit 39f94c7bd4
11 changed files with 768 additions and 250 deletions

69
contrast/event_test.py Normal file
View File

@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 16 18:56:18 2024
@author: ym
"""
import os
import cv2
from utils.event import ShoppingEvent
def main():
evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images"
text1 = "one2n_Error.txt"
text2 = "one2SN_Error.txt"
events = []
text = (text1, text2)
for txt in text:
txtfile = os.path.join(evtpaths, txt)
with open(txtfile, "r") as f:
lines = f.readlines()
for i, line in enumerate(lines):
line = line.strip()
if line:
fpath=os.path.join(evtpaths, line)
events.append(fpath)
events = list(set(events))
'''定义当前事件存储地址及生成相应文件件'''
resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result"
for evtpath in events:
evtname = os.path.basename(evtpath)
event = ShoppingEvent(evtpath)
img_cat = event.draw_tracks()
trajpath = os.path.join(resultPath, "trajectory")
if not os.path.exists(trajpath):
os.makedirs(trajpath)
traj_imgpath = os.path.join(trajpath, evtname+".png")
cv2.imwrite(traj_imgpath, img_cat)
## 保存序列图像和轨迹子图
subimgpath = os.path.join(resultPath, f"{evtname}", "subimg")
imgspath = os.path.join(resultPath, f"{evtname}", "imgs")
if not os.path.exists(subimgpath):
os.makedirs(subimgpath)
if not os.path.exists(imgspath):
os.makedirs(imgspath)
subimgpairs = event.save_event_subimg(subimgpath)
for subimgName, subimg in subimgpairs:
spath = os.path.join(subimgpath, subimgName)
cv2.imwrite(spath, subimg)
imgpairs = event.plot_save_image(imgspath)
for imgname, img in imgpairs:
spath = os.path.join(imgspath, imgname)
cv2.imwrite(spath, img)
print(f"{evtname}")
if __name__ == "__main__":
main()

View File

@ -84,82 +84,84 @@ def ft16_to_uint8(arr_ft16):
return arr_uint8, arr_ft16_ return arr_uint8, arr_ft16_
def plot_save_image(event, savepath): # =============================================================================
cameras = ('front', 'back') # def plot_save_image(event, savepath):
for camera in cameras: # cameras = ('front', 'back')
if camera == 'front': # for camera in cameras:
boxes = event.front_trackerboxes # if camera == 'front':
imgpaths = event.front_imgpaths # boxes = event.front_trackerboxes
else: # imgpaths = event.front_imgpaths
boxes = event.back_trackerboxes # else:
imgpaths = event.back_imgpaths # boxes = event.back_trackerboxes
# imgpaths = event.back_imgpaths
def array2list(bboxes): #
'''[x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]''' # def array2list(bboxes):
frame_ids = bboxes[:, 7].astype(int) # '''[x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]'''
fID = np.unique(bboxes[:, 7].astype(int)) # frame_ids = bboxes[:, 7].astype(int)
fboxes = [] # fID = np.unique(bboxes[:, 7].astype(int))
for f_id in fID: # fboxes = []
idx = np.where(frame_ids==f_id)[0] # for f_id in fID:
box = bboxes[idx, :] # idx = np.where(frame_ids==f_id)[0]
fboxes.append((f_id, box)) # box = bboxes[idx, :]
return fboxes # fboxes.append((f_id, box))
# return fboxes
fboxes = array2list(boxes) #
# fboxes = array2list(boxes)
for fid, fbox in fboxes: #
imgpath = imgpaths[int(fid-1)] # for fid, fbox in fboxes:
# imgpath = imgpaths[int(fid-1)]
image = cv2.imread(imgpath) #
# image = cv2.imread(imgpath)
annotator = Annotator(image.copy(), line_width=2) #
for i, *xyxy, tid, score, cls, fid, bid in enumerate(fbox): # annotator = Annotator(image.copy(), line_width=2)
label = f'{int(id), int(cls)}' # for i, *xyxy, tid, score, cls, fid, bid in enumerate(fbox):
if tid >=0 and cls==0: # label = f'{int(id), int(cls)}'
color = colors(int(cls), True) # if tid >=0 and cls==0:
elif tid >=0 and cls!=0: # color = colors(int(cls), True)
color = colors(int(id), True) # elif tid >=0 and cls!=0:
else: # color = colors(int(id), True)
color = colors(19, True) # 19为调色板的最后一个元素 # else:
annotator.box_label(xyxy, label, color=color) # color = colors(19, True) # 19为调色板的最后一个元素
# annotator.box_label(xyxy, label, color=color)
im0 = annotator.result() #
spath = os.path.join(savepath, Path(imgpath).name) # im0 = annotator.result()
cv2.imwrite(spath, im0) # spath = os.path.join(savepath, Path(imgpath).name)
# cv2.imwrite(spath, im0)
#
def save_event_subimg(event, savepath): #
''' # def save_event_subimg(event, savepath):
功能: 保存一次购物事件的轨迹子图 # '''
9 items: barcode, type, filepath, back_imgpaths, front_imgpaths, # 功能: 保存一次购物事件的轨迹子图
back_boxes, front_boxes, back_feats, front_feats, # 9 items: barcode, type, filepath, back_imgpaths, front_imgpaths,
feats_compose, feats_select # back_boxes, front_boxes, back_feats, front_feats,
子图保存次序:先前摄、后后摄,以 k 为编号,和 "feats_compose" 中次序相同 # feats_compose, feats_select
''' # 子图保存次序:先前摄、后后摄,以 k 为编号,和 "feats_compose" 中次序相同
cameras = ('front', 'back') # '''
for camera in cameras: # cameras = ('front', 'back')
if camera == 'front': # for camera in cameras:
boxes = event.front_boxes # if camera == 'front':
imgpaths = event.front_imgpaths # boxes = event.front_boxes
else: # imgpaths = event.front_imgpaths
boxes = event.back_boxes # else:
imgpaths = event.back_imgpaths # boxes = event.back_boxes
# imgpaths = event.back_imgpaths
for i, box in enumerate(boxes): #
x1, y1, x2, y2, tid, score, cls, fid, bid = box # for i, box in enumerate(boxes):
# x1, y1, x2, y2, tid, score, cls, fid, bid = box
imgpath = imgpaths[int(fid-1)] #
image = cv2.imread(imgpath) # imgpath = imgpaths[int(fid-1)]
# image = cv2.imread(imgpath)
subimg = image[int(y1/2):int(y2/2), int(x1/2):int(x2/2), :] #
# subimg = image[int(y1/2):int(y2/2), int(x1/2):int(x2/2), :]
camerType, timeTamp, _, frameID = os.path.basename(imgpath).split('.')[0].split('_') #
subimgName = f"cam{camerType}_{i}_tid{int(tid)}_fid({int(fid)}, {frameID}).png" # camerType, timeTamp, _, frameID = os.path.basename(imgpath).split('.')[0].split('_')
spath = os.path.join(savepath, subimgName) # subimgName = f"cam{camerType}_{i}_tid{int(tid)}_fid({int(fid)}, {frameID}).png"
# spath = os.path.join(savepath, subimgName)
cv2.imwrite(spath, subimg) #
# basename = os.path.basename(event['filepath']) # cv2.imwrite(spath, subimg)
print(f"Image saved: {os.path.basename(event.eventpath)}") # # basename = os.path.basename(event['filepath'])
# print(f"Image saved: {os.path.basename(event.eventpath)}")
# =============================================================================
def data_precision_compare(stdfeat, evtfeat, evtMessage, save=True): def data_precision_compare(stdfeat, evtfeat, evtMessage, save=True):
@ -296,7 +298,11 @@ def one2one_simi():
if not os.path.exists(pairpath): if not os.path.exists(pairpath):
os.makedirs(pairpath) os.makedirs(pairpath)
try: try:
save_event_subimg(event, pairpath) subimgpairs = event.save_event_subimg(pairpath)
for subimgName, subimg in subimgpairs:
spath = os.path.join(pairpath, subimgName)
cv2.imwrite(spath, subimg)
except Exception as e: except Exception as e:
error_event.append(evtname) error_event.append(evtname)
@ -304,11 +310,17 @@ def one2one_simi():
if not os.path.exists(img_path): if not os.path.exists(img_path):
os.makedirs(img_path) os.makedirs(img_path)
try: try:
plot_save_image(event, img_path) imgpairs = event.plot_save_image(img_path)
for imgname, img in imgpairs:
spath = os.path.join(img_path, imgname)
cv2.imwrite(spath, img)
except Exception as e: except Exception as e:
error_event.append(evtname) error_event.append(evtname)
errfile = os.path.join(subimgPath, f'error_event.txt') errfile = os.path.join(subimgPath, f'error_event.txt')
with open(errfile, 'w', encoding='utf-8') as f: with open(errfile, 'w', encoding='utf-8') as f:
for line in error_event: for line in error_event:
@ -353,7 +365,6 @@ def one2one_simi():
matrix = 1 - cdist(stdfeat, evtfeat, 'cosine') matrix = 1 - cdist(stdfeat, evtfeat, 'cosine')
matrix[matrix < 0] = 0 matrix[matrix < 0] = 0
simi_mean = np.mean(matrix) simi_mean = np.mean(matrix)
simi_max = np.max(matrix) simi_max = np.max(matrix)
stdfeatm = np.mean(stdfeat, axis=0, keepdims=True) stdfeatm = np.mean(stdfeat, axis=0, keepdims=True)
@ -436,7 +447,10 @@ def gen_eventdict(sourcePath, saveimg=True):
errEvents = [] errEvents = []
k = 0 k = 0
for source_path in sourcePath: for source_path in sourcePath:
bname = os.path.basename(source_path) evtpath, bname = os.path.split(source_path)
bname = r"20241126-135911-bdf91cf9-3e9a-426d-94e8-ddf92238e175_6923555210479"
source_path = os.path.join(evtpath, bname)
pickpath = os.path.join(eventDataPath, f"{bname}.pickle") pickpath = os.path.join(eventDataPath, f"{bname}.pickle")
if os.path.isfile(pickpath): continue if os.path.isfile(pickpath): continue
@ -451,9 +465,9 @@ def gen_eventdict(sourcePath, saveimg=True):
errEvents.append(source_path) errEvents.append(source_path)
print(e) print(e)
# k += 1 k += 1
# if k==10: if k==1:
# break break
errfile = os.path.join(eventDataPath, f'error_events.txt') errfile = os.path.join(eventDataPath, f'error_events.txt')
with open(errfile, 'w', encoding='utf-8') as f: with open(errfile, 'w', encoding='utf-8') as f:

View File

@ -105,27 +105,56 @@ def test_compare():
plot_pr_curve(simiList) plot_pr_curve(simiList)
def one2one_pr(paths): def one2one_pr(paths):
'''
1:1
'''
paths = Path(paths) paths = Path(paths)
# evtpaths = [p for p in paths.iterdir() if p.is_dir() and len(p.name.split('_'))>=2] evtpaths = []
evtpaths = [p for p in paths.iterdir() if p.is_dir()] for p in paths.iterdir():
condt1 = p.is_dir()
condt2 = len(p.name.split('_'))>=2
condt3 = len(p.name.split('_')[-1])>8
condt4 = p.name.split('_')[-1].isdigit()
if condt1 and condt2 and condt3 and condt4:
evtpaths.append(p)
# evtpaths = [p for p in paths.iterdir() if p.is_dir() and len(p.name.split('_'))>=2 and len(p.name.split('_')[-1])>8]
# evtpaths = [p for p in paths.iterdir() if p.is_dir()]
events, similars = [], [] events, similars = [], []
##===================================== 扫A放A, 扫A放B场景 ##===================================== 扫A放A, 扫A放B场景()
one2oneAA, one2oneAB = [], [] one2oneAA, one2oneAB = [], []
one2SNAA, one2SNAB = [], []
##===================================== 应用于展厅 1N ##===================================== 应用于 11
_tp_events, _fn_events, _fp_events, _tn_events = [], [], [], []
_tp_simi, _fn_simi, _tn_simi, _fp_simi = [], [], [], []
##===================================== 应用于 1SN
tp_events, fn_events, fp_events, tn_events = [], [], [], [] tp_events, fn_events, fp_events, tn_events = [], [], [], []
tp_simi, fn_simi, tn_simi, fp_simi = [], [], [], [] tp_simi, fn_simi, tn_simi, fp_simi = [], [], [], []
##===================================== 应用于1:n ##===================================== 应用于1:n
tpevents, fnevents, fpevents, tnevents = [], [], [], [] tpevents, fnevents, fpevents, tnevents = [], [], [], []
tpsimi, fnsimi, tnsimi, fpsimi = [], [], [], [] tpsimi, fnsimi, tnsimi, fpsimi = [], [], [], []
other_event, other_simi = [], []
##===================================== barcodes总数、比对错误事件 ##===================================== barcodes总数、比对错误事件
bcdList, one2onePath = [], [] bcdList = []
one2onePath, one2onePath1 = [], []
one2SNPath, one2SNPath1 = [], []
one2nPath = []
errorFile_one2one, errorFile_one2SN, errorFile_one2n = [], [], []
for path in evtpaths: for path in evtpaths:
barcode = path.stem.split('_')[-1] barcode = path.stem.split('_')[-1]
datapath = path.joinpath('process.data') datapath = path.joinpath('process.data')
@ -140,35 +169,74 @@ def one2one_pr(paths):
except Exception as e: except Exception as e:
print(f"{path.stem}, Error: {e}") print(f"{path.stem}, Error: {e}")
'''放入为 1:1相似度取最大值取出时为 1:SN, 相似度取均值'''
one2one = SimiDict['one2one'] one2one = SimiDict['one2one']
one2SN = SimiDict['one2SN']
one2n = SimiDict['one2n'] one2n = SimiDict['one2n']
'''================== 0. 1:1 ==================='''
barcodes, similars = [], [] barcodes, similars = [], []
for dt in one2one: for dt in one2one:
one2onePath.append((path.stem))
if dt['similar']==0:
one2onePath1.append((path.stem))
continue
barcodes.append(dt['barcode']) barcodes.append(dt['barcode'])
similars.append(dt['similar']) similars.append(dt['similar'])
if len(barcodes)==len(similars) and len(barcodes)!=0:
if len(barcodes)!=len(similars) or len(barcodes)==0: ## 扫A放A, 扫A放B场景
continue
##===================================== 扫A放A, 扫A放B场景
simAA = [similars[i] for i in range(len(barcodes)) if barcodes[i]==barcode] simAA = [similars[i] for i in range(len(barcodes)) if barcodes[i]==barcode]
simAB = [similars[i] for i in range(len(barcodes)) if barcodes[i]!=barcode] simAB = [similars[i] for i in range(len(barcodes)) if barcodes[i]!=barcode]
one2oneAA.extend(simAA) one2oneAA.extend(simAA)
one2oneAB.extend(simAB) one2oneAB.extend(simAB)
one2onePath.append(path.stem)
##===================================== 以下应用适用于展厅 1N ## 相似度排序barcode相等且排名第一为TP适用于多的barcode相似度比较
max_idx = similars.index(max(similars)) max_idx = similars.index(max(similars))
max_sim = similars[max_idx] max_sim = similars[max_idx]
# max_bcd = barcodes[max_idx] # max_bcd = barcodes[max_idx]
if path.stem.find('100321')>0:
print("hhh")
for i in range(len(one2one)): for i in range(len(one2one)):
bcd, simi = barcodes[i], similars[i]
if bcd==barcode and simi==max_sim:
_tp_simi.append(simi)
_tp_events.append(path.stem)
elif bcd==barcode and simi!=max_sim:
_fn_simi.append(simi)
_fn_events.append(path.stem)
elif bcd!=barcode and simi!=max_sim:
_tn_simi.append(simi)
_tn_events.append(path.stem)
elif bcd!=barcode and simi==max_sim and barcode in barcodes:
_fp_simi.append(simi)
_fp_events.append(path.stem)
else:
errorFile_one2one.append(path.stem)
'''================== 2. 取出场景下的 1 : Small N ==================='''
barcodes, similars = [], []
for dt in one2SN:
barcodes.append(dt['barcode'])
similars.append(dt['similar'])
if len(barcodes)==len(similars) and len(barcodes)!=0:
## 扫A放A, 扫A放B场景
simAA = [similars[i] for i in range(len(barcodes)) if barcodes[i]==barcode]
simAB = [similars[i] for i in range(len(barcodes)) if barcodes[i]!=barcode]
one2SNAA.extend(simAA)
one2SNAB.extend(simAB)
one2SNPath.append(path.stem)
if len(simAA)==0:
one2SNPath1.append(path.stem)
## 相似度排序barcode相等且排名第一为TP适用于多的barcode相似度比较
max_idx = similars.index(max(similars))
max_sim = similars[max_idx]
# max_bcd = barcodes[max_idx]
for i in range(len(one2SN)):
bcd, simi = barcodes[i], similars[i] bcd, simi = barcodes[i], similars[i]
if bcd==barcode and simi==max_sim: if bcd==barcode and simi==max_sim:
tp_simi.append(simi) tp_simi.append(simi)
@ -179,12 +247,15 @@ def one2one_pr(paths):
elif bcd!=barcode and simi!=max_sim: elif bcd!=barcode and simi!=max_sim:
tn_simi.append(simi) tn_simi.append(simi)
tn_events.append(path.stem) tn_events.append(path.stem)
else: elif bcd!=barcode and simi==max_sim and barcode in barcodes:
fp_simi.append(simi) fp_simi.append(simi)
fp_events.append(path.stem) fp_events.append(path.stem)
else:
errorFile_one2SN.append(path.stem)
##===================================== 以下应用适用1:n
'''===================== 3. 取出场景下的 1:n ========================'''
events, evt_barcodes, evt_similars, evt_types = [], [], [], [] events, evt_barcodes, evt_similars, evt_types = [], [], [], []
for dt in one2n: for dt in one2n:
events.append(dt["event"]) events.append(dt["event"])
@ -192,9 +263,10 @@ def one2one_pr(paths):
evt_similars.append(dt["similar"]) evt_similars.append(dt["similar"])
evt_types.append(dt["type"]) evt_types.append(dt["type"])
if len(events)!=len(evt_barcodes) or len(evt_barcodes)!=len(evt_similars) \ if len(events)==len(evt_barcodes) and len(evt_barcodes)==len(evt_similars) \
or len(evt_barcodes)!=len(evt_similars) or len(events)==0: continue and len(evt_similars)==len(evt_types) and len(events)>0:
one2nPath.append(path.stem)
maxsim = evt_similars[evt_similars.index(max(evt_similars))] maxsim = evt_similars[evt_similars.index(max(evt_similars))]
for i in range(len(one2n)): for i in range(len(one2n)):
bcd, simi = evt_barcodes[i], evt_similars[i] bcd, simi = evt_barcodes[i], evt_similars[i]
@ -208,90 +280,102 @@ def one2one_pr(paths):
elif bcd!=barcode and simi!=maxsim: elif bcd!=barcode and simi!=maxsim:
tnsimi.append(simi) tnsimi.append(simi)
tnevents.append(path.stem) tnevents.append(path.stem)
elif bcd!=barcode and simi==maxsim: elif bcd!=barcode and simi==maxsim and barcode in evt_barcodes:
fpsimi.append(simi) fpsimi.append(simi)
fpevents.append(path.stem) fpevents.append(path.stem)
else: else:
other_simi.append(simi) errorFile_one2n.append(path.stem)
other_event.append(path.stem)
'''命名规则: '''命名规则:
1:1 1:n 1:N 1:1 (max) 1:1 (max) 1:n 1:N
TP_ TP TPX _TP TP_ TP TPX
PPrecise_ PPrecise PPreciseX _PPrecise PPrecise_ PPrecise PPreciseX
tpsimi tp_simi tpsimi tp_simi
''' '''
''' 1:1 数据存储''' ''' 1:1 数据存储, 相似度计算方式:最大值、均值'''
_PPrecise, _PRecall = [], []
_NPrecise, _NRecall = [], []
PPrecise_, PRecall_ = [], [] PPrecise_, PRecall_ = [], []
NPrecise_, NRecall_ = [], [] NPrecise_, NRecall_ = [], []
''' 1:n 数据存储''' ''' 1:SN 数据存储,需根据相似度排序'''
PPrecise, PRecall = [], []
NPrecise, NRecall = [], []
''' 展厅 1:N 数据存储'''
PPreciseX, PRecallX = [], [] PPreciseX, PRecallX = [], []
NPreciseX, NRecallX = [], [] NPreciseX, NRecallX = [], []
''' 1:n 数据存储,需根据相似度排序'''
PPrecise, PRecall = [], []
NPrecise, NRecall = [], []
Thresh = np.linspace(-0.2, 1, 100) Thresh = np.linspace(-0.2, 1, 100)
for th in Thresh: for th in Thresh:
'''============================= 1:1''' '''(Precise, Recall) 计算方式, 若 1:1 与 1:SN 相似度选择方式相同,则可以合并'''
TP_ = sum(np.array(one2oneAA) >= th) '''===================================== 1:1 最大值'''
FP_ = sum(np.array(one2oneAB) >= th) _TP = sum(np.array(one2oneAA) >= th)
FN_ = sum(np.array(one2oneAA) < th) _FP = sum(np.array(one2oneAB) >= th)
TN_ = sum(np.array(one2oneAB) < th) _FN = sum(np.array(one2oneAA) < th)
_TN = sum(np.array(one2oneAB) < th)
_PPrecise.append(_TP/(_TP+_FP+1e-6))
_PRecall.append(_TP/(len(one2oneAA)+1e-6))
_NPrecise.append(_TN/(_TN+_FN+1e-6))
_NRecall.append(_TN/(len(one2oneAB)+1e-6))
'''===================================== 1:SN 均值'''
TP_ = sum(np.array(one2SNAA) >= th)
FP_ = sum(np.array(one2SNAB) >= th)
FN_ = sum(np.array(one2SNAA) < th)
TN_ = sum(np.array(one2SNAB) < th)
PPrecise_.append(TP_/(TP_+FP_+1e-6)) PPrecise_.append(TP_/(TP_+FP_+1e-6))
# PRecall_.append(TP_/(TP_+FN_+1e-6)) PRecall_.append(TP_/(len(one2SNAA)+1e-6))
PRecall_.append(TP_/(len(one2oneAA)+1e-6))
NPrecise_.append(TN_/(TN_+FN_+1e-6)) NPrecise_.append(TN_/(TN_+FN_+1e-6))
# NRecall_.append(TN_/(TN_+FP_+1e-6)) NRecall_.append(TN_/(len(one2SNAB)+1e-6))
NRecall_.append(TN_/(len(one2oneAB)+1e-6))
'''============================= 1:n''' '''适用于 (Precise, Recall) 计算方式多个相似度计算并排序barcode相等且排名第一为 TP '''
TP = sum(np.array(tpsimi) >= th) '''===================================== 1:SN '''
FP = sum(np.array(fpsimi) >= th)
FN = sum(np.array(fnsimi) < th)
TN = sum(np.array(tnsimi) < th)
PPrecise.append(TP/(TP+FP+1e-6))
# PRecall.append(TP/(TP+FN+1e-6))
PRecall.append(TP/(len(tpsimi)+len(fnsimi)+1e-6))
NPrecise.append(TN/(TN+FN+1e-6))
# NRecall.append(TN/(TN+FP+1e-6))
NRecall.append(TN/(len(tnsimi)+len(fpsimi)+1e-6))
'''============================= 1:N 展厅'''
TPX = sum(np.array(tp_simi) >= th) TPX = sum(np.array(tp_simi) >= th)
FPX = sum(np.array(fp_simi) >= th) FPX = sum(np.array(fp_simi) >= th)
FNX = sum(np.array(fn_simi) < th) FNX = sum(np.array(fn_simi) < th)
TNX = sum(np.array(tn_simi) < th) TNX = sum(np.array(tn_simi) < th)
PPreciseX.append(TPX/(TPX+FPX+1e-6)) PPreciseX.append(TPX/(TPX+FPX+1e-6))
# PRecallX.append(TPX/(TPX+FNX+1e-6))
PRecallX.append(TPX/(len(tp_simi)+len(fn_simi)+1e-6)) PRecallX.append(TPX/(len(tp_simi)+len(fn_simi)+1e-6))
NPreciseX.append(TNX/(TNX+FNX+1e-6)) NPreciseX.append(TNX/(TNX+FNX+1e-6))
# NRecallX.append(TNX/(TNX+FPX+1e-6))
NRecallX.append(TNX/(len(tn_simi)+len(fp_simi)+1e-6)) NRecallX.append(TNX/(len(tn_simi)+len(fp_simi)+1e-6))
'''============================= 1:1 曲线'''
'''===================================== 1:n'''
TP = sum(np.array(tpsimi) >= th)
FP = sum(np.array(fpsimi) >= th)
FN = sum(np.array(fnsimi) < th)
TN = sum(np.array(tnsimi) < th)
PPrecise.append(TP/(TP+FP+1e-6))
PRecall.append(TP/(len(tpsimi)+len(fnsimi)+1e-6))
NPrecise.append(TN/(TN+FN+1e-6))
NRecall.append(TN/(len(tnsimi)+len(fpsimi)+1e-6))
'''1. ============================= 1:1 最大值方案 曲线'''
fig, ax = plt.subplots() fig, ax = plt.subplots()
ax.plot(Thresh, PPrecise_, 'r', label='Precise_Pos: TP/TPFP') ax.plot(Thresh, _PPrecise, 'r', label='Precise_Pos: TP/TPFP')
ax.plot(Thresh, PRecall_, 'b', label='Recall_Pos: TP/TPFN') ax.plot(Thresh, _PRecall, 'b', label='Recall_Pos: TP/TPFN')
ax.plot(Thresh, NPrecise_, 'g', label='Precise_Neg: TN/TNFP') ax.plot(Thresh, _NPrecise, 'g', label='Precise_Neg: TN/TNFP')
ax.plot(Thresh, NRecall_, 'c', label='Recall_Neg: TN/TNFN') ax.plot(Thresh, _NRecall, 'c', label='Recall_Neg: TN/TNFN')
ax.set_xlim([0, 1]) ax.set_xlim([0, 1])
ax.set_ylim([0, 1]) ax.set_ylim([0, 1])
ax.grid(True) ax.grid(True)
ax.set_title('1:1 Precise & Recall') ax.set_title('1:1 Precise & Recall')
ax.set_xlabel(f"Event Num: {len(one2oneAA)}") ax.set_xlabel(f"Event Num: {len(one2oneAA)+len(one2oneAB)}")
ax.legend() ax.legend()
plt.show() plt.show()
## ============================= 1:1 最大值方案 直方图'''
'''============================= 1:1 直方图'''
fig, axes = plt.subplots(2, 1) fig, axes = plt.subplots(2, 1)
axes[0].hist(np.array(one2oneAA), bins=60, edgecolor='black') axes[0].hist(np.array(one2oneAA), bins=60, edgecolor='black')
axes[0].set_xlim([-0.2, 1]) axes[0].set_xlim([-0.2, 1])
@ -301,7 +385,63 @@ def one2one_pr(paths):
axes[1].set_title('BB') axes[1].set_title('BB')
plt.show() plt.show()
'''============================= 1:n 曲线'''
'''2. ============================= 1:1 均值方案 曲线'''
fig, ax = plt.subplots()
ax.plot(Thresh, PPrecise_, 'r', label='Precise_Pos: TP/TPFP')
ax.plot(Thresh, PRecall_, 'b', label='Recall_Pos: TP/TPFN')
ax.plot(Thresh, NPrecise_, 'g', label='Precise_Neg: TN/TNFP')
ax.plot(Thresh, NRecall_, 'c', label='Recall_Neg: TN/TNFN')
ax.set_xlim([0, 1])
ax.set_ylim([0, 1])
ax.grid(True)
ax.set_title('1:1 Precise & Recall')
ax.set_xlabel(f"Event Num: {len(one2SNAA)}")
ax.legend()
plt.show()
## ============================= 1:1 均值方案 直方图'''
fig, axes = plt.subplots(2, 1)
axes[0].hist(np.array(one2SNAA), bins=60, edgecolor='black')
axes[0].set_xlim([-0.2, 1])
axes[0].set_title('AA')
axes[1].hist(np.array(one2SNAB), bins=60, edgecolor='black')
axes[1].set_xlim([-0.2, 1])
axes[1].set_title('BB')
plt.show()
''''3. ============================= 1:SN 曲线'''
fig, ax = plt.subplots()
ax.plot(Thresh, PPreciseX, 'r', label='Precise_Pos: TP/TPFP')
ax.plot(Thresh, PRecallX, 'b', label='Recall_Pos: TP/TPFN')
ax.plot(Thresh, NPreciseX, 'g', label='Precise_Neg: TN/TNFP')
ax.plot(Thresh, NRecallX, 'c', label='Recall_Neg: TN/TNFN')
ax.set_xlim([0, 1])
ax.set_ylim([0, 1])
ax.grid(True)
ax.set_title('1:SN Precise & Recall')
ax.set_xlabel(f"Event Num: {len(one2SNAA)}")
ax.legend()
plt.show()
## ============================= 1:N 展厅 直方图'''
fig, axes = plt.subplots(2, 2)
axes[0, 0].hist(tp_simi, bins=60, edgecolor='black')
axes[0, 0].set_xlim([-0.2, 1])
axes[0, 0].set_title('TP')
axes[0, 1].hist(fp_simi, bins=60, edgecolor='black')
axes[0, 1].set_xlim([-0.2, 1])
axes[0, 1].set_title('FP')
axes[1, 0].hist(tn_simi, bins=60, edgecolor='black')
axes[1, 0].set_xlim([-0.2, 1])
axes[1, 0].set_title('TN')
axes[1, 1].hist(fn_simi, bins=60, edgecolor='black')
axes[1, 1].set_xlim([-0.2, 1])
axes[1, 1].set_title('FN')
plt.show()
'''4. ============================= 1:n 曲线,'''
fig, ax = plt.subplots() fig, ax = plt.subplots()
ax.plot(Thresh, PPrecise, 'r', label='Precise_Pos: TP/TPFP') ax.plot(Thresh, PPrecise, 'r', label='Precise_Pos: TP/TPFP')
ax.plot(Thresh, PRecall, 'b', label='Recall_Pos: TP/TPFN') ax.plot(Thresh, PRecall, 'b', label='Recall_Pos: TP/TPFN')
@ -311,11 +451,10 @@ def one2one_pr(paths):
ax.set_ylim([0, 1]) ax.set_ylim([0, 1])
ax.grid(True) ax.grid(True)
ax.set_title('1:n Precise & Recall') ax.set_title('1:n Precise & Recall')
ax.set_xlabel(f"Event Num: {len(one2oneAA)}") ax.set_xlabel(f"Event Num: {len(tpsimi)+len(fnsimi)}")
ax.legend() ax.legend()
plt.show() plt.show()
## ============================= 1:n 直方图'''
'''============================= 1:n 直方图'''
fig, axes = plt.subplots(2, 2) fig, axes = plt.subplots(2, 2)
axes[0, 0].hist(tpsimi, bins=60, edgecolor='black') axes[0, 0].hist(tpsimi, bins=60, edgecolor='black')
axes[0, 0].set_xlim([-0.2, 1]) axes[0, 0].set_xlim([-0.2, 1])
@ -332,35 +471,18 @@ def one2one_pr(paths):
plt.show() plt.show()
'''============================= 1:N 展厅 曲线''' fpsnErrFile = str(paths.joinpath("one2SN_Error.txt"))
fig, ax = plt.subplots() with open(fpsnErrFile, "w") as file:
ax.plot(Thresh, PPreciseX, 'r', label='Precise_Pos: TP/TPFP') for item in fp_events:
ax.plot(Thresh, PRecallX, 'b', label='Recall_Pos: TP/TPFN') file.write(item + "\n")
ax.plot(Thresh, NPreciseX, 'g', label='Precise_Neg: TN/TNFP')
ax.plot(Thresh, NRecallX, 'c', label='Recall_Neg: TN/TNFN') fpErrFile = str(paths.joinpath("one2n_Error.txt"))
ax.set_xlim([0, 1]) with open(fpErrFile, "w") as file:
ax.set_ylim([0, 1]) for item in fpevents:
ax.grid(True) file.write(item + "\n")
ax.set_title('1:N Precise & Recall')
ax.set_xlabel(f"Event Num: {len(one2oneAA)}")
ax.legend()
plt.show()
'''============================= 1:N 展厅 直方图'''
fig, axes = plt.subplots(2, 2)
axes[0, 0].hist(tp_simi, bins=60, edgecolor='black')
axes[0, 0].set_xlim([-0.2, 1])
axes[0, 0].set_title('TP')
axes[0, 1].hist(fp_simi, bins=60, edgecolor='black')
axes[0, 1].set_xlim([-0.2, 1])
axes[0, 1].set_title('FP')
axes[1, 0].hist(tn_simi, bins=60, edgecolor='black')
axes[1, 0].set_xlim([-0.2, 1])
axes[1, 0].set_title('TN')
axes[1, 1].hist(fn_simi, bins=60, edgecolor='black')
axes[1, 1].set_xlim([-0.2, 1])
axes[1, 1].set_title('FN')
plt.show()
# bcdSet = set(bcdList) # bcdSet = set(bcdList)
# one2nErrFile = str(paths.joinpath("one_2_Small_n_Error.txt")) # one2nErrFile = str(paths.joinpath("one_2_Small_n_Error.txt"))
@ -378,7 +500,7 @@ def one2one_pr(paths):
if __name__ == "__main__": if __name__ == "__main__":
evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\展厅测试\1129_展厅模型v801测试组测试" evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images"
one2one_pr(evtpaths) one2one_pr(evtpaths)

View File

@ -5,17 +5,43 @@ Created on Tue Nov 26 17:35:05 2024
@author: ym @author: ym
""" """
import os import os
import cv2
import pickle import pickle
import numpy as np import numpy as np
from pathlib import Path from pathlib import Path
import sys import sys
sys.path.append(r"D:\DetectTracking") sys.path.append(r"D:\DetectTracking")
from tracking.utils.plotting import Annotator, colors
from tracking.utils.drawtracks import drawTrack
from tracking.utils.read_data import extract_data, read_tracking_output, read_similar from tracking.utils.read_data import extract_data, read_tracking_output, read_similar
IMG_FORMAT = ['.bmp', '.jpg', '.jpeg', '.png'] IMG_FORMAT = ['.bmp', '.jpg', '.jpeg', '.png']
VID_FORMAT = ['.mp4', '.avi'] VID_FORMAT = ['.mp4', '.avi']
def array2list(bboxes):
'''
将 bboxes 变换为 track 列表
bboxes: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]
Return
lboxes列表列表中元素具有同一 track_idx1y1x2y2 格式
[x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]
'''
lboxes = []
if len(bboxes)==0:
return []
trackID = np.unique(bboxes[:, 4].astype(int))
track_ids = bboxes[:, 4].astype(int)
for t_id in trackID:
idx = np.where(track_ids == t_id)[0]
box = bboxes[idx, :]
lboxes.append(box)
return lboxes
class ShoppingEvent: class ShoppingEvent:
def __init__(self, eventpath, stype="data"): def __init__(self, eventpath, stype="data"):
'''stype: str, 'pickle', 'data', ''' '''stype: str, 'pickle', 'data', '''
@ -253,14 +279,218 @@ class ShoppingEvent:
elif len(self.back_feats): elif len(self.back_feats):
self.feats_select = self.back_feats self.feats_select = self.back_feats
def main(): def plot_save_image(self, savepath):
pklpath = r"D:\DetectTracking\evtresult\images2\ShoppingDict.pkl"
evt = ShoppingEvent(pklpath, stype='pickle') def array2list(bboxes):
'''[x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]'''
frame_ids = bboxes[:, 7].astype(int)
fID = np.unique(bboxes[:, 7].astype(int))
fboxes = []
for f_id in fID:
idx = np.where(frame_ids==f_id)[0]
box = bboxes[idx, :]
fboxes.append((f_id, box))
return fboxes
imgpairs = []
cameras = ('front', 'back')
for camera in cameras:
if camera == 'front':
boxes = self.front_trackerboxes
imgpaths = self.front_imgpaths
else:
boxes = self.back_trackerboxes
imgpaths = self.back_imgpaths
fboxes = array2list(boxes)
for fid, fbox in fboxes:
imgpath = imgpaths[int(fid-1)]
image = cv2.imread(imgpath)
annotator = Annotator(image.copy(), line_width=2)
for i, box in enumerate(fbox):
x1, y1, x2, y2, tid, score, cls, fid, bid = box
label = f'{int(tid), int(cls)}'
if tid >=0 and cls==0:
color = colors(int(cls), True)
elif tid >=0 and cls!=0:
color = colors(int(tid), True)
else:
color = colors(19, True) # 19为调色板的最后一个元素
xyxy = (x1/2, y1/2, x2/2, y2/2)
annotator.box_label(xyxy, label, color=color)
im0 = annotator.result()
imgpairs.append((Path(imgpath).name, im0))
# spath = os.path.join(savepath, Path(imgpath).name)
# cv2.imwrite(spath, im0)
return imgpairs
def save_event_subimg(self, savepath):
'''
功能: 保存一次购物事件的轨迹子图
9 items: barcode, type, filepath, back_imgpaths, front_imgpaths,
back_boxes, front_boxes, back_feats, front_feats,
feats_compose, feats_select
子图保存次序:先前摄、后后摄,以 k 为编号,和 "feats_compose" 中次序相同
'''
imgpairs = []
cameras = ('front', 'back')
for camera in cameras:
boxes = np.empty((0, 9), dtype=np.float64) ##和类doTracks兼容
if camera == 'front':
for b in self.front_boxes:
boxes = np.concatenate((boxes, b), axis=0)
imgpaths = self.front_imgpaths
else:
for b in self.back_boxes:
boxes = np.concatenate((boxes, b), axis=0)
imgpaths = self.back_imgpaths
for i, box in enumerate(boxes):
x1, y1, x2, y2, tid, score, cls, fid, bid = box
imgpath = imgpaths[int(fid-1)]
image = cv2.imread(imgpath)
subimg = image[int(y1/2):int(y2/2), int(x1/2):int(x2/2), :]
camerType, timeTamp, _, frameID = os.path.basename(imgpath).split('.')[0].split('_')
subimgName = f"cam{camerType}_{i}_tid{int(tid)}_fid({int(fid)}, {frameID}).png"
imgpairs.append((subimgName, subimg))
# spath = os.path.join(savepath, subimgName)
# cv2.imwrite(spath, subimg)
return imgpairs
# basename = os.path.basename(event['filepath'])
print(f"Image saved: {os.path.basename(self.eventpath)}")
def draw_tracks(self):
front_edge = cv2.imread(r"D:\DetectTracking\tracking\shopcart\cart_tempt\board_ftmp_line.png")
back_edge = cv2.imread(r"D:\DetectTracking\tracking\shopcart\cart_tempt\edgeline.png")
front_trackerboxes = array2list(self.front_trackerboxes)
back_trackerboxes = array2list(self.back_trackerboxes)
# img1, img2 = edgeline.copy(), edgeline.copy()
img1 = drawTrack(front_trackerboxes, front_edge.copy())
img2 = drawTrack(self.front_trackingboxes, front_edge.copy())
img3 = drawTrack(back_trackerboxes, back_edge.copy())
img4 = drawTrack(self.back_trackingboxes, back_edge.copy())
imgcat1 = np.concatenate((img1, img2), axis = 1)
H, W = imgcat1.shape[:2]
cv2.line(imgcat1, (int(W/2), 0), (int(W/2), H), (128, 255, 128), 2)
imgcat2 = np.concatenate((img3, img4), axis = 1)
H, W = imgcat2.shape[:2]
cv2.line(imgcat2, (int(W/2), 0), (int(W/2), H), (128, 255, 128), 2)
illus = [imgcat1, imgcat2]
if len(illus):
img_cat = np.concatenate(illus, axis = 1)
if len(illus)==2:
H, W = img_cat.shape[:2]
cv2.line(img_cat, (int(W/2), 0), (int(W/2), int(H)), (128, 128, 255), 3)
return img_cat
def main():
# pklpath = r"D:\DetectTracking\evtresult\images2\ShoppingDict.pkl"
# evt = ShoppingEvent(pklpath, stype='pickle')
evtpath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images\20241209-160248-08edd5f6-1806-45ad-babf-7a4dd11cea60_6973226721445"
evt = ShoppingEvent(evtpath, stype='data')
img_cat = evt.draw_tracks()
cv2.imwrite("a.png", img_cat)
# =============================================================================
# def main1():
# evtpaths = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images"
# text1 = "one2n_Error.txt"
# text2 = "one2SN_Error.txt"
# events = []
# text = (text1, text2)
# for txt in text:
# txtfile = os.path.join(evtpaths, txt)
# with open(txtfile, "r") as f:
# lines = f.readlines()
# for i, line in enumerate(lines):
# line = line.strip()
# if line:
# fpath=os.path.join(evtpaths, line)
# events.append(fpath)
#
#
# events = list(set(events))
#
# '''定义当前事件存储地址及生成相应文件件'''
# resultPath = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\result"
# # eventDataPath = os.path.join(resultPath, "evtobjs")
# # subimgPath = os.path.join(resultPath, "subimgs")
# # imagePath = os.path.join(resultPath, "image")
#
# # if not os.path.exists(eventDataPath):
# # os.makedirs(eventDataPath)
# # if not os.path.exists(subimgPath):
# # os.makedirs(subimgPath)
# # if not os.path.exists(imagePath):
# # os.makedirs(imagePath)
#
#
# for evtpath in events:
# event = ShoppingEvent(evtpath)
#
#
# evtname = os.path.basename(evtpath)
# subimgpath = os.path.join(resultPath, f"{evtname}", "subimg")
# imgspath = os.path.join(resultPath, f"{evtname}", "imgs")
# if not os.path.exists(subimgpath):
# os.makedirs(subimgpath)
# if not os.path.exists(imgspath):
# os.makedirs(imgspath)
#
# subimgpairs = event.save_event_subimg(subimgpath)
#
# for subimgName, subimg in subimgpairs:
# spath = os.path.join(subimgpath, subimgName)
# cv2.imwrite(spath, subimg)
#
# imgpairs = event.plot_save_image(imgspath)
# for imgname, img in imgpairs:
# spath = os.path.join(imgspath, imgname)
# cv2.imwrite(spath, img)
#
# =============================================================================
if __name__ == "__main__": if __name__ == "__main__":
main() main()
# main1()

View File

@ -77,8 +77,13 @@ def pipeline(
'''事件结果存储文件夹''' '''事件结果存储文件夹'''
if not savepath: if not savepath:
savepath = Path(__file__).resolve().parents[0] / "evtresult" savepath = Path(__file__).resolve().parents[0] / "evtresult"
save_dir_event = Path(savepath) / evtname save_dir_event = Path(savepath) / evtname
pickpath = Path(savepath)/"pickfile"
if not pickpath.exists():
pickpath.mkdir(parents=True, exist_ok=True)
ShoppingDict = {"eventPath": eventpath, ShoppingDict = {"eventPath": eventpath,
"eventName": evtname, "eventName": evtname,
@ -117,6 +122,8 @@ def pipeline(
save_dir_video.mkdir(parents=True, exist_ok=True) save_dir_video.mkdir(parents=True, exist_ok=True)
'''Yolo + Resnet + Tracker''' '''Yolo + Resnet + Tracker'''
optdict["source"] = vpath optdict["source"] = vpath
optdict["save_dir"] = save_dir_video optdict["save_dir"] = save_dir_video
@ -162,14 +169,16 @@ def pipeline(
# pklpath = save_dir_event / "ShoppingDict.pkl" # pklpath = save_dir_event / "ShoppingDict.pkl"
# with open(str(pklpath), 'wb') as f: # with open(str(pklpath), 'wb') as f:
# pickle.dump(ShoppingDict, f) # pickle.dump(ShoppingDict, f)
pklpath = Path(savepath) / evtname+".pkl" pf_path = Path(pickpath) / Path(str(evtname)+".pkl")
with open(str(pklpath), 'wb') as f: with open(str(pf_path), 'wb') as f:
pickle.dump(ShoppingDict, f) pickle.dump(ShoppingDict, f)
'''轨迹显示模块''' '''轨迹显示模块'''
illus = [None, None] illus = [None, None]
for CamerType, vts in event_tracks: for CamerType, vts in event_tracks:
if len(vts.tracks)==0: continue
if CamerType == 'front': if CamerType == 'front':
edgeline = cv2.imread("./tracking/shopcart/cart_tempt/board_ftmp_line.png") edgeline = cv2.imread("./tracking/shopcart/cart_tempt/board_ftmp_line.png")
@ -255,7 +264,7 @@ def main():
''' '''
函数pipeline(),遍历事件文件夹,选择类型 image 或 video, 函数pipeline(),遍历事件文件夹,选择类型 image 或 video,
''' '''
evtdir = r"\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\比对测试\1209永辉超市测试" evtdir = r"\\192.168.1.28\share\测试视频数据以及日志\算法全流程测试\202412\images"
evtdir = Path(evtdir) evtdir = Path(evtdir)
parmDict = {} parmDict = {}
@ -263,25 +272,22 @@ def main():
parmDict["SourceType"] = "image" # video, image parmDict["SourceType"] = "image" # video, image
parmDict["stdfeat_path"] = None parmDict["stdfeat_path"] = None
k = 1 k = 0
errEvents = [] errEvents = []
for item in evtdir.iterdir(): for item in evtdir.iterdir():
if item.is_dir(): if item.is_dir():
item = r"D:\exhibition\images\images2\images2" # item = r"D:\exhibition\images\images2\images2"
parmDict["eventpath"] = item parmDict["eventpath"] = item
try:
pipeline(**parmDict) pipeline(**parmDict)
except Exception as e:
errEvents.append(item)
# try:
# pipeline(**parmDict)
# except Exception as e:
# errEvents.append(str(item))
# k+=1 k+=1
# if k==1: if k==1:
# break break
errfile = os.path.join(parmDict["savepath"], f'error_events.txt') errfile = os.path.join(parmDict["savepath"], f'error_events.txt')
with open(errfile, 'w', encoding='utf-8') as f: with open(errfile, 'w', encoding='utf-8') as f:

73
shopper.py Normal file
View File

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 17 10:45:10 2024
@author: ym
"""
import os
import numpy as np
import pandas as pd
from pathlib import Path
xpath = r"\\192.168.1.28\share\模型\部署相关\永辉金源广场店商品信息.xlsx"
xroot, xfilename = os.path.split(xpath)
xfile, ext = os.path.splitext(xfilename)
spath = os.path.join(xroot, xfile+'_diff.xlsx')
df = pd.read_excel(xpath)
barcodes = df["商品条码"].tolist()
names_caojq = df["商品名称"].tolist()
stdpath = r"\\192.168.1.28\share\数据\已完成数据\比对数据\barcode\all_totalBarocde\totalBarcode"
stdpath = Path(stdpath)
stdBarcodes = [int(f.stem) for f in stdpath.iterdir() if f.is_dir() and f.stem.isdigit() and len(f.stem)>=8]
barcodes_s = set(barcodes)
stdBarcodes_s = set(stdBarcodes)
A = barcodes_s - stdBarcodes_s
record_bcd, record_name = [], []
for bcd in A:
if np.isnan(bcd): continue
try:
index = barcodes.index(bcd)
name = names_caojq[index]
record_bcd.append(bcd)
record_name.append(name)
except ValueError:
print(f"元素 {bcd} 不在列表中")
df_save = pd.DataFrame({
'商品条码': record_bcd,
'商品名称': record_name
})
df.to_excel(spath, index=False)
print("Done")

View File

@ -364,6 +364,9 @@ def drawTrack(tracks, img):
annotator = TrackAnnotator(img, line_width=2) annotator = TrackAnnotator(img, line_width=2)
for track in tracks: for track in tracks:
if isinstance(track, np.ndarray):
annotator.plotting_track(track)
else:
annotator.plotting_track(track.boxes) annotator.plotting_track(track.boxes)
img = annotator.result() img = annotator.result()

View File

@ -202,9 +202,9 @@ def read_tracking_output(filepath):
if len(feats) != len(boxes): if len(feats) != len(boxes):
return np.array([]), np.array([]) return [np.array([])], [np.array([])]
return np.array(boxes), np.array(feats) return [np.array(boxes)], [np.array(feats)]
def read_deletedBarcode_file(filePath): def read_deletedBarcode_file(filePath):
@ -408,6 +408,7 @@ def read_similar(filePath):
if len(one2one_list): SimiDict['one2one'] = one2one_list if len(one2one_list): SimiDict['one2one'] = one2one_list
if len(one2n_list): SimiDict['one2n'] = one2n_list if len(one2n_list): SimiDict['one2n'] = one2n_list
if len(one2SN_list): SimiDict['one2SN'] = one2SN_list
return SimiDict return SimiDict
@ -532,13 +533,12 @@ def main():
break break
def main1(): def main1():
fpath = r'\\192.168.1.28\share\测试_202406\1101\images\20241101-140456-44dc75b5-c406-4cb2-8317-c4660bb727a3_6922130101355_6922130101355\process.data' fpath = r'\\192.168.1.28\share\测试视频数据以及日志\各模块测试记录\比对测试\1209永辉超市测试\20241209-155924-117e1941-70f8-4287-8de1-4866868548a6_6926475209967\process.data'
simidct = read_one2one_simi(fpath) simidct = read_similar(fpath)
print(simidct) print(simidct)
if __name__ == "__main__": if __name__ == "__main__":
# main()
main1() main1()
@ -552,3 +552,4 @@ if __name__ == "__main__":