참고
AWS 공식 문서
참고
AWS Rekognition git-hub
Amazon에서 제공하는 Rekognition은 application에 이미지 및 비디오 분석을 쉽게 추가할 수 있다. 내가 하려는 작업은 이미지가 사람인지 아닌지 구부하는 분석을 해보려고 한다.
Amazon의 컴퓨터 과학자들이 매일 수십억 개의 이미지와 비디오를 매일 분석할 목적으로 개발하여 검증되고 확장성이 뛰어난 딥 러닝 기술을 기반으로 하고 있고 머신 러닝 전문 지식이 필요하지 않고 S3에 저장된 이미지 또는 비디오 파일을 분석할 수 있는 간편하고 사용하기 쉬운 API가 포함되어 있다.
implementation platform('software.amazon.awssdk:bom:2.17.230')
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:rekognition'
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);
}
}
나의 경우 마지막에서 사람인지 판단하기 위한 여부를 다음과 같이 코드를 작성했다.