Yolo V5で簡単7セグLED読み取りAI


はじめに

センシンロボティクスでは、ロボティクス+AIの力により社会課題を解決する業務のデジタル化を推進しています。耐用年数が長い設備ではアナログメーターが依然として多く使われており、設備点検業務のデジタル化にはまずはアナログメーターの自動読み取りが必要となります。

撮影条件を工夫したり閾値を調整したりと、従来の画像処理では苦労が耐えませんが、ディープラーニングを使って簡単にこれを実現したい!ということで、物体検出アルゴリズムのYolo V5を使って7セグLEDの自動読み取りを実現してみました。

環境

  • Intel Core i7-8700K
  • 48GBメモリ
  • GTX 1080Ti
  • PyTorch 1.7.0
  • Yolo V5

学習データセット

まずは学習データセットを準備します。Raspberry Piに7セグLEDディスプレイを接続し、乱数を表示して撮影するプログラムを作成します。
参考: Raspberry Pi+MAX7219で7セグLEDディスプレイ

2,000枚ほど撮影した後、アノテーションツール(LabelImgなど)を使用して、0〜9、表示なしの合計11クラスをアノテーションします。アノテーションした画像は次のようなものになります(暗いのは誤って撮影中に部屋の照明を落としたため笑)。

Yolo V5

準備

Yolo V5をダウンロードします。

$ git clone https://github.com/ultralytics/yolov5.git

datasets以下に適当にフォルダを作りtrain/validに画像を分けて、以下のようなdataset.yamlを作成します。

dataset.yaml
train: datasets/7seg/train/images
val: datasets/7seg/valid/images

nc: 11
names: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"]

学習

あとは、適当に環境に合わせてバッチサイズを変えたり、エポック数を指定します。今回は4つあるモデルのうち、Largeモデルで試してみました。

$ python3 train.py --img 320 --batch 32 --epochs 300 --data ./datasets/7seg/dataset.yaml --cfg ./models/yolov5l.yaml --weights '' --device 0

テスト

テストは、学習データセットとは別に撮影した動画を使って認識させてみます。

$ python3 detect.py --weights runs/exp0/weights/best.pt --img 320 --conf 0.4 --source datasets/7seg/7seg.avi

結果

多少のカメラ移動でも問題なく検出できています。多少オーバフィッティングしていると思いますが、対象の計器ごとモデルを作っても良いので十分使えそうです。

まとめ

7セグLEDの認識は簡単な部類かと思いますが、Yoloの性能の高さにあらためて感心しました。引き続き新しい技術を駆使してレガシーシステムをデジタル世界につないでいきたいと思います。