追記
続編書きました.
以下の記事で実現できなかった,12時間以上かかるフォトグラメトリを無料で行う方法の紹介をしています.
VRエンジニアは忙しい
VRエンジニアはとても忙しい.
VRChatをやったり,BeatSaberをやったり,VirtualCastをやったりとても忙しい.
GPUがいつもフル稼働
そんな状態では,フォトグラメトリしている暇もない.そうすると,解決方法は1つです.
他人のGPUでフォトグラメトリしたい!!
他人の金で焼き肉が食いたい理論です.もし他人のGPUでフォトグラメトリできれば,自分のPCではVRChatやり放題です.やったぜ.
まぁ僕はサーバーサイドエンジニアなんで,そんなに忙しくないんですけど.
※この内容は夏のxR自由研究発表祭【すたみと#3 特別編】で発表した内容です.
Google Colaboratoryでフォトグラメトリする.
Google Colaboratoryとは
Colaboratory は、完全にクラウドで実行される Jupyter ノートブック環境です。設定不要で、無料でご利用になれます。
Colaboratory を使用すると、コードの記述と実行、解析の保存や共有、強力なコンピューティング リソースへのアクセスなどをブラウザからすべて無料で行えます。
ざっくりというと,Webブラウザから使うことができるGoogleが提供している機械学習用のプラットフォームです.利用料は無料です.どういうスペックのマシンが使えるというと
n1-highmem-2 instance
Ubuntu 18.04
2vCPU @ 2.2GHz
13GB RAM
(GPUなし/ TPU)40GB, (GPUあり)360GB Storage
GPU NVIDIA Tesla T4 16GB または Tesla K80 12GB
参考:【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory
なんとGPUも無料で使える.
この環境上で,フォトグラメトリをしよう.ということです.
MeshRoom
MeshRoomはAliceVision社がOSSで開発しているフォトグラメトリソフトで,無料で使えます.これはWindowsとLinuxで動作するのですが,NVIDIAのGPUが必須です.今回は,このソフトをGoogleColab上で動かします.
GoogleColaboratoryでフォトグラメトリする.
1. GoogleDriveにフォルダを作成する.
GoogleDriveにアクセスして,"source_images"というフォルダを作成します.
2. フォトグラメトリする画像をアップロードする.
今回,MeshRoomのサンプルデータを使います.その中でも,mini3という一番小さいデータセットを利用します.
このデータをダウンロードしてきて,先ほど作ったGoogleDriveの"source_images"のフォルダにアップロードします.
3. GoogleColaboratoryの準備をする.
GoogleColaboratoryにアクセスし,左上のメニューから「Python3の新しいノートブック」をクリックします.
https://colab.research.google.com/notebooks/welcome.ipynb
新しいノートブックが表示された後,「編集」「ノートブックの設定」をクリックします.
ノートブックの設定で,「ハードウェアアクセラレータ」を「GPU」に設定し,「保存」します.
4. GoogleColaboratoryでフォトグラメトリする.
以下のスクリプトをコピーし,GoogleColaboratoryにコピーします.
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
!wget https://github.com/alicevision/meshroom/releases/download/v2019.2.0/Meshroom-2019.2.0-linux.tar.gz
!tar xvf ./Meshroom-2019.2.0-linux.tar.gz
!mkdir images
folder = drive.ListFile({'q': 'title = "source_images"'}).GetList()[0]
file_list = drive.ListFile({'q': '"{}" in parents and trashed = false'.format(folder['id'])}).GetList()
for file in file_list:
file.GetContentFile('images/'+file['title'])
!ls images
!mkdir temp
!./Meshroom-2019.2.0/meshroom_photogrammetry --input "images" --output "temp"
!zip result.zip temp/*
upload_file = drive.CreateFile()
upload_file.SetContentFile("result.zip")
upload_file.Upload()
そのあと,「ランタイム」から「すべてのセルを実行」をクリックします.
次に,GoogleDriveとの連携を求められます.URLが以下のように表示されるので,クリックします.
そのあと,先ほど画像データをアップロードしたGoogleアカウントをクリックします.
右下の許可をクリックします.
トークンが発行されるので,右のアイコンをクリックし,トークンをコピーします.
先ほどのトークンを「Enter verification code:」の横のテキストボックスに貼り付け,Enterを押下します.
あとは自動でMeshRoomがインストールされ,フォトグラメトリが実行されます.
5. 結果をダウンロードする.
フォトグラメトリが終了すると,GoogleDriveにresult.zipが作成されます.これが出力結果となっているので,ダウンロードしてください.
これで完成です.
注意事項
これは,GoogleColaboratoryの仕様ですが,**12時間以上のジョブは実行できません.そのため,作業時間が12時間を超えるフォトグラメトリは実行できません.また,GoogleColaboratoryは基本的には対話的に機械学習を行うプラットフォームです.そのため,基本的にセッションが切れるとデータが消えます.**ただ,猶予もあり,セッションが切れた後,90分間は再接続可能です.再接続した場合はデータは消えません.
そのため,長時間のフォトグラメトリをする場合は,
- ブラウザはGoogleColaboratoryを開きっぱなしにして,パソコンがスリープ状態にならないようにして放置する.
- GoogleColaboratoryとの接続が切れたときに再接続するように調整する.
といった工夫が必要です.1.に関しては,まだ簡単ですが,2.に関しては良い解決策がありません.良い解決方法があれば教えて欲しいです.
感想
実は,これには元ネタがありまして,
Google Colaboratoryが、3D CGレンダリング用途にも有能すぎた件
という記事がありました.これはGoogleColab上でBlenderを動かしています.この時に,GoogleColab上で勝手にGPUを使ったソフトウェアが動かせるんだーと思いました.そんな折に,フォトグラメトリをやってみて,やっぱりGPUで動かしたいな.と思いました.その時に,前述した記事を思い出し,やってみた.という内容です.
今回,ちょっと趣向を変えてみて,Fanboxに有料記事を書いてみました.「すたみと#3 特別編」発表の裏話」ということで,この題材を取り上げた経緯や,すたみとでの発表した裏側をまとめました.よろしければどうぞ.