아이폰에서 기계 학습 모형으로 이미지 식별

이 항목에는 GMO 광고 Advent Calendar 2018이 포함되어 있습니다.
( https://qiita.com/advent-calendar/2018/gmo-am ) 의 보도.
GMO 광고 마케팅이 Advent Calendar에 참가하는 것은 이번이 처음이다.

입문


'ML 만들기'를 사용하면 머신러닝 모델을 쉽게 만들 수 있기 때문에 한번 시도해 보았습니다.
이미지 인식을 통해 아이폰 카메라의 인물이 무엇인지 식별하는 앱을 만든다.
내가 너에게 식별시키고 싶은 것은 산타클로스다.다른 것은 하동, 좀비다.
실행 환경은 다음과 같습니다.
Mac OS X 10.14.2(mojave)
iOS12
Xcode10

기계 학습 모형 만들기


이미지 데이터 수집


구글 등 검색엔진을 이용해 산타클로스, 하동, 좀비의 사진을 각각 수집한다.
수집된 이미지는 이번에 사용된 Apple의 이미지 인식 메커니즘에 따라 분류되어 저장됩니다.
이미지의 약 80%는 교육 데이터 세트로 교육 데이터 세트 폴더 아래에 저장되고 나머지 이미지는 테스트 데이터 세트로 테스트 아래 폴더에 저장됩니다.
이번에는 산타클로스, 하동, 좀비의 종류별로 20장의 이미지를 준비해 훈련용 폴더에 16장, 테스트용 이미지 목록에 4장의 이미지를 저장했다.
다음은 설정 예입니다.
교육 데이터 세트

테스트 데이터 세트

기계 학습 모형 만들기


Xcode에서 Playground를 선택한 다음 macOS 템플릿을 선택합니다.
편집기에 다음을 입력합니다.
Recognition.swift
import CreateMLUI 

let builder = MLImageClassifierBuilder()
builder.showInLiveView()
코드를 입력하고 Playgound의 실행 아이콘을 선택합니다.
Assistant Editor 디스플레이 버튼을 선택하면 오른쪽에 이미지용 머신러닝용 GUI가 표시됩니다.

그럼 제가 기계 학습용 모형을 만들게요.트레이닝 이미지가 포함된 폴더를 Drop Images to Begin Traning 섹션으로 드래그합니다.그리고 기계 학습 모형을 만들기 위한 교육을 시작한다.

다음은 기계 학습 모형의 테스트를 진행한다.테스트 이미지가 포함된 폴더를 Drop Images to Begin Testing으로 드래그합니다.방금 만든 기계 학습 모델을 테스트하여 식별 정밀도를 표시합니다.

생성된 머신 러닝 모델의 이름을 지정하고 파일을 저장합니다.

이 설정의 예는 ImageClassifier입니다.파일은 mlmodel 이름으로 저장됩니다.

기계 학습 모형 내장


XCode에서 Project를 선택하고 iOS의 템플릿을 선택하여 iPhone용 응용 프로그램을 만듭니다.

머신 러닝 모델 추가


드래그하여 추가합니다.

Info.평면 편집


카메라를 사용할 설정을 추가합니다.
Info.plist
    <key>NSCameraUsageDescription</key>
    <string>カメラでの撮影のため必要です。</string>

프로그램 주체의 설치


ViewController.swift
import UIKit
import AVFoundation
import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    let recognitionLabel: UILabel = {
        let recognitionLabel = UILabel()
        recognitionLabel.textColor = .white
        recognitionLabel.translatesAutoresizingMaskIntoConstraints = false
        recognitionLabel.text = ""
        recognitionLabel.font = recognitionLabel.font.withSize(24)
        return recognitionLabel
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupCaptureSession()

        view.addSubview(recognitionLabel)
        recognitionLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        recognitionLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -50).isActive = true
    }

    func setupCaptureSession() {
        let captureSession = AVCaptureSession()

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

        do {
            if let captureDevice = availableDevices.first {
                captureSession.addInput(try AVCaptureDeviceInput(device: captureDevice))
            }
        } catch {
            print(error.localizedDescription)
        }

        let captureOutput = AVCaptureVideoDataOutput()
        captureSession.addOutput(captureOutput)

        captureOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))

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

        captureSession.startRunning()
    }

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        // 機械学習モデルの取得
        guard let model = try? VNCoreMLModel(for: ImageClassifier().model) else { return }

        guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

        // 機械学習モデルを利用して画像認識
        let request = VNCoreMLRequest(model: model) { (finishedRequest, error) in
            guard let results = finishedRequest.results as? [VNClassificationObservation] else { return }
            guard let Observation = results.first else { return }

            DispatchQueue.main.async(execute: {
                self.recognitionLabel.text = "\(Observation.identifier)"
            })
        }

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

실행 이미지


아래의 인상처럼 산타클로스가 인식되었다.
(응용 프로그램에서 화면을 포착할 수 없기 때문에 실행 인상으로 기재됨)

주제 밖의 말을 하다.이번에 제작된 모형은 산타클로스, 하동, 좀비 3가지 종류가 있기 때문에 그 중 하나처럼 이미지 인식을 해야 한다.모형을 만들 때 녹색 이미지가 많아서인지 오이는 하동으로 여겨진다.

참고 자료


Classifying Images with Vision/Apple
Create ML
How to build an image recognition iOS app with Apple's CoreML and Vision APIs

다음 Advent Calendar 2018


내일@mnaka1115 선생의 "Gephi로 보도된 회유 상황을 가시화"에 관한 이야기입니다.
기대해주세요.
크리스마스까지 이어지는 GMO 광고 컨설턴트 달력 2018
앞으로도 투고에 꼭 관심을 가져주세요!
■ 엔지니어의 Techblog 공개 중!
https://techblog.gmo-ap.jp/
■ Wantedly 페이지~ 블로그와 채용 공개중!~
https://www.wantedly.com/projects/199431
■ 엔지니어 모집 페이지~ 복지와 각종 제도에 대한 소개가 여기 있습니다~
https://www.gmo-ap.jp/engineer/
■ 엔지니어 모집 실습 중!~ 유상형 실습으로 개발 현장을 체험해보자~
https://hrmos.co/pages/gmo-ap/jobs/0000027

좋은 웹페이지 즐겨찾기