广告行业中那些趣事系列42:基于最近邻算法的广告素材图片聚类实践

2022-05-05 13:49:46 浏览数 (1)

导读:本文是“数据拾光者”专栏的第四十二篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要介绍基于最近邻算法的广告素材图片聚类实践,对于希望将广告素材图片进行聚类操作的小伙伴可能有帮助。

摘要:本篇主要介绍基于最近邻算法的广告素材图片聚类实践。首先介绍了项目背景,为了提升品控需要对广告素材图片进行聚类操作;然后重点介绍了我们线上广告素材聚类方案实践,基于基于ResNet-18获取图片特征向量表示,然后基于最小距离阈值对图片进行聚类,使用的是基于scikit-learn最近邻算法计算图片相似距离,最后介绍了详细流程。对于希望将广告素材图片进行聚类操作的小伙伴可能有帮助。

下面主要按照如下思维导图进行学习分享:

01

背景介绍

上一篇《广告行业中那些趣事系列39:实战广告场景中的图片相似度识别任务》中讲到过,因为可能会存在连续曝光的两个广告图片素材是一样或者是非常相似的,这样会影响用户的体验。针对这种情况,需要识别广告素材图片的相似度,从而给用户曝光的广告素材图片有一定的多样性,提升品控。为了识别出相似的广告素材图片,我们会通过md5和phash算法等获取图片的素材指纹,通过素材指纹来初步识别相似图片。Md5可以识别完全一样的图片素材,而phash算法的优点在于简单容易实现,计算速度也比较快,可以识别出广告素材图片添加文案语料以及缩放的情况,可以作为一个很好的baseline使用。但是phash算法也存在一个问题,对于部分裁剪的图片得到的相似度得分非常低。为了对广告素材图片进行聚类需要解决两个问题,第一个问题是获取广告素材图片更好的特征向量表示,第二个问题则是如何进行聚类。

02

线上广告素材聚类方案实践

2.1 基于ResNet-18获取图片特征向量表示

调研了很多图片识别任务,感觉比较靠谱的是微软开源的computervision-recipes项目。项目中也有图片相似度识别模块,整体架构就是对图片使用ResNet-18模型提取特征得到512维embedding向量,进行L2归一化后计算相似度距离作为图片的相似度得分。下面是模型结构图:

图1 cv-recipes的图片相似度模型结构图

值得注意的是这里可以用下游业务相关的图片数据对ResNet-18模型进行微调,然后再用于提取图片特征效果会更好。这里我们主要是利用ResNet-18来提取图片的特征用于后续的聚类操作。

2.2 广告素材图片聚类

2.2.1 基于最小距离阈值图片聚类方案

拿到广告素材图片特征向量表示之后需要进行聚类操作,最开始的想法是直接使用k-means进行聚类。但是这里有一个问题,需要设置聚类的数目k。对于实际的业务场景来说,我们的目标是把相似的图片聚类到一起,需要聚类的app和中小smb广告素材图片非常多,虽然很难确定聚类的数目,但是我们可以根据特征向量的距离来确定是否应该聚在一类,相当于向量的距离会作为一个先验知识来辅导我们进行聚类。至于具体怎么选择最近距离的阈值,则可以先设定一个比较大的阈值,比如先将距离小于0.3的聚为一类,然后将聚类的结果按照0.05作为一个分段,那可以得到(0.25,0.3)、(0.2,0.25)、(0.15,0.2)、(0.1,0.15)、(0.05,0.1)、(0,0.05)六个分段,然后从每个分段中随机挑选一批相似图片对交给人工审核,根据正确的比例来确定最终的阈值。如果最小距离阈值设定为0.25的时候聚类的准确率为92%,可以满足线上的要求,则将阈值设置为0.25。通过这种方式可以确定相似图片距离阈值。下面是基于最小距离阈值对图片进行聚类实例图

图2 基于最小距离阈值对图片进行聚类实例图

上图中以A为质心将阈值距离内的点都聚为一类,否则放在其他的类中。

2.2.2 基于scikit-learn最近邻算法计算图片相似距离

上面已经确定了基于最小阈值距离进行图片聚类,最简单的方法其实是通过暴力检索的方式计算每张图片和其他图片的相似度距离,这里计算距离可以使用欧式距离。具体的方法是基于最近邻NN(Nearest Neighbors) 算法。scikit-learn中最近邻相关代码在sklearn.neighbors中,提供了无监督和有监督学习方法。在机器学习中无监督最近邻思想是很多算法的重要基础,包括流行学习(manifold learning)和谱聚类(Spectral Clustering)。而有监督最近邻算法则主要用于对离散标签的归类和对具有连续标签的回归。

对于我们广告素材图片聚类任务来说使用的是无监督最近邻算法,scikit-learn无监督最近邻算法提供了三种不同的学习算法,分别是基于sklearn.metrics.pairwise规则的brute-force、Ball-Tree和KD-Tree,具体使用哪一种算法只需要通过参数‘algorithm’来设置,可选的参数有 [‘auto’, ‘ball_tree’,‘kd_tree’, ‘brute’],默认是auto。当设置为auto时将自动选择性能最好的算法。下面是使用scikit-learn无监督最近邻算法实战代码:

图3 scikit-learn无监督最近邻算法实战代码

从上面的实战代码可以看出,需要设置的参数为n_neighbors,这是最近邻KNN算法中的K,可以设定一个大概的值。如果实在不好确定,那么就设置成数据集的长度,相当于每次对所有数据进行检索。

2.3 详细方案流程

整体方案分成以下几个步骤:

  • 将广告素材图片下载到本地用于抽取特征,并划分成不同的粒度。这里需要注意的是我们线上会分成两大类,第一类是app广告素材图片,第二类则是非app的,主要是中小smb广告素材图片。划分为app和非app之后还需要从更小粒度进行聚类操作。比如app是以单个app粒度进行聚类操作,因为不同的app有版权,所以一般不同的app广告素材差别都比较大。而smb则根据代理资质来进行划分。划分成不同更细粒度进行聚类操作一个原因是基于线上业务的需求,不同app一般很少有相似广告素材图片。另外的原因是直接对所有图片进行聚类可能流程上比较简单,但是很容易出现性能问题,因为需要将所有图片素材下载完成之后才能进行聚类操作。而划分成更细的粒度则更便于执行,聚类操作也是在细粒度下执行,比如会对app下某个app中的所有广告素材图片进行聚类,并不会影响其他细粒度聚类流程;
  • 使用ResNe-8对图片进行特征抽取并使用knn进行聚类操作。因为上面流程会以单个appp粒度来进行聚类操作,所以这里相当于有两个循环,第一个大循环是app/unapp,第二个小循环则是单个app。每个小循环中进行特征抽取和聚类操作,这样程序如果因为某些原因中断,只要对那些还没有进行聚类的app或者smb资质进行聚类即可;
  • 将聚类的结果转化成图片相似对的方式,从每个分段中随机抽取一些相似对进行人工评估是否相似从而确定最低阈值距离。根据人工评估的结果结合线上准确率的要求,确定最低阈值距离。这里需要注意的是app和smb可能最低阈值距离是不同的,因为两者的广告素材图片还是差距蛮大的;
  • 确定最低距离阈值之后则将步骤2中满足最低距离阈值的图片聚为一类,输出聚类结果。

03

总结及反思

本篇主要介绍基于最近邻算法的广告素材图片聚类实践。首先介绍了项目背景,为了提升品控需要对广告素材图片进行聚类操作;然后重点介绍了我们线上广告素材聚类方案实践,基于基于ResNet-18获取图片特征向量表示,然后基于最小距离阈值对图片进行聚类,使用的是基于scikit-learn最近邻算法计算图片相似距离,最后介绍了详细流程。对于希望将广告素材图片进行聚类操作的小伙伴可能有帮助。

0 人点赞