深度学习(七十)darknet 实现编写mobilenet源码

本文介绍如何在Darknet框架中实现深度可分离卷积,并以MobileNet为例详细展示了网络配置文件的编写过程及训练实验效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、添加一个新的网络层

(1)parse.c文件中函数string_to_layer_type,添加网络层类型解析:

if (strcmp(type, "[depthwise_convolutional]") == 0) return DEPTHWISE_CONVOLUTIONAL;

(2)darknet.h文件中枚举类型LAYER_TYPE添加网络层枚举类型:

DEPTHWISE_CONVOLUTIONAL;

(3)parse.c文件中函数parse_network_cfg添加网络层解析后进行构建:

        LAYER_TYPE lt = string_to_layer_type(s->type);
if (lt == DEPTHWISE_CONVOLUTIONAL) {
l = parse_depthwise_convolutional(options, params);//自己编写的函数,主要调用了make layer
}
        else if(lt == CONVOLUTIONAL){
            l = parse_convolutional(options, params);

(4)parse.c 添加参数读取网络层加载文件

A、添加网络层读取参数函数

void load_weights_upto(network *net, char *filename, int start, int cutoff)
load depthwise weights;

B、把参数读取到内存上:

void load_depthwise_convolutional_weights(layer l, FILE *fp);

C、以及修改depthwise_convolutional_kenel.cu把读取后的cpu参数拷贝到显存上:

void push_depthwise_convolutional_layer(depthwise_convolutional_layer layer);

(5)parse.c添加参数保存功能:

void save_weights_upto(network net, char *filename, int cutoff):
void save_depthwise_convolutional_weights(layer l, FILE *fp);
void pull_depthwise_convolutional_layer(depthwise_convolutional_layer layer);

(6)添加network.c中网络层:

int resize_network(network *net, int w, int h)的resize:
if (l.type==DEPTHWISE_CONVOLUTIONAL)
{
resize_depthwise_convolutional_layer(&l, w, h);
}

(7)另外在多卡异步训练的时候,network_kernels.cu的好几个函数也要添加depth_convolutional参数相关的更新设置。

总结为一句话:直接搜索项目中调用:CONVOLUTIONAL的关键子

有调用到卷积层枚举类型的地方,可分离卷积层也要添加相对应的功能。

(8)darknet使用须知:darknet的网络配置文件中的学习率、batch并不是我们平时所说的学习率、batch_size。网络更新所用的学习率为:learning_rate/batch_size,所以学习率不能太小,比如如果学习率设置为0.01,batch=128,那么实际计算的学习率就是0.000078,非常小的一个数值,基本上就是更新不了

二、编写网络层代码:depthwise_convolutional_kernels.cu、depthwise_convolutional_layer.c、depthwise_convolutional_layer.h

三、编写mobilenet网络结构文件:

[net]
batch=32
subdivisions=1
height=224
width=224
channels=3
momentum=0.9
decay=0.000
max_crop=320

learning_rate=0.1
policy=poly
power=3
max_batches=1600000

#conv1 
[convolutional]
batch_normalize=1
filters=32
size=3
stride=2
pad=1
activation=relu

#conv2_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv2_1/sep
[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=0
activation=relu


#conv2_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv2_2/sep
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=0
activation=relu

#conv3_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu


#conv3_1/sep
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=0
activation=relu

#conv3_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv3_2/sep
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=0
activation=relu

#conv4_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv4_1/sep
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=0
activation=relu

#conv4_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv4_2/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_1/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_2/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_3/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_3/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_4/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_4/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_5/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_5/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_6/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv5_6/sep
[convolutional]
batch_normalize=1
filters=1024
size=1
stride=1
pad=0
activation=relu

#conv6/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv6/sep
[convolutional]
batch_normalize=1
filters=1024
size=1
stride=1
pad=0
activation=relu

#pool6
[avgpool]

#fc7
[convolutional]
filters=1000
size=1
stride=1
pad=0
activation=leaky

[softmax]
groups=1

[cost]
四、imagenet训练实验

1、训练一天后,经过两轮多的epoch后,精度:


2、训练两天后,迭代第二天结果:


3\又训练了一天多:


<think>嗯,用户询问的是关于TensorRTX的信息,包括其定义、教程、特性和下载方式。从对话历史中的引用来看,TensorRTX似乎是一个与TensorRT相关的工具或项目,特别是在手动构建模型结构方面有应用。 让我仔细分析一下引用内容:引用[1]提到TensorRTX属于"手动构造模型结构"的方式,用户需要自己构建网络结构并转移权重。引用[2]展示了使用Python部署TensorRT的代码示例,特别是ONNX解析器的使用。引用[3]则是一个在Jetson nano上部署YOLOv5模型的博客参考。 根据这些信息,TensorRTX应该是一个开源项目,主要用于通过C++手动实现各种深度学习模型结构,以便直接转换为TensorRT引擎。这种方式虽然灵活但实现成本较高,适合需要深度优化的场景。 用户可能是一位开发者,正在寻找TensorRT的模型部署方案,特别是对现有转换器(Caffe-Parser/UFF-Parser)不满意的场景。ta可能遇到了ONNX转换的限制,或者需要更精细的控制模型结构。 在回答中需要明确: 1. TensorRTX的本质是GitHub开源项目而非官方工具 2. 强调其手动实现特性带来的优势和代价 3. 提供实际应用场景(如YOLO系列部署) 4. 给出具体的GitHub路径作为下载来源 特别注意要区分TensorRT(官方SDK)和TensorRTX(社区项目)的关系,避免混淆。教程部分应包含关键步骤:环境准备、模型选择、权重转换、编译运行。特性描述要突出其与标准工作流的差异点。</think>好的,我们来详细了解一下 TensorRTX。 **TensorRTX 是什么?** TensorRTX 是 **一个开源项目**(通常指在 GitHub 上由 **wang-xinyu/tensorrtx** 维护的仓库),它的核心目标是提供一系列 **使用纯 C++ 实现** 的流行深度学习模型(如 YOLO 系列、ResNet、SSD、ArcFace 等)的网络结构定义,并演示如何将这些模型 **直接转换为 NVIDIA TensorRT 引擎** 进行高性能推理。 * **核心价值:** 它提供了一种 **“手动构造模型结构”** 的方式来实现 TensorRT 部署,这是 TensorRT 官方支持的三种模型转换方式之一(如引用[1]所述)。这种方式虽然需要手动编写网络定义代码,但提供了最大的灵活性和对底层细节的控制。 * **解决的问题:** 当使用官方转换器(如 ONNX parser, UFF parser)遇到兼容性问题、算子不支持、或者需要实现非常定制化的网络结构/算子时,TensorRTX 提供了一种可行的替代方案。它直接使用 TensorRT 的 C++ API 构建网络,绕过了中间格式转换可能带来的问题。 * **与 TensorRT 的关系:** TensorRTX **不是** NVIDIA 官方的 TensorRT SDK 的一部分。它是社区开发者创建的一个**实用工具集和示例库**,帮助用户更直接地利用 TensorRT C++ API 部署特定模型。你可以把它看作是一个**高级的 TensorRT 应用范例和模型实现库**。 **TensorRTX 的主要特性** 1. **纯 C++ 实现:** 所有模型结构都使用 TensorRT 的 C++ API 直接定义,不依赖其他深度学习框架(如 PyTorch, TensorFlow)的运行时。这使得部署环境更轻量、更可控。 2. **模型多样性:** 支持多种主流模型架构,尤其是计算机视觉领域模型(YOLOv3/v4/v5/v7/v8, YOLOX, YOLOR, ResNet, MobileNet, EfficientNet, ShuffleNet, ArcFace, DBFace, CenterFace, RetinaFace, SSD, MTCNN 等)。 3. **高性能优化:** 代码实现通常包含了针对 TensorRT 和特定硬件(如 Jetson 系列)的性能优化技巧,例如层融合(layer fusion)、使用最优的精度(FP16/INT8)、高效的内存管理等,旨在发挥 TensorRT 的最大推理速度。 4. **直接权重转换:** 提供工具(通常是 Python 脚本)将原始训练框架(如 PyTorch, Darknet)导出的模型权重(`.pt`, `.weights`, `.pth` 等)转换为 TensorRTX C++ 代码可以直接加载的格式(通常是 `.wts` 文件)。这个转换过程只转移权重数值,不涉及模型结构。 5. **端到端示例:** 提供完整的编译、转换、推理的代码和流程说明,用户可以参考其实现自己的模型或进行二次开发。 6. **灵活性:** 由于是直接操作 TensorRT API,开发者可以精细控制网络的每一层、定制不支持的算子(通过 Plugin 机制)、实现复杂的预处理/后处理集成,满足高度定制化的部署需求。 7. **跨平台:** 核心 C++ 代码可以在支持 TensorRT 的各种平台上运行,包括 x86 服务器/工作站和 NVIDIA Jetson 系列边缘设备(如引用[3]在 Jetson Nano 上部署 YOLOv5 的实践)。 **TensorRTX 使用教程 (核心步骤概述)** 使用 TensorRTX 部署模型通常遵循以下主要步骤(具体细节需参考官方仓库对应模型的 README): 1. **环境准备:** * 安装对应版本的 **NVIDIA GPU 驱动**、**CUDA Toolkit** 和 **cuDNN**。 * 安装 **TensorRT** SDK。确保版本兼容性(TensorRTX 仓库通常有版本要求说明)。 * (可选) 安装 **OpenCV**(用于图像加载、预处理/后处理可视化)。 2. **获取 TensorRTX 源码:** ```bash git clone https://github.com/wang-xinyu/tensorrtx.git ``` 3. **选择目标模型:** * 进入仓库中对应模型的目录,例如 `tensorrtx/yolov5` 或 `tensorrtx/resnet`。 4. **获取原始模型权重:** * 下载你需要的预训练模型权重文件(如 YOLOv5 的 `yolov5s.pt`)。 5. **权重转换 (生成 .wts 文件):** * 运行模型目录下提供的 Python 转换脚本(如 `yolov5/gen_wts.py`),将原始权重文件(`.pt`)转换为 TensorRTX 可读的 `.wts` 文件。 ```bash python gen_wts.py -w yolov5s.pt -o yolov5s.wts # 示例命令 ``` * 将生成的 `.wts` 文件复制到后续 C++ 项目的构建目录或指定位置。 6. **编译 TensorRTX 工程:** * 进入模型对应的 C++ 源码目录(如 `tensorrtx/yolov5`)。 * 创建 `build` 目录并进入: ```bash mkdir build cd build ``` * 使用 CMake 生成构建文件并编译。需要指定 TensorRT、CUDA 等路径: ```bash cmake .. -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc # 可能需要指定 CUDA 编译器路径 make -j$(nproc) ``` * 编译成功后会生成可执行文件(如 `yolov5`, `yolov5_det` 等)。 7. **运行推理:** * 运行生成的可执行文件,通常需要指定 `.wts` 文件路径、输入图像/视频路径、输出路径、精度模式(FP32/FP16/INT8)等参数。 ```bash ./yolov5 -s yolov5s.wts yolov5s.engine s # 示例:序列化生成 engine 文件 ./yolov5 -d yolov5s.engine ./samples # 示例:加载 engine 文件进行推理 ``` * 具体参数请参考每个模型目录下的 README 或运行程序时查看帮助 (`-h`)。 **TensorRTX 下载** TensorRTX 是一个托管在 GitHub 上的开源项目。下载它的唯一官方途径是克隆其 Git 仓库: * **GitHub 仓库地址:** `https://github.com/wang-xinyu/tensorrtx` **使用命令下载:** ```bash git clone https://github.com/wang-xinyu/tensorrtx.git ``` **总结:** TensorRTX 是一个强大的开源工具集,它通过提供纯 C++ 实现的流行模型和端到端的部署流程,让开发者能够绕过官方转换器的限制,直接利用 TensorRT C++ API 进行高性能、高灵活性的模型部署。它特别适用于需要深度定制、优化或部署官方转换器难以支持的模型场景。其核心特性包括模型多样性、C++实现、高性能优化和直接权重转换。使用它需要一定的 C++ 和 TensorRT 基础,并遵循克隆仓库、转换权重、编译代码、运行推理的标准流程。 [^1]: TensorRT官方支持Caffe、Tensorflow、Pytorch、ONNX等模型的转换...也提供了三种转换模型的方式:...手动构造模型结构,然后手动将权重信息挪过去...tensorrtx。 [^2]: 使用Python部署TensorRT...创建builder,network和parser...使用trt.OnnxParser...从PyTorch和其他框架导入。 [^3]: Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值