인프라/AWS

[ AWS ] Rekoganition 아마존 레코그니션 (2)

IT마스터되자 2021. 2. 9. 22:53
728x90

Rekognition Image 이미지 작업

 

참고 사항 이미지는 JPG , PNG 형식의 이미지를 분석한다

-만약 바이트 배열로 이미지 분석 할 경우에는 base64로 인코딩 해야한다 하지만 자바는 AWS SDK 이미지를 자동 인코딩하므로 안해두된당

-S3Object 를 이용할 시 s3 버킷 리전과 Rekognition Image 리전이 같아야한다.

-최근에 서울 리전이 추가 되었다 엔드포인트는 -  rekognition.ap-northeast-2.amazonaws.com 리전은 - ap-northeast-2 서울꺼다

-Java , JavaScript , Python , PHP 외의 다른 AWS SDK를 사용하는경우는 Rekognition API 작업을 호출할 때 이미지 형식 오류가 발생하면 이미지 바이트를 Rekognition API 작업에 전달 하기 전에 base64로 인코딩한후에 보내야한다.

 

Rekognition Image 작업 지연 시간

작업 지연 시간을 최소화하려면 이것들을 고려해야한다.

1.이미지가 포함된 aws s3 버킷의 리전과 aws Rekognition Image API 작업에 사용하는 리전이 일치해야함.

2. 이미지 바이트로 AWS Rekognition Image 작업을 호출하는 것이 이미지를 AWS S3 버킷에 업로드한 다음 AWS Rekognition Image 작업에서 업로드된 이미지를 참조 하는 것보다 더 빠르다. 그러기 때문에 거의 실시간으로 처리하기 위하는 경우는 이 방식을 고려해볼이유가있다.

3. 하지만 만약 AWS S3 버킷에 이미 이미지가 있는 경우에는 이미지 바이트로 작업 하는것보다 AWS S3 이미지 버킷으로 작업 하는 것이 더 빠르다.

4. 이건 뭐 누가 봐도 당연하다고 생각하겠지만 저해상도 이미지가 고해상도 이미지 보다 더 빠르게 처리된다. 참조하길..

 

Rekognition Image 얼굴 인식 입력 이미지에 대한 권장 사항

1. 정면을 향한 얼굴이 있어야한다.

2. 그림자 등 음영이 바뀌지 않도록 평면 조명이 얼굴을 비춰야 한다.

3. 배경과 충분한 대비를 이뤄야한다. 고대비 흑백 배경이 효과적이다.

4. 충분히 커야한다. AWS Rekognition Image는 HD 해상도 이미지 1920x1080에서 40x40픽셀의 작은 얼굴을 감지할 수 있다. 이미지 해상도가 높을수록 최소 올굴 크기를 크게 지정해야한다.

5. 밝고 선명해야한다 DetectFaces를 사용하여 얼굴의 밝기와 선명도를 파악할 수 있으니 참조 하길 바란다.

6. 헤드밴드나 마스크 등으로 가리지 않도록 해야한다.

 

로컬 이미지 이미지 바이트로 레이블 감지

- Image 입력 파라미터를 사용하여 이미지 바이트를 Rekognition API 작업에 전달 해야한다

Image - com.amazonaws.services.rekognition.model.Image 패키지 이며, 바이트 또는 S3객체로 입력 이미지를 제공한다.

바이트 사용시 - 최대 5mb의 이미지 바이트 / 유형 : Base64로 인코딩 된 바이너리 데이터 개체 / 길이 제한 조건 : 최소 길이 1 최대길이 5242880

S3객체 사용시 - S3객체를 이미지 소스로 식별 / 유형 : S3Object 객체

- Image에서 Bytes 속성을 지정하여 base64로 인코딩된 이미지 바이트를 전달한다.(aws java sdk 사용시 인코딩 필요없다 또한 s3객체 사용시에도)

 

기본적인 예제 코드

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.List;
 
import org.junit.Test;
 
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClient;
import com.amazonaws.services.rekognition.model.AmazonRekognitionException;
import com.amazonaws.services.rekognition.model.DetectLabelsRequest;
import com.amazonaws.services.rekognition.model.DetectLabelsResult;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.Label;
import com.amazonaws.util.IOUtils;
// 위에는 여기서 사용한 패키지 
@Test
    public void test() throws FileNotFoundException, IOException {
        // 로컬 파일 경로
        String filePath = "C:/Users/11h11m/Desktop/zz/5054000478s.jpg";
        
        // 인풋스트림에 파일 추가
        ByteBuffer imageBytes;
        try (InputStream inputStream = new FileInputStream(new File(filePath))) {
            imageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream));
        }
 
        // AmazonRekognition - Amazon Rekognition에 액세스하기위한 인터페이스
        // AmazonRekognitionClient aws 계정 연동을 위한
        AmazonRekognition rekognitionClient = new AmazonRekognitionClient(new BasicAWSCredentials("accessKey", "secretKey"));
 
        // AmazonWebServiceRequest를 상속 받고 있음
        DetectLabelsRequest request = new DetectLabelsRequest()
                .withImage(new Image() // 입력 이미지는 base64로 인코딩 된 바이트 또는 S3 객체입니다
                        .withBytes(imageBytes))
                .withMaxLabels(10) // 서비스에서 응답으로 반환 할 최대 레이블 수입니다.
                .withMinConfidence(77F); // 레이블이 반환 할 최소 정확도 수준을 지정합니다.
 
        try {
            // AmazonWebServiceResult<ResponseMetadata> 상속 받고 있음
            DetectLabelsResult result = rekognitionClient.detectLabels(request); // 입력으로 제공된 이미지 (JPEG 또는 PNG) 내의 실제 엔티티 인스턴스를 감지
            List <Label> labels = result.getLabels(); // 레이블 뽑기
 
            System.out.println("파일 위치" + filePath);
            for (Label label: labels) {
               // getName 은 레이블 즉 객체 추출한 명 , getConfidence().toString()은 레이블의 정확도
               System.out.println(label.getName() + ": " + label.getConfidence().toString());
            }
 
        } catch (AmazonRekognitionException e) {
            e.printStackTrace();
        }
    }

 

S3 버킷으로 이미지 레이블 감지 테스트코드

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.List;
 
import org.junit.Test;
 
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClient;
import com.amazonaws.services.rekognition.model.AmazonRekognitionException;
import com.amazonaws.services.rekognition.model.DetectLabelsRequest;
import com.amazonaws.services.rekognition.model.DetectLabelsResult;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.Label;
import com.amazonaws.services.rekognition.model.S3Object;
import com.amazonaws.util.IOUtils;
// 위에는 여기서 사용한 패키지 참조할것
@Test
    public void test() throws FileNotFoundException, IOException {
        // s3 버킷명 이랑 s3 객체 키값
        String bucket = "common01";
        String s3Key = "script02/12345678/img/lighthouse.jpg";        
 
        // AmazonRekognition - Amazon Rekognition에 액세스하기위한 인터페이스
        // AmazonRekognitionClient aws 계정 연동을 위한
        AmazonRekognition rekognitionClient = new AmazonRekognitionClient(new BasicAWSCredentials("accessKey", "secretKey"));
        // s3 버킷 리전과 rekognition image 작업 리전이 같아야하므로 엔드포인트 
        rekognitionClient.setEndpoint("rekognition.ap-northeast-2.amazonaws.com");
 
        // AmazonWebServiceRequest를 상속 받고 있음
        DetectLabelsRequest request = new DetectLabelsRequest()
                .withImage(new Image() // 입력 이미지는 base64로 인코딩 된 바이트 또는 S3 객체입니다
                        .withS3Object(new S3Object() // s3Object 를 사용 버킷명과 키값을 적용
                        .withName(filePath).withBucket(bucket)))
                .withMaxLabels(10) // 서비스에서 응답으로 반환 할 최대 레이블 수입니다.
                .withMinConfidence(77F); // 레이블이 반환 할 최소 정확도 수준을 지정합니다.
 
        try {
            // AmazonWebServiceResult<ResponseMetadata> 상속 받고 있음
            DetectLabelsResult result = rekognitionClient.detectLabels(request); // 입력으로 제공된 이미지 (JPEG 또는 PNG) 내의 실제 엔티티 인스턴스를 감지
            List <Label> labels = result.getLabels(); // 레이블 뽑기
 
            for (Label label: labels) {
               // getName 은 레이블 즉 객체 추출한 명 , getConfidence().toString()은 레이블의 정확도
               System.out.println(label.getName() + ": " + label.getConfidence().toString());
            }
 
        } catch (AmazonRekognitionException e) {
            e.printStackTrace();
        }
    }

 

이미지에 있는 텍스트 레이블 감지 테스트코드

 

ISO 라틴 문자어만 가능하다 즉 서유럽 언어만 가능하다는 점이다.... 그리고 숫자 , @ / $ % * + = - 같은 일반 기호도 감지할 수 있다 (한글이 아니면 무슨소용..ㅜ 점점 언어를 늘려간다니깐 기달려야할거같다...)

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.List;
 
import org.junit.Test;
 
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClient;
import com.amazonaws.services.rekognition.model.AmazonRekognitionException;
import com.amazonaws.services.rekognition.model.DetectTextRequest;
import com.amazonaws.services.rekognition.model.DetectTextResult;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.TextDetection;
import com.amazonaws.util.IOUtils;
// 위에는 여기서 사용한 패키지 참조할것
@Test
    public void test() throws FileNotFoundException, IOException {
        // 파일명
        String filePath = "C:/Users/11h11m/Desktop/zz/5054000478s.jpg";    
 
        // 인풋스트림에 파일 추가
        ByteBuffer imageBytes;
        try (InputStream inputStream = new FileInputStream(new File(filePath))) {
            imageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream));
        }
 
        // AmazonRekognition - Amazon Rekognition에 액세스하기위한 인터페이스
        // AmazonRekognitionClient aws 계정 연동을 위한
        AmazonRekognition rekognitionClient = new AmazonRekognitionClient(new BasicAWSCredentials("accessKey", "secretKey"));
 
        // AmazonWebServiceRequest를 상속 받고 있음
        DetectTextRequest request = new DetectTextRequest()
                .withImage(new Image()
                        .withBytes(imageBytes));
        try {
            // AmazonWebServiceResult<ResponseMetadata> 상속 받고 있음
            DetectTextResult result = rekognitionClient.detectText(request); // 입력으로 제공된 이미지 (JPEG 또는 PNG) 내의 실제 엔티티 인스턴스를 감지
            List<TextDetection> texts = reText.getTextDetections(); // 텍스트 추출
 
            System.out.println("파일 위치" + filePath);
            for (TextDetection text: texts) {         
                    // 감지된 텍스트
                    System.out.println("Detected: " + text.getDetectedText());
                    // 정확도
                    System.out.println("Confidence: " + text.getConfidence().toString());
                    // 단어와 줄의 관계(Id 및 ParentId)
                    System.out.println("Id : " + text.getId());
                    // 단어와 줄의 관계(Id 및 ParentId)
                    System.out.println("Parent Id: " + text.getParentId());
                    // 이미지에서 텍스트의 위치(Geometry)
                    System.out.println("Geometry: " + text.getGeometry());
                    // 감지된 텍스트(Type)의 유형
                    System.out.println("Type: " + text.getType());
                    System.out.println();
            }
 
        } catch (AmazonRekognitionException e) {
            e.printStackTrace();
        }
    }

   관련 글

 

저의 글을 읽어 주셔서 감사합니다. 오늘도 즐거운 하루 보내세요.

저의 글이 조금이나마 도움이 되셨다면 로그인이 필요 없는 공감♥ 한번 꾸욱 눌러주세요 하하~

728x90