kookmin-sw / 2019-cap1-2019_4

Flex Ads to implement advertising system in offline market
MIT License
10 stars 7 forks source link

AWS Rekognition Collection 생성 및 관리 #40

Closed james-sungjae-lee closed 5 years ago

james-sungjae-lee commented 5 years ago

AWS Rekognition 을 이용하여 Face Recognition 작업을 수행하기 위해서는

사전에 얼굴 데이터를 모으고, 콜렉션을 생성한 다음, 해당 얼굴 데이터를 업로드 하는 등의 과정이 필요하다

이를 정리해둘 필요가 있기에 Issue 를 이용해 그 과정을 순차적으로 작성하도록 한다.

james-sungjae-lee commented 5 years ago

1단계 : 얼굴 데이터 수집

Rekognition 을 사용하기 위해서는 먼저 Recognize 하고자 하는 사람의 얼굴 데이터를 수집하여야 한다.

Flex Ads 에서는 미리 만들어둔 Jetson 의 detectnet-camera 의 facenet 모델을 이용하여 사람을 촬영하고,

얼굴 부분만 크롭핑 하여 이미지 데이터로 저장하도록 하였다. 이를 통해 간편하게 얼굴 데이터의 수집이 가능하다

얼굴 데이터를 수집할 때, 몇 가지 주의사항이 있으며 이는 AWS Rekognition Documentation 에서 제공하는

"입력 이미지에 대한 권장 사항" 을 고려하면 된다.

https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/recommendations-facial-input-images.html

이에 따르면 각도에 따라 최소 5장의 이미지를 사용할 것을 권장한다.

Flex Ads 에서는 각도, 표정, 광원 등을 다양화 하여 1인당 40장의 얼굴 이미지 데이터를 수집하였다.

56127834-02148b00-5fb9-11e9-84d6-34a62151506a

james-sungjae-lee commented 5 years ago

2단계 : collection 생성 및 관리

수집된 얼굴 데이터를 Rekognition 에 등록(학습, 인덱싱) 하기 위해서는 collection 을 생성해야 한다.

collection 이란 N 명의 얼굴을 등록하여 클러스터링(인덱싱) 한 얼굴 집합으로 생각할 수 있다.

A, B, C 를 X collection 에 등록하면, X 를 호출하여 새로운 이미지에 A, B, C 가 존재하는지 확인 가능하다

collection 을 생성(create), 나열(list), 설명(describe), 삭제(remove) 하는 것은 문서를 통해 확인 가능하다.

생성 https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/create-collection-procedure.html

나열 https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/list-collection-procedure.html

설명 https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/describe-collection-procedure.html

삭제 https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/delete-collection-procedure.html

collection 의 생성은 되도록 얼굴 이미지를 저장할 S3와 동일 region 에 생성해야 한다.

자신의 프로젝트를 대표하는 이름으로 collection 을 생성하면 된다.

생성 후에는 잘 생성되었는지 나열을 통해 확인하도록 한다.

james-sungjae-lee commented 5 years ago

3단계 : collection 에 얼굴 등록

일반적으로 collection 에 얼굴을 등록하는 과정은 다음과 같다.

Local Face Image -> S3 Upload -> Add to collection

이는 S3 에 얼굴 이미지를 저장하여 안정적인 시스템을 구축하기 위함이며, S3 에서는 다음의 과정이 필요하다

S3 Root 위치에 업로드 -> collection 에 추가 -> S3 업로드 이미지 정리 ( train/ 으로 이동 ) -> 기존이미지 삭제

Documentation 에서 "모음에 얼굴 추가" 에서 확인할 수 있다.

https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/add-faces-to-collection-procedure.html

python 의 boto3 를 이용한 얼굴 추가 방법은 'index_faces' 메소드를 이용하는 것으로 아래와 같이 사용한다.

response=client.index_faces(CollectionId=collectionId,
                            Image={'S3Object':{'Bucket':bucket,'Name':photo}},
                            ExternalImageId=photo,
                            MaxFaces=1,
                            QualityFilter="AUTO",
                            DetectionAttributes=['ALL'])

Image 는 S3 에 저장된 위치이며, ExternalImageId 가 얼굴과 매칭하고자 하는 ID 이다.

Collection 에 얼굴을 추가하는 index_faces 의 작동 원리를 추측하면,

먼저 얼굴을 Detection 한 다음, 해당 얼굴의 특징을 vector 형태로 추출하여 clustering 하는 것으로 보인다

이에 어느 위치에 얼굴이 detection 되었는지에 대한 결과가 response 에 나타난다.

james-sungjae-lee commented 5 years ago

4단계 : 이미지를 이용한 collection 검색

collection 에 얼굴을 등록하는 과정과 마찬가지로, S3 를 거쳐 검색하게 된다.

Local Face Image -> S3 Upload -> Search Collection -> Return ID to Local

Documentation 의 "이미지를 사용하여 얼굴 검색" 에서 확인 가능하다

https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/search-face-with-image-procedure.html

Python Boto3 에서는 SearchFaceByImage 메소드를 이용해 사용 가능하다

response=client.search_faces_by_image(CollectionId=collectionId,
                            Image={'S3Object':{'Bucket':bucket,'Name':fileName}},
                            FaceMatchThreshold=threshold,
                            MaxFaces=maxFaces)

위와 거의 동일하지만, 학습에 필요한 Label 이 할당되지 않는 것을 볼 수 있다.

앞에서 학습시킨 ExternalImageId 를 포함한 얼굴 정보가 반환된다.