lecture:インタラクションデザイン演習実習Ⅰ:2020

インタラクションデザイン演習実習A

このページは東京都立大学にて開講している、インタラクションデザイン演習実習Ⅰにおける授業補助教材です。covid-19に合わせ昨年度から大きく変更があるため,現在ページは更新途中です.

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

論文読解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参考ページ:インタラクションデザインの為のパターン認識入門

Processing

// (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

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

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

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:笑顔は人を幸せにするのか?笑顔促進支援システム

WISS2011 Paper

辻田 眸、暦本 純一(東京大学)
概要
高齢化など様々な要因で,独居生活を選択あるいは余儀なくされている人は少なくない.孤 独な生活により感情状態が悪化し,うつ病や心の病にかかるなど深刻な問題である.一方,心理学者ウィリ アム・ジェイムズの言説で,「人は幸福であるが故に笑うのではなく,笑うが故に幸福である」という考え方 がある.これは笑顔形成が感情状態を向上させる可能性を示唆している.そこで本論文では,日常生活のな かで積極的に笑顔をつくることを促進し,感情状態の向上を支援するシステム「HappinessCounter」を提 案する.笑顔促進のために,ユーザが日常的に行う作業時に笑顔形成を促し,フィードバックを与えたり, ソーシャルネットワークサービスなどと連携させることで,より積極的に笑顔形成を支援し,感情状態の向 上を目指す.さらに試作したシステムを実際の日常生活で利用してもらい評価実験を行った.その実験結果 を示し,今後の展望を述べる.

この論文ではユーザの笑顔形成を促すシステムを提案していますが、笑顔を認識できることで可能となるシステムサービスの一例をプロトタイピングから示し、実際に被験者実験(アンケート調査、インタビュー)を行っています。デバイス周りの実装はこの授業では扱いませんが、笑顔を検出するシステムを実際に制作してみたいと思います。

まず、この回では p5.jsを利用して実装を進めて行きます。DOM(html上のオブジェクトを利用すること)は使用しないので、基本的にはProcessingと同じような文法になりますが、まずは下記リンクを参照して、Processingとp5.jsを比較します。

続いて、次のサンプルを利用してまずは手っ取り早く、FaceTrackerしてみます。以降はブラウザを必ずChromeにて実行してください.

上記サンプルの元になっているのが,https://github.com/auduno/clmtrackr です.こちらのサンプルでは単純なfacetrackerの他にマスク, サブスティチューション,表情認識等のデモを確認することができます.まずは各頂点情報を参照して,顔の各パーツを扱えるようにプログラムを工夫していきます.すでにexampleでは口の横の長さで笑顔度を計算する記述も含まれているので,うまく利用してみましょう.

  • lecture/インタラクションデザイン演習実習Ⅰ/2020.txt
  • 最終更新: 2020/05/27 10:00
  • by baba