ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android를 위한 TensorFlow Lite 예제 (MNIST 손글씨 숫자 인식)
    Machine Learning & Deep Learning/Tensorflow 강좌 2019. 10. 16. 00:20



    Android에서 TensorFlow Lite를 사용하여 

    카메라에 비춘 손글씨 숫자를 인식시켜보았습니다. 


    조명환경이나 카메라 차이로 인해 결과가 달라서 

    이진화 부분의 아규먼트를 수정할 필요가 있을 수 있습니다. 






    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 24

    • ㅇㅇ 2019.11.08 11:55


      잘봤습니다 ^0^

    • ㅌ1 2019.11.23 22:05


      궁금한게 있습니다 깃허브에서 다운받은 안드로이드 스튜디오 파일에 asset 폴더안에 영상에 있는 .tflite 이라는 이름의 파일들이 있는데 아마 영상에 나온것처럼 변환되어서 파일이 들어간것으로 생각됩니다. 이것을 다시 역으로 파이썬? 파일로 역변환해서 저창을 띄워서 코드를 파헤쳐보고 싶은데 이건 어떻게 해야하나요? 안드로이드 스튜디오에서 .tflite를 누르면 그냥 중국어와 같이 깨진 문자들만 출력됩니다 ㅜㅜ 부탁드립니다! 그리고 영상에 나온 코드들은 안올라온건가요? 공유해주시면 공부하는데 도움이 많이 될것 같습니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.24 16:50 신고


        깃허브에 파이썬 코드가 포함되어 있습니다. 파이썬 코드를 보면 됩니다.

        깃허브 주소는 유튜브 소개글에 있습니다.

      • ㅌ1 2019.11.24 23:44


        역으로 파이썬으로 열어볼 수 있나요?ㅜㅜ
        그리고 제모델이 학습시킨 이미지들을 사진으로 찍으면 비슷한 이미지와 텍스트가 출력되는 모델인데 저 안드로이드프로젝트에 asset안에 .tflite만 바꿔 붙여넣기하면 작동이 될련지.. 뭘 수정해야할지 모르겠네요 알려주시면 감사하겠습니다!

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.25 08:34 신고


        파이썬 코드는 아래 링크에 있습니다.

        https://github.com/webnautes/Tensorflow_Lite_Example/blob/master/Train%20Code(Python)/train.py

    • 2019.11.24 16:19


      비밀댓글입니다

    • ㅌㄹ 2019.11.29 13:21


      혹시 주피터 노트북에서 이미지분류를 해놨는데 그 결과값을 그대로 가져오려면 어떻게 해야하나요?
      public String recognizeImage(Bitmap bitmap) {
      ByteBuffer byteBuffer = convertBitmapToByteBuffer(bitmap);

      float [][] result = new float[1][3];
      tflite.run(byteBuffer, result);
      return result.tostring();
      }

      이부분인데 값이 [[F@5A09C1 과같이 이상한 값으로 나오네요
      원래 깃허브에서 받아온 코드는
      public String recognizeImage(Bitmap bitmap) {
      ByteBuffer byteBuffer = convertBitmapToByteBuffer(bitmap);

      float [][] result = new float[1][3];
      tflite.run(byteBuffer, result);
      float a=result[0][0];
      float b=result[0][1];
      float c=result[0][2];

      if((a>b))
      return "낭포성여드름";
      else if((a<b))
      return "좁쌀여드름";
      else if ((a>c))
      return "화농성여드름";
      else if((b>c))
      return "면포성여드름";
      else if(b<c)
      return "구진성여드름";
      else if(a<c)
      return "그냥여드름";
      else
      return "버즘";
      }

      이런식으로 a>b 이런 조건이 걸려있는데 이것들이 의미하는게 무엇인지도 모르겠구요 모델에서 이 이미지는 이거 저 이미지는 저거 이렇게 91프로의 정확도로 출력이 되어 있습니다
      혹시 파이썬 코드도 필요하시면 첨부하겠습니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.30 12:31 신고


        모델에 입력을 넣으면...
        tflite.run(byteBuffer, result);

        3개의 값을 얻을 수 있고..
        float a=result[0][0];
        float b=result[0][1];
        float c=result[0][2];

        이 세값을 비교하여 어떤 여드름인지 파악하는 것으로 보입니다.

        if((a>b))
        return "낭포성여드름";
        else if((a<b))
        return "좁쌀여드름";
        else if ((a>c))
        return "화농성여드름";
        else if((b>c))
        return "면포성여드름";
        else if(b<c)
        return "구진성여드름";
        else if(a<c)
        return "그냥여드름";
        else
        return "버즘";

      • ㅌㄹ 2019.11.30 17:59


        감사합니다 좀더 자세한 답변좀 부탁드릴게요 여쭤볼곳이 이곳밖에 없어서요 ㅠㅠ

        float a=result[0][0];
        float b=result[0][1];
        float c=result[0][2];

        1. 이거는 원래 깃허브에 있던 코든데 .tflite가 바뀌면 위의 변수도 바꿔줘야 하는건가요? 또 굳이 a,b,c 변수를 정해줘야하나요 a>b이거는 어떻게 정해진 조건일까요

        2. 파이썬 코드에서 예를들면 1이라는 이미지는 1이다 라고 결과값이 나왔는데 안드로이드 스튜디오에서 그냥 return result 이런식으로하면 자동으로 띄우는게 불가능한건가요? 꼭 a,b,c 선언하고 a>b는 뭐다 이래야하나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.01 18:17 신고


        정확한 구조는 저도 모릅니다.

        학습결과 얻은 모델을 사용한거라면
        깃허브 코드에 나오내로 구현할 수 밖에 없습니다.

      • 2019.12.04 22:35


        비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.05 09:38 신고


        파이썬 코드를 봐도 어떻게 모델에서 나온 출력을 사용해야 하는지는 알 수 없습니다. 최종적으로 3개의 값이 출력된다는 것만 알 수 있습니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.05 09:40 신고


        깃허브나 캐글에서 같이 데이터셋을 사용한 코드를 찾아보는게 어떨까합니다.

      • ㅌㄹ 2019.12.05 22:56


        파이썬 코드를봐도 할수 없으면 어떤것을 보고 안드로이드 스튜디오에서 조건문을 걸어야하는건가요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.06 09:32 신고


        모델을 사용하여 예측결과를 가져오는 것을 안드로이드에서 하는 겁니다.

        예측 결과로 3개의 숫자가 주어지는 듯한데..

        3개의 숫자에 대한
        추가 설명이 있어야 어떻게 if문을 걸지 알 수 있을 듯합니다.

        안드로이드에서 해야하는게 맞습니다.

      • ㅌㄹ 2019.12.14 17:42


        float [][] result = new float[1][3];
        tflite.run(byteBuffer, result);
        float a=result[0][0];
        float b=result[0][1];
        float c=result[0][2];
        if(a>b) imgPreview.setImageResource(R.drawable.doctor);
        return "낭포성여드름";
        else if(a<b)
        return "화농성여드름";
        else if(a>c)
        return "구진성여드름";
        else
        return "좁쌀여드름";

        여드름 종류에따라 대표이미지를 결과화면에 같이 띄워주고 싶은데 저렇게 하면 빨간줄이 뜨더라구요 어떻게해야 결과에 따라 이미지를 매칭시켜서 띄워줄수 있나요? 저 코드에서는 doctor라는 이미지를 낭포성여드름일때만 텍스트옆에 띄워주려고 하는겁니당 !

    • 2019.12.05 14:54


      안녕하세요 소스받아서 구동까지 해보았습니다. 그런데 숫자 하나하나만 인식이 되는거같은데 여러개 숫자를 인식시키려고 하는데 어떻게 해야할까요??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.06 09:27 신고


        다른 분이 한 것을 보니 숫자들의 컨투어를 검출하여 숫자마다 외곽박스를 구하여 하시더라구요. 해보지는 않았습니다.

    • 1234 2019.12.11 21:45


      한가지만 여쭙겠습니다

      implementation fileTree(dir: 'libs', include: ['*.jar'])
      implementation 'com.android.support:appcompat-v7:28.0.0'
      implementation 'com.karumi:dexter:5.0.0'
      implementation 'com.android.support.constraint:constraint-layout:1.1.3'
      implementation 'com.specyci:residemenu:1.6+'
      implementation 'org.tensorflow:tensorflow-lite:1.14.0'

      깃허브에서 받은 gradle중 일부분인데요 androidx 이전껍니다 그런데 여기서 구글맵 api를 적용시키기 위해서
      implementation 'com.google.android.gms:play-services-maps:17.0.0'
      implementation 'com.google.android.gms:play-services-location:17.0.0'

      를 추가하면 오류가 sync now에서 오류가 뜹니다 이거 해결법 아시나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.12 00:23 신고


        androidx로 바꾸어야 해결될듯합니다.

        아래 링크에서 com.android.support로 시작하는 것만 검색하여 androidx 패키지로 교체해보세요.

        https://developer.android.com/jetpack/androidx/migrate/class-mappings

Designed by Tistory.