小言_互联网的博客

开发拍照识花App,程序员秒变“植物专家”

542人阅读  评论(0)

春暖花开,万物复苏,正是踏青好时候。周末,阿珍组织班级里的小朋友去公园踏青,程序员阿强,作为护花使者也一同前往。

阿强本以为,可以肆意在林间草地自由地奔跑,回忆一下逝去的童真时光,没想到却成了小朋友们的“植物识别器”,整个踏青之旅变成大型科普现场。面对大自然,小朋友们满脑子都是“这啥花这啥草”,配以崇拜的小眼神真诚发问,让阿强即使手忙脚乱地偷偷上网搜索,也要给出正确答案。

但其实,植物科普不必这般费力,平时对大自然的了解甚少,也有办法轻松hold住小朋友稀奇古怪的发问。执行力满满的阿强,开发出一款拍照识花App,只需拿起手机拍摄一张完整花朵的照片,即可快速识别花卉种类,在App的协助下,秒变植物专家。

Demo示例

 

实现原理

拍照识花功能用到了华为机器学习服务的图片分类能力,通过对图片中的实体对象进行分类并添加标注信息,帮助定义图片题材和适用场景等。图片分类支持端侧识别云测识别,端侧识别支持超过400个类别,云测识别支持12000个分类,同时,该服务提供了自定义模型能力,支持用户自定义图片分类模型。

开发准备

1、在华为开发者联盟网站创建应用并配置签名证书

2、配置华为 Maven仓地址,在应用级的“build.gradle”文件中添加编译SDK依赖


  
  1. dependencies{
  2. // 引入基础SDK
  3. implementation 'com.huawei.hms:ml-computer-vision-classification:2.0.1.300'
  4. // 引入图片分类模型包
  5. implementation 'com.huawei.hms:ml-computer-vision-image-classification-model:2.0.1.300'
  6. }

3、设置自动更新机器学习模型

添加如下语句到AndroidManifest.xml文件中,用户从华为应用市场安装您的应用后,将自动更新机器学习模型到设备:


  
  1. <manifest
  2. ...
  3. < meta-data
  4. android:name= "com.huawei.hms.ml.DEPENDENCY"
  5. android:value= "label"/>
  6. ...
  7. </manifest>

4、配置混淆脚本

上述步骤具体可参考开发者网站中的开发准备介绍:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/config-agc-0000001050990353-V5?ha_source=hms1

5、在AndroidManifest.xml文件里面声明系统权限

为了可以通过相机和相册进行图片的获取,需要在Manifest文件中申请相关的权限:


  
  1. <uses-permission android:name="android.permission.CAMERA" />
  2. <uses-permission android:name="android.permission.INTERNET" />
  3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  5. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  6. <uses-feature android:name="android.hardware.camera" />
  7. <uses-feature android:name="android.hardware.camera.autofocus" />

开发步骤

1.创建并配置云端图片分类分析器

创建图片分类分析器类

public class RemoteImageClassificationTransactor extends BaseTransactor<List<MLImageClassification>>

之后在该类中,通过图像分类自定义类MLRemoteClassificationAnalyzerSetting创建分析器,并设置对应的参数配置,同时配置Handler


  
  1. private final MLImageClassificationAnalyzer detector;
  2. private Handler handler;
  3. MLRemoteClassificationAnalyzerSetting options = new MLRemoteClassificationAnalyzerSetting.Factory().setMinAcceptablePossibility( 0f).create();
  4. this.detector = MLAnalyzerFactory.getInstance().getRemoteImageClassificationAnalyzer(options);
  5. this.handler = handler;

2.调用asyncAnalyseFrame方法进行图像处理

使用异步处理方式,对传入的MLFrame对象进行分类处理


  
  1. @Override
  2. protected Task<List<MLImageClassification>> detectInImage(MLFrame image) {
  3. return this.detector.asyncAnalyseFrame(image);
  4. }

3.获取分类成功后的结果

在RemoteImageClassificationTransactor中重写onSuccess()方法,将识别到的物体名称显示到图片中


  
  1. @Override
  2. protected void onSuccess(
  3. Bitmap originalCameraImage,
  4. List<MLImageClassification> classifications,
  5. FrameMetadata frameMetadata,
  6. GraphicOverlay graphicOverlay) {
  7. graphicOverlay.clear();
  8. this.handler.sendEmptyMessage(Constant.GET_DATA_SUCCESS);
  9. List<String> classificationList = new ArrayList<>();
  10. for ( int i = 0; i < classifications.size(); ++i) {
  11. MLImageClassification classification = classifications. get(i);
  12. if (classification.getName() != null) {
  13. classificationList. add(classification.getName());
  14. }
  15. }
  16. RemoteImageClassificationGraphic remoteImageClassificationGraphic =
  17. new RemoteImageClassificationGraphic(graphicOverlay, this.mContext, classificationList);
  18. graphicOverlay.addGraphic(remoteImageClassificationGraphic);
  19. graphicOverlay.postInvalidate();
  20. }

如果错误的话,进行对应的错误处理和Log显示


  
  1. @Override
  2. protected void onFailure(Exception e) {
  3. this .handler .sendEmptyMessage( Constant .GET_DATA_FAILED);
  4. Log .e( RemoteImageClassificationTransactor .TAG, " Remote image classification detection failed: " + e .getMessage());
  5. }

4.识别完成释放资源

识别完成后,需要将原有的分析器停止,并释放检测资源,在RemoteImageClassificationTransactor中重写stop()方法


  
  1. @Override
  2. public void stop() {
  3. super.stop();
  4. try {
  5. this.detector.stop();
  6. } catch (IOException e) {
  7. Log.e(RemoteImageClassificationTransactor.TAG,
  8. "Exception thrown while trying to close remote image classification transactor" + e.getMessage());
  9. }
  10. }

 

>>访问华为开发者联盟官网,了解更多相关内容

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解华为移动服务最新技术资讯~

 

 

 


转载:https://blog.csdn.net/HUAWEI_HMSCore/article/details/115406199
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场