PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】画像認識 - 画像認識ワークフローまとめ【DeepLearning】


ここまで学習してきたことについて軽くまとめてみます。






まだまだ深くは理解できていませんが、画像認識をする際のワークフローは

概ね以下のような流れが多かったと思います



①プロジェクトの理解
②データの理解
③データの読み込み・加工・複製
④モデルの選択
⑤モデルの評価


精度を確認しながら③~⑤を繰り返す
それぞれについてまとめていきます




①プロジェクトの理解

まず初めにやることはプロジェクト全体をよく理解することです。

どのようなデータが与えられていて、データをもとに何を求めていけばいいのかということをまとめます。

以前行ったがん細胞の判別コンぺの場合は、がん細胞が非常に小さなものでかつ画像の狭い領域に

しか映っていないことが課題として挙げられていました。

また最終的にどのような評価関数で精度を導き出すのが適切か、ということも検討する必要があります。

プロジェクト全体の大まかなフローをこの段階で決めておくと以後の作業が進めやすくなるような気がします。




②データの理解

次に与えられたデータを理解する必要があります。

主に以下のような内容を確認していきます。

・データフォーマット
・データサイズ
・チャンネル数
・データ型
・圧縮
・データ数
・カテゴリごとのデータの分布
・注目すべきオブジェクトの特徴

このフェーズで得た情報をもとに、データ整形を行っていくためよく理解する必要があります。

例えば注目すべき物体が同一色であったら、色をもとにオリジナル画像を加工していく、等の方法が考えられます。




③データの読み込み・加工・複製

今まで見てきた中だと、このフェーズが非常に重要だと感じました。

どのモデルを使うかよりも、データの特徴を生かした前加工をしっかりしたものの方が精度が上がっている気がします。


まずデータの読み込みですが、データの形式として

①画像データがカテゴリごとにフォルダに分類されているもの

②一つのフォルダに全てのトレーニングデータが入っており、別途csv形式でカテゴリが指定してあるもの


の2種類がありました。

データの読み込み方が違うみたいなので、形式にあった方法で読み込んでいきます。
僕は経験が浅いので、まずここで詰まりました笑
(以前記事にまとめたので、詳細はそちらを参照ください)


また、読み込んだデータは数値(Numpy配列)等に変換、
ラベルデータも数値に変換(ワンホットエンコーディング)しておきます


次にデータの加工です。

データの特徴に合わせて加工をする必要がありますが、

今まで見てきたものだと、主に以下のような処理を行っていました。

・データをRGB→HSV変換し、オブジェクトの色に注目、マスク作成
・画像のノイズを削除するために、ぼかしを加える(cv2.GaussianBlur)
・不要な領域を削除するためのトリミング
・エッジを検出
など

主にOpenCVの関数を使用して、オリジナル画像を加工していくことが多いみたいです。



画像の加工が終わったら、データを複製していきます。

データが十分に用意されている場合は必要ないですが、たいていの場合はデータが偏っていたり、

そもそも元データが少なかったりで、この処理を行うことになると思います。

主に以下のような処理を行います

・ズーム
・回転
・コントラスト強調
・輝度調整
・スライド



④モデルの選択

ここまで来てやっとモデルの構築を行っています。

見てきた中では、既存のモデル(ResNet,DenseNet等)を転移学習するものが多かったので、

プロジェクトやデータにもよると思いますが、まずは転移学習を試してみるといい気がします。

pytorchなんかを使えば、学習済モデルを簡単に読み込めるみたいです

Keras等のフレームワークを使って一段ずつ層を作っていくパターンもありました。



まだまだ勉強不足ですがアンサンブルなんかも試してみたいと思っています。




⑤モデルの精度検証


学習が終わったら、バリデーションデータでモデルの精度を検証していきます。

ConfusionMatrixなどでどこがうまく判別できなかったのか、などを確認してみるのもいいかもしれません




今まで学んだ内容をとりあえずまとめてみました。


また理解が進んだら改めて記事にまとめたいと思います。