2018년 8월 6일 월요일

내가 왓챠플레이를 만든다면 - 개인별 예고편

내가 왓챠플레이를 만든다면, 특히 예고편을 만든다면 어떤 단계를 거쳐야 할까 좀 더 생각해 보았다.

일단 영상 전체에서 각 장면을 구분해야 된다. 장면이 구분되고 나서야 그 장면이 어떤 성격이고, 사용자 취향에 맞는지 어떤지 판단할 수 있다.
장면을 정의한다면, 영상이란 프레임의 연속이고, 각 프레임마다 분석해서 프레임의 성격이 크게 바뀌는 시점마다 나누었을 때 그 조각들을 장면이라고 할 수 있다.

가장 먼저, 프레임을 나누어야 한다. 간단하게 ffmpeg 명령을 써서 동영상을 이미지 파일로 저장했다.
$ ffmpeg -i 동영상파일 -r 1 -f image2 image-%4d.jpeg
저장된 이미지들을 분석해서 어떤 성격인지 구분하는 건 tensorflow의 이미지 인식 튜토리얼에 있는 classify_image.py를 써보았다.
$ pip3 install tensorflow # tf 미설치 상태라면
$ git clone https://github.com/tensorflow/models
$ cd models/tutorials/image/imagenet/
$ for f in image*.jpeg; do logfile=output.$(basename $f); python3 classify_image.py --image_file=$f > $logfile; done

사실 tensorflow보다 먼저 떠오른 건 Google의 Vision API였지만, 분석할 갯수가 아주 많은데 외부 API를 쓴다는 건 시간과 비용면에서 도저히 선택할 수 없는 방법이어서 접었다. tensorflow는 희미한 개념만 알 뿐 잘 다뤄본 적이 없어서, 아마 결과물의 품질이나 신뢰도가 높지는 않을 거라고 생각하지만, 일단 샘플이니까.

한참 돌아가고 나면 output.* 파일에 아래와 같이 그 이미지의 속성이 분석된 걸 확인할 수 있다.
$ cat output.image-1000.jpeg
sewing machine (score = 0.59451)
restaurant, eating house, eating place, eatery (score = 0.04678)
tank, army tank, armored combat vehicle, armoured combat vehicle (score = 0.02917)
desk (score = 0.02453)
dining table, board (score = 0.01770)
$ cat output.image-1713.jpeg
sock (score = 0.22062)
sandal (score = 0.17339)
clog, geta, patten, sabot (score = 0.15232)
shoe shop, shoe-shop, shoe store (score = 0.01656)
Loafer (score = 0.01599)

이제 이 파일들을 시간순으로 비교해서 연속된 장면인지 아닌지 판단할 차례인데, 어떤 방법을 써야 좋을지 잘 모르겠다. 처음부터 비지도 학습으로 막 계산만 하는 건 적절하지 않으니 초반에는 지도 학습을 위해 프레임이 장면으로 분절되는 걸 사람이 인식할 수 있는 형태로 보여줘야 할 텐데, 그러려면 시각화 방법 중에 어떤 걸 써야 하는 걸까?
그리고 score가 너무 낮은 건 그 프레임이 어떤 장면인지 파악할 때 영향이 낮게 계산되어야 할 텐데 얼마나 낮아야 낮은 건지도 사람이 개입해야 하는 지점일 것 같다.

word2vec 정도를 가져와서 돌려보면 뭔가 결과가 나올 것 같긴 한데, 이것도 개념만 대충 알고 다뤄본 적은 없어서 잘 모르겠다.