景
创意平台是一个拥有丰富素材、模板的多场景在线设计平台。
众所周知,颜色在设计中扮演着极为重要的角色,它不仅仅是美感的体现,还深刻影响用户的感知、情绪和行为。为了提升用户的检索效率,提高作品的最终视觉效果,我们需要支持颜色检索图片。
在最初版本中,我们通过人工识别的方式,将颜色作为标签与图片关联起来,显然,这与创意平台设计的初衷背道而驰,所以我们决定在系统层面上实现图片颜色识别及关联自动化。
目的
实现素材&模板的主色识别及关联自动化。换句话说,就是让用户在上传素材&模板之后,不经过人工处理,就能够通过颜色检索到对应的素材&模板。
实现方案
通过分析用户的使用场景,我们可以将流程细化成四步:用户上传素材&模板->服务器提取主色->服务器关联颜色与素材&模板->用户检索素材&模板,其中服务器需要做三件事,提取主色、颜色归类、颜色关联,那么接下来我们将对这三件事进行详细阐述。
1.主色提取
计算机是如何表达图像的?
在提取主色前,我们首先需要知道计算机是如何表达图像的。首先给出结论:计算机是通过像素和颜色信息来表达图像的。图像是由多个不可分割的单元组成的,这些单元被称为像素,每个像素代表图像中的一个点,像素都包含颜色信息、位置信息。像素的颜色信息通常使用RGB(红、绿、蓝)模型表示。
RGB颜色模型
在RGB模型中,颜色由红色、绿色和蓝色三个颜色通道的组合来表示。每个通道的强度可以在0到255之间变化,其中0表示没有该颜色,255表示该颜色的最大强度。例如,RGB(255, 0, 0) 表示红色,因为红通道的强度是255,而绿和蓝通道的强度为0。
主色提取算法
知道了图像在计算机中的表达方式后,那么自然而然的想法是,可以通过统计图像中像素个数排名靠前的颜色来得到主色,显然,这种提取方式在一些简单场景上(如:纯色图片)效果不错,但是在复杂场景(如:颜色渐变)上就不太合适了。
常见的主色提取算法有Kmeans算法、中位切分法、八叉树算法等,相较于其他语言,Java在图像处理方面有着明显的劣势,虽然有基础的图像处理API,但缺少强大的图像处理库,通过调研这三种算法的实现难度、实现效果后,我们更倾向于Kmean算法和中位切分法,幸运的是,我们在github上找到开源的颜色提取项目Color thief,它是基于中位切分法实现的。此开源项目的核心思想简述如下:
在引用开源项目后,我们成功提取出图片的主色,但是在实验过程中发现以下两个问题:
针对问题1:
经过对比分析,我们猜测是透明的像素点被识别成了黑色,为了验证这一猜想,我们调研了PNG图片的格式,PNG图片分为三通道PNG(RGB PNG)、四通道PNG(RGBA PNG),其中R G B A分别代表红色通道、绿色通道、蓝色通道、透明度通道,所以我们在获取像素点颜色这一步骤中过滤了全透明像素点,成功解决这一问题。
针对问题2:
我们都知道采样是一种近似方法,对图像进行采样可能导致信息丢失、颜色提取的精确度降低。另外,减少像素数量,可以提高计算效率,对于大尺寸的图像,可以显著减少处理时间、减少资源消耗。我们期望在尽可能还原图像最真实的颜色的基础上,降低对服务器的影响,在创意平台中,96.8%的图片大小处于5M以内,我们对于这类图片使用最高的采样标准,对于超过5M的图片,尽可能使用最高的采样标准,对于处理失败的图片,未来将采取压缩或者转格式的方式来降低图像文件大小。
主色提取数量的变化会影响提取的主色范围。最初,在参考常规的颜色提取网站后,我们选定了主色数量为4个,在大多数场景下效果不错,但在特殊场景下,肉眼感知的主色和图片识别的主色不一致。
我们第一反应:这张图片应包含橙色、灰色、黑色、棕色。
但提取出来的颜色是这样的:
为什么没有识别出橙色?我们知道,中位切分法是通过不断二分颜色直方体,使得直方体数量等于主色数量,最后得出主色,所以在二分的过程中可能导致颜色精度损失。因此我们的策略是尽可能提取多的颜色,但不可能全量提取,所以我们在原有4个主色的基础上,分别增加1、2、3个进行对比测试。
提取5个主色
提取6个主色
提取7个主色
测试结果显示,在把主色数量设置为5时,提取的主色基本就能覆盖所有主色,再增加提取的主色数量也不过是增加"重复"的棕色,因此选定主色提取数量为5个。
然而,这又引入一个新问题,当把主色提取数量设置为5个后,简单类型的图像主色包含占比很低的颜色。为了避免这一情况,就需要过滤占比较低的颜色,但是占比多少算低,没有一个准确的定论,只能通过不断调整主色在原图上的占比阈值来反复测试,最后,我们找到一个相对合适的占比范围。
2. 颜色归类
首先,我们回顾一下RGB颜色空间,以r g b为轴,建立空间坐标系,如下图所示。
可以看到,在RGB空间中,八个顶角分别代表了黑色、红色、绿色、蓝色、黄色、洋红色、青色、白色。显然,通过主色rgb值就确定主色属于什么颜色是一件非常困难的事情,原因有二,第一,rgb三个分量是高度相关的,即使在rgb分量上有些许的变化,也会导致颜色分类改变;第二,RBG颜色空间是面向机器的,颜色均匀性很差,无法通过空间点之间的关系进行分类;所以我们不能使用RGB颜色空间。
为了将主色进行颜色归类,我们需要更合适的颜色模型。通过调研,常见的颜色模型有CMYK、LAB、HSV。
常见的颜色模型
CMYK颜色模型
CMYK颜色模型是一种用于印刷和出版的颜色模型,它表示颜色通过四个颜色通道:青(Cyan)、洋红(Magenta)、黄(Yellow)和黑(Key,通常表示黑色)。这四个颜色通道可以组合产生多种颜色。
LAB颜色模型
LAB颜色空间是一种颜色空间,也称为CIE Lab*颜色空间,由国际照明委员会(CIE)定义。它是一种基于人眼感知的颜色空间,与设备无关,用于更准确地描述和测量颜色,更适用于颜色编辑
LAB颜色空间如下所示:
HSV颜色模型
HSV颜色模型是一种描述颜色的方式,其中颜色由三个属性组成:色调(Hue)、饱和度(Saturation)和明度(Value)。HSV模型相对于RGB模型更加直观,更符合人类对颜色的感知。
HSV颜色空间如下所示:
按照角度划分出颜色范围如下所示:
通过对比这三种颜色模型,我们最终选择了HSV颜色模型。原因有二,第一,HSV颜色空间只需要通过一个变量就能控制颜色的线性变化,而LAB颜色空间需要两个;第二,HSV颜色空间更加容易确定颜色空间范围。
如何归类
通过观察HSV颜色空间,颜色归类可以抽象成在局部三维空间中找到指定的点,在这个局部颜色空间中,所有的像素点均被归类成同一个颜色。我们需要做两件事,第一,将主色转换成空间中的点;第二,确定颜色在HSV颜色空间的范围
我们将rgb映射成hsv,构建成三维空间坐标系。rgb转hsv公式如下,由于java中Color工具类中已实现rgb转hsv,因此不需要再重复实现。
其中 max 等于 r, g, b 中的最大者
其中 min 等于 r, g, b 中的最小者
为了方便计算,hsv的取值范围分别映射成[0-180] [0-255] [0-255],如下图所示:
参考网上资料给出的颜色取值表,我们经过了一系列的主色转换测试,发现部分颜色的分类不能够满足需求,所以,在原有取值表的基础上,耗费了大量时间进行调整范围测试,最终找到一个相对合适的取值范围。原hsv颜色取值表如下所示:
3.颜色检索实现及效果展示
在确定主色所在的颜色分类空间范围后,我们有两种实现思路:
第一种方案,存储素材&模板的主色hsv值,使用给定范围空间作为入参去检索素材&模板,也就是在空间里找点。创意平台目前是使用ElasticSearch和MySQL对素材&模板进行存储和检索的,虽然两者都支持了空间检索,但是仅支持二维空间检索。如果要使用其他的空间检索工具,成本会非常高,因为需要保证数据一致性。
第二种方案,存储素材&模板的主色hsv对应的颜色分类,即"色卡",效果等同于颜色标签,再通过"色卡"进行检索。实现简单,数据一致性也可通过内部自研的数据同步工具保证。
经过多方面考量,最终,我们选择了第二种实现方案,通过ElasticSearch实现存储与检索,效果不错。我们支持了PNG、SVG、JPEG、JPG、GIF、PPT、PPTX类型文件的主色提取及关联自动化,自动识别成功率达到99%。
"色卡"紫色检索图片素材的效果如下所示:
在设计团队视角上,资源中心展示的素材&模板均由设计师设置并展示,如果要使用颜色筛选功能则需要设计师人工识别颜色并打标。现在,由系统自动化处理,可节省时间成本20~30s/次(至少节省原人工处理流程时间的70%)。另外,资源中心内展示的图片素材&模板存量约为9000,通过系统处理可节省时间50~75h;周均上传图片素材&模板约100,周均节省时间33~50min;
在业务团队视角上,图片主色识别&关联自动化功能上线前,日均检索总次数为95,上线后,日均检索总次数为122(提升约27%),其中使用"色卡"检索的次数为18(占比约15%),由此可见,颜色检索素材&模板功能是很重要的。
总结及展望
在颜色检索2.0版本中,我们将颜色检索图片抽象成在三维空间中寻找点,首先使用中位切分法提取图像的主色,然后构建主色的hsv空间坐标系,在空间坐标系中划分各颜色空间领域,最后通过将主色归类到各颜色所在空间,实现颜色关联图像,从而达成颜色检索图片的目的。
颜色检索只是CBIR(Content-Based Image Retrieval)领域的冰山一角,而我们在功能上使用到的技术更是微不足道的一粒冰粒,在图像特征的其他方向如纹理、形状上,我们还有许多的路要走。
参考资料
1.https://github.com/sergeyk/rayleigh
2.https://github.com/SvenWoltmann/color-thief-java
3.https://immortalqx.github.io/2020/08/17/opencv-notes-2/
4.https://blog.csdn.net/xxboy61/article/details/88356005
5.https://www.mathworks.com/help/images/understanding-color-6.spaces-and-color-space-conversion.html
7.https://blog.csdn.net/qq_42475234/article/details/122746811
8.https://blog.csdn.net/lly_3485390095/article/details/104570885
作者:石开
来源:微信公众号:高途技术
出处:https://mp.weixin.qq.com/s/Smf2BRoeNenaK96FPs8S0w
迎观看 Premiere Pro 教程,小编带大家学习 Pr 的基本编辑技巧,了解如何创建颜色溶解过渡。
在此项目中,将在两个剪辑之间创建一个过渡,该过渡看起来与典型的交叉溶解非常不同。从编辑工作区开始,将剪辑放在时间线上,以便第一个(“传出”)剪辑与第二个(“传入”)剪辑重叠。重叠的长度应该至少与您希望溶解效果持续的时间一样长。
将颜色键效果应用于顶部的传出剪辑。在「效果控件」面板中,单击「主要颜色」吸管以对要用于启动过渡效果的颜色进行采样。
对于戏剧性的外观,选择占主导地位的场景,例如天空。
在短时间内将「颜色容差值」从零到最大值 (255) 设置关键帧,重叠时间的一半。
会看到传出的剪辑逐渐消失,露出其下方的传入剪辑。
在「效果控件」面板中选择「颜色键」效果并复制它。
使用快捷键 Command+C,然后按 Command+V。
在下面的副本中,拖动选择,然后向前移动「颜色容差」关键帧,以便第一个关键帧与上面副本中的第二个关键帧对齐。
将关键颜色更改为仍出现在传出剪辑中的颜色。
如果它有助于您对颜色进行采样,放大播放序列。
添加第二个颜色关键点效果将删除传出剪辑的所有痕迹,完全显示传入剪辑。如果没有,稍微增加「边缘细化」值。
尝试不同的起始键颜色,看看它们如何影响过渡。还可以使用颜色遮罩(或任何图形)作为传入的剪辑,使传出的剪辑逐渐融合到另一个视频以外的其他内容中。
以上就是在 Premiere Pro 中创建颜色溶解过渡的方法。
https://www.macz.com/mac/6072.html?id=NzY4OTYwJl8mMjcuMTg2LjkuMzM%3D
法的实现可以访问链接了解:
https://github.com/hyperparameters/tracking_via_colorization
简单地说,它可以理解为在整个视频序列中识别唯一的对象。要跟踪的对象通常称为目标对象,跟踪可以通过边界框或实例分割来完成,有两种类型的公共对象跟踪挑战。
1. 单目标跟踪:在整个视频序列中跟踪感兴趣的目标,例如VOT挑战
2. 多目标跟踪:在整个视频序列中跟踪多个感兴趣的目标。例如:MOT挑战
一些著名的经典的用于解决目标跟踪CV算法的是:
1. Mean shift
2. Optical flow
3. Kalman filters
其中最著名的一种多目标跟踪算法是SORT,是以卡尔曼滤波器为核心,并且非常成功的一种算法。
随着深度学习时代的到来,社会上出现了非常有创新性的研究并且深度学习方法成功地胜过了传统的CV方法来应对公共跟踪挑战。尽管在公共挑战方面取得了巨大成功但深度学习仍在努力为现实世界中的问题陈述提供通用的解决方案。
在训练深度CNN模型时,我们面临的主要挑战之一是训练数据。
训练数据:深度学习方法需要大量的数据,这几乎每次都会成为一个瓶颈。此外,像多目标跟踪这样的任务很难注释,而且这个过程变得不切实际而且成本高昂。
深度模型数据永远不嫌多
我们都知道有监督和非监督学习技术。这是一种被称为自监督学习的新型学习方式。在这些类型的学习中,我们试着利用数据中已经存在的信息,而不是任何外部标签,或者有时我们说模型是自己学习的。实际上,我们所做的就是训练CNN模型去完成一些其他的任务,间接地帮助我们实现我们的目标,这个模型自我监督。这些任务被称为“代理任务”或“借口任务”。
代理任务的示例如下:
CNN模型学习从灰度图像预测颜色。(来源:https://arxiv.org/abs/1603.08511)
从图像中提取补丁并将其打乱。模型学习如何解开拼图并按照正确 的顺序排列,如图3所示。(来源:https://arxiv.org/abs/1603.09246)
该模型学习在视频序列中对打乱的帧进行排序。[来源:https://arxiv.org/abs/1708.01246]
许多这样的任务可以用作计算机视觉问题的代理任务。这种训练的一个主要好处是训练不需要手动注释数据,并且适合解决生活中实际的用例。
我们已经看到了并了解了什么是自监督模型,您一定猜到了我们将使用着色作为我们的代理任务的名称。
通过给视频着色来实现跟踪
我们使用大量未标记视频学习模型的视觉跟踪无需人工监督。
arxiv.org(https://arxiv.org/abs/1806.09594)
简介
着色是代理任务或借口任务,目标跟踪是主要任务或下游任务。采用大规模的无标记视频对模型进行训练,不需要人工进行任何单一像素的标注。该模型利用视频的时间相干性对灰度视频进行着色。这看起来可能有点混乱,但我会慢慢给大家讲明白。
模型将如何学习跟踪
我们将取两个帧,一个目标帧(时刻t),一个参考帧(时刻t-1),并通过模型。该模型期望通过对参考帧颜色的先验知识来预测目标帧的颜色。通过这种方式,模型内部学会了指向正确的区域,以便从参考框架复制颜色,如图所示。这种指向机制可以用作推理期间的跟踪机制,我们将很快看到如何做到这一点。
模型接收一个彩色帧和一个灰度视频作为输入,并预测下一帧的颜色。模型学会从参考系复制颜色,这使得跟踪机制可以在没有人类监督的情况下学习。[来源:https://ai.googleblog.com/2018/06/self-supervised-tracking-via-video.html]
我们不复制网络中的颜色,而是训练我们的CNN网络学习目标帧的像素和参考帧的像素之间的相似度(相似度是灰度像素之间),然后线性组合时使用此相似度矩阵参考帧中的真实颜色会给出预测的颜色。从数学上讲,设Cᵢ为参考帧中每个像素i的真实颜色,Cⱼ为目标帧中每个像素j的真实颜色。
[资源链接:https://arxiv.org/abs/1806.09594]
公式1:预测颜色与参考颜色的线性组合
无论是图像、参考帧还是目标帧都经过模型学习后对每个像素进行了低层次的嵌入,这里fᵢ是像素i在参考帧中的嵌入,类似地,f是像素j在目标帧中的嵌入。然后,计算相似度矩阵:
公式2:用softmax归一化的内积相似度
相似矩阵中的每一行表示参考帧的所有像素i和目标帧的像素j之间的相似性,因此为了使总权重为1,我们对每一行应用softmax。
Lets look an example with dimension to make it clear,we try to find a similarity matrix of 1 pixel from target frame.An illustration of this example is shown below.Consider reference image and target image, size (5, 5) => (25,1)for each pixel, cnn gives embedding of size (64, 1), embedding for reference frame, size (64, 25), embedding for target frame, size (64, 25), embedding for 3rd pixel in target frame, size (64, 1)Similarity Matrix, between reference frame and target pixel, j=2 =softmax , size (25, 64) (64, 1) => (25,1) => (5, 5)we get a similarity between all the ref pixels and a target pixel at j=2.Colorization, To copy the color (here, colours are not RGB but quantized colour of with 1 channel) from reference frame,, Colors of reference frame size (5, 5) => (25, 1), Similarity matrix, size (5, 5) => (1, 25)Predicted color at j=2, , size (1, 25) (25, 1) => (1, 1)From the similarity matrix in below figure, we can see reference color at i=1 is dominant(0.46), thus we have a color copied for target, j=2 from reference, i=1PS:1. ᵀ denotes transpose2. matrix indices starts from 0
(a)为2帧大小(5,5),(b)为参考帧嵌入与目标像素在j =2处嵌入的内积,(c) softmax后的相似度矩阵,(d)相似度矩阵与参考帧真颜色的线性组合[来源:https://github.com/hyperparameters/tracking_via_colorization]
同样,对于目标帧中的每个目标像素((5,5)=> 25个像素),我们将会有一个相似矩阵的大小(5,5),即大小为(5,5,25)的完整相似度矩阵Aᵢⱼ =(25,25)。
在实现中,我们将使用(256 x 256)图像扩展相同的概念。
图像量化
第一行显示原始帧,第二行显示来自实验室空间的ab颜色通道。第三行将颜色空间量化到离散的容器中,并打乱颜色,使效果更加明显。[来源:https://arxiv.org/abs/1806.09594]
颜色是空间频率偏低,所以我们可以处理低分辨率的帧。我们不需要C(255,3)颜色组合,所以我们创建了16个聚类并将颜色空间量化为这些聚类。现在我们只有16种独特的颜色簇(见上图第3栏)。聚类是用k-均值完成的。16个群集会有一些颜色信息的丢失,但足以识别物体。我们可以增加聚类的数目来提高着色的精度,但代价是增加计算量。
[来源:https://arxiv.org/abs/2002.07793]
为了将图像量化成簇,我们将使用LAB颜色空间的AB通道而不是RGB颜色空间通道。上面的图显示了RGB和LAB通道间的相关性,从图中我们可以得出结论
RGB往往比LAB更具相关性。
LAB将强制模型学习不变性,它将强制其学习更强大的表示形式,而不是依赖于本地颜色信息。
可以使用sklearn的KMeans软件包进行聚类。
这个类将用于制作颜色的簇,我们将把它存储为一个pickle。
注意:我使用pytorch来进行实现,它遵循(N, C, H, W)格式。在处理矩阵重塑时要记住这一点。如果你对形状有任何疑问,请随时与我们联系。
该模型从参考帧中学习为视频帧着色。[来源:https://ai.googleblog.com/2018/06/self-supervised-tracking-via-video.html]
输入
该模型的输入是四个灰度视频帧,其下采样为256×256。三个参考帧和一个目标帧。
首先,我们将所有的训练视频压缩到6fps。然后预处理框架以创建两个不同的集合。一个用于CNN模型,另一个用于着色任务。
- Video fps is reduced to 6 fpsSET 1 - for CNN Model- Down sampled to 256 x 256- Normalise to have intensities between [-1, 1]SET 2 - for Colourization- Convert to LAB colour space- Downsample to 32 x 32- Quantize in 16 clusters using k-means- Create one-hot vector corresponding to the nearest cluster centroid
所用的主干是ResNet-18,因此其结果与其他方法相当。ResNet-18的最后一层被更新为32 x 32 x 256的尺寸输出。ResNet-18的输出随后被传送到3D-Conv网络,最终输出为32 x 32 x 64。(下面的代码块显示了从ResNet-18网络获取输入的3D网络)
训练可分为以下3个步骤:
1. 网络传递
我们将使用SET 1的预处理帧,即通过网络传递大小为(256 x 256)的4个灰度帧,以获得具有64个通道的(32 x 32)空间图。对于(32 x 32)图像的每个像素,这可以解释为64维嵌入。因此,我们有四个这样的像素级嵌入,三个用于参考图像,一个用于目标图像 。
2. 相似度矩阵
利用这五个嵌入,我们找到了参考帧和目标帧之间的相似矩阵。对于目标帧中的像素我们将获得一个相似度值,其中所有三个参考帧中的所有像素均通过softmax归一化为1。
3. Colourization着色处理
我们将使用SET 2的预处理帧,即将四个降采样为(32 x 32)并量化的帧用于着色。将三个参考帧与相似度矩阵相结合,得到预测的量化帧。我们发现了具有预测颜色的交叉熵损失,(记住,我们量化帧到16个聚类,现在我们有16个类别。我们发现在这些颜色上有多类交叉熵损失。
跟踪预测的例子[来源:https://ai.googleblog.com/2018/06/self-supervised-tracking-via-video.html]
在学习了着色的任务后,我们有了一个模型,可以计算一对目标框架和参考框架的相似矩阵aᵢⱼ。对于跟踪的实际任务,我们利用了标签空间中模型是非参数的这一特性。我们简单地重复使用等式1来传播,但不是传播颜色,而是传播类别的分布。对于第一帧,我们有真实框掩码,我们将所有实例掩码布置为一独热矢量cᵢ(这类似于训练期间使用的量化颜色的一独热矢量)。将cᵢ与我们的相似性矩阵A相结合,以找到掩码的新位置,但请记住,随后几帧中的cⱼ预测将变得很柔和,表明模型的置信度。为了做出艰难的决定,我们可以简单地选择最自信的那一类。推理算法为:
失效模式
让我们来讨论一下,当模型在某些场景中趋于失败时,这主要是着色失败的情况,这意味着着色与跟踪有很高的相关性。
在以下情况下会发现一些故障:
*请认真填写需求信息,我们会在24小时内与您取得联系。