728x90

2021.07.19 - [실습 note] - Single Shot Detector 실습

 

Single Shot Detector 실습

1. opencv_ssd_inference https://colab.research.google.com/drive/1fp85xfnSxWI59OTrr2-H6Bzl5mMoFGxs#scrollTo=CP7z351geMkc Google Colaboratory Notebook Run, share, and edit Python notebooks colab.resea..

ghdrldud329.tistory.com

*one-stage detector & two-stage detector의 구분: RegionProposal(영역추천)이 별도로 구성되어 있느냐 없느냐로 구분할수 있다. two-stage detector의 단점은 수행능력이 떨이지므로 이를 개선하기 위해서 나온 알고리즘이 SSD이다.

VGG를 통해 만들어진 각기 다른 크기의 Feature Map들에서 각각 Anchor Box을 적용한 모델이다. Anchor Box들이 Classification&Object Dectection을 함께 수행한다.

SSD의 주요 구성 요소는 아래와 같다.

 

1. multi Scale Feature Layer

노란색 윈도우 슬라이드가 오른쪽으로 스캔하면서 객체를 탐지하는데 맨 왼쪽 그림처럼 객체가 노란색 박스보다 큰 경우엔 객체 탐지가 되지 않는다. 따라서 이미지 scale를 조정하면서 object detection 하는 것을 이미지 피라미드라고 한다.

 

크기를 줄여서 객체가 박스안에 들어와서 detection 할수 있도록 돕는다. 만일 애초에 슬라이드 윈도우 박스를 크게 만든다면 큰 객체는 탐지 할수 있을지언정 작은 객체들은 탐지하기가 어렵다는 문제가 있다.

그렇다면 object detection한다는 기준이 뭘까?

Iou를 기준으로 삼는다. 큰 슬라이드 윈도우는 예측 박스도 크게 나온다. 반면 작은 객체들의 Ground Truth는 작다. 이럴경우 Iou는 매우 작아져서 detect에 들어오지 않게 된다. (Iou = 두 박스의 교집합/ 예측박스+GT의 합집합)

그렇다고 원본 자체를 가지고 이미지피라미드를 하게 되면 수행성능이 떨어지는 단점을 가지고 있다. 이를 개선한 방법으로는 CNN에서 발생된 FM들을 가지고 Object Detection 하는 것이다.

큰 FM는 객체의 위치정보를 가진다. 이를 점점 Convolution 연산을 통해 작아지면 축약적인, 즉 추상적이고 이미지의 핵심적인 정보만 남게 된다. 4*4 FM는 작은 윈도우 슬라이드를 이용해도 그 안에 들어 있는 큰 객체들을 detect할수 있다. 즉, 32*32에서는 비교적 작은 객체를 detect하는데 유리하고 4*4 처럼 FM가 작을수록 큰 객체들의 detect가 이루어진다.

 

2. Anchor Box

SSD의 anchor box의 역할은 위 그림의 RPN을 화살표가 향하는 장소로 옮겨가서 Classification과 Bounding Box를 함께 수행할수 있도록 해준다. two-stage-detector에서 one-stage-detector로 변할려면 이 anchor box가 필요하다는 것이다.

anchor box는 RPN에서 영역을 추천하기 위해서 도입이 된 개념이다. 이 개념을 단지 영역추천으로 한정 지을게 아니라 더 나아가 object detection에 적용하기에 이른다. 이를 처음으로 도입한 것이 Yolo였다. 이를 뒤이어 SSD도 이 개념을 도입하게 되었다.

 

코끼리의 FM이 16*16이라면 총 256개의 점에서 anchor box가 적용된다. 각 점에 대해서 anchor box가 돌아 다니면서 객체에 대한 학습을 진행한다. (ground truth와 가장 많이 겹치는 anchor box가 학습을 하게된다)

20*20, 10*10, 4*4 등 각기 다른 FM에 맞는 Anchor box가 투입되어 학습을 진행하게 된다. (참고로 작은 FM일수록 큰 객체 탐지에 유리하고 반대로 큰 FM은 작은 객체 탐지에 유리)

 

 

*SSD: 원본이미지 크기가 300*300 or 512*512 로 고정됨

*back bone은 굳이 VGG 사용안해도 된다.

*논문에서는 anchor box 를 defaultbox라고 칭한다.

위 그림 SSD를 보면 각각의 FM에서 object detection을 할수 있게끔 만드는 anchor box정보들이 화살표 방향의 한곳으로 모이게 되고, 모인 정보들이 학습이 된다.

어떻게 anchor box의 정보들을 학습 시키는 걸까?

각각의 FM별로 3*3conv연산을 한다. 이때 anchor box은 4종류이다.

빨간 화살표 아래에 있는 4라는 것은 anchor box가 4개라는 뜻이다. classes는 해당 dataset의 class 갯수이다. 가령 pascal voc의 class 갯수는 20개 이므로 위 Classes 값은 20이다. 여기 +1를 해주는데 그 이유는

object detection의 경우는 background object라는 개념을 가지고 있다. 이것은 Detect할 object가 아닌 object를 의미한다.

가령 이미지에 개와 고양이, 나무,  웅덩이가 있는데, Ground truth 정보는 개와 고양이만 가지고 있다. 즉 개와 고양이를 Detect하는 경우 나머지 오브젝트들 예를 들어 나무와 웅덩이는 background가 된다. 그래서 20+1 이 된다. 끝에 있는 4의 경우는 예측 좌표값이다. xmin, ymin, xmax, ymax가 된다.

하나의 Class 당 detect된 수는 8732이다. 너무 많기 때문에 Non-Maximum Suppression을 통해서 각 class에 가장 성능이 높은 detection값을 하나 씩 뽑는다.

 

3*3conv 하나에 detect된 BB가 네개씩 나온다(38*38 한해서는 4개) 각 BB별로 21가지의 confidence 값이 나온다. 20개의 class에 대한 softmax 값 + Back Ground 값 까지 포함여 21개 + 4개의 좌표값 총 25개이다. X,Y는 센터 BB의 센터값, W,H은 가로 세로이다. 여기서 중요한점은 이 좌표값이 BB의 값이 아니라는 점이다. GT와 BB간의 offset값(떨어진 값, 간격, 차이 값)이 4개 좌표로 들어가게 되는 것이다.

 

 

8*8에서는 고양이가 detect 된 걸 확인 할수 있다. 파란색 박스는 매칭이 되었다 라는 뜻이다. 이 파란색 박스는 여러 anchor box들 중GT와의 IOU가 50%이상인 것을 가리킨다. 4*4에서는 강아지가 detect되어서 빨간색으로 매칭이 되었음을 알수있다. 매칭된 anchor box들은 같은 형태의 FM이 들어 왔을때 Classification 역할을 해줄수 있다. 또한 지속적으로 매칭된 박스들이 GT와 오차값이 감소할수 있도록 BB Regression 진행한다. BB Regression을 한다는 것은 BB를 예측하다는 것이다. 그래서 BB와 GT간의 offset 값이 감소하는 방향으로 학습해 나간다.

 

one-stage-detector의 문제점: 작은 Object detect에 대한 성능이 떨어진다. (Yolo도 마찬가지) 작은 객체 검출을 SSD에서 해결하기 위해서 위 그림의 Data Augmentation 과정을 거치게 된다.

 

실습은 아래 링크로 연결되어 있습니다.

2021.07.19 - [실습 note] - Single Shot Detector 실습

 

Single Shot Detector 실습

1. opencv_ssd_inference https://colab.research.google.com/drive/1fp85xfnSxWI59OTrr2-H6Bzl5mMoFGxs#scrollTo=CP7z351geMkc Google Colaboratory Notebook Run, share, and edit Python notebooks colab.resea..

ghdrldud329.tistory.com

 

 

 

728x90
728x90

실습설명은 주석으로 되어있습니다. 

강의: iflearn의 딥러닝 컴퓨터 비젼 완벽가이드[개정판]

 

2021.07.09 - [실습 note] - MMDetection의 이해와 Faster RCNN 적용 실습 모음

 

MMDetection의 이해와 Faster RCNN 적용 실습 모음

첫번째 실습 https://colab.research.google.com/drive/1clatjT7ESQ1bYeb8ZvcPgRwRByFk5-BS?hl=ko#scrollTo=1U7BfoXrpR4l Google Colaboratory Notebook Run, share, and edit Python notebooks colab.research.g..

ghdrldud329.tistory.com

 

728x90
728x90

1.RCNN : Region Proposal + CNN Detection 

RCNN은 전 시간에 배웠던 selective searh 통하여 객체 있을만한 장소를 추천해 줍니다. 추천 해준 영역은 설정에 따라 몇천 개가 될 수 있습니다. 위 그림을 보면 1단계에서 selective search 실행합니다. 여기서는 대략 2000개를 뽑았다고 가정합시다. 2000개를 AlexNet에 넣어서 분류와 바운딩 박스 예측을 실행하게 됩니다. 

RCNN의 특이점은 SVM Classification 머신러닝을 이용한다는 점입니다. SVM을 적용하기전에 softmax로 업데이트한 가중치를 가지고 SVM 분류를 적용하면 성능이 향상되는 결과를 얻을 수 있습니다. 

 

 

하지만 문제점이 있는데, AlexNet의 입력값은 227*227입니다.  Region Proposal로 추천된 것들은 제각각
크기가 달라서 227*227로 통일하면 이미지가 찌그러진다. (객체가 있을법한 장소를 임의로 선택해서 출력하므로 정해진 규격이 없습니다.)  pretrained AlexNet은 찌그러진 이미지를 학습하지 않았으므로 성능이 떨어집니다. 이를 해결하기 위해선 찌그러진 이미지를 포함시켜 다시 학습을 진행하면 개선됩니다. 

여기서 짚고 넢어 가야 할 점은 selectiveSearch자체로 바운딩 박스 역할하면 되지 않겠는가?라는 의문이 들 수 있습니다. 하지만 이는 객체가 있을만한 곳을 알려줄 뿐이지 정확한 위치를 반환하진 않습니다. 그래서 따로 회귀를 통해 바운딩 박스 예측을 해야 합니다.

 

2번에서 region proosals를 2000개 뽑았습니다. 각 한 장 한 장을 위와 같이 모델에 넣어서 분류, 바운딩 예측 두 가지를 진행합니다. 이렇게 되면 수행 시간이 매우 길어지는 큰 단점이 생기게 됩니다.

바운딩 박스를 예측하는 수식은 아래와 같습니다.

 

예측 바운딩 박스와 실제 박스를 계산해서 손실 함수를 가장 적게 만드는 가중치를 찾게 됩니다.
pw: predict width(예측한 너비)
ph: predict height(예측한 높이)
(px,py) -> 예측한 바운딩 박스의 중심 좌표

간단하게 정리를 하자면 위 식을 통해서 실제 박스의 중심점에 가장 가까운 가중치를 찾습니다.

 

RCNN의 장단점은..

장점보단 단점이 많은데, 일단 수행 시간이 길다는 치명적인 단점이 존재합니다. 2000개(설정에 따라 2000개 이상 될 수 있음) 각 이미지를 모델에 적용시키는 것이 아닌 좀 더 효율적인 방법을 연구하게 되는데,,, 이때 나온 개념이 SPPNet입니다.

 

2. SPP(Spatial Pyramid Pooling)Net

위 내용처럼 2000개 이상의 많은 region proposal 이미지를 한 번에 피처 맵에 맵핑을 적용한다는 점 핵심입니다. 하지만 여기서도 문제가 있습니다. region proposal 이미지는 각자 크기가 다릅니다. CNN은 서로 다른 사이즈의 Image를 수용하지 않는데, 가장 큰 이유는 Flatten Fully Connection Input의 크기가 고정이 되어야 하기 때문입니다. 따라서

제 각각인 이미지를 FC로 변환을 못하게 됩니다.

이때 적용되는 도구가 SPP개념입니다. 서로 다른 크기의 이미지가 들어와도 고정된 벡터로 변환해줍니다. 제각각인 크기가 모두 통일이 되므로 FC적용이 가능해집니다.

SPP는 SPM에 근간을 둡니다.

 

SPM(Spatial Pyramid Matching)?

SPM은 고전적인 방법인 Bag of Visual words을 해결하기 위해 등장한 개념입니다.

Bag of Visual words에 대해서 간략하게 설명하자면 

NLP에서의 bag of words란 개념이 있습니다. 대상이 되는 문서의 단어를 모두 담아 놓은 가방입니다. 마찬가지로 위 그림처럼 사람 객체 이미지를 담아 놓습니다. 그 후 예측할 대상이 들어오면 가방 안에 있는 것과 비교하여 개수를 카운트합니다. 히스토그램을 만드는 것이죠. 그러면 예측할 객체가 무엇인지 분류가 가능해집니다. 

하지만 이것도 문제점이 존재합니다.

대상이 되는 객체에 쓸데없는 배경이나 다른 객체가 뒤섞여 있다면 분별하기가 힘들어집니다. 이를 해결하기 위해서

이미지를 분할하고, 분할된 이미지 각각을 히스토그램 계산한 다음, 분할된 수만큼 생긴 히스토그램을 통합시키면 

향상된 성능을 보이게 됩니다. 이미지를 분할하는 개념이 SPM입니다.

level0은 분할하지 않았을 때 히스토그램

level 1은 4개로 분할했을 때 히스토그램

level 2은 16개로 분할했을 때 히스토그램

좀 더 자세하게 살펴보겠습니다.

파란색, 노란색, 빨간색(사람, 자전거, 바이올린) 각각 있습니다. 

level 1에서 좌측 상단부터 우측 하단까지 파란색은 몇 개, 노란색은 몇개, 빨간색은 몇 개인지 각각 표현합니다. 

이렇게 되면 각 분변에서 어떤 값이 가장 높은지 파악할 수 있습니다. 

level0의 각 색깔별 카운트는 11,10,12, 총 3개이고, level 1의 각 분 면도 색깔별로 카운트할 수 있습니다. (총 12개)

아래 빨간 직사각 형안에 이렇게 카운트된 갓을 일렬로 벡터화시킨다면 해당 벡터는 원본 이미지인 level0을 가장 잘 표현한 값이 됩니다.

파란색, 노란색, 빨간색이 들어있는 8*8 피처 맵이 존재한다고 가정할 때

원본 이미지는 분할이 없으므로 각 3개의 색깔별로 카운트 값이 일렬로 나열되어 있을 것입니다. (3*1의 벡터)

4분면은...

각 분 면마다 카운트 값을 센 후, 나열하면 총 12개 값이 나열됩니다. 

이렇게 16분면까지 하면 총 63*1이라는 벡터가 생성이 됩니다. 

 

 

그렇다면 본론으로 돌아와서 SPP은 무엇인지 말씀드리자면

SPP의 마지막 P는 Pooling입니다. 즉 나눠진 각 반면에 가장 큰 값 하나만 가져오면 됩니다. 이 개념 덕분에 

어떤 사이즈라도 나중엔 고정된 벡터로 출력이 가능해지는 것입니다. 

가장 큰 값 하나만 있으면 되므로 각 분면의 대푯값만 나오게 됩니다. 만일 사이즈가 8*8이 아니라 다른 사이즈라도 

분할수만 같다면 똑같은 벡터 값을 생성할 수 있다는 점이 핵심입니다. 이렇게 생성된 벡터를 FC로 넘길 수 있게 됩니다.

 

 

 

 

 

3. Fast RCNN

Fast RCNN에서 바뀐점이 있다면 SPP layer가 ROI Pooling으로 변경되었다는 점입니다. 

ROI Pooling은 7*7(49분면) 하나의 형식만을 이용합니다. 그외에 두가지 변경된 점이 있는데

내용은 아래 이미지를 통해 확인할수 있습니다. 

   

SPP에서 사용된 SVM->Softmax로 변경 및 multi_task loss를 통해 분류와예측을 함께 최적화 하는 방향으로 바뀌었습니다. 

 

SmoothL1은  오차값이 1보다 작으면 L2(제곱)유형의 함수값을 적용하고 그게 아니라면 L1(절대갓)유형의 함수값을 적용합니다. u>=1이라는건 백그라운드를 제외한다는 의미입니다. (백그라운드의 값은 0이고 밝은 색일수록 값이 증가)

위 공식을 이용해서 loss가 최소가 되는 가중치를 찾게 됩니다.

하지만 큰 문제점이 있습니다. 바로 Region Proposal 수행시간이 길다는 점입니다.

영상을 처리할려면 보통 20~30 FPS가 나와야 하지만 그에 비해 FAST RCNN은 현저히 성능이 떨어집니다.

Region Proposal 수행시간이 긴 이유는 CPU를 사용하기 때문입니다. 

이를 해결한 것이 Faster RCNN인데, Region Proposal 작업을 Net으로 만들어서 end-to-end net으로 묶으면 GPU를 사용할수 있게 됩니다. 

 

 

 

4. Fast RCNN

Faster RCNN = RPN(Region Proposal Network) + Fast RCNN

피처맵에서 3*3 Conv을 실행한 결과를 RPN에 입력되어서 객체인지 아닌지 분류 판단을 하고, 객체라면 바운딩 박스는 어디인지 예측을 하게 됩닌다. 단지 region propsal이므로 정확한 값이 아닌 대략적인 위치를 나타내는 용도입니다.

단지 문제점이 있다면 어떻게하면 FM(feature map)에서 Selective Search 수준의 Region Proposal을 할 수 있을 것인가? 입니다. 이 문제를 해결하기 위해 앵커박스라는 방법이 적용 되는 것입니다.

각자 크기가 다른 9개의 앵커가 적용이 됩니다. 객체를 식별할때 사각형이 가장 잘 detection하는 모습을 보여왔습니다.

따라서 사각형을 유지한 채 크기와 사이즈를 달리하여 놓칠수 있는 객체을 모두 검출하고자 노력합니다.

만일 앵커 모습이 사각형이 아니라 비행기를 검출하기 위한 비행기 모양의 앵커를 사용한다거나 다른 모양으로 할 경우엔 비행기는 검출할지 몰라도 다른 객체는 검출이 안될 확률이 커지게 됩니다. 즉, 과적합의 우려가 있게됩니다.

아래 그림을 통해 이해를 도울수 있겠습니다.

차와 사람이 있는 이미지입니다. 자동차, 사람 각각 검출하기 위해선 위와 같이 서로 다른 크기의 앵커가 필요하게 됩니다. 이러한 현상때문에 각자 크기가 다른 앵커는 객체 검출에 효과적일수 있겠습니다.

 

 

원본이미지에 일정한 간격으로 점이 찍혀 있습니다. 이점을 중심으로 각각 9개씩 앵커박스가 적용이 됩니다.

600*800 이미지를 16으로 서브샘플링하게 되면 세로 가로 각각 40*50이 됩니다. 약 1900개의 점이 생깁니다.

하나의 점 마다 9개의 앵커박스가 있으므로 총 17100개의 앵커박스가 생기게됩니다.

이렇게 많은 앵커박스중 filter 역할을 하는 것이 RPN입니다. 

 

현재 이 fater RCNN의 원리를 제대로 이해하지 못하고 있어서 여기까지 올립니다. 좀 더 공부를 한 후에 이해한 내용을 바탕으로 다시 블로그 업데이트 할 예정입니다.

728x90
728x90

 

1. PASCAL VOC

Annotation : 이미지의 Detection 정보를 별도의 설명 파일로 제공되는 것을 일반적으로 Annotation 이라고 함. Annotation은 Object의 Bounding Box 위치나 Object 이름등을 특정 포맷으로 제공함.

노란색 점선을 보면 Object라고 적혀있다. 한 이미지에 들어있는 객체 정보를 위와 같이 저장해 놓는다.

 

 

2. MS-COCO

annotations의 포맷은 JSON이다. (PASCAL VOC는 XML 형식)

COCO Dataset은 이미지 한 개에 여러 오브젝트들을 가지고 있으며 타 데이터 세트에 비해 난이도가 높은 데이터를 제공한다. PASCAL VOC은 COCO Dataset처럼 한이미지안에 여러 객체를 많이 취급 하지 않는다.

왼쪽 그래프: 한 이미지안에 종류 서로 다른 객체가 몇개가 있는가를 표현

오른쪽 그래프: 한 이미지안에 모든 객체가 몇개가 있는가를 표현

COCO가 다른 dataset보다 객채 종류도 많고 객체 수도 많다는 걸 알수있다.

 

 

3. OpenCV 소개

해당 챕터는 전에 3월달에 배웠던 OpenCV 강의 덕분에 빠르게 진행 할수 있었습니다. 

그래서 세세한 설명보다는 강의에서 소개 된 실습 코드를 소개해 드립니다.

 

opencv_image_n_video.ipynb
3.15MB

 

728x90
728x90

*본 강의 및 실습 내용은 iflearn의 딥러닝 컴퓨터 비전 완벽 가이드 임을 알려드립니다.

*실습 코드는 제외하였습니다

 

Object Detection의 이해

localization: 하나의 물체에서 위치를 찾아내는 것이다. 해당 Object의 위치를 회귀로 예측하여 Bounding box를 찾은 후 어느 부류인지 Classification을 진행한다. 즉, 바운딩 박스를 찾기 위한 회귀와 분류가 혼합되어 있다.

 

detection: 여러 물체의 위치와 해당 물체가 어떤 분류에 속하는지 찾아낸다. detection은 localization와는 다르게 여러 객체의 위치를 찾아야 하는 복잡성이 추가된다.

 

segmentation: 픽셀 레벨의 탐지 영역이다. 개별 픽셀들이 어떤 객체에 속하는지 찾아낸다(classification 포함)

 

Sliding Window

여러 객체의 위치를 찾기 위해서 사용되는 방법 Sliding Window

->윈도우를 왼쪽부터 오른쪽으로 스캔하면서 해당 객체가 있는지 보는 것

대표적인 문제점: 찾아야 할 객체가 작고 배경이 대부분이라면 쓸데없는 배경 탐색에 시간/비용 자원이 소모
-> Region Proposal(영역 추정): 스캔하기 전 객체가 있을만한 곳을 추천받는다.

 

Region Proposal

Region Proposal('객체가 있을만한 후부 영역을 찾자') 방법 중 Selective Search 라이브러리 존재
1 step: 각 픽셀 별로 segmentation을 진행한다.
2 step: 비슷한 segmentation은 그룹핑하는데 무늬, 크기, 형태에 따라 유사한 것 끼리 묶인다. 이 과정을 반복한다.
3 step: 묶인 그룹에 대해여 바운딩 박스로 추천이 된다.

Over segmentation으로, 최대한 많은 바운딩 박스를 만든다. 그 이유는 한 바운딩 박스에 객체 들어 있게끔 하기 위해서이다. 많으면 많을수록 한 바운딩 박스에 객체 하나가 있을 확률이 높아진다.

 

많은 바운딩 박스를 이제 컬러, 무늬(Texture), 크기(Size), 형태(Shape)에 따라 유사도가 비슷한 Segment들을 위와 같이 그룹핑시킨다. 이를 반복하면 복잡해 보였던 영역들이 몇 군데로 추릴 수가 있게 된다. 이로써 객체 위치를 대략적으로 파악할 수 있다. 이런 과정을 통하여 얻은 바운딩 박스를 평가할 방법들이 필요해진다. Object detection의 성능평가 2가지에 대해서 알아보자

 

1. Object detection의 성능평가 : IoU(Intersection over Union)

예측 박스와 실제 박스와 얼마나 겹치는지 평가한다.

IoU= 겹치는 박스 구간/ 실제 박스+예측 박스

 

2. Object detection의 성능평가 : mAP(mean Average Precision)

mAP 설명에 앞서서 먼저 NMS(Non Max Suppression)에 대하여 설명해야 이해하기 수월해진다.

NMS(Non Max Suppression) : 여러 개의 바운딩 박스들 중 비슷하게 겹쳐진 박스들을 제거하여 가장 적합한 박스를 선택하는 기법

Confidence score? 예측된 바운딩 박스 값이 해당 객체일 확률을 말한다. 주황색 자동차 0.9라는 것은 바운딩 박스 안에 객체는 90% 확신으로 차인 것이다. 왼쪽 검은색 차는 0.8을 점수를 보인다.

이때 가장 높은 점수별로 내림차순 한다. 0.9 0.8 0.7... 그러고 나서는 가장 높은 0.9 바운딩 박스와 겹쳐진 빨간 바운딩 박스 간에 IoU를 구한다. 그 후 IoU의 threhold 값 이상이라면 모두 삭제시킨다. 이렇게 되면

0.9 바운딩 박스와 많이 겹치는 박스들은 모조리 삭제가 될 것이다. 이런 과정을 0.9, 0.8, 0.7 순으로 쭉 실행해 나간다.

 

본론인 mAP를 알기 위해서 한 가지 더 선행 학습이 필요하다. 재현율(Recall)과 정밀도(Precision)이다.

위 내용은 강의 내용인데 코로나로 빗대어 설명해 본다면

정밀도(신중한 놈, 비난사): 100명을 코로나 양성이라고 예측했는데 50명만 양성이 나왔다. 이때 정밀도는 0.5
재현율(신중하지 않는 놈, 난사): 100명의 코로나 양성을 대상으로 검사했는데 50명만 양성이 나왔다. 이때 재현율 0.5  -> 양성자를 빠뜨리지 않고 얼마나 정확히 검출했는지 알 수 있다.

 

이 둘의 차이점이 중요하다. 정밀도의 핵심은 내가 예측한 것이 분모이다. 다시 말해 내가 양성이라고 예측한 값이 분모이기 때문에 이 분모 안에는 실제로 양성인 사람과 음성인 사람이 같이 혼재되어 있다.

반면 재현율의 분모는 양성인 사람 그 자체이다. 내가 예측한 사람이 아니라 양성인 사람을 데리고 와서 검사를 했을 때 과연 몇 명이나 양성을 판별하는지를 보는 것이기 때문에 검출력을 확인해 볼 수 있다.

TP는 새를 새라고 맞춘 것이며 FP는 False가 있으므로 새라고 예측했지만 틀린 경우이다. 위 세 가지 경우가 틀렸을 때의 모습이다. FN의 N은 예측 클래스에 해당된다. N이므로 예측 조차 하지 않았다는 의미이다.

재현율은 난사, 정밀도는 난사라고 위에서 표현했다. 먼저 난사라는 의미는 바운딩 박스를 있는 대로 찍어서 출력한다는 것이다. 그러면 총 5마리의 새가 무자비한 난사로 인해 모두 바운딩 박스 안에 들어갈 확률이 높아진다. 이렇게 되면 재현율은 증가한다. 반면 비 난사인 정밀도는 신중하게, 아주 확실하다 싶은 객체만 바운딩 박스 친다. 즉, Confidence 값이 큰 것들만 바운딩 박스를 친다. 위와 아래 그림은 Confidence 값에 따른 정밀도, 재현율 변화를 나타낸다. 개인적으로는 단순히 글보다는 이 그림들 보고 나서 이해하기가 수월했다.

이때, 위 결과를 토대로 AP(Average Precision)를 구할 수 있다. 

원래는 왼쪽 표대로 그린다면 파란색 선처럼 지그재그로 표현된다. AP 값을 구하기 위해서 빨간 박스처럼 지그재그 중 가장 튀어나온 값을 연결하여 AP를 구한다. 

그렇다면 mAP는 무엇인가? 

 

*AP는 한 개 오브젝트에 대한 성능 수치

*mAp(mean Average Precision) 은 여러 오브젝트들의 AP를 평균한 값

 

마지막으로 아래 그림을 설명하게 끝 마치겠습니다.

IoU threshold 값이 커질수록 재현율이 감소한다. 다시 말해서 난사되는 바운딩 박스가 사라진다는 것이다. 

IoU는 겹치는 구간을 비율로 나타낸 것이다. 따라서 IoU threshold값이 0.95라는 것은 예측한 박스와 실제 박스의 겹치는 구간이 95% 이상 일치해야 한다는 것이다. 이게 일치하지 않으면 취급하지 않겠다는 것이다. 이 기준으로 위 그림을 보자,

 

IoU 기준값이 0.95라면 난사되는 박스들은 사라지게 되고 95% 이상 일치되는 것들만 남게 된다. 즉 정밀도는 올라가고 재현율은 감소하게 된다. 

 

 

728x90
728x90

R

R에서의 SVM 실습 내용입니다! 자세한 그래프는 생략했고 내용물만 업로드 합니다

library(caret)

rawdata <- read.csv(file='wine.csv', header=TRUE)
rawdata$Class <- as.factor(rawdata$Class) #범주형 변환
str(rawdata)

analdata <- rawdata
set.seed(2021)
datatotal <- sort(sample(nrow(analdata),nrow(analdata)*.7))
train <- rawdata[datatoal,]
test <- rawdata[-datatoal,]
str(train)
str(test)

train_x <- train[,1:13]
train_y <- train[,14]

test_x <- test[,1:13]
test_y <- test[,14]

#선형모델
ctrl <- trainControl(method='repeatedcv',repeats=5)
svm_linear <- train(Class~.,
               data=train,
               method='svmLinear', #선형 svm
               trControl=ctrl,
               preProcess=c('center','scale'),
               metric='Accuracy')
svm_linear

#예측
pred_Test_linear <- predict(svm_linear, newdata=test)
confusionMatrix(pred_Test_linear, test$Class)

#중요도
importance_linear <- varImp(svm_linear, scale=FALSE)
plot(importance_linear)

#비선형모델
ctrl <- trainControl(method='repeatedcv',repeats=5)
svm_ploy <- train(Class~.,
                    data=train,
                    method='svmPoly', #선형 svm
                    trControl=ctrl,
                    preProcess=c('center','scale'),
                    metric='Accuracy')
svm_ploy
#예측
pred_Test_ploy <- predict(svm_ploy, newdata=test)
confusionMatrix(pred_Test_ploy, test$Class)

#중요도
importance_linear <- varImp(svm_ploy, scale=FALSE)
plot(importance_linear)

 

태양열 프로젝트

지난 4월부터 진행했던 프로젝트를 끝을 냈습니다. 엊그제 블로그에 정리하면서 업로드는 해놨습니다

2021.06.29 - [project] - 태양열 에너지 예측 프로젝트 (4)_dacon

 

태양열 에너지 예측 프로젝트 (4)_dacon

1. Import and Libraries !pip install tsfresh import pandas as pd import numpy as np import matplotlib.pyplot as plt import os from tqdm import tqdm # Ignore the warnings import warnings warnings.fi..

ghdrldud329.tistory.com

 

사실 더 진행 할수도 있었습니다. lgb 그리드 서치라든가 다른 모델을 사용한다던가 등 여러 시도를 시간 들여서 해볼순 있었지만 제가 계획해 놨던 공부들이 있어서 기간 맞출려면 슬슬 정리하는게 좋을 것 같단 생각이 들었습니다. 무엇보다.. 제 실수로 인해 점수 계산을 할수 없는 상태라서 의욕이 상당히 많이 떨어졌습니다; 첫 대회 참가라서 제대로 결과까지 받아 보고 싶었는데 말이죠  첫 술에 배부를순 없으니까 이 실수를 발판삼아 다음엔 제대로 도전해 볼 생각입니다.

 

번외

사실 제가 더위에 상당히 약한 편 인데요. 

요즘 날이 너무 더워서 공부에 집중이 잘 되지 않습니다 ;; 

중요한 시기인데 말이죠 

집이 원룸이고 통풍이 안되는 구조라 야외보다 더 덥습니다 ㅎㅎ;;

 

그외에도 개인적인 일이 겹쳐서 

집중을 찾아 볼수가 없습니다ㅠ 

 

오늘은 계획했던 컴퓨터 비젼 중급 강의를 듣기 위해서 결제를 했는데요

R part는 원래 6월달 안에 끝내야 하는데 제가 집중을 찾아 볼수 없는 상태라서 어물쩡 거리는 바람에

7월에도 R을 해야 할것같습니다 내일도 더울 생각을 하니.... 

 

 

 

728x90
728x90

빨간색 부분이 오늘 진행한 내용입니다.

태양열 프로젝트

1차 시도. 랜덤 포레스트 log 상태에서 스케일링에 따른 변화
-> 변화 없음

2차 시도. log 아닌 상태에서 스케일링에 따른 변화
->Normalizer

3차 시도. 변수의 차분 변화에 따른 성능 측정
->변수 2개 이상 동시 사용 시 성능 저하 발생

4차 시도. extracted_features 활용
-> 모든 변수 사용시 성능 저하 발생하여 VIF 및 RFECV 실행

 extracted_features 함수를 통해 얻은 변수들 중 의미 있어 보이는 120여 개 피처들로 예측한 그래프입니다.

성능값이 23점을 기록했습니다;;

120여개의 피처들을 vif를 통해 추리고, 추린 값을 refecv를 통해 또 추려봤습니다. 120개의 피처를 refecv를 돌리면 에러가 발생해서 vif 통해 1차적으로 걸렀습니다. 그래서 vif을 통해 얻은 피처 VS vif+refecv을 통해 얻은 피처들을 각각 랜덤 포레스트에 돌렸고 결과는 아래와 같습니다. 기존 변수 활용 시 성능은 7.801이었습니다.

* VIF : 7.98 (성능다운)
* refecv: 7.98(성능다운)

ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ


5차 시도. 랜덤 포레스트 그리드 서치

-> 랜덤포레스트 그리드 서치를 실행했습니다. 
{'criterion': 'mse',
 'max_depth': None,
 'max_features': 'auto',
 'min_samples_leaf': 2,
 'min_samples_split': 8,
 'n_estimators': 300}

 

앞서 구한 결과를 토대로 적용한 결과
* 7.96 (성능다운)

6차 시도. 계절성 분해 적용

-> target값을 분해한 후 validation data인 2021년 01월 추세&계절 값은 2020년도 01월 값을 사용했습니다.
랜덤 포레스트: 13.98 (추세+계절)
랜덤포레스트: 7.78(계절), 약 0.02 개선

 

7차 시도. Cloud lag값 제거

-> 7.73으로 성능 개선됨

 

8차 시도['Temperature','WindSpeed','Humidity'] 차분 횟수에 따른 성능변화

-> 차분 6일 때 가장 좋은 성능을 보임

1. diff -> 3 : 7.580
2. diff -> 4 : 7.510
3. diff -> 5 : 7.599
4. diff -> 6 : 7.435
5. diff -> 7 : 7.589 (차분 7회 이상부터 과적합)
6. diff -> 8 : 7.645
7. diff -> 9 : 7.702
8. diff -> 10 : 7.753

 

9차 시도. 랜덤 포레스트 estimator 변경에 따른 성능변화

300 : 7.369
400: 7.363
500: 7.326
600: 7.314
700: 7.331
800: 7.350
900: 7.340
1000: 7.360

 

10차 시도. 수정된 피처를 적용한 그리드 재검토

*그리드 결과

'max_depth': None, 
'min_samples_leaf': 6, 
'min_samples_split': 14, 
'n_estimators': 600

-> 정확도 83%, Score : 7.51
기존 7.31 보다 0.2 낮아짐. min_samples_leaf & min_samples_split는 과적합 방지로 사용한다. 기존에 사용하던 값은 디폴트 값을 이용했으므로 과적합에 취약한 모델일 가능성이 있다. 하지만 validation 값은 앞서 언급했듯이 0.2가 낮아진 상태이다. 어떤 파라미터가 옳은지는 사실 잘 모르겠다. 일단 val값을 가장 낮추는 방향으로 진행할 예정이다.

 

11차 시도. Cloud의 더미 변수화

-> 7.526으로 개선 효과 없음

 

12차 시도. day 데이터의 lag 적용

day lag값 -> 24,48 인 경우 7.249 성능개선day lag값 -> 24,48,72 인 경우 7.26 성능감소 
day lag값 -> 24,48,72,96 인 경우 7.35 성능감소 

 

13차 시도. seasonal 1월 값을 예측

기존에는 시계열 분해한 계절성 데이터를 2020/01 ->2021/01(validation) 그대로 복사했습니다.

그래서 이번 시도는 랜덤포레스트로 예측하여 2021/01 계절성 데이터를 채웠습니다. 그리고 스케일링 전/후 성능비교까지 포함하여 진행했습니다.

 

스케일링 전: 7.248
스케일링 후 7.248

 

진행한 결과 변화가 거의 없었습니다. 또한 스케일링 전후 차이도 없었습니다.

타켓값의 계절성 데이터는 랜덤포레스트 변수 중요도에서 70% 정도를 차지하는 변수입니다. 그래서 

나름 기대하면서 진행했는데 결과는 조금 아쉬웠습니다. 

 

14차 시도. 계절성 데이터를 차분

랜덤포레스트 후 잔차 진단 결과 자기상관 그래프입니다.

편자기상관은 튀는 값이 있긴 하지만 상당히 진정된 상태를 보입니다. 반면 자기상관은 패턴이 보입니다.

어떻게 랜덤포레스트 모델에서 자기상관을 없앨수 있을까 고민을 했습니다. 일단 가지고 있는 데이터 중 계절성 데이터가 있으므로 이를 차분하여 어떤 효과가 있는지 변화를 보고자 했습니다. 

주기는 24이고, 결과는 아래와 같습니다.

 

target 변수 차분 24: 11.535
target 변수 차분 24,48: 12.555
-> 오히려 자기 상관성 튀는 값과 패턴이 뚜렷해짐

랜덤과 사리마모델을 혼합해 볼까 생각도 해봤지만 사리마 모델도 현재 성능이 썩 좋지는 않고 정상성도 확보를 못하고 있었던 터라 ..;; 부랴부랴 다시 파라미터 점검에 나섰습니다. 그런데 전과는 다르게 이번엔 전체 데이터로 (파라미터 실험했을땐 2020년도만 데이터 쪼개서 실행했었음) 실행하니까 중간에 오류가 걸립니다. 원인도 나오지 않은 채 그냥 터진 것 같습니다. 사리마로 진행하는 건 시간 낭비 일거란 판단하에 내일은 lgb모델의 파라미터 최적화를 해볼 생각입니다.

 

15차 시도. lgb 파라미터 최적화 

'boosting': 'gbdt',
'learning_rate': 0.01,
'min_child_samples': 10,
'n_estimators': 700, 'num_leaves': 36
-> CV SCORE: 8.7685

그리드 서치 적용 결과 성능이 8.4에서 8.7로 나빠 졌는데, 제 생각엔 과적합 현상이 줄어서 그런게 아닌가 싶습니다.

결과적으로는 랜덤 포레스트가 더나은 성능을 보이기 때문에 lgb는 이제 생각치 않도록 하려 합니다.

 

16차 시도. PCA를 통한 변수 축소

전체 변수를 사용하면 랜덤 포레스트는 7.28정도가 나옵니다. 이 성능을 가진 모델을 2월달 predict 하니까 패턴이 사라지고 뒤죽박죽으로 되어 있었습니다. 15시 태양열 에너지가 보통 400~600 정도 나오는데, 갑자기 50or 0 이 나오는패턴이었습니다. 패턴을 설명하는 seasonal 데이터에 다른 변수가 영향을 끼친게 아닌가 의심이 들어서 VIF로 걸러낸 column으로 재시도 했습니다. 그 결과, 랜덤 포레스트 성능은 7.5로 성능이 다운이 되었지만 2월달 predict 에서는 패턴을 제대로 감지 했습니다.

 

 

방해되던 변수는 차분을 6차까지 했던 변수들이 대부분이였습니다. 이 컬럼들은 따로 모아서 PCA로 차원 축소를 하여 성능을 조금 더 끌어 올렸습니다. 차원축소를 1~3개 각각 했을 경우 결과는 아래와 같습니다.

 

PCA 1개로 축소할때 랜덤 포레스트 성능: 7.420

pca 1

 

PCA 2개로 축소할때 랜덤 포레스트 성능: 7.429

pca 2

PCA 3개로 축소할때 랜덤 포레스트 성능: 7.249

pca 3

PCA 4개로 축소할때 랜덤 포레스트 성능: 7.437

결론

PCA 3개로 했을때가 가장 좋은 성능을 보였습니다. 그치만 PCA 전 과적합 현상이 있었던 모델 성능도 7.2점대 이라서 이 모델도 과적합이 아닐까 의심이 듭니다. 일단 패턴을 보존하면서 predict도 잘 되었으니까 pca3개로 고정하겠습니다.

 

 

728x90
728x90

빨간색 부분이 오늘 진행한 내용입니다.

태양열 프로젝트

1차 시도. 랜덤 포레스트 log 상태에서 스케일링에 따른 변화
-> 변화 없음

2차 시도. log 아닌 상태에서 스케일링에 따른 변화
->Normalizer

3차 시도. 변수의 차분 변화에 따른 성능 측정
->변수 2개 이상 동시 사용 시 성능 저하 발생

4차 시도. extracted_features 활용
-> 모든 변수 사용시 성능 저하 발생하여 VIF 및 RFECV 실행

 extracted_features 함수를 통해 얻은 변수들 중 의미 있어 보이는 120여 개 피처들로 예측한 그래프입니다.

성능값이 23점을 기록했습니다;;

120여개의 피처들을 vif를 통해 추리고, 추린 값을 refecv를 통해 또 추려봤습니다. 120개의 피처를 refecv를 돌리면 에러가 발생해서 vif 통해 1차적으로 걸렀습니다. 그래서 vif을 통해 얻은 피처 VS vif+refecv을 통해 얻은 피처들을 각각 랜덤 포레스트에 돌렸고 결과는 아래와 같습니다. 기존 변수 활용 시 성능은 7.801이었습니다.

* VIF : 7.98 (성능다운)
* refecv: 7.98(성능다운)

ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ


5차 시도. 랜덤 포레스트 그리드 서치

-> 랜덤포레스트 그리드 서치를 실행했습니다. 
{'criterion': 'mse',
 'max_depth': None,
 'max_features': 'auto',
 'min_samples_leaf': 2,
 'min_samples_split': 8,
 'n_estimators': 300}

 

앞서 구한 결과를 토대로 적용한 결과
* 7.96 (성능다운)

6차 시도. 계절성 분해 적용

-> target값을 분해한 후 validation data인 2021년 01월 추세&계절 값은 2020년도 01월 값을 사용했습니다.
랜덤 포레스트: 13.98 (추세+계절)
랜덤포레스트: 7.78(계절), 약 0.02 개선

 

7차 시도. Cloud lag값 제거

-> 7.73으로 성능 개선됨

 

8차 시도['Temperature','WindSpeed','Humidity'] 차분 횟수에 따른 성능변화

-> 차분 6일 때 가장 좋은 성능을 보임

1. diff -> 3 : 7.580
2. diff -> 4 : 7.510
3. diff -> 5 : 7.599
4. diff -> 6 : 7.435
5. diff -> 7 : 7.589 (차분 7회 이상부터 과적합)
6. diff -> 8 : 7.645
7. diff -> 9 : 7.702
8. diff -> 10 : 7.753

 

9차 시도. 랜덤 포레스트 estimator 변경에 따른 성능변화

300 : 7.369
400: 7.363
500: 7.326
600: 7.314
700: 7.331
800: 7.350
900: 7.340
1000: 7.360

 

10차 시도. 수정된 피처를 적용한 그리드 재검토

*그리드 결과

'max_depth': None, 
'min_samples_leaf': 6, 
'min_samples_split': 14, 
'n_estimators': 600

-> 정확도 83%, Score : 7.51
기존 7.31 보다 0.2 낮아짐. min_samples_leaf & min_samples_split는 과적합 방지로 사용한다. 기존에 사용하던 값은 디폴트 값을 이용했으므로 과적합에 취약한 모델일 가능성이 있다. 하지만 validation 값은 앞서 언급했듯이 0.2가 낮아진 상태이다. 어떤 파라미터가 옳은지는 사실 잘 모르겠다. 일단 val값을 가장 낮추는 방향으로 진행할 예정이다.

 

11차 시도. Cloud의 더미 변수화

-> 7.526으로 개선 효과 없음

 

12차 시도. day 데이터의 lag 적용

day lag값 -> 24,48 인 경우 7.249 성능개선day lag값 -> 24,48,72 인 경우 7.26 성능감소 
day lag값 -> 24,48,72,96 인 경우 7.35 성능감소 

 

13차 시도. seasonal 1월 값을 예측

기존에는 시계열 분해한 계절성 데이터를 2020/01 ->2021/01(validation) 그대로 복사했습니다.

그래서 이번 시도는 랜덤포레스트로 예측하여 2021/01 계절성 데이터를 채웠습니다. 그리고 스케일링 전/후 성능비교까지 포함하여 진행했습니다.

 

스케일링 전: 7.248
스케일링 후 7.248

 

진행한 결과 변화가 거의 없었습니다. 또한 스케일링 전후 차이도 없었습니다.

타켓값의 계절성 데이터는 랜덤포레스트 변수 중요도에서 70% 정도를 차지하는 변수입니다. 그래서 

나름 기대하면서 진행했는데 결과는 조금 아쉬웠습니다. 

 

14차 시도. 계절성 데이터를 차분

랜덤포레스트 후 잔차 진단 결과 자기상관 그래프입니다.

편자기상관은 튀는 값이 있긴 하지만 상당히 진정된 상태를 보입니다. 반면 자기상관은 패턴이 보입니다.

어떻게 랜덤포레스트 모델에서 자기상관을 없앨수 있을까 고민을 했습니다. 일단 가지고 있는 데이터 중 계절성 데이터가 있으므로 이를 차분하여 어떤 효과가 있는지 변화를 보고자 했습니다. 

주기는 24이고, 결과는 아래와 같습니다.

 

target 변수 차분 24: 11.535
target 변수 차분 24,48: 12.555
-> 오히려 자기 상관성 튀는 값과 패턴이 뚜렷해짐

랜덤과 사리마모델을 혼합해 볼까 생각도 해봤지만 사리마 모델도 현재 성능이 썩 좋지는 않고 정상성도 확보를 못하고 있었던 터라 ..;; 부랴부랴 다시 파라미터 점검에 나섰습니다. 그런데 전과는 다르게 이번엔 전체 데이터로 (파라미터 실험했을땐 2020년도만 데이터 쪼개서 실행했었음) 실행하니까 중간에 오류가 걸립니다. 원인도 나오지 않은 채 그냥 터진 것 같습니다. 사리마로 진행하는 건 시간 낭비 일거란 판단하에 내일은 lgb모델의 파라미터 최적화를 해볼 생각입니다.

728x90

+ Recent posts