Page 105 - 대건고 2022 교지
P. 105
유튜브 썸네일 파인더의 검색엔진을 만들면서 성능개선에 힘썼습니다. 가장 이상적인 분석
방법이 모든 프레임을 분석하여 최적의 결과를 얻어내는 것으로 생각할 수 있습니다. 그러나
이러한 방식은 족히 몇 분이 걸리는 작업을 수행합니다. 이때 저는 Introduction to Algorithms
를 읽으며 공부했던 알고리즘을 적용하여 성능을 개선하였습니다. 제가 사용한 알고리즘들은
Greedy와 Parallel programming입니다. 분석할 전체 리소스를 담는 리스트를 만들고, 표준 분
석 영상이 30fps이므로 1초 간격으로 또다시 1초 간격 리소스 리스트를 만듭니다. 사용할 스레
드의 개수만큼 1초 간격 리소스 리스트를 분할하여 새로운 리소스 리스트에 할당합니다. 번거
롭게 새로운 리스트를 만드는 이유는 Async하게 처리하기 위함입니다. 하나의 리스트를 공유
하여 병렬 컴퓨팅한다면 false sharing 문제가 일어날 수 있음을 유의해야 합니다. 리소스를 할
당받을 스레드를 생성하고, 각 스레드가 컴퓨팅을 끝낸다면 가장 높은 유사도를 지니는 리소스
리스트에 대하여 n 프레임 간격으로 새로운 분할 및 분석을 진행합니다. 이러한 과정을 재귀적
으로 만들면 아주 빠르게 수렴 값을 찾을 수 있습니다. 이렇듯 두 알고리즘을 사용하면 분석할
리소스를 획기적으로 줄일 수 있으며, 비약적인 성능향상으로 이어집니다.
SW.AI동아리 전시회를 위해 만들었던 동작 인식 춤 게임의 성능 개선을 해본 경험이 있습니
다. 제가 분석해야 할 영상은 두 가지였습니다. 표본 영상과 웹캠을 통해 들어오는 사용자의 움
직임 영상입니다. 그런데 GPU가 없는 전산실 컴퓨터의 CPU에서는 연산력 부족 문제로 많은
레이턴시가 발생하여 실시간으로 게임을 즐기기 어려웠습니다. 그래서 Dynamic programming
을 적용했습니다. 동적 프로그래밍의 기본 개념은 big-problem이 여러 중복되는 sub-
problem으로 쪼개질 때, 하위 문제를 해결 후 저장을 통해 큰 문제를 해결하는 것입니다. 춤은
일련의 동작 나열로 구성됩니다. 점수를 내는 부분의 동작은 여러 번 중복되어 나옵니다. 즉 춤
이라는 big-problem은 동작들이라는 sub-problems의 조합으로 볼 수 있다는 것입니다. 표본
영상의 춤 동작들의 기울기를 미리 분석하고, 이를 동작 1, 동작 2… 이런 식으로 이름 붙인 후
JSON 포맷으로 저장합니다. 게임 시작 시 필요 파일들을 램에 로드하여 점수를 계산할 때 참조
하여 사용합니다. 이렇게 Memoization을 통하여 필요한 연산력을 확보하여 레이턴시를 제거할
수 있었습니다. 이외에도 점수 계산 시 병렬화를 통해 Async하게 처리하여 실시간으로 게임을
즐길 수 있었습니다.
여러분들에게 전해드릴 이야기는 여기까지입니다. 이 글을 읽고 컴퓨터 과학에 관심이 더 생
겼다면 좋겠습니다.
2022 Daegun High School 105