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

图像分类iOSSDK集成文档

简介

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

目前支持EasyEdge的功能包括:

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

目前支持EasyDL的功能包括:

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

系统支持

系统:

  • 通用arm版本:iOS 9.0 以上
  • A仿生芯片版:iOS 15.0 及以上

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

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

离线SDK包说明

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

  • EasyEdge

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

    • 通用ARM版:支持iPhone5s, iOS 9.0 以上所有手机。
    • A仿生芯片版:支持iPhone5s, iOS 15.0 以上手机。充分利用苹果A系列仿生芯片优势,在iPhone 8以上机型中能有显著的速度提升。
    • 自适应芯片版:同时整合了以上两种版本,自动在iOS 15以下中使用通用ARM版,在iOS 15以上系统中使用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

时间 版本 说明
2023.08.31 0.7.13 新增按实例数鉴权;迭代优化
2023.06.29 0.7.12 迭代优化
2023.05.17 0.7.11 CoreML引擎升级,支持更多语义分割模型;兼容横屏;迭代优化
2023.03.16 0.7.10 支持更多语义分割模型;迭代优化
2022.12.29 0.7.9 ARM引擎升级;迭代优化
2022.10.27 0.7.8 支持更多检测模型;迭代优化
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
步骤二:配置开发者自己的签名
步骤三:连接手机运行,不支持模拟器

检测模型运行示例:

image.png

SDK使用说明

集成指南

步骤一:依赖库集成 步骤二:import <EasyDL/EasyDL.h>import <Vision/Vision.h>

依赖库集成

  1. 复制 LIB 目录至项目合适的位置
  2. 配置 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. 使用序列号激活

2.1. 离线激活(默认鉴权方式)

首次联网激活,后续离线使用

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

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

根据序列号类型,序列号与BundleID绑定或与BundleID+设备绑定。

请确保设备时间正确。

2.2. 按实例数激活

周期性联网激活,离线后会释放所占用鉴权,启动时请确保心跳间隔小于等于生成序列号时填写的定期确认时间

填入序列号,配置按实例数鉴权并设置心跳间隔:

// 设置序列号
[EasyDL setSerialNumber:@"!!!Enter Your Serial Number Here!!!"];
// 配置实例数鉴权及心跳间隔,单位:秒
[EasyDL setInstanceAuthMode:10000];

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

上一篇
Android集成文档
下一篇
Windows集成文档