2018 年 4 月

第 33 卷,第 4 期

本文章是由機器翻譯。

機器學習服務 - 運動方面的感應器:利用 AI 分析人體移動

Kevin Ashley

未來,運動員可能可以開啟他們的電話,並詢問簡單的問題:「 我怎麼如何改善我的技能? 」 我們仍要進行早期步驟運動 AI 朝回答的基本問題,但我們希望的產能的 Microsoft 工具和參考資料將會一天設日常的案例。與許多運動,很難人類的眼睛觀察運動員可能會讓活動的過程中的所有動作,但很可能記錄甚至 unobservable 資料與感應器。藉由使用這項資料的機器學習 (ML),運動員和指導可以和了解改善依照精確的測量和分析。已檢測的運動員成為新的競爭優勢。

如果目前的趨勢會繼續,幾年來銷售存放區中大部分的運動設備必須內嵌智慧感應器。Electronics 變得更小、 更亮和更有彈性,而且可能我們可以看到它們內嵌在網狀架構、 鞋子、 ski、 網球拍和其他類型的智慧型齒輪。您可以判斷如何套用技術和物聯網 (IoT),行動裝置應用程式,Microsoft Azure 在學習的技巧和 ML 以運動。

若要採用這項技術輕鬆,我們建立了開放原始碼感應器套件與元件來處理、 量值、 分析和改善感應器運動效能度量。經過一段時間,我們的目標是發展以及 electronics 和運動設備公司和運動關聯和愛好者社群感應器套件。感應器套件與這個發行項的所有範例位於bit.ly/2CmQhzq。這包括 R、 Python、 C#、 Xamarin 及 Azure Cosmos DB 程式碼範例。圖 1顯示冬季運動行動應用程式,示範感應器組件的使用,並為冬季 sports.co 下載。

感應器套件整合,說明影響 Skier 強制冬季運動行動裝置應用程式
圖 1 感應器套件整合,說明影響 Skier 強制冬季運動行動裝置應用程式

最近大幅增加的運算能力、 可靠性和負擔的感應器配備的硬體已進行許多案例新可行。和 AI 的感應器信號運動員所產生的應用程式中的進階功能提供了解及改善運動效能的新方法。例如,提供可解譯運動員感應器訊號 」 活動的簽章,」 中所示圖 2,可讓運動分析超越 gross 活動追蹤和彙總,並測量技能的索引鍵的項目或活動。從 [加速透過特定的輪中,可以方向 g-強制 engendered 期間每毫秒,產生的運動分析要重新定義。在本文中,我們將詳細說明如何偵測到這些活動的簽章;在此情況下,有問題的活動是開啟滑雪或滑板時進行。

活動會滑雪或滑板中的簽章
圖 2 滑雪或滑板中開啟活動簽章

在雲端中使用 Azure 人工地智慧 (AI),我們內嵌感應器資料,將其轉換為豐富的分析,然後點選 ML 以擷取運動員和指導更有用的資訊。ML 模型使其可分類 [專業技術層級,在每個技術執行,並甚至可能是預測的進度和未來運動員即將競爭事件時的效能。共用的資料標準的好處是這樣運動員來建立基準相對於本身或其社群聯繫,以了解差異、 弱式點和優點。和使用中但能夠實作 AI 邊緣,新的進階功能,我們可以推送活動辨識、 預測模型評分和效能測量一次快速可用性運動員在其裝置上或在混合的現實顯示中的裝置。我們希望這個資料集的開放原始碼資源 nurtures 和加速運動社群的創新。

感應器組件概觀

感應器套件是一組的開放原始碼跨平台資料的產能工具,包括工作擷取資料、 分析和 ML,以及感應器硬體參考設計的程式碼範例。套件可協助運動科學家、 coaches 和運動員擷取運動員移動毫秒精確度和 ML 模型評估的資料移動分析。套件被設計來協助設備製造商、 資料和運動科學家和 coaches 感興趣的運動科學中,包括 ML 和 AI 現代化的方法。圖 3提供感應器組件的項目高層級檢視。在下列各節,我們會說明感應器組件,從硬體、 擷取資料和資料轉換、 分析、 ML 和簡報的許多項的目。

運動應用程式的感應器套件
圖 3 感應器運動應用程式套件

套件被設計成允許運動愛好者或 professional,以使用部分或所有元件。例如,分析師可能只需要內嵌的感應器資料訊號,並將該資料轉換成可供分析的格式的方式。資料管線的程式碼範例可供許多典型的原始資料格式。或分析師可能想要進一步利用邏輯或程式碼,以將資料轉換成您可以使用的分析報表或預測的 ML 模型。我們提供數個辨識特定體育活動和效能量值的活動,例如程式碼集、 開啟和加速實現超出開啟。感應器套件 SDK 被寫入納入考量,跨平台開發跨平台的.NET 標準 2.0 C# 程式庫,以及它會將編譯使用 Xamarin,如此您就可以在 Android、 iOS 和 Windows 應用程式中使用它。

感應器硬體

圖 4顯示感應器套件的硬體。何謂感應器硬體製造商通常是指感應器為單一用途測量裝置。在本文中感應器是強大接受和處理來自多個感應式輸入資料、 將結果儲存和傳輸回至主機或閘道 inertial 度量單位 (IMU) 裝置。感應器系統所組成:

  • IMU 能夠提供 9 DOF (自由度) 在 40-100 Hz 加速計、 迴轉器和磁力計資料。
  • 藍芽低能源 (B) 或其他無線通訊的方式。
  • 適當的彙總或未經處理的感應器資料的儲存體。
  • 其他的感應器,例如用於相近、 位置以及其他等等。

感應器套件硬體
圖 4 感應器套件硬體

資料模型和管線

此一說當,千位英哩之旅開頭的第一個步驟。並深入了解程式碼範例來擷取,讓我們開始轉換,並準備資料供稍後分析及簡報。  設計資料結構或 「 資料模型 」 和設計從裝置到儲存體,則轉換和呈現運動員和指導資訊的資料管線,我們會說明在這裡,兩個基本項目。

讓我們開始的資料模型。感應器組件有三種模式的資料彙總 — 摘要、 事件層級與原始記錄:

  • 感應器上的預先彙總的資料摘要的資料。在大部分的零售感應器案例,這可以是相對較小的裝載傳輸與每個資料集。
  • 事件層級的資料會觸發特定事件,例如開啟、 跳等等。事件層級資料可能會有多個數百或數千個資料錄,每個工作階段。這些事件根據預先定義的活動衍生自感應器資料的簽章。它們是開啟 「 偵測活動簽章從感應器資料 」 一節中所述更多詳細資料。
  • 未經處理的記錄是最佳的記錄資料的頻率高,通常是最上層的頻率感應器可以提供-40-100 Hz,或多個。

根據感應器的取樣率、 原始記錄資料的彙總可能需要允許接近即時的資料從裝置集合。在更廣泛的取用者大量的市場情況下,產生、 儲存和傳輸因此更精細的資料可能過多,因此我們定義傳輸稍微彙總的資料,以減少資料的輸送量需求感應器套件中的標準模式。如果您需要的所有詳細的資料,感應器套件可讓您啟用詳細資訊記錄使用 SetLogging(true) 呼叫。

連接到感應器

讓我們開始資料管線從本身的感應器的描述。初始化感應器套件很簡單,只需呼叫初始化方法:

SensorKit.Instance.Init();

感應器組件的運作提取及發送模式;使用提取模式的應用程式必須明確地呼叫同步方法上感應器,在推送模式時自動註冊感應器的通知。若要啟用推播更新,您可以呼叫 SetAutoUpdates(true)。若要訂閱感應器的更新,請使用 Subscribe 方法:

await Task.Run(async () =>
{
  await sensor.Instance.Subscribe();
});

感應器套件取用感應器中的資料,提供時間同步處理方法,並將資料傳送至雲端。時間同步處理時,很重要,特別是運動員可以有多個附加的感應器和感應器套件會自動解析硬體裝置上的時間戳記與感應器套件啟用應用程式主機裝置上的時間。若要將資料儲存在雲端中的方法是取決於應用程式開發人員;程式庫提供 Cosmos DB 連接器和 Azure 容器為了方便起見,如下所示圖 5

在 Visual Studio 中的感應器套件程式庫
圖 5 感應器套件程式庫,在 Visual Studio 中

感應器套件提供某些事件已轉換的資料和彙總來自裝置本身。以下清單中的項目結構描述會描述這些資料元素的分類:

  • SensorItem:單一感應器資料的項目。項目可以是任何持續時間] 或 [資料粒度
  • SensorTurnData:開啟的彙總的資料
  • SensorAirData:跳躍點的彙總的資料
  • SensorSummaryData:感應器每彙總的摘要資料
  • SensorRawData:高頻率未經處理資料 (例如,100 Hz)
  • UserData*:使用者層級資訊 (特定選擇性的應用程式)
  • TeamData *:小組層級的資料,小組的運動員 (特定選擇性的應用程式)

以 Cosmos DB 儲存感應器資料

當然,有許多選項將雲端資料載入時。Cosmos DB 最適合用於 IoT 和遙測資料,如下所示圖 6,並載入和查詢資料,以及延展性和全域發佈提供多個應用程式開發介面。

Cosmos DB 與感應器套件的文件
圖 6 Cosmos DB 與感應器套件的文件

感應器套件包含 Cosmos DB 連接器與 Azure 函式的儲存體容器,您可以在找到bit.ly/2GEB5Mk。您可以輕鬆地使用感應器套件使用下列方法來連線到 Cosmos DB 更新從感應器的資料:

await SensorKit.AzureConnectorInstance.InsertUserSensorDataAsync(userSensorData);

運動員層級和新資料更新 Cosmos DB 運動員可以有多個感應器和感應器套件彙總感應器資料。一旦資料 Cosmos DB 中,所以可以輕鬆地查詢透過多個介面,SQL 和非 SQL 資料。比方說,您可以使用 Microsoft Power BI 的小組,每個運動員感應器從建立資料的特殊的指導的檢視,或使用行動裝置應用程式呈現資料。此下列查詢會傳回摘要資料透過感應器套件中,找到的每個感應器中所示圖 7:

 

SELECT * FROM Items.sensorSummary c

Cosmos DB 感應器套件摘要資料的查詢結果
圖 7 Cosmos DB 感應器套件摘要資料的查詢結果

一旦資料上傳至 Azure,您可以使用 ML 來定型模型或處理資料。

現在,您知道資料到雲端的取得方式,讓我們重點討論感應器資料分析和更具體來說,運動網域之分析的邏輯部分。從使用 coaches,我們判斷出他們感興趣偵測事件,例如開啟,並從 g 強制執行期間遇到運動員載入。我們來看看如何我們可以剖析偵測滑雪開啟收集的資料。

偵測活動感應器資料的簽章

Skier 主要軌道對齊移動他中央的大型,所以我們放 pelvis,ski 包覆在口袋內中間感應器。加速計和迴轉儀的從收到的資料。使用感應器的資訊可讓我們分析運動員移動,並定義活動簽章。

我們的資料是由加速計和迴轉器範例文字檔案中儲存的值所組成 (bit.ly/2GJkk2w)。我們 9 DOF 感應器可讓我們 3D 加速和角速度向量從加速計和儀分別大約 100 Hz 取樣。若要分析的資料我們必須 RStudio 載入它。您可以使用我們剖析的程式碼,將會位於bit.ly/2GLc5mG,並載入我們的範例檔。

使用 9 DOF 感應器需要徹底校正感應器,這是相當費時的程序。我們的目標在此情況下是只計算次數,這並不需要執行特定的軸精確移動分析。這個發行項,並簡化我們計算,我們將使用加速和角速度的大小。

因為我們實驗涉及偵測開啟時,我們有興趣僅稍微運動員移動時。當運動員仍代表時,加速計感應器顯示幾乎平穩直線,角速度仍可能變更。實際移動啟動時,加速和迴轉器值的幅度迅速改變,因此標準差會增加。做為圖 8所示,我們可以定義活動的開始點開頭的資料,加速計值超過固定的臨界值。結束點將會加速計會低於臨界值資料的尾端。

開始和結束的加速活動
圖 8 開頭和結尾加速活動

它是已知加速計感應器資料非常累贅,,以及使用移動平均計算會產生更平滑的訊號。讓我們來定義標準差超出閾值的平均值做為起點的訊號的百分比時的時間點:

a_smooth1 <- SlidingAvg(a,lag,threshold,influence)
st<-which(a_smooth1$std > thresholdPct* a_smooth1$avg)
startPos<-min(st)
endPos<-max(st)

尖峰偵測資料中的一種方式是使用的尖峰大小必須大於其緊接的鄰近點的屬性。加速計和迴轉器值的大小來計算方式如下:

lag       <- 30
threshold <- 1.5
influence <- 0.5
res<-SmoothAndFindPeaks(df$magnitudeW,df$magnitudeA,lag,threshold,influence)
print (paste("Total peaks in A = ", length(res$pks_a), " peaks in W = ", length(res$pks_w) ))

這會導致:

> res<-SmoothAndFindPeaks(df$magnitudeW,df$magnitudeA,lag,threshold,influence)
[1] "Calculation for activity start = 3396 end = 4239"
> print (paste("Total peaks in A = ”, length(res$pks_a), " peaks in W = ", length(res$pks_w) ))
[1] "Total peaks in A = 29 peaks in W = 22"

這些結果所示圖 9

加速計和迴轉器中尋找尖峰值
圖 9 尋找尖峰加速計和迴轉器值

觀察的移動運動員開啟時顯示每次在轉換階段中的開啟,範圍會移到較低的值,而且在區域的開啟 apex 大小到達其最大值。這表示如果我們計算尖峰的 「 移動 」 區段的資料就會得到我們所要的數目。迴轉器資料也比較簡單,我們將使用角速度大小來計算來判斷將變成尖峰。之後,我們需要若要移除的尖峰所到彼此。

若要取得很穩定,經過一段時間的低雜訊資料,我們可以使用快速鍵的長期穩定性結合迴轉儀的短期精確度互補篩選器。

現在,我們已經開啟偵測的 R 程式碼,我們可以建立 ML 定型模型類似機器學習部落格中所述的程序中張貼在bit.ly/2EPosSa

測量運動員 G 強制載入

在健身運動負載超出只是彙總的量值旅行距離或總完成的活動。了解運動員壓力和健身品質的重要層面需要測量運動員的負載。有數個元件運動負載。最重要的其中一種 g 強制產生及體驗運動員,以建立所需的活動,例如 ski 輪流,以及 jerks 過程控制項的強制和從地形或其影片,它們必須貼齊產生容納。

讓人了有與他們能容忍 g 強制的限制。這些限制的壓力會發生的時間量,以及是否低強度一段很長的持續時間] 或 [高強度短時間而定。這些限制,也取決於方向和中,會認為 g-force。例如,讓人了會更能夠容忍高的垂直方向 g force ("z"存取),而不高側方向 g-force ("y"存取) 和回頸部和接點上其壓力。幸運的是,已被廣泛的欄位研究 g-force 效果和從航空業以及我們可以加以運用,以量值和描繪 g-force 和 g-force 容錯的 NASA 的限制。讓我們深入 g-強制人體,我們會如何測量它們,以及如何以代表他們建立運動員的負載。

G-Force 加速感應器量值的計算計算無方向 g-force 人力的內文與感應器加速量值是,使用形成畢氏三元理論如下所示:

Directionless G-Force = Math.sqrt(AccelerationX^2 + AccelerationY^2 + AccelerationZ^2)

G-force,以指定的方向的計算方式是加速除以 9.81,假設以公尺為單位,每秒為單位加速平方。 例如,Y 方向 g 強制的計算方式如下:

Y G-Force = AccelerationY / 9.81

當然,在運動員 g-強制載入的重要元件是認為期間的時間週期。

I o n G 強制最大容錯體育活動,方便您比較是人力的主體可以容許每個方向,g 強制最大值。而這些 g 強制反映重心的最大值,而非特定的接點,時所提供實用的方式來表示 g 強制運動員遇到這些最大值的百分比。假設我們就可以將量值在感應器、 取樣率 g 強制持續時間中任何位置從 10 秒 (10 hz) 範例加入 100 個樣本,每秒 (100 hz),我們可以歸納的最大百分比運動員 g-強制載入任何指定的持續時間。

Python 程式碼來計算 G-強制公式如前文所述,只需要從感應器的加速 X、 Y 和 Z 量值。您必須了解的延展,它具有測量、 通常中每秒英呎平方或以公尺為單位,每秒平方。從這些項目中,我們可以計算 g-force 依特定方向,以及無方向 g-force 運動員主體所整體經歷。由於我們夥伴 XSens 中,我們可以使用高有效位數感應器記錄在每秒 (100 hz) 100 個樣本的資料移動,並將它們載入至 Azure。

圖 10示範從對應至 3D 動畫感應器的擷取。如您所見,skier 發生 g 強制在 Y 方向,以及在 X 方向為他傳輸下山勢阻擋。計算這些強制,搭配加速達成來自該回合中,可讓運動員以深入了解其在瀏覽該 g 強制透過開啟效能。

G 強制載入視覺化 XSens 軟體是不同軸,沿著不同
圖 10 G-強制載入視覺化 XSens 軟體是不同軸,沿著不同

圖 11呈現計算 g 強制的 Python 程式碼。

圖 11 Python 程式碼來計算 G-Force

########################
# G-Force, Using Python 3.5+
########################
#Directionless g-force (gg = Math.sqrt(Accx * Accx + Accy * Accy + Accz * Accz))  <pythagorean theorem>
#Assuming accelerometer is in meters per second squared, gforce measurement by dividing by 9.81
#1 acceleration of gravity [g] = 9.80664999999998 meter/second² [m/s²]
#our data is in feet per second so we use the converstion 1 ft/s2 = 0.3048 m/s2
#Set Conversion Metrics
G_conversion = (9.80664999999998)
MperS_conversion = (.3048)  #from above
#Replace na's with zeroes to avoid math errors
dataset=dataset.fillna(0)
#Using acceleration measures from 'dataset' dataframe, we convert to meters per second squared
#In our case our acceleration variables are labeled AccX, AccY and AccZ
#In our case, acceleration was in feet per second, so we needed to apply a conversion.
dataset["AccX_mtrpersecsqrd"] = dataset["AccX"]/MperS_conversion]
dataset["AccY_mtrpersecsqrd"] = dataset["AccY"]/MperS_conversion]
dataset["AccZ_mtrpersecsqrd"] = dataset["AccZ"]/MperS_conversion]
#Generate Directionless G-Force measure, call it 'DirectionlessGG'
dataset["DirectionlessGG"] = ((dataset["AccX"]*dataset["AccX"])+­(dataset["AccY"]*dataset["AccY"])+dataset["AccZ"]*dataset["AccZ"])).astype(float)
dataset["DirectionlessGG"] = np.sqrt(dataset["DirectionlessGG"])#.astype(float)
#Generate Direction Specific G-Force, call them 'X_GG', 'Y_GG' and 'Z_GG'.
dataset["X_GG"] = dataset["AccX"]/MperS_converstion/G_conversion
dataset["Y_GG"] = dataset["AccY"]/MperS_converstion/G_conversion
dataset["Z_GG"] = dataset["AccZ"]/MperS_converstion/G_conversion

您可以找到要計算 g 強制,以及額外的計算,包括 g-force 相對於最大值,在我們的 GitHub rep 在指令碼中的指令碼bit.ly/2BPS6nA。讀取有關物理 g 強制,以及其對人類的影響的詳細資訊請參閱 「 超出速度和加速:從歐洲筆記本的物理在個笨蛋、 嵌入式管理單元和更高的衍生項目 > 文章bit.ly/2FvLkTD,用來描述 g 強制執行相對於該內容的滾輪 coaster 經驗。和了解人力容錯和 g 強制的限制,請參閱 Wikipedia 文章: 在bit.ly/2EPQDjE,以及以 NASA 集合的參考資料在go.nasa.gov/2oyS9fj。在計算 g 強制的詳細資訊將會位於bit.ly/2Fzxpfa

總結

我們用於接收和夥伴進行感應器收集運動員資料,並說明連接行動裝置應用程式與感應器的感應器套件和 Azure Cosmos DB 我們開放原始碼的使用。我們將說明如何處理該資料與統計工具,例如 R,以擷取 」 活動的簽章 」 描述運動員時滑雪進行開啟。最後,我們將說明如何使用從感應器的資料來計算從運動員負載 g 強制使用 Python。


Kevin Ashley是 microsoft 架構設計人員推廣人員。他是 coauthor"Professional Windows 8 程式設計的 」 (Wrox 2012) 和開發人員的最上層的應用程式和遊戲,最值得注意的是 Active 適用性 (activefitness.co)。他通常顯示在不同的事件、 產業顯示及網路廣播的技術。在他的角色,他在工作啟動與夥伴,建議您在軟體設計、 商務和技術策略、 架構和開發。在 Twitter 上關注他: @kashleytwit

Olga Vigdorovich是資料庫管理員、 資料科學家和勤 skier。她建立的資料模型和可擴充的雲端平台根據 Microsoft Azure,包括在 Summit 資料 Corp.Active 適用性冬季運動的後端

Patty Ryan是 microsoft 為套用的資料科學家。與處理困難的問題與感應器、 文字和願景的資料搭配使用機器學習方法,其合作夥伴和客戶她代碼。在 Twitter 上關注她: @singingdata

非常感謝下列 Microsoft 技術專家檢閱這篇文章:Mona Soliman Habib


MSDN Magazine 論壇中的這篇文章的討論