이전 글 보기: AWS Rekognition + PHP를 이용한 이미지 분석 예제 (1/2)



Overview

지난 글에서는 AWS Rekognition을 이용해 S3 Bucket에 업로드한 이미지로 이미지 분석 결과를 확인했습니다. 이번엔 더 나아가 Collection(얼굴 모음)을 생성해보고, 얼굴 검색을 해보겠습니다.




1. Collection 만들기

Collection은 AWS Rekognition의 기본 리소스입니다., 생성되는 각각의 컬렉션에는 고유의 Amazon 리소스 이름(ARN)이 있습니다. 컬렉션이 있어야 얼굴들을 저장할 수 있습니다. 저는 ‘BrandiLabs’라는 이름의 Collection을 생성했습니다.

1-1. createRekognition 메소드를 이용해 손쉽게 Collection 을 생성합니다.

# 클라이언트 생성
$sdk = new \\Aws\\Sdk($sharedConfig);
$rekognitionClient = $sdk->createRekognition();

# 모음(Collection) 이름 설정
$collection = array('CollectionId' => 'BrandiLabs');
$response = $rekognitionClient->createCollection($collection);



1-2. Collection이 정상적으로 생성되었다면 아래와 같은 응답을 받습니다.

[
    {
        "StatusCode" : 200
        "CollectionArn" : "aws:rekognition:region:account-id:collection/BrandiLabs"
        /*...*/
    }
]




2. Collection에 얼굴 추가

IndexFaces 작업을 사용해 이미지에서 얼굴을 감지하고 모음에 추가할 수 있습니다. (JPEG 또는 PNG) 모음에 추가할 이미지에 대해서는 몇 가지의 권장사항[1]이 있습니다.

  1. 두 눈이 잘 보이는 얼굴 이미지를 사용합니다.
  2. 머리띠, 마스크 등 얼굴을 가리는 아이템을 피합니다.
  3. 밝고 선명한 이미지를 사용합니다.

권장사항에 최적화된 사진은 S3 Bucket 에 업로드되어 있어야 합니다. 미리 ‘kimwk-rekognition’ 이라는 이름으로 버킷을 생성 후 제 사진과 곽정섭 과장님의 사진을 업로드해두었습니다.

01


2-1. IndexFaces 메소드를 이용해 얼굴을 추가합니다. 예시에서는 제 얼굴과 곽 과장님의 얼굴을 인덱싱했습니다.

$imageInfo = array();
$imageInfo['S3Object']['Bucket'] = 'kimwk-rekognition';
$imageInfo['S3Object']['Name'] = 'kwakjs.jpg';

$parameter = array();
$parameter['Image'] = $imageInfo;
$parameter['CollectionId'] = 'BrandiLabs';
$parameter['ExternalImageId'] = 'kwakjs';
$parameter['MaxFaces'] = 1;
$parameter['QualityFilter'] = 'AUTO';
$parameter['DetectionAttributes'] = array('ALL');

$response = $rekognitionClient->indexFaces($parameter);



각각의 요청 항목에 대한 상세 설명은 아래와 같습니다.

  1. Image : 인덱싱 처리할 사진의 정보입니다.

  2. CollectionId : 사진을 인덱싱할 CollectionId 입니다.

  3. ExternalImageId : 추후 인식할 이미지와 인덱싱된 이미지를 연결할 ID 입니다.

  4. MaxFaces : 인덱싱되는 최대 얼굴 수 입니다. 작은 얼굴(ex. 배경에 서 있는 사람들의 얼굴)은 인덱싱하지 않고 싶을 때 유용합니다.

  5. QualityFilter : 화질을 기반으로 얼굴을 필터링하는 옵션입니다. 기본적으로 인덱싱은 저화질로 감지된 얼굴을 필터링합니다. AUTO를 지정하면 이러한 기본 설정을 명시적으로 선택할 수 있습니다. (AUTO | NONE)

  6. DetectionAttributes : 반환되는 얼굴 정보를 다 가져올 것인지 아닌지에 대한 옵션입니다. ALL 로 하면 모든 얼굴 정보를 받을 수 있지만 작업을 완료하는데 시간이 더 걸립니다. (DEFAULT | ALL)

2-2. Collection에 정상적으로 얼굴이 추가되었다면 아래와 같은 응답을 받습니다. 사진 속 인물의 성별, 감정, 추정 나이 등의 정보를 확인할 수 있습니다.

[  
   {  
      "Face":{  
         "FaceId":"face-id",
         "BoundingBox":{  
            "Width":0.28771552443504333,
            "Height":0.3611610233783722,
            "Left":0.39002931118011475,
            "Top":0.21431422233581543
         },
         "ImageId":"image-id",
         "ExternalImageId":"kimwk",
         "Confidence":99.99978637695312
      },
      "FaceDetail":{  
         "BoundingBox":{  
            "Width":0.28771552443504333,
            "Height":0.3611610233783722,
            "Left":0.39002931118011475,
            "Top":0.21431422233581543
         },
         "AgeRange":{  
            "Low":20,
            "High":38
         },
         "Smile":{  
            "Value":false,
            "Confidence":85.35209655761719
         },
         "Eyeglasses":{  
            "Value":false,
            "Confidence":99.99824523925781
         },
         "Sunglasses":{  
            "Value":false,
            "Confidence":99.99994659423828
         },
         "Gender":{  
            "Value":"Male",
            "Confidence":99.35176849365234
         },
         "Beard":{  
            "Value":false,
            "Confidence":94.80714416503906
         },
         "Mustache":{  
            "Value":false,
            "Confidence":99.92304229736328
         },
         "EyesOpen":{  
            "Value":true,
            "Confidence":99.64280700683594
         },
         "MouthOpen":{  
            "Value":false,
            "Confidence":99.4529037475586
         },
         "Emotions":[  
            {  
               "Type":"HAPPY",
               "Confidence":2.123939275741577
            },
            {  
               "Type":"ANGRY",
               "Confidence":6.1253342628479
            },
            {  
               "Type":"DISGUSTED",
               "Confidence":19.37765121459961
            },
            {  
               "Type":"SURPRISED",
               "Confidence":7.136983394622803
            },
            {  
               "Type":"CONFUSED",
               "Confidence":30.74079132080078
            },
            {  
               "Type":"SAD",
               "Confidence":9.113149642944336
            },
            {  
               "Type":"CALM",
               "Confidence":25.382152557373047
            }
         ],
         "Landmarks":[  
            {  
               "Type":"eyeLeft",
               "X":0.45368772745132446,
               "Y":0.31557807326316833
            },
						…
         ],
         "Pose":{  
            "Roll":5.615509986877441,
            "Yaw":-5.510941982269287,
            "Pitch":-17.47319793701172
         },
         "Quality":{  
            "Brightness":93.13915252685547,
            "Sharpness":78.64350128173828
         },
         "Confidence":99.99978637695312
      }
   }
]




3. 얼굴 검색

드디어 얼굴 검색의 시간이 왔습니다. searchFacesByImage 메소드를 이용하면 지금까지 그래왔던 것처럼 쉽게 얼굴 검색을 할 수 있습니다. 저는 ‘kimwk2.jpg’ 라는 또 다른 제 얼굴 사진을 S3 Bucket에 업로드해뒀습니다. 얼굴 검색이 제대로 이루어졌다면 응답으로 제 ExternalImageId (kimwk) 가 내려올 것입니다. 한 번 해볼까요?

3-1. searchFacesByImage 메소드를 이용해 얼굴 검색을 합니다.

$imageInfo = array();
$imageInfo['S3Object']['Bucket'] = 'kimwk-rekognition';
$imageInfo['S3Object']['Name'] = 'kimwk2.jpg';

$parameter = array();
$parameter['CollectionId'] = 'BrandiLabs';
$parameter['Image'] = $imageInfo;
$parameter['FaceMatchThreshold'] = 70;
$parameter['MaxFaces'] = 1;

$response = $rekognitionClient->searchFacesByImage($parameter);



3-2. 정상적으로 검색이 되었다면 아래와 같은 응답을 받습니다.

[  
   {  
      "Similarity":99.04029083251953,
      "Face":{  
         "FaceId":"FaceId",
         "BoundingBox":{  
            "Width":0.23038800060749054,
            "Height":0.2689349949359894,
            "Left":0.2399519979953766,
            "Top":0.08848369866609573
         },
         "ImageId":"ImageId",
         "ExternalImageId":"kimwk",
         "Confidence":100
      }
   }
]



SearchFacesByImage는 기본적으로 알고리즘이 80% 이상의 유사성을 감지하는 얼굴을 반환합니다. 유사성은 얼굴이 검색하는 얼굴과 얼마나 일치하는지를 나타냅니다. FaceMatchThreshold 값을 조정하면 어느 정도까지 유사해야 같은 얼굴이라고 허용할지를 정할 수 있습니다.




Conclusion

이미지 분석 알고리즘과 얼굴 검색 기능을 직접 구현하려 했다면 시간이 많이 걸렸겠지만 AWS 서비스를 이용하면 이미지 분석을 금방 할 수 있습니다. 이 기능을 잘 활용하면 미아 찾기나 범죄 예방과 같은 공공 안전 및 법 진행 시나리오에도 응용할 수도 있겠죠. 다음엔 보다 재밌는 주제로 찾아오겠습니다.




참고
[1] 얼굴 인식 입력 이미지에 대한 권장 사항
[2] Amazon Rekonition 개발자 안내서
[3] 모든 예제는 AmazonRekognition, AmazonS3에 대한 권한이 있어야 함


김우경 대리 | R&D 개발1팀
kimwk@brandi.co.kr
브랜디, 오직 예쁜 옷만