一个利用机器学习算法(Naive Bayes),通过对手机传感器数据的分类,检测用户正在进行的动作的Android应用。
- 光传感器
- 近距离传感器
- 加速度传感器
- 方向传感器(虚拟,实际是由另外的传感器数据计算得出)
- 喝咖啡:在台灯下把手机当成咖啡杯拿到嘴边。
- 行走:把手机拿在右手上走路。
- 唱歌:把手机当成麦克风拿起。
- 关窗:把手机拿在右手上,右手抬起在半空向左移作关窗状。
小组成员自己做动作收集而来。 收集所用的App见:coolspring1293/AI-Lab-Final。
由于Weka有许多依赖在Android不能找到,需要一些努力(代码裁剪)才能让它可用于Android。
本项目所用的Weka库来自Institute for Pervasive Computing, Johannes Kepler Universität Linz。 详见此文档。
Weka基于GPL协议。
先保证sbt已安装,然后
$ sbt android:package
这会生成一个Apk文件,位于<project root>/target/android/output/ai-lab-detector-debug.apk
。
由于sbt的Android插件有一些Bug,如果出错,可以尝试:
- 再dex一次,实际上只需:
$ sbt android:package
。 - 清除缓存:
$ rm -rf target
。然后重新开始构建。
详见pocorall/hello-scaloid-sbt和pfn/android-sdk-plugin。
如果想要修改模型,按以下步骤:
- 收集数据。
- 将数据组织为Weka所用的ARFF格式。格式说明详见Weka文档。
- 在命令行中用Weka训练模型并保存到文件:
$ java -cp weka-3.6.6-android.jar weka.classifiers.bayes.NaiveBayes -t data.arff -d trained.model
。 如果不希望使用Naive Bayes
分类器, 只需更改命令中的类名和build.sbt
文件中的Proguard选项,让其在裁剪时保留所使用的分类器类以便序列化。 - 将保存的模型(实际上是Serialized的对象)保存至
src/main/res/raw/trained.model
。 - 修改
src/main/scala/org/ai/predictor/Predictor.scala
中Predictor
类的定义,尤其是Predictor.Attributes
对象。为了有趣,修改emojis
成员。 - 修改
src/main/scala/org/ai/predictor/PredictorActivity.scala
中有关获取传感器数据的部分。 - 构建即可。
GPL V3.0.