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版本。