文來源:Lemberg Solutions Ltd
作者:Zahra Mahoor、Jack Felag、 Josh Bongard
「雷克世界」編譯:嗯~阿童木呀、KABUDA
現如今,與智能手機進行交互的方式有很多種:觸摸屏、硬件按鈕、指紋傳感器、視頻攝像頭(如人臉識別)、方向鍵(D-PAD)、手持設備控制等等。但是我們該如何使用動作識別功能呢?
我們可以舉一個例子來說明這個問題,比如當你持手機將其快速移動到左側或右側時,可以非常精確地顯示出想要切換到播放列表中下一首或上一首歌曲的意圖;或者,你可以將手機快速向上向下翻轉,從而刷新應用程序內容。引入這樣的交互看起來是非常有發展前景的,并且為用戶體驗增添了一個新的層面。接下來,本文將介紹該如何使用機器學習和Android上的Tensorflow庫實現這一目標。
對于我們的目標,我們可以將其描述為希望手機能夠識別左右的快速動作。
我們希望能夠在一個單獨的Android庫中完成這一實現,以便它能夠容易地集成到任何其他應用程序中。
這些動作可以通過手機上的幾個傳感器進行捕獲:加速度計、陀螺儀、磁力計等等。隨后,這些批量動作可以用于機器學習算法,以便進行訓練和后續識別。
為了捕捉數據,我們將開發一個Android應用程序。預處理和訓練過程將在Jupyter Notebook環境的PC上使用Python和TensorFlow庫執行。手勢識別將在一個Android應用程序演示中執行,并生成訓練數據。最后,我們將開發一個即時可用的Android庫,用于手勢識別,而且可以很容易地集成到其他應用程序中。
下面是有關該實現過程的高級計劃:
1.在手機上收集數據
2.設計和訓練神經網絡
3.將神經網絡導出到手機中
4.開發一個測試Android應用程序
5.開發Android庫
實現
?準備數據
首先,我們來明確一下什么樣的傳感器和什么樣的數據可以用于描述我們的動作手勢。為了準確地描述這些手勢,我們應該使用加速度計和陀螺儀。
加速度計傳感器明顯是用于測量加速度,然后測量運動:
加速度計有一個有趣的細微差別;它不僅測量設備本身的加速度,而且測量地球重力的加速度,大約為9.8m/s2。這意味著放在桌子上的手機加速度向量的大小將等于9.8。這些值不能直接使用,而應從地球重力值中提取。這并不是一件容易的任務,因為它需要磁力計和加速度計傳感器值的融合。不過幸運的是,Android已經有了特定的線性加速度傳感器以執行這樣的計算并返回正確的值。
另一方面,陀螺儀將用于測量旋轉:
我們試著找出將與我們的手勢相關聯的值。顯然,在加速度計(即線性加速度計)中,X和Y值將高度描述手勢,而加速度計的Z值不太可能受到我們手勢的影響。
至于陀螺儀傳感器,似乎只有Z軸會受到手勢的輕微影響。不過,為了簡化實施,我們可以不將該值考慮在內。在這種情況下,我們的手勢檢測器不僅能夠識別手機在手中的移動,而且還能識別出其沿著水平線的移動——例如在桌子上。這大概不是一個太大的問題。
所以,我們需要開發一個能夠記錄加速度計數據的Android應用程序。
我開發了一款這樣的應用程序,下面是記錄的“向右移動”手勢的屏幕截圖:
正如你所看到的那樣,X軸和Y軸對手勢的反應非常強烈。 Z軸也有反應,但正如我們所說的那樣,我們沒有將其考慮在內。
這是“左移”手勢:
請注意,X值與前一手勢的值幾乎相反。
還有一點需要提及的是數據采樣率。這反映了數據采樣的頻率,并且直接影響每個時間間隔的數據量。
另一個要考慮的是手勢持續時間。這個值,就像這里許多其他值一樣,應該根據經驗對其進行選擇。我所建立的那個手勢持續時間不超過1秒,但為了讓事情進行得更為順利,我把它四舍五入到了1.28秒。
我選擇的數據采樣率是每個選定的持續時間內128點,這將產生10毫秒的延遲(1.28 / 128)。這個值應該被傳遞給registerListener(https://developer.android.com/reference/android/hardware/SensorManager.html#registerListener%28android.hardware.SensorEventListener,%20android.hardware.Sensor,%20int%29)方法。
因此,這個想法就是訓練一個神經網絡,用以在加速度傳感器中的實時數據流中識別這些信號。
所以,接下來,我們需要記錄一系列手勢并將其導出到文件。當然,相同類型的手勢(右側或左側)應該使用相同的標簽進行標記。我們很難事先說出需要多少樣本來訓練這個網絡,但這可以通過訓練結果進行確定。
通過點擊數據,樣本持續時間將自動高亮顯示:
現在,“保存”按鈕啟用,點擊它將自動把已選項保存到工作目錄中的文件。文件名將以“{label} _ {timestamp} .log”的形式生成。可以使用應用程序菜單來選擇工作目錄。
另外請注意,保存當前選擇后,將自動選擇下一個手勢。下一個手勢的選擇是使用一個非常簡單的算法實現的:找到其絕對值大于3的第一個X條目,然后返回20個樣本。
這種自動化過程使我們能夠快速保存一系列樣本。對于每個手勢我們記錄了500個樣本。保存的數據應該被復制到一臺PC上以進行進一步處理。 (直接在手機上進行處理和訓練看起來很有發展前景,但是Android的TensorFlow目前不支持訓練)。
在前面提供的截圖中,數據范圍大約為±6。但是,如果你更有力地揮動手機,它可以達到±10。對數據進行正則化操作比較好,從而使得范圍為±1,這更適合神經網絡數據格式。我只是把所有的數據除以一個常數系數,我通常使用的是9。
開始訓練之前可以執行的下一步是過濾數據以消除高頻振蕩。這種振動與我們的手勢無關。
有很多方法可以過濾數據。一種是基于移動平均值(https://en.wikipedia.org/wiki/Moving_average)框進行過濾。
請注意,X數據的最大值現在是原來值的一半。由于我們將在識別過程中對實時數據執行相同的過濾,所以這應該不成問題。
改善訓練的最后一步是數據增強(data augmentation)。該過程通過執行一些操作擴展了原始數據集。在我們的例子中,我簡單地將數據左右移動了幾個點:
?設計一個神經網絡
設計一個神經網絡并不是一個簡單的任務,需要一些經驗和直覺。另一方面,神經網絡在某些任務中是眾所周知的,而且你可以簡單地對現有網絡做些調整。我們的任務與圖像分類任務非常相似,輸入可以被視為高度為1像素的圖像(這是真實的——第一個操作是將二維數據[128列x 2信道]的輸入轉換為三維數據[1行x 128列x 2信道])。
所以,神經網絡輸入是[128,2]。
神經網絡輸出是長度等于標簽數量的向量。在我們的例子中是[2]。數據類型是雙精度浮點數。
這里是神經網絡的示意圖:
這里是通過TensorBoard獲得的詳細原理圖:
該示意圖包含一些僅用于訓練的輔助節點。之后,我將提供一個干凈的、優化后的圖片。
?訓練
訓練將在具有Jupyter Notebook環境的PC上使用Python和TensorFlow庫進行。可以使用以下配置文件在Conda環境中啟動Notebook。以下是一些訓練超參數(hyperparameters):
Optimizer: Adam
Number of training epochs: 3
Learning rate: 0.0001
數據集按照7/3的比例被分為訓練集和驗證集。
訓練質量可以通過訓練和測試精確度值來控制。訓練的精確度應該接近但不能達到1。如果值太低,則表示識別率低且不準確,并且過高的值將導致模型過度擬合,并且可能在識別期間引入一些偽像,如非手勢數據的非零識別評估。良好的測試精度可以證明:一個訓練有素的模型可以識別不可見的早期數據。
訓練日志:
(‘Epoch: ‘, 0, ‘ Training Loss: ‘, 0.054878365, ‘ Training Accuracy: ‘, 0.99829739)
(‘Epoch: ‘, 1, ‘ Training Loss: ‘, 0.0045060506, ‘ Training Accuracy: ‘, 0.99971622)
(‘Epoch: ‘, 2, ‘ Training Loss: ‘, 0.00088313385, ‘ Training Accuracy: ‘, 0.99981081)
(‘Testing Accuracy:’, 0.99954832)
TensorFlow圖和相關數據使用以下方法保存到文件中:
saver = tf.train.Saver()
with tf.Session() as session:
session.run(tf.global_variables_initializer())
# save the graph
tf.train.write_graph(session.graph_def, '.', 'session.pb', False)
for epoch in range(training_epochs):
# train
saver.save(session, './session.ckpt')
完整的notebook代碼可以在這里查看:
https://github.com/ryanchyshyn/motion_gestures_detection/blob/master/Python/training.ipynb
?輸出神經網絡
上一部分展示了如何保存Tensor Flow數據。圖形保存到“session.pb”文件中,訓練數據(權重,偏差等)被保存到一批“session.ckpt”文件中。這些文件可以足夠大:
session.ckpt.data-00000-of-00001 3385232
session.ckpt.index 895
session.ckpt.meta 65920
session.pb 47732
表格和訓練數據可以被凍結,并轉化成適合在移動設備上運行的單個文件。
為了凍結它,需要將tensorflow / python / tools / freeze_graph.py文件復制到notebook目錄中,然后運行以下命令:
python freeze_graph.py --input_graph=session.pb \
--input_binary=True \
--input_checkpoint=session.ckpt \
--output_graph=frozen.pb \
--output_node_names=labels_output
生成的文件比之前的文件要小,但就單個文件而言,仍然足夠大:
frozen.pb 1130835
這是TensorBoard中的模型:
tensorflow / python / tools / import_pb_to_tensorboard.py文件復制到notebook目錄并啟動:
python import_pb_to_tensorboard.py --model_dir=frozen.pb --log_dir=tmp
其中frozen.pb是一個模型文件。
現在,啟動TensorBoard:
tensorboard --logdir=tmp
有幾種方法可以為移動環境優化模型。想要運行所描述的命令,需要從源代碼編譯TensorFlow:
1.刪除未使用的節點和常規優化。執行:
bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph --in_graph=mydata/frozen.pb --out_graph=mydata/frozen_optimized.pb --inputs='x_input' --outputs='labels_output' --transforms='strip_unused_nodes(type=float, shape="128,2") remove_nodes(op=Identity, op=CheckNumerics) round_weights(num_steps=256) fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms'
這是TensorBoard運行結果:
2.執行量化(轉換浮點數據格式信息8位數據格式),執行:
bazel-bin/tensorflow/tools/graph_transforms/transform_graph --in_graph=mydata/frozen_optimized.pb --out_graph=mydata/frozen_optimized_quant.pb --inputs='x_input' --outputs='labels_output' --transforms='quantize_weights strip_unused_nodes'
因此,與3.5 Mb的原始文件相比,輸出文件的大小為287129字節。這個文件可以在Android的TensorFlow中使用。
?演示 Android應用程序
想在Android應用程序中執行信號識別,你需要使用Android的Tensor Flow庫。將庫添加至gradle屬性項:
dependencies {
implementation 'org.tensorflow:tensorflow-android:1.4.0'
}
現在,你可以通過TensorFlowInferenceInterface類訪問TensorFlow API。首先,將“frozen_optimized_quant.pb”文件放入應用程序的“assets”目錄中 (即 “app/src/main/assets” ),并將其加載到代碼中(如:從Activity開始;但是,像往常一樣,最好在后臺線程中執行有關IO的相關操作)
inferenceInterface = new TensorFlowInferenceInterface(getAssets(), “file:///android_asset/frozen_optimized_quant.pb”);
注意如何選定模型文件
最后,看一下如何進行識別:
float[] data = new float[128 * 2];
String[] labels = new String[]{"Right", "Left"};
float[] outputScores = new float[labels.length];
// populate data array with accelerometer data
inferenceInterface.feed("x_input", data, new long[] {1, 128, 2});
inferenceInterface.run(new String[]{“labels_output”});
inferenceInterface.fetch("labels_output", outputScores);
數據是我們“黑盒”的一個輸入,應該有一個加速度計X和Y測量的平面陣列,即數據格式是[x1, y1, x2, y2, x3, y3, …, x128, y128]。
在輸出方面,我們有兩個浮點值,它們根據“左”或“右”的手勢變化,隨不同輸入值在0到1的范圍內取值。需要注意的是,這些值的總和是1。因此,舉一個例子,如果輸入信號與左或右手勢不匹配,那么輸出將接近[0.5,0.5]。為了進一步簡化,最好使用簡單的數學方法將這些值轉化為絕對值在0到1之間的數。
在運行之前,需要對數據進行過濾和正則化操作。
這里是演示應用程序的最終測試屏幕:
其中“紅色”和“綠色”的線條是實時預處理信號,黃線和青線分別屬于“固定”、“左”和“右”概率。“時間”是處理時間,非常短,這使得實時識別成為可能。(2毫秒意味著可以以500Hz的頻率運行處理,同時我們請求加速度計以100Hz的頻率進行更新)。
正如你所看到的,有一些令人驚奇的細微差別。首先,即便是“沉默”信號,也存在一些非零概率。其次,每個手勢在中心都具有長時間的“真實”識別,其值接近于1,并且在邊緣處具備較小的相反識別。
看起來,要執行準確的實際手勢識別,需要進行一些附加的處理。
?Android庫
我在一個單獨的Android庫中對輸出信號進行附加處理,實現了TensorFlow識別。以下是庫和演示應用程序。
如果在你自己的應用程序中使用它,請將庫屬性項添加至模塊gradle文件中:
repositories { maven { url "https://dl.bintray.com/rii/maven/" } }
dependencies {
...
implementation 'uk.co.lemberg:motiondetectionlib:1.0.0'
}
創建一個動作檢測器監聽器(MotionDetector listener):
private final MotionDetector.Listener gestureListener = new MotionDetector.Listener() {
@Override
public void onGestureRecognized(MotionDetector.GestureType gestureType) {
Log.d(TAG, "Gesture detected: " + gestureType);
}
};
啟用動作檢測:
MotionDetector motionDetector = new MotionDetector(context, gestureListener);
motionDetector.start();
我們通過利用TensorFlow庫,在Android應用程序上實現了對動作手勢進行識別的所有步驟:采集和預處理訓練數據、設計和訓練神經網絡、開發測試應用程序以及隨時可用的Android庫。所描述的方法可以用于其他任何識別/分類任務。生成的庫可以集成到其他任何Android應用程序中,并通過動作手勢進行升級。
編輯
編輯
編輯
1.新增OPPO直接提取方案,支持Android 9及以上OPPO手機,部分特殊機型除外
2.優化微信朋友圈和公眾號的顯示效果
3.增加Android設備備份空間不足時的彈窗
4. 支持Android設備在設置中自定義“文件提取”掃描范圍
5、HTML報告中新增“手機取證報告助手”下載地址
編輯
6.程序運行時防止PC休眠
7.插件更新:
iOS:LINE、Rocket Chat、Soul、TikTok、Chrome、釘釘、Safari、淘寶
Android:Potato、TikTok、Rocket Chat、、Via、火狐、京東、支付寶
每個人生活在這個世界上都有一部手機,每部手機上都有各種各樣的應用程序來幫助它的主人方便地做很多事情,所以手機上
包含著個人的很多私人信息,包括身份證、財務狀況、與他人的關系、
通訊等。記錄、愛好、地理位置等等。有了這些信息,我們就可以制作有關其所有者的角色檔案。
另一方面,手機成為當今最廣泛的指揮、控制、實施和記錄犯罪活動的設備。
手機比你自己更了解你。
移動設備調查過程的第一步是識別手機。
這并不像聽起來那么容易,因為有數百家設備制造商,每家制造商平均每年推出 15 個新版本的移動設備。
應用程序通常將大部分信息存儲在 SQLite 數據庫中,因此這些數據庫將包含案例數據的主要部分。
移動取證工具包會自動解碼數據庫并以結構化方式顯示它們,但是根據工具包的不同,
僅支持幾十到幾百個不同的應用程序,這是一個相對較小的數字,因為可用的
應用程序超過 500 萬個在市場上。
移動設備上使用安全機制來保護數據。這些機制的范圍從手機用戶鎖到 SIM 卡 PIN 碼
和 PUK 以及設備加密。通過 PIN 或密碼鎖定的設備可以通過適當的
軟件程序或設備所有者的信息來解鎖。加密更加深入,在軟件和/或硬件級別保護數據,并且通常很難解密。
隨著技術的不斷發展,執法機構中的數字取證需要進一步的權限來訪問手機以進行犯罪調查。
現在,通過使用 Salvationdata SPF Pro(智能手機取證系統專業版),您可以深度訪問各種手機Android & IOS(Iphone)、
Symbian、Blackberry,支持99%的中國品牌手機,如華為、Oppo、小米等。通過對被調查手機的數據提取和成像,我們可以輕松
完成嫌疑人的分析。此外,與大數據取證系統合作將為調查人員提供整體和可視化分析結果的建議。
SPF Pro可以支持全球流行的智能手機和應用程序,尤其是幾乎所有中國品牌的智能手機。此外,廣泛使用的應用程序也被添加到支持列表中。
品牌:iPhone、三星、華為、OPPO、VIVO、小米、HTC、黑莓、諾基亞、摩托羅拉、NEC、多普達、索尼愛立信、LG、中興、聯想、魅族、酷派等中國品牌,包括海外手機品牌的中國OEM制造商。
SPF Pro支持豐富的智能手機,幾乎所有著名的操作系統,包括功能手機。
Android、iOS、Firefox OS、Yun OS、Blackberry、Windows Phone、Symbian、Palm、BADA、Windows Mobile、Ubuntu、MTK、展訊等
中國智能手機或功能手機操作系統。
全面優化的多任務性能,支持多達8個移動設備同時基于
物理和邏輯層面的數據提取和恢復。幫助以取證上合理且有效的方式收集數字證據。
自動檢測智能手機型號和狀態,智能決策并向用戶推薦最佳提取方案。
文件瀏覽器可以實時查看和提取智能手機中的證據數據。
智能、主動地監控敏感數據并向用戶發出警報。分析項目包括關鍵字、應用程序、URL、電話、MD5 和完全可定制。
為您節省昂貴且耗時的流程,以更低的成本為您提供更智能的移動取證
IOS
安卓
蘋果
微信
真我
OPPO
紅米
維沃
微信
在移動取證中,應用程序數據備份提取是一種無需root智能手機即可獲取應用程序數據的簡單解決方案。通過使用Android系統的備份功能,可以創建保存在SD卡中的應用程序數據副本,無需root訪問。
本次演示中,我們以搭載MIUI系統(Android系統)的小米手機為例,演示如何在不root手機的情況下備份和提取App數據。
前提條件
目標智能手機必須正常運行并且可以開機
屏幕可以解鎖
Android系統備份功能可供用戶使用
手機操作流程
SPF Pro操作流程
手機操作流程
1.進入設置
2.找到Backup & Reset(在其他系統中,也可能是Backup & Restore或其他類似名稱)
3.點擊本地備份
4.單擊“備份”創建新備份
5.然后選中您要提取的應用程序的框
6.點擊備份開始創建備份
7.然后等待該過程完成
8.將智能手機連接到電腦并從SD卡中提取備份數據。
9.備份數據的存儲位置通常在名為backup的文件夾中
,在本演示中,位置如下:SD卡MIUIackupAllBackup
SPF Pro操作流程
現在使用SPF Pro加載并分析您剛剛提取的備份數據
創建新案例或打開現有案例
單擊文件夾分析,然后找到并加載從手機獲取的備份文件夾。
注意:請加載備份文件的根文件夾(應用程序文件夾的上層文件夾),否則SPF Pro可能無法識別備份文件。
單擊自動邏輯提取
選擇您的提取目標
單擊“開始”開始該過程
等待該過程完成,然后您可以看到提取結果
① 導航面板
單擊此處可在不同應用程序和類別之間導航。
② 分類窗口
所有提取的數據將顯示在此處。
③ 過濾欄
設置過濾器,可根據時間、關鍵詞等快速定位目標數據。
④ 報告
單擊可打開報告窗口并生成取證報告。
能手機顯示,受試者血液內的酒精含量為0.08。
酗酒已經演變成一個全球性問題,僅在美國,每年就有上萬名司機死于酒駕事故。如果公眾可以隨時隨地使用酒精測試儀,這類悲劇事件或許能減少。可惜的是,公眾對專門攜帶酒精測試儀并不太感興趣。
techxplore.com網站當地時間8月12日報道,加拿大拉瓦爾大學光學、光子和激光中心(COPL)的研究人員找到了一種潛在的解決方案:在智能手機中植入酒精測試儀。這個想法并不新鮮,很多科學家已經有過類似的嘗試。其問題在于,目前檢測血液酒精含量的技術還無法集成到手機中——這需要為手機更換化學傳感器,而它們的體積龐大、價格昂貴、難以大規模生產,并且不耐用。
COPL的研究人員并不打算在手機中集成現有的酒精測試技術,而試圖以手機中已有的組件來測量血液酒精含量。為此,他們提出了一種有趣的思路——將光學酒精測試儀集成在智能屏幕中。其工作原理是基于對屏幕上呼吸霧蒸發速率的分析。當手機屏幕蒙上呼吸霧時,其表面會形成無數的微滴。當呼吸霧中含有酒精時,微滴會蒸發得更快。
用于保護手機、平板電腦和智能手表的強化玻璃表面都有防刮層。防刮層比玻璃其他部分密度更大,它形成了平面波導,可將光從一端引導至另一端。而光源就是手機顯示屏的背光。當手機屏幕有霧時,部分光被耦合到平面波導中,并被引導至屏幕的另一側。在此處,可以放置一個光電二極管來測量光強度。
研究人員表示,微滴邊緣發生的強烈全反射誘導了光與平面波導的耦合。因此,光電二極管測得的光強度與微滴數量成正比,并隨蒸發而減小。當呼吸霧中含酒精時,屏幕上的微滴蒸發速率變快,光電二極管測得的光強度也下降得更快。研究人員已經證實了光強度信號與血液酒精濃度之間的相關性。
不過,論文作者Jerome Lapointe博士也表示:“雖然新技術在受控環境中表現良好,但現實環境的條件更加復雜。比如說,如果天氣暖和或者空氣不那么潮濕時,屏幕上的霧氣會蒸發得更快一些。因此,我們需要在盡可能多的復雜條件下進行測試,以校準呼吸分析器……在積累了龐大的數據庫后,我們計劃通過訓練神經網絡來提高測試準確性,進而說服主要的手機制造商接受這一集成建議。”
編譯:雷鑫宇 審稿:西莫 責編:陳之涵
期刊來源:《傳感器》
期刊編號:1424-8220
原文鏈接:
https://techxplore.com/news/2021-08-smartphone-screen-integrated-optical-breathalyzer.html
中文內容僅供參考,一切內容以英文原版為準。轉載請注明來源。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。