コンテンツへスキップ

画像検出率と処理フローで安定稼働(稼働1カ月)

2019年7月29日より稼働し、5週間。合計110回のめざましじゃんけん結果を蓄積しました。(平日25日×4回+土曜5日×2回)
最終週は、処理変更なしに、めざましテレビのめざましじゃんけん生放送中のリアルタイム画像検出を100%稼働させました。
一度しかない生放送、何気なく選んだテーマですが、ぞんぶんに楽しめる開発対象です。
機械学習部分に記事が追い付いてないのですが、現在Darknet / Tiny YOLO3を用いた画像検出を行っております。試行錯誤しておりますが、誤検出は存在してしまいます。
現在は、めざましじゃんけんの生放送に合わせた処理手順と画像検出を合わせて、画像の検出ミス時にも対応可能なシステムとしております。

画像検出と処理フロー

天気予報の晴れマークや気温の羅列、何かしらのテロップやフリップボードなど、予期せぬところで、Janken_Gooとじゃんけんでグーを出したと誤認識されることなどもあります。当初2次元であり難易度は低いと考えておりましたが、実写の報道番組という特性があり、出てくる画像パターンは多岐にわたりました。

現在のめざましじゃんけん画像検出システムは、誤検出が出たとしても、確率的に誤判定が出ないような処理フローとなっております。

Stage0:めざましじゃんけん開始前
Stage1:めざましじゃんけん開始を検出した状態(じゃんけんの手を選択する)
Stage2:出したじゃんけんの手を検出した状態(結果待ちの状態)
Stage3:めざましじゃんけん結果検出状態

めざましじゃんけん処理フロー

システムメインコンポーネント

Intel Neural Compute Stick 2

Movidius Neural Compute Stick 2(NCS2)導入

めざましじゃんけん時に取得したWEBカメラ画像を216枚で画像認識エンジンを動作させた際の性能比較です。
NCS2(Movidius Neural Compute Stick 2)導入により十分高速化された結果となりました。

参考記事:ディープラーニング向けUSBアクセラレーターNeural Compute Stick 2ー

Windows(GPU未使用)
Core i7 6700/(Skylake) クロック周波数:3.4GHz
15秒
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
785秒
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
+ Movidius Vision Processing Unit(Myriad 2)
105秒
2019-08-14 20:34:48,460:202:INFO:ループ開始:D:\pic4ml\Janken_Target_Test\20190806_055717_102196_1.jpg 処理回数:1
2019-08-14 20:35:03,389:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
019-08-14 20:35:03,390:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
2019-08-15 12:11:10,292:202:INFO:ループ開始:/home/miki/cronScript/Janken_Target_Test/20190806_055717_102196_1.jpg 処理回数:1
2019-08-15 12:24:15,786:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
2019-08-15 12:24:15,787:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
2019-08-24 12:16:09,419:202:INFO:ループ開始:/home/miki/cronScript/Janken_Target_Test/20190806_055717_102196_1.jpg 処理回数:1
2019-08-24 12:17:54,200:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
2019-08-24 12:17:54,201:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo

OpenVINO™ toolkit for Raspbianインストール

インストールガイド:Install OpenVINO™ toolkit for Raspbian* OS

導入は簡単です。必要なライブラリをダウンロードし、ダウンロードしたライブラリー群にパスを通すスクリプトを実行して終了です。

Pythonスクリプト側も1行の変更で、無事にMovidius Neural Compute Stick 2(NCS2)の導入が完了しました。

「net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)」の記載を、DNN_TARGET_MYRIADに変更し、実行エンジンの指定を行います。
「net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)」
@raspberrypi:~# mkdir intel
@raspberrypi:~# cd intel/
@raspberrypi:~/intel# wget https://download.01.org/opencv/2019/openvinotoolkit/R2/l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz
--2019-08-19 10:42:59-- https://download.01.org/opencv/2019/openvinotoolkit/R2/l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz
download.01.org (download.01.org) をDNSに問いあわせています... 2600:140b:12:2b0::ae6, 2600:140b:12:29f::ae6, 23.218.7.188
download.01.org (download.01.org)|2600:140b:12:2b0::ae6|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 18637784 (18M) [application/x-gzip]
`l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz' に保存中

l_openvino_toolkit_ 100%[===================>] 17.77M 2.21MB/s 時間 8.5s

2019-08-19 10:43:08 (2.09 MB/s) - `l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz' へ保存完了 [18637784/18637784]

@raspberrypi:~/intel# sudo mkdir -p /opt/intel/openvino
@raspberrypi:~/intel# sudo tar -xf l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz --strip 1 -C /opt/intel/openvino

@raspberrypi:~ $ source /opt/intel/openvino/bin/setupvars.sh
[setupvars.sh] OpenVINO environment initialized
@raspberrypi:~ $ echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc
@raspberrypi:~ $ sudo usermod -a -G users "$(whoami)"
[sudo]パスワード:


miki@raspberrypi:~ $ source /opt/intel/openvino/bin/setupvars.sh
[setupvars.sh] OpenVINO environment initialized
miki@raspberrypi:~ $ sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh
Updating udev rules...
Udev rules have been successfully installed.

Movidius Neural Compute Stick 2(NCS2)

しっかりとした包装で発送されており、製品の質感も良かったです。
発熱する製品なので、Rasberry PiのUSBポートからUSB延長ケーブルを用いて接続しました。
また、電源付きUSBハブ経由だとうまく動作しないケースがあったので、Raspberrypiの本体USBポートよりUSB延長ケーブルでNCS2(Movidius Neural Compute Stick 2)を接続しました。

Intel Neural Compute Stick 2

Yolo3、Tiny-Yolo3での独自学習方法

画像検出に向けて、独自に準備した教師データを用いて、AlexeyAB Darknetを用いて、YOLO3、Tiny-YOLO3で独自学習を行います。
YOLO3とTiny-YOLO3での独自学習時の違いは、独自学習時に指定するコンフィグファイルの違いのみとなります。処理速度と画像検出の違いとなっておりますが、画像検出対象により向き不向きもあると思うので、両方での試行をお勧めします。

また、YOLO2など以前のフレームワークも利用しましたが、画像検出精度や検出速度で、明らかにYOLO3のほうが良いので、学習後のモデル動作環境がYOLO3で問題なければ、YOLO3の利用をお勧めします。

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

前提条件

AlexeyAB Darknetを用いて、YOLO3・Tiny-YOLO3で独自学習に向けた準備

LabelImg利用方法(アノテーション)で準備した、7クラスの学習を行います。
最終的な、独自学習を実行する際のコマンドラインは以下となります。

darknet.exe detector train cfg/obj.data cfg/yolov3-voc-janken.cfg darknet53.conv.74
  1. darknet.exe
    Windows10に AlexeyAB・Darknet・YOLO V3導入(Vestal Studio)でコンパイルした実行ファイル。(「darknet\build\darknet\x64」に格納されています)
  2. obj.data(obj.data内で指定するobj.names)の2ファイル
  3. yolov3-voc-janken.cfg、yolo3, tiny-yolo3向けに事前準備されたモデル定義をコピーして独自学習向けに作成
  4. darknet53.conv.74、学習開始時の初期ウェイトファイル。yolo3とtiny-yolo3では異なるファイルを用います。

obj.dataに、train(学習データー)とvalid(検証データー)のリストを設定します。
このtrainとvalidのファイルリストは、LabelImg利用方法(アノテーション)でラベリングしたフォルダで、以下のスクリプト(process.py)を実行し、自動的に作成します。

process.pyですが、データファイルのパス指定、ファイル名、テストデータの割合を指定します。以下の例では、検証データを全体のファイル数の10%を検証データに指定されています。

import glob, os

# Current directory
current_dir = os.path.dirname(os.path.abspath(__file__))

# Directory where the data will reside, relative to 'darknet.exe'
path_data = 'data/obj/'

# Percentage of images to be used for the test set
percentage_test = 10;

# Create and/or truncate train.txt and test.txt
file_train = open('train.txt', 'w')  
file_test = open('test.txt', 'w')

# Populate train.txt and test.txt
counter = 1  
index_test = round(100 / percentage_test)  
for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")):  
    title, ext = os.path.splitext(os.path.basename(pathAndFilename))

    if counter == index_test:
        counter = 1
        file_test.write(path_data + title + '.jpg' + "\n")
    else:
        file_train.write(path_data + title + '.jpg' + "\n")
        counter = counter + 1
  • train.txt トレーニング用画像ファイル一覧
  • test.txt 検証用画像ファイル一覧

obj.data(obj.data内で指定するobj.names)の2ファイル

「darknet\build\darknet\x64\cfg\obj.data」ファイル

学習クラス数をClassに登録します。作成した、train.txtとtest.txtファイルパスを指定します。
次に作成する、cfg/obj.namesと学習結果を格納するフォルダbackupを指定します。

classes = 7
train = train.txt
valid = test.txt
names = cfg/obj.names
backup = backup/

「darknet\build\darknet\x64\cfg\obj.names」ファイル

学習クラス名一覧を指定します。

janken_active
janken_goo
janken_choki
janken_pa
janken_won
janken_lose
janken_draw

yolov3-voc-janken.cfg、yolo3, tiny-yolo3向けに事前準備されたモデル定義をコピーして独自学習向けに作成

Yolo3向けcfgファイル作成

「darknet\build\darknet\x64\cfg\」フォルダ内の初期ファイルをコピーして、自己学習向けのコンフィグファイルを作成します。yolov3.cfg、yolo-obj.cfgをコピー元ファイルとして、編集するコンフィグファイルを作成します。

  • Batch数を変更します。batch=64
  • Subdivisionsを変更します。subdivisions=8
  • 学習するクラス数に合わせて、最大バッチ回数を指定します。
    学習するクラス数×2000となります。
    7クラスでの学習の際には、max_batches=14000 とします。
  • Stepsを最大バッチ回数の80%と90%になるように修正します。
    最大バッチ回数が14000の場合は、steps=11200,12600とします。
  • 3つある[yolo]レイヤーのClassesを、今回学習させる7に変更します。
  • [yolo]レイヤー直前の[convolutional]レイヤーのfiltersを変更します。
    filtersの値は、(classes + 5)×3とします。
    7クラスの場合は、(7+5)×3=36を指定します。

Tiny-Yolo3向けcfgファイル作成

「darknet\build\darknet\x64\cfg\」フォルダ内の初期ファイルをコピーして、自己学習向けのコンフィグファイルを作成します。yolov3-tiny-obj.cfg、yolov3-tiny_obj.cfgをコピー元ファイルとして、編集するコンフィグファイルを作成します。

yolov3-tiny-obj.cfg based on cfg/yolov3-tiny_obj.cfg

  • Batch数を変更します。batch=64
  • Subdivisionsを変更します。subdivisions=8
  • 学習するクラス数に合わせて、最大バッチ回数を指定します。
    学習するクラス数×2000となります。
    7クラスでの学習の際には、max_batches=14000 とします。
  • Stepsを最大バッチ回数の80%と90%になるように修正します。
    最大バッチ回数が14000の場合は、steps=11200,12600とします。
  • 2つある[yolo]レイヤーのClassesを、今回学習させる7に変更します。
  • [yolo]レイヤー直前の[convolutional]レイヤーのfiltersを変更します。
    filtersの値は、(classes + 5)×3とします。
    7クラスの場合は、(7+5)×3=36を指定します。

学習開始時の初期ウェイトファイル準備

Yolo3向け初期ウェイトファイルダウンロード

https://pjreddie.com/media/files/darknet53.conv.74よりdarknet53.conv.74ファイルをダウンロードします。ダウンロードしたdarknet53.conv.74ファイルが初期ウェイトファイルとなります。

darknet53.conv.74

Tiny-Yolo3向けウェイトファイルダウンロード

https://pjreddie.com/media/files/yolov3-tiny.weightsよりyolov3-tiny.weightsファイルをダウンロードし、darknet.exeおよび標準のcfgファイルを用いて、初期ウェイトファイルを準備します。

darknet.exe partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15

yolov3-tiny.conv.15

AlexeyAB/DarknetでYOLO3トレーニング開始

最初に示したコマンドラインで自己学習を開始します。

darknet.exe detector train cfg/obj.data cfg/yolov3-voc-janken.cfg darknet53.conv.74

Out of Memory

Out of Memoryが出る場合、GPUのメモリ不足となり、設定ファイルの変更が必要となります。設定ファイルで設定した、 subdivisions=16 を「32」や「64」へ変更し実行可能な設定へ変更が必要です。

32の倍数での画像サイズの縮小でも学習時のメモリサイズを減らすことが出来ます。width=256、height=256 などへwidth, heightを変更。

Neural Compute Stick 2 (NCS) による結果検出リアルタイム化V1.1システムアップデート

主な変更点

Raspberry PiにNeural Compute Stick 2を導入。

画像検出速度の飛躍的な向上を実現し、めざましじゃんけん放映時のテレビ画面を用いたリアルタイム画像認識を実現。じゃんけん結果認識直後に、TwitterおよびWEBページに結果を公開。
めざましじゃんけん結果公開までの時間(速さ)で、世界No1を実現。(本家テレビデータ放送を除くWEB分野、個人による調査結果)

  • じゃんけん終了とほぼ同時の結果速報通知(Raspberry Piでの画像検出実施)
    Raspberry Piで画面キャプチャし、Windowsのメインマシンでの画像検出というシーケンス処理からよりリアルタイムな画像検出を実施
  • 試行中じゃんけん出し手の予測エンジンをRaspberry Piで実行

上記より、めざましじゃんけん結果検出時のメインマシンWindows不要化を実現。
機械学習の学習モデル作成時は、GPUが必須であり、Windowsで実施。

V1.1機能一覧と実装(V1からの変更点)

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

システムの主要コンポーネント

Intel Neural Compute Stick 2
SYNOLOGY シノロジー DiskStation DS218j デュアルコアCPU搭載多機能パーソナルクラウド 2ベイNASキット DS218j[DS218J]

画像検出に向けて利用するフレームワーク

本家のDarknetも利用しましたが、特定ケースでの学習失敗やメモリ操作関係の不具合など、私自身も上手く行かないケースも有り、ブログ記事などからもAlexeyABを勧めている内容が多かったので、早い時期よりAlexeyABを導入し利用しております。

AlexeyABのDarknetは、WindowsおよびLinuxのDarknet Yolo v3 & v2のNeural Networks for object detection (Tensor Cores are used)をサポートしております。

AlexeyAB公開サイト

以下、サイトにすべての利用方法が記載されております。関連ソフトのインストール方法や、独自学習の方法など。

Darknetインストール方法

本件も同様ですが、AlexeyABでも2つのインストール方法が紹介されております。
最終的には、Legacy wayのVisual StudioでコンパイルしたDarknetを利用しております。この投稿では、1番めのVCPKGを利用したコンパイル方法を紹介します。

  1. How to compile on Windows (using vcpkg)
  2. How to compile on Windows (legacy way)

GitHUBよりAlexeyAB一式をダウンロードしておきます。
今後の学習モデル作成時などにも利用するフォルダとなるので、それなりの容量の余裕などを考え、各種ファイルを配置して下さい。

VCPKGを利用したDarknetの導入

Visual Studioインストール

Visual Studio CommunityよりVisual Studioをダウンロードしインストールします。

CUDAとcuDNNインストール

NVIDIA cuDNNの入手には、開発コミュニティへの登録が必要であるが、 cuDNNは、機械学習時のGPU-accelerated libraryとなるので、開発者登録を行い、導入しているCUDAと同じバージョンのcuDNNを入手し、入手したファイルをCUDAインストールフォルダに配置しましょう。

gitとcmakeのインストール

Gitおよびcmakeを導入して下さい。
CMakeよりWindows win64-x64 Installerをダウンロードし、インストラーを用いてCMakeをインストールします。

vcpkインストール

Microsoft vcpkへアクセスし、インストールを

  1. Githubからcloneする。
  2. クローンディレクトリの"bootstrap-vcpkg.bat"を実行する。
    ※ ここで、Visual Studioをインストール → "vcpkg.exe"が生成される。
  3. (visual studioに統合する場合)そこのフォルダで管理者権限で cmd を実行して以下のコマンドを入力。
    cmd .\vcpkg.exe integrate install

環境変数「VCPKG_ROOT」「VCPKG_DEFAULT_TRIPLET」を設定

  1. VCPKG_ROOTの環境変数にvcpkgのインストールパスを設定
  2. VCPKG_DEFAULT_TRIPLETの環境変数にx64-windowsを設定

VCPKGで前提ソフトインストール

> cd $env:VCPKG_ROOT
\Git\vcpkg> .\vcpkg.exe install pthreads opencv[cuda,ffmpeg]
The following packages will be built and installed:
* cuda[core]:x64-windows
* eigen3[core]:x64-windows
* libjpeg-turbo[core]:x64-windows
* liblzma[core]:x64-windows
* libpng[core]:x64-windows
opencv[core,cuda,eigen,ffmpeg,flann,jpeg,opengl,png,tiff]:x64-windows
pthreads[core]:x64-windows
* tiff[core]:x64-windows
* zlib[core]:x64-windows
Additional packages (*) will be modified to complete this operation.
Starting package 1/9: zlib:x64-windows
Building package zlib[core]:x64-windows...
Warning: The following VS instances are excluded because the English language pack is unavailable.
D:\Program Files (x86)\Microsoft Visual Studio\2019\Community
D:\Program Files (x86)\Microsoft Visual Studio\2019\Community
Please install the English language pack.
-- Downloading http://www.zlib.net/zlib-1.2.11.tar.gz...
-- Extracting source S:/Public/Documents/Git/vcpkg/downloads/zlib1211.tar.gz
-- Applying patch cmake_dont_build_more_than_needed.patch
-- Using source at S:/Public/Documents/Git/vcpkg/buildtrees/zlib/src/1.2.11-f690224aeb
-- Downloading https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip...
-- Configuring x64-windows
CMake Error at scripts/cmake/vcpkg_execute_required_process.cmake:58 (message):
Command failed: ninja -v
Working Directory: S:/Public/Documents/Git/vcpkg/buildtrees/zlib/x64-windows-rel/vcpkg-parallel-configure
Error code: 1
See logs for more information:
S:\Public\Documents\Git\vcpkg\buildtrees\zlib\config-x64-windows-out.log

Call Stack (most recent call first):
scripts/cmake/vcpkg_configure_cmake.cmake:290 (vcpkg_execute_required_process)
ports/zlib/portfile.cmake:22 (vcpkg_configure_cmake)
scripts/ports.cmake:74 (include)

Error: Building package zlib:x64-windows failed with: BUILD_FAILED
Please ensure you're using the latest portfiles with `.\vcpkg update`, then
submit an issue at https://github.com/Microsoft/vcpkg/issues including:
Package: zlib:x64-windows
Vcpkg version: 2019.07.18-nohash

Additionally, attach any relevant sections from the log files above.

英語の言語パッケージがないと、エラーがでるので英語の言語パッケージをインストールします。

参考URL:https://github.com/Microsoft/vcpkg/issues/1939#issuecomment-354644869

PowershellよりDarknetビルド実行

Powershellのコマンドプロンプトを開き、Darknetをダウンロードしたフォルダで、「./build.ps1」を実行しビルドを実施します。

PS S:\Public\Documents\Git\darknet> .\build.ps1
Found vcpkg in VCPKG_ROOT: S:\Public\Documents\Git\vcpkg\
Found VS in D:\Program Files (x86)\Microsoft Visual Studio\2019\Community
Visual Studio Command Prompt variables set
Setting up environment to use CMake generator: Visual Studio 16 2019
Added missing env variable CUDA_TOOLKIT_ROOT_DIR

ディレクトリ: S:\Public\Documents\Git\darknet

Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2019/07/25 11:23 build_win_release
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
-- The C compiler identification is MSVC 19.21.27702.2
-- The CXX compiler identification is MSVC 19.21.27702.2
-- Check for working C compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.21.27702/bin/Hostx64/x64/cl.exe
-- Check for working C compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.21.27702/bin/Hostx64/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.21.27702/bin/Hostx64/x64/cl.exe
-- Check for working CXX compiler: D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.21.27702/bin/Hostx64/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for a CUDA compiler
-- Looking for a CUDA compiler - NOTFOUND
-- Looking for pthread.h
-- Looking for pthread.h - not found
-- Found Threads: TRUE
-- Found PThreads4W: optimized;S:/Public/Documents/Git/vcpkg/installed/x64-windows/lib/pthreadVC3.lib;debug;S:/Public/Documents/Git/vcpkg/installed/x64-windows/debug/lib/pthreadVC3d.lib
-- Found OpenCV: S:/Public/Documents/Git/vcpkg/installed/x64-windows (found version "3.4.3")
-- Found Stb: S:/Public/Documents/Git/darknet/3rdparty/stb/include
-- Found OpenMP_C: -openmp (found version "2.0")
-- Found OpenMP_CXX: -openmp (found version "2.0")
-- Found OpenMP: TRUE (found version "2.0")
-- ZED SDK not enabled, since it requires CUDA
-- Configuring done
-- Generating done
-- Build files have been written to: S:/Public/Documents/Git/darknet/build_win_release
.NET Framework 向け Microsoft (R) Build Engine バージョン 16.1.76+g14b0a930a7
Copyright (C) Microsoft Corporation.All rights reserved.

Checking Build System
Building Custom Rule S:/Public/Documents/Git/darknet/CMakeLists.txt
yolo_v2_class.cpp
http_stream.cpp
S:\Public\Documents\Git\darknet\src\http_stream.cpp(494,35): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
image_opencv.cpp
S:\Public\Documents\Git\darknet\src\http_stream.cpp(494,35): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(81,39): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(81,39): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(82,48): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(82,48): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(83,49): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
コードを生成中...
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(83,49): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\dark.vcxproj]
activation_layer.c
activations.c
art.c
avgpool_layer.c
batchnorm_layer.c
blas.c
box.c
captcha.c
cifar.c
classifier.c
coco.c
col2im.c
compare.c
connected_layer.c
conv_lstm_layer.c
convolutional_layer.c
cost_layer.c
cpu_gemm.c
crnn_layer.c
crop_layer.c
コードを生成中...
コンパイル中...
dark_cuda.c
data.c
deconvolutional_layer.c
demo.c
detection_layer.c
detector.c
dice.c
dropout_layer.c
gemm.c
getopt.c
gettimeofday.c
go.c
gru_layer.c
im2col.c
image.c
layer.c
list.c
local_layer.c
lstm_layer.c
matrix.c
コードを生成中...
コンパイル中...
maxpool_layer.c
network.c
nightmare.c
normalization_layer.c
option_list.c
parser.c
region_layer.c
reorg_layer.c
reorg_old_layer.c
rnn.c
rnn_layer.c
rnn_vid.c
route_layer.c
scale_channels_layer.c
shortcut_layer.c
softmax_layer.c
super.c
swag.c
tag.c
tree.c
コードを生成中...
コンパイル中...
upsample_layer.c
utils.c
voxel.c
writing.c
yolo.c
yolo_layer.c
コードを生成中...
ライブラリ S:/Public/Documents/Git/darknet/build_win_release/Release/dark.lib とオブジェクト S:/Public/Documents/Git/darknet/b
uild_win_release/Release/dark.exp を作成中
dark.vcxproj -> S:\Public\Documents\Git\darknet\build_win_release\Release\dark.dll
Building Custom Rule S:/Public/Documents/Git/darknet/CMakeLists.txt
darknet.c
activation_layer.c
activations.c
art.c
avgpool_layer.c
batchnorm_layer.c
blas.c
box.c
captcha.c
cifar.c
classifier.c
coco.c
col2im.c
compare.c
connected_layer.c
conv_lstm_layer.c
convolutional_layer.c
cost_layer.c
cpu_gemm.c
crnn_layer.c
コードを生成中...
コンパイル中...
crop_layer.c
dark_cuda.c
data.c
deconvolutional_layer.c
demo.c
detection_layer.c
detector.c
dice.c
dropout_layer.c
gemm.c
getopt.c
gettimeofday.c
go.c
gru_layer.c
im2col.c
image.c
layer.c
list.c
local_layer.c
lstm_layer.c
コードを生成中...
コンパイル中...
matrix.c
maxpool_layer.c
network.c
nightmare.c
normalization_layer.c
option_list.c
parser.c
region_layer.c
reorg_layer.c
reorg_old_layer.c
rnn.c
rnn_layer.c
rnn_vid.c
route_layer.c
scale_channels_layer.c
shortcut_layer.c
softmax_layer.c
super.c
swag.c
tag.c
コードを生成中...
コンパイル中...
tree.c
upsample_layer.c
utils.c
voxel.c
writing.c
yolo.c
yolo_layer.c
コードを生成中...
http_stream.cpp
S:\Public\Documents\Git\darknet\src\http_stream.cpp(494,35): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
image_opencv.cpp
S:\Public\Documents\Git\darknet\src\http_stream.cpp(494,35): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(81,39): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(81,39): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(82,48): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(82,48): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(83,49): warning C4200: 非標準の拡張機能が使用されています: 構造体 または共用体中にサイズが 0 の配列があ
ります。 [S:\Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
コードを生成中...
S:\Public\Documents\Git\darknet\src\image_opencv.cpp(83,49): message : このメンバーは、既定のコンストラクターまたはコピー/移動代入演算子により無視されます [S:\
Public\Documents\Git\darknet\build_win_release\darknet.vcxproj]
darknet.vcxproj -> S:\Public\Documents\Git\darknet\build_win_release\Release\darknet.exe
Building Custom Rule S:/Public/Documents/Git/darknet/CMakeLists.txt
yolo_console_dll.cpp
uselib.vcxproj -> S:\Public\Documents\Git\darknet\build_win_release\Release\uselib.exe
Building Custom Rule S:/Public/Documents/Git/darknet/CMakeLists.txt
yolo_console_dll.cpp
uselib_track.vcxproj -> S:\Public\Documents\Git\darknet\build_win_release\Release\uselib_track.exe
Building Custom Rule S:/Public/Documents/Git/darknet/CMakeLists.txt
-- Install configuration: "Release"
-- Installing: S:/Public/Documents/Git/darknet/dark.lib
-- Installing: S:/Public/Documents/Git/darknet/dark.dll
-- Installing: S:/Public/Documents/Git/darknet/include/darknet/darknet.h
-- Installing: S:/Public/Documents/Git/darknet/include/darknet/yolo_v2_class.hpp
-- Installing: S:/Public/Documents/Git/darknet/uselib.exe
-- Installing: S:/Public/Documents/Git/darknet/darknet.exe
-- Installing: S:/Public/Documents/Git/darknet/uselib_track.exe
-- Installing: S:/Public/Documents/Git/darknet/share/darknet/DarknetTargets.cmake
-- Installing: S:/Public/Documents/Git/darknet/share/darknet/DarknetTargets-release.cmake
-- Installing: S:/Public/Documents/Git/darknet/share/darknet/DarknetConfig.cmake
-- Installing: S:/Public/Documents/Git/darknet/share/darknet/DarknetConfigVersion.cmake

画像検出に向けて利用するフレームワーク

本家のDarknetも利用しましたが、特定ケースでの学習失敗やメモリ操作関係の不具合など、私自身も上手く行かないケースも有り、ブログ記事などからもAlexeyABを勧めている内容が多かったので、早い時期よりAlexeyABを導入し利用しております。

AlexeyABのDarknetは、WindowsおよびLinuxのDarknet Yolo v3 & v2のNeural Networks for object detection (Tensor Cores are used)をサポートしております。

AlexeyAB公開サイト

以下、サイトにすべての利用方法が記載されております。関連ソフトのインストール方法や、独自学習の方法など。

Darknetインストール方法

本件も同様ですが、AlexeyABでも2つのインストール方法が紹介されております。
最終的には、Legacy wayのVisual StudioでコンパイルしたDarknetを利用しております。この投稿では、2番めのLegacy way(Visual Studio)を利用したコンパイル方法を紹介します。

  1. How to compile on Windows (using vcpkg)
  2. How to compile on Windows (legacy way)

GitHUBよりAlexeyAB一式をダウンロードしておきます。
今後の学習モデル作成時などにも利用するフォルダとなるので、それなりの容量の余裕などを考え、各種ファイルを配置して下さい。

Visual Studioを利用したDarknetの導入

CUDA、cuDNN、OpenCVを導入します。

CUDAとcuDNNインストール

NVIDIA cuDNNの入手には、開発コミュニティへの登録が必要であるが、 cuDNNは、機械学習時のGPU-accelerated libraryとなるので、開発者登録を行い、導入しているCUDAと同じバージョンのcuDNNを入手し、入手したファイルをCUDAインストールフォルダに配置しましょう。

OpenCV導入

https://opencv.org/releases/より必要なバージョンをダウンロードし、Windowsの環境変数Pathに「\opencv\build\bin」を追加します。

C:\opencv\bin;それまでの値

Visual Studioよりプロジェクトオープン

GitHUBよりダウンロードしたファイル群のbuild\darknet\darknet.slnをオープン。

コンパイル時のエラー対応

すでに複数バージョンのDarknetをインストールしましたが、何度か同じエラーが出ております。opencvのライブラリー不足です。
おそらく、コードに直接ライブラリ名が記載されております。エラー内容を見て、エラーが示すバージョンのOpencvをセットアップして、再度ビルドを事項して下さい。

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK1104 ファイル 'opencv_world343.lib' を開くことができません。 darknet S:\Public\Documents\Git\darknet\build\darknet\LINK 1

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

Intel Neural Compute Stick 2 - NCS 2 ニューラル ディープラーニング USB スティック

Raspberry PiのCPUでは限界もあり、開発当初よりIntelのディープラーニング向けUSBアクセラレータの「Neural Compute Stick 2」を調べておりました。利用する機械学習のフレームワークややりたいことが定まってから、具体的にどの程度効果が出るのか見極めてからの導入と考えておりました。
Raspberry Piで利用か、Synologyの置き換えとして考えている常時電源ONサーバの追加機能として利用できるなど、利用シーンも様々です。特に、常時電源ONサーバは、GPUを搭載するスロット有りなしでサイズや電源が全く異なるので、このスティックで学習済みモデルのみ動作させることが出来たら便利だなと考えております。

NCS2は、USBタイプの外部演算装置となります。Movidius Neural Compute StickはIntelが開発したUSB接続タイプのディープラーニング用演算装置です。画像の認識や分析に特化したプロセッサ「Movidius Vision Processing Unit(Myriad 2)」が搭載され、ディープラーニングにおける解析処理の際に外部演算装置として使用できます。


USB接続なのでRaspberryPiなどの小型PCでも使えます。演算装置しか持たない環境でも、これを使えばデープラーニングを使った画像解析などが出来るようになります。

このサイトで開発を続けているめざましめざましじゃんけん結果検出システムですが、待ったなしの数十秒の生放送。フリーズしそうな速度で、もっさりと画像認識をしていては、結果取得失敗になる確率を上げてしまいます。

ソフトウェア的に解決を模索しておりますが、気になるハードでも有り、導入を考えてます。(この手の導入検討には波が出ますね)
導入によるメリットは、めざましじゃんけん結果検出時のメインマシンWindowsの完全停止です。

以下は、めざましじゃんけん時に取得したWEBカメラ画像を216枚で画像認識エンジンを動作させた際の性能比較です。52倍の時間差。

Windows(GPU未使用)
Core i7 6700/(Skylake) クロック周波数:3.4GHz
15秒
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
785秒
2019-08-14 20:34:48,460:202:INFO:ループ開始:D:\pic4ml\Janken_Target_Test\20190806_055717_102196_1.jpg 処理回数:1
2019-08-14 20:35:03,389:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
019-08-14 20:35:03,390:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
2019-08-15 12:11:10,292:202:INFO:ループ開始:/home/miki/cronScript/Janken_Target_Test/20190806_055717_102196_1.jpg 処理回数:1
2019-08-15 12:24:15,786:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
2019-08-15 12:24:15,787:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
Intel Neural Compute Stick 2

学習モデル

次週より、システム変更に着手予定です。
めざましじゃんけん関係で、各種技術を深めております。
各種技術情報の詳細は、随時公開を進めます。
良い学習モデルが仕上がりました。現時点では、ベストかなと感じてます。
(8月15日より学習モデルは新バージョンで稼働しており、めざましじゃんけん後の結果公開までを1分30秒ほど短縮しております、限りなくゼロに近づけます。)
今までは、7時58分のジャンケン結果を8時01分31秒にホームページ更新、Twitter投稿から、新エンジンで8時00分00秒にホームページ更新、Twitter投稿に時間短縮。画像検出方法変更のみで1分半ほどの時間短縮を実現しています。
あと1分詰めれば、ジャンケン終了とほぼ同時に結果公開が可能となります。

以下、WindowsマシンでGPUなし、OpenCV dnnで速度測定。

import cv2 as cv
net = cv.dnn.readNetFromDarknet(CFG, MODEL)
net.setPreferableBackend(cv.dnn.DNN_BACKEND_DEFAULT)
net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)

めざましじゃんけんシステムのテスト環境(228枚の画像)

  • 第二世代(現行):109秒、平均99%以上の認識率
  • 開発バージョン1:16秒、平均65%以上の認識率
  • 開発バージョン2(次期本番向け):15秒、平均99%以上の認識率

第二世代(現行)の学習曲線

GPUの容量不足により多くの時間を要しました。検出速度よりも正確さを重視し、システム稼働後に本番システムに導入しました。めざましテレビ終了後よりめざましテレビが始まる時間を利用し、2日間かけて学習させました。

開発バージョン1の学習曲線

速度向上を目的に、追加開発を継続しました。速度は向上しましたが、認識率が一気に下がりました。

開発バージョン2(次期本番向け)

速度、認識率ともに問題なしです。
この学習モデルを本番投入します。
また、このモデルを用いて、Raspberry Piでのオンザフライ(放送中)での結果解析を進めます。現在のメインマシンWindowsからRaspberry Piで動作させた際の速度比較も気になります。

少し甘く見ていた、めざましじゃんけん結果検出システム。
システム構成機器(REGZAテレビ、Raspberry Pi、WEBカメラ、Synology(WEBサーバ、DB))、Windows(Yolo,Darknet,GPU)、自動電源オン、オフ、そして不確定さが増す外部のインターネットサービスTwitter、IFTTT)の多さ、初めての技術、色々バタバタでした。
対象が待ったなしの生放送、デジタル放送部分の録画も出来ずにぶっつけ本番での毎朝じゃんけん初回からのアジャイル開発が忙しかったです。
とりあえず、公開して走りながらのストレッチが大きかったです。
その分、反響もあり、楽しんでます。特に、Twitterで知り合っためざましじゃんけんエキスパートの方との繋がりが、なんとか安定稼働まで早朝開発を続けられたモチベーションとなりました。結果確認やさりげない会話ありがとうございました。
結果、安定起動に乗せることが出来ました。

めざましじゃんけん結果検出システム初日

とりあえずアナウンスしたものの、初日の最終じゃんけんでは、テレビ電源Off状態で結果取得失敗。初回から想像以上に正常動作したので、安心しすぎたのかもしれません。最低限の機能で、メインパスのみを開発した状態でのスタートでした。
めざましじゃんけん結果取得Go-Live!

第1週目

追加機能

  • めざましじゃんけん結果のTweet(今の時代は検索エンジンよりもTweetの影響力に驚いておりますSEO観点)
  • フジテレビのめざましテレビTweetより、めざましじゃんけん対戦相手情報の取得とデータ蓄積(不定形なフォーマットで苦しんでます。数字や空白の半角、全角、句読点などなど、担当の方が頑張って手動でTweetされているのだと思います。頑張れ!!)
  • 本ブログへの結果公開ページ更新

トラブル

  • Twitterに慣れておらず、ハッシュタグや文字数制限など、Tweet毎にエラーを見て、Tweet内容の変更対応
  • フジテレビ様の公式アカウントのめざまし土曜日のじゃんけん時間がホームページと異なり、エラー発生
  • 複数回の画像誤検出

第2週目

初回のGo-Live記事に画像認識結果を掲載しておりますが、画像検出確度は78%、81%程度でした、誤検出もあり、1週目も手動介入が合計で5回以上は入っておりました。特定パターンでの失敗が見えていたので、運用回避などを行ってました。
毎日学習データを増やし、追加学習を繰り返しました。しかし、改善も見られず、6日(火曜日)時点では、一度サービス中止し、画像検出方法の再点検が必要と考えておりました。

追加機能

  • Twitter関係微修正(ハッシュタグでハイフン(ー)は利用不可など)
  • Twitter投稿をIFTTT経由から独自モジュールに変更
    (汎用的な内容であり、Twitter側の仕様変更などもあり最新情報を知りたい方もいらっしゃると思うので、記事公開順序を繰り上げて内容を公開予定)
  • Darknet学習モジュール変更
    →十分な学習状態出ない状態で水曜日より本番投入、追加学習を得て木曜日時点では、100%近い検出率

トラブル

  • 誤検出による結果取得失敗
  • 学習データ・教師データの間違い発見
    (これは、週末時点で修正、その後も検出率が上がらず、手詰まりでした)

今後の計画

機械学習を勉強してみて、奥の深さに関心しております。
毎日続く分かりやすい題材でも有り、もう少しめざましじゃんけん結果検出システム関係で、技術探求を行います。
全く、未定ですが、処理速度向上、Raspberry Piのような小さなエンジンでの実行。

この2週間は、あまり新規技術や分野へ取り組めていないのですが、やはりじゃんけん結果の予測が気になっておます。RNN(リンカレントニュートラルネットワーク)という時系列向けの機械学習を習得必要もあり、予測対象コンテンツと技術内容にも興味が大きいので、少しWEBで技術内容を調べ始めてます。
めざましじゃんけん自体を楽しみにされている方が多いので、事前に予測結果を公開する気にはなれませんが。
人間の感覚や判断に近い内容の、違和感なく生活に溶け込むようなIT利用を目指そうと思います。

YOLO/Darknetの学習向け教師データ準備

「教師データの間違いはないように!」

画像検出や画像認識では、教師データが必要となります。対象の難しさにもよりますが、数百・数千枚という画像が必要となります。
本サイトで紹介しているめざましじゃんけん画像検出システムでは、YOLO/Darknetを利用しており、教師データのラベリングに、LabelImgを利用しました。

ラベリングのイメージですが、左の画像において、この対象が「janken_won」ですよ、この対象が「janken_goo」ですよと、実際の画像を用いて、検出させたい対象にレベルをつけて、機械学習時の教師データとして登録します。

一つの画像ファイルに、一つのラベリング情報を記録したテキストファイルを準備します。
以下が、ラベリング情報を記載したテキストファイルとなります。

オブジェクト(クラス)番号 オブジェクトの中心X座標 オブジェクトの中心Y座標 オブジェクトの幅 オブジェクトの高さ
3 0.501563 0.351042 0.365625 0.056250
6 0.571875 0.303125 0.140625 0.031250

クラス番号は、「janken_won」や「janken_goo」などの学習対象の分類番号となります。LabelImgを利用する際は、「classes.txt」というファイルを作成し、学習させたい対象の定義を行います。

LabelImgインストール

インストール方法は、色々な方法があります。
準備したPythonの実行環境にも依存すると思います。

  • Anaconda環境への導入
  • 通常のWindows環境へ導入

ここでは、通常のWindows環境への導入方法を紹介します。

PythonをWindows環境にインストールします。リンクより必要ファイルをダウンロードし、インストールを実行して下さい。
インストールしたPythonのpip3コマンドを用いて、「PyQt5」および「lxml」をインストールします。

C:\Users\user\AppData\Local\Programs\Python\Python37>pip3 install pyqt5
Collecting pyqt5
Downloading https://files.pythonhosted.org/packages/3b/d3/76670a331935f58f9a2ebd53c6e9b670bbf15c458fa6993500af5d323160/PyQt5-5.13.0-5.13.0-cp35.cp36.cp37.cp38-none-win_amd64.whl (49.7MB)
100% |████████████████████████████████| 49.7MB 128kB/s
Collecting PyQt5_sip<13,>=4.19.14 (from pyqt5)
Downloading https://files.pythonhosted.org/packages/cf/c8/1e9eda4ba09a84fc528d4c87001de2d7a8cbbe04c2a834af3eb81a0ecd88/PyQt5_sip-4.19.18-cp37-none-win_amd64.whl (51kB)
100% |████████████████████████████████| 61kB 6.8MB/s
Installing collected packages: PyQt5-sip, pyqt5
Successfully installed PyQt5-sip-4.19.18 pyqt5-5.13.0

C:\Users\user\AppData\Local\Programs\Python\Python37>pip3 install lxml
Collecting lxml
Downloading https://files.pythonhosted.org/packages/c6/22/a43126b87020c325fac159bb3b7f4e7ea99e7b2594ce5b8fa23cfa6ee90d/lxml-4.3.4-cp37-cp37m-win_amd64.whl (3.6MB)
100% |████████████████████████████████| 3.6MB 6.9MB/s
Installing collected packages: lxml
Successfully installed lxml-4.3.4

GitHubよりLabelImgをダウンロードし、https://github.com/tzutalin/labelImg

labelImg-master.zipを解凍したフォルダまたはGitHubをクローンしたフォルダへコマンドラインで移動し、以下のコマンドを実行します。

pyrcc5 -o line/resources.py resources.qrc

インストールは以上となります。

LabelImg起動

以下のコマンドラインより、LabelImgを起動します。
1行目も2行目も起動コマンドとなります。
IMAGE_PATHには、学習対象画像フォルダ、PRE-DEFINED CLASS FILEには、学習させたい対象の分類(クラス)定義ファイル「classes.txt」を指定します。

python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]

めざましじゃんけん画像システムの「classes.txt」は、以下となっております。
上からゼロとなり、クラス0がjanken_active、クラス1がjanken_goo、・・・、クラス6がjanken_drawと全7クラスを画像検出対象としています。

janken_active
janken_goo
janken_choki
janken_pa
janken_won
janken_lose
janken_draw

LabelImgの利用方法は、画像つきで各種サイトで紹介されております。
特に共有しておきたいポイントは、以下です。

  • YOLO向けのテキストファイル出力を設定する
  • 絶対にラベル指定を間違えない
  • 「D」「W」「A」のショートカットキーを利用する
  • 基本的に「Auto Save Mode」「Single Class Mode」でラベリングを基本に作業実施

ラベリングが完了すると、用意した画像ファイルと対にラベリング情報の記載されたテキストファイルが作成されます。

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

機械学習に必要なアノテーションツールをwindowsにインストールする方法

labelImgとChainerCVを使ってアノテーション作業を楽にする