如何用Python和深度神经网络寻找相似图像
代码首先,读入TuriCreate软件包import turicreate as tc我们指定图像所在的文件夹image,让TuriCreate读取所有的图像文件,并且存储到data数据框data = tc.image_analysis.load_images('./image/')我们来看看,data数据框的内容:data data包含两列信息,第一列是图片的地址,第二列是图片的长宽描述。
下面我们要求TuriCreate给数据框中每一行添加一个行号。这将作为图片的标记,方便后面查找图片时使用,并输出查看data。
data = data.add_row_number()data下面,是重头戏。我们让TuriCreate根据输入的图片集合,建立图像相似度判别模型。
model = tc.image_similarity.create(data)这个语句执行起来,可能需要一些时间。如果你是第一次使用TuriCreate,它可能还需要从网上下载一些数据。请耐心等待。
经过或长或短的等待,模型已经成功建立。下面,我们来尝试给模型一张图片,让TuriCreate帮我们从目前的图片集合里,挑出最为相似的10张来。为了方便,我们就选择第一张图片作为查询输入。
我们利用show()函数展示一下这张图片。tc.Image(data[0]['path']).show()下面我们来查询,我们让模型寻找出与这张图片最相似的10张。
similar_images = model.query(data[0:1], k=10)我们把结果存储在了similar_images变量里面,下面我们来看看其中都有哪些图片。
similar_images返回的结果一共有10行。跟我们的要求一致。每一行数据,包含4列。
分别是:查询图片的标记获得结果的标记结果图片与查询图片的距离结果图片与查询图片近似程度排序值有了这些信息,我们就可以查看到底哪些图片与输入查询图片最为相似了。
注意其中的第一张结果图片,其实就是我们的输入图片本身。考虑它没有意义。我们提取全部结果图片的标记(索引)值,忽略掉第一张(自身)。
similar_image_index = similar_images['reference_label'][1:]把上面9张图片的标记在所有图片的索引列表中过滤出来:filtered_index = data['id'].apply(lambda x : x in similar_image_index)filtered_index验证完毕以后,请执行以下语句。
我们再次调用TuriCreate的explore()函数,展现相似度查询结果图片。data[filtered_index].explore()。
谷歌人工智能写作项目:神经网络伪原创
相似图片搜索的原理是怎样的?
2011年,Google把“相似图片搜索”正式放上了首页写作猫。你可以用一张图片,搜索互联网上所有与它相似的图片。点击搜索框中照相机的图标。一个对话框会出现。
你输入网片的网址,或者直接上传图片,Google就会找出与其相似的图片。下面这张图片是美国女演员Alyson Hannigan。
上传后,Google返回如下结果类似的”相似图片搜索引擎”还有不少,TinEye甚至可以找出照片的拍摄背景。这种技术的原理是什么?计算机怎么知道两张图片相似呢?
根据Neal Krawetz博士的解释,原理非常简单易懂。我们可以用一个快速算法,就达到基本的效果。
这里的关键技术叫做”感知哈希算法”(Perceptual hash algorithm),它的作用是对每张图片生成一个”指纹”(fingerprint)字符串,然后比较不同图片的指纹。
结果越接近,就说明图片越相似。下面是一个最简单的实现:第一步,缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。
这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。第二步,简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
第三步,计算平均值。计算所有64个像素的灰度平均值。第四步,比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。第五步,计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
得到指纹以后