172 lines
5.0 KiB
Python
172 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
取出再放回场景下商品轨迹特征比对方式与性能分析
|
|
|
|
Created on Tue Apr 1 17:17:47 2025
|
|
@author: wqg
|
|
"""
|
|
import os
|
|
import pickle
|
|
import random
|
|
import numpy as np
|
|
from pathlib import Path
|
|
import matplotlib.pyplot as plt
|
|
from scipy.spatial.distance import cdist
|
|
from utils.calsimi import calsiml, calsimi_vs_evts
|
|
|
|
def read_eventdict(evtpaths):
|
|
evtDict = {}
|
|
for filename in os.listdir(evtpaths):
|
|
evtname, ext = os.path.splitext(filename)
|
|
if ext != ".pickle": continue
|
|
|
|
evtpath = os.path.join(evtpaths, filename)
|
|
with open(evtpath, 'rb') as f:
|
|
evtdata = pickle.load(f)
|
|
evtDict[evtname] = evtdata
|
|
|
|
|
|
return evtDict
|
|
|
|
|
|
|
|
def compute_show_pr(Same, Cross):
|
|
TPFN = len(Same)
|
|
TNFP = len(Cross)
|
|
|
|
Recall_Pos, Recall_Neg = [], []
|
|
Precision_Pos, Precision_Neg = [], []
|
|
Correct = []
|
|
Thresh = np.linspace(-0.2, 1, 100)
|
|
for th in Thresh:
|
|
TP = np.sum(Same >= th)
|
|
FN = np.sum(Same < th)
|
|
# FN = TPFN - TP
|
|
|
|
TN = np.sum(Cross < th)
|
|
FP = np.sum(Cross >= th)
|
|
# FP = TNFP - TN
|
|
|
|
|
|
Precision_Pos.append(TP/(TP+FP+1e-6))
|
|
Precision_Neg.append(TN/(TN+FN+1e-6))
|
|
Recall_Pos.append(TP/(TP+FN+1e-6))
|
|
Recall_Neg.append(TN/(TN+FP+1e-6))
|
|
|
|
# Recall_Pos.append(TP/TPFN)
|
|
# Recall_Neg.append(TN/TNFP)
|
|
|
|
|
|
Correct.append((TN+TP)/(TPFN+TNFP))
|
|
|
|
fig, ax = plt.subplots()
|
|
|
|
ax.plot(Thresh, Precision_Pos, 'r', label='Precision_Pos: TP/(TP+FP)')
|
|
ax.plot(Thresh, Recall_Pos, 'b', label='Recall_Pos: TP/TPFN')
|
|
ax.plot(Thresh, Recall_Neg, 'g', label='Recall_Neg: TN/TNFP')
|
|
ax.plot(Thresh, Correct, 'c', label='Correct: (TN+TP)/(TPFN+TNFP)')
|
|
ax.plot(Thresh, Precision_Neg, 'm', label='Precision_Neg: TN/(TN+FN)')
|
|
|
|
ax.set_xlim([0, 1])
|
|
ax.set_ylim([0, 1])
|
|
|
|
ax.set_xticks(np.arange(0, 1, 0.1))
|
|
ax.set_yticks(np.arange(0, 1, 0.1))
|
|
ax.grid(True, linestyle='--')
|
|
|
|
ax.set_title('PrecisePos & PreciseNeg')
|
|
ax.set_xlabel(f"Same Num: {TPFN}, Cross Num: {TNFP}")
|
|
ax.legend()
|
|
plt.show()
|
|
|
|
# rltpath = os.path.join(similPath, f'pr_1to1_{simType}.png')
|
|
# plt.savefig(rltpath) # svg, png, pdf
|
|
|
|
|
|
fig, axes = plt.subplots(2,1)
|
|
axes[0].hist(Same, bins=60, range=(-0.2, 1), edgecolor='black')
|
|
axes[0].set_xlim([-0.2, 1])
|
|
axes[0].set_title(f'TP({len(Same)})')
|
|
|
|
axes[1].hist(Cross, bins=60, range=(-0.2, 1), edgecolor='black')
|
|
axes[1].set_xlim([-0.2, 1])
|
|
axes[1].set_title(f'TN({len(Cross)})')
|
|
|
|
# rltpath = os.path.join(similPath, f'hist_1to1_{simType}.png')
|
|
# plt.savefig(rltpath)
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
def trail_to_trail(evtpaths, rltpaths):
|
|
# select the method type of how to calculate the feat similarity of trail
|
|
simType = 2
|
|
|
|
##1. read all the ShoppingEvent object in the dir 'evtpaths'
|
|
evtDicts = read_eventdict(evtpaths)
|
|
|
|
##2. Combine event object with the same barcode
|
|
barcodes, evtpairDict = [], {}
|
|
for k in evtDicts.keys():
|
|
evt = k.split('_')
|
|
condt = len(evt)>=2 and evt[-1].isdigit() and len(evt[-1])>=10
|
|
if not condt: continue
|
|
|
|
barcode = evt[-1]
|
|
if barcode not in evtpairDict.keys():
|
|
evtpairDict[barcode] = []
|
|
barcodes.append(barcode)
|
|
|
|
evtpairDict[barcode].append(evtDicts[k])
|
|
barcodes = set(barcodes)
|
|
|
|
AA_list, AB_list = [], []
|
|
for barcode in evtpairDict.keys():
|
|
events = evtpairDict[barcode]
|
|
if len(events)>1:
|
|
evta, evtb = random.sample(events, 2)
|
|
AA_list.append((evta, evtb, "same"))
|
|
|
|
evtc = random.sample(events, 1)[0]
|
|
|
|
dset = list(barcodes.symmetric_difference(set([barcode])))
|
|
bcd = random.sample(dset, 1)[0]
|
|
evtd = random.sample(evtpairDict[bcd], 1)[0]
|
|
AB_list.append((evtc, evtd, "diff"))
|
|
|
|
mergePairs = AA_list + AB_list
|
|
|
|
##3. calculate the similar of two event: evta, evtb
|
|
new_pirs = []
|
|
for evta, evtb, label in mergePairs:
|
|
similar = calsimi_vs_evts(evta, evtb, simType)
|
|
if similar is None:
|
|
continue
|
|
new_pirs.append((label, round(similar, 3), evta.evtname[:15], evtb.evtname[:15]))
|
|
|
|
##4. compute PR and showing
|
|
Same = np.array([s for label, s, _, _ in new_pirs if label=="same"])
|
|
Cross = np.array([s for label, s, _, _ in new_pirs if label=="diff"])
|
|
compute_show_pr(Same, Cross)
|
|
|
|
|
|
def main():
|
|
evttypes = ["single_event_V10", "single_event_V5", "performence_V10", "performence_V5"]
|
|
# evttypes = ["single_event_V10"]
|
|
|
|
for evttype in evttypes:
|
|
evtpaths = "/home/wqg/dataset/pipeline/contrast/{}/evtobjs/".format(evttype)
|
|
rltpaths = "/home/wqg/dataset/pipeline/yrt/{}/yolos_tracking".format(evttype)
|
|
|
|
trail_to_trail(evtpaths, rltpaths)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
|
|
|