导读:本文是“数据拾光者”专栏的第四十二篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要介绍基于最近邻算法的广告素材图片聚类实践,对于希望将广告素材图片进行聚类操作的小伙伴可能有帮助。
摘要:本篇主要介绍基于最近邻算法的广告素材图片聚类实践。首先介绍了项目背景,为了提升品控需要对广告素材图片进行聚类操作;然后重点介绍了我们线上广告素材聚类方案实践,基于基于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 详细方案流程
整体方案分成以下几个步骤:
03
总结及反思
本篇主要介绍基于最近邻算法的广告素材图片聚类实践。首先介绍了项目背景,为了提升品控需要对广告素材图片进行聚类操作;然后重点介绍了我们线上广告素材聚类方案实践,基于基于ResNet-18获取图片特征向量表示,然后基于最小距离阈值对图片进行聚类,使用的是基于scikit-learn最近邻算法计算图片相似距离,最后介绍了详细流程。对于希望将广告素材图片进行聚类操作的小伙伴可能有帮助。