導讀:這篇文章聚焦於「rPPG 原理」,並延伸整理影像式生理訊號、應用案例、限制,幫你快速掌握重點。
延伸導覽:生醫產業趨勢與案例總覽
隨著生醫技術的飛速發展,生理訊號(Biomedical Signals)已成為生命科學和醫療領域中不可或缺的一部分。
從心電圖(ECG)、腦電圖(EEG)(有興趣可以看腦機介面,這篇有更詳細介紹)到肌電圖(EMG),光體積變化描記圖(PPG)可以透過光學的變化,偵測血液周期性的變化。直到今日,則甚至發現一般的照相機鏡頭就可以透過「非接觸」的方式,偵測到被拍者的心率變化。
本偏基於一篇Algorithmic Principles of Remote-PPG,用淺白的方式說明如何透過鏡頭拍攝出來的像素,經過訊號處理跟分析,透過線性轉換成可用的脈搏訊號,最後換算成心率的過程。
rPPG (Remote Photoplethysmography)
遠程光學生理訊號量測(remote Photoplethysmography, rPPG)是一種非接觸式技術,利用攝影機捕捉皮膚的細微光學變化來測量生理訊號,像是心率、呼吸頻率等等。
主要的原理是基於光學吸收特性,血液中的血紅素會吸收特定波長光(如綠光)會隨心跳週期變化,導致皮膚反射光強度微弱波動。
rPPG就是使用普通攝影機(如手機或網路攝影機)從臉部、手部等暴露皮膚區域提取訊號,並分析這些光訊號變化,提取生理資訊。
訊號處理流程

訊號的來源會從相機、手機等鏡頭中透過光源的反射被相機的感光元件偵測到。在串流的影像中,會因此收到包含人臉的一幀一幀的圖片。
為了避免背景、頭髮、髮飾等等造成計算上的問題,多數的演算法會透過現代CNN、DNN的ML方式擷取人臉的部分,目的是希望讓有「值」的像素盡量都是來自皮膚的訊號(才能夠偵測得到真正的心率訊號)。
接著,透過Extraction的方式把人臉的皮膚訊號轉換成脈搏的raw data,再經過filter過濾掉雜訊後,分析脈搏的訊號轉換成心率。
關於filter?
raw data本身會含有很多雜訊,就像在遠處的交通,你看到朋友再跟你說話的嘴巴,卻因為汽機車的引擎喇叭聲充斥,沒辦法聽到你朋友到底在說什麼。
從這個案子來說會包含測量的雜訊、光影變化的雜訊等等,照理來說會很難找到真正的訊號。那怎麼辦呢?
好在我們可以透過不同頻率的區間、音色的方式把不對的聲音過濾掉。以心率來說,我們知道人體的心率大概在60-150bpm之間,那我就知道除了這個區間以外的訊號肯定都不是心率訊號,可以把它過濾掉。
所以通常會使用帶通濾波(band pass filter),把雜訊的頻帶去除,留下合理範圍的頻率區間的訊號。
皮膚反射模型

從生理角度來看,當光線照射到皮膚的時候,會在表面產生鏡面反射以及穿透皮膚進到血管再反射出來的漫反射。
而光線到血管中,大部分會被血液中的血紅素吸收掉,反射出紅光。
因此在鏡頭或者眼睛中看到的光線,可以解釋成鏡面反射的光+漫反射的光+一些noise (例如眼睛有雜點或鏡頭髒掉等等的因素),而數學式子如下:

其中,鏡面反射以及漫反射又可以分成固定光強跟隨時間變化的光強,因此可以得到下方:

可以拆解出來,根據照射的光強、反射的變化、脈搏的變化都會影響到最後接收到的顏色變化。
I可以分成固定的光強(相較穩定的光照強度)和時間變化光強(因為交流電其實會產生微小高頻率不穩定的閃爍,只是肉眼分辨不出來)。
S鏡面反射可以分成反射光強的RGB顏色變化不同內積(可以理解為乘以)固定反射的光+閃爍的光。
P漫反射和脈搏的部分,則可以分成膚色內積漫反射強度和脈搏RGB變化內積脈搏強弱的訊號。
拆解開來後,會再發現膚色、固有光強、反射光強的顏色都會是相對穩定的,因此可以最後整理圖上左邊的式子。

最後,因為交流的部分強度相對小很多(幾乎肉眼看不到),因此可以理解交流訊號跟交流訊號的內積值會小到可以被忽略,最後會發現接受到的顏色會需要討論i(t)、s(t)、p(t)的線性組合關係。
特徵擷取問題
為了要拆解線性組合的關係,最後把真正的p(t)訊號分離出來,我們需要想辦法把原本的膚色、光強變化、鏡面反射變化的訊號去除掉。
從過去以來有不少研究嘗試過不同的演算法來做到這件事,可以分成:
- 盲源分流(BSS): ICA、PCA
- 基於模型方法: PBV、CHROM
- 數據方法: 2SR
- POS(Plane-Orthogonal-to-Skin)
盲源分流(BSS)
最一開始,考慮到線性組合的訊號分離,大部分人都會想到把資料做特徵擷取(Feature extraction),而最一開始最廣為人知的就是ICA和PCA兩種:

而這種基於數學的理論,有一個強假設:「不同訊號之間彼此獨立」,並且最後選擇最有週期性的訊號當作signal其他當作noise。
這樣的假設會導致,當真正的noise有很強的週期性訊號的時候會被當作為signal,例如偵測時人在做健身這種週期性的運動,而且肉眼可見的顏色變化強度大於脈搏訊號。
除此之外,PCA的算法是使用covariance估計空間的矩陣W,把資料投影到一個假想的平面上分離不同訊號,但是當資料變化不夠明顯的時候,就很難找到平面分開不同訊號。

而ICA的部分,則是假設Y(t)是獨立且非高斯的分布,只要討論到分布狀況,就需要讓訊號夠長才可以符合這個假設,但實際場域很常希望做到「即時」,會對應用上產生限制。
資料整理
首先,對於膚色這件事情,需要透過數學運算把膚色的訊息找出來(I0*u0*C0)。
而剛好,我們可以透過時間軸的關係來做到這件事,因為膚色在光照強度固定的情況下應該是固定的值,所以在時間上取平均值,就能得到一個代表膚色的正規化矩陣N。

而經過正規化之後,原本的固定常數就會變成0,而光照強度變化就會是沿著1方向的變化。也就是說,因為人的運動所造成的變化會直接地呈現在intensity這個部分。
而剩下的鏡面反射跟脈搏的漫反射就會因為正規化,讓數值忠實呈現。舉例來說如果有一個數值變動是[100,101,95,105],從原本數值看起來就是一個些微的變動,但是透過正規化後就可以呈現類似[0,1,-5,5]的變化。
PBV
PBV在資料處理之後,會將顏色變化全部投影到一維z做估計,可以想像讓不同角度的竿子透過照射去觀察竿子的影子。
根據已知的參數條件,假設血容量脈搏向量滿足upBv=N⋅up⋅I0會發現滿足血容量脈搏跟z維的關係為:

當燈光、感光片都固定時(鹵素燈、UI-2220SE-C感光片),可以得出upbv = [0.33,0.77,0.53]T,進而得到z維的關係換算成脈搏訊號。
但實際場域並不會都是鹵素燈,感光片也不會是固定型號,當這個假設不成立的時候,upbv的向量就不會是固定的,也無法很好拆解出脈搏訊號。
CHROM
為了要消除高光的部分,CHROM的作法則是定義脈搏訊號Cn(t)在垂直於鏡面變化方向的平面上投影。也就是說,透過消除鏡面反射的變化(因為內積都是0)的方式,來討論剩下的光強度變化和脈搏變化。
但在這個之前,因為鏡面變化已經為0,需要確定膚色的向量能夠被定義,這時候他們透過大量實驗,來算出一個最具代表性的標準化的膚色向量來實現白平衡。
接著使用時間正規化的膚色,投影到假定的標準化膚色的平面上,這時會得到一個Pc與M內積的矩陣,同時會創建2個投影訊號,讓運動與脈動出現在同向或反向中。
這個方法,他們稱為alpha-tuning,因為透過簡單的式子,標準差來比較S1或S2的訊號大小。當S1和S2反向的時候,可以透過alpha讓訊號加成。而當S1和S2同向時,則可以透過alpha讓運動訊號的比例透過負號消除。

但是這樣的理論必須建立在膚色屬於標準化膚色的情況,選擇先消除鏡面反射的變化,這會和實際場域相違背,當照相機、光線變化和皮膚質地不同時,膚色向量就會改變而無法很好分離運動與脈動訊號。
除此之外,alpha-tuning也會因當S1和S2訊號強度相當時,無法很好運作到消除或加成的效果。
2SR
不同於前面的模型理論,2SR完全根據data-driven的方法,創建了一個與主體相關的皮膚顏色空間,不考慮強度變化的情況下,追蹤隨時間的色調變化來測量脈搏。也就是說,我只考慮當下偵測到的膚色的變化來直接作為脈搏訊號。
然而,當空間測量不可靠的時候(例如蒙皮有噪音,或者選擇不當時)會有脈搏訊號不準的問題。
POS (Plane-Orthogonal-to-Skin)算法
綜合以上的不同理論,可以發現各自理論的優缺點:
- PBV透過時間正規化可以消除不同膚色的差異,但無法對血容量脈搏的條件有適應性。
- CHROM透過定義鏡面方向的平面,在使用alpha-tuning來調整訊號的向量,但膚色平面是非穩定的。
- 2SR排除了光強度變化造成的問題,但是當空間測量不可靠時會無法很好分離隨時間變化的顏色數值。
POS則匯聚了上述的優點,結合出了一個相對較穩定的方式。
2SR消除強度

首先因為2SR只考慮色調邊化而忽略強度,所以先把原式投影到正交於1的平面,藉此消除強度的變化。
接著,不同於CHROM,POS選擇定義一個與膚色正交的平面Pp(後面會提到),因為N⋅up⋅I0相對穩定(固定光源和感光片)。此時,只需要討論鏡面反射加脈搏的訊號變化。

PBV討論血液與光強關係
從生理特性的角度,血液容量脈衝會和反射光線產生直接的關係。其實不難理解,血「紅」素會吸收大部分的綠光,反射出紅光,所以能夠在光譜上發現,400奈米到700奈米之間的波長強度能夠測量到絕對的震幅。因此可以知道血液容量脈衝會跟光強的關係如上圖。
同時,應用原本PBV的理論,應該可以透過投影向量,將upbv轉換到成真實的脈搏強度,得到以下:

討論到這裡,投影向量變成一個需要固定下來的問題。相較於CHROM,選擇先消除鏡面變化並預設膚色是穩定的,脈搏發出的光度變化才是相對穩定的方法(因為血紅素吸收波長是固定)。
PPG特性
而該如何將投影向量固定(找到Pp)呢?
這部分則透過大量實驗數據來討論這個問題。他們假定了z1,z2,z3三個投影軸,並測試投影出來的脈動強度。從圖中發現z1和z2產生反向但跟原始訊號有高度週期的相關性,而z3則像是雜訊。從強度上也可以看到z1=-0.64, z2=0.68, z3=-0.04。

最後,透過實驗結果,他們定義了Pp的數據:

而定義好的平面,結合CHROM的方法能夠在找到這個向量矩陣後,映射出一個粗略的投影區,並產生S1和S2兩個脈動與鏡面反射的訊號,這時候S(t)可以從(28)被整理成(32)。

D(t) = [d1, d2, d3]T是根據RGB訊號強度做順序排列值做排序。基於upbv的脈動強度做對應的排序,也就是說從PPG特性中綠光應該變化是最強的(被吸收程度)而紅光是最小,所以可以知道順序應該是[Gn, Bn, Rn]。
由此可推論出S1(t) = Gn(t) - Bn(t),S2(t) = Gn(t) + Bn(t) + 2Rn(t),到這裡已經定義一個投影區域,並且投影軸應該是較高的脈動強度以及較低的鏡面反射強度,並且投影的訊號應該有同相的脈動強度及反相的鏡面強度。
CHROM的優化
然而,原本CHROM的方式是假設upbv保持穩定,但是因為無法固定光源跟感光等等元件,造成強假設不成立。這部分如果我們透過upbv的特性,討論可能的脈動區域而定義一個粗略的投影區,再透過tuning的方式精確動態調整方向是不是能讓原本的假設有更多彈性?
要能夠增加彈性的前提必須要先滿足「鏡面反射與脈動訊號在平面上是可分離的」的條件,從實驗的圖表上可以看到,鏡面反射與脈動在正規化膚色的RGB有不同的相對強度,並且兩訊號週期性相關性很低,因此可以認為條件滿足。

在應用alpha-tuning後,可以列出下式:

可以了解到當脈動變化大的時候,S1(Gn-Bn)和S2(Gn+Bn-2Rn)同相,可以利用alpha將訊號強度提高;而當鏡面反射變化較大時,S1和S2反相,假如S1比較強,alpha就可以加乘S2,而S2較強時會縮小S1強度,讓S1與S2反向相消減少鏡面反射失真。
算法
綜合前面的作法整合,可以得到整理後的pseudo code其實很簡單:

在前處理將資料統整後,在臉部的空間相素上做Spatial avergaging後,針對時間序列的資料作正規化(PBV)。
接著對原本的訊號做經過大量實驗數據驗證的投影矩陣,轉換到與膚色正交的平面上,會產生S1和S2,最後透過alpha-tuning來微調每次的平面向量,分離出脈搏的訊號。
參考資料
https://github.com/Drovosek81/rPPG_FrameRate
https://blog.csdn.net/weixin_49747246/article/details/119999336
https://research.tue.nl/en/publications/algorithmic-principles-of-remote-ppg
結論
時隔已久的文章總算寫出來了!
這次是因為正職的公司需求剛好從影像辨識中發想一些應用,才針對光學攝影機的使用場域討論到了生理訊號的辨識。
中間的線性轉換跟生理特性的理解花了大概兩個禮拜的時間,甚至到寫文章的部分也花了很多思考時間做整理。
在我準備的過程中間思考卡住的地方說多做解釋,希望讓讀這篇的你可以更好更快速的理解這種光學轉生理訊號的原理!

有興趣想討論,或想要取暖的話歡迎加入生醫討論群唷~




