<style>
/* basic design */
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6,
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {
font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic';
text-align: left;
line-height: 1.8;
letter-spacing: normal;
text-shadow: none;
word-wrap: break-word;
color: #444;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;}
.reveal h1, .reveal h2, .reveal h3 {color: #2980b9;}
.reveal th {background: #DDD;}
.reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;}
.reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;}
.reveal table {margin: 1.0vw auto;}
.reveal code {line-height: 1.2;}
.reveal p, .reveal li {padding: 0vw; margin: 0vw;}
.reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;}
/* table design */
.reveal table {background: #f5f5f5;}
.reveal th {background: #444; color: #fff;}
.reveal td {position: relative; transition: all 300ms;}
.reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;}
.reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;}
/* blockquote design */
.reveal blockquote {
width: 90%;
padding: 0.5vw 0 0.5vw 6.0vw;
font-style: italic;
background: #f5f5f5;
}
.reveal blockquote:before{
position: absolute;
top: 0.1vw;
left: 1vw;
content: "\f10d";
font-family: FontAwesome;
color: #2980b9;
font-size: 3.0vw;
}
/* font size */
.reveal h1 {font-size: 5.0vw;}
.reveal h2 {font-size: 4.0vw;}
.reveal h3 {font-size: 2.8vw;}
.reveal h4 {font-size: 2.6vw;}
.reveal h5 {font-size: 2.4vw;}
.reveal h6 {font-size: 2.2vw;}
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;}
.reveal code {font-size: 1.6vw;}
/* new color */
.red {color: #EE6557;}
.blue {color: #16A6B6;}
/* split slide */
#right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;}
#left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;}
</style>
<style>
/* specific design */
.reveal h1 {
margin: 0% -100%;
padding: 2% 100% 4% 100%;
color: #fff;
background: #c2e59c; /* fallback for old browsers */
background: linear-gradient(-45deg, #EE7752, #E73C7E, #23A6D5, #23D5AB);
background-size: 200% 200%;
animation: Gradient 10s ease infinite;
}
@keyframes Gradient {
0% {background-position: 0% 50%}
50% {background-position: 100% 50%}
100% {background-position: 0% 50%}
}
.reveal h2 {
text-align: center;
margin: -5% -50% 2% -50%;
padding: 4% 10% 1% 10%;
color: #fff;
background: #c2e59c; /* fallback for old browsers */
background: -webkit-linear-gradient(to right, #64b3f4, #c2e59c); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to right, #64b3f4, #c2e59c); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
</style>
<!-- --------------------------------------------------------------------------------------- -->
<br>
# <br>データセット半自動生成のための<br>蛍光マーカの提案<br><br>
<br>
#### 2020/6/29 2M2-18
---
## 研究概要
1. 問題
データセット作成の難しさ
2. 既存手法のアプローチ
![app](https://i.imgur.com/1SerMIm.png)
---
## 研究概要
3. 提案手法による問題の解決
蛍光マーカの提案。
既存のマーカアルゴリズムで問題となっていたドメイン固有の問題を、従来手法をベースにして解決。
![app picture](https://i.imgur.com/NsCJeeo.png)
---
## マーカ一般知識
### ペイロードのタイプ
- **マーカのバイナリ情報が直接文字や数字を表すタイプ**
- **あらかじめ用意された辞書と対応させるタイプ** :heavy_check_mark:
<br>
![artoolkit](https://i.imgur.com/E2Uq6SX.png)
---
## マーカ一般知識
手法利用時の流れ
![flow](https://i.imgur.com/HtLdspn.png)
---
## マーカ一般知識
### 研究の流れ
ARToolKit, ARTagが昔の主流。(線形回帰)
ARTag以降は正方形の $n \times n$ グリッドで区切られたタイプが多く登場するようになる。
![history](https://i.imgur.com/Nb64rVe.png)
---
## ArUcoマーカとは
**マーカ生成器, 推定器**
<div class="box">
マーカを生成するアルゴリズムと、生成したマーカの特定とを推定するアルゴリズムを持つ。
</div>
**ペイロードの複雑さを定式化**
<div class="box">
ペイロードの複雑さをビット遷移量(後述)として定式化。<br>
マーカ生成器ではこのビット遷移量を最大化するようなアルゴリズムとなっている。<br>
</div>
**エラー修正機能**
<div class="box">
認識対象のマーカが辞書内のマーカと完全一致しない場合でも、<br>
ビット遷移量が最も近いマーカを提案することができる。
</div>
> [(2014) Automatic generation and detection of highly reliable fiducial markers](http://www.uco.es/investiga/grupos/ava/sites/default/files/GarridoJurado2014.pdf)
---
## 記号
| 記号 | 意味 |
| -------- | -------- |
| $m$ | イテレーションごとに生成されるマーカ |
| $Ψ$ | 閾値γを越えない場合のイテレーション |
$\mathbb{W}$ | ワードの集合
$\mathbb{D}$ | 辞書 マーカとIDの対応表。
| $\gamma$ |(ガンマ) ビット遷移量の閾値 |
| $\gamma^0$ | 最大となるビット遷移量 |
| $\omega$ | ワード。 $\omega \in \mathbb{W}$ |
| $\omega^j_i$ | j-bit, i-iteration の ワード |
| $S$ | self-distance |
| $S^*$ | self-distanceの最大値 |
| $C$ | 一つのマーカに対するカルテットとなりうる座標対の個数 |
| $Q$ | 回転させた時に移動する先の座標郡。 カルテット。 |
| $T$ | ワードのビット遷移量に関係する式 |
| $H$ | ハミング距離 |
---
## アルゴリズム概要
マーカは確率的手法を使ったイテレーションアルゴリズムによって自動的に作られている。
![概要](https://i.imgur.com/AYRVrGw.png)
<div class="box">
生成されたマーカのビット遷移量が閾値γを超えた場合は辞書に追加し、越えなかった時は連続非生成回数カウンタを増やす。
<br>
連続して規定回数Ψを超えて失敗をすると、ビット遷移量の閾値γを下げる。
<br>
<br>
意訳すると、初めは高めの基準で生成を行い、高めの基準が満たせなくなってきた場合は基準を下げる働きになる
</div>
---
## MarkerGenerator
#### ワードωが選ばれる確率 $P ∈ [0, 1]$
$$
P\{\omega = \omega_i\} =
\frac{
T(\omega_i)O(\omega_i, \mathbb{D})
}
{\sum_{\omega_i \in W}
T(\omega_i)O(\omega_i, \mathbb{D})
}
$$
***
$$
T(\omega_i)=
1-\frac{
\sum^{n-2}_{j=0}
\sigma(\omega^{j+1}_i, \omega^j_i)
}
{ n-1 }
$$
***
$$
O(\omega_i, \mathbb{D})=
\begin{cases}
1-
\frac{
1 -
\sum_{m_i \in \mathbb{D}}
\sum_{\omega_j \in m_i}
\sigma(\omega_j,\omega_i)
}
{
n|\mathbb{D}|
}
\quad(
|\mathbb{D}| \neq 0
)\\
1 \quad(otherwise)
\end{cases}
$$
----
## MarkerGenerator
### ワードωが選ばれる確率 $P ∈ [0, 1]$
$$
P\{\omega = \omega_i\} =
\frac{
T(\omega_i)O(\omega_i, \mathbb{D})
}
{\sum_{\omega_i \in W}
T(\omega_i)O(\omega_i, \mathbb{D})
}
$$
**$T(\omega_i)O(\omega_i, \mathbb{D})$ が各単語 $\omega_i$のスコア**
<br>
<div class="box">
サイズが n × n のマーカは、ワード集合Wから選択されたワードωをn個選択することで生成される。
<br>
<br>
(つまり、arucoのアルゴリズムにおいては、隣り合うワード同士の関係は考慮されていない。)
</div>
----
## MarkerGenerator
### ワードのビット遷移量に関係する $T(\omega)∈ [0, 1]$
$$
T(\omega_i)=
1-\frac{
\sum^{n-2}_{j=0}
\sigma(\omega^{j+1}_i, \omega^j_i)
}
{ n-1 }
$$
**ビット遷移量が少ないものを選ばないようにする仕組み**
<br>
<div class="box">
σ(a, b)はa=bで1,それ以外で0。
<br>
σが1に近い場合は連続するビットによってビット遷移量が多くなり、0に近い場合はビット遷移量が少なくなる。
</div>
```
例
T(010110) = 4/5
T(000011) = 1/5
```
----
## MarkerGenerator
### 辞書$\mathbb{D}$の中にマーカωが登場する頻度に関係する式 O(ω, D)
$$
O(\omega_i, \mathbb{D})=
\begin{cases}
1-
\frac{
1 -
\sum_{m_i \in \mathbb{D}}
\sum_{\omega_j \in m_i}
\sigma(\omega_j,\omega_i)
}
{
n|\mathbb{D}|
}
\quad(
|\mathbb{D}| \neq 0
)\\
1 \quad(otherwise)
\end{cases}
$$
**既に何度も使われているワードを選ばないようにするための仕組み**
<br>
<div class="box">
分子はダブルサムによって辞書Dの中にマーカωが何回登場するかをカウントして、分母は辞書のワード数である。
<br>
これによって既に使用率が低ければ1に近くなり、使用率が高ければ0に近くなる。
</div>
---
## Distance calculation
距離の概念は、マーカの検出には関係せず、マーカのポーズ推定時に利用される。
----
### マーカ間の距離 $D$
$$
D(m_i, m_j) = min_{k \in \{0, 1, 2, 3\}} \{H(m_i, R_k(m_j))\}
$$
式$H$は二つのマーカ間のハミング距離。
式$R_k$は90度ずつ入力を回転させるためのオペレーター。
これらにより、式Dはマーカを回転させたときの最小のハミング距離を意味することになる。
### マーカと辞書の距離 $D$
$$
D(m_i, \mathbb{D}) =
min_{k \in \{0, 1, 2, 3\}}
\{D(m_i, m_j)\}
$$
辞書の中のマーカから距離が最小となるマーカとマーカmjとの距離を意味する。
---
### self-distance $S$
$$
S(m_i) =
min_{k \in \{0, 1, 2, 3\}}
\{
{H(m_i, R_k(m_i))}
\}
$$
有効なマーカは閾値γを超えているべきであることから、self-distanceを上記のように定義する。
```
S(1100) = min( H(1100, 0110), H(1100, 0011), H(1100, 1001) )
= min( 2, 4, 2 )
= 2
```
----
### 初期値 $\gamma^0$
Algorithm1で初期値となる、$n \times n$ のマーカにおける最大の閾値 $\gamma^0$ を考える.
#### カルテット
グリッド(x,y)について、マーカを回転させたときの位置Q
$$
\{Q = {(x,y),(n−y−1,x),(n−x−1, n−y−1),(y,n−x-1)}\}
$$
$S^*_n$ はカルテットの距離によって得られる。
#### カルテットのハミング距離
例
$$
H(1100, 0110) = 2; H(1100, 0011) = 4; H(1100, 1001) = 2.
$$
----
#### Self-distanceの最大値 $S^*_n$
![11](https://i.imgur.com/wuTy9dp.png)
![12](https://i.imgur.com/4FnmKtQ.png)
![13](https://i.imgur.com/0LbvRle.png)
例として、5x5のマーカのセルフディスタンスは以下のように求まる。
![Table1](https://i.imgur.com/vBWfM8U.png)
$$
V = min_{i \in {0, 90, 180, 270 deg}}(sum(H_i))
$$
---
## マーカの認識とエラーの修正
![](https://i.imgur.com/JIM9C9t.png)
ポイント: (e) [homography変換](https://blog2.cct-inc.co.jp/blog/img-processor/homography)($\vec{x}^, = A\vec{x} + \vec{b}$)によって俯瞰画像に変換
<br>
<br>
<br>
手順
- (b) canny(or local adaptove thresholding approach)
- (c) contour detection (suzuki85)
- 多様体近似アルゴリズム[3]
- 4つの頂点によってなるもの以外は候補から外す
- 内部の輪郭を単純化する
- (d)マーカのコード抽出
- (e) [homography変換](https://blog2.cct-inc.co.jp/blog/img-processor/homography)($\vec{x}^, = A\vec{x} + \vec{b}$)によって俯瞰画像に変換
- 変換した画像を大津の判別分析法で二値化
- マーカの検出、回転
マーカ候補が検出されたとき、それを回転させることで計4つのマーカ候補が得られる。
マーカ辞書の中に該当するものがあればそれが有効なマーカとなる。
この時、辞書の要素はバイナリツリーとしておく。
ここで一致しなかった時はエラー修正が適用される。
- エラー修正
式8に基づいて、マーカと辞書との距離を計算する。
マーカ内の辞書との距離が一定以下ならば、その中で距離が最も近いものを正しいものとする。
補正するビットの数は、以下になる。
---
## 従来手法をマーカに適応するにあたっての問題点
![marker](https://i.imgur.com/cQbct4z.png)
従来のマーカでは図のように、シールとして印刷して使うのが困難な場合がある。
---
## 新規性
ペイロードをシールとして印刷して使えるようなマーカ生成器
これには、ArUcoマーカの生成器と推定器をベースにする。
----
##### 従来
$$
P\{\omega = \omega_i\} =
\frac{
T(\omega_i)O(\omega_i, \mathbb{D})
}
{\sum_{\omega_i \in W}
T(\omega_i)O(\omega_i, \mathbb{D})
}
$$
##### 提案 (ペイロードのクラスタ化)
$$
P\{\omega = \omega_i\} =
\frac{
T(\omega_i)O(\omega_i, \mathbb{D})
}
{\sum_{\omega_i \in W}
T(\omega_i)O(\omega_i, \mathbb{D})
}
Cluster(\omega_0, \cdots, \omega_i)
$$
$$
Cluster(\omega_0, \cdots, \omega_i) =
\prod^n_{k=0}
\prod^n_{l=0}
\delta_{kl}
$$
$$
\delta_{kl} =
\begin{cases}
0
\quad(
\omega^l_k = 1\
and \
\omega^{l-1}_{k}=
\omega^{l+1}_{k}=
\omega^{l}_{k+1}=
\omega^{l}_{k-1}=
0
)\\
1 \quad(otherwise)
\end{cases}
$$
$$
otherwise\ i \ != 0
$$
値1のビットの上下左右の4bitが全て値0でなければよい
$Cluster$は0か1の値を取る。
ダブルプロダクトの中の値は、$\omega^l_k$の値が1のときに隣接する上下左右のビット($\omega^{l-1}_{k}, \omega^{l+1}_{k},\omega^{l}_{k+1},\omega^{l}_{k-1}$)が全て0でなければ1となり、それ以外の時は、0となる。
---
# 参考文献
<br>
<br>
1. [Automatic generation and detection of highly reliable fiducial markers under occlusion](http://www.uco.es/investiga/grupos/ava/sites/default/files/GarridoJurado2014.pdf)
2. [AprilTag: A robust and flexible visual fiducial system](https://april.eecs.umich.edu/papers/details.php?name=olson2011tags)
3. Efficient collection and automatic annotation of real world object images by taking advantage of post diminished multiple visual markers
4. [opencv_dictionary.cpp](https://github.com/opencv/opencv_contrib/blob/d0d86695f8902066072417f0c2ff5fd95fe31878/modules/aruco/src/dictionary.cpp)
----
## 考えうる指摘 1
- Q
数式を触っているが、`Algorithm 1`にif文を一つ挿入するのとやってることは同じでは?
- A
結果としては同じだが、実行速度は良くなる。
(副次的効果として難しそうに見える。)
----
## 考えうる指摘 2
- Q
式Tはマーカを複雑にする項であり、マーカをシンプルにしようと作用するCluster項と相反する動きをしようとする。
それぞれの強さを調整する項が必要になるのでは?
- A
必要になるかもしてない。
実際に実装してみて、その他にも問題がありそうなら都度式を変更していく予定。
---
## 考えうる指摘 3
- Q
似たようなことをしている従来研究はあるか?
本当に新しいのか?
- A
類似したことを目指す論文は以下
![Efficient collection and automatic annotation of real world object images by taking advantage of post diminished multiple visual markers.pdf
](https://i.imgur.com/snBRXcq.png)
---
## これからの作業の流れ
- 実装
- MarkerGenerator
提案手法を実装する。
- MarkerEstimator
arucoを実装したopencvのDecectMarkerを利用。
(白と黒を反転させて読み込ませることで、利用可能にする。)
{"metaMigratedAt":"2023-06-15T09:59:17.418Z","metaMigratedFrom":"YAML","title":"データセット半自動生成のための蛍光マーカの提案","breaks":"true","slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"none\",\"keyboard\":true,\"spotlight\":{\"enabled\":true},\"width\":\"93%\",\"height\":\"100%\"}","contributors":"[{\"id\":\"cfc611f0-903d-4796-b01b-22c97b64ed68\",\"add\":17076,\"del\":5181}]"}