【TitanCraft】マインクラフトに巨人を召喚するためのツール作った

# TitanCraft is 何？
スマホなどで撮影した1枚の全身画像から、３Dオブジェクトを経由してしてマインクラフトの`.schematic`ファイルを生成します。
生成された`.schematic`ファイルを[WorldEdit](https://www.curseforge.com/minecraft/mc-mods/worldedit)などの`mod`を使ってマイクラのワールドに読み込ませると巨人を召喚できます。

ソースコードは[ここ](https://github.com/takecx/TitanCraft)で公開しています

# こんなことができます

![titan1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/bfe57905-3ee6-5130-9ecf-e797edebe5c4.png)

> *その日 人類は思い出した*
*ヤツらに支配されていた恐怖を…*
*鳥籠の中に囚われていた屈辱を…*

![titan2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/c276bb89-f827-81eb-0e9b-b3ec6cf4a6e0.png)

![titans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/0f956232-b860-f00c-c7bd-7c86ef14397c.png)


# 処理の流れ
 以下の画像を使って処理の流れを追ってみます。（画像は[ここ](https://publicdomainq.net/business-man-portrait-0040715/)から取得しました:pray_tone1:）
![man_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/ec18e07b-6e7f-f8c4-258b-efc2b652ddeb.jpeg)


## 1. 入力画像から前景を抜き出す
私が作成した[remove_bg](https://github.com/takecx/remove_bg)というリポジトリを使って前景を抜き出します。
その際、次の工程の`PIFu`でマスク画像が必要なので、それも一緒に作成します。
[remove_bg](https://github.com/takecx/remove_bg)では、まず入力画像に対して`Semantic Segmentation`を適用して対象のオブジェクトを抽出します。その後、`trimap`という3値画像を生成し、入力画像とあわせて[FBA_Matting](https://github.com/MarcoForte/FBA_Matting)に入力して前景の抽出を行っています。

**[処理結果]**
![man_2_remove_bg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/3f59c37e-bc27-25f0-ab0a-690239114a69.png)

サンプルの画像に背景がほとんど無いのであまり適切では無いですが、うまく人物が切り出せていることがわかります。（股のや首の近くなど少し背景が残ってしまっているところもありますね）
[remove.bg](https://www.remove.bg/ja)の[API](https://www.remove.bg/api)を使えばもっと高精度になると思いましたが、有料だったので今回は使っていません。

## 2. `PIFu`で画像から3Dオブジェクト生成
[PIFu](https://arxiv.org/abs/1905.05172)という手法を使って画像から３Dオブジェクトを生成します。
この処理によって、３D形状だけでなく画像に写っていない部分の服や髪型などのテクスチャも推論してくれます。
`PLFu`の詳細については私はあまり理解できていないですが、[この記事](https://marvin.news/7168)などにもう少し詳しく載っています。

**[処理結果]**
![man_1_obj.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/870171ad-1aa6-ec60-8b09-af7da918ec7d.jpeg)
（[*meshlab*](https://www.meshlab.net/)*で可視化*)

入力画像には全く写っていない背中やお尻の部分もよく再現されています。すごいですね。
現状では、このまま３Dオブジェクトとして使うのは少し厳しいかもしれませんが、今後技術がさらに進展すれば1枚の画像からキレイな３Dオブジェクトが生成できる日も遠くなさそうですね:ok_hand_tone2:

## 3. 3Dオブジェクトからマインクラフト用の`.schematic`ファイル生成
私が作成した[obj2schematic]()というリポジトリを使って、[2.](#2.-`PIFu`で画像から3Dオブジェクト生成)で生成した`.obj`ファイルからマインクラフト用の`.schematic`ファイルを作ります。
`PIFu`が生成する`.obj`ファイルを読み込み、中身を解析してマイクラのブロックに変換しています。
生成された`.schematic`ファイルを[WorldEdit](https://www.curseforge.com/minecraft/mc-mods/worldedit)などの`mod`でワールドに読み込ませることで巨人を召喚できます！

**[処理結果]**
![man_schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6fb2cabd-01ef-c254-39ff-e181d4424156.png)

どうでしょうか⁉
まぁまぁよく出来てると思います:smile_cat:

以下、召喚した巨人のギャラリーです。

![2020-08-03_16.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/1ac58f61-0c23-51a0-6254-f8b227826c19.png)
*そびえ立つ巨人と見守る村人たち*

![2020-08-03_16.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/654680f2-76c5-dd18-38de-b383bfc26e16.png)
*夕焼けの巨人*

![2020-08-03_16.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/a1fa9d18-14cd-00bb-d181-b8546ec88d1d.png)
*丑三つ刻の巨人*

![2020-08-03_16.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/9b0b4684-db54-5d9b-7c78-b05910cc7c7e.png)
*巨人の肩の上に立つ*

![2020-08-03_17.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/f075acaf-7e0c-c658-b13b-8c8b0c853392.png)
*中身は空洞です*

![2020-08-03_17.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/3e6fdd0e-e3a4-c17e-aeae-5db0b6e599ab.png)
*オマエヲミテルゾ*

# まとめ
1枚の画像からマインクラフト内に巨人を召喚するツールを作りました。
Google Colabで実行できるようにしておいたので是非使ってみてください。
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/takecx/TitanCraft/blob/master/TitanCraft_Colab.ipynb)

ローカルで実行する場合は、pythonの環境が必要ですが、そこさえクリアできればすぐに使えると思います。
GPU無しの私の環境（MacBook Pro(2019)）でも1画像（512x512）あたり2~3分で処理することが出来ます。

「すげー！」と息子に言ってもらいたくて作りましたが、想像通りにできて満足です:joy_cat:
今回は全身画像から３Dオブジェクトを作りましたが、使用するモデルを切り替えることで他にも色々できるんじゃないかと考えています。
何かアイデアがある方はコメントなどで教えていただけると対応するかもしれません:rolling_eyes:

また、`PIFu`や`FBA_Matting`などの公開されているモデルを使用させてもらっていますが、各手法の詳細について理解していなくても使えるような状態になっていることはすごいことだと改めて感じました。