ユーザとモノをつなぐ対話設計であるインタラクションデザインに関する体系的知識及び実践的基礎技術を身に付けることを目標とする.近年の論文からいくつかのトピックを議論し,最先端の研究分野をフォローできるための知識を獲得し,それらを実際に再現するために必要な技術要素を同時に身に付けることを目標とする.

本授業は首都大学東京インダストリアルアートコースに向けて開講している授業となります.

論文読解1:The smart floor: a mechanism for natural user identification and tracking

Short Paper

Robert J. Orr and Gregory D. Abowd. 2000. The smart floor a mechanism for natural user identification and tracking. In CHI '00 Extended Abstracts on Human Factors in Computing Systems (CHI EA '00). ACM, New York, NY, USA, 275-276. DOI=10.1145/633292.633453 http://doi.acm.org/10.1145/633292.633453

2ページの英文ショートペーパーです.ロードセルを利用したシンプルなユーザ識別装置に関する報告です.識別にはユークリッド距離を 利用しています.なお,ウェブで検索をするとフルペーパーも見つかるので,詳細はそっちで確認することをおすすめします.ユーザが歩いた際における圧力や時間,力の分散などを特徴量として学習済みの特徴量をf,入力データをf'(ダッシュ)とした場合,次のような計算で距離を求めると,様々な学習済みデータとどの程度入力データがことなるのかを計算できるようになります. 本講義でのもっとも基本的で重要な考え方なので,しっかり理解しましょう.

* Nearest Neighbor参考ページ:インタラクションデザインの為のパターン認識入門

2つの値(身長体重)と入力データ(マウスポインタ座標)の距離を計算してラベルづけを行うサンプル

Processing

simple_kNN.pde
// (x1, y1) -> male
int x1 = 165;
int y1 = 68;
 
// (x2, y2) -> female
int x2 = 160;
int y2 = 47;
 
 
void setup()
{
  size(200,200);
}
 
void draw()
{
  background(255);
 
  fill(0,0,255);
  ellipse(x1,y1, 10,10); 
 
  fill(255,0,0);
  ellipse(x2,y2, 10,10); 
 
  fill(0,255,0);
  ellipse(mouseX,mouseY, 10,10);
  text("("+str(mouseX)+","+str(mouseY)+")", mouseX, mouseY);
 
  float l1 = sqrt( (x1-mouseX)*(x1-mouseX)+(y1-mouseY)*(y1-mouseY) ); 
  float l2 = sqrt( (x2-mouseX)*(x2-mouseX)+(y2-mouseY)*(y2-mouseY) );
 
  if( l1 < l2 ){
    line(mouseX,mouseY, x1,y1);
  }
  if( l2 < l1 ){
    line(mouseX,mouseY, x2,y2);
  }
}

python

simple_kNN.pyde
x1 = 165
y1 = 68
 
x2 = 160
y2 = 47
 
def setup():
    size(200,200)
 
def draw():
    background(255)
    fill(0,0,255)
    ellipse(x1,y1,10,10)
 
    fill(255,0,0)
    ellipse(x2,y2,10,10)
 
    fill(0,255,0)
    ellipse(mouseX,mouseY,10,10)
    text("("+str(mouseX)+","+str(mouseY)+")", mouseX, mouseY)
 
    l1 = sqrt( (x1-mouseX)*(x1-mouseX)+(y1-mouseY)*(y1-mouseY) )
    l2 =  sqrt( (x2-mouseX)*(x2-mouseX)+(y2-mouseY)*(y2-mouseY) )
 
    if l1 < l2:
        line(mouseX,mouseY,x1,y1)
    if l2 < l1:
        line(mouseX,mouseY,x2,y2)

データ数を増やしてみる

Processing

kNN.pde
int data[][] = {
  {'M', 164, 60}, 
  {'M', 178, 80}, 
  {'M', 168, 69}, 
  {'M', 170, 58}, 
  {'M', 165, 68}, 
  {'F', 160, 47}, 
  {'F', 155, 45}, 
  {'F', 164, 60}, 
  {'F', 170, 62}, 
  {'F', 148, 40}
};
 
void setup() {
  size(200, 200);
}
 
void draw()
{
  background(255);
  for ( int i = 0; i < 10; i++ ) {
    if ( data[i][0] == 'M' ) {
      fill(0, 0, 255);
    } else if ( data[i][0] == 'F' ) {
      fill(255, 0, 0);
    }
    ellipse(data[i][1], data[i][2], 10, 10);
  }
 
  float distance[] = new float[10];
  for( int i = 0; i < 10; i++ ){
    distance[i] = sqrt( (mouseX-data[i][1])*(mouseX-data[i][1])+(mouseY-data[i][2])*(mouseY-data[i][2]));
  }
 
  float min = 1000.0;
  int id_min = 0;
  for( int i = 0; i < 10; i++ ){
    if( min > distance[i] ){
      min = distance[i];
      id_min = i;
    }
  }
 
   line(mouseX, mouseY, data[id_min][1], data[id_min][2]);
 
  fill(0, 255, 0);
  ellipse(mouseX, mouseY, 10, 10);
  text("("+str(mouseX)+","+str(mouseY)+")", mouseX, mouseY);
}

Processing Python

kNN.pyde
data = [
    ['M', 164, 60, 0],
    ['M', 178, 80, 0],
    ['M', 168, 69, 0],
    ['M', 170, 58, 0],
    ['M', 165, 68, 0],
    ['F', 160, 47, 0],
    ['F', 155, 45, 0],
    ['F', 164, 60, 0],
    ['F', 170, 62, 0],
    ['F', 148, 40, 0]
]
 
def setup():
    size(200,200)
 
 
def draw():
    background(255)
 
    for each_data in data:
        if each_data[0] == 'M':
            fill(0,0,255)
        elif each_data[0] == 'F':
            fill(255,0,0)
        ellipse(each_data[1], each_data[2], 10, 10)
 
    fill(0,255,0)
    ellipse(mouseX, mouseY, 10,10)
    text("("+str(mouseX)+","+str(mouseY)+")", mouseX, mouseY)
 
    for each_data in data:
        each_data[3] = dist(mouseX, mouseY, each_data[1], each_data[2]) #sqrt( (mouseX-each_data[1])*(mouseX-each_data[1])+(mouseY-each_data[2])*(mouseY-each_data[2]))
 
    sorted_data = sorted(data, key=lambda x : x[3])
    line(mouseX, mouseY, sorted_data[0][1], sorted_data[0][2])
 

論文読解2:SmartVoice: 言語の壁を超えたプレゼンテーションサポーティングシステム

Paper

李 翔, 暦本 純一, SmartVoice:言語の壁を越えたプレゼンテーションサポーティングシステム, 日本ソフトウェア科学会インタラクティブシステムとソフトウェアに関する研究会(WISS2013), 2013.

WISS2013での和文論文です.OF及びofxFaceTrackerを利用しています.読み上げテキストと音声フレーズとのマッチングにDPアルゴリズムを用いています. DPはDynamic Programingのことで,動的なプログラム(編集)を指します.一般的に原稿にそって人間が読み上げを行い,その結果,音声データの位置と 原稿データの位置のマッチングをとるには音声信号処理を行うことが多いです.一方でこの論文ではそのような真っ向勝負はせず, 原稿データを一度ボイスシンセサイザーから再生し,音声データ2を作成します.この2つのデータはフレーズ区切り情報が含まれていますが, その順番が一致していない可能性が大いにあります.そこで音声再生時間をマッチングの為のコスト距離として動的に順番を合わせること を行っています.また読み上げの際は,ただ単純に読むだけでなく発表者の表情をインタフェースに声量や速度を調整できるようにしています.

ここではDPアルゴリズムを理解することと,フェイストラッカーを利用して簡単な表情認識を行うことをします. 表情認識には,smart floorで学習した多次元特徴量の距離計算をベースに実装してみます.

こちらに動画リンクを貼っておきますので、参照してください。

練習問題 FaceTrackerのgetGesture関数より口の開閉等の各データを取得し,それらリアルタイムデータと記録したデータ間においてN次のユークリッド距離を用いることで,任意表情の区別をせよ. ただし利用するGestureはLEFT_EYEBROW_HEIGHT, RIGHT_EYEBROW_HEIGHT, LEFT_EYE_OPENNESS, RIGHT_EYE_OPENNESS, MOUTH_HEIGHT, MOUTH_WIDTH, JAW_OPENNESSの7次元とする.

練習問題 上記練習問題の条件より,3種類以上の表情を識別するプログラムを記述せよ

課題 表情認識を利用して,緑色のプレイヤーを赤色のゴールに向かわせるシンプルなゲームを楽しみ,より早くクリアできるようにインタフェースを最適化して下さい.キーボードを利用してはいけません.あくまで顔の表情認識及び特徴データを利用してプレイヤーを操作して下さい.

  • 日程:5月30日10:30〜
  • 場所:2号館501室
  • 優勝者には景品をプレゼント

論文読解3:Scratch Input: Creating Large, Inexpensive, Unpowered and Mobile finger Input Surfaces

著者の研究紹介ページ(PDFあり)

Harrison, Chris and Hudson, Scott E. Scratch Input: Creating Large, Inexpensive, Unpowered and Mobile finger Input Surfaces. In Proceedings of the 21st Annual ACM Symposium on User interface Software and Technology. UIST '08. ACM, New York, NY. 205-208.

タイトルにあるようにスクラッチ(ひっかき)音を入力とした操作インタフェースの提案を行っています.4ページの限られた文章の中で十分に技術再現が記述されていない部分が見受けられます. 音響信号の特徴量について,Early prototypeの際にはどのような特徴量を利用したかが明確に記述されておらず,動的伸縮法(Dynamic Time Warping)とナイーブベイズ分類器によって認識処理を行っています. おそらく入力信号から直接学習済み信号をDTWを利用して単純ベイズによるマッチング計算を行ったのだと思います. 最終的にはピークカウント及び振幅変動をベースとした決定木(Decision Tree)によるシンプルなアルゴリズムに落ち着いています.ただしこの部分も十分な記載が無いため,読解に少し努力が要ります.

スクラッチ音は3KHz以上の周波数成分を強く持つため,日常生活における様々な騒音環境下でも有効に機能すると述べています.実際に様々な素材で実験を行いある程度の認識精度があることを実験から示しています.

ここでは,信号処理をインタフェースとして利用するための基礎的な技術・知識を身に付けることが目標です. ここでは決定木(if文)ベースで実装を行いますが,興味のある人はDTWでナイーブベイズ識別行うプログラムも挑戦 してみるとよいでしょう.ただし著者らは精度が良くなかったと述べています.ナイーブベイズ識別に関しては 本サイトのインタラクションデザインの為のパターン認識入門を参照してください. この他ウェブサイトや参考書でもナイーブベイズに関する解説は多く入手できると思います.

入力された信号がどのような周波数成分を持つかを解析する一般的な手法です.すべての信号はsinとcosの足し合わせで表現できる.というフランスの数学者フーリエの考えに基づいた理論です. ここではその考えを直感的に表現してみたEasy DFTを実際に利用し,その後DFTを理解します.さらに高速化手法であるFFTを用いて周波数解析する方法に慣れてみましょう. ちなみにEasy DFTというのは存在しません.馬場が勝手に授業用に用意した簡易なDFTとなります.

プログラムを実装していくにあたり,幾つかの基礎練習をします.

ofxGui

様々なパラメータを利用して,ユーザの入力値を調整していく際,GUI(Graphical User Interface)を利用してその値を手軽に変更できると,作業が捗ります. そこで,OpenFrameworksに標準(v.0.8以降)のofxGuiを利用して,プログラム内の変数を動的に変更する方法を練習します. このあたりは /examples/gui/guiExample の例を実行して内容を確認してみます.

C++における vector型

様々な処理に配列は多く利用されます.信号処理や画像処理にかぎらず,一般的な計算には配列は多用されます. この配列を何度も利用しているうちに,いろいろと不便なことに気づきます.例えば最初は配列サイズを100確保 したのに途中からそれ以上必要になってしまった時,配列の中にあるデータを削除し,削除した分を詰めて配列に 再度格納したいとき等です.vector型に関する詳しい説明は多くの参考書やウェブサイトに譲るとして,ここでは 基本的な使い方を抑えたいと思います.emptyExampleをベースに実習してみましょう.

 vector<int>a;  // intの配列をvector型で宣言
  a.push_back(1); // a[0]に1が格納される
  a.push_back(2); // a[1]に2が格納される
  a.push_back(3); // a[2]に3が格納される
  ofDrawBitmapString(ofToString(a.size()), 10,10); // (10,10)座標に3が表示される
  
  a.pop_back();   // a[2]が削除され,a[0]=1, a[1]=2が残る
  a.push_back(4); // a[2]に4が格納される
  
  a.erase(a.begin()); // a[0]が削除され,後ろのデータが全て前に移動する→a[0]=2, a[1]=4
  
  for( int i = 0; i < a.size(); i++ ){
    ofDrawBitmapString("a["+ofToString(i)+"]="+ofToString(a[i]), 10, 20+i*10);
  }

これまでの基礎知識を踏まえていよいよScratchInputの技術再現を行います.ただし著者らは認識のための特徴量に 関して詳細な情報を論文に載せていないので,ここではすこしアレンジを加えて実装を行ってみます.そこで,これから このプログラムのことをScratchInputZと呼ぶことにします.

正規化

論文読解2の最後にユーザの表情を認識するプログラムを実装しましたが,ここで,厳密にその評価を行うと 一つ問題があることがわかります.眉毛の高さや口の開閉等の中にはその変化の度合いが全て均等とは言い切れません. 例えばx,yにおいて(5,5)と(10,6)はxの値が大きく異るように見えますが,実際の計測データ上ではx:5-10,y:5-6 の範囲で取得されているとします.この場合,そのままユークリッド距離等を計算してしまうと,xの変化によって 識別結果が大きく左右されてしまいます.そこで,一般的には正規化処理を行うことでこの問題に対応します. 先ほどの例では(10,5), (5,6)でしたが,x:5-10, y:5-6であることから,それぞれを正規化すると (1,0), (0,1)となります.これでそれぞれの次元において,値は異なるものの,変化の度合いを揃えることができます.

まずは上記のテンプレートをダウンロードして実行して下さい.ofxGuiとvector型を用いて記述されています. 一緒に読んでプログラムになにが記述されているかを把握します.

課題 テンプレートを利用して,数種類のスクラッチインプットを識別するプログラムを記述してみましょう. ただし,特徴量として,次を利用してみます.ピークカウント,正規化周波数積分(0-3000),(3000-8000),(10000-20000). また,認識には論文と同様決定木にて実装してください.識別するジェスチャーは下記の通りとします.

  • Single Tap
  • Double Tap
  • Triple Tap
  • Quad Tap
  • Single Swipe
  • Double Swipe
  • Triple Swipe
  • Quad Swipe

また,課題用雛形として,下記のプログラムを利用してください.

動作の参考資料として,下記動画を確認してください.

提出方法 6月27日10:30の授業開始時に順番に机を周り,動作しているかを直接確認します.

論文読解4:You Only Look Once: Unified, Real-Time Object Detection

https://arxiv.org/pdf/1506.02640.pdf

Joseph Redmon∗, Santosh Divvala∗†, Ross Girshick¶, Ali Farhadi∗†

We present YOLO, a new approach to object detection. Prior work on object detection repurposes classifiers to per- form detection. Instead, we frame object detection as a re- gression problem to spatially separated bounding boxes and associated class probabilities. A single neural network pre- dicts bounding boxes and class probabilities directly from full images in one evaluation. Since the whole detection pipeline is a single network, it can be optimized end-to-end directly on detection performance. Our unified architecture is extremely fast. Our base YOLO model processes images in real-time at 45 frames per second. A smaller version of the network, Fast YOLO, processes an astounding 155 frames per second while still achieving double the mAP of other real-time detec- tors. Compared to state-of-the-art detection systems, YOLO makes more localization errors but is less likely to predict false positives on background. Finally, YOLO learns very general representations of objects. It outperforms other de- tection methods, including DPM and R-CNN, when gener- alizing from natural images to other domains like artwork.

ここでは,リアルタイム物体検出で有名なYOLOの論文を読み,実際にYOLOを利用してみます.YOLOそのものを実装しませんが,深層学習におけるネットワークのデザインや意味に関して概略的に学び,それを利用したアプリケーションを作成するところまでを行ってみます.

馬場がgithub上で公開している ofxYolov2 というOF用のアドオンを利用します.

実際の動作にはネットワークの構成を示すcfgファイル,そのネットワーク構成に従って学習を行った学習済み重みファイルが必要になります. 設定ファイルに関しては darknet/data以下に最初から含まれています.重みファイルは別途ダウンロードが必要です.

もしくはコマンドラインで

$ wget https://pjreddie.com/media/files/yolov2-tiny.weights 

でダウンロードできます.

一般にAnnotationツールと読んでいますが,そもそも作らなくても結構いろいろございます.詳しくは下記のリンクを参照してください. 手動でアノテーション(ラベル付)をするためのツールが紹介されています.

これらの中でも特にYOLOを扱うのであれば,Microsoftが提供するVoTTがおすすめです.

VoTTを使用してみるとわかりますが,単なる手動アノテーション機能だけではなく,R-CNNを利用した半自動アノテーション機能 も含まれています.UIもスッキリとしており,ツールとしても使いやすいです.VoTTを利用することでアノテーション作業は可能ですが, せっかくなんで,Openframeworksを使って作ってみようと思います.プログラムがかければ自分だけのかゆいところに手が届くソフト にすることができます.

設計

VoTTと同じく,

  1. イメージが保存されたディレクトリを読み込んで,アノテーションを行う
  2. 動画ファイルを読み込んで,任意時間ごとのフレームに対してアノテーションを行う

上記2つの機能をもたせたいと思います.動画ファイルに関しては指定時間間隔で動画から 画像ファイルを切り出すことが簡単にできるので,イメージが保存されたディレクトリを読み込んで アノテーションを行う,というアプリケーションだけを作成できればOKです.ofxYolov2の addon内に新しくexampleとしてannotationというexampleを追加しましたのでそちらで 動作を確認します.

ofxYolov2のExample/annotaion を利用してデータセットを作成する

先ずはannotationをXcode上で実行してアプリケーションを立ち上げます.annotation/bin/data/test_images にサンプル学習セットが含まれているので,立ち上げた画面に test_images フォルダをドラッグアンドドロップして ください.すると犬の画像と読み込まれたBounding Boxが同時に表示されます.矢印の右・左キーで対象となる画像を進めたり 戻したりできます.画像データは下記形式を守ってください.

  • jpg形式のみ(拡張子名も.jpgのみで,JPGやjpegなどは不可)
  • jpgおよび対応するtxtファイルのフォルダ名はallとしてください.

右のクラス一覧から登録したいクラス名をクリックして,ドラッグアンドドロップでバウンディングボックスを引くとそれが同名の txtファイルにてリアルタイムで保存されます.実際に登録したものがtxtファイルに保存されるかを自分で確かめて見ましょう.

この他,controlキーを押すと,yolov2-tiny.weightsファイルからの自動認識結果も合わせて表示してくれます. 実際にannotation作業を行う際,同じようなバウンディングボックス作成が連続して苦痛なので,それを和らげるために, 自動で正しく認識している箇所はワンクリックで登録できる粋なはからいになっています.このような機能は先に紹介した microsoftのannotationツールでも実装されています.ただし全く新しいデータ・セットを作成する際はcocoの80クラスでは 支援作業に意味をなさない場合がほとんどなので,一番最初はちょっとだけデータセット作成を完全に手動で行い.少しデータが 溜まったところ(500枚程度)で,一度学習を行い,次からはその学習済みファイルを利用することが有効だと思います.

png形式画像の一括jpg変換

収集した画像がjpg形式ではなかった場合,それらを手作業で一つひとつjpg形式に変換するのはかなり骨がおれます. 例えば1,000枚の画像を集めてきたところ,その中にはpngファイル等のjpgではないものがいくつか含まれている場合を考えてみます. このような場合でもコマンドを利用することで簡単に一括で,例えばpngファイルをjpgに変換することができます.

画像変換コマンドにはImageMagickというパッケージをインストールしておくと,mogrifyという画像変換コマンドがインストール されるようになるので,まずはImageMagickをインストールします.

$ brew install imagemagick

その後,例えば hoge というフォルダ内にtest1.png, test2.png というpngファイルがあるとします.この場合,これらを 一括でjpg形式に変更するには hoge フォルダ内において,下記コマンドを実行すればよいです.

$ mogrify -quality 100 -format jpg *.png

これで png形式のファイルを一括で最高品質のjpgに変更してくれます.

動画ファイルから一定の時間感覚でjpgファイルを切り出す

これはffmpegなるコマンドを使えば可能です.具体的には

$ ffmpeg -i input.mp4 -filter:v fps=fps=1:round=down %04d.jpg

ただし,input.mp4 は切り出し対象となる動画ファイルに置き換えてください.

作成したデータセットを学習させ,データセットに不備がないかを確認する

データセットを学習されるためには次に示す手順が必要です.

  1. 学習対象となる画像への絶対パスをまとめた train.txt (名前は任意)というテキストファイル
  2. クラス一覧を記した names.txt (名前は任意)というテキストファイル
  3. 上記 train.txt, names.txt や学習済みデータを保存する先のディレクトリ名 を記した meta.txt (名前は任意)

の合計3つのファイルを準備する必要があります.

train.txtファイルの生成

このファイルには学習対象となる画像ファイルへのパスを一行に付き一枚ずつ入力しておけばよいです.これも手作業では 気の遠くなる作業ですが,コマンドを利用することで簡単にファイルを作成できます.annotation作業した画像が all という フォルダ内に全て含

見出し

まれている場合,下記コマンドを実行することで,画像ファイルパス一覧をtrain.txtに保存することができます.

$ find `pwd`/all -name "*.jpg" > train.txt

findは検索コマンドです.pwdは今いるディレクトリまでのパスを教えてくれるコマンドです.上記を実行することで,allフォルダ以下にある,拡張子がjpgのファイルを見つけてきて,一行ずつ表示してくれ,その表示をtrain.txtファイルにそのまま出力(リダイレクト)しています.

names.txtファイルの作成

このファイルがクラス名が記述されたファイルになります.これはすでにannotation作業を行った際,coco.namesというファイルを編集することで予めクラスファイルを作成できていますので,ここで利用したcoco.namesを names.txt として保存しておけば問題ありません.

meta.txtファイルの作成

こちらは上記で作成したファイルの場所等を記しておくファイルです.具体的には下記のようにしておきます.

classes= 1 # ここはクラス数を記入する
train  = <path-to-dataset>/train.txt # <path-to-dataset>にはそれぞれの環境に見合ったパスを入力する
names = <path-to-dataset>/names.txt
backup = backup # ./darknetを実行する位置になるので,darknet/backup というフォルダに途中経過や最終結果を保存する

yolov2-tiny.cfg の修正

今回はyolov2-tinyのネットワークを利用するので,こちらの雛形を流用します. yolov2-tiny.cfgは darknet/cfg 以下に最初から含まれています.このファイルをまずは darknet/data/mydataset 以下に保存しましょう. そしてyolov2-tiny.cfgを修正します.具体的には

  • filter=425 を適切な数値に変更
  • class=80 を適切な数値に変更

を行います.classは学習させるクラス数をそのまま記述すればよいです.filter=425と書かれているものは,(class数+5)*5で計算をします.例えば クラス数が1であれば (1+5)*6 = 30 となります.また,80クラスの場合は (80+5)*5 = 425になっているわけです.

学習

では準備が整ったところで,実際に学習を行います.例えば darknet/data/mydataset 以下に先程のmeta.txt, train.txt, names.txt, yolov2-tiny.cfg, all/(アノテーションデータが入ったフォルダ)が置かれている場合,下記コマンドで学習を開始できます.

$ ./darknet detector train data/mydataset/meta.txt data/mydataset/yolov2-tiny.cfg

エラーなどがでず,そのまま学習が始まればデータ・セットはOKです.

Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Resizing
480
Loaded: 0.523287 seconds
Region Avg IOU: 0.092090, Class: 0.142081, Obj: 0.548218, No Obj: 0.456659, Avg Recall: 0.012723,  count: 393
Region Avg IOU: 0.100210, Class: 0.157903, Obj: 0.522707, No Obj: 0.459687, Avg Recall: 0.016667,  count: 420
1: 822.926941, 822.926941 avg, 0.001000 rate, 195.341817 seconds, 64 images
.
.
.

実際に学習をスタートされると気づくかと思いますが,とてつもなく時間がかかります.一回の学習(画像入力から重み調整まで)につき 上記の出力では195秒かかっています.それだけ学習されるかはデータ・セットの量やクラス数,実際の学習結果に応じて変化しますが, cocoデータ・セットで学習されたyolov2-tiny.weightsファイルは約40万回(イテレーション)程度学習しています. なので,単純に上記のような普通のPCでは902日(2.5年)かかる計算になります.あくまで目安ですのでご注意ください.

そこで作成したデータ・セットが問題なく学習できることを確認したら,そのデータ・セット一式を下記のアップロードリンクを利用して 馬場に送ってください.こちらの深層学習用PCで学習することで,1日程度で学習が終了します.

データのアップロード先

作成したデータ・セットは下記リンクへzipファイルでまとめてアップロードしてください.

  • lecture/インタラクションデザイン演習実習a.txt
  • 最終更新: 2019/04/24 13:56
  • by baba