mAP : mean Average Pression (욜로에서 성능, 정확도를 표기하는 지표이다. 0 ~ 100의 수치를 갖는데 100일 수록 정확도가 높다.)
이유는 군대에서 사람들을 살상하는 무기로 사용되서 자괴감으로 인해 하차함.
인공지능은 항상 어떤 데이터가 들어오고 나오는지 알 수 있어야 한다.
입력했을때 448x448x3 이엇고 출력은 7x7x30으로 출력된다.
레이어 20개 써서 압축한다.
C.R = convolution, ReLU.
FC.R = Fully Connected, ReLU
FC = Fully Connected
Scratch 한 부분을 모델이 train한다.
google Net 을통해 이미지의 특징을 추출한 것들이 14x14x1024에 저장 시켰다.
google Net 을 사용한 이유는 특징들을 압축시켜서 Train할때 빠르게 연산처리 하기 위함이다
마지막 으로 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이라고 한다.
매우 중요하다 잘 알아두자!!
예측하기 위해서 FCL를 사용해서 예측을 해준다.
모델2는 이미 학습이 완료된 weight(model의 CNN+FCN을 학습한 부분)를 가져와서 사용한다
하지만 마지막에 classes들의 갯수가 다르다, 이를 맞추기 위해서는
Strict = False를 써줘서 학습 된 부분만 학습하고 안 된 부분은 랜덤하게 들어갈 수 있도록 설계 해줘야 한다.
Tranfer Learning은 다른 곳에서 학습된 weight값을 가져와서 사용하는건데
두가지 방법이 있다.
1. 고정 (얼린다 freeze)
2. 뜯어온걸 여기서 학습 진행 - freezing시킨것 보다는 속도가 느리다 하지만, 데이터를 사용한다는데에 이점이있다.
주의깊게 봐야할 곳은 출력값이 7x7x30 이다 왜냐하면 물체를 감지해야 하기 때문이다.
원본 이미지를 비율적으로 줄였다고 생각하면된다.
488 488 을 7 7 으로 줄였다고 생각하면된다.
채널이 30개의 값을 해석해서 박스 바운더리나, 라벨의 값을 해석해서 output을 만들어 낸다.
위 7 7 30 박스를 잘 해석 해야 한다.
한 픽셀값에 해당하는 채널값들을 가져와서 일렬화 시킨것이다... 1X30
채널값들중 가장 앞 5가지가 제일 중요하다
x, y, w, h, c 을 말한다. c는 물체가 있는지 없는지 알아내는 역할을 한다 0 아니면 1로 나옴.
뒤에 나혼 값들은 학습에 의해서 나온 결과값들을 말한다. 최종적으로 뽑혀진 값들이다.
이 것들을 잘 해석해서 그리면 물체가 들어있는 지점을 정확히 그릴수 있다. 한 픽셀에
이 값들을 스케일링 해야 한다. 이유는 NN 에 넣기 위해서는 0~1사이의 값들을 스케일링 해줘야 한다.
한 그리드 박스 - x(50%) 와 y(50%)는 한 박스 그리드안에서의 값을 말한다.
전체 이미지 - 대비 비율이 w 0.3(30%) h 0.6(60%) 으로 본다.
c는 threshold가 0.7로 잡혀 있기 때문이다.
자동차는 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으로 출력한다.
C를 보고 박스를 그릴지 말지 결정한다
C 를 Box Quality 라고 표현한다.
빨간 박스는 정답 값, 주황색은 예측값
Bbox 안의 물체의 센터점을 포함하고 있는 그리드 셀은 1 포함하지 않고 있는 셀은 0 이다.
센터점을 포함하지 않으면 C값은 무조건 0이다.
그리고 물체를 포함한 그리드셀(C가 1이상인 그리드셀)의 갯수와 라벨의 갯수는 trade on 관계이다.
C = 1 이 나오면 안된다... 왜냐면 C가 점점 back으로 학습을 해야하는데
결론 - IOU가 높으면서 중앙값이 정답 그리드셀과 같을 경우에 가장 예측이 잘된 것이다.
정리
학습의 오류로 중앙값을 다른곳에 찍는데, 다른곳을 찍게되면 Bbox가 안나온다. 그래서 2개를 2번의 기회를 주는데
그래서 그리드 셀이 총 98개중 3개를 거르게 된다..
손코딩으로 if문으로 후처리 박스 처리한다.
처음 나오는 5개 x 2으로 10개 가지고 무엇을 알수 있을까?
박스 위치(존재)와 그 안에 물체의 정확도(물체 포함여부)를 알 수 있다.
10개 가지고 물체를 알아 볼수는 없다. 20개는 박스 안의 물체가 어떤 카테고리에 속하는지를 알 수 있다.
얼려서 학습 안 시키고, 압축시켜서 보관한다음> 학습진행 ( 특징추출함 > FCL으로 예측 ) > 결과 추출( 7 x 7 x 30 )으로 만듬. 뒤에 채널은 30개로 만들어준다. 각각 그리드 셀마다 2개씩 처지기 때문에 98개의 박스가 쳐진다.
박스안에 어떤 객체가 들어가 있는지 모르므로 카테고리로 알아낸다.
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 |