본문 바로가기
iOS/CoreML

CoreML 배워보자 (1)

by HaningYa 2020. 4. 13.
728x90


책을 한권 샀다.

 

실전! Core ML을 활용한 머신러닝 iOS 앱 개발: 인공지능을 활용한 객체 인식, 감정 탐지, 스타일 전이, 스케치 인식 구현

애플 Core ML을 활용한 스마트한 iOS 앱 만들기! Core ML은 다양한 머신러닝 작업을 지원하기 위해 설계된 API를 제공하는 애플의 유명한 프레임워크다. 이 프레임워크를 활용하면 머신러닝 모델을 훈련시킨 다음 그 모델을 iOS 앱에 통합시킬 수 있다. 이 책은 Core ML을 이해하기 쉽게 설명할 뿐 아니라 머신러닝을 명확하게 설명해 준다. 모바일 플랫폼(특히 iOS)에서 현실적이면서 흥미로운 머신러닝 예제를 통해 배우며, 시각 기반의 애플리케

wikibook.co.kr

 

온디바이스 머신러닝을 한번쯤 경험해봐야지 했는데
딱 맞는 책을 찾았다. 번역이 안좋다는 평도 있었지만 뭐 어떠한가

 

CoreML Framework

 

Core ML | Apple Developer Documentation

Add a simple model to an app, pass input data to the model, and process the model’s predictions.

developer.apple.com

Use Core ML to integrate machine learning models into your app. Core ML provides a unified representation for all models. Your app uses Core ML APIs and user data to make predictions, and to train or fine-tune models, all on the user’s device.

 

ML 모델을 앱으로 integrate 해주는 역할을 한다. Core ML의 API 와 사용자의 데이터로 예측을 하고 사용자의 디바이스 상에서 train 하거나 fine tuning 할 수 있다.

 

책에선 core ml이 추론만 수행할 수 있다고 한다. 그래서 다른 머신러닝 책들과 달리 ML 의 적용에 중점을 두고 주로 컴퓨터 비전 어플리케이션에 초점을 맞출거라 한다.


머신러닝이란

인공지능(AI) 의 히위분야이다. 초기 AI 는 수많은 if 문으로 규칙을 정의했는데 이 방식을 기호적 인공지능이라고 한다.

 

이러한 인공지능은 명시적인 프로그래밍이 필요했는데 정의되지 않은 모호한 입력이 주어질 경우 문제가 발생했다.

 

그러한 문제점을 극복 할 수 있는게 머신러닝이다. 직접 규칙을 만드는 대신, 사례와 경험을 통해 배우는 방식으로 접근한다.

 

좀더 구체적으로 말하자면 규칙으로 정의할 가능성이 거의없는 복잡한 작업을 모델링 하기 위한 효과적인 도구가 머신러닝인 것이다.

 

머신러닝 모델을 생성하는 단계를 training이라고 한다. 이때는 입력값과 응답(정답?) 을 사용해 훈련한다.

 

머신러닝 모델을 사용해서 응답을 받는 것을 prediction 이라고 한다. 입력값만 주어진다.

 

이 밖에 supervised, unsupervised learning 등등 데이터 마이닝 수업때 들었던 기억들이 떠오른다.


머신러닝 실제 적용 사례

  • 추천 생성하기
    - 자신가 비슷한 기호를 갖는 사람에게서 추천받는 현실 세계 모방
    - 거리 유사도(유클리드 거리)
    - Collaborative Filtering
    - Unsupervised learning
    - clustering 사용(Apriori, basket, K-means 종류가 있음)
  • HCI 분야 (드로잉)
    - 원시 데이터 전처리 수행
    - 특징 공학 수행
    - 창작활동 보조(증강 지능)
    - 시각 주머니 생성(bag of visual words)
    - HOG(histogram of oriened gradients) 알고리즘 사용
    - unsupervised learning
    - K-means 사용
    - classifier : Support Vector Machines (SVM) 사용
  • 구도 기반 이미지 검색(셔터스톡)
    - CNN
  • iOS 키보드 다음 글자 예측
    - RNN
    - weak supervision 
    - multi-class classification

*one-hot encoding : 글자를 숫자로 변환

*딥러닝 이전에는 특징 공학이 ML 의 핵심단계여서 특수 기술과 영역 전문성이 필요했고 그러한 특징들이 모든 사례에 적용될 만큼 일반적이여야 했음


머신러닝 작업 흐름

  • 훈련단계
     - 목표정의 --> 데이터 수집 --> 데이터 준비 --> 모델 개발 --> 모델 훈련 --> 모델 평가 --> 목표정의(순환)
  • 추론단계
     - 입력 --> 입력 준비 --> 훈련된 모델 --> 출력 해석

*책에서는 이미 훈련된 모델을 사용한다.


CoreML 소개

훈련과 추론의 차이

 

딥 러닝 인공지능의 핵심 요소, 훈련과 추론 - 엔비디아 공식 블로그

딥 러닝 인공지능의 핵심 요소, 훈련과 추론 안녕하세요, 엔비입니다! 오늘은 인공지능과 머신 러닝, 딥 러닝의 차이점을 알아본 지난 포스팅에 이어, 딥 러닝의 지능이 어떻게 구현되는지 좀 더 자세하게 살펴볼까 하는 누구나 초등학교 저학년일 때는 선생님의 지도에 따라 간단한 문장읽기와 한글쓰기부터 배우는 것을 시작하지만, 고학년이 될수록 누군가의 도움 없이도 책도 척척 읽어내는데요. 처음에는 백지 상태에서 시작하지만 Read article >

blogs.nvidia.co.kr

 

CoreML 은 edge 에서의 prediction 을 쉽게 해주는 프래임워크이다.

 

근데 굳이 edge 에서 해야하는 장점이 있을까?? 컴퓨팅 파워가 좋은 서버단에서 추론작업을 한 후 device 에는 결과값만 다루는게 낫지 않나 생각이 들었다.

 

이 책에서 edge 에서 수행하는 이유들을 나열 해 봤다.

  • 데이터를 네트워크를 통해 전송하는 일의 비용이 많을때
  • 데이터를 네트워크를 통해 전송하는 시간이 오래 걸릴때
  • 보안 측면에서 개인 데이터를 네트워크를 통해 전송할 필요가 없으므로 상대적으로 안전
  • 네트워크 없이도 사용가능
  • 수요가 증가해도 서버부하와 직접적인 관련이 없어 확장성이 좋음

On device machine learning 예시

  • 음성 인식
     - 지속적으로 데이터를 스트리밍하는 것이 아닌 Hey siri 와 같은 wake word, hot word를 탐지할 때 (탐지 이후 말들은 서버 전송)
  • 이미지 인식
     - 필터나 비슷한 이미지 하나로 묶기 등은 원격 서버에 연결할만큼 중요한 기능은 아니지만 로컬에서 수행가능.
  • 객체 위치 찾기
     - 증강현실 등 사용자 경험을 반응형으로 구성할 때 추론을 수행하는 시간적 지연이 거의 없어야 한다.
  • 광학 문자 인식
  • 번역
  • 동작 인식
  • 텍스트 예측
     - 시간적 지연 없어야 하며 개인 정보를 보호해야해서
  • 텍스트 분류

--> 결국 edge 에서의 추론의 장점은 기기 밖에서 추론할 때 보다 더 높은 수준의 상호작용을 제공할 수 있기 때문이다. 

 

iOS11에서 부터 CoreML 이 추가되면서 Prediction을 수행하는 코드는 단 몇 줄로 가능해 졌다.

 

제일 하단에는 CPU 와 GPU 가 있을 것이다.

 

CoreML 이전에는 위 계층 구조에서 Accelerate 나 Metal Performance Shaders(MPSes) 를 포팅하기 위해 몇가지 추가 작업이 필요했다.

하지만 CoreML을 통해 해당 모델이 이 내부 프레임 워크중 어느것을 선택할지 결정해 준다.

  • Accelerate : 메모리가 많이 필요한 작업 - CPU
  • MPSes : 계산 집약적인 작업 - GPU

CoreML 상단의 Vision Natural Language, Speech, Sound Analysis 는 영역 특화된 계층이다. 

Face Recognition, Object Detection, 등 이미지와 텍스트 데이터로 작업할 때 사용되는 공통 작업들을 더 추상화 한 영역이다.

 

결론 ) CoreML 은 코드에서 머신러닝 모델에 쉽게 접근하고 사용할 수 있게 머신러닝 모델은 iOS 로 가져와 표준 인터페이스로 감싸는 절차를 쉽게 만들어 주는 도구 묶음(프레임워크)이다.


CoreML 작업 흐름

  • 데이터 획득 --> 모델 정의 --> 모델 훈련 --> 모델 배포

  • Core ML Tools : 훈련된 모델을 iOS로 쉽게 가져오는 도구 집합을 제공하는 파이썬 패키지
     - 모델을 가져와 .mlmodel 파일로 export 한 다음 Xcode project 로 import 할 수 있다.

 

  • 모델을 위한 인터페이스를 Xcode 가 생성 쉽게 접근 할 수 있도록 만들어 준다.

학습 알고리즘

Supervised Learning 에 필요한 구성 요소(예시 : 동물 분류)

  • 입력 데이터 포인트 : 동물 이미지
  • 입력에 대한 기대 출력 : 해당 동물 이미지에 대한 레이블(개, 고양이..)
  • 머신러닝 알고리즘 : 모델을 만들 알고리즘

예제 : 스웨덴 자동차 보험

[예제 코드 다운로드]

 

PacktPublishing/Machine-Learning-with-Core-ML

Machine Learning with Core ML, published by Packt. Contribute to PacktPublishing/Machine-Learning-with-Core-ML development by creating an account on GitHub.

github.com

chapter 2/start/linearRegression

 

보험 청구 건수(x) 가 주어질떄 전체 청구 내역의 전체 지급액(y)를 예측하는 모델

데이터 셋은 2열 64행이다.

 

데이터와 모델의 시각화 코드

// create view to render scatter plot
let view = ScatterPlotView(frame: CGRect(x: 20, y: 20, width: 300, height: 300))

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = view

 

csvData import 코드

// load dataset
let csvData = parseCSV(contents:loadCSV(file:"SwedishAutoInsurance"))

 

데이터 셋을 ScatterPlotView에 뿌려주는 코드

// create structure for our plot
let dataPoints = extractDataPoints(data: csvData, xKey: "claims", yKey: "payments")

 

까지만 실행했을 때 결과

직관적으로 y=ax+b 형태로 증가하는걸 볼 수 있다 --> 단순 선형 회귀(LinearRegression) 알고리즘 사용해 보기로 판단

 

이제 가장 데이터와 잘 맞는 y=ax+b를 구해야 한다. 이땐 경사 하강법(Gradient Descent) 을 사용한다. 

[참고자료]

 

기계학습(Machine Learning) - 경사 하강법(Gradient Descent)

이번에는 cost 비용을 최소화 하기 위한 최적화 알고리즘 경사 하강법(Gradient Descent) 에 대해서 간략하게 알아보겠다. 먼저 최적화에 대한 개념을 잠깐 짚고 넘어가 보자. 최적화란, 여러 가지 허용되는 값들..

gdyoon.tistory.com

 

경사 하강법 : 최솟값을 찾는 과정

손실함수(loss function) : 최솟값을 결정

 

간단히 train 함수 구성해 보면

func train(
    x:[CGFloat],
    y:[CGFloat],
    b:CGFloat=0.0,
    w:CGFloat=0.0,
    learningRate:CGFloat=0.00001,
    epochs:Int=100,
    trainingCallback: ((Int, Int, CGFloat, CGFloat, CGFloat) -> Void)? = nil) -> (b:CGFloat, w:CGFloat){
    
    var B = b // 편향값
    var W = w // 가중치
    
    let N = CGFloat(x.count) // 데이터 포인트 갯수
    
    for epoch in 0..<epochs{
        // b와 w에 대해 해당 epoch의 경사를 저장할 변수 생성
        
        for i in 0..<x.count{
            //에측 생성(y = b + x*w)
            //절대 오차 계산(예측값 - 실제값)
            //오차와 b 에 대해 경사 계산 : 해당 세대 편향값 경사에 더함
            //오차와 w 에 대해 경사 계산 : 해당 세대 가중치 경사에 더함
        }
        //learningRate 를 사용해 편향값(B) 업데이트
        //learningRate 를 사용해 가중치(W) 업데이트
        
        if let trainingCallback = trainingCallback{
            trainingCallback(epoch, epochs, W, B, sumError)
        }
    }
    
    return (b:B, w:W)
}

// x : 청구 건수를 담고있는 배열
// y : 지급 총액을 담고있는 배열
// b : 선형 함수에서 사용하는 난수
// w : 선형 함수에서 사용하는 난수
// learningRate : 가중치 조정 속도
// epochs : 반복횟수
// trainingCallback : 세대마다 진행 경과 보고

 

코드를 완성하면

 

func train(
    x:[CGFloat],
    y:[CGFloat],
    b:CGFloat=0.0,
    w:CGFloat=0.0,
    learningRate:CGFloat=0.00001,
    epochs:Int=100,
    trainingCallback: ((Int, Int, CGFloat, CGFloat, CGFloat) -> Void)? = nil) -> (b:CGFloat, w:CGFloat){
    
    var B = b
    var W = w
    
    let N = CGFloat(x.count) // number of data points
    
    for epoch in 0..<epochs{
        // b와 w에 대해 해당 epoch의 경사를 저장할 변수 생성
        var sumError : CGFloat = 0.0
        var bGradient : CGFloat = 0.0
        var wGradient : CGFloat = 0.0
        
        for i in 0..<x.count{
           	//에측 생성(y = b + x*w)
            let yHat = W * x[i] + B
            
           	//절대 오차 계산(예측값 - 실제값)
            let error = y[i] - yHat
            
    		//오차와 b 에 대해 경사 계산 : 해당 세대 편향값 경사에 더함
            sumError += error * error
            
         	//오차와 w 에 대해 경사 계산 : 해당 세대 가중치 경사에 더함
            bGradient += -(2.0/N) * error
            wGradient += -(2.0/N) * x[i] * error
        }
        
    	//learningRate 를 사용해 편향값(B) 업데이트
        B = B - (learningRate * bGradient)
        
        //learningRate 를 사용해 가중치(W) 업데이트
        W = W - (learningRate * wGradient)
        
        if let trainingCallback = trainingCallback{
            trainingCallback(epoch, epochs, W, B, sumError)
        }
    }
    
    return (b:B, w:W)
}

 

결과는

 

진행 과정까지 포함된 결과
결과


지원 학습 알고리즘

  • 비지도 학습(Unsupervise Learning)
    • 연속형 데이터
       - 클러스터링 & 차원축소
       - SVD, PCA, K-Means
    • 범주형 데이터
       - 연관 규칙 분석 : Apriori, FP-Growth
       - 은닉 마르코프 모델
  • 지도학습(Supervised Learning)
    • 연속형 데이터
       - Regression : 선형, 비선형 회귀
       - Decision Tree
       - Random Forest
       - Neural Network
    • 범주형 데이터
       - Classification : KNN, 분류 트리, logistic Regression, Naive Bayes Classifier, SVD, Nerual Network

CoreML 모델 생성은 이러한 머신러닝 알고리즘들을 iOS 에서 실행할 수 있는 모델로 전환하는 것이다.

CoreML 에서 지원하는 학습 알고리즘은 다음과 같다. 

  • 일반 선형 모델
     - 선형 회귀
     - 로지스틱 회귀
  • 서포트 벡터 머신(SVM)
  • 트리 앙상블
     - 랜덤 포레스트
     - 부스트 트리
     - 결정 트리
  • 인공 신경망
     - 전방 전달 신경망
     - 컨볼루션 신경망
     - 순환 신경망

*지원하지 않는 알고리즘의 경우 MLCustomLayer과 MLCustomModel 두개의 프로토콜을 사용한다.


edge에서 training & prediction을 할때 고려사항

  1. 모델크기 : 앱의 크기를 2GB 까지 허용하나 사용자가 다운받을 지는 의문이다.
  2. 메모리 : 아이폰 8 기준 메모리는 2GB 이다.
  3. 속도 : 추론은 여러 단계중 하나이다. 데이터 로딩과 전처리에도 시간이 걸린다.
  4. 알고리즘 및 데이터 형식 지원

앞으로 구현해볼 예제

  • 카메라를 통한 객체 인식
  • 객체의 위치 기준 이미지 검색 기능
  • 얼굴 표정 인식 감정 상태 추론
  • CNN 사용 스케치 인식 RNN 이용 동일 작업
  • Prisma 앱 스타일 전이
  • action shot 효과

 

728x90

'iOS > CoreML' 카테고리의 다른 글

CoreML 배워보자 (2) - Object Detection  (2) 2020.04.24

댓글