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的用法。
目录
相关文章
|
28天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
34 2
|
9天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
16天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
1月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
29 1
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
|
2月前
|
开发框架 Android开发 Swift
安卓与iOS应用开发对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文将深入探讨这两大操作系统在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的差异和特点。通过比较分析,旨在为开发者提供一个宏观的视角,帮助他们根据项目需求和目标受众选择最合适的开发平台。同时,文章还将讨论跨平台开发框架的利与弊,以及它们如何影响着移动应用的开发趋势。
|
2月前
|
安全 搜索推荐 Android开发
安卓与iOS应用开发的对比分析
【8月更文挑战第20天】在移动应用开发领域,安卓和iOS两大平台各领风骚。本文通过深入探讨两者的开发环境、编程语言、用户界面设计、应用市场及分发机制等方面的差异,揭示了各自的优势和挑战。旨在为开发者提供决策支持,同时帮助理解为何某些应用可能优先选择在一个平台上发布。
30 2
|
8天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
17天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
5天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
22 7
下一篇
无影云桌面