kyoungjoosin / Capston-Design

0 stars 0 forks source link

Object tracking(1) #10

Open kyoungjoosin opened 1 year ago

kyoungjoosin commented 1 year ago

object_tracking_passenger.py image

tracking.py image

1)

object_tracking_passenger이라는 파이썬 파일을 만들어줍니다. 그리고 tracking이라는 라이브러리에서 tracker라는 클래스와 trackable이라는 클래스를 가져옵니다. 이를 위해서 tracking이라고 하는 파일은 또 따로 만들어주었습니다.

5, 12)

tracking 파일에서 보면 tracker와 trackable이라는 클래스가 있는 것을 확인할 수 있습니다.

여기서 trackable은 트래킹을 당하는 하나 하나의 사람이고, tracker는 실제로 이것을 관리하면서 추적하고 좌표를 찾아주는 기능을 하는 클래스입니다.

2~9)

다시 passenger파일로 돌아와서 보면 opencv를 가지고 오고 수치 계산을 위해 numpy를 np로 사용할겁니다.

frame 사이즈를 416으로 설정해주고, 어느 정도의 신뢰도를 가지고 있느냐를 나타내는 min_confidence의 값을 0.5로 지정해주면서 0.5 이상의 신뢰도를 필터링 해줍니다.

min_direction은 들어오는 사람과 나가는 사람이 꼭 한 방향으로만 움직이지 않을 수도 있고, 시스템이 항상 위치를 정확하게 인식하지 않을 수도 있기 때문에 튀는 값들을 보정해주기 위해 최소 10번 정도는 한 방향으로 가야 들어오고 나가고를 정할 수 있게 계수를 지정하였습니다.

19~23)

tracker는 배열로 trackable은 딕셔너리로 설정해주었습니다. 파일은 user 디렉토리 아래에 있는 test 영상을 넣어주었습니다.

영상을 확인해보면 프레임을 하나 하나 처리해주어야 하기 때문에 영상 속도가 매우 느립니다. 그래서 결과로 나오는 영상도 매우 느리게 나오기 때문에 output 파일을 avi로 만들어 빠르게 나오도록 하였습니다.

25~31)

사물과 사람을 디텍트하기 위해 저희는 yolo를 사용할 것입니다.

모델이 어떤 구조로 되어있는지 어떤 레이어드를 갖고 있다라는 것을 설명해주는 yolov3 config 파일을 가져와 readnet 해줘서 opencv의 dnn 모듈에서 net이라는 변수에 객체를 생성합니다.

그리고 getLayerNames 해서 yolov3.cfg 파일의 이름들을 다 가져옵니다. 이 중에서 getUnconnectedOutLayer는 Layer중 ouput용으로 쓰는 3개의 Layer를 가지고 와서 나중에 추론을 하게 되는 것입니다.

그래서 먼저 처음에는 tracker라는 객체를 만들어줍니다. tracking.py라는 파일 안의 tracker라는 클래스가 하나의 객체로 생명이 불어넣어지는 것입니다.

34)

output이라는 파일을 만들어주기 위해 writer라는 변수를 하나 만들어줍니다. 그 다음 None이라고 해서 전역 변수를 사용해준 것입니다.

object_tracking_passenger.py image image image

47)

먼저 비디오 캡쳐를 합니다. 저희가 지정해준 test라는 비디오 파일을 읽습니다. 읽은 다음 vs라는 객체에 넣어줍니다. 비디오는 많은 프레임들의 모임이기 때문에 프레임은 정지 이미지와 같습니다.

48~)

52~54)

만약 프레임이 None이면 No more frame이 출력되게 합니다. 즉, 영상이 끝나면 loop가 끝이 나게 지정해줍니다.

56~60)

그렇지 않을 때는 먼저 시간을 측정해줍니다.

그리고 몇 개의 프레임을 처리했는지 카운트를 해줍니다.

그러고 높이와 넓이의 값을 프레임이 움직일 때마다 측정을 해줍니다. 사실 이 값은 영상이 변하지 않기 때문에 쭉 같은 값이 나올 것입니다.

count_limit은 영상 가운데 축에 선을 하나 그어줄 것입니다. 이것은 손님이 들어오고 나가고의 기준이 되는 선이 됩니다.

65~72)

그 다음 yolo 모델을 실시해 blob 값을 가지고 와서 실제로 detection을 합니다. 프레임을 가지고 와서 지정해주었던 프레임 사이즈인 416으로 욜로 모델을 지정해주고 기준 선인 255로 나누어준 값을 보내줍니다.

모델을 포워드 시키고 앞에서 저장했던 3개의 output layer를 주게 되면 outs라고 해서 object detection한 내용이 나옵니다. 이것을 관리해주기 위해 rects, confidence, box라고 하는 세 가지 배열을 선언해줍니다.

dnn 프로세스_blob

dnn 프로세스란, 추론 엔진으로 OpenCV를 사용하기 위해서 Tenserflow, caffe, Pytorch와 같은 다른 딥러닝 프레임 워크에서 훈련된 모델들을 로드

그런 다음 blobFromImage 함수를 사용하여 이미지를 전처리하고 마지막으로 로드 된 사전 학습된 모델로 blob을 전달하여 예측 결과를 얻어냄

image

dnn 모듈에서 사용하는 네 가지 방법은 readNetFrom, blobFromImage, setInput, forward

blob 사용 blob이란 동일한 방식으로 전처리 된 동일한 너비, 높이 및 채널 수를 가진 하나 이상의 이미지

blobFromImage 매개변수 이미지에서 4차원 blob을 만들고 선택적으로 크기를 조정하고 중앙에서 이미지를 자르고 평균값을 빼는 등의 작업 수행

blob = cv2.dnn.blobFromImage(image, scalefactor, size, mean, swapRB, crop, ddepth)

input image는 신경망을 통과할 이미지 scalefactor를 사용하면 선택적으로 특정 요소만큼 이미지 크기를 늘리거나 줄일 수 있음 size는 신경망이 예상하는 이미지의 크기 swapRB는 첫 번째와 마지막 채널을 교환하는 것 crop은 크기를 조정한 후 이미지를 자를지의 여부이며 기본적으로 자르기는 수행되지 않음 ddepth은 출력 blob의 depth이며 기본적으로 CV_32F를 사용

74~80)

사람이나 자동차 등 out중에 detection된 것을 찾아서 detection의 5번 째 이후가 식별한 물체의 배열과 거기에 있는 각 확률값이 나와있는 것이 score입니다.

그 중에서 가장 높은 값을 아그맥스라고 하는 numpy의 함수를 통해 찾아줍니다. 그 값은 confidence 값이 됩니다.

여기서는 두 가지 일을 실행합니다. 먼저, confidence 값이 앞에서 지정했던 min_confidence인 50퍼센트 이상은 되어야 한다는 것과 사람만 인식을 하는 것입니다. 사람은 person이라는 이름으로 되어있고 0번째입니다.

82~86)

카메라가 위에 달려있어서 머리가 주로 보일 것입니다. 그래서 사람을 인식하기가 어려워서 가끔 detection을 잃어버리기도 할 수 있지만 센터로이드가 따라가면서 tracking을 할 수 있습니다.

그럴 경우, center_x와 center_y, width와 height를 detection의 0과 detection의 1, 2, 3이 전체의 폭과 높이를 기준으로 했을 때 상대적인 값으로 나오는데 이에 실제 값을 더하게 되면 절대적인 값이 나오게 됩니다.

88~94)

x와 y는 센터 값으로 center_x와 y에서 각각 넓이와 높이의 반을 뺀 값이 됩니다. 그렇게 해서 x와 y, w와 h를 박스 안에 배열로 계속 넣어줍니다. 컨피던스도 float값으로 해서 confidence에 계속 넣어줍니다.

96~100)

바로 사용하지 않는 이유는 NMS함수를 사용해주기 때문입니다. NMS함수는 박스들이 중복되는 경우를 막아주는 함수입니다. 중복을 제외한 값을 indexes에 넣어줍니다. 그럼 앞에서 인식한 박스를 for문을 돌리면서 index에 들어있는 중복을 제외한 것들만 박스로써 인식을 합니다.

박스의 i번째를 들고 와서 x, y, w, h의 값을 가지고 오고 rects에 추가해줍니다. rects는 중복된 값이 없는 대표적인 박스들로만 다시 배열을 만드는 것입니다.

label은 confidence의 i에 소수점 둘 째 자리까지 퍼센트로 표시돼서 여기에 사각형을 그려주고 몇 퍼센트인지 보여주는 것입니다.

kyoungjoosin commented 1 year ago

참고 문헌

https://m.blog.naver.com/tommybee/222067664722

https://www.creapple.com/lecture