コンテンツへスキップ

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

本家の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

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

WordPress利用時のTwitterカード

「Wordpress」を利用している際は、「All in One SEO」プラグインを利用するとソーシャル設定が簡単に実施できます。Twitter向けにカードタイプの指定やカスタムTwitter画像設定も簡単に設定できます。

All in One SEOを導入し、各投稿画面の「ソーシャル設定」画面で、Twitterの関連箇所を設定します。

Twitterサービス上のTwitterカード情報の更新

Twitterで投稿をPOST時に、URLが記載されていると、Tweetの下部に記載したURLのイマージ画像やページサマリが表示されます。これが、Twitterカードとなります。
Twitterカードが適切に表示されると、テキストだけよりもインパクトがり、注目を集めやすいです。

Twitterカードで指定している画像の変更や、サマリ部分の文章を変更した際に、誤字脱字等のケースも有り、すぐに最新の情報に更新したい場合があります。
通常は、週次でキャッシュの更新処理を行っているようなので、しばらく時間を置けば最新の情報にTwitterカードは更新されるようです。

強制的にTwitterカードをリフレッシュするには、以下のリンク(Card Validator)より対象のURLのTwitterカードを手動で表示させ、内容を更新させて下さい。

画像ファイルを変更した際に、ファイル名・URLに変更がないと、キャッシュが更新されないケースもあるので、画像ファイルのファイル名に?xxx(myimage.jpg?4362984378)などと指定し、少し強引にファイルが変更したように設定変更を行い、Card validatorでプレビューの取得を実施して下さい。

有用な情報が多かったので、ヘルプページのリンクと内容も掲載しておきます。

Card validator

 

Optimize Tweets with Cards

Refreshing a Card in a Tweet

I updated my site meta tags, but my Tweet shows the old Card. How do I refresh the Card?

Our web crawlers re-index the Card tag information on your page roughly every week.

When testing and/or iterating on Cards, it is sometimes helpful to test updates on your timeline. It may be possible to use the following technique to refresh the cache with your most up-to-date changes of your page’s Card.

  1. Add Card metadata to a page
  2. Tweet URL to that page
  3. Refresh your browser to view the Card contents on your timeline
  4. Change Card metadata on the page
  5. Take the same URL and runs it through bit.ly
  6. Tweet the new bit.ly URL
  7. Refresh your browser to view the updates

Additionally, you can create multiple bit.ly URLs to allow for repeat testing. For example, adding dummy parameters to the end of your URL (http://www.test.com/?x=test1) or a unique hash (http://www.test.com/#test1) will generally not affect the page contents, but will generate a unique bit.ly URL for each unique value of x.

My Card information now refreshes, but images are not updating. How do I get the images to refresh?/a>

Images referenced in a Card are also cached based on URL. This often causes images to not update when the above Card refresh technique is used.

To work-around this issue, you can add an extra parameter at the end of your image URL so that the Twitterbot treats the image as a unique URL and re-fetches the image.

For example:

<meta name="twitter:image" content="http://example.com/myimage.jpg?4362984378"></meta>

 

メインサーバー 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