【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matchingharmonylab
公開URL:https://arxiv.org/pdf/2404.19174
出典:Guilherme Potje, Felipe Cadar, Andre Araujo, Renato Martins, Erickson R. ascimento: XFeat: Accelerated Features for Lightweight Image Matching, Proceedings of the 2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (2023)
概要:リソース効率に優れた特徴点マッチングのための軽量なアーキテクチャ「XFeat(Accelerated Features)」を提案します。手法は、局所的な特徴点の検出、抽出、マッチングのための畳み込みニューラルネットワークの基本的な設計を再検討します。特に、リソースが限られたデバイス向けに迅速かつ堅牢なアルゴリズムが必要とされるため、解像度を可能な限り高く保ちながら、ネットワークのチャネル数を制限します。さらに、スパース下でのマッチングを選択できる設計となっており、ナビゲーションやARなどのアプリケーションに適しています。XFeatは、高速かつ同等以上の精度を実現し、一般的なラップトップのCPU上でリアルタイムで動作します。
セル生産方式におけるロボットの活用には様々な問題があるが,その一つとして 3 体以上の物体の組み立てが挙げられる.一般に,複数物体を同時に組み立てる際は,対象の部品をそれぞれロボットアームまたは治具でそれぞれ独立に保持することで組み立てを遂行すると考えられる.ただし,この方法ではロボットアームや治具を部品数と同じ数だけ必要とし,部品数が多いほどコスト面や設置スペースの関係で無駄が多くなる.この課題に対して音𣷓らは組み立て対象物に働く接触力等の解析により,治具等で固定されていない対象物が組み立て作業中に運動しにくい状態となる条件を求めた.すなわち,環境中の非把持対象物のロバスト性を考慮して,組み立て作業条件を検討している.本研究ではこの方策に基づいて,複数物体の組み立て作業を単腕マニピュレータで実行することを目的とする.このとき,対象物のロバスト性を考慮することで,仮組状態の複数物体を同時に扱う手法を提案する.作業対象としてパイプジョイントの組み立てを挙げ,簡易な道具を用いることで単腕マニピュレータで複数物体を同時に把持できることを示す.さらに,作業成功率の向上のために RGB-D カメラを用いた物体の位置検出に基づくロボット制御及び動作計画を実装する.
This paper discusses assembly operations using a single manipulator and a parallel gripper to simultaneously
grasp multiple objects and hold the group of temporarily assembled objects. Multiple robots and jigs generally operate
assembly tasks by constraining the target objects mechanically or geometrically to prevent them from moving. It is
necessary to analyze the physical interaction between the objects for such constraints to achieve the tasks with a single
gripper. In this paper, we focus on assembling pipe joints as an example and discuss constraining the motion of the
objects. Our demonstration shows that a simple tool can facilitate holding multiple objects with a single gripper.
5. ネットワークフロー
• 辺に容量制約がついた有向グラフ G = (V,E) を
考える
• 始点 (ソース) s から終点 (シンク) t へ、各辺の
容量制約を守って最大いくら t まで流せるか?
a
d
c
b
9
s t
10
8
4 3
4
3
6
6. ネットワークフロー
• 辺に容量制約がついた有向グラフ G = (V,E) を
考える
• 始点 (ソース) s から終点 (シンク) t へ、各辺の
容量制約を守って最大いくら t まで流せるか?
a
d
c
b
9
s t
10
8
4 3
4
3
6
10
4 3
1
3
88
2
合計14
7. ネットワークフロー
• もっと数学的な定義: G = (V,E) の s-t フローとは、
• 辺 e ∈ E に対し、容量関数 c(e)、流量関数 f(e)を
考える
• f(e) は以下の制約を満たす
• 0 ≤ f(e) ≤ c(e)
• v ∈ V {s,t} について、Σe∈δ-(v) f(e) = Σe∈δ+(v) f(e)
• このとき、Σe∈δ+(s)f(e) (= Σe∈δ-(t)f(e)) を最大化せよ
入辺 出辺
8. グラフカット
• (重み付き)有向グラフ G = (V,E) を考える
• 頂点集合 V の任意の分割 S, VS に対し、S か
ら VS への辺の集合をカットセットと呼ぶ
a
d
c
b
9
s t
8
3
4
3
610
4
S
VS
11. 最大流・最小カット定理
• 辺に容量制約がついた有向グラフ G = (V,E) を
考える
• 最大 s-t フローの流量 = 最小 s-t カットの容量和
• 証明は後で
a
d
c
b
9
s t
10
8
4 3
4
3
6
10
4 3
1
3
88
2
合計14
a
d
c
b
9
s t
10
8
4 3
4
3
6
合計14
17. 間違った貪欲法
• 容量が余っている辺からなる s-t パスがあれば
流せるだけ流す
• 他のパスで流した方がよいところを勝手に先に
使ってしまうのでダメ
a
d
c
b
9
s t
10
8
4 3
4
3
6
10
4
4
66
3 3
a
d
c
b
9
s t
10
8
4 3
4
3
6
10
4 3
1
3
88
2
合計14合計13 <
24. 最大流・最小カット定理の証明
• 証明は2つ
• フローの流量 ≤ カットの容量
• 最小カットの容量 ≤ 最大流の流量
a
d
c
b
9
s t
10
8
4 3
4
3
6
10
4 3
1
3
88
2
合計14
a
d
c
b
9
s t
10
8
4 3
4
3
6
合計14
25. 1. フロー ≤ カット
• カットされていると s-t パスがないためフロー
が流せない
→ カットをやめても最大でカットの容量しか
流せない
a
d
c
b
9
s t
10
8
4 3
4
3
6
26. 2. 最小カット ≤ 最大流
• 最大流 残余グラフで s-t パスがない = カット
• 最大流の流量 = カットの容量 ≧ 最小カットの容量
• S から VS への辺の流量 = 容量
• VS から S への辺の流量 = 0 (= 逆辺容量も0)
a
d
c
b
2
s t
0
1
0 0
0
2
3
4
310
77
3
4
1
27. Ford-Fulkerson のアルゴリズム
• 残余グラフに s-t パスが存在する
→めいっぱい流した後、逆辺を張って
残余グラフを更新
• 以上をパスがある限り繰り返す
• O(|F| |E|) : |F| = 最大流量、|E| = 辺数
a
d
c
b
9
s t
10
8
4 3
4
3
6
28. Ford-Fulkerson の実装 (グラフ構築)
struct edge{
int to, cap, rev;
edge(int t, int c, int r){
to = t; cap = c; rev = r;
}
};
void add_edge(int from, int to, int cap, vector< vector<edge> > &g){
g[from].push_back( edge(to,cap,g[to].size()) );
g[to].push_back( edge(from,0,g[from].size()-1) );
}
29. Ford-Fulkerson の実装 (本体)
int dfs(int v,int t, int f, vector< vector<edge> > &g, vector<int> &used){
if(v==t)return f;
used[v] = 1;
for(edge &e : g[v]){
if(!used[e.to] && e.cap>0){
int d = dfs(e.to,t,min(f,e.cap),g,used);
if(d>0){
e.cap -= d;
g[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
int max_flow(int s, int t, vector< vector<edge> > g){
int flow = 0;
while(1){
vector<int> used(g.size(),0);
int f = dfs(s,t,INF,g,used);
if(f==0)return flow;
flow += f;
}
}
32. 最小費用流
• 辺に容量制約、コストがついた有向グラフ G = (V,E) を考える
• 辺に流す流量1につき、辺についたコストがかかる
• 始点 (ソース) s から終点 (シンク) t へ、各辺の容量制約を
守って流量 f まで t へ流すとき、最小のコスト和はいくらか?
a
s t
容量5, コスト2
容量10, コスト5
容量2, コスト1
流量 f = 3 だけ流したい!
33. 最小費用流
• 辺に容量制約、コストがついた有向グラフ G = (V,E) を考える
• 辺に流す流量1につき、辺についたコストがかかる
• 始点 (ソース) s から終点 (シンク) t へ、各辺の容量制約を
守って流量 f まで t へ流すとき、最小のコスト和はいくらか?
a
s t
容量5, コスト2
容量10, コスト5
容量2, コスト1
流量 f = 3 だけ流したい!
2 流す
1 流す コスト 2 (2+1) + 1 5 =11
最小!!!
34. SSP (Successive Shortest Path)
• 容量が余っている辺からなる s-t 最短路に流せ
るだけ流す
• 流れている容量分、逆辺を追加して押し戻せる
ようにする
• 逆辺のコストは正負を逆転する
a
s t
容量5, コスト2
容量10, コスト5
容量2, コスト1
流量 f = 3 だけ流したい!
最短路!
2まで流せる!
38. SSP (Bellman-Ford) の実装 (グラフの構築)
struct edge{
int to, cap, cost, rev;
edge(int t, int c, int v, int r){
to = t; cap = c; cost = v; rev = r;
}
};
void add_edge(int from, int to, int cap, int cost, vector< vector<edge> > &g){
g[from].push_back( edge(to,cap,cost,g[to].size()) );
g[to].push_back( edge(from,0,-cost,g[from].size()-1) );
}
44. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点1つをリスト L に入れる
2. まだ L に入れてない頂点がある限り、
・ L の頂点との辺重み和が最大の頂点を L に加える
3. L|V| と他の頂点との間の辺重み和を W とおく
4. L|V| と L|V|-1 を1つの頂点にまとめて G' とする
5. min( W, MinCostCut( G' ) ) が答え
45. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( )
46. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a )
47. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a )
48. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c )
49. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c )
50. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c, b )
51. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c, b )
52. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c, b, d )
53. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c, b, d )
W = 6
54. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
a b
c
1
d
2
4
2
6
L = ( a, c, b, d )
W = 6
a
bd
c
3
2
6
55. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
Wd = 6
a
bd
c
3
2
6
56. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
Wd = 6
a
bd
c
3
2
6
L = ( a, c, bd )
Wbd = 5
57. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
Wd = 6
a
bd
c
3
2
6
L = ( a, c, bd )
Wbd = 5
a
bcd
8
58. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
Wd = 6
L = ( a, bcd)
Wbd = 5
a
bcd
8 Wa = 8
59. Stoer-Wagner のアルゴリズム
MinCostCut (G = (V, E) ):
1. 適当な頂点をリスト L に入れる
2. L に入れてない頂点がある限り、
・ L との辺重み和が最大の頂点を
L に加える
3. L|V| と他の頂点との辺重み和を W
4. L|V| と L|V|-1 を1つにまとめて G'
5. min( W, MinCostCut( G' ) ) が答え
Wd = 6
L = ( a, bcd)
Wbd = 5
a
bcd
8 Wa = 8
最小全域カット = 5
60. Stoer-Wagner の正当性
• 最大隣接順序 (Maximum Adjacent Order) で頂点
を並べた最後の2頂点を s, t とする
• 以下の2つの定理が成り立てば正しい
1. t から他の全頂点への辺和は最小 s-t カットに
等しい
2. G の最小カットは、G'の最小カットか最小 s-t
カットかのいずれか
61. Stoer-Wagner の正当性
1. t から他の全頂点への辺和は最小 s-t カットに等しい
• 任意の s-t カット C について、w(At,t) ≤ w(Ct) を言え
ばよい
• Av : MA Order で v より前の頂点集合
• w(A,v) : Aとvの間の辺の重み和
• Cv : Cのうち、Av ∪ {v} 間の辺のみの集合
• w(C) : 辺集合 C に含まれる辺の重み和
62. Stoer-Wagner の正当性
1. t から他の全頂点への辺和は最小 s-t カットに等しい
• active な頂点に関する帰納法
• v が active : カット C 中で v と1つ前の頂点が
違う集合に分けられている
• vの直前の active な頂点u が w(Au,u) ≤ w(Cu) と仮定
→ w(Av,v) ≤ w(Cv) が言えればよい
vu ...... ...
active
63. Stoer-Wagner の正当性
1. t から他の全頂点への辺和は最小 s-t カットに等しい
• 帰納法 : w(Av,v) ≤ w(Cv) を言いたい
• w(Av,v) = w(Au,v) + w(AvAu,v) ← 集合分けただけ
≤ w(Au,u) + w(AvAu,v) ← MA Order
≤ w(Cu) + w(AvAu,v) ← 帰納法仮定
≤ w(Cv) ← 下図
v
u ......
w(Cu)
w(AvAu,v)
足されてない
64. Stoer-Wagner の正当性
2. G の最小カットは、G'の最小カットか最小 s-t
カットかのいずれか
• まあ自明
• G'の最小カット = s と t を分けない最小カット
• つまり、最小カットは s と t を分ける最小カットか
分けない最小カットかのいずれか、と言ってるだけ