Core ML
애플의 머신러닝
애플의 머신러닝은 통번역, 이미지 인식 등 상당히 강력한 기능을 제공하고 있다.
특징은, 사용자의 기기 안에서만 실행되기 때문에 네트워크에 연결할 필요가 없다는 것이다.
애플의 CoreML을 사용하여, 기존 앱에 쉽게 날개를 달아줄 수 있을 것이다.
CoreML 이라는 형식으로 저장된 머신 러닝 모델을 iOS 프로젝트에 추가해보자.
위 사이트에서 CoreML 모델을 다운받을 수 있다.
이번에는 이미지 인식기능과 자연어 언어감지 기능을 사용해보겠다.
일반적으로 .mlmodel 파일은 용량이 크기 때문에, gitignore에 추가하는 것이 일반적이다.
이미지 인식
mlmodel을 프로젝트에 추가했다면, 이제 필요한 라이브러리를 import 한다.
import CoreML
import Vision
SqueezeNet 라는 모델을 사용했으며, 코드는 다음과 같다.
let modelFile = try? SqueezeNet(configuration: MLModelConfiguration())
모델 파일을 로드하고 MLModelConfiguration를 통해 모델을 설정한다. SqueezeNet 는 이미 제공하는 (학습이 완료된) 이미지 분류 모델이다.
let model = try! VNCoreMLModel(for: modelFile!.model)
VNCoreMLModel을 사용하여 Core ML 모델을 Vision 프레임워크에서 사용할 수 있는 모델로 변환한다.
그리고 나서 이미지 처리 핸들러를 생성한다. 이미지 인식 기능 앱을 실습할때와 마찬가지로 CGImage 를 요구한다.
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
그리고 이미지 인식 요청이 완료된 후 호출되어 결과를 처리하는 함수를 정의한다.
findResults()
guard let results = request.results as? [VNClassificationObservation] else {
fatalError("Unable to get results")
}
request.results를 VNClassificationObservation 배열로 캐스팅하여 이미지 인식 결과를 가져온다.
이제부터는 confidence, ‘신뢰도’라고 하는 것을 통해 confidence의 최댓값을 찾아야 한다. 이미지 인식에 있어, 더 나은 결과를 이끌어낼 수 있도록.
최댓값을 찾는 과정과 유사하게. 코드는 다음과 같다.
var bestGuess = ""
var bestConfidence: VNConfidence = 0
for classification in results {
if classification.confidence > bestConfidence {
bestConfidence = classification.confidence
bestGuess = classification.identifier
}
}
다시 말해, 인식된 결과 중 가장 높은 신뢰도를 가진 결과를 찾는 과정이라고 볼 수 있다.
실행 결과
추가로, SqueezeNet 모델이 MobileNetV2 보다 더 높은 신뢰도를 가진 결과를 찾을 수 있었다.
언어 인식
이번에는 텍스트를 분석하여, 텍스트의 언어를 인식하는 기능을 실습해보았다.
따로 model 파일 추가 없이, NaturalLanguage 를 임포트 하여 사용할 수 있다.
func predictLanguage(text: String) -> String? {
let locale = Locale(identifier: "en")
let recognizer = NLLanguageRecognizer()
recognizer.processString(text)
guard let language = recognizer.dominantLanguage else {
return "Unknown language"
}
return locale.localizedString(forIdentifier: language.rawValue)
}
predictLanguage 함수는 text의 언어를 인식하는 함수.
NLLanguageRecognizer 언어 인식기를 초기화하고,
recognizer.dominantLanguage 를 통해 가장 유력한 언어를 가져온다.
결과를 나타내는 부분은 Locale, 이 영어로 language.rawValue 를 뽑아내어, ‘ko’를 ‘korean’ . 이런 식으로 뽑아내는 것.