今天简单使用了下CoreML , 我的这个模型功能主要是 打开摄像头,然后对准物体,会自动帮我们识别摄像头中的物体,并且给我们大概的百分比值

代码如下:

    @IBAction func startClick(_ sender: Any) {
startFlag = !startFlag
if startFlag {
startCaptureVideo()
startButton.setTitle("stop", for: .normal)
}else {
startButton.setTitle("start", for: .normal)
stop()
} } //1、初始化CaptureSeason
lazy var captureSession:AVCaptureSession? = {
    //1.1 实例化
let captureSession = AVCaptureSession()
captureSession.sessionPreset = .photo
   //1.2 获取默认设备
guard let captureDevice = AVCaptureDevice.default(for: .video) else {
return nil
} guard let captureDeviceInput = try? AVCaptureDeviceInput(device: captureDevice) else {
return nil
} captureSession.addInput(captureDeviceInput) let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(previewLayer)
previewLayer.frame = view.frame let dataOutput = AVCaptureVideoDataOutput()
dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "kingboVision"))
captureSession.addOutput(dataOutput)
return captureSession
}() func startCaptureVideo(){
captureSession?.startRunning()
} func stop() {
captureSession?.stopRunning()
} func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
print("Camera was safe ")
guard let pixelBuffer:CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else
{
print("nil object ")
return
} guard let model = try? VNCoreMLModel(for: SqueezeNet().model) else {return} let request = VNCoreMLRequest(model: model) { [unowned self](finishRequest, error) in
//
guard let results = finishRequest.results as? [VNClassificationObservation] else {
return
}
guard let first = results.first else {
return
}
DispatchQueue.main.async {
self.descriptionLabel.text = "\(first.identifier): \(first.confidence * 100)%,"
}
}
print("start to VN") try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
}

分为以下几步操作

1、我们工程inf.plist 文件中添加摄像头权限说明

  Privacy - Camera Usage Description     相机权限设置

 Privacy - Microphone Usage Description  麦克风权限设置

2、头文件引用

import AVKit
import Vision

3、准备模型

模型准备我这里是使用App 官网上的SqueezeNet模型

4、将模型拖动到工程里面即可

5、代码编写部分

 5.1 初始化AVCaptureSession

       let captureSession =  AVCaptureSession()
captureSession.sessionPreset = .photo

5.2 获取当前iPhone 设备控制,当作输入数据来源

guard  let captureDevice = AVCaptureDevice.default(for: .video) else {
return nil
}

captureSession.addInput(captureDeviceInput)

5.3 设置输出数据

//设置输出数据处理对象
let dataOutput = AVCaptureVideoDataOutput()
dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "kingboVision"))
captureSession.addOutput(dataOutput)

AVCaptureVideoDataOutput 设置代理,处理数据流图片数据,因此当前ViewController需要实现AVCaptureVideoDataOutputSampleBufferDelegate 的代理,如下

class ViewController: UIViewController ,AVCaptureVideoDataOutputSampleBufferDelegate{
...... func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
//将视频数据转成CVPixBuffer
guard let pixelBuffer:CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else
{
print("nil object ")
return
}
// 这里SquzzedNet是我从苹果中直接获取的模型
guard let model = try? VNCoreMLModel(for: SqueezeNet().model) else {return} let request = VNCoreMLRequest(model: model) { [unowned self](finishRequest, error) in
//处理数据分析进行业务处理
guard let results = finishRequest.results as? [VNClassificationObservation] else {
return
}
guard let first = results.first else {
return
}
DispatchQueue.main.async {
self.descriptionLabel.text = "\(first.identifier): \(first.confidence * 100)%,"
}
}
print("start to VN") try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
}
.....
}

5.4 将当前的摄像头显示在指定的View 上,(我们这里使用当前VC 的view)

  let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(previewLayer)
previewLayer.frame = view.frame

效果如下:

CoreML 简单使用的更多相关文章

  1. CoreML试水--图片识别

    今年的WWDC上,关于人工智能方面Apple开放了CoreML工具包. 今天就趁着时间还早果断的尝试了一下到底有多容易. import UIKit import CoreML import Visio ...

  2. Unity AR Foundation 和 CoreML: 实现手部的检测和追踪

    0x00 前言 Unity的AR Foundation通过上层抽象,对ARKit和ARCore这些底层接口进行了封装,从而实现了AR项目的跨平台开发能力. 而苹果的CoreML是一个可以用来将机器学习 ...

  3. iOS11 SDK 新特性 CoreML 及swift 小demo

    github代码 如果本博客对您有帮助,希望可以得到您的赞赏! swift 机器学习Core ML的简单调用小demo.完整代码附上: https://github.com/Liuyubao/LYBC ...

  4. coreml之通过URL加载模型

    在xcode中使用mlmodel模型,之前说的最简单的方法是将模型拖进工程中即可,xcode会自动生成有关模型的前向预测接口,这种方式非常简单,但是更新模型就很不方便. 今天说下另外一种通过URL加载 ...

  5. Mac mini M1使用简单体验(编程、游戏、深度学习)

    好久不见了各位! 前一阵子忍不住剁手买了M1芯片的mac mini,为了弥补自己的内疚感就卖了自己的旧的mbp2017款.数据也完全迁移到了新机器上,之前的工作也就由mbp2017彻底换成mac mi ...

  6. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  7. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  8. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  9. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

随机推荐

  1. bzoj1051题解

    [题意分析] 给你一张有向图,求有多少个点,满足以其他任意一点为起点都能到达该点. [解题思路] 如果这张有向图不连通,则一定没有点能被其他所有点到达,答案为0. 然后先用tarjan缩一波强连通分量 ...

  2. luoguP3281 [SCOI2013]数数

    传送门 抄的llj的代码 还有点问题没弄懂,先码着 //Achen #include<algorithm> #include<iostream> #include<cst ...

  3. NtOpenProcess被HOOK,跳回原函数地址后仍然无法看到进程

    点击打开链接http://www.ghoffice.com/bbs/read-htm-tid-103923.html

  4. (转)HashSet<T>类

    转载于:http://www.importnew.com/6931.html HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复 ...

  5. Tomcat下载部署及解决中文乱码显示

    一.下载 tomcat下载链接:https://tomcat.apache.org/ 1.进入tomcat官网后,我使用的是tomcat9,所以我选择tomcat9.然后点击core下的zip包下载. ...

  6. shell得到两个文件的差集

    第一种方法: grep: [root@hdp05 src]# grep -vxFf leadering.txt leaderNum.txt [root@hdp05 src]# cat leaderin ...

  7. Solrj API读取core 索引库数据

    private static String zkHost = "ip:2181,ip:2181,ip:2181"; private static CloudSolrServer s ...

  8. VO和DO的区别

    阿里巴巴Java开发手册中的DO.DTO.BO.AO.VO.POJO定义 分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Da ...

  9. iOS开发系列-iOS布局相关

    LayoutSubViews 需要在某个View调整子视图的位置时,可以重写. 以下情况会出发LayoutSubViews方法的调用 init初始化不会触发layoutSubviews,但是是用ini ...

  10. (转)C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...