YOLOだけではうまくいかなかったので、AIを3つに分けました

技術記事

前回の記事(YOLOとEfficientNetの違いとは?物体検出AIと画像分類AIを分かりやすく解説)では、

  • YOLO(物体検出AI)
  • EfficientNet(画像分類AI)

の違いについて紹介しました。

実は、現在の構成は最初から決まっていたわけではありません。

開発当初は、

「YOLOだけで全部できるのでは?」

と考えていました。

YOLOは物体検出だけでなく、物体の種類まで分類できます。

つまり、

「牌を見つける」

「何の牌なのかを判断する」

この2つを1つのAIで行うことができます。

実際に私も、この方法で開発を始めました。

しかし、開発を進めていくうちに、もっと開発しやすい方法があることに気付きました。

今回は、その試行錯誤について紹介します。


最初はYOLOだけで牌認識しようとしていた

YOLOは物体検出AIですが、

クラスを設定することで、

  • 一萬
  • 二萬

など、それぞれの牌を直接認識できます。

つまり、構成としてはとてもシンプルです。

カメラ

↓

YOLO
(検出+分類)

↓

CPU

AIが1つなので、

実装もシンプルになりそうでした。

実際に私も、この構成で学習を進めていました。


YOLOだけでも動く。でも改善しづらかった

YOLOだけでも、牌の検出と分類は十分可能です。

実際に認識もできますし、学習を繰り返せば精度も向上していきます。

しかし、開発を進める中で、

「改善のしやすさ」

という別の問題が見えてきました。

例えば、

「二萬と認識された」

という結果になったとします。

もちろん、デバッグ用に出力を確認すれば、

  • YOLOが正しく牌を検出できたのか
  • 分類で間違えたのか

といった原因を判断することはできます。

ただ、毎回その確認を行うのが面倒でした。

YOLOが検出と分類の両方を担当していると、

認識ミスが起こるたびに、

「検出が悪かったのか」

「分類が悪かったのか」

を確認する必要があります。

学習を繰り返すたびにこの作業を続けるのは、思っていた以上に手間がかかりました。


まずは「14枚を見つける」ことだけに集中する

そこで、

YOLOには

牌を検出することだけ

を担当してもらうことにしました。

つまり、

カメラ

↓

YOLO
(牌を検出)

↓

牌画像を切り出し

ここまでをYOLOの役割にしました。

まずは、

「14枚の牌を安定して検出できること」

だけを目標にします。

牌をきちんと切り出せるようになれば、

分類精度はあとから何度でも改善できます。

つまり、

  • まず物体検出を完成させる
  • 次に分類モデルを育てる

というように、段階的に開発を進められるようになりました。


分類AIもさらに2段階に分けた

さらに現在は、

分類AIも2段階に分けています。

現在の構成は次のようになっています。

カメラ

↓

YOLO
(牌を検出)

↓

牌画像を切り出し

↓

EfficientNet①
(萬子・筒子・索子・字牌)

↓

EfficientNet②
(1〜9・東南西北白發中)

↓

CPU

最初の分類AIでは、

  • 萬子
  • 筒子
  • 索子
  • 字牌

という大まかな種類だけを判定します。

その後、

萬子なら萬子モデル、

字牌なら字牌モデル、

というように、それぞれ専用の分類モデルへ渡します。

こうすることで、

一度にすべての牌を分類するよりも、

学習しやすく、改善もしやすい構成になりました。


AIを分けたことで得られたメリット

現在の構成にして良かったと感じていることは、大きく3つあります。

① 開発を段階的に進められる

まずはYOLOだけ完成させる。

その後、分類モデルだけ改善する。

というように、

目標を小さく分けながら開発できるようになりました。


② デバッグしやすくなった

認識ミスが起きても、

まずは

「YOLOは正しく牌を切り出せているか」

だけを確認します。

もし切り出しが正しければ、

分類モデルだけを改善すれば済みます。

原因の切り分けが非常にシンプルになりました。


③ 分類モデルだけ何度でも育てられる

YOLOが安定して牌を切り出せるようになれば、

分類モデルだけを再学習できます。

YOLOを毎回学習し直す必要がないため、

認識精度の改善もしやすくなりました。

この考え方は、次回紹介する「再学習」の仕組みにもつながっています。


まとめ

最初は、

YOLOだけですべて認識しようと考えていました。

しかし、実際に開発を進めると、

AIを役割ごとに分けた方が、

開発もしやすく、

改善もしやすいことが分かりました。

現在は、

  • YOLO(牌を検出)
  • EfficientNet①(牌種を分類)
  • EfficientNet②(牌を分類)

という3つのAIが、それぞれ得意な役割を担当しています。

一見すると少し遠回りな構成ですが、

結果として、この方法が最も開発しやすく、認識精度も向上させやすい構成になりました。


関連記事

コメント

タイトルとURLをコピーしました