首页 > 其他分享 >iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类

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

时间:2023-04-29 11:03:33浏览次数:49  
标签:VNRecognizeTextRequest MachineLearning 静态 iOS func var 识别 open class

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,可信度越高。

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

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

可以看到,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。识别效果如下图:

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

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")
    }
}

识别效果如下图所示:

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

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

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

https://github.com/ZYHshao/MachineLearnDemo

到此,我们已经将静态图片的分析做了详尽的介绍,相信很多AI能力都是开发中会使用到的。本系列后面文章,将介绍对象追踪的相关API的用法。

标签:VNRecognizeTextRequest,MachineLearning,静态,iOS,func,var,识别,open,class
From: https://blog.51cto.com/u_11643026/6236657

相关文章

  • C#中的隐形坑之泛型基类中的静态变量
    ​切记:泛型基类中定义的静态变量,在各子类中是不会共享数据的。一般在进程内共享数据可选择定义全局const变量或static变量。本文的主角就是static变量。例如我们要定义一个可以跨方法使用的事务时,会想到在基类中定义一个静态变量:[ThreadStatic]publicstaticIDbTransaction......
  • 从实例出发,了解单例模式和静态块
    就算你没有用到过其他的设计模式,但是单例模式你肯定接触过,比如,Spring中bean默认就是单例模式的,所有用到这个bean的实例其实都是同一个。单例模式的使用场景什么是单例模式呢,单例模式(Singleton)又叫单态模式,它出现目的是为了保证一个类在系统中只有一个实例,并提供一个访问它的......
  • 【解决】axios 下载文件 Failed to read the 'responseText' property from 'XMLHttp
    主要解决以下两个问题问题一:idm一些网站不允许请求同一文件两次故障原因:IDM在发神经因为它检测到浏览器集成插件未安装,所以诱导你安装。实际上,装了插件问题也会出现。改参数都没用。1.很可能是你点击网页的下载链接有问题(换个网页下载试试,就不提示了),Edge浏览器一直会欺......
  • Windows/Android/iOS 等常见 User-Agent 大全
    UserAgent中文名为用户代理,简称UA,是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。Python爬虫通过伪装UA可以绕过某些检测。以下为搜集的常见的各浏览器的User-Agent,其中:安卓操作......
  • 使用Axios下载Nignx文件,并重命名
    需求:因为下载的nginx的文件地址是UUID组成的,要下载呢就需要用axios。然后结合我上一篇文章,把nginx的跨域打开。http://localhost:8085/project_1/2023/04/27/C9E9CC592AF849F7BFA025F16E2271BD.sqlhttps://www.cnblogs.com/pphboy/p/17360526.htmlexportfunctiondownloadFil......
  • iOS MachineLearning 系列(9)—— 人物蒙版图生成
    iOSMachineLearning系列(9)——人物蒙版图生成人物蒙版图能力是Vision框架在iOS15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。1-人物蒙版的提取首......
  • 静态数据成员
    用关键字static声名为该类所有对象共享必须在类外定义和初始化 原理1.同一类的不同对象,其成员数据之间是互相独立的。2.当我们将类的某一个数据成员的声名为static,则油该类所生产的所有对象,其静态成员共享一个存储空间 static规定1.static成员必须在类外定义并初始化2......
  • iOS APP启动广告实现方式 与 APP唤端调用
    APP启动广告功能实现要从2个方面思考一是UI方案,怎样处理广告页与主页之间的切换方式。二是广告页展示时机,是使用后台实时广告数据还是使用本地缓存广告数据。后台数据方式获取广告最新但是用户要等待后台返回数据后才能展示,增加用户等待时间。使用本地缓存启动速度快但数据更新......
  • JS通过axios提交application/x-www-form-urlencoded类型的数据
    使用axios提交类型为application/x-www-form-urlencoded数据的正确姿势:letformData=newURLSearchParams()formData.append('param1',param1)formData.append('param2',param2)axios({url:'http://xxx.xxx.xxx.xxx/xxx',method:'......
  • Unity跟IOS原生开发项目融合
    更多精品文章Aladdin的博客需求:做一款社交类的APP,主体工程是原生开发,也就是是IOS的Xcode工程,产品经理为了丰富应用的玩法,就想往里面加上现在比较流行的AR功能,组成一款AR社交APP,我们之前见识多的都是工程是主体,然后IOS原生功能或者代码作为插件添加进Unity的Plugin里面,这样的方式参......