iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类

简介: 本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是Machine Learning领域重要的应用。通过大量的图片数据进行训练后,模型可以轻易的分析出图片的属性以及图片中物体的属性。

iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类

本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是Machine Learning领域重要的应用。通过大量的图片数据进行训练后,模型可以轻易的分析出图片的属性以及图片中物体的属性。

1 - 文字识别

文字识别是应用非常广泛的一种图片识别技术。在Vision框架中,使用VNRecognizeTextRequest来进行文字识别,并且其支持多种语言,且有不错的识别精度。VNRecognizeTextRequest的创建示例如下:

private lazy var recognizeTextRequest: VNRecognizeTextRequest = {
    let textDetectionRequest = VNRecognizeTextRequest { request, error in
        DispatchQueue.main.async {
            self.drawTask(request: request as! VNRecognizeTextRequest)
        }
    }
    // 设置语言
    textDetectionRequest.recognitionLanguages = ["zh-Hans"]
    // 设置识别级别 accurate为最精准 fast为最快速
    textDetectionRequest.recognitionLevel = .accurate
    // 设置是否使用语言矫正
    textDetectionRequest.usesLanguageCorrection = true
    // 获取所支持的语言
    let set = try? textDetectionRequest.supportedRecognitionLanguages()
    print(set)
    return textDetectionRequest
}()

可以通过对VNRecognizeTextRequest实例进行配置来调整识别精度,识别的语言,是否进行矫正的选项,VNRecognizeTextRequest类的定义如下:

open class VNRecognizeTextRequest : VNImageBasedRequest, VNRequestProgressProviding {
    // 所支持的语言列表
    open class func supportedRecognitionLanguages(for recognitionLevel: VNRequestTextRecognitionLevel, revision requestRevision: Int) throws -> [String]
    open func supportedRecognitionLanguages() throws -> [String]
    // 识别过程中所使用的语言
    open var recognitionLanguages: [String]
    // 自定义的词汇,在识别单词时,自定义的词汇优先级会高于默认词典
    open var customWords: [String]
    // 识别等级,精度优先会更加消耗性能
    //  accurate: 精度优先 fast: 速度优先
    open var recognitionLevel: VNRequestTextRecognitionLevel
    // 设置是否使用自动矫正,自动矫正会更加消耗性能
    open var usesLanguageCorrection: Bool
    // 设置是否自动识别语言类型,当不确定输入的语种时,可以设置其自动识别,会更消耗性能
    open var automaticallyDetectsLanguage: Bool
    // 设置可识别文本的最小高度(为相对原图的比例值)
    open var minimumTextHeight: Float
    // 结果数组
    open var results: [VNRecognizedTextObservation]? { get }
}

VNRecognizeTextRequest的识别结果为VNRecognizedTextObservation类,此类也是继承自VNRectangleObservation的,因此我们也同时可以获取到所识别的文本所在原图的位置。VNRecognizedTextObservation类的定义如下:

open class VNRecognizedTextObservation : VNRectangleObservation {
    // 获取候选结果
    open func topCandidates(_ maxCandidateCount: Int) -> [VNRecognizedText]
}

topCandidate会返回一组候选结果,其参数设置最多返回的候选结果个数,需要注意此参数所支持的最大值为10。候选结果是指对于同一段文字,可能会识别出多个相似的结果,最终识别的文本结果VNRecognizedText类的定义如下:

open class VNRecognizedText : NSObject, NSCopying, NSSecureCoding, VNRequestRevisionProviding {
    // 识别出的文本字符串
    open var string: String { get }
    // 本次识别结果的可信度(0-1之间)
    open var confidence: VNConfidence { get }
}

对于confidence可信度属性来说,越接近1,可信度越高。

下图演示了照片中文本的识别效果:

可以看到,Vision对于中文印刷体的识别能力还是比较准确的。

目前,所支持识别的语种列举如下:

en-US:美式英语
fr-FR:法语
it-IT:意大利语
de-DE:德语
es-ES:西班牙语
pt-BR:葡萄牙语
zh-Hans:简体中文
zh-Hant:繁体中文
yue-Hans:粤语简体
yue-Hant:粤语繁体
ko-KR:韩语
ja-JP:日语
ru-RU:俄语
uk-UA:乌克兰语

2 - 动物识别

虽说是动物识别,但其实目前的API仅仅支持猫和狗的识别。使用VNRecognizeAnimalsRequest类来创建动物识别请求:

open class VNRecognizeAnimalsRequest : VNImageBasedRequest {
    // 获取所支持识别的动物种类
    open class func knownAnimalIdentifiers(forRevision requestRevision: Int) throws -> [VNAnimalIdentifier]
    open func supportedIdentifiers() throws -> [VNAnimalIdentifier]
    // 结果列表
    open var results: [VNRecognizedObjectObservation]? { get }
}

识别的结果VNRecognizedObjectObservation类也是继承自VNDetectedObjectObservation,其会包装所识别的动物所在图片中的区域,且VNRecognizedObjectObservation类中会封装一组VNClassificationObservation对象,如下:

open class VNRecognizedObjectObservation : VNDetectedObjectObservation {
    // 识别的动物标签
    open var labels: [VNClassificationObservation] { get }
}

VNClassificationObservatio类即表示识别出的物体具体的标签,定义如下:

open class VNClassificationObservation : VNObservation {
    // 标签字符串
    open var identifier: String { get }
}

对于VNRecognizeAnimalsRequest请求来说,此标签的值可能为Cat或Dog。识别效果如下图:

3 - 图片物体分类

图片物体分类是指对静态图片继续分析,将其中可能存在的物体分析出来。使用VNClassifyImageRequest创建图片物体分析请求。此类非常简单,没有太多需要配置的,定义如下:

open class VNClassifyImageRequest : VNImageBasedRequest {
    // 获取支持识别的物体
    open class func knownClassifications(forRevision requestRevision: Int) throws -> [VNClassificationObservation]
    open func supportedIdentifiers() throws -> [String]
    // 结果数组
    open var results: [VNClassificationObservation]? { get }
}

VNClassifyImageRequest所支持识别的物体种类非常多,有千余种,这里就不再列举。其识别后的结果也是VNClassificationObservation类,其内部的identifier表示所识别出的物体的标签。

需要注意,对于略微复杂的图片来说,识别的结果可能非常多,我们需要根据需求来设置一个可信度的阈值,只有达到此可信度的才被采用,例如:

private func drawTask(request: VNClassifyImageRequest) {
    boxViews.forEach { v in
        v.removeFromSuperview()
    }
    for result in request.results ?? []  where result.confidence > 0.8 {  
        // 解析出文本
        textView.text = textView.text.appending(result.identifier + "\n")
    }
}

识别效果如下图所示:

可以看到,我们选择了大于0.8可信度的结果,所识别出的关键字有:建筑,加工木材,动物,哺乳动物,犬类,狗,博美。(不知为何对猫的识别度很差)

本中所涉及到的代码,都可以在如下 Demo 中找到:

https://github.com/ZYHshao/MachineLearnDemo

到此,我们已经将静态图片的分析做了详尽的介绍,相信很多AI能力都是开发中会使用到的。本系列后面文章,将介绍对象追踪的相关API的用法。
目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
190 4
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
1月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
30 8
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
41 1
|
4月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
159 3
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
4月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
17天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
108 66
|
3天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈