2019년 CVPR(Computer Vision Pattern Recognition, IEEE주최)컨퍼런스 Action Recognition 분야 1등모델입니다.
기존 Two Stream Network 모델처럼 Optical Flow정보를 사용하지 않는 점이 특징입니다.


biological 연구에서 영감을 받았다고 합니다.
영장류의 시각 시스템을 연구했더니 망막 신경세포가 두 종류가 있는데 세포가 시그널을 전파하는 path도 두가지가 있다고 합니다.(2종류 cells, paths)
아래쪽에 있는 패스가 대부분의 정보를 처리하는 부분인데 컬러 및 공간 디테일 정보(what) (slow) (P-cells),
윗부분 초록색부분은 흔히 운동선수들이 가지고있는 동체시력, 즉 움직임과 위치에 대한 정보를 주로 얻게되는 시각세포들의 연결이 되겠습니다(fast)(M-cells).
사람 시각 시스템의 세포들은 80%의 Parveocellular(P-cells)와 15~20%의 Magnocellular(M-cells)로 이뤄져 있다고 합니다.
P-cells는 spaital detail, color에 대해 반응하지만, temporal한 정보에는 천천히 반응한다는 특징이 있습니다.
M-cells은 high temporal frequency에 대한 연산을 하며, fast-temporal change에 반응합니다. 그러나 spatial detail이나 color에는 거의 반응을 하지 않습니다.
이런 연구 결과에 기반하여, 모델을 설계했으며 유사한 결과를 내었습니다.
특히나 주목할만한 점은 각 pathway의 계산량이 8:2(Slow : Fast), cells의 분포가 8:2(P-cells : M-cells)로 매우 유사하다는 것입니다. 인간의 시각 인지 시스템을 딥러닝 버전으로 만들어 적용했더니만 좋은 결과를 얻었다고도 볼 수 있습니다.

슬로우 패스와 패스트 패스를 연결을 하면 위와 같습니다.
Image + Optical Flow 대신 Image + Image 를 입력해서 데이터를 처리합니다. 하나의 pathway는 16프레임마다 샘플링해서 입력(Low frame rate)으로 넣는다면 나머지 하나의 pathway는 2프레임마다 샘플링해서 입력(High frame rate)으로 넣는 형태로 양쪽 pathway의 프레임 입력에 대한 stride값을 다르게 설정하는 구조입니다. 즉, Low frame rate부분은 공간적 정보를 학습하고 Hight frame rate 부분은 시간적 정보를 주로 학습하게 됩니다.
패스트 네트워크에서 슬로우 네트워크쪽으로 단방향으로 연결이 되어있어 정보를 전달하면 concat하거나 summation합니다
하이퍼 파라미터로 두 네트워크의 관계를 설명해줍니다.
- S = 영상을 정사각형으로 crop한 height 혹은 width 정보
- T = Temporal length= 4 (slow path 총 프레임갯수)
- α = speed ratio = 8 (α배 만큼 프레임 비율이 높다)
- β = channel ratio = ⅛(패스트 패스는 모션정보만 얻으면 되기 때문에 많은 채널을 필요로 하지 않습니다.저자의 실험에 의해 찾은 파라미터값 입니다. 이렇게 채널을 줄이면 공간 정보를 표현하는 능력은 떨어지게 되고 temporal 표현 능력을 증가시키게 됩니다.)
- τ = temporal stride = 16
- 원본 비디오 클립은 총 T x τ = 64 frame입니다.
- Fast pathway에 들어가는 frame은 αT=32, Slow pathway에 들어가는 frame은 T=4입니다

kinetics 400(사람 행동 400개 클래스, 각 클래스당 최소 400개의 비디오, 약 10초 길이, YouTube에서 가져옵니다. 동작은 인간에 초점을 맞추고 악수와 같은 인간과 인간의 상호 작용뿐만 아니라 악기 연주와 같은 인간과 개체의 상호 작용을 포함하여 광범위한 클래스를 포함합니다.) 데이터로 비교해보니 FAIR 다른 팀에서 발표한 R(2+1)D모델에 비해서 성능도, 연산량도 향상된것을 볼 수 있습니다.
T는 프레임 갯수, tau는 샘플링 프레임 수 입니다.

슬로우만 사용했을때와 비교하여 어느정도 성능이 향상되는지(초록색line) 비교 그래프 입니다.
가로축은 연산량, 세로는 정확도입니다. 세로축이 0부터 시작하지 않아 어느정도 왜곡이 있지만 fast를 추가했을때 증가되는 연산량에 비해 성능향상이 의미가 있다고 합니다. 빨간색 line은 기존 slow에서 feature수를 2배(연산량2배)해서 성능 향상 한것에 비해 단순히 fast만 추가했는데 성능향상이 더 많이 됐다는것을 보여주고 있습니다.
SlowFast는 영상 인식 분야에서 사용되는 딥러닝 모델 중 하나입니다. 이 모델은 시간 축을 두 가지로 나누어 각각 다른 속도로 영상을 처리함으로써 더욱 정확한 결과를 도출할 수 있도록 설계되었습니다.
SlowFast 모델은 두 개의 네트워크로 구성됩니다. 첫 번째는 영상의 고해상도 느린 속도 인코더(ResNet)입니다. 이 네트워크는 영상의 고해상도 프레임을 처리하며, 시간적으로 느린 정보를 추출합니다. 이렇게 추출된 정보는 두 번째 네트워크인 빠른 속도 인코더(ResNet)에서 처리됩니다. 이 네트워크는 저해상도 빠른 속도의 영상 프레임을 처리하며, 시간적으로 빠른 정보를 추출합니다.
이렇게 두 개의 네트워크로 구성된 SlowFast 모델은 영상 분류, 객체 인식, 동작 인식 등 다양한 영상 인식 분야에서 높은 성능을 보입니다. 또한, 이 모델은 학습에 사용되는 데이터의 양이 적어도 다른 모델들과 비교하여 학습에 더욱 효과적인 방법을 제공할 수 있습니다.
장점
- 높은 성능: SlowFast 모델은 시간 축을 두 가지로 나누어 각각 다른 속도로 영상을 처리하므로, 더욱 정확한 결과를 도출할 수 있습니다. 이로 인해, 다른 영상 인식 모델과 비교하여 높은 성능을 보입니다.
- 효과적인 학습: SlowFast 모델은 고해상도 느린 속도 인코더와 저해상도 빠른 속도 인코더 두 개의 네트워크로 구성되어 있으며, 이를 통해 학습에 사용되는 데이터의 양이 적어도 다른 모델들과 비교하여 학습에 더욱 효과적인 방법을 제공할 수 있습니다.
- 다양한 분야에서 활용 가능: SlowFast 모델은 영상 분류, 객체 인식, 동작 인식 등 다양한 영상 인식 분야에서 높은 성능을 보입니다. 따라서, 다양한 분야에서 활용 가능합니다.
- 쉬운 구현: SlowFast 모델은 PyTorch를 기반으로 구현되어 있으며, PyTorch는 다른 딥러닝 라이브러리보다 쉬운 구현 방법을 제공합니다. 따라서, PyTorch를 사용하여 SlowFast 모델을 구현하면 비교적 쉽게 구현할 수 있습니다.
단점
- 높은 계산 비용: SlowFast 모델은 시간 축을 두 가지로 나누어 영상을 처리하므로, 다른 영상 인식 모델에 비해 높은 계산 비용이 필요합니다. 이로 인해, 더 많은 하드웨어 리소스를 필요로 하며, 학습 및 추론 속도가 다른 모델에 비해 느릴 수 있습니다.
0.1. 환경구축 후 테스트
0.2. Requirements 설치(초록색글씨)
- Python >= 3.8
- Numpy pip install numpy
- PyTorch >= 1.3
- fvcore: pip install 'git+https://github.com/facebookresearch/fvcore'
- torchvision that matches the PyTorch installation. You can install them together at pytorch.org to make sure of this.
- simplejson: pip install simplejson
- GCC >= 4.9
- PyAV: conda install av -c conda-forge
- ffmpeg (4.0 is prefereed, will be installed along with PyAV)
- PyYaml: (will be installed along with fvcore)
- tqdm: (will be installed along with fvcore)
- iopath: pip install -U iopath or conda install -c iopath iopath
- psutil: pip install psutil
- OpenCV: pip install opencv-python
- torchvision: pip install torchvision or conda install torchvision -c pytorch
- tensorboard: pip install tensorboard
- moviepy: (optional, for visualizing video on tensorboard) conda install -c conda-forge moviepy or pip install moviepy
- PyTorchVideo: pip install pytorchvideo
- Detectron2:
git clone https://github.com/facebookresearch/detectron2 detectron2_repo
pip install -e detectron2_repo
- FairScale: pip install 'git+https://github.com/facebookresearch/fairscale'
0.3. Pytorch
Please follow PyTorch official instructions to install from source:
git clone --recursive https://github.com/pytorch/pytorch
0.4. PySlowFast
Clone the PySlowFast Video Understanding repository.
git clone https://github.com/facebookresearch/slowfast
Add this repository to $PYTHONPATH.
export PYTHONPATH=/path/to/SlowFast/slowfast:$PYTHONPATH
0.5. Build PySlowFast
After having the above dependencies, run:
git clone https://github.com/facebookresearch/slowfast
cd SlowFast
python setup.py build develop
0.6. 예제 실행 명령어
Now the installation is finished, run the pipeline with:
python tools/run_net.py --cfg configs/Kinetics/C2D_8x8_R50.yaml NUM_GPUS 1 TRAIN.BATCH_SIZE 8 SOLVER.BASE_LR 0.0125 DATA.PATH_TO_DATA_DIR path_to_your_data_folder
1. 이슈
1.0.1. 1. utils/distributed import error
cat_all_gather
https://github.com/facebookresearch/SlowFast/issues/545
1.0.2. 2. NCCL
config/defaults.py
# Distributed backend.
_C.DIST_BACKEND = "gloo" 변경합니다.
1.0.3. 3. RuntimeError: CUDA error: invalid device ordinal
configs/Kinetics/C2D_8x8_R50.yaml파일에서 NUM_GPUS 1로 수정합니다.
1.0.4. 4. config/deafaults.py에서 worker 1로 수정했음(GPU병렬연산)
1.0.5. 5. sover.warmup_epochs mismatch type
defaults.py에서 solver.warup_empochs를 정수로 바꿉니다.
1.0.6. 6. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa4 in position 5: invalid start byte
defaults.py 에서 checkpoint_type을 pytorch-> caffe2 바꿉니다.
CHECKPOINT_TYPE: caffe2
1.0.7. 7. kinetics, ava.json파일 다운
https://github.com/facebookresearch/SlowFast/blob/main/VISUALIZATION_TOOLS.md
#pbtxt->json변환 코드
import re
import os
os.chdir('E:\GoogleDrive\pycv\slowfast')
os.getcwd()
# reading the data from the file
with open('ava_action_list_v2.2.pbtxt') as f:
data = f.read()
# print(data)
result = re.findall(r'["](.*?)["]', data) # find all contents inside double quote
with open("result.json", "a") as file: # a mean append
for i in range(80):
num = i+1
file.write("\"\\\"" + result[i] + "\\\"\": " + str(num) + ", ")
1.0.8. ref
https://blog.csdn.net/leimingxiao/article/details/114487701
https://deep-eye.tistory.com/59
1.0.9. 실행 명령어
python .\tools\run_net.py --cfg .\demo\AVA\SLOWFAST_32x2_R101_50_50.yaml
1.1. 결과 동영상
https://drive.google.com/file/d/16MNVFYiRimtqi31_lRKw-s4Ap2LUqg_b/view?usp=sharing
https://drive.google.com/file/d/15xIR6OXDKmRVScXmIwtheD7cZelx3lZT/view?usp=sharing
https://drive.google.com/file/d/15ouNnWx9hcacP_KGZ8XBh9FNi9j2Jr8i/view?usp=sharing
https://drive.google.com/file/d/15k8GTkgMFMc-yuSmOAYemEnETytkonZB/view?usp=sharing
https://drive.google.com/file/d/16Ed4XR1ZnRQ3aOlblMbWveSFf8POyDEF/view?usp=sharing
'영상처리 > Recognition' 카테고리의 다른 글
MediaPipe Hands Python 예제 소스 (37) | 2023.01.12 |
---|