목록전체 글 (222)
꺼내먹는지식 준

Faster R CNN 소스 코드를 읽으면서 numpy 의 용례를 많이 찾아볼 수 있다. 본 글은 numpy 에 익숙하지 않은 사람 대상으로, Faster R CNN 소스코드를 읽을 때 만날 수 있는 여러 시행착오를 줄이기 위해 작성 Numpy Where np.where 의 official doc https://numpy.org/doc/stable/reference/generated/numpy.where.html numpy.where — NumPy v1.22 Manual Return elements chosen from x or y depending on condition. Note When only condition is provided, this function is a shorthand for np..
https://zhang-yang.medium.com/reshaping-numpy-arrays-newaxis-v-s-reshape-v-s-expand-dims-521289b73c8a Adding dimensions to numpy.arrays: newaxis v.s. reshape v.s. expand_dims This post demonstrates 3 ways to add new dimensions to numpy.arrays using numpy.newaxis, reshape, or expand_dim. It covers these cases with… zhang-yang.medium.com 시간 날 때 읽고 정리해보자.
softmax 는 dim 을 지정해서 apply 할 수 있다. test = torch.randn(2,3,2) print(F.softmax(test, dim = 0)) print(F.softmax(test, dim = 1)) print(F.softmax(test, dim = 2)) 3D tensor에 0차원 1차원 2차원에 softmax를 apply 하고 결과를 보자. dim = 2 결과 부터 보면 2차원 원소들에 softmax 가 취해진 것을 볼 수 있다. 0.7388 + 0.2612 = 1 0.4158 + 0.5842 = 1 dim = 1 결과를 보면, (3) 0.5528 + 0.3504 + 0.0968 = 1 dim =2 결과를 보면, (2) 0.4200 + 0.5800 = 1 0.0447 + 0.9..

pytorch 에서 함수 사용할 때 마다 인자로 dim 을 줄 때 차원이 햇갈렸다. 이에 따라 간략 정리 한번 한다. (일단 axis 와 dim 은 같다는걸 인지하고 시작하자.) 2D, 3D, 4D 에서 torch.cat 을 수행하며 차원에 따른 concat 결과를 명확하게 봐보자. a = torch.randn(7,3) b = torch.randn(7,3) print(torch.cat((a,b),axis=0).shape) print(torch.cat((a,b),axis=1).shape) a = torch.randn(7,3,5) b = torch.randn(7,3,5) print(torch.cat((a,b),axis=0).shape) print(torch.cat((a,b),axis=1).shape) pri..

object detection 의 성능은 1) mAP 2) Speed 두가지로 결정된다. EfficientDet은 성능도 높고, 속도도 빠르게 하기 위한 연구 (사실 모든 연구가 그렇다. SSD도 그렇고.) Efficient in Object Detection DL model은 키우면 키울 수록 성능이 증가하는 경향, 그러다보니 계속해서 점점 더 깊어지고, 복잡 하지만, 단순하게 깊게 쌓는 것이 성능적인 gain에 한계가 있다. 즉 모델의 복잡도 대비 성능향상이 비효율적 이에 따라 모델을 쌓을 때 잘 쌓는 법에 대한 연구가 진행 3가지 방향의 scaling width scaling: 채널을 더 크게 주기 depth scaling: 모델을 더 깊게 쌓기 resolution scaling: input 이미지..

Yolo Familty, SSD, RetinaNet 2 Stage model 1) Localization (후보 영역 찾기) 2) Classification (후보 영역에 대한 분류) $\rightarrow$ 속도가 매우 느려서, real time 으로 활용하기 위한 방법론 one stage feature map으로부터 바로 객체의 종류와 위치를 예측함으로써 RPN 과정을 생략 (localization, classification 동시 진행) 전체 이미지에 대해 특징 추출, 객체 검출 $\rightarrow$ 간단하고 쉬운 디자인 속도가 매우 빠름 영역을 추출하지 않고 전체 이미지를 보기 때문에 객체에 대한 맥락적 이해가 높음 (background error가 낮음) YOLO YOLO v1 network..

맨날 transform(img) image tranform 하는 것만 보다가 갑작스럽게 image, bboxes, labels가 모두 transform의 매개변수로 들어가는 걸 보고 당황했다. 주변인의 도움을 받아 해결 참고 코드는 다음과 같다. transforms = get_train_transform(resize_H, resize_W) def get_train_transform(h, w): return A.Compose([ A.Resize(height = h, width = w), A.Flip(p=0.5), ToTensorV2(p=1.0) ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']}) sample = { 'image': im..
* unpacking 은 엄청 간단하다. 근데 ** unpacking은 기대처럼 동작하지 않는다. a = {"Ha": 1, "He": 2, "Hu": 4} def answer(a,b,c): print(a,b,c) answer(**a) 각 a,b,c 에 mapping 될 거라 생각했던 것과 달리 TypeError: cal() got an unexpected keyword argument 'Ha' 라 한다. 즉, keyword argument 와 key 를 맞춰줘야 한다... def cal(Ha, Ho, Hu): print(Ha, Ho, Hu) 다음과 같이 선언해준 후 출력해야 1 2 4 출력이 된다.

Object Detection Neck 그간 Object Detection 논문들 읽으면서 Neck 에 해당되는 개념들을 아주아주 간단하게 작성하고 넘어갔는데, 드디어 한번 살펴본다. NECK 이 나오기 전, backbone의 마지막 feature map 으로 ROI 를 수행했다. NECK은 여기서 backbone의 마지막 feature map만을 활용해야하는 이유가 있을까? 라는 의문에서 뭔가를 해보고자 했다. 왜냐, 마지막 feature map은 high level 정보를 담고는 있지만, 그 과정 속에서 유실되는 정보도 있고, spatial 정보도 많이 유실 되었기 때문이다. NECK 이 왜 필요한가? 결론적으로는 NECK이 없다면 여러 크기의 물체를 감지하는 것이 어렵다. 즉, 여러 feature ..

MMdetection은 정말 많은 object detection module을(Faster R CNN, Yolo v3. DERT..) 담고 있다. 사용법도 굉장히 간단해서 config 파일을 수정해주는 것만으로 사용 준비 끝이다. 다만, config 파일 사용법은 숙지를 해야한다. 모델, scheduler, optimizer 등 모두 수정 가능 mmdetection github에서 configs directory를 들어가보면 다양한 모델의 config가 사전 정의되어있다. 각각 학습가능한 dataset에 대해서도 작성되어있다. configs/base/ 폴더에 가장 기본이 되는 config 파일이 존재 datset, model, scheule, default_runtime 4가지 기본 구성 요소 datas..