딥러닝 모델의 정확도 올리기
안녕하십니까? 딥러닝 모델의 정확도 올리는 노하우에 대해서 이야기할 공우 12기 AI매니아입니다!
이 글에서는 제가 컴퓨터 비전 관련 딥러닝 경진대회를 나갔던 경험을 바탕으로 모델의 정확도를 올리기 위해 적용한 네 가지 방법들에 대해서 소개해 드리고자 합니다.
또한, 일반적으로 컴퓨터 비전 문제에서 학습 데이터를 가공하는 Data Augmentation이 어떻게 이루어지는지에 대해서도 소개하겠습니다.
대회 정보/해결한 문제
우선 제가 참가했던 대회는 여러 종류들의 물체들을 진열한 다음에 바운딩 박스로 어디에 어떤 종류의 물체가 있는지를 인식해야 했는데요, mAP(mean Average Precision)라고 해서 인식 정확도가 높을수록, 그리고 처리 속도가 빠를수록 높은 점수를 얻는 대회였습니다.
이 대회에서 정확도를 99% 대까지 올릴 수 있었는데, 그 과정에서 어떤 시도들을 했는지 소개하겠습니다.
1. 좋은 모델을 선택하자
제가 활용한 첫번째 방법은 좋은 모델을 선택하는 것이였습니다. 대회 OT에서 예시로 소개한 네트워크는 darknet의 YoLOv3였는데, 이의 단점을 보완한 YoLOv4도 darknet 오픈 소스에 있었습니다. 그래서 이를 활용해보니 65.20%까지 올릴 수 있었습니다.
그래서 좋은 모델을 선택하는 게 이런 차이를 만들어 내는구나를 수치적으로 실감하게 되었습니다.
2. 테스트 데이터를 정복하자.
두 번쨰 방법은, 테스트 데이터를 이해하는 것이였습니다. 보통 제가 문제를 해결하기 위해 필요한 정보는 대회 문제 설명에 다 나와있었다고 생각해서 테스트 데이터를 굳이 다 뜯어보려고 하지는 않았었습니다. 그런데 아무리 iteration 수를 늘려도 정확도가 70% 근처에서 정체되는 현상이 발생하자 뭔가 이상하다고 생각했었습니다. 그 이유를 테스트 데이터를 열어보자마자 깨닫게 되었습니다.
왜냐하면 일반 조명 하에서 촬영된 데이터들 뿐만 아니라 조명 색깔이 바뀐 경우도 테스트 데이터에 포함이 되어 있었기 때문입니다. 당연히 일반 조명 데이터셋만을 가지고 학습을 시켰기 때문에 조명 색깔이 바뀌는 순간 인식을 잘 하지 못하게 되었던 것입니다.
그래서 부랴부랴 RGB 픽셀 시프트를 이용하여 총 4가지 종류의 조명효과를 준 데이터셋을 제작하게 되었습니다. 몇 픽셀 시프트가 적당한지는 실험하면서 찾았고 원래 있었던 10만 장 정도의 데이터를 5배로 늘릴 수 있게 되었습니다.
그뿐만 아니라 처리 시간을 빠르게 하기 위해 YoLOv4-tiny 모델로 갈아탄 다음에 전형적인 하이퍼파라미터 튜닝 과정을 거쳐서 47000 iteration 만에 97.44%를 달성할 수 있게 되었습니다.
3. 광범위한 하이퍼파라미터 튜닝
세 번째 방법은 광범위한 Hyperparameter Tuning입니다. 실제 YoLO에서 튜닝할 수 있는 하이퍼파라미터의 양이 생각보다 많았습니다. 배치 사이즈라던지, 딥러닝 모델이 보는 이미지의 해상도를 의미하는 height & width 라던지 등등 많았습니다. 그래서 대회가 약 4일 남은 시점부터는 이런 튜닝을 하는데만 대부분의 시간을 보낸 것 같습니다. 덕분에 learning rate(학습률) 스케줄링과 더불어 h&w 값을 변화시켜 가면서 실험한 결과 정확도 99%대를 달성할 수 있었습니다.
4. 다양한 방법을 통한 데이터셋 확장
네 번째 방법은, 저만의 데이터셋을 갖추는 것이였습니다. 대회 측에서는 여러 물체들이 함께 찍힌 사진들 뿐만 아니라, 각 종류의 물체만이 나온 배경이 제거된 segmentation 이미지도 제공했습니다. 이것들을 잘 합쳐서 여러 물체들이 있는 이미지들을 만들어 보라는 것입니다. 그래서 원하는 위치에 원하는 개수만큼 물체를 배치할 수 있습니다. 제가 활용했던 알고리즘은 다음과 같습니다.
활용할 물체의 종류 수 N을 정하고 각각을 랜덤한 위치에 놓습니다. 그 다음에 두 가지 이상의 물체가 겹친 면적을 계산해서 그게 전체 면적의 1/8을 넘어가면 다시 만들게 합니다. 하지만 안타깝게도 이런 방법은 대회 막바지에 시도하기 시작해서 N = 2,3일때 각각 10000장 씩 데이터셋에 추가해서 학습시키는 선에서 마무리했습니다.
그래서 이러한 방법들을 총동원한 결과 validation 정확도 기준으로 99.3% 이상을 얻을 수 있었습니다.
Data Augmentation
그렇다면 마지막으로 컴퓨터 비전 문제에서 학습 데이터를 가공하는 Data Augmentation이 어떻게 이루어지는지에 대해서도 간략하게 다뤄보고 마무리하겠습니다.[1]
유명한 개/고양이 분류 문제나 물체 인식에서는 데이터를 확충하기 위해 이런 시도들을 해볼 수 있습니다. 여기에 개 사진이 있는데, 이 사진을 확대하거나 축소해도 개라는 사실은 변하지 않습니다. 그런데 신경망 입장에서는 픽셀 단위로 데이터를 처리하다 보니까 굉장히 다른 사진이 되기 때문에 마치 데이터를 하나 더 얻은 듯한 효과를 볼 수가 있습니다. 사진을 돌리거나 랜덤한 노이즈를 주거나 blur을 주거나 색을 살짝 변화시켜도 마찬가지입니다.
이와 같이 데이터를 임의로 변형해 데이터의 수를 늘리는 방법을 Data Augmentation이라고 합니다.
일반적으로 이미지 분류 문제에서 이를 적용하면 성능이 소폭 상승함이 알려져 있습니다.[2]
비교적 최근에 제안된 Cutout과 Cutmix에 대해서 보면, Cutout은 이미지의 일부를 도려내는 기법이고, Cutmix는 그 도려낸 자리를 다른 범주에 속하는 이미지로 대체하여 면적 비율만큼의 라벨값을 주는 기법입니다. 이 두 기법 모두 일반적인 이미지 분류 문제에서 다른 Data Augmentation 기법들보다 성능이 뛰어나다는 것이 논문을 통해 밝혀졌습니다.
마무리하며
제가 활용했던 방법들은 주로 모델에 관한 대단한 지식이 필요한 방법들이 아니라, 학습 데이터를 어떻게 가공하는지, 여러 하이퍼파라미터들을 어떻게 조정하는지와 관련이 깊었습니다. 앞으로 딥러닝 모델을 적용할 때 이런 방법들을 활용하면 좋은 성능의 모델을 얻는 데에 도움이 될 것입니다. 감사합니다.
이미지 출처 & 참고 자료
[1] https://medium.com/lunit/photometric-data-augmentation-in-projection-radiography-bed3ae9f55c3
[2] CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features (2019)
[3] <파이썬 딥러닝 파이토치> ,이경택 외, p.147~148
'STEM - 학술세미나 > 컴퓨터공학' 카테고리의 다른 글
컴퓨터공학과: 넥슨 본사에서 넥슨 게임을 키다...! Vol. 2 (0) | 2022.12.24 |
---|---|
3D 렌더링에 인공지능을 어떻게 사용할까? (2) | 2022.04.12 |
딥러닝을 활용하여 입술 모양을 단어로 추측하기 (4) | 2022.02.08 |
YoLO로 객체 인식하기 (2) | 2021.12.31 |
Invertible Adversarial Attack (1) | 2021.10.31 |
댓글