天天看點

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統

Intelligent elderly care system based on computer vision

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

基于計算機視覺的智慧養老系統通過(模拟)多組攝像頭實時拍攝到的畫面,用計算機視覺技術實時分析老人的情感、是否有人摔倒、是否有人闖入禁止區域、老人是否有和義工互動、是否有陌生人出現并追蹤陌生人。一旦上述事件發生,該事件會立即插入到資料庫中。這些事件資料被實時地更新在報表中,管理人員是以可以迅速做出反應,進而可以提高管理人員的服務水準和管理能力。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

本系統分為2部分,分别是 Web 使用者界面 和基于計算機視覺的攝像頭(群組)。其中,系統 Web 使用者界面僅供系統管理者使用。系統管理者使用該系統不僅可以管理老人、從業人員和義工的資訊,包括錄入、檢視等,還可以檢視實時監控以及得到實時的事件報警,如陌生人入侵、陌生人追蹤等。Web 使用者界面的功能結構圖如下圖所示:

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

本文重點介紹該項目中攝像頭(群組)負載的計算機視覺任務及其算法實作。根據項目需求,設計了如圖所示的系統安裝環境。辦公室的攝像頭用于收集人臉資料;房間的攝像頭檢測陌生人和老人微笑,走廊的攝像頭檢測是否有人摔倒,活動室的攝像頭放在桌子上,當有義工通路才拿出來使用,同時在活動室安裝标定闆(用于獲得世界坐标系與像素坐标系的映射關系),院子的攝像頭監控是否有人闖入禁止區域。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • Nginx-RTMP與直播推流

在實時監控方面,搭建 Nginx-RTMP 直播推流伺服器。Nginx 是一個非常出色的 HTTP 伺服器, FFMPeg 是非常好的音視訊解決方案。這兩個東西通過一個 Nginx 的子產品 nginx-rtmp-module, 組合在一起即可以搭建一個功能相對比較完善的流媒體伺服器。這個流媒體伺服器可以支援RTMP和HLS(Live Http Stream)。

RTMP 在網際網路 TCP/IP 五層體系結構中應用層,RTMP 協定是基于TCP協定的,是面向連接配接的協定,能夠為資料的傳輸提供可靠保障,是以資料在網絡上傳輸不會出現丢包的情況。不過這種可靠的保障也會造成一些問題,也就是說前面的資料包沒有傳遞到目的地,後面的資料也無法進行傳輸。系統的視訊流傳輸結構如圖所示。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • 單樣本學習與人臉識别

在人臉識别的情況下,模型或系統可能隻有一個或幾個給定人臉的樣本,并且必須從新照片中正确識别出該人,包括在表情、發型、光照和首飾等都有所變化的情況下。是以,人臉識别是單樣本學習的常見例子之一 。

現代人臉識别系統通過學習豐富的低維特征表示方法(稱為人臉嵌入)來解決通過人臉識别進行單樣本學習的問題。這種低維特征表示可以很容易地計算出人臉,并在驗證和識别任務中進行比較。

從曆史上來看,嵌入是通過使用孿生網絡(Siamese network)來解決單樣本學習問題的。通過對具有對比損失(Comparative Loss)函數的孿生網絡進行訓練,獲得了更好的性能,後來導緻了 Google 在 FaceNet 系統中使用三重損失(Triplet Loss)函數,這個函數在基準人臉識别任務取得了當時最先進的結果。

如圖所示,傳統 CNN 包含卷積層、全連接配接層等元件,并采用 softmax 多類别分類器和多類交叉熵損失函數。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

孿生神經網絡是單樣本學習中最具代表性的模型。孿生網絡是由兩個并行神經網絡構成的架構,每個神經網絡采用不同的輸入,其輸出被組合起來以提供一些預測。這個網絡的兩個子網絡相同(不同則為僞孿生神經網絡),兩個子網絡有相同的參數和權重。其目标是尋找兩個可比較對象的相似程度(例如,簽名驗證、人臉識别等)。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

學習像圖像這樣的複雜輸入的向量表示就是降維的一個例子。有效降維的目标是學習一種新的低維表示,它保留了輸入的結構,使得輸出向量之間的距離能夠有意義地捕捉到輸入中的差異。然而,向量必須捕獲到輸入中的不變特征。降維是孿生網絡用于解決單樣本學習的方法。

Raia Hadsell 等人在 2006 年發表的一篇題為《學習不變映射的降維》(《Dimensionality Reduction by Learning an Invariant Mapping》)論文中,探讨了利用具有圖像資料的卷積神經網絡進行孿生網絡降維,并提出了通過對比損失對模型進行訓練的方法。與在訓練資料集中的所有輸入樣本中評估模型性能的其他損失函數不同,對比損失是在成對的輸入之間計算的,例如提供給孿生網絡的兩個輸入之間。對比損失是在成對的輸入之間計算的,例如提供給孿生網絡的兩個輸入之間。

成對的樣本被提供給網絡,損失函數根據樣本的類别是相同的還是不同對模型進行不同的懲罰。具體來說,如果類是相同的,損失函數就鼓勵模型輸出更為相似的特征向量,而如果類不同的話,那麼損失函數就會鼓勵模型輸出不太相似的特征向量。是以,對比損失可用來訓練人臉識别系統,特别是用于人臉認證的任務。

對比損失的概念可以進一步擴充,從兩個樣本擴充到三個樣本,稱為三重損失。Google 的 Florian Schroff 等人在 2015 年發表的論文《FaceNet:人臉識别和聚類的統一嵌入》(《FaceNet: A Unified Embedding for Face Recognition and Clustering》)中介紹了三重損失。

Triplet 是一個三元組,這個三元組是這樣構成的:從訓練資料集中随機選一個樣本,該樣本稱為 Anchor,然後再随機選取一個和 Anchor 屬于同一類的樣本和不同類的樣本,這兩個樣本對應的稱為 Positive 和 Negative,由此構成一個(Anchor,Positive,Negative)三元組。損失函數對模型進行懲罰,減小比對樣本之間的距離,增加了非比對樣本之間的距離。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

這種方法是 FaceNet 系統的基礎。FaceNet 是一個通用的系統,可以用于人臉驗證,識别和聚類,它直接學習圖像到歐式空間上點的映射,兩張圖像所對應的特征的歐式空間上的點的距離直接對應着兩個圖像的相似程度。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

在本系統中,人臉驗證的思路是通過人臉檢測器将人臉從圖像中提取出來,通過Facenet 進行驗證。如下圖所示:

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

對比了不同的人臉檢測器,發現OpenCV中提供的DNN運作速度快,對遮擋等情況适用。

檢測器 第三方庫 CPU 非正面和遮擋
Haar OpenCV 實時 不起作用
DNN OpenCV 實時 适用
HoG Dlib 最快 輕微遮擋和稍不正面
CNN Dlib 很慢 适用

不同人臉檢測器的效果如下圖所示

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

此外,從使用者角度出發,在建立人臉資料庫時,通過 OpenCV 和 win32com 從文字和語音方面進行操作提示。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • Mini-Xception 與微笑檢測

在微笑檢測上,我們使用了基于fer2013資料集的Mini-Xecption模型,該模型移除了全連接配接層,結合了殘差子產品和深度可分離卷積減少參數,達到實時檢測的目的。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

😀 移除全連接配接層:VGG16 中90%的參數位于全連接配接層,與 AlexNet 相比,Mini-Xception 參數從 60M 減少到了 600,000

😀 結合了 residual modules 和 depth-wise separated convolutions

  • residual modules enable the gradients better back-propagate to lower layers
  • depth-wise separated convolutions spatial cross-correlations are separable convolutions channel cross-correlations. Therefore the number of parameters is further reduced in convolutional layers
  • 人臉識别綜合算法

綜上,我們首先建立人臉資料庫,通過人臉檢測器提取出圖檔中的人臉進行處理,利用 Facenet 計算新圖檔中人臉與資料庫中人臉的歐式距離 ,若最小值大于標明的門檻值(基于 KNN 和 SVM),則發出陌生人警告,反之,若新圖檔中的人臉為老人,則通過 Mini-Xception 選擇置信度最大的情緒識别結果。算法結構如下圖所示。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • 物體運動特征與摔倒檢測

摔倒檢測方面,從單幅圖像上來看,我們可以提取出人的高度、寬度和夾角資訊。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

從時間序列上來看,除了上述特征,我們還可以提取出速度和加速度,摔倒行為的特征表現如圖所示。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

在 中使用的背景差分法,由于易受到攝像頭擺動等因素幹擾而影響測量準确度。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

故在本項目中使用 OpenPose 提取人體關鍵點進而提取人體運動特征。OpenPose 是由 C++ 開發的開源庫,可用于實時人體姿态估計等,為了在python 中使用,需要對其進行編譯。(在 提供了基于 Windows 10 + Python 3.7.4 + vs2017 +cmake 3.18.0 + OpenPose 1.6 + CUDA 10.0 +cudnn -10.0-windows10-x64-v7.6.5.32 的編譯結果,自行編譯請參考 )

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

但 OpenPose 在人體姿勢極端的情況下,識别準确度下降,為識别摔倒的老人通過揮手臂等方式求救,我們實作了基于人體關鍵點和背景差分的摔打檢測算法,利用人力關鍵點提取出速度、高度、寬度等描述特征,當發生異常通過背景差分提取出角度特征,當特征連續多次滿足摔倒檢測門檻值時,則發出摔倒報警。算法結構如圖所示。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

該摔倒檢測算法的效果如下

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • 系統标定與互動檢測

在互動檢測上,我們假定老人與義工的距離小于50cm即發生互動。是以需要建立像素坐标系與世界坐标系的映射關系。僞随機序列具有良好的視窗特性,即通過一個較小的視窗在編碼圖案上面移動時,每個視窗内的編碼組合是唯一的,根據視窗的這個特性可以唯一地辨識編碼圖案上的特征點。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

作為本原多項式生成僞随機序列,通過伽羅華域下的四則運算,生成

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

的僞随機矩陣,視窗大小為

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

編碼圖案以菱形作為基本圖案,菱形的角點作為特征點,以紅、藍、綠、黑四種顔色作為菱形的顔色。分别對應矩陣中的不同數值,通過顔色及位置對特征點進行編碼,進而可以唯一确定圖案中某一角點的位置,進而确定不同角點在世界坐标系下的相對位置。

通過設計的解碼算法,可以将角點位置精确到亞像素,在Lab演色空間下進行顔色分類,完成解碼。

  • 确定候選特征點:
    基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • 确定特征點:
    基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • 8鄰域廣度優先搜尋将特征點位置精确到亞像素
  • 色彩校正、Lab 顔色空間對菱形顔色分類并解碼

标定部分算法結構可參考下面僞代碼:

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

如圖分别為拍攝原圖,角點位置和顔色分類結果。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統
  • 移動物體監測與跟蹤

在禁止區域入侵監測方面,包括物體監測和物體追蹤兩部分。在本項目中,物體檢測的目的是識别出人這個物體,而物體追蹤則是追蹤畫面中檢測到的人。在對比了不同物體檢測方法(如 R-CNN、YOLO等)後,出于實時性和準确性的考慮,選擇了質心跟蹤算法。其算法步驟如圖所示。

基于計算機視覺的智慧養老系統 基于計算機視覺的智慧養老系統

Features

  • OpenCV 人臉檢測器識别人臉,拍照錄入人臉資訊
  • win32com.client 語音提示
  • FaceNet 單樣本人臉識别
  • Mini-Xception 基于 fer2013 資料集的表情識别
  • 綜合 Face Detector+FaceNet+Mini-Xception 的老人微笑檢測+陌生人檢測(Happy-Elder-Care-Net)
  • 提供基于 Python 3.7.4 + vs2017 +cmake 3.18.0 + OpenPose 1.6 + CUDA 10.0 +cudnn -10.0-windows10-x64-v7.6.5.32 的編譯結果
  • 基于 Windows 10 + OpenPose + Background Subtraction 計算人體高度、寬度、角度、速度等名額的摔倒檢測
  • 基于 GF(4) 标定的互動檢測
  • 基于質心跟蹤的入侵檢測和追蹤
  • 基于 Nginx-RTMP 的直播推流

繼續閱讀