앞서 darknet 시험 방법에 대해서 간단히 정리했습니다. 아래 링크를 참고해 주십시오.
이글은 train하고 모델을 변경해서 성능을 향상시키는 것이 목표가 아닙니다. Train을 완료한 config 파일과 weights 파일을 이용해서 테스트 파일을 시험하고, 모델의 성능을 평가하는 것이 주요 목표입니다.
평가를 위해서는 test를 통해서 object를 detect하고, 해당 object로 인식하는 confidence, 위치, 크기등의 정보가 필요합니다. 이를 위해서는 "./darknet detector test" 명령어를 사용하며, git 소스의 src/detector.c에 있는 test_detector() 함수를 직접 호출하게 되는데, 함수의 원형은 다음과 같습니다.
void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename,
float thresh, float hier_thresh, int dont_show, int ext_output, int save_labels,
char *outfile, int letter_box, int benchmark_layers)
Arguments들에 대해서 확인한 내용을 정리하면 다음과 같습니다.
datacfg : 데이터 파일
cfgfile : cfg 파일
weightfile : weights 파일
filename : 시험에 사용할 테스트 파일
thesh : object를 인식하기 위한 minimum threshold
hier_thresh : -
dont_show : OpenCV가 있는 경우, 찾은 object를 box로 표시한 그림을 볼 수 있는데, 이를 보지 않도록 하는 옵션
ext_output : 찾은 object의 위치 정보를 console에 출력하기 위한 옵션
save_labels : 찾은 object의 위치 정보를 txt 파일로 자동 저장 (예를 들어 data/dog.jpg를 시험하면, data/dog.txt 파일이 자동으로 생성됨)
outfile :찾은 object의 확률 및 정보등을 json 파일 형식으로 저장하기 위한 옵션
letter_box : box를 letterbox로 그리는 것으로 보임(확인해 보지 않음)
benchmark_layers : -
옵션을 사용하기 위해서 입력해야 하는 변수는 위의 이름과 틀릴 수 있습니다. (hier_thresh가 아니라 -hier을 사용하는등... 자세한 사항은 소스 참조)
이글에서는 save_labels와 outfile 옵션을 소개합니다.
앞선 글에서 설명했듯이, -ext_output 옵션을 사용하면 화면에 detect한 object들의 위치를 출력합니다.
-save_labels 옵션을 사용하면 이미지 파일이 존재하는 폴더에 이미지 파일에서 확장자를 'txt'로 변경한 파일명을 가지는 label 파일이 생성됩니다.
이 label 파일에는 -ext_output의 출력 내용을 map 옵션에서 사용하기 위해서 변경한 최종 내용이 포함됩니다.
예를 들어 data/dog.jpg에서 data/dog.txt 파일이 생성되고, 그 내용은 아래와 같습니다.
16 0.2889 0.6654 0.2558 0.5551
7 0.7584 0.2202 0.2816 0.1368
1 0.4471 0.4834 0.5881 0.5357
즉, 구태여 -ext_output 옵션을 사용해서 화면에 출력하고, 따로 계산해서 label 파일을 만들 필요 없이, -save_labels 옵션을 사용하면 됩니다.
outfile 옵션은 '-out 파일명' 형식으로 사용하면 되는데, 해당 파일명을 가지는 파일에는 json 형식으로 detect한 object들의 정보가 포함됩니다.
각 이미지 파일별로 생성하는 것이 아니고 모두 포함된 파일 하나만 생성됩니다.
그 내용은 아래와 같습니다.
[
{
"frame_id":1,
"filename":"data/dog.jpg",
"objects": [
{"class_id":16, "name":"dog", "relative_coordinates":{"center_x":0.288886, "center_y":0.665429, "width":0.255769, "height":0.555123}, "confidence":0.997768},
{"class_id":7, "name":"truck", "relative_coordinates":{"center_x":0.758406, "center_y":0.220200, "width":0.281645, "height":0.136754}, "confidence":0.931509},
{"class_id":1, "name":"bicycle", "relative_coordinates":{"center_x":0.447122, "center_y":0.483448, "width":0.588141, "height":0.535695}, "confidence":0.989874}
]
},
...
]
시험 방법은 다음과 같습니다.
일단 다음과 같은 내용을 가지는 cfg/test.txt 파일을 생성합니다. (이용할 파일들의 path를 정리)
data/dog.jpg
data/eagle.jpg
data/giraffe.jpg
data/horses.jpg
data/person.jpg
data/scream.jpg
그리고, 아래 명령을 실행합니다.
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights \
-ext_output -dont_show -save_labels -out output.json < cfg/test.txt
위 명령은
- detect한 object들의 정보를 화면에 출력하고 (-ext_output)
- 따로 그림으로 그려서 보여주지는 않고 (-dont_show)
- 각 이미지 파일명과 동일한 label 파일들을 생성하고 (-save_labels)
- 모든 label 정보가 포함된 json 파일을 생성하는데 (-out output.json)
- cfg/test.txt 파일에 있는 이미지 파일들에 대해서 'darknet detector test'를 수행한다.
는 의미입니다.
생성한 파일들은 이후 AP, mAP등으로 성능 평가를 진행할 때 매우 유용하게 사용할 수 있습니다.
(추가)
-dont_show 옵션이 없다면, detect한 object들을 box로 표시한 이미지를 확인할 수 있습니다.
그리고, 여러 이미지를 사용해서 시험하더라도 출력은 항상 고정된 파일명인 prediections.jpg로 저장됩니다.
이미지마다 detect한 object들을 포함하는 이미지로 각각 저장하기 위해서는 아래와 같이 일부 코드를 수정하면 됩니다.
find_replace_extension(input, ".jpg", ".1.jpg", output_buff);
save_image(im, output_buff);
if (!dont_show) {
show_image(im, "predictions");
}
- End -
'프로그래밍 > Big data' 카테고리의 다른 글
[Big data] AP, mAP (0) | 2020.09.23 |
---|---|
[Big data] darknet 기본 시험 방법 - 1 (2) | 2020.09.14 |