行為識別常用哪種特徵提取?

最近在做行為識別,不知道該如何下手


我是中科院計算所的博士研究生,以前做過一些行為識別方面的研究。這裡提供幾個鏈接:

一、我的github上關於機器學習及行為識別的資料,有課程有資料有論文,比較詳細:GitHub - jindongwang/MachineLearning: 一些關於機器學習的學習資料與研究介紹 GitHub - jindongwang/activityrecognition: Information about activity recognition

二、關於提特徵的問題,主要是時域和頻域特徵,用滑動窗口提取特徵,比如平均數、方差、過零率等,還有傅里葉變換後的幅度、頻率、均值等。

三、可用數據集:

來自UCI的一個行為識別數據集,可用來練手:UCI Machine Learning Repository: Daily and Sports Activities Data Set

四、我寫的python和matlab提取特徵代碼,見文章最後

五、最近剛發現一個自動提取時間序列特徵的庫,可以省不少事,地址在這裡:blue-yonder/tsfresh

Matlab版本的在這裡:https://github.com/benfulcher/hctsa

下面以行為識別中最常用的加速度為例,分別從滑動窗口、時域特徵、頻域特徵三部分做簡單的分析。文章最後附有我寫的python提取特徵程序。

0.滑動窗口

滑動窗口由兩個關鍵變數構成:窗口大小(windowssize)和滑動步長(step)。其中,窗口大小指的是一次處理的數據量。假設感測器採樣頻率為f	ext{Hz},那麼一個窗口大小通常設定為2f,步長為f

在實際應用中,由於要提取頻域特徵,為使得傅里葉變換可計算(變數必須滿足是2的冪),實際窗口大小的計算公式調整為:

	ext{windowsize}=2^{ceil({log_{2}(2*f)})}

這樣能保證提取頻域特徵時,傅里葉變換的順利進行。

1.合成加速度

加速度計通常有三軸讀數(x,y,z),分別表示三個方向的加速度值。在實際應用中,除去一些特定的動作需要使用特定的單軸來辨別方向之外,通常我們是將三軸加速度合成為一個加速度值(合成加速度),之後的特徵提取與分類全以合成加速度為初始數據進行。這樣在確保精度的同時,減少了計算複雜性。

a_i表示合成加速度,a^x_i,a^y_i,a^z_i分別表示三軸加速度計讀數,iin{1,2,...,n}表示第i條加速度計讀數,合成加速度的計算方式為:

a_i=sqrt{(a^x_i)^2 + (a^y_i)^2 +(a^z_i)^2}

2.時域特徵

時域特徵(time domain features)是指,在序列隨時間變化的過程中,所具有的與時間相關的一些特徵。我們用n來表示一個時間窗口的大小(即窗口內數據的行數),用i來表示第i 行數據,常用的時域特徵如下:

2.1.均值mean

計算公式:mean=frac{1}{n} sum_{i=1}^{n}{a_i}

Matlab中可用的函數:mean()

Python中可用的函數:numpy.mean()

2.2.標準差std

計算公式:std = sqrt{frac{1}{n} sum_{i=1}^{n}{(a_i - mean)^2} }(根號下寫成frac{1}{n-1}亦可).

Matlab中可用的函數:std()

Python中可用的函數:std()

2.3.眾數mode

一般來說,一組數據中,出現次數最多的數就叫這組數據的眾數。例如:1,2,3,3,4的眾數是3。

但是,如果有兩個或兩個以上個數出現次數都是最多的,那麼這幾個數都是這組數據的眾數。例如:1,2,2,3,3,4的眾數是2和3。

還有,如果所有數據出現的次數都一樣,那麼這組數據沒有眾數。例如:1,2,3,4,5沒有眾數。

為了計算方便,如果有多個眾數,我們取平均作為惟一的眾數。

Matlab中可用的函數:mode()

Python中可用的函數:mode()

2.4.最大值max

一個窗口內的最大值。

計算公式:max=max{(a_i)},iin{1,2,...,n}

Matlab中可用的函數:max()

Python中可用的函數:max()

2.5.最小值min

一個窗口內的最小值。

計算公式:min=min{(a_i)},iin{1,2,...,n}

Matlab中可用的函數:min()

Python中可用的函數:min()

2.6.範圍range

一個窗口內最大值與最小值的差。

計算公式:range=|max-min|

Matlab中可用的函數:abs(max()-min())

Python中可用的函數:abs(max()-min())

2.7.過均值點個數above\_mean

一個窗口內超過均值點的數據個數。

計算公式:above\_mean=sum_{i=1}^{n}mathbb{I}(a_i>mean),其中mathbb{I}(cdot)是指示函數(indicator function),當括弧里條件成立時取值為1,否則為0。

2.8.相關係數
ho

相關係數是指對於兩個向量(比如x,y這兩軸讀數)之間的相關性。一般用在辨別一個方向的運動較多,不是很常用。

計算公式:
ho_{x,y}=frac{cov(x,y)}{sigma_x sigma_y}

其中,cov(x,y)表示x,y的皮爾遜相關係數,sigma_x,sigma_y分別表示x,y的標準差。

2.9.信號幅值面積SMA

信號幅值面積(Signal Magnitude Area,SMA)指x,y,z三軸的加速度讀數曲線分別與三個坐標軸圍成的面積之和。一般來說,靜止狀態和運動狀態下該特徵比較明顯。

計算公式:SMA=frac{1}{t}left(int_{0}^{t}|x(t)|dt+int_{0}^{t}|y(t)|dt+int_{0}^{t}|z(t)|dt 
ight)

其中,t表示一個時間窗口的大小。由於涉及到積分運算,該特徵一般不常用。

3.頻域特徵

頻域特徵(frequency domain features)通常被用來發現信號中的周期性信息。例如,跑步和走路都是典型的周期性運動。頻域分析主要用快速傅里葉變換(Fast Fourier Transform,FFT)來計算。

Matlab中進行快速傅里葉變換的函數:FFT()

由於信號是一維的,對長度為n的信號進行傅里葉變換後,得到n個變換後的數值。頻域特徵就主要從這n個變換後的數值得到。為了方便理解,下面舉例說明。

舉例:原數據有8個:1,2,3,4,5,6,7,8.

經過FFT後得到以下8個數:

36.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i

-4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569i

從這8 個數中可以很明顯地看到,第1個數最大,剩下7個數以第5個數為中心是對稱的。這是傅里葉變換所決定的。所以在實際計算中,除去單獨取第1個數以外,剩下的數可以只取一半。

3.1.直流分量DC

直流分量(Direct Current,DC)是傅里葉變換後的第一個分量,是這些信號的均值,一般要比其他的數大得多。

3.2.幅度

幅度就是變換後數據的絕對值。

3.3.功率譜密度PSD

功率譜密度(Power Spectral Density,PSD)用來描述數據在頻域的能量分布。

功率譜密度分為幅度統計特徵和形狀統計特徵這兩種特徵。

3.3.1 幅度統計特徵

C(i)是第i個窗口的頻率幅度值,N表示窗口數,則幅度統計特徵的幾個量計算方式如下:

a.均值mean:

mu_{amp}=frac{1}{N}sum_{i=1}^{N}C(i)

b.標準差standard deviation:

sigma_{amp}=sqrt{frac{1}{N}sum_{i=1}^{N}[C(i)-mu_{amp}]^2}

c.偏度skewness:

gamma_{amp}=frac{1}{N}sum_{i=1}^{N}[frac{C(i)-mu_{amp}}{sigma_{amp}}]^3

d.峰度kurtosis:

gamma_{amp}=frac{1}{N}sum_{i=1}^{N}[frac{C(i)-mu_{amp}}{sigma_{amp}}]^4-3

3.3.2 形狀統計特徵

C(i)是第i個窗口的頻率幅度值,N表示窗口數,S=sum_{i=1}^{N}C(i),則形狀統計特徵的幾個量計算方式如下:

a.均值mean:

mu_{shape}=frac{1}{S}sum_{i=1}^{N}iC(i)

b.標準差standard deviation:

sigma_{shape}=sqrt{frac{1}{S}sum_{i=1}^{N}(i-mu_{shape})^2C(i)}

c.偏度skewness:

【感謝@Tang指正,此處寫錯了下標】

gamma_{shape}=frac{1}{S}sum_{i=1}^{N}left(frac{i-mu_{shape}}{sigma_{shape}}
ight)^3 C(i)

d.峰度kurtosis:

gamma_{shape}=frac{1}{S}sum_{i=1}^{N}[frac{i-mu_{shape}}{sigma_{shape}}]^4C(i)-3

我寫的滑動窗口提特徵代碼(Matlab+Python)見這裡:jindongwang/activityrecognition


目前都是使用spatio-temporal features做分類,主流的特徵有Harris3D,HOG3D,
Cuboids 等,然後使用Bag of words方法形成動作特徵字典,最後再用諸如SVM,adaboosting等方法分類。不過現在CNN也有不少做這個的。


可以考慮使用STIP特徵,然後使用Bag of words方法形成動作特徵字典,最後使用一般的分類器(如softmax,SVM)就可以完成常規的行為識別。


本科畢業設計做的視頻中人行為識別。一種分類方式是將其分為兩大類,一大類是基於局部描述子的statistical information的方法,像HOG3D等,其他朋友的回答中也有提到。這一類中目前知道的比較好的是Dense Trajectory(DT)方法,作者在這個方法上下了很大功夫,由DT方法在ICCV,CVPR,IJCV上發表了好幾篇文章(文章名字都很像,都是講DT這一個東西的,只是做了一些改進,像15年的文章裡面考慮了相機抖動、用Fisher encoding代替Bag of feature以取得更好效果等),源碼有提供LEAR - Improved Trajectories Video Description,我在JHMDB數據集上做過實驗,效果還不錯。另一大類是基於pose的行為識別方法,pose可以提取更加細節的信息,先用pose estimation方法估計pose,再從pose中提取各個關節之間的角度、距離等等作為特徵。但受pose estimation準確率的影響,目前這種方法不是很常用,但實驗發現在理想的pose estimation情況下這種方法準確率是很高的(高於DT),所以可能是未來行為識別領域的一個發展趨勢,源碼見http://jhmdb.is.tue.mpg.de/challenge/JHMDB/datasets。

另外,在選擇實驗數據集的時候可以參考12年的CVPR Tutorial,裡面詳細介紹了目前的開源數據集以及截止12年各個數據集的分類準確率。


基於深度攝像頭的行為識別比較容易獲取。比如運動軌跡,速度,角度。步頻,步幅。 晃動幅度,姿勢,手勢,高度變化,等等。傳統攝像頭就比較難一些。


幾年前做個的一個小東西,主要對交通路口的行人行為進行識別,精度還可以

識別特種提取應該分為整體和局部

難點是把目標從背景中分離出來,路口的行人太多,另外過往車輛造成的干擾太大,使用光流的話,得到的目標不幹凈,使用幀差又會丟掉一些細節信息,最後想了很多辦法;

目標提取後,其實就簡單多了,先獲取目標的輪廓信息,作為整體特徵

然後獲取目標的SURF特徵做局部特徵

整體特徵和局部特徵是有對應關係的,可以理解為圖像的高低頻信號(細節結構),都很重要

其他的就是採樣訓練


mark,去過計算所,聽過陳益強老師的報告。


我寫論文想引用你的總結 求出處。。。。。


在計算機視覺領域的行為識別,卷積神經網路CNNs應該現在效果會不錯吧,自動特徵提取


行為識別達到何種程度?


推薦閱讀:

OpenCV已經將圖像處理(識別)的演算法寫成函數了,那我們還有必要去學習這些演算法不?
用演算法怎樣識別圖片上的植物?
能否搜索某視頻的其中一幀畫面?或者通過一張圖片搜索此圖來自哪個視頻?
Facebook 的人工智慧實驗室 (FAIR) 有哪些厲害的大牛和技術積累?
先進的圖像識別怎樣改變 AV 產業?

TAG:OpenCV | 圖像識別 | 計算機視覺 | 特徵提取 |