AIlib2/DMPRUtils/jointUtilbak.py

143 lines
6.8 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.

import math
import numpy as np
import torch
import time
from loguru import logger
def dmpr_yolo( yolo_det, dmpr_det,pars):
#if len(yolo_det)==0 or len(dmpr_det)==0:
#print('line11:\n',yolo_det, dmpr_det,pars)
time1=time.time()
if len(yolo_det)==0:
return yolo_det,' No yolo detections'
img_shape = (pars['imgSize'][1],pars['imgSize'][0])
cls = pars['carCls']; scaleRatio = pars['scaleRatio']
illParkCls = pars['illCls'];border = pars['border']
yolo_det = np.array(yolo_det)
yolo_det_0 = yolo_det.copy()
#print('-'*10,'line17',yolo_det_0)
# 过滤在图像边界的box(防止出现类似一小半车辆的情况)
x_c = (yolo_det[:, 0] + yolo_det[:, 2]) / 2
y_c = (yolo_det[:, 1] + yolo_det[:, 3]) / 2
tmp = (x_c >= border) & (x_c <= (img_shape[1] - border)) & (y_c >= border) & (y_c <= (img_shape[0] - border))
yolo_det = yolo_det[tmp]
# 创建yolo_det_clone内容为x1, y1, x2, y2, conf, cls, unlabel (unlabel代表该类是否需要忽略0不忽略 其他:忽略)
logger.info("标记 :{}, yolo_det:{}, dmpr_det:{}", '+++'* 10, yolo_det, dmpr_det)
yolo_det_clone = yolo_det.copy()
tmp_0_tensor = np.zeros([len(yolo_det), 1])
yolo_det_clone = np.concatenate([yolo_det_clone, tmp_0_tensor], axis=1)
# cls为需要计算的类别
yolo_det = yolo_det[yolo_det[:, -1] == cls]
# new_yolo_det为膨胀后数据内容为x1, y1, x2, y2, flag (flag代表膨胀后车位内是否包含角点 且 与角点方向差值小于90度, 其值为第一个满足条件的角点索引)
new_yolo_det = np.zeros([len(yolo_det), 7])
# yolo框膨胀长的边两边各膨胀0.4倍总长短的边两边各膨胀0.2倍总长
x_length = yolo_det[:, 2] - yolo_det[:, 0] #x2-x1
y_length = yolo_det[:, 3] - yolo_det[:, 1] #y2-y1
# x, y哪个方向差值大哪个方向膨胀的多
x_dilate_coefficient = ((x_length > y_length) + 1)*scaleRatio
y_dilate_coefficient = ((~(x_length > y_length)) + 1)*scaleRatio
logger.info("膨胀前标记 :{}, yolo_det:{}", '+++'*10, new_yolo_det)
# 原始框中心点x_c, y_c
new_yolo_det[:, 5] = (yolo_det[:, 0] + yolo_det[:, 2]) / 2
new_yolo_det[:, 6] = (yolo_det[:, 1] + yolo_det[:, 3]) / 2
# 膨胀
new_yolo_det[:, 0] = np.round(yolo_det[:, 0] - x_dilate_coefficient * x_length).clip(0, img_shape[1]) #x1 膨胀
new_yolo_det[:, 1] = np.round(yolo_det[:, 1] - y_dilate_coefficient * y_length).clip(0, img_shape[0]) #y1 膨胀
new_yolo_det[:, 2] = np.round(yolo_det[:, 2] + x_dilate_coefficient * x_length).clip(0, img_shape[1]) #x2 膨胀
new_yolo_det[:, 3] = np.round(yolo_det[:, 3] + y_dilate_coefficient * y_length).clip(0, img_shape[0]) #y2 膨胀
m, n = new_yolo_det.size, dmpr_det.size
logger.info("膨胀后标记 :{}, yolo_det:{} m:{}, n:{}", '+++'*10, new_yolo_det,m,n)
if not m or not n:
#print('##line47 original yolo_det_clone:',yolo_det_clone)
yolo_det_clone[np.logical_and( yolo_det_clone[:,-1]==0,yolo_det_clone[:,-2]==cls),-2] = illParkCls
#yolo_det_clone[yolo_det_clone[:, -1] == 0 & yolo_det_clone[:, -2==cls] , -2] = illParkCls
return yolo_det_clone[:,0:6], ' no cars or T/L corners'
new_yolo = new_yolo_det[:, np.newaxis, :].repeat(dmpr_det.shape[0], 1) # 扩展为 (m , n, 5)
dmpr_det = dmpr_det[np.newaxis, ...].repeat(new_yolo_det.shape[0], 0)
yolo_dmpr = np.concatenate((new_yolo, dmpr_det), axis=2) # (m, n, 10)
logger.info("膨胀后标记 :{}, yolo_dmpr:{}", '+++' * 10, yolo_dmpr)
x_p, y_p = yolo_dmpr[..., 8], yolo_dmpr[..., 9]
x1, y1, x2, y2 = yolo_dmpr[..., 0], yolo_dmpr[..., 1], yolo_dmpr[..., 2], yolo_dmpr[..., 3]
x_c, y_c = yolo_dmpr[..., 5], yolo_dmpr[..., 6]
direction1 = np.arctan2(y_c - y_p, x_c - x_p) / math.pi * 180
direction2 = yolo_dmpr[..., 10] / math.pi * 180
direction3 = direction2 + 90 # L形角点另外一个方向
direction3[direction3 > 180] -= 360
ang_diff = direction1 - direction2
ang_diff2 = direction1 - direction3
# 判断膨胀后yolo框包含角点关系 && 包含角点的时候计算水平框中心点与角点的角度关系
# direction ∈ -180 180 若角差大于180需算补角
# T形角点比较一个方向L形角点比较两个方向
mask = (x_p >= x1) & (x_p <= x2) & (y_p >= y1) & (y_p <= y2) & \
(((yolo_dmpr[..., 11] <= 0.5) & # T形角点情况
(((ang_diff >= -90) & (ang_diff <= 90)) | ((ang_diff > 180) & ((360 - ang_diff) <= 90)) |
(((ang_diff) < -180) & ((360 + ang_diff) <= 90)))) |
((yolo_dmpr[..., 11] > 0.5) & # L形角点情况
(((ang_diff >= -90) & (ang_diff <= 90)) | ((ang_diff > 180) & ((360 - ang_diff) <= 90)) |
(((ang_diff) < -180) & ((360 + ang_diff) <= 90))) &
(((ang_diff2 >= -90) & (ang_diff2 <= 90)) | ((ang_diff2 > 180) & ((360 - ang_diff2) <= 90)) |
(((ang_diff2) < -180) & ((360 + ang_diff2) <= 90)))))
logger.info("省略 :{}, mask1:{}", '+++' * 10, mask)
res = np.sum(mask, axis=1)
logger.info("省略 :{}, mask2:{}", '+++' * 10, res)
logger.info("省略 :{}, yolo_det_clone:{}", '+++' * 10, yolo_det_clone)
yolo_det_clone[yolo_det_clone[:, -2] == cls, -1] = res
#print('##line69 original yolo_det_clone:',yolo_det_clone)
#yolo_det_clone[yolo_det_clone[:, -1] == 0, -2] = illParkCls
logger.info("省略:{}, yolo_det_clone:{}", '+++' * 10, yolo_det_clone)
#print('-'*20,'--line78',yolo_det_clone)
yolo_det_clone[ np.logical_and( yolo_det_clone[:,-1]==0,yolo_det_clone[:,-2]==cls) ,-2 ] = illParkCls
#print('-'*20,'--line80:',yolo_det_clone)
yolo_det_clone = yolo_det_clone[:,0:6]
time2=time.time()
return np.array(yolo_det_clone), 'dmpr_yolo:%.1f'%( (time2-time1)*1000 )
def stdc_yolo(stdc_det, yolo_det):
im = np.uint8(stdc_det)
x_c = ((yolo_det[:, 0] + yolo_det[:, 2]) // 2).astype(int)
y_c = ((yolo_det[:, 1] + yolo_det[:, 3]) // 2).astype(int)
yolo_filted = yolo_det[im[y_c, x_c] == 0]
return yolo_filted
def dmpr_yolo_stdc(predsList,pars):
if len(predsList)==2:
yolo_det, dmpr_det = predsList[0:2]
else:
yolo_det, dmpr_det,stdc_det = predsList[0:3]
if len(yolo_det)==0:
return yolo_det,' No yolo detections'
if isinstance(yolo_det,list):
yolo_det = np.array(yolo_det)
if len(predsList)>2:
yolo_det = stdc_yolo(stdc_det, yolo_det)
return dmpr_yolo(yolo_det, dmpr_det,pars)