阅读《A2-RL: Aesthetics Aware Reinforcement Learning for Image Cropping Debang》
一: 文章的主要任务
本文介绍的是如何用强化学习的方法对图片做美学剪裁
如下图,Input是一张风景图,初始化是整张图片,然后经过多个action后,我们得到了最后的裁剪方案作为输出。
二: 相关的工作
对于图片的裁剪,主要有两个大方向:
1. 基于Attention-based: 这个的目的是在原图中寻找关键区域。比如说在图片上寻找信息量最大的区域等等
2. 基于Aethetics-based: 即基于美学,这一方面是想在原图中寻找最让人感觉舒服的区域,这也是本文的目的。
3. 其他还有基于Change-based, 即比较原图和裁剪后的图,根据比较结果决定要去除哪些无关要紧的区域,保留一些质量较高的区域
对于前人的工作,主要有如下缺点:
1. 首先,大部分弱监督的裁剪方法都是依赖于滑动窗口机制(Sliding window mechanism)
2. 滑动窗口的机制有一些缺陷:即要求我们要固定长宽比
3. 大部分滑动窗口的方法会产生上万个备选窗口,这使得程序很耗时
三: 本文的主要想法
针对上述缺点,文章提出了基于Reinforcement Learning的解决方案:
1. 首先,把我们的问题看作一个决策链问题,这个过程就需要我们定义好State space 和 action space
2. 提出本文的算法框架(A2-RL)
3. 设计出一个reward函数使之能有益于我们对图片进行美学裁剪
四: State and Action
- 对于当前状态,我们可以表示成:
s_t = \{o_0, o_1,...,o_{t-1},o_t\}
其中o_t表示agent当前所观察到环境,即当前裁剪的图片 - 对于\{o_0,o_1,...,o_{t-1}\} 表示过去的记忆,即前t-1次迭代过程的剪裁图片,本文用网络LSTM来处理这些记忆
这里需要注意,虽然我们的状态是当前所观察到的环境加上过去的回忆,但是训练的时候只需要输入但前所观察到的环境就可以的,我们的LSTM会提供我们之前的记忆信息
如上图所示,我们把Agent观察到的场景,即裁剪的结果,先进行卷积操作,最后输出一个向量(即Local Feature),而Global Feature 是原图进行卷积的结果,把Local Feature 和 Global Feature 合并起来就是我们是o_t了
Action
Action 很简单,就只有14个动作
五: Reward Function
- reward的计算方法就是: 当前最新裁剪的图片的美学分数与上一次迭代结果的差值,再用信号函数把差值限制在[-1,1]内
sign(s_{aes}(I_{t+1}) - s_{aes}(I_t)) - 此外,还要加一个附加的reward设定-0.001 * (t+1), 目的是想使我们的迭代步数尽可能的小
r^\prime_t = sign(s_{aes}(I_{t+1}) - s_{aes}(I_t)) -0.001 * (t+1) - 为了不让我们的Agent往极端的方向上一去不复返,我们还要设计另一个附加的reward。记ar表示裁剪窗口的长宽比,nr表示一个惩罚,最终,reward function 可以写成:
\quad r_t(s_t,a_t)= \left\{\begin{aligned} &r^\prime_t + nr, &\text{if } ar<0.2 \text{ or } ar>2 \\ &r^\prime_t, &\text{ othewise} \end{aligned}\right. - 最后,就是s_{aes}如何计算了。本文用一个预先训练好的网络VFN来获得一张图片的美学分数。这个网络的结果在这:https://arxiv.org/pdf/1702.00503.pdf
六: 算法框架
最后,总体框架如下:
如上图,我们先把剪裁的图片进行5层的卷积,然后经过一个全连接层输出一个向量作为Local Feature,并合并上对原图的卷积的结果最为RL算法的输入o_t。其中即时的回报通过把Local Feature 放入预先训练好的网络VFN来获得。因为本文的算法采用的是Actor-Critic框架,所以输出分为两个部分,一个是由Actor输出的action,另一个是由critic输出的对该action的评价。
七: 算法细节
本文的算法是基于asynchronous advantage actor-critic(A3C),相比于原始的算法,本文针对实际问题做了一些改善。
- 去掉同步机制,即本文的实验并没有随机生成多个随机场景做训练。但是在训练的时候输入是用mini-batch的形式作为输入的,同样起到了同步训练的结果。
- 使用优势函数以及加入了熵, policy gradient 公式如下
\nabla_\theta log \pi(a_t|s_t; \theta)(R_t - V(s_t;\theta_v)) + \beta \nabla_\theta H(\pi(s_t; \theta))
相比于原始的policy gradient:
\nabla_\theta log \pi_\theta(s,a)(Q^{\pi_\theta}(s,a) - V^{\pi_\theta}(s))
我们发现,本文对算法的变动主要是用reward来表示你的Q function,不过这是很常规的操作,其次是加入了一个熵项,从下面的算法更能直接看出差别