guoqing bakeup

This commit is contained in:
王庆刚
2024-10-04 12:12:44 +08:00
parent 09e92d63b3
commit 390c5d2d94
37 changed files with 1409 additions and 219 deletions

View File

@ -1,453 +0,0 @@
# -*- coding: utf-8 -*-
"""
Created on Sat Jul ** 14:07:25 2024
现场测试精度、召回率分析程序,是 feat_select.py 的简化版,
但支持循环计算并输出总的pr曲线
@author: ym
"""
import os.path
import shutil
import numpy as np
import matplotlib.pyplot as plt
import cv2
from utils.plotting import Annotator, colors
import sys
sys.path.append(r"D:\DetectTracking")
from tracking.utils.read_data import extract_data, read_deletedBarcode_file, read_tracking_output
from tracking.utils.plotting import draw_tracking_boxes
def showHist(err, correct):
err = np.array(err)
correct = np.array(correct)
fig, axs = plt.subplots(2, 1)
axs[0].hist(err, bins=50, edgecolor='black')
axs[0].set_xlim([0, 1])
axs[0].set_title('err')
axs[1].hist(correct, bins=50, edgecolor='black')
axs[1].set_xlim([0, 1])
axs[1].set_title('correct')
# plt.show()
return plt
def show_recall_prec(recall, prec, ths):
# x = np.linspace(start=-0, stop=1, num=11, endpoint=True).tolist()
fig = plt.figure(figsize=(10, 6))
plt.plot(ths, recall, color='red', label='recall')
plt.plot(ths, prec, color='blue', label='PrecisePos')
plt.legend()
plt.xlabel(f'threshold')
# plt.ylabel('Similarity')
plt.grid(True, linestyle='--', alpha=0.5)
# plt.savefig('accuracy_recall_grid.png')
# plt.show()
# plt.close()
return plt
def compute_recall_precision(err_similarity, correct_similarity):
ths = np.linspace(0, 1, 51)
recall, prec = [], []
for th in ths:
TP = len([num for num in correct_similarity if num >= th])
FP = len([num for num in err_similarity if num >= th])
if (TP+FP) == 0:
prec.append(1)
recall.append(0)
else:
prec.append(TP / (TP + FP))
recall.append(TP / (len(err_similarity) + len(correct_similarity)))
return recall, prec, ths
# =============================================================================
# def read_tracking_output(filepath):
# boxes = []
# feats = []
# with open(filepath, 'r', encoding='utf-8') as file:
# for line in file:
# line = line.strip() # 去除行尾的换行符和可能的空白字符
#
# if not line:
# continue
#
# if line.endswith(','):
# line = line[:-1]
#
# data = np.array([float(x) for x in line.split(",")])
# if data.size == 9:
# boxes.append(data)
# if data.size == 256:
# feats.append(data)
#
# return np.array(boxes), np.array(feats)
# =============================================================================
def read_tracking_imgs(imgspath):
'''
input:
imgspath该路径中的图像为Yolo算法的输入图像640x512
output
imgs_0后摄图像根据 frameId 进行了排序
imgs_1前摄图像根据 frameId 进行了排序
'''
imgs_0, frmIDs_0, imgs_1, frmIDs_1 = [], [], [], []
for filename in os.listdir(imgspath):
file, ext = os.path.splitext(filename)
flist = file.split('_')
if len(flist)==4 and ext==".jpg":
camID, frmID = flist[0], int(flist[-1])
imgpath = os.path.join(imgspath, filename)
img = cv2.imread(imgpath)
if camID=='0':
imgs_0.append(img)
frmIDs_0.append(frmID)
if camID=='1':
imgs_1.append(img)
frmIDs_1.append(frmID)
if len(frmIDs_0):
indice = np.argsort(np.array(frmIDs_0))
imgs_0 = [imgs_0[i] for i in indice ]
if len(frmIDs_1):
indice = np.argsort(np.array(frmIDs_1))
imgs_1 = [imgs_1[i] for i in indice ]
return imgs_0, imgs_1
# =============================================================================
# def draw_tracking_boxes(imgs, tracks):
# '''tracks: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]
# 0 1 2 3 4 5 6 7 8
# 关键imgs中的次序和 track 中的 fid 对应
# '''
# subimgs = []
# for *xyxy, tid, conf, cls, fid, bid in tracks:
# label = f'id:{int(tid)}_{int(cls)}_{conf:.2f}'
#
# annotator = Annotator(imgs[int(fid-1)].copy())
# if cls==0:
# color = colors(int(cls), True)
# elif tid>0 and cls!=0:
# color = colors(int(tid), True)
# else:
# color = colors(19, True) # 19为调色板的最后一个元素
#
# pt2 = [p/2 for p in xyxy]
# annotator.box_label(pt2, label, color=color)
# img0 = annotator.result()
#
# subimgs.append(img0)
#
# return subimgs
# =============================================================================
def get_contrast_paths(pair, basepath):
assert(len(pair)==2 or len(pair)==3), "pair: seqdir, delete, barcodes"
getout_fold = pair[0] # 取出操作对应的文件夹
relvt_barcode = pair[1] # 取出操作对应放入操作的 Barcode
if len(pair)==3:
error_match = pair[2] # 取出操作错误匹配的 Barcode
else:
error_match = ''
getoutpath, inputpath, errorpath = '', '', ''
day, hms = getout_fold.strip('_').split('-')
input_folds, times = [], []
errmatch_folds, errmatch_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]==relvt_barcode and int(hms1)<int(hms):
input_folds.append(pathname)
times.append(int(hms1))
if day1==day and len(error_match) and infold[1]==error_match and int(hms1)<int(hms):
errmatch_folds.append(pathname)
errmatch_times.append(int(hms1))
''' 根据时间排序,选择离取出操作最近时间的文件夹,
作为取出操作应正确匹配的放入操作所对应的文件夹 '''
if len(input_folds):
indice = np.argsort(np.array(times))
input_fold = input_folds[indice[-1]]
inputpath = os.path.join(basepath, input_fold)
'''取出操作错误匹配的放入操作对应的文件夹'''
if len(errmatch_folds):
indice = np.argsort(np.array(errmatch_times))
errmatch_fold = errmatch_folds[indice[-1]]
errorpath = os.path.join(basepath, errmatch_fold)
'''放入事件文件夹地址、取出事件文件夹地址'''
getoutpath = os.path.join(basepath, getout_fold)
return getoutpath, inputpath, errorpath
def save_tracking_imgpairs(pair, basepath, savepath):
'''
basepath: 原始测试数据文件夹的路径
savepath: 保存的目标文件夹
'''
getoutpath, inputpath, errorpath = get_contrast_paths(pair, basepath)
if len(inputpath)==0:
return
'''==== 读取放入、取出事件对应的 Yolo输入的前后摄图像0后摄1前摄 ===='''
'''==== 读取放入、取出事件对应的 tracking 输出boxes, feats ===='''
if len(inputpath):
imgs_input_0, imgs_input_1 = read_tracking_imgs(inputpath)
input_data_0 = os.path.join(inputpath, '0_tracking_output.data')
input_data_1 = os.path.join(inputpath, '1_tracking_output.data')
boxes_input_0, feats_input_0 = read_tracking_output(input_data_0)
boxes_input_1, feats_input_1 = read_tracking_output(input_data_1)
ImgsInput_0 = draw_tracking_boxes(imgs_input_0, boxes_input_0)
ImgsInput_1 = draw_tracking_boxes(imgs_input_1, boxes_input_1)
if len(getoutpath):
imgs_getout_0, imgs_getout_1 = read_tracking_imgs(getoutpath)
getout_data_0 = os.path.join(getoutpath, '0_tracking_output.data')
getout_data_1 = os.path.join(getoutpath, '1_tracking_output.data')
boxes_output_0, feats_output_0 = read_tracking_output(getout_data_0)
boxes_output_1, feats_output_1 = read_tracking_output(getout_data_1)
ImgsGetout_0 = draw_tracking_boxes(imgs_getout_0, boxes_output_0)
ImgsGetout_1 = draw_tracking_boxes(imgs_getout_1, boxes_output_1)
if len(errorpath):
imgs_error_0, imgs_error_1 = read_tracking_imgs(errorpath)
error_data_0 = os.path.join(errorpath, '0_tracking_output.data')
error_data_1 = os.path.join(errorpath, '1_tracking_output.data')
boxes_error_0, feats_error_0 = read_tracking_output(error_data_0)
boxes_error_1, feats_error_1 = read_tracking_output(error_data_1)
ImgsError_0 = draw_tracking_boxes(imgs_error_0, boxes_error_0)
ImgsError_1 = draw_tracking_boxes(imgs_error_1, boxes_error_1)
savedir = pair[0] + pair[1]
if len(errorpath):
savedir = savedir + '_' + errorpath.split('_')[-1]
foldname = os.path.join(savepath, 'imgpairs', savedir)
if not os.path.exists(foldname):
os.makedirs(foldname)
for i, img in enumerate(ImgsInput_0):
imgpath = os.path.join(foldname, f'input_0_{i}.png')
cv2.imwrite(imgpath, img)
for i, img in enumerate(ImgsInput_1):
imgpath = os.path.join(foldname, f'input_1_{i}.png')
cv2.imwrite(imgpath, img)
for i, img in enumerate(ImgsGetout_0):
imgpath = os.path.join(foldname, f'getout_0_{i}.png')
cv2.imwrite(imgpath, img)
for i, img in enumerate(ImgsGetout_1):
imgpath = os.path.join(foldname, f'getout_1_{i}.png')
cv2.imwrite(imgpath, img)
for i, img in enumerate(ImgsError_0):
imgpath = os.path.join(foldname, f'errMatch_0_{i}.png')
cv2.imwrite(imgpath, img)
for i, img in enumerate(ImgsError_1):
imgpath = os.path.join(foldname, f'errMatch_1_{i}.png')
cv2.imwrite(imgpath, img)
# def performance_evaluate(all_list, isshow=False):
# corrpairs, correct_barcode_list, correct_similarity, errpairs, err_barcode_list, err_similarity = [], [], [], [], [], []
# for s_list in all_list:
# seqdir = s_list['SeqDir'].strip()
# delete = s_list['Deleted'].strip()
# barcodes = [s.strip() for s in s_list['barcode']]
# similarity = [float(s.strip()) for s in s_list['similarity']]
# if delete in barcodes[:1]:
# corrpairs.append((seqdir, delete))
# correct_barcode_list.append(delete)
# correct_similarity.append(similarity[0])
# else:
# errpairs.append((seqdir, delete, barcodes[0]))
# err_barcode_list.append(delete)
# err_similarity.append(similarity[0])
def performance_evaluate(all_list, isshow=False):
corrpairs, correct_barcode_list, correct_similarity, errpairs, err_barcode_list, err_similarity = [], [], [], [], [], []
for s_list in all_list:
seqdir = s_list['SeqDir'].strip()
delete = s_list['Deleted'].strip()
barcodes = [s.strip() for s in s_list['barcode']]
similarity_comp, similarity_front = [], []
for simil in s_list['similarity']:
ss = [float(s.strip()) for s in simil.split(',')]
similarity_comp.append(ss[0])
if len(ss)==3:
similarity_front.append(ss[2])
if len(similarity_front):
similarity = [s for s in similarity_front]
else:
similarity = [s for s in similarity_comp]
index = similarity.index(max(similarity))
matched_barcode = barcodes[index]
if matched_barcode == delete:
corrpairs.append((seqdir, delete))
correct_barcode_list.append(delete)
correct_similarity.append(max(similarity))
else:
errpairs.append((seqdir, delete, matched_barcode))
err_barcode_list.append(delete)
err_similarity.append(max(similarity))
'''3. 计算比对性能 '''
if isshow:
recall, prec, ths = compute_recall_precision(err_similarity, correct_similarity)
show_recall_prec(recall, prec, ths)
showHist(err_similarity, correct_similarity)
return errpairs, corrpairs, err_similarity, correct_similarity
def contrast_analysis(del_barcode_file, basepath, savepath, saveimgs=False):
'''
del_barcode_file: 测试数据文件,利用该文件进行算法性能分析
'''
'''1. 读取 deletedBarcode 文件 '''
all_list = read_deletedBarcode_file(del_barcode_file)
'''2. 算法性能评估,并输出 (取出,删除, 错误匹配) 对 '''
errpairs, corrpairs, _, _ = performance_evaluate(all_list)
'''3. 获取 (取出,删除, 错误匹配) 对应路径,保存相应轨迹图像'''
relative_paths = []
for errpair in errpairs:
GetoutPath, InputPath, ErrorPath = get_contrast_paths(errpair, basepath)
relative_paths.append((GetoutPath, InputPath, ErrorPath))
if saveimgs:
save_tracking_imgpairs(errpair, basepath, savepath)
return relative_paths
def contrast_loop(fpath):
savepath = r'\\192.168.1.28\share\测试_202406\deletedBarcode\illustration'
# savepath = r'D:\contrast\dataset\1_to_n\illustration'
if not os.path.exists(savepath):
os.mkdir(savepath)
if os.path.isfile(fpath):
fpath, filename = os.path.split(fpath)
BarLists, blists = {}, []
for filename in os.listdir(fpath):
file = os.path.splitext(filename)[0][15:]
filepath = os.path.join(fpath, filename)
blist = read_deletedBarcode_file(filepath)
BarLists.update({file: blist})
blists.extend(blist)
BarLists.update({file: blist})
BarLists.update({"Total": blists})
for file, blist in BarLists.items():
errpairs, corrpairs, err_similarity, correct_similarity = performance_evaluate(blist)
recall, prec, ths = compute_recall_precision(err_similarity, correct_similarity)
plt1 = show_recall_prec(recall, prec, ths)
# plt1.show()
plt1.xlabel(f'threshold, Num: {len(blist)}')
plt1.savefig(os.path.join(savepath, file+'_pr.png'))
# plt1.close()
# plt2 = showHist(err_similarity, correct_similarity)
# plt2.show()
# plt2.savefig(os.path.join(savepath, file+'_hist.png'))
# plt.close()
def main():
fpath = r'\\192.168.1.28\share\测试_202406\deletedBarcode\other'
contrast_loop(fpath)
def main1():
del_barcode_file = r'\\192.168.1.28\share\测试_202406\709\deletedBarcode.txt'
basepath = r'\\192.168.1.28\share\测试_202406\709'
savepath = r'D:\contrast\dataset\result'
try:
relative_path = contrast_analysis(del_barcode_file, basepath, savepath)
except Exception as e:
print(f'Error Type: {e}')
if __name__ == '__main__':
main()
# main1()

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 30 17:53:03 2024
have Deprecated!
1. 确认在相同CamerType下track.data CamerID 项数量 = 图像数 = 帧ID数 = 最大帧ID

View File

@ -15,12 +15,15 @@ import pandas as pd
import shutil
import random
import math
import sys
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
from pathlib import Path
from utils.gen import Profile
sys.path.append(r"D:\DetectTracking\tracking")
from dotrack.dotracks_back import doBackTracks
from dotrack.dotracks_front import doFrontTracks
from utils.drawtracks import plot_frameID_y2, draw_all_trajectories

View File

@ -8,10 +8,11 @@ import numpy as np
import cv2
from pathlib import Path
from scipy.spatial.distance import cdist
from utils.mergetrack import track_equal_track, readDict
from tracking.utils.mergetrack import track_equal_track, readDict
curpath = Path(__file__).resolve().parents[0]
curpath = Path(curpath)
parpath = curpath.parent
class MoveState:
"""商品运动状态标志"""
@ -297,11 +298,15 @@ class Track:
front, 前置摄像头
'''
if camerType=="back":
incart = cv2.imread("./shopcart/cart_tempt/incart.png", cv2.IMREAD_GRAYSCALE)
outcart = cv2.imread("./shopcart/cart_tempt/outcart.png", cv2.IMREAD_GRAYSCALE)
incart = cv2.imread(str(parpath/'shopcart/cart_tempt/incart.png'), cv2.IMREAD_GRAYSCALE)
outcart = cv2.imread(str(parpath/'shopcart/cart_tempt/outcart.png'), cv2.IMREAD_GRAYSCALE)
else:
incart = cv2.imread("./shopcart/cart_tempt/incart_ftmp.png", cv2.IMREAD_GRAYSCALE)
outcart = cv2.imread("./shopcart/cart_tempt/outcart_ftmp.png", cv2.IMREAD_GRAYSCALE)
incart = cv2.imread(str(parpath/'shopcart/cart_tempt/incart_ftmp.png'), cv2.IMREAD_GRAYSCALE)
outcart = cv2.imread(str(parpath/'shopcart/cart_tempt/outcart_ftmp.png'), cv2.IMREAD_GRAYSCALE)
# incart = cv2.imread('./cart_tempt/incart_ftmp.png', cv2.IMREAD_GRAYSCALE)
# outcart = cv2.imread('./cart_tempt/outcart_ftmp.png', cv2.IMREAD_GRAYSCALE)
xc, yc = self.cornpoints[:,0].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,1].clip(0,self.imgshape[1]-1).astype(np.int64)
x1, y1 = self.cornpoints[:,6].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,7].clip(0,self.imgshape[1]-1).astype(np.int64)

View File

@ -5,7 +5,7 @@ Created on Mon Mar 4 18:36:31 2024
@author: ym
"""
import numpy as np
from utils.mergetrack import track_equal_track
from tracking.utils.mergetrack import track_equal_track
from scipy.spatial.distance import cdist
from .dotracks import doTracks, ShoppingCart
from .track_back import backTrack

View File

@ -5,7 +5,7 @@ Created on Mon Mar 4 18:38:20 2024
@author: ym
"""
import numpy as np
from utils.mergetrack import track_equal_track
# from tracking.utils.mergetrack import track_equal_track
from .dotracks import doTracks
from .track_front import frontTrack

View File

@ -10,6 +10,10 @@ from scipy.spatial.distance import cdist
from sklearn.decomposition import PCA
from .dotracks import MoveState, Track
from pathlib import Path
curpath = Path(__file__).resolve().parents[0]
curpath = Path(curpath)
parpath = curpath.parent
class backTrack(Track):
# boxes: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]
@ -93,9 +97,9 @@ class backTrack(Track):
maxbox_iou, minbox_ioutrack中最大、最小 box 和boxes流的iou二者差值越小越接近 1表明track的运动型越小。
incartrates: 各box和incart的iou时序由小变大反应的是置入过程由大变小反应的是取出过程
'''
incart = cv2.imread("./shopcart/cart_tempt/incart.png", cv2.IMREAD_GRAYSCALE)
outcart = cv2.imread("./shopcart/cart_tempt/outcart.png", cv2.IMREAD_GRAYSCALE)
cartboarder = cv2.imread("./shopcart/cart_tempt/cartboarder.png", cv2.IMREAD_GRAYSCALE)
incart = cv2.imread(str(parpath/"shopcart/cart_tempt/incart.png"), cv2.IMREAD_GRAYSCALE)
outcart = cv2.imread(str(parpath/"shopcart/cart_tempt/outcart.png"), cv2.IMREAD_GRAYSCALE)
cartboarder = cv2.imread(str(parpath/"shopcart/cart_tempt/cartboarder.png"), cv2.IMREAD_GRAYSCALE)
incartrates = []
temp = np.zeros(incart.shape, np.uint8)

View File

@ -1,433 +0,0 @@
# -*- 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 compute_recall_precision, show_recall_prec
from tracking.contrast_analysis import performance_evaluate
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
back_sole_boxes后摄boxes
front_sole_boxes前摄boxes
back_sole_feats后摄特征
front_sole_feats前摄特征
feats_compose将前后摄特征进行合并
feats_select特征选择优先选择前摄特征
'''
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)
# '''读取 track.data 文件中的数据'''
# fpath_0_track = os.path.join(datapath, '0_track.data')
# fpath_1_track = os.path.join(datapath, '1_track.data')
# if os.path.exists(fpath_0_track) and os.path.isfile(fpath_0_track):
# _, _, _, _, tracking_boxes, tracking_feat_dict = extract_data(fpath_0_track)
# event['back_tracking_boxes'] = tracking_boxes
# event['back_tracking_feats'] = tracking_feat_dict
# if os.path.exists(fpath_1_track) and os.path.isfile(fpath_1_track):
# _, _, _, _, tracking_boxes, tracking_feat_dict = extract_data(fpath_1_track)
# event['front_tracking_boxes'] = tracking_boxes
# event['front_tracking_feats'] = tracking_feat_dict
# =============================================================================
# '''================1. 直接指定读取,速度快======================================'''
# '''读取 tracking_output.data 文件中的数据'''
# fpath_0_tracking = os.path.join(datapath, '0_tracking_output.data')
# fpath_1_tracking = os.path.join(datapath, '1_tracking_output.data')
# if os.path.exists(fpath_0_tracking) and os.path.isfile(fpath_0_tracking):
# tracking_output_boxes, tracking_output_feats = read_tracking_output(fpath_0_tracking)
# event['back_sole_boxes'] = tracking_output_boxes
# event['back_sole_feats'] = tracking_output_feats
#
# if os.path.exists(fpath_1_tracking) and os.path.isfile(fpath_1_tracking):
# tracking_output_boxes, tracking_output_feats = read_tracking_output(fpath_1_tracking)
# event['front_sole_boxes'] = tracking_output_boxes
# event['front_sole_feats'] = tracking_output_feats
# =============================================================================
'''================2. 遍历方式读取(与以上方式二选一)======================================'''
'''读取当前事件的 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):
'''
生成deletedBarcodeTest.txt
'''
# filepath = r'\\192.168.1.28\share\测试_202406\0723\0723_1\deletedBarcode.txt'
basepath, _ = os.path.split(filepath)
bcdlist = read_deletedBarcode_file(filepath)
MatchList = []
k = 0
for s_list in bcdlist:
getout_fold = s_list['SeqDir'].strip()
getout_path = os.path.join(basepath, getout_fold)
'''取出事件文件夹不存在,跳出循环'''
if not os.path.exists(getout_path) and not os.path.isdir(getout_path):
continue
day, hms = getout_fold.strip('_').split('-')
''' 生成取出事件字典 '''
getout_event = {}
getout_event['barcode'] = s_list['Deleted'].strip()
getout_event['path'] = getout_path
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
if len(infold[0])<=14 or len(infold[1])<=10: continue
day1, hms1 = infold[0].split('-')
if day1==day and infold[1]==barcode and int(hms1)<int(hms):
input_folds.append(pathname)
times.append(int(hms1))
if len(input_folds)==0: continue
''' 根据时间排序,选择离取出操作最近时间的文件夹,作为取出操作应的放入操作所对应的文件夹 '''
input_fold = input_folds[times.index(max(times))]
input_path = os.path.join(basepath, input_fold)
if not os.path.exists(getout_path) and not os.path.isdir(getout_path):
continue
input_event['barcode'] = barcode
input_event['path'] = input_path
input_event['similarity'] = float(similarity[i])
input_event['feats_compose'] = np.empty((0, 256), dtype=np.float64)
input_event['feats_select'] = np.empty((0, 256), dtype=np.float64)
InputList.append(input_event)
MatchList.append((getout_event, InputList))
# k += 1
# if k==2:
# break
print('Step 1: Event init Done!')
for getout_event, InputList in MatchList:
getout_path = getout_event['path']
if os.path.exists(getout_path) and os.path.isdir(getout_path):
event = update_event(getout_path)
getout_event.update(event)
'''====== 放入事件是在取出事件存在的情况下分析 ======'''
for input_event in InputList:
input_path = input_event['path']
if os.path.exists(input_path) and os.path.isdir(input_path):
event = update_event(input_path)
input_event.update(event)
print('Step 2: Event update Done!')
results = []
for getout_event, InputList in MatchList:
getout_barcode = getout_event['barcode']
getout_feats_compose = getout_event['feats_compose']
getout_feats_select = getout_event['feats_select']
if len(getout_feats_select):
outfeats_select = getout_feats_select.copy()
else:
outfeats_select = getout_feats_compose.copy()
result = {}
result['SeqDir'] = os.path.split(getout_event['path'])[1]
result['Deleted'] = getout_barcode
result['List'] = {}
for input_event in InputList:
input_barcode = input_event['barcode']
input_feats_compose = input_event['feats_compose']
input_feats_select = input_event['feats_select']
if len(input_feats_select):
infeats_select = input_feats_select.copy()
else:
infeats_select = input_feats_compose.copy()
similar_comp = compute_similar(getout_feats_compose, input_feats_compose)
similar_selt = compute_similar(outfeats_select, infeats_select)
'''现场测试相似度,组合特征相似度,前摄选择特征相似度'''
result['List'][f'{input_barcode}'] = (input_event['similarity'], similar_comp, similar_selt)
# result[f'{input_barcode}'] = (input_event['similarity'], similar_comp, similar_selt)
results.append(result)
print('Step 3: Similarity conputation Done!')
wpath = os.path.split(filepath)[0]
wfile = os.path.join(wpath, 'deletedBarcodeTest.txt')
with open(wfile, 'w', encoding='utf-8') as file:
for result in results:
SeqDir = result['SeqDir']
Deleted = result['Deleted']
file.write('\n')
file.write(f'SeqDir: {SeqDir}\n')
file.write(f'Deleted: {Deleted}\n')
file.write('List:\n')
for key, value in result['List'].items():
file.write(f'{key}: ')
file.write(f'{value[0]}, {value[1]:.3f}, {value[2]:.3f}\n')
print('Step 4: File writting Done!')
def precision_compare(filepath, savepath):
'''
1. deletedBarcode.txt 中的相似度的计算为现场算法前后摄轨迹特征合并
2. deletedBarcodeTest.txt 中的 3 个相似度计算方式依次为:
(1)现场算法前后摄轨迹特征合并;
(2)本地算法前后摄轨迹特征合并;
(3)本地算法优先选择前摄
'''
fpath = os.path.split(filepath)[0]
_, basefile = os.path.split(fpath)
'''1. 综合前后摄特征的相似度比对性能'''
fpath1 = os.path.join(fpath, 'deletedBarcode.txt')
blist1 = read_deletedBarcode_file(fpath1)
errpairs, corrpairs, err_similarity, correct_similarity = performance_evaluate(blist1)
recall, prec, ths = compute_recall_precision(err_similarity, correct_similarity)
os.path.split(fpath1)
plt1 = show_recall_prec(recall, prec, ths)
# plt1.show()
plt1.xlabel(f'threshold, Num: {len(blist1)}')
plt1.title(basefile + ', compose')
plt1.savefig(os.path.join(savepath, basefile+'_pr.png'))
plt1.close()
'''2. 优先选取前摄特征的相似度比对性能'''
fpath2 = os.path.join(fpath, 'deletedBarcodeTest.txt')
blist2 = read_deletedBarcode_file(fpath2)
front_errpairs, front_corrpairs, front_err_similarity, front_correct_similarity = performance_evaluate(blist2)
front_recall, front_prec, front_ths = compute_recall_precision(front_err_similarity, front_correct_similarity)
plt2 = show_recall_prec(front_recall, front_prec, front_ths)
# plt2.show()
plt2.xlabel(f'threshold, Num: {len(blist2)}')
plt1.title(basefile + ', front')
plt2.savefig(os.path.join(savepath, basefile+'_pr_front.png'))
plt2.close()
def main():
'''
1. 成deletedBarcodeTest.txt
2. 不同特征选择下的精度比对性能比较
'''
fplist = [#r'\\192.168.1.28\share\测试_202406\0723\0723_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0723\0723_2\deletedBarcode.txt',
r'\\192.168.1.28\share\测试_202406\0723\0723_3\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0722\0722_01\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0722\0722_02\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0719\719_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0719\719_2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0719\719_3\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0719\719_4\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0718\0718-1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0718\0718-2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0717\0717-1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0717\0717-2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0717\0717-3\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0716\0716_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0716\0716_2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0716\0716_3\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0715\0715_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0715\0715_2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0715\0715_3\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0712\0712_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\0712\0712_2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\711\images01\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\711\images02\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\710\images_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\710\images_2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\709\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\705\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\703\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\702_pm_1\702_pm_1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\702_pm_3\702_pm_3\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\701_am\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\701_pm\701_pm\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\628\1\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\628\2\deletedBarcode.txt',
# r'\\192.168.1.28\share\测试_202406\627\deletedBarcode.txt',
]
savepath = r'\\192.168.1.28\share\测试_202406\deletedBarcode\illustration'
for filepath in fplist:
try:
#1. 生成deletedBarcodeTest.txt 文件
creatd_deletedBarcode_front(filepath)
#2. 确保该目录下存在deletedBarcode.txt, deletedBarcodeTest.txt 文件
precision_compare(filepath, savepath)
except Exception as e:
print(f'{filepath}, Error: {e}')
if __name__ == '__main__':
main()

View File

@ -98,13 +98,10 @@ def read_imgs(imgspath, CamerType):
flist = file.split('_')
if len(flist)==4 and ext in ImgFormat:
camID, frmID = flist[0], int(flist[-1])
imgpath = os.path.join(imgspath, filename)
img = cv2.imread(imgpath)
if camID==CamerType:
img = cv2.imread(os.path.join(imgspath, filename))
imgs.append(img)
frmIDs.append(frmID)
if len(frmIDs):
indice = np.argsort(np.array(frmIDs))
imgs = [imgs[i] for i in indice]
@ -227,7 +224,7 @@ def do_tracking(fpath, savedir, event_name='images'):
'''4.2 在 imgs 上画框并保存'''
imgs_dw = draw_tracking_boxes(imgs, trackerboxes)
for fid, img in imgs_dw:
img_savepath = os.path.join(save_dir, CamerType + "_fid_" + f"{fid}.png")
img_savepath = os.path.join(save_dir, CamerType + "_fid_" + f"{int(fid)}.png")
cv2.imwrite(img_savepath, img)
'''4.3.2 保存轨迹选择对应的子图'''
@ -238,7 +235,7 @@ def do_tracking(fpath, savedir, event_name='images'):
x1, y1, x2, y2 = int(xyxy[0]/2), int(xyxy[1]/2), int(xyxy[2]/2), int(xyxy[3]/2)
subimg = img[y1:y2, x1:x2]
subimg_path = os.path.join(subimg_dir, f'{CamerType}_tid{int(tid)}_{int(fid-1)}_{int(bid)}.png' )
subimg_path = os.path.join(subimg_dir, f'{CamerType}_tid{int(tid)}_{int(fid)}_{int(bid)}.png' )
cv2.imwrite(subimg_path, subimg)
# for track in tracking_output_boxes:
# for *xyxy, tid, conf, cls, fid, bid in track:
@ -270,8 +267,9 @@ def tracking_simulate(eventpath, savepath):
# else:
# return
# =============================================================================
enent_name = os.path.basename(eventpath)[:15]
bname = os.path.basename(eventpath)
idx = bname.find('2024')
enent_name = bname[idx:(idx+15)]
'''2. 依次读取 0/1_track.data 中数据,进行仿真'''
illu_tracking, illu_select = [], []
@ -289,7 +287,9 @@ def tracking_simulate(eventpath, savepath):
if img_tracking is not None:
illu_tracking.append(img_tracking)
'''3. 前、后摄原始轨迹、本地tracking输出、现场算法轨迹选择前、后共幅8图'''
'''3. 共幅8图上下子图显示的是前后摄每一行4个子图分别为
(1) tracker输出原始轨迹; (2)本地tracking输出; (3)现场算法轨迹选择前轨迹; (4)现场算法轨迹选择后的轨迹
'''
if len(illu_select)==2:
Img_s = np.concatenate((illu_select[0], illu_select[1]), axis = 0)
H, W = Img_s.shape[:2]
@ -307,15 +307,15 @@ def tracking_simulate(eventpath, savepath):
Img_t = illu_tracking[0]
else:
Img_t = None
'''3.1 单独另存保存完好的 8 轨迹图'''
basepath, _ = os.path.split(savepath)
trajpath = os.path.join(basepath, 'trajs')
if not os.path.exists(trajpath):
os.makedirs(trajpath)
traj_path = os.path.join(trajpath, enent_name+'.png')
imgpath_tracking = os.path.join(savepath, enent_name + '_ing.png')
imgpath_select = os.path.join(savepath, enent_name + '_slt.png')
imgpath_ts = os.path.join(savepath, enent_name + '_ts.png')
@ -327,9 +327,9 @@ def tracking_simulate(eventpath, savepath):
cv2.imwrite(imgpath_ts, Img_ts)
cv2.imwrite(traj_path, Img_ts)
else:
if Img_s: cv2.imwrite(imgpath_select, Img_s)
if Img_t: cv2.imwrite(imgpath_tracking, Img_t)
if Img_s: cv2.imwrite(imgpath_select, Img_s) # 不会执行到该处
if Img_t: cv2.imwrite(imgpath_tracking, Img_t) # 不会执行到该处
@ -382,11 +382,13 @@ def main():
eventPaths: data文件地址该 data 文件包括 Pipeline 各模块输出
SavePath: 包含二级目录,一级目录为轨迹图像;二级目录为与data文件对应的序列图像存储地址。
'''
eventPaths = r'\\192.168.1.28\share\测试_202406\0723\0723_3'
# eventPaths = r'\\192.168.1.28\share\测试_202406\0723\0723_3'
eventPaths = r"D:\DetectTracking\tracking\images"
savePath = r'D:\contrast\dataset\result'
k=0
for pathname in os.listdir(eventPaths):
pathname = "20240723-163121_6925282237668"
pathname = "20240925-142635-3e3cb61a-8bbe-45f2-aed7-a40de7f2d624_6924743924161"
eventpath = os.path.join(eventPaths, pathname)
savepath = os.path.join(savePath, pathname)

View File

@ -80,14 +80,14 @@ def save_subimgs(vts, file, TracksDict):
cv2.imwrite(str(imgdir) + f"/{tid}_{fid}_{bid}.png", img)
def have_tracked():
trackdict = r'./data/trackdicts_20240608'
trackdict = r'./data/trackdicts'
alltracks = []
k = 0
gt = Profile()
for filename in os.listdir(trackdict):
# filename = 'test_20240402-173935_6920152400975_back_174037372.pkl'
filename = '6907149227609_20240508-174733_back_returnGood_70f754088050_425_17327712807.pkl'
filename = '6907149227609_20240508-174733_front_returnGood_70f754088050_425_17327712807.pkl'
# filename = '6907149227609_20240508-174733_back_returnGood_70f754088050_425_17327712807.pkl'
# filename = '6907149227609_20240508-174733_front_returnGood_70f754088050_425_17327712807.pkl'
file, ext = os.path.splitext(filename)
filepath = os.path.join(trackdict, filename)
@ -119,11 +119,14 @@ def have_tracked():
save_subimgs(vts, file, TracksDict)
edgeline = cv2.imread("./shopcart/cart_tempt/edgeline.png")
img_tracking = draw_all_trajectories(vts, edgeline, save_dir, file)
trackpath = save_dir.joinpath(f'{file}.png')
cv2.imwrite(str(trackpath), img_tracking)
print(file+f" need time: {gt.dt:.2f}s")
k += 1
if k==1:
break
# k += 1
# if k==1:
# break
if len(alltracks):
drawFeatures(alltracks, save_dir)

View File

@ -333,7 +333,7 @@ def draw_tracking_boxes(imgs, tracks, scale=2):
annotator.box_label(pt2, label, color=color)
img = annotator.result()
subimgs.append((fid-1, img))
subimgs.append((fid, img))
return subimgs

View File

@ -79,18 +79,21 @@ def extract_data(datapath):
feats.append(str_to_float_arr(feat))
if line.find("output_box:") >= 0:
box = str_to_float_arr(line[line.find("output_box:") + 11:].strip())
tboxes.append(box) # 去掉'output_box:'并去除可能的空白字符
index = find_samebox_in_array(boxes, box)
assert(len(boxes)>=0 and len(boxes)==len(feats)), f"{datapath}, {datapath}, len(boxes)!=len(feats)"
assert(len(boxes)==len(feats)), f"{datapath}, {datapath}, len(boxes)!=len(feats)"
box = str_to_float_arr(line[line.find("output_box:") + 11:].strip())
index = find_samebox_in_array(boxes, box)
if index >= 0:
tboxes.append(box) # 去掉'output_box:'并去除可能的空白字符
# feat_f = str_to_float_arr(input_feats[index])
feat_f = feats[index]
norm_f = np.linalg.norm(feat_f)
feat_f = feat_f / norm_f
tfeats.append(feat_f)
if len(boxes): bboxes.append(np.array(boxes))
if len(feats): ffeats.append(np.array(feats))
if len(tboxes): trackerboxes = np.concatenate((trackerboxes, np.array(tboxes)))

View File

@ -80,13 +80,12 @@ def videosave(bboxes, videopath="100_1688009697927.mp4"):
cap.release()
def main():
videopath = r'\\192.168.1.28\share\测试_202406\0822\A_1724314806144'
videopath = r'D:\videos'
savepath = r'D:\videos'
videopath = r'D:\datasets\ym'
savepath = r'D:\datasets\ym'
# video2imgs(videopath, savepath)
k = 0
for filename in os.listdir(videopath):
# filename = "20240822-163506_88e6409d-f19b-4e97-9f01-b3fde259cbff.ts"
filename = "20240929-155533.ts"
file, ext = os.path.splitext(filename)
if ext not in VideoFormat:

View File

@ -1,36 +0,0 @@
tracking_test.py
have_tracked():
轨迹分析测试。遍历track_reid.py输出的文件夹trackdict下的所有.pkl文件。
time_test.py
统计Pipeline整体流程中各模块耗时
module_analysis.py
main():
遍历文件夹下的每一个子文件夹对子文件夹执行tracking_simulate() 函数;
main_loop()
(1) 根据 deletedBarcode.txt 生成事件对,并利用事件对生成存储地址
(2) 调用 tracking_simulate() 函数
tracking_simulate(eventpath, savepath)
(1) 根据event_names获取事件名enent_name
(2) 遍历并执行 eventpath 文件夹下的 0_track.data、1_track.data 文件并调用do_tracking() 执行
(3) 将前后摄、本地与现场工8幅子图合并为1幅大图。
do_tracking(fpath, savedir, event_name='images')
enentmatch.py
1:n 模拟测试have Deprecated!
contrast_analysis.py
1:n 现场测试评估。
main():
循环读取不同文件夹中的 deletedBarcode.txt合并评估。
main1():
指定deletedBarcode.txt进行1:n性能评估
feat_select.py
以下两种特征选择策略下的比对性能比较
(1) 现场算法前后摄特征组合;
(2) 本地算法优先选择前摄特征;