메뉴 건너뛰기

개발강좌/정보

  • 텐서플로우로 이미지인식 모바일앱 만들어보기 - 3 (이미지 학습시켜보기) [머신러닝/딥러닝]
  • 공돌이
    조회 수: 8610, 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, 안드로이드)에 넣어서 테스트해보는 부분까지 진행해 보겠습니다.

     

댓글 26 ...

  • 배우고싶어요

    2017.05.12 14:28

    작성해주신 내용을 토대로 텐서플로우를 보다 쉽게 접할 수 있었습니다. 진심으로 감사드립니다.
    제가 이미지 학습관련하여 문의 사항이 있는데 3) 학습진행 에서 학습명령어를 입력하니
    아래와 같은 이슈들이 발생했습니다.
    이유를 알 수 있을까요??

    Looking for images in 'bottlenecks'
    No files found
    Looking for images in 'inception'
    WARNING: Folder has less than 20 images, which may cause issues.
    Looking for images in 'inception-2015-12-05'
    WARNING: Folder has less than 20 images, which may cause issues.
    Looking for images in 'inception'
    WARNING: Folder has less than 20 images, which may cause issues.
    Looking for images in 'flower_photos'
    Traceback (most recent call last):
    File "/Users/greencar/tensor/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/examples/image_retraining/retrain.py", line 1105, in <module>
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
    File "/Users/greencar/tensor/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
    File "/Users/greencar/tensor/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/examples/image_retraining/retrain.py", line 816, in main
    FLAGS.validation_percentage)
    File "/Users/greencar/tensor/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/examples/image_retraining/retrain.py", line 152, in create_image_lists
    file_list.extend(gfile.Glob(file_glob))
    File "/Users/greencar/tensor/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/python/lib/io/file_io.py", line 323, in get_matching_files
    compat.as_bytes(filename), status)]
    File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/contextlib.py", line 89, in __exit__
    next(self.gen)
    File "/Users/greencar/tensor/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/python/framework/errors_impl.py", line 466, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
    tensorflow.python.framework.errors_impl.NotFoundError: train/out/flower_photos/flower_photos
  • 공돌이

    2017.05.12 17:34

    저는 스크립트를 만들어서 사용하는데, 이해를 돕기위해 위에서는 풀어서 설명하다보니 약간 실수가 있는것 같습니다. 다시 수정하도록 하겠습니다...ㅠㅜ

    일단 올려주신 오류메시지는,

    폴더위치가 정확하지 않아서 발생하는 문제입니다.

     

    0) 폴더를 만들때는 train/input, train/output 으로 만들고 정작 밑에서는 train/data, train/out 으로 썼네요...-_-;; 실수입니다. 통일시킬게요.

    1) train 밑에 out 폴더 밑에 flower_photos 폴더가 만들어져야 하는데, 제가 스크립트에서 자동으로 처리하다 보니까 그부분이 빠졌습니다. out 밑에 flower_photos 밑에 inception, bottleneck 등의 폴더가 만들어지고, 결과그래프도 저장되거든요...

    2) out/flower_photos 밑에 만들어져야 할 bottlenecks, inception 등의 폴더가  분석을 위한 입력이미지폴더 (train/data/flower_photos ) 아래에 생성되어버렸습니다. 그러다보니 학습프로그램(retrain) 이 bottleneck 등의 폴더를 입력데이터용 라벨폴더로 착각하고 이미지를 찾는데 없으니까 less than 20 images 라는 메시지가 나왔네요...

    3) 앞서와 train/out/flower_photos 폴더가 만들어지지 않아서 graph/label 파일을 저장할 폴더를 못찾아서 "ensorflow.python.framework.errors_impl.NotFoundError: train/out/flower_photos/flower_photo" 오류가 발생했습니다...

     

    ---->

     

    위 강좌를 수정하고, 별도로 자료실에 제가 사용하는 스크립트를 올릴테니 그걸로 사용하시면 될 것 같은데, 일단 임시로

       1) train/input/flower_photos 폴더를 삭제하시고 다시 tgz 파일을 푸세요.

       2) train/output/flower_photos 폴더를 만드세요 ( mkdir -p train/out/flower_photos)

    그리고 나서 본문의 학습과정을 다시한번 진행해 보세요... (학습과정에 폴더 명이 input/output으로 수정되었으니 참고하세요)

     

    그래도 안되면 다시 댓글 남겨주세요....^^

  • 배우고싶어요

    2017.05.12 19:44

    답변주신 내용을 토대로 학습까지 완료했습니다! ^^ 무언가 갖춰지는 기분이라 금요일 저녁인데도 사무실에 남아있는게 뿌듯하네요 ㅎㅎ
    추가로 질문이 있습니다.
    학습 완료후 test.jpg를 가지고 테스트를 하는 부분이 있는데
    test.jpg의 경로는 tensor 루트경로에 위치해 있으면 될까요?

    일단 루트 경로에 위치하고 알려주신 테스트 명령어를 입력하면 아래와 같은 결과가 보여집니다.
    선생님께서 보여주신 결과와는 다소 차이가 있어 보이는데 아래 내용 좀 봐주실 수 있을까요? 부탁드립니다!

    tensor greencar$ 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
    -bash: bazel-bin/tensorflow/examples/label_image/label_image: No such file or directory
    (tensor) Greencarui-MacBook-Pro:tensor greencar$
  • 공돌이

    2017.05.12 20:52

    에구구 제가 사용하는 환경과 경로를 살짝 달리하다보니 실수가 많았네요

    그리고, 테스트용 파일명은 어디에 두시던 상관없이 --image 옵션에 정확한 경로를 넣어주시면 됩니다. 현재 디렉토리에 있다면 별도로 경로를 지정해주실 필요없이 파일명만 주셔도 되구요....(아래 참고).

    경로 앞에 tensorflow/ 가 붙어야 하는데 실수했습니다 ㅠㅜ (이것도 아래 참고)

     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

  • 행인

    2017.06.29 19:56

    안녕하세요, 죄송하지만 rose, dandelion, tulip 학습에 각각 사용된 이미지수가 대충 몇개정도 되세요? 저는 천자문정도를 학습시켜 보려고합니다
  • 공돌이

    2017.07.03 22:05

    기본적으로 이미지가 많을수록 정확도가 올라갑니다. 즉, 많다고 해서 그래프 용량이 막 늘어나거나 그런건 아니라는거죠. rose,dandelion 등은 텐서플로우에서 예제로 제공되는파일들로서 각각 600여개의 파일이 들어가 있습니다. 천자문등의 글자를 학습하는건 이 튜토리얼에서 설명하는 인셉션엔진이 아니고 MNIST라는 다른 모델을 사용하셔야 합니다. 이거는 지금 튜토리얼이 마무리되면 적당히 시간을 잡아서 시작해보려고 합니다...^^;;

  • kjs

    2017.07.02 17:01

    여기까지 잘 따라왔는데 너무 재미있네요 감사합니다
  • 공돌이

    2017.07.03 22:05

    재밌다고 하시니 저도 뿌듯하네요...^^ 감사합니다!

  • 드린

    2017.08.21 01:38

    MacBook-Pro:trademarkLearn baeg$ 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

    Traceback (most recent call last):
      File "tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain", line 178, in
        Main()
      File "tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain", line 145, in Main
        'Cannot exec() %r: file not found.' % main_filename
    AssertionError: Cannot exec() '/Users/baeg/TrademarkLearn/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/examples/image_retraining/retrain.py': file not found.

    이렇게 입력했는데, 위와 같은 파일을 찾을 수 없다고 오류가 나오네요. 

    bin            lib            tensorflow
    include            pip-selfcheck.json    train
    현재 디렉토리 내부에 있는 폴더 및 파일들이고,

    ACKNOWLEDGMENTS        README.md        configure
    ADOPTERS.md        RELEASE.md        configure.py
    AUTHORS            WORKSPACE        models.BUILD
    BUILD            arm_compiler.BUILD    tensorflow
    CODEOWNERS        bazel-bin        third_party
    CODE_OF_CONDUCT.md    bazel-genfiles        tools
    CONTRIBUTING.md        bazel-out        util
    ISSUE_TEMPLATE.md    bazel-tensorflow
    LICENSE            bazel-testlogs
    tensorflow폴더 내부에 있는 폴더 및 파일들이예요.
    뭐가 문제인걸까요?

  • 공돌이

    2017.08.21 10:43

    @드린 님, bazel build 를 하면 bazel-bin 폴더 안에 여러 실행파일들이 들어가는데, 그중에 아래도 들어갑니다 (원본은 tensorflow/examples/image_ratrining/ 안에 있습니다).

    /Users/baeg/TrademarkLearn/tensorflow/bazel-bin/tensorflow/examples/image_retraining/retrain.runfiles/org_tensorflow/tensorflow/examples/image_retraining/retrain.py 

    일단 메시지로 보아서는 빌드가 제대로 안된것 같아요. 오류메시지 없이 빌드가 되었는지 확인해보시고, 만약 안되어있다면 다시한번 빌드를 해보셔야 할것 같습니다.

    (만약 빌드하면서 ./configure 같은걸 다시 돌리시거나 bazel clean 같은걸 하시면 기존에 빌드되어있던 파일들이 날라갑니다. 즉, 다시 전체를 빌드하셔야 합니다.)

    빌드가 오류없이 (워닝은 많이 뜨는데 무시하셔도 되고요) 이루어졌는데도 동일한 오류가 반복된다면 다시한번 올려주세요 (빌드 로그를 같이 올려주시면 좋을것 같아요)

     

    그리고, 참고로...빌드 없이 그냥 retrain.py 를 돌리셔도 실행은 됩니다...^^;; (python /경로/retrain.py 파라미터들 로도 실행가능) 

    아마 전반적인 속도를 올리기 위해서 연산부분만 컴파일하는거같아요. 

  • 드린

    2017.08.21 23:29

    다시 빌드하고 추가로 설치하라고 하는 autograd?이것도 같이 설치하니 잘 돌아가네요.

    한가지 더 질문이 있는데요.

    기존에 학습 되어있는 것을 없애고 처음부터 다시 학습시키려면 어떻게 해야하나요?

  • 공돌이

    2017.08.22 00:13

    처음부터 학습이, 만약 인셉션V3 에서 pretrain 된 것들을 무시하고 완전히 처음부터 학습을 이야기하시는거라면 잘 생각하셔야 합니다. scratch부터 학습의 경우는 짧게는 며칠부터 몇주이상 걸릴수도 있습니다. 메모리와 GPU성능에 굉장히 크게 좌우되고요, 

    만약 단순히 새로운 class들을 학습시키기 원하시는거라면, retrain을 이용하시는게 정신건강상 좋습니다...^^ 

    그럼에도 불구하고 scratch 부터 학습(맨땅에 헤딩)시켜보시길 원하신다면,  https://github.com/tensorflow/models/tree/master/inception 에서 How to Train From Scratch 부분을 참고하세요.

    retrain 시 정확도를 높이기 위해 fine-tuning 하는 방법도 있으니 참고하시구요...나중에 시간이 되면 정리해서 한번 올릴까 합니다. (요즘은 여력이 ㅠㅜ)

  • 드린

    2017.08.22 01:02

    성심껏 답글 달아주셔서 감사합니다.

    폴더를 하나 더 만들어서 새로운 input output을 만들어서 경로명도 바꾸어 진행하였습니다.

    하지만 제가 구한 이미지가 20개가 넘지 못한다고 하여 학습을 시작하지 않더군요.

    WARNING:tensorflow:WARNING: Folder has less than 20 images, which may cause issues.

     

    그래서 Ctrl + C , V를 통해서 복사본을 만든 뒤 각각 20개의 이미지를 넘겼더니 

    ERROR:tensorflow:Only one valid folder of images found at train/input/logo - multiple classes are needed for classification.

    이런식으로 오류가 나오더군요. 복사본 이미지의 문제인지 여쭙고싶고,

    만약 문제가 맞다면 적은 이미지만으로 학습을 하는 것은 불가능 할까요?

    제가 로고 이미지들을 학습 시키려하는데, 로고 이미지가 많지 않아 질문드립니다.

  • 공돌이

    2017.08.22 09:39

    1. 일단 첫번째 워닝은 학습에 필요한 만큼의 샘플이 없어서 나는 경고메시지이구요 (정확도는 학습데이터가 많을수록 올라갑니다) 몇가지 왜곡옵션을 줘서 (사이즈, 플립,색상변경등) 임의로 좀 더 향상하는것은 가능하니 당장은 크게 신경쓰지 않으셔도 됩니다.

    2. class 라는것은 인식한 물체의 식별자를 나타내는 것입니다. 메시지로 보아서는 logo 폴더 아래에 class (인식할 수 있는 물체의 종류)가 하나 밖에 없다는 것인데, 혹시 각 로고별로 폴더를 만들지 않으셨나요?  logo 아래에 A, B, C, D 이런식으로 각각 로고 이미지가 들어있는 폴더를 만드시고 그 아래에 이미지들을 두시면 됩니다.

    3. 말씀하시는걸로 보아, logo 가 가변적인 게 아니고 정형화 된 온라인상의 로고이미지 같은데, 만약 제 생각이 맞다면 tenorflow 보다 opencv쪽이 좀 더 쉬우실 수도 있습니다.

  • 드린

    2017.08.22 14:06

    logo 폴더 내에는 샘플로 10가지 정도의 폴더를 만들어 각 폴더에 이미지를 넣었구요.

    제가 만드려는 프로젝트는 로고 검사가 아닌 현재 저작권에 등록되어있는 로고들과 제작하려는 로고의 유사성의 정도를 측정하기 위함이예요.

    인터넷에는 아무리 찾아보아도 해결법이 보이지 않는것 같아 이렇게 질문드려요!

    다시한번 정성스럽게 답글 달아주셔서 너무 너무 감사드립니다.

  • 공돌이

    2017.08.22 15:04

    제 생각에는 아마도 명령행 인자에 경로지정이 약간 잘못되지 않았나 싶은데요, 번거로우시겠지만

    1) 사용한 명령행 (retrain 뒤에 인자값들) 과

    2) 현재 train 폴더 안의 폴더구조 를 알려주시면 다시한번 살펴보겠습니다.

  • 드린

    2017.08.22 21:27

    1. 사용한 명령행 이구요.

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

     --bottleneck_dir=train/output/logo/bottlenecks        

    --how_many_training_steps 4000        

    --model_dir=train/output/logo/inception        

    --output_graph=train/output/logo/retrained_graph.pb        

    --output_labels=train/output/logo/retrained_labels.txt        

    --image_dir train/input/logo

     

    2.

    (trademarkLearn) baegui-MacBook-Pro:train baeg$ ls
    input    output

    (trademarkLearn) baegui-MacBook-Pro:input baeg$ ls
    flower_photos    logo

    ├── 네이버
    │   ├── images\ (1)\ 2.jpg
    │   ├── images\ (1).jpg
    │   ├── images\ (10).jpg
    │   ├── images\ (2)\ 2.jpg
    │   ├── images\ (2).jpg
    │   ├── images\ (3)\ 2.jpg
    │   ├── images\ (3).jpg
    │   ├── images\ (4)\ 2.jpg
    │   ├── images\ (4).jpg
    │   ├── images\ (5)\ 2.jpg
    │   ├── images\ (5).jpg
    │   ├── images\ (6).jpg
    │   ├── images\ (7).jpg
    │   ├── images\ (8).jpg
    │   ├── images\ (9).jpg
    │   ├── images\ 2.jpg
    │   ├── images.jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (1).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (10).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (11).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (2).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (3).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (4).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (5).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (6).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (7).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (8).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (9).jpg
    │   ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ 2.jpg
    │   └── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?.jpg
    └── 나이키
        ├── images\ (1)\ 2.jpg
        ├── images\ (1).jpg
        ├── images\ (10).jpg
        ├── images\ (11).jpg
        ├── images\ (12).jpg
        ├── images\ (2)\ 2.jpg
        ├── images\ (2).jpg
        ├── images\ (3)\ 2.jpg
        ├── images\ (3).jpg
        ├── images\ (4)\ 2.jpg
        ├── images\ (4).jpg
        ├── images\ (5).jpg
        ├── images\ (6).jpg
        ├── images\ (7).jpg
        ├── images\ (8).jpg
        ├── images\ (9).jpg
        ├── images\ 2.jpg
        ├── images.jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (1).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (2).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (3).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (4).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (5).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (6).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (7).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ (8).jpg
        ├── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?\ 2.jpg
        └── ?\204\203?\205??\204\213?\205??\206??\204\205?\205??\204\203?\205?.jpg

     

    output

    logo flower_photos

    .
    └── inception
        ├── LICENSE
        ├── classify_image_graph_def.pb
        ├── cropped_panda.jpg
        ├── imagenet_2012_challenge_label_map_proto.pbtxt
        ├── imagenet_synset_to_human_label_map.txt
        └── inception-2015-12-05.tgz

    이렇게 구성되어있습니다.

  • 공돌이

    2017.08.23 10:00

    아...클래스명 (네이버, 나이키 로 되어있는)은 한글을 제대로 인식 못합니다...^^ 영어로 폴더명을 수정하셔서 다시 돌려봐주세요.

  • 드린

    2017.08.23 12:39

    파일명도 영어로 폴더명도 영어로 바꾸니 제대로 작동하네요!

    감사합니다!!

  • 드린

    2017.08.23 17:40

    이미지 학습은 완료되었지만, 이미지 학습을 테스트해보려하니 또 오류가 나더군요.

    (trademarkLearn) baegui-MacBook-Pro:trademarklearn baeg$ tensorflow/bazel-bin/tensorflow/examples/label_image/label_image          --input_layer=Mul          --output_layer=final_result          --labels=train/output/logo/retrained_labels.txt          --image=test.jpg          --graph=train/output/logo/retrained_graph.pb
    2017-08-23 17:38:06.015386: E tensorflow/examples/label_image/main.cc:318] Unknown argument   
    usage: tensorflow/bazel-bin/tensorflow/examples/label_image/label_image
    Flags:
        --image="tensorflow/examples/label_image/data/grace_hopper.jpg"    string    image to be processed
        --graph="tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb"    string    graph to be executed
        --labels="tensorflow/examples/label_image/data/imagenet_slim_labels.txt"    string    name of file containing labels
        --input_width=299                    int32    resize image to this width in pixels
        --input_height=299                   int32    resize image to this height in pixels
        --input_mean=0.000000                float    scale pixel values to this mean
        --input_std=255.000000               float    scale pixel values to this std deviation
        --input_layer="input"                string    name of input layer
        --output_layer="InceptionV3/Predictions/Reshape_1"    string    name of output layer
        --self_test=false                    bool    run a self test
        --root_dir=""                        string    interpret image and graph file names relative to this directory

     

  • 공돌이

    2017.08.24 11:11

    일단 tensorflow/bazel-bin/tensorflow/examples/label_image/label_image --input_layer=Mul --output_layer=final_result --labels=train/output/logo/retrained_labels.txt --image=test.jpg --graph=train/output/logo/retrained_graph.pb  의 명령어로 돌리신거로 보이는데, label_image 와 --input_layer=Mul --output_layer=final_result --labels=train/output/logo/retrained_labels.txt --image=test.jpg --graph=train/output/logo/retrained_graph.pb 이 부분에 정상적이지 않은 개행문자 같은게 들어간것 같습니다. (인자값을 잘못넣으면 원래는 unknown argument 하고 잘못된 부분 문자가 나오는데, 블랭크로 되어있는걸로 보아 특수문자가 중간에 들어가 있는게 아닌가 싶어요)

    tensorflow/bazel-bin/tensorflow/examples/label_image/label_image --인자명=인자값 --인자명=인자값 이런형태로 사이사이에 정확히 스페이스만 들어가도록 해서 다시한번 시도해봐주세요.

     

  • 드린

    2017.08.24 14:14

    --image부분이 이상한 것으로 대체 되어있더군요.

    드디어 해결했습니다.

    같은 이미지 30개 이상을 4000번 학습 시켰는데, 인식율이 그다지 좋지 못하더군요.

    혹시 학습을 더 시키면 인식률이 좋아질까요?

    아니라면 다른 해결방안은 없을까요? 

    질문이 너무 많아 죄송합니다...

  • 공돌이

    2017.08.24 18:27

    인식율이 그닥 안좋다는게 어떤 상황인지를 정확히 모르겠네요. 학습은 이미지가 많을수록 효율이 올라갑니다.(똑같은 이미지를 여러장 학습시키는건 별 의미가 없고 다른 - 크기/색상/찍은 각도 등 - 이미지가 많을수록 좋습니다. 최소한 50개 이상 추천)

    텐서플로우의 학습이란게 결국은 이미지를 수치(행렬)로 변환해서 비교하면서 유사도를 측정하는거거든요...

    학습을 시키실때는 Cross entropy 값과 Validation accuracy 값을 유심히 살펴보셔야 합니다.

    cross entropy 값은 낮아질수록, validation accuracy 값은 높아질수록 인식의 정확도가 올라갑니다. 

    (의미를 설명하려면 이야기가 길어지니 간단히 cross entropy 는 학습이 잘되고 있는지를 측정하는 손실함수, validation accuracy 는 임의의 데이터셋을 이용해 학습을 평가한 결과값 정도로 생각하고 가도 일단은 괜찮을것 같습니다)

     

    만약 샘플이미지가 별로 없어서 숫자를 채우기 힘드시다면, retrain 할때 왜곡옵션을 좀 줘서 크기, 위치,  색상, 좌우/상하반전 등의 변형이미지를 자동생성해서 학습시키도록 할 수 있습니다. 단, 학습속도는 많이 느려집니다. 

    retrain 인자에 아래의 인자를 원하시는 대로 추가해서 사용하시면 됩니다.

    --random_crop  숫자

    --random_brightness 숫자

    --random_scale 숫자

    --flip_left_right True

    (여기서 숫자가 있는 경우는 0~100 까지 숫자를 입력하시면 됩니다. 숫자는 %값으로, 왜곡의 정도를 나타내는데, 5~10 정도면 적당할것 같습니다)

    flip_left_right 가 True 이면 좌우반전이미지를 자동학습합니다.

     

    드린님의 현재 환경이나 상황을 제가 정확히 모르는 상태에서 온라인상에서 말로 도움드릴수 있는 거는 이정도인것 같아요... ㅠㅜ

     

  • 드린

    2017.08.24 18:31

    이런 방법도 있었군요!

    정말 감사드려요.

    제가 하려는 프로젝트는 자신이 제작한 상표를 입력데이터로 넣으면 기존에 학습시켰던 여러 개의 상표중에 어떤 상표와 가장 유사한지 1~5위까지 보여주는 프로그램을 만들어보려고 했죠.

  • 공돌이

    2017.08.24 18:50

    아 ㅎㅎ 그러시군요.

    원래 저 왜곡옵션은 컴 사양이 딸리면 속도가 너무 느려서 보통 이미지를 하나 가지고 이미지편집툴로 변형한 것들을 여러개 생산해서 만들곤 합니다...(만드는건 번거롭지만 학습은 좀 더 빠른듯)

    모쪼록 좋은 결과 있으시길 바래요!

  • 네오비전

    2018.04.12 09:56

    (tensorflow) Hyungminui-iMac:tensorflow hyungmincho$ bazel-bin/tensorflow/examples/label_image/label_image \
    >          --input_layer=Mul \
    >          --output_layer=final_result \
    >          --labels=train/output/flower_photos/retrained_labels.txt \
    >          --image=train/test.jpg \
    >          --graph=train/output/flower_photos/retrained_graph.pb
    2018-04-12 09:54:37.717091: E tensorflow/examples/label_image/main.cc:319] Unknown argument   
    usage: bazel-bin/tensorflow/examples/label_image/label_image
    Flags:
    --image="tensorflow/examples/label_image/data/grace_hopper.jpg" string image to be processed
    --graph="tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb" string graph to be executed
    --labels="tensorflow/examples/label_image/data/imagenet_slim_labels.txtstring name of file containing labels
    --input_width=299 int32 resize image to this width in pixels
    --input_height=299 int32 resize image to this height in pixels
    --input_mean=0.000000 float scale pixel values to this mean
    --input_std=255.000000 float scale pixel values to this std deviation
    --input_layer="input" string name of input layer
    --output_layer="InceptionV3/Predictions/Reshape_1" string name of output layer
    --self_test=false bool run a self test
    --root_dir="" string interpret image and graph file names relative to this directory

    (tensorflow) Hyungminui-iMac:tensorflow hyungmincho$

    이렇게 나오는건 혹시 어떤 문제일까요?..경로 문제는 아닌거 같은데..자세히 봐도 잘 모르겠네요 ㅠㅠ
https://meisteruser.net/devflow/2279
번호
제목
닉네임
11 프레임워크/기타 공돌이 3 2018.09.20
10 머신러닝/딥러닝 공돌이 2233 2017.07.05
9 머신러닝/딥러닝 공돌이 2397 2017.06.05
8 머신러닝/딥러닝 공돌이 7540 2017.05.26
7 머신러닝/딥러닝 공돌이 2568 2017.05.02
머신러닝/딥러닝 공돌이 8610 2017.04.27
5 머신러닝/딥러닝 공돌이 3877 2017.04.24
4 머신러닝/딥러닝 공돌이 2998 2017.04.23
3 머신러닝/딥러닝 공돌이 6099 2017.04.19
2 머신러닝/딥러닝 공돌이 23421 2017.03.22
1 공지 공돌이 700 2017.03.21
태그
위로