WSL2を使ってSIGGRAPH 2020で発表されたPoint2Meshを実装する

抄録
本稿では、入力点群からサーフェスメッシュを再構成する手法であるPoint2Meshを紹介する。期待される形状特性をコード化する事前処理を明示的に指定する代わりに、事前処理は入力点群を用いて自動的に定義されます。自己優先順位は、ディープ・ニューラル・ネットワークの重みの中に、単一形状からの幾何学的な繰り返しをカプセル化する。我々は、単一の入力点群をシュリンクラップするように初期メッシュを変形させるために、ネットワークの重みを最適化する。これは、共有された局所カーネルがオブジェクト全体にフィットするように計算されるため、再構成された形状全体を明示的に考慮しています。畳み込みカーネルは形状全体にわたって大域的に最適化されているため,形状表面の局所的な幾何学的自己相似性が本質的に促進されます.自己優先順位を用いて点群をシュリンクラップすることで、望ましい解に収束することを示します。従来の再構成アプローチの性能は、実世界のスキャンでよく見られる非理想的な条件、すなわち、無向法線、ノイズ、欠落した(低密度の)部分では劣化しますが、Point2Meshは非理想的な条件にもロバストです。我々は、複雑さの異なる多種多様な形状に対してPoint2Meshの性能を実証しています。
www.DeepL.com/Translator(無料版)で翻訳しました。

(こんな律義にクレジットはいるんだ...)

入力された点群からサーフェスメッシュを再構成する手法。
動画によれば、従来のSmooth-Priorに比べて欠損データを埋め合わせることができるようなSelf-Priorというアプローチを採用しているため、より元の形状に近い形でサーフェスメッシュを再構成できるらしい。

機械学習は詳しくないので細かい内部処理がわからないが、面白そうなので実装してみる。

目的

動画では、様々な動物の点群データを用いたデモを行っているけど、おそらく動物に形状が都合のいい複雑さを持っているからだろう。

今回は、建物の点群データを入力したらどれくらい精度よくサーフェスメッシュを再構成してくれるのか、あるいはそもそも建物の点群には対応していないのか確かめたい。

実装

まずは環境構築から

作者のGithubページのインストラクションに従ってインスコしてく。

とりあえずGithubリポジトリからクローンする。

$ git clone https://github.com/ranahanocka/point2mesh.git
$ cd point2mesh

次にAnacondaを使って仮想環境を構築するそうなんだけど、どれが仮想環境なのかわかっていない。

→どうやらパッケージやライブラリの管理をするために、pipでPCにインストールではなく、condaでAnaconda上で管理するってことか。(つまりこの管理環境が、仮想環境という意味かな)

んーどうやら違うっぽい。めっちゃわかりやすい。

環境とは
環境とは、pythonのバージョン、インストールされているライブラリの種類、ライブラリのバージョンなどの状態をまとめた言い方です。

仮想環境とは
仮想環境とは、環境に関する概念的な単語です。
1つのパソコンの中に複数の環境を用意して、ある環境を使うときにコンピュータにはまるで、その1つの環境しかないように思わせることです。
公式マニュアルでは、conda環境と表記してありました。
仮想環境のメリットは、複数の環境を用意できる点です。


コマンドプロンプトで使いたくばPATHを通せ

Windowsのコマンドプロンプトで以下のコマンドを打っても

'conda'コマンドが認識されません...

と出やがる。どうやらPATHが通ってないらしい。
PATHというのは、今回の場合Anaconda3をCドライブのユーザーに保存しているので、そのパスをcondaに省略するための関連付けのこと。

以下のコマンドでパスを通した。(ありがとう。gavri)

\Users\YOUR_USER\Anaconda3
\Users\YOUR_USER\Anaconda3\Library\mingw-w64\bin
\Users\YOUR_USER\Anaconda3\Library\usr\bin
\Users\YOUR_USER\Anaconda3\Library\bin
\Users\YOUR_USER\Anaconda3\Scripts

再起動したら無事にcondaコマンドが使えた。

これしなくてもAnacondaのプロンプトがインストールされているので、そっち使えばよろしいらしい。


Anaconda仮想環境にセットアップするパッケージ

依存しているPyTorchのバージョン1.4(または1.5)とPyTorch3Dのバージョン0.2.0。
conda環境経由でインストール 
conda env create -f environment.yml(point2mesh と呼ばれる環境を作成)
「マニホールド」ソフトウェアをインストールする
このコードは、Robust Watertight Manifold Softwareに依存しています。まずcd、ソフトウェアをインストールする場所に移動します。たとえば、を使用しましたcd ~/code。次に、Wateright READMEのインストール手順に従います。とは異なるパスにマニホールドをインストールした場合は~/code/Manifold/build、options.py適宜更新してください(この行を参照)

(google翻訳、途中にコードが入ると弱い)

最初は、PyTorchなど諸々を手動でインスコしてたんだけど、どうやらymlファイルで環境を再構築できるらしいので、conda環境を構築

$ conda env create -f ~/environment.yml

しかし

Collecting package metadata (repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://conda.anaconda.org/pytorch/win-64/repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
'https://conda.anaconda.org/pytorch/win-64'

プログラミングっていつもこう。根気強く向かい合うしかない。

HTTP 000 は、「有効なHTTP応答コードがない(つまり、接続が失敗したか、データが発生する前に中止された)」らしい。

調べてみるとこの方と同じ状況

パス通せてないのかい!!

どうやらGUIからも設定できるらしい。やり直そう。

(2020.07.07)

環境変数のユーザーとシステムは何の違いが?

パスを通した

$ conda env create -f environment.yml
Collecting package metadata (repodata.json): done
Solving environment: failed

ResolvePackageNotFound:
 - pytorch3d=0.2.0

どうやら次はPyTorch3D 0.2.0が見つからないらしい?

Anaconda Navigator(GUI)のimportで試したけど、当然のように同じエラーが発生。

ResolvePackageNotFound:
 - pytorch3d=0.2.0

再構築するためのyamlファイルを書き換えれば良さそうということで、いったんPyTorch3Dのインスコは保留。

<environment.yml>

name: point2mesh
channels:
 - pytorch
 - defaults
 - conda-forge
 - fvcore
#  - pytorch3d
dependencies:
 - python=3.8.2
 - numpy=1.18.1
 - pytorch=1.4.0
 - torchvision=0.5.0
 - fvcore=0.1
#  - pytorch3d=0.2.0
 - pip
 - pip:
   - pytest==5.4.2

これで、再度仮想環境を作成してみる。

$ conda env create -f environment.yml
Collecting package metadata (repodata.json): done
Solving environment: done

Downloading and Extracting Packages
pytorch-1.4.0        | 472.4 MB  | ##########4                                                                  |  14%

行けたっぽい。(できた)

根本的な原因はわからないけど、パスも通しているのでPyTorch3D側の問題かもという指摘を発見。(俺はwindowsだけど)

ちなみにpipでインストールすることも考えたけど、それは厳禁、御法度。

pipでインストールしたパッケージは、Anacondaで管理できないので、開発環境が崩壊する可能性がある。(これも備忘録として別記事にまとめるか)

pipはPython環境で様々なパッケージを管理するための標準ツールらしい。つまりcondaはanacondaの独自のパッケージマネージャ。

両者の間に互換性はないために、混合厳禁てわけですね。

それにしてもパッケージのインスコは時間がかかるねー...。

# conda environments:
#
base                     ~\anaconda3
point2mesh            *  ~\anaconda3\envs\point2mesh

できたー!!!

PyTorch3Dをインストールします。

Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

 - pytorch3d

Current channels:

 - https://conda.anaconda.org/pytorch3d/win-64
 - https://conda.anaconda.org/pytorch3d/noarch
 - https://repo.anaconda.com/pkgs/main/win-64
 - https://repo.anaconda.com/pkgs/main/noarch
 - https://repo.anaconda.com/pkgs/r/win-64
 - https://repo.anaconda.com/pkgs/r/noarch
 - https://repo.anaconda.com/pkgs/msys2/win-64
 - https://repo.anaconda.com/pkgs/msys2/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

   https://anaconda.org

and use the search bar at the top of the page.

エラーーー!!

どうやらwindows用のcondaパッケージがまだ使用できないらしい。Anaconda Cloudで検索したところ対応プラットフォームがLinuxになってた。これはLinuxを用意する必要があるのかな...。


とりあえずLinuxをインストールしてみたのでした...

(2020.07.08 追記)

Linux Debianで再チャレンジじゃ!!

とりあえず、VMwareでLinux Debianをインストール。

VMware(R) Workstation 15 Player
15.5.6 build-16341506
(Host OS) Windows 10, 64-bit  (Build 18363.900) 10.0.18363
(Virtual OS) debian-10.4.0-amd64-netinst

ディレクトリ名を英語に。

ついでに、Anaconda3とGitをインストール。

Anaconda3はここからshファイルをダウンロードして、

$ sh Anaconda3-2020.02-Linux-x86_64.sh

でインストール。

Gitはターミナルからインストール。しかし

$ sudo apt-get install git-all
sudoers ファイル内にありません。この事象は記録・報告されます。

どうやら私のアカウントがsudoグループにいないらしいので以下の記事を参考に権限を与える。

~# gpasswd -a user sudo
ユーザ user をグループ sudo に追加

~# su - user

これで実行できました。が、インストール中にスリープモードに入ってしまい、さらにはログインしようにも認証が失敗しましたが連発、そもそもパスワードを入力できない(キーが反応しない)事態が発生。仕方なく強制的に再起動。

GUIが起動しなくなった...

DebianはX Window Systemを使っているらしいので、ログをたどることに。

(EE) systemd-logind: failed to get session: Failed to activate service 'org.freedesktop.login1': timed out (service_start_timeout=25000ms)

んーーーーー??以下の記事に従ってみる

# systemctl restart systemd-logind
Failed to connect to bus : 文字化け~~~!!

xorg.confがないんだけど生成できないのう...

もうOS再インストールしようかな...笑

とりあえずまた明日...

(2020.07.09 追記)

環境構築できた!!

OSを再インストールしてAnaconda3とGitのインスコを終えました。

$ sudo apt update
$ sudo apt install git

ここまで戻ってまいりました。さて、Githubからリポジトリをクローンします。

$ conda env create -f environment.yml
Collecting package metadata (repodata.json): done
Solving environment: done

いけたっぽい!!結局はPyTorch3Dがwindowsに対応していないことが、PackagesNotFoundErrorの原因だったんですね。PyTorch3DのGithubページにはwindowsに対応してそうな記述があったんだけど、見込なんだろうか。

ひとまずパッケージのインストール完了まで、お酒とつまみを楽しむ。

...

インストール完了!!さて、つぎ~!

Manifoldのインストール

以下の説明はしっかりと読みましょう。

Install "Manifold" Software
This code relies on the Robust Watertight Manifold Software. First cd into the location you wish to install the software. For example, we used cd ~/code. Then follow the installation instructions in the Watertight README. If you installed Manifold in a different path than ~/code/Manifold/build, please update options.py accordingly (see this line)​

(ちなみにここをすっ飛ばして別のディレクトリに保存してた俺は、見事にエラーを吐いた。)

ここでCMAKEをインストール。

$ sudo apt install cmake

ManifoldのGithubページでインストール作業を進める。

$ git clone --recursive -j8 git://github.com/hjwdzh/Manifold
$ cd Manifold
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make

しかし、ここでまたエラー

no cmake_cxx_compiler could be found.
$ sudo apt-get update && sudo apt-get install build-essential

もう一度

$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make

でけた。いったんここでCMAKEとManifoldについてまとめようかな


実行編

サンプルデータのダウンロード

user:~/point2mesh$ bash ./scripts/get_data.sh

condaの環境をpoint2meshに切り替えてサンプルファイルを実行!

user:~/point2mesh$ bash ./scripts/examples/giraffe.sh

画像2

上記の画像を撮影した時点ですでに2時間以上かかっていますが、1/6も終わっていません。6000回も学習まわすそうなので、今日は寝る。ねみー。

(2020.07.10 追記)

翌昼...やっちまったーーーーーーーーーー。

Traceback (most recent call last):
  File "main.py", line 85, in <module>
    mesh = utils.manifold._upsample(mesh, opts.save_path, Mesh,
  File "~/point2mesh/utils.py", line 18, in manifold_upsample
    raise FileNotFoundError(f'{manifold_script_path} not found')
FileNotFoundError: ~/code/Manifold/build/manifold not found

原因はわかっています。酒の勢いでManifoldのフォルダごとゴミ箱へ放り込んでいました。すぐにゴミ箱から回収してきました。お酒ってこれだから怖い。おかげでイテレーションは1000で終わっちまいました。

ついでに、処理が遅かったのでCPUのコア数をぶち上げした。どうやらVMware Workstation PlayerではGPUの仮想化ができないぽいので、CPUのコア数を上げた。ここしっかり調べよう

もう一度サンプルデータを回す。サンプルデータの学習とサーフェスメッシュを再構成できたら、自前の点群をどうインプットして再構築できるか、内部を深堀ってみたい。

Traceback (most recent call last):
  File "main.py", line 85, in <module>
    mesh = utils.manifold._upsample(mesh, opts.save_path, Mesh,
  File "~/point2mesh/utils.py", line 18, in manifold_upsample
    raise FileNotFoundError(f'{manifold_script_path} not found')
FileNotFoundError: ~/code/Manifold/build/manifold not found

再発。むむむ。しっかりとファイルは存在しているんだけどな...ほら。

キャプチャ

一つここで重大なミスに気付く。Manifoldをこれとは別のディレクトリにビルドして、慌ててcodeフォルダに持ってきたんだった。おそらくManifoldの構成ファイル内に記述されたパスが本来とずれているためにエラーが起きているんだろう。

ということで、codeフォルダでしっかりビルドしました。

今夜も回しながら眠りにつく...(たこ焼きうまい)

(2020.07.11 追記)

相対パスまわりのエラー

Traceback (most recent call last):
  File "main.py", line 85, in <module>
    mesh = utils.manifold._upsample(mesh, opts.save_path, Mesh,
  File "~/point2mesh/utils.py", line 18, in manifold_upsample
    raise FileNotFoundError(f'{manifold_script_path} not found')
FileNotFoundError: ~/code/Manifold/build/manifold not found

同じエラーが出てきた。うーーーん。もう少し戦ったらIssue報告してみるのもありか。

<options.py, line 6>
MANIFOLD_DIR = r'~/code/Manifold/build'

options.pyの該当箇所を見てみると、見ての通り相対パスが指定されていて、この通りに配置している。ちなみに、manifoldファイルを含んだパスは、utils.pyの16行目で以下のようにパスの結合をしている。(from options import MANIFOLD_DIRでoptions.pyの変数をインポートしている)

<utils.py, line 16>
manifold_script_path = os.path.join(MANIFOLD_DIR, 'manifold')

相対パスなので、基準のディレクトリが問題になりそうなんだけど、これが問題だったのかな?ちなみにカレントディレクトリなどは以下の通り。

(point2mesh) hoge@hoge:~/point2mesh$bash ./scripts/examples/giraffe.sh

それと、manifoldまでのファイル構成はこう。(他省略)

point2mesh
- main.py
- utils.py
- options.py
- scripts
 - examples
  - giraffe.sh
- code
 - build
  - manifold

うーむ。とりあえず絶対パスでやってみるか。

...


サンプルが動いた!!

manifold ./checkpoints/giraffe/recon_7500.obj ./checkpoints/giraffe/temp3b9955c1-62eb-4854-a5eb-028abbf4fe51.obj 100000
upsampled to 10000 faces; number of parts 2
giraffe.ply; iter: 2000 out of: 6000; loss: -0.1688; sample count: 15000; time: 15.25
exporting reconstruction... current LR: 0.00010999633333333334

い、いけたああああ!!

これまで、1000代区切りでのcheckpointでエラーを起こしてたんだけど、無事にイテレーション2000回まわっている。

つまりは、相対パスの書き方と基準となるディレクトリとの兼ね合いがわるかったかのどちらかかどうかって問題だったのか。それはそれで解決しなくちゃいけない。

ひとまず今夜も回しながら眠ることにする(イテレーション重ねるたびに処理時間が増えているので朝に終わるかどうか。)

...


(2020.07.12 追記)

サンプルの実行に成功

できた!!!(途中PCの電源が抜けてしまってイテレーション回し切ってないですが8割回したのでとりあえずサンプルは良しとします)

本当は、プロジェクト紹介動画のようにタイムラプス的に全イテレーションのモデルを見せたかったんだけど、作り方がなんとも思いつかなかった&この実装以上に時間がかかりそうだったのでひとまず初期メッシュ→最終モデルへの画像を載せる。

さて...ここで目的を振り返ろう

今回は、建物の点群データを入力したらどれくらい精度よくサーフェスメッシュを再構成してくれるのか、あるいはそもそも建物の点群には対応していないのか確かめたい。

こんなことを言っていた。(もう1週間前なのか...)

そう。建物を3Dスキャンして模型を作るあるいは整えてビジュアライズするみたいなことがあったんだけど、どうも点群からきれいなサーフェスメッシュを手動でモデリングするのは骨が折れる。

ある程度でいいから穴のないメッシュを作れないかなと思っていたところでこのプロジェクトを見つけたのだ。

ということで、諸々のファイルを準備する!!

実験にうつる

まずは、屋内の点群を用意。(10万点)

画像3

イニシャルとなるメッシュを作成。点群を覆うような直方体。

画像4

さて、これをそれぞれ

room.ply
room_initmesh.obj

として、サンプルデータと同じ階層にそれぞれ配置。さらに、実行用のシェルスクリプトを作成。

<room.sh>
python main.py --input-pc ./data/room.ply \
--initial_mesh ./data/room_initmesh.obj \
--save-path ./checkpoints/room \
--iterations 1000

これで実行します!いけええええ!!!

Traceback (most recent call last):
  File "main.py", line 19, in <module>
    mesh = Mesh(opts.initial_mesh, device=device, hold_history=True)
  File "~/point2mesh/models/layers/mesh.py", line 24, in __init__
    self.vs, self.faces = load_obj(file)
  File "~/point2mesh/utils.py", line 69, in load_obj
    assert len(face_vertex_ids) == 3
AssertionError    

エラー。どうやらutils.pyの69行目あたりの処理で躓いている。

ちょっと解読するには処理内容を勉強する必要がありそうだったので今夜はここまで

(2020.07.13 追記)

WSL2が使えるようになったので環境構築してみた

かなり時間が空きまして、本日は2020年8月30日。夏も折り返しを過ぎたころでございます。

以前試した時にはドライバの非対応警告が発生してWindows10 バージョン 2004にアップグレードできなかったんだけど、今回できたのでWSL2をインストールして環境を構築していく。(ちなみに1903/1909でもWSL2は使えるようになったらしい。

というわけで、WSL2をインストールしていく

基本的に上記のページに書いてある通りに進めていくんだけど、その前にwindowsバージョン2004に更新する必要がある。

上の公式ページから更新アシスタントをダウンロードして更新しましょう。

そうしたら先ほどのページに戻り、各コマンドを打ち込む。

しかしここで一つつまずく

$wsl --set-default-version 2
Error: 0x1bc
For information on key differences with WSL 2 please visit https://aka.ms/wsl2

エラーが吐き出される。ただこれはエラーそのものではなく、システム言語が英語設定じゃないために、エラーメッセージがコードに変換されている。

実際のエラーメッセージは以下

WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel

Linuxカーネルをインストールしてねっていうことでした。

メッセージ内のリンクから、ダウンロードしてインスコ。

その後「Microsoft Store」から好きなLinux系のOSを選んでおしまい。

(WSL2,Ubuntu)Anacondaのインストール

さて、ここから冒頭に戻ったような内容になるじゃないか。臆せず続ける。

$wget <URL>でシェルファイルをダウンロードして$bashコマンドで実行&インストール。

ここから先は、全く同じ内容になるので「環境構築できた!!」を自己参照(笑)

CUDAが使えない

環境の構築も済み、サンプルファイルを動かしたんだけど、やっぱりCPUで動作してしまう。

CUDAをしっかりインストールできていないぽいので、諸々の確認。

ここを参照してもダメだった。

そもそもグラボを読み込んでいない説?以下の記事を参考に試してみると、

import torch
>>> torch.cuda.current_device()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/in2/anaconda3/envs/point2mesh/lib/python3.8/site-packages/torch/cuda/__init__.py", line 377, in current_device
   _lazy_init()
 File "/home/in2/anaconda3/envs/point2mesh/lib/python3.8/site-packages/torch/cuda/__init__.py", line 196, in _lazy_init
   _check_driver()
 File "/home/in2/anaconda3/envs/point2mesh/lib/python3.8/site-packages/torch/cuda/__init__.py", line 98, in _check_driver
   raise AssertionError("""
AssertionError:
Found no NVIDIA driver on your system. Please check that you
have an NVIDIA GPU and installed a driver from
http://www.nvidia.com/Download/index.aspx

となった。ドライバーがインストールされていない。リンクに行き.runファを実行するとさらにエラーが発生する。

WARNING: You do not appear to have an NVIDIA GPU supported by the 450.66 NVIDIA Linux graphics driver installed in this system. For further details, please see the appendix SUPPORTED NVIDIA GRAPHICS CHIPS in the README available on the Linux driver download page at www.nvidia.com.
  ERROR: Unable to find the kernel source tree for the currently running kernel.  Please make sure you have installed the kernel source files for your kernel and
        that they are properly configured; on Red Hat Linux systems, for example, be sure you have the 'kernel-source' or 'kernel-devel' RPM installed.  If you
        know the correct kernel source files are installed, you may specify the kernel source path with the '--kernel-source-path' command line option.
  ERROR: Installation has failed.  Please see the file '/var/log/nvidia-installer.log' for details.  You may find suggestions on fixing installation problems in the
        README available on the Linux driver download page at www.nvidia.com.


どうやらWSL2に対応したCUDAドライバーをインストールしなければいけない

まず、Windows insider programに登録して、Windows 10 Insider Preview 20150 かそれ以上に更新。

今回の場合はbuild 20201.1000に更新。(必ずバックアップを取ってください)

それから、上の記事に記載の「NVIDIA Drivers for CUDA on WSL」ドライバをインストールしますー。ここでも「NVIDIA Developer Program Membership」に登録。

それからもう一度Linuxディストリビューションをインストール、環境構築をしたらCUDAでtorchが動作した。歓喜!!

画像5

以前は、イテレーションごとに7秒から9秒かかっていたので、約3倍程度のスピードアップ。強力。これで5,6時間まって結果を眺めたい。

今日はここまで

(2020.08.30 追記)

GPUのメモリ不足

RuntimeError: CUDA out of memory. Tried to allocate 484.00 MiB (GPU 0; 8.00 GiB total capacity; 5.57 GiB already allocated; 378.75 MiB free; 5.99 GiB reserved in total by PyTorch)

この記事が気に入ったらサポートをしてみませんか?