a sort.py demo

 这份代码展示了如何使用 sort.py。注意,此处,我将文件名改为 my_sort.py。

你并不能直接 copy 使用,因为环境,包,还有模型。

此处使用 SSD-MobileNetv2 进行物体检测,将结果传入以 np 数组的形式传入sort 模块,经过处理,以 np.empty((0, 5))的格式传出,在绘画模块,提取信息,标识矩形框和物体ID。

#!/home/ncut/miniconda3/envs/tf/bin/python
# -*- coding: utf-8 -*-
import rospy
import tensorflow as tf
import cv2
import numpy as np
import time
from sensor_msgs.msg import Image
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge, CvBridgeError
from my_sort import Sort  # 确保 my_sort 模块在 Python 路径下# --------------------- 模型推理模块 ---------------------
def load_model(model_dir):"""加载 TensorFlow SavedModel(例如 ssd-mobilenet-v2 或 efficientdet)返回推理函数。"""model = tf.saved_model.load(model_dir)infer = model.signatures["serving_default"]return inferdef preprocess_frame(frame):"""预处理输入图像:- 将 BGR 转换为 RGB(模型输入要求)- 将图像 resize 为 320x320,并扩展 batch 维度返回:input_tensor: 模型输入 tensorwidth: 原图宽度height: 原图高度"""img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)resized_frame = cv2.resize(frame, (320, 320), interpolation=cv2.INTER_AREA)input_tensor = tf.convert_to_tensor(resized_frame, dtype=tf.uint8)input_tensor = tf.expand_dims(input_tensor, 0)  # 增加 batch 维度height, width = frame.shape[:2]return input_tensor, width, heightdef run_inference(infer, input_tensor):"""利用推理函数执行模型预测,返回检测框和置信度。"""detections = infer(input_tensor)num_detections = int(detections['num_detections'].numpy()[0])boxes = detections['detection_boxes'].numpy()[0][:num_detections]scores = detections['detection_scores'].numpy()[0][:num_detections]return boxes, scoresdef convert_detections_to_sort(boxes, scores, width, height, threshold=0.5):"""将检测结果(归一化坐标)转换为 SORT 跟踪器所需格式:[x1, y1, x2, y2, score]"""sort_inputs = []for i in range(len(scores)):if scores[i] < threshold:continueymin, xmin, ymax, xmax = boxes[i]x1 = int(xmin * width)x2 = int(xmax * width)y1 = int(ymin * height)y2 = int(ymax * height)sort_inputs.append([x1, y1, x2, y2, scores[i]])return np.array(sort_inputs)# --------------------- 跟踪与可视化模块 ---------------------
def draw_tracks(frame, tracks):"""在图像上绘制跟踪结果(边框和跟踪ID)。"""for track in tracks:x1, y1, x2, y2, track_id = track.astype(int)cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(frame, f"ID: {track_id}", (x1, y1 - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 2)return frame# --------------------- ROS 图像订阅与处理模块 ---------------------
# 全局变量:模型推理函数、SORT 跟踪器、CvBridge 实例
infer = None
tracker = None
bridge = CvBridge()def image_callback(msg):"""ROS 图像回调函数:- 将 ROS 图像消息转换为 OpenCV 格式- 进行模型推理和 SORT 跟踪- 显示带跟踪结果的图像"""global infer, tracker, bridgetry:cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") # raw#cv_image = bridge.compressed_imgmsg_to_cv2(msg,"bgr8") #compressed compressed_imgmsg_to_cv2except CvBridgeError as e:rospy.logerr("CvBridge 转换错误: %s", e)return# 图像预处理和模型推理input_tensor, width, height = preprocess_frame(cv_image)boxes, scores = run_inference(infer, input_tensor)detections = convert_detections_to_sort(boxes, scores, width, height, threshold=0.5)# 更新 SORT 跟踪器并绘制跟踪结果tracks = tracker.update(detections)tracked_frame = draw_tracks(cv_image.copy(), tracks)# 显示带跟踪结果的图像cv2.imshow("Tracking", tracked_frame)cv2.waitKey(1)def main():global infer, tracker# 初始化 ROS 节点rospy.init_node("tracking_inference_node", anonymous=True)# 加载模型model_dir = "/home/ncut/models/ssd-mobilenet-v2"  # 根据需要更新模型路径time_before_load = time.time()infer = load_model(model_dir)time_after_load = time.time()rospy.loginfo("模型加载耗时:%.2f 秒", time_after_load - time_before_load)# 初始化 SORT 跟踪器tracker = Sort(max_age=1, min_hits=3, iou_threshold=0.3)# 订阅图像话题 below is a description of the car launch file astra    /camera/rgb/image_raw/compressed# to original photo, topic is /camera/rgb/image_raw                 average rate is 2Hz     4.02MB/s# to compressed photo, topic is /camera/rgb/image_raw/compressed    average rate is 30Hz    1.25MB/srospy.Subscriber("/camera/rgb/image_raw", Image, image_callback)    # Image for raw, CompressedImage for compressedrospy.loginfo("Tracking Inference Node 已启动,订阅话题:/camera/rgb/image_raw")# ROS 循环等待消息rospy.spin()cv2.destroyAllWindows()if __name__ == '__main__':try:main()except rospy.ROSInterruptException:pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Redis解决:集群的Session共享问题

使用Redis解决&#xff1a;集群的Session共享问题 session共享问题&#xff1a;多台Tomcat并不共享session存储空间&#xff0c;当请求切换到不同的tomcat服务时导致数据丢失的问题。 问题背景 ​无状态HTTP协议&#xff1a;HTTP协议本身是无状态的&#xff0c;服务器无法直接识…

Linux 内核知识体系[1]

1 Linux内核知识体系 2.Linux内核学习路线 2.1基础知识准备 操作系统基础&#xff1a;了解操作系统的概念和基本原理&#xff0c;包括进程管理、内存管理、文件系统、输入输出等。 书籍&#xff1a;《操作系统&#xff1a;设计与实现》&#xff08;Andrew S. Tanenbaum&…

KiActivateWaiterQueue函数和Queue->Header.WaitListHead队列等待列表的关系

第一部分&#xff1a; if (Thread->ApcState.KernelApcPending && (Thread->SpecialApcDisable 0) && (Thread->WaitIrql < APC_LEVEL)) { } else { // // Insert wait block in ob…

让DeepSeek API支持联网搜索

引子 DeepSeek官网注册的API token是不支持联网搜索的&#xff0c;这导致它无法辅助分析一些最新的情况或是帮忙查一下互联网上的资料。本文从实战角度提供一种稳定可靠的方法使得DeepSeek R1支持联网搜索分析。 正文 首先登录火山方舟控制台&#xff0c;https://www.volcen…

生物信息Rust-01

前言-为什么想学Rust&#xff1f; 一直想多学一门编译语言&#xff0c;主要有几个原因吧&#xff08;1. 看到一位老师实验室要求需要掌握一门编译语言&#xff1b;2. 自己享想试着开发一些实用的生信工具&#xff0c;感觉自己现在相比于数据分析&#xff0c;探索生物学层面的意…

字符串与相应函数(上)

字符串处理函数分类 求字符串长度&#xff1a;strlen长度不受限制的字符串函数&#xff1a;strcpy,strcat,strcmp长度受限制的字符串函数:strncpy,strncat,strncmp字符串查找&#xff1a;strstr,strtok错误信息报告&#xff1a;strerror字符操作&#xff0c;内存操作函数&…

asm汇编源代码之文件操作相关

提供7个子程序:   1. 关闭文件 FCLOSE   2. 打开文件 FOPEN   3. 文件大小 FSIZE   4. 读文件 FREAD   5. 写文件 FWRITE   6. 建立文件 FCREATE   7. 读取或设置文件指针 FPOS 具体功能及参数描述如下 ; ---------------------------- FCLOSE PROC  FAR ; IN…

[Dify] 使用 Docker 本地部署 Dify 并集成 Ollama 模型的详细指南

在 AI 应用快速发展的今天&#xff0c;开源项目如 Dify 正成为构建本地化 AI 应用的利器。通过 Dify&#xff0c;你可以轻松地集成不同的大语言模型&#xff08;LLM&#xff09;&#xff0c;如 Ollama&#xff0c;并快速创建可交互的 AI 应用。本篇文章将带你一步步通过 Docker…

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…

DevOps与功能安全:Perforce ALM通过ISO 26262合规认证,简化安全关键系统开发流程

本文来源perforce.com&#xff0c;由Perforce中国授权合作伙伴、DevSecOps解决方案提供商-龙智翻译整理。 近日&#xff0c;Perforce ALM&#xff08;原Helix ALM&#xff09;通过了国际权威认证机构 TV SD的ISO 26262功能安全流程认证&#xff01;该认证涵盖Perforce ALM解决方…

Android11车载WiFi热点默认名称及密码配置

一、背景 基于车厂信息安全要求,车载热点默认名称不能使用统一的名称,以及默认密码不能为简单的1~9。 基于旧项目经验,组装工厂自动化测试及客户整车组装的时候均存在多台设备同时打开,亦不太推荐使用统一的热点名称,连接无法区分。 二、需求 根据客户的要求,默认名称…

MacOs java环境配置+maven环境配置踩坑实录

oracl官网下载jdk 1.8的安装包 注意可能需要注册&#xff01;&#xff01;&#xff01; 下载链接&#xff1a;下载地址点击 注意晚上就不要下载了 报错400 &#xff01;&#xff01;&#xff01; 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…

如何解读 /proc/net/netstat

在刷了屏的川普&#xff0c;关税&#xff0c;AI 大模型和 RDMA 之外的一股清流&#xff0c;来点实用的。 众所周知 /proc/net/netstat 很难读&#xff0c;且 netstat 并不是每个系统上都支持 -s&#xff0c;那么对齐该文件给出一个可读的输出就是一件高尚的事。可以用 column …

汉化进度100%

P3834 #include<bits/stdc.h> #define int long long #define 定义整型变量 int #define 这是一个常量 const #define 无返回值函数 void #define 这是一个循环条件在后面 for #define 定义结构体 struct #define 如果 if #define 否则 else #define 定义无返回值的 sig…

基于SpringBoot的动物救助中心系统(源码+数据库)

500基于SpringBoot的动物救助中心系统&#xff0c;本系统共分为2个角色&#xff1a;系统管理员、用户&#xff0c;主要功能如下 【管理员】&#xff1a; 1. 登录&#xff1a;管理员可以通过登录系统来管理各种功能。 2. 用户管理&#xff1a;管理员可以查看用户列表&#xff0…

rockylinux 8 9 升级到指定版本

rockylinux 8 update 指定版本 rockylinux 历史版 所有版本rockylinux 最新版 所有版本vault历史版 pub最新版(https://dl.rockylinux.org)地址后面增加不同名称 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new rockylinux repo" cat <<EO…

聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?

【全球云观察 &#xff5c; 科技热点关注】 随着近年来AI与大模型的兴起&#xff0c;云计算行业正在发生着一场大变局。 “在2025年春节期间&#xff0c;DeepSeek两周火爆全球&#xff0c;如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出&#xff0c;AI与…

React8+taro开发微信小程序,实现lottie动画

安装核心依赖 npm install lottie-miniprogram tarojs/plugin-html --save修改 Taro 配置 (config/index.js) const config {plugins: [tarojs/plugin-html,// 其他插件...],mini: {canvas: true,webpackChain(chain) {chain.merge({module: {rule: {lottie-loader: {test: …

有效压缩 Hyper-v linux Centos 的虚拟磁盘 VHDX

参考&#xff1a; http://www.360doc.com/content/22/0505/16/67252277_1029878535.shtml VHDX 有个不好的问题就是&#xff0c;如果在里面存放过文件再删除&#xff0c;那么已经使用过的空间不会压缩&#xff0c;导致空间一直被占用。那么就需要想办法压缩空间。 还有一点&a…

【力扣hot100题】(089)最长有效括号

这题目真是越做越难了。 但其实只是思路很难想到&#xff0c;一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组&#xff0c;维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够&#xff0c;看了答案…