コンテンツへスキップ

メインサーバー Synology

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

機種のモデルアップか、自作小型サーバ導入か検討中。

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

Shuttle Intel H270 Expressチップセット搭載XH270

今のWindowsメインマシンもShuttleを利用しております。マザーボード、電源などは変更していますが、 もうすぐ10年です。Shuttle SG41J1を利用しております。
仕様要件として、Synologyと同様に信頼性が一番高くなります。よって、ディスクのRAID化必須となります。各種ベアボーンが製品化されており、PC自作派には嬉しい時代なのですが、意外とないのが、省スペース筐体での複数SATAサポート。SATA1台とM.2のPCI-ExpressによるSATA構成が多いと思います。

  • Shuttle Intel H270 Expressチップセット搭載XH270
    • 搭載CPU:ソケット1151
    • 対応メモリ:DDR4 2133/2400MHz SO-DIMM ×2 (最大容量32GB)
    • オーディオ機能:5.1チャンネル HDオーディオ
    • ネットワーク機能:有線LAN : 1000BASE-T/100BASE-TX/10BASE-T対応
    • ドライブベイ:4 / 2.5インチ (9.5mm厚まで)
    • 拡張スロット:M.2 Type2242/2260/2280 M key (PCI-Express x4,SATA 6GB/s対応) / M.2 Type2230 AE key (PCI-Express x1,USB2.0対応)
CPUとメモリは、以下ぐらいを選ぶと思います。トータルで7万円ぐらいにはなりますね。
  • INTEL インテル Core i3-9100F
  • Crucial [Micron製] DDR4 ノート用メモリー 8GB x2 
  • Crucial SSD 1000GB MX500 内蔵2.5インチ 7mm MX500 ✕2台

残りのSATA2台分は、容量大きめのSATA HDDを導入すると思います。

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]

 

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で動作させた際の速度比較も気になります。

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

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

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

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

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

めざましじゃんけん結果
回次結果対戦相手
8月17日
(土曜日)
【2戦目】08時21分三吉彩花さん ムロツヨシさん
【1戦目】07時22分大野将平選手
8月16日
(金曜日)
【4戦目】07時58分生じゃんけん!横山ルリカ リポーター
【3戦目】07時35分乃木坂46
【2戦目】06時58分小籔千豊さん
【1戦目】05時58分まちかどじゃんけん
8月15日
(木曜日)
【4戦目】07時58分信太昌之さん、マルシアさん
【3戦目】07時35分渋野日向子選手
【2戦目】06時58分和田優希さん、中村浩大さん
【1戦目】05時58分まちかどじゃんけん
8月14日
(水曜日)
【4戦目】07時58分大島美幸さん ちびまる子ちゃん
【3戦目】07時35分井上清華アナウンサー
【2戦目】06時58分横山裕さん
【1戦目】05時58分まちかどじゃんけん
8月13日
(火曜日)
【4戦目】07時58分生じゃんけん!梶裕貴さん
【3戦目】07時35分村上信五さん
【2戦目】06時58分黒木瞳さん
【1戦目】05時58分まちかどじゃんけん
8月12日
(月曜日)
【4戦目】07時58分丸山隆平さん
【3戦目】07時35分山口智子さん
【2戦目】06時58分モンキー・D・ルフィ
【1戦目】05時58分まちかどじゃんけん

Twitterの影響力

WEBページのアクセスログを見ていると、Twitterからの訪問者が多く関心しています。昔のSEOとはかなり異なるなと体感しております。

システム公開後、数日後よりIFTTTを使ってTwitterへめざましじゃんけんの結果のTweetを開始しました。
当初、ホームページへの結果更新のついでにTwitterへ投稿をポストするぐらいの、ついで処理だったのですが、SNSらしいコミュニケーションがあったりと、文字数制限やハッシュタグなど各種成約の基で的確に内容を伝えるなど、Twitterワールドに興味を持ちました。(IFTTTでも問題なく投稿できます、ただ、自分でのTwitterアプリ作成が気になったので、PHPからのTweetを実装しました)

Twitterへアプリ登録。(PHPから実行時に必要となる、API Key、API Secret Key、Access Token、Access Token Secretの取得を行います

PHPからTwitterへの操作は、TwitterOAuthというライブラリを用います。

  1. Twitterへの開発者登録とApp登録
  2. TwitterOAuth導入

Twitterへの開発者登録とApp登録

Twitterの以下のURLへアクセスし、登録をすすめます。

上のURLよりサービスにログインします。

ログイン後の画面です。右上の「Create an app」をクリックします。

「Create an app」を押すと、最初に開発者アカウントへの登録へ誘導されます。

一番の開発理由を聞かれます。「Professional」これは通常ビジネス目的、「Hobbyist」趣味なので、個人利用は通常このカテゴリとおもいます。
今回は、API経由でTweet・Postを行いたいので、Making a botを選択しました。BOTの作成。

アカウント情報の確認をされました。通常問題ないと思います。

1,居住国、2.呼び名を聞かれました。それぞれ、Japanと「(適当に)mikiie」と登録しました。

アプリの説明をフリーフォーマットで記載しました。
WEB翻訳などで準備した内容を貼り付ければOKです。

追加の質問事項に回答します。
Twitter情報を分析Analyzeするか? Tweet,Retweet, Like, Followなどを実施するか?
また、フリーフォーマットで、開発対象の機能内容の記載が必要でした。

これまでに記載や選択した内容のサマリ画面が表示され、間違いがないか確認を行い、「Looks good!」を選択します。

最後に利用規約に同意し、Submit Application(申請を送信)すると、利用申請の結果がメールで届きます。

利用申請後に着信した利用申請結果メールのリンクよりアクセスすると、Welcome画面が表示されます。

開発登録者完了後に、Create an appを実施するとアプリの作成が行えます。
コールバックURLを登録する必要がありまうが、PHPが動作するサーバで問題ないとおもますので、http://127.0.0.1/と登録しておけば問題ないです。

最後に、Keys and TokensでアプリのAPI Keysを取得します。
(API Key、API Secret Key、Access Token、Access Token Secretの取得を行います

TwitterOAuth導入

TwitterOAuth

GitHub-twitteroauth

V1.1 Source code (tar.gz)

TwitterOAuthをダウンロードし、PHPを利用したいサーバに配置します。

  1. ライブラリのダウンロード
  2. tar.gzの解凍
  3. フォルダ名の変更
$ curl -OL https://github.com/abraham/twitteroauth/archive/1.0.1.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 127 0 127 0 0 285 0 --:--:-- --:--:-- --:--:-- 294
100 714k 0 714k 0 0 475k 0 --:--:-- 0:00:01 --:--:-- 1674k

$ tar -zxvf 1.0.1.tar.gz
$ mv twitteroauth-1.0.1/ twitteroauth/

以下、一番簡単なサンプルPHPです。

<?php
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

$consumerKey = "your consumer key";
$consumerSecret = "your consumer secret";
$accessToken = "your access token";
$accessTokenSecret = "your access token secret";

$twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

$result = $twitter->post(
        "statuses/update",
        array("status" => "Tweetテスト")
);

if($twitter->getLastHttpCode() == 200) {
    print "tweeted\n";
} else {  &nbsp; 
 &nbsp;  print "tweet failed\n";
}
以下が私が作成したスクリプトです。
  • 利用したいハッシュタグを配列登録 (ランダムで選択)
  • 280バイト(日本語140文字)対応
    文字数に関しては、投稿できる文字数が多くなっているようです。
    $max_char = 280 + $url_char - 11.5;の「$max_char」を大きくして、投稿可能な最大文字数を確認してください。
  • ハッシュタグの「ー(ハイフン)」を「_(アンダースコアー)」へ
  • URL1件投稿時の最大文字数対応(必要に応じてハッシュタグ部分を削減で対応)
  • めざましじゃんけん固有
    • DBより最新のめざましじゃんけん結果を取得
    • ハッシュタグ時に不要なキーワードを削除
      「アナウンサー」「○○さん」「生じゃんけん!」
<?php
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
define("TARGET_TWEET",0);
##TARGET_TWEET 0 is newest record
$host_name = '127.0.0.1:3307';
$user_name = '@DB_User@';
$password = '@DB_Pass@';
$database_name ='@DB_Name@';
$table_name = '@DB_Table@';

function postTweet($value1, $value2) {
    $consumerKey = "@consumerKey@";
    $consumerSecret = "@consumerSecret@";
    $accessToken = "@accessToken@";
    $accessTokenSecret = "@accessTokenSecret@";
    $tweet_text = $value1.PHP_EOL.$value2;
    //文字数 URL=11.5文字、全角140文字、半角のみ280文字
    $url_char = strlen('https://www.miki-ie.com/mezamashi-jyanken/');
    $max_char = 280 + $url_char - 11.5;
    while(strlen($tweet_text) > $max_char){
        $tweet_text = mb_strrchr($tweet_text,'#',true,'UTF-8');
    }
    $twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
    $result = $twitter->post(
     "statuses/update",
             array("status" => $tweet_text)
                );
    if($twitter->getLastHttpCode() == 200) {
        return true;
    } else {
        return false;
    }
}

$mysqli = new mysqli($host_name, $user_name, $password, $database_name);
if ($mysqli->connect_error) {
echo$mysqli->connect_error;
exit();
} else {
$mysqli->set_charset("utf8");
}
$table = "";
$sql = "SELECT id, times, tv, who FROM janken order by datetime desc limit 30";
if ($result = $mysqli->query($sql)) {
    $result = $mysqli->query($sql);
    $counter = 0;
while ($row = $result->fetch_assoc()) {
        if ($counter == TARGET_TWEET){
            $value1 = "【".$row["times"]."戦目】めざましじゃんけん結果速報:".PHP_EOL;
            if($row["tv"] == 1){
                $value1 = $value1."グー(Goo)"."でした。パーが勝ちです。";
            }elseif($row["tv"] == 2){
                $value1 = $value1."チョキ(Chyoki)"."でした。グーが勝ちです。";
            }else{
                $value1 = $value1."パー(Pa)"."でした。チョキが勝ちです。";
            }
            $value1 = $value1.PHP_EOL."今回の相手:".$row["who"];
            $who = $row["who"];
            $num_week = date('w', strtotime($row["datetime"]));
        }
        $counter++;
}
$result->close();
}
$mysqli->close();

$who = str_replace('さん','',$who);
$who = str_replace('アナウンサー','',$who);
$who = str_replace('リポーター','',$who);
$who = str_replace('キャスター','',$who);
$who = str_replace('生じゃんけん!','',$who);
//全角スペースを半角スペースに変換、句読点やカッコも半角スペースに変換
$who = str_replace(' ', ' ', $who);
$who = str_replace('、', ' ', $who);
$who = str_replace('(', ' ', $who);
$who = str_replace(')', ' ', $who);
//前後のスペース削除
$who = trim($who);
//連続する半角スペースを半角スペースひとつに変換
$who = preg_replace('/\s+/', ' ', $who);
//半角スペースで分割
$whos = explode(' ',$who);
$addhash = "";
if($num_week == 6) $addhash = " #めざましどようび";
foreach($whos as $this_who){
    $this_who = str_replace('-', '_', $this_who);
    $addhash = $addhash." #".$this_who;
}
$addhash2 = "";
$addhash_ary = array("機械学習", "AI", "深層学習", "DNN", "Darknet", "YOLO", "mikiie", "みきいえ", "ニューラルネットワーク");
shuffle($addhash_ary);
foreach($addhash_ary as $this_hash){
    $addhash2 = $addhash2." #".$this_hash;
}
$value2 = "By https://www.miki-ie.com/mezamashi-jyanken/".PHP_EOL." #めざましじゃんけん #めざましテレビ #人工知能".$addhash.$addhash2." ";
postTweet($value1, $value2);
?>

少し甘く見ていた、めざましじゃんけん結果検出システム。
システム構成機器(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利用を目指そうと思います。

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

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

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

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

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

めざましじゃんけん結果
回次結果対戦相手
8月10日
(土曜日)
【2戦目】08時21分生じゃんけん!WANIMA
【1戦目】07時22分安田章大さん
8月09日
(金曜日)
【4戦目】07時58分生じゃんけん!ユースケ・サンタマリアさん 指原莉乃さん 山里亮太さん(南海キャンディーズ)
【3戦目】07時35分錦戸亮さん
【2戦目】06時58分ネプチューン
【1戦目】05時58分まちかどじゃんけん
8月08日
(木曜日)
【4戦目】07時58分モンキー・D・ルフィー
【3戦目】07時35分どんぐりさん
【2戦目】06時58分林蓮音さん、松尾龍さん
【1戦目】05時58分まちかどじゃんけん
8月07日
(水曜日)
【4戦目】07時58分ユースケ・サンタマリアさん
【3戦目】07時35分大倉忠義さん
【2戦目】06時58分Da-iCE
【1戦目】05時58分まちかどじゃんけん
8月06日
(火曜日)
【4戦目】07時58分生じゃんけん!梶裕貴さん
【3戦目】07時35分指原莉乃さん
【2戦目】06時58分三浦春馬さん
【1戦目】05時58分まちかどじゃんけん
8月05日
(月曜日)
【4戦目】07時58分山里亮太さん
【3戦目】07時35分尾崎世界観さん
【2戦目】06時58分戸次重幸さん
【1戦目】05時58分まちかどじゃんけん

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での実行