yolov5とラズパイ5で、トランプのリアルタイム検出してみた

トランプの検出画像

ラズパイ5でyolov5使って、トランプの検出に成功しました。上記のような結果になって、なかなかの精度だと確認できると思います。


今回はそのやり方について解説します。

動作環境

  • ラズパイ5:Model B
  • メモリ:8GB
  • カメラ:HD1080P

yolov5とは?

yolov5は、yolo(正式名称You Only Look Once)という物体検出アルゴリズムのモデルの一つで、バージョン5なのでyolov5です。


現時点で、yolov1〜yolov12までありますが、公式ドキュメントより、エッジデバイス向けということで、yolov5にしました。

YOLOv5は、特に特定のハードウェアで推論速度を最大化することが重要なアプリケーションにとって、 依然として強力で信頼性の高い候補です。(中略) エッジデバイスへの迅速な展開が必要なプロジェクトに最適です。

yolov5のインストール

インストールは超簡単です。下記コマンドを実行するだけです

これでyolov5が使えるようになりました。

てことなんで、試しにデフォルトのサンプル画像を使って動かしてみましょう。

しばらく待つと、結果が保存されます。yolov5/runs/detect/exp[数字]/に保存されています。

yolov5のサンプル画像検出結果

スキンヘッドニキがなぜブチ切れてるかは不明

usbカメラでのテスト

さっきは静止画を読んだだけなので、今度はラズパイにカメラを接続して、リアルタイム検出してみましょう


使用したのは EMEETの1080Pのwebカメラ です。3000円ぐらいのやつ。


接続したら、下記コマンドで実行してみましょう


weightsでは、重みを指定していて、

yolov5n < yolov5s < yolov5m < yolov5l < yolov5x

の順で、右に行く程、高精度かつ低速になります


sを指定したんですけど、ラズパイなんで、マァ、重いです。

誤検知してるし、、、

デフォルトでは、forkとかmouseなどの80項目が認識対象として設定されています。( yolov5/data/coco128.yaml から確認できます)


その中にトランプは含まれていないので、そういう場合は、自身で学習させる必要があります


トランプの学習データセットの準備

まず、学習用の画像、つまりデータセットを用意します。


トランプの画像を一枚一枚撮って、アノテーションをつけて、、、とかやるのはあまりにも地獄なので、今回は既存のデータセットを利用します。


そんな時に助かるのが、roboflowというサイトです。


以下のように、有志の人達が作成した、アノテーション済みのデータセットがダウンロードできる素晴らしいサイトです。

roboflowのトランプデータセット

今回使用させていただくのは、PlaycardsDetectionさんのデータセットです。


約6700枚の画像があって、学習データとしては十分なのと、カードの角にある数字とマークだけで識別できるタイプのデータセットだったので、選びました。

Dataset → Download → Download dataset → Continueをクリック

Image and Annotation Formatを、YOLO v5 PyTorch

Download Optionsを、Download zip to computer

に設定したらContinueを押して、ダウンロードします。


Playing Cards Detection.v1i.yolov5pytorch.zipという名前のファイルがダウンロード出来たら、データセットの準備はおkです。(まだ解凍しなくて大丈夫です)

学習タイム突入

早速学習する訳ですが、ラズパイ君で学習させるのはしんどいので、P100のGPUが無料で使える kaggle のnotebookを使います。


モチロンGoogleColabチャートもありですが、GPUの使用制限がよくわからないので、今回はkaggleを使います。


kaggleのトップページ

kaggleのアカウントを作成したら、サイドバーのcreateから、Datasetを選択します。

kaggle-dataset作成

データのアップロード画面で、先ほどダウンロードしたフォルダをzipファイルのままアップロードします。


その後、下記の通りに設定して、データセットを作成します

kaggle-dataset作成

データセットの作成が完了したら、今度はサイドバーのcreateから、Notebookを選択します


Notebookが作成されたら、右側のAdd Inputを選択します

kaggle-dataset作成

データセットマークの右にある+マークをクリックすると、Notebookにデータセットがうpされます

kaggle-dataset作成

その後、上部のメニューバーの、Settings → Acceleratorから、GPU P100を選択します。

GPU全然詳しくないんですが、調べたところ、T4×2よりP100の方が早いらしいです。


ここまできたら、後は下記のコマンド群をぽちぽち実行して行きます

上記のコマンドを実行し終えたら、下記のコマンドで、学習を開始します。ココが一番大変であろうステップ。(◜ཀ◝)


めっちゃ時間かかる(4〜6時間ぐらい?)ので注意です。特にセッション切れには気をつけましょう

  • --img 640:画像サイズ デフォルトです
  • --batch 20:バッチサイズ(1ステップで同時に処理する画像の枚数)
  • --epochs 50:学習回数(全データを50回使って訓練する)多い方が精度は上がりますが、時間がかかるのと、過学習になる可能性があります。
  • --data data.yaml:データセットの情報が書かれたyamlファイル。このファイルに、データセットの構成ファイルが記載されています。
  • --name play_card:学習結果の保存先フォルダ名
  • --weights yolov5s.pt:事前学習済みモデルの指定。色々試しましたが、ラズパイ5だとsが一番良いと思います。

学習が終了したら、右側にある、左向きの三角ボタンをクリックして、サイドバーを表示させます。


三角ボタンが無い場合は、ウィンドウを横に広げたら出てくると思います。

kaggleのサイドバー表示

Outputにある、yolov5/runs/train/play_card/weights/内のbest.ptとlast.ptを、右の・が縦に三つ並んでるボタンをクリックしてDownloadします。それ以外はフヨウラ!

kaggleのサイドバー表示

トランプのリアルタイム検出

ここまできたら、ようやくトランプのリアルタイム検出が可能になります。


まず、トランプを用意しましょう。白いノーマルのやつ良いですが、今回は、実験として、キャラクタートランプも使ってみましょう


使用するトランプ

左:100均のトランプ(Seria)  右:ワンピースのトランプ(部屋にあったやつ)

kaggleのサイドバー表示

ラズパイのyolov5ディレクトリ内に、先ほどダウンロードしたbest.ptをアップロードします。


cd yolov5してから以下を実行。何事もなければ、良い感じにトランプが識別されるはずです、、、!

Seriaトランプ。それなりにちゃんとできてる!

ランダムな角度にも対応してますね

ワンピトランプ。できてなくはないが、こっちはウーンって感じです

全然関係ないですが、今って100均でプラスチックのトランプ売ってるんですね。。。昔はおもちゃ屋のちょっと高いやつしか無かった気がしますけど、良い感じの時代になりました


まとめ

てことで、トランプの識別が可能となりました。課題としては

  • たまに誤検知する(ラズパイで、yolov5sだと限界ありますかね。。。)
  • Joker未対応
  • ちょっと重い

などがありますが、それは今後の課題とします。。

至らぬところも多かったと思いますが、ご覧いただきまして誠にありがとうございます!