iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Mobile Development

iOS 菜雞的開發日記系列 第 22

鐵人賽 [Day 22] Core ML 教學(7)

  • 分享至 

  • xImage
  •  

今天要教大家如何在 Xcodce 專案中使用已經訓練好的模型!
不管自己訓練的模型或者是其他人已經訓練好的模型,只要遵照裡面的使用方法就都可以使用喔!

創建一個 Xcode 專案,並把自己做好的 mlmodel 檔放進去

https://ithelp.ithome.com.tw/upload/images/20231007/2015139180jAWiAWvt.png

https://ithelp.ithome.com.tw/upload/images/20231007/2015139174ZTAtcsLW.png

進行相機調用的設定

先設定一個可以呈現相機的 View

https://ithelp.ithome.com.tw/upload/images/20231007/20151391CMx4B7MrsI.png

    @IBOutlet weak var vVideo: UIView!

導入我們需要的框架

import CoreML
import AVFoundation

一個是 CoreML 的框架,另一個是蘋果的多媒體處理框架

設定相機的輸入源,以及輸入判斷並輸出的程式碼

使用手機的內置相機後鏡頭捕捉視訊

 // 創建一個 AVCaptureSession 來管理音頻和視頻的捕獲設定
let captureSession = AVCaptureSession()
        
// 獲取預設的後置內置廣角攝像頭作為視頻捕獲設備
let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
        
// 聲明一个可選變量来儲存捕獲設備的輸入源
var input: AVCaptureDeviceInput?
        
// 使用 do-catch ,創建 AVCaptureDeviceInput 從捕獲設備。如果
do {
    input = try AVCaptureDeviceInput(device: captureDevice!)
} catch {
    print(error.localizedDescription)
}

設定視訊資料輸出的代理,以及將視訊加進剛剛的 UIView

// 創建一個AVCaptureVideoPreviewLayer,用於在 vVideo UIView 上顯示攝像頭預覽
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        
// 創建一個 AVCaptureVideoDataOutput ,用於處理捕獲到的視頻數據
let outputData = AVCaptureVideoDataOutput()
        
// 設置 outputData 的樣本緩衝協議代理為 self ,並指定一個名為 "videoQueue" 的 DispatchQueue 用於處理捕獲的視訊數據
outputData.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        
// 將 outputData 添加到捕獲會話(captureSession)的輸出(output)中
captureSession.addOutput(outputData)
        
// 設置 previewLayer 的框架大小,以匹配剛剛設定好的 UIView 的寬度和高度,用於顯示攝像頭預覽
previewLayer.frame = CGRect(x: 0, y: 0, width: vVideo.frame.width,
                                    height: vVideo.frame.height)
        
// 在 vVideo UIView 的圖層上添加previewLayer,以顯示攝像頭預覽
vVideo.layer.addSublayer(previewLayer)
        
// 將之前創建的捕獲設備輸入(input)添加到捕獲會話(captureSession)中
captureSession.addInput(input!)
        
// 使用背景排隊(DispatchQueue.global)啟動捕獲會話(captureSession),以開始捕獲視訊
DispatchQueue.global(qos: .background).async {
    captureSession.startRunning()
}

設定視訊資料的輸出判斷,以及 print 出結果

// 記得先繼承喔!


class MainViewController: AVCaptureVideoDataOutputSampleBufferDelegate

// AVCaptureVideoDataOutput 委託方法,當攝像頭輸出新的視頻幀時被調用
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    // 從 CMSampleBuffer 中獲取像素緩衝區(pixelBuffer),該緩衝區包含捕獲的視頻幀數據
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
    
    do {
        // 創建一個 MLModelConfiguration 來配置機器學習模型
        let modelConfiguration = MLModelConfiguration()
        
        // 創建 DogsAndCatsDetection 模型實例,該模型用於狗和貓的檢測
        let model = try DogsAndCatsDetection(configuration: modelConfiguration)
        
        // 創建一個 DogsAndCatsDetectionInput 對象,並使用像素緩衝區作為輸入圖像
        let input = DogsAndCatsDetectionInput(image: pixelBuffer!)
        
        // 使用機器學習模型進行預測,並獲取預測結果
        let output = try model.prediction(input: input)
        
        // print 出預測的類別標籤
        print(output.classLabel)
    } catch {
        // 如果有錯誤發生,打印錯誤消息
        print(error.localizedDescription)
    }
}

大功告成!!

https://ithelp.ithome.com.tw/upload/images/20231007/20151391CssEyIQFsO.png


上一篇
鐵人賽 [Day 21] Core ML 教學 (6)
下一篇
鐵人賽 [Day 23] FCM(Firebase Cloud Message) 推播教學(1)
系列文
iOS 菜雞的開發日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言