AWS - Amazon Rekognition

유의선·2024년 11월 25일

물체인식 AI 기능을 사용하기 위한 방법을 찾던 중, AWS에 Rekognition이라는 이미지/비디오 실시간 분석 기능이 있다는 걸 알게되어 사용해보았다.

https://ap-northeast-2.console.aws.amazon.com/rekognition/home?region=ap-northeast-2#/


IAM 사용자 만들기

Amazon Rekognition을 사용하기 위한 IAM 사용자를 만든다.
생성 중 권한 설정에서 rekognition 관련 권한을 설정해주었다.

그 후 생성된 사용자에서 권한 키를 생성한다.

키를 생성하면 액세스 키와 비밀 액세스 키 값을 얻을 수 있다.


Amazon Rekognition

dependencies 추가

build.gradle에 의존성을 추가한다.

dependencies {
	...

    implementation("com.amazonaws:aws-android-sdk-iot:2.54.0")
    implementation("com.amazonaws:aws-android-sdk-rekognition:2.54.0")
}

권한 추가

AndroidManifest.xml 에 권한을 추가한다.
AWS 서비스에 연결하기 위한 인터넷 권한과, 분석할 사진을 찍을 카메라 권한을 추가하였다.

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    <uses-permission android:name="android.permission.CAMERA" />

AmazonRekognitionClient 생성

위에서 얻은 액세스 키와 비밀 액세스 키를 사용해 AmazonRekognitionClient를 생성한다.

        AmazonRekognitionClient rekognitionClient;
        
        try {
            BasicAWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
            rekognitionClient = new AmazonRekognitionClient(awsCredentials);
            rekognitionClient.setRegion(com.amazonaws.regions.Region.getRegion(Regions.AP_NORTHEAST_2));
        } catch (Exception e) {
            Log.e(TAG, "Error in AWSCredentials : ", e);
        }

해당 방법은 테스트용으로 사용한 방법으로 실제로 사용하기엔 보안적으로 취약할 수 있다.

이미지 분석 결과 받기

위에서 만든 AmazonRekognitionClient를 사용하여 JPEG 데이터를 넘겨주고 인식된 물체 이름과, BoundingBox 데이터를 받는 코드이다.

	private ExecutorService executorService;
    private boolean isProcessing = false;
    
    public void detectRequest(byte[] jpegDate) {

        ArrayList<String> items = new ArrayList<>();
        List<BoundingBox> boundingBoxes = new ArrayList<>();

        DetectLabelsRequest request = new DetectLabelsRequest()
                .withImage(new Image().withBytes(ByteBuffer.wrap(jpegDate)))
                .withMaxLabels(MAX_LABELS)  // 감지할 객체 수
                .withMinConfidence(MIN_CONFIDENCE);    // 최소 신뢰도

        if(!isProcessing){
            isProcessing = true;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        DetectLabelsResult result = rekognitionClient.detectLabels(request);
                        List<Label> labels = result.getLabels();

                        for(Label label : labels){
                            items.add(label.getName());

                            for(Instance instance : label.getInstances()) {
                                BoundingBox box = instance.getBoundingBox();
                                boundingBoxes.add(box);
                            }

                            Log.i(TAG, "Label: " + label.getName() + ", Confidence: " + label.getConfidence().toString());
                        }

                        Log.i(TAG,"Box Count : " + boundingBoxes.size());
                        Log.i(TAG,"------------------------------------------------");

                    } catch (Exception e) {
                        Log.e(TAG, "Error detecting labels : ", e);
                    } finally {
                        isProcessing = false;
                    }
                }
            });
        }
    }

0개의 댓글