iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 上一篇文章中,我们介绍了几个官方的图片分类的模型,图片分类模型的应用场景在于将图片中最主要的事物进行识别,在已有的词库中找到最可能得事物。而对象识别则要更高级一些。再之前的文章,我们介绍过可以使用官方提供的API来进行矩形识别,文本识别,二维码识别以及人脸识别等,这类识别功能的特点是我们不仅可以将图片中的物体位置和尺寸分析出来,还可以对其进行类别的分类。

iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型

上一篇文章中,我们介绍了几个官方的图片分类的模型,图片分类模型的应用场景在于将图片中最主要的事物进行识别,在已有的词库中找到最可能得事物。而对象识别则要更高级一些。再之前的文章,我们介绍过可以使用官方提供的API来进行矩形识别,文本识别,二维码识别以及人脸识别等,这类识别功能的特点是我们不仅可以将图片中的物体位置和尺寸分析出来,还可以对其进行类别的分类。

本篇文章,我们将介绍使用官方提供的两个CoreML模型来进行对象识别,这两个模型可以很好的补充系统API的不足,助力业务场景功能的开发。

1 - TOLOv3模型

TOLOv3是一个快速识别物体的神经网络模型。关于物体识别,Vision框架提供的有VNRecognizedObjectObservation,此类即描述了识别出的结果。使用自定义的CoreML模型进行对象识别,也会使用到此类。前面我们在使用图片分类的模型时,可以直接使用Xcode帮我们生成的代码,TOLOv3模型则不再适用此方式,我们需要使用Vision框架的接口来实现功能。

其实过程也比较简单,首先加载模型:

let url = URL(fileURLWithPath: Bundle.main.path(forResource: "YOLOv3", ofType: "mlmodelc")!)
lazy var visionModel = try! VNCoreMLModel(for: MLModel(contentsOf: url))
AI 代码解读

这里需要注意,我们拖入Xcode工程中的模型名字为YOLOv3.mlmodel,但是经过Xcode的编译,实际在IPA包中的模型文件的后缀为mlmodelc,这里一定要注意不要写错。

下面创建一个图片分析请求的处理类:

// 图像分析请求处理类
lazy var imageRequestHandler = VNImageRequestHandler(cgImage: image.cgImage!,
                                                    orientation: .up,
                                                    options: [:])
AI 代码解读

这一步我们应该相当熟悉了,前面文章介绍Vision框架时,几乎每个示例都会使用到这个类。之后来创建识别请求:

let objectRecognition = VNCoreMLRequest(model: visionModel, completionHandler: {
   
    (request, error) in
    DispatchQueue.main.async(execute: {
   
   
        // perform all the UI updates on the main queue
        if let results = request.results {
   
   
            self.handleOutPut(outPut: results as! [VNRecognizedObjectObservation])
        }
    })
})
AI 代码解读

这里使用了Vision框架中的VNCoreMLRequest类,这个类通过CoreML模型来创建请求。最后发起请求即可:

try? imageRequestHandler.perform([objectRecognition])
AI 代码解读

关于请求的结果的处理,其实就是对VNRecognizedObjectObservation数据的处理,示例如下:

func handleOutPut(outPut: [VNRecognizedObjectObservation]) {
   
   
    for objectObservation in outPut {
   
   
        // 获取可信度最高的结果
        let topLabelObservation = objectObservation.labels[0]
        // 获取位置和尺寸
        var box = objectObservation.boundingBox
        box.origin.y = 1 - box.origin.y - box.size.height
        let size = imageView.frame.size
        let v = UIView()
        v.frame = CGRect(x: box.origin.x * size.width, y: box.origin.y * size.height, width: box.size.width * size.width, height: box.size.height * size.height)
        v.backgroundColor = .clear
        v.layer.borderColor = UIColor.red.cgColor
        v.layer.borderWidth = 2
        imageView.addSubview(v)

        let label = UILabel()
        label.font = .boldSystemFont(ofSize: 18)
        label.text = "\(topLabelObservation.identifier):" + String(format: "%0.2f", topLabelObservation.confidence)
        label.frame = CGRect(x: v.frame.origin.x, y: v.frame.origin.y - 18, width: 200, height: 18)
        label.textColor = .red
        imageView.addSubview(label)
    }
}
AI 代码解读

代码运行效果如下图所示:

可以看到,这个识别模型对交通工具和信号灯的识别度很高,其用来做辅助驾驶或导航会非常好用。

2 - TOLOv3Tiny模型

TOLOv3模型很好用,但其尺寸也很大,32位的模型大小为248.4MB,最算最小的8位模型也要62.2MB。更多时候将这么大的一个模型引入应用中是要付出成本的,最直观的成本就是应用的包体积会增大,增加用户的下载难度。TOLOv3还提供了一个精简版的模型TOLOv3Tiny,从功能上来说,其与TOLOv3所能支持的识别的词库一样,但其只有35.4MB,并且最小的8位模型只有8.9MB。其用法与TOLOv3一样,对同一张图片,其识别效果如下:

可以看到,相比起来,精简版的模型对物体的边界分析能力要略差一些。识别的精度也更低一些。

这两个模型都可以在如下地址下载:

https://developer.apple.com/machine-learning/models/

示例代码可在此Demo中查看:

https://github.com/ZYHshao/MachineLearnDemo

目录
打赏
0
0
0
0
47
分享
相关文章
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
214 0
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
本系列前面的文章详细的介绍了在iOS中与AI能力相关的API的使用,也介绍了如何使用训练好的CoreML模型来实现更强大的AI能力。然而,无论是成熟的API提供的能力,还是各种各样的三方模型,有时候都并不能满足某一领域内的定制化需求。当我们拥有很多的课训练数据,且需要定制化的AI能力时,其实就可以自己训练生成CoreML模型,将此定制化的模型应用到工程中去。
463 0
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型
本篇文章将是本系列文章的最后一篇。本专题将iOS中有关Machine Learning的相关内容做了整体梳理。下面是专题中的其他文章地址,希望如果你有需要,本专题可以帮助到你。
412 0
iOS MachineLearning 系列(21)——CoreML模型的更多训练模板
前面文章中,有介绍如何训练生成定制化需求的 CoreML 模型,以图像分类为例做了演示.
231 0
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
118 66
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
113 3
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等