지난 시간까지 데이터를 수집하고 Tensorflow Lite 모델을 만드는 과정까지 진행해보았다. 이번에는 이 모델 파일을 Android에 삽입해서 실제 구동까지 진행해보도록 하겠다.
TFlite 모델에 메타데이터 추가하기
이 부분 때문에 필자는 몇 시간동안 삽질을 했다. 이전 장에서 만든 .tflite 파일을 그대로 안드로이드에 사용하게 되면 에러가 발생한다:(. 구글링을 하고 stack overflow에 업로드하는 등 여러 노력을 통해서 솔루션을 찾아냈다. 에러의 내용은 tflite모델에 NormalizationOptions이 추가되어 있어야 한다는 뜻이었다. 이는 메타 데이터의 일종인데 이를 삽입하기 위해선 추가적인 작업이 필요했다.
위 코드를 사용하면 필요한 메타 데이터를 추가 할 수 있다. 코드를 보면 아래의 부분을 볼 수 있는데 여기에 자신이 메타데이터를 추가할 tflite 파일과 label.txt의 경로를 지정한 후 그대로 실행시켜주면 된다.
지난 시간에는 roboflow를 사용해서 데이터를 업로드하여 처리하는 방법에 대해서 알아보았다. 이번에는 데이터와 Tensorflow 프레임워크를 사용해서 모델을 만들어보도록 하겠다. 추가적으로 컨버터를 사용해서 Tensorflow Lite 모델까지 변환하는 방법에 대해서 알아보도록 하겠다. (이 장에서는 필수적으로 수정해야 할 부분에 대해서만 언급하겠다. 코드에 대해서 자세히 알고 싶다면 Colab내부의 주석을 참고하도록 하자)
최근에 어떤 프로젝트를 진행하게 되면서 안전모를 착용했는지 확인하기 위한 모바일용 머신러닝 모델이 필요하게 되었다. 3일이라는 짧은 시간 안에 프로토타입을 만들게 되었는데, 진행하면서 알게 된 에러 사항에 대해서 공유하기 위해서 이 글을 작성하니 모바일용 객체 탐지 모델을 만드는 사람들이 참고해서 쉽게 사용했으면 좋겠다.
위 사이트는 확보한 데이터를 업로드하여 이미지를 육안으로 확인하거나 모델 향상을 위해서 Augmentation 시킬 수 있는 사이트이다. 만약 이미지 보안이 별로 중요하지 않다면 이를 활용하면 좋다. 업로드 및 활용과정은 처음 사이트를 이용할 경우 튜토리얼이 진행되니 순서만 따라간다면 어렵지 않게 사용할 수 있다.
데이터 확인
데이터를 입력하고 나면 위처럼 대시보드가 나오게된다. 여기서 이미지를 클릭하여 어노테이션이 잘 되어있는지 확인할 수 있다. 만약 어노테이션이 되어있지 않은 이미지가 있다면 쉽게 어노테이션을 추가할 수 있다.
데이터 전처리
대시보드 아래에 보면 Preprocessing Option을 볼 수 있다. 여기선 Crop, GrayScale, Tile 등의 전처리를 UI로 손쉽게 다룰 수 있다. (일부 기능은 유료버전에서만 사용 가능한데 돈내기는 싫으니 사이킷런의 전처리 라이브러리를 사용해서 코드에서 진행 후 다시 업로드하도록 하자)
Augmentation
Augmentation은 머신러닝 모델의 정확도 향상을 위해서 데이터를 증식시키는 것을 의미한다. 이 또한 대시보드에서 Augmentation Option을 선택하여 진행 할 수 있다. 여기도 몇 가지 기능은 유료버전에서만 사용 가능하다. 그러니 Albumentation(아래 링크 참고)을 사용해서 코드상에서 구현하도록 하자. 이 라이브러리가 roboflow보다 더욱 다양한 기능을 제공한다.
데이터와 모델의 목적에 따라서 위에서 언급한 것들 이외의 전처리 과정이 더 필요할 것이다. 기존의 솔루션을 잘 분석해서 어떻게 데이터를 처리할지 결정하고 이를 추가적으로 작업하여 데이터셋을 완성하자. 다음 장에서는 이 데이터셋을 가지고 tensorflow 프레임 워크를 사용하여 SSD MobileNetv2 모델을 만든 다음 이를 Tensorflwo Lite 모델로 컨버팅 하는 방법에 대해서 알아보자
Flatten은 입력데이터의 shape를 일렬로 변경하는 클래스입니다.(reshape(-1,1)과 동일합니다.) Flatten은 선언하면 뉴런층이 생성되는 것이 아니라 단순히 데이터의 형태를 변경합니다. InputLayer(input_shape=[28,28])를 통해서 대체가 가능합니다.
Dense는 이전 뉴런과 완전연결된 밀집 뉴런층을 의미합니다. 이를 선언하고 모델에 추가함으로써 모델 내부에 새로운 뉴런층을 생성할 수 있으며 첫 번째 파라미터로 뉴런 수를 서정하고 activation 파라미터를 통해서 활성화 함수를 지정할 수 있습니다.
마지막 Dense는 softmax를 활성화 함수를 사용하고 있는데 이는 우리가 원하는 모델은 분류기이기 때문에 각 샘플의 타깃레이블에 대한 예측확률을 측정하기 위해서입니다.
분류기이기 때문에 CEE를 비용함수로 정하고 최적화 방법은 SGD를 사용하였습니다. 만약 SVM같은 다른 모델을 사용하고싶으면 loss="hinge"로 지정하는 등 다른 비용함수를 정하면 되며 최적화 방식은 optimizer를 설정하여 변경 할 수 있습니다.(AdaGrad 등이 있습니다.)
metrics를 통해서 학습을 진행할 때마다 출력할 평가방식을 지정할 수 있습니다.
5.모델 학습하기
history = model.fit(X_train, y_train, epochs=30,
validation_data=(X_valid, y_valid))
fit 메서드를 통해서 학습시킬수 있으며 이 때 훈련 샘플,레이블 에폭수 그리고 검증 샘플,레이블을 입력할 수 있습니다.
fit 메서드를 실행하면 위와 같이 학습을 진행하며 에폭이 끝날 때마다 훈련데이터와 검증데이터의 손실함수 그리고 metrics에서 지정한 평가점수를 출력합니다.
학습이 끝나면 fit 메서드는 학습과정의 데이터를 저장한 history 클래스를 리턴합니다.