물체인식 AI 기능을 사용하기 위한 방법을 찾던 중, AWS에 Rekognition이라는 이미지/비디오 실시간 분석 기능이 있다는 걸 알게되어 사용해보았다.
https://ap-northeast-2.console.aws.amazon.com/rekognition/home?region=ap-northeast-2#/
Amazon Rekognition을 사용하기 위한 IAM 사용자를 만든다.
생성 중 권한 설정에서 rekognition 관련 권한을 설정해주었다.

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

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

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 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;
}
}
});
}
}