(지난 포스트에서 이어지는 글)
https://hemon.tistory.com/78?category=1289659
우리가 원하는 건 캔 밑바닥에 찍힌 유통기한 글자를 인식하는 기능이었다!
이게 정석 글자가 아니고 도트로 찍히기도 하고 바닥에 굴곡이 있다보니 쉽게 되지 않음 ^^,,,,
파이썬으로 구글 Tesseract도 해보고 네이버 Clova 등등 여러 OCR AI를 사용해보려고 했지만 싹 다 실패!!
그래서 결국 찾은 대안은 Amazon Rekognition이었다
클라우드 수업에서 한번 사용해봤기 때문에 쉬울 줄 알았는데 AWS는 역시나 역할, 권한, 정책… 뭐가 너무 많아!!!!!!💢💢
며칠동안 헤매다가 성공한 방법을 포스팅한다.
https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/text-detecting-text-procedure.html
아마존에서 제공하는 개발자 안내서에 보면 언어별로 친절(?)하게 설명이 써져있다. 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);
}
'Study > AWS' 카테고리의 다른 글
안드로이드에서 AWS S3 버킷으로 사진 업로드하기 (0) | 2022.06.21 |
---|---|
AWS Rekognition 사용하기(IAM 생성, 버킷 만들기) (0) | 2022.05.16 |