文来源: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小时内与您取得联系。