Как мне создать простое приложение для камеры в Swift, используя CoreML, которое не принимает оперативный ввод?

#ios #swift #camera #image-recognition #coreml

#iOS #быстрый #камера #распознавание изображений #coreml #swift

Вопрос:

Я пытался создать простое приложение для распознавания изображений с камеры в xcode с помощью swift, которое позволяет пользователю делать снимки. Затем фотография вводится в уже подготовленную модель CoreML, а результат с прогнозируемой точностью выводится на этикетку.

Я просмотрел несколько веб-сайтов, и все, что я могу найти, это учебные пособия, такие как

https://medium.freecodecamp.org/ios-coreml-vision-image-recognition-3619cf319d0b

это позволяет распознавать изображения в режиме реального времени. Я не хочу, чтобы это было в режиме реального времени, а просто позволяю кому-то делать снимок. Я хотел бы знать, как возможно преобразовать этот код таким образом, чтобы он не вводился в реальном времени:

   import UIKit
  import AVFoundation
  import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
let label: UILabel = {
    let label = UILabel()
    label.textColor = .white
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = "Label"
    label.font = label.font.withSize(30)
    return label
}()
override func viewDidLoad() {

    super.viewDidLoad()

    // establish the capture session and add the label
    setupCaptureSession()
    view.addSubview(label)
    setupLabel()
    // Do any additional setup after loading the view, typically from a nib.
}
func setupCaptureSession() {
    // create a new capture session
    let captureSession = AVCaptureSession()

    // find the available cameras
    let availableDevices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back).devices

    do {
        // select a camera
        if let captureDevice = availableDevices.first {
            captureSession.addInput(try AVCaptureDeviceInput(device: captureDevice))
        }
    } catch {
        // print an error if the camera is not available
        print(error.localizedDescription)
    }

    // setup the video output to the screen and add output to our capture session
    let captureOutput = AVCaptureVideoDataOutput()
    captureSession.addOutput(captureOutput)
    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewLayer.frame = view.frame
    view.layer.addSublayer(previewLayer)

    // buffer the video and start the capture session
    captureOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
    captureSession.startRunning()
}

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    // load our CoreML Pokedex model
    guard let model = try? VNCoreMLModel(for: aslModel().model) else { return }

    // run an inference with CoreML
    let request = VNCoreMLRequest(model: model) { (finishedRequest, error) in

        // grab the inference results
        guard let results = finishedRequest.results as? [VNClassificationObservation] else { return }

        // grab the highest confidence result
        guard let Observation = results.first else { return }

        // create the label text components
        let predclass = "(Observation.identifier)"
        let predconfidence = String(format: "%.02f%", Observation.confidence * 100)

        // set the label text
        DispatchQueue.main.async(execute: {
            self.label.text = "(predclass) (predconfidence)"
        })
    }


    // create a Core Video pixel buffer which is an image buffer that holds pixels in main memory
    // Applications generating frames, compressing or decompressing video, or using Core Image
    // can all make use of Core Video pixel buffers
    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

    // execute the request
    try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
}
func setupLabel() {
    // constrain the label in the center
    label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

    // constrain the the label to 50 pixels from the bottom
    label.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -50).isActive = true
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
  

}

Прямо сейчас, как было указано ранее, он принимает ввод изображения в реальном времени.

Ответ №1:

Я написал об этом пост на Medium, но он на португальском. Посмотрите, позволяет ли автоматический перевод Medium вам понять сообщение.

Swift Core ML

Я надеюсь, что это может вам помочь.

Комментарии:

1. Спасибо, это привело меня в правильном направлении. Мне просто интересно, есть ли причина, по которой ввод в модель должен быть CIImage? И мне также было интересно, поскольку ожидаемый ввод модели, которую я использую, представляет собой изображение размером 112 на 112, должен ли я увеличивать изображение перед вводом его в модель?

2. CIImage Было использовано из-за init VNImageRequestHandler . Это зависит от вашей модели, которая имеет свои собственные входные свойства. Вы должны проверить это, когда добавляете свою модель в проект.