广告图片过滤

为一个信息流产品作数据抓取,其中数据清洗时必不可少的。其中有一个步骤就是清洗掉其中与内容无关的广告。文本通过语料库积累和NLP相关技术进行过滤,有些文字广告不过滤对产品影响也不大。有点儿麻烦的是其中的有些图片广告如果不过滤掉,在感官上会对产品造成很大的印象,为了解决这个问题,用了一些杂七杂八的方法,始终没有一个唯一的解决方案。最终采用多级判断进行组合check(漏斗式缩小范围),在这里简单记录一下。

主要处理步骤如下图:

第一步:检查是否为二维码

文章开始和末尾的二维码一般都是广告(可以说至今没有发现不是的),由于二维码是编码良好的图片,可以不依赖材料库就可以判断,所以第一步先判断图片是否为二维码。

二维码判断Demo代码如下:

# coding:utf-8

import sys
from PIL import Image
import zbarlight

def is_qr_code(img):
    try:
        scan_result = zbarlight.scan_codes("qrcode", img)
    except Exception:
        return False
    else:
        #  打印QRCODE信息
        return True if scan_result else False

if __name__ == "__main__":
    img_name = sys.argv[1]
    ig = Image.open(img_name)
    print is_qr_code(ig)

若怕二维码中有重要信息,可以将从二维码图片中识别的文本信息做进一步的NLP处理,从而决定是否判定为广告

第二步:检查来源URL

有些广告图片都来同一个URL,比如某些自媒体/资讯平台会在每篇文章下面带有相同的广告图片,有的不是同一家产品的,但是采用了同一个广告平台都会出现这种情况。具体实现就是文本比对,代码就不用说了。

第三步:检查图片Hash-MD5(绝对指纹)

某些广告图片完全相同,但却来自不同的URL(比如,某些网站静态资源URI变更),用第二步的URL比对就不行了。在本步骤中采用图片内容的完全比对进行广告图片识别。若采用像素点比对那效率就太低了,所以采用MD5哈希值比对。MD5一般用于校验文件是否损坏、被修改,在这一步正好合适。

获取图片MD5哈希值的简单Demo代码:
Demo代码:

# coding:utf-8

import sys
from hashlib import md5

if __name__ == "__main__":
    img_name = sys.argv[1]
    img_body = open(img_name).read()
    fingerprint = md5(img_body).hexdigest()
    print fingerprint

第四步:检测图片感知哈希

参考:https://realpython.com/blog/python/fingerprinting-images-for-near-duplicate-detection/

在第三步中采用的MD5哈希比对对于内容完全相同的广告图片是适用的,但是一旦两张图片稍有差异,MD5就完全不同了,也就造成第三步的检测失效。所以在这里采用感知哈希进行相似图片的匹配(和广告图片相似的也是广告图片)。感知哈希是一类哈希算法。这里实验两种
DHash——均值感知哈希,
pHash——余弦变换感知哈希
均值哈希Demo代码:

# coding:utf-8

import sys
from PIL import Image

def dhash(image, hash_size=8):
    image = image.convert('L').resize(
        (hash_size + 1, hash_size),
        Image.ANTIALIAS,
    )

    difference = []
    for row in xrange(hash_size):
        for col in xrange(hash_size):
            pixel_left = image.getpixel((col, row))
            pixel_right = image.getpixel((col + 1, row))
            difference.append(pixel_left > pixel_right)

    decimal_value = 0
    hex_string = []
    for index, value in enumerate(difference):
        if value:
            decimal_value += 2 ** (index % 8)
        if (index % 8) == 7:
            hex_string.append(hex(decimal_value)[2:].rjust(2, '0'))
            decimal_value = 0

    return ''.join(hex_string)

if __name__ == "__main__":
    img_name = sys.argv[1]
    img = Image.open(img_name)
    print dhash(img)

第五步:人为定义特征

还可以通过其他人为定义特征进行过滤,以下特征可以考虑:

  • 色彩分布
  • 整体轮廓
  • ......

结束

本文只介绍了整个流程的实现demo。当然,在真正的业务项目中还牵涉到其他的组件。其中主要的时广告图片url、md5、指纹的存储和比对,就不介绍了,这和其他服务中的数据库的检索没什么区别,就是根据实际数据量进行设计&调整持久化、索引、缓存、备份、排序等相关策略。



后记:很早之前写的,写的不好,一直躺在草稿箱。现在发布出来,虽然已经不在进行这项工作了,还是希望有朋友提出改进的建议,谢谢!

原文地址:https://www.cnblogs.com/taceywong/p/7650536.html

时间: 2024-11-09 06:05:56

广告图片过滤的相关文章

左边logo 右边广告图片布局 div css左右浮动布局实例

左边logo 右边广告图片布局(div css左右浮动布局实例) 一般网页头部是左边网站标志logo,右边为广告图片或电话号码图片,这里DIVCSS5为大家介绍对float浮动使用实例布局介绍. 需要div+css布局案例效果图需要div+css布局案例效果图(缩小)一.DIVCSS5实例布局技术点说明 - TOP 1.图片切出说明:首先切好左边logo图片,右边广告图片(切图注意不影响图片质量情况尽量宽度高度尺寸切小).2.采用float:left和float:right布局:一般遇到内容靠左

nginx图片过滤处理模块http_image_filter_module安装配置笔记

nginx图片过滤处理模块http_image_filter_module安装配置笔记 http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是即时计算的结果,所以网站访问量大的话,不建议使用. 安装还是很简单的,默认HttpImageFilterModule模块是不会编译进ngi

CSS3实战开发: 纯CSS实现图片过滤分类显示特效

各位网友大家好,今天我要带领大家开发一个纯CSS的图片分类显示的网址导航,单纯看标题大家可能有些困惑,依照以往惯例,我先给大家演示一下实际运行效果: 从上面的运行效果,大家不难发现,当我点击某一菜单时,导航区域会相应高亮显示此分类的图标,而其他图标则会变暗. 很多人可能会说,这个这么简单,直接使用javascript或jQuery等前端框架,再配合一些CSS,就可以很快实现同样的效果了.如果你是这一部分人,我也希望你停下脚步,看看这篇教程.因为在今天这篇教程中,我会用另一个思维方式来思考问题,我

nginx图片过滤处理模块http_image_filter_module

nginx图片过滤处理模块http_image_filter_module安装配置笔记 http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是即时计算的结果,所以网站访问量大的话,不建议使用. 安装还是很简单的,默认HttpImageFilterModule模块是不会编译进ngi

随机显示广告图片

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>随机显示广告图片</title> </head> <body> <script> advertisement = new Array(4); advertisement[0] = '<img src="

Keymob为加速广告转化 推广告误点过滤功能

Keymob作为一个专业的移动广告平台,为加速广告转化,推出新的功能:广告误点过滤功能. 随着移动互联网时代的到来,人们在手机上网中,受限于屏幕和键盘的大小,进行手指按下和滑动操作的时候,很容易出现按错键或按错按钮的现象.业内把这种现象称之为 “胖手指”(fat finger)效应,且多以“胖手指综合征”(fat-finger syndrome)的词组形式出现. 胖手指现象同样存在于的商业广告中,由于用户并不是主动意愿去点击广告,这些误点对应转化效率非常低,严重伤害到广告主ROI,因此需要将这部

转载ECTouch1.0 修改后台广告管理中广告列表显示广告图片

http://www.ectouch.cn/topics/94.html 效果 操作: 1. 修改后台控制器文件 调用出相关字段信息. mobile\include\apps\admin\controller\AdvertController.class.php  函数function ad_list 位置: $ad_list[$key]['orders'] = $this->get_orders($value['ad_id']); 后面一行 添加代码           if($value['

Android实现Banner界面广告图片循环轮播(包括实现手动滑动循环)

前言:经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环.本以为单纯的ViewPager就可以实现这些功能.但是蛋疼的事情来了,ViewPager并不支持循环翻页.所以要实现循环还得需要自己去动手.自己在网上也找了些例子,本博文的Demo是结合自己找到的一些相关例子的基础上去改造,也希望对读者有用. Demo实现的效果图如下: Demo代码: 工程目录如下图: 废话不多说,上代码. 1.主Activity代码如下: [java] view plaincopy pa

如何更改/删除magento首页产品/广告图片等模块信息

如何更改/删除magento首页产品/广告图片等模块信息,如果只是修改一些简单的地方,例如已经存在 的左右栏目里面的图片内容等,是很简单的,直接在后台就可以修改的,具体如下: 如何删除magento首页不需要的信息. 首先登陆后台.CMS=>Manage Pages=>选择edite page=>Home page=>选择custom design. 然后选择相应的模板,选择相应的列数, 编辑里面的内容. <reference name=”content”> <b