Get distance by using opencv, yolo_v2 for my study
카메라로부터 오브젝트 탐지,
거리계산 처음엔 카메라 두대를 이용하여 유클리드 거리를 구하는 방식을 생각하였는데, 단안 카메라를 이용한 거리측정에 대한 논문을 발견하여 이를 활용해보기로 하였다.
거리 정보가 포함된 Kitti dataset을 이용하여 distance loss를 추가하여 계산
논문 내에서 dataset을 imagenet과 cocodataset을 wordTree로 구성한뒤 Joint training 방식을 통해 특정 loss에 따라 backward를 다르게 구현합니다만, 이번 프로젝트에서는 Torch의 autograd를 사용하였습니다.
해당 시그마가 의미하는것은 단순 합계가 아닌 객체가 존재하는 그리드셀의 값이였다.
"즉, localization loss, confidence loss는 해당 셀에 실제 객체의 중점이 있을 때 해당 셀에서 출력한 bounding box 중 Ground Truth Box와 IoU가 더높은 bounding box와 Ground Truth Box와의 loss를 계산한 것들입니다. 그리고 classification loss는 해당 셀에 실제 객체의 중점이 있을 때 해당 셀에서 얻은 class score와 label data 사이의 loss를 나타낸 값이죠."
confidence loss 구현 부분에서 bestbox(responsible)와 나머지 박스들의 c score도 알아야 되는데 max를 통하여 최대값을 찾다보니 모든 박스들의 score값을 알수 없었다.
리스트를 통해 한번에 알아볼수있게 정리하였다.
Iobj_i (exist)는 해당 셀 내에서 객체가 실제로 존재하는지(classification loss에 사용) , 존재시 1, 아닐경우 0
Iobj_ij(responsible)는 스칼라인 confidence score(1(pr_object)*iou(bbox,gt_box))을 np형태로 가공, responsible bbox(최대 iou bbox)와 gt box를 비교할것이라는 뜻
max iou 자체는 torch.max를 이용하여 쉽게 찾을 수 있었지만, 이를 bboxes에 매칭하는것이 어려웠다.
(shape is [batchsize, gridcell, gridcell, channel])
unsqueeze를 이용하여 박스 idx 채널을 하나 추가하였고, torch.mode 를 이용하여 most frequency를 파악하여 best box를 선택하였다.
사진의 크기는 resize가 되어 416x416의 형태가 되고, 3채널 이미지를 가진다. 배치사이즈는 32로 가정시 즉 예상 이미지당 용량은 416x416x3x32x32bit 인데, 이는 0.066453504 gb이고 200장 기준 약 13gb가 사용된다.
메모리의 최대 크기는 12기가인데, 여기서 문제가 발생하는 것이였다.(추가로 Conv2D 혹은 Weighting, bias를 너무 많이 사용하는 모델을 사용시 발생하는 문제였음)
yolo의 모델 크기도 크고, 이미지 사이즈도 큰 편이라 하는 수없이 사진의 갯수를 줄이고 학습 틈틈이 지우면서 학습하였다.
할 수 있는 범위 내 가장 큰 범위인 30epoch 학습 진행 (save load를 이용해 두 번에 걸쳐 학습)
loss graph
정상적인 동작 확인
해당 이미지를 예측한 결과, 세밀한 보정은 아직 진행하지 않았으나 좌하단 원점 기준 가로 293 ~ 331 영역, 세로 59 ~ 80 영역에서 탐지된 객체가 차로 표현되는 등 정상적인 작동을 확인하였음.
추가적으로, backbone network를 다크넷을 구현하여 사용하였으나, pre-trained 모델이 아니였으므로 실제 모델만큼의 좋은 성능을 보이지 못했다고 생각
yolo v2 역시 제로베이스에서 학습하여 좋은 성능을 보이지 못함
비록 환경여건으로 인해 만족스러운 결과를 얻지는 못하였지만, 학습이 진행된다는 점은 확인되었으므로 어느정도 만족함
추후 기회가 된다면 같은 주제로 프로젝트를 만들고 싶다.