45、加速智能手机图像字幕解码步骤

加速智能手机图像字幕解码步骤

1. 架构选择

为实现图像字幕生成方法,选用了类似Show and Tell方法的编码器 - 解码器结构。具体采用了优化版本的编码器 - 解码器结构。
- 编码器 :使用预训练的InceptionV4,在速度和准确性方面都是合适的选择。
- 解码器 :采用用于序列建模的神经网络架构生成输出描述,目标是最大化给定输入图像生成正确字幕的概率,用公式表示为:
[h^* = \arg\max_{h} \sum_{(I,S)} \log p(S|I,h)]
其中,(h) 是模型参数,(I) 是输入图像,(S) 是描述图像的正确单词序列。

2. 序列建模与LSTM

由于循环神经网络能够处理可变长度序列,(p(S_t|I, S_0, \ldots, S_{t - 1})) 可以用循环神经网络建模。信息存储在固定长度的隐藏状态 (h_t) 中,通过递归函数 (h_{t + 1} = f(h_t, x_t)) 更新。
为解决循环神经网络中梯度消失和梯度爆炸问题,引入长短期记忆单元(LSTM)。LSTM 有记忆单元,通过遗忘门 (f)、输入门 (i) 和输出门 (o) 控制单元行为,具体公式如下:
[
\begin{align }
i_t &= \sigma(W_{ix}x_t + W_{im}m_{t - 1})\
f_t &= \sigma(W_{fx}x_t + W_{fm}m_{t - 1})\
o_t &= \sigma(W_{ox}x_t + W_{om}m_{t - 1})\
c_t &= f_t \odot c_{t - 1} + i_t \odot \tanh(W_{cx}x_t + W_{cm}m_{t - 1})\
m_t &= o_t \odot c_t\
p_{t + 1} &= \text{softmax}(m_t)
\end{align
}
]
其中,(W) 矩阵是仿射变换参数,(\sigma(.)) 是 sigmoid 函数,(\tanh(.)) 是双曲正切激活函数。

3. 训练与推理
  • 训练步骤
    1. 输入图像的编码视觉特征作为递归结构的输入:(x_{-1} = \text{encoder}(I))。
    2. 解码器逐个处理真实字幕的单词,LSTM 根据图像和先前单词提供下一个单词的概率分布:
      [
      \begin{align }
      x_t &= W_e S_t, \quad t \in {0, \ldots, N - 1}\
      p_{t + 1} &= \text{LSTM}(x_t), \quad t \in {0, \ldots, N - 1}
      \end{align
      }
      ]
    3. 通过最小化每个步骤正确单词的对数似然和来优化可训练参数,损失函数为:
      [L(I, S) = - \sum_{t = 1}^{N} \log p_t(S_t)]
  • 推理方法
    • 采样方法 :将起始符号作为初始输入,根据输出概率分布采样单词,直到采样到结束符号。
    • 束搜索方法 :维护大小为 (k) 的句子集合,选择最佳的 (k) 个序列,但计算复杂度高,在智能手机上耗时,因此采用贪心方法,每步选择概率最大的单词。
4. 模型实现与部署

使用 TensorFlow 实现编码器 - 解码器架构,具体操作步骤如下:
1. 在 Python 中实现架构并在 GPU 上训练,将训练好的权重存储到 TensorFlow 变量中。
2. 将变量转换为常量并序列化图,生成 protobuf 文件(.pb)。由于预训练卷积编码器没有可训练参数,对整个数据集进行一次特征提取,用得到的特征向量训练解码器,得到两个单独的 protobuf 文件。
3. 在推理阶段,将两个 protobuf 文件合并为一个,导出到智能手机设备。在 Android 应用中,冻结图以相机输入,生成的字幕显示在屏幕上。

5. 动态控制流的引入

原方法将输出字幕长度限制为最大 20,很多情况下会浪费时间生成空闲单词。通过分析 MSCOCO 测试数据集字幕长度分布,发现大部分字幕长度集中在 9 - 14。
为减少解码步骤时间,利用 TensorFlow 提供的条件和迭代控制流设施,提出使用高级控制流结构构建数据流图,包含检查结束符号的子图。数据流图包含特殊原语 Enter、Merge、Switch、NextIteration 和 Exit。

操作类型 动态控制流指令(操作种类) 展开到最大长度(操作种类)
总操作 36 22
编码器特定操作(如 conv2D、maxpool)
解码器特定操作(如 matmul)
公共操作(add、mul)

以下是动态控制流相关的流程:

graph TD;
    A[开始] --> B[输入图像];
    B --> C[编码器提取特征];
    C --> D[解码器开始处理];
    D --> E{是否生成结束符号};
    E -- 否 --> F[生成下一个单词];
    F --> D;
    E -- 是 --> G[结束生成];
    G --> H[输出字幕];
6. 实验与结果分析

本次实验的主要目的是分析采用动态控制流代替将计算展开到固定最大长度的效果。由于模型架构和解码例程的贪心行为与之前的模型相同,所以重点在于比较执行时间。

6.1 实验设置
  • 选取 MSCOCO 数据集的一个子集进行运行时间评估,对比“固定字幕长度”和“动态图方法”两种场景。
  • 使用一款处理器相对较弱的手机(CPU 配置为四核 1.2 GHz Cortex - A53)进行实验,从 MSCOCO 测试集中选取 30 张图像,其字幕长度分布近似于之前分析的分布。
  • 通过计算解码器侧 30 次运行时间的平均值来进行性能比较,同时使用手机相机输入生成自然语言字幕,利用“tensorflow/tools/benchmark”工具分析执行时间。
6.2 执行时间计算

每次执行时,解码器时间 (D) 由解码器特定运行时间 (D_{specific}) 和公共操作中解码例程的贡献 (D_{common}) 组成,公式如下:
[D_i = D_{specific_i} + D_{common_i}]
平均解码时间 (D_{avg}) 为:
[D_{avg} = D_{specific_{avg}} + D_{common_{avg}}]
通过对编码器部分的冻结图进行实验,分析公共操作执行时间,定义三个随机变量:总耗时 (T_{common})、编码器耗时 (E_{common}) 和解码器耗时 (D_{common}),它们的关系为:
[D_{common_i} = T_{common_i} - E_{common_i}]
当实验次数 (N) 足够大时,可近似得到 (D_{common_{avg}}):
[D_{common_{Avg}} \approx T_{common_{Avg}} - E_{common_{Avg}}]
其中:
[
\begin{align }
D_{common_{Avg}} &= \frac{\sum_{i = 1}^{N} D_{common_i}}{N}\
T_{common_{Avg}} &= \frac{\sum_{i = 1}^{N} T_{common_i}}{N}\
E_{common_{Avg}} &= \frac{\sum_{i = 1}^{N} E_{common_i}}{N}
\end{align
}
]

6.3 实验结果
实验场景 执行时间(ms) 内存使用(MB) 模型大小(KB)
静态图 711 110432 193867
动态图(本文方法) 488 109596 193922

从实验结果可以看出:
- 模型大小方面,动态图方法的整体模型大小略有增加,但增加幅度极小,可认为静态和动态方法的模型大小基本相同。
- 内存使用方面,动态图方法略有减少,这与循环神经网络解码步骤的减少有关。
- 执行时间方面,动态图方法在解码步骤上实现了约 31% 的加速。

7. 结论

本文提出了一种在智能手机设备上快速实现图像字幕解码的方法。图像字幕生成可作为改善视障人士生活质量的有用工具。
通过分析字幕长度概率分布,利用动态控制流减少了解码步骤的时间开销。循环神经网络本就适合处理可变长度序列,本文方法避免了将计算展开到固定最大长度,提高了智能手机上图像字幕解码例程的速度。
在 MSCOCO 数据集子集上的实验结果验证了该方法的有效性。由于该方法相比实时静态方法能显著减少解码执行时间,因此可作为实时应用的合适候选方案。

以下是整个流程的总结图:

graph LR;
    A[输入图像] --> B[编码器(InceptionV4)];
    B --> C[特征提取];
    C --> D[解码器(LSTM)];
    D --> E{是否结束};
    E -- 否 --> F[生成单词];
    F --> D;
    E -- 是 --> G[输出字幕];
    H[训练阶段] --> I[Python 实现架构];
    I --> J[GPU 训练];
    J --> K[保存权重];
    K --> L[转换常量并序列化];
    L --> M[生成 protobuf 文件];
    M --> N[推理阶段合并文件];
    N --> O[部署到手机];
    O --> A;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值