개발자로 후회없는 삶 살기
딥러닝 PART.교과목 yolo, segmentation 본문
서론
교과목 5주차 강의 내용을 정리합니다.
본론
- faster rcnn 복습
=> rpn
1. 어디에 있냐를 예측해야 하는데 어떤 모양으로, 어떤 크기로 있는지도 모르기 때문에 아는 게 없습니다.
2. 아무것도 모르는데 예측하 는 건 말이 안 되니 기본 틀을 만들어 두고 이 크기로 물체가 있을 거다라고 생각해 보겠습니다.
> 실제로 물체가 어떻게 있는지 모르는 상태에서 예측하라고 하면 말도 안 되는 말입니다.
3. 그래서 미리 "이럴 거다~"는 식으로 만들어 놓습니다. > 전체를 격자로 쪼개고 (이것도 하이퍼 파라미터입니다.) 격자의 점을 중심으로 k개의 앵커박스를 준비하고 다음 한 칸 옆 픽셀에서도 그 점을 중심으로 k개를 준비합니다. > 지역으로 제안할 후보(candidate)가 엄청 많은데 그 박스들을 평가하는 것이 왼쪽, 오른쪽 score로 > 왼쪽은 박스에 물체가 있냐 없냐입니다.(이진 분류이니 있다만 했도 되지 않나요? 근데 정확하지 않아서 있을 가능성과 없을 가능성 두 개를 구합니다.)
4. 오른쪽은 좌표입니다.
5. k가 박스로 박스마다 왼쪽 두 개, 오른쪽 4개가 나옵니다. > 점수가 높은 놈을 위에서부터 상위 몇 개 놔두고 그 남은 놈이 물체가 있을 거 같은 애들입니다. (몇 개를 남길지도 하이퍼 파라미터입니다.)
6. 살아남은 놈이 여기 있을 거 같은 resion proposal입니다. = 프로그램이 알려주는 external region proposal입니다.(★ resion proposal이지 최종 바운딩 박스가 아닙니다. = 이것으로 분류를 하고 박스 좌표 조정도 합니다. -> 프로그램으로 받은 resion proposal도 최종 resion이 아닌데요? 오른쪽 score로 조정을 하는 게 아니라 점수만 구하는 것입니다.
- YOLO
=> 새로운 점
resion을 제안해서 feature를 제안한 대로 쪼개서 분류기에 넣는 게(2 스탭) 아닙니다., 바로 앵커 박스에서 분류를 합니다.(1 스탭)
-> faster가 1 스탭에서 앵커 박스 거르기만 하고 2 스탭에서 받은 지역에서 feature map을 추천받은 대로 쪼개는 작업이 필요한데 얘는 그냥 처음 생판 있는지 없는지 모르는 앵커 박스에서 분류합니다.
=> 방법
1. 어딨 는지 모르는데 위치 잡고 분류도 해야 합니다. > faster는 어디에 있는 지를 먼저 찾고 거기서 roi 한 결과를 dense 해서 분류하자였는데 이제는 어디 있는지 모르는데 분류도 하고 바운딩 박스 조절도 합니다.
2. 근데 여기 진짜 있을까?라는 의심이 드니 신뢰도도 같이 구합니다. > 후보박스가 있는데 그 박스에 물체가 있다는 전제하에 분류도 하고 위치도 잡고 근데 생각 없이 잡은 박스이니 신뢰도도 구해서 신뢰도로 높은 박스를 남기고 다 버립니다.(일단 있다고 생각하고 나중에 필터링합니다.)
3. 역시 백본으로 cnn 해서 특징 추출하고 > 앵커 박스 준비하는 것도 동일 > 영상을 격자로 쪼개고 격자마다 k개의 앵커 박스가 있는 것도 동일합니다.
4. 그 격자마다의 k개의 앵커박스에서 '파란 막대'를 다 구합니다. > c가 신뢰도 > 20개의 클래스가 있다면 각각의 클래스마다 이 박스에 그 물체가 있을 가능성으로 20개의 0~1 값이 나옵니다. > 그게 하나의 격자에서 박스 k만큼 파란색 막대기가 풀로 붙인 것처럼 나옵니다.
=> 후처리
1. 앵커박스에서 구한 막대하나하나가 region proposal이라고 할 수 있는데 신뢰도의 임계치가 안 넘으면 버립니다.
2. 넘으면 넘더라도 박스를 하나의 격자에 중심점에 여러 개 뒀기 때문에 같은 영역을 잡는 경우가 많습니다. > 그래서 그 중복성을 nms로 처리합니다. > maximum만 남기고 나머지 중복된 애들은 버립니다.
3. 남은 박스가 최종 결과물입니다. (이게 마지막으로 남은 박스가 최종 바운딩 박스입니다. 왜냐하면 얘는 1 스탭이라서 resion을 제안받지 않습니다! [박스의 출력은 4개의 숫자인데 그래픽으로 선으로 그리면 결과입니다.]
4. 이것도 처음에 어노테이션으로 넣은 좌표와의 차이로 학습할 것입니다.
-> ★ 둘 다 앵커 박스 여러 개 중에서 정확도가 높고, 타이트하게 맞춘 남은 최종 박스입니다.
- semantic segmentation
기계가 그림을 보고 어디가 소녀고 어디가 자전거인가 알게 해보겠습니다. > 탐지와의 차이는 한 사물을 찾는 건데 얘는 사물을 제외한 배경, 장면 모두 어디가 뭐고 어디가 뭔지를 알아내는 것입니다. vs 탐지는 찾고 싶은 사물만 찾아냅니다.
-> 연구 초기는 각 픽셀을 전부 분류하는 것이었습니다. > 이후 계산량이 매우 높고 성능이 좋지 않아 폐기하고 CNN 인-디코더 망을 사용 + 영상의 의미대로(다른 물체대로) 화소를 분할합니다. > 화소를 다 분류하지 말고 모델로 학습합니다. 입력을 원래 이미지 넣고 학습을 해서 오차를 줄이는 방식으로 그냥 GAN이라는 생각이 들었습니다.
+ 강화
화소를 30*30으로 하기에는 900개의 픽셀이 너무 하니 한 번에 합니다. > (이것도 정답이 있습니다. ade20k, pascal voc2012 데이터를 보면 실제 이미지와 그 픽셀을 다 분류해 놓은 데이터가 있습니다.)
-> 이 데이터를 U넷에 넣으면 각 필셀마다 최종 출력으로 나온 이미지의 라벨과 와 실제 라벨과의 오차로 학습을 할 것입니다. ∴ unet 영상에서 영상을 만드는 것으로 일반 픽셀에서 클래스라벨이 붙은 픽셀로 바꾸는 것입니다. ★ 픽셀 분류를 하는데 32*32 각각 하면 무리이니 한 번에 하자는 것입니다.
- Mask RCNN
모든 화소(객체와 상관없는)를 분류하는 게 아니고 원하는 물체만을 찾는데 사람을 사각형이 아니라 형태를 제대로 찾습니다. > 이걸 MASK라고 부르고 사람을 다 다른 객체로 구분해서 봅니다.
=> 방법
1. faster를 살짝 바꿨는데 원래 faster은 rpn이 있을 것 같은 resion을 알려주면 roi 풀링으로 크기를 맞추고 dense로 분리하는 class 분류를 했었습니다.
2. roi 풀링 거친 것은 feature map을 rpn의 추천에 맞게 쪼갠 바운딩 박스를 roi 한 거잖아요? 즉 바운딩 박스잖아요?
3. 그 박스에는 물체가 하나 있겠죠? (바운딩 박스에는 무조건 물체가 하나입니다.) 그 박스에서 물체인지 배경인지 = 객체의 영역인가 아닌가라는 이진 분류를 시킵니다.
4. 객체가 있는 영역이 MASK입니다.
5. 보면 객체를 roi pooling 하면 faster rcnn이라고 보면 바운딩 박스가 출력됩니다. 그러면 객체를 찾았습니다. 그럼 그 박스에서 객체가 어떤 객체인지 알겠죠? 만약 고양이면 그 박스에서 고양이 영역과 고양이가 아닌 영역을 모든 픽셀에 대해 이진 분류할 수 있겠습니다.
-> 학습 데이터 셋 microsoft coco
'[AI] > [교과목 | 학습기록]' 카테고리의 다른 글
딥러닝 PART.교과목 오토인코더(Ae) (0) | 2022.11.16 |
---|---|
딥러닝 PART.교과목 단어 임베딩 (0) | 2022.11.08 |
딥러닝 PART.교과목 RNN (0) | 2022.11.08 |
딥러닝 PART.교과목 transformer, BERT (0) | 2022.10.25 |
딥러닝 PART.교과목 VQA, CNN text에 활용 (0) | 2022.10.23 |