5. 탐지 결과를 그릴 때 무엇을 검증할까
draw_detections는 detection마다 threshold를 넘은 클래스 이름을 모으고, 첫 클래스를 기준으로 색을 고른 뒤 정규화된 box를 픽셀 좌표로 바꾼다.
1
2
3
4
5
6
7
| int left = (b.x-b.w/2.)*im.w;
int right = (b.x+b.w/2.)*im.w;
int top = (b.y-b.h/2.)*im.h;
int bot = (b.y+b.h/2.)*im.h;
draw_box_width(im, left, top, right, bot,
width, red, green, blue);
|
draw_box는 좌표를 이미지 경계로 자르고 CHW 배열의 네 변에 RGB 값을 직접 쓴다. alphabet이 있으면 문자 이미지를 이어 붙인 label을 그리고, mask가 있으면 14×14 mask를 box 크기로 resize한 뒤 0.5에서 threshold해 삽입한다.
결과가 이상할 때는 화면만 보지 말고 다음을 순서대로 확인한다.
- 입력
image가 CHW이며 픽셀 값이 0~1 범위인가? bbox.x, bbox.y, bbox.w, bbox.h가 정규화 좌표인가?- letterbox를 거쳤다면 여백과 scale을 되돌렸는가?
- RGB와 BGR을 바꾸는
rgbgr_image가 중복 호출되지 않았는가? - 새 버퍼를 반환한 함수와 입력을 직접 수정한 함수를 구분했는가?
- 임시
image를 정확히 한 번만 free_image 했는가?
show_image는 OpenCV로 컴파일됐으면 창을 띄우고, 아니면 같은 이름의 PNG를 저장한다. “창이 안 뜬다”는 현상만으로 이미지 생성 실패라고 판단하면 안 된다. 결국 image.c의 핵심은 개별 필터 이름이 아니라 배열 배치, 좌표계, 값 범위, 버퍼 소유권이 다음 함수로 어떻게 전달되는지 추적하는 것이다.