- 人工智能
- 计算机视觉
- 深度学习
- 微调
【免费下载链接】jetson-inference
Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.
本文是 jetson-inference 仓库语义分割(Semantic Segmentation)训练链路的实操指南,核心讲解如何在 NVIDIA DIGITS 中创建并训练 FCN-Alexnet 分割模型,覆盖从预训练模型生成、训练参数配置、训练收敛观察、DIGITS 内推理测试,到将模型快照迁移至 Jetson 并经 TensorRT 兼容化后部署运行的全流程。读完本文,你将掌握在 DIGITS 中基于自建分割数据集(以航拍无人机 FPV 数据集为例)完成 FCN-Alexnet 训练的全部关键步骤,并能将训练产物无缝接入本仓库的segNet推理管线。
一、训练前的完整准备链路
本仓库的语义分割教程是一条三步走的技术链路,docs/segnet-training.md是其中的第三步(训练),前两步缺一不可:
- 导入分割数据集:参考 docs/segnet-dataset.md,在 DIGITS 中创建
Segmentation Dataset,把航拍无人机数据集(NVIDIA-Aerial-Drone-Dataset/FPV/SFWA)的720p/images与720p/labels分别指定为特征图与标签图文件夹,% for validation设为 1%,Class labels 指向fpv-labels.txt,Color map 选择From text file,Feature/Label Encoding 均选None; - 生成 FCN-Alexnet 预训练模型:参考 docs/segnet-pretrained.md,通过 DIGITS 语义分割示例自带的
net_surgery脚本把 ImageNet 预训练 Alexnet“卷积化”为全卷积网络(FCN)形态; - 在 DIGITS 中训练分割模型:即本文主体,基于上一步生成的
fcn_alexnet.caffemodel与导入的数据集,训练出可用的航拍分割模型,随后经 docs/segnet-patches.md 的 TensorRT 补丁处理后,在 Jetson 上由segNet完成推理部署(docs/segnet-console.md)。
关于语义分割的定位:与整图分类(imageNet)不同,语义分割在像素级进行分类。做法是把预训练图像识别模型(如 Alexnet)卷积化,转成可逐像素标注的全卷积分割模型,适合环境感知与避障等场景。在本仓库中,c/segNet.h 的
segNet类接收 2D 图像输入,输出带有逐像素分类掩码叠加的第二张图像,每个掩码像素对应一个被分类的物体类别。
二、生成 FCN-Alexnet 预训练模型(net_surgery)
训练之前必须先拿到 FCN-Alexnet 的预训练权重。FCN 的关键在于“卷积化”:把 Alexnet 末端的全连接层改写为卷积层,使网络能接受任意尺寸输入并输出与空间位置对应的逐像素分类图。DIGITS 5 新增了对分割数据集与分割模型训练的支持,并在其语义分割示例(DIGITS/examples/semantic-segmentation)中附带了把 Alexnet 转换为 FCN-Alexnet 的脚本。
在运行 DIGITS 服务器的主机上打开终端,进入 DIGITS 示例目录并执行:
$ cd DIGITS/examples/semantic-segmentation $ ./net_surgery.py Downloading files (this might take a few minutes)... Downloading https://raw.githubusercontent.com/BVLC/caffe/rc3/models/bvlc_alexnet/deploy.prototxt... Downloading http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel... Loading Alexnet model... ... Saving FCN-Alexnet model to fcn_alexnet.caffemodel脚本会自动下载 BVLC 发布的 Alexnet 原始模型(deploy.prototxt 与 bvlc_alexnet.caffemodel),执行网络结构转换后保存为fcn_alexnet.caffemodel。这个文件将作为后续在 DIGITS 中训练航拍分割模型时的预训练起点(Pretrained Model),其路径为DIGITS/examples/semantic-segmentation/fcn_alexnet.caffemodel。
三、在 DIGITS 中创建分割模型(训练核心步骤)
当上一节的数据导入任务完成后,回到 DIGITS 首页,进入Models选项卡,从下拉菜单中选择新建Segmentation Model。
3.1 模型创建表单的关键配置
在模型创建表单中,核心配置项如下:
| 配置项 | 取值 | 说明 |
|---|---|---|
| 数据集 | 上一步创建的航拍分割数据集 | 训练样本来自已导入 DIGITS 的 FPV/SFWA 数据 |
| Subtract Mean | None | 不做均值减除,避免引入与训练数据不匹配的像素偏移 |
| Base Learning Rate | 0.0001 | 基学习率,从预训练模型继续微调时使用较小的学习率 |
| Custom Network → Caffe | 粘贴 FCN-Alexnet prototxt | 指定网络拓扑(fcn_alexnet.prototxt,来自 DIGITS 语义分割示例) |
| Pretrained Model | DIGITS/examples/semantic-segmentation/fcn_alexnet.caffemodel | 上一步 net_surgery 生成的全卷积预训练权重 |
设置网络拓扑时,选择Custom Network选项卡并确保Caffe子选项卡处于选中状态,然后把 DIGITS 语义分割示例提供的FCN-Alexnet prototxt(fcn_alexnet.prototxt)完整复制粘贴到文本框中;Pretrained Model一栏则填入第二节生成的fcn_alexnet.caffemodel路径。
3.2 启动训练并观察收敛
为模型命名后点击页面底部的Create按钮即启动训练任务。训练约5 个 epoch后,Accuracy曲线(橙色)应开始明显爬升,此时模型已具备可用性:
源码侧印证:训练出的分割模型类别数量、输出网格分辨率与
segNet的接口直接对应。查看 c/segNet.h,GetNumClasses()返回输出 blob 的通道数(DIMS_C(mOutputs[0].dims)),GetGridWidth()/GetGridHeight()返回原始分割输出的空间分辨率(DIMS_W/DIMS_H),GetClassLabel(id)与GetClassColor(id)分别按索引取类别名与可视化颜色。这解释了为什么训练数据集必须同时提供类别标签文件(fpv-labels.txt)与颜色映射文件——segNet::loadClassLabels()/loadClassColors()(见 c/segNet.cpp)正是消费这些文件的入口。
四、在 DIGITS 中测试推理模型
在把训练好的模型迁移到 Jetson 之前,先在 DIGITS 内做一次推理验证。在训练结果页面(即上文 Accuracy 曲线的同一页面)向下滚动到Trained Models区域:
- 将
Visualization Model设置为Image Segmentation; - 在
Test a Single Image下选择一张测试图,例如/NVIDIA-Aerial-Drone-Dataset/FPV/SFWA/720p/images/0428.png; - 点击
Test One,页面会显示类似如下的逐像素分割可视化结果。
验证通过后,下载并解压训练模型快照(snapshot)到 Jetson,即可进入下一步 TensorRT 兼容化与部署。
五、模型快照的 TensorRT 兼容化(迁移前必须执行的补丁)
训练得到的 snapshot 中的deploy.prototxt包含两个 TensorRT 不支持的层,需要按 docs/segnet-patches.md 的说明手工删除并做一处参数修正:
- 删除
deploy.prototxt末尾的 deconv 与 crop 层,即upscore(Deconvolution,kernel_size: 63、group: 21、stride: 32、权重填充bilinear)和score(Crop,axis: 2、offset: 18)。这两层是训练阶段用于把低分辨率分数图上采样回输入尺寸的后处理层,推理侧由segNet的Overlay/Mask例程替代,因此必须从部署图中移除; - 将
deploy.prototxt第 24 行的pad: 100改为pad: 0——FCN-Alexnet 输入层的 100 像素填充同样不属于 TensorRT 支持的推理路径; - 把航拍数据集的
fpv-labels.txt与fpv-deploy-colors.txt复制到 Jetson 上的模型快照文件夹,供segNet加载类别名与可视化颜色。
完成这三步后,模型快照即可被 TensorRT 解析并加载。
六、在 Jetson 上运行分割模型(落地验证)
部署侧使用本仓库的segnet命令行示例。需要说明的是:当前仓库中该示例位于 examples/segnet/segnet.cpp(示例目录为examples/segnet),编译产物segnet读取一个输入流(图片/视频/摄像头),输出叠加了分割掩码的渲染结果。
为方便起见,先把解压后的快照路径存入环境变量:
$ NET=20170421-122956-f7c0_epoch_5.0然后对单张图片运行推理:
$ ./segnet drone_0428.png output_0428.png \ --prototxt=$NET/deploy.prototxt \ --model=$NET/snapshot_iter_22610.caffemodel \ --labels=$NET/fpv-labels.txt \ --colors=$NET/fpv-deploy-colors.txt \ --input_blob=data \ --output_blob=score_fr各参数含义如下:
| 参数 | 含义 |
|---|---|
--prototxt | 补丁处理后的部署网络定义deploy.prototxt(仅对 .caffemodel 生效) |
--model | 训练得到的权重快照snapshot_iter_22610.caffemodel |
--labels | 类别标签文件fpv-labels.txt |
--colors | 类别可视化颜色文件fpv-deploy-colors.txt |
--input_blob | 网络输入 blob 名,FCN-Alexnet 为data |
--output_blob | 网络输出 blob 名,FCN-Alexnet 为score_fr(补丁删除 upscore/score 后的最后一层) |
上述参数与 c/segNet.h 中SEGNET_USAGE_STRING定义的命令行选项一一对应,segNet::Create(cmdLine)(见 c/segNet.cpp)会据此加载 prototxt/caffemodel 并解析--input-blob/--output-blob指定的张量名。此外还可选用--alpha(overlay 透明度,0-255,默认 150)、--visualize(overlay/mask/overlay|mask)、--filter-mode(point/linear)与--ignore-class(默认忽略void类)等参数,详见 examples/segnet/segnet.cpp 主循环对SetOverlayAlpha、VisualizationFlagsFromStr、FilterModeFromStr的调用(c/segNet.cpp)。
除了本文训练的航拍模型,仓库还提供了 Cityscapes、SYNTHIA、Pascal-VOC 等数据集的预训练分割模型,可直接通过
segNet::Create(network)加载;从源码结构看,fcn-resnet18-voc是默认网络(见 c/segNet.hSEGNET_USAGE_STRING列出的 fcn-resnet18 系列模型)。
七、深入源码:segNet 推理与可视化管线
理解训练产物的消费方式,能帮你更好地判断训练配置是否合理。segNet的推理主流程(以 examples/segnet/segnet.cpp 为参考)为:
videoSource捕获一帧图像(input->Capture);net->Process(imgInput, width, height, ignoreClass)执行 TensorRT 推理,对输出网格做 argmax 分类,得到每块的类别索引(对应 c/segNet.h 中classify()与mClassMap运行时缓冲);- 按需生成可视化结果:
net->Overlay(...)把类别颜色按 alpha 混合叠加到原图(VISUALIZE_OVERLAY);net->Mask(...)输出纯色化的分割掩码(VISUALIZE_MASK);- 两者同时启用时通过
cudaOverlay拼成左右并排的 composite 图;
videoOutput->Render渲染输出,状态栏显示 TensorRT 版本、网络名与实时 FPS。
Overlay/Mask均支持FILTER_POINT(最近邻)与FILTER_LINEAR(双线性)两种上采样滤波模式(默认线性),上采样尺寸即原始输入图像尺寸,正好替代了训练图中被删除的 deconv/crop 层功能——这也从实现层面解释了第五节补丁操作的合理性。
至此,从 DIGITS 训练 FCN-Alexnet 航拍分割模型到 Jetson 上 TensorRT 推理的完整闭环已经打通:数据集导入 → net_surgery 生成预训练模型 → DIGITS 创建并训练分割模型 → DIGITS 内测试 → 下载快照并打 TensorRT 补丁 → 在 Jetson 上通过 segNet 推理。你可以沿这条链路将同样的方法迁移到自己的自定义分割数据集上。
- 人工智能
- 计算机视觉
- 深度学习
- 微调
【免费下载链接】jetson-inference
Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.
相关推荐
TorchVision FCN 语义分割模型完全指南:FCN-ResNet50 / FCN-ResNet101 的架构、预训练权重与实战使用
TorchVision FCN 语义分割模型完全指南:FCN ResNet50 / FCN ResNet101 的架构、预训练权重与实战使用 本文以 Torch
计算机视觉深度学习图像处理数据集解密NVIDIA-Nemotron-Parse-v1.1-TC架构:ViT-H编码器与mBart解码器的完美协作
解密NVIDIA Nemotron Parse v1.1 TC架构:ViT H编码器与mBart解码器的完美协作 NVIDIA Nemotron Parse v
使用 SuperGradients 训练语义分割模型:模型库、损失函数与端到端实战指南
使用 SuperGradients 训练语义分割模型:模型库、损失函数与端到端实战指南 SuperGradients 为语义分割任务提供了一套完整的开箱即用方案
深度学习计算机视觉预训练人工智能
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考