클래스번호 x y 너비 높이
0 0.3 0.4 0.3 0.3
1 0.3 0.4 0.3 0.3
2 0.3 0.4 0.3 0.3
3 0.3 0.4 0.3 0.3
클래스 번호는 특정 이미지안에 무슨 객체인지에 대한 가르키는 숫자적 정보를 의미합니다. 만약 본인이 학습할 객체가 총 합쳐서 "물고기, 육고기" 2개라면 클래스 번호는 총 2개가 되며, 0, 1을 의미할 수 있습니다. 0이 물고기인지 1이 물고기인지에 대해서, 그러한 이미지 위치를 가르키는 명시 작업을 해줘야하는데 이는 yml에서 수행할 수 있습니다.
train: train/images
val: val/images
test: test/images
nc: 2
names: ['fish','animals']
data.yml 에서는 train 의 images 위치, val 의 images 위치, test의 images 위치를 지정 해 줍니다. 한편 nc는 클래스의 개수를, names에는 각 클래스의 이름들을 배열로 정의 합니다.
결과적으로 학습 데이터 구조는 다음과 같은 형태로 구성됩니다.
python train.py --data "data.yml 위치" --weights yolov5s.pt --epochs 10 --batch-size 2 --img-size 128
위 명렁어는 data.yml 의 데이터를 기본 모델 yolov5s 모델 위에 학습을 수행함을 의미합니다. 각 이미지를 배치사이즈 2만큼씩, 에폭은 10번 수행하는 명령어입니다. 이렇게 학습을 하면 learning rate 및 각종 하이퍼 파라메터는 기본 값으로 수행합니다. 하이퍼 파라메터 자료는 yolov5 의 기본 디렉터리의 data 폴더 내 hyps 폴더에 여러 샘플들이 존재하는데, 내부 값들을 수정하고 학습할 때 아래와 같은 인자를 추가함으로써 특정 하이퍼파라메터를 적용할 수 있습니다.
hyp.yml 예시
...
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.9 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.1 # image mixup (probability)
...
python train.py --data "data.yml 위치" --weights yolov5s.pt --epochs 10 --batch-size 2 --img-size 128 --hyp "hyp.yml 위치"
학습을 수행하면, yolov5 디렉터리의 runs 내 train 디렉터리 내에 exp<번호> 순으로 기록되고, 학습된 가중치는 내부 디렉터리의 last.pt 및 best.pt 로 저장됩니다. best.pt는 제일 성능 점수가 높았던 가중치, last.pt는 마지막 에폭의 가중치를 의미합니다. 이 가중치는 나중에 predict 할 때 사용할 수 있습니다. 현재 학습된 정도를 시각적으로 확인하려면 해당 디렉터리 안에 PR 곡선 파일 자료들을 확인하면 됩니다.
결과 추론 (코드)
이렇게 만들어진 가중치 .pt 를 활용해서 특정 이미지의 객체 탐지를 수행할 수 있습니다.
먼저 torch를 로드하고, yolov5 메인 디렉터리가 존재하는 위치와 .pt 경로가 존재하는 위치를 지정하여 모델을 로드합니다.
import torch
model = torch.hub.load("./yolov5-master", "custom", "./best.pt", source='local' )
model.conf = 0.5
result = model(
["이미지1.png",
"이미지2.png"])
그리고 모델 결과에 추론될 최소 confidence 값을 지정 해주고, 특정 이미지를 배열로 넣어 추론을 수행하고, 그 결과를 확인 합니다.
result.pandas().xywh[0]
0번째 이미지에 대한 결과
result.pandas().xywh[1]
1번째 이미지에 대한 결과