본문 바로가기

Study/AWS

안드로이드 앱으로 Amazon Rekognition 사용하기!!

728x90

 

 

(지난 포스트에서 이어지는 글)

https://hemon.tistory.com/78?category=1289659 

 

안드로이드에서 AWS S3 버킷으로 사진 업로드하기

안드로이드 앱으로 Rekognition을 사용하기 위해서 카메라로 촬영한 사진을 S3에 업로드 해야 할 일이 생겼다 나중에 내가 참고하려고 정리하는 글!! 먼저 IAM과 S3 버킷이 만들어져 있어야 함! 이전

hemon.tistory.com

 

 


 

우리가 원하는 건 캔 밑바닥에 찍힌 유통기한 글자를 인식하는 기능이었다!

이게 정석 글자가 아니고 도트로 찍히기도 하고 바닥에 굴곡이 있다보니 쉽게 되지 않음 ^^,,,,

파이썬으로 구글 Tesseract도 해보고 네이버 Clova 등등 여러 OCR AI를 사용해보려고 했지만 싹 다 실패!!

 

그래서 결국 찾은 대안은 Amazon Rekognition이었다

클라우드 수업에서 한번 사용해봤기 때문에 쉬울 줄 알았는데 AWS는 역시나 역할, 권한, 정책… 뭐가 너무 많아!!!!!!💢💢

며칠동안 헤매다가 성공한 방법을 포스팅한다.

 

 

https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/text-detecting-text-procedure.html

 

이미지에서 텍스트 감지 - Amazon Rekognition

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

아마존에서 제공하는 개발자 안내서에 보면 언어별로 친절(?)하게 설명이 써져있다. Python이랑 Node.JS 다 있음

그래서 우리도 바로 자바 코드를 가져옴!!

public class DetectText {

   public static void main(String[] args) throws Exception {
      
  
      String photo = "inputtext.jpg";
      String bucket = "bucket";

      AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.defaultClient();

     
      
      DetectTextRequest request = new DetectTextRequest()
              .withImage(new Image()
              .withS3Object(new S3Object()
              .withName(photo)
              .withBucket(bucket)));
    

      try {
         DetectTextResult result = rekognitionClient.detectText(request);
         List<TextDetection> textDetections = result.getTextDetections();

         System.out.println("Detected lines and words for " + photo);
         for (TextDetection text: textDetections) {
      
                 System.out.println("Detected: " + text.getDetectedText());
                 System.out.println("Confidence: " + text.getConfidence().toString());
                 System.out.println("Id : " + text.getId());
                 System.out.println("Parent Id: " + text.getParentId());
                 System.out.println("Type: " + text.getType());
                 System.out.println();
         }
      } catch(AmazonRekognitionException e) {
         e.printStackTrace();
      }
   }
}

 

 

첫번째 문제는 저놈의 AmazonRekognitionClientBuilder.......

아무리 해도 import가 안됨!! 4대의 컴퓨터로 해봤지만 안됨 구글링 며칠동안 뒤져도 안나옴 ㅋ

그래서 결국 다른 방법으로 Client를 만들어서 썼다

 

 

어찌저찌 System.out.println 찍어보면서 꾸역꾸역 코드를 완성했는데 텍스트가 안나옴!!!💢

그냥 버킷에 사진 올려서 다른 걸로 돌려보면 잘 나오는데,,,

 

알고보니 권한을 놓친게 있었다,,,,,,,,

 

⭐⭐⭐⭐⭐ 우리가 생성한 Cognito에 권한 4개를 추가해줘야 함!! ⭐⭐⭐⭐⭐

당장 다시 IAM > 역할 > Unauth Role에 들어가서 권한을 추가해주자

다시 한번 얻은 교훈... Amazon을 쓸 때는 권한 추가 잊지 말기...

 

 

권한 추가하고 나니까 드디어 나온 결과값!!!!

보고 눈물 흘릴뻔...........

깔끔~~

 

 

github 다 뒤져가며 힘들게 완성한 코드😢

public void DetectText() {

    String photo = "upload_test.jpg";
    String bucket = "cloud-test-hyun";

    //AmazonRekognition rekognitionClient = AmazonRekognitionClient.builder();
    //AWSCredentials credential = new BasicAWSCredentials(accesskey,secretkey);

    AWSCredentials cre = new AWSCredentials() { // 자격
        @Override
        public String getAWSAccessKeyId() {
            return "액세스키";
        }

        @Override
        public String getAWSSecretKey() {
            return "시크릿키";
        }
    };

    AmazonRekognition rekognitionClient = new AmazonRekognitionClient(cre);
    rekognitionClient.setRegion(Region.getRegion(Regions.AP_NORTHEAST_2));
    
    DetectTextRequest request = new DetectTextRequest()
            .withImage(new Image()
                    .withS3Object(new S3Object()
                            .withName(photo)
                            .withBucket(bucket)));

    String res =""; // 텍스트 결과값

    try { // DetectText 요청
        AsyncTask<DetectTextRequest,Void,String> asyncTask = new AsyncTask<DetectTextRequest, Void, String>() {
            @Override
            protected String doInBackground(DetectTextRequest... detectTextRequests) {

                DetectTextResult result = rekognitionClient.detectText(request);
                List<TextDetection> textDetections = result.getTextDetections();

                System.out.println("Detected lines and words for " + photo);

                String res="";

                for (TextDetection text: textDetections) {

                    System.out.println("Detected: " + text.getDetectedText());
                    if (text.getId() == 0) {
                        res = text.getDetectedText();
                        break;
                    }

                }
                return res;
            }
        };

        res = asyncTask.execute(request).get();


    }catch (Exception e){
        System.out.println("FAIL----------------------------------------------------"+e);
    }

    System.out.println("----------------------------" + res);
    System.out.println(res.length());

    String result = "0000년  00월  00일";
    String resNum = res.replaceAll("[^0-9]", "");

    String yyyy, mm, dd;

    if (resNum.length() == 6) { 
        yyyy = "20" + resNum.substring(0, 2);
        mm = resNum.substring(2, 4);
        dd = resNum.substring(4, 6);

        result = yyyy + "년" + mm + "월" + dd + "일";
    }
    else if (resNum.length() == 8) { 
        yyyy = resNum.substring(0, 4);
        mm = resNum.substring(4, 6);
        dd = resNum.substring(6, 8);

        result = yyyy + "년" + mm + "월" + dd + "일";
    }
    else { // 인식 잘 안됨
        result = "유통기한 인식에 실패했습니다.\n다시 사진을 촬영해주세요.";
    }

    text_display.setText(result);
    tts.speak(result, TextToSpeech.QUEUE_FLUSH, null);


}

 

728x90
LIST