Angel Eyes基于SIFT特征点的图像搜索系统的开发

计算机视觉公司列表 Angel Eyes在开发的过程中,阅读并收集了不少的有关CV方面的资料,作了一个列表,以下列出的是研发计算机视觉技术的公司(团队)和个人,有些来自自己的收集,有些是翻译别人的成果。总之拿出来,晒一晒,与大家一起分享,如有其它亲们知道的,可告知我们,我们不断更新,补充。 汽车助理类 Iteris (美国) http://www.iteris.com/ 卡车和小汽车的车道偏离和碰 阅读详情

过年回来以后,Angel Eyes的团队成员又开始了紧张忙碌的工作。为了争取在这个月向外界开放API和SDK,我们又对图像特征点搜索系统开发做了进一步的研究和实验,以力求搜索,匹配的精准。以下是我们基于SIFT特征点的图像搜索系统开发日志,也算是一些心得,与各位CV的同行们分享。


一、C#验证实验阶段

1、实验框架搭建工作:配置EmguCV、编写界面。

写界面是C#的长项,不过需要怎样一个界面来做实验,倒是一开始没想清楚,折腾了几下,要是用MFC来写,就伤不起了。


2、特征点提取与XML存储

以前学习的C#的XML序列化派上用场了,几行代码轻松解决图像库的特征点存储问题,存储的XML格式片段如下:

<Objects>

<StandardObject>

<Name>U盾</Name>

<Images>

<FeaturableImage>

<Name>IMG_0819.jpg</Name>

<Featrues>

<ImageFeature>

<Descriptor>

<float>0.000823393755</float>

<float>0.0008284497</float>

…………………………………………………….

</StandardObject>

</Objects>

 

3、简单图像搜索,两幅图像对比时,仅考虑两幅图像中有多少比例的特征点配对


4、高级筛选:随机样本一致算法

4.1 仿射变换模型封装(6参数线性变换模型,支持旋转、平移、缩放、错切等变换的组合,不含尺度空间的尺度参数)

4.2仿射变换模型的最小二乘拟合

4.2.1 公式推导:相当于多元线性回归的最小二乘拟合

4.2.2 求解3元一次方程组,我们用的最基本的行列式和代数余子式的求法,看了一下网上的,其他人是用了列主元素消元法,没有Angel Eyes的方法精度高,最终筛选效果不行,到底是他们实现的列主元素消元法不太正确,还是方法本身的差异,Angel Eyes也没深究,因为3元一次的方程组用什么方法速度都差不多,精度够就行。

怕求余子式展开时不小心写错,试用MatLab的符号计算功能,还不错

syms a11 a12 a13

syms a21 a22 a23

syms a31 a32 a33

A=[a11,a12,a13;a21,a22,a23;a31,a32,a33];

syms y1 y2 y3;

Y=[y1;y2;y3];

linsolve(A,Y)

4.3 实现随机样本一致

按照维基百科关于随机抽样的共识(RANdom SAmple Consensus,RANSAC)的词条介绍的框架,带入仿射变换模型来实现的。

其中有一点想法,就是RANSAC每次随机选三点建立仿射变换模型,有可能重复,导致要做随机选择的次数比较多,才有充分的代表性,倒是可以设计一个每次选三点绝不重复的伪随机函数,不知道性能能否提升一丁点,不过这块不是算法的性能瓶颈,可以控制在1ms以内筛选好两幅有较多相似特征点的匹配,没功夫纠缠了。

维基百科英文RANSAC:http://en.wikipedia.org/wiki/Ransac 信息更全面

筛选后的结果如下,比没筛选的效果好太多。


5 如何利用筛选后的结果

在筛选之前,我们只考虑匹配上了多少对点,筛选之后,我们还可以利用这些点的一致性(回归的残差越小,说明拟合得越好,一致性越好),这里我们粗略建了一个评价函数,还需进一步查资料了解经典的做法是怎样。

6 特征点的搜索

如果用C#组个对比特征点(128位向量),整个搜索匹配过程会非常慢,如下图所示,差不多一幅图要耗1秒钟。


二、C++移植阶段

做C++移植主要是两个目的:一个是在算法复杂度一样的情况下,利用C的高效,尽量提高搜索效率,通过特征点的全遍历搜索来看,做这种纯数值计算,C++还是可以比C#快2-3倍;第二个目的是C++的兼容性好,可以把服务器架架设在Linux、Windows,也可以把搜索匹配做在iOS、安卓上。

1.用KDTREE实现特征点的高效搜索

提到高效检索,我们应该想到的就是HASH表和二叉平衡树了, KD树就是多关键字的二叉树,如果不考虑对结点的增删改,我们可以把这颗二叉树建得非常平衡,这样相对于顺序查找,查找效率是非常高的。

1.1 调用or自己写?

KDTree的基本原理和实验数据仍然是从博客园的博文http://archive.cnblogs.com/a/2241247/参考的。在网上找了几个KdTree的实现代码,感觉实现得比较好的是OpenCV的_kdtree.hpp,不过OpenCV的那段代码太多C的技巧和特殊优化的处理,没看太懂怎么用起来就放弃了,我们自己实现一遍吧,有什么特殊需求也好修改。从OpenCV哪里倒是借鉴了一次性全部申请树的所有结点的方法,不然按数据结构教科书的套路,差点弄成每个结点单独动态申请了,效率降很多还不好存储到磁盘文件。另外可能有一小点创新的是,在生成KDTree做排序划分的时候,没有去移动特征向量,而是做了一个小标集map,排序的是map中的下标,这样排序的移动代价小了128倍,最后查找使用时,也没增加复杂度,唯一的坏处是得自己写排序算法,c语言标准的qsort不好支持这样的排序需求。

1.2 几个经典的bug(缺陷)调试

第一个缺陷是:建立的KDTree数据量小的时候没问题,数据量大就报告栈溢出,一查看原来是qsort递归次数太多,再一看怎么会这么递归多呢?原来是qsort遇到了最坏情况,数据是有序的,每次只能把数据分成1和n-1个,这个n很大时,递归次数当然很多。为什么运气会这么差呢?再以分析,应该在建立KDTree时,有些作过划分维的维度,已经有序了。我们自己心里当然明白,按说有三个方法解决,一个是舍伍德算法也就是乱序再来,感觉费劲还效果不一定好,一个是每次取中位数做划分依据,实现太麻烦,最后选择实现了一个非递归的MergeSort,轻松实现又不依赖于人品,什么样顺序的数据都可以稳定的表现。

第二个缺陷是:用C#做顺序搜索,然后筛选,查找,结果很好。同样搜索参数,用KDTree做下来很差,反复分析分析分析之后,发现我们在C#中用标准图中的每个点在未知图中找最相似的匹配点,因为标准图没有多余的特征点,这样匹配下来的有效率很高。而对于KDTree,我们只能用未知图的特征点在KDTree中搜索在每幅标准图中的最相似点,而未知图的背景比较复杂,对于最终正确的匹配,无效特征点很多,这样做就会出很多无效匹配点,挤占了有效匹配点的比例,导致RANSAC算法的一个前提条件不成立:就是内点要达到一定比例才能用RANSAC。发现了就有办法解决,具体不说了。

第三个缺陷是:居然KDTree没有顺序搜索速度快,不管是5000个特征点的标准库(都是5秒),还是22000个特征点的标准库(都是18秒),居然和顺序搜索一样,毫无点,严重的打击了我们团队的斗志,岂不是白忙活一阵子,完全不能用?然后深入调节参数,在保证搜索准确率不降低的情况下,把KDTree的搜索效率大幅度提高。同时

在5017个特征点中搜索火机图,需要171ms,29.3个特征点/ms

在22228个特征点中搜索火机图,需要578ms,38.5个特征点/ms

在32643个特征点中搜索火机图,需要812ms,40.2个特征点/ms

以上数据初步说明当特征点越多的时候,检索效率越高,KDTree有一定效果,按这个升高趋势,在10幅图中检索要超过100ms,在100幅图中检索在1000ms以内,在1000幅图钟检索应该在6000ms左右。

 

三、性能深度优化阶段

1、考虑多线程,预计8核提高5倍

2、考虑分布式计算,预计提高10-100倍,视资源多少而定

3、考虑SSE等CPU多媒体指令级别的优化,预计提高10-50倍

4、考虑设计KDTree以外的更高效的多关键字检索算法,有一定想法,希望提高10-200倍

5、显卡计算,CUDA不是很通用,暂时不考虑

6、考虑服务端被大量用户并发访问,性能降低1000倍。

我们的产品Angel Eyes预计将会在这个月向开发者开放API和SDK,希望对计算机视觉(CV)和Angel Eyes感兴趣的朋友能够时刻关注我们的信息,并申请内测。


我们的网址:www.angeleyes.it

我们的微博:http://weibo.com/u/2597388234

我们的电邮:angeleyes.tech@gmail.com

 

 

 

 

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

相关推荐

C#提取特征点并进行图像匹配

建立在Moravec算子基础上提取特征点后与另外一幅图像进行匹配计算,并输出特征点对应的匹配点像素坐标

Dlib人脸特征点检测性能测试(光照+各部分功能模块运行时间)

Dlib人脸特征点识别各模块性能的测试以及构想。

朱铭德的博客 1万+

图像特征点的提取以及同名像点匹配程序C#

利用C#编写的图像特征点的提取以及同名像点匹配程序

Fast特征点的寻找和提取

一、基础最初由Rosten和Drummond [Rosten06]提出的FAST(加速段测试的特征)特征检测算法是基于将点P与其包围圆内的点集的直接比较的思想。基本思想是,如果附近的几个点与P类似,那么P将成为一个很好的关键点。点P是FAST算法的关键点候选者。 影响P分类的点的圈由p周围的圆确定。 在这种情况下,该圆上有16个像素,这里编号为0-15。具体的算法在这里并没有说明。二、函数clas...

weixin_33971977的博客 645

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

DataEaseV2.9 本地开发环境搭建与调试指南

本文详细指导如何搭建DataEase V2.9的本地开发环境,涵盖从软件准备、源码获取、数据库初始化到在IDEA中配置、编译和调试的全过程。重点解决了本地运行环境的关键配置与常见问题,帮助开发者高效开启DataEase的定制化开发与二次开发。

weixin_29290863的博客 141

cuda编程---第一个cuda程序

前言:1、参考: nvidia offical tutorial 2、使用 nvcc 编译程序,并且加-g -G 参数进行编译,以保存调试信息,之后可以用cuda-gdb 进行单步调试。 程序#include <iostream> #include <math.h>//CUDA Kernel function to add the elements of two arrays on the GPU.

风哥有点田 702

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1350

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 167

SwarmClaw:自托管多智能体AI运行时部署与实战指南

多智能体系统是人工智能领域的重要发展方向,它通过多个具备自主决策和协作能力的智能体共同完成任务,其核心原理在于分布式问题求解与协同规划。这种架构在提升任务处理效率、复杂问题分解和鲁棒性方面具有显著技术价值,广泛应用于自动化工作流、虚拟团队协作、智能客服和个性化助手等场景。本文聚焦于SwarmClaw这一自托管的多智能体AI运行时,它原生支持Model Context Protocol,并内置了超过23种AI提供商,为开发者提供了一个开箱即用且高度可定制的控制平面,便于构建和管理复杂的多智能体协作网络。

weixin_27207591的博客 401

【物理模拟】PBD算法详解

参考MatthiaMuller的十分钟物理(他就是PBD算法的发明者)

beidou111的博客 9499

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 229

【教程4>第6章>第26节】基于FPGA的MMSE信道估计与均衡系统实现与整体测试,并对比LS信道估计

通过前面几个章节的学习,我们完成了MMSE信道估计和均衡系统。为了进一步验证MMSE信道估计的性能,我们在系统的最后,增加一个信道估计误差计算程序。由于MMSE信道估计,其主要优势在SNR较小时提现,因此测试对比时,我们在testbench中,将SNR设置为2db。然后m值,我们不考虑一个固定值,而是一直累加,直到所设置的仿真时间结束。通过对比可以看到,MMSE信道估计性能优于LS信道估计。这样方便FPGA中的误差计算。

FPGA/MATLAB学习教程/源码/项目合作开发 1596

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 552

SAP Gateway 中事务码 /IWFND/MAINT_SERVICE 的用法介绍

本文系统梳理了SAP Gateway中/IWFND/MAINT_SERVICE事务码的核心功能与运维实践。作为OData服务管理中樞,它支持服务注册激活、ICF节点配置、系统别名绑定、批量处理等关键操作。文章详解了服务目录、ICF节点、系统别名的配置要点,提供了批量激活、缓存清理、性能监控等实用技巧,并针对常见陷阱(如传输配置、删除残留)给出解决方案。通过制造业批量激活、零售业OAuth集成等案例,展示了事务码在企业级应用中的实际价值,为SAP Gateway运维提供了一套完整的治理清单。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 302

华为OD机试双机位C卷:补种未成活胡杨 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 补种未成活胡杨,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 补种未成活胡杨。

qq_45776114的博客 4001

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 17

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 642

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 366

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 152

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 80

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 176

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 311
上一篇: 计算机视觉技术为盲人带来福音
下一篇: AR(增强现实)应用 2014年产值将达$7亿1400万
GeekIn
博客等级 码龄15年 9粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值