视觉任务iOSSDK集成文档
简介
本文档描述 EasyEdge/EasyDL iOS 离线预测SDK相关功能;
目前支持EasyEdge的功能包括:
- 图像分类
- 物体检测
- 人脸检测
- 姿态估计
- 百度OCR模型
目前支持EasyDL的功能包括:
- 图像分类
- 物体检测
- 图像分割
系统支持
系统:
- 通用arm版本:iOS 9.0 以上
- A仿生芯片版:iOS 13.0 及以上
硬件: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
时间 | 版本 | 说明 |
---|---|---|
2022.09.15 | 0.7.7 | 支持更多检测模型;迭代优化 |
2022.07.28 | 0.7.6 | 迭代优化 |
2022.06.29 | 0.7.5 | 支持EasyEdge语义分割模型;CoreML引擎升级,新增EasyEdge检测模型支持;迭代优化 |
2022.05.18 | 0.7.4 | ARM引擎升级;支持EasyDL物体检测超高精度模型;支持更多加速版模型发布;迭代优化 |
2022.03.25 | 0.7.3 | ARM引擎升级;支持更多检测模型 |
2021.12.22 | 0.7.2 | 支持EasyEdge更多姿态估计模型;迭代优化 |
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 | 第一版! |
快速开始
文件结构说明
.EasyEdge-iOS-SDK
├── EasyDLDemo # Demo工程文件
├── LIB # 依赖库
├── RES
│ ├── easyedge # 模型资源文件夹
│ │ ├── model
│ │ ├── params
│ │ ├── label_list.txt
│ │ ├── infer_cfg.json
│ │ ├── conf.json
└── DOC # 文档
测试Demo
按如下步骤可直接运行 SDK 体验 Demo:
步骤一:用 Xcode 打开 EasyDLDemo/EasyDLDemo.xcodeproj
步骤二:配置开发者自己的签名
步骤三:连接手机运行,不支持模拟器
检测模型运行示例:
SDK使用说明
集成指南
步骤一:依赖库集成
步骤二:import <EasyDL/EasyDL.h>
,import <Vision/Vision.h>
依赖库集成
- 复制 LIB 目录至项目合适的位置
- 配置 Build Settings 中 Search paths: 以 SDK 中 LIB 目录路径为例
- Framework Search Paths:
${PROJECT_DIR}/../LIB/lib
- Header Search Paths:
${PROJECT_DIR}/../LIB/include
- Library Search Paths:
${PROJECT_DIR}/../LIB/lib
集成过程如出现错误,请参考 Demo 工程对依赖库的引用
使用流程
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;
返回的数组类型如下,具体可参考 EasyDLResultData.h
中的定义:
| 模型类型 | 类型 |
| --- | ---- |
| 图像-图像分类 | EasyDLClassfiData |
| 图像-物体检测/人脸检测 | EasyDLObjectDetectionData |
| 图像-实例分割/语义分割 | EasyDLObjSegmentationData |
| 图像-姿态估计 | EasyDLPoseData |
| 图像-文字识别 | EasyDLOcrData |
错误说明
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版本。