머신러닝 & 딥러닝

[ML] 내 dataSet으로 transfer learning하기

pa_songsong 2021. 10. 5. 18:23

안드로이드에 사용할 내 이미지 dataSet을 학습한 tflite 파일이 필요했다.

하지만 dataSet이 적기때문에 이미 이미지 분류 모델로 만들어진 inception_v3로 transfer learning을 하려고 했다.

내 dataSet은 피부질환 6종 각 50장씩 이었다.

 

먼저 Transfer Learning이란?

  • 기존의 만들어진 모델을 사용해 내 dataSet을 학습시켜 예측을 높이는 방법이다.
  • 이미 잘 훈련된 모델이 있고, 특히 해당 모델과 유사한 문제를 해결시 transfer learining을 사용한다.

출처

http://incredible.ai/artificial-intelligence/2017/05/13/Transfer-Learning/

 

Transfer Learning in Pytorch

어렵지 않아요~ Transfer Learning Transfer Learning 이란? 기존의 만들어진 모델을 사용하여 새로운 모델을 만들시 학습을 빠르게 하며, 예측을 더 높이는 방법입니다. 왜 사용하나? 실질적으로 Convolution

incredible.ai

 

Transfer Learning 진행

아래 블로그의 코드를 파이썬 파일로 만들어서 터미널에서 아래의 명령어를 입력한다.

6종 50개 정도의 이미지를 넣었다.

 python inceptionv3파일이름.py --image_dir 데이터셋파일위치

테스트 결과 정확도는 72%정도 나왔다.

http://solarisailab.com/archives/1422

 

11. 텐서플로우(TensorFlow)를 이용해서 Inception v3 모델 Retraining을 통해 나만의 데이터셋을 이미지 인

이번 시간에는 구글의 Inception v3 모델을 retraining을 통해서 나만의 데이터셋에 대한 이미지 인식(추론)을 진행해보자. 매번 새로운 Task에 대해 바닥부터 적합한 Neural Networks 구조를 발견하고, 이를

solarisailab.com

 

이미지를 사용해 결과 확인

이제 이걸 가지고 실제로 이미지 분류가 잘 되는지 확인 해야하는데 tensorflow 버전이 2로 달라진 점이 있어서 블로그 내의 테스트.py을 수정했다.

#!/usr/bin/env python
# coding: utf-8

# In[ ]:


# -*- coding: utf-8 -*-

"""Inception v3 architecture 모델을 retraining한 모델을 이용해서 이미지에 대한 추론(inference)을 진행하는 예제"""

import numpy as np
import tensorflow.compat.v1 as tf	#추가
tf.disable_v2_behavior() 			#추가
import tensorboard as tb			#추가
tf.io.gfile = tb.compat.tensorflow_stub.io.gfile    #tf.gfile 에서 tf.io.gfile로 바꿈
imagePath = 'mel.jpeg'                   # 추론을 진행할 이미지 경로
modelFullPath = './model/saved_model.pb'   # 읽어들일 graph 파일 경로
labelsFullPath = '/tmp/output_labels.txt'  # 읽어들일 labels 파일 경로
tf.disable_v2_behavior()			#추가 (tensorflow 1.x.x버전의 Session사용위해 추가)
def create_graph():
    """저장된(saved) GraphDef 파일로부터 graph를 생성하고 saver를 반환한다."""
    # 저장된(saved) graph_def.pb로부터 graph를 생성한다.
    with tf.io.gfile.GFile(modelFullPath, 'rb') as f:		#FastGFile에서 GFile로 바꿈
        graph_def = tf.compat.v1.GraphDef()
        graph_def.ParseFromString(f.read())
        _ = tf.import_graph_def(graph_def, name='')


def run_inference_on_image():
    answer = None

    if not tf.io.gfile.exists(imagePath):
        tf.logging.fatal('File does not exist %s', imagePath)
        return answer

    image_data = tf.io.gfile.GFile(imagePath, 'rb').read()

    # 저장된(saved) GraphDef 파일로부터 graph를 생성한다.
    create_graph()

    with tf.Session() as sess:

        softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
        predictions = sess.run(softmax_tensor,
                               {'DecodeJpeg/contents:0': image_data})
        predictions = np.squeeze(predictions)

        top_k = predictions.argsort()[-5:][::-1]  # 가장 높은 확률을 가진 5개(top 5)의 예측값(predictions)을 얻는다.
        f = open(labelsFullPath, 'rb')
        lines = f.readlines()
        labels = [str(w).replace("\n", "") for w in lines]
        for node_id in top_k:
            human_string = labels[node_id]
            score = predictions[node_id]
            print('%s (score = %.5f)' % (human_string, score))

        answer = labels[top_k[0]]
        return answer


if __name__ == '__main__':
    run_inference_on_image()

위의 파일의 명령어는 

python 테스트파일이름.py

테스트 결과

피부질환 6종 중 한가지인 melanoma(흑색종)로 이미지를 넣었었는데 특징이 확실하다보니 90%로 맞추었다. (6종 중 top 5개만 나와있음)

하지만 acne(여드름) 으로 넣으면 헷갈려한다. (psoriasis = 건선, eczema = 습진, dermatofibroma = 피부섬유종)

 

학습을 돌리고 나면 /tmp 경로에 아래 두개의 파일이 생기게 되는데 android에서 학습하기위해 이 파일들이 필요하다. Android에서 추론하기위해 아래의 두개 파일을 어떻게 사용했는지 작성하겠다!