コンテンツへスキップ

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を変更。

2019年08月27日 めざましじゃんけん結果

個人の実験的な試行内容であり、めざましじゃんけんの結果を保証したり、全ての結果が記載を保証するものではありません。

2019年08月27日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
8月27日
(火曜日)
【4戦目】07時58分生じゃんけん!梶裕貴さん
【3戦目】07時35分比嘉愛未さん
【2戦目】06時58分生じゃんけん!酒井唯菜さん(2020ミス・ティーン・ジャパン)
【1戦目】05時58分まちかどじゃんけん

ASRock の DeskMini 310 Series

少し前に、Shuttleの2.5インチドライブを4つ搭載可能なベアボーンを紹介しましたが、 Intel® H310チップセット搭載で、2.5インチドライブを2つ搭載可能なベアボーンに魅力を感じております。
参考記事:RAID対応ShuttleベアボーンXH270

メインサーバー Synology

  • 動作がもっさりすることがある
  • 特に、一番しっかりしてほしいWEBサーバーの動きがもっさり
    WEB APIのタイムアウトやWEBサイトへのアクセス不通

WordPressおよびDB(SQL)向けサーバを準備したいなと考えております。
よって、大容量が必要なNASはSynology。
CPU処理速度と十分なメモリ容量、そして少ない電力と考えていると今回のASRockのDeskMini 310 SeriesのASRock Intel H310ベアボーンが出てきました。

  • Synology DiskStation DS218j 2ベイ
    • 1.3GHzデュアルコアCPU
    • 512MB DDR3メモリ搭載

ASRock Intel H310ベアボーン

Mini-STX 、ミニ・ソケット・テクノロジー・エクステンデッド(Mini Socket Technology Extended)(Mini-STX)フォームファクタにより Intel® LGA 1151 ソケットベースの Intel® プロセッサー対応、Intelのデスクトップ向けCPUを搭載できるので、費用対効果の良いCore™ i3 プロセッサーを利用できます。

  • Supports Intel® 9th/8th Core™ / Pentium® / Celeron® LGA1151 processors
  • 2 x SO-DIMM DDR4-2666MHz, Max. 32GB (non-ECC)
  • 3 つのビデオ出力: DisplayPort、HDMI、D-Sub
  • 1 x Ultra M.2 PCIe Gen3 x4 スロット
  • 2 x 2 x 2.5" HDD/SSD トレイ
  • 1 x M.2 (2230) Wi-Fi スロット
  • USB 3.1 Gen1 Type-C ポート
  • Micro SD カードリーダー
CPUとメモリは、RAID対応ShuttleベアボーンXH270で紹介した製品を選ぶとして、ディスクは、信頼性を上げたいので2.5インチHDDを選ぶと思います。4万円前後で購入可能と思います。
(ShuttleベアボーンXH270構成:トータルで7万円ぐらいでした)
  • INTEL インテル Core i3-9100F
  • Crucial [Micron製] DDR4 ノート用メモリー 8GB x2 
  • 東芝 2.5インチ 1TB MQ01ABD100 SATA✕2台

ASRock DeskMini 310/B/BB/JP Intel H310チップセット搭載 Mini-STXフォームファクタ採用ベアボーンPC
intel MM999J4X Core i3-9100F LGA1151(INT-BX80684I39100F)
CFD W4N2400CM-8G Crucial スタンダードモデル DDR4-2400 ノート用メモリ 260pin SO-DIMM 8GB 2枚組

もちろん、Synologyも簡単にサーバー運用が出来るので、おすすめです。

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

2019年08月26日 めざましじゃんけん結果

個人の実験的な試行内容であり、めざましじゃんけんの結果を保証したり、全ての結果が記載を保証するものではありません。

2019年08月26日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
8月26日
(月曜日)
【4戦目】07時58分宮野真守さん、梶裕貴さん
【3戦目】07時35分山﨑賢人さん、新田真剣佑さん、永野芽郁さん
【2戦目】06時58分森本慎太郎さん
【1戦目】05時58分まちかどじゃんけん

テレビの電源オンオフ

他のリモコン操作の家電も同様ですが、現在の状態把握が難しいです。NatureRemoで電源オンとスケジュールしていても、実際は、電源ボタンを押すのみで、電源が消えていれば、電源ボタン操作で電源がオンとなりますが、電源オン状態であれば、電源操作により電源オフ状態と期待通りになりません。

HDMI接続によるCEC(Consumer Electronics Control)

結構盲点でした、物理的にテレビに接続し、制御可能なデバイスが既に導入されていたとは。Raspberry PiのHDMI端子を活用し、テレビのON/OFF(STANDBY)変更操作となります。電源のON/OFF(STANDBY)状況を確認することも可能です。

HDMIのCEC(Consumer Electronics Control)は、機器間を制御するリンク機能となり、SONYだとブラビアリンク、東芝だとレグザリンク、パナソニックだとビエラリンク、SHARPだとAQUOSファミリンクとなります。

cec-utilsインストール

@raspberrypi:~ $ sudo apt-get update
@raspberrypi:~ $ sudo apt-get upgrade -y
@raspberrypi:~ $ sudo apt-get install cec-utils -y

Raspberry Piの電源起動時に、TVの入力が切り替わったり、TVの電源が入らないよいうに、boot/config.txthdmi_ignore_cec_init=1を追記します。

@raspberrypi:~ $ vi /boot/config.txt
@raspberrypi:~ $ sudo vi /boot/config.txt
@raspberrypi:~ $ tail /boot/config.txt
#dtoverlay=vc4-fkms-v3d

# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
start_x=1
gpu_mem=128

#add
hdmi_ignore_cec_init=1

cec-utilsコマンド実行

状態確認:sudo cec-client -l

HDMIケーブル未接続時

@raspberrypi:~ $ sudo cec-client -l
libCEC version: 4.0.4, compiled on Linux-4.15.0-48-generic ... , features: P8_USB, DRM, P8_detect, randr, RPi, Exynos, AOCEC
Found devices: NONE

HDMIケーブル接続時

@raspberrypi:~ $ sudo cec-client -l
libCEC version: 4.0.4, compiled on Linux-4.15.0-48-generic ... , features: P8_USB, DRM, P8_detect, randr, RPi, Exynos, AOCEC
Found devices: 1

device: 1
com port: RPI
vendor id: 2708
product id: 1001
firmware version: 1
type: Raspberry Pi

TV電源ON:echo 'on 0' | cec-client -s

アクセス権によりコマンド失敗

@raspberrypi:~ $ echo 'standby 0' | cec-client -s
* failed to open vchiq instance

アクセス権を変更変更

@raspberrypi:~ $ ls -al /dev/vchiq
crw-rw---- 1 root video 243, 0 8月 18 09:38 /dev/vchiq
@raspberrypi:~ $ sudo chmod 666 /dev/vchiq
@raspberrypi:~ $ ls -al /dev/vchiq
crw-rw-rw- 1 root video 243, 0 8月 18 09:38 /dev/vchiq

tvserviceが起動していてコマンド失敗

tvservice --offが必要

TV電源OFF:echo 'standby 0' | cec-client -s

PHPから実行

function tv_on_HDMI()
{
    exec("echo 'on 0' | cec-client -s -d", $output, $result);

    if ($result) {
        echo "echo 'on 0' | cec-client -s 成功", PHP_EOL;
    } else {
        echo "echo 'on 0' | cec-client -s 失敗", PHP_EOL;
        echo implode(PHP_EOL, $output);
	}
    return $result;
}

function tv_off_HDMI()
{
    exec("echo 'standby 0' | cec-client -s", $output, $result);

    if ($result) {
        echo "echo 'standby 0' | cec-client -s 成功", PHP_EOL;
    } else {
        echo "echo 'standby 0' | cec-client -s 失敗", PHP_EOL;
        echo implode(PHP_EOL, $output);
	}
    return $result;
}

tv_on_HDMI();
tv_off_HDMI();

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

Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する

RaspberryPi コマンドでテレビ電源をオンオフする(cec制御)echo 'on 0' | cec-client -s

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]

2019年08月19日週 めざましじゃんけん結果

個人の実験的な試行内容であり、めざましじゃんけんの結果を保証したり、全ての結果が記載を保証するものではありません。

2019年08月19日週 のめざましじゃんけんの結果をベストエフォートで公開します。

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
8月24日
(土曜日)
【2戦目】08時21分丸山城志郎選手
【1戦目】07時22分飯尾和樹さん(ずん)
8月23日
(金曜日)
【4戦目】07時58分佐々木希さん
【3戦目】07時35分髙藤直寿 選手
【2戦目】06時58分ローラさん
【1戦目】05時58分まちかどじゃんけん
8月22日
(木曜日)
【4戦目】07時58分加藤諒さん
【3戦目】07時35分阿部詩選手
【2戦目】06時58分林蓮音さん、和田優希さん
【1戦目】05時58分まちかどじゃんけん
8月21日
(水曜日)
【4戦目】07時58分生じゃんけん!軽部真一アナウンサー
【3戦目】07時35分ウルフアロン選手
【2戦目】06時58分TAKAHIROさん 市原隼人さん 岡田義徳さん
【1戦目】05時58分まちかどじゃんけん
8月20日
(火曜日)
【4戦目】07時58分生じゃんけん!梶裕貴さん
【3戦目】07時35分朝比奈沙羅選手
【2戦目】06時58分高嶋政伸さん
【1戦目】05時58分まちかどじゃんけん
8月19日
(月曜日)
【4戦目】07時58分超特急
【3戦目】07時35分芳田司 選手
【2戦目】06時58分上野樹里さん
【1戦目】05時58分まちかどじゃんけん

2019年08月24日 めざましじゃんけん結果

個人の実験的な試行内容であり、めざましじゃんけんの結果を保証したり、全ての結果が記載を保証するものではありません。

2019年08月24日のめざましじゃんけんの結果をベストエフォートで公開します。

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
8月24日
(土曜日)
【2戦目】08時21分丸山城志郎選手
【1戦目】07時22分飯尾和樹さん(ずん)

SynologyのphpMyAdminセッションタイムアウト変更

phpMyAdminの設定ファイル「config.inc.php」を変更します。
具体的には、「config.inc.php」の最終行に、設定したいタイムアウト値を秒指定で登録します。
$cfg['LoginCookieValidity'] = 86400; //タイムアウト24時間と設定する場合

@Synology:~$ sudo vi /volume1/web/phpMyAdmin/config.inc.php
Password:
@Synology:~$ tail /volume1/web/phpMyAdmin/config.inc.php
* default = 'ask'
*/
//$cfg['SendErrorReports'] = 'always';

/**
* You can find more configuration options in the documentation
* in the doc/ folder or at <https://docs.phpmyadmin.net/>.
*/
$cfg['LoginCookieValidity'] = 86400; //24時間

2019年08月23日 めざましじゃんけん結果

個人の実験的な試行内容であり、めざましじゃんけんの結果を保証したり、全ての結果が記載を保証するものではありません。

2019年08月23日のめざましじゃんけんの結果をベストエフォートで公開します。

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
8月23日
(金曜日)
【4戦目】07時58分佐々木希さん
【3戦目】07時35分髙藤直寿 選手
【2戦目】06時58分ローラさん
【1戦目】05時58分まちかどじゃんけん