V-StudyMate 是一套結合專注度辨識與虛擬角色互動的智慧學習監測系統。系統透過攝影機即時擷取臉部特徵,判斷使用者處於專注、困惑、無聊、疲倦或挫折等狀態,再由虛擬角色以表情與文字提醒。學習結束後,系統會把整段學習的狀態畫成圖表,供使用者回顧。
系統可應用於線上課程與自主學習,教師也能從彙整的數據看出教材的難點。
整個系統可以想成五個接力的階段。最前面是臉部捕捉,我們用 MediaPipe 把鏡頭裡的臉轉成一組臉部特徵點,再算出眼睛張多開、嘴巴張多大這類數值,當作判斷的依據。接著是專注度辨識,把這些數值丟進訓練好的機器學習模型,由模型即時推測使用者的學習狀態。第三個階段是通訊傳輸,Python 這一端會把表情和頭部旋轉的資料打包,傳給 Unity。第四個階段是 V 皮驅動,Unity 收到資料並解析之後,讓虛擬角色跟著換表情、轉頭。最後是應用系統,我們呈現番茄鐘結果和學習數據的圖表,並加上 AI 給予的學習建議,做成一個完整的 App。
| 階段 | 做什麼 | 使用技術 |
|---|---|---|
| 臉部捕捉 | 擷取臉部特徵點,算出物理特徵值 | MediaPipe |
| 專注度辨識 | 以機器學習模型判斷使用者的學習狀態 | 隨機森林、XGBoost 等 |
| 通訊傳輸 | 把表情與旋轉資料打包送到 Unity | UDP、OSC、VMC |
| V 皮驅動 | 同步虛擬角色的表情與頭頸動作 | Unity、EVMC4U、UniVRM |
| 應用系統 | 整合番茄鐘、學習數據圖表與學習建議 | Unity、Gemini |
一、研究背景
社會需求:終身學習與職場技能提升。現在的工作變化很快,不少人需要持續學習新的技能,學習已經不再只是學生時期的事。
學習管道多元:許多大學提供開放式課程,YouTube 上也有不同領域的教學影片,想學什麼幾乎都找得到。
彈性自主學習:依照自己的需求選擇內容,彈性安排學習時間。但也因為沒有老師在旁邊觀察,注意力掉下來、聽不懂或是累了,都不會有人察覺,學習效率自然受到影響。
二、研究動機
現代人常在螢幕前自主學習或工作,容易恍神導致效率低落,我們希望利用虛擬角色所帶來的陪伴感,能夠在不給予使用者心理壓力的同時,透過系統量化並記錄這些情緒數據,幫助使用者提升學習效率。
另外還有一個技術上的考量。每個人坐的位置、光線和鏡頭角度都不一樣,如果直接拿影像來判斷,很容易被這些條件干擾。所以我們改用臉部特徵點算出比例和相對距離,不直接使用原始影像,這樣不管使用者離鏡頭比較近或比較遠,結果都比較穩定,也不用保留臉部照片,隱私上比較安心。
| 線上學習的問題 | 做法 |
|---|---|
| 缺乏老師即時觀察,分心或疲倦時沒人發現 | 攝影機即時擷取臉部特徵,辨識專注、困惑、無聊與疲倦 |
| 專注力軟體多從「監視」出發,使用者壓力大 | 以虛擬角色陪伴,用表情與文字給回饋 |
| 學習狀態抽象,很難量化與回顧 | 搭配番茄鐘與狀態圖表,回頭看整段學習 |
| 鏡頭距離、光線和角度不同,影響辨識 | 用比例與相對距離的特徵,且不保留原始影像 |
三、研究目的
我們想建立的,是一套智慧學習監測系統,透過即時的專注度辨識與分析,做到幾件事。它要能看出學習者有沒有皺眉困惑、視線飄走恍神,或是閉眼點頭的疲倦;也要能在適當的時候提醒或暫停,幫忙留意學習中卡住的地方;同時透過虛擬角色的陪伴,降低鏡頭監測帶來的壓力;最後把整段學習留下紀錄並加以分析,讓使用者之後可以調整自己的學習方式。這樣的系統對學習的人來說,及時的提醒能幫助他把注意力放回重點,學習效率和成效都會比較好,而且有角色陪著,不會有被盯著的壓力,學習動機也比較高;對整體教育來說,結合人工智慧和人機互動,是線上學習輔助很可行的方向;對老師來說,專注度曲線和狀態變化也可以拿來當作調整教學的依據。
過去的研究情形
過去把自動辨識學習狀態用在教育場景的研究,大多靠傳統機器學習或深度學習模型,但常遇到兩個問題:一是要花很多時間訓練龐大的資料,二是模型像黑盒子,沒辦法說明它為什麼這樣判斷。臺灣大學 CASE 的一篇報導提到,Yu 等人的最新研究把多模態大型語言模型(例如 Gemini)用在包含 DAiSEE 的學習情緒資料庫上,發現模型能透過眼睛距離、嘴唇微縮這類臉部特徵,說明學習者是專注還是困惑,可解釋性相當高。
我們正是沿著這個概念:用眼睛縱橫比(EAR)、嘴巴縱橫比(MAR)、頭部姿態和眉間距離這些看得懂的幾何特徵當輸入,再搭配比較輕量的模型,既降低訓練成本,也能說明判斷的理由。
| 過去研究的問題 | 做法 |
|---|---|
| 需要花很多時間訓練龐大的資料 | 使用比較輕量的模型,只取關鍵特徵 |
| 模型像黑盒子,說不出判斷的理由 | 用眼睛、嘴巴、頭部姿態與眉間距離等看得懂的幾何特徵 |
(一)整體流程
有了前面的動機,接下來就是把想法一步一步做出來。我們的整體流程可以看下面這張圖。一開始先找尋相關的資料集,接著進入專注度辨識,做法是先平衡資料、比較模型,再選出表現最好的。模型選好之後進入傳輸通訊,Python 端會把預測的表情和旋轉數據打包成封包,傳輸到 Unity 端。接著是 V 皮驅動,Unity 端收到訊號之後,同步驅動虛擬角色切換表情,骨架也跟著連動。最後是應用系統,也就是 APP 的介面,裡面有番茄鐘系統,並把學習的數據做成可視化的圖表。
(二)採用的方法與原因
在方法上,我們做了六件事。先用電腦視覺從攝影機畫面抓出臉部特徵點,再用機器學習模型判斷學習狀態;專注度的部分,用視線和頭部姿態看使用者有沒有看著螢幕;疲勞則用眼睛開合的比例和嘴巴張開的程度,判斷是不是閉眼。最後,系統會依辨識結果,用文字和虛擬角色跟使用者互動,每次互動之後要隔 30 秒才會再出現,避免一直打擾,也提供暫停功能讓使用者掌握自己的節奏,同時每 5 秒依權重記錄一次時間點和情緒,當作學習報告圖表的資料。我們選這套方法有三個原因:可以即時回饋、人臉辨識和機器學習已經有很成熟的技術可以用,而且很容易接進現有的影音學習平台。
| 方法 | 做法 | 主要依據 |
|---|---|---|
| 人臉偵測 | 從攝影機畫面取得臉部特徵點 | MediaPipe |
| 學習狀態辨識 | 用機器學習模型判斷六種專注度狀態 | 四種幾何特徵 |
| 專注度分析 | 以視線與頭部姿態判斷是否看著螢幕 | Pitch、Yaw |
| 疲勞偵測 | 以眼睛開合與嘴巴張開程度判斷閉眼 | Avg_EAR、MAR |
| 事件觸發 | 文字互動(隔 30 秒)、暫停、每 5 秒記錄時間點與情緒 | 辨識結果 |
| 虛擬角色互動 | 同步表情與頭頸動作 | Unity |
(三)預期的困難與解決方式
過程中我們預期會碰到幾個問題,也各自找了做法。準確度不夠的話,就比較多種模型,最後用 SMOTE 加 XGBoost;光線會影響辨識,所以我們不用原始畫素,改用臉部網格的特徵點,降低光線和角度的干擾;即時運算很吃效能,所以只擷取關鍵特徵,不疊加複雜的連續運算;至於誤判,我們先用平滑化過濾抖動,時間門檻的設計則留作之後的延伸。
(一)開發架構
我們把整個系統拆成兩塊,在同一台電腦上同時運作。Python 這一塊負責「看」和「想」:從攝影機取得畫面,用 MediaPipe 找出臉部特徵點,算出特徵值,再交給訓練好的模型判斷狀態。Unity 這一塊負責「演」和「顯示」:接收 Python 傳來的資料,讓虛擬角色換表情、轉頭,也負責所有使用者看得到的畫面,包括時間設定、各種特別功能和最後的結果報告。兩塊之間用網路封包溝通,這樣其中一邊出問題的時候,比較容易分開檢查。
(二)使用的技術
先說 Python 這一端。臉部特徵是用 MediaPipe 的 Face Mesh 取得的,它可以從一般 Webcam 的二維畫面估計出臉部的三維特徵點,再進一步算出 52 個 Blendshape 數值,每個數值介於 0 到 1,越接近 1 就代表那個部位變形越明顯。專注度辨識用的是我們自己算的四種幾何特徵,包括眼睛縱橫比、嘴巴縱橫比、頭部的俯仰與左右轉動角度,以及兩眉之間的距離;52 個 Blendshape 數值則是後面用來驅動虛擬角色表情的資料。
模型的部分,我們比較了隨機森林和 XGBoost。資料不平衡的問題,則用 SMOTE 來處理。
傳輸這一段,我們用 UDP 送資料,格式採用 OSC 和 VMC 這兩種動作捕捉常用的通訊協定。UDP 的好處是速度快、不用等對方回應,很適合每一幀都要更新的即時畫面。Unity 這一端則靠 EVMC4U 套件接收並解析 VMC 資料,再用 UniVRM 匯入 VRM 格式的虛擬角色模型,也就是我們說的 V 皮。
| 環節 | 使用工具 | 用途 |
|---|---|---|
| 臉部特徵擷取 | MediaPipe Face Mesh | 取得臉部特徵點與 52 個 Blendshape |
| 模型訓練 | 隨機森林、XGBoost | 辨識專注度狀態 |
| 資料平衡 | SMOTE | 讓每個類別的筆數一致 |
| 資料傳輸 | UDP、OSC、VMC | 把表情與旋轉資料送到 Unity |
| 接收與渲染 | EVMC4U、UniVRM | 解析資料並驅動 VRM 虛擬角色 |
| 前端介面 | Unity(場景、Animator) | 時間設定、虛擬角色與結果報告 |
(三)開發環境:Unity
我們的前端是用 Unity 開發的。一開始並不是直接用 Unity,而是先用免費軟體 VSeeFace 測試,確認 Python 的資料真的傳得過去、角色真的會動。但第三方軟體沒辦法讓我們自由加入自己的介面,而我們需要番茄鐘、情緒圖表,還要渲染三維模型,所以後來決定改用 Unity 自己開發。
Unity 原本是做遊戲的引擎,三維模型、動畫、畫面介面和場景切換都有現成的工具,剛好符合我們的需求。我們把整個 App 拆成幾個場景,像是歡迎畫面、時間選擇、學習畫面和結果報告,每個場景各管一件事,再用程式把它們串起來。角色的動作交給 Unity 的 Animator 控制,表情和頭頸的動作則由收到的資料來驅動。
環境本身是整個開發裡很大的挑戰。Unity 和各種套件都有自己的版本需求,版本一旦對不上就會出錯,所以我們最後是退回比較舊的 Unity 與套件,才換來穩定的環境,這也是整個串接過程中最花時間的一段。
(一)資料集
本專題資料集Student-engagement:用於專注度辨識,共六類狀態
專注度辨識用的是 Student-engagement 資料集,一共 2,120 張,分成六類狀態:困惑 369 張、專注投入 347 張、挫折 360 張、無聊 358 張、昏沉 263 張(最少)、看向他處 423 張(最多)。最多和最少差了約 1.6 倍,差距不算大,但還是需要在訓練集做平衡化。
(二)四種物理特徵
因為要即時判斷,我們不直接拿影像來用,而是用 MediaPipe Face Mesh 取得 468 個三維關鍵點,再用歐氏距離公式算出四個特徵。是四個特徵在臉上的位置,接下來依序說明。
臉部傾斜角度(Pitch & Yaw) 首先,我們將探討臉部傾斜角度的部分。「Pitch」指的是頭部向上或向下的角度變化,當頭部向上抬時為正值,而向下低頭則為負值。「Yaw」則表示頭部向左或向右的角度變化,左轉為負值,右轉為正值。透過這些角度的精確測量,我們能夠辨識頭部的姿態變化,作為分析注意力的特徵。
眉間距離(Eyebrow_Dist) 眉間距離是我們分析面部表情的一個關鍵特徵。首先,我們需要擷取左右眉毛內側的關鍵點,然後計算這些關鍵點之間的距離。這個距離的變化,能夠提供關於使用者困惑或專注狀態的有用資訊。眉毛的微小變化常常不被注意,但它們卻能反映出豐富的情緒資訊。因此,在進行特徵工程時,我們將這些資訊作為分析面部表情的重要參考特徵。
眼睛張開度(Avg_EAR) 在這一部分,我們探討如何精確地擷取眼睛的關鍵點。我們先關注眼睛的上下及內外側的關鍵點,這些點有助於計算眼睛的垂直高度與水平寬度的比例,這就是我們所稱的眼睛張開度。接下來,透過左右眼相加除二得到的平均 EAR 值,能有效降低單眼偵測誤差的影響,這樣的精確度能夠幫助我們更準確地判斷注意力與疲勞狀態。
嘴巴張開度(MAR) 資料擷取與特徵工程的最後是「嘴巴張開度」,也就是 MAR。這個指標的計算涉及擷取嘴巴的多個關鍵點,包括左、右、上、下四個方位。我們透過計算嘴巴的垂直開口距離與水平寬度的比例,得出嘴巴張開度的數值。這個比例的變化可以幫助我們偵測嘴巴的開合狀態。此數值所得出的結果,結合眼睛與臉部傾斜角度等分析,MAR 能夠有效地辨識出說話等行為。
我們用比例和相對距離,而不是直接用數值,是因為注意力藏在很細微的肌肉動作裡,用比例和相對位移可以抵消使用者離鏡頭太近或太遠造成的縮放誤差,讓特徵具備尺度不變性。
| 特徵 | 計算方式 |
|---|---|
| 平均眼睛縱橫比(Avg_EAR) | 左右眼垂直距離 ÷ 水平距離的平均 |
| 嘴巴縱橫比(MAR) | 嘴巴垂直距離 ÷ 水平距離 |
| 頭部姿態(Pitch/Yaw) | 由三維關鍵點估算角度 |
| 眉間距離(Eyebrow_Dist) | 兩眉內側點的距離 |
(三)單一模型
特徵準備好之後,我們先用單一模型試試看。在 1,618 筆訓練、405 筆測試的設定下,隨機森林對看向他處和困惑的辨識率都很高,測試約 86%,但挫折和無聊只有約 56% 和 39%;XGBoost 在看向他處(84.8%)、困惑(93.2%)和昏沉(91.3%)的表現都很好,並把挫折和無聊提高到約 59% 和 45%。
單一模型有三個痛點。分類像開關一樣硬,特徵稍微變動,標籤就會劇烈跳動;無聊和專注的幾何特徵重疊很多,隨機森林容易漏掉,XGBoost 又容易被環境雜訊誤導;而且一換設備或光線,準確率就掉很多。
(四)模型優化
各方法的整體比較在這一頁最後已經整理過。單一模型的準確率不足,無聊和挫折都抓不太到,所以我們把隨機森林和 XGBoost 都加上 SMOTE。SMOTE 搭配隨機森林的訓練與測試準確率是 79.29% 和 72.84%,抗雜訊的能力不錯,但邊緣細節的辨識率偏低;SMOTE 搭配 XGBoost 則是 86.42% 和 81.73%,對少數類別的辨識最精準,不過在複雜的真實場景裡,泛化能力還需要再驗證。
SMOTE 搭配 XGBoost 之所以能救回無聊和挫折,是因為我們把訓練集每一類都拉平到 313 筆(共 1,878 筆),模型沒辦法再靠多猜數量多的類別衝分,XGBoost 又對細微的特徵殘差很敏銳,被迫去學這兩類的微表情特徵。最後無聊從約 45% 升到約 64%,挫折升到約 68%,所以我們選它作為專注度辨識的最終模型。
(五)各方法的準確度比較
為了選出最適合的模型,我們把各種做法放在同一張表裡比較。 整理了專注度辨識裡四種做法的結果,包含純隨機森林、純 XGBoost,以及搭配資料平衡化(SMOTE)的組合,表中的無聊與挫折準確率,指的是這兩種狀態各自被正確辨識的比例。
| 方法 | 無聊(Bored)準確率 | 挫折(Frustrated)準確率 | 整體測試準確率 |
|---|---|---|---|
| 隨機森林 | 39.13% | 55.88% | 72.35% |
| XGBoost | 44.93% | 58.82% | 75.56% |
| 隨機森林 + SMOTE | 37.68% | 55.88% | 72.84% |
| SMOTE + XGBoost | 63.77% | 67.65% | 81.73% |
依據,四種方法的整體測試準確率落在 72% 到 82% 之間,看起來差距不算很大,但只要把焦點放在最難辨識的無聊和挫折,差別就出來了:純隨機森林對無聊只抓到 39% 左右,搭配 SMOTE 之後甚至掉到 37.68%,而 SMOTE 搭配 XGBoost 可以拉高到 63.77%。我們推測,隨機森林靠很多棵樹投票,碰到樣本很少的類別時,SMOTE 合成出來的樣本反而變成雜訊;XGBoost 則是一棵接著一棵、專門修正前一棵的錯誤,比較抓得到細微的特徵差異,所以和 SMOTE 搭配起來效果最好。
兩個模型的邏輯也不太一樣。隨機森林會建立幾百棵各自獨立的決策樹,最後用投票決定答案,所以抗雜訊的能力不錯,也比較不容易過擬合;XGBoost 則是把樹串起來,後面的樹專門去修正前面判斷錯的地方,準確度通常比較好,執行速度也很快。
(一)從 VSeeFace 到自己開發的 Unity App
完成前面的模型測試之後,為了確認整條路是通的,我們先用免費軟體 VSeeFace 做測試,看看 Python 能不能順利把臉部資料傳出去,並讓角色動起來。結果發現,VSeeFace 只收表情資料,如果要讓模型的頭也能動,還得另外傳臉部特徵點的資料(也就是畫面右下角那個綠點人臉),問題也就從這時候一個一個冒出來。整條資料流大致是這樣:Python 搭配 MediaPipe 負責擷取,UDP、OSC 和 VMC 負責傳輸,Unity 搭配 EVMC4U 和 UniVRM 負責解讀和渲染。
(二)串接時遇到的三個障礙
整合的時候,我們遇到三個主要的麻煩。最先碰到的是資料格式不一致:Python 預設輸出 64 位元的浮點數,Unity 底層只讀 32 位元,所以得先強制轉型,Unity 才看得懂座標。接著是「有連線卻沒動作」,封包明明送到了,角色卻一動也不動,查了很久才發現是 Unity 的 Animator(動作控制器)在匯入過程中不見了,重新綁定之後就恢復正常。最後,也是最花時間的,是各種套件和環境的版本衝突,我們試了很多組合,最後退回舊版的 Unity 與套件,才換來穩定的環境。
| 遇到的問題 | 原因 | 解決方式 |
|---|---|---|
| 資料格式不一致 | Python 輸出 64 位元浮點數,Unity 只讀 32 位元 | 強制轉型對齊 |
| 有連線卻沒動作 | Animator(動作控制器)在匯入過程中遺失 | 重新綁定 |
| 套件與環境版本衝突 | Unity 與套件的版本需求對不上 | 退回舊版 Unity 與套件 |
(三)讓角色動得更自然
角色能動之後,我們發現動作很僵硬,所以做了四項優化。Webcam 的畫面有一點點雜訊,角色就會跟著抖,所以我們加上平滑化;座標軸對不起來又沒有脖子,頭一轉整個人像是斷掉,所以我們校正座標軸,把頭部旋轉按比例分一部分給脖子,看起來比較像真的肌肉連動;低頭太多模型會穿模,仰頭又常常超出鏡頭看得到的範圍,所以我們用非對稱增益,限制低頭的角度,同時把仰頭的參數放大;最後,我們提供一鍵重置的基準點,並強制寫入軀幹參數,讓角色把雙手放下來,不再卡在 T-Pose。
| 動作上的問題 | 做法 |
|---|---|
| Webcam 雜訊讓角色抖動、僵硬 | 加上平滑化 |
| 軸向錯亂、沒有脖子 | 校正座標軸,把頭部旋轉按比例分給頸部 |
| 低頭穿模、仰頭超出鏡頭範圍 | 非對稱增益:限制低頭角度、放大仰頭參數 |
| 角色卡在 T-Pose | 一鍵重置基準點,並強制寫入軀幹參數 |
使用者的坐姿一改變,模型就會固定偏掉,這時候只要按一下 C,就能重新校正三維空間的原點,讓陪伴的視角一直對著使用者。
(四)特別功能
除了讓角色動起來,我們也花了很多心思在使用者實際操作的細節上,希望畫面保持乾淨,讓使用者自己掌握節奏。這些功能按使用的順序,可以分成學習前、學習中和學習後三段。
- 使用說明
- 自訂輸入時間
- 倒數/計時
- 進度條(直線、圓形)
- 直接開始按鈕
- 第一頁顯示特徵點
- 第三頁可透明點擊
- 隱藏暫停與結束介面
- 暫停功能
- 文字互動(30 秒冷卻)
- 每 5 秒記錄時間點與情緒
- 時間點與情緒圖表
- 圖表上的情緒標註中文名稱
- 圖表下方的文字分析說明
- 重新開始/離開
學習前系統一開始就有使用說明,右上角的「?」按鈕隨時都能點開,簡單說明每個功能怎麼用,使用者不用自己摸索。接著可以自訂輸入學習時間,想讀二十五分鐘或一個小時,直接輸入分鐘數就好。時間的方式有倒數和計時兩種,倒數會從設定的時間往下數,計時則是從零開始往上累計。進度條有直線和圓形兩種樣式,而且會依照所選的模式決定要不要出現,不需要的時候就藏起來,畫面比較清爽。設定好之後,按下直接開始按鈕就能一鍵進入學習,不用再經過多餘的步驟。
學習中進入學習之後,第一頁會直接顯示臉部特徵點,讓使用者一眼就能確認系統真的有看到自己的臉。第三頁可以透明點擊,也就是畫面上的東西不會擋住後面的內容,使用者還是可以點到下面的視窗。暫停和結束的介面預設是隱藏的,平常不會顯示在畫面上,需要的時候才叫出來,這樣畫面保持乾淨,不會干擾閱讀;使用者也可以隨時按暫停,先離開座位,回來再繼續。在互動方面,角色會用文字跟使用者說話,但每說一次要隔 30 秒才會再說,避免一直打擾。同時,系統每 5 秒會依權重抓一次時間點和情緒,悄悄記下來。
學習後學習結束時,系統會把剛剛每 5 秒記錄的時間點與情緒畫成圖表,橫軸是時間,縱軸是專注、困惑、無聊、轉開視線、挫折和昏沉這幾種狀態,使用者一眼就能看出自己是從哪一段開始分心。圖表上的每個情緒都標有中文名稱,圖表下方也會附上一段文字分析說明,用白話解讀圖裡的趨勢,使用者不用自己判讀曲線。畫面最下面有重新開始和離開兩個按鈕,可以再讀一輪,也可以直接結束。
一、系統畫面與使用流程
我們先直接看成果。App 實際運作的時候,使用者會依序看到五個畫面,下面照編號 1 到 5 說明,圖上的 A、B、C 等標記對應到每張圖下方的文字。畫面上方的顏色標籤代表所屬階段,學習前學習中學習後各用一種顏色。
學習前畫面 1 隱私權同意
畫面 1 是打開 App 最先看到的畫面。上方是「歡迎來到 V_StudyMate」(A),中間的「隱私權同意選項」(B)寫得很清楚:本產品用特徵點抓取臉部特徵,絕不儲存或側錄攝影機畫面,請安心使用。看完說明之後,使用者可以選擇拒絕(C)或接受(D)。右上角的「?」(E)是使用說明的入口,每個畫面都找得到,點開就能看到這個程式怎麼使用。
學習前畫面 2 特徵點預覽
畫面 2 是同意隱私權之後的預覽畫面。畫面上方同樣是「歡迎來到 V_StudyMate」(A),中間的黑色區塊是攝影機的預覽(B),使用者可以在這裡看到自己的臉部特徵點,確認偵測有正常運作。準備好之後,按下開始(C)就會進到選擇專注時間的畫面。右上角的「?」(D)同樣是使用說明的入口。
學習前畫面 3 選擇專注時間
畫面 3 是設定這一次要讀多久。標題寫著「請選擇專注時間」(A),下方有 15 分、30 分和 45 分三個常用時間可以直接選(B),也可以在旁邊的輸入欄自己輸入分鐘數(C);如果不想設定,按快速開始(D)就會直接開始;時間選好之後,再按下方的開始(E)。
學習中畫面 4 虛擬角色陪伴
畫面 4 是學習過程中的主要畫面。使用者照平常的方式看教學影片或讀資料(D),虛擬角色(A)直接疊在畫面右側陪著,會依辨識結果換表情、轉頭,也會用文字跟使用者互動;點擊 V 皮可以跳出暫停與結束選單,再點一次就會隱藏。畫面左上角(B)會顯示最近 5 秒的情緒占比,例如圖中是「分心 59.6%」,下面還有記錄次數,每 5 秒記錄一次,這些記錄後來就變成結果報告裡的折線圖。右上角的「?」(C)點下去就是使用方法的說明;左下角(E)顯示的是監測時間,也就是這次已經監測了多久;圖中間下方是時間的進度條(F),在碼表模式下會自動隱藏。角色和介面都是透明的,滑鼠可以直接穿透去操作後面的內容,所以畫面很乾淨。
學習後畫面 5 結果報告
畫面 5 是學習結束後的結果報告。上方標題是「結果報告」(A),左邊列出專注、困惑、無聊、分心、挫折和疲倦六種狀態(B),中間的折線圖(C)每個點代表一次記錄,依序連起來就是這段學習的狀態變化;下方是時間軸(D),這次示範記錄了 35 秒。右下角有重新開始和離開兩個按鈕(E),按重新開始可以回到前面的畫面再讀一輪,按離開就結束程式。圖下方的文字(F)是 AI 建議,能給予個人化建議,提升使用者的學習效率。
二、特別功能成果
學習前使用說明、自訂時間、倒數與計時,還有直接開始的按鈕,讓設定這件事變得很簡單,進度條的直線與圓形兩種樣式,也會跟著模式出現或隱藏。學習中第一頁的特徵點讓使用者放心,第三頁的透明點擊,加上預設隱藏的暫停與結束介面,讓畫面一直保持乾淨,文字互動不會一直吵人。學習後每 5 秒依權重記錄的時間點與情緒,會變成一張看得懂的圖表,並附上文字說明。這些功能的設計想法與實作細節,我們寫在研究流程的「四、Unity 串接與特別功能」。
三、最後成果與預期效益
對照一開始計畫書裡的工作項目,我們最後完成了這些成果。臉部表情與專注度偵測模組已經完成,能辨識六類專注度狀態;影片事件觸發的部分,完成了文字互動(隔 30 秒)和暫停功能,自動標記影片難點與倒退則是之後想延伸的功能;虛擬角色互動模組用 Python 與 Unity 串接,即時同步表情和頭頸動作,還能按 C 重新校正;系統整合的部分,前端畫面和辨識模型已經各自完成,之後會由 Unity 擔任主控端,把番茄鐘和辨識模型整合在一起。
| 工作項目 | 最後成果 |
|---|---|
| 臉部表情與專注度偵測模組 | 辨識六類專注度狀態 |
| 影片事件觸發模組 | 完成文字互動(隔 30 秒)與暫停;自動標記影片難點與倒退為延伸功能 |
| 虛擬角色互動模組 | Python 與 Unity 串接,即時同步表情與頭頸動作,可按 C 重新校正 |
| 系統整合 | 前端畫面與辨識模型已各自完成,之後由 Unity 擔任主控端整合 |
至於預期效益,我們希望這套系統能即時看出使用者的專注狀態,給個人化的提醒,讓線上學習更有效率;產生的專注度曲線和狀態統計,也能幫忙學習分析和教學調整;而我們團隊自己也在過程中學到影像辨識、專注度分析、互動設計和系統整合。這些效益裡,即時辨識、虛擬角色回饋和文字互動已經做出來了,學習報告圖表也已經完成,真實學習數據的完整串接則是下一步。往後,這套系統可以放進線上課程平台或自主學習軟體,讓老師看到學生在哪個段落容易困惑,進而調整教材,也讓學生更了解自己的學習節奏。
| 預期效益 | 達成情形 |
|---|---|
| 即時監測專注狀態,提供個人化提醒 | 已完成即時辨識、虛擬角色回饋與文字互動 |
| 生成專注度曲線與狀態統計圖 | 學習報告圖表已完成,真實數據的完整串接是下一步 |
| 團隊學習影像辨識、專注度分析、互動設計與系統整合 | 完成特徵工程、模型比較、Unity 串接與介面 |
整體來看,我們完成了一套結合專注度辨識和虛擬角色陪伴的智慧學習監測系統。我們從臉部特徵點出發,用眼睛、嘴巴、頭部姿態和眉間距離這些看得懂的幾何特徵,再用比例和相對距離消除遠近的影響,而且不保留原始影像,兼顧了隱私。在專注度辨識上,SMOTE 搭配 XGBoost 讓測試準確率達到 81.73%,無聊和挫折這兩個最難的狀態也有明顯進步。辨識結果透過 Python 與 Unity 串接,讓虛擬角色即時換表情、轉頭,再加上使用說明、自訂時間、倒數與計時、暫停、文字互動和學習報告這些功能,使用者可以用比較輕鬆的方式完成一次學習。
這套系統能即時提醒、降低被監控的壓力,也讓老師從專注度曲線與狀態變化看出教材的難點,在線上學習上有不錯的應用價值。不過我們也知道還有不足:專注度辨識的資料只有 2,120 張,在真實複雜的場景裡表現如何還需要驗證;辨識只看單張影像,沒有用到連續影片;自動標記影片難點和完整的系統整合也還沒做完。
| 項目 | 內容 |
|---|---|
| 成果 | 專注度辨識測試準確率 81.73%;完成 Python 與 Unity 串接及特別功能 |
| 限制 | 專注度辨識資料僅 2,120 張;僅用單張影像;難點標記與完整整合未完成 |
一、參考文獻
| 資料集 | 用於 | 類別數 | 樣本數 |
|---|---|---|---|
| Student-engagement | 專注度辨識 | 6 類 | 共 2,120 張 |
本專題使用之資料集
- 本專題資料集 ①Joyee19. (n.d.). Student engagement [Data set]. Kaggle. Retrieved from https://www.kaggle.com/datasets/joyee19/studentengagement(用於專注度辨識)
中文文獻(網路資料)
- 國立臺灣大學 CASE(無日期)。部落格文章:多模態大型語言模型與學習情緒辨識相關報導。取自:https://case.ntu.edu.tw/blog/?p=46080
- ScienceDirect(無日期)。期刊文章:學習過程中會出現的情緒。取自:https://www.sciencedirect.com/science/article/abs/pii/S0959475211000806
- STEAM 教育學習網(無日期)。MediaPipe 臉部特徵點偵測(Face Landmark Detection)教學。取自:https://steam.oxxostudio.tw/category/python/ai/ai-mediapipe-2023-face-landmark-detection.html
英文文獻
- Breiman, L. (2001). Random forests. Machine Learning, 45(1):5-32.
- Chawla, N.V., Bowyer, K.W., Hall, L.O. & Kegelmeyer, W.P. (2002). SMOTE: Synthetic minority over-sampling technique. Journal of Artificial Intelligence Research, 16:321-357.
- Chen, T. & Guestrin, C. (2016). XGBoost: A scalable tree boosting system. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pp.785-794.
- Google AI Edge. (n.d.). mediapipe-samples, issue #645 [Source code repository]. GitHub. Retrieved from https://github.com/google-ai-edge/mediapipe-samples/issues/645
- Lugaresi, C. et al. (2019). MediaPipe: A framework for building perception pipelines. arXiv:1906.08172. Retrieved from https://arxiv.org/abs/1906.08172
二、版權與授權聲明
本網頁所使用的素材,其版權與授權處理方式說明如下。系統流程圖、混淆矩陣及系統畫面截圖,皆由本團隊自行製作或經實驗產生。資料集(Student-engagement)中的真人照片,以及第三方教學影片畫面,基於肖像權與著作權之考量,一律不於本網頁中呈現。3D 虛擬角色為第三方模型素材,系統畫面中的背景圖亦取自網路,上述素材僅供學術成果展示之用,著作權歸原作者所有;若日後作為商業用途或公開散布,須另行確認並取得授權。資料集僅用於學術研究與模型訓練,並遵守各資料集之授權規範。字型採用 Google Fonts 的 Noto Sans TC 與 Noto Serif TC,其授權為 SIL Open Font License。其餘文字內容皆由本團隊自行撰寫,所引用之文獻與網路資料均已列於前述參考文獻。