资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

EasyEdge平台iOS系统SDK开发文档

简介

本文档描述 EasyEdge/EasyDL iOS 离线预测SDK相关功能;

目前支持EasyEdge的功能包括:

  • 图像分类
  • 物体检测
  • 人脸检测
  • 姿态估计
  • 百度OCR模型

目前支持EasyDL的功能包括:

  • 图像分类
  • 物体检测
  • 图像分割

系统支持

系统:

  • 通用arm版本:iOS 8.0 以上
  • A仿生芯片版:11.0以上(EasyDL物体检测高性能A仿生芯片版需要iOS 13及以上)

硬件:arm64 (Starndard architectures) (暂不支持模拟器)

内存:图像分割模型需要手机内存3GB以上,并尽量减少其他程序内存占用

离线SDK包说明

根据用户的选择,下载的离线SDK,可能包括以下类型:

  • EasyEdge

    • 通用ARM版:支持iPhone5s, iOS 9.0 以上所有手机。
    • A仿生芯片版:支持iPhone5s, iOS 11.0 以上手机。充分利用苹果A系列仿生芯片优势,在iPhone 8以上机型中能有显著的速度提升。
  • EasyDL 通用版/全功能AI开发平台BML(原EasyDL专业版)

    • 通用ARM版:支持iPhone5s, iOS 9.0 以上所有手机。
    • A仿生芯片版:支持iPhone5s, iOS 11.0 以上手机。充分利用苹果A系列仿生芯片优势,在iPhone 8以上机型中能有显著的速度提升。
    • 自适应芯片版:同时整合了以上两种版本,自动在iOS 11以下中使用通用ARM版,在iOS 11以上系统中使用A仿生芯片版,自适应系统,但SDK体积相对较大。
  • AI市场试用版SDK

SDK大小说明

SDK库的二进制与_TEXT增量约3M。

资源文件大小根据模型不同可能有所差异。

物体检测(高性能)的DemoApp在iPhone 6, iOS 11.4下占用空间实测小于40M。

虽然SDK库文件很大(体现为SDK包文件很大,ipa文件很大),但最终应用在用户设备中所占用的大小会缩小很多。 这与multi architechtures、bitcode和AppStore的优化有关。

获取序列号

生成SDK后,点击获取序列号进入控制台获取。EasyEdge控制台、EasyDL控制台、BML控制台

试用版SDK在SDK的RES文件夹中的SN.txt中包含试用序列号。

更换序列号、更换设备时,首次使用需要联网激活。激活成功之后,有效期内可离线使用。

Release Notes

时间 版本 说明
2021.10.20 0.7.1 ARM引擎升级
2021.07.29 0.7.0 迭代优化
2021.04.06 0.6.1 ARM引擎升级
2021.03.09 0.6.0 支持EasyEdge人脸检测及姿态估计模型
2020.12.18 0.5.7 ARM引擎升级
2020.09.17 0.5.6 CoreML引擎升级,支持AI市场试用版SDK
2020.08.11 0.5.5 CoreML支持EasyDL专业版模型,支持EasyEdge OCR模型
2020.06.23 0.5.4 ARM引擎升级
2020.04.16 0.5.3 ARM引擎升级;支持压缩加速版模型
2020.03.13 0.5.2 ARM引擎升级;支持图像分割模型
2020.01.16 0.5.1 ARM引擎升级;增加推荐阈值支持
2019.12.04 0.5.0 ARM引擎升级;增加coreml3的支持
2019.10.24 0.4.5 支持EasyDL专业版;ARM引擎升级
2019.08.30 0.4.4 支持EasyDL经典版图像分类高性能、高精度
2019.06.20 0.4.3 引擎优化
2019.04.12 0.4.1 支持EasyDL经典版物体检测高精度、高性能模型
2019.03.29 0.4.0 引擎优化,支持CoreML;
2019.02.28 0.3.0 引擎优化,性能与效果提升;
2018.11.30 0.2.0 第一版!

快速开始

DemoApp的使用

从官网下载的SDK和XCode工程已集成开发者已经训练完成的模型,填写License之后,即可直接运行。

若报错 libEasyDL.a not found,请添加LIBRARYRY_SEARCH_PATH ${SDK_ROOT}/LIB/libEasyDL.a。

如何集成

SDK的工程结构如下:

${SDK_ROOT}
  ├─ EasyDLDemo  // Demo工程文件
  ├─ LIB         // 库文件
  ├─ RES         // 资源文件
  ├─ DOC       // 文档

请开发者参考DemoApp的使用方法对SDK进行集成。 集成过程中,请务必参考Demo工程对库的引用方式,引入LIB文件夹下的所有库文件:

libEasyDL.a 
libpaddle_api_full_bundled.a
opencv2.framework
libstdc++.tbd
Accelerate.framework

最后import 头文件 <EasyDL/EasyDL.h> 即可。

使用流程

1. 生成模型,下载SDK

开发者在官网下载的SDK已经自动为开发者配置了模型文件和相关配置,开发者直接运行即可。

2. 使用序列号激活

将前面申请的序列号填入:

[EasyDL setSerialNumber:@"!!!Enter Your Serial Number Here!!!"];

根据序列号类型,序列号与BundleID绑定或与BundleID+设备绑定。 请确保设备时间正确。

3. 初始化模型

EasyDLModel *_model = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];

请注意相关资源必须以folder reference方式加入Xcode工程。也即默认的easyedge文件夹在Xcode文件列表里显示为蓝色。

4. 调用检测接口

UIImage *img = .....;
NSArray *result = [model detectUIImage:img withFilterScore:0 andError:&err];

使用说明

图像相关

离线模式:

/**
 * 检测图像
 * @param image 带检测图像
 * @param score 只返回得分高于score的结果(0 ~ 1)
 * @return 成功返回识别结果,NSArray的元素为对应模型的结果类型;失败返回nil,并在err中说明错误原因
 */
- (NSArray *)detectUIImage:(UIImage *)image
           withFilterScore:(CGFloat)score
                  andError:(NSError **)err;

结果数据的返回类型:

模型类型 类型
图像-图像分类 EasyDLClassfiData
图像-物体检测/人脸检测 EasyDLObjectDetectionData
图像-图像分割 EasyDLObjSegmentationData
图像-OCR EasyDLOcrData
图像-姿态估计 EasyDLPoseData

错误说明

SDK的方法会返回NSError错,直接返回的NSError的错误码定义在EEasyDLErrorCode中。NSError附带message(有时候会附带NSUnderlyingError),开发者可根据code和message进行错误判断和处理。

FAQ

1. 如何多线程并发预测?

SDK内部已经能充分利用多核的计算能力。不建议使用并发来预测。

如果开发者想并发使用,请务必注意EasyDLModel所有的方法都不是线程安全的。请初始化多个实例进行并发使用,如

- (void)testMultiThread {
    UIImage *img = [UIImage imageNamed:@"1.jpeg"];
    NSError *err;
    EasyDLModel * model1 = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];
    EasyDLModel * model2 = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];

    dispatch_queue_t queue1 = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue2 = dispatch_queue_create("testQueue2", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue1, ^{
        NSError *detectErr;
        for(int i = 0; i < 1000; ++i) {
            NSArray * res = [model1 detectUIImage:img withFilterScore:0 andError:&detectErr];
            NSLog(@"1: %@", res[0]);
        }
    });

    dispatch_async(queue2, ^{
        NSError *detectErr;
        for(int i = 0; i < 1000; ++i) {
            NSArray * res = [model2 detectUIImage:img withFilterScore:0 andError:&detectErr];
            NSLog(@"2: %@", res[0]);
        }
    });
}

2. 编译时出现 Undefined symbols for architecture arm64: ...

  • 出现 cxx11, vtable 字样:请引入 libc++.tbd
  • 出现 cv::Mat 字样:请引入 opencv2.framework
  • 出现 CoreML, VNRequest 字样:请引入CoreML.framework 并务必#import <CoreML/CoreML.h>

3. 运行时报错 Image not found: xxx ...

请Embed具体报错的库。

4.编译时报错:Invalid bitcode version

这个可能是开发者使用的xcode低于12导致,可以升级至12版本。

上一篇
Android
下一篇
Windows