YOLOv8边缘部署实战:从轻量化到TensorRT加速完整指南
2026/9/19 4:55:48 网站建设 项目流程

这几年做边缘设备上的目标检测,YOLOv8基本是绕不开的模型。但真把它往Jetson、RK3588这类板子里塞的时候,很多人第一步就傻眼:明明训练的时候跑得挺好,一到边缘设备上就卡顿、爆显存、推理速度惨不忍睹。我在这个坑里进进出出折腾了小半年,踩过各种莫名其妙的错,今天这篇就把“从零到一”完整链路拆开讲清楚,从思路选型、环境搭建到模型导出、工程化推理,再到实测数据和排障实录,希望能帮准备上车的人少走点弯路。

这篇文章适合谁看?准备在树莓派、RK3588、Jetson Nano/Orin等设备上做视觉项目的工程师,以及高校里拿YOLOv8做毕设又不想只在服务器上跑PPT的同学。无论你是想把模型真正跑起来,还是被导出转换、精度损失、推理加速这些环节卡住,这篇都会给你一套可以直接抄作业的路径。

1. 整体设计思路与方案选型

1.1 为什么边缘设备必须走“轻量化”这一步

边缘设备的硬件资源是硬约束,不是你想优化就能靠堆配置解决的。以常见的RK3588为例,NPU算力大概6 TOPS,Jetson Orin Nano的GPU算力可能稍好一些,但和服务器上一张RTX 4090动辄几百TOPS的算力相比,差距是两个数量级。更麻烦的是内存带宽和显存容量:边缘设备往往用LPDDR4X或者LPDDR5,带宽有限,跑大模型时就卡在数据搬运上,算力再高也白搭。

还有一个很多人忽视的功耗限制。在户外、车载、无人机这些场景,整机功耗可能被限制在5W到15W,这意味着GPU/NPU不能长时间跑在满频状态。所以“轻量化”不只是一个技术名词,它是设备能不能在物理世界长期稳定工作的前提。

在动手之前,我建议你先做一个简单的需求拆解:目标任务的类别数量是多少?最小检测目标大概多大?要求的帧率是实时(30 FPS)还是准实时(10 FPS)?模型在边缘设备上允许占用的内存上限是多少?这些问题没想清楚,后面所有优化都会变成没有靶心的乱射。

1.2 主流部署方案横向对比:TensorRT、ONNX Runtime、NCNN、RKNN

做边缘部署,推理引擎的选择基本决定了你能榨出多少性能。这里我按平台把几个主流方案拉出来对比一下:

推理引擎适用平台核心优势常见坑点
TensorRTNVIDIA GPU / Jetson算子融合、INT8量化、性能天花板最高版本兼容性要求严格,转换流程繁琐
ONNX Runtime全平台部署灵活,模型转换门槛低性能一般,很难榨干硬件
NCNN手机/ARM CPU,部分NPU轻量级、移动端优化好算子支持不全,复杂模型转换费劲
RKNNRockchip NPU专门针对瑞芯微NPU优化算子受限多,量化掉点需要慢慢调

我的建议是:NVIDIA平台的设备,无脑选择TensorRT;瑞芯微平台就别折腾TensorRT了,直接用RKNN Toolkit做转换;如果只是想在ARM CPU上快速验证跑通流程,先用ONNX Runtime把整个链路打通,后续再换更优的引擎。

等一下,这里有个容易犯的错误:很多人以为推理引擎能完全代替模型优化,实际上不是这样的。TensorRT再快,本质上还是在做算子层面的融合和精度压缩;如果模型结构本身太冗余,比如backbone非常重、FPN层数太多、head过宽,转换后依然跑不出理想速度。轻量化改造和推理加速不是二选一,而是叠buff的关系。

1.3 轻量化改进的三个方向

轻量化不是单一手段,我习惯把它分成三个层面来看:

第一是模型结构层面。最直观的方式是换更轻的backbone,比如把YOLOv8s的backbone替换成MobileNetV3、GhostNet、ShuffleNetV2这类轻量网络。近两年YOLO系列后续版本在结构上也做了大量轻量化设计,比如在检测头里减少卷积堆叠、精简FPN层数,这些思路同样可以移植回YOLOv8上。

第二是训练层面。常见手段包括知识蒸馏、通道剪枝和结构化剪枝。蒸馏是用一个大模型做教师,带着小模型训练,让小模型的输出尽量贴近教师模型的预测分布,这种方式能在不改变模型结构的前提下提高小模型的精度上限,实际工程中非常好用。

第三是工程部署层面。包括精度校准、INT8量化、动态shape优化、内存复用等。这个层面不改变模型本身,但在最终效果上往往有立竿见影的速度提升。我的经验是:先做结构轻量化,再做训练优化,最后做工程优化,顺序基本不要反过来,因为每一步的优化目标会互相影响。

2. 环境准备与基础搭建

2.1 硬件选型与算力评估

很多人在设备选型时很纠结,其实核心就是匹配算力需求和功耗预算。这里给出几个常见档位的参考数据:

设备算力典型内存适合场景实测参考(YOLOv8n+TensorRT FP16)
Raspberry Pi 5无GPU/NPU,仅CPU8GB LPDDR4X原型验证、低帧率场景2~5 FPS,几乎不可用于实时
RK35886 TOPS NPU8/16GB LPDDR4X智能摄像头、边缘盒子15~30 FPS(RKNN INT8)
Jetson Orin Nano约20 TOPS GPU8GB LPDDR5机器人、无人机、车载30~60 FPS(TensorRT FP16)
GTX 1660 Ti(PC端测试)约12 TOPS GPU6GB GDDR6算法验证、半实物仿真100+ FPS(TensorRT FP16)

硬件选型这件事,我建议按“性能上浮30%”的原则来选:如果计算目标任务需要15 FPS,那设备选型就按20 FPS去选,给系统负载和内存占用留出余量。之前我帮朋友评估过一个RK3588的盒子,他一开始觉得跑YOLOv8s没问题,后来又加了多路视频流和AVG等预处理,结果单路还好、四路直接内存爆炸,最后只能降级到YOLOv8n加更激进的后处理优化。

2.2 软件环境版本组合与安装要点

环境搭建是整个流程里最容易翻车的地方,尤其是TensorRT和CUDA、cuDNN之间的版本匹配。我的建议是直接用NVIDIA官方推荐的组合,别贪新。这里给出一个经过验证的稳定组合:

  • CUDA 11.4 / 11.8 搭配 cuDNN 8.2 / 8.6
  • TensorRT 8.5 / 8.6(注意TensorRT 8.6对应CUDA 11.8组合比较稳)
  • PyTorch 2.0 / 2.1 + torchvision
  • ultralytics 8.0.x(不要追最新,有时候新版本改动会带来部署侧的兼容问题)

安装时建议优先用conda创建虚拟环境,避免把系统Python环境搞乱。安装完CUDA和cuDNN后,用以下命令验证:

nvidia-smi nvcc -V

nvidia-smi显示的CUDA版本是驱动最高支持的版本,而nvcc -V显示的才是当前工具链使用的版本,两者可能不同,不用惊慌,只要不在编译期强制要求更高版本,一般没大问题。

TensorRT的安装稍微麻烦一点,建议直接下载deb包离线安装,不要用pip装早期的nvidia-tensorrt,那个版本可能不包含完整的工具链。安装完成后检查/opt/TensorRT/bin/trtexec这个工具是否存在,它是后面验证转换是否成功的关键。

2.3 Docker部署与裸机环境的选择

关于环境管理,我再聊一下Docker。如果你在PC上用GTX 1660 Ti做算法验证,或者手上有多台设备要统一配置,强烈建议把整个环境打包成镜像。一个常见的坑是:新手把CUDA、PyTorch、TensorRT全都装在系统里,跑通一个项目后,再碰另一个项目时发现版本冲突,直接把系统搞崩。

Docker镜像推荐基于nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04构建,然后在此基础上安装Python、PyTorch、TensorRT和ultralytics。这样做的另一个好处是可以把部署环境直接复制到其他机器上,或者后续交付给工程团队,不用重新踩一遍安装的坑。下面是一个我常用的基础安装命令序列:

FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04 RUN apt-get update && apt-get install -y python3.8 python3-pip git wget RUN pip3 install torch==2.1.0 torchvision --index-url https://download.pytorch.org/whl/cu118 RUN pip3 install ultralytics==8.0.230 onnx onnxruntime

注意,TensorRT在这个镜像是不会自动安装进来的,仍需手动把deb包拷贝进去再dpkg安装。docker-compose里记得配置runtime: nvidiaenvironment里的NVIDIA_VISIBLE_DEVICES=all,否则容器里看不到GPU。

2.4 快速验证:跑通官方模型推理

环境装好之后,别急着训练。先用ultralytics官方权重在PC上跑一次推理,确认整个环境链路是通的。最简单的验证方式就是跑一下:

from ultralytics import YOLO model = YOLO("yolov8n.pt") results = model.predict(source="https://ultralytics.com/images/bus.jpg", device=0, save=True) print(results[0].boxes)

如果这一步顺利,说明PyTorch、CUDA调用都没问题。接着尝试导出ONNX:

model.export(format="onnx", opset=12, dynamic=True)

如果导出成功,再用onnxruntime跑一次推理对比结果。这里我最常遇到的问题就是opset版本不匹配和动态shape支持不完整,后面会专门讲。

3. 模型训练与轻量化改进实操

3.1 训练自己的数据集:从数据准备到参数调优

YOLOv8训练自己的数据集,第一步就是把标注数据整理成YOLO格式。目录结构一般是images/trainimages/vallabels/trainlabels/val,每个txt文件里每行是一个目标,格式是class x_center y_center width height,坐标都是归一化到0~1之间的。

然后是数据集的yaml文件,示例:

path: /path/to/dataset train: images/train val: images/val nc: 3 names: ['person', 'car', 'bicycle']

训练命令可以直接用命令行:

yolo detect train data=my_dataset.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16 device=0

训练参数里有几个关键参数需要重点调:

  • freeze:冻结前N层backbone权重,在数据集较小、不想破坏预训练特征的时候很实用。比如freeze=10会冻结前10层。我个人做迁移学习时,如果数据不足1000张,更倾向于冻结整个backbone,只训练head部分。
  • workers:数据加载线程数,先在服务器上跑的话可以调到8,边缘设备上一般不动它。
  • lr0:初始学习率,默认0.01在多数场景够用,但小数据集建议降低到0.005,防止过拟合。

训练过程中,除了看loss曲线,我还会重点看results.png里的mAP50和mAP50-95。一个比较常见的现象是loss降得很快,但mAP上不去,这种情况大概率是数据质量问题,比如标注框不齐、类别不平衡、背景干扰太多。此时先别急着换模型,优先清理数据和修正标注。

3.2 轻量化backbone替换与结构改进

如果直接训练yolov8n精度不够,但yolov8s又跑不动,这时候就该考虑结构改进了。

最省事的方式是直接在ultralytics的基础上替换backbone。比如把默认的C2f模块替换为基于Ghost Conv的模块,或者把普通卷积换成深度可分离卷积Depthwise Separable Convolution。改动量不大,但参数量和FLOPs能降下来不少。

以GhostNet替换backbone为例,大致思路是:定义GhostConv和GhostBottleneck结构,然后在YOLOv8的模型配置文件里把backbone部分替换成自定义结构。要点是保证下采样阶段的通道数和特征图尺度对齐,否则FPN阶段会报维度不匹配的错。

另一个方向是减少检测头的层数。YOLOv8有P3、P4、P5三个尺度的检测头,分别对应小、中、大目标。如果任务场景目标尺寸比较集中,比如只检测中大型目标,可以砍掉P3检测头,直接减少计算量。这个改动在代码上要改动的部分比较多,它的收益也很明显——在边缘设备上,每少一个检测头,端到端推理时间大约能缩短15%~20%。

3.3 知识蒸馏与剪枝的工程化落地

蒸馏的核心思路是让一个性能好的大模型“教”一个小模型。在YOLOv8场景下,我常用的做法是拿yolov8m或yolov8l做教师,yolov8n或自定义轻量模型做学生。蒸馏的损失函数一般包含三部分:硬标签的分类/回归损失、教师模型输出的软标签损失、特征图对齐损失。

硬标签损失就是普通训练的损失。软标签损失要求学生模型的输出分布尽量接近教师的输出分布,一般用KL散度来衡量。特征图对齐损失是让学生模型在backbone中间层的特征图接近教师模型,但因为学生和教师的通道数往往不一致,需要在中间加一个1x1卷积做维度对齐,这里要注意权重初始化方式,否则容易梯度爆炸。

剪枝方面,工程上最成熟的是结构化通道剪枝。剪枝流程大致是:先训练一个大模型,然后分析各通道的重要性(常见做法是用BN层的缩放因子gamma作为重要性指标),把gamma值很小的通道剪掉,微调恢复精度,再剪下一轮。这套流程需要改代码的地方不少,需要你自己写剪枝工具,所以我更推荐在项目时间紧张时优先用蒸馏,而不是一开始就上剪枝。

4. 模型导出与格式转换

4.1 pt转ONNX:动态shape和opset的选择

训练完成,拿到了best.pt,接下来就是导出。这步看起来简单,实际上有很多细节,稍不注意后面转TensorRT就会失败。

用ultralytics导出ONNX的命令之前已经写过,但有几个细节值得展开:

第一,opset推荐设置为12到14之间。opset版本过低,某些算子不支持;版本太高,TensorRT可能又不认识,反而转换失败。我实际踩过坑:opset默认11导出的模型在TensorRT里某些模块报Op not registered的错,改成12就好了。

第二,动态shape问题。启用dynamic=True会让输入输出的shape变成动态的,这样在服务端推理时灵活,但转TensorRT的时候动态shape需要做profile配置,稍微麻烦一些。如果在边缘设备上部署,我通常建议导出时固定输入尺寸,比如640x640,这样后续转engine时不需要额外配置动态维度,性能也更稳。

第三,导出后一定要验证一下ONNX模型。用onnxruntime跑一张图,对比PyTorch结果,AP差距在0.01以内才算正常。如果差距明显,大概率是某些算子在ONNX导出时行为不一致,需要回到模型结构上排查具体是哪一层出了问题。

4.2 TensorRT引擎生成:FP32/FP16/INT8的选择

拿到ONNX模型后,生成TensorRT engine有两种常见方式:用trtexec命令行工具,或者写Python脚本调用TensorRT的API。这里先说命令行,适合快速验证。

trtexec --onnx=yolov8n.onnx --saveEngine=yolov8n_fp16.engine --fp16

如果只想跑FP32,去掉--fp16即可。FP16在多数边缘设备上是精度和速度的平衡点,一般不会掉点太多,速度提升却非常明显。但是,使用FP16的时候有个注意点:如果网络里存在某些对精度比较敏感的层,例如大数值范围的归一化层,FP16可能导致输出异常,需要手动把这些层指定为FP32精度,这就是TensorRT的layer precision控制,通过API来配置。

INT8量化是另一个方向。TensorRT的INT8量化需要校准数据,通常是从训练集里采样几百到上千张代表性图片,计算每层激活值的分布,然后选择最优的量化阈值。在边缘设备上,INT8相比FP16通常还能再快1.5到2倍,但精度损失会加大,特别是小目标检测上更容易掉点。我的经验是:目标类别少、目标尺寸大的场景,用INT8没问题;如果任务是行人检测这种小目标密集场景,优先用FP16。

校准过程可以参考下面这段Python代码的核心部分:

import tensorrt as trt class EntropyCalibrator(trt.IInt8EntropyCalibrator2): def __init__(self, images, batch_size): trt.IInt8EntropyCalibrator2.__init__(self) self.images = images self.batch_size = batch_size self.cache_file = "calib.cache" def get_batch_size(self): return self.batch_size def get_batch(self, names): # 从数据集中读取一个batch,预处理成模型输入格式 batch = preprocess(self.images.next_batch(self.batch_size)) return [batch] def read_calibration_cache(self): if os.path.exists(self.cache_file): return open(self.cache_file, "rb").read() def write_calibration_cache(self, cache): with open(self.cache_file, "wb") as f: f.write(cache)

写校准器的时候有个常见的坑:你从数据集中拿来做校准的图片,一定要和训练数据分布一致,否则校准出来的量化阈值可能偏向某个特定场景,部署后在真实环境里掉点严重。另外,校准图片数量不是越多越好,通常200到500张够了,太多会拉长校准时间,而且收益不大。

4.3 非NVIDIA平台的备选转换方案

如果你的目标平台是RK3588这类瑞芯微芯片,TensorRT就使不上劲了,要用RKNN Toolkit。整体流程是:先把PyTorch模型导出为ONNX,再用RKNN Toolkit把ONNX转换为.rknn格式。RKNN的转换工具对算子支持比较苛刻,很多在YOLOv8里常用的算子会被转换成CPU算子,导致NPU根本跑不起来。遇到这种情况,一种办法是简化网络结构,另一种是检查算子是否在RKNN支持列表里,必要时需要反卷积、上采样等操作替换成支持列表内的算子。

如果目标平台是手机或纯ARM Linux盒子,NCNN是个不错的选择。NCNN的模型转换同样从ONNX开始,通过onnx2ncnn工具转换。NCNN的推理速度在移动端比较靠谱,缺点是对一些复杂结构的网路支持还不完善,需要手动改代码或者使用自定义层。

5. C++工程化推理实现与优化

5.1 核心推理代码框架

Python推理适合原型验证,但真正工程落地到边缘设备上,C++是不可回避的选择。C++版本的推理代码主要分四步:初始化TensorRT engine、准备输入输出buffer、执行推理、后处理。

这里给出一个核心的推理框架,伪代码和关键逻辑如下:

// 1. 加载engine std::ifstream file(enginePath, std::ios::binary); std::vector<char> data(std::istreambuf_iterator<char>(file), {}); std::unique_ptr<IRuntime> runtime{createInferRuntime(sample::gLogger.getTRTLogger())}; std::unique_ptr<ICudaEngine> engine{runtime->deserializeCudaEngine(data.data(), data.size())}; std::unique_ptr<IExecutionContext> context{engine->createExecutionContext()}; // 2. 准备buffer void* buffers[2]; // input and output size_t inputSize = batchSize * 3 * inputH * inputW * sizeof(float); size_t outputSize = batchSize * outputNum * outputChannels * sizeof(float); cudaMalloc(&buffers[0], inputSize); cudaMalloc(&buffers[1], outputSize); // 3. 执行推理 cudaMemcpy(buffers[0], hostInput, inputSize, cudaMemcpyHostToDevice); context->enqueueV2(buffers, stream, nullptr); cudaMemcpy(hostOutput, buffers[1], outputSize, cudaMemcpyDeviceToHost); // 4. 后处理 postProcess(hostOutput, results);

关键点有三个:

第一,要用enqueueV2而不是executeV2,因为前者是异步非阻塞的,可以在等待推理时用CUDA stream同时做图像预处理,能明显提升多路视频流场景的吞吐。

第二,buffer的生命周期管理很重要。最标准的做法是在初始化阶段一次性分配好所有buffer,然后在推理循环里反复复用,而不是每条视频流都重新分配。cudaMalloc的开销虽然不算特别大,但在边缘设备上持续分配释放会引入隐性延迟和内存碎片。

第三,如果engine是动态shape的,必须在推理前调用context->setBindingDimensions来指定输入的实际shape。这里也要注意,output的shape不能由你胡设,必须用context->getBindingDimensions查询实际大小,否则可能读到越界数据。

5.2 后处理优化:解码与NMS的加速思路

YOLOv8的head输出是三维矩阵,形状通常是[1, 84, 8400],其中84对应4个框坐标加80个类别分数,8400是三个尺度特征图上所有anchor点的总和。在Python里做后处理很简单,但C++里逐层解析会变成性能瓶颈,如果处理不好,推理引擎省下的时间全都会在后处理上还回去。

优化思路有两个方向。

第一个方向是把解码和NMS放到GPU上执行,使用TensorRT plugin或者CUDA自定义核函数。这种方式可以把后处理的时间从十几毫秒压到一两毫秒,但开发难度较高,要对CUDA编程和TensorRT插件机制比较熟。

第二个方向是写一个高效的CPU后处理实现。重点在于:使用多线程并行处理各个batch,对NMS的候选框按类别分数排序时限制候选框数量(例如只取分数最高的500个),IoU计算用SIMD指令加速。这些优化叠加起来,后处理在ARM CPU上也可以控制在5毫秒左右。

我在实际项目里的建议是:如果目标是30 FPS,后处理必须控制在总耗时的10%以内。假如模型推理时间是20毫秒,后处理不能超过3毫秒,否则就先优化后处理,再回头折腾模型。

5.3 性能调优:warmup、多线程与内存复用

工程部署的性能调优,很多时候不是在优化模型,而是在优化数据流。

第一个建议是显式调用warmup。TensorRT engine在首次推理时会做context初始化,还包含显存分配、卷积核选择等步骤,时间可能超过几百毫秒。如果你把这个时间计入了延迟统计,数据会很难看。所以在服务启动时跑几次无实际意义的推理,完成预热,之后再测延迟。

第二个建议是使用CUDA流,并配合生产者-消费者模式。这是我在多路视频流接入时强烈推荐的做法。每条视频流分配一个处理线程和一个独立的CUDA stream,图像采集、预处理、推理、后处理在流水线上重叠,这样四路视频的吞吐并不等于四倍的串行延迟,而是近似于单路延迟加一点同步开销。

第三个建议是合理规划显存和内存。如果有多路输入需要统一batch推理,尽量把多张图拼成一个batch输入到模型里,batch=4比4次batch=1的总耗时低很多。在嵌入式设备上,这招对提高吞吐量非常重要。

6. 实测数据与常见问题排查

6.1 不同设备上的性能实测

我把自己实际跑过的几组数据贴出来,给大家一个直观参考。模型统一用YOLOv8n,输入尺寸640x640,后处理在CPU上完成,分别是单batch推理的端到端耗时:

设备推理引擎精度模式端到端耗时(ms)帧率(FPS)备注
GTX 1660 TiTensorRTFP166~8120+训练验证阶段使用
Jetson Orin NanoTensorRTFP1612~1560~80实际项目主力
Jetson Orin NanoTensorRTINT88~10100+精度需验证
RK3588RKNNINT825~3530~40与算子支持情况和NPU负载有关
Raspberry Pi 5ONNX RuntimeFP32200+<5不适合实时任务

这些数值和你跑出来的结果可能有出入,因为温度、功耗策略、内存频率都会影响实测结果。比如Jetson在持续高负载下会触发降频,时间一长帧率就往下掉。解决思路是把功耗模式设置为MAXN,限制CPU/GPU的频率上限,让性能输出更稳定。

6.2 常见错误速查与排障思路

部署过程里最耗时间的其实不是写代码,而是排错。这里整理一个我高频遇到的错误速查表:

报错信息原因分析解决方法
CUDA error: out of memory显存不足,通常是没有复现buffer或者批大小太大降低batch,确认是否过度分配buffer,关掉无关服务释放显存
[TensorRT] ERROR: op not registeredONNX中算子版本过新或太老,TensorRT不支持调低opset到12导出,或替换对应算子的实现
Assertion failed: binding is dynamic用了动态shape但没setBindingDimensions检查engine是否为动态shape,推理前显式设置输入shape
NMS returns empty results后处理置信度阈值太高或模型预处理不对降低conf_thres,检查图像归一化方式是否和训练一致
INT8量化后精度下降明显校准集分布和真实场景不符,或量化敏感层未处理重新选择校准集,对关键层强制FP16精度
推理结果出现大偏移框解码公式错误或输出tensor的尺寸解释错误检查输出层顺序,确认是[batch, 84, 8400]而不是[batch, 8400, 84]

排障的思路其实是有套路的。首先确认模型在PyTorch上推理正常,再检查ONNX推理是否一致,最后才检查TensorRT。每层转换都加一个精度对比,问题出在哪一层,一测就定位了。不要绕过中间层直接调试,否则排查的范围太大,容易把自己绕进去。

6.3 我的几点实战心得

最后分享几个我用真金白银换来的体会。

第一,先确定精度验收标准再做量化。不要一上来就追求最快的速度,先把FP32在目标设备上的推理结果跑通,明确可接受的精度下降范围。比如你要求mAP下降不超过1%,那就可以大胆尝试FP16;如果只能接受下降0.5%,那就先不要碰INT8,把精力放在结构轻量化和训练蒸馏上。

第二,输入尺寸不是非640不可。很多任务场景中,目标物体本身就比较清晰,用480x480甚至416x416也不会明显掉点,但推理速度能提升30%以上。这个参数在ultralytics训练时通过imgsz指定,部署时直接在导出步骤固定匹配就行。我做过一个例子,把输入从640降到512,精度只掉了0.3%,但端到端帧率几乎翻倍。

第三,对于边缘设备的推理项目,数据和后处理结构往往比模型结构更值得优化。我遇到过不止一次,客户端反馈检测变慢了,最后发现不是模型的问题,而是采集端的图片加入了大量与任务无关的预处理,比如超大尺寸的原始图缩放、多余的颜色空间转换。保持全链路数据的“平铺直叙”,能让你的部署效果更稳定。

第四,如果时间非常紧张,优先保证全链路能跑通,再逐步优化。先用yolov8n加FP16跑通一个端到端的demo,哪怕帧率只有10 FPS,也比卡在某个追求极致的阶段强。部署这件事,跑起来永远是第一优先级。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询