差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
lecture:インタラクションデザイン演習実習i:2023 [2023/05/10 00:17] – 作成 baba | lecture:インタラクションデザイン演習実習i:2023 [2023/05/10 10:32] (現在) – [論文読解2:手軽な指文字学習支援のためのブラウザゲーム:ゆびもじタイピング] baba | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== | + | ====== |
- | * [[https:// | + | |
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | このページは東京都立大学にて開講している、2022年度インタラクションデザイン演習実習Ⅰにおける授業補助教材です。 | + | このページは東京都立大学にて開講している、2023年度インタラクションデザイン演習実習Ⅰにおける授業補助教材です。 |
</ | </ | ||
- | | + | |
====== 論文読解1:The smart floor: a mechanism for natural user identification and tracking ====== | ====== 論文読解1:The smart floor: a mechanism for natural user identification and tracking ====== | ||
行 18: | 行 15: | ||
* Nearest Neighbor参考ページ:[[http:// | * Nearest Neighbor参考ページ:[[http:// | ||
- | ==== 2つの値(身長体重)と入力データ(マウスポインタ座標)の距離を計算してラベルづけを行うサンプル | + | ====== 論文読解2:手軽な指文字学習支援のためのブラウザゲーム:ゆびもじタイピング ====== |
- | <WRAP group> | + | |
- | <WRAP half column> | + | |
- | Processing | + | |
- | <code c++ simple_kNN.pde> | + | |
- | // (x1, y1) -> male | + | |
- | int x1 = 165; | + | |
- | int y1 = 68; | + | |
- | // (x2, y2) -> female | + | * {{ : |
- | int x2 = 160; | + | * https://ipsj.ixsq.nii.ac.jp/ |
- | int y2 = 47; | + | |
- | + | >宮崎 優子 馬場 哲晃 | |
- | void setup() | + | |
- | { | + | |
- | size(200, | + | |
- | } | + | |
- | + | ||
- | void draw() | + | |
- | { | + | |
- | background(255); | + | |
- | + | ||
- | fill(0, | + | |
- | ellipse(x1, | + | |
- | + | ||
- | fill(255, | + | |
- | ellipse(x2, | + | |
- | + | ||
- | fill(0, | + | |
- | ellipse(mouseX, | + | |
- | text(" | + | |
- | + | ||
- | 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, | + | |
- | } | + | |
- | if( l2 < l1 ){ | + | |
- | line(mouseX, | + | |
- | } | + | |
- | } | + | |
- | </code> | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | <WRAP half column> | + | |
- | python | + | |
- | <code py simple_kNN.pyde> | + | |
- | x1 = 165 | + | |
- | y1 = 68 | + | |
- | + | ||
- | x2 = 160 | + | |
- | y2 = 47 | + | |
- | + | ||
- | def setup(): | + | |
- | size(200, | + | |
- | + | ||
- | def draw(): | + | |
- | background(255) | + | |
- | fill(0, | + | |
- | ellipse(x1, | + | |
- | + | ||
- | fill(255, | + | |
- | ellipse(x2, | + | |
- | + | ||
- | fill(0, | + | |
- | ellipse(mouseX, | + | |
- | text(" | + | |
- | + | ||
- | 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, | + | |
- | if l2 < l1: | + | |
- | line(mouseX, | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <file js p5js.js> | + | |
- | var x1 = 165; | + | |
- | var y1 = 68; | + | |
- | + | ||
- | var x2 = 160; | + | |
- | var y2 = 47; | + | |
- | + | ||
- | function setup() { | + | |
- | createCanvas(200, | + | |
- | } | + | |
- | + | ||
- | function draw() { | + | |
- | background(220); | + | |
- | fill(0, | + | |
- | circle(x1, | + | |
- | + | ||
- | fill(255, | + | |
- | circle(x2, | + | |
- | + | ||
- | fill(0, | + | |
- | circle(mouseX, | + | |
- | + | ||
- | fill(0); | + | |
- | text(`(${mouseX}, | + | |
- | + | ||
- | var l1 = sqrt( (x1-mouseX)*(x1-mouseX)+(y1-mouseY)*(y1-mouseY) ) | + | |
- | var l2 = sqrt( (x2-mouseX)*(x2-mouseX)+(y2-mouseY)*(y2-mouseY) ) | + | |
- | + | ||
- | if(l1 < l2){ | + | |
- | line(mouseX, | + | |
- | } | + | |
- | if(l2 < l1){ | + | |
- | line(mouseX, | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | ==== データ数を増やしてみる ==== | + | |
- | <WRAP group> | + | |
- | <WRAP half column> | + | |
- | Processing | + | |
- | <code c kNN.pde> | + | |
- | int data[][] = { | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | {' | + | |
- | }; | + | |
- | + | ||
- | void setup() { | + | |
- | size(200, 200); | + | |
- | } | + | |
- | + | ||
- | void draw() | + | |
- | { | + | |
- | background(255); | + | |
- | for ( int i = 0; i < 10; i++ ) { | + | |
- | if ( data[i][0] == ' | + | |
- | fill(0, 0, 255); | + | |
- | } else if ( data[i][0] == ' | + | |
- | fill(255, 0, 0); | + | |
- | } | + | |
- | ellipse(data[i][1], | + | |
- | } | + | |
- | + | ||
- | 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; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | | + | |
- | + | ||
- | fill(0, 255, 0); | + | |
- | ellipse(mouseX, | + | |
- | text(" | + | |
- | } | + | |
- | + | ||
- | </ | + | |
- | </ | + | |
- | + | ||
- | <WRAP half column> | + | |
- | Processing Python | + | |
- | <code py kNN.pyde> | + | |
- | data = [ | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | [' | + | |
- | ] | + | |
- | + | ||
- | def setup(): | + | |
- | size(200, | + | |
- | + | ||
- | + | ||
- | def draw(): | + | |
- | background(255) | + | |
- | + | ||
- | for each_data in data: | + | |
- | if each_data[0] == ' | + | |
- | fill(0, | + | |
- | elif each_data[0] == ' | + | |
- | fill(255, | + | |
- | ellipse(each_data[1], | + | |
- | + | ||
- | fill(0, | + | |
- | ellipse(mouseX, | + | |
- | text(" | + | |
- | + | ||
- | for each_data in data: | + | |
- | each_data[3] = dist(mouseX, | + | |
- | + | ||
- | sorted_data = sorted(data, | + | |
- | line(mouseX, | + | |
- | + | ||
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <file js p5js.js> | + | |
- | var data = [ | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | { gender: " | + | |
- | ]; | + | |
- | + | ||
- | function setup(){ | + | |
- | createCanvas(200, | + | |
- | } | + | |
- | + | ||
- | function draw(){ | + | |
- | background(255); | + | |
- | + | ||
- | for(d of data){ | + | |
- | if( d.gender == ' | + | |
- | fill(0, | + | |
- | } | + | |
- | else if( d.gender == ' | + | |
- | fill(255, | + | |
- | } | + | |
- | circle(d.height, | + | |
- | } | + | |
- | + | ||
- | fill(0, | + | |
- | circle(mouseX, | + | |
- | fill(0); | + | |
- | text(`(${mouseX}, | + | |
- | + | ||
- | for( d of data){ | + | |
- | d.distance = dist(mouseX, | + | |
- | } | + | |
- | + | ||
- | // | + | |
- | data.sort(function(a, | + | |
- | if( a.distance -b.distance < 0){ | + | |
- | return -1; | + | |
- | } | + | |
- | else{ | + | |
- | return 1; | + | |
- | } | + | |
- | }); | + | |
- | console.log(data); | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | ====== 論文読解2:笑顔は人を幸せにするのか?笑顔促進支援システム ====== | + | |
- | + | ||
- | [[https:// | + | |
- | >辻田 眸、暦本 純一(東京大学) | + | |
>概要 | >概要 | ||
- | >>高齢化など様々な要因で,独居生活を選択あるいは余儀なくされている人は少なくない.孤 独な生活により感情状態が悪化し,うつ病や心の病にかかるなど深刻な問題である.一方,心理学者ウィリ アム・ジェイムズの言説で,「人は幸福であるが故に笑うのではなく,笑うが故に幸福である」という考え方 がある.これは笑顔形成が感情状態を向上させる可能性を示唆している.そこで本論文では,日常生活のな かで積極的に笑顔をつくることを促進し,感情状態の向上を支援するシステム「HappinessCounter」を提 案する.笑顔促進のために,ユーザが日常的に行う作業時に笑顔形成を促し,フィードバックを与えたり, ソーシャルネットワークサービスなどと連携させることで,より積極的に笑顔形成を支援し,感情状態の向 上を目指す.さらに試作したシステムを実際の日常生活で利用してもらい評価実験を行った.その実験結果 | + | >>聴覚障がい者のコミュニケーションツールには,単語を手の形や位置,動きで表現する手話と,日 本語かなを手の形や動きに対応させた指文字がある.指文字は手話表現にない固有名詞や名前を表現する ときに使われ,手話初心者にとって手話を覚えていなくても指文字を覚えれば単語を綴ることができる. したがって,指文字をスムーズに綴れることは,手話初心者にとって聴覚障がい者との円滑なコミュニ ケーションへの第一歩と言える.手話の学習方法としては対面で講師から学ぶ方法が主であるが,これは 学習者にとって時間的・金銭的コストがかかる.一方で,学習者が単独で手話を学ぶには,本や DVD を 使った方法があるが,これらは指文字を一字ずつ覚えることはできても,実際に指文字を使うときのよう な単語を綴りながらの指文字練習は紙面やコンテンツ数の制約により,限界があった.そこで本研究では |
- | この論文ではユーザの笑顔形成を促すシステムを提案していますが、笑顔を認識できることで可能となるシステムサービスの一例をプロトタイピングから示し、実際に被験者実験(アンケート調査、インタビュー)を行っています。デバイス周りの実装はこの授業では扱いませんが、笑顔を検出するシステムを実際に制作してみたいと思います。 | ||
- | まず、この回では p5.jsを利用して実装を進めて行きます。DOM(html上のオブジェクトを利用すること)は使用しないので、基本的にはProcessingと同じような文法になりますが、まずは下記リンクを参照して、Processingとp5.jsを比較します。 | + | ===== Hand Mario ===== |
- | + | ||
- | {{indexmenu>: | + | |
- | + | ||
- | + | ||
- | 続いて、次のサンプルを利用してまずは手っ取り早く、FaceTrackerしてみます。以降はブラウザを必ずChromeにて実行してください. | + | |
- | * https:// | + | |
- | + | ||
- | 上記サンプルの元になっているのが,[[https:// | + | |
- | サブスティチューション,表情認識等のデモを確認することができます.< | + | |
- | + | ||
- | まずは [[https:// | + | |
- | + | ||
- | なお,複数のカメラデバイスが存在しており,任意のカメラだけをオープンしたい場合は以下のページを参照してください. | + | |
- | * [[p5js: | + | |
- | + | ||
- | 授業を通じて,笑顔を認識するアルゴリズムからコーディングまで実装します. | + | |
- | ===== Facial | + | |
この授業用の特別教材を準備しました.笑顔認識ができるようになったので,表情を認識させることができるようになりました.先の論文では冷蔵庫の開閉にインタラクションをデザインしていましたが,これをゲーム操作インタフェースとして応用してみます.スーパーマリオブラザーズを模したp5jsのコードをベースにして,表情認識でマリオを操作してみます. | この授業用の特別教材を準備しました.笑顔認識ができるようになったので,表情を認識させることができるようになりました.先の論文では冷蔵庫の開閉にインタラクションをデザインしていましたが,これをゲーム操作インタフェースとして応用してみます.スーパーマリオブラザーズを模したp5jsのコードをベースにして,表情認識でマリオを操作してみます. | ||
* https:// | * https:// | ||
行 325: | 行 32: | ||
* レース用の雛形(タイマーの下にフレームカウントがついています):https:// | * レース用の雛形(タイマーの下にフレームカウントがついています):https:// | ||
- | ====== 論文読解3:Effects of Objective Feedback of Facial Expression Recognition during Video Support Chat ====== | + | ====== 論文読解3: |
- | * https://dl.acm.org/doi/10.1145/ | + | * https://cir.nii.ac.jp/crid/1390575661587795840 |
- | + | * 論文データ:{{ : | |
- | Jianming Wu, Toshiyuki Hagiya, Yujin Tang, Keiichiro Hoashi(KDDI Research, Inc.) | + | * 著者:馬場哲晃 |
- | >This paper examines the effects of objective feedback of facial expression recognition on the operators of a video support chat system. We have built a facial expression feedback (FEF) system, which recognizes the users’ facial expressions, | + | * Covid-19によって,多くの教育機関がオンライン授業への対応を余儀なくされた.対面授業とオンライン授業の比較は多くの研究がなされる一方で,オンライン授業では様々なデジタルツールの活用がなされる等,多様な取り組み方法が継続的に実践・検討されている.本稿では,著者が2020年度から開発を開始した音声リアクション・コメント読み上げ共有システムCommentableに対し,学習者による匿名の音声干渉(本稿では特に音声による学生と教員間のインタラクションを指す)機能を利用することで,一部授業では音声なしよりも音声付き投稿が多用されたことや,投稿ログとアンケート結果から授業への参画度向上が示されたことを報告する.一方で,音声干渉機能は200人規模の授業には不向きであるほか,小規模,中規模授業であっても教師および学習者同士が協調し本機能を活用する必要があることがアンケート結果から示された. |
- | + | ||
- | この論文は論文読解2と同様に表情認識を利用したものです。前者は冷蔵庫の開閉につなげ、今回はコールセンターにおけるセルフアウェアネス利用に関して議論をしています。セルフアウェアネスに関してはまずは[[https:// | + | |
- | + | ||
- | 今回はすでにFaceTrackerを利用して表情認識ができるようになっているので、チャットシステムを自分たちでまずつくるところから始めたいと思います。p5jsには様々なチュートリアルが用意されていますが、まずは [[https:// | + | |
- | + | ||
- | * [[p5js: | + | |
====== NeuralNet Challenge====== | ====== NeuralNet Challenge====== | ||
ここではまずは実際にNeuralNetを自分でコーディングし,その振る舞いを理解した後に楽しいサンプルを触っていきます. | ここではまずは実際にNeuralNetを自分でコーディングし,その振る舞いを理解した後に楽しいサンプルを触っていきます. |