본문 바로가기

카테고리 없음

Training YOLO with custom dataset by fiftyone

Labelme로 만들어낸 커스텀 데이터셋을 이용해서 이제 yolo를 트레이닝 시킬 차례다.

 

이 과정에 fiftyone 이라는 툴을 사용해볼 예정

 

자 그럼 시작해보자

 

지난 포스팅에서 fiftyone 상에 COCO 포맷으로 뽑아둔 데이터셋이 잘 올라가는 것까지 확인을 했다.

 

이제 이걸 yolo 학습용 데이터셋으로 변경해야한다. 

 

일단 이미지 수가 매우 적긴 하지만, 작동이 되는지 확인을 하기 위한 용도로 진행해보면, 

 

import fiftyone as fo
import fiftyone.utils.random as four

def export_yolo_data(
    samples,
    export_dir,
    classes,
    label_field = "detections",
    split = None
    ):

    if type(split) == list:
        splits = split
        for split in splits:
            export_yolo_data(
                samples,
                export_dir,
                classes,
                label_field,
                split
            )
    else:
        if split is None:
            split_view = samples
            split = "val"
        else:
            split_view = samples.match_tags(split)

        split_view.export(
            export_dir=export_dir,
            dataset_type=fo.types.YOLOv5Dataset,
            label_field=label_field,
            classes=classes,
            split=split
        )

# The directory containing the source images
data_path = "data_dataset_coco_weldHelmet"

# The path to the COCO labels JSON file
labels_path = "data_dataset_coco_weldHelmet/annotations.json"

# Import the dataset
dataset = fo.Dataset.from_dir(
    dataset_type=fo.types.COCODetectionDataset,
    data_path=data_path,
    labels_path=labels_path,
)

dataset.untag_samples(dataset.distinct("tags"))

classes=["WeldHelmet"]

## split into train and val
four.random_split(
    dataset,
    {"train": 0.8, "val": 0.2}
)

## export in YOLO format
export_yolo_data(
    dataset,
    "WeldHelmet_train",
    classes,
    split = ["train", "val"]
)

8번쨰 줄을 ground_truth에서 detections로 수정했다.

 

이걸 하고 나면

yolo 포맷으로 뽑아둔 폴더가 생기고

안에 들어가보면

트레인 데이터와 벨리데이션 데이터로 구분되어 저장된 것을 볼 수 있다.

 

이제 yolo를 학습해보자.

 

yolo task=detect mode=train model=yolov8n.pt data=WeldHelmet_train/dataset.yaml epochs=60 imgsz=640 batch=16 device=0

 

학습은 금방 끝났고 결과는 다음과 같았다.

이제 이걸 평가해보자.

 

yolo task=detect mode=predict model=runs/detect/train6/weights/best.pt source=WeldHelmet_train/images/val save_txt=True save_conf=True device=0

 

해봤는데..

이렇게 나온다.

 

실패다.

 

학습데이터를 늘여본다. 500개의 학습데이터를 만들었다.

 

열심히 학습 후 prediction을 해보니

잘 탐지가 되는 것 처럼 보인다.

 

실제로 그러한가?

 

탐지가 된걸 탐색기로도 확인할 수 있다.

 

 

fiftyone에서도 확인해보자. 평가를 하려면 gt_field가 뭔지 알려줘야 하는데, 아래 처럼 알려주면 된다.

base_helmet_results = dataset.evaluate_detections(
    "yolov8n_helmet",
    eval_key="base",
    gt_field="detections",
    compute_mAP=True,
)

 

그리고 prediction 파일을 제대로 못읽어오는 이슈가 있어서, 

filename = filename.replace("C:\\Users\\YbKim\\fiftyone\\coco-2017\\validation\\data\\","")
    filename = filename.replace("E:\\ExternalTools\\YOLOv8\\data_dataset_coco_weldHelmet_Full\\JPEGImages\\","")

요 코드도 추가해줬다.

 

그 결과는?

정확도가 상당히 높게 나왔다. 

 

fiftyone에서도 확인해본다.

 

잘 나오긴 하는데, 우상단 그림처럼, 실제로 있는 객체를 탐지 못하는 경우도 있었다. 아마 precision이외의 다른 파라미터가 이를 표현하고 있을건데 이에 대해서는 공부를 더 해봐야겠다.

 

이상으로 커스텀 데이터를 이용한 yolo 학습 포스팅을 마친다.