들어가며

지난 시간까지 데이터를 수집하고 Tensorflow Lite 모델을 만드는 과정까지 진행해보았다. 이번에는 이 모델 파일을 Android에 삽입해서 실제 구동까지 진행해보도록 하겠다.

TFlite 모델에 메타데이터 추가하기

이 부분 때문에 필자는 몇 시간동안 삽질을 했다. 이전 장에서 만든 .tflite 파일을 그대로 안드로이드에 사용하게 되면 에러가 발생한다:(. 구글링을 하고 stack overflow에 업로드하는 등 여러 노력을 통해서 솔루션을 찾아냈다. 에러의 내용은 tflite모델에 NormalizationOptions이 추가되어 있어야 한다는 뜻이었다. 이는 메타 데이터의 일종인데 이를 삽입하기 위해선 추가적인 작업이 필요했다.

addMetaData.ipynb
0.01MB

위 코드를 사용하면 필요한 메타 데이터를 추가 할 수 있다. 코드를 보면 아래의 부분을 볼 수 있는데 여기에 자신이 메타데이터를 추가할 tflite 파일과 label.txt의 경로를 지정한 후 그대로 실행시켜주면 된다.

Android Studio Demo APP에 삽입하기

자 이제 마지막 단계이다. github.com/tensorflow/examples/tree/master/lite/examples/object_detection/android이 링크에 들어가게 되면 Android에서 Object Detection 모델을 실행할 수 있는 코드를 다운로드할 수 있다. Readme의 지침을 잘 따라서 모델을 Asset 디렉터리에 삽입하게 되면 비로소 모델을 실행시킬 수 있을 것이다.

 

마무리

예전 코드를 참조해서 그런지 필자는 중간에 여러번 에러가 발생해서 굉장히 힘들었다... 이 글을 본 사람들은 부디 필자처럼 삽질을 하지 않았으면 좋겠다. ㅎㅎ 지금까지 안드로이드에서 동작하는 Object Detection 애플리케이션을 만드는 과정이었다.

Reference

1. www.tensorflow.org/lite/convert/metadata

 

TensorFlow Lite 모델에 메타 데이터 추가

TensorFlow Lite 메타 데이터는 모델 설명에 대한 표준을 제공합니다. 메타 데이터는 모델이 수행하는 작업과 입력 / 출력 정보에 대한 중요한 지식 소스입니다. 메타 데이터는 TensorFlow Lite 호스팅 모

www.tensorflow.org

2. github.com/tensorflow/examples/tree/master/lite/examples/object_detection/android

 

tensorflow/examples

TensorFlow examples. Contribute to tensorflow/examples development by creating an account on GitHub.

github.com

 

들어가며

지난 시간에는 roboflow를 사용해서 데이터를 업로드하여 처리하는 방법에 대해서 알아보았다. 이번에는 데이터와 Tensorflow 프레임워크를 사용해서 모델을 만들어보도록 하겠다. 추가적으로 컨버터를 사용해서 Tensorflow Lite 모델까지 변환하는 방법에 대해서 알아보도록 하겠다. (이 장에서는 필수적으로 수정해야 할 부분에 대해서만 언급하겠다. 코드에 대해서 자세히 알고 싶다면 Colab내부의 주석을 참고하도록 하자)

데이터 다운로드

colab.research.google.com/drive/1aIobwtqWggRbLbe606_WzVGtFiWZT9tr?usp=sharing

 

Roboflow-TFLite-Object-Detection_Bicycle_Helmet.ipynb

Colaboratory notebook

colab.research.google.com

위 링크는 모델을 학습시키고 Tensorflow Lite 모델로 변환하기 위한 모든 코드가 포함되어있다. 

Prepare Data부분에서 위와 같은 코드를 찾을 수 있을 것이다. 여기에 이전 장에서 진행했던 Roboflow 데이터셋의 링크를 삽입해야 한다. Roboflow 튜토리얼을 잘 따랐다면 대시보드에 자신이 만든 버전이 있는 것을 확인할 수 있을 것이다. 

여기에서 Export Your Dataset부분에서 포맷을 정하고 링크를 받을 수 있는 부분이 있을 것이다.

우선 COCO포맷을 정한다음 GetLink를 클릭하게 되면 Jupyter탭에서 아래와 같은 부분이 나올 것이다.

 !curl -L "링크" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

자신의 링크를 복사하여 colab에 [COCO Json Link Here!]라고 표시된 부분에 복사하도록 하자.

그리고 이번에는 Format을 Tensorflow TFRecord로 변경하여 위 과정을 반복한 후 [Tensorflow TFRecord Link Here!]라고 표시된 부분에 링크를 삽입하도록 한다. 이렇게 하면 데이터를 다운로드할 수 있다.

파일 이름 수정

Prepare tfrecord file 세션 아래의 코드를 보면 다음과 같은 코드가 있을 것이다.

각 roboflow에서 다운로드한 파일의 이름은 데이터셋에 따라서 다르기 때문에 여기에 자신이 설명한 데이터셋 이름을 업데이트해주어야 한다. colab 내부에 해당 경로를 따라가서 자신의 파일이 어떤 이름으로 정해져 있는지 확인 후 업데이트하도록 하자.

마무리

특별한 에로사항이 없다면 위에서 언급한 코드만 바꾸어 주어도 자동으로 모델을 학습하고 Tensorflow Lite로 모델을 변경한 다음 자신의 드라이브에 모델을 업데이트할 것이다. 만약 어떤 에러가 발생한다면 github.com/BEOKS/Bicycle-Helmet-Wearing-Detection 여기에 issue를 써준다면 수정하도록 하겠다.

Reference

1. How to Train a Custom TensorFlow Lite Object Detection Model, https://blog.roboflow.com/how-to-train-a-tensorflow-lite-object-detection-model/

 

How to Train a Custom TensorFlow Lite Object Detection Model

In this post, we walk through the steps to train and export a custom TensorFlow Lite object detection model with your own object detection dataset to detect your own custom objects. If you need a fast model on lower-end hardware, this post is for you. Whet

blog.roboflow.com

2. MobileNet SSD, https://github.com/tensorflow/models/tree/master/research/object_detection

 

tensorflow/models

Models and examples built with TensorFlow. Contribute to tensorflow/models development by creating an account on GitHub.

github.com

 

들어가며

최근에 어떤 프로젝트를 진행하게 되면서 안전모를 착용했는지 확인하기 위한 모바일용 머신러닝 모델이 필요하게 되었다. 3일이라는 짧은 시간 안에 프로토타입을 만들게 되었는데, 진행하면서 알게 된 에러 사항에 대해서 공유하기 위해서 이 글을 작성하니 모바일용 객체 탐지 모델을 만드는 사람들이 참고해서 쉽게 사용했으면 좋겠다.

혹시 결과물이 바로 보고 싶은 사람은 아래의 링크를 참고하란다.

github.com/BEOKS/Bicycle-Helmet-Wearing-Detection

 

BEOKS/Bicycle-Helmet-Wearing-Detection

Tensorflow lite model that detects bicycle helmet wearing and Android demo application - BEOKS/Bicycle-Helmet-Wearing-Detection

github.com

데이터 수집

모든 머신러닝 모델의 시작은 데이터를 확보하는 것이다. Kaggle에서 사용가능한 데이터들이 있는데 나는 이를 참고하였다. 참고로 라이선스가 전부 다르기 때문에 주의하기 바란다. 만약 이미 데이터가 확보되어있다면 이 과정을 넘겨도 된다.

www.kaggle.com/brendan45774/bike-helmets-detection

 

Bike Helmets Detection

764 images in 2 classes

www.kaggle.com

데이터 처리

전처리 프레임워크

머신러닝 모델이 잘 학습 할 수 있도록 데이터를 처리를 해야 한다. 데이터에 따라 몇 가지가 있지만 프로토타입 제작이므로 잘못된 정보가 있는지만 확인하도록 하겠다.

roboflow.com/

 

Roboflow: Everything you need to start building computer vision into your applications

Even if you're not a machine learning expert, you can use Roboflow train a custom, state-of-the-art computer vision model on your own data. Let us show you how.

roboflow.com

위 사이트는 확보한 데이터를 업로드하여 이미지를 육안으로 확인하거나 모델 향상을 위해서 Augmentation 시킬 수 있는 사이트이다. 만약 이미지 보안이 별로 중요하지 않다면 이를 활용하면 좋다. 업로드 및 활용과정은 처음 사이트를 이용할 경우 튜토리얼이 진행되니 순서만 따라간다면 어렵지 않게 사용할 수 있다.

데이터 확인

데이터를 입력하고 나면 위처럼 대시보드가 나오게된다. 여기서 이미지를 클릭하여 어노테이션이 잘 되어있는지 확인할 수 있다. 만약 어노테이션이 되어있지 않은 이미지가 있다면 쉽게 어노테이션을 추가할 수 있다.

데이터 전처리

대시보드 아래에 보면 Preprocessing Option을 볼 수 있다. 여기선 Crop, GrayScale, Tile 등의 전처리를 UI로 손쉽게 다룰 수 있다. (일부 기능은 유료버전에서만 사용 가능한데 돈내기는 싫으니 사이킷런의 전처리 라이브러리를 사용해서 코드에서 진행 후 다시 업로드하도록 하자)

Augmentation

Augmentation은 머신러닝 모델의 정확도 향상을 위해서 데이터를 증식시키는 것을 의미한다. 이 또한 대시보드에서 Augmentation Option을 선택하여 진행 할 수 있다. 여기도 몇 가지 기능은 유료버전에서만 사용 가능하다. 그러니 Albumentation(아래 링크 참고)을 사용해서 코드상에서 구현하도록 하자. 이 라이브러리가 roboflow보다 더욱 다양한 기능을 제공한다.

 github.com/albumentations-team/albumentations

 

albumentations-team/albumentations

Fast image augmentation library and easy to use wrapper around other libraries. Documentation: https://albumentations.ai/docs/ Paper about library: https://www.mdpi.com/2078-2489/11/2/125 - albume...

github.com

마무리

데이터와 모델의 목적에 따라서 위에서 언급한 것들 이외의 전처리 과정이 더 필요할 것이다. 기존의 솔루션을 잘 분석해서 어떻게 데이터를 처리할지 결정하고 이를 추가적으로 작업하여 데이터셋을 완성하자. 다음 장에서는 이 데이터셋을 가지고 tensorflow 프레임 워크를 사용하여 SSD MobileNetv2 모델을 만든 다음 이를 Tensorflwo Lite 모델로 컨버팅 하는 방법에 대해서 알아보자

 

Reference

  1. How to Train a Custom TensorFlow Lite Object Detection Model, https://blog.roboflow.com/how-to-train-a-tensorflow-lite-object-detection-model/
 

How to Train a Custom TensorFlow Lite Object Detection Model

In this post, we walk through the steps to train and export a custom TensorFlow Lite object detection model with your own object detection dataset to detect your own custom objects. If you need a fast model on lower-end hardware, this post is for you. Whet

blog.roboflow.com

들어가며

지난 글까지 인공 신경망과 학습 모델들에 대해서 알아보고 이를 사이킷런으로 구현해 보았습니다. 

이번에는 google 의 tensorflow에서 지원하는 keras라이브러리를 사용해서 간편하게 신경망을 구현, 학습, 그리고 평가하는 방법에 대해서 알아보겠습니다.

 

목차

1. 텐서플로2 설치

2. Sequential API로 이미지 분류기 구현하기

    1. 데이터 다운로드

    2. Sequential Model 구축

    3. 모델 알아보기

    4. 모델 컴파일하기

    5.모델 학습하기

    6. 학습 시각화하기

    7. 테스트 데이터로 평가하기

    8. 예측하기

 

Tensorflow 2.0 설치하기

tensorflow 2.0을 설치하는 환경이 여러 가지가 있으므로 이는 tensorflow.org에 게재된 공식문서를 참조하는 것이 좋습니다.

https://www.tensorflow.org/install/pip?hl=ko

 

pip를 사용하여 TensorFlow 설치

TensorFlow 2 패키지 사용 가능 tensorflow - CPU와 GPU 지원이 포함된 안정적인 최신 출시(Ubuntu 및 Windows) tf-nightly - 미리보기 빌드(불안정). Ubuntu 및 Windows에는 GPU 지원이 포함되어 있습니다. 이전 버전의 TensorFlow TensorFlow 1.x의 경우 CPU와 GPU 패키지는 다음과 같이 구분됩니다. tensorflow==1.15 - CPU 전용 출시 tensorflow-gpu=

www.tensorflow.org

Seauential API로 이미지 분류기 만들기

1. 데이터 다운로드

이미지 분류기를 만들기 전에 분류할 이미지 데이터를 다운해봅시다.

여기서는 fashion_mnist 데이터를 사용합니다. keras 라이브러리를 통해서 쉽게 다운이 가능합니다.

from tensorflow import keras

fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()

데이터를 간단히 살펴봅시다.

하나의 패션 샘플은 28x28의 배열로 이루어져있으며 하나의 픽셀은 0~255의 정수로 이루어져 있습니다.

이미 데이터는 어느정도 전처리가 진행되어있으니 바로 keras를 통해 모델을 구축해봅시다.

2. Sequential Model 구축

keras.models.Sequential은 케라스로 MLP를 구현하는 가장 기본적이고 쉬운 방법입니다.

Sequential 클래스를 선언하고 층을 순서대로 추가함으로써 MLP구현이 가능합니다.

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))

Flatten은 입력데이터의 shape를 일렬로 변경하는 클래스입니다.(reshape(-1,1)과 동일합니다.) Flatten은 선언하면 뉴런층이 생성되는 것이 아니라 단순히 데이터의 형태를 변경합니다. InputLayer(input_shape=[28, 28])를 통해서 대체가 가능합니다.

 

Dense는 이전 뉴런과 완전연결된 밀집 뉴런층을 의미합니다. 이를 선언하고 모델에 추가함으로써 모델 내부에 새로운 뉴런층을 생성할 수 있으며 첫 번째 파라미터로 뉴런 수를 서정하고 activation 파라미터를 통해서 활성화 함수를 지정할 수 있습니다.

 

마지막 Dense는 softmax를 활성화 함수를 사용하고 있는데 이는 우리가 원하는 모델은 분류기이기 때문에 각 샘플의 타깃레이블에 대한 예측확률을 측정하기 위해서입니다.

3. 모델 알아보기

모델을 생성했으니 이를 분석해봅시다.

model.summary()

summary를 통해서 모델의 정보를 대략 알 수 있습니다. 

hidden1 = model.layers[1]
hidden1.name #'dense'추출
weights, biases = hidden1.get_weights()

model에서 인덱스를 통해서 레이어를 추출하고 name을 통해서 이름을 알고 get_weight() 메서드를 통해서 weight와 bias를 알 수 있습니다. (set_weight()를 통해서 설정도 가능합니다.)

4. 모델 컴파일하기

keras모델은 층을 생성한 후 비용함수, 최적화방법을 설정하여 어떻게 학습을 진행할지 설정해주어야하는데 이를 컴파일이라고 합니다.

model.compile(loss="sparse_categorical_crossentropy",
              optimizer="sgd",
              metrics=["accuracy"])

분류기이기 때문에 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 클래스를 리턴합니다.

6. 학습 시각화하기

fit 메서드에서 리턴받은 history를 통해서 쉽게 구현가능합니다.

import pandas as pd

pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
save_fig("keras_learning_curves_plot")
plt.show()

출처 : https://github.com/ageron/handson-ml2/blob/master/10_neural_nets_with_keras.ipynb

7. 테스트 데이터로 평가하기

evalute()메서드를 통해서 평가 할 수있습니다.

model.evaluate(X_test, y_test)
'''
result :
10000/10000 [==============================] - 0s 21us/sample - loss: 0.3378 - accuracy: 0.8781
'''

8. 예측하기

predict()메서드를 통해서 새로운 샘플을 예측하고 클래스별 확률을 알 수 있습니다.

X_new = X_test[:3]
y_proba = model.predict(X_new)
y_proba.round(2)
'''
result:

array([[0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.01, 0.  , 0.99],
       [0.  , 0.  , 0.99, 0.  , 0.01, 0.  , 0.  , 0.  , 0.  , 0.  ],
       [0.  , 1.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]],
      dtype=float32)
'''

predict_calsses()메서드를 통해서 예측 클래스만 출력할 수 있습니다.

y_pred = model.predict_classes(X_new)
y_pred
'''
result:
array([9, 2, 1])
'''

+ Recent posts