# 2 Fri

## GARIGO : Face Mosaic Project

### 유사도 Part 2.

![](https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MZGTtFp3rjMnteeaSdP%2F-MZGWezK0dJVuRMRWXYZ%2Fimage.png?alt=media\&token=1f7cccc6-6b8f-402f-a879-b210d316f6f2)

* 다음과 같은 기준으로 동인 인물로 간주한다고 했다. 이에 대한 구현적인 부분과 한계를 다룬다.

```python
import cv2

ex_hist = []
methods = {'CORREL': cv2.HISTCMP_CORREL, 'CHISQR': cv2.HISTCMP_CHISQR,
     'INTERSECT': cv2.HISTCMP_INTERSECT,
     'BHATTACHARYYA': cv2.HISTCMP_BHATTACHARYYA}
     
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
cv2.normalize(hist, hist, 0, 1, cv2.NORM_MINMAX)
if len(ex_hist) == 0:
    ex_hist = hist

similarity = cv2.compareHist(ex_hist, hist, methods['CORREL'])
ex_hist = hist

if similarity < 0.9:
  similarity2, _ = structural_similarity(ex_frame, image, full= True, multichannel=True)
  if similarity2 < 0.7:
    pass
  else:
    similarity = 1

ex_frame = image
```

* 1 : cv2에 있는 유사도 함수를 사용하기 위함이다
* 3 : 이전 프레임을 기억하기 위한 변수
* 4: 다음과 같은 유사도 비교 함수들이 존재한다. 이 중 두 함수는 1에 가까워야 유사하고 나머지 두 함수는 0에 가까워야 유사하다. 자세한 내용은 [여기](https://bkshin.tistory.com/entry/OpenCV-12-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%9C%A0%EC%82%AC%EB%8F%84-%EB%B9%84%EA%B5%90-%EC%82%AC%EB%9E%8C-%EC%96%BC%EA%B5%B4%EA%B3%BC-%ED%95%B4%EA%B3%A8-%ED%95%A9%EC%84%B1-%EB%AA%A8%EC%85%98-%EA%B0%90%EC%A7%80-CCTV)를 참고하라
* 8\~10 : 히스토그램을 계산하고 정규화한다
* 11 : 이전 장면이 없을 경우(첫 프레임) 예외 처리
* 17 : 유사도가 0.9이하 일경우 비슷한 이미지로 간주하지 않겠다는 뜻이다.
* 19 : 아래에서 설명

### structural\_similarity

* 이 때 opencv 함수를 사용해 유사도를 비교하면 간혹 굉장히 비슷한 장면인데도 유사도가 다르게 나올 때가 있다.
  * 마치 딥페이크 블락 기술과 비슷한걸까?
* 이 때 한번더 검증을 하기 위해 `skimage.metrics` 에서 제공하는 모듈을 사용한다. 이 모듈이 좀 더 정확하고 정밀한 유사도 결과를 출력한다.
  * 아니 그러면 그냥 이거 쓰면 되잖아?
  * 그만큼 오래걸린다. 상당히 오래걸린다. 따라서 첫번째 유사도 비교에서 탈락했을 경우만 적용한다.
    * 영상은 비슷한 장면들의 연속체이다.

```python
from skimage.metrics import structural_similarity
```

{% file src="<https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MZGTtFp3rjMnteeaSdP%2F-MZGYe9Wd5b3U8_jkn9x%2F%EB%AF%B8%EB%94%94%EC%96%B42.mp4?alt=media&token=17ed08dc-d5a3-4f73-878b-5ffb7e35b397>" %}

* 이는 결과 파일이다. (동영상으로 나왔으면 깔끔했을텐데..)

####

### 한계

* 바로 이전 프레임에는 적용하지 못했다는 것이다.
  * (인식 못함) - (김종국) - (인식 못함) 의 경우에는
  * (인식 못함) - (김종국) - (김종국) 으로 개선되지만 이전 프레임은 개선되지 못한다.
* 이를 개선하려면 유사도가 비슷한 장면들간의 모든 얼굴좌표를 기억해야 한다.
  * 프로젝트 완성 기한이 다가와서 구현하지 못했지만 구현해보고 싶은 부분이다.

![](https://2275555537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNN4u9o9noCQwX8pO35%2F-MZGTtFp3rjMnteeaSdP%2F-MZGZH1QVZY4FTDhFTcR%2Fimage.png?alt=media\&token=7d14c1da-a039-4cc2-9fa8-81a4f97a3a8d)

* 이는 한 인물에 대해 여러 사진을 학습했을 때의 작동 방식과 동일한데, 각 프레임마다 인식 미인식 여부를 조사하고 특정 threshold값보다 인식 비율이 높다면 유사도가 비슷한 전체 프레임의 얼굴을 인식하는 것으로 결정한다.
