일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 장고
- Android Studio
- 중국어입문
- es6
- Android
- express
- react
- 자바
- 안드로이드스튜디오
- 자바스크립트
- 리액트
- Django
- mongodb
- 알고리즘
- 안드로이드 스튜디오
- PYTHON
- 안드로이드
- javascript
- 블로그 만들기
- java
- 블로그만들기
- 중국어
- mern Stack
- 입문
- 개발
- nodejs
- MernStack
- 파이썬
- Node js
- androidstudio
- Today
- Total
City At Night
[Yolo5] 무인편의점 상품을 인식하기! 본문
Yolo란 You only look once 한 번 보고 바로 예측한다!
우리가 알고 있는 의미와는 다르죠?
처음 실시간 객체인식은 자율주행 차량에 많이 사용 되었다고 합니다.
자동차가 주행중 무언가의 장애물이 들어왔을때 다음 행동( 피해가기, 멈추기)을 해야하기에 꼭 필요한 기술이였죠.
하지만 지금은 언택트 시대로 바뀌면서 사람의 일을 컴퓨터가 대신하게 되었죠
편의점에 사람이 없고 소비자가 직접 계산을 한다면?
컴퓨터가 상품을 알고 있어야 인식을 하고 그 상품에 대한 정보(이름,가격)를 보여주고 결제를 진행한다.
그런데 상품을 인식하는데 다른걸 인식해버리거나 인식하는데 오래 걸린다면..? 손님은 기다리다 지쳐서 다시는 그 편의점에 오지 않을 것 이다.
그러므로 상품을 인식할때 제일 중요한건 정확도와 스피드이다!
그게 바로 Yolo이다.
전반적 이론을 베이스로 설명하겠다.
7 x 7 이미지이며 한칸을 grid cell 이라고 한다. (쉽게 gird라 하겠음)
하나의 grid는 두 개의 Bounding Box를 가집니다.(bb라고 하겠음)
( 그럼 위 이미지는 총 98개의 bb를 갖는다. 7 x 7 x 2)
그럼 Bounding Box란 무엇인가?
⇒ grid에서 예측한 박스이다
2개의 Bounding Box는 network가 찾아서 만듭니다!
이 개념은 우선 넘어가도록 하죠! 이런 네트워크를 통해 BB를 찾아서 만든다~정도만 알고 계시면 됩니다!
자 Bounding Box에 대해 다시 설명하자면
Bounding Box는 x, y ,w, h, c 라는 5개의 정보를 갖게 됩니다.
x,y는 bb1의 중심이 그리드(현재 빨간박스)의 중심에서 어디에 있는지
w,h는 가로와 세로의 길이가 전체 이미지 크기에 어느정도 크기를 갖는지를 나타냅니다.
⇒ 전체 이미지의 가로는 7이면 .. w는 대략 3/7, h는 4/7 정도 갖죠
c는 bb에(bounding box)에 오브젝트가 있을 확률이다.
쉽게 말하면 Bounding Box에 무언가가 있는지 없는지를 뜻하죠.
⇒ 오브젝트가 있을 확률이 0에 가까우면 배경이라 보시면 됩니다.
(여기서는 자료를 만들기 어려워서 인터넷에서 사진을 가져왔다.)
지금 사진 속의 초록색 바는 채널이라고 한다.
채널은 하나의 그리드에 대한 Bounding Box의 정보(x,y,w,h,c)가 들어 있다.
즉, 하나의 그리드에는 두개의 Bounding Box가 있다고했으니
이렇게 표현 할 수 있다. 참 쉽쥬?
그럼 바운딩박스 정보 뒤에 채널은 뭐가 들어갈까?
뒷쪽에는 해당 그리드 셀(빨간색 박스)에 오브젝트가 있다면 그것이 어떤 클래스일지에 대한 확률이 저장되어 있다
채널의 크기 30중 bb1과 bb2를 제외한 부분의 크기는 20이다.
노란바는 이해시키기 위해 그 부분을 따로 표시한것이다.
지금까지 한 내용을 토대로
네트워크를 통해 그리드 셀에 오브젝트가 있을 확률을 구했고 (어떤 오브젝트가 있을 확률)
그 오브젝트가 어떤 클래스일지에 대한 확률을 구하는데 그 확률이 노란 바에 들어간다는 것이다.
예를 들어 클래스 종류에 (물,고양이,아이스크림,사과,과자, ....)가 있다고 하면
저 그리드 셀에 있는 오브젝트가 물일 확률 , 고양이일 확률,아이스크림일 확률,,,을 구하게 된다
이 클래스일 확률을 순서대로 ( 0.3 ,0.6, 0.1, 0.15 .... ,0.2)라고 하면
- 그리드 셀에 오브젝트가 있을 확률 * 0.6
- 그리드 셀에 오브젝트가 있을 확률 * 0.1
- 그리드 셀에 오브젝트가 있을 확률 * 0.15
*
*
*
20.그리드 셀에 오브젝트가 있을 확률 * 0.2
총 각각의 확률 20개가 나올 것이다.
그림으로 표시하면 위와 같다!
그러면 위에서 총 48개의 채널이 존재한다.
그리고 스레시홀드(확률 0.2)보다 작은것은 0으로 바꿔주고 확률이 높은 순으로 나열 해준다.
이후 모델을 돌려보면 아래와 같이 중복 문제가 발생한다.
저 수많은 박스들은 다 높은 정확도로 잘 예측하고 있지만 우리는 하나의 박스로만 표현하는것도 충분하기에 하나만 남기고 중복된 박스들은 삭제할 것이다.
이때 사용하는게 NMS이다. 제일 높은 정확도를 가지는 Bound Box를 빼고 다 제거한다
그러면 위 이미지의 오른쪽과 같이 하나의 Bounding Box만 남게된다!
이로써 yolo의 개념은 끝!!