러닝머신 하는 K-공대생
내가 과학고에서 뭐했더라 본문
0. 글을 시작하며
여름방학이 시작되었고 자소서 시즌이 되면서 나의 고등학교 인생을 되돌아볼 때가 되었다. 이번 글에서는 고등학교 올라와서 중간중간 블로그나 유튜브, 깃헙 등에 기록을 자주 했었는데 너무 정리가 안 되어있어 기억나는 거 위주로 기록한 내용들을 정리해보고자 한다.
1. 캔위성 경연대회
교내 정보동아리 SADA에 들어가고 동아리 선배와 진행한 첫 프로젝트였다. 영상 분할을 딥러닝으로 구현하는 것과 영상처리 쪽 프로그래밍을 담당했었다. FCN, U-Net 등 영상 분할을 위한 딥러닝 모델을 공부해보고 이론에서 벗어나 딥러닝을 활용해본 제대로 된 프로젝트였고 하드웨어 작업하는 것을 도우면서 UART 통신과 라즈베리파이도 익숙해졌었다.
2. SADA 머신러닝 세미나
현재 2022 SADA의 모습을 보면 딥러닝을 이용해 여러 프로젝트를 진행하지만 내가 1학년때까지만 해도 딥러닝이나 머신러닝 분야에 관심을 갖고 있던 부원이 많이 없었다. 그래서 기초적으로 머신러닝 개요, 회귀와 경사하강법에 대해서 소개하고 내가 이쪽 분야를 공부해온 방법들이나 딥러닝을 공부하기 위한 방법들을 공유했었다. 2학년 때는 다들 딥러닝에만 빠져있는 것 같아서 고전적인 머신러닝도 소개할 겸 수학을 좀 덜고 내용 위주로 설명했었다. 쉽다고 생각해서 대충 넘어갔던 부분들도 다시 바라보니 놓쳤던 부분들이 있었고 부족한 부분들을 채워가는데 도움이 되었고 알려주면서 진정한 공부를 할 수 있었다. 이외로도 각종 대회 참여 과정 및 후기, 나의 성장 과정 등을 공유하기도 했었다.
- Machine Learning Introduction: https://youtu.be/MQcRsigRWWE
- Regression & Gradient Descent: https://youtu.be/GovIDUOM11k
- 최근 공부한 고전 머신러닝 알고리즘: https://youtu.be/E51eUJOX4IM
3. 미래과학자 강연
■ 1학년: AI Research Trend
- AI의 시작부터 암흑기, 이후 오류역전파 CNN, LSTM, Deep Learning 본격적으로 딥러닝의 시대가 열리게 된 과정부터 전이 학습, 강화 학습, Robust Model, 설명 가능 AI, GAN 등 현재 연구가 활발히 진행되는 분야까지 AI 전반에 대한 발표를 진행했다. 또한 내가 직접 Semantic Segmentation을 진행한 경험, CNN 구조를 이용한 글자 인식 프로그램 개발 경험, 얼굴 tracking 프로그램 등을 소개하면서 AI 분야에서도 Computer Vision 쪽에 대한 깊은 관심을 보여 줄 수 있어서 좋았다. 발표를 준비하면서 ICLR 2019,2020에서 인공지능 Top Trends를 정리해보면서 최신 연구 동향에 대해 파악할 수 있었다.
- 영상: https://www.youtube.com/watch?v=u5CjbwJSHYI&t=658s&ab_channel=TaeguKang
■ 2학년: 모바일 서비스를 위한 가벼운 딥러닝 모델
- R&E를 진행할 때 모바일 환경 내에서 딥러닝 알고리즘이 작동시키길 원했고 모델 경량화 분야를 공부했었고 이를 정리해 발표를 진행했었다. 딥러닝에 대한 개요, Convolution Neural Network의 작동 원리를 기본적으로 소개하고 딥러닝 모델을 다이어트시키는 방법에 대한 발표를 진행하였다. ResNet, DenseNet, SqueezeNet 등 모델 구조를 변경하거나 MobileNet, ShuffleNet 등 컨볼루션 필터를 개선하는 시도들을 공부하며 CNN의 발전 과정을 이해할 수 있었고 당시 딥러닝에 빠져있었던 나에게 모델 설계의 중요성을 느끼게 할 수 있었다. 또한 가지치기나 양자화/이진화 등 알고리즘적으로 경량화를 하는 방법들에 대해서도 이해할 수 있었고 딥러닝 모델 선택이나 전이 학습 등 나름대로 경험에 의존한 꿀팁도 전수했다.
- 영상: https://www.youtube.com/watch?v=3tPJ7e9V_FQ&t=1115s&ab_channel=TaeguKang
4. 정보과학 R&E
시각장애인의 어려움을 해결하겠다는 당찬 포부를 가지고 1학년 때는 대상을 한정하여 계단에서의 공간지각을 돕기 위해 계단 인식 딥러닝 프로그램 설계, 계단 영역 추출 방법 고민, 계단 개수 카운팅 알고리즘 등을 진행했었다. 1학년 때 너무 기술적인 부분에만 초점을 맞춘 것 같아 2학년 때는 이동 과정에서의 실질적인 도움을 주고자 공간정보를 음성 말고 효과적으로 전달할 수 있는 방법이 없을까 다시 원점에서 문제를 바라보았다. 어떻게 하면 공간을 쉽게 알려줄 수 있을까 고민하다 bird eye view로 위에서 내려다보는 것처럼 스마트폰 화면 위에 촉각 지도를 만들어서 직접 터치하면서 이동 가능한 영역을 파악할 수 있게 하자는 아이디어를 제시했다. 기숙사 학교에 살고 있기에 대상은 교내로 한정했고 복도 사진을 찍어서 라벨링 하고 U-net 아키텍처 기반으로 세그멘테이션 모델을 학습시키고, Depth Estimation 모델로 상대적인 Depth 정보를 얻어서 월드 좌표로 변환해 대응점을 찾고 Homography 행렬을 계산해서 RGB-d 카메라 및 Ridar 센서 없이 Bird eye view를 얻어내는 데 성공했다. 이 과정을 잘 정리해 앱 개발을 총괄했던 현중이에게 전달하였고 적절히 잘 협업해 TOBDA 앱개발 프로젝트를 진행했다. 2학년 중 가장 인상깊었던 활동이었고 주소창 대회에도 같이 참여를 하며 방학중에도 개발을 같이 진행했고 영상처리 및 핀홀 카메라 이론과 딥러닝을 공부하고 모두 활용하는 등 어려웠지만 계속 아이디어를 내고 구현해보고 분석하고 다시 개발하고 팀원과 협력하는 등 많은 성장을 준 잊지못할 소중한 경험이다.
- 개발 중간 과정 코드: https://github.com/taegukang35/device_for_blind
- 최종 앱개발 코드: https://github.com/paull04/tobda
- 개발과정 영상 모음: https://youtube.com/playlist?list=PLCIotXpWRBuaCyokIwuAOsqV7Dc2pX2yx
- 블로그 포스팅
5. 해킹동아리 활동
1학년 땐 선배들의 세미나를 들었었지만 나의 복습 부족으로 머릿속에 남은 게 없어 1학년 겨울방학 포스텍 해킹캠프에 참여해 시스템 해킹, 리버싱, 암호학, 포너블, 웹해킹의 기초를 배웠다. 2학년이 되어선 같이 해킹캠프를 참여했던 지후와 현준이와 같이 전반적인 커리큘럼과 세미나를 구성하는등 동아리를 주도적으로 이끌었다. 리눅스와 SQL Injection 등의 웹해킹 관련 세미나를 진행했고 크립토와 웹해킹 실습을 위한 세미나를 진행하기도 했다. 부원 우선선발 문제 출제나 매 세미나마다 라이브 스트리밍을 진행해 온라인 참여나 복습을 격려했고 좋은 성과를 내진 못했어도 전국 고등학교 사이버 보안 경진대회(ANUSEC 2021)에 나가 열심히 친구들과 크립토와 웹 문제를 해결했었다.
6. 창의개인연구
■ 1학년 2학기: K-Means 클러스터링을 이용한 영상 분할
캔위성을 진행하면서 영상 분할에 관심 많았었고 이전에 수학 수업 듣다 k-means 클러스터링 조사해본 적이 있었는데 이를 활용해 영상 분할을 진행해보고자 했고 마스킹된 라벨 정보가 제대로 주어지지 않은 데이터셋들을 사용자가 편하게 라벨을 달 수 있도록 개발했었다.
■ 2학년 1학기: CNN 모델 시각화를 통한 영상 분할 방법 제안
정보 R&E를 진행하면서 복도 영역을 추출하기 위한 딥러닝 모델 학습을 위해 이미지 라벨링이란 엄청난 노고를 겪어보며 좀 쉬운 방법으로 영역 추출이 가능할지 고민하다 이미지를 인식하는 모델의 핵심이 되는 CNN 레이어 중간의 정보를 활용할 수 없을까 고민했다. CNN 구조를 해부학적으로 분석해보고 CNN 모델을 다양한 방법으로 시각화를 시도하고 이미지 분할을 진행하는 방법과 연결 지을 수 있을지에 대해 연구하였다. CNN의 각 레이어의 출력 값, 필터의 패턴, Class Avtivation Map, Grad CAM, Gudied Backpropagation 등을 활용해 CNN 구조 시각화를 진행했었다. 레이어와 필터를 시각화하며 CNN의 작동원리를 이해할 수 있었으며 Image Segmentation을 위한 각 시각화 방식의 의의와 한계를 분석하고 Grad CAM을 이용한 Image Segmentation 및 Bounding Box 추출이 가능함을 보여 부분적으로 목적을 달성했다. CAM과 같이 블랙박스라고 불리는 딥러닝 모델의 모호함을 분석할 수 있는 방법론을 접해보니 eXplainable AI, XAI 분야에 대한 관심의 확장이 이뤄졌었다.
- 관련 코드 모음: https://github.com/taegukang35/ML-study
- 블로그 포스팅: https://prgmti1.tistory.com/entry/1-Convolutional-Neural-Network-%EA%B7%B8-%EB%82%B4%EB%B6%80%EB%A5%BC-%EB%B3%B4%EB%8B%A4?category=929664
■ 2학년 2학기: Pygame을 이용한 딥러닝 모델 시각화 툴 개발
2학년 1학기 창개연을 진행하면서 모델 시각화와 XAI 분야에 관심이 생겼고 XAI 분야를 파고들기 시작했다. 각 은닉층에서 역전파된 gradient를 얻어내 클래스의 중요성을 알아낸 CAM처럼 역방향으로 순회에 은닉층의 결과 기여도를 알아내는 방법론에 관심이 많았다. 그래서 LRP(Layer-wise Releavance Propagation) 관련 논문을 읽고 분석해보기도 안재현 님의 'XAI 설명 가능한 인공지능, 인공지능을 해부하다' 책을 읽고 궁금증을 해결해가기도 하면서 책에서 소개한 기법들과 1학기 때 진행한 시각화 방법을 활용하여 딥러닝 모델의 작동 과정을 뜯어볼 수 있는 프로그램 개발을 진행했다. 가장 일반적인 CNN 모델인 VGG16 모델을 타깃으로 삼았고 이미지를 입력하면 VGG16의 각 레이어마다 피처맵, 필터 패턴, Grad-CAM, SHAP, LIME의 모드를 적용해볼 수 있고 pygame을 활용해 GUI로 쉽게 사용할 수 있게 만들었다.
LRP 관련 블로그 포스팅:
- https://prgmti1.tistory.com/entry/XAI-Reading-Log-1?category=929664
- https://prgmti1.tistory.com/entry/XAI-Reading-Log-2?category=929664
개발한 프로그램 관련 포스팅:
시각화 툴 소스코드: https://github.com/taegukang35/CNN-Interpret-Tool
■ 3학년 1학기: 그래프 컷을 활용한 영상 분할 알고리즘 구현
이전에 딥러닝 모델을 직접 학습시키거나 딥러닝 방식에서부터 벗어나고자 이진화나 K-Means 클러스터링의 방법을 시도하여 영상 분할을 구현해보기도 했었다. 최적화 분야를 공부하기 위해 ‘영상 이해를 위한 최적화 기법' 강의를 듣던 중 이미지 분할과 관련된 내용이 있었고 에너지 함수를 가지고 variational 한 방법으로 최적화를 진행하거나 조합적 방법으로 그래프 컷에 기반하여 물체/배경 으로의 영상 분할을 진행하는 아이디어를 얻을 수 있었고 특히 그래프 컷을 활용해 영상 분할을 하는 아이디어가 흥미로웠다. 이에 영상 분할에 대한 최적화 방법들을 정리하고 관련 알고리즘을 학습하며 아이디어를 구체화시켜 밑바닥부터 직접 구현해 실제로 이미지를 주었을 때 영상 분할을 진행할 수 있도록 제작하였다.
- 아이디어 관련 포스팅
- 개발 프로그램 소스코드: https://github.com/taegukang35/graphcut_segmentation
지금까지 매 학기 창개연을 참여했었는데 돌아보면 영상 분할이란 하나의 큰 궁금증을 해결하려고 다양한 방법론으로 접근하려 시도했고 의도치 않게 CNN, XAI, 최적화적 지식의 축적으로 나아갈 수 있었다.
7. 미래 수학자 대회
정보과학만큼 수학도 좋아하는 나에게 미래 수학자 대회는 매년 참가해 좋은 결과를 받았다. 1학년 때는 작렬히 전사하고 2, 3학년 때 본선에 진출했다. 2학년 땐 N-gram 기반으로 랩 벌스 생성하는 알고리즘을 제작해 프로그램 만든 것을 소개했고, 3학년 땐 최적화에서 많이 쓰이는 뉴턴 메서드의 수렴성 증명과 가우스-뉴턴 법등 확장 내용을 소개하였다.
■ 2학년: 조건부 확률과 Markov Cahin을 이용한 확률적 랩 벌스 생성
■ 3학년: 수학적 최적화에 적용되는 Newton's Method의 수렴성 증명과 확장
영상: https://www.youtube.com/watch?v=P8H9NdWlPt4&ab_channel=TaeguKang
8. 자연학술탐사
우리 학교에서는 자연학술탐사를 2, 3학년 때 가는데 2학년 땐 시화호에 갔고 3학년 땐 제주도에 갔었다. 사실 생물이나 지구과학 관련 연구를 진행하는 친구들이 많았지만 나는 둘 다 컴퓨터 비전 쪽으로 영상처리 분야를 다뤘다. 자연 학술보단 컴퓨터 비전에 대한 관심이 더욱 커지게 된 과정들이었다. 시화호에선 파노라마 이미지 생성 알고리즘을 구현했고 제주도 수월봉에선 탄낭구조를 인식하고 돌의 넓이 및 곡률을 계산하는 과정을 자동화시키는 연구를 진행했다.
■ 2학년: Image Stitching 기법을 이용한 시화호 풍경 파노라마 이미지 생성
시화호에 가서 사진 데이터를 수집했다. SIFT 알고리즘으로 이어 붙일 두 이미지 A, B에 대해 key point를 추출하여 매칭 했고 RANSAC 알고리즘으로 이미지 A의 keypoint와 매칭 되는 이미지 B의 keypoint로부터 Homograpy matrix를 구해 image B를 warping 변환을 진행하고 겹치는 부분에 블랜딩을 적용해 병합하도록 했고 여러 이미지에 대해서 적용시킬 수 있게 확장했었다. 컴퓨터 비전 쪽을 공부하면서 이미지 처리하는 방법에 관심이 많았었는데 SIFT, RANSAC의 원리를 찾아보고 직접 워핑 변환을 진행해 이미지를 이어 붙여 컴퓨터 비전에 쓰이는 여러 원리와 기술들에 대한 이해도가 높아졌다.
돌아보면 R&E에서 사진을 위에서 내려다본 것처럼 변환을 진행할 때 연산 속도면에서 고민하고 있었는데 호모그래피 행렬을 계산해 워핑 변환을 진행해 빠르게 변환을 진행하여 해결했었다. 이 프로젝트를 진행했던 경험이 문제를 해결하는데 도움이 된 것 같다. 또 이후에 OpenCV 책을 사서 전반적인 컴퓨터 비전에 대한 개요를 넓히기도 다크 프로그래머 님의 영상처리 글들을 읽으며 틈틈이 공부했었다. 컴퓨터 비전은 항상 재밌다.
■ 3학년: 영상인식 기법을 활용한 탄낭 구조 이미지 분석
수월봉에서 탄낭 구조 사진을 수집하였고 이진화, GrabCut, k-Means 클러스터링 등 영상인식 기법을 활용해 탄낭 구조를 추출하였다. 컨투어를 구해 원으로 근사시켜 탄낭 구조의 곡률을 계산할 수 있는 프로그램을 개발하였다. 단순히 한 방법만 시도해본 게 아니라 여러 차례 실패를 겪고 원인을 분석하고 이를 극복하기 위한 방법을 고민하고 여러 아이디어를 내며 프로젝트를 성공적으로 이끌었다. 구체적인 예시로는 영상의 밝기 정보만 가지고 영역 분할을 진행하려고 이진화를 진행했지만 실패해서 k-means 클러스터링으로 색상 정보도 활용하고자 했으나 실패했고 이진화와 그래프 컷 기반 알고리즘을 활용해 영역 분할에 성공할 수 있었다. 원을 피팅할 때도 이전 방법론으론 잘 적용이 되지 않아 추출한 영역의 경계를 구하고 접하는 원을 찾는 방식으로 해결했다.
9. 그 외 기억에 남는 프로젝트들
■ 딥러닝과 최소자승법을 이용한 이차곡선 피팅
이차곡선의 매개변수 방정식을 이용해 노이즈를 포함한 데이터를 생성했고 단순화를 위해 회전은 고려하지 않았다. 타원, 포물선, 쌍곡선을 분류하도록 덴스 레이어 쌓아서 딥러닝 모델을 학습시켰다. 이차곡선의 방정식을 알아내기 위해 포물선의 경우에는 f(x) = ax^2+bx+c 가 있을 때 (x_i^2 x_i 1)을 행 벡터로 쭉 쌓은 것을 A, X = [a, b, c]^T, B = [y1, y2,..., yn]^T로 두어 AX = B 꼴로 나타내어 pseudo inverse로 계산해 X를 얻어내었다. 타원과 쌍곡선의 경우에는 1차 선형식이 아니라 최소자승법을 그대로 적용하기 힘들어 x^2 항을 우변으로 넘겨 AX = B 꼴로 변형하여 가우스-뉴턴 방법으로 풀었다. 최적화 분야에 조금 관심을 갖고 있었는데 이차곡선 피팅을 진행하면서 최소자승법의 아이디어와 문제를 최소자승법으로 정식화하는 과정에 대해 이해도가 높아질 수 있었고 최적화 분야가 재밌게 다가왔다. 당시 그냥 받아들인 것 같지만 가우스-뉴턴 방법으로 비선형 연립방정식을 풀어내는 방법과 pseudo-inverse의 개념도 흥미로웠다.
■ 라그랑주 완화를 이용한 서포트 벡터 머신(SVM) 구현
나는 <알고리즘 인생을 계산하다> 8장 완화를 읽으면서 최적화 문제에서 여러 제약조건이 있는 경우 문제를 풀기 어려운데 불가능성을 페널티로 전환하여 문제를 푸는 라그랑주 완화를 이용하면 문제를 좀 더 쉽게 풀 수 있음을 알게 되었고 어떻게 라그랑주 완화를 적용할 수 있을까 궁금해 혁펜하임님의 강의를 들으며 Convex Optimization 분야를 파고들면서 여러 제약조건이 있는 최적화 문제를 푸는 방법에 대해 공부를 진행하였다. 이전에 직관적으로만 이해했던 SVM(Support Vetor Machine)은 마진을 최대화할 조건을 찾는 수학적 최적화 문제로 공부한 내용을 적용해볼 수 있는 좋은 문제라고 판단하였다. SVM을 수학적으로 기술하고 라그랑주 완화를 이용해 부등식 제약조건을 완화시키고 KKT 조건을 변형해서 풀어내는 Primal-dual Interior Point Method를 활용해 SVM을 구현하였다.
- 영상: https://www.youtube.com/watch?v=OQy1YWBChH0&ab_channel=TaeguKang
- 소스코드: https://github.com/taegukang35/convex_optimization/blob/main/svm.py
최근엔 딥러닝이 이런 문제를 효과적으로 풀어줄 수 있지만 Convex Optimization 분야를 공부하며 직접 문제를 정의하고 라그랑주 완화를 적용하고 KKT 조건을 분석하며 이를 알고리즘적으로 풀어내기 위한 최적화 기법들(배리어법, interior point method, Primal-dual IPM 등)을 공부해보고 다변수에 대한 미분 과정과 뉴턴 메서드를 적용해보는 등 공부한 내용들을 모두 응용해볼 수 있는 좋은 경험이었다. 그리고 최적화 분야를 대학가서도 계속 공부하고 싶다는 생각이 들었다.
■ Damped Oscillation Simulator using Runge-Kutta Method
내가 정보만 파는 친구처럼 보일 수 있지만 2학년 때부터 내신 공부도 꽤나 열심히 했기 때문에 수학과 물리에 대한 관심도 또한 높다. AP 일반물리학을 공부하면서 감쇠 진동 운동이 물리적으로, 수학적으로나 흥미로웠다. 물체의 변위 x에 대해 운동 방정식을 가지고 비제차 2차 미분방정식을 풀어 직접 해를 구해 물체의 운동을 분석할 수 있다. 최적화 분야를 공부하며 수치해석 분야에 관심이 많아져서 미분방정식의 해를 직접 구하지 않고도 수치해석적으로 구할 수 없을까 궁금했고 이를 위해 수치해석적으로 미분방정식을 풀어낼 수 있는 오일러 방법과 룽게쿠타법에 대해 알아보고 감쇠 진동 운동에 적용해보고자 했다. 룽게쿠타법을. 적용 가능하게 감쇠 진동 식을 변형하고 변위를 수치해석적으로 구할 수 있게 알고리즘을 구성하고 만든 over-damping, critical-damping, under-damping 등 세 가지로 나눠 일반 해와 수치해석적으로 구한 결과를 비교하였고 거의 일치했다. 이와 비슷하게 1학년 때는 현실적인 원판 던지기 시뮬레이션을 구현했었는데 물리와 정보, 수치해석 등을 융합하면 재밌게 할 것들이 꽤나 많은 것 같다.
- 영상: https://www.youtube.com/watch?v=MjitQ7oooBk&t=389s&ab_channel=TaeguKang
- 소스코드: https://github.com/taegukang35/analytic_simulations/blob/main/damped_oscillation.py
10. 글을 마치며
크게는 컴퓨터 과학, 머신러닝, 최적화 좋아했었고 그때그때 관심사에 맞게 파고들면서 재밌게 살아온 것 같았는데 궁금했던 점들, 공부하고 싶었던 점들, 머신러닝이나 최적화 분야 등 팔 수 있을 때까지 계속 파온 과정이 뿌듯하다. 학교생활을 돌아보면 중간중간 내신이나 연구 등이 잘 안 풀리는 순간들도 많았지만 결국 돌아보면 다 극복한 것 같다. 내가 과학고에 오지 않았더라면 어떤 삶을 살고 있었을까. 감히 상상이 잘 안 된다. 과학고는 나에게 있어 많은 경험과 배움의 장소이다. 비록 처음엔 서툴고 못할지라도 진지하고 순수한 자세로 임하면 결국 해낼 수 있다는 마인드를 얻게 된 경험이 앞으로 인생을 살아갈 때 많은 도움이 될 것 같다.
'Project' 카테고리의 다른 글
Graph-Cut 을 이용한 영상 분할 구현 (1) | 2023.02.12 |
---|---|
TOBDA App 개발 근황 (2) | 2021.09.23 |
톺다(TOBDA), 시각장애인의 진정한 독립보행을 돕다 (0) | 2021.08.10 |
두 과고생의 뜨거운 도전, 2020 캔위성 경연대회 (2) | 2021.04.03 |