我正在构建一个应用程序,使用hadoop从用户的输入图像中查找所有相似的图像。
我用两种方式来实现它:
方法1:我收集的图像被转换成sequencefile,作为map函数的输入。然后在map函数中,使用opencv库来比较这些图像与用户输入图像之间的相似度,包括以下步骤:-提取关键点-计算描述符-计算每对图像之间的距离,在reduce函数中找到相似度,我只复制与输出文件夹相似的图像。
方式2:
与方式1相似,除了:
我首先使用hbase存储图像特征(关键点、描述符)。为此,由于opencv不支持将关键点、描述符数据类型直接转换为bytes[]的方法(为了将数据插入hbase,我们必须转换为bytesl[]),因此我必须使用本文中提到的技巧:opencv mat object serialization in java
然后在map函数中,我只从hbase查询图像特征,与用户输入的图像特征进行比较。
在通常的思维中,我们可以看到,将所有的图像特征保存到一个数据库中,然后仅仅查询它们来与用户输入的图像进行比较,会比在每个Map函数中我们必须开始提取这些特征来做比较快。
但事实上,当我在我的虚拟机(独立模式)中执行并测试两种方式时,我发现方式2的运行速度比方式1慢,而且运行时间不可接受。在我看来,我认为方法2运行得很慢,因为在map函数中,从hbase中的bytes[]值转换到opencv中的keypoints、descriptor和datatype要花很多时间来进行比较。这就是为什么它会降低整个map函数的性能。
我收集的图片只包括240张jpg格式的图片。
所以我在这里的问题是,除了上述原因之外,我认为2号公路比1号公路慢。有没有其他原因使路2比路1慢,例如:
不建议使用hbase以独立模式运行?
输入大小不足以使用hbase?
谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!