【ARDK】Semantic Segmentationで巨大なオブジェクトにオクルージョン処理を行う際の注意点

## はじめに
本記事では実装手法については言及しません。
"Semantic Segmentationで巨大なオブジェクトにオクルージョン処理を行う方法"
については下記記事が詳しいです。
【参考リンク】：[Niantic Lightship ARDK セマンティック セグメンテーションを使って巨大ロボを出現させてみた。](https://note.com/st_one/n/n1756a3d901a1)

## バージョン情報
ARDK 2.0.0

## ARDK
[ARDK](https://lightship.dev/)はNianticが提供するARライブラリです。

リアルワールドメタバースを目指しているだけあって、
ARの実装時に活躍する様々な機能が用意されています。

## Semantic Segmentation
ARDKにおいてSemantic Segmentationという機能が利用できます。
カメラ映像から"あらかじめ学習済みの特定の領域"を検出することができます。

【参考リンク】：[将来景観ビジュアリゼーションのためのAR/MRと新技術](https://www.archifuture-web.jp/magazine/622.html)

## Semantic Segmentationの応用
Semantic Segmentationを応用させることで特定の領域に対して描画しない、
ということが可能になります。
正確には特定の領域に対して、深度値の書き込みが可能となります。

描画したい領域は1それ以外は0とすることでその間にARオブジェクトを出現させ、
簡易的にオクルージョン表現を行うことができます。(下記図参考)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/fd153df5-6cdf-5933-5741-ac93ca222fbe.png)

オクルージョン用のオブジェクト(遮蔽物)でマスクするイメージです。

【参考リンク】：[Semantic Segmentation](https://lightship.dev/docs/ardk/context_awareness/semantic_segmentation/semantics.html)

## Semantic Segmentationの注意点
Semantic Segmentationの理屈を考えれば理解が早いですが、
**"ビルなどの遮蔽物をまたいでこちらに向かってくる"というような表現はできません。**

Semantic Segmentationによって判定された特定の領域に対して深度地を書き込み、
その値によってマスク処理を行っているにすぎないので、
実際に建物との前後関係が把握できる技術というわけではありません。

公式のデモにおいても、よく観察してみると
常に遮蔽物の後方にオブジェクトが出ていることが見て取れます。
![semantics_lightship.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/ecb81fe8-b3d6-d6f1-e27e-9ee0c7801ead.gif)
【引用元】：[Niantic Lightship：開発者プラットフォームとARツールを拡張](https://nianticlabs.com/blog/lightship/?hl=ja)

## AR Foundationとの併用
ARDKの機能はARFoundationに依存しません。
そのため、ARFoundationをプロジェクトに導入する必要はありませんが、
既に組み込まれたプロジェクトで利用しようとするとエラーが発生します。

私の環境下では以下のエラーがビルド時に発生しました。
>Attribute meta-data#com.google.ar.core.min_apk_version@value value=(191106000) from [:arcore:] AndroidManifest.xml:35:13-38 is also present at [:arcore_client:] AndroidManifest.xml:38:13-38 value=(202940000). Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:33:9-35:41 to override.

ARDKのARCore用Pluginが
UnityのARCorePluginと衝突していたのが原因のようだったので、
以下のPluginを削除するとビルドが通り問題なく動作しました。
(Semantic Segmentation以外の機能については未検証です)

`ARDK\Plugins\unity_exports\ardk_client_platform\exports`

## オリエンテーションによる不具合
ARDKはLandscape mode(端末の横持ち)での使用を保証していません。
>Currently ARDK does not support landscape mode on mobile devices

【引用元】：[Runtime Requirements](https://lightship.dev/docs/ardk/ardk_fundamentals/system_reqs.html#runtime-requirements)

ですが、Landscape modeにサポートしている機能もあるようで、
完全に機能しないというわけではないようです。

私の検証している限りでは、
端末のオリエンテーション(縦持ち横持ちの切り替えによる画面の縦横比の変更)によって
異常が発生することが多かったです。

この件については、フォーラムに投稿済みなので返答があり次第更新します。
【参考リンク】：[Does ARDK support device orientation? ](https://community.lightship.dev/t/does-ardk-support-device-orientation/2318)

## 距離によるちらつき

先ほど、"Semantic Segmentationを応用したオクルージョンの仕組み"について
以下のようにまとめました。

>描画したい領域は1、それ以外は0とすることでその間にARオブジェクトを出現させ、
簡易的にオクルージョン表現を行うことができます。

すなわち、手前に出現するものはセグメントされた領域のマスク処理によって
非表示になるのが常だと思っていたのですが、
どうも検証している限りだと、ARオブジェクトを配置した距離に影響されるようです。

実際に試したものが以下のGIFです。
2，30メートルほどしか距離がない場合、ARオブジェクトはビルでマスクされるはずですが、
ビルの手前に表示されてしまっています。
![BigFoot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/cf3e474f-5ac6-775c-f1e3-236d37003aec.gif)


こちらについても、フォーラムに投稿済みなので返答があり次第更新します。
【参考リンク】：[Segment and occlusion is not correctly working when it outs of view sky ](https://community.lightship.dev/t/segment-and-occlusion-is-not-correctly-working-when-it-outs-of-view-sky/2317)

---
2022/07/19 追記

上記返信が来たのでまとめると、
"距離は関係なく、建物の壁が認識しずらかっただけ"とのことでした。

【参考リンク】：[Post #6](https://community.lightship.dev/t/segment-and-occlusion-is-not-correctly-working-when-it-outs-of-view-sky/2317/6?u=kento)