画像認識における前処理
はじめに
この記事では備忘録もかねて画像データの「前処理」にフォーカスして、ディープラーニングなどで使用する際に最低限何を実施すべきかを記載していきます。
詳しいやり方というより、こういう工程・項目を入れた方がよいなどを記載していきます。
今回の前提
画像は撮影済みで、「前処理」を行い、この後の「物体検出」や「分類」に繋げていく場合を想定しています。
前処理
- ファイルネーミング変更
- ファイルをランダムに分割
- アノテーション
- リサイズ
- パディング
- データ拡張
- 画像確認ツール
ファイルネーミング変更
ファイルのネーミングに関して、撮影後にルールを決めてネーミングを変更しておいた方が以降の処理で扱いやすいです。
例えば、iPhoneで複数人で撮影して画像を集める場合、画像名が「IMG_<数字>.JPG」などで被る可能性があるからです。
「<日付>-<撮影者>-<クラス>-<数値(インクリ)>.jpg」などにしておけば被ることはありません。
撮影者の情報も入れておけば人ごとに仕分けをするなども可能になります。
プロジェクトごとで必要な情報を付与するとよいです。
ファイルをランダムに分割
ディープラーニングで画像を扱う際は、ファイルをランダムに分割ということをよく行います。
rand関数等を使用して7:3や8:2などにすぐに分割できる用意をしておくとよいです。
この時に注意なのが、オリジナルのフォルダは残しておくという点です。
違うパターンで再度分割したくなった時にオリジナルがないと分けられなくなるので注意が必要です。
例:
オリジナルフォルダ-|
|- 学習用フォルダ(8)
|-<日付>-<撮影者>-<クラス>-<数値(インクリ)>.jpg
|-・
|-・
|- 評価用フォルダ(2)
アノテーション
アノテーションは物体検出特有ですが、下記のツールを使用して行うことが多いです。
また、ネガティブを学習させる際に空のアノテーションファイル(名前はアノテーションファイルと同じだが、中身は空)を事前に別フォルダに作成しておくと、ネガティブ用のデータとして使用できるので効率がよいです。
リサイズ
学習する入力サイズに合わせてリサイズをすることがあります。
Pythonでは下記のライブラリを使用してリサイズを行うことが多いです。
PillowとOpenCVはどちらかに統一して使用する方が無難です。
-
OpenCV
https://docs.opencv.org/4.x/
※デフォルトはBGRで読み込まれるので注意が必要です -
Pillow(Imageモジュールのメソッドresize)
https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.resize
パディング
例えばアスペクト比を16:9のままに維持して正方形の形にリサイズを行いたい場合などがあると思います。
その場合、アスペクト比を維持したままリサイズを行うと正方形にならないので、パディングする必要があります。
縦横をルールなく撮影した場合はパディングをする場所にも注意が必要です。
(縦長の場合は右側にパディング。横長の場合は下側にパディングなど)
-
Pillow(Imageモジュールのメソッドpaste)
https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.paste
データ拡張
データ拡張は下記のようなツールを使用して拡張することが多いです。
-
ImageDataGenerator
https://keras.io/ja/preprocessing/image/
データはやみくもに増やせばよいというわけではなく、実際使用するシチュエーションを意識してデータ拡張する必要があります。
例えば、オリジナルの画像を上下反転するような実際のシチュエーションはないのに、その画像を上下反転でデータ拡張で増やしても余り意味はありません。
画像確認ツール
サーバーなどで操作をしていて前処理を行ったり、推論結果をみたくなった場合に備えて、簡単に画像を確認するツールを準備しておくと便利です。
筆者はjupyter notebook等を使用してPillowなどのモジュールで画像を確認するツールを作成し、その場で確認するようにしています。
最後に
記載の内容ですべてではありませんが、撮影してきた画像データをその後の処理に繋げるための最低限の前処理の内容は記載したと思います。
今後も必要に応じて内容をアップデートしていきたいと思います。