[機械学習]RotNetを使って画像の向きを検出する

2021年7月3日土曜日

Artificial Intelligence

TensorFlowを使って画像の回転角度を予測するRotNetの導入手順を記載します。
RotNetは画像の正しい向きを予測し、正しい向きに補正することを可能にします。

回転した画像と正しい角度に補正した画像の比較
左:回転画像、右:補正後の画像
出典: https://d4nst.github.io/2017/01/12/image-orientation/


RotNetとは?

畳み込みニューラルネットワークを用いて画像の特徴を学習し
画像の内容を解釈しながら画像の回転角度を検出します

このことにより
従来技術が画像内の直線を垂直、または水平になるように補正することに対し
RotNetでは画像内の内容の特徴を見て補正するため
上下反転に補正してしまう等のエラーを減少させることが可能となります

例えば下記のような手紙の画像の向きを修正する場合を考えます

回転画像の例

この画像を従来技術の機械学習を用いない手法で補正する場合
単に文字列の向きを水平に保つことを考えるため
下記のようなエラーが起こり得ます

 
画像の向き補正失敗例


対してRotNetの場合
上記のような手紙を学習させておくことで正しい向きの手紙の特徴を学習します。
正しい文字列の向きを考慮した上で、画像全体の向きを予測するため上記エラーを減少させます。

注意点としてRotNetは手紙に何が書かれているかを分かっていません
あくまで、向きがわかるだけです

日本人の方が、ロシア語の手紙を見て内容は分かりませんが
なんとなくロシア語の文字を見て手紙の向きは分かる事と似ています

以降では、実際に動かしてみたいと思います。
 

RotNetの導入手順

GitHub: d4nst/RotNetのコードを実行環境に配置していきます
導入環境を汚さないためにminicondaを使って仮想環境上に構築していきます

conda環境作成

conda create -n RotNet python=3.7 -y
conda activate RotNet
cd RotNet
mkdir workspace
cd workspace
この環境にRotNetを導入していきます

code clone

git clone https://github.com/d4nst/RotNet.git
cd RotNet
次にpipで必要なライブラリをインストールします

# proxy配下の場合
export HTTP_PROXY=http://"username":"passward"@"proxy":"port"
export HTTPS_PROXY=http://"username":"passward"@"proxy":"port"

pip install -r requirements.txt
conda install tqdm

GPUを使用したい場合上記requirements.txtにtensorflow-gpuが含まれていないため
別途インストールが必要です

# 2度手間ですが念のため一旦アンインストールします
pip uninstall tensorboard tensorflow tensorflow-estimator keras keras-applications keras-preprocessing
conda uninstall cudatoolkit cudnn

# tensorflow-gpuをインストール
conda install tensorflow-gpu keras

次に学習済みモデルをダウンロードします

cd /RotNet/workspace/RotNet
mkdir models
# 下記からzipをダウンロードし解凍します
# https://drive.google.com/open?id=0B9eNEi5uvOI1SjQ5M2tQY3ZMM1U
# models直下に下記モデルを配置してください
# rotnet_mnist.hdf5


以上で環境整備は完了です

MNISTの予測

先ほどダウンロードしたモデルを使って実際に予測させていきます

MNIST画像の回転角度を検出させ、正しい向きに補正させます。
といってもすでにコードが用意されているので
RotNet/test/test_mnist.ipynb をRun all cellsで実行するだけです

すると下記のような出力が得られると思います
数字の向きを補正した結果の図
出典: https://d4nst.github.io/2017/01/12/image-orientation/

Originalの列はMNISTの元画像です
RotatedはOriginalをランダムに0~359°に回転した画像です
CorrectedはRotatedの回転角度をモデルが予測し補正した結果の画像です
Correctedの画像上部のAngleはOriginalとの回転角度の差異を表示しています

概ね良好な結果ではないでしょうか?

以上がRotNetの導入手順となります
学習用コードも提供されているため、独自の画像を学習させ
目的に沿った画像の回転角度を補正するモデルを生成することも可能です

まとめ

本記事では、画像認識AIであるRotNetを紹介させて頂きました。

実装量が少ないためTensorFlowを初めて触る方や、機械学習がどのように実装されているか見てみたい方におすすめのモデルです。

いきなり非常に実装量の多いモデルを見て挫折してしまうよりも、このような比較的実装量も少なく、学習時間も短いモデルに挑戦して、感覚を掴むことも重要かもしれません。

機械学習フレームワークやモデルが違ったとしても、機械学習の流れそのものは大きく変わりません。
まずは、この流れを理解することをお勧めします。

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

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

AIで副業ならココから!

まずは無料会員登録

プロフィール

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

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


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology