Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

匹配准确 #19

Closed
lianghaoyue opened this issue Apr 9, 2019 · 22 comments
Closed

匹配准确 #19

lianghaoyue opened this issue Apr 9, 2019 · 22 comments

Comments

@lianghaoyue
Copy link

匹配的时候,匹配结果不对。

问题

左上角的图片是初始模板的特征点的位置;最右边为模板训练,角度从负45°到45°,笔尖的位置用圆画出来了;中间图片为匹配的结果,结果模板为0度的模板,但是整体的特征点左移动了,针尖的位置也相差很大。也尝试移动其他,换成其他角度,匹配的结果更差,不知道什么原因。希望可以指点一下。

@meiqua
Copy link
Owner

meiqua commented Apr 9, 2019

这个形状接近平行线了,右移很正常,光这些特征点确实定不出来笔尖。
也就是说对称轴能识别出来,要定笔尖的位置可以后面加一些处理,比如看对称轴跟笔尖那块边缘的交点,类似画个箭头的感觉。

@oUp2Uo
Copy link

oUp2Uo commented Apr 16, 2019

测试中发现在加了icp之后,在模板训练时对角度没有那么敏感了(最后靠icp能算回去),但是对尺度还是比较敏感。
就是说,scale如果定的步长比较大,那么检测结果的高分项跳动的可能性会比较大,对检测结果的影响比较明显。比如相机与测量物体有距离上的变化时,正好处在两个scale a/b的中间左右的话,那结果就会是a或b跳动比较明显(分都差别不大)。
不知对于scale的这个问题是否有想法?
谢谢

@meiqua
Copy link
Owner

meiqua commented Apr 16, 2019

ICP也能处理,scale加进来就是SIM3群了。
在现在的基础上写不难,要不我先改改等会你帮我测测?

@oUp2Uo
Copy link

oUp2Uo commented Apr 16, 2019

ICP也能处理,scale加进来就是SIM3群了。
在现在的基础上写不难,要不我先改改等会你帮我测测?

ok没问题呀…

有了icp之后,感觉角度训练的步长明显可以放宽了

@meiqua
Copy link
Owner

meiqua commented Apr 16, 2019

OK, sim3 branch

@meiqua
Copy link
Owner

meiqua commented Apr 16, 2019

我这边简单测试了下,允许的scale误差跟训练图像大小有关,太大scale一下绝对误差大,点就配不上了。
目前这个例子里0.97可以恢复过来,0.96就会丢失。

@oUp2Uo
Copy link

oUp2Uo commented Apr 16, 2019

我这边简单测试了下,允许的scale误差跟训练图像大小有关,太大scale一下绝对误差大,点就配不上了。
目前这个例子里0.97可以恢复过来,0.96就会丢失。

scale是result.transformation_[0][0],不是result.transformation_[2][2] 么?

@meiqua
Copy link
Owner

meiqua commented Apr 16, 2019

这两个一样

@oUp2Uo
Copy link

oUp2Uo commented Apr 16, 2019

我这边简单测试了下,允许的scale误差跟训练图像大小有关,太大scale一下绝对误差大,点就配不上了。
目前这个例子里0.97可以恢复过来,0.96就会丢失。

好像对大小很敏感?
我测了几组自己的数据,icp的scale一直是1,没有变化……

edit:好像是result.transformation_[0][0]和result.transformation_[2][2]不一样,看了下test里是打印的前者……用result.transformation_[0][0]的话测了几组都基本是对的
edit2:好像叠加了比较大旋转之后,scale的值就不大对了

@meiqua
Copy link
Owner

meiqua commented Apr 16, 2019

哦,[0][0] [1][1]一样的, [2][2]当然一直是1了

@meiqua
Copy link
Owner

meiqua commented Apr 16, 2019

旋转理论上不影响,初始姿态配的差不多,ICP都一样跑

@oUp2Uo
Copy link

oUp2Uo commented Apr 17, 2019

哦,[0][0] [1][1]一样的, [2][2]当然一直是1了

可能我表达的不是很清楚……
开始以为结果的3x3是旋转+平移矩阵,右下角是1……
结果仔细看了下求角度是asin而不是atan,所以这并不是旋转矩阵?
然后读了下icp代码这块有点没看明白 ,能稍微解释下么?

@meiqua
Copy link
Owner

meiqua commented Apr 17, 2019

这里的3x3矩阵就是sim3里那个公式sR + t;是atan,我写错了。
icp代码就是一个牛顿法,或者像这样推导,转化为Ax=b的问题,两种方法是等价的。

@oUp2Uo
Copy link

oUp2Uo commented Apr 17, 2019

这里的3x3矩阵就是sim3里那个公式sR + t;是atan,我写错了。
icp代码就是一个牛顿法,或者像这样推导,转化为Ax=b的问题,两种方法是等价的。

嗯,所以就是sR+t的话,
角度应该是atan(result.transformation_[1][0]/result.transformation_[0][0]),
然后icp的scale应该是sqrt((result.transformation_[0][0])*(result.transformation_[0][0]) + (result.transformation_[1][0]) * (result.transformation_[1][0]))对吧?

@meiqua
Copy link
Owner

meiqua commented Apr 17, 2019

对的

@oUp2Uo
Copy link

oUp2Uo commented Apr 18, 2019

对的

顺便一提,这里应该叫sim2?

@meiqua
Copy link
Owner

meiqua commented Apr 18, 2019

@meiqua
Copy link
Owner

meiqua commented May 1, 2019

@lianghaoyue 看到一个视频,能很好地说明适用范围

@411066282
Copy link

作者怎么看 NVlab的DOPE,跟您这个算法相比,孰优孰劣?

@meiqua
Copy link
Owner

meiqua commented May 16, 2019

@411066282 我觉得模板匹配优点是比较可靠。深度学习这种可能不会这么稳定,虽然靠生成大量样本来提升可靠性,但比如一个零件沾了点灰,颜色变,有阴影了等等,识别不识别就不确定了。模板匹配是有理论保障的,只要能提到边缘方向就能识别。当然缺点也很明显,适用范围很窄,纹理多了,不是固定形状(比如识别个人)等等就不行。刚好工业上识别固定形状的场景比较多,所以这个算法是halcon定位模块里面比较核心的一个。

@411066282
Copy link

突发奇想,如果用instance segmentation先做好mask,那么object不就成了textureless了吗,不过那样可能无法判断surface normals。

@meiqua
Copy link
Owner

meiqua commented May 17, 2019

@411066282 有纹理的话,SIFT之类的一般就行了。而且如果segmentation可靠的话,后面加一些处理也能很快得到pose,比如super4pcs,global registration,也可以就在mask范围内模版匹配。

@meiqua meiqua closed this as completed May 28, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants