この記事の概要を簡単に説明すると、「技術の無駄遣い」です。
きっかけ
組込み・画像処理・AI界隈でTLを賑わすエンジニア・クリエイターの高橋かずひとさんがAxrossに投稿された記事がきっかけでした。
その内容は「単眼デプス推定を用いて距離を計測するレシピ」だそうです。
『え!?単眼なのに深度推定!?』
深度を測定するのであれば、直接レーザーや超音波を当てて返ってくるまでの時間を用いる方法や複数のカメラの視差画像をもとに距離を計算する方法などがあります。Lidarやステレオカメラの性能は進化を続けており、深度の抽出に関しては多くの選択肢があります。
ここで紹介するMidasは単眼の画像(WebカメラとかでもOK)から深度を抽出してしまうらしいです。意味がわかりませんね。しかし、Webカメラとコンピュータを組み合わせるだけで深度を測定できるのであれば大きさやコストの面で有利かもしれません。
現在の計算リソースでは厳しいかもしれませんが、将来的にコンピュータの計算性能が飛躍的に進化すれば小型な端末上でも動くかもしれません。
手元に画像がなかったのでヒト(っぽい)画像を使ってみた。
フリー素材を探せばいくらでも候補が見つかるはずなのに、私は某馬育成ゲーム画面の画像をいくつか引っ張ってMidas推論をしました。
なぜこんな画像を使ったのか? Urara-Challengeを見てください。
MiDaS v2.1、まさかのゲーム画面のキャラクターの深度も推論できる🐎
— Ar-Ray (@Ray255Ar) 2022年4月11日
(※推論するメリット皆無) pic.twitter.com/4GJ7lZGNCb
するとなんということでしょう!かなり正確に深度が取れてしまいました。
そこで、私はこの技術を使って壁紙を作ることにしたのでした。(!?)
↓リポジトリは以下のURLの通り。Google Colabで動きます。
技術
ネタリポジトリなので、そこまで凝ったことはしていません。手順としては、
- 画像をアップロード&パラメータ調整
- Midas(チュートリアル通り)を用いて深度抽出して背景除去
- Canny法を用いて線画化
- 線画を透過
- PowerPointなどを使って壁紙のベースに貼り付ける
です。枯れた技術と新しい技術を連結しただけ!
結構ウケた
とりあえずUrara-Challengeの元ネタを変換してみました。
それほど違和感ない…(達成感バイアスかかっている可能性高) pic.twitter.com/iJ3Lkl8rdV
— Ar-Ray (@Ray255Ar) 2022年5月5日
すると結構反応がよく、私のプログラムのユーザがちょこちょこと現れました!!
私が尊敬する(闇のエンジニアの)からあげ先生も猫の画像を線画化していました。さらにこのネタで記事も書かれていました。
残念ながら、記事中ではうまく変換できなかったようです。私が作成したプログラムのトレース元が線がはっきりと写っているものだったので、実際の物体の線画抽出には強くなかったみたいです…
私も猫を使ってLinyax…!したかったのですができませんでした。
linyax、コンピュータとAIの力を借りたから今度こそ完璧だったと思ったんだけどなーー…🙄🙄🙄 pic.twitter.com/X5DekjeaYc
— Ar-Ray (@Ray255Ar) 2022年5月5日
ロボットだと結構うまくいくみたいです。色がはっきりと区別できればいけそうです。
Ar-Ray さんのリポジトリを利用して、Midas 単眼 depth 推定してみた。
— でべ (@devemin) 2022年5月6日
面白いな~~w
Ar-Ray-code / PastePicture2Wallpaperhttps://t.co/3YRoLyrDjXhttps://t.co/vJ2xBRMuzX pic.twitter.com/uYJAUAOjOI
全部Colabで動きます!
最初は深度情報の抽出のみをColabで計算させていましたが、Google Colab で全て動くようにしました。
パラメータ調整もColabでできるようになっています。この機能は結構便利だなーと思ったので、ぜひチュートリアルをColabで作成される際は使ってみてください。
以下にそのコードを示します。
# プルダウン式の選択肢 mode = 'Anime' #@param ["Anime"] {allow-input: true} OS = 'Mac-Gray' #@param ["Ubuntu","Windows","Mac-White","Mac-Gray"] {allow-input: true} # スライドバー median_ksize = 5 #@param {type:"slider", min:1, max:9, step:2} morph_g_ksize = 5 #@param {type:"slider", min:1, max:9, step:2} depth_threshold = 150 #@param {type:"slider", min:0, max:255, step:1} canny_threshold = 150 #@param {type:"slider", min:0, max:255, step:1}
画像はOSの雰囲気に合わせて4種類出力できます。
まとめ
新しい技術を無駄遣いするの、楽しいですね❗