阅读本文的其他语言版本:English。
在本开发人员 Code Pattern 中,我们将使用 Apache Cordova、Node.js 和 Watson Visual Recognition 创建一个移动应用程序。该移动应用程序发送汽车和摩托车事故和问题的照片,以便通过一个服务器应用程序使用 Watson Visual Recognition 来分析这些照片。
服务器应用程序将使用汽车事故和其他事故的照片来训练 Watson Visual Recognition 识别各种类型的问题,比如故意破坏、挡风玻璃损坏、摩托车事故或爆胎。开发人员可以利用此应用程序为他们的用例创建自定义的 Visual Recognition 分类器。
读者完成本 Code Pattern 后,将会掌握如何:
- 创建一个能利用 Watson Visual Recognition 服务对图像进行分类的 Node.js 服务器。
- 让一个服务器在启动时初始化一个 Visual Recognition 自定义分类器。
- 在一个应用程序中创建一个 Visual Recognition 自定义分类器。
- 创建一个 Android 移动应用程序,它可以将照片发送给一个服务器应用程序,以便使用 Visual Recognition 对照片进行分类。
- 用户与移动应用程序交互并捕获一幅图像。
- 将手机上的图像传递给在云中运行的服务器应用程序。
- 服务器将图像发送给 Watson Visual Recognition 服务进行分析。
- Visual Recognition 服务对图像进行分类,并将信息返回给服务器。
- Watson Visual Recognition:Visual Recognition 理解图像的内容 - 为图像添加标签,查找人脸、大约年龄和性别,并在图库中查找类似图像。
- 移动:互动参与体系越来越多地开始使用移动技术作为交付平台。
- Node.js:异步事件驱动的 JavaScript 运行时,旨在构建可扩展的应用程序。
本 Code Pattern 包含多个部分。应用服务器与 Watson Visual Recognition 服务进行通信。在本地构建移动应用程序并在 Android 手机上运行。您可以使用 IBM Cloud 来部署服务器应用程序,或者将应用程序部署到本地机器上。
按上面的 Deploy to IBM Cloud
按钮,单击 Deploy
,然后跳到步骤 #5。
要监控部署情况,请在 Toolchains 中单击 Delivery Pipeline
,并在部署应用程序时查看日志。
要查看为本 Code Pattern 创建和配置的应用程序和服务,可以使用 IBM Cloud 仪表板。此应用程序命名为 watson-vehicle-damage-analyzer
(含有独特后缀)。可使用 wvda-
前缀来创建并轻松识别以下服务:
* wvda-visual-recognition
记下
watson-vehicle-damage-analyzer
URL 路径 - 在移动应用程序中稍后会用到。
执行步骤 1-9:
-
执行 6a 或 6b。
-
使用 Cordova 部署到 Android
7b. 设置您的 Android 设备
7c. 构建并运行该移动应用程序
-
使用 Cordova 部署到 iOS
8a. 添加 iOS 平台和插件
8b. 设置 iOS 项目
将 watson-vehicle-damage-analyzer
存储库克隆到本地。在终端中,运行以下命令:
$ git clone https://github.com/IBM/watson-vehicle-damage-analyzer.git
$ cd watson-vehicle-damage-analyzer
使用 IBM Cloud 或 Watson Studio(两者均可使用免费 Lite
套餐和 Standard
套餐)创建 Watson Visual Recognition 服务。确保此服务名为 wvda-visual-recognition
。
或者
传统上,IBM Cloud 是面向应用程序开发者的主平台,而 IBM Watson Studio(原名为 Data Science Experience)面向的则是数据科学家。2018 年初,新产品 Watson Studio 正式推出。Watson Studio 为数据科学家和应用程序开发者提供了一套工具,让他们能够通过协作连接到数据,充分发掘此数据,并利用它来规模化构建、训练和部署模型。
为帮助您确定要使用的平台,请尝试回答以下问题:
- 我是否正在使用多个数据集?使用 Watson Studio
- 我是否正在为 Watson Visual Recognition 创建自定义分类器?使用 Watson Studio
- 我是否正在使用 Watson Visual Recognition 内置分类器?使用 IBM Cloud
千头万绪、不知所措?毋庸担心。您在 IBM Cloud 或 Watson Studio 中创建的任何资源均可相互混用。
要使用 Visual Recognition 服务,您将需要使用 API 密钥。
要在 Watson Studio 中检索密钥,请转至以下选项卡:
在 IBM Cloud 中将如下所示:
将 watson-vehicle-damage-analyzer/server/env.example
文件重命名为 watson-vehicle-damage-analyzer/server/.env
,并添加 API 密钥:
# Watson Visual Recognition
VISUAL_RECOGNITION_API_KEY=<add_api_key>
如果您使用了 Deploy to IBM Cloud
,则会自动进行设置。
-
安装 Node.js and npm(
npm
V4.5.0 或更高版本) -
安装应用程序依赖项并启动应用程序:
$ npm install
$ npm start
如果您无法或不想构建移动应用程序,可以在浏览器中访问服务器并测试该应用程序。
- 对于本地运行的服务器,请打开浏览器选项卡并转至
localhost:<port>
。 - 对于在 IBM Cloud 上运行的服务器,请打开浏览器选项卡并指向您的服务器的 URL
<IBM_Cloud_server_URL:port>
默认端口为 3000
然后,您可以上传一张本地照片,比如来自此存储库的 test/data/
中的一张照片
编辑 mobile/www/config.json
并使用以前获取的值来更新设置。
"SERVER_URL": "put_server_url_here"
对于本 Code Pattern,您需要根据这些依赖项各自的文档来安装必备工具:
构建移动应用程序需要一些依赖项,您需要自行手动安装这些依赖项。如果您运行 Docker,可以通过跳到在 Docker 容器中为 Android 运行移动应用程序构建,在容器中构建该移动应用程序
对于手动构建 Android 应用程序,您需要根据这些依赖项各自的文档来安装这些必备工具:
- Java 开发工具包 (JDK)
- Android Studio,其中包含 Android 工具并允许您访问 Android SDK
您需要安装适合您的移动设备的特定 SDK。从 Android Studio
,下载并安装期望的 SDK API Level。我们使用 Android API Level 23,因为截至 2018 年 1 月,大部分手机都支持它。为此:
- 启动
Android Studio
并接受所有默认值。 - 单击工具栏中的
SDK Manager
图标。 - 导航到
Appearance & Behavior
->System Settings
->Android SDK
- 选择 Android 6.0 (Marshmallow) (API Level 23)。
- 单击 apply 进行下载并安装。
mobile/config.xml
被配置为针对 Android API Level 23 进行构建。如果您希望针对不同的 API 进行构建,请调整此设置:
<preference name="android-targetSdkVersion" value="23" />
完成所有需要的安装和设置后,您需要针对您的平台来恰当设置以下环境变量:
JAVA_HOME
ANDROID_HOME
ANDROID_SDK_HOME
打开 Android Studio
并导航到 File
-> Project Structure
-> SDK Location
。此位置值将用作环境变量的基础。例如,如果位置为 /users/joe/Android/sdk
,则:
$ export ANDROID_HOME=/users/joe/Android/sdk
$ export ANDROID_SDK_HOME=/users/joe/Android/sdk/platforms/android-<api-level>
$ export JAVA_HOME=`/usr/libexec/java_home`
获取 JAVA_HOME
的准确路径:/usr/libexec/java_home
对于我们的示例,我们将以下内容添加到 $PATH
中。(您的位置可能有所不同)
$ export PATH=${PATH}:/users/joe/Android/sdk/platform-tools:/users/joe/Android/sdk/tools:/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home
如果您运行 Docker,可以在 Docker 容器中构建该移动应用程序。
下载该映像:
docker pull scottdangelo/cordova_build
或在本地构建:
docker build -t cordova_build .
现在为 cordova
创建以下别名,并且 cordova 的命令将在容器内运行。如果您已在本地构建该容器,请使用 cordova_build
替换 scottdangelo/cordova_build
。
alias cordova='docker run -it --rm --privileged -v $PWD:/mobile scottdangelo/cordova_build cordova'
mobile/config.xml
文件被配置为针对 Android API Level 23 进行构建。如果您希望针对不同的 API 进行构建,请调整此设置:
<preference name="android-targetSdkVersion" value="23" />
根据您目前的工作目录来修改路径 watson-vehicle-damage-analyzer/mobile
。
首先添加 Android 平台作为您的移动应用程序的目标。
$ cd watson-vehicle-damage-analyzer/mobile
$ cordova platform add android
确保所有一切都已正确安装:
$ cordova requirements
您应该会看到对于构建的任何应用程序(ios
或 android
),所需的项已安装完成。对于 Android,会显示:
Requirements check results for android:
Java JDK: installed 1.8.0
Android SDK: installed true
Android target: installed android-26
Gradle: installed /usr/share/gradle/bin/gradle
Requirements check results for ios:
Apple macOS: not installed
Cordova tooling for iOS requires Apple macOS
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Some of requirements check failed
最后,安装该应用程序所需的插件:
$ cordova plugin add cordova-plugin-camera
$ cordova plugin add cordova-plugin-file-transfer
要在 Android 设备上运行该应用程序,您需要准备将该应用程序的 .apk
文件传输到您的设备(在下一步中创建)。开发人员可通过多种方式实现此目的。
如果您将 Android 设备连接到您的计算机,而且启用了 developer options
和 web debugging
,Android Studio 会为您处理传输。
请参阅特定手机上的文档来设置这些选项。
对于 Mac 用户,Android File Transfer 可帮助在您的计算机和 Android 设备之间执行简单文件传输。
$ cd watson-vehicle-damage-analyzer/mobile
$ cordova build android
.apk
文件应出现在 watson-vehicle-damage-analyzer/mobile/platforms/android/build/outputs/apk/android-debug.apk
上,其中包含该 Android 应用程序。
然后,您可以手动将 .apk
传输到您的设备并自行运行它,或者,如果您的设备已建立连接(如上一步中所述),您可以运行以下命令:
$ cordova run android
此刻,名为 Watson Vehicle Damage Analyzer
的应用程序应该在您的移动设备上。使用摄像机图标对汽车挡风玻璃、轮胎、故意破坏之处或摩托车拍一张照。在单击 check mark
后,移动应用程序会将把图像发送到服务器,服务器将使用 Watson 分析该图像并抓取结果数据。
安装 iOS 部署工具
$ npm install -g ios-sim
$ npm install -g ios-deploy
添加 iOS 平台和构建。这样将在 platform
目录中创建 iOS 文件夹,其中包含要在仿真器或 iOS 设备中运行的所有必需文件
$ cordova platform add ios
$ cordova prepare # or "cordova build"
所有 cordova 插件均在 mobile/config.xml 中配置,在您创建平台和构建时将安装这些插件。
为了运行从步骤 8a 创建的 iOS 项目,需要首先从 Xcode
创建 provisioning file、app IDs 和 certificates
。您需要具有 apple 登录帐户,如果您有 iOS 设备,那么此帐户免费。转至 Xcode>Preferences>Accounts
,并添加您的 apple 登录帐户。这将创建可用于注册您的项目的 Personal Team
概要文件。
如果收到 error: exportArchive: No profiles for ‘com.watson.vehicledamageanalyzer’ were found
,您需要在 Xcode 中选择项目,并将 bundle identifier
更改为一个唯一标识。并且,将 mobile/config.xml 中的窗口小部件 id
更改为 Xcode 中相同的值
例如:将 com.watson.vehicle-damage-analyzer
更改为新的捆绑软件标识名称 com.foo.vehicle-damage-analyzer
使用以下步骤部署应用程序,确保部署时您的设备处于解锁状态。
在已连接的 iOS 设备上部署应用程序:
`$ cordova run ios --device`
-
使用 test/README.md 中的操作说明来测试 Visual Recognition 服务
-
cordova run android
错误:Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
Vehicle Damage Analyzer
应用程序已安装在您的手机上,而且与您现在尝试运行的版本不兼容。卸载当前版本并再试一次。
cordova run android
错误:No target specified and no devices found, deploying to emulator
确保您的手机已插入计算机,而且您可以从 Android File Transfer 实用程序访问它(参见上面的步骤 #6)。
- Error: Server error, status code: 502, error code: 10001, message: Service broker error: {"description"=>"Only one free key is allowed per organization.Contact your organization owner to obtain the key."}
每个组织仅允许使用一个免费密钥。将服务绑定到一个应用程序,这会触发一个尝试分配新密钥的流程,该尝试会遭到拒绝。如果您已经有一个 Visual Recognition 实例和一个相关密钥,可以将该实例绑定到您的应用程序或更新服务器代码中的 API 密钥,以便告诉该应用程序要使用哪个密钥。
- 部署或仪表板显示应用程序未运行
您可能在 Deploy Stage 中的日志中看到该应用程序已崩溃且无法启动:
Starting app watson-vehicle-damage-analyzer-20171206202105670 in org scott.dangelo / space dev as [email protected]...
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 crashed
FAILED
Error restarting application: Start unsuccessful
TIP: use 'cf logs watson-vehicle-damage-analyzer-20171206202105670 --recent' for more information
Finished: FAILED
或者您可能在 IBM Cloud 控制台中看到该应用程序
Not Running
:
二者都是虚假的错误。可以单击 IBM Cloud 控制台中的
Visit App URL
链接,或者尝试单击Runtime
->SSH
,或者只是测试该应用程序,看看它是否在运行。
- 人工智能e Code Pattern:喜欢本 Code Pattern 吗?了解我们其他的 AI Code Pattern。
- 关于 AI 和数据 Code Pattern 播放清单:收藏包含我们所有 Code Pattern 视频的播放清单
- With Watson:想要进一步改进您的 Watson 应用程序?正在考虑使用 Watson 品牌资产?加入 With Watson 计划,以便利用独家品牌、营销和技术资源来增强和加速开发 Watson 嵌入式商业解决方案。