所有文档

          EasyDL定制AI训练平台

          经典版图像分割iOSSDK集成文档

          简介

          本文档描述 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 经典版/专业版

            • 通用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控制台

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

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

          Release Notes

          时间 版本 说明
          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 支持图像分类高性能、高精度
          2019.06.20 0.4.3 引擎优化
          2019.04.12 0.4.1 支持物体检测高精度/高性能模型
          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;

          结果数据的返回类型:

          模型类型 类型
          图像-物体检测 EasyDLObjectDetectionData
          图像-图像分类 EasyDLClassfiData

          错误说明

          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具体报错的库。

          上一篇
          AndroidSDK集成文档
          下一篇
          经典版图像分割LinuxSDK集成文档-C++