J o e
JoE's StOrY
J o e
  • 분류 전체보기 (206)
    • workSpace (184)
      • 도메인 지식 (2)
      • ALGORITHM (39)
      • ANDROID (3)
      • JS (0)
      • JAVA (21)
      • MYSQL (6)
      • NETWORK (3)
      • PYTHON (91)
      • LINUX (9)
      • PROJECT (4)
    • Others (20)
      • Opic (1)
      • myLife (17)
      • popSong (1)
      • 정보처리기사 (1)
    • 훈빠의 특강 (0)
      • opencv (0)
      • python (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • The code with long statements is⋯
  • 매일 매일이 행복하고 밝은 날이 될거에요

인기 글

태그

  • 태블릿 연동
  • Fully Connected Network
  • 파이썬
  • linearclassification
  • java
  • How to create a GUI in Java with JFrame?
  • 단어의 개수
  • read_html
  • numpy
  • 이미지 연산
  • DTO
  • ㅖ43
  • MySQL
  • 넘파이 문제
  • sort_index
  • sort_value
  • dao
  • 넘파이함수
  • Python
  • full loss

최근 댓글

최근 글

티스토리

J o e

WHY?

[DL] Object Detection YOLO V1
workSpace/PYTHON

[DL] Object Detection YOLO V1

2021. 2. 8. 12:49

 

mAP : mean Average Pression (욜로에서 성능, 정확도를 표기하는 지표이다. 0 ~ 100의 수치를 갖는데 100일 수록 정확도가 높다.)

조셉 레드먼은 yolo3까지만 만들고 후계자가 나머지 4 5 를 만들었다.

이유는 군대에서 사람들을 살상하는 무기로 사용되서 자괴감으로 인해 하차함.

인공지능은 항상 어떤 데이터가 들어오고 나오는지 알 수 있어야 한다.

입력했을때 448x448x3 이엇고 출력은 7x7x30으로 출력된다. 

레이어 20개 써서 압축한다.

C.R = convolution, ReLU.
FC.R = Fully Connected, ReLU
FC = Fully Connected

YOLO v1의 구조이다.

Scratch 한 부분을 모델이 train한다.

google Net 을통해 이미지의 특징을 추출한 것들이 14x14x1024에 저장 시켰다.

googleNet에서 이미지를 자른부분이다. 예시임.

google Net 을 사용한 이유는 특징들을 압축시켜서 Train할때 빠르게 연산처리 하기 위함이다

conv2d+ReLU는 늘려도 되지만, FCN을 늘리게 되면 Computation Cost가 높아서 늘리지 않는다.

마지막 으로 7x7x30 에서해석하고 분석해서 바운더리 박스를 만들고,

최종적으로 박스가 여러개 처지면 안되므로(하나의 박스에 하나의 물체) 잘 연산 정리해야한다.

출력값으로 해석해야 하는 그 과정이 좀 난해하다 잘 알아둬야 하는 부분이다.


Transfer Learning

 

모델구조는 거의동일 하지만, 데이타셋만 다를경우, model1 에서 사용했던 cat_dog_model.ckpt 에 저장된 weight값을 가져와서 아래 model2에서 사용하면 된다.

args.resume() 에서 불러와 사용하면 된다

학습은 고라니 vs 강아지 data로 학습 시키면 된다.

결론 : model2를 학습 할때 weight 값은 model1에서 사용했던 weight 값으로 train하고, data는 강아지, 고라니로 학습을 시작한다.

그렇다면 이렇게 사용하면 좋은 이점은 무엇이 있을까? 아래 사진으로 알아보고 정리하자.

결론 - 이미 학습을 끝낸 모델의 값(checkpoint - weight)을 가져와서 새롭게 학습할 대상에 접목 시키면 빠르고 정확한 학습을 할 수 있다. = pretrained 라고 한다.

pretrained으로 학습을 하는 방법을 Transfer Learning이라고 한다.

학습하는 방법론은 다양하게 있지만, 그중에서 사람들이 주로 사용하는 방법이다.
googleNet에서 Transfer Learning 방법을 사용해서 가져왔다.

매우 중요하다 잘 알아두자!!

Strict = False인 이유

예측하기 위해서 FCL를 사용해서 예측을 해준다.

모델2는 이미 학습이 완료된 weight(model의 CNN+FCN을 학습한 부분)를 가져와서 사용한다

하지만 마지막에 classes들의 갯수가 다르다, 이를 맞추기 위해서는 

Strict = False를 써줘서 학습 된 부분만 학습하고 안 된 부분은 랜덤하게 들어갈 수 있도록 설계 해줘야 한다.

Tranfer Learning은 자유도가 높다. 보통은 2번처럼 사용한다

 

Tranfer Learning은 다른 곳에서 학습된 weight값을 가져와서 사용하는건데

두가지 방법이 있다.

1. 고정 (얼린다 freeze) 
2. 뜯어온걸 여기서 학습 진행 - freezing시킨것 보다는 속도가 느리다 하지만, 데이터를 사용한다는데에 이점이있다.

FCN은 늘리지않는게 중요~!

주의깊게 봐야할 곳은 출력값이 7x7x30 이다 왜냐하면 물체를 감지해야 하기 때문이다.

원본 이미지를 비율적으로 줄였다고 생각하면된다.

488 488 을 7 7 으로 줄였다고 생각하면된다.

채널이 30개의 값을 해석해서 박스 바운더리나, 라벨의 값을 해석해서 output을 만들어 낸다.

위  7 7 30 박스를 잘 해석 해야 한다.

한 픽셀값에 해당하는 채널값들을 가져와서 일렬화 시킨것이다... 1X30

채널값들중 가장 앞 5가지가 제일 중요하다 

x, y, w, h, c 을 말한다. c는 물체가 있는지 없는지 알아내는 역할을 한다 0 아니면 1로 나옴.

뒤에 나혼 값들은 학습에 의해서 나온 결과값들을 말한다. 최종적으로 뽑혀진 값들이다.

이 것들을 잘 해석해서 그리면 물체가 들어있는 지점을 정확히 그릴수 있다. 한 픽셀에

x y w h c 가 갖고 있는 설명문...

이 값들을 스케일링 해야 한다. 이유는 NN 에 넣기 위해서는 0~1사이의 값들을 스케일링 해줘야 한다.

 

한 그리드 박스 - x(50%) 와 y(50%)는 한 박스 그리드안에서의 값을 말한다.
전체 이미지 - 대비 비율이 w 0.3(30%) h 0.6(60%) 으로 본다. 
c는 threshold가 0.7로 잡혀 있기 때문이다.

최종 값이 0.7인데 0.9로 예측하면 loss값이 낮아지니까 좋지는 않은것이다.

자동차는 0.7 0.5 0.4 0.2 1

wrt = with regard to

 

C는 IOU값까지 곱해있는 값이다.

총 그리드 셀은 49개 이다.

분홍색은 의미가 없고 객체가 없으니까 1 또는 0중에 0으로 표기 되어서 C값은 모두 0으로 표기된다.

3개의 점만 바운더리 박스르 갖는 의미있는 점이 된다. 

즉 46개는 무의미한 박스이다.

3개의 그리드 셀만이 의미있는 점이다.

실제답안과 예측답안 비교

다른 예측값이 있어도 IOU가 낮아서 다른 IOU값이 높은것들을 output으로 출력한다.

노란색은 IOU가 낮아서 채택이 안됨
IOU계산법

C를 보고 박스를 그릴지 말지 결정한다

C 를 Box Quality 라고 표현한다.

물체가 존재할 확률

빨간 박스는 정답 값, 주황색은 예측값 

Bbox 안의 물체의 센터점을 포함하고 있는 그리드 셀은 1 포함하지 않고 있는 셀은 0 이다.

센터점을 포함하지 않으면 C값은 무조건 0이다.
그리고 물체를 포함한 그리드셀(C가 1이상인 그리드셀)의 갯수와 라벨의 갯수는 trade on 관계이다.

C = 1 이 나오면 안된다... 왜냐면 C가 점점 back으로 학습을 해야하는데 

결론 - IOU가 높으면서 중앙값이 정답 그리드셀과 같을 경우에 가장 예측이 잘된 것이다.

 

정리

그리드 셀마다 각각 나오는데 거기서 사용되는 그리드 셀은 3개(나온객체수)만큼만 사용되게 된다.
이제 저 앞부분 5개를 했는데 이제부터는 뒤에 나오는 5개와 20개에 대해서 알아보자

 

학습의 오류로 중앙값을 다른곳에 찍는데, 다른곳을 찍게되면 Bbox가 안나온다. 그래서 2개를  2번의 기회를 주는데

그래서 그리드 셀이 총 98개중 3개를 거르게 된다..

손코딩으로 if문으로 후처리 박스 처리한다.

위의 것보다 좀더 이상적인 방법인데 이 방법을 사용하지 않은 이유는 Conputation Cost때문이다. 그래서 2번 쓰지 않았다

처음 나오는 5개 x 2으로 10개 가지고 무엇을 알수 있을까?

박스 위치(존재)와 그 안에 물체의 정확도(물체 포함여부)를 알 수 있다.

Bbox를 만드는 로직

10개 가지고 물체를 알아 볼수는 없다. 20개는 박스 안의 물체가 어떤 카테고리에 속하는지를 알 수 있다.

얼려서 학습 안 시키고, 압축시켜서 보관한다음> 학습진행 ( 특징추출함 > FCL으로 예측 ) > 결과 추출( 7 x 7 x 30 )으로 만듬. 뒤에 채널은 30개로 만들어준다. 각각 그리드 셀마다 2개씩 처지기 때문에 98개의 박스가 쳐진다.

박스안에 어떤 객체가 들어가 있는지 모르므로 카테고리로 알아낸다. 

YOLO는 B에 가깝다

v1은 Recall이 낮다. 왠만한건 잡는데 놓치는게 많다.

Pre-trained Model(Transfer Learning) = 이미 학습한걸 뜯어 씀 그리고 얼림. 레이어 20개 까지만 뜯어씀
Activation Function : Leaky ReLU 그냥 그저 좋음
Data augmentation : Random translation (20%) 는 여기서 중요한건 crop이나 flip이나 등등을 순서를 잘 맞춰짜면 코드가 쉽다.

version v2에서는 저 FCN부분이 없다. 왜 공간정보를 없애면서 저러는지 모르겠음...

다음 장에서 알아보자... 


참고

YOLO의 모델들의 차이점 [ www.youtube.com/watch?v=s8Ui_kV9dhw ]

NMS 설명 1 [ dyndy.tistory.com/275 ]

NMS 설명 2 [ visionhong.tistory.com/11 ]

 

전반적인 로직 설명 [ docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.p ]

 

 

 

 

'workSpace > PYTHON' 카테고리의 다른 글

윈도우에서 우분투 설치하는 블로그  (0) 2021.02.08
[DL] Object Detection YOLO V2  (0) 2021.02.08
[DL] MP  (0) 2021.02.07
[DL] Object Detection  (0) 2021.02.05
[DL] Threshold  (0) 2021.02.05
    'workSpace/PYTHON' 카테고리의 다른 글
    • 윈도우에서 우분투 설치하는 블로그
    • [DL] Object Detection YOLO V2
    • [DL] MP
    • [DL] Object Detection
    J o e
    J o e
    나의 과거를 기록합니다.

    티스토리툴바