원할한 수행을 위해서는 numpy, matplotlib, opencv-python 패키지가 필요합니다.
virtualenv를 이용한 가장 기본적인 환경 설정은 다음과 같습니다.
# virtualenv 환경 설치
virtualenv venv --python=python3
# virtualenv 실행
source venv/bin/activate
# 필요한 패키지 설치
pip install numpy
pip install matplotlib
pip install opencv-python
이후에는 단순히 아래 명령어를 수행하면 됩니다.
python main.py
프로그램이 실행되면서 화면이 계속 변경되는 것을 확인할 수 있습니다.
최종적인 디렉토리 구조는 아래와 같습니다.
├── input
│ ├── detection-results # detection 결과 txt 파일들
│ ├── ground-truth # object 정보 txt 파일들 (정답)
│ └── images-optional # 원본 이미지
└── output # 통계 이미지, output.txt
├── classes # class별 AP 그림
└── images # 원본과 detection 결과를 같이 보여 주는 이미지
└── detections_one_by_one # 각각의 object별 이미지
소스를 처음 받으면 input 폴더와 하위 폴더만 있고, 실행 후에 output 폴더가 생성됩니다.
각 폴더 및 폴더에 포함된 파일들에 대한 상세 설명은 아래와 같습니다.
input/detection-results : 모델을 통해서 얻어진 detection 결과값
input/ground-truth : ground-truth data. 일종의 정답
input/images-optional : 실제 사용한 이미지들
output : 통계 이미지. AP, mAP를 위한 실제 데이터 값 (output.txt)
output/classes : class별 AP 이미지
output/images : detection 정보 및 ground-truth data가 box 형태로 실제 이미지에 표시된 최종 결과 이미지
output/images/detections_one_by_one : detection된 내용이 개별적으로 이미지에 표시된 파일
detection-results에 포함된 "이미지파일명.txt" 파일들의 구성은 다음과 같습니다.
class명 confidence xtl ytl xbr ybr
confidence : 모델이 해당 class로 확신하는 정도. float. %
xtl, ytl : box의 좌측상단 좌표(top left)
xbr, ybr : box의 우측하단 좌표(bottom right)
ground-truth에 포함된 "이미지파일명.txt"는 위와 동일한데, confidence만 없습니다.
- 여기서 'detecor test' 명령에는 data 파일이 사용되는데, data 파일의 형식은 다음과 같습니다. (coco.data 파일에 주석을 달았습니다.)
# #는 주석 표시
# class의 갯수
classes= 80
# train에 사용하는 파일
train = /home/pjreddie/data/coco/trainvalno5k.txt
# validation이나 test에 사용하는 파일
valid = coco_testdev
#valid = data/coco_val_5k.list
# class와 class id를 matching시키기 위한 names 파일
names = data/coco.names
backup = /home/pjreddie/backup/
eval=coco
- 시험에 사용할 파일명( (여기서는 data/dog.jpg)을 맨 마지막에 넣어 줬는데, 파일명이 없는 경우 아래와 같은 메시지가 출력되면서 파일 경로 입력을 기다립니다.
"Enter Image Path:
- 인식 확률이 출력되는데, '-ext_output' 옵션을 추가하면, 검출된 objects의 위치와 크기 정보를 출력합니다.
.txt-file for each .jpg-image-file - in the same directory and with the same name, but with .txt-extension, and put to file: object number and object coordinates on this image, for each object in new line: <object-class> <x> <y> <width> <height>
Where:
<object-class> - integer number of object from 0 to (classes-1)
<x> <y> <width> <height> - float values relative to width and height of image, it can be equal from (0.0 to 1.0]
for example: <x> = <absolute_x> / <image_width> or <height> = <absolute_height> / <image_height>
atention: <x> <y> - are center of rectangle (are not top-left corner)
For example for img1.jpg you will be created img1.txt containing:
- 여기서 X, Y는 이미지의 start point가 아니라, 전체 이미지의 center 값입니다. 내용을 이해하기 어려운데 git source의 script/voc_lable.py의 convert() 함수에 다음 내용이 있습니다.
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
x = x*dw
w = w*dw
여기서 box[0], box[1]은 xmin, xmax로, box[2], box[3]은 ymin, ymax로 이해하면 되며, 이를 수식으로 표시하면 다음과 같습니다.