はじめに
センシンロボティクスでは、ロボティクス+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を作成します。
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の性能の高さにあらためて感心しました。引き続き新しい技術を駆使してレガシーシステムをデジタル世界につないでいきたいと思います。