当前位置: 首页 > news >正文

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像

前言

  • 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2UE5仿真的通讯,达到小车自主导航的目的。
  • 本教程使用的环境:
    • ubuntu 22.04 ros2 humble
    • windows11 UE5.4.3
    • python8
  • 本系列教程将涉及以下内容:
    • UE仿真环境和简易小车的搭建
    • UE仿真雷达数据和RGBD深度相机数据的获取
    • 使用ROS2和UE5进行通讯
    • 使用ROS2导航Nav2及其相关模块对小车进行自主通讯
    • UE5部分C++编写和ROS2C++代码编写
    • 部分插件使用python进行编写
  • 本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客

UE介绍

请添加图片描述

  • UE5(Unreal Engine5)是由Epic Games开发的一款功能强大、跨平台的最新版的游戏开发引擎,以其高质量的实时渲染效果、多编程语言支持、丰富的市场资源和活跃的社区而闻名,广泛应用于游戏、影视、建筑等多个领域,不断推动着数字内容产业的发展。
  • 目前Unreal Engine(UE)主要支持以下编程语言:
      1. C++
      • C++是UE的核心编程语言,用于编写引擎的底层架构和游戏逻辑。
      • 它提供了最高的性能和灵活性,允许开发者直接访问和修改引擎的各个组件。
      • C++在UE中通过自定义的反射系统与蓝图系统紧密集成,使得C++类和函数可以在蓝图可视化编程环境中被使用。
    1. 蓝图(Blueprint)
      • 蓝图是UE的一种可视化脚本系统,它允许开发者通过拖拽连接节点的方式来创建逻辑和功能,无需编写传统的代码。
      • 蓝图降低了编程的入门门槛,使得非程序员也能参与到游戏和应用的开发中。
      • 蓝图可以与C++代码无缝交互,使得开发者可以根据需要选择最适合的编程方法。
安装
  • 本系列教程将使用最新版的UE5.4.3作为教程使用

  • 在下载UE需要先安装Epic Games Launcher,下载链接请添加图片描述

  • 下载完后初次进入会要求注册Epic账号,注册好后选择虚幻引擎的库选项,选择“+”号在下拉的菜单栏中选择5.4.3即可完成下载请添加图片描述

  • 注意下载可能需要根据个人需求安装对应的编辑器,这里我们使用的是VisualStudio2022请添加图片描述

  • 完成安装后我们选择创建一个全新的C++空白模板项目请添加图片描述

  • 创建完项目打开我们会得到以下的画面,这样就完成UE5.4版本的安装请添加图片描述


UnrealCV插件

  • UnrealCV是一个开源项目,旨在将Unreal Engine(UE)与计算机视觉(CV)领域结合起来。它允许开发者利用UE的高质量渲染能力来生成用于机器学习和计算机视觉研究的数据集和场景。UnrealCV提供了一个Python接口,允许用户通过Python脚本控制UE引擎,从而实现自动化场景渲染、数据采集和交互。请添加图片描述

  • 更多内容->UnrealCV官网

安装
  • 这里来介绍以下如何为UE5配置UnrealCV插件插件

  • 首先我们先登录UnrealCV的github仓库,由于官方提供的二进制release目前只支持到UE4.16版本,所以这里我们选择源码安装请添加图片描述

  • 注意选择5.2分支,目前UnrealCV已经支持到UE5.4版本请添加图片描述

  • git clone后我们会得到一个unrealcv的文件夹,文件夹内容大致如下请添加图片描述

  • 找到你的项目文件夹(该文件夹下有一个以.uproject结尾的项目文件),创建一个名为Plugins的文件夹请添加图片描述

  • 把上述你下载的unrealcv文件夹整个移动到Plugins文件交下,然后重新打开这个项目,项目会弹出UnrealCV插件是否进行编译的提示,选择是,然后就会进行编译请添加图片描述

  • 安装好后,在UE5界面左上角的编辑,在下拉菜单找到插件,搜索UnrealCV请添加图片描述

  • 返回UE主界面,找到绿色箭头开始运行此关卡(请务必记得这一步!!!)请添加图片描述

  • 在左下方的控制台输入vget /unrealcv/status确认插件配置情况请添加图片描述

  • 在左侧输出日志得到如下输出则表示插件配置成功请添加图片描述

报错指南
  • 控制台输入vget /unrealcv/statusUE直接闪退请添加图片描述

  • 检查是否进行绿色箭头开始运行此关卡此步骤(八成问题)

  • 检查UE下载是否完全,检查UE版本是否为5.4.3,检查unrealcv下载的分支是否为5.2


使用python对Unreal客户端与服务器进行连接通讯

  • UnrealCV 实现了在游戏和计算机视觉算法之间的进程间通信 (IPC)。这种通信可以用下图来总结。由UE创建的游戏将通过加载UnrealCV服务器作为其模块来扩展。当游戏启动时,UnrealCV将启动一个TCP 服务器并等待命令。任何程序都可以使用UnrealCV客户端代码发送纯文本 UnrealCV 命令来控制场景或检索信息。请添加图片描述

  • 下面我们来简单的写一段代码进行通讯测试,默认的UnrealCV服务器运行在本地的9000端口,我们通过简单的配置完成下述代码

from unrealcv import Client  
client = Client(('localhost', 9000))  # 连接到 UnrealCV 服务器  
if client.connect():  print('UnrealCV connected successfully')  
else:  print('UnrealCV is not connected')  exit()  response = client.request('vget /unrealcv/status')  
print(response)  
# 断开连接  
client.disconnect()
  • 上述运行结果将会输出和我们在UE控制台同样的内容输出,即视为通讯连接成功,此过程中确保UE允许了UnrealCV插件且UE处于运行此关卡中请添加图片描述

使用UnrealCV进深度和分割图像的获取

  • 这里我们介绍UnrealCV的一些基础用法,首先我们使用UE简单在摄像机视角前搭建一些简单物体请添加图片描述

  • 为相机添加初始位置,这里我们假定设置相机的位置为0,0,0(运行此关卡默认的摄像头视角就是0,0,0),注意这里必须设置,否则后面拍摄的深度和分割图像可能无法正确拍摄。

camera_settings = {  'location': {'x': 0, 'y': 0, 'z': 0},  # 相机位置  'rotation': {'pitch': 0, 'yaw': 0, 'roll': 0}  # 相机旋转  
}  
# 使用 vset 命令设置相机的位置  
client.request('vset /camera/0/location {x} {y} {z}'.format(**camera_settings['location']))  # 使用 vset 命令设置相机的旋转  
client.request('vset /camera/0/rotation {pitch} {yaw} {roll}'.format(**camera_settings['rotation']))
  • 然后我们在上述连接的基础上添加如下代码,下述的代码将保存
    • lit:摄像机原始图像
    • object_mask:物体分割图像
    • depth:深度图像(注意这里深度图像保存为npy格式)
client.request('vget /camera/0/lit C:/Users/lzh/Desktop/UE5_ROS2_project/camera/lit.png')  
client.request('vget /camera/0/object_mask C:/Users/lzh/Desktop/UE5_ROS2_project/camera/object_mask.png')  
client.request('vget /camera/0/depth C:/Users/lzh/Desktop/UE5_ROS2_project/camera/depth.npy')
  • 我们简单对图像进行展示,便得到以下图像请添加图片描述
# 加载图像  
lit_img = plt.imread(r'C:/Users/lzh/Desktop/UE5_ROS2_project/camera/lit.png')  
object_mask_img = plt.imread(r'C:/Users/lzh/Desktop/UE5_ROS2_project/camera/object_mask.png')  
depth_img = np.load(r'C:\Users\lzh\Desktop\UE5_ROS2_project\camera\depth.npy')  # 创建图形和子图  
fig, axes = plt.subplots(1, 3, figsize=(15, 5))  # 显示 lit 图像  
axes[0].imshow(lit_img)  
axes[0].set_title('Lit Image')  
axes[0].axis('off')  # 显示 object_mask 图像  
axes[1].imshow(object_mask_img, cmap='gray')  
axes[1].set_title('Object Mask')  
axes[1].axis('off')  # 显示 depth 图像  
axes[2].imshow(depth_img, cmap='gray', vmin=0, vmax=1300)  
axes[2].set_title('Depth Image')  
axes[2].axis('off')  # 显示图形  
plt.tight_layout()  
plt.show()

实时进行图像读取与显示

  • 上面我们进行了单张文件的保存,下面我们来介绍如何进行实时读取,这里我们介绍核心函数,通过下述三个函数,我们就能实时返回读取到的图像数据,为此我们需要进行解码
data=client.request('vget /camera/0/lit png')
data=client.request('vget /camera/0/object_mask png')
data=client.request('vget /camera/0/depth npy')
  • 对于普通图像和分割图像,我们只需要
lit_img = cv2.imdecode(np.frombuffer(self.data, np.uint8), cv2.IMREAD_COLOR)
object_mask_img = cv2.imdecode(np.frombuffer(self.data, np.uint8), cv2.IMREAD_COLOR)
  • 对于深度图像,如果我们希望使用opencv-python进行展示,我们需要进行转换
import io
def read_npy(self,res):  return np.load(io.BytesIO(res))
depth_img = self.read_npy(self.data)  
gray_depth = cv2.convertScaleAbs(depth_img, alpha=(255.0 / 1300.0))  
# 使用cv2.applyColorMap将灰度图转换为伪彩色图  
colored_depth = cv2.applyColorMap(gray_depth, cv2.COLORMAP_JET)  
  • 通过上述核心代码,我们只需要简单写一个循环,进行展示即可
  • 在不额外添加移动物体以及移动摄像机的前提下,我们移动观测者小球,便能得到以下实时画面
    在这里插入图片描述
    在这里插入图片描述

封装

  • 为了后续教程我们方便使用,我们封装以下整个流程
from unrealcv import Client  
import cv2  # OpenCV  
import numpy as np  
import io  
import time  
class UE5CameraCenter:  def __init__(self):  self._client = Client(('localhost', 9000))  self._connection_check()  self._camera_init()  self._lit_image=LitImage()  self._object_mask=ObjectMaskImage()  self._depth_mask=DepthImage()  def __del__(self):  self._client.disconnect()  def _connection_check(self):  '''检查是否连接'''  if self._client.connect():  print('UnrealCV connected successfully')  else:  print('UnrealCV is not connected')  exit()  def set_camera_pose(self,x,y,z,pitch,yaw,roll):  '''设置摄像头位置'''  camera_settings = {  'location': {'x': x, 'y': y, 'z': z},  # 相机位置  'rotation': {'pitch': pitch, 'yaw': yaw, 'roll': roll}  # 相机旋转  }  # 设置相机的位置  self._client.request('vset /camera/0/location {x} {y} {z}'.format(**camera_settings['location']))  # 设置相机的旋转  self._client.request('vset /camera/0/rotation {pitch} {yaw} {roll}'.format(**camera_settings['rotation']))  def _camera_init(self):  '''摄像头初始化'''  self.set_camera_pose(0,0,0,0,0,0)  def get_camera_data(self, camera_type):  valid_types = {'lit', 'object_mask', 'depth'}  # 检查 camera_type 是否在有效类型中  if camera_type not in valid_types:  raise ValueError(f"Invalid camera type. Expected one of {valid_types}, but got '{camera_type}'.")  # 根据camera_type获取相应的数据  if camera_type == 'lit':  return self._lit_image.get_image(self._client)  elif camera_type == 'object_mask':  return self._object_mask.get_image(self._client)  elif camera_type == 'depth':  return self._depth_mask.get_image(self._client)  def test(self):  while True :  self._lit_image.get_image(self._client)  self._object_mask.get_image(self._client)  self._depth_mask.get_image(self._client)  self._lit_image.display()  self._object_mask.display()  self._depth_mask.display()  class Image:  def __init__(self):  self.data_np = None  def get_image(self,client):  pass  def display(self):  pass  class LitImage(Image):  def __init__(self):  self.data_np = None  def get_image(self,client):  data = client.request('vget /camera/0/lit png')  self.data_np=cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)  def display(self):  cv2.imshow("lit_img", self.data_np)  key = cv2.waitKey(1)  
class ObjectMaskImage(Image):  def __init__(self):  self.data_np = None  def get_image(self,client):  data=client.request('vget /camera/0/object_mask png')  self.data_np=cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)  def display(self):  cv2.imshow("object_mask_data", self.data_np)  key = cv2.waitKey(1)  
class DepthImage(Image):  def __init__(self):  self.data_np = None  def get_image(self,client):  data=client.request('vget /camera/0/depth npy')  self.data_np = self.read_npy(data)  def display(self):  gray_depth = cv2.convertScaleAbs(self.data_np, alpha=(255.0 / 1300.0))  # 使用cv2.applyColorMap将灰度图转换为伪彩色图  colored_depth = cv2.applyColorMap(gray_depth, cv2.COLORMAP_JET)  cv2.imshow("depth_img", colored_depth)  def read_npy(self,res):  return np.load(io.BytesIO(res))  def main():  ue5_cam_center=UE5CameraCenter()  ue5_cam_center.test()  
if __name__ =='__main__':  main()
  • 并预留三个接口
    • 设置摄像机位置def set_camera_pose(self,x,y,z,pitch,yaw,roll):
    • 获取摄像机图像def get_camera_data(self, camera_type):
    • 测试(显示摄像机画面)def test(self):

UnrealCV指令大全

通用命令
  • vget /unrealcv/status:获取 UnrealCV 插件的状态。
  • vget /unrealcv/help:列出所有可用的命令及其帮助信息。
  • vget /unrealcv/version:获取 UnrealCV 的版本信息。
  • vget /scene/name:获取当前场景的名称。
  • vget /level/name:获取当前级别的名称。
对象命令
  • vget /objects:获取场景中所有对象的名称。
  • vset /objects/spawn_cube:在场景中生成一个用于调试的立方体。
  • vget /object/[str]/location:获取指定对象的坐标位置。
  • vset /object/[str]/location [float] [float] [float]:设置指定对象的坐标位置。
  • vget /object/[str]/rotation:获取指定对象的旋转。
  • vset /object/[str]/rotation [float] [float] [float]:设置指定对象的旋转。
  • vset /object/[str]/color [uint] [uint] [uint]:设置指定对象的颜色。
  • vset /object/[str]/destroy:销毁指定对象。
相机命令
  • vget /cameras:列出场景中所有传感器(相机)。
  • vset /camera/[uint]/location [float] [float] [float]:设置指定相机的位置。
  • vset /camera/[uint]/rotation [float] [float] [float]:设置指定相机的旋转。
  • vget /camera/[uint]/lit [str]:从指定相机获取光照图像。
  • vget /camera/[uint]/depth [str]:从指定相机获取深度图像。
  • vget /camera/[uint]/normal [str]:从指定相机获取表面法线图像。
  • vget /camera/[uint]/object_mask [str]:从指定相机获取对象掩码图像。
  • vset /camera/[uint]/fov [float]:设置指定相机的视场角。
视图模式命令
  • vset /viewmode [str]:设置视图模式,如 lit(光照)、normal(法线)、depth(深度)、object_mask(对象掩码)等。
  • vget /viewmode:获取当前的视图模式。
其他命令
  • vrun [str]:运行 Unreal 引擎内置的命令。
  • vexec [str]:运行 Unreal 引擎蓝图函数。
  • vbp [str]:运行 Unreal 引擎蓝图函数。

小结

  • 本节介绍了如何使用UnrealCV插件在UE中获取原始,深度,分割图像,并实时进行读取
  • 下一节我们将进行跨平台实现图像数据的传输
  • 感谢大家对本教程的支持,如有错误,欢迎指出~

相关文章:

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程使用的环境: ubuntu 22.04 ros2 humblewindows11 UE5.4.3python8 本系列教程将涉及以…...

Java算法解析一:二分算法及其衍生出来的问题

这个算法的前提是,数组是升序排列的 算法描述: i和j是指针可以表示查找范围 m为中间值 当目标值targat比m大时,设置查找范围在m右边:i m-1 当目标值targat比m小时,设置查找范围在m左边:j m1 当targat的…...

数学建模预测类—【一元线性回归】

每日格言:行动是治愈恐惧的良药,而犹豫拖延将不断滋养恐惧. 目录 前言 一、什么是回归分析? 1.概念理解 2.分类和一般步骤 二、一元线性回归(Matlab算法) 1.利用regress函数 2、例题讲解 总结 前言 在具体讲述线性回归…...

配置更加美观的 Swagger UI

//注册Swagger服务 private static void AddSwaggerService(IServiceCollection services){services.AddSwaggerGen(opt >{opt.SwaggerDoc("Push", new OpenApiInfo{Version "v1",Title "Push API",Description "Push API 文档"…...

软件测试 - 基础(软件测试的生命周期、测试报告、bug的级别、与开发人员产生争执的调解方式)

一、软件测试的生命周期 测试贯穿软件的整个生命周期 软件测试的生命周期: 需求分析 →测试计划→ 测试设计、测试开发→ 测试执行→ 测试评估->上线->运行维护 需求分析:判断用户的需求是否合理,是否可实现 测试计划:计划项…...

RTX 4070 GDDR6显存曝光:性能与成本的平衡之选

近期,关于NVIDIA RTX 4070新显卡的信息曝光,这款显卡将配备较为缓慢的GDDR6显存,而非更高性能的GDDR6X。这一配置的选择引发了业内的广泛关注,特别是在性能与成本的平衡问题上。 新版RTX 4070 OC 2X的核心特点 **1.显存类型与带…...

canvas的基础使用

canvas的基础使用 一、画一条直线二、线的属性设置三、防止多次绘制的样式污染四、闭合五、快捷绘制矩形六、绘制圆形七、绘制文字八、绘制图片js版dom版图片截取 一、画一条直线 画一条直线需要用到三个方法&#xff1a;cxt.moveTo、cxt.lineTo、cxt.stroke <canvas id&qu…...

Windows 常用网络命令之 telnet(测试端口是否连通)

文章目录 1 概述1.1 启用 telnet 2 常用命令2.1 ping&#xff1a;测试网络是否连通2.2 telnet&#xff1a;测试端口是否连通 3 扩展3.1 进入 cmd 命令3.2 cls 清屏命令 1 概述 1.1 启用 telnet telnet ip:port // 格式 telnet 10.0.24.154:8001若出现上述提示&…...

x264 编码器像素运算系列:asd8函数

x264 编码器中像素间运算 在 x264 编码器中有多种像素间的运算,如下: sad 计算:SAD(Sum of Absolute Differences,绝对差值和)是一种在图像处理和视频编码中常用的度量,用于计算两个图像块之间的差异。SAD值越小,表示两个图像块越相似。hadamard_ac计算:用于计算Hadam…...

什么是AR、VR、MR、XR?

时代背景 近年来随着计算机图形学、显示技术等的发展&#xff0c;视觉虚拟化技术得到了广泛的发展&#xff0c;并且越来越普及化&#xff0c;慢慢的也走入人们的视野。目前市场上视觉虚拟化技术的主流分为这几种 VR、AR、MR、XR。这几项技术并不是最近才出现的&#xff0c;VR的…...

Epic Games 商店面向欧盟 iPhone 用户上线

Epic Games Store 终于在欧盟推出&#xff0c;为玩家提供了不通过 App Store 就能在 iPhone上访问游戏的途径。在经历了漫长而昂贵的关于支付和竞争对手应用程序店面的法律战&#xff0c;以及公证方面的麻烦之后&#xff0c;Epic Games 成功地为App Store 带来了一个数字店面。…...

【计算机毕设项目】2025级计算机专业小程序项目推荐 (小程序+后台管理)

以下项目选题适合计算机专业大部分专业&#xff0c;技术栈主要为&#xff1a;前端小程序&#xff0c;后端Java语言&#xff0c;数据库MySQL 后台免费获取源码&#xff0c;可提供远程调试、环境安装配置服务。&#xff08;文末有联系方式&#xff09; 以下是本次部分项目推荐1…...

Fast API + LangServe快速搭建 LLM 后台

如果快速搭建一个 LLM 后台 API&#xff0c;使前端可以快速接入 LLM API。LangChain 或者 LlamaIndex 架构都可以快速集成各种大语言模型&#xff0c;本文将讲述如何通过 Fast API LangServe 快速的搭建一个后台 Rest API 服务。LLM 这些框架现在主打一个就是快速&#xff0c;…...

CSS继承、盒子模型、float浮动、定位、diaplay

一、CSS继承 1.文字相关的样式会被子元素继承。 2.布局样式相关的不会被子元素继承。&#xff08;用inherit可以强行继承&#xff09; 实现效果&#xff1a; 二、盒子模型 每个标签都有一个盒子模型&#xff0c;有内容区、内边距、边框、外边距。 从内到外&#xff1a;cont…...

使用百度文心智能体创建AI旅游助手

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…...

斗破C++编程入门系列之四:运算符和表达式

鸡啄米C 记住首页不迷路&#xff1a; http://www.jizhuomi.com/software/129.html 斗破观看顺序&#xff1a; https://v.haohuitao.cc/yhplay/336-1-2.html 第一季☞第二季前2集☞特别篇1☞第二季3&#xff5e;12集☞特别篇2沙之澜歌☞第三季☞第四季☞三年之约☞缘起☞年番…...

CVPR2024 | PromptAD: 仅使用正常样本进行小样本异常检测的学习提示

PromptAD: 仅使用正常样本进行小样本异常检测的学习提示 论文名称&#xff1a;PromptAD: Learning Prompts with only Normal Samples for Few-Shot Anomaly Detection 论文地址&#xff1a;https://arxiv.org/pdf/2404.05231 研究背景 异常检测&#xff08;Anomaly Detecti…...

文件批量上传,oss使用时间戳解决同名问题 以及一些sql bug

1.文件批量上传 ApiOperation(value "文件批量上传")PostMapping("/multipleImageUpload")Transactional(rollbackFor Exception.class)public Result multipleImageUpload(ApiParam(name "files",value "文件",required true) R…...

机器学习——线性回归(sklearn)

目录 一、认识线性回归 1. 介绍 2. 多元线性回归的基本原理&#xff08;LinearRegression&#xff09; 二、多重共线性 1. 介绍 2. 多重共线性详细解释 三、岭回归&#xff08;解决多重共线性问题&#xff09; 1. 模型推导 2. 选取最佳的正则化参数取值 四、Lasso&am…...

Go 语言切片(Slice) 15

在 Go 语言中&#xff0c;切片(Slice)是一种可以容纳多个值的数据结构&#xff0c;它可以被视为一个可变的数组。切片是一个引用类型&#xff0c;它可以容纳任意类型的值&#xff0c;可以是整数、字符串、浮点数、结构体等。 切片的声明方式是使用 [] 语法&#xff0c;例如&am…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...