AI AI できること AI 入門 Python プログラミング

【python AI】pytorch SSD 物体検出の実装方法 -学習と確認-

 

前回で学習済みのAIを使ってみて、前々回で、自分のデータを学習するための準備をしました。

参考【python AI】pytorch SSD 学習済みのAIを使って物体検知をする

続きを見る

参考【python AI】物体検出の実装方法 -データの準備-

続きを見る

 

データの準備ができたので、次は用意したデータを学習します。

学習するAIモデルにはSSDを使います。

 

hituji
自分の用意したデータで学習して、物体検知をしたい

動かすのに必要コードのみ知りたい

 

本記事の内容

  • 事前準備
  • 学習
  • 学習したモデルを使って検知

 

 

今回は、3回に分けて、この技術の使い方を紹介してます。

3ステップ

  • 学習済みAIを使ってみる
  • データの準備
  • AIを学習 👈 本記事はここ

 

今回は、3つ目の「AIを学習」になります。

ここでは、前回準備した犬の位置を検出できるように学習します。

下記リンクに、Jupyter Notebookとデータをセットでおいてあるので、参考にしてください。

サンプルコード・データ

 

スポンサーリンク

事前準備

始める前にいくつか準備いただくことがあるので、紹介していきます。

 

ライブラリのインストール

いくつか必要なライブラリがあります。

Google Colaboratoryを使う場合は、インストール済みですのでスキップしてください。

必要なライブラリ

  • numpy
  • tqdm
  • matplotlib
  • scikit-learn
  • pytorch

pytorchのインストールは、下記pytorch公式のサイトを参照してください。

 >> pytorch install 

OSなどを選ぶとpipのコマンドなどが出てきます。

そのコマンドを使ってインストールしましょう。

 

SSDモデルのダウンロード

SSDのモデルをダウンロードします。

GitHubにあるpytorchのSSDのコードは、下記のものがあります。

 >> amdegroot/ssd.pytorch

 

ですが、今回はこちらを使わず、このコードをベースに日本語の書籍で紹介されているコードがありますので、そちらを使います。

 >> pytorch_advanced 

下記の書籍で、コードの説明などがされていますので、購入するのもありです。

分かりやすく実践的な書籍です。

 

pytorch_advancedのGitHubからクローンのZipファイルをダウンロードしてください。

 

「2_objectdetection」フォルダにある「utils」を使います。

 

学習済みVGG16の取得

次に下記リンクより学習ずみのVGG16をダウンロードします。

 >> 学習済みVGG16モデル

ダウンロードした「vgg16_reducedfc.pth」を保存しておきます。

 

VGG16は画像分類でも使うAIモデルです。

なぜこれが必要か?

SSDのモデルの前の方では、VGG16を使っています。

 

この部分を、すでに何かで学習したものを使うことができます。

今回は犬を検知したいタスクですが、事前に学習されたVGGに犬が含まれていなくても問題ありません。

この方法を転移学習と言います。

転移学習を使えば、少ないデータでも精度を出すことができます。

今回は140ほどのデータ学習させていますので、この方法は必須です。

 

フォルダ構成

さて、ここまで「utils」というフォルダと「vgg16_reducedfc.pth」というファイルを用意しました。

最終的には次のようなフォルダ構成にしましょう。

 

画像データ:od_dogsというフォルダに入れています。アノテーションのxmlも一緒です

utils:先程GitHubから取得したものそのままです

weights:weightsフォルダを作って、vgg16_reducedfc.pthを入れておきましょう

 

od_train.ipynbは今からコードを記載するjupyter notebookになります。

 

学習

今から、コードを使って、学習していきますが、次のステップになります。

学習までの流れ

  • ライブラリ読み込み
  • データ準備
  • モデルの準備
  • ロス、最適化関数の準備
  • 学習

 

学習にはGPUが乗ったパソコンが必要になります。

GoogleColablatoryを使うと無料でGPUが使えます。

使い方は、Jupyter Labと似ています。

 

ライブラリ読み込み

まず、必要なライブラリを読み込みます。

from utils.ssd_modelとなっているところは、GitHubから拝借した、SSDのモデルとか必要な機能が入っています。

 

データ準備

pytorchではDataSet、DataLoderを使いますので、お作法にならって実装していきます。

 

自分のデータを用意された方は、vol_classesの検知したいリストを修正してください。

今回は、犬の検知をしたいだけなので、['dog']としています。

 

DataSetはデータの元を管理しつつ、データの変換などをします。

DataLoaderはDatasetのデータを順番に取得します

 

DataSetは画像の変換などをするので、AIモデルによって自分で用意することが多いですが、今回はすでにSSD用にVOCDataSetが用意されていますので、それを使っています。

 

モデルの準備

AIモデルを準備します。

まず、AIモデルを読み込みます。

 

SSDの引数は2つphasecfgです。

phaseは学習時はtrainとし、cfgには、設定情報が入っているssd_cfgを入れます。

ssd_cfgの変更点はnum_classesのみで、今回は犬のみの検知なので1クラスですが、背景クラスというのがあって、+1します。

なので、num_classesは2が入っています。

 

次に、先程ダウンロードした学習済みVGG16を読み込みます。

 

VGG16の設定ができたら、その他の箇所は初期化してしまいます。

 

これでAIモデルの重みと呼ばれるものが設定できました。

重みは学習時にうまく検知できるように、調整されるパラメータのことです。

 

重みの初期化とついでに、GPUかCPUどちらが使えるかをdeviceに文字列入れています。

CPUマシーンの場合は、相当時間がかかります。

 

ロス、最適化関数の準備

ロスと最適化関数を設定します。

 

ロス(損失関数)はアノテーションしたデータとAIが検知(推論)した結果の違いを値にしたもの。

ロスが小さくなれば、AIの精度が上がっている状態です。

最適化関数は算出されたロスを元に、ロスを小さくするためのアルゴリズムです。

 

ここら辺をまだ知らない方は、線型回帰の機械学習について調べてみましょう。

基本的な考えを知ることができます。

 

学習

最後に学習になります。

学習用の関数を用意して、動かします。

学習用の関数は次のようになります。

 

この書き方もよく見られる書き方だと思います。

検証用のデータが小さい場合にweightsフォルダに「ssd_best.pth」で学習したモデルを保存しています。

 

では、実際に学習を実行してみましょう。

 

データ少ないので、エポック数200 で実行しています。

 

処理結果がログで出てきます。

train_loss, val_lossがどんどん下がっていきます。

 

Legacy...とエラーが出る場合

pytorchのバージョンのためか、エラーが出る場合は、次のようにコードを変更してください。

私は出てしまいました。

utilsフォルダのssd_model.pyを変更します。

1箇所目は633行目のDetectクラスです。

 

コードも添付しておきます。

 

もう1箇所は、SSDクラスの下の方で809行目のところです。

 

コードも添付します。

 

この2箇所を変更すれば、エラーが解消されます

 

 

学習したモデルで検知

学習したモデルを実際に使って、アプリケーションなどに実装する場合の紹介をします。

やることは次の3つです。

コード実装の3ステップ

  • ライブラリ読み込み
  • SSDモデル設定
  • 新しい画像で検知

 

ライブラリ読み込み

必要なライブラリを読み込みます。

 

SSDモデル設定

SSDモデルを設定します。

学習時とほぼ同じですが、SSDのphase='inference'のところと、学習済みのssd_best.pthを読み込んでいる点が違います。

 

新しい画像で検知

では、適当な犬の画像を使って、検知できるか見ていきます。

jupyter notebookと同じフォルダに、dog_test.jpgを置いて、検知してみます。

 

最初に、ssd.showで検知した結果を表示します。

次に、ssd.ssd_predictで実際の検知したものを四角のボックスや確信度も表示しています。

 

分かりやすい犬のデータばかり使っているというのもありますが、約140のデータにしては、ちゃんと検知できています。

この一連の流れで、数千枚の画像をしっかり学習すれば、自分の使いたい物体検知のAIが開発できるようになります。

-AI, AI できること, AI 入門, Python, プログラミング

© 2021 ひつじ工房