285 lines
7.6 KiB
Python
285 lines
7.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Fri May 31 14:50:21 2024
|
|
|
|
@author: ym
|
|
"""
|
|
import cv2
|
|
import numpy as np
|
|
import torch
|
|
from scipy.spatial.distance import cdist
|
|
from tracking.trackers.reid.config import config as ReIDConfig
|
|
from tracking.trackers.reid.reid_interface import ReIDInterface
|
|
ReIDEncoder = ReIDInterface(ReIDConfig)
|
|
|
|
def read_data_file(datapath):
|
|
|
|
with open(datapath, 'r') as file:
|
|
lines = file.readlines()
|
|
Videos = []
|
|
FrameBoxes, FrameFeats = [], []
|
|
boxes, feats = [], []
|
|
|
|
bboxes, ffeats = [], []
|
|
timestamp = []
|
|
t1 = None
|
|
for line in lines:
|
|
if line.find('CameraId') >= 0:
|
|
t = int(line.split(',')[1].split(':')[1])
|
|
timestamp.append(t)
|
|
|
|
if len(boxes) and len(feats):
|
|
FrameBoxes.append(np.array(boxes, dtype = np.float32))
|
|
FrameFeats.append(np.array(feats, dtype = np.float32))
|
|
|
|
boxes, feats = [], []
|
|
|
|
if t1 and t - t1 > 1e4:
|
|
Videos.append((FrameBoxes, FrameFeats))
|
|
FrameBoxes, FrameFeats = [], []
|
|
t1 = int(line.split(',')[1].split(':')[1])
|
|
|
|
if line.find('box') >= 0:
|
|
box = line.split(':', )[1].split(',')[:-1]
|
|
boxes.append(box)
|
|
bboxes.append(boxes)
|
|
|
|
|
|
if line.find('feat') >= 0:
|
|
feat = line.split(':', )[1].split(',')[:-1]
|
|
feats.append(feat)
|
|
ffeats.append(feat)
|
|
|
|
|
|
|
|
|
|
FrameBoxes.append(np.array(boxes, dtype = np.float32))
|
|
FrameFeats.append(np.array(feats, dtype = np.float32))
|
|
Videos.append((FrameBoxes, FrameFeats))
|
|
|
|
TimeStamp = np.array(timestamp, dtype = np.float32)
|
|
DimesDiff = np.diff((timestamp))
|
|
|
|
return Videos
|
|
|
|
def inference_image(image, detections):
|
|
H, W, _ = np.shape(image)
|
|
imgs = []
|
|
batch_patches = []
|
|
patches = []
|
|
for d in range(np.size(detections, 0)):
|
|
tlbr = detections[d, :4].astype(np.int_)
|
|
tlbr[0] = max(0, tlbr[0])
|
|
tlbr[1] = max(0, tlbr[1])
|
|
tlbr[2] = min(W - 1, tlbr[2])
|
|
tlbr[3] = min(H - 1, tlbr[3])
|
|
img1 = image[tlbr[1]:tlbr[3], tlbr[0]:tlbr[2], :]
|
|
|
|
img = img1[:, :, ::-1].copy() # the model expects RGB inputs
|
|
patch = ReIDEncoder.transform(img)
|
|
|
|
imgs.append(img1)
|
|
# 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 imgs, features
|
|
|
|
def readimg():
|
|
imgpath = r"D:\datasets\ym\Img_ResnetData\result\0.png"
|
|
image = cv2.imread(imgpath)
|
|
|
|
img = cv2.resize(image, (224, 224))
|
|
|
|
cv2.imwrite('0_224x224.jpg', img)
|
|
|
|
|
|
def readdata(datapath):
|
|
|
|
with open(datapath, 'r') as file:
|
|
lines = file.readlines()
|
|
dlist = lines[0].split(',')
|
|
dfloat = [float(d) for d in dlist]
|
|
afeat = np.array(dfloat).reshape(1, -1)
|
|
|
|
return afeat
|
|
def readrawimg(datapath):
|
|
with open(datapath, 'r') as file:
|
|
llines = file.readlines()
|
|
imgs = []
|
|
|
|
row = 224
|
|
|
|
for i in range(8):
|
|
lines = llines[i*224 : (i+1)*224]
|
|
|
|
|
|
|
|
img = np.empty((224, 224, 0), dtype=np.float32)
|
|
imgr = np.empty((0, 224), dtype=np.float32)
|
|
imgg = np.empty((0, 224), dtype=np.float32)
|
|
imgb = np.empty((0, 224), dtype=np.float32)
|
|
|
|
for line in lines:
|
|
dlist = line.split(' ')[0:224]
|
|
|
|
img_r = np.array([float(s.split(',')[0]) for s in dlist], dtype=np.float32).reshape(1, -1)
|
|
img_g = np.array([float(s.split(',')[1]) for s in dlist], dtype=np.float32).reshape(1, -1)
|
|
img_b = np.array([float(s.split(',')[2]) for s in dlist], dtype=np.float32).reshape(1, -1)
|
|
|
|
# img_r = [float(s.split(',')[0]) for s in dlist if len(s.split(',')[0].encode('utf-8')) == 4]
|
|
# img_g = [float(s.split(',')[1]) for s in dlist if len(s.split(',')[1].encode('utf-8')) == 4]
|
|
# img_b = [float(s.split(',')[2]) for s in dlist if len(s.split(',')[2].encode('utf-8')) == 4]
|
|
|
|
imgr = np.concatenate((imgr, img_r), axis=0)
|
|
imgg = np.concatenate((imgg, img_g), axis=0)
|
|
imgb = np.concatenate((imgb, img_b), axis=0)
|
|
|
|
imgr = imgr[:, :, None]
|
|
imgg = imgg[:, :, None]
|
|
imgb = imgb[:, :, None]
|
|
|
|
img = np.concatenate((imgb, imgg, imgr), axis=2).astype(np.uint8)
|
|
|
|
imgs.append(img)
|
|
|
|
return imgs
|
|
|
|
|
|
|
|
|
|
|
|
def inference(image):
|
|
|
|
patches = []
|
|
|
|
image = image[:, :, ::-1].copy() # the model expects RGB inputs
|
|
patch = ReIDEncoder.transform(image)
|
|
|
|
patch = patch.to(device=ReIDEncoder.device)
|
|
|
|
patches.append(patch)
|
|
patches = torch.stack(patches, dim=0)
|
|
pred = ReIDEncoder.model(patches)
|
|
pred[torch.isinf(pred)] = 1.0
|
|
bfeat = pred.cpu().data.numpy()
|
|
|
|
return bfeat
|
|
|
|
|
|
|
|
def test_img_feat():
|
|
# datapath = r"D:\datasets\ym\Img_ResnetData\aa\aa.txt"
|
|
# afeat = readdata(datapath)
|
|
|
|
imgpath = r"D:\datasets\ym\Img_ResnetData\aa\aa.jpg"
|
|
img = cv2.imread(imgpath)
|
|
bfeat = inference(img)
|
|
|
|
|
|
datapath = r"D:\datasets\ym\Img_ResnetData\rawimg\7.txt"
|
|
afeat = readdata(datapath)
|
|
|
|
rawpath = r"D:\datasets\ym\Img_ResnetData\rawimg\28950640607_mat_rgb"
|
|
imgx = readrawimg(rawpath)
|
|
cv2.imwrite("rawimg.png", imgx[7])
|
|
bfeatx = inference(imgx[7])
|
|
|
|
cost_matrix = 1 - np.maximum(0.0, cdist(afeat, bfeatx, 'cosine'))
|
|
|
|
imgpath1 = r"D:\datasets\ym\Img_ResnetData\result\0_224x224.png"
|
|
img1 = cv2.imread(imgpath1)
|
|
bfeat1 = inference(img1)
|
|
|
|
aafeat = afeat / np.linalg.norm(afeat, ord=2, axis=1, keepdims=True)
|
|
bbfeat = bfeat / np.linalg.norm(bfeat, ord=2, axis=1, keepdims=True)
|
|
|
|
cost_matrix = 1 - np.maximum(0.0, cdist(aafeat, bbfeat, 'cosine'))
|
|
|
|
print("Done!!!")
|
|
|
|
def main():
|
|
imgpath = r"D:\datasets\ym\Img_ResnetData\20240531-103547_0354b1cb-53fa-48de-86cd-ac3c5b127ada_6921168593576\3568800050000_0.jpeg"
|
|
datapath = r"D:\datasets\ym\Img_ResnetData\20240531-103547_0354b1cb-53fa-48de-86cd-ac3c5b127ada_6921168593576\0_tracker_inout.data"
|
|
savepath = r"D:\datasets\ym\Img_ResnetData\result"
|
|
|
|
image = cv2.imread(imgpath)
|
|
|
|
|
|
Videos = read_data_file(datapath)
|
|
|
|
bboxes, afeats = Videos[0][0][0], Videos[0][1][0]
|
|
imgs, bfeats = inference_image(image, bboxes)
|
|
|
|
|
|
aafeats = afeats / np.linalg.norm(afeats, ord=2, axis=1, keepdims=True)
|
|
bbfeats = bfeats / np.linalg.norm(bfeats, ord=2, axis=1, keepdims=True)
|
|
|
|
|
|
cost_matrix = 1 - np.maximum(0.0, cdist(aafeats, bbfeats, 'cosine'))
|
|
|
|
|
|
for i, img in enumerate(imgs):
|
|
cv2.imwrite(savepath + f"\{i}.png", img)
|
|
|
|
|
|
|
|
print("Done!!!!")
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# main()
|
|
|
|
# readimg()
|
|
|
|
test_img_feat()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|