Files
detecttracking/contrast/stdfeat_analys.py
2024-12-05 10:23:03 +08:00

160 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 20 11:17:29 2024
@author: ym
"""
import os
import cv2
import pickle
import numpy as np
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
def save_imgpairs(barcode, imgpaths, matrix, savepath, thresh=(0.4, 0.6), ctype="intra"):
if ctype=="intra":
rows, cols = np.triu_indices(matrix.shape[0], k=1) # k=1 表示不包括对角线
mask = matrix[rows, cols] < thresh[1]
indices = list(zip(rows[mask], cols[mask]))
else:
rows, cols = np.where(matrix > thresh[0])
indices = list(zip(rows, cols))
if len(indices):
savepath = os.path.join(savepath, barcode)
if not os.path.exists(savepath):
os.makedirs (savepath)
for idx1, idx2 in indices:
if len(imgpaths) == 1:
img1 = cv2.imread(imgpaths[0][idx1])
img2 = cv2.imread(imgpaths[0][idx2])
elif len(imgpaths) == 2:
img1 = cv2.imread(imgpaths[0][idx1])
img2 = cv2.imread(imgpaths[1][idx2])
simi = matrix[idx1, idx2]
H1, W1 = img1.shape[:2]
H2, W2 = img2.shape[:2]
H, W = max((H1, H2)), max((W1, W2))
img = np.ones((H, 2*W, 3), dtype=np.uint8) *np.array([255, 128, 128])
img[0:H1, 0:W1, :] = img1
img[0:H2, (2*W-W2):, :] = img2
text = f"sim: {simi:.2f}"
org = (10, H-10)
cv2.putText(img, text, org, fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.75,
color=(0, 0, 255), thickness=2, lineType=cv2.LINE_AA)
imgpath = os.path.join(savepath, f"{simi:.2f}_{barcode}_{idx1}_{idx2}.png")
cv2.imwrite(imgpath, img)
def feat_analysis(featpath):
savepath = r"D:\exhibition\result\stdfeat"
InterThresh = (0.4, 0.6)
featDict, features= [], []
for filename in os.listdir(featpath):
file, ext = os.path.splitext(filename)
if ext != ".pickle": continue
filepath = os.path.join(featpath, filename)
with open(filepath, 'rb') as f:
bpDict = pickle.load(f)
feat = bpDict["feats_ft32"]
featDict.append(bpDict)
features.append(feat)
N = len(features)
simMatrix = []
intra_simi = np.empty(0)
low_simi_index = {}
for i, feats in enumerate(features):
matrix = 1 - cdist(feats, feats, 'cosine')
simMatrix.append(matrix)
'''提取相似矩阵上三角元素'''
rows, cols = np.triu_indices(matrix.shape[0], k=1) # k=1 表示不包括对角线
upper_tri= matrix[rows, cols]
intra_simi = np.concatenate((intra_simi, upper_tri))
'''保存相似度小于阈值的图像对'''
barcode = featDict[i]["barcode"]
imgpaths = featDict[i]["imgpaths"]
# save_imgpairs(barcode, [imgpaths], matrix, savepath, InterThresh, "intra")
print(f"{barcode} have done!")
Matrix = np.zeros((N, N))
inter_bcds = []
inter_simi = np.empty(0)
for i, feati in enumerate(features):
bcdi = featDict[i]["barcode"]
imgpathi = featDict[i]["imgpaths"]
for j, featj in enumerate(features):
bcdj = featDict[j]["barcode"]
imgpathj = featDict[j]["imgpaths"]
matrix = 1 - cdist(feati, featj, 'cosine')
inter_bcds.append((i, j, bcdi, bcdj))
Matrix[i, j] = np.mean(matrix)
if j>i:
bcd_ij = bcdi+'_'+bcdj
# save_imgpairs(bcd_ij, [imgpathi, imgpathj], matrix, savepath, InterThresh, "inter")
inter_simi = np.concatenate((inter_simi, matrix.ravel()))
print(f"{bcd_ij} have done!")
fig, axs = plt.subplots(2, 1)
axs[0].hist(intra_simi, bins=100, color='blue', edgecolor='black', alpha=0.7)
axs[0].set_xlim(0, 1)
axs[0].set_xlabel('Performance')
axs[0].set_title("inter similarity")
axs[1].hist(inter_simi, bins=100, color='green', edgecolor='black', alpha=0.7)
axs[1].set_xlim(0, 1)
axs[1].set_xlabel('Performance')
axs[1].set_title("inter similarity")
print("Done")
def main():
stdpath = r"D:\exhibition\dataset\feats"
feat_analysis(stdpath)
if __name__ == '__main__':
main()