news 2026/9/25 5:47:00

用 DIGITS 训练 FCN-Alexnet 语义分割模型:jetson-inference 端到端实操指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 DIGITS 训练 FCN-Alexnet 语义分割模型:jetson-inference 端到端实操指南
  • 人工智能
  • 计算机视觉
  • 深度学习
  • 微调

【免费下载链接】jetson-inference

Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.

项目地址:https://gitcode.com/gh_mirrors/je/jetson-inference
点击查看免费下载

本文是 jetson-inference 仓库语义分割(Semantic Segmentation)训练链路的实操指南,核心讲解如何在 NVIDIA DIGITS 中创建并训练 FCN-Alexnet 分割模型,覆盖从预训练模型生成、训练参数配置、训练收敛观察、DIGITS 内推理测试,到将模型快照迁移至 Jetson 并经 TensorRT 兼容化后部署运行的全流程。读完本文,你将掌握在 DIGITS 中基于自建分割数据集(以航拍无人机 FPV 数据集为例)完成 FCN-Alexnet 训练的全部关键步骤,并能将训练产物无缝接入本仓库的segNet推理管线。


一、训练前的完整准备链路

本仓库的语义分割教程是一条三步走的技术链路,docs/segnet-training.md是其中的第三步(训练),前两步缺一不可:

  1. 导入分割数据集:参考 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;
  2. 生成 FCN-Alexnet 预训练模型:参考 docs/segnet-pretrained.md,通过 DIGITS 语义分割示例自带的net_surgery脚本把 ImageNet 预训练 Alexnet“卷积化”为全卷积网络(FCN)形态;
  3. 在 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 MeanNone不做均值减除,避免引入与训练数据不匹配的像素偏移
Base Learning Rate0.0001基学习率,从预训练模型继续微调时使用较小的学习率
Custom Network → Caffe粘贴 FCN-Alexnet prototxt指定网络拓扑(fcn_alexnet.prototxt,来自 DIGITS 语义分割示例)
Pretrained ModelDIGITS/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 的说明手工删除并做一处参数修正:

  1. 删除deploy.prototxt末尾的 deconv 与 crop 层,即upscore(Deconvolution,kernel_size: 63、group: 21、stride: 32、权重填充bilinear)和score(Crop,axis: 2、offset: 18)。这两层是训练阶段用于把低分辨率分数图上采样回输入尺寸的后处理层,推理侧由segNet的Overlay/Mask例程替代,因此必须从部署图中移除;
  2. 将deploy.prototxt第 24 行的pad: 100改为pad: 0——FCN-Alexnet 输入层的 100 像素填充同样不属于 TensorRT 支持的推理路径;
  3. 把航拍数据集的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 为参考)为:

  1. videoSource捕获一帧图像(input->Capture);
  2. net->Process(imgInput, width, height, ignoreClass)执行 TensorRT 推理,对输出网格做 argmax 分类,得到每块的类别索引(对应 c/segNet.h 中classify()与mClassMap运行时缓冲);
  3. 按需生成可视化结果:
    • net->Overlay(...)把类别颜色按 alpha 混合叠加到原图(VISUALIZE_OVERLAY);
    • net->Mask(...)输出纯色化的分割掩码(VISUALIZE_MASK);
    • 两者同时启用时通过cudaOverlay拼成左右并排的 composite 图;
  4. 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.

项目地址:https://gitcode.com/gh_mirrors/je/jetson-inference
点击查看免费下载

相关推荐

上一篇:mailcow 中的 QRicket QR 码提供商:TwoFactorAuth 库可选配置与源码级解析
下一篇:国家中小学智慧教育平台电子课本下载终极指南:三步获取PDF教材的完整解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 5:44:48

Atlas 300V 24G推理卡部署YOLO全流程与踩坑指南

前几天有个做安防项目的朋友发了一张截图给我,问“Atlas 300V 24G到底算不算运算加速卡?能不能拿来跑YOLO?”这个问题我其实被问过很多次。很多人从CUDA那套习惯转过来,第一次接触华为的昇腾设备,容易拿GPU的思维去套A…

作者头像 李华
网站建设 2026/9/25 5:44:03

HCIP-Storage备考:H13-624练习题拆解与实操验证指南

简介:这份HCIP-Storage(存储)H13-624练习题文档,面向备考华为存储认证的考生及希望系统梳理存储知识点的工程师,围绕融合存储、超融合、RAID2.0、容灾备份等核心考点提供针对性训练。内容涵盖并行快速数据重建、超融合…

作者头像 李华
网站建设 2026/9/25 5:41:43

Atlas 300V 24G加速卡实测:从环境搭建到YOLOv5部署全流程

“atlas 300v 24g 是运算加速卡吗”,这个问题如果只看型号名,答案毫无悬念:是。但实际操作一圈之后你会发现,这个“是”字后面藏着很多前提。我最近在一台服务器上装了Atlas 300V Pro 24G,并且把YOLOv5检测模型从PyTor…

作者头像 李华