android监测闹钟,Android上的图像识别:构建一个看到的闹钟

这些天有两个确定性:1)机器学习正在创造一套更强大的工具来完成无数复杂的任务,2)起床很难。现在,借助一些Java和Clarifai API的帮助,您可以创建一个应用程序,帮助您使用前者解决后者:一个闹钟只有在您拍摄预先指定的对象后才会关闭。例如,它在看到椅子时会关闭:

特别感谢@RedRussianBearMikhail Khrenov为这个项目所做的工作。

准备您的Clarifai用户帐户

Clarifai提供深度学习驱动的计算机视觉和图像识别服务。您的第一步应该是注册免费的Clarifai帐户。

创建帐户后,您需要通过开发人员界面使用Clarifai创建应用程序:

然后,选择您的应用程序并单击“创建API密钥”。这将是您的应用程序用于访问Clarifai的ID。

您需要记下此API密钥以便稍后使用。保持安全!

创建Android闹钟应用

我们将在Android Studio官方IDE中开发应用程序的其余部分。如果您还没有,请下载并进行设置。本教程将一次引导您完成应用程序的一个部分,但您可以在GitHub上下载所有代码。

我们将创建一个新的空白Android项目,该项目应该包含一个名为“MainActivity”的初始空白活动。在项目完成并初始Gradle构建完成后,我们将进行一些额外的设置。

首先,添加行...

api'com.clarifai.clarifai-api2:core:2.3.0'

...到应用程序级build.gradle的末尾。这将告诉Gradle,构建系统,包括Clarifai并让我们访问Clarifai的库。

接下来,我们将在res / xml / create_paths.xml下创建一个新文件,其内容如上所示。稍后我们将需要它来存储用户相机将拍摄的照片。

最后,我们将对应用程序的清单进行两次添加:首先,在< application>内部。阻止,我们将添加< provider>如上所示,我们可以访问我们拍摄的照片。

然后,在清单块的外面,我们将添加三个< uses - *>声明。第一个告诉Android我们的应用程序需要一个摄像头(为了拍照),第二个告诉Android,在某些SDK版本上我们的应用程序需要访问文件的权限(为了存储它们),最后一个告诉Android我们的应用程序需要互联网(与Clarifai交谈)。

现在,到应用程序本身。除了MainActivity,我们还将添加另一个名为AlarmActivity的活动。要执行此操作,请在Android Studio中右键单击app / java,选择new-> Activity-> Blank Activity。虽然MainActivity将成为首次启动应用程序和设置闹钟的用户界面,但AlarmActivity将是用户在闹钟响起时看到的内容,并且需要将其停用。

创建应用程序布局

我们将首先设计每个活动中可用的布局和输入。 res / layouts / activity_main.xml的蓝图模式应如下所示:

从上到下,输入元素是名为'object'的纯文本,名为'date'的日期,分别名为'hour'和'minute'的两个Number输入,以及名为'button'的Button。虽然您可以根据需要命名它们,但您需要更改一些以后的代码才能匹配。此视图上的输入将允许我们的用户输入他们想要查找的对象,警报何时应该关闭,并触发设置警报的功能。

同时,activity_alarm.xml应如下所示:

我们将TextView放在名为infoText的顶部,将中心的Button命名为photoButton。我们将使用前者通知用户Clarifai处理状态,后者用于拉起相机。

如果您不想使用布局编辑器,只需将activity_main.xml和activity_alarm.xml的内容复制到项目文件中即可。

我们的res / values / strings.xml文件应如下所示,以设置所有UI元素的默认值:

将UI连接到代码

现在我们已经构建了应用程序的用户界面,我们可以获得处理程序代码。在开始之前,请在相应文件的顶部包含以下导入:

我们将首先解决MainActivity问题。在此活动中,用户将决定时间和要检测的对象作为设置警报的参数。为了解决这个问题,我们将添加一个新方法setAlarm():

首先,我们通过id检索所有视图输入。然后我们将date,hour和minute的值编译成单个字符串,我们将其解析以创建一个Date对象,该警报将参考

接下来,我们创建一个Intent来打开AlarmActivity。在Extra for That Intent中,我们将放置object的内容,这是我们用户需要拍摄的对象的名称,以便禁用活动警报。

最后,我们检索AlarmManager,将各个部分放在一起设置警报,然后使用finish()函数正常退出活动。

到目前为止,我们有一个应用程序,我们可以设置闹钟以打开应用程序的另一个活动。实际的闹钟元素来自AlarmActivity:播放声音,捕捉要由Clarifai处理的照片。

创建活动时(当闹钟响起时),我们需要提供哪个对象应该停用它。我们将使用之前在onCreate()函数中设置的Intent extra来检索该参数。

接下来,我们将努力播放声音。在我们的onStart()方法中,我们设置了一个MediaPlayer对象。我们将其配置为异步工作以防止应用程序停止运行。虽然我们的MediaPlayer可以从任意URI(甚至是来自URL的流)播放,但为了简单起见,我们将检索用户默认铃声的URI并连续播放。通过此设置,我们通过infoText向用户发送消息:“Snap a [object]!”。

现在我们已经引起了用户的注意,我们需要给他们一个拍照的方法。我们通过takePicture()执行此操作,我们将它绑定到activity_alarm.xml中的photoButton的on_click字段。在此方法中,我们创建一个Intent来运行相机应用程序,创建一个文件,应用程序可以在其中放置照片,并在成员字段中存储照片的路径。

现在我们有一个闹钟让我们可以拍照,但要关闭闹钟我们需要确保照片实际上包含我们在设置闹钟时拍摄的真实物体。这就是Clarifai进来的地方!

用Clarifai解释你的照片

这是一个非常简单的部分:使用Clarifai在您的图像上运行对象识别。为了做到这一点,我们将制作私有类ClarifaiTask,它是AsyncTask的扩展。我们需要异步运行与Clarifai的通信,因为我们需要进行网络呼叫,这可能需要几秒钟。默认情况下,如果我们将Clarifai调用放在主线程上,Android甚至不会让我们的代码编译。

在ClarifaiTask中,我们需要实现两个方法:doInBackground()和onPostExecute()。在doInBackground()中,我们将通过ClarifaiClient对象连接到Clarifai(这是您之前的API密钥所在的位置 - 请务必将YOUR_API_TOKEN替换为您自己的Clarifai仪表板中的那个!)。然后,我们将照片发送到Clarifai'通用'模型,该模型识别最广泛的物体。

我们使用Clarifai发回的图像预测来查看结果是否包含我们在创建警报时指定的对象的名称。在onPostExecute()中,我们检查是否检测到我们要查找的对象,然后删除图像,因为我们不再需要它。如果我们确实检测到了正确的对象,我们将退出活动(关闭警报铃声)。如果没有,我们会提示用户再次尝试,因为未检测到该对象。

ClarifaiTask是在onResume()方法的实现中启动的。回到应用程序时,我们会检查我们的照片是否指向某个文件。如果是这样,我们刚刚从相机应用程序回来,应该将图像发送到Clarifai以检查我们是否应该关闭闹钟。

最后,我们需要确保当我们的AlarmActivity关闭时,闹钟会关闭。

哇,现在铃声终于可以停止......我们做到了!我们的Android设备上有一个视觉上可以轻松运行的闹钟,我们可以设置为foranyobject我们认为需要我们起床才能拍照。

带图像识别的后续步骤

这是您可视闹钟的入门实现。从这里您可以扩展它以允许重复警报,任意警报声音和自定义对象 - 以检测您已经使用自定义训练训练Clarifai寻找。例如,您可以训练Clarifai识别您的个人运动鞋或某些地标。图像识别功能触手可及,您已拥有自己的Android应用程序。你还在等什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值