我建立了反向图像搜索像素艺术

2021-04-08 18:28:50

Permalink我想建立一个反向图像搜索OpenGameart作为Google图像搜索和Tineye Don' T给它提供了良好的结果。我先前已经生成了一个巨大的瓷砖地图,以概述OpenGameart上的类似图像,但它是&# 39; t非常友好的网络或图像浏览器,并且必须分成较小的文件,加上它,而不是以任何方式搜索,只是可滚动。所以我想要一种方法来探索什么样的艺术可在OpenGameart上使用,并使用相似性搜索降落以浏览图像空间。

我必须做的第一件事是检索查询的搜索结果我对OpenGameart感兴趣的,大多是2D Art.然后我不得不检索在搜索结果索引中的每个HTML页面并解析为文件链接的HTML .opengameart包含大量的归档文件,如zip和rar文件,所以我不得不解开它们以进入图像。

例如,这是一个代码段,显示如何解析内容页面并获取文件链接:

响应人员=等待常见。 ReadUriorcache(blob,common。BaseUri +页面,客户); var htmldoc = new htmldocument(); htmldoc。 loadhtml(响应); var htmlbody = htmldoc。文档编码。 SelectSinglenode(" // body"); foreach(var在htmlbody中的nnode。后代(" a")){if(nnode。nodeType == htmlnodetype。元素& nnode。属性[" href"]! = null& nnode; nnode。属性[" href"]。值。包含(" /默认/文件/")){msg。添加(htmltility。htmldecode(nnode。属性[" href"]。值。替换(常见的。filemi,""))); }}

我使用了Azure函数来做爬网的步骤,通过一些来回手动干预来根据需要纠正事物。移居有自己的队列,然后将作业放在下一个队列上的下一步。在结束时,调用的结束Azure 50美元,如果我记得是正确的,那么让Let' S说出10-20百万函数调用。

我试图使用开源MILVUS数据库,但它在我的数字电信服务器上崩溃,因为我没有足够的记忆。然后,我不小心,幸运的是在黑客新闻评论部分中发现了Pinecone的链接并决定使用相反,随着试验是免费的,我不必扩展我的服务器内存来使用微米兽。在最后我扩展了我的服务器,但我没有尝试米尔维斯(至少还没有) 。

我在我的脚本中使用了VGG16功能提取。请凭借更多信息,但实质上是' s 4096 32位浮点数,每个图像都描述了图像的各种特征,例如非常简化的方式,它具有多少条纹或平方点或者是多么绿。但这些特征基于神经网络中的神经元,用于VGG16(通常用于图像分类),因此特征可能比所述的描述更复杂通过简单的功能标签。我们需要这些向量的原因是它' s易于使用的欧几里德距离或余弦相似或两种向量上的另一个措施,看看它们是否相似,因此图像类似。那里有类似的。在这些向量上是搜索技术,可以快速搜索大量的搜索。

Warning: Can only detect less than 5000 characters

我也维持A"反向数据库"文本文件才能链接回OpenGameart站点的图像查找(具有此问题的错误,我还有一些错误,在这种情况下,它只是与OpenGameart主页的链接。此文件也加载到查询服务器上启动。最后还有一个链接,用于搜索类似的图像,其隐式使用第二种查询逐图像。

最后,我还添加了一个快速修复,以删除具有相同分数的近重叠图像结果.II遇到与&#34的搜索页面上的一些麻烦;双倍" URL编码,因为我使用文件系统中的URL编码存储了文件,但是我在前端的某些检测代码处理了浏览器双重编码URL编码的文件名.I建议不要在没有的情况下存储爬网文件URL encoding.i遗憾的是,我的脚本不是那么高的质量或抛光,例如脚本中有多个步骤,我通过编辑脚本来改变事物而不是拍摄命令行arguments.i don' t'感觉像发布播放片段脚本和解释它们有点杂乱。在处理特征提取之前,我将来自Azure存储的文件从Azure存储移动到My DigitaloCean服务器中,所以有一些不一致的数据位置处理'

我建议在比天蓝色的函数和天蓝色的存储器上进行爬行,以节省一些钱,例如您自己的服务器或固定的价格云服务器。它只需50美元,但我本可以在我的数字沉积上免费完成它服务器,这样'为什么。

我建议在可以在它可能终止或需要一些手动干预的任何点构建一个更强大的爬虫,idempotent和重启(例如,我超过了Azure函数最大运行时间为5分钟提取一些大型邮政编码,所以我提取了它们在VS代码中本地运行函数)。

有一件事我遗憾的是,这次做完了,这次是为了将瓷砖纸张从瓷砖纸张中提取到单个图像以进行搜索。这将使搜索更有用。另一方面,它可能会用太多几乎相同的图像混淆相似性搜索。

使用一点内容原型对系统进行原型可能是有用的,然后在完成工作后,运行整个流水线端到结束所有内容,而不是完成爬网中的第一步,然后执行所有功能提取,然后执行所有数据库插入就像我一样。

总之,我制作的是一个黑客,而不是那么强大的脚本,用于更新新内容,但它作为原型工作并给出了体面的图像搜索结果(并不总是如此,但我责备它的特征提取不是在微小的像素领域(尽管在特征提取之前调整大小/上部))。

看来Milvus还可以提供类似的结果,一并侧面比较某种类型,速度和质量,但我发现从它已经启动并运行并运行以来,我发现使用Pinecone更容易使用 所以我不必运行自己的矢量数据库。 Azure函数OpenGameArt爬虫在* .cs文件中。 由于定价,我以逐渐转移到DigitaloCean。