iOS11 카메라와 CoreML(Vision)로 이미지 감지

카메라(비디오)에서 취득한 화상 데이터로부터 iOS11 로 도입된 CoreML 와 그 상위 레이어의 Vision 를 사용해 화상 검출하는 샘플입니다.Xcode9 와 카메라를 사용하므로 iOS11 를 설치한 실제 기기가 필요합니다.
요 전날 WWDC2017 세션 이런 분위기 덧붙여서 미국의 드라마 실리콘 밸리에 등장한 ホットドック🌭 かそうでないか 를 판정하는 앱이 개그로 유행했기 때문에, 여기에서도 바나나를 찍어 not 🌭 로 우케하고 있습니다.

전 자료는 Brian 씨의 이쪽의 YouTube 동영상 입니다. (그에게 승낙)

짧기 때문에 소스 코드를 대충 올립니다. (스토리 보드는 사용되지 않음)

ViewController.swift

import UIKit
import AVKit
import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

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

        guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
        guard let input = try? AVCaptureDeviceInput(device: captureDevice) else { return }

        captureSession.addInput(input)
        captureSession.startRunning()

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

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        captureSession.addOutput(dataOutput)
    }

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

        guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else { return }

        let request = VNCoreMLRequest(model: model) { (finishedReq, err) in
            guard let results = finishedReq.results as? [VNClassificationObservation] else { return }
            guard let firstObservation = results.first else { return }
            print(firstObservation.identifier, firstObservation.confidence)
        }

        try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
    }
}

또한 CoreML 학습 모델 파일(Inceptionv3.mlmodel)과 카메라 사용 권한 설정(Info.plist)이 필요합니다.



CoreML의 모델 파일를 다운로드합니다. Inception v3를 선택하십시오.


다운로드한 모델 파일을 프로젝트에 복사합니다.
모델 파일을 선택하고 File Inspector > Target Membership를 선택합니다. 그러면 자동으로 클래스 파일이 생성됩니다. (수초가 걸립니다)


실제 기계를 잡고 실행합니다. 이런 느낌이 듭니다.

학습 모델을 바꾸고 싶다면


CoreML에 해당하는 학습 학습 모델 파일은 여기에서도 다운로드 할 수 있습니다.
MNIST, 랜드마크에서 위도 경도를 반환하거나 자동차 차종, 과일, 꽃에 특화된 학습 모델 등도 있습니다.
기본적으로는, 이하의 VNCoreMLModel 의 인수를 재기록하는 것만으로 움직입니다.


CoreML 자체는 추론 기능뿐이므로, Keras나 Caffe등으로 학습 모델을 작성해, 전환 도구CoreML 의 학습 모델 파일로 변환할 필요가 있습니다.

좋은 웹페이지 즐겨찾기