CoreML 简单使用
今天简单使用了下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 简单使用的更多相关文章
- CoreML试水--图片识别
今年的WWDC上,关于人工智能方面Apple开放了CoreML工具包. 今天就趁着时间还早果断的尝试了一下到底有多容易. import UIKit import CoreML import Visio ...
- Unity AR Foundation 和 CoreML: 实现手部的检测和追踪
0x00 前言 Unity的AR Foundation通过上层抽象,对ARKit和ARCore这些底层接口进行了封装,从而实现了AR项目的跨平台开发能力. 而苹果的CoreML是一个可以用来将机器学习 ...
- iOS11 SDK 新特性 CoreML 及swift 小demo
github代码 如果本博客对您有帮助,希望可以得到您的赞赏! swift 机器学习Core ML的简单调用小demo.完整代码附上: https://github.com/Liuyubao/LYBC ...
- coreml之通过URL加载模型
在xcode中使用mlmodel模型,之前说的最简单的方法是将模型拖进工程中即可,xcode会自动生成有关模型的前向预测接口,这种方式非常简单,但是更新模型就很不方便. 今天说下另外一种通过URL加载 ...
- Mac mini M1使用简单体验(编程、游戏、深度学习)
好久不见了各位! 前一阵子忍不住剁手买了M1芯片的mac mini,为了弥补自己的内疚感就卖了自己的旧的mbp2017款.数据也完全迁移到了新机器上,之前的工作也就由mbp2017彻底换成mac mi ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
随机推荐
- jsonp的原理,应用场景,优缺点
在开发测试中,难免会在不同域下进行跨域操作,出于安全性考虑,浏览器中的同源策略阻止从一个域上加载的脚本获取或者操作 另一个域下的文档属性,这时需要进行跨域的方式进行解决,如:使用jsonp ,ifra ...
- JDK 安装步骤
1.JAVA_HOME = JDK安装路径 2. Path = %JAVA_HOME%\bin; 3. CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%J ...
- oracle一体机(exdata)创建ACFS文件系统
ACFS是一个支持多个平台,可扩展的,基于ORACLE ASM的集群文件系统,可以用来存储数据库和各种应用的文件,包括数据库的trace文件,alert日志文件和配置文件等等,也可以用来存储视频,音频 ...
- (转)Python学习笔记(1)__name__变量
Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行.每个文件(模块)都可以任意写一些没有缩进的代码,并在载入时自动执行.为了区分 主执行代码和被调用文件,Python引入 ...
- 剑指offer——10跳台阶演变
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 题解: 纯找规律题: class Solution { public: ...
- 自动化测试工具2-testcomplete
今天来说说testcomplete的使用 录了一个简单案例视频,网址如下:https://v.qq.com/x/page/f05116a062y.html 第一步是创建一个工程: 输入工程名,和选择工 ...
- 获取从天气预报接口返回回来的json数据
搬迁到了我的新博客中 ==> http://www.suanliutudousi.com/2017/08/26/%E8%8E%B7%E5%8F%96%E4%BB%8E%E5%A4%A9%E6%B ...
- verbosity
import unittest class myTest(unittest.TestCase): def test_01(self): print("普通方法1") def tes ...
- uoj140 【UER #4】被粉碎的数字
题目 看起来就像是数位\(\rm dp\) 不妨从竖式乘法的角度来考虑这个问题 为了方便处理进位,我们得从低位向高位填数 设\(dp[i][0/1][j][p][t]\)表示填到了第\(i\)位,卡不 ...
- WebApi的Swagger多版本控制实现
WebApi + Swagger2.0接口文档多版本控制设计实现 最近前后端分离的项目越来越多,API的对接对于前后端开发交流得最多的一块内容,一个好的API文档生成工具就显得非常重要,选取了Swag ...