VisionFramework 및 CoreML을 사용한 이미지 분석

8846 단어 SwiftiOS

개시하다


CoreML을 사용한 이미지 해석에 관해서는 좀 늦었지만 시도해 보았습니다.

환경 확인


다음 환경을 사용합니다.
  • macOS Sierra Version 10.12.4
  • Xcode Version 9.0.0 β6
  • iOS11.0β6
  • 이번에 하고 싶은 거.


    코어ML을 사용하여 묶음에 포함된 이미지의 해석 결과를 탭에 토로합니다.간단한 동작만 확인하기 위해 터미널 내부에서 이미지를 얻지 않고 이미지의 통신을 하지 않고 프로젝트에 저장합니다.

    모델 가져오기


    다음 단계에 따라 프로젝트에 학습된 모델을 포함합니다.
    이번에는 애플이 제공한 ResNet50을 사용하겠습니다.
    ※ 모형은 아래 사이트에서 구입할 수 있습니다.
    https://developer.apple.com/machine-learning/
  • 프로젝트 파일에 모델 넣기
  • 드래그 앤 드롭을 통해 손쉽게 넣을 수 있습니다.
  • 모델 대상에 항목 추가
  • Utility Area의 Target Memberhip에서 항목 추가
  • 이때 Xcode를 통해 모델에 대응하는 카테고리를 자동으로 생성
  • 이렇게 하면 모델 화면 중앙부의 모델 클래스 부분에 (->) 표시가 표시되기 때문에 이 부분을 클릭하면 클래스 내용을 확인할 수 있다.

  • 클래스 내에는 초기화 방법, 해석용 이미지의 속성, 해석 방법 등이 있다.여기서 눈길을 끄는 것은 이미지가 UIImage가 아니라 CVPixelBuffer에 의해 정의된 것이다.
    Resnet50.swift
        /// 画像解析対象のイメージ(224 * 224 のピクセルバッファで定義する必要がある)
        /// Input image of scene to be classified as color (kCVPixelFormatType_32BGRA) image buffer, 224 pixels wide by 224 pixels high
        var image: CVPixelBuffer
    
        /// 解析用のメソッド
        func prediction(image: CVPixelBuffer) throws -> Resnet50Output
    

    이루어지다


    다음 단계에 따라 실시한다.
  • 이미지의 URL 획득
  • 학습된 모델의 인스턴스 생성
  • VNCore Request용 모델 클래스 생성
  • VisionFramework의 요청용 프로세서 생성
  • VNCoreMLRequest의 생성
  • compuletionHandler에 결과를 기재한 후 처리
  • request
  • 실행
    import UIKit
    import CoreML
    import Vision
    
    class ViewController: UIViewController {
        // 結果出力用のラベル
        @IBOutlet weak var resultLabel: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // 画像ファイルのURL取得
            let path = Bundle.main.path(forResource: "sample", ofType: "jpg")
            let imageURL = NSURL.fileURL(withPath: path!)
    
            // 学習済みModelのインスタンス生成
            let modelFile = Resnet50()
            // Vision FrameworkのVNCoreMLRequest用のクラス生成
            let model = try! VNCoreMLModel(for: modelFile.model)
            // VNRequestのhandler作成
            let handler = VNImageRequestHandler(url: imageURL)
            // リクエストの生成
            let request = VNCoreMLRequest(model: model) { (request, error) in
                // 結果取得
                guard let results = request.results as? [VNClassificationObservation] else {
                    fatalError("ML Vision Requestの結果取得失敗")
                }
                // 予測結果と信頼度の定義
                var bestPrediction = ""
                var bestConfidence: VNConfidence = 0.0
    
                // 最高信頼度の予測結果と信頼度数値を取得
                for classification in results {
                    if(classification.confidence > bestConfidence) {
                        bestConfidence = classification.confidence
                        bestPrediction = classification.identifier
                    }
                }
                // 予測結果と信頼度の出力
                print("予測: \(bestPrediction) 信頼度:\(bestConfidence)" )
                self.resultLabel.text = bestPrediction
            }
            // requestの実行
            try! handler.perform([request])
        }
    }
    

    감상


    CoreML 단일체는 반드시 CVPixel Buffer를 사용해야 한다. 모델에 따라 이미지 사이즈를 조정해야 하고 예측 방법의 매개 변수와 출력 형식은 모델에 따라 미묘한 차이가 있기 때문에 배운 모델의 전환도 시간이 걸리고 약간 어렵다.
    그런 점에서 VisionFramework를 사용하면 그 부분은 신선도가 유지되고 문턱이 낮아진다.사용한 모델의 변경도 VNCoreMLModel의 매개 변수의 모델 종류를 변경한 모델일 뿐, 매우 간단하게 느껴진다.

    참고 문헌


    Apple 공식 문서 - Mine Learning

    좋은 웹페이지 즐겨찾기