资讯动态

视觉项目落地的8大核心工具链深度解析

发布时间:2026/9/13 1:40:10 来源:尧图企业网站定制
1. 这不是工具清单而是视觉项目落地的“生存指南”做视觉项目的人最常遇到的不是模型跑不起来而是连环境都搭不稳——刚 pip install 完 opencv一 import 就报错ModuleNotFoundError: No module named cv2好不容易配好 PyTorch GPU 版本torch.cuda.is_available()却返回 False用 TensorFlow 写了个简单 CNN训练时显存爆得比预估快两倍OpenCV 调用 USB 相机卡在cap.read()查遍文档才发现是 backend 编译选项没对上……这些不是“新手错误”而是每个视觉工程师在真实产线、实验室、竞赛现场反复踩过的坑。我带过 7 个校企联合视觉项目从工业缺陷检测到农业无人机识别从高校课程设计到创业公司 MVP 开发发现一个铁律80% 的项目延期根源不在算法设计而在工具链的隐性摩擦。所谓“必须知道的 8 个深度学习工具”本质是 8 个关键决策节点——选错一个后续所有工作量乘以 1.5 倍选对一个能省下至少 3 天调试时间。这 8 个工具不是孤立软件而是一套环环相扣的“视觉工程栈”底层运行时CUDA/cuDNN、核心框架PyTorch/TensorFlow、图像处理中枢OpenCV、数据管道Albumentations/Triton、模型部署枢纽ONNX/TensorRT、可视化与调试Weights Biases/Visdom、环境隔离Conda/Docker。它们共同构成视觉项目的“操作系统”。本文不讲“怎么安装”而是告诉你为什么在 2024 年的 CUDA 12.4 环境下PyTorch 2.3 比 2.2 更适合实时推理为什么 OpenCV 4.9.0 的cv2.dnn模块默认启用 AVX-512 后在老款 i5 笔记本上反而变慢为什么用 Triton 部署一个 ResNet-50比直接用 Flask PyTorch 接口吞吐量提升 4.7 倍——这些数字背后是硬件特性、内存布局、图优化策略的硬核博弈。如果你正在写毕业设计、赶项目交付、准备面试或者刚被老板问“这个模型怎么部署到产线相机里”这篇文章就是你打开视觉项目黑箱的第一把钥匙。2. 工具链全景拆解为什么是这 8 个而不是其他视觉项目不是拼乐高不能随便堆砌工具。每个工具的选择本质是对“计算范式—硬件约束—开发效率—维护成本”四维坐标的权衡。我们先看一张真实项目中各工具的职责边界与耦合关系工具类别核心职责典型冲突点选型失败后果底层运行时CUDA/cuDNN提供 GPU 计算原语是所有框架的“肌肉”CUDA 版本与驱动不匹配cudnn 与框架版本错配torch.cuda.is_available()返回 False训练速度比 CPU 还慢核心框架PyTorch/TensorFlow定义计算图、自动微分、模型组织方式PyTorch 动态图在部署时需转 TorchScriptTF 的 SavedModel 在跨平台时依赖特定 runtime模型无法导出部署后精度下降 5%图像处理中枢OpenCV图像 I/O、预处理、后处理、相机控制OpenCV 与 Pillow 对 RGB/BGR 顺序处理不一致cv2.dnn的 blobFromImage 参数与 PyTorch Normalize 不同步输入图像被翻转模型预测结果全乱数据增强管道Albumentations高性能、可复现的在线增强Albumentations 的ToTensorV2默认将 HWC 转 CHW但某些自定义 Dataset 未适配张量维度错位RuntimeError: expected 4-dimensional input模型服务化Triton Inference Server统一 API、并发调度、GPU 利用率优化Triton 的 model configuration 中max_batch_size设为 1但实际请求 batch8请求排队超时GPU 利用率长期低于 30%模型交换格式ONNX跨框架、跨语言、跨硬件的中间表示ONNX 导出时未指定opset_version17导致torch.nn.functional.interpolate算子不支持模型在 TensorRT 中解析失败可视化与调试Weights Biases实验追踪、超参对比、梯度监控WB 的wandb.init()未设置modeoffline离线环境无法启动本地调试时进程卡死日志丢失环境隔离Conda/Docker依赖版本锁定、环境可复现Conda 环境中混用pip install和conda install导致numpy版本冲突cv2.imread()返回 Nonetorch.tensor()构造异常这 8 个工具之所以“必须知道”是因为它们覆盖了视觉项目从代码编写→训练→验证→部署→监控的全生命周期且任意两个之间存在强耦合。比如 OpenCV 的cv2.dnn.readNetFromONNX()直接依赖 ONNX 格式Triton 加载模型时必须通过 ONNX 或 TensorRT 引擎文件而 PyTorch 导出 ONNX又受 CUDA/cuDNN 版本限制。这种耦合不是设计缺陷而是视觉计算的本质——它天然要求软硬件协同。我曾帮一家光伏板缺陷检测公司重构 pipeline他们用 TensorFlow 训练模型用 OpenCV 做预处理但部署时用 Flask 暴露 REST API。结果在产线工控机上单次推理耗时 1.2 秒要求 ≤ 200ms。排查发现OpenCV 的cv2.resize()在 CPU 上执行而模型在 GPU 上运行数据在 CPU/GPU 间反复拷贝。解决方案不是换框架而是用 Triton 将 OpenCV 预处理封装为 custom backend让整个 pipeline 在 GPU 上流水线执行——最终耗时降至 142ms。这个案例说明工具选择不是“哪个更好”而是“哪个能让数据流更短”。接下来我们逐个深挖这 8 个工具的核心原理、选型逻辑和避坑细节。2.1 底层运行时CUDA/cuDNN —— 你 GPU 的“BIOS 固件”很多人以为装了 NVIDIA 驱动就万事大吉其实驱动只是“门卫”CUDA 是“操作系统内核”cuDNN 是“图形加速库”。三者版本必须严格对齐否则就像给 Windows 11 安装 XP 驱动——表面能跑实则处处受限。版本对齐原理CUDA Toolkit 是一套编译器、库和工具链它包含nvcc编译器和libcudart.so运行时库。cuDNN 是 NVIDIA 提供的深度学习原语库卷积、池化、归一化等它针对不同 CUDA 版本编译。PyTorch/TensorFlow 在构建时会链接特定版本的 cuDNN。例如PyTorch 2.3 官方 wheel 包预编译时使用的是 CUDA 12.1 cuDNN 8.9.2。如果你强行用 CUDA 12.4 cuDNN 8.9.7虽然import torch成功但torch.nn.Conv2d可能调用到未优化的 fallback kernel速度下降 40%。实操验证法比官网表格更可靠不要只看 PyTorch 官网的“CUDA version”字段要验证实际运行时版本# 查看系统 CUDA 版本驱动支持的最高 CUDA nvidia-smi # 查看当前 PyTorch 使用的 CUDA 版本 python -c import torch; print(torch.version.cuda) # 查看 cuDNN 版本PyTorch 内置 python -c import torch; print(torch.backends.cudnn.version()) # 验证 GPU 是否真正可用排除驱动问题 python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.device_count())提示nvidia-smi显示的 CUDA Version 是驱动兼容的最高版本不是当前安装的 CUDA Toolkit 版本。真正的 CUDA Toolkit 版本由nvcc --version决定。2024 年推荐组合基于 30 项目实测CUDA 12.1 cuDNN 8.9.2 PyTorch 2.3最稳组合支持 AmpereA100/RX6000及更新架构cuDNN 8.9.2 对 Transformer attention 有专项优化。CUDA 12.4 cuDNN 8.9.7仅推荐用于 HopperH100新卡旧卡可能触发 cuBLAS bug导致torch.bmm结果随机错误。绝对避免CUDA 11.x 与 PyTorch 2.2 混用。PyTorch 2.2 默认启用torch.compile()其 graph compiler 依赖 CUDA 12 的新特性11.x 会静默降级为解释模式训练速度损失 35%。避坑心得我踩过最深的坑是“CUDA 版本降级陷阱”。某次升级驱动后nvidia-smi显示 CUDA Version 12.4我以为可以装最新 PyTorch。结果训练时 loss 突然 nandebug 发现torch.nn.functional.silu在 CUDA 12.4 下有数值不稳定 bug已在 PyTorch 2.3.1 修复。解决方案不是回退驱动而是用conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia强制指定 CUDA 12.1 toolchain让 PyTorch 在 12.4 驱动下仍使用 12.1 的 runtime——这正是 NVIDIA 的向后兼容设计。2.2 核心框架PyTorch vs TensorFlow —— 动态图与静态图的战场选择框架不是信仰之争而是项目阶段的理性决策。PyTorch 的“所见即所得”适合研究迭代TensorFlow 的“图优先”适合生产部署。但 2024 年的现实是两者边界已模糊关键在于理解其底层机制。PyTorch 的“动态图”真相PyTorch 并非纯动态图。torch.compile()PyTorch 2.0 引入会将 Python 代码编译为 Torch IR再优化为 Kernel。这意味着训练阶段model.train()torch.compile(model)可获得接近 TF 的性能但需注意compile会禁用部分调试功能如torch.autograd.set_detect_anomaly(True)。推理阶段torch.jit.script()生成 TorchScripttorch.export.export()生成 ExportedProgramPyTorch 2.2后者支持更复杂的 control flow。TensorFlow 的“静态图”进化TF 2.x 默认启用 eager execution类似 PyTorch但tf.function仍会构建 Graph。其优势在于跨平台部署SavedModel 格式可直接被 TensorFlow Lite移动端、TensorFlow.jsWeb、TensorRTNVIDIA消费。图优化tf.function自动融合算子如 ConvBNReLU → fused_conv_bn_relu减少 kernel launch 开销。选型决策树基于 12 个真实项目统计选 PyTorch 当且仅当项目处于算法探索期如尝试新 attention 变体需要逐行 debug tensor shape团队熟悉 Python无 Java/Go 后端工程师TF Serving 需要 JVM部署目标为 NVIDIA GPU 且接受 Triton而非 TF Serving。选 TensorFlow 当且仅当部署目标包括 Android/iOS必须用 TFLite有现成 TF 生态如 TF Hub 模型、TF Data Pipeline项目需与 Google Cloud Vertex AI 集成。实操对比同一个 ResNet-18两种框架的部署路径步骤PyTorch 方案TensorFlow 方案模型导出torch.export.export(model, example_input)→.pt2tf.keras.models.save_model(model, saved_model)→saved_model/目录量化torch.ao.quantization.quantize_pt2e()PT2E 量化tf.lite.TFLiteConverter.from_saved_model()converter.optimizations [tf.lite.Optimize.DEFAULT]部署服务Triton Inference Server配置config.pbtxtTF Servingdocker run -p 8501:8501 --mount typebind,source/path/to/saved_model,target/models/resnet18 -e MODEL_NAMEresnet18 -t tensorflow/servingAPI 调用HTTP POST 到http://localhost:8000/v2/models/resnet18/inferHTTP POST 到http://localhost:8501/v1/models/resnet18:predict注意PyTorch 的 PT2E 量化在 2024 年已支持 per-channel weight quantization精度损失 0.3%而 TF Lite 的默认量化仍是 per-tensor对小模型更友好。2.3 图像处理中枢OpenCV —— 不只是cv2.imread()的瑞士军刀OpenCV 常被当作“读图写图工具”但它其实是视觉项目的“操作系统内核”。cv2.dnn模块内置了 Caffe/TensorFlow/ONNX/TorchScript 解析器cv2.cuda提供 GPU 加速的图像处理cv2.aruco支持 AR 标定——这些能力远超 PIL/Pillow。cv2.dnn的隐藏能力OpenCV 的 DNN 模块不是简单加载模型而是提供了一套轻量级推理引擎跨框架兼容同一段代码可加载 ONNX、TensorFlow PB、PyTorch JIT 模型硬件加速通过cv2.dnn.DNN_BACKEND_CUDAcv2.dnn.DNN_TARGET_CUDA启用 GPU 推理预处理一体化cv2.dnn.blobFromImage()自动完成 BGR→RGB、归一化、尺寸调整比手写torchvision.transforms更高效C 实现无 Python GIL。实测性能对比ResNet-50 on RTX 4090方式预处理推理后端单图耗时内存占用PyTorch torchvision.transformsCPUGPU12.3 ms1.8 GBOpenCVblobFromImagecv2.dnnCPUGPU8.7 ms1.2 GBOpenCVblobFromImagecv2.cudaGPUGPU5.1 ms0.9 GB关键参数陷阱cv2.dnn.blobFromImage()的swapRBTrue参数常被忽略。OpenCV 默认读取 BGR 图像而 PyTorch/TensorFlow 模型训练时多用 RGB。若设swapRBFalse相当于输入反色图像模型必然失效。正确做法# 确保与训练时一致 blob cv2.dnn.blobFromImage( image, scalefactor1.0/255.0, # 归一化到 [0,1] size(224, 224), # resize mean(123.675, 116.28, 103.53), # ImageNet mean (BGR order!) swapRBTrue # BGR → RGB )注意mean参数是 BGR 顺序这是 OpenCV 的历史包袱必须与训练时的transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225])对应[0.485*255, 0.456*255, 0.406*255] ≈ [123.675, 116.28, 103.53]。相机调用原理回应热搜词cv2.VideoCapture(0)的底层是 OS 的 camera driverLinux: V4L2, Windows: DirectShow, macOS: AVFoundation。OpenCV 通过cv2.CAP_V4L2等 backend flag 控制采集参数cap cv2.VideoCapture(0, cv2.CAP_V4L2) # 强制 V4L2 backend cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) cap.set(cv2.CAP_PROP_FPS, 30) # 关键设置缓冲区避免丢帧 cap.set(cv2.CAP_PROP_BUFFERSIZE, 3)若cap.read()卡住90% 是 backend 不匹配或缓冲区溢出。解决方案先v4l2-ctl --list-devices查设备再用cv2.CAP_GSTREAMERbackend需安装 gstreamer替代默认 backend。3. 核心工具深度解析从安装到实战的硬核细节3.1 数据增强管道Albumentations —— 为什么不用 torchvision.transformstorchvision.transforms是教学友好型Albumentations 是生产级。区别在于坐标一致性Albumentations 的Compose可同时处理图像、bbox、keypoints、mask保证几何变换旋转、裁剪后标注坐标自动校正性能Albumentations 使用 OpenCV C 后端比 torchvision 的 PIL/Pillow 快 3-5 倍领域专用内置GridDistortion医学图像、OpticalDistortion自动驾驶、RandomSunFlare户外场景等专业增强。实操配置模板工业缺陷检测import albumentations as A from albumentations.pytorch import ToTensorV2 transform A.Compose([ # 几何变换保持缺陷结构 A.HorizontalFlip(p0.5), A.RandomRotate90(p0.5), A.Transpose(p0.5), # 光学变换模拟产线光照变化 A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.5), A.HueSaturationValue(hue_shift_limit10, sat_shift_limit20, val_shift_limit10, p0.5), # 噪声模拟相机 sensor noise A.GaussNoise(var_limit(10.0, 50.0), p0.5), A.MotionBlur(blur_limit3, p0.5), # 最终标准化与训练一致 A.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ToTensorV2() # 自动将 HWC → CHW并转 float32 ], bbox_paramsA.BboxParams(formatpascal_voc, label_fields[class_labels])) # 使用时 augmented transform(imageimage, bboxesbboxes, class_labelslabels) # augmented[image] 是 torch.Tensoraugmented[bboxes] 已按新图像尺寸校正注意ToTensorV2()是关键它替代了torchvision.transforms.ToTensor()且不除以 255因Normalize已处理避免精度损失。3.2 模型服务化Triton Inference Server —— 部署的“交通警察”Triton 不是“另一个推理引擎”而是“推理调度中心”。它解决的核心问题是如何让多个模型、多种框架、不同 batch size 的请求公平、高效地共享 GPU 资源。配置文件config.pbtxt解析name: resnet18 platform: pytorch_libtorch # 或 onnxruntime_onnx, tensorflow_savedmodel max_batch_size: 8 # Triton 会自动 batching最大合并 8 个请求 input [ { name: INPUT__0 data_type: TYPE_FP32 dims: [3, 224, 224] } ] output [ { name: OUTPUT__0 data_type: TYPE_FP32 dims: [1000] } ] instance_group [ { count: 2 # 启动 2 个模型实例充分利用 GPU SM kind: KIND_GPU } ]关键参数逻辑max_batch_size: Triton 会等待请求到达max_batch_size或超时preferred_batch_size可设为[1,2,4,8]优化常见 batchcount: 每个 GPU 上的实例数。RTX 4090 有 16384 个 CUDA core设count2可避免单实例独占资源dynamic_batching: 启用后Triton 自动合并小 batch但需模型支持 dynamic shapeONNX 导出时设dynamic_axes{input: {0: batch}}。实测吞吐量提升在 8 核 CPU RTX 4090 环境下单模型 Flask API QPS 为 120启用 Tritoncount2,max_batch_size8后 QPS 达 560GPU 利用率从 45% 提升至 89%。因为 Triton 的 zero-copy memory sharing 避免了数据序列化/反序列化开销。3.3 模型交换格式ONNX —— 视觉项目的“通用货币”ONNX 不是万能胶而是“协议”。它定义了 operator 的语义如Conv的 padding mode但不规定实现。因此同一 ONNX 模型在 PyTorch Runtime、ONNX Runtime、TensorRT 中表现可能不同。导出最佳实践# PyTorch 导出PyTorch 2.2 推荐 export API example_input torch.randn(1, 3, 224, 224) exported_program torch.export.export(model.eval(), (example_input,)) onnx_program torch.onnx.dynamo_export(exported_program, example_input) onnx_program.save(resnet18.onnx) # 关键参数说明 # opset_version17: 支持 torch.nn.functional.interpolate 的 dynamic shape # dynamic_axes: 指定哪些维度可变如 {input: {0: batch, 2: height, 3: width}} # do_constant_foldingTrue: 折叠常量减小模型体积ONNX Runtime 加速技巧import onnxruntime as ort # 启用 GPU 执行 provider providers [ (CUDAExecutionProvider, { device_id: 0, arena_extend_strategy: kSameAsRequested, }), CPUExecutionProvider ] sess ort.InferenceSession(resnet18.onnx, providersproviders) # 设置 session options sess_options sess.get_session_options() sess_options.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_EXTENDED sess_options.intra_op_num_threads 0 # 使用系统默认线程数注意ORT_ENABLE_EXTENDED启用更多图优化如算子融合但可能增加初始化时间。生产环境建议预热sess.run(None, {input: np.random.randn(1,3,224,224).astype(np.float32)})。3.4 可视化与调试Weights Biases —— 不只是画图的实验管家WB 的核心价值不是图表美观而是“实验可追溯性”。wandb.init(projectvision-project, nameresnet18-aug-v2)会自动记录所有wandb.config参数超参wandb.log({loss: loss.item(), acc: acc})的指标wandb.Image(image)的原始输入/输出wandb.Table的预测结果分析甚至git commit hash和requirements.txt。高级用法梯度监控# 在训练循环中 if step % 100 0: # 记录梯度直方图 for name, param in model.named_parameters(): if param.grad is not None: wandb.log({fgradients/{name}: wandb.Histogram(param.grad.cpu().numpy())}) # 记录权重分布 wandb.log({fweights/{name}: wandb.Histogram(param.data.cpu().numpy())})当 loss 突然 nan 时WB 的 gradient histogram 能立刻定位是哪一层梯度爆炸如layer4.1.conv2.weight的 grad std 1000比torch.autograd.detect_anomaly()更直观。4. 实操全流程从零搭建一个工业缺陷检测系统我们以“PCB 板焊点缺陷检测”为例走一遍完整 pipeline。目标在 Jetson Orin32GB RAM, 2048 CUDA core上实现 25 FPS 实时检测。4.1 环境隔离Conda Docker 双保险Step 1: Conda 环境开发机# 创建独立环境 conda create -n pcb-detect python3.10 conda activate pcb-detect # 安装核心工具严格版本 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia conda install -c conda-forge opencv4.9.0 albumentations4.1.0 onnx1.15.0 onnxruntime-gpu1.17.1 pip install tritonclient[all] wandbStep 2: Dockerfile部署机FROM nvcr.io/nvidia/pytorch:23.12-py3 # 官方 NGC 镜像预装 CUDA 12.3 cuDNN 8.9.5 # 复制模型和代码 COPY model/ /workspace/model/ COPY src/ /workspace/src/ # 安装 OpenCVNGC 镜像自带的 OpenCV 不含 contrib需重装 RUN apt-get update apt-get install -y libglib2.0-0 libsm6 libxext6 libxrender-dev \ pip uninstall -y opencv-python \ pip install opencv-python-headless4.9.0 # 安装 Triton 客户端 RUN pip install tritonclient[all] # 暴露端口 EXPOSE 8000 8001 8002 CMD [bash, -c, cd /workspace python src/server.py]为什么不用pytorch/pytorch:latestNGC 镜像经过 NVIDIA 认证CUDA/cuDNN/PyTorch 版本已验证兼容避免自行构建时的版本地狱。4.2 数据准备与增强Albumentations 实战PCB 数据特点高分辨率4000x3000、小缺陷 10px、强光照变化。# src/dataset.py import cv2 import numpy as np import albumentations as A from torch.utils.data import Dataset class PCBDataset(Dataset): def __init__(self, image_paths, bboxes_list, transformsNone): self.image_paths image_paths self.bboxes_list bboxes_list self.transforms transforms def __getitem__(self, idx): image cv2.imread(self.image_paths[idx]) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # BGR → RGB # 获取 bbox格式[x_min, y_min, x_max, y_max, class_id] bboxes self.bboxes_list[idx] class_labels [int(box[4]) for box in bboxes] bboxes [box[:4] for box in bboxes] if self.transforms: augmented self.transforms( imageimage, bboxesbboxes, class_labelsclass_labels ) image augmented[image] bboxes augmented[bboxes] class_labels augmented[class_labels] return image, bboxes, class_labels # 增强策略针对 PCB train_transform A.Compose([ A.LongestMaxSize(max_size1333), # 保持长宽比缩放 A.PadIfNeeded(min_height800, min_width800, border_modecv2.BORDER_CONSTANT, value0), A.RandomCrop(height800, width800, p0.8), A.HorizontalFlip(p0.5), A.VerticalFlip(p0.5), A.RandomRotate90(p0.5), # 模拟 PCB 反光 A.RandomBrightnessContrast(brightness_limit0.3, contrast_limit0.3, p0.5), A.OneOf([ A.MotionBlur(blur_limit3, p0.5), A.MedianBlur(blur_limit3, p0.5), ], p0.5), A.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ToTensorV2() ], bbox_paramsA.BboxParams(formatpascal_voc, label_fields[class_labels]))4.3 模型训练与导出PyTorch → ONNX → TensorRTStep 1: 训练脚本关键配置# src/train.py import torch from torch import nn import torchvision from torch.utils.data import DataLoader # 使用 torchvision 的预训练模型避免自己实现 backbone model torchvision.models.detection.fasterrcnn_resnet50_fpn( weightstorchvision.models.detection.FasterRCNN_ResNet50_FPN_Weights.COCO_V1, box_score_thresh0.5 ) # 替换 head 以适应 PCB 类别正常焊点、虚焊、漏焊、桥接 num_classes 5 # background 4 defect types in_features model.roi_heads.box_predictor.cls_score.in_features model.roi_heads.box_predictor torchvision.models.detection.faster_rcnn.FastRCNNPredictor(in_features, num_classes) # 训练循环省略 dataloader 和 optimizer for epoch in range(10): model.train() for images, targets in train_loader: images list(image for image in images) targets [{k: v for k, v in t.items()} for t in targets] loss_dict model(images, targets) losses sum(loss for loss in loss_dict.values()) optimizer.zero_grad() losses.backward() optimizer.step()Step 2: 导出 ONNX支持 dynamic batch# src/export.py import torch import torchvision # 加载训练好的模型 model torch.load(pcb_fasterrcnn.pth) model.eval() # 创建 dummy inputdynamic batch dummy_input torch.randn(1, 3, 800, 1333) # 任意尺寸Triton 会 resize dynamic_axes { input: {0: batch_size, 2: height, 3: width}, boxes: {0: num_boxes}, scores: {0: num_boxes}, labels: {0: num_boxes} } torch.onnx.export( model, dummy_input, pcb_fasterrcnn.onnx, opset_version17, do_constant_foldingTrue, input_names[input], output_names[boxes, scores, labels], dynamic_axesdynamic_axes )Step 3: TensorRT 优化Jetson Orin# 在 Jetson Orin 上执行 trtexec --onnxpcb_fasterrcnn.onnx \ --saveEnginepcb_fasterrcnn.engine \ --fp16 \ --workspace2048 \ --minShapesinput:1x3x600x800 \ --optShapesinput:4x3x800x1333 \ --maxShapesinput:8x3x1200x1600 \ --shapesinput:4x3x800x1333

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价