안녕하세요.

이번 글에서는 2019년도 이후 부터 현재 글을 쓰고 있는 시점인 2021년 (9월) 까지object detection (based on deep learning) 모델에 대해서 소개하려고 합니다.

 

현재 제 블로그에 작성한 Object detection 모델은 YOLOv3까지입니다. 그 이유는 제가 2018.05월에 석사 졸업논문을 쓸 당시 주로 사용되던 최신모델이 YOLOv3, SSD, RetinaNet이었기 때문이죠. (RetinaNet은 아직 업로드가 안되어 있는데, 추후에 빠르게 업로드 하도록 하겠습니다!)

 

그럼 지금부터 2021년까지의 Object Detection model trend 변화를 설명해보도록 하겠습니다.

 

Note1. 참고로 모델의 trend만 설명드리는거라 디테일한 설명은 하지 않을 예정입니다. 디테일한 기술부분은 차후에 따로 해당 모델에 대한 논문을 리뷰하는 방식으로 업로드 하도록 하겠습니다!

Note2. 이 글에서 trend라고 설명되는 모델들은 저의 주관과 paperwithcode를 기반으로 선택된 모델들임을 미리 말씀드립니다!  

 

 

 

 

1. Object Detection History (From 2013 ~ 2019)

2013년최초의 딥러닝 기반 object detection 모델R-CNN등장했습니다. 이 후, R-CNN 계열의 object detection 모델인 Fast R-CNN, Faster RCNN 모델들이 좋은 성과를 보여주고 있었죠. 그러다, 2016년에는 YOLOSSD등장하면서 새로운 계열의 딥러닝 기반 object detection 모델이 등장하게 됩니다. 2017년에는 RetinaNet이 등장하면서 높은 성능을 보여주기도 했죠. (Mask-RCNN 모델도 등장하긴 했지만, Mask-RCNN 모델은 segmentation 분야에서 더 설명할 수 있는게 많은 모델이라 여기에서는 따로 object detection 모델의 mile stone으로 언급하진 않겠습니다)

<그림1 출처:&nbsp; https://mlai.iptek.web.id/2019/01/20/object-detection-state-of-the-art-progress/>

 

<그림2 출처. YOLOv3 논문>

 

2018.04월 치매환자 행동패턴 분석연구를 하기 위해 이용했던 딥러닝 모델들이 SSD, RetinaNet, YOLOv3 정도가 있었던거 같습니다. (당시에 TF 1.5 버전을 쓰면서 좋아했던 기억이.... )

 

"그럼 언제부터 새로운 object detection 모델들이 등장하기 시작했나요?"

 

앞서 언급했던 모델들이 오랜 시간동안 사용되다가  2019년 후반부터 새로운 object detection model 등장하기 시작했습니다. 2019년부터 CNN 모델에 다양한 변화가 일어나기 시작했는데, 이러한 변화가 object detection 모델에 영향을 주었습니다. (Object detection 모델classification task와 bounding box regression task가 결합된 multi-task loss로 구성되어 있기 때문에 CNN의 변화가 생기면 classification task에 영향을 주게 되겠죠? 만약 좋은 영향을 주면 그만큼 object detection 모델의 성능도 좋아질테니까요!)

 

<그림3 출처. CS231n>

 

그럼 지금부터 해당 모델들을 순차적으로 설명해보도록 하겠습니다.

 

 

 

 

 

 

 

2. EfficientDet (2020 CVPR)

2-1. EfficientNet

2019.03월 arXiv에 EfficientNet이라는 논문이 등장합니다.

  • 2019.03.28 arXiv 등록
  • 2019 ICML accept

https://arxiv.org/abs/1905.11946

 

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

Convolutional Neural Networks (ConvNets) are commonly developed at a fixed resource budget, and then scaled up for better accuracy if more resources are available. In this paper, we systematically study model scaling and identify that carefully balancing n

arxiv.org

 

 

보통 CNN은 224×224 크기로 training&evaluation을 진행했는데, CNN의 입력크기를 키워줄 수록, 성능이 좋아진다는 사실을 알게 됐습니다. 입력 크기를 키워주려면 CNN의 규모(scale) 자체를 크게 키워야 하는데, 어떻게 하면 적절하게 규모를 키워 줄 수 있을지에 대한 방법론이 연구되었습니다. 이 과정에서 AutoML 기법을 도입하여 적절한 CNN 모델을 만들게 되었고, 이것을 EfficientNet이라고 부르게 되었습니다. 드디어 EfficientNet의 등장으로 CNN 모델이 84% top-1 accuracy를 넘어서는 성능을 보여주기 시작했죠

 

 

 

(↓↓↓입력이미지 크기에 따라 Efficient 모델 버전(ex: B0, B1, ..., B7)을 나눈 것↓↓↓) 

<그림4 출처.&nbsp; https://developpaper.com/keras-efficient-net-introduces-that-the-rising-point-of-imagenet-task-is-obvious/>

 

 

2-2. EfficientDet

2019.03 EfficientNet 모델이 등장하고 8개월 후, EffcientNet을 backbone (for classification task)으로 한 EfficientDet이 등장하게 됩니다.

  • 2019.11.20 arXiv 등록
  • 2020 CVPR accept

https://arxiv.org/abs/1911.09070

 

EfficientDet: Scalable and Efficient Object Detection

Model efficiency has become increasingly important in computer vision. In this paper, we systematically study neural network architecture design choices for object detection and propose several key optimizations to improve efficiency. First, we propose a w

arxiv.org

 

 

(↓↓↓EfficientDet 논문을 보면 Bacbone Network로 EfficientNet을 사용한 걸 확인할 수 있습니다↓↓↓)

 

 

EfficientDet의 등장으로 50 AP넘는 object detection 모델이 등장하기 시작했고, EfficientDet 모델은 2020년 초반까지 object detection SOTA 모델의 자리를 유지합니다. 

 

 

 

 

 

 

3. Deformable DETR

기존 object detection은 CNN을 기반으로 다양한 bounding box regression 기법을 연구하는 방향으로 진행되어왔습니다. 하지만, 2020년 초반부터 NLP 분야에서 사용되던 attention기반의 transformer 기법을 object detection에 적용해보려는 시도가 이루어지면서 새로운 object detection 모델들이 등장하게 됩니다.

 

3-1. Transformer (Feat. Attention)

2017.06월GoogleNLP(자연어처리) 분야에서 attention mechanism을 기반으로한 Transformer 모델을 소개합니다.

  • 2017.06.12 arXiv 등록
  • 2017 NIPS accept

 

https://papers.nips.cc/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html

 

Attention is All you Need

Attention is All you Need Part of Advances in Neural Information Processing Systems 30 (NIPS 2017) Authors Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin Abstract The dominant seque

papers.nips.cc

 

 

 

 

3-2. DETR

2020.03월Facebook NLP (자연어처리) 분야에서 사용하던 Transformer 기술들을 CV (컴퓨터 비전)에 적용하기 시작합니다.

  • 2020.03.22 arXiv 등록
  • 2020 ECCV accept

https://arxiv.org/abs/2005.12872

 

End-to-End Object Detection with Transformers

We present a new method that views object detection as a direct set prediction problem. Our approach streamlines the detection pipeline, effectively removing the need for many hand-designed components like a non-maximum suppression procedure or anchor gene

arxiv.org

 

 

 

 

하지만, 성능자체는 기존 object detection 모델의 성능보다 높게 나오지는 않았습니다. 사실 EfficientDet(←2019.11월 출현 & 50 AP)에 비하면 성능이 많이 뒤쳐지는 편이죠. 여기서 인지해야 하는 부분이 DETR에서 transformer를 사용했다는걸 ViT모델을 사용했다는 걸로 착각하시면 안된다는 점입니다. (참고로 ViT 모델은 DETR가 나오고 7개월 후인 2020.10월에 등장합니다. )

 

 

3-3. Deformerable DETR

DETR 모델이 등장하고 7개월 후에, DETR 모델의 후속연구로 Deforma DETR출현합니다.

  • 2020.10.08 arXiv 등록
  • 2021 ICLR accept

https://arxiv.org/abs/2010.04159

 

Deformable DETR: Deformable Transformers for End-to-End Object Detection

DETR has been recently proposed to eliminate the need for many hand-designed components in object detection while demonstrating good performance. However, it suffers from slow convergence and limited feature spatial resolution, due to the limitation of Tra

arxiv.org

 

 

Deformable DETR에서는 deformable attention module을 이용하여 성능을 높이려고 시도했습니다.

 

 

Deformable DETR의 성능이 EfficientDet보다 조금씩 더 나은 것을 볼 수 있었습니다. 이것을 통해 Transformer를 CV에 접목하려는 연구가 주목을 받기 시작했죠.

 

 

 

 

4. YOLOS

2020.10월 ViT 모델의 등장으로 object detection 모델의 backbone을 기존 CNN에서 Transformer 계열로 바꾸려는 시도가 이루어지기 시작합니다.

 

4-1. ViT

2020.10월 Deformable DETR로 인해 object detection 분야에서 Transformer의 관심을 보이기 시작했다면, 동시에 classification 분야에서는 2020.10월 ViT 모델의 등장으로 Transformer에 대한 관심이 뜨거워졌습니다. (Transformer라는 개념을 처음 소개한 것도 google이고, Transformer를 object detection에 처음 접목시킨 DETR도 google이고, Transformer를 (vision) classification에 처음 접목시킨 것도 google이네요 ㅎㄷㄷ...)

  • 2020.10.22 arXiv 등록
  • 2021 ICLR accept

 

https://arxiv.org/abs/2010.11929

 

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

While the Transformer architecture has become the de-facto standard for natural language processing tasks, its applications to computer vision remain limited. In vision, attention is either applied in conjunction with convolutional networks, or used to rep

arxiv.org

 

 

 

 

하지만, ViT의 단점 중 하나는 모델이 지나치게 크기 때문에 학습을 시키기 위해서 방대한 양의 데이터를 필요로 한다는 점이었죠. (물론 모델이 크기 때문에 transfer learning에 적합하지 않다는 지적도 받았습니다.)

 

 

 

4-2. DeiT (Data-efficient Image Transformer)

기존에 ViT에서 지적된 것 중 하나가 방대한 양의 데이터셋을 필요로 한다는 점이었습니다. Transfer learning 관점에서 보면 pre-training을 위해 방대한 양의 데이터셋이 필요한 것이라고 볼 수 있죠. 이러한 단점극복하기 위해 FacebookDeiT이라는 classification 모델 제안하게 됩니다.

  • 2020.12.23 arXiv 등록
  • 2021 ICML accept

https://arxiv.org/abs/2012.12877

 

Training data-efficient image transformers & distillation through attention

Recently, neural networks purely based on attention were shown to address image understanding tasks such as image classification. However, these visual transformers are pre-trained with hundreds of millions of images using an expensive infrastructure, ther

arxiv.org

 

 

DeiT 모델 구조 자체는 ViT와 유사합니다. 대신, vision transformer 계열의 모델을 학습 시킬 때 기존의 CNN 방식과 다른 학습 기법을 적용했다는 것이 ViT와 큰 차이라고 볼 수 있습니다. 예를 들어, vision transformer 모델에 적합한  augmentation, optimization, regularization 등의 기법을 찾으려고 시도했고, 효율적인 학습을 위해 knowledge distillation 기법을 transformer 모델에 적용 (←Transformer-specific distillation) 하려는 노력도했습니다. (참고로 knowledge distillation을 적용했을 시에 teacher 모델로 RegNet을 이용했다고 하네요)

 

 

위와 같은 ViT와 같이 방대한 양의 학습 데이터 없이도 EfficientNet 보다 classification 성능이 좋은 vision transformer 모델을 선보이게 됩니다.  

 

 

4-3. YOLOS

Note1. 기존에 알고 있는 YOLO 모델 계열과 전혀 관계가 없다는 것을 알아두세요!

 

2021년에 들어서자 object detection 모델의 backone으로써 vision transformer 계열의 모델을 사용하는 연구가 진행됩니다. 

  • 2021.06.01 arXiv 등록
  • 2021 ICML accept

 

https://arxiv.org/abs/2106.00666

 

You Only Look at One Sequence: Rethinking Transformer in Vision through Object Detection

Can Transformer perform $2\mathrm{D}$ object-level recognition from a pure sequence-to-sequence perspective with minimal knowledge about the $2\mathrm{D}$ spatial structure? To answer this question, we present You Only Look at One Sequence (YOLOS), a serie

arxiv.org

 

항저우 대학은 앞서 소개되었던 DeiT이라는 classification 모델을 object detection 모델의 backbone으로 사용하여 YOLOS라는 object detectioin 모델을 만듭니다. 하지만, 기존 object detection 모델에 비해 좋은 성과를 거두지는 못합니다 (오히려 EfficientNet, Derformalbe DETR 성능이 더 좋은 것 같네요).   

 

 

 

 

 

5. Scaled YOLO v4

YOLO계열의 object detection 모델은 real-time이라는 측면에서 많은 사랑을 받아왔습니다. 하지만, 상대적으로 낮은 AP 성능으로 인해 YOLO v3 이후 많은 외면을 받아오기도 했는데요. 올해 제안된 YOLO 계열의 object detection 모델이 56 AP 성능을 기록하면서 다시 한 번 주목을 받고 있습니다. 

 

5-1. YOLO v1, YOLO v2, YOLO v3

2015년 첫 real-time object detection 모델인 YOLO v1이 출현합니다. 하지만, real-time에 초점을 맞춘 나머지 정확도 측면에서 많은 아쉬움을 주었죠.

  • 2015.06.08 arXiv 등록
  • 2016 CVPR accept

https://arxiv.org/abs/1506.02640

 

You Only Look Once: Unified, Real-Time Object Detection

We present YOLO, a new approach to object detection. Prior work on object detection repurposes classifiers to perform detection. Instead, we frame object detection as a regression problem to spatially separated bounding boxes and associated class probabili

arxiv.org

 

그리고, 1년 뒤 YOLO v1의 정확성보완YOLO v2 모델등장합니다. 이때부터 YOLO 계열의 object detection 모델이 많은 연구자들에게 관심을 받기 시작하죠.

https://arxiv.org/abs/1612.08242

 

YOLO9000: Better, Faster, Stronger

We introduce YOLO9000, a state-of-the-art, real-time object detection system that can detect over 9000 object categories. First we propose various improvements to the YOLO detection method, both novel and drawn from prior work. The improved model, YOLOv2,

arxiv.org

 

YOLO v2의 개발자 Joseph Redmon은 Ted 나가서도 자신의 모델을 강연하는 등 대중들에게 YOLO 라는 모델을 각인시키는 노력도 합니다.

https://www.youtube.com/watch?v=Cgxsv1riJhI 

 

 

Joseph Redmon은 YOLO v2가 나온 후 2년이 지난 2018년에 YOLO v3를 보여줍니다. 

  • 2018.04.08 arXiv 등록

https://arxiv.org/abs/1804.02767

 

YOLOv3: An Incremental Improvement

We present some updates to YOLO! We made a bunch of little design changes to make it better. We also trained this new network that's pretty swell. It's a little bigger than last time but more accurate. It's still fast though, don't worry. At 320x320 YOLOv3

arxiv.org

 

 

YOLO v3는 다른 학회에 제출하지는 않고 Tech Report 형식으로 arXiv에 올리기만 했는데 그 이유는 다음과 같습니다. 사실, Joseph Redmon은 YOLO v3 Tech Report에서도 computer vision 분야에서 object detection 모델을 개발하는 것에 대한 윤리적 책임감을 강조했습니다. 어떤 이유가 결정적이었는 지는 모르겠지만, YOLO v3 모델을 개발하고 2년 후 자신은 object detection 모델을 개발하는 것을 그만두겠다는 트윗을 올리게 되죠. 그 이유는 아래와 같이 군사적 목적으로 쓰이는걸 원치않았기 때문이라고 합니다. 

 

 

 

 

5-2. YOLO v4

2018년 석사시절에 필자는 YOLO v3를 사용할 때, Joseph Redmon의 official site를 이용하지는 않았습니다. (질문을 올려도 답을 잘 안해줬던 기억이...) 이 당시에 Alexey라는 russian reseacher의 github에서 YOLO v3를 자주 이용했습니다. 

 

 

질문하면 정말 빠르게 피드백 해주어서 연구할 때 많은 도움을 받았던 기억이 있네요...ㅎ (사실, 설치나 코드 파악하기에도 Alexey의 코드가 더 보기 편했던 것 같습니다.)

 

 

2020.02월에 Joseph Redmon이 YOLO v4에 대한 개발 포기를 선언하자, 2달뒤 2020.04월에 Alexey가 YOLO v4 모델을 개발합니다.

  • 2020.04.23 arXiv 등록
  • 2020 CVPR accept

https://arxiv.org/abs/2004.10934

 

YOLOv4: Optimal Speed and Accuracy of Object Detection

There are a huge number of features which are said to improve Convolutional Neural Network (CNN) accuracy. Practical testing of combinations of such features on large datasets, and theoretical justification of the result, is required. Some features operate

arxiv.org

 

EfficientDet에 비교하면 아직 아쉬운 수준이었지만, 기존 YOLO v3보다는 더 좋은 성능을 보여주었습니다. 아래 figure1을 보면 GPU V100 모델 기준으로의 높은 FPS 성능을 보여주고 있기 때문에 충분히 낮은 GPU 성능이 장착된 작은 device에 임베딩해서도 사용될 수 있음을 예상 할 수 있습니다.

 

 

 

5-3. YOLO v5

YOLO v4라는 논문이 2020.04월에 나온 후, 곧바로 한 달뒤인 2020.05월에 YOLO v5가 나왔습니다.  그런데, YOLO v5는 arXiv와 같은 paper형식이 아닌 blog site에 소개가 됩니다.

https://blog.roboflow.com/yolov5-is-here/

 

YOLOv5 is Here

State of the art object detection at 140 FPS.

blog.roboflow.com

 

https://docs.ultralytics.com/

 

YOLOv5 Documentation

Introduction To get started right now check out the Quick Start Guide What is YOLOv5 YOLO an acronym for 'You only look once', is an object detection algorithm that divides images into a grid system. Each cell in the grid is responsible for detecting objec

docs.ultralytics.com

 

AP와 FPS 측면에서 모두 성능향상을 이루긴 했지만, machine learning commuity에서 여러 의견이 있었던 것 같습니다. 특히, YOLO v4의 저자인 Alexey가 성능을 측정하는 것에 대해 여러 문제점을 제기했다고 합니다. (자세한 내용은 아래 사이트의 "Controversy in machine learning community" section에서 확인해주세요!)

https://towardsdatascience.com/yolo-v4-or-yolo-v5-or-pp-yolo-dad8e40f7109

 

YOLO v4 or YOLO v5 or PP-YOLO?

What are these new YOLO releases in 2020? How do they differ? Which one should I use?

towardsdatascience.com

 

 

5-4. Scaled YOLO v4

Alexey는 YOLO v4를 개발하고 7개월 뒤 (2020.11) 후속연구인 Scaled YOLO v4를 발표합니다. 

  • 2020.11.16 arXiv 등록
  • 2021 CVPR 

https://arxiv.org/abs/2011.08036

 

Scaled-YOLOv4: Scaling Cross Stage Partial Network

We show that the YOLOv4 object detection neural network based on the CSP approach, scales both up and down and is applicable to small and large networks while maintaining optimal speed and accuracy. We propose a network scaling approach that modifies not o

arxiv.org

 

YOLO 모델이 EfficientDet의 AP 성능을 뛰어 넘는 것 까지 보여줌으로써 object detection 모델이 FPS, accuracy 모두 잡을 수 있다는 것을 보여주게됩니다. (YOLO 계열의 모델이 SOTA를 기록할 수 있다는 것을 보여준 것이죠.)

 

5-5. YOLOR

YOLO v4 때부터 같이 개발에 참여한 팀원들은 Taiwan의 nataional academy인 Sinica academy 소속이었습니다. (참고로 Alexey의 약력은 아래와 같습니다) 

 

[Alexey]

  • 2001~2008: MISIS University
  • 2019.11~현재: Lead Machine Learning Engineer: Academica Sinica, Taiwan
  • 2020.07~현재: Intel Research Engineer

 

해당 팀원들이 Scaled YOLO v4를 같이 개발 한 후,  6개월 뒤 후속 연구로써 YOLOR 라는 논문을 arXiv에 등록하게 됩니다. 

  • 2021.05.10 arXiv 등록

https://arxiv.org/abs/2105.04206

 

You Only Learn One Representation: Unified Network for Multiple Tasks

People ``understand'' the world via vision, hearing, tactile, and also the past experience. Human experience can be learned through normal learning (we call it explicit knowledge), or subconsciously (we call it implicit knowledge). These experiences learne

arxiv.org

 

논문의 결과나 paperwithcode에서 살펴봤을 때, 모델의 성능 자체는 크게 개선되지 않았던것 같습니다.

 

 

하지만, Scaled YOLO v4 모델을 좀 더 representation 관점에서 다양한 해석을 시도하려고 했기 때문에 이를 기반으로 후속 연구들이 나오지 않을까 기대하고 있습니다.

 

 

 

 

 

6. Soft Teacher+Swin-L

2021년에 들어서면서 Transformer 계열의 object detection 모델이 CNN 계열의 object detection 모델을 밀어내고 독주하기 시작합니다. 필자가 조사를 했을 당시 (2021.08) paperwithcode에서 object detection SOTA 모델Soft Teacher+Swin-L 이었는데, 이 모델 역시 Transformer 계열의 objecte detection 모델이었습니다.

 

6-1. Swin Transformer

2021.03월에 Microsoft Reseaerch Asia에서 새로운 vision Transformer 모델 Swin Transformer 모델을 선보입니다.

  • 2021.03.25 arXiv 등록
  • 2021 ICCV accept 
    • 2021.10.11~2021.10.17 온라인 개최 예정
    • Oral 3 Strong Accepts

https://arxiv.org/abs/2103.14030

 

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

This paper presents a new vision Transformer, called Swin Transformer, that capably serves as a general-purpose backbone for computer vision. Challenges in adapting Transformer from language to vision arise from differences between the two domains, such as

arxiv.org

 

Swin Transformer는 사실 semantic segmentation 분야에 Transformer 모델을 적용시키기 위해 고안되었습니다. Segmentationdense prediction을 해야하기 때문에 계산량이 많은데, 기존 Transformer 모델 자체도 계산량이 많기 때문에 sementic segmentation과 Transformer 기술 까지 같이 접목시키면 intractable 문제로 바뀐다고 합니다. 이러한 intractable 문제를 극복하기 위해서 Swin Transformer 논문은 hierarchical feature mapShifted window (Swin) block을 이용했다고 합니다.

 

 

 

 

Swin Transformer 모델은 2021.03월에 58 AP를 기록하면서 object detection SOTA 모델로 등극하게 됩니다.

 

 

6-2. Soft Teacher+Swin-L

Swin Transformer 모델이 나온 후 3개월 뒤 후속 연구로써 Soft Teacher+Swin-L 모델이 등장합니다.

  • 2021.06.16 arXiv 등록
  • 2021 ICCV (제출예정)

https://arxiv.org/abs/2106.09018

 

End-to-End Semi-Supervised Object Detection with Soft Teacher

This paper presents an end-to-end semi-supervised object detection approach, in contrast to previous more complex multi-stage methods. The end-to-end training gradually improves pseudo label qualities during the curriculum, and the more and more accurate p

arxiv.org

 

Swin Transformer의 저자 중 한 명이 Soft Teacher+Swin-L 모델 연구 개발에 참여한 것으로 보이고, Micro Soft와 항저우 과기대 (HUST) 팀원들이 같이 참여 한 것으로 보이네요. (올해는 항저우 과기대라는 이름을 더 자주 보는 듯합니다)

 

 

Pseudo label 기반의 Semi-Supervised Learning 방식을 Swin Transformer에 적절히 잘 적용Soft Teacher+Swin-L 모델이 제안됩니다

 

 

기존에는 Semi-Supervised Learning이 Supervised Learning의 성능을 뛰어 넘지 못했던 것과 달리, Soft Teacher+Swin-L 모델에 Semi-Supervised Learning을 적용했을 때는 더 좋은 성과를 보여준 것이 고무적입니다. 또한, 드디어 60 AP 고지를 돌파한 object detection 모델을 선보이기도 했죠. 

 

 

 

 

 

7. ETC

2021.08월을 기준으로 현재 paperwithcode에서 object detection 1, 2, 3등 모델 모두 Swin Tranformer기반으로 하고 있습니다.

 

  • DyHead 
    • 2021.06.15 arXiv 등록
    • 2021 CVPR accept
  • Dual-Swin-L
    • 2021.07.01 arXiv 등록

 

 

 

1, 2 3등을 기록한 연구들은 서로 별개의 독립적인 연구였던 것 같습니다.

 

 

 

 

지금까지 2021.08월까지 object detection 모델의 trend에 대해서 소개해드렸습니다.

앞으로 object detection 관련 글을 쓰게 되면 Swin Transformer 또는 EfficientDet 부터 쓰게되지 않을까 싶습니다.

 

읽어주셔서 감사합니다! 

 

 

 

[Reference Site]

1) Vision Transformer 관련 글

https://hoya012.github.io/blog/Vision-Transformer-1/

 

Transformers in Vision: A Survey [1] Transformer 소개 & Transformers for Image Recognition

“Transformers in Vision: A Survey” 논문을 읽고 주요 내용을 정리했습니다.

hoya012.github.io

 

 

 

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

13. YOLO V3  (0) 2021.08.26
11. SSD  (3) 2020.02.06
10. YOLO V2  (4) 2020.02.06
9. YOLO V1  (4) 2020.02.06
8. Faster RCNN  (1) 2020.02.06

안녕하세요.

이번 글에서는 실행파일에 대해서 설명한 후, 파이썬으로 실행파일을 만드는 방법에 대해서 말씀드리도록 하겠습니다.

 

[Note]

실행파일 만드는 순서만 따로 보고싶으시다면 맨 아래 "6. python으로 작성된 딥러닝 실행파일을 만드는 방법 정리"만 참고하시면 될 것 같습니다.

 

1. 딥러닝 개발을 하는데 실행파일이 왜 필요한가요?

학계에서 딥러닝을 연구하시는 분들은 보통 파이썬으로 train 코드와 evaluation 코드를 작성하고, "train.py"  or "test.py" 파일형태로 github에 올립니다. 특히 요즘 같이 top-tier 딥러닝 학회에 논문을 낼 때에는 자신의 코드를 github에 올린 후, 논문에 기재하기도 하죠. 이렇게 코드를 올리면 다운받아서 실제로 잘 돌아가는지도 확인할 수 있겠죠?

 

 

 

그렇다면 딥러닝을 비지니스에서 사용하려고 할 때는 어떨까요? 

 

학계에서는 많은 연구자들에게 어필해야하므로 관련 코드를 github에서 볼 수 있게 해줍니다. 물론 연구자들은 전문가이기 때문에 언제든 github을 통해 돌려볼 수 도 있습니다. 논문도 훌륭하고 코드도 잘 돌아가면 그만큼 저자의 명성이 높아지겠죠.

 

비지니스에서는 어필해야할 사람들이 누굴까요?

바로, 투자자들입니다. 우리가 학계에서 처럼 투자자들에게 코드를 github에서 다운받아서 돌려보라고 할 수 있을까요? 투자자들이 모델학습에 관심이 있을까요?

 

학계와 달리 투자자들은 개발에 대해서 전혀 모르고 있을 가능성이 큽니다. 또한, 투자자들의 관심은 단지 모델이 잘 돌아가는지 눈으로 확인하는 것이죠.

 

그래서, 프로젝트 마무리 단계에 진입하면 자신들의 성과를 보여주기 위해 투자자들에게 개발한 모델을 시연합니다.

 

예를 들어, 우리가 숫자를 인식하는 딥러닝 프로그램을 만들었다고 해보겠습니다. 투자자들은 간단한 GUI 프로그램을 통해 숫자 인식을 제대로 하는지에만 관심이 있을거에요.

(↓↓ 18초 부터 ↓)

https://www.youtube.com/watch?v=m_VjcyjMlpQ 

 

이러한 GUI 프로그램을 만들기 위해 필요한 것이 실행파일입니다. 즉, .exe 라는 확장자명을 가진 실행파일을 클릭하기만 하면 자동으로 GUI 프로그램이 실행되도록 해주는 것이죠. 이러한 실행파일을 실행시키기 위해서는 단지 학습이 완료된 모델들과 테스트 이미지만 있으면 됩니다.

 

(파이썬으로 간단한 GUI 프로그램을 만드는 방법은 "pyqt5" 모듈 or "tkinter" 모듈을 이용하면 됩니다. 이 내용은 따로 다루도록 하겠습니다.)

 

 

 

 

 

2. PyInstller 모듈

파이썬으로 실행파일을 만드는 과정은 간단합니다.

 

첫 번째, PyInstller 모듈을 설치해줍니다. 

필자는 개발환경으로 anaconda를 이용하고 있기 때문에, anaconda 명령어로 설치해주었습니다.  

conda install -c conda-forge pyinstaller

 

두 번째, 아래 명령어를 이용해 원하는 python파일(.py)을 실행파일(.exe)로 만들어 줍니다.

pyinstaller 원하는파일.py

 

 

[예시]

1. VS code 편집기에 YOLOv3를 구현해 놓습니다.

 

 

 

2. YOLOv3를 구현해 놓은 코드를 돌리면 __pycache__ 폴더가 생성됩니다.

 

 

(__pycache__ 폴더에는 컴파일되어 실행 준비가 된 Python 3 바이트 코드들이 저장됩니다)

 

 

 

 

 

3. 원하는 python 파일을 실행파일로 바꿔주기 위한 명령어를 입력합니다.

 

 

 

4. 명령어를 실행하면 아래와 같이 두 개의 폴더가 생성됩니다.

 

  • dist 폴더: distribute(배포)의 약자입니다. 즉, 배포되는 파일이 들어 있는 디렉토리라고 보시면 됩니다. dist 폴더에 실행파일이 만들어졌음을 확인할 수 있습니다. 나중에 시연할 때에는 아래의 실행파일이용하면 됩니다.

 

 

 

 

 

3. pyinstaller 업데이트 (Feat. No module named)

지금부터는 아래와 같이 'main_for_exe.py' 파일을 실행파일로 만들어보겠습니다.

 

 

 

만약 pyinstaller를 처음 설치하고 바로 실행파일을 만들고 실행('main_for_exe.exe')하면, 아래와 같이 "No module named"라는 에러 메시지가 뜰 가능성이 있습니다. 제가 사용하고 있는 vscode에서는 문제 없이 잘 돌아갔는데, 왜 실행파일을 실행시키면 에러가 날까요?

 

 

 

이유는 간단합니다. 

 

vscode의 interpreter는 anaconda or pip로 설치한 패키지들이 저장되어 있는 디렉토리의 path를 잘 잡아주고 있는 반면, 업그레이드 하지 않은 초기 버전의 pyinstaller 를 이용하면 해당 디렉토리를 못잡아주기 때문에 anaconda 명령어로 설치한 'torch' 모듈을 load 할 수 없게 되는 것이지요. 

 

( anaconda or pip로 설치한 패키지들이 저장되어 있는 디렉토리↓)

 

 

위와 같은 문제를 해결해주는 방법은 아래와 같이 pyinstaller를 업그레이드 해주는 것입니다. (사실, 최근에 설치했다면 위와 같은 오류가 생성되지는 않을 것입니다.)

pip install --upgrade pyinstaller

 

 

위와 같이 업그레이드를 시켜주고 다시 실행파일을 만들면 아래와 같이 hook path로써 "anaconda or pip로 설치한 패키지들이 저장되어 있는 디렉토리"를 잡아주는 것을 확인할 수 있습니다.

 

 

 

 

 

4. hidden module (Feat. hidden import)

만약 anaconda or pip로 설치한 모듈이 아닌 다른 github에서 다운 받는 모듈들을 사용하게 되면 추가적인 작업을 해주어야 합니다.

 

예를 들어, github에서 아래와 같이 'retinanet'이라는 모듈을 다운을 받았다고 가정해보겠습니다.

 

 

이때, 'main_for_exe.py'의 실행파일을 만들기 위해서는 추가된 retinanet 모듈의 path도 잡아주어야 합니다.

 

path를 잡아주는 방법은 간단합니다.

 

1. 실행파일을 생성했다면 동시에 spec 파일도 생성될 것 입니다.

 

 

2. vscode(or 다른 IDE)로 해당 spec 파일을 열어 줍니다.

 

3. hiddenimports 부분에 추가할 module을 입력 해줍니다.

 

 

 

retinanet.model 모듈을 추가해준 이유는 retinanet만 추가해줬을 때 아래와 같은 에러가 출력됐기 때문입니다.

 

 

4. hiddenimports를 추가해주었다면 spec 파일을 아래와 같이 다시 빌드해줍니다.

 

이렇게 하면 'no module name'과 같이 모듈을 인식하지 못하는 문제는 해결할 수 있을 것입니다.

 

(사실 pyinstaller 명령어에서 --hidden-import 라는 옵션이 있긴 한데, 위에서 언급한 대로 에러를 잡아가는게 더 정확했던것 같습니다.)

 

 

 

 

 

5. 실행파일과 script파일 경로 차이 해결

vscode에서는 문제없이 돌아간 파일을 실행파일로 만들면 아래와 같이 경로에러를 발생시키는 경우가 있습니다.

 

 

위의 에러가 난 이유를 아래 코드 디버깅을 통해 살펴보니 retina_model_path 경로 때문인 것으로 파악할 수 있었습니다. 아래 vscode 상에서는 "C:\\Users\\MI2RL\\Desktop\\script\\logs\\Retina_weight\\retinanet101_21.pt"로 잘 설정되어 있지만, 위의 Anaconda Prompt에서는 엉뚱한 경로를 설정하고 있는걸 확인할 수 있었습니다.

 

 

 

아래 디렉토리를 확인해 보니, main_for_exe.exe 실행 파일을 수행하면 현재 실행시킨 경로를 기준으로 파일경로가 재설정되는 듯했습니다. 자세히 말하자면, vscode 상에 'retina_model_path를 설정하는 코드를 보면 'prefix' 변수명에 'logs\Retina_weight\~' 경로를 합쳐주는걸로 되어있는데, vscode 상에서는 script 폴더에서부터 접근하는 반면, 

 

 

 

실행파일을 돌리면 script\src\dist 폴더에서부터 접근하는 것으로 보였습니다.

 

 

그래서, vscode에서 main_for_exe.py을 실행시켰던 src 디렉토리로 main_for_exe.exe 파일을 옮겨준 후 다시 실행시켜보았습니다.

 

 

 

그러자, 앞서 언급한 경로문제는 해결되었지만, src\dist\main_for_exe 폴더에 main_for_exe.exe가 생성될 때 같이 생성된 다른 모듈들과의 호환문제가 발생했습니다. 

 

 

위의 에러메시지를 보면 main_for_exe.exe 파일이 생성되는 디렉토리에 관련 모듈들도 동일한 디렉토리에 생성되는데, main_for_exe.exe 파일만 따로 빼내어 실행시키다보니 에러메시지가 나타났습니다. 

 

 

 

그래서, src\dist 폴더에 main_for_exe.exe 파일에 모든 모듈을 통합하도록 --onefile 옵션을 주어 파일을 다시 컴파일을 해줍니다.

 

 

앞서 --onefile 옵션을 통해 아래와 같이 하나의 exe 파일로 생성됐습니다. 그리고, 해당 파일을 복사한 후

 

 

 

아래 폴더 위치에 다시 옮겨 놓습니다.

 

 

[Note]

만약, 위와 같이 main_for_exe.exe 파일을 src\dist 폴더에서 빼내지 않고, 애초에 main_for_exe.exe 파일을 main_for_exe.py 폴더가 위치한 src 폴더에 생성시키려면 아래와 같이 distpath 옵션에 src 폴더경로를 입력해주면 됩니다.

 

 

 

그리고, src 디렉토리에서 main_for_exe.exe 파일을 실행시키면, 아래와 같이 warning 메시지만 뜨고 문제 없이 실행되는 걸 확인 하실 수 있습니다.

 

 

 

 

 

6. 다른 local에서 실행파일 테스트하기

자신의 local 컴퓨터에서 문제 없이 돌아갔다면, 다른 사용자의 local 컴퓨터에서도 문제 없이 돌아갔는지 확인해야 합니다.

 

위의 예시를 기준으로 확인순서를 말씀 드리겠습니다.

 

  1. 다른 사용자의 local 컴퓨터에 script 폴더를 다운받습니다.
  2. src 폴더의 main_for_exe.exe를 실행시켜 줍니다.

 

만약 아래와 같은 에러가 생긴다면 CUDA를 설치하시고 다시 실행시키면 됩니다.

OSError: [WinError 126] 지정된 모듈을 찾을 수 없습니다. Error loading "C:\Users\MI2RL-JW\AppData\Local\Temp\_MEI260802\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies.
[32] Failed to execute script 'test_OP_exe' due to unhandled exception!

 

(에러 원인을 찾아보니 아래와 같은 문구가 있어서 CUDA를 다시 설치하니 다른 local에서도 문제 없이 돌아가네요. 아마 코드자체가 gpu를 사용하겠금 구현되어 있어서 그런듯 합니다...)

 

(↑↑↑ 위의 메시지 출력↑↑↑) 

https://discuss.pytorch.org/t/i-cannot-use-the-pytorch-that-was-built-successfully-from-source-dll-initialization-routine-failed-error-loading-caffe2-detectron-ops-gpu-dll/93243/23

 

I cannot use the pytorch that was built successfully from source: (DLL) initialization routine failed. Error loading caffe2_dete

Thank you very much for your fast answer @lorenzznerol (are you italian like me?), I tried activating the base environment and it solves the warning in python but not the torch error. C:\Users\AZand_000\Downloads\Pytorch\pytorch>conda activate base (base)

discuss.pytorch.org

 

 

 

 

 

7. python으로 작성된 딥러닝 실행파일을 만드는 방법 정리

지금까지 설명드린 내용을 종합하여 설명해보도록 하겠습니다.

 

1. pyinstaller 설치 및 업그레이드 (최근에 설치하는 것이라면 아래 명령어 중 하나만 선택하기만 해도 됨)

conda install -c conda-forge pyinstaller
pip install --upgrade pyinstaller

 

 

 

2. vscode 실행했던 디렉토리에 (모듈이 통합 된) exe 파일 및 spec 파일 생성 하기

pyinstaller --onefile --distpath 디렉토리명 실행파일명.py

 

(↓↓vscode에서 실행했던 main_for_exe.py 파일과 동일한 경로에 --distpath가 설정되어있는지 확인↓↓)

 

(↓↓아래와 같이 새 폴더 또는 파일이 생성됐는지 확인↓)

 

 

 

 

 

 

 

3. github으로 다운 받은 모듈이 있다면 hiddenimports 추가 && spec 파일 다시 빌드

 

 

 

[Note]

--distpath 설정해주어야 이전에 --distpath 경로에서 만들어진 exe 실행파일에 hiddenimports가 추가된 내용이 overwrite됩니다. 

 

pyinstaller --distpath 디렉토리명 실행파일명.spec

 

 

 

 

4. 실행하기

실행파일.exe

 

 

 

5. 다른 local 컴퓨터에서 실행파일 테스트 (시연) 하기

  1. 다른 사용자의 local 컴퓨터에 script 폴더를 다운받습니다.
  2. src 폴더의 main_for_exe.exe를 실행시켜 줍니다.

 

만약 아래와 같은 에러가 생긴다면 

OSError: [WinError 126] 지정된 모듈을 찾을 수 없습니다. Error loading "C:\Users\MI2RL-JW\AppData\Local\Temp\_MEI260802\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies.
[32] Failed to execute script 'test_OP_exe' due to unhandled exception!

 

  1. Pytorch + CUDA를 설치하시고 다시 실행시킵니다.
  2. 1번이 안되면 spec 파일에 아나콘다\torch\lib 경로를 pathex에 추가시켜주고 다시 실행파일로 만들어줍니다

 

※만약, 해당 파일이 계속해서 실행이 안된다면 아래의 사항을 확인해주세요!

  • 실행하려는 Local에서 GPU가 있는지 확인합니다.
  • 만약, GPU가 없다면 코드에 try ~ except 문을 이용하여 GPU가 없을 시, CPU 코드로 돌아갈 수 있게 구현해 놓습니다.

(보통 딥러닝 모델을 inference 용도로만 사용하는 경우 해당 local에는 GPU가 없을 가능성이 있습니다. 클라우드 서버에서 돌리면 더더욱 그러한데, 그 이유는 클라우드에서 GPU 사용시 돈이 굉장히 많이 소요되기 때문이라고 합니다.)

 

 

 

 

 

 

 

[Note. pydicom 에러]

만약 pydicom 모듈이 포함된 실행파일을 만들었다면 아래와 같은 에러 메시지가 출력 될 수 도 있습니다.

 

 

 

1. 위 문제를 해결할 수 있는 한 가지 방법은 pydicom 모듈을 simpleITK 모듈로 바꿔주어 dicom 파일을 읽도록 하는 것이 있습니다.

 

https://89douner.tistory.com/284?category=991951 

 

4-1. Python으로 dicom 데이터 읽기 (Feat. pydicom, SimpleITK)

안녕하세요. 이번 장에서는 Python으로 dicom 데이터를 읽는 방법에 대해서 말씀드리겠습니다. Python에서는 pydicom 모듈과 SimpleITK 모듈을 제공하고 있는데, 이러한 모듈들을 사용하여 dicom 파일을 읽

89douner.tistory.com

 

2. 사실 pydicom을 사용해서도 실행파일이 돌아갈 수 있게 하는 것이 더 큰 궁극적인 목적인데, 이를 위해서는 pydicom 버전을 2.0.0으로 downgrade해주면 해결이 됩니다.

 

 

이상 딥러닝 모델을 실행파일로 만드는 과정을 설명드렸습니다. 

감사합니다!

안녕하세요. 

이번 글에서는 logging 모듈에 대해서 설명해보려고 합니다.

먼저, logging을 검색하면 아래와 같이 정의하고 있음을 알 수 있습니다.

 

"In computing, a log file is a file that records either events that occur in an operating system(or other software runs) or messages between different users of communication software. Logging is the act of keeping a log."

(By Wikipedia)

 

 

1. Event란 무엇인가요?

컴퓨팅에서 event란 프로그램에 의해 감지되고 처리될 수 있는 동작이나 사건을 말합니다.  예를 들어, 마우스를 클릭 하거나 키보드를 입력하면 이벤트가 발생합니다.  마우스를 예로 들어 이벤트 기반 시스템이 수행되는 과정을 설명하면 아래와 같습니다.

  1. (마우스) 장치로부터 입력이나 내부 경보를 계속해서 기다립니다.
  2. 마우스 클릭 시, 이벤트 발생 시 정보들(ex: 언제, 어디서, 어떤 이벤트가 발생 했는지 등)을 이벤트 핸들러 (event handler)로 보냅니다.
  3. 그리고, 이벤트 핸들러 (event handler) 에서 발생 한 이벤트를 어떻게 처리해 줄 지 프로그래밍 해줍니다.

<그림1 출처. https://fromyou.tistory.com/546>

 

위 그림에서 마우스를 클릭하여 event를 발생시키면 event handler를 통해 사이트에 접속하는 과정이 실행됩니다.

 

이때, 접속한 시간을 따로 기록할 수 있도록 프로그래밍을 할 수 도 있습니다. 이렇게 접속한 시간을 따로 기록해두면 나중에 내가 한달에 몇 번 사이트에 접속했는지 알 수 있겠죠?  

 

 

 

2. Log란 무엇인가요?

앞서 설명한 "접속시간을 기록하는 행위""log"라고 합니다. 좀 더, 일반화 해서 말하자면 "무언가를 기록하는 행위"log라고 하지요.  (computer 분야에서는 log라는 것 자체를 동사 개념으로 사용하고 있는데, 보통 logging이라는 용어로 대체되어 사용되기도 합니다) 

 

<그림2 출처. https://en.dict.naver.com/#/entry/enko/36130c3cc2784ed8a58f61092fab6066>

 

그리고, 이렇게 "무언가를 기록하는 행위"를 한다는 것은 "기록에 대한 파일을 만드는 것"으로 볼 수 있는데, 이때 만들어진 파일을 log파일이라고 합니다. 접속시간에 대한 내용만 기록을 했다면 "접속시간 log 파일"이라고 부르죠.

 

마우스나 키보드와 같은 이벤트를 통해서만 log라는 행위를 하거나 (log)파일을 얻을 수 있는 건 아닙니다. 

프로그램 명령어를 통해 log라는 행위를 할 수 도 있습니다

 

 

 

3.logging 모듈이란?

Python에서는 명령어를 통해 log를 할 수 있게 해줍니다.

즉, 특정 명령어를 이용하면 프로그램이 실행되는 동안 일어나는 모든 정보를 기록으로 남길 수 있죠.

기록된 정보들은 의미있는 분석을 위해 사용될 수 도 있습니다.

 

log를 이용하는 또 다른 목적은 개발 단계에서 프로그램이 제대로 동작하는지 확인하기 위함입니다.  

프로그램이 제대로 동작하는지 확인하는 단계는 크게 5가지 단계로 나눌 수 있는데, 이것을 logging level이라고 합니다.

 

 

3.1. logging level

Level Numeric value 의미
DEBUG 10 어떤 문제가 발생했을 경우 해당 문제를 진단하고 싶을 때 필요한 자세한 정보를 기록
INFO 20 작업이 정상적으로 작동하고 있음을 메시지를 통해 확인하고 싶은 경우 
WARNING 30 소프트웨어가 동작하고 있지만, 예상치 못한 일이 발생했거나 가까운 미래에 문제가 발생할 수 도 있음을 경고
Ex1) 디스크 공간 부족 → 프로그램은 잘 동작되지만 앞으로 문제가 발생할 수 도 있음
ERROR 40 문제가 발생했으며 소프트웨어 일부가 기능을 수행하지 못했다는 뜻
CRITICAL 50 심각한 에러 → 프로그램 자체가 실행되지 않을 수 있다는 것을 뜻함

 

DEBUG < INFO < WARN < ERROR < FATA 

 

"setLevel"이라는 명령어를 이용하여 위와 같은 5단계의 logging level 중 하나를 설정해 줄 수 있습니다.

만약, WARN을 로그 레벨로 지정을 하게 되면 WARN보다 높은 level에 대한 logging message만 출력되는 것을 볼 수 있습니다.

 

 

 

3.2. logging.Formatter

logging.Formatter를 이용하면 추가적인 정보를 더해 logging message를 출력할 수 있습니다.

logging.Formatter를 이용하려면 4가지 단계를 거쳐야 합니다.

  1. logging.Formatter를 이용하여 원하는 logging message 출력형태를 결정해줍니다. 
  2. logging message를 출력하는 방법은 총 2가지 입니다. 첫 번째는 console 창에 logging message를 띄우는 방법이 있고, 두 번째는 특정 파일에 logging message를 보내 저장시키는 방법이 있습니다. 이때, console 창에 출력하고 싶다면 "logging.StreamHandler()"함수를, 특정 파일에 출력하고 싶다면 "logging.FileHandler()"함수를 이용하면 됩니다. 
  3. 앞서 설정한 logging message 형태와 출력방식을 "setFormatter(formatter)" 함수로 세팅해줍니다.
  4. 마지막으로 "addHandler"를 통해 logging 객체(=logger)에 추가시켜 줍니다.

 

 

 

 

참고로 logging.Formatter의 attribute에 대한 설명은 아래 사이트를 참고 하시는걸 추천합니다.

https://docs.python.org/ko/3/library/logging.html

 

logging — 파이썬 로깅 시설 — Python 3.9.7 문서

logging — 파이썬 로깅 시설 소스 코드: Lib/logging/__init__.py 이 모듈은 응용 프로그램과 라이브러리를 위한 유연한 이벤트 로깅 시스템을 구현하는 함수와 클래스를 정의합니다. 표준 라이브러리

docs.python.org

<그림3 출처. https://docs.python.org/ko/3/library/logging.html>

 

 

logging에 대해 좀 더 알고 싶으시다면 아래 사이트를 참고하시는 걸 추천합니다!

https://greeksharifa.github.io/%ED%8C%8C%EC%9D%B4%EC%8D%AC/2019/12/13/logging/#21-%EC%B0%A8%EB%A1%80%EB%8C%80%EB%A1%9C-logging-%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B0

 

Python, Machine & Deep Learning

Python, Machine Learning & Deep Learning

greeksharifa.github.io

 

https://www.youtube.com/watch?v=zf7L1hCO1t4 

 

+ Recent posts