Unity中用Sentis部署YOLOv8 Nano实现移动端实时目标检测

news2026/5/22 2:32:05
1. 为什么是YOLOv8 Nano Sentis不是ONNX Runtime也不是TensorRT去年在做一个AR巡检项目时我卡在物体检测环节整整三周。客户要求在中端安卓手机骁龙665上实现每秒15帧以上的实时检测同时要识别7类工业零件。一开始用Unity原生插件调用Python后端延迟高、断连频繁换过ONNX Runtime for Unity模型加载成功了但推理耗时稳定在120ms以上帧率压根上不去试过把YOLOv5s转成TensorRT再封装成C DLL供Unity调用结果发现驱动兼容性问题太多——测试机里有三分之一机型直接黑屏重启。直到某天翻Unity官方博客看到Sentis正式GA的公告顺手点开文档里的“Supported Models”表格一眼扫到YOLOv8 Nano被明确列为“fully supported”。当时没多想只当是又一个营销话术。结果真把yolov8n.onnx拖进Sentis Model Importer勾选“Optimize for mobile”点击Import——模型直接变成一个.sentis文件双击还能在Editor里预览输入输出张量形状。更关键的是在Pixel 4a上实测推理耗时压到了38ms配合异步纹理上传GPU管线优化最终稳稳跑出23FPS。这不是玄学。Sentis本质是Unity自研的轻量级推理引擎不依赖系统级AI框架比如Android的NNAPI或iOS的Core ML而是把模型编译成统一中间表示IR再针对目标平台GPU/CPU特性做深度定制化codegen。它绕开了传统跨语言调用的序列化/反序列化开销也规避了第三方运行时对设备驱动版本的强绑定。YOLOv8 Nano之所以能成为Sentis首批重点适配对象核心在于它的结构极简Backbone只有6个C2f模块Neck全靠一次上采样拼接Head干脆去掉解耦设计直接用单层卷积输出box/conf/cls。这种“瘦模型”天然契合Sentis对算子粒度和内存带宽的苛刻要求。提示别被“Nano”二字误导。YOLOv8 Nano不是YOLOv8s的简单剪枝版而是从头设计的超轻量架构——参数量仅2.3MFP16精度下模型体积5MB且在COCO val2017上mAP0.5仍达37.3%。这意味着你能在Unity AssetBundle里塞进3~4个不同场景的专用检测模型而不会让包体膨胀失控。我后来对比过同一台设备上三种方案的内存占用曲线ONNX Runtime峰值RSS达480MBTensorRT方案因需预分配CUDA context占掉320MB而Sentis全程稳定在190MB左右。这个数字背后是Sentis对内存池的精细管理——它把模型权重、激活缓存、临时张量全部纳入统一生命周期控制甚至支持手动触发GC回收闲置缓冲区。这对Unity项目太关键了你再也不用担心检测模块长期运行导致GC spike引发卡顿。所以当你看到标题里“UnitySentis玩转YOLOv8 Nano”请先理解这组组合的本质它不是技术堆砌而是为移动实时AI推理量身定制的最小可行闭环。接下来所有操作都围绕如何把这个闭环从Demo跑通推进到生产可用展开。2. 模型准备从Ultralytics训练到Sentis兼容的完整链路很多人以为“把YOLOv8 Nano的ONNX导出扔进Sentis”就完事了结果导入时报错“Unsupported operator: Resize”。这其实是Ultralytics默认导出配置埋的坑——它用的是onnx opset 17的动态Resize算子而Sentis当前2024.2版只支持opset 11的静态Resize。这个问题不解决后面所有优化都是空中楼阁。2.1 正确导出ONNX的三步法第一步必须锁定opset版本。打开Ultralytics源码中的ultralytics/engine/exporter.py找到_export_onnx方法在torch.onnx.export调用前插入# 强制使用opset 11 torch.onnx.export( model, im, f, opset_version11, # 关键必须设为11 ... )第二步禁用动态轴。YOLOv8默认导出时会把batch size和image size设为动态维度-1Sentis无法处理。修改导出脚本在input_names后添加# 固定输入尺寸假设训练用640x640 dynamic_axes { images: {0: batch, 2: height, 3: width}, # 原始动态轴 } # 改为静态轴注释掉dynamic_axes或设为空字典 dynamic_axes {}第三步替换Resize算子。Ultralytics的Detect层里有个上采样操作会生成Resize节点。我们得把它替换成Upsampleopset 11支持。在导出前插入模型重写逻辑from ultralytics.utils.torch_utils import initialize_weights # 在model.eval()之后export之前执行 for m in model.modules(): if isinstance(m, torch.nn.Upsample): m.recompute_scale_factor False # 避免生成Resize完成这三步后导出命令变成yolo export modelyolov8n.pt formatonnx opset11 dynamicFalse你会得到一个yolov8n.onnx用Netron打开检查所有Resize节点应消失取而代之的是Upsample输入张量shape固定为[1,3,640,640]输出节点名应为output0Sentis要求单输出。2.2 Sentis模型导入的隐藏开关把ONNX拖进Unity Project窗口后Inspector里会出现Sentis Model Importer面板。这里有两个关键选项常被忽略Optimize for mobile必须勾选。它会启用Sentis的移动端专属优化通道包括算子融合如ConvBNSiLU合并为单kernel、内存复用激活缓存与权重缓存共享显存池、半精度计算自动将FP32权重转FP16。Enable GPU acceleration在Android/iOS平台必须开启。但注意它不等于“强制GPU”而是让Sentis根据设备能力动态选择——低端机自动fallback到CPU高端机启用GPU。实测发现开启此选项后Pixel 4a的推理耗时从42ms降至38ms而iPhone SE2020从51ms降至45ms。注意导入后务必点击右下角“Reimport”按钮。很多人改完设置忘了点这个导致优化未生效。Sentis的缓存机制很顽固不点ReimportEditor里看到的还是旧编译结果。2.3 输入预处理的陷阱BGR→RGB与归一化顺序YOLOv8训练时用的是RGB输入[0,1]归一化除以255但OpenCV读图默认BGR很多Unity开发者直接用Texture2D.ReadPixels读取屏幕纹理结果得到的是RGBA格式——R/G/B通道错位。我见过最典型的错误是模型检测出一堆“幽灵框”实际是因为输入数据的B通道被当成了R通道喂给网络。正确做法分两步通道校准在C#脚本中创建预处理材质MaterialShader用如下片段// Preprocess.shader half4 frag (v2f i) : SV_Target { half4 col tex2D(_MainTex, i.uv); // RGBA → RGB → BGR因为YOLOv8训练用BGR不这是误区 // 实际Ultralytics默认用RGB所以只需丢弃A通道 return half4(col.rgb, 1.0); }归一化时机千万别在CPU端做/255.0Sentis支持在GPU侧完成归一化效率高且避免精度损失。在Sentis Model Importer里勾选“Normalize inputs”填入mean[0.0,0.0,0.0]、std[1.0,1.0,1.0]即不做减均值然后在代码中传入[0,255]范围的uint8纹理——Sentis会在GPU kernel里自动执行texel / 255.0。这个细节让预处理耗时从CPU端的8ms降至GPU端的0.3ms对帧率提升肉眼可见。3. Unity端集成从模型加载到检测结果解析的硬核实现Sentis的C# API设计得很“Unity味”——没有复杂的Session/Context概念一切围绕Model、Tensor、InferenceSession三个核心类展开。但官方文档里藏着几个关键限制不提前知道会浪费大量调试时间。3.1 模型加载的线程安全边界Model.Load()必须在主线程调用但InferenceSession的创建和Run()可以放在子线程。这是Unity对Native Plugin调用的硬性约束。我最初把Model.Load()放进协程结果在Android上随机崩溃——日志显示JNI ERROR (app bug): local reference table overflow。正确模式是// Start()中同步加载 private void Start() { // 主线程加载模型耗时约120ms可加Loading UI _model Model.Load(Path.Combine(Application.streamingAssetsPath, yolov8n.sentis)); // 创建session可异步但必须在主线程 _session new InferenceSession(_model); } // 检测逻辑放协程或Job System private IEnumerator DetectCoroutine() { while (isRunning) { yield return new WaitForEndOfFrame(); // 在子线程调用Run需用ThreadSafeTensor RunDetectionAsync(); } }提示Model.Load()的耗时与模型大小正相关。YOLOv8 Nano约4.8MB加载120ms若你用YOLOv8s25MB加载会飙到600ms以上。建议启动时用Addressable预加载或拆分模型为多个小sentis文件按需加载。3.2 输入Tensor的内存管理雷区Sentis要求输入Tensor必须是TensorType.Float32且shape严格匹配模型输入[1,3,640,640]。常见错误是直接用new Tensor(...)创建托管内存Tensor结果Run()时抛出InvalidMemoryLayoutException。根本原因是Sentis的GPU加速路径需要Native内存由Unity Graphics API直接管理。正确做法是用Tensor.CreateGPU// 创建GPU Tensor关键 _inputTensor Tensor.CreateGPU( new TensorShape(1, 3, 640, 640), TensorType.Float32 ); // 从RenderTexture拷贝数据假设rt是640x640的RGB渲染纹理 Graphics.Blit(rt, _inputTexture); // _inputTexture是RenderTexture _inputTensor.CopyFromGPU(_inputTexture); // 自动处理格式转换这里_inputTexture必须是RenderTextureFormat.RFloat或RHalf否则CopyFromGPU会失败。我踩过的坑是用了DefaultHDR格式结果拷贝后数据全为0——因为HDR纹理的像素值范围远超[0,1]而Sentis期望的是标准LDR范围。3.3 输出解析从raw float数组到BoundingBox的完整映射YOLOv8 Nano的输出是[1, 84, 8400]的float数组8441nc8400anchors数量。Sentis返回的outputTensor.ToReadOnlyArray()是一维数组需要手动reshape并解码。官方示例代码只给了伪代码实际工程中必须处理三个关键点Anchor网格索引8400不是随便来的它是80x80 40x40 20x20三个检测头的anchor数量和。每个头的stride不同8/16/32需按位置反推属于哪个头。坐标解码公式YOLOv8用的是xywh格式但Sentis输出的是归一化后的cx,cy,w,h。解码公式为x1 (cx - w/2) * image_width y1 (cy - h/2) * image_height x2 (cx w/2) * image_width y2 (cy h/2) * image_heightNMS后处理Sentis不提供内置NMS必须自己实现。我用的是快速版CPU NMS非极大值抑制阈值设0.45IOU阈值0.2。实测在Pixel 4a上处理8400个候选框耗时仅1.2ms。以下是精简后的解析核心代码private ListBoundingBox ParseOutput(float[] rawOutput) { var boxes new ListBoundingBox(); const int numClasses 1; // 示例单类别 const int numAnchors 8400; const int numAttrs 4 1 numClasses; // cx,cy,w,h,conf,cls for (int i 0; i numAnchors; i) { int offset i * numAttrs; float conf rawOutput[offset 4]; if (conf 0.25f) continue; // 置信度过滤 float cx rawOutput[offset 0]; float cy rawOutput[offset 1]; float w rawOutput[offset 2]; float h rawOutput[offset 3]; float clsScore rawOutput[offset 5]; // 单类别时即conf // 解码为像素坐标假设输入尺寸640x640输出缩放到屏幕尺寸 float x1 (cx - w * 0.5f) * 640; float y1 (cy - h * 0.5f) * 640; float x2 (cx w * 0.5f) * 640; float y2 (cy h * 0.5f) * 640; boxes.Add(new BoundingBox { X Mathf.Clamp(x1, 0, 640), Y Mathf.Clamp(y1, 0, 640), Width Mathf.Clamp(x2 - x1, 0, 640), Height Mathf.Clamp(y2 - y1, 0, 640), Confidence conf * clsScore, ClassId 0 }); } // CPU NMS此处省略具体实现用标准算法即可 return ApplyNMS(boxes, 0.2f); }注意Mathf.Clamp必不可少。YOLOv8的回归分支可能输出负坐标或超界值不裁剪会导致后续DrawRect崩溃。4. 性能压榨从38ms到22ms的七项实战优化在客户验收现场我遇到一个致命问题连续检测5分钟帧率从23FPS掉到14FPS。Profiler显示Gfx.WaitForPresentOnGpu耗时暴涨GPU温度飙升至48℃。这说明优化不能只盯着模型推理必须打通“采集-预处理-推理-后处理-渲染”全链路。以下是我在真实项目中验证有效的七项优化4.1 输入分辨率动态降级策略YOLOv8 Nano在640x640下mAP37.3%但在320x320下仍有32.1%。我设计了一个分级策略初始阶段用640x640保证精度连续3帧耗时40ms自动切到480x480连续5帧耗时35ms切到320x320温度45℃强制切到320x320并降低检测频率从每帧到隔帧实现方式是在RunDetectionAsync中加入耗时监控private float _lastInferenceTimeMs; private int _consecutiveSlowFrames; private void OnInferenceComplete(float durationMs) { _lastInferenceTimeMs durationMs; if (durationMs 40f) { _consecutiveSlowFrames; if (_consecutiveSlowFrames 3) { SwitchInputResolution(480); // 切换RenderTexture尺寸 } } else { _consecutiveSlowFrames 0; } }这项优化让设备在高温场景下帧率稳定在18FPS且mAP下降可控从37.3%→32.1%对工业零件识别影响不大。4.2 GPU纹理复用避免每帧Alloc/Free最初每帧都新建RenderTexture导致GC频繁。改为创建3个RenderTexture循环复用private RenderTexture[] _rtPool new RenderTexture[3]; private int _rtIndex 0; private RenderTexture GetReusableRT(int width, int height) { var rt _rtPool[_rtIndex]; if (rt null || rt.width ! width || rt.height ! height) { rt?.Release(); rt new RenderTexture(width, height, 0, RenderTextureFormat.RFloat); _rtPool[_rtIndex] rt; } _rtIndex (_rtIndex 1) % 3; return rt; }配合Graphics.Blit的异步调度纹理拷贝耗时从平均5.2ms降至1.8ms。4.3 异步推理与渲染解耦Unity默认是“渲染→逻辑→渲染”单线程循环。我把推理放到独立线程用ConcurrentQueue传递结果private ConcurrentQueueListBoundingBox _detectionResults new(); // 推理线程 private void InferenceThread() { while (_isRunning) { if (_newFrameAvailable) { var result RunInference(); // 耗时操作 _detectionResults.Enqueue(result); _newFrameAvailable false; } Thread.Sleep(1); // 避免空转 } } // 主线程LateUpdate中消费结果 private void LateUpdate() { if (_detectionResults.TryDequeue(out var boxes)) { _latestBoxes boxes; } }这样即使某帧推理超时也不会阻塞渲染线程画面保持流畅。4.4 后处理GPU化用Compute Shader加速NMSCPU NMS在8400个框时耗时1.2ms但用Compute Shader可压到0.3ms。核心思路是把候选框数据传入CS用原子操作实现并行IOU计算。关键代码片段// NMS.compute #pragma kernel CSMain RWStructuredBufferfloat4 outputBoxes; // x,y,w,h RWStructuredBufferfloat outputScores; uint _numBoxes; [numthreads(256,1,1)] void CSMain(uint3 id : SV_DispatchThreadID) { if (id.x _numBoxes) return; float4 boxA outputBoxes[id.x]; float scoreA outputScores[id.x]; // 并行检查与其他框的IOU for (uint j 0; j _numBoxes; j) { if (j id.x) continue; float4 boxB outputBoxes[j]; float iou CalculateIOU(boxA, boxB); if (iou 0.2f outputScores[j] scoreA) { InterlockedMin(outputScores[id.x], 0); // 标记为抑制 return; } } }需注意Compute Shader的dispatch size要设为ceil(8400/256)33否则会漏处理。4.5 内存池精细化控制Sentis默认内存池大小为128MB对中端机过大。通过InferenceSessionOptions手动设限var options new InferenceSessionOptions { memoryPoolSize 64 * 1024 * 1024 // 64MB }; _session new InferenceSession(_model, options);实测64MB足够YOLOv8 Nano运行且减少内存碎片。4.6 检测频率自适应非关键场景如背景检测可降频。用Time.time控制private float _lastDetectionTime; private float _detectionInterval 0.05f; // 20FPS private bool ShouldDetect() { if (Time.time - _lastDetectionTime _detectionInterval) { _lastDetectionTime Time.time; return true; } return false; }4.7 Android特定优化禁用VSync与调整线程优先级在AndroidPlayerSettings中关闭V Sync Count设为Dont SyncScript Execution Order中把检测脚本设为-100早于CameraOther Settings→Threading→Worker Thread Count设为3这三项让Android端帧率稳定性提升40%。5. 工程化落地模型热更新与多场景切换实战客户提出一个需求产线有A/B/C三条线每条线的零件反光特性不同需要三套专用模型。如果每次更新都要发版运维成本太高。我们实现了基于AssetBundle的模型热更新整个流程无需重启App。5.1 Sentis模型的AssetBundle打包规范Sentis模型文件.sentis不能直接打进AB必须用BuildPipeline.BuildAssetBundles并指定BuildAssetBundleOptions.UncompressedAssetBundle。原因Sentis加载时会校验文件CRC压缩会导致校验失败。打包脚本关键段var buildMap new Dictionarystring, string(); buildMap.Add(Assets/Models/yolov8n_A.sentis, models/yolov8n_a); buildMap.Add(Assets/Models/yolov8n_B.sentis, models/yolov8n_b); BuildPipeline.BuildAssetBundles( Assets/ABs, buildMap, BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.Android );5.2 热更新流程与降级策略客户端逻辑private async Task LoadModelFromCDN(string modelName) { try { var url $https://cdn.example.com/models/{modelName}.ab; using var www UnityWebRequest.Get(url); await www.SendWebRequest(); if (www.result UnityWebRequest.Result.Success) { var ab DownloadHandlerAssetBundle.GetContent(www); _model ab.LoadAssetModel(yolov8n.sentis); _session?.Dispose(); _session new InferenceSession(_model); } } catch (Exception e) { // 降级到本地兜底模型 _model Model.Load($StreamingAssets/{modelName}_fallback.sentis); } }注意DownloadHandlerAssetBundle.GetContent()返回的AB必须在使用后调用Unload(false)否则内存泄漏。Sentis模型加载后AB可立即卸载。5.3 多模型无缝切换技巧切换模型时旧InferenceSession必须Dispose()否则GPU内存不释放。但Dispose()是同步阻塞操作会卡主线程。解决方案是用ThreadPool异步执行private void SwitchModelAsync(Model newModel) { ThreadPool.QueueUserWorkItem(_ { _session?.Dispose(); // 安全Dispose可多线程调用 _session new InferenceSession(newModel); }); }实测切换耗时从120ms同步降至8ms异步无感知。最后分享个真实案例我们在某汽车零部件厂部署时用这套方案支撑了12个产线模型的动态下发。运维人员在后台上传新模型AB30秒内所有终端自动更新检测准确率从89%提升到94.7%。这背后没有魔法只有对Sentis内存模型、Unity渲染管线、移动端硬件特性的深度抠细节。我在产线调试时最大的体会是YOLOv8 Nano不是“够用就行”的玩具模型而是经过严苛工程验证的生产力工具。当你把Sentis的优化开关拧到极致它真能在骁龙665上跑出比某些旗舰机还稳的帧率——这恰恰证明所谓“实时AI”从来不是堆算力而是对每一毫秒、每一字节的敬畏。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…