Files
detecttracking/contrast/feat_similar.py
王庆刚 0cc36ba920 bakeup
2024-09-02 11:50:08 +08:00

131 lines
4.0 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 Fri Aug 9 10:36:45 2024
@author: ym
"""
import os
import cv2
import numpy as np
import torch
import sys
from scipy.spatial.distance import cdist
sys.path.append(r"D:\DetectTracking")
from tracking.trackers.reid.reid_interface import ReIDInterface
from tracking.trackers.reid.config import config as ReIDConfig
ReIDEncoder = ReIDInterface(ReIDConfig)
def inference_image(images):
batch_patches = []
patches = []
for d, img1 in enumerate(images):
img = img1[:, :, ::-1].copy() # the model expects RGB inputs
patch = ReIDEncoder.transform(img)
# patch = patch.to(device=self.device).half()
if str(ReIDEncoder.device) != "cpu":
patch = patch.to(device=ReIDEncoder.device).half()
else:
patch = patch.to(device=ReIDEncoder.device)
patches.append(patch)
if (d + 1) % ReIDEncoder.batch_size == 0:
patches = torch.stack(patches, dim=0)
batch_patches.append(patches)
patches = []
if len(patches):
patches = torch.stack(patches, dim=0)
batch_patches.append(patches)
features = np.zeros((0, ReIDEncoder.embedding_size))
for patches in batch_patches:
pred = ReIDEncoder.model(patches)
pred[torch.isinf(pred)] = 1.0
feat = pred.cpu().data.numpy()
features = np.vstack((features, feat))
return features
def similarity_compare(root_dir):
'''
root_dir包含 "subimgs"字段的文件夹中图像为 subimg子图
功能:相邻帧子图间相似度比较
'''
all_files = []
extensions = ['.png', '.jpg']
for dirpath, dirnames, filenames in os.walk(root_dir):
filepaths = []
for filename in filenames:
if os.path.basename(dirpath).find('subimgs') < 0:
continue
file, ext = os.path.splitext(filename)
if ext in extensions:
imgpath = os.path.join(dirpath, filename)
filepaths.append(imgpath)
nf = len(filepaths)
if nf==0:
continue
fnma = os.path.basename(filepaths[0]).split('.')[0]
imga = cv2.imread(filepaths[0])
ha, wa = imga.shape[:2]
for i in range(1, nf):
fnmb = os.path.basename(filepaths[i]).split('.')[0]
imgb = cv2.imread(filepaths[i])
hb, wb = imgb.shape[:2]
feats = inference_image(((imga, imgb)))
similar = 1 - np.maximum(0.0, cdist(feats, feats, metric='cosine'))
h, w = max((ha, hb)), max((wa, wb))
img = np.zeros(((h, 2*w, 3)), np.uint8)
img[0:ha, 0:wa], img[0:hb, w:(w+wb)] = imga, imgb
linewidth = max(round(((h+2*w))/2 * 0.001), 2)
cv2.putText(img,
text=f'{similar[0,1]:.2f}', # Text string to be drawn
org=(max(w-20, 10), h-10), # Bottom-left corner of the text string
fontFace=0, # Font type
fontScale=linewidth/3, # Font scale factor
color=(0, 0, 255), # Text color
thickness=linewidth, # Thickness of the lines used to draw a text
lineType=cv2.LINE_AA, # Line type
)
spath = os.path.join(dirpath, 's'+fnma+'-vs-'+fnmb+'.png')
cv2.imwrite(spath, img)
fnma = os.path.basename(filepaths[i]).split('.')[0]
imga = imgb.copy()
ha, wa = imga.shape[:2]
return
def main():
root_dir = r"D:\contrast\dataset\result\20240723-112242_6923790709882"
try:
similarity_compare(root_dir)
except Exception as e:
print(f'Error: {e}')
if __name__ == '__main__':
main()