• 텐서플로우로 이미지인식 모바일앱 만들어보기 - 3 (이미지 학습시켜보기) [머신러닝/딥러닝]
  • 공돌이
    조회 수: 21895, 2017.04.27 13:08:07
  • 2017.05.12 : - 생성폴더명과 학습/그래프생성시 지정하는 폴더명 불일치 부분 수정 ( input,output <-> data,out) ==> (input,output 으로 통일)

                        - output 밑에 flower_photos 폴더를 만드는부분 빠진거 추가

    2017.05.12 : 테스트 툴 경로 수정 ...ㅠㅜ

    =========================

     

    구글에서는 이미지를 쉽게 구분해서 분류하고 학습시킬 수 있는 인셉션이라는 모델을 이미 개발해서 제공하고 있습니다.

    이 모델은 이미 사전에 학습된 데이터를 제공하고 있으므로, 이를 이용해 손쉽게 새로운 이미지를 학습시켜 인식시킬 수 있습니다.

     

    이번 회차는 아래의 단계로 설명을 진행합니다.

     

    1) 학습을 위한 디렉토리 생성

    2) 학습을 위한 샘플 이미지파일들 다운로드 받기

    3) 학습 진행!

    4) 반복작업을 편하게 하기 위한 스크립트작성

     

     

    1) 학습을 위한 디렉토리 생성

     

    학습을 위한 디렉토리 안에 학습결과로 생성시킨 그래프파일, 라벨, 테스트용 파일등을 집어넣을 예정이므로 아래와 같은 구조로 디렉토리를 만듭니다.

     

    train

    ㄴ input

    ㄴ output

     

    train 디렉토리는 관리상의 편의를 위해 가상환경을 위해 생성해 둔 디렉토리 (이 튜토리얼 기준으로는 tensor) 밑에 생성하시면 됩니다.

     

    터미널을 열고, 

     

    $ cd tensor

    $ source bin/activate

    (tensor) $ mkdir -p train/input

    (tensor) $ mkdir -p train/output

    디렉토리가 생성되었습니다. 앞으로 학습을 위한 이미지폴더는 input 밑에 갖다 놓는걸로 하겠습니다.

     

    2) 학습을 위한 샘플 이미지파일들 다운로드 받기

     

    구글에서 저작권 걱정없이 이거 테스트해 볼 수 있도록 꽃 사진들을 제공합니다...

     

    아까 만들어둔 train 디렉토리 안의 input 디렉토리로 들어가서, 이미지 샘플(압축파일)을 다운받은 후 압축을 풀어줍니다.

     

    (tensor) $ cd train/input

    (tensor) $ curl -O http://download.tensorflow.org/example_images/flower_photos.tgz

    (tensor) $ tar -zxvf flower_photos.tgz

     

    그러면 input 디렉토리 밑에 flower_photos 라는 디렉토리가 만들어지고 그 밑에 다시 하위 디렉토리로 rose, dandelion, tulip 등의 꽃이름으로 된 디렉토리들이 만들어지고 그아래에 각각의 꽃 사진들이 수십개씩 들어가 있습니다.

     

    이 디렉토리 구조를 잘 기억하세요.

    앞으로 자신만의 이미지학습을 시키고자 할때에도 동일한 구조로 디렉토리를 생성하시고 원하는 사진들을 넣으시면 됩니다.

     

    • 학습시킬 최상위 디렉토리 (여기서는 flower_photos)
    • 이미지를 분류해서 원하는 라벨(나중에 텐서플로우는 이미지를 입력받으면 여기서 구분한 기준으로 어느 라벨에 속하는지를 확률값으로 알려주게 됩니다)을 폴더명으로 생성(dandelion, tulips 등)
    • 라벨 디렉토리 안에 학습시킬 (손으로 이미 분류한) 이미지들을 집어넣음

     

    3) 학습진행

     

    바로 이걸 위해서 이전 회에서 오랜시간에 걸쳐 유틸들을 빌드했었죠!

     

    가상환경 홈 디렉토리로 갑니다. (터미널을 닫았다면 다시 열고, cd tensor 해서 activate 해주세요)

     

    분석용 인셉션그래프를 다운로드받고, 결과 파일들을 생성할 폴더를 만들어주세요  

     

    mkdir -p train/output/flower_photos

     

    그리고, 아래의 명령어를 실행시켜 주세요.

     

     tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain \

             --bottleneck_dir=train/output/flower_photos/bottlenecks \

             --how_many_training_steps 4000 \

             --model_dir=train/output/flower_photos/inception \

             --output_graph=train/output/flower_photos/retrained_graph.pb \

             --output_labels=train/output/flower_photos/retrained_labels.txt \

             --image_dir train/input/flower_photos

     

    옵션값 간단설명

     

    • --bottleneck_dir : 분류를 위해 기존레이어와 비교하는 역할을 합니다. 이 디렉토리는 캐싱이 되어, 다음번에 훈련시킬때는 재사용됩니다(속도가 빨라지죠)
    • --how_many_training_steps : 반복학습횟수 ( 이옵션을 빼면 디폴트값으로 4000번 학습합니다)
    • --model_dir : 인셉션모델 디렉토리 (이거는 작업하면서 다운로드받습니다)
    • --output_graph : 최종적인 학습결과 그래프파일
    • --output_labels :  분류값 목록 (텍스트파일입니다)
    • --image_dir : 학습시킬 이미지가 들어있는 폴더(하위폴더명이 라벨이 됩니다)

     

     

    위의 명령을 수행하면 텐서가 (재)학습을 시작합니다. 처음 돌릴때는 bottleneck 생성등으로 인해 시간이 꽤 걸릴거라는걸 감안하시고 느긋이 기다리시면 됩니다.

    학습과정이 올라오는걸 자세히 보시면 training accuracy, validation accuracy, cross entropy 값들이 계속 나옵니다. 

     

    2017-04-26 16:55:54.866886: Step 0: Train accuracy = 36.0%

    2017-04-26 16:55:54.867596: Step 0: Cross entropy = 1.544944

    2017-04-26 16:55:54.952325: Step 0: Validation accuracy = 30.0% (N=100)

    2017-04-26 16:55:55.720003: Step 10: Train accuracy = 81.0%

    2017-04-26 16:55:55.720062: Step 10: Cross entropy = 1.164292

    2017-04-26 16:55:55.796767: Step 10: Validation accuracy = 76.0% (N=100)

    2017-04-26 16:55:56.630440: Step 20: Train accuracy = 81.0%

    2017-04-26 16:55:56.630494: Step 20: Cross entropy = 0.940358

    2017-04-26 16:55:56.719233: Step 20: Validation accuracy = 80.0% (N=100)

    2017-04-26 16:55:57.532717: Step 30: Train accuracy = 75.0%

    2017-04-26 16:55:57.532772: Step 30: Cross entropy = 0.900710

    2017-04-26 16:55:57.619545: Step 30: Validation accuracy = 83.0% (N=100)

    2017-04-26 16:55:58.471343: Step 40: Train accuracy = 78.0%

    2017-04-26 16:55:58.471400: Step 40: Cross entropy = 0.815629

    2017-04-26 16:55:58.555016: Step 40: Validation accuracy = 82.0% (N=100)

    ...(횟수만큼 Step반복)

     

     

    표시되는 값 설명:

    • Train accuracy : 학습이미지를 동일라벨 내의 학습된이미지들과 비교해서 추정정확도
    • Validation accuracy: 학습이미지를 랜덤하게 뽑아낸 학습이미지들과 비교해서 추정정확도
    • Cross entropy: loss function 이라고 하는데 일종의 오차율 정도로 이해해도 괜찮을것 같습니다 (낮을수록 좋음)

     

     

    학습이 끝나면 꽃 이미지를 학습한 결과가 그래프파일 (여기서는 retrained_graph.pb) 과 라벨파일(retrained_label.txt) 로 train/output/flower_photos 폴더 밑에 생성됩니다.

     

    학습이 잘 되었는지 한번 테스트도 해봐야겠죠?

     

     

     tensorflow/bazel-bin/tensorflow/examples/label_image/label_image \

             --input_layer=Mul \

             --output_layer=final_result \

             --labels=train/output/flower_photos/retrained_labels.txt \

             --image=test.jpg \

             --graph=train/output/flower_photos/retrained_graph.pb

     

            input_layer 와 output_layer는 기존모델을 이용하는 거니까 수정하실 필요없고,

           --labels 와 --graph 는 앞서 학습에서 생성된 라벨파일과 그래프파일을 지정해주시면 됩니다.

           --image 에는 테스트하려는 이미지를 지정해주시구요. (구글검색에서 꽃사진을 아무거나 - rose, danelion, tulip, sunflower,daisy 중에 -  다운로드 받아서 사용해보세요!)

     

     

    * 저는 구글에서 Danelion 을 검색해서 아래와 같은 이미지를 찾아서 넣어봤습니다.

     

     

    이걸 돌려보면 아래와 같이 추측해줍니다.

     

    이거는 500번 학습시켰을때 시험용 이미지 테스트값

    2017-04-26 16:50:11.356277: I tensorflow/examples/label_image/main.cc:206] dandelion (1): 0.808701

    2017-04-26 16:50:11.356297: I tensorflow/examples/label_image/main.cc:206] sunflowers (3): 0.0838159

    2017-04-26 16:50:11.356302: I tensorflow/examples/label_image/main.cc:206] roses (2): 0.0553269

    2017-04-26 16:50:11.356305: I tensorflow/examples/label_image/main.cc:206] tulips (4): 0.0351568

    2017-04-26 16:50:11.356308: I tensorflow/examples/label_image/main.cc:206] daisy (0): 0.0169989

     

     

    이거는 4000번 학습시켰을때 시험용 이미지 테스트값

    2017-04-26 17:03:06.405137: I tensorflow/examples/label_image/main.cc:206] dandelion (1): 0.999632

    2017-04-26 17:03:06.405156: I tensorflow/examples/label_image/main.cc:206] sunflowers (3): 0.000169072

    2017-04-26 17:03:06.405161: I tensorflow/examples/label_image/main.cc:206] tulips (4): 9.32354e-05

    2017-04-26 17:03:06.405164: I tensorflow/examples/label_image/main.cc:206] daisy (0): 7.80552e-05

    2017-04-26 17:03:06.405167: I tensorflow/examples/label_image/main.cc:206] roses (2): 2.74586e-05

     

    네...500번 학습했을 때는 80% 확률로 dandelion일거 같다고 추측을 했는데 4000번 학습시키니까 99.9% 확률로 맞췄네요.

    확률은 학습용 샘플이미지가 많을수록, 학습횟수가 많을수록 정확도가 올라갈거라는걸 알 수 있습니다.

     

    여기까지 하시면 텐서플로우를 학습까지 시켜보신겁니다!

    이 예제가 아니더라도 본인이 원하는 이미지들을 직접 구하셔서 학습을 시켜도 됩니다. (예를 들자면 자동차를 종류별로 인식시켜본다던가...)

     

     

    다음 편에서는, 이 그래프파일과 라벨파일을 이용해서 모바일에서 사용할 수 있는 형태로 변환하고, 직접 모바일기기 (IOS, 안드로이드)에 넣어서 테스트해보는 부분까지 진행해 보겠습니다.