多模型

本文主要给大家介绍如何在Android平台下使用多模型版本的角蜂鸟实现一个简单的多模型例子。

准备工作

  1. 配置环境等详情请参照Hello 2018里的快速开始,此处不具体阐述。
  2. 下载物体检测和人脸检测所需的俩个模型graph_object_SSDgraph_face_SSD文件,在您Android Studio中,当前module下新建assets包,将下载的模型文件复制到该目录下,该模型支持20种物体的检测。
  3. 因工程需要处理图像,所以使用了javacv库,可从GitHub自行下载或点击链接从示例工程中拷贝到自己工程下。

具体实现

1.实现具体步骤:

  • 开启设备通信。
  • 将俩个模型按顺序通过USB送入角蜂鸟里。
  • 获取人脸模型对应的图像。
  • 得到对应人脸模型的结果。
  • 将图像进行预处理传入物体检测的模型里。
  • 得到对应物体检测的结果。

2.主要代码逻辑:

    //子线程中执行对应步骤代码
   int status = openDevice();
   int face_id = allocateGraphByAssets(mContext, "graph_face_SSD");
   int object_id = allocateGraphByAssets(mContext, "graph_object_SSD");
   byte[] bytes = getImage(STD, MEAN, face_id);
   float[] result_face = getResult(face_id);
   //...经过预处理bytes图像数据并转成float类型传给物体检测模型
   loadTensor(float_tensor, float_tensor.length, object_id);
   float[] result_object = getResult(object_id);
  HornedSungemFrame frame = getFrameResult(image, result_face, result_object);//整合结果显示

具体代码可以参考示例工程,本文只摘取了重要代码,其中数据的处理及业务逻辑未列出

3.返回结果解析:

因本文主要用到人脸检测和物体检测俩种模型,具体的解析结果可参照模型列表的详细介绍。

  int num_object = (int) object_result[0];
  if (num_object > 0) {
    for (int i = 0; i < num_object; i++) {
        HornedSungemFrame.ObjectInfo objectInfo = new HornedSungemFrame.ObjectInfo();
        int type = (int) (object_result[7 * (i + 1) + 1]);
        int x1 = (int) (object_result[7 * (i + 1) + 3] * 1280);
        int y1 = (int) (object_result[7 * (i + 1) + 4] * 720);
        int x2 = (int) (object_result[7 * (i + 1) + 5] * 1280);
        int y2 = (int) (object_result[7 * (i + 1) + 6] * 720);
        int wight = x2 - x1;
        int height = y2 - y1;
        int percentage = (int) (object_result[7 * (i + 1) + 2] * 100);
        if (type == 0) {
            continue;
        }
        if (percentage <= 55) {
            continue;
        }
        if (wight >= 1280 * 0.8 || height >= 720 * 0.8) {
            continue;
        }
        if (x1 < 0 || x2 < 0 || y1 < 0 || y2 < 0 || wight < 0 || height < 0) {
            continue;
        }
        objectInfo.setType(labels[type - 1]);
        objectInfo.setRect(new Rect(x1, y1, x2, y2));
        objectInfo.setScore(percentage);
        objectInfos.add(objectInfo);
    }
}

4.效果展示:

result

5.注意事项:

多模型版本处于测试阶段,如遇到问题请向我们发送电子邮件(support@hornedsungem.org)。 如有任何建议、模型需求或希望加入我们也欢迎和我们联系。

更多详情,请点击进入实例教程,或直接下载演示工程,下载地址