news 2026/6/10 16:12:02

draw_tensor2psd_v4.py

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
draw_tensor2psd_v4.py

import cv2

import numpy as np

import math

import os

import struct

from tqdm import tqdm

from glob import glob

PALETTE = np.random.randint(0, 255, [255, 3], dtype=np.uint32)

# 模型输入尺寸(W, H),用于把模型坐标缩放回原图

MODEL_IN_W = 608

MODEL_IN_H = 736

# 调试:同时输出“模型输入尺寸”和“交换W/H”的可视化

DEBUG_DRAW_MODEL_SIZE = True

DEBUG_DRAW_MODEL_SWAP = True

# zh

imagespath = "/ai/DataSets/OD_FSD_zh/TI_test/rm/4/image/"

# imagespath = "/ai/DataSets/OD_FSD_zh/TI_test/ppchen/DVR-20250804152834-2382380-PLR/image/"

# savepath = "/ai/zhdata/multiyolov5_point_v2/test_images/out"

zh1 = 0

def readTensor(tensorFile):

global zh1

tensor = open(tensorFile,'rb')

infer_data = np.fromfile(tensor, dtype=np.int32)

print(infer_data.shape)

soltnum = int(len(infer_data) / 20)

im0 = cv2.imread(imagespath + tensorFile.split('/')[-1][:-8] + '.bmp')

if im0 is None:

print("读取图片失败:", tensorFile)

return

h0, w0 = im0.shape[:2]

sx = w0 / float(MODEL_IN_W)

sy = h0 / float(MODEL_IN_H)

point_all =[]

max_raw_x = 0

max_raw_y = 0

for i in range(soltnum):

point_dict1={}

#

raw_x1 = max(int(infer_data[20*i+6]), 0)

raw_y1 = max(int(infer_data[20*i+7]), 0)

raw_x2 = max(int(infer_data[20*i+8]), 0)

raw_y2 = max(int(infer_data[20*i+9]), 0)

raw_x3 = max(int(infer_data[20*i+10]), 0)

raw_y3 = max(int(infer_data[20*i+11]), 0)

raw_x4 = max(int(infer_data[20*i+12]), 0)

raw_y4 = max(int(infer_data[20*i+13]), 0)

max_raw_x = max(max_raw_x, raw_x1, raw_x2, raw_x3, raw_x4)

max_raw_y = max(max_raw_y, raw_y1, raw_y2, raw_y3, raw_y4)

# zh = struct.unpack('!f',int(bin(infer_data[20*i+4])[2:],2).to_bytes(4,byteorder='big'))

point_dict1["conf"] = struct.unpack('!f',int(bin(infer_data[20*i+4])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["isOccupied"] = struct.unpack('!f',int(bin(infer_data[20*i+14])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["isVIP"] = struct.unpack('!f',int(bin(infer_data[20*i+15])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["iswoman"] = struct.unpack('!f',int(bin(infer_data[20*i+16])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["isdisabled"] = struct.unpack('!f',int(bin(infer_data[20*i+17])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["ischarging"] = struct.unpack('!f',int(bin(infer_data[20*i+18])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["step"] = struct.unpack('!f',int(bin(infer_data[20*i+19])[2:],2).to_bytes(4,byteorder='big'))[0]

point_dict1["name"] = str(struct.unpack('!f',int(bin(infer_data[20*i+5])[2:],2).to_bytes(4,byteorder='big'))[0])

point_dict1["delrule"] = 0

point_dict1["raw_pointx"] = [raw_x1, raw_x2, raw_x3, raw_x4]

point_dict1["raw_pointy"] = [raw_y1, raw_y2, raw_y3, raw_y4]

if raw_x3 > 1000 or raw_x4 > 1000 or raw_x1 > 1000 or raw_x2 > 1000 or raw_y3 > 1000 or raw_y4 > 1000 or raw_y1 > 1000 or raw_y2 > 1000:

zh1 +=1

kk = struct.unpack('!f',int(bin(infer_data[20*i+17])[2:],2).to_bytes(4,byteorder='big'))[0]

print("数据解析错误"+ tensorFile + str(raw_x3) + '--'+ str(zh1))

break

point_all.append(point_dict1)

# 判断 raw 坐标是否已经是原图尺寸

use_raw_as_original = (max_raw_x <= w0 and max_raw_y <= h0)

if use_raw_as_original:

scale_x, scale_y = 1.0, 1.0

else:

scale_x, scale_y = sx, sy

print("raw_max:", max_raw_x, max_raw_y, "use_raw_as_original:", use_raw_as_original)

# 根据判断结果生成最终坐标

for point_i in point_all:

point_i["pointx"] = [int(point_i["raw_pointx"][0] * scale_x),

int(point_i["raw_pointx"][1] * scale_x),

int(point_i["raw_pointx"][2] * scale_x),

int(point_i["raw_pointx"][3] * scale_x)]

point_i["pointy"] = [int(point_i["raw_pointy"][0] * scale_y),

int(point_i["raw_pointy"][1] * scale_y),

int(point_i["raw_pointy"][2] * scale_y),

int(point_i["raw_pointy"][3] * scale_y)]

end = len(point_all)

for i in range(len(point_all)):

if point_all[i]["delrule"] == 0:

for j in range(i+1,end):

#简单就是求入口顶点之间的距离

xi1 = point_all[i]['pointx'][0]

yi1 = point_all[i]['pointy'][0]

xi2 = point_all[i]['pointx'][1]

yi2 = point_all[i]['pointy'][1]

xj1 = point_all[j]['pointx'][0]

yj1 = point_all[j]['pointy'][0]

xj2 = point_all[j]['pointx'][1]

yj2 = point_all[j]['pointy'][1]

if (abs(xi1 - xj1) + abs(yi1 - yj1)) < 40 or (abs(xi2 - xj2) + abs(yi2 - yj2)) < 40:

point_all[j]["delrule"] = 1

for i in range(len(point_all)):

if point_all[i]["delrule"] == 0:

line1 = [point_all[i]['pointx'][0],point_all[i]['pointy'][0],point_all[i]['pointx'][3],point_all[i]['pointy'][3]]

line2 = [point_all[i]['pointx'][1],point_all[i]['pointy'][1],point_all[i]['pointx'][2],point_all[i]['pointy'][2]]

vec1 =[line1[2]-line1[0],line1[3]-line1[1]]

vec2 =[line2[2]-line2[0],line2[3]-line2[1]]

#计算向量的点积和模长

dot_product = vec1[0] * vec2[0] + vec1[1] * vec2[1]

m1 = math.sqrt(vec1[0]**2 + vec1[1]**2) + 0.000000000001

m2 = math.sqrt(vec2[0]**2 + vec2[1]**2) + 0.000000000001

val = dot_product/(m1 * m2)

if val > 1:

val = 1

if val < -1:

val = -15

radians = math.acos(val)

du = math.degrees(radians)

if du > 20:

point_all[i]["delrule"] = 2

if 1:

for point_i in point_all:

if point_i["delrule"] == 0:

if point_i["conf"] > 0.45:#0.45

# print(point_i["conf"])

cv2.putText(im0, f'{point_i["conf"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 6),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #置信度

cv2.putText(im0, point_i["name"],

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 30),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #类别

if float(point_i["isOccupied"])> 0.1: #0.5

cv2.putText(im0, "Occ :" + f'{point_i["isOccupied"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 54),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #是否被占用

if float(point_i["isVIP"]) > 0.5:

cv2.putText(im0, "VIP :" + f'{point_i["isVIP"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 78),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #是否VIP车位

if float(point_i["iswoman"]) > 0.5:

cv2.putText(im0, "woman :" + f'{point_i["iswoman"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 102),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #是否女性车位

if float(point_i["isdisabled"]) > 0.5:

cv2.putText(im0, "disab :" + f'{point_i["isdisabled"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 126),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #是否残疾人车位

if float(point_i["ischarging"]) > 0.5:

cv2.putText(im0, "charg :" + f'{point_i["ischarging"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 150),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #是否充电车位

if float(point_i["step"]) > 0.5:

cv2.putText(im0, "step :" + f'{point_i["step"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 174),

cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),2) #是否阶梯形车位

cv2.arrowedLine(im0, (point_i["pointx"][0], point_i["pointy"][0]),(point_i["pointx"][1], point_i["pointy"][1]), (0, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][1], point_i["pointy"][1]),(point_i["pointx"][2], point_i["pointy"][2]), (255, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][2], point_i["pointy"][2]),(point_i["pointx"][3], point_i["pointy"][3]), (255, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][3], point_i["pointy"][3]),(point_i["pointx"][0], point_i["pointy"][0]), (255, 255, 0), 1, cv2.LINE_AA)

else:

cv2.putText(im0, f'{point_i["conf"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 6),

cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255),3)

cv2.arrowedLine(im0, (point_i["pointx"][0], point_i["pointy"][0]),(point_i["pointx"][1], point_i["pointy"][1]), (0, 0, 255), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][1], point_i["pointy"][1]),(point_i["pointx"][2], point_i["pointy"][2]), (0, 0, 255), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][2], point_i["pointy"][2]),(point_i["pointx"][3], point_i["pointy"][3]), (0, 0, 255), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][3], point_i["pointy"][3]),(point_i["pointx"][0], point_i["pointy"][0]), (0, 0, 255), 1, cv2.LINE_AA)

if point_i["delrule"] == 1:

cv2.putText(im0, f'{point_i["conf"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 6),

cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255),3)

cv2.arrowedLine(im0, (point_i["pointx"][0], point_i["pointy"][0]),(point_i["pointx"][1], point_i["pointy"][1]), (0, 0, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][1], point_i["pointy"][1]),(point_i["pointx"][2], point_i["pointy"][2]), (0, 0, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][2], point_i["pointy"][2]),(point_i["pointx"][3], point_i["pointy"][3]), (0, 0, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][3], point_i["pointy"][3]),(point_i["pointx"][0], point_i["pointy"][0]), (0, 0, 0), 1, cv2.LINE_AA)

if point_i["delrule"] == 2:

cv2.putText(im0, f'{point_i["conf"]:.3f}',

(point_i["pointx"][0] + 6, point_i["pointy"][0] + 6),

cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255),3)

cv2.arrowedLine(im0, (point_i["pointx"][0], point_i["pointy"][0]),(point_i["pointx"][1], point_i["pointy"][1]), (0, 0, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][1], point_i["pointy"][1]),(point_i["pointx"][2], point_i["pointy"][2]), (0, 0, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][2], point_i["pointy"][2]),(point_i["pointx"][3], point_i["pointy"][3]), (0, 0, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im0, (point_i["pointx"][3], point_i["pointy"][3]),(point_i["pointx"][0], point_i["pointy"][0]), (0, 0, 0), 1, cv2.LINE_AA)

zh = "/ai/TopViewMul/4/psd_out/" + tensorFile.split('/')[-1][:-8] + '.bmp'

print(zh)

cv2.imwrite(zh, im0)

if DEBUG_DRAW_MODEL_SIZE:

im_model = cv2.resize(im0, (MODEL_IN_W, MODEL_IN_H))

for point_i in point_all:

if point_i.get("raw_pointx") is None:

continue

if point_i["delrule"] == 0 and point_i["conf"] > 0.45:

cv2.arrowedLine(im_model, (point_i["raw_pointx"][0], point_i["raw_pointy"][0]), (point_i["raw_pointx"][1], point_i["raw_pointy"][1]), (0, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im_model, (point_i["raw_pointx"][1], point_i["raw_pointy"][1]), (point_i["raw_pointx"][2], point_i["raw_pointy"][2]), (255, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im_model, (point_i["raw_pointx"][2], point_i["raw_pointy"][2]), (point_i["raw_pointx"][3], point_i["raw_pointy"][3]), (255, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im_model, (point_i["raw_pointx"][3], point_i["raw_pointy"][3]), (point_i["raw_pointx"][0], point_i["raw_pointy"][0]), (255, 255, 0), 1, cv2.LINE_AA)

zh_model = "/ai/TopViewMul/4/psd_out/" + tensorFile.split('/')[-1][:-8] + '_model.bmp'

cv2.imwrite(zh_model, im_model)

if DEBUG_DRAW_MODEL_SWAP:

im_model_swap = cv2.resize(im0, (MODEL_IN_H, MODEL_IN_W))

for point_i in point_all:

if point_i.get("raw_pointx") is None:

continue

if point_i["delrule"] == 0 and point_i["conf"] > 0.45:

cv2.arrowedLine(im_model_swap, (point_i["raw_pointx"][0], point_i["raw_pointy"][0]), (point_i["raw_pointx"][1], point_i["raw_pointy"][1]), (0, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im_model_swap, (point_i["raw_pointx"][1], point_i["raw_pointy"][1]), (point_i["raw_pointx"][2], point_i["raw_pointy"][2]), (255, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im_model_swap, (point_i["raw_pointx"][2], point_i["raw_pointy"][2]), (point_i["raw_pointx"][3], point_i["raw_pointy"][3]), (255, 255, 0), 1, cv2.LINE_AA)

cv2.arrowedLine(im_model_swap, (point_i["raw_pointx"][3], point_i["raw_pointy"][3]), (point_i["raw_pointx"][0], point_i["raw_pointy"][0]), (255, 255, 0), 1, cv2.LINE_AA)

zh_model_swap = "/ai/TopViewMul/4/psd_out/" + tensorFile.split('/')[-1][:-8] + '_model_swap.bmp'

cv2.imwrite(zh_model_swap, im_model_swap)

# zh

# for binpath in tqdm(glob(os.path.join("/ai/DataSets/OD_FSD_zh/TI_test/rm/2/psd/",'*.bin'))):

# readTensor(binpath)

num=0

for binpath in tqdm(glob(os.path.join("/ai/TopViewMul/4/out_608_736/psd/",'*.bin'))):

readTensor(binpath)

print('===================')

num+=1

if num==100:

print('exit')

exit(0)

# ————————————————

# 版权声明:本文为CSDN博主「weixin_39544891」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

# 原文链接:https://blog.csdn.net/weixin_39544891/article/details/151015274

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:39:07

RPA 架构下的企微非官方 API:外部群主动调用的技术实现与优化

QiWe开放平台 个人名片 API驱动企微自动化&#xff0c;让开发更高效 核心能力&#xff1a;为开发者提供标准化接口、快速集成工具&#xff0c;助力产品高效拓展功能场景 官方站点&#xff1a;https://www.qiweapi.com 团队定位&#xff1a;专注企微API生态的技术服务团队 对接…

作者头像 李华
网站建设 2026/6/10 11:12:18

探索Matlab/Simulink三闭环直流电机调速系统仿真

matlab/simulink三闭环直流电机调速系统仿真加说明文档及相关材料 位置环&#xff0c;速度环&#xff0c;电流环均采用PI控制&#xff0c;用于控制电机的位置&#xff0c;转速及电流 采用PWM进行调制&#xff0c;H桥便于控制电机正反转 附赠两千多字说明文档及资料&#xff0c;…

作者头像 李华
网站建设 2026/6/10 11:12:35

<span class=“js_title_inner“>什么是闪电贷攻击? 3月区块链安全公开课,拆解DeFi协议的10大经典漏洞</span>

讲师介绍&#xff1a;Bosco&#xff0c;MS08067核心成员&#xff0c;香港科技大学博士&#xff0c;某安全公司前区块链高级安全研究员。 为了让大家获得最好的学习体验&#xff0c;本次特训营采用内部不公开授课&#xff0c;有意向同学扫描二维码加助教老师进入班级群。 名额有…

作者头像 李华
网站建设 2026/6/10 11:26:54

[STM32L5] 【STM32L562E-DK试用】第4辑:板载蓝牙的体验

这个开发板还支持无线通信功能&#xff0c;使用的是一个板载的蓝牙模块&#xff0c;就是下面这个小家伙&#xff1a; 这个也是一款ST的蓝牙模块——SPBTLE-RFTR&#xff0c;STMicroelectronics BlueNRG-M0蓝牙网络处理器模块是一款符合蓝牙4.2规范的主/从网络处理器模块。该模块…

作者头像 李华
网站建设 2026/6/10 11:03:55

python变量详解

好&#xff0c;这一题是 Python 入门到进阶都绕不开的核心。 我会按 “是什么 → 怎么用 → 底层原理 → 易错点 → 面试/实战总结” 给你一篇真正把变量讲透的说明。 Python 变量详解 一、Python 中的变量是什么&#xff1f; 一句话定义&#xff1a; Python 变量本质上是“对…

作者头像 李华