物体認識系技術の勉強の備忘録①

# この記事について
物体認識系技術の勉強として学んだ内容のざっくりまとめ。
多くの画像はプロジェクトページの画像へのリンク。

# Amodal Ground Truth and Completion in the Wild
Amodalデータセットに関する論文。

[論文](https://arxiv.org/abs/2312.17247) [プロジェクトページ](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/)
![プロジェクトのトップ画像](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img1.png)

## 概要情報
### 関連分野
セグメンテーション
### 主な成果
- 3Dデータを使用したAmodalマスク決定自動パイプラインの提案
- 新しい評価ベンチマークデータセット MD3D-Amodal の作成
- Amodalマスク推論モデル2種の提案

### Amodalとは
| 英単語 | 和訳 | 備考 |
|--|--|--|
| modal | 形式的な |  |
| amodal | 非形式的な | 否定の接頭辞 a ＋ modal |

上記の単語の意味直訳だと意味が取りづらい…。
ざっくりと意訳して **形のない** や **非可視部分の** と解釈。

**Amodal**マスク ＝ **遮蔽された部分も補完した**マスク。

例えば下の画像ではバイクやソファが別のバイクやテーブルによって部分的に遮蔽されている。
遮蔽された部分の形状を保管したマスクが欲しいというタスクがAmodalマスクの推定。
![Amodalマスクの例](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img1.png)

**用語メモ**
| 用語 | 説明 |
|--|--|
| Occlusion | ある物体が遮蔽された状態 |
| Occluder | 遮蔽物<br>ある物体を遮蔽している物体 |
| Occluded | 被遮蔽物<br>何らかの物体によって遮蔽されている物体 |

## 学ぶモチベーション
画像処理関連の業務を行っている中で
**認識対象の物体が遮蔽物によって部分的に隠れていても、隠された部分も推定できれば...**
というケースに遭遇したため。

- 通常は遮蔽が発生しにくいカメラの位置にするが、諸般の都合でカメラは動かせない
- 映像内の物体配置が頻繁に変わり、遮蔽の有無が刻々と変化する
- 認識対象物体の着目したい部位が遮蔽されやすい
- 着目するの座標のため見えない部分のテクスチャは不要

## 内容
### Amodalデータ作成パイプライン
1. 既存のデータセットMatterport3Dから3Dメッシュを取得
1. 3Dメッシュを2Dに投影してマスク生成
    - modalマスク: 全ての物体を2Dへ投影
    - amodalマスク: 物体ごとに2Dへ投影
1. 下記判定式でOccludedを特定
    $(amodalマスク面積) ＞ 1.2 × (modalマスク面積)$
1. 人による選定
    - 元となるデータセットMatterport3D自体にノイズがある

### [Matterport3Dデータセット](https://niessner.github.io/Matterport/)
![Matterport3Dのサンプル画像](https://niessner.github.io/Matterport/teaser.png)

- データの内容
    - 建物90シーン
    - 194,400枚のRGB-D画像
    - 10,800枚のパノラマビューのRGB-D画像
- [Matterport](https://matterport.com/ja): RGB-Dカメラを出していおり、デジタルツイン推しの企業

### 作成されたAmodalデータセット
#### サンプルデータ
ダウンロードしたデータの中身を抜粋。

##### 画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045187/997f7c4c-443a-49eb-bfb9-1e76acb6e7f1.jpeg" alt="scene-1LXtFkjw3qL-img_name-03a8325e3b054e3fad7e1e7091f9d283_i1_1.jpg" width=30% />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045187/5693aafe-aee7-40f2-8bed-bb4fed0ebc56.jpeg" alt="scene-1LXtFkjw3qL-img_name-3aba2bf1310e4a10918e4a5bc51d1979_i1_0.jpg" width=30% />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045187/cfc70825-da78-4aea-a658-5ecc3ad2eb38.jpeg" alt="scene-VLzqgDo317F-img_name-f4810f2f18cb497389628bd8738ba036_i2_0.jpg" width=30% />

##### アノテーション
アノテーションはpklファイルになっている。
以下はPythonのインタプリタモードで確認した結果。
（長すぎる内容は省略して記載）

形式はCOCOAデータセット（COCOをベースにAmodal対応したデータセット）。
[COCOA形式の参考](https://github.com/shunk031/huggingface-datasets_COCOA)

```
>>> import pickle
>>> with open(r"MP3D_seleted_eval_10.29.pkl", "rb") as f:
...     loaded_data = pickle.load(f)
...
>>>
>>> type(loaded_data)
<class 'dict'>
>>>
>>> loaded_data.keys()
dict_keys(['images', 'annotations'])
>>> type(loaded_data["images"])
<class 'list'>
>>> len(loaded_data["images"])
11441
>>> loaded_data["images"][0]
{
    'data_captured': '?', 
    'coco_url': 'http://mscoco.org/images/27', 
    'flickr_url': '?', 
    'license': 2, 
    'height': 1024, 
    'id': 1, 
    'width': 1280, 
    'file_name': 'scene-VLzqgDo317F-img_name-f4810f2f18cb497389628bd8738ba036_i2_0.jpg'
}
>>> type(loaded_data["annotations"])
<class 'list'>
>>> len(loaded_data["annotations"])
11441
>>> loaded_data["annotations"][0]
{
    'depth_constraint': '', 
    'url': 'https://s3-us-west-1.amazonaws.com/coco-ann/coco-test/COCO_test2014_000000000027.jpg', 
    'size': 1, 'author': 'upwork26', 'image_id': 1, 'id': 1, 
    'regions': [
        {
            'isStuff': 0, 'order': 1, 'category_id': 1, 'area': 323593, 
            'name': 'mp3d_obj', 'occlusion_rate': 0.3892120740813445, 'image_id': 1, 
            'visible_mask': {'size': [1024, 1280], 'counts': b']Zcg04mo05（略）'}, 
            'segmentation': {'size': [1024, 1280], 'counts': b'^Pcb0i0in0（略）'}
        }
    ]
}
```
- pklを読み込むと 'images', 'annotations' のキーを持つ辞書になっている
- 'images', 'annotations' の値は辞書のリストになっている
- 'images' の各辞書には画像のファイル名やサイズが含まれている
- 'annotations' の各辞書には 'occlusion_rate' のようなメタ情報やマスク情報が含まれている

**用語メモ**
「thing」と「stuff」はどちらもモノを指す単語だが「thing」は可算名詞で「stuff」は不可算名詞という違いがある。

| 用語 | 説明 | 例 |
|--|--|--|
| thing (things) | 1つ1つ数えやすい物体 | 人 犬 椅子 車 コップ |
| stuff | 明確な形状がないものや広がりのある領域など<br>インスタンスセグメンテーションでは対象外 | 空 道路 水 壁 道路植栽 |

#### 詳細情報
##### 他データセットとの比較
- 合成データでないリアル画像
- AmodalなGT
- 対象カテゴリ(クラス)が多い
- 主に屋内画像

![他データセットとの比較表](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/table1.png)

##### データ分割
- 評価ベンチマークなため、学習用データは少なく評価用データが多い
- 学習用データはモデルのドメイン適応させるためで、根本的な推論能力の獲得は別のデータセットで行う必要がありそう
- 1画像当たり約1.17インスタンス

![データ分割の表](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/table2.png)

##### データ分布
- 屋内データのため壁や家具類が多い
    - トップ画像にあるバイクは無い…？
- Occlusion Rate 20～30%がボリュームゾーン

![データ分布の表](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img3.png)

##### サンプル画像
![サンプル画像](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img2.png)

### Amodalセグメンテーションモデル
#### 2ステップモデル
- Occluder推定とAmodalマスク推定の2段構成

![2ステップモデルアーキテクチャ図](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img5.png)

#### 1ステップモデル
- Stable Diffusionを使用した1段階構成(Occluder推定部無し)
- Stable Diffusionパワーで2ステップモデルより高精度

![1ステップモデルアーキテクチャ図](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img6.png)

### 実験結果
#### 他モデルとの比較
![他モデルとの比較表](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/table5.png)

#### 学習データを変えて提案モデルの比較
![学習データを変えて提案モデルの比較表](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/table6.png)

#### 定性的な比較
![定性的比較](https://www.robots.ox.ac.uk/%7Evgg/research/amodal/assets/img7.png)

## まとめ
- 研究の主な成果
    - Amodalマスク決定自動パイプラインの提案
    - 評価ベンチマークデータセットの作成
    - Amodalマスク推論モデル2種の提案
- 成果物のデータセット
    - 評価用ベンチマーク
    - Amodalマスクの数は限定的（1画像1マスク程度）

**所感**
- Amodalというワードを知ることができたため、ネットで更なる情報収集が可能になった
- Amodalマスクが得られれば様々な応用ができそう
    - Amodalな姿勢推定など

## 関連情報
[Amodal Panoptic Segmentation](https://amodal-panoptic.cs.uni-freiburg.de/)