YOLOは、画像の中から物体の位置を検出できるAIです。
近年ではさまざまな場面で利用されており、自分で学習データを用意すれば、オリジナルの物体検出AIを作ることもできます。
一般的なYOLOモデルの作成手順は、それほど複雑ではありません。
画像を撮影し、物体を矩形で囲んでアノテーションを行い、学習させるという流れです。
私も最初は、この一般的な方法で麻雀牌認識AIを作ろうとしていました。
しかし実際に進めてみると、麻雀牌には種類が多く、14枚の並び方も無数にあります。
認識率を上げようとすると、撮影する画像もアノテーションする枚数もどんどん増えていきました。
そこで現在は、少数の画像から大量の学習データを自動生成する方法へ切り替えています。
このシリーズでは、
まずは一般的なYOLOモデルの作成方法を紹介し、そのあとに私が実際に行った改善方法について紹介していきます。
YOLOとは?
YOLO(You Only Look Once)は、画像の中から物体の位置を検出するAIです。
例えば麻雀牌の画像を入力すると、
下の画像のように
「この位置に牌があります」
という情報を返してくれます。

YOLOは物体の位置だけでなく、物体の種類まで同時に分類することもできます。
しかし今回の麻雀CPUでは、
YOLOには牌の位置を検出する役割だけを担当してもらっています。
牌の種類は、後からEfficientNetという画像分類AIで判定しています。
役割を分けることで、
- 検出
- 分類
- デバッグ
- 精度改善
をそれぞれ独立して行えるようにしています。
一般的なYOLOモデルの作り方
一般的には、YOLOモデルは次のような流れで作成します。
画像を撮影
↓
矩形アノテーション
↓
データ拡張(Augmentation)
↓
YOLOで学習
まずは学習に使用する画像を撮影します。
次に、機械に覚えてもらうために画像内の物体を一つひとつ矩形で囲みます。
この作業をアノテーションと呼びます。
その後、画像の明るさや回転などを変化させてデータを水増しし、YOLOで学習を行います。
この方法だけでも、十分に物体検出AIを作ることができます。
私も最初はこの方法で作っていました
私も最初は、この一般的な流れで麻雀牌認識AIを作っていました。
OpenCVで画像を撮影し、
自作したアノテーションツールで矩形を作成し、
YOLOへ学習させていました。
実際にこのシリーズで紹介する
- 撮影ツール
- アノテーションツール
は、一般的なYOLOモデルを作る場合でもそのまま使用できます。
麻雀牌は撮影する画像が多すぎた
しかし、麻雀牌では少し問題がありました。
牌は全部で30種類以上あり、
さらに14枚の並び方も毎回変わります。
認識率を上げようとすると、
- 牌の並びを変える
- 光の当たり方を変える
- 少し位置を変える
など、多くの画像を撮影する必要があります。
さらに、そのすべての画像へ矩形アノテーションを行う必要があります。
最初は問題なく進められていましたが、
学習データを増やそうとすると、
撮影とアノテーションに多くの時間がかかるようになりました。
少数の画像から学習データを作る方法を考えました
そこで、
「もっと楽に学習データを増やせないだろうか」
と考えました。
そこで思いついたのが、
少数の画像から学習データを自動生成する方法です。
最初に必要なのは、
- 牌の柄画像
- ベースとなる画像
だけです。
牌画像を切り出して保存しておき、
ベース画像には牌を貼り付ける位置だけを指定します。
すると、
プログラムがランダムに牌画像を配置し、
YOLO用のアノテーションまで自動で作成してくれるようになりました。

現在のYOLOモデル作成の流れ
現在は、次のような流れで学習データを作成しています。
画像を撮影
↓
牌画像を矩形アノテーション
↓
牌画像を切り出す
↓
ベース画像を柄部分をポリゴンでアノテーション
↓
牌画像を射影変換して貼り付ける
YOLOラベルを自動生成・データ拡張
↓
YOLOで学習
一般的なYOLOモデル作成より工程は増えていますが、
一度準備してしまえば、
大量の学習データを短時間で作成できるようになりました。
このシリーズで紹介する内容
このシリーズでは、次の順番で紹介していきます。
- OpenCVで学習用画像を撮影するツールを作る
- YOLO用アノテーションツールを自作する
- YOLOラベルから牌画像を自動で切り出す
- 射影変換用の4点アノテーションツールを作る
- 麻雀牌のYOLO学習データを自動生成する
- Ultralytics YOLOを学習する
通常のYOLOモデル作成の流れを紹介しながら、
途中から私が実際に改善した方法も紹介していきます。
まとめ
YOLOモデルは、
画像を撮影して学習させるだけでも作成できます。
しかし、認識率を上げようとすると、
学習データの量と質が重要になり、
撮影やアノテーションの負担も大きくなります。
今回の麻雀牌認識では、
その負担を減らすために、
少数の画像から大量の学習データを自動生成する仕組みを作成しました。
次回は、
まず最初の工程であるOpenCVを使った学習用画像の撮影ツールについて紹介します。
関連記事
- 麻雀CPU、あったらいいので作ります。④ 実物の牌を認識できるのか試してみた
- OpenCVでYOLOの学習用画像を撮影するツールを作る
- YOLO用矩形アノテーションツールをPythonで自作する
- YOLOラベルから牌画像を自動で切り出す
- 射影変換用の4点アノテーションツールを作る
- 麻雀牌のYOLO学習データを自動生成する
- Ultralytics YOLOを学習する



コメント