[Shape from Blur] AIでぼやけた画像を鮮明化する [3D対応]

2021年12月17日金曜日

Artificial Intelligence

本記事ではShape from Blurと呼ばれる機械学習手法を用いて、ぼやけた画像から3Dオブジェクトを認識し鮮明化した画像を生成する方法を紹介します。

アイキャッチ

Shape from Blurとは

Shape from Blurは物体の高速な動きによってオブジェクトがぼやけた画像から、オブジェクトの3D形状、テクスチャ、及びモーションを再構築する手法です。

イメージが付きにくいと思いますので出力結果をご覧ください。

Shape from Blur出力サンプル
出典: rozumden/ShapeFromBlur

上図のInputsは、ぼやけた(Blur)オブジェクトを含む画像と、オブジェクトを含まない背景画像の2画像です。
Shape from Blurは、この2画像を入力すると、3Dオブジェクトの形状や動きテクスチャなどを再構築して画像を出力します。このGIFはフレームごとに鮮明化された画像をつなげてGIFにしたものです。

2D画像のBlur除去が一般的ですが、この手法は3Dオブジェクトを対象としており、オブジェクトの動きによるBlurを再構築する点が興味深いですね。

また、ぼやけたオブジェクトを含まない背景画像ですが準備が難しい場合があります。
その際には下記のような手法でぼやけたオブジェクトを画像から消してしまうのも一つの手かもしれません。

Shape from Blurの導入手順

セットアップ1: conda環境構築

それでは早速、開発環境にShape from Blurをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、Shape from Blurをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

conda環境構築手順を下記に記載します。Shape from Blurの動作要件は下記の通りです。

  1. kaolin>=0.9.0
  2. kornia>=0.5.10

kaolinのインストールには若干注意が必要です。
こちらのGETTING STARTEDには version1.5以上、1.7.1以下のtorchが必要と記載されていますが、公式のGithubにはversion1.5以上、1.9.0以下と記載されています。インストレーションガイドの更新が追いついていないと思われるためGithubの方を確認するようにしてください。

それではセットアップを始めていきます。
conda環境を構築し、kaolinのインストール、Shape from Blurのインストールの順に行います。

# python version 3.7のconda環境を作成
$ conda create -n shapefromblur python=3.7 -y

# 作成した環境をアクティベート
$ conda activate shapefromblur
$ cd shapefromblur

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# kaolinのセットアップ
# setup.pyに記載のtorchバージョンを確認(WebのInstallationのバージョンがずれている場合があるため)
# https://pytorch.org/get-started/previous-versions/ からcudaバージョンが一致するものをインストール
$ conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=10.2 -c pytorch
# torchの動作確認
$ python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count());"
1.9.0
True
2

# kaolinが依存するライブラリをインストール
# https://kaolin.readthedocs.io/en/latest/notes/installation.html
$ conda install -c anaconda cython==0.29.20 scipy pillow
$ pip3 install usd-core

# kaolinのcode clone
$ git clone --recursive https://github.com/NVIDIAGameWorks/kaolin
$ cd kaolin
$ python setup.py develop

# kaolinのインストール確認
$ python -c "import kaolin; print(kaolin.__version__)"
0.9.1
# CIテストを実行する場合は以下
$ pip install -r tools/ci_requirements.txt
$ pytest tests/python/

続いてShare from Blurをインストールします。

# 関連するライブラリをインストール
$ pip install kornia==0.5.10 scikit-image opencv-python meshzoo meshio plyfile pyvista vtk

# Shape of Blurのコードをgit clone
$ cd ..
$ git clone https://github.com/rozumden/ShapeFromBlur.git
$ cd ShapeFromBlur
# インストール確認のため実行
$ python optimize.py

# 以下はエラーが発生した場合にのみご参照ください。
# ModuleNotFoundError: No module named 'vtkCommonCorePython'が発生した場合
$ conda uninstall vtk
$ pip install vtk
$ pip install pyvista

# ImportError: cannot import name 'DeFMO' from 'kornia.feature' が発生した場合
$ conda uninstall kornia
$ pip install kornia

以上で、Shape from Blurの環境構築は完了です。

Shape from Blur(鮮明化)実行

それでは、さっそく鮮明化(3DオブジェクトのBlur除去)を行います。
なお、optimize.pyを実行するとモデルをダウンロードするためProxy配下で実行する場合は、以下の通りコードを修正しておく必要があります。Proxy配下でない場合は読み飛ばして頂いて大丈夫です。

# Proxy配下の場合は事前にoptimize.pyに下記を設定
import argparse
import os
import shutil
import torch
import time
from utils import *
from shapefromblur import *

# proxy設定を追加しておく
os.environ['http_proxy'] = 'http://"username":"password"@proxy:port'
os.environ['https_proxy'] = 'http://"username":"password"@proxy:port'

今回は以下の画像のBlur除去を行ってみます。
下図左が背景画像、下図右がBlur画像です。

入力画像
# 鮮明化実行
$ python optimize.py --im examples/pen_im.png --bgr examples/pen_bgr.png
# ./outputに出力結果が出力されます

下図が出力結果です。

出力結果

Blur画像から、ペンが落下した画像が生成されています。
視認することすら難しいBlur画像からペンの形状や、モーションに至るまで再構築するとはなかなか驚異的です。

ちなみに下図のようなやや複雑な形状のBlur画像を生成してみました。
カメラの前で手を振って作成した画像です。こちらを試してみます。

複雑な形状のblur画像
$ python optimize.py --im examples/target_image.jpg --bgr examples/target_background.jpg

出力結果は以下の通りです。

複雑な形状のblur除去画像

手が円形に丸めこまれてしまっていますね。
config.yamlのパラメータを調整してみましたが、手の形状に再構成されることはありませんでした。

現状、円形や棒状など比較的単純な形状に限定されていそうですね。

まとめ

本記事では、Shape from Blurで3DオブジェクトのBlur除去方法を紹介しました。
複雑な形状のBlur除去はこれからのものの、単純な形状であれば1枚の2次元画像から3Dオブジェクトの形状、モーション、テクスチャの再構成が可能であることを確認しました。これからも注視していきたい技術です。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1. 論文 - Shape from Blur: Recovering Textured 3D Shape and Motion of Fast Moving Objects

2. GitHub - rozumden/ShapeFromBlur

3. Kaolin - Installation

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology