AWS Rekognition

최준호·2022년 8월 16일
0

AWS

목록 보기
7/10
post-thumbnail

참고 AWS 공식 문서
참고 AWS Rekognition git-hub

👏 AWS Rekognition이란?

Amazon에서 제공하는 Rekognition은 application에 이미지 및 비디오 분석을 쉽게 추가할 수 있다. 내가 하려는 작업은 이미지가 사람인지 아닌지 구부하는 분석을 해보려고 한다.

Amazon의 컴퓨터 과학자들이 매일 수십억 개의 이미지와 비디오를 매일 분석할 목적으로 개발하여 검증되고 확장성이 뛰어난 딥 러닝 기술을 기반으로 하고 있고 머신 러닝 전문 지식이 필요하지 않고 S3에 저장된 이미지 또는 비디오 파일을 분석할 수 있는 간편하고 사용하기 쉬운 API가 포함되어 있다.

📗 프로젝트에 적용하기

📄 gradle 추가

implementation platform('software.amazon.awssdk:bom:2.17.230')
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:rekognition'

📄 Config 파일 작성

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import lombok.RequiredArgsConstructor;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;

@Configuration
@RequiredArgsConstructor
public class RekognitionClientConfig {
    private final Environment env;

    @Bean
    public RekognitionClient getRekognitionClient(){
        AwsBasicCredentials credentials = AwsBasicCredentials.create(env.getProperty("cloud.s3.access-id"), env.getProperty("cloud.s3.secret-key"));
        
        return RekognitionClient.builder()
        .region(Region.AP_NORTHEAST_2)
        .credentialsProvider(StaticCredentialsProvider.create(credentials))
        .build();
    }
}

s3에서 사용하는 사용자 id와 key 동일하여 다음과 같이 사용했다.

📄 소스 작성

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;

import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import lombok.extern.slf4j.Slf4j;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.DetectLabelsRequest;
import software.amazon.awssdk.services.rekognition.model.DetectLabelsResponse;
import software.amazon.awssdk.services.rekognition.model.Image;
import software.amazon.awssdk.services.rekognition.model.Label;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.S3Object;

@Service
@Slf4j
public class S3V3ServiceImpl implements S3V3Service{
    private S3Client s3Client;
    private String bucketName;
    private RekognitionClient rekognitionClient;
    private S3Dao s3Dao;

    ...

    @Override
    public void detectLablesS3(String path) {
        software.amazon.awssdk.services.rekognition.model.S3Object s3Object = software.amazon.awssdk.services.rekognition.model.S3Object.builder()
        .bucket(bucketName)
        .name(path)
        .build();
        
        Image image = Image.builder()
                        .s3Object(s3Object)
                        .build();
        
        DetectLabelsRequest detectLabelsRequest = DetectLabelsRequest.builder()
        .image(image)
        .maxLabels(10)
        .build();

        DetectLabelsResponse response = rekognitionClient.detectLabels(detectLabelsRequest);
        List<Label> labels = response.labels();
        for(Label label : labels){
            log.debug(label.toString());
        }
    }
}

코드는 다음과 같이 작성했다. 여기서 주의 할 점은 S3Object가 S3 라이브러리를 import해서 사용하는 것이 아닌 rekognition을 import해서 사용해야한다는 것이다.

😂 에러 발생!

진행하던 도중 에러가 발생해서 좀 많이 헤맸다... 내가 발생한 에러는

software.amazon.awssdk.services.rekognition.model.AccessDeniedException: User: arn:aws:iam::566238214173:user/s3-manage is not authorized to perform: rekognition:DetectLabels because no identity-based policy allows the rekognition:DetectLabels action

다음 에러가 발생했으며 이유는 에러 그대로 권한을 설정하지 않아서이다. 권한은 AWS에서 설정해야하는데 iam -> 기존 s3에 접근하고 있던 사용자 그리고 권한 추가를 클릭하여 rekognition의 권한을 추가 해주어야한다.

권한 추가를 누르고

상황에 알맞은 권한을 넣으면 된다. 나의 경우 테스트 용으로 모든 권한을 허용하는 정책을 설정했다.

📄 테스트

url을 만들어서 요청을 했다.

테스트 전 S3에 여성 사람 사진을 구글에서 다운받아 저장해두었다.

결과는 다음과 같이 사진에 대한 분석 결과가 list로 반환된다.

📄 반환 객체 담아보기

👏 정리

S3에 저장된 이미지를 Rekognition을 통하여 분석하는 학습을 진행해보았다. 결과 적으로 label안에 사람 사진일 경우 Person과 같은 value값을 반환해주어서 이 결과를 사용하여 분석한 결과를 이용하면 될거 같다!

@Service
@Slf4j
public class S3V3ServiceImpl implements S3V3Service{
    
    ...

    @Override
    public void detectLablesS3(String path) {
        software.amazon.awssdk.services.rekognition.model.S3Object s3Object = software.amazon.awssdk.services.rekognition.model.S3Object.builder()
        .bucket(bucketName)
        .name(path)
        .build();
        
        Image image = Image.builder()
                        .s3Object(s3Object)
                        .build();
        
        DetectLabelsRequest detectLabelsRequest = DetectLabelsRequest.builder()
        .image(image)
        .maxLabels(10)
        .build();

        DetectLabelsResponse response = rekognitionClient.detectLabels(detectLabelsRequest);
        List<Label> labels = response.labels();

        log.debug(labels.toString());

        boolean result = labels.stream().anyMatch(label -> {
            if(label.name().equals("Person") || label.name().equals("Human")) return true;
            return false;
        });

        log.debug("사람인지 여부 : {}", result);
    }
}

나의 경우 마지막에서 사람인지 판단하기 위한 여부를 다음과 같이 코드를 작성했다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글