필자는 팀프로젝트로 OnePIC이라는 카메라 앱을 구현하였고, 다양한 공모전에 참여하였습니다.
이 과정에서 필자가 구현한 베스트 사진 추천에 대해 간단하게 설명하고자한다.
베스트 사진 추천
베스트 사진 추천이란, All-in JPEG 파일 속 전체 이미지들 중에서 가장 잘 나온 사진을 추천하는 기능이다.
해당 기능에 대한 설명과 기능을 어떻게 구현하였는지에 관해 간단하게 설명하고자한다.
베스트 사진 추천은 BestPictureRanking 알고리즘을 통해 구현하였다. BestPictureRanking 알고리즘은 다음과 같다.
BestPictureRanking 알고리즘
BestPictureRanking 알고리즘 일반적으로 사람들은 흔들리지 않고 정확하게 찍힌 사진이나, 사진 속 인물이 모두 눈을 뜨고 웃고 있는 사진을 베스트 사진으로 여긴다. BestPictureRanking 알고리즘은 이러한 기준에 맞춰 베스트 사진을 찾아낸다. BestPictureRanking 알고리즘은 다음 그림 1과 같다.

Best Picture Ranking 알고리즘을 핵심은 다음과 같다. All-in JPEG 파일에 들어있는 모든 사진에 대해, 눈을 뜬 정도(𝑒), 웃고 있는 정도(ℎ), 사진 선명도(𝑠)를 계산하고, 식(1)과 같이 가중치와 결합하여 점수를 매긴 뒤, 점수가 제일 높은 한 장을 베스트 사진으로 결정한다.
All-in JPEG 파일에 들어있는 𝑖 번째 사진의 𝑠𝑐𝑜𝑟𝑒𝑖는 식(1)로 계산한다.

여기서 𝑤𝑒, 𝑤ℎ, 𝑤𝑠는 각 𝑒,ℎ,𝑠의 가중치 값으로 표 1과 같다.

𝑒, ℎ, 𝑠의 가중치가 표 1과 같이 설정된 기준을 설명하면 다음과 같다.
좋은 사진을 결정할 때 사진 선명도(흔들리지 않은 정도)와 웃고 있는 정도, 눈을 뜬 정도를 동일한 비율로 적용할 수 없기 때문에 해당 값의 중요도를 뜻하는 가중치를 서로 다르게 설정하였다.
사진 선명도(흔들린 정도)가 심하면 아무리 눈을 뜬 정도(𝑒), 웃고 있는 정도(ℎ)가 높다고 할지라도 좋은 사진으로 판정할 수는 없다. 그러므로 사진 선명도(𝑠)의 가중치를 0.5로 결정한다. 또한 눈을 뜬 사진이 웃고 있는 사진보다 좋은 사진으로 여겨지므로 눈을 뜬 정도(𝑒)의 가중치를 0.3으로, 웃고 있는 정도(ℎ)의 가중치를 0,2로 결정한다. 이러한 가중치 값은 아직 최적의 값은 아님을 분명히 밝혀 둔다.
그림 2는 BestPictureRanking 알고리즘 설명에 사용될 샘플로서, 네 명이 연속 촬영된 3개의 이미지가 담겨있는 All-in JPEG 파일로, 흔들린 사진과 눈감은 사진, 눈 뜨고 흔들리지 않은 사진이 함께 저장되어 있다. BestPictureRanking 알고리즘의 자세한 처리 과정을 그림 2에서 눈 뜨고 흔들리지 않은 사진을 베스트 사진으로 추천해 주는 과정과 함께 설명한다. 추가로 이미지들에 대해 이야기할 때 왼쪽부터 0, 1, 2번째 사진이라 칭한다.

[단계1] MLKit 라이브러리를 통한 얼굴 분석
머신러닝 모델을 제공하는 MLKit 라이브러리에서 얼굴 감지(Face Detection) 모델을 통해 사진 속 얼굴을 분석한다. 사진 분석 결과로 얼굴마다 다음 3가지 얼굴 특징값(Feature probabilities)정보를 알려준다. 얼굴 특징값은 다음과 같으며, 샘플 사진인 그림 2의 두 번째 이미지를 얼굴 감지 모델을 통해 분석하면 그림 3와 같은 얼굴 특징값이 나타난다.
- 오른쪽 눈을 뜬 정도(Right eye open) : 𝑟𝑒 ( 0 ≤ 𝑟𝑒 ≤ 1)
- 왼쪽 눈을 뜬 정도(Left eye open) : 𝑙𝑒 ( 0 ≤ 𝑙𝑒 ≤ 1)
- 웃은 정도 값(Smiling) : 𝑠𝑚 ( 0 ≤ 𝑠𝑚 ≤ 1)

[단계 2] 𝒆 (눈을 뜬 정도) 결정
사진 속 𝑗번째 얼굴을 𝑓𝑗라 하고, 𝑒𝑓𝑗 는 𝑓𝑗의 𝑟𝑒(오른쪽 눈을 뜬 정도)와 𝑙𝑒(왼쪽 눈을 뜬 정도) 중 큰 값으로 결정한다. 𝑖번째 사진의 눈 뜬 정도 𝑒i는 식(2)을 통해 해당 사진 속 모든 얼굴 𝑒𝑓𝑗 의 평균으로 결정한다.

4명이 촬영된 All-in JPEG 샘플 그림 2의 두 번째 이미지의 눈 뜬 정도 𝑒2는 다음 식과 같이 계산된다.
𝑒2= (0.85 + 0.93 + 0.84 + 0.98)÷4=0.900
[단계 3] 𝒉 (웃고 있는 정도) 결정
ℎ𝑓𝑗 는 𝑓𝑗의 𝑠𝑚(웃고 있는 정도) 값으로 결정한다. 𝑖번째 이미지의 웃고 있는 정도 ℎ𝑖는 식(3)을 통해 해당 사진 속 모든 얼굴 ℎ𝑓𝑗 의 평균으로 결정한다.

4명이 촬영된 All-in JPEG 샘플 그림 2의 두 번째 이미지의 웃고 있는 정도를 ℎ2는 다음 식과 같이 계산된다.
ℎ2= (0.12+0.73+0.14+0.98)÷4=0.492
[단계 4] 𝒔 (사진이 선명도) 결정
i번째 사진의 𝑠를 𝑠𝑖라 하고, 𝑠𝑖는 OpenCV의 Laplacian 필터를 통해 윤곽선을 알아낸 후, 윤곽이 뚜렷한 정도를 의미하는 샤프니스 값으로 결정한다. 𝑠𝑖은 음수부터 양수까지 다양한 범위의 값이므로, 식(4)를 통해 0과 1 사이의 값으로 정규화한다.

4명이 촬영된 All-in JPEG 샘플 그림 2에서 각 이미지의 선명도가 𝑠0=2.43, 𝑠1=−6.54, 𝑠2= 25.3인 경우, 두 번째 이미지의 선명도(흔들린 정도) 𝑠2는 다음 식과 같이 0과 1 사이의 값으로 정규화한다. 𝑠2 = 25.23 − 2.43 25.32 − 2.43 =1
[단계 5] 각 사진의 𝒔𝒄𝒐𝒓𝒆 결정 및 사진 추천
i번째 사진의 𝑠𝑐𝑜𝑟𝑒을 𝑠𝑐𝑜𝑟𝑒𝑖라 하고, 각 추천 기준(𝑒𝑖,ℎ𝑖,𝑠𝑖)과 이에 따른 가중치(𝑤𝑒,𝑤ℎ,𝑤𝑠)를 통해 식(1)과 같이 각 사진의 𝑠𝑐𝑜𝑟𝑒𝑖를 결정한다. 모든 𝑠𝑐𝑜𝑟𝑒 계산 후, 𝑠𝑐𝑜𝑟𝑒가 가장 높은 사진을 베스트 사진으로 추천한다. 표 2는 샘플 사진 그림 2를 통해 결정된 𝑠𝑐𝑜𝑟𝑒 계산에 사용된 값들을 보여준다.

'OnePIC (Android App) > 사진 편집 기능' 카테고리의 다른 글
[기능 설명] 얼굴 블렌딩 (5) | 2024.11.16 |
---|---|
Tensorflow Lite를 이용한 객체 감지 (Segmentation) (0) | 2024.01.23 |
Segmentation 이란? (0) | 2024.01.23 |
[얼굴 변경 :Face Blending] 얼굴 잘라서 사진 위에 합성 (2) | 2023.12.26 |
[얼굴 변경 :Face Blending] 두 사진에서 동일 얼굴 찾기 (0) | 2023.12.26 |