Amazon SageMakerで複数のネジの検出と分類をやってみた ー改善編ー

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、大澤です。こちらのエントリで行なった複数のネジの検出と分類を改善してみました。 今回は前回と被る内容が多いので、やった内容と結果のみお伝えします。

目次

検証した内容

今回も前回と同様、検出器で画像からねじを検出し、その検出した部分のみ切り取った画像を分類器に渡して、ねじの種類を分類するという構成で検証を行いました。
検出器は前回の時点でほとんど検出ができていたので、今回は分類器の学習データを変えてみました。

変更点は以下の通りです。

学習データに背景が異なった画像を紛れ込ませる
前回背景が白いものしか含まれていなかったので、その背景まで特徴量として学習していたのではという、懸念がありました。なので、今回は異なる場所でねじを撮影し、学習データに加えました。
学習データのねじ画像をねじ部分だけトリミングして使用
前回の検証で推論に使用するときに使用する画像に対して、学習に使用する画像は余白が多い問題があったので、今回は余白を削ってみてどうなるかを検証。学習データの画像に対して検出器でねじを検出し、その部分をトリミングした画像に差し替えました。<本来なら手作業でトリミングする必要がありますが、面倒だったので、誤検出覚悟で検出器を使って自動化しました。

分類器の学習について

今回、分類器の学習・テストに使ったデータの特徴は以下の通りです。

  • 元画像は全部で96枚(なべネジ:39、 皿ネジ:22、 蝶ネジ:35)
  • 白背景のものが4割、異なった背景のものが6割程度で構成
  • 画像からねじを検出し、その部分を切り取ったものを元画像と置き換えた
  • 各画像は回転や反転などで10倍に増幅
  • 全画像のうち学習用に9割、テスト用に1割使用
  • 学習用に使用するデータのうち、150個を学習データとして使用し、残りを学習時の検証データとして使用
  • 各画像は最大224*224のJPEGに変換
  • 学習データは最終的にRecordIO形式に変換

ハイパーパラメータは以下のものを使用しました。詳細についてはドキュメントをご確認ください。

# レイヤー数
num_layers = 50
#最大画像サイズ
image_shape = "3,224,224"
# 学習データ数
num_training_samples = 150
# 出力クラス数
num_classes = 3
# 各エポックで使用するデータ数
mini_batch_size = 30
# エポック数
epochs = 50
# 初期の学習率
learning_rate = 0.01
# 学習中に報告する精度は上位何個までか
top_k = 1
# 学習中にモデルのパラメータを保存する間隔(単位:エポック)
checkpoint_frequency = 2
# 事前学習したモデルを使用するかどうか
use_pretrained_model = 1

# 実行したい画像増幅の種類
augmentation_type = 'crop_color_transform'

以上の条件の元で学習しました。
学習のやり方については"画像分類をやってみたエントリ"であるこのエントリをご参照していただければと思います。

結果

実際に複数のねじが写っている画像に対してねじの検出と分類を試しました。
ねじ画像をねじ部分だけトリミングした画像を学習用に使用した割合を変えて確認してみました。
トリミング画像の割合を0、50、100%とした場合の結果を3例ずつ紹介します。
※画像内のラベルについて:検出されたネジの周りを枠で覆い、枠の上にネジの種類 検出時のネジだという判定確率 分類時のその種類だとする確率を表示しています。

トリミング画像の割合が0%

物によってはうまく分類できているものもありますが、ほとんどは間違った分類になってしまっています。
背景が異なる画像を学習しただけでは、まだ分類はうまくいかないようです。

トリミング画像の割合が50%

蝶ネジは分類する事が出来ました!
しかし、皿ネジとなべネジを分類することはできませんでした。やはり蝶ネジとは違いかなり似ているので難しいようです。

とはいえ、蝶ネジとそれ意外とで分類できたので、トリミングの効果はありそうです。

トリミング画像の割合が100%

全てのねじの種類を分類する事ができました!
トリミングによって、学習と推論共に同じだけねじが拡大されている事が良かったのかもしれません。
それによって、よりねじの特徴を強く学習できた可能性があります。

さいごに

今回の検証では、前回において分類に失敗したねじを今回は正しく分類することができました。  
ねじの種類は3つのみに加えて、ねじ同士が離れているという制約のもとですが、前エントリからの目的である、複数のねじが写っている画像からねじの種類を検出するは一旦は達成としたといえるのではないでしょうか。

とはいえ、ねじの検出+分類の二つのモデルを組み合わせた時の定量的な評価がなかったり、分類可能なねじの種類が少なかったり、ハイパーパラメータのチューニングを行なっていなかったり...など、まだまだ問題点が多くあります。
なので今後も少しずつでも改善していければ..いいかなと思っています。

最後までお読み頂きありがとうございました。

参考