Pelee阅读学习笔记

PeleeNet是一种专为移动设备设计的高效特征提取网络,基于Densenet变体,结合SSD改进,实现在VOC2007上达到76.4%的准确率,iPhone8上速度达23.6fps。PeleeNet采用Two-WayDenseLayer、低成本StemBlock、动态通道数和无压缩过渡层等创新设计,同时引入复合函数以提高计算效率。

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

1.论文阅读:

摘要:

  • VOC 2007:76.4%;MS coco:22.4%
  • 速度:iPhone8的速度为23.6 fps,Nvidia TX2的速度为125 fps。

引言:

【MobileNet、ShuffleNet、MobileNet v2等相继被提出,这些模型都过度依赖于depthwise卷积,而深度可分离卷积缺乏高效实现】

本文主要工作:

1.提出了一种用于移动设备端的网络架构:PeleeNet——是Densenet的变体

【遵循了Desenet的连接模式和一些关键性的设计原则;能够满足对内存和计算预算的限制】

特点如下:

  • Two-Way Dense Layer:

如下图所示,受GoogLeNet启发,使用2-way dense layer来获得不同尺度的感受野。

One way 使用1个3X3的卷积

The other way使用两个堆叠的3X3卷积层来学习大目标的visual patterns

  • Stem Block:

如下图所示,​​​​​​​受Inception-v4和DSOD的启发,提出一种低成本的stem block。

用于第一个dense layer之前提取特征
能够提升特征表达能力,且没有增加太多的计算成本

  • Dynamic Number of Channels in Bottleneck Layer:
bottleneck中的通道数量根据输入feature map的形状而变化,并不是像Densenet中直接扩大4倍
实验结果表明,与原有的Densenet结构相比,该方法可以节省28.5%的计算成本,对计算精度影响较小。

  • Transition Layer without Compression:在PeleeNet中,过渡层不会进行通道数量的压缩。​​​​​​​
  • Composite Function:使用"Conv-BN-ReLU"(后激活),而不是想DenseNet那样进行预激活。后激活的好处是,在做inference阶段,可以将所有的BN层与卷积层合并,可以大幅提高计算速度。为了弥补后激活对精度降低的影响,PeleeNet在设计时尽可能“浅而宽”。并且在最后一个dense block之后添加了1*1卷积层以获得更高级的特征。

2.结合PeleeNet对SSD进行改进,提出了Pelee:

  •  Feature Map Selection :检测模型中有5组不同尺度的特征图——19*19、10*10、5*5、3*3、1*1;为了降低计算成本不选择38*38的尺度
  • Residual Prediction Block :设计ResBlock产生用于预测的feature map

  •  Small Convolutional Kernel for Prediction:ResBlock 使得能够应用1X1的卷积来进行预测分类得分和回归偏移量;精度与使用3X3卷积模型几乎一致,但能够降低21.5%的计算成本。

PELEENET:一种高效的特征提取网络

1.结构:

如表1所示,首先通过stem block[快速提取特征],然后通过4个由dense layers和1个Transition layer组成的stage[除了stage4以外,其他3个stage最后部分都使用了stride=2的平均池化],最后通过1X1卷积层以及全局平均池化做分类检测输出。

之后用可视化工具看了pelee的网络结构超级有规律

2.训练:

有训练SSD安装的caffe,所以只需要把pelee复制到caffe-ssd的examples文件夹中,生成好lmdb文件

sudo python train_voc.py

最后结果:

对比一下结果差了0.6%

### 封装 PeleeNet 模型的方法 PeleeNet 是一种轻量级卷积神经网络架构,专为移动设备优化设计。为了有效封装此模型以便于部署和调用,可以遵循以下方法: #### 1. 安装依赖项 首先安装必要的 Python 库来支持深度学习操作。通常情况下会使用 PyTorch 或 TensorFlow 这样的框架。 对于基于 PyTorch 的环境: ```bash pip install torch torchvision torchaudio ``` #### 2. 导入所需库并定义模型结构 创建一个新的 Python 文件 `peleenet.py` 来保存自定义的 PeleeNet 类定义。 ```python import torch.nn as nn from collections import OrderedDict class PeleeNet(nn.Module): def __init__(self, num_classes=1000): super(PeleeNet, self).__init__() # 构建基础层和其他组件... self.features = nn.Sequential(OrderedDict([ ('conv1', ...), # 卷积层配置 ('norm1', ...), # 归一化处理 ('relu1', ...) # 非线性激活函数 ])) def forward(self, x): out = self.features(x) return out ``` 此处省略了具体的卷积核参数设置等内容,实际应用时应参照原始论文中的描述进行调整[^2]。 #### 3. 加载预训练权重文件 如果已有官方发布的预训练模型,则可以直接加载这些权重到本地实例化的对象上;如果没有现成资源,则需自行训练或微调现有数据集上的表现。 ```python model = PeleeNet() pretrained_dict = torch.load('path_to_pretrained_weights.pth') model.load_state_dict(pretrained_dict) # 设置评估模式 model.eval() ``` #### 4. 创建接口类简化外部访问逻辑 为了让其他开发者更容易理解和集成该模型,在此基础上进一步抽象出更高级别的 API 接口是非常有帮助的做法。 ```python class PeleeNetWrapper(object): def __init__(self, model_path=None): device = 'cuda' if torch.cuda.is_available() else 'cpu' self.model = PeleeNet().to(device) if model_path is not None: pretrained_dict = torch.load(model_path,map_location=device) self.model.load_state_dict(pretrained_dict) self.transform = transforms.Compose([transforms.Resize((input_size)), transforms.ToTensor(), transforms.Normalize(mean=[...], std=[...])]) def predict(self, img_tensor): with torch.no_grad(): transformed_img = self.transform(img_tensor).unsqueeze(0) output = self.model(transformed_img) _, predicted_class = torch.max(output.data, 1) return int(predicted_class.item()) ``` 通过这种方式不仅能够隐藏内部细节,还能提供更加直观友好的交互方式给最终用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值