首页 > 其他分享 >iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型

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

时间:2023-05-22 23:32:29浏览次数:54  
标签:box MachineLearning 17 TOLOv3 模型 CoreML let 识别 size

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

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

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

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

这一步我们应该相当熟悉了,前面文章介绍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])
        }
    })
})

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

try? imageRequestHandler.perform([objectRecognition])

关于请求的结果的处理,其实就是对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)
    }
}

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

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

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

标签:box,MachineLearning,17,TOLOv3,模型,CoreML,let,识别,size
From: https://blog.51cto.com/u_11643026/6327940

相关文章

  • CF1770F 题解
    \(\text{link}\)。很困难的二进制计数。前置知识\(1\):范德蒙德卷积推广。即\(\sum\limits_{a_1+a_2+\dots+a_n=k,a_i\in\N}\prod\limits_{j=1}^n\dbinom{b_i}{a_i}=\dbinom{b_1+b_2+\dots+b_n}{k}\)。这里给一个组合意义的证明。\(RHS\)相当于在\(\sumb_i\)个物品中选......
  • NOIP2017普及组试题题解
    1.成绩原题:https://www.luogu.com.cn/problem/P3954代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;inta,b,c;intmain(){ cin>>a>>b>>c; cout<<a/10*2+b/10*3+c/10*5; return0;}解题思路:因为数据保证a,b,c都是10的......
  • 【杂文随笔】2017年总结 送自己一个字
    .......
  • Python 1-17 元组
    Python1-17元组classtuple([iterable])tuple是一个不可变的序列类型。>>>s='abc'>>>l=[1,2]>>>t=1,2>>>d=dict(a=1,b=2)>>>set={'a','b'}1、元组创建>>>tup=()#创建空元组>>......
  • 2023-Liunx命令 第17章 软件包管理
    17.1rpm指令RPM软件包管理器【语法】rpm[选项][参数]【功能介绍】rpm指令是RPM软件包的管理工具。RPM(全称为:RedHatPackageManager)最早由Redhat公司开发,作为RedhatLinux中软件包的管理工具。目前,有很多主流的发行版都是用RPM来管理Linux的软件包 【选项......
  • 如何在UBUNTU中卸载 OpenJDK,安装 Oracle JDK 17
    可以按照以下步骤在Ubuntu中卸载OpenJDK:1.打开终端并输入以下命令,列出您系统上已安装的Java软件包:```dpkg--list|grep-Ei"jdk|jre"```该命令会显示您系统上已安装的Java软件包的清单。2.选择您想要卸载的Java软件包并输入以下命令进行卸载。例如,如......
  • CF1774F Magician and Pigs【性质】
    有一个空序列,需要维护如下三个操作:1x:在序列中添加\(x\)。2x:把序列中每个元素的值减去\(x\)。3:重复从第一条到本条操作的前一条的所有操作,包括操作\(3\)。当一个数的值\(\leq0\)时,它将被移出序列。求最后有多少个数还在序列中。答案对\(998244353\)取模。\(n\leq......
  • Stack Overflow 2017 开发者调查报告(程序员必看)
    最近,StackOverflow发布了一篇2017开发者调查报告,此次在全球有超过64,000名开发者参与调查,分别对其技能、工具、学习趋势等数据进行了统计,比较遗憾的是中国参与调查的开发者很少,只有大概300人左右,所以有些调查结果可能跟中国环境不太相符,不过毫无疑问,这几乎代表了全球技术的......
  • 2017第二届广东省强网杯线上赛--------phone number
    ================================个人收获:1.sql语句里面也可以直接用database()2.跟数据库有联系的地方都可能存在注入 ================================题目: 开始前对源码,http请求,路径。。这些都找过没什么有用的信息。就只有这个还有点用,再检查手机号使用人数页面的源码有这......
  • POJ1737 Connected Graph ( n点无向连通图计数
    题意说明:求\(n\)个点的无向连通图个数据说已经非常典了,但是我太菜了不会组合数学,最近补档时看到这道题,决定记录下来理理思路......