본문 바로가기
TensorFlow OpenCV

YOLO V3 darknet 수정(이미지 잘라서 사용) 2019. 9. 8. 21:18

by BABEL-II 2019. 10. 5.

darknet을 학습시키고, 데모를 돌릴 때에 1920x1080 풀 사이즈 이미지를 이용하면 오브젝트 이미지가 상대적으로 너무 작아서 학습및 검출이 잘 안 된다.

학습은 이미지를 반으로 잘라서 시키면 어느 정도 되는데,

demo를 돌릴 때에도 반으로 잘라서 제공해야 한다.

1. 일단 좌측 반을 이용하는 코드.

~/darknet/src$ vi image_opencv.cpp

image get_image_from_stream(void *p)

{

VideoCapture *cap = (VideoCapture *)p;

Mat m;

*cap >> m;

if(m.empty()) return make_empty_image(0,0,0);

//return mat_to_image(mr);

Mat mr = m(Rect(0,0, m.cols/2, m.rows));

printf("image get_image_from_stream w=%d, h=%d\r\n", mr.cols, mr.rows);

return mat_to_image(mr);

}

2. 이건 좌측 반과 우측 반을 이용해서 전체 이미지를 재생성하는 부분

// MODIFIED

Mat msave;

int monce = 0;

image get_image_from_stream(void *p)

{

VideoCapture *cap = (VideoCapture *)p;

if(monce == 0) {

monce = 1;

*cap >> msave;

if(msave.empty()) return make_empty_image(0,0,0);

Mat mr = msave(Rect(0,0, msave.cols/2, msave.rows));

printf("image get_image_from_stream w=%d, h=%d\r\n", mr.cols, mr.rows);

return mat_to_image(mr);

}

else {

monce = 0;

Mat mr = msave(Rect(msave.cols/2,0, msave.cols/2, msave.rows));

printf("image get_image_from_stream w=%d, h=%d\r\n", mr.cols, mr.rows);

return mat_to_image(mr);

}

}

// MODIFIED

Mat showL;

int show0 = 0;

int show_image_cv(image im, const char* name, int ms)

{

if(show0 == 0) {

show0 = 1;

showL = image_to_mat(im);

return -1;

}

show0 = 0;

Mat mR = image_to_mat(im);

Mat m;

hconcat(showL, mR, m);

imshow(name, m);

int c = waitKey(ms);

if (c != -1) c = c%256;

return c;

}