[ Rubust CNN-based Gait Verification and Identification using SGEI ]

 

( 1 ) ........ [ SGEI ] Skeleton Extraction & Gait Period Analysis ( 현재글 )

 

 

  이 논문에서는 보행자의 Skeleton을 OpenPose Network를 통해 얻어낸 후 , 보행자의 다리를 하나의 Pendulum으로 가정하고 회전 각을 계산하여 Gait Period ( 보행 주기 ) 를 계산한다. 이후 한 주기 동안의 Silhouette Image들과 Skeleton을 이용하여 SGEI를 만들어낸다. 이를 통해 보행자의 옷, 들고있는 물건 등의 외형 변화에 따른 영향을 제거하는 것이 목표이다.

 

- Skeleton Extraction

 

 

< OpenPose Network >

 

  먼저 위 그림은 OpenPose Network의 Architecture이다. 2개의 Branch로 구성되어 있고 Stage를 직렬로 연결한다. 하나의 Branch는 Part Confidence Maps을, 다른 Branch는 Part Affinity Fileds를 예측하는 구조이다. 본 논문에서는 OpenPose Network에 대한 자세한 설명을 생략하겠다. 그에 관한 내용은 아래 링크를 참고하면 좋을 것 같다.

 

 

OpenPose : https://blog.naver.com/worb1605/221297566317

 


 

- Gait Period Analysis

 

  입력으로 들어오는 개개인의 Gait Sequence는 길이가 각각 다를 수 있다. 찍힌 시점에 따라 시작 Frame에 Gait Cycle이 시작될 수도 있고, Gait Cycle의 중간부터 시작해서 이어질 수도 있다. 동일한 조건에서 Gait Feature를 뽑아내야 유리하기 때문에, 한 주기를 측정하기 위해 보행자의 다리를 Pendulum으로 가정한 후 각도를 이용한다.

 

 

< Leg Pendulum Model & Gait Signals >

  위 그림을 보면, 다리를 하나의 Pendulum으로 가정한 후, 무릎에서 발목까지의 Vector와 무릎에서 지면으로의 수직 Vector사이의 각도를 측정하여 오른쪽 위의 Signal을 만들어 낸다. 

 

< 두 Vector 사이의 각 >

  위 수식을 통해 Vector 사이의 각을 구할 수 있다. 하지만 이렇게 뽑아낸 Signal Graph만 보고 Gait Period를 측정하는 건 쉽지 않다. 따라서 논문에서는 normalization, mean filtering, autocorrelation등의 과정을 통해 오른쪽 아래의 파란 Signal을 만들어 내었다. 그 과정은 아래와 같다.

 

○ Normalization

 

  먼저 평균 (mean) 값으로 빼준 후 Standard deviation으로 normalization하면 된다. 직접 CASIA-B Dataset을 통해 진행해본 결과는 아래와 같다.

 

○ Mean Filtering

 

  다음으로 평균 Filter를 통과시킨다. 정해진 크기의 window를 움직여가면서 window 내의 값을 평균하여 출력하는 Filter이다. Edge에서의 처리에 따라 결과가 다른데, 주변 값을 활용하여 Extension해주거나 Periodic Signal의 경우 그냥 반대편에서 Data를 가져다 ( 앞 부분엔 뒤의 Data, 뒷 부분엔 앞 쪽의 Data, 환형 Queue를 생각하면 쉬울 듯 ) 쓰는 경우도 있다. 하지만 앞서 말한대로 어떤 Gait Cycle 동작에서 시작할 지 모르므로, 그냥 채워주지 않고 사용했다.

 

 

○ Autocorrelation

 

  마지막 단계는 Autocorrelation이다. correlation이란 두 Signal 사이의 상관성을 따져볼 때 사용되는 개념이다. 시계열 Data에서는 현재의 상태가 과거 또는 미래의 상태와 연관지어 생각할 수 있는 경우가 많다. 이럴 때, 시간 이동된 자기 신호화의 상관성을 Autocorrelation이라고 한다.

 

  몇 가지 주요한 특징이 있는데,

 

     1. Autocorrelation은 대칭적이다.

     2. 원점에서 최고점에 도달

     3. 주기적 SIgnal은 그 주기성을 유지한다.

 

  시간 이동된 자기 신호화의 상관성을 따질 수 있기 때문에, Peak만 찾으면 주기를 알 수 있게 되고, 주기성을 유지하기 때문에 더욱 좋다.

 

 

 

  오른쪽의 Graph를 보면 오른쪽, 왼쪽 다리를 각각 계산해 보았을 때의 Graph이다. Peak부터 Peak까지의 Frame 수를 주기로 생각하고 사용할 수 있다.

 


 

- SGEI

 

 

< GEI 와 SGEI >

  위 그림의 1, 2 Row는 SGEI 3, 4 Row는 GEI를 나타낸다. SGEI를 만들 때에는 Skeleton Extraction을 통해 얻어낸 Body Part Point에 17 pixel radius의 원을 그리고 Body Part 간의 연결을 35 pixel의 width를 가진 Rectengle로 Skeleton을 그린 후 한 주기의 Silhouette Image를 입력으로 받아 SGEI를 만들어낸다.

 

  다음 글에서는 SGEI를 이용해 Gait Verification 과 Identification을 하는 과정에 대해 알아보겠다.

 


- 참고자료

- Robust CNN-based Gait Verification and Identification using Skeleton Gait Energy Image

- OpenPose : Realtime Multi-Person 2D Pose Estimation using Part Affinity Fileds

 

- 티스토리 블로그를 Google Search Console 에 등록한 이후 스킨을 변경하다가 실수로 메타 태그가 지워져버렸다.

 

- 구글링을 통해 메타 태그 확인하는 법을 찾아 보았지만, 이전 버전의 Search Console에서 확인하는 법만 나와있었다. 속성을 삭제하고 다시 추가하는 것도 시도해 보았지만, 같은 블로그를 등록하니 메타 태그 등록없이 그냥 진행되서 여러 가지 찾아보다가 성공한 방법을 정리해보았다.

 

1. Google Search Console 접속

 

https://search.google.com/search-console/about?hl=ko

 

Google Search Console

Search Console 도구와 보고서를 사용하면 사이트의 검색 트래픽 및 실적을 측정하고, 문제를 해결하며, Google 검색결과에서 사이트가 돋보이게 할 수 있습니다.

search.google.com

 

2. 메타 태그 확인

 

- 위 링크를 통해 접속 후 원하는 속성을 선택한다.

 

- 왼쪽 상단의 메뉴 버튼을 클릭하여 아래 설정을 클릭.

 

- 위와 같은 화면이 나오는데 여기서 사용자 및 권한 오른쪽의 화살표를 눌러주면 된다.

 

 

 

- 소유자 오른쪽의 더보기 ( 점 3개 ) 를 누르게 되면 속성 소유자 관리가 나오는게 눌러주면 된다.

 

 

- 화면이 바뀌고 위와 같은 창이 뜬다. 이때 확인된 관리자 오른쪽의 확인 세부정보를 누르게되면 소유자 확인을 위해 사용한 방법과 그 때 사용했던 것을이 나온다.

 

 

- 나는 메타 태그를 통해 소유자 확인을 했기 때문에, 위와 같은 화면이 나왔다. 여기서 메타 태그를 확인할 수 있다.

 

3. 티스토리 블로그에 적용

 

- 이제 블로그로 돌아와서 스킨 편집을 통해 적용해주면 된다. HTML 편집 버튼을 누르고 아래와 같이 본인의 메타 태그를 붙여넣고 적용 버튼을 누르면 된다.

 

VSCode, PyCharm 등 다양한 IDE가 있지만, 개인적으로 JupyterLab이 편하다고 생각한다. 최근 처음부터 설치하던 중 관련 내용을 정리해봤다.

 

1. Anaconda 설치

https://www.anaconda.com/distribution/

 

Anaconda Python/R Distribution - Free Download

Anaconda Distribution is the world's most popular Python data science platform. Download the free version to access over 1500 data science packages and manage libraries and dependencies with Conda.

www.anaconda.com

 

- 먼저 Anaconda를 설치한다. 다양한 Package를 제공하고 편리하게 사용할 수 있는 Platform이다. 나는 Python 3.7 version을 사용하기 때문에 해당 설치 파일을 다운받았다.

 


 

2. JupyterLab 실행해보기

 

- Anaconda 설치가 완료된 후 Anaconda Prompt에서 jupyter lab을 입력하면 실행된다.

 

 

 

 

 


 

3. 가상 환경에 PyTorch 설치

 

- base 환경에 전부 설치해도 되지만, 가상 환경을 나눠서 각각의 환경에 원하는 것만 설치해 사용할 수 있다. 나 같은 경우에는 공부하던 중 Tensorflow도 설치해야 할 필요성이 있어서 가상 환경을 나눠서 따로 설치해서 사용한다.

 

○ Conda 환경 만들기

 

- 아래 코드를 통해 새로운 Conda 환경을 만들어준다. -n 뒤에 원하는 이름을 입력하면 된다. ipykernel이 설치되어 있고 python version을 3.7.1로 지정해주었다.

conda create -y -n PyTorch ipykernel python=3.7.1

 

- 가상 환경 List를 보고 싶을 땐 아래와 같이 입력하면 된다.

conda env list

 

○ 가상 환경으로 진입

 

- 가상 환경으로 진입하고 다른 모듈을 설치하거나 원하는 동작을 해야 해당 환경에 적용된다. 따라서 아래 코드를 통해 가상 환경을 활성화해준다.

 

- activate 뒤에 만들어준 가상 환경의 이름을 입력하면 된다.

activate PyTorch

 

○ PyTorch 설치

 

- 해당 환경에 PyTorch를 설치한다. 공식 홈페이지에서 원하는 OS, Python Version, CUDA에 맞춰 선택하면 command를 알려준다.

 

https://pytorch.org/

 

PyTorch

An open source deep learning platform that provides a seamless path from research prototyping to production deployment.

pytorch.org

$ conda install pytorch torchvision cudatoolkit=10.0 -c pytorch

 


 

4. Jupyter에 등록

 

- 설치가 완료된 후 아래의 코드를 통해 등록해주면 된다.

 

python -m ipykernel install --user --name PyTorch --display-name "PyTorch"

 

- 이후 가상 환경을 빠져나와 JupyterLab에서 확인하면 아래와 같다.

 

conda deactivate

 

 

- PyTorch Kernel로 Notebook을 만들어 사용할 수 있다.

 

 

5. 가상 환경 및 Kernel 삭제하기

 

- No Kernel 문제가 발생하거나 다양한 이유로 다시 설치하고 싶을 때, 또는 환경을 삭제하고 싶을 때는 아래와 같이 하면 된다.

 

conda env remove --name PyTorch

 

- 위 코드를 실행하면 가상 환경은 삭제되지만 Jupyter 에 등록된 Kernel은 남아있다. 만약 Kernel을 삭제하지 않은 채 Anaconda를 삭제했다 다시 설치하게 되면 Kernel은 만들어져 있지만 해당 Kernel의 가상 환경이 삭제되어 오류가 발생할 수 있다.

 

- 또는 단순히 Kernel을 삭제하고 싶을 때 아래와 같이 입력하면 된다. 뒤의 PyTorch 부분을 본인의 Kernel 이름으로 바꿔주면 된다.

 

jupyter kernelspec remove PyTorch

 

- Jupyter 에 등록된 Kernel List를 확인하고 싶을 때는 아래와 같이 입력한다.

 

jupyter kernelspec list

 

6. Jupyter Lab 실행파일 만들기

 

- Jupyter Lab 이 설치되어 있지 않다면 아래 코드로 설치할 수 있다.

 

pip install jupyterlab

 

- Jupyter Lab을 실행하기 위해 매번 Anaconda Prompt를 켜서 jupyter lab 커맨드를 입력하기 귀찮아져 찾아보았다.

 

 

○ 첫 번째 방법

 

 

- Anaconda가 설치된 폴더로 이동하여 Scripts 폴더 내부의 activate.bat 파일을 찾는다. 복사하여 원하는 이름으로 바꿔준 뒤 메모장으로 열어 맨 아래에 아래와 같이 추가해준다.

 

- 나는 D Drive에 작업 경로가 있기 때문에 해당 경로로 이동하는 부분을 적어주었다. 본인의 작업 경로로 맞춰주면 된다. 이후 만들어준 bat 파일을 오른쪽 마우스 클릭하여 바로 가기를 만들어준다. 원하는 곳에 두고 사용할 수 있다.

 

 두 번째 방법

 

- 위 방법은 확실하게 실행파일을 만들 수 있다는 장점이 있지만, 나는 보통 자주 실행하는 프로그램을 시작 화면에 고정시켜두는데, 첫 번째 방법으로 만들어준 바로가기 파일은 시작 화면에 고정할 수 없다. 

 

- 두 번째 방법은 시작 화면에 고정시켜서 사용할 수 있는 방법인데, 이유는 모르겠지만 간혹 다른 컴퓨터에서 실행되지 않는 문제가 발생하긴 했다. 하지만 나는 이상없이 실행되서 그냥 사용하는 방법이다.

 

 

- 마찬가지로 Anaconda3/Scripts 폴더로 이동하면 jupyter-lab.exe라는 파일을 찾을 수 있다. 오른쪽 마우스 클릭하여 시작 화면에 고정하면 된다.

 

 

- 만약 위와 같은 창이 뜨거나 ( 사실 바로 꺼져서 Video Capture 후 Frame 별로 찍어봤음 ) 바로 꺼지고 실행이 안되면 환경 변수 ( 시스템 변수 ) 에 아래와 같이 추가해주면 된다.

 

 

 

참고 자료

1. https://blog.naver.com/worb1605/221456891149

 

Jupyter lab 설치 및 바로가기 만들기

Jupyter notebook사용자들은 한번쯤은 jupyter lab에 대해 들어봤을 것이다.notebook에서 조금 더 진화된 ...

blog.naver.com

2. https://ipython.readthedocs.io/en/stable/install/kernel_install.html

 

Installing the IPython kernel — IPython 7.8.0 documentation

Important This documentation covers IPython versions 6.0 and higher. Beginning with version 6.0, IPython stopped supporting compatibility with Python versions lower than 3.3 including all versions of Python 2.7. If you are looking for an IPython version co

ipython.readthedocs.io

3. http://blog.naver.com/PostView.nhn?blogId=baek2sm&logNo=221378601592&categoryNo=35&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

Jupyter Lab에서 PyTorch를 이용하여 Deep Learning Model을 학습시키던 중 아래와 같은 에러가 발생하였다.

 

1. CuDNN Ccudnn error: cudnn_status_success

 

   Error를 쭉 따라 읽어 내려가다 보면 F.Conv2d 쪽에서 문제가 발생하였는데 단순히 해당 Cell을 한번 더 실행했을 때 사라지고 정상적으로 실행이 되는 듯하여 넘어갔던 문제이다.

 

   그러다 아래와 같은 문제가 복합적으로 발생하기 시작했다.

 

2. Cublas cublas runtime error : the GPU program failed to execute at C:/ProgramData/Miniconda3/conda-bld/pytorch_1533094653504/work/aten/src/THC/THCBlas.cu:411

 

   해당 Error 또한 해당 Cell을 다시 실행했을 경우에는 발생하지 않았고, Kernel을 Restart 하거나 컴퓨터를 재부팅했을 경우에는 지속적으로 발생했다.

 

   물론 그냥 다시 실행해서 학습을 진행시킬 수 있었지만, 갑자기 학습이 느려지고 Gpu Load가 일정 Percent 이상 올라가지 않고 GPU가 놀기 시작했다. 특히 Ram 사용량이 급격히 높아지며 결국에는 컴퓨터가 먹통이 돼버리는 문제가 발생했다.

 

  기존의 Code를 수정 없이 다시 실행했을 때 갑자기 발생한 문제여서 처음엔 여기저기서 말썽이 많다는 Rtx 2080 ti 가 사망하였거나 Freeze 가 걸린 게 아닌가 의심하기 시작했다. 해외 포럼이나 Google에 검색해봤을 때 많은 사람들이 비슷한 문제를 겪고 있었는데, Rtx 2080 또는 ti를 사용한다는 말이 많았고, 단순히 Cell을 재실행해서 해결했다는 사람들이 많았다.

 

  하지만, 여러 글을 읽던 중 가뭄에 단비와 같은 한줄짜리 Comment를 발견했다.

 

https://discuss.pytorch.org/t/runtimeerror-cudnn-error-cudnn-status-success/28045/3

 

RuntimeError: CuDNN error: CUDNN_STATUS_SUCCESS

No… I just know about the issue is occurred when I use RNN base model. For example, from torchvision import models vgg = models.vgg19(pretrained = True) vgg.cuda() These lines are not problem. They work clearly. However, from torch import nn gru = nn.gru(3

discuss.pytorch.org

 

   다른 Comment를 읽어보면 9.0, 9.2, 10.0을 사용하고 있는 사람들에게서도 빈번하게 나타나는 문제여서 처음엔 가볍게 무시하고 넘어갔었지만, 연구실 형의 말을 듣다 보니 사용하고 있는 PyTorch와 Cuda version에 문제가 있을 수 있다는 생각이 들었다. 

 

   conda install pytorch cuda92 -c pytorch

 

   win10과 Anaconda를 사용하는 User의 경우 단순히 Conda prompt를 켜 위의 명령어를 실행하면 간단하게 version이 호환된 pytorch와 cuda92를 다운로드할 수 있다. 나와 같은 경우 10.0을 사용하다 호환의 문제로 9.0으로 Downgrade 해서 사용하고 있었는데 다시 9.2로 Upgrade 했다.

 

   설치가 완료되고 다시 Jupyter Lab을 실행하여 처음부터 실행해본 결과!! 아무런 에러 없이, 또 정상적인 GPU Load와 함께 학습이 진행되었다.

 

 

   만약 나와 같은 문제가 발생하였다면, 사용하고 있는 Framework와 Cuda 간 Version이 호환되지 않는 문제가 있는 게 아닐까 한번 의심해보길 바란다.

 

 

++ 추가사항 ++

 

   CuDNN , Cublas Error는 위와 같은 방법으로 해결하였다. 하지만 Gpu Load가 떨어지는 것은 다른 문제였는데, CPU로 하는 연산이 오래 걸리거나, 또는 코드 상 반복문에서 빠져나오는 게 오래 걸렸기 때문이었다. 코드를 수정하여 CPU 연산을 최소화하고 반복문에 갇히는 문제를 해결하니 정상적으로 동작하였다.

+ Recent posts