Search
Duplicate

시각적 이해를 위한 머신러닝/ Video Classification I

비디오 예측
비디오는 주로 action에 초점을 맞춤. 그걸 하려면 당연히 object 인식도 해야 함.
응용 예는 비디오 검색
또 다른 예는 비디오 추천
Video와 option으로 script가 주어지고 (아니면 음성 인식으로 script를 구성) 영상에 대해 질문을 하면 답을 줌
질문에 따라 내용을 봐야 할 수도 있고, 장면을 봐야 할 수도 있음.
Video 생성하는 task
Video 압축 task
Video 문제의 어려운 점. 데이터가 크고 계산량이 많음.
(video를 할 수 있다는 것은 사실상 인간이 세상을 이해하는 것을 할 수 있다는 것이라고 볼 수 있음. 연속된 이미지 + 음성 + 객체 인식 + 상황 인식이 다 포함되어 있기 때문. 결국 자율주행은 결국 video 인식 문제가 기본)
Video는 라벨링 코스트가 큼. 그래서 scale을 키우기가 어려움.
시간 dimesion이 추가된 것, 영상의 앞과 뒤에 context가 달라지는 것 등 복잡한 요인들이 많음.
fps가 다른 것도 video 마다 차이가 있음.
video 연구는 근본적으로 인간의 시청각 능력을 모사하는 것.
처음에는 video 중에서 한 장 가져와서 분류를 했음.
이러면 motion에 대한 정보가 없음
그래서 아예 여러 장을 뽑아서 분류를 시도
최종 score를 합쳐서 처리하는 방법이 있고, feature 수준에서 합쳐서 처리하는 방법이 있음.
합치는 몇 가지 방법들 - max, average, concatenate. concatenate를 세로로 쌓는 방법 등.
feature를 어디 합칠 것인가?
late fusion은 개별 프레임의 결과를 가장 마지막에 합침. 이러면 frame 고유의 정보가 남아 있음.
early fusion은 처음에 여러 프레임을 아에 하나로 합치고 그 이후에 한 장의 이미지처럼 처리 함.
그 외에 여러 방법들이 가능함. 중간에 하든가 slow fusion도 있음.
video 인식의 흐름
Two-stream 접근 방식은 공간에 대한 conv net과 시간에 대한 conv net을 따로 돌려서 합치는 방식
공간 정보는 한 장의 이미지에서 배우고, 시간적인 정보는 optical flow를 통해 배움
이미지 상의 픽셀들이 어디로 가는지를 나타내는 벡터장을 optical flow라고 함.
optical flow의 예
horizontal 방향, vertical 방향으로 얼마나 움직이는지, 움직임이 얼마나 있는지를 표시
Optical flow를 위한 몇 가지 가정.
픽셀이 다음 프레임에서도 비슷한 brightness를 가질 것이다.
픽셀이 다음 프레임에서 근처 어디에 있을 것이다.
가까이 이는 pixel은 같은 오브젝트일 것이다.
Lukas-Kanade 알고리즘
opencv에서 구현한 예
모든 pixel에 대해 연산하기 어렵기 때문에 우선 특징점을 잡아서 그 점들이 어떻게 움직이는지를 본다.
이렇게 미리 계산한 optical flow를 Temporal stream에 input으로 넣어준다.
temporal stream에서는 전체 프레임의 정보를 stacking해서 한장의 이미지처럼 처리함.
그렇게 공간적, 시간적 2장의 이미지를 합쳐서 처리 함.
위 방식으로는 비디오가 길어지면 제대로 처리 못 함.
멀리 뛰기인데, 달리는 부분 이미지만 가져오면 달리기라고 인식 함.
영상이 길어지면 optical flow를 계산해서 저장하는데 큰 비용이 발생 함
optical flow를 쓰므로 end-to-end 학습이 안 됨
저자들이 후속 논문에서 이미지를 합치는 다른 방법들을 시도 해 봄.
마지막에 합치지 않고, 중간에 합치거나, 중갑에 합치고 공간정보를 남겼다가 다시 합치거나 등
중간에 합치려면 이미지 크기가 같아야 하기 때문에 같은 크기를 유지해야 한다. 그래서 같은 위치의 pixel들이 같은 것을 보도록.
pixel-wise corresponding을 유지하는게 중요하다.
high-level layer들의 feature를 공유해서 파라미터 수를 줄여서 효율적으로 할 수 있었다.
2개의 타워를 합칠 때 언제 합치는거에 대한 실험.
끝에서 합치나 앞에서 합치나 별 차이 없더라. 대신 앞에서 합치면 모델 파라미터를 아낄 수 있어서 더 효율적이다.
conv layer는 나중에 합치는게 좋더라.
TSN은 Two-stream 모델에서 input을 k 장을 뽑는 등 여러 가지 개선을 함.
video를 여러 segment로 쪼갠 후에 그 안에서 1장을 뽑고, optical flow를 계산해서 two-stream 모델을 돌림
optical flow를 미리 계산해서 저장해 두었다가 쓰기 때문에 용량을 많이 잡아 먹기 때문에 그걸 개선한 버전.
spatial은 two-stream을 그대로 쓰고, temporal 부분에 optical flow를 만들어주는 MotionNet을 이용함.
Motion Net은 optical flow 계산을 한 것을 이용해서 모델을 학습 시켜서 만듦.