CoreML 简单使用

摘要:
今天,我只使用了CoreML。我这个模型的主要功能是打开相机,然后对准物体。它将自动帮助我们识别相机中的对象,并提供如下近似百分比代码:@IBActionfuncstartClick(_sender:Any){startFlag=!StartFlagifstartFlag{startCaptureVideo()startButton。setTitle(“stop”,用于:.nor

   今天简单使用了下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 简单使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java 之 调用.Net的 WebService 整理Android系统默认Home应用程序(Launcher)的启动过程源码分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

聚合初始化

从当前C++标准库中提取,提供了两个容器来表示数组的概念:array表示静态数组,vector表示动态数组。这两种类型都可以使用列表初始化进行初始化。std::array={1,2,3,4,5};std::vector<int>={1,2,3,4,5};这实际上是聚合初始化。聚合初始化历史悠久,在C语言中就已经存在。intarray[5]={1,2,3,4,...

C# AES的128位、192位、256位加密

这里将不解释C#AES的128位、192位和256位加密原理。这里我们主要讨论AES的CBC加密模式中128位、192位和256位加密之间的差异,并参考对称加密和块加密的四种模式。16位密钥对应128位加密,24位密钥对应192位加密,32位密钥对应256位加密,矢量必须为16位。“);ifthrownewException(”指定的密钥长度不能小于16位。...

【Lua】使用随机数(转)

游戏中有一个用于创建角色的随机命名功能,它使用随机数。我在网上找到一篇关于在Lua使用随机数的文章。标记它。Lua需要两个函数来生成随机数:数学。randomseed,数学。数学随机种子接收整数n作为随机序列种子。将系统时间视为随机种子是很自然的,也就是说,数学随机——然后连续生成i=1,5do打印结束的随机数,但问题出现了。如果程序在短时间内运行几次,您得...

Fiddler抓包7-post请求(json)(转载)

2.查看上图中的红色框:这里只支持application/x-www-form-urlencoded格式的body参数,即json格式。您需要检查JOSN列中的five和xml。1.如果遇到text/xml格式的正文,如下图所示...

如何根据角色批量激活SAP Fiori服务

我们知道Fiori的角色不同于ERP,即使您的帐户具有SAP_ALL权限,但当您打开Fiori时,它也是空的:只有在您将Fiori所需的角色添加到帐户并激活相关服务时,才能使用Fioriapp。否则,打开Fioriapps将报告错误。可以通过GUI事务代码找到特定错误:/n/iwfnd/error_Log以查看特定原因。...

[转]从minio中读取文件流进行下载文件

本文转自:https://blog.csdn.net/ZHANGLIZENG/article/details/82892678一、获取Minio连接publicstaticStringminioUrl;publicstaticStringminioUsername;publicstaticStringminioPassword;@Value("${syste...