반응형


tqdm이 Jupyter notebook에서 Hbox로 보일 때

Progress Bar를 통해 보다 시인성 좋은 반복문을 만들어주는 tqdm은, Jupyter에서 사용될 때에는 별도의 위젯을 설치해주어야 한다. tqdm 내부적으로 Jupyter 환경이면 tqdm_notebook이 실행되기 때문인데 만약 위젯을 설치하지 않은 채로, tqdm을 실행하게 되면 아래와 같이 깨진 형태가 나오게 된다.

 

최신 버전의 jupyter는 기본적으로 해당 위젯을 포함하는 것 같기도 하지만, 버전에 따라 이슈가 발생할 수 있다.

HBox(children=(IntProgress(value=1, bar_style='info', max=1), HTML(value='')))

 

해당 이슈를 해결하기 위해서는 아래와 같은 절차를 거치면 된다.

먼저 ipywidgets를 설치해야한다.

pip install ipywidgets

jupyter nbextension enable --py widgetsnbextension

 

그 후, Jupyter의 FigureWidget을 설치한다.

jupyter labextension install @jupyter-widgets/jupyterlab-manager
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


Jupyter Lab / Jupyter Notebook 에서 Token 확인하는 방법

Jupyter Lab과 Jupyter Notebook을 사용하시다보면, 아래와 같은 화면을 수도 없이 자주 보게 될 것이다.

 

생각보다 의외로 많은 분들이 위와 같은 token 입력 창에서 어떻게 토큰을 다시 확인하는지 몰라서,

Jupyter 서버 자체를 껏다가 키는 경우가 종종 있다는 사실을 알게 되어 가볍게 포스팅을 진행한다.

 

Jupyter 관련 프로그램 모두 보고 싶은 경우


jupyter server list

=====Output=====
Currently running servers:
http://{your_IP}/?token={your_token}

대부분 위처럼 server 커맨드를 사용하여 token을 찾을 수 있지만,

다중 GPU가 세팅된 서버에서 jupyter notebook과 jupyter lab이 동시에 켜져 있는 경우가 종종 있다.

(대학원 연구실 등등)

 

이 때, 특정 유형의 서버만 보는 명령어도 존재한다.

 

Jupyter Lab만 보고 싶은 경우


jupyter lab list

=====Output=====
Currently running servers:
http://{your_IP}/?token={your_token}

 

Jupyter Notebook만 보고 싶은 경우


jupyter notebook list

=====Output=====
Currently running servers:
http://{your_IP}/?token={your_token}

 

 

Token= 뒤에 붙어 있는 부분을 복사하여 password or token 입력 박스에 넣고 Log in 버튼을 누르면 된다!

이 때, 유의사항은 접속하는 장비가 달라질 경우, password를 설정했더라도 최초 1회는 token으로 로그인을 해야 한다는 점이다. 만약 invalid credential 에러가 발생할 경우 token으로 로그인을 시도해보자!

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


Pushing the Performance Limit of Scene Text Recognizer without Human Annotation

현재 근무하고 있는 OCR Recognizer팀의 Workshop에서 발표했던 논문 리뷰를 블로그 포스팅으로 다시 정리해본다.

해당 논문은 Consistency Regularization(CR)이라고 불리우는 최근 Semi-Supervised Learning(SSL)의 핫한 방법론을 Scene Text Recognition(STR)에 적용한 논문으로, Human Annotation 없이도 이전 SOTA 모델들의 최고정확도를 갱신했다는 점에서 큰 의미가 있다. 본 논문의 저자들은, 일반적으로 STR에서 학습에 사용하는 합성데이터(Synthetic Text)들은 Real Scene Text와 Domain Gap이 커서 정확도에 안좋은 영향을 미치기 때문에 Annotation되어 있지 않은 Real Scene Text 데이터를 학습하는 방법을 제안한다.

 

 

 

Abstract


  • STR은 대부분 fully supervised manner로 학습되기 때문에 어마어마한 양의 labeled data를 필요로 한다.

  • 비록 Synthetic Data의 연구로 인해 STR의 학습이 보다 원활해졌지만, Real-to-Synthetic의 Domain Gap으로 인해 STR의 정확도 상승에 제약이 있다.

  • 본 연구는 Synthetic Data를 사용하여 Supervised Learning을 하는 동시에, 다수의 Unlabeled Real Data를 활용하여 STR의 정확도를 향상시키는 방법을 다룬다.

  • STR은 일종의 Sequence Generation Task이기 때문에, 이를 고려한 Character-Level Consistency Regularization(CCR)을 활용한 STR 프레임워크를 제안한다.

  • 다양한 Case에 대한 실험을 진행한 결과, 기존에 존재하는 STR 모델들에 적용했을 때 성공적으로 정확도를 상승시켰으며, 새로운 SOTA를 달성했다.

  • 본 논문은, STR에 CR을 최초로 적용한 논문이다.

 

Introduction


  • 일반적으로 STR Task는 Fully supervised manner로 학습되지만, Real Labeled Dataset은 어마어마한 Annotation 비용으로 인해서 대부분 Sample수가 그다지 크지 않다.

  • 그렇다보니, 다양한 Text를 특정 background image에 합성해서 만들어낸 합성데이터(Synthetic Data)인 MJSynth와 SynthText와 같은 Open Synthetic Dataset이 주로 학습에 사용되고 있다.

  • 그러나 Synthetic Data와 Real Data는 사람이 보기에도 확연히 그 Visual Feature가 다르고, 이러한 Domain Gap으로 인해 STR은 실제 Test Set에서 어느정도의 성능 하락이 발생하고 있으며, 해당 내용은 아래 논문에서 어느정도 입증되었다. ["What If We Only Use Real Datasets for Scene Text Recognition? Toward Scene Text Recognition With Fewer Labels"]

  • 즉, STR 데이터는 Real Data에 굶주려 있는 상태이며, 이러한 Real Data는 Annotation 비용이 높을 뿐, 데이터 자체는 인터넷에서 크롤링등의 방법을 통해서 손 쉽게 얻어낼 수 있다.

  • 따라서 저자들은, Consistency Regularization이라는 SOTA Semi-supervised Learning(SSL) 방법론을 STR Task에 적용하여 Real Unlabeled Data(RU)를 사용하여 STR 모델들의 성능을 올리는 실험을 진행하였다.

Proposed Method


  • 본 논문에서 제안하는 STR Framework의 전체 구조는 위 그림과 같으며,  CR Architecture를 사용하여 Synthetic Labeled Data와 Real Unlabeled Data 각각에서 정보를 추출하여 학습하는 방식으로 학습을 진행한다.

  • 해당 CR Architecture는 UDA논문["Unsupervised data augmentation for consistency training."]에서 영감을 받아 Supervised Branch와 Unsupervised Branch의 2가지 Branch로 구성되어 있다. 

  • Supervised Branch는 Synthetic Data 활용하여 Supervised Learning을 진행하고, Unsupervised Branch에서는 Unlabeled Real Data를 받아서 Strong Augmentation과 Weak Augmentation을 진행하고 각각의 Input에 대한 Output이 최대한 비슷하게 출력되도록 학습된다.

  • Unsupervised Branch는 BYOL["Bootstrap your own latent: A new approach to self-supervised Learning"]의 논문에서 영감을 받아, 같은 Architecture에 Parameter만 다른, 2개의 모델(Online Model, Target Model)을 사용하여 학습을 진행한다. Online Model는 Supervised Branch에서 학습된 모델과 Parameter를 공유하고, Target Model은 Unsupervised Branch에서 Online Model과 EMA 방식을 활용하여 학습이 진행된다.

  • 저자들은 STR이 Sequence Generation Task라는 점을 고려하여 Character-Level Consistency Regularization(CCR)을 제안한다.

  • 해당 방식의 아이디어는 매우 심플한데, Sequence Generation을 위해 Teacher Forcing을 할 때, Time Step t마다 Target Decoder와 Online Decoder의 Input으로 들어오는 t-1 Step의 output값을 서로 다른 값을 쓰게 되면 Character Alignment에 안좋은 영향을 미치게 학습될 수 있으므로, 무조건 Target Model의 t-1 step의 Output을 t step의 입력으로 받게끔 하는 방식이다.
    ex) "Hello"라는 글자를 읽을 때, Target 모델이 "H"로 읽고 Online 모델이 "T"로 읽었어도, 양쪽 Decoder에는 다음 Step에 무조건 Target 모델의 Output "H"를 입력하도록 하여 Context를 공유하도록 함

  • 또한 저자들은 Synthetic Data와 Real Data의 Domain Gap을 줄일 수 있도록, 위 (6)과 같은 Domain Adaption Loss를 추가하였다.

  • 해당 Loss는 간단히 말하면, Synthetic 모델에서 뽑아낸 Feature Map과 Real 모델에서 뽑아낸 Feature Map의 유사도를 높이게 만들어서 양쪽 데이터에서 최대한 비슷한 추상화된 Feature를 뽑아낼 수 있도록 유도하는 역할을 한다.

Experiments


  • 전반적으로 정확도가 향상된 모습을 보여주었다.

  • Synthetic Data로 만들기 까다로운 Irregular Text에서 정확도가 큰 폭으로 상승하였다.(SVTP 86.4% -> 93.3%)

  • 2.5M의 Data만을 사용한 TRBA-cr이 14.5M의 Synthetic Data를 사용한 TRBA-pr보다 정확도가 1.7% 향상되었다.
    (학습시간은 거의 1/6 수준)

Conclusion


  • 본 논문의 저자들은 Human Annotation이 아예 없이도 Real Scene Data에 대해서 높은 정확도를 가지는 STR Framework를 제안하였다.

  • Synthetic Data와 Real Data의 Gap을 줄여주는 식으로 학습을 유도하기 위해 Domain Adaption Loss, Consistency Loss등을 사용하였다.

  • Synthetic과 비슷한 크기로 구축하는게 현실적으로 불가능한 Labeled Real Data의 한계점을 극복하기 위해 Semi-supervised Learning을 도입하였다.

  • BYOL 논문의 방식에서 영감을 받아 Projection Layer를 추가하여 학습을 안정화하였다.

  • STR이 Sequence Generation Task인 점을 고려하여 Target Model로 Teacher Forcing을 진행하는 Character Level Consistency Regularization 방법론을 제안하였다.

  • OCR Recognizer에 적용해볼 수 있는 Simple하면서도 효과적인 연구가 아닐까 개인적으로 생각된다!
    바쁜 일이 끝나면, 한번 직접 구현해서 실험해볼 예정이다!
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


GPU 메모리 비우기, 프로세스 전부 종료하기

pytorch나 tensorflow와 같은 인공지능 프레임워크를 사용하다보면, 중간에 예기치 않게 프로그램이 종료될 때가 있는데, 이 때 문제점이 data_loader의 num_worker 수만큼 발생한 서브프로세스들이 부모 프로세스가 종료되었다는 사실을 인지하지 못하고 계속 작업을 수행하는 경우가 발생한다.

 

즉, 프로그램이 종료되었는데도 불구하고, GPU 메모리는 모두 반환되지 않는 상태가 종종 발생한다.

매우 단순한 해결 방법을 알아보자!

 

해결 방안


for i in $(lsof /dev/nvidia1 | grep python | awk '{print $2}' | sort -u); do kill -9 $i; done

위 명령어를 통해서, nvidia gpu를 점유하고 있는 모든 python 프로세스를 종료시킬 수 있다.

multi-gpu 환경이라면, nvidia1을 nvidia2로 바꾸는 등 인덱스에 맞게 여러번 실행시키면 된다.

 

일반적으로 torch.dist와 같은 multi-gpu training의 경우엔 nvidia1에 해당하는 프로세스만 꺼줘도 모두 정상 반환되는 것을 확인할 수 있었다.

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


AttributeError : Can't get attribute '_unpickle_block' on 

<module 'pandas._libs.internals' from ' /internals.cpython-38-x86_64-linux-gnu.so'>

 

에러 메시지


AttributeError: Can't get attribute '_unpickle_block' on <module 'pandas._libs.internals' from ' /internals.cpython-38-x86_64-linux-gnu.so'>

 

에러 발생 지점


model = torch.load('/checkpoint/path')

 

해결법


checkpoint를 생성한 pandas 버전과 현재 읽어오려고 하는 local machine의 pandas의 minor version이 다를 때 발생하는 이슈이다. 

 

필자의 경우, 모델을 학습하는데에 사용했던 pandas는 1.4.1이었고, load 하려는 쪽에 깔려있던 pandas 버전은 1.3.1이었다. 버전을 1.4.1로 Upgrade 후, 문제가 해결되었다!

 

# Use Pip
pip install pandas==1.4.1

# Use Conda
conda install -c conda-forge pandas==1.4.1
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


Python JSON 파일 한글 깨짐 해결법

파이썬을 사용하다보면, Dict 형태의 자료형을 json.dump()와 함께 json으로 저장하는 일이 빈번하다.

하지만, JSON 파일을 열어보면 한글이 \u290과 같은 유니코드 형태로 변경되어 있는 경우가 많다.

 

매번 해결하고도, 까먹어서 다시 검색하는 일이 잦아 아예 포스팅을 하기로 결정했다.. ㅋㅋ

해결 방법을 알아보자!

 

문제 상황


import json

json_dict = {
	"file_path" : "/data/project",
    "model_type" : "Recognizer",
    "version" : "V1.1.0",
    "current_status" : "개발"
}

with open("./my.json", "w", encoding="utf-8") as f:
	json.dump(json_dict, f, indent="\t")

# 결과
# {
# 	"file_path" : "/data/project",
#	"model_type" : "Recognizer",
#	"version" : "V1.1.0",
#	"current_status" : "\uac1c\ubc1c"
# }

 

별도의 옵션 없이 json dump를 뜨면 일반적으로 한글은 저렇게 깨져서 유니코드 형태로 출력되게 된다.

이는 기본적으로 json.dump가 ascii만을 다루게끔 설정이 되어 있기 때문인데, 이를 ensure_ascii 라는 flag 형태로 False로 변경할 수 있다.

 

해결 방안


import json

json_dict = {
	"file_path" : "/data/project",
    "model_type" : "Recognizer",
    "version" : "V1.1.0",
    "current_status" : "개발"
}

with open("./my.json", "w", encoding="utf-8") as f:
	json.dump(json_dict, f, indent="\t", ensure_ascii=False)

# 결과
# {
# 	"file_path" : "/data/project",
#	"model_type" : "Recognizer",
#	"version" : "V1.1.0",
#	"current_status" : "개발"
# }

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


Jupyter Notebook/Lab 에서 파이썬 스크립트를 반복문으로 실행하는 방법

 

필자처럼 ML쪽 업무를 하는 사람이라면, Jupyter Notebook 혹은 Jupyter Lab을 매우매우 자주 활용하게 된다. 

실시간으로 Line by Line 실행 결과를 확인하면서 디버그 하기도 용이하고, ML 모델이 잘 학습되고 있는지 로그 찍어보기도 편리하기 때문이다.

 

하지만 때로는 주피터 노트북 형태의 커널이 아니라, 일종의 서버 인터페이스용으로 주피터를 사용하며 파이썬 스크립트를 주피터 상에서 돌리는 경우도 있다.

 

이 때, 항상 아쉬웠던 점이 특정 인자를 바꿔가면서 다양한 실험을 해보고 싶을 때 !와 함께 사용하는 스크립트 실행으로는 모든 Argument를 하나하나 입력하는 방식으로 작성해놔야 한다는 점이었다. 단순히 반복문과 함께 ! 기능을 사용하여 실행시킬 수도 있지만, 이럴 경우 파이썬 스크립트가 에러가 나서 종료되었을 때, 에러 메시지를 뱉지 않고 다음 스크립트로 넘어가는 현상이 종종 있다.

 

다음과 같은 형태로 에러 걱정 없이 순차적으로 명령어를 수행시킬 수 있다.

아래 예시는 glob을 통해 추출한 다양한 checkpoint 파일에 대해서 inference를 수행하는 예시이다.

 

from glob import glob
from subprocess import check_all

model_list = glob('outputs/models/*.pth')

for m in model_list:
	run_name = m.split('/')[-1][:-4]
    check_call(["python", "evaluate.py", "--checkpoint", "{m}", "--run_name", "{run_name}"])

'''
아래와 같이 실행되는 효과를 지닌다.
python evaluate.py --checkpoint outputs/models/model1.pth --run_name model1
python evaluate.py --checkpoint outputs/models/model2.pth --run_name model2
python evaluate.py --checkpoint outputs/models/model3.pth --run_name model3
'''

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


Python으로 파일 복사 하는 방법

 

특정 디렉터리 안에 있는 모든 jpg 파일을 옮기거나, 머신러닝의 모델 파일들을 추려내거나, 특정 문자열을 포함한 파일만을 추출해서 복사하고 싶을 때, 파이썬을 통해 간편히 파일 복사가 가능하다.

 

import os
from glob import glob
import shutil

# 디렉터리 안에 계층 구조가 2단계 있을 때
jpg_list = glob.glob('target_dir/**/**/*.jpg')
# outputs 디렉터리 안에 있는 .pth만 가져오고 싶을 때
model_list = glob.glob('outputs/*.pth')

# 그 후, 원하는 위치로 복사
dest_list = ['your_target_dir', ..., 'your_target_dir']

for src, dest in zip(model_list, dest_list):
	# makedirs를 exist_ok 플래그와 함께 사용하면 해당 위치에 디렉터리가 없을 경우 생성함
	os.makedirs(os.path.dirname(dest), exist_ok=True)
    shutil.copy(src, dest)

 

위와 같이 glob을 통해서 특정 패턴의 파일 경로들을 추출하고, shutil을 통해서 복사하면 수작업으로 하면 굉장히 오래 걸릴 삽질을 순식간에 마무리 할 수 있다.

또한, 아마도 복사하면서 가장 많이 발생하는 이슈는, 해당 위치에 디렉터리가 존재하지 않을 때 발생하는 cannot find ~ 류의 에러일텐데, 이를 os.makedirs로 미리 만들어주고 사용하면 이슈 없이 활용이 가능하다.

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


2021년도는 여러모로 굉장히 바쁜 한 해였다.

석사 막 학년이기도 했고, 전문연구요원 취업을 해야했기 때문이다!

 

2021년을 분기별로 회고해보자면 다음과 같다.

 

1분기 (1월 ~ 3월)

  • 1월부터 운동 본격적으로 시작 (거의 90kg에 육박하는 몸무게에 충격)
    - 미국으로 교환학생 갔다온 뒤, 불어난 몸무게 상태로 딱히 다이어트를 안했음
    - 식습관이 자극적으로 바뀌고, 대학원에서 주로 앉아만 있다보니 몸무게가 계속 늘어남
    - 결국 마의 구간 90을 돌파해버렸다.
    - 심각성 느끼고 다이어트 결심!

  • 석사 연구 주제 선택
    - SW마에스트로에서 하던 DeepFake 관련 연구 추가 진행을 할까?
    - Kaggle에서 아예 새로운 프로젝트를 해볼까?
    - 이제 Vision은 그만 두고, NLP 외주 프로젝트를 해볼까?
    결론 : DeepFake 후속도 하고, 외주 프로젝트도 하자!!!

  • 정보처리기사 + 토익 공부
    - 막학기에 정신없어지기전에, 미리미리 따두자! (1달 집중 공부)
    - 정보처리기사 취득
    - 토익 925점으로 만족하고 Stop

  • Journal of Information Processing System(JIPS) 논문 제출
    - 과거 네이버, 맨텍 해커톤에서 금상을 수상했던 스마트팩토리 프로젝트를 바탕으로 작성한 논문을 제출
    - 구현을 딱히 대단하게 하지는 않아서 그냥 SCOPUS 저널에 제출 (SCI 제출할 정도로 노력을 기울이진 않았음)

  • SW마에스트로 하면서 제출했었던, NVIDIA TensorRT 컨트리뷰션 성공
    - 보낸지 오래되서 까먹었던 PR이 뜬금없이 새벽에 NVIDIA 팀에게 LGTM을 받았을 때의 쾌감이란..!

  • 군대 + 취업의 일반적인 컴공 취업 테크를 탄 동기들을 보며 전문연구요원의 길을 의심
    - 15학번 동기들이 대학원 진학한 친구들 외에는 모두 대기업/네카라쿠배/금융권으로 취업함(한명도 빠짐없이..)
    - 그들의 연봉을 들으며 전문연구요원 평균 연봉과 비교해보면서 자괴감을 느꼈다...

  • 외부 업체와 NLP 외주 계약!
    - 6개월간 Domain Specific BERT를 만들고, 특정 Domain의 문서를 분류, 요약하는 프로젝트
    - 어마어마한 양의 고품질 데이터를 얻었다. (4TB)

 

2분기 (4월 ~ 6월)

  • 성공적인 다이어트 진행
    - 과도하지 않은 식단 조절 (일반식에 밥만 절반 + 군것질, 탄수화물 자제, 닭가슴살 섭취)
    - 꾸준히 걷기 (10000~30000보 천천히 걷더라도 매일 매일 걷기)
    - 다이어트 시작 3개월만에 10kg 감량 달성! (근육량 증가, 체지방만 감소)
    - 바지 사이즈 (36 -> 32)
    - 상의 사이즈 (110 -> 100)
    - 주변에서 살 빠졌다고 격려를 잔뜩 받아 자존감 상승

  • 디파이 투자 개시
    - Defi가 대세라는 것을 알고는 있었지만, 참여를 안하고 있었는데 결국 투자를 감행
    - 제주도 학회 출장 중에 BUNNY 코인 해킹 사건 발생 ㅠㅠ
    - 투자하지 말걸....

  • JIPS 논문 메이저 리비전
    - 리뷰어들이 사실상 내용을 싹 다 갈아엎기를 바랬음
    - 하라면 해야지..... 논문 내용 전체 수정 및 추가 실험 진행
    - LSTM + SVM, OC-SVM 등등 다양한 모델을 통해 기기 Anomaly Detection 진행
    - 해당 내용 추가하여 논문 대거 수정
    - 최종 Accept! 

  • 즐거운 여행들!
    - 고등학교 친구들과 함께 떠난 여수-순천 여행!
    - 5월 광주 학회 출장
    - 5월 제주도 학회 출장
    - 6월 제주도 학회/연구실 워크샵

  • SW마에스트로 장관상 수상
    - 코로나 때문에 밀리고 밀려서 6월이 되어서야 장관상 시상식이 진행됨
    - 정장 풀 세트 사서 처음으로 정장입어봤음

  • 본격적으로 헬스장 등록
    - 홈트의 한계(등운동, 가슴운동 할 게 없음...)를 느끼고 헬스장 등록!

3분기 (7월 ~ 9월)

  • 다이어트 대성공!
    - 식단 조금 느슨하게 가끔씩 치킨도 먹고, 군것질도 함
    - 헬스장 루틴 만들고 습관화 완료
    - 1월대비 -15kg 달성!

  • NLP 외주 프로젝트 본격적으로 진행
    - 데이터가 너무 많아서 웬만한 GPU로는 어림도 없음 => TPU 시도
    - 삽질 무한 반복, 그래도 어마어마하게 성장한 계기
    - Tesla V100 2대로는 1달 가까이 걸리던 학습 시간을 TPU를 사용하여 일주일 정도로 대폭 향상시킴

  • DeepFake 탐지 후속 연구
    - NLP TPU로 학습 돌려놓고 결과 나오는 동안 DeepFake 연구 진행
    - Vision Transformer(ViT)가 굉장히 핫하길래 DeepFake 탐지에 적용시도
    - 정확도 자체는 엄청나게 낮았지만, CNN과 굉장히 다른 양상의 탐지 결과 발견
    - 측면 얼굴, 그림자 진 얼굴, 저화질 영상에서 CNN 대비 매우 높은 Generalization 성능을 확인
    - CNN + ViT를 Weighted Majority Voting Ensemble로 합쳐볼까? => 유의미한 성능 향상 확인 => 논문거리가 됨
    - IEEE Access (SCI Journal) 제출
    - 졸업논문 주제로 삼기로 결정

  • 전문연구요원 취준 시작
    - 자기소개서 작성
    - TOEIC 성적 안보고 OPIC만 보는 기업들이 있어서 100% 무베이스로 OPIC 급하게 신청해서 시험 응시, IM2 취득
    - SW마에스트로 멘토님께서 많은 기업을 알아봐주셨고, 나를 맘에 들어하시는 기업체들 만나서 면접 진행, 2개 기업 합격(근데 만족 X)

4분기 (10월 ~ 12월)

  • NLP 프로젝트 연장
    - 성능에 욕심이 생겨서 혼자서 연구 추가적으로 더 진행 (MLOps 강의 듣고 실험 자동화 진행)
    - 기존 BERT대비 8%이상 증가한 분류 성능과 실제 전문가(사람)을 뛰어넘는 분류 정확도
    - 문서 요약까지 그럴듯하게 구현 성공
    - 성공적으로 프로젝트 마무리

  • 논문 리뷰 및 구현 시작
    - 딥러닝 연구자로써 취준을 하려면 필수인 논문 리뷰와 구현을 시작
    - ResNet, VGG, ResNeXt, Bag of Tricks 등등 다양한 논문 구현 진행

  • DeepFake 논문 Access 까임 ㅠ
    - 너무 SOTA 이긴 것만 강조해서 리뷰어 한 분이 맘에 안들어함. (충분히 납득 가능한 이유였음)
    - 다른 리뷰어분들은 나름 호평해줬는데, 리뷰어 한명이 강하게 반대하면 일단 Reject 당하는 구조인듯...
    - 리뷰 내용 보완 및 실험 추가해서 논문 재작성 -> 논문 퀄리티가 전보다 좋아짐
    - 허접하지만 추가 실험에서 나름대로 유의미한 결과를 보여줬기에 과감하게 CVPR 내보려고 했으나, 제출 기한 3일 지남 : (
    - 취업 후에도 논문 때문에 얽매이기 싫어서 SCI 저널 제출 결정


  • 졸업 논문 준비
    - 미리 써둔 논문이 있었으니, 그냥 그대로 졸업 논문 작성 (언어만 국문으로 바꿔서)
    - 논문 발표 준비

  • 취업 스트레스!
    - 본격적으로 코딩테스트 공부 시작(14일동안 하루 10시간 이상씩 앉아서 알고리즘만 풀음. 연구실 후배 민상이(Tony9402)의 알고리즘 공부용 레포가 큰 도움이 됐음
    - 전문연구요원을 못가면 어떡하지라는 거대한 불안감, 일종의 학벌 컴플렉스(탑티어 논문 실적 빠방한 탑스쿨 졸업생들과의 비교)
    - 하던 운동 다 때려치고 스트레스가 너무 극심해서 폭식증에 가까운 음식 섭취(기껏 힘들게 빼놓고 다시 80kg로 돌아옴 ㅠㅠ)

  • 전문연구요원 최종 합격!
    - Deep Learning 관련해서는 탑티어 회사라고 자부할 수 있는 성킴교수님의 회사 Upstage(업스테이지)에 6단계의 기나긴 전형을 넘고 합류하게 되었음
    - 2주간 알고리즘에 반쯤 미친 연구실 후배(ACM-ICPC 19위)에게 추천받은 문제를 유형별로 다 풀어봄
    - Upstage 알고리즘 코딩 테스트 올솔 성공!
    - ML 코딩 테스트는 4일간 잠을 아예 안자며 다 쏟아부어 실험, 합격!
    - 기술 면접 때는 진행했던 프로젝트들 쭉 설명하는 위주로 진행, 합격!
    - 만족스러운 조건의 오퍼레터를 받고 합류 최종 결정
    - 회고를 달성하는 현재 (2022년 1월)기준 근무중!

 

총평

정말 바쁘게 살았던 한해였다.

다이어트도 꽤나 사람 스트레스 받게 하는데다가, NLP 외주 프로젝트만 해도 꽤 빡셌는데, DeepFake 후속 연구까지 추가로 진행을 했으니....게다가 취준까지...

 

취준 스트레스가 이렇게 큰 줄 몰랐다.물론 운이 좋아서 내가 가장 가고 싶었던 회사에 한 번에 붙어버려서, 취준생의 고충을 논하는 것이 우습게 보일 수도 있겠지만, 정말 머리카락이 막 빠질 정도로 심하게 스트레스에 시달렸다. 그리고 왜 취준생들이 자존감이 낮아지는지 절실하게 체험할 수 있었다. 자꾸만 나보다 우월한 사람과 나 스스로를 비교하며 한 없이 작아졌던 시기인 것 같다. 개인적으로는 인생 최악의 암흑기.

올 한해는 그래도 열심히 살았다고 스스로 인정할 수 있을 것 같다.내년에도 또 내 스스로 한계를 깨부실 수 있는 시간을 가졌으면 좋겠다.

 

근데 너무 아쉬운 점이 한가지 있다면,기껏 열심히 다이어트 해놓고 마지막에 너무 풀어진 게 조금 아쉽다.계속 건강하게 운동하고 그랬으면 -20kg도 충분히 도전해볼 수 있었던 것 같은데...

 

2022 목표!

  • 회사 생활 빠르게 익히고 회사에 기여할 수 있는 직원되자!

  • 다이어트 다시 진행하고 근육 좀 키워보자!

  • 클라이밍, 스키, 스쿼시 등등 다양한 활동 취미를 가져보자!
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


A Normalized Gaussian Wasserstein Distance for Tiny Object Detection

CIoU, DIoU, GIoU와 같이 단순히 IoU를 사용하는 방법의 문제점을 제시하며 새로운 방법론을 제시하는 논문이다.

이 때, 기존 CIoU, DIoU등은 BBox가 아예 겹치지 않았을 때 거리를 고려하지않고 완전 터무니없는 후보군과 나름대로 가깝게 추론한 후보 BBox를 모두 0으로 똑같이 취급하는 문제점을 꼽았다면, 본 논문에서는 Tiny Object(소형 객체)탐지에서 발생하는 문제점을 꼽고, BBox의 크기에 의존성이 없도록 두 BoundBox간의 Wasserstein Distance를 구하고 이를 Normalize하여 Metric 형식으로 사용할 수 있도록하는 Normalized Gaussian Wasserstein Distance를 제안한다.

 

 

 

Abstract


  • Object Detection 분야에서 Tiny Object를 탐지하는 것은 굉장히 까다로운 문제이다. 그 근본적인 원인은 Tiny Object는 포함된 Pixel 수 자체도 매우 적기 때문이다.

  • 저자들은 꽤나 높은 정확도를 가진 SOTA 모델들도 Tiny Object에 대해서는 만족스럽지 못한 결과물을 나타내는 것에 문제 의식을 가졌다.

  • 저자들은 이러한 현상의 원인이, Intersection over Union(IoU) 기반 Metric이 Tiny Object에서는 위치 정보의 사소한 변화에도 너무 Sensitive하게 변화하는 특성 때문이라고 생각하였다.

    - Ex) 거대한 Bounding Box에서는 Ground Truth와 Predicted Box가 1Pixel 정도 차이난다고 하더라도, 높은 IoU를 얻을 수 있지만, Bounding Box가 워낙 작아서 넓이가 불과 몇 픽셀밖에 안되는 Tiny Object에서는 1Pixel이라도 Ground Truth와 차이가 발생하게 되면 IoU가 매우 크게 감소하여, Threshold 값을 결국 넘기지 못하는 상황이 발생

  • 이를 보완하기 위해서, 저자들은 Wasserstein Distance를 활용한 새로운 Evaluation Metric을 제안한다. 

  • 본 논문에서 제안하는 방법은 첫째로, Bounding Box들을 2D Gaussian Distribution 형태로 변환한후, Normalized Wasserstein Distance(NWD)를 통해 두 Gaussian Distribution의 유사성을 구한다. 

  • 위와 같은 방식으로 계산된 NWD는 Non-maximum suppression(NMS), IoU Loss 등에서 기존 방식을 대체하여 사용될 수 있으며, Tiny Object만으로 구성된 Dataset인 AI-TOD에서 기존 방식 대비 AP가 무려 6.7이나 향상되었다고 저자들은 주장한다.

 

Introduction


  • Tiny Object 탐지는 자율주행과 같은 다양한 Task에 있어서 중요한 요소중 한가지이다. 비록 Object Detection 성능 자체는 매우 큰폭으로 향상되었지만, 아직도 소형 객체 탐지 성능은 상용화되기 어려울 정도로 정확도가 떨어진다.

  • 16 x 16 pixel 보다 적은 객체들로 구성된 AI-TOD 데이터셋의 경우, 굉장히 한정된 양의 시각 데이터를 제공하며, 이로 인해서 이러한 Tiny Object를 탐지해내는 것은 굉장히 어려운 문제로 꼽힌다.

  • 최근 진행된 연구에서는 이러한 한계점을 해결하기위해서, GAN을 활용한 Super Resolution 방식으로 작은 Object의 크기를 크게 만들어 학습을 진행한다던가, FPN등의 Multi-scale Feature를 활용하는 방법을 적용하였으나, Tiny Object를 탐지하기위해서 별도의 추가적인 작업이 필요하다는 단점이 있다.

  • 본 논문에서는 Tiny Object 탐지를 어렵게 하는 근본적인 원인인 IoU의 한계점을 설명하고, 이를 해결하기 위한 방법론을 제시한다.
    6x6 크기의 Tiny Scale Object와 36x36 크기의 Normal Scale Object
  • 위 그림에서 A는 Ground Truth, B는 GT에서 1 pixel만큼 shifting 한 Bounding Box,  C는 4 pixel 만큼 shifting한 Bounding Box이다. Normal Scale Object는 1Pixel에선 0.9, 4Pixel에서는 0.65의 IoU를 가졌지만, 반면 Tiny Scale Object는 1Pixel 차이만으로도 이미 IoU가 0.53으로 크게 하락하고, C의 경우에는 아예 0.06으로 매우 낮은 IoU를 가지게 되는 것을 볼 수 있다.

  • 즉, Tiny Scale Object에서의 IoU는 Ground Truth와 거의 완벽히 일치하지 않는 이상, IoU Threshold를 넘는 IoU값을 가지게 되는 것이 어렵고, Positive Sample로 Labeling되기 어렵다는 사실을 나타낸다.

 

 

Methodology


  • 저자들이 제안하는 새로운 Metric은 다음과 같다.

  • 먼저, Bounding Box (cx, cy, w, h)에 대해서, 내부에 내접하는 타원의 형태를 나타내면 아래와 같다.
  • 그리고 2D Gaussian Distribution의 확률 분포 함수는 아래와 같다.
  • 이 때, Gaussian Distribution의 Mean Vector와 공분산 행렬이 아래 조건을 만족시킬 경우,
    위 수식의 타원이 2D Gaussian Distribution의 Density Contour가 되므로, Bounding Box (cx,cy,w,h)는 다음과 같은 2D Gaussian Distribution으로 표현될 수 있다.
  • 이는 즉, Bounding Box A와 B의 유사도가 두 Gaussian Distribution의 거리로 표현될 수 있음을 의미한다.
    본 저자들은 두 Gaussian Distribution의 거리를 측정하기 위해서 Wasserstein Distance 개념을 적용하였다.
    엄청 어려워보이지만, 쉽게 말하면 두 Bounding Box를 바탕으로 2D Gaussian Distribution으로 전환하고, L2 Norm 개념으로 두 2D Gaussian Distribution의 유클리디언 거리를 구한다라는 느낌으로 이해하면 되는 것으로 보인다.

  • IoU를 대체하는 식으로 사용하기 위해서는 0과 1사이의 값을 가지도록 변경해주어야 하므로, 저자는 아래와 같은 방식으로 Normalize를 진행한다. 이 때, 분모 C는 데이터셋에 맞게 조정되는 Hyperparameter이다.

Experiments


  • 위 표는 AI-TOD에 적용한 다양한 Evaluation Metric의 결과이다. NWD를 기존 방식들과 비교했을 때, Label Assigning에서 가장 효과적이었다. 

  • 이는 위에서 언급한 IoU의 과도한 민감도로 인해 IoU Threshold를 넘지 못하는 문제를 효과적으로 해결했기 때문으로 보이며, 후처리를 담당하는 NMS에서는 그다지 좋은 모습을 보여주지는 않는다.
  • 다만 위 표만 봐도 어느정도 예상이 되는 부분이 있는데, Large를 뜻하는 AP_L이 없다. 즉, Tiny Object에 강인해진 대신, 그 여파로 Large Object에 대해서는 성능이 하락된 것으로 보인다.

  • 실제로 직접 실험한 것은 아니지만, 딥러닝논문읽기모임의 안종식님의 말에 따르면(https://www.youtube.com/watch?v=eGKlg4sZ0Zw), VisDrone 데이터셋을 분류한 결과, AP_S(small)은 기존 IoU 방식 mAP 0.258에서 NWD를 사용했을 시 0.292로 향상되는 모습을 보였지만, AP_L(Large)의 경우에는 기존 IoU 방식 0.655에서 NWD방식 0.405로 큰폭의 하락이 존재했다고 한다. 

  • 결국 해당 방식도, Anchor Size를 줄여서 작은 Object를 잘 찾게 되면, 큰 Object를 못 찾게 되는것과 유사한 모습을 보인다는 것을 확인할 수 있다.

Conclusion


  • 비록 한계점도 존재하는 연구이긴 하지만, 본 논문에서는 Tiny Object를 효과적으로 탐지할 수 있는 방법론을 소개했다.

  • 작은 객체로만 이루어진 AI-TOD 데이터셋에서 SOTA를 달성하였으며, VisDrone 데이터셋의 경우에도 mAP_L이 비록 감소하긴 했지만 최종적인 mAP@0.5가 조금이나마 개선되는 모습을 보였다.

  • 따라서 본 방식은 소형 객체 탐지에 특화된 모델을 만드는데에 주요하게 동작할 것으로 보인다.
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,