コンテンツへスキップ

Darknet/YOLOの独自学習に向けた画像準備

独自/オリジナルの1クラスを勉強させるのに多くの画像データが必要となります。WEBの記事では、1クラス数千枚と記載されておりました。このサイトで公開しているめざましじゃんけん画像検出も精度向上で画像追加を適時行っておりますが、サービス提供開始時点でトータル5000枚(4クラス合計)で開始しております。
インターネットからキーワードで画像データを探してくるツールや、機械学習向けのデータセットを公開しているサイトなどもあるようです。

機械学習向けデータセット公開サイト:ImageNet
80,000を超える対象のデータセットが準備されているようです。

Raspberry Piに接続したUSBカメラで機械学習向けデータセット準備

Raspberry PiにUSB接続のWEBカメラ導入
当初、扱いが楽なfswebcamを利用して実施しようとしましたが、結局は画像検出でも多用するOpenCVを利用した画像準備を実施しました。
めざましじゃんけんでは、結果表示時間が短いこともあり、短時間で多くの画像取得をする必要がありました。fswebcamはコマンドで閉じた画像取得ができるのがメリットとなりますが、カメラの準備や利用終了などが一連の流れとしてコマンド化されており、画像の連続取得には適しておりませんでした。Sleepなしで連続画像取得をした際に、Raspberry Piでは1画像/3−8秒必要となっておりました。このインターバルが不揃いであった点も利用に至らなかった要因です。

fswebcamインストールと機械学習向けデータセット

画像取得時のコマンド

以下のコマンドで、画像保存を行いました。

参考にさせて頂いたサイト

Webカメラでインターバル撮影

OpenCVインストールと機械学習向けデータセット

今後、Raspberry Pi上でのOpenCVインストール方法を記事にしますが、簡単な画像処理には、以下コマンドで入るOpenCVで特に問題は有りませんでした。

OpenCVの利用方法

  1. OpenCVをインポート
    import cv2
  2. カメラデバイスを取得
    c = cv2.VideoCapture(0)
  3. カメラ起動待ち
    Sleepを少し入れるか、c.read()を画像取得なしで実行します
    ※ カメラ依存と思いますが、最初の画像が暗くなる傾向があります。
  4. readで画像をキャプチャ、imgにRGBのデータが入ってくる
    r, img = c.read()
  5. ファルへ保存
    cv2.imwrite('photo.jpg', img)

参考にさせて頂いたサイト

[Raspberry Pi]USBカメラをつなぎ、PythonのOpenCVで写真を撮る

python-opencvインストールログ

GeFroceのGPUアップグレード検討

せっかくなので、メモですが記事として残します。

現在、MSI GTX 960 2GD5T OCV2 (GeForce GTX960 2GB OC)  を利用しております。
2GBのメモリ容量となります。2万5千円で購入しました。

ディープラーニング(Deep Learning)深層学習、ニューラルネットワーク(ディープニューラルネットワーク、Deep Neural Network: DNN)による機械学習向けにGeForceのアップグレードを検討。

  • YOLO, DarknetなどDNN実施時のGPUメモリ不足(out of memory)回避、メモリ不足回避の学習回数増加による学習時間増加
  • 画像関係のDNNでは、GPUメモリ不足により、満足に学習自体実行が出来ないケースあり
  • 趣味の範囲なので、過剰な投資は出来ない(個人的には2−3万円以内)
  • PCで基本的にゲームなどは実施しない、モニタもHDMI接続1台
  • メモリ容量が増えるが目的

グラフィックカードのメーカーですが、NVIDIAかAMDとなり、それぞれNVIDIAからGeForce、AMDからRadeonがリリースされています。
各種ツールとの親和性を考えると、GeForce一択となりました。(自身でコンパイル時の修正などが出来るスキルが有るならば、魅力的なRadeonもありと思います)

NVIDIAのGeForce RTX 20XXシリーズ(2080 Ti、2080、2070、2060)やGeForce GTX 16XXシリーズ(1660 Ti、1660)が現行モデルとなります。

予算オーバーのRTX20シリーズですが、深層学習用のテンソルコア(Tensor Core)搭載となります。4×4行列の積和算を4つ並列に行う事が出来るようになり、Tensor Coreを使えば、CNNの畳み込み高速化、メモリ転送の効率化などにより、前世代の Pascal GPU と比べて、学習(トレーニング)速度が4 倍になるようです。
Volta Tensor コア GPU が AI パフォーマンスの新記録を達成

消費電力も、現在のパソコンケースの電源サイズや電気料金にも影響するので、一応比較軸に入れます。消費電力とTDP:Thermal Design Power(熱設計電力)は混同されて利用されています。TDPは、電源および冷却に関する指標を示す数字となります。

NVIDIAのGPUコアは「CUDA(クーダ)コア」と呼ばれます。一般的には「シェイダープロセッサ(Shader Processor)」、「ストリームプロセッサ(Stream Processor)」などと呼びます。

GPU導入候補比較表

価格帯を考え、メモリサイズ6GB導入で検討しました。
メモリサイズ2GB部分のみが、(現在利用している)GTX960の弱点で、非常にコストパフォーマンスが良い機種であると再確認も出来ました。

GPUGeForce GTX 960GeForce RTX 2060GeForce GTX1660TiGeForce GTX1660GeForce GTX1060
価格イメージ
2019/08
当時購入金額
25,000
42,00036,00028,00026,000
メモリサイズ2GB6GB6GB6GB6GB
メモリ規格GDDR5GDDR6GDDR6GDDDR5GDDR5
CUDA(SP数)10241920153614081280
消費電力120W160W120W130W120W
サイズ230 x 111 x 38175x126x43 mm178x126x41 mm178x126x41 mm175x115x38 mm

個人深層学習向けGPU比較結果

  1. 価格的にGTX1660(現行モデル)とGTX1060を最終的に検討。価格差も誤差の範囲であり、GTX1660が購入の最有力候補
  2. 私は、予算外なのですが、想定以上に価格がやすかったので、あえて明記。
    予算的に可能ならば、GeForce RTX 2060が絶対におすすめです。
GeForce RTX 2060 AERO ITX 6G OC MSI PCI Express 3.0 x16対応 グラフィックスボードMSI GeForce RTX 2060 AERO ITX 6G OC

初期検討時のシステム構想

機械学習どころか、プログラム言語Pythonも全く初めて、Raspberry PiやWEBカメラなどインフラ関係も知識なし。

めざましじゃんけん結果

WEBからの情報などで、こんな感じにしたいと思い描いたのが以下のシステム構想。

一般的なGeForce(GeForce GTX 960)ビデオカード搭載のWindowsメインマシン(Intel Core i7-6700 CPU)で機械学習・ニューラルネットワークを用いた学習モデルの作成。作成した学習モデルをRaspberry Pi 3
Model B+ へ移動し、Raspberry Piで画像検出を実施。

Raspberry Piでの画像検出結果により、じゃんけん結果をDBへ蓄積。蓄積したDBデータより、めざましじゃんけんの結果をホームページと速報としてTwitterで公開。

当初画像認識と画像検出の違いも分かっておらず、書籍などで紹介されていた画像認識を駆使したシステムを構築しようとしておりました。画像認識を試した時点ではRaspberry Piで処理可能に感じました。
画像認識・・・対象がアップ(画像一面)になっている画像の判定を行う
画像検出・・・対象が写り込んでいる画像より、対象を画像検出する

第一は、技術習得が1番のモチベーションであった、予期しないカメラのズレなどを考えても、画像検出のほうがシステムの安定稼働を望めるので、画像検出実装へ方針転換しました。実際には、画像認識は1日で実装出来たのですが、うまく動作せず、画像認識対象部分の画像切り取りなど、決め打ちの方式しか思いつかず、そうそうに画像検出に方針転換しました。他にも転用出来る素晴らしい技術に出会えたと思います。(Darknet、YOLO、Open CV、Python、DNN、ニューラルネットワーク)

V1での妥協と実装方式

本当は、リアルタイムでの画像検出を実装する予定でした。時間指定で動作するシステムよりもテレビさえ動いていれば、じゃんけんのスタートを自動検知し、結果を漏れなく収集するシステムを構想しました。
しかし、Raspberry Piの処理速度・信頼性より断念しました。画像検出中のRaspberry Piの発熱量など。
よって、V1ではめざましじゃんけん結果の判定の画像検出は、メインのWindowsマシンで実行しております。
めざましじゃんけんのみに特化して考えると、OpenCVの画像処理を駆使すれば軽くて高速なフィルタ作成も可能かなと考えています。

V1機能一覧と実装

機能名実装
画像検出フレームワーク準備学習データ収集Raspberry PiとWEBカメラで、めざましじゃんけん実施時の画面キャプチャー取得
学習データ整理メインのWindowsマシンで実施。
LabelImgで学習したい内容のラベル登録
学習メインのWindowsマシンでDarknetを用いて実施。
システム起動TV起動Raspberry PiよりNature Remo経由で実施。
TVチャネル変更Raspberry PiよりテレビREGZAのWEB APIを用いて実施。
じゃんけん時の「青」「赤」「緑」ボタン操作もRaspberry PiよりWEB APIを用いて実施。
メインマシン起動メインマシン(Windows)の起動をRaspberry Piより実施
画像検出画像蓄積Raspberry PiのWEBカメラを用いて目覚ましテレビの画像をキャプチャー
画像移動Raspberry PiでキャプチャーしたデータをWindowsのメインマインに移動
画像検出Windowsマシンで画像検出を実施。
検出結果結果をDB登録Windowsマシンより画像検出結果をSynology NASのSQL DBへ登録
情報発信WEBコンテンツSQL DB情報よりWEBコンテンツの更新。Synologyで実施。
Twitter発信WEBコンテンツ更新と同じタイミングでTwitter発信を実施。処理はSynologyで実施。

めざましじゃんけん 画像検出システム

めざましじゃんけん結果

テレビ画像よりフジテレビ、めざましテレビ内で実施されるめざましじゃんけんの結果を蓄積します。めざましじゃんけんは、デジタル放送のコンテンツであり、B-CAS(ビーキャス)カードを用いた受信装置により、データ放送を画面表示させ、リアルタイムに参加する必要があります。番組録画しても、データ放送のコンテンツは録画することは出来ません。

  1. 環境準備(インストール)

  2. Darknet/YOLOで学習モデル準備

  3. システム実装と結果公開

  4. プログラム関連技術

本システム実装に関連した、プログラム関係のTips。

    • PHP
    • Python
  1. 【機械学習導入】ニューラルネットワークChainerフレームワーク

    • 導入方法
    • 機械学習
    • Out of Memoryへの対応
    • 学習モデルのRaspberry Piでの実行

フジテレビのめざましじゃんけん画像検出

フジテレビのめざましじゃんけんシステムGo-Live!!
本日分が無事に動いたので、早速公開!
めざましじゃんけん結果一覧はこちら

初めての技術習得が結構多く、開発極小がポリシーなのですが、時間かかりました。各種勉強から初めて3週間弱でしょうか。
7月13日の週末に、関連書籍とWEBカメラをアマゾンで購入していました。

Deep Learning(ディープラーニング、深層学習)DNN(ディープニューラルネットワーク)、AI(人工知能)ML(機械学習)を少し触ってみました。初めての技術ばかりで、ライフのデジタル化計画に有益な技術習得を行いました。

  • Python(初めて扱いました)
  • Python関係画像ライブラリ、OpenCVなど(オープンシーヴィ、Open Source Computer Vision Library)
  • Chainer (チェイナー) ディープラーニングフレームワーク
  • Darknet(ダークネット)YOLO(You Only Look Once)物体検出、オープンソースのニューラルネットフレームワーク

以下サンプル画像です。デジタル放送部分のみなので、著作権には配慮しているつもりです。問題のある際は、ご連絡下さい。大手なので、使用許諾にも時間がかかりそうなので、時間を見つけて画像の使用許諾を考えます。

8月からのブログネタは、このシステム構築に関わる技術内容とする予定です。
次の週末にでも記事を書き溜めます。
さて、次は、、、まだ未定。