오브젝트 인식... 까지 할껀 아니였는데!
어쩌다보니 이까지 오게 되었네요..ㅎ
그래도 Yolo모델은 간단하게 학습하고 실행하는게 가능하기에 진행해 보았습니다.
사실 라벨링된 이미지만 있으면 금방 학습이 되는거 같더라구요...?
(학습은 되는데... 제가 수집한 데이터가 별론가봐요..)
그래도 점차 나아지고 있는거 같으니,
지금까지 진행한 내용만 정리해보려고 합니다.
그럼 시작!
일단 Yolo!
아래는 yolo모델들에 대한 공식사이트!
Models Supported by Ultralytics
Discover a variety of models supported by Ultralytics, including YOLOv3 to YOLOv10, NAS, SAM, and RT-DETR for detection, segmentation, and more.
docs.ultralytics.com
v3부터 11...12 버전이 되게 많네요...
그래프를 보니.. 어떤식으로 발전해 나가고 있는지 알것 같습니다!
저는 저 많은 모델중 V11을 사용해보기로 하였습니다.
V11에도 종류가 ㄷㄷ
일단 모델들은
Detection - 일반 인식
Instance Segmentation - 세그멘테이션
Pose - 포즈 및 키포인트 관련
Oriented Detection - 방향성 객체 인식
Classification - 객체 분류
으로 사용할 수 있는 모델들이 따로 준비되어있습니다.
저는 이중 일반 객체인식 모델인 Yolo11 선택....
그다음은 n,s,m,l,x....? 이건 모델의 속도 및 크기에 따라 다른....!
저는 서버컴을 믿고 Yolo11x 버전으로 사용하기로...!
데이터 준비준비!
이제 모델 탐색을 끝냈으니... 학습할 데이터에 대해서 알아봅시다..
Yolo 모델을 학습시키기위해서는 아래처럼 2가지의 데이터가 필요한데,
학습할 이미지와 그 이미지 속에서 인식하고자하는 오브젝트에 대해서 라벨링된 정보값이 필요합니다.
이런 데이터를 준비하는과정은
1. coco데이터셋이나 다른사람이 준비한 데이터셋을 사용한다...
2. 열심히 라벨링을 한다....
1번의 경우 coco데이터셋을 yolo형식으로 변경해서 사용하기만 하면 되지만,
내가 원하는 데이터가 있을지가.....
2번의 경우에는
Labelme나 다양한 라벨링 툴을 이용해서 열심히 오브젝트에 대해서 라벨링을 진행하면... 되는데...
이미지 인식 라벨링을 위한 Labelme Tool 사용 및 수정(1)
특정 이미지에 대해서 학습을 시키기 위해선 모델도 중요하지만 정확히 라벨링 된 이미지파일들도 매우 중요하기에 직접 제작 해보려 했으나 구현해야할 기능들이 너무 많아.... 포기.. 그래서
ljhyunstory.tistory.com
손으로 데이터 수만장을 하기에는.... 쉽지 않지만..... 해야되는...
(Yolo학습시키는 것보다 힘든...)
하지만 전 단순하게 흰 배경에서 특정 이미지를 뽑아내는게 필요해서...
저는 라벨링 없이 데이터를 생성해주겠습니다.
(생성하는 과정은 흰 배경에 제가 인식할 이미지에 대해서 붙여넣는 과정이라서 생략하겠습니다.)
생성한 이미지와 실제 이미지....
차이가 거의 없는것 같... 굳굳
진짜 학습 시작
그럼 이제 학습에 대해서 진행! 하기 전에...
학습데이터를 분할하는 과정이 필요합니다.
학습코드에서 데이터를 받으면서 분할해도 상관은 없지만!
저는 따로 디렉토리를 구성하기위해 아래와 같은 분할코드를 따로 작성하였습니다!
import os
import random
import shutil
from glob import glob
dataset_path = os.path.dirname(os.path.realpath(__file__))
IMAGE_DIR = os.path.join(dataset_path, "synthetic_dataset/images")
LABEL_DIR = os.path.join(dataset_path, "synthetic_dataset/labels")
TRAIN_IMG_DIR = os.path.join(dataset_path, "Addtrain/images")
TRAIN_LABEL_DIR = os.path.join(dataset_path, "Addtrain/labels")
VAL_IMG_DIR = os.path.join(dataset_path, "Addval/images")
VAL_LABEL_DIR = os.path.join(dataset_path, "Addval/labels")
# 폴더 생성
os.makedirs(TRAIN_IMG_DIR, exist_ok=True)
os.makedirs(TRAIN_LABEL_DIR, exist_ok=True)
os.makedirs(VAL_IMG_DIR, exist_ok=True)
os.makedirs(VAL_LABEL_DIR, exist_ok=True)
image_files = glob(os.path.join(IMAGE_DIR, "*.jpg"))
random.shuffle(image_files)
split_ratio = 0.8
split_index = int(len(image_files) * split_ratio)
train_files = image_files[:split_index]
val_files = image_files[split_index:]
def move_files(file_list, dest_img_dir, dest_label_dir):
for img_path in file_list:
filename = os.path.basename(img_path) # 파일명 추출 (ex: synthetic_1.jpg)
label_path = os.path.join(LABEL_DIR, filename.replace(".jpg", ".txt")) # 라벨 파일명 변환
# 이미지 이동
shutil.move(img_path, os.path.join(dest_img_dir, filename))
# 라벨 파일이 존재하면 이동
if os.path.exists(label_path):
shutil.move(label_path, os.path.join(dest_label_dir, filename.replace(".jpg", ".txt")))
move_files(train_files, TRAIN_IMG_DIR, TRAIN_LABEL_DIR)
move_files(val_files, VAL_IMG_DIR, VAL_LABEL_DIR)
분할된 데이터를 가지고, 진짜 학습 시작,
각 라이브러리들을 import하고 학습과정의 랜덤성을 seed를 통해 잡아주었습니다.
import os
import shutil
import yaml
import cv2
import numpy as np
import matplotlib.pyplot as plt
from ultralytics import YOLO
import random
random.seed(821)
np.random.seed(821)
dataset_path = os.path.dirname(os.path.realpath(__file__))
train_path = f"{dataset_path}/train"
val_path = f"{dataset_path}/val"
그리고 데이터경로에 대해서 받아와 주었습니다.
다음은 학습을 위한 데이터 yaml파일을 작성해야하는데,
모델의 학습 정보를 정리한 파일이라고 생각하시면 될 것 같습니다.
해당 데이터의 클래스와 데이터 위치, 그리고 이름,경로 등등을 포함하고 있습니다.
data_yaml = {
"path": dataset_path,
"train": "train/images",
"val": "val/images",
"nc": 11, # 클래스 개수
"names": ["Apple", "BlueBerry", "GreenApple", "Kiwi", "Lemon", "Melon", "Orange", "Peach", "Pear", "Punica", "Watermelon"]
}
with open(f"{dataset_path}/data.yaml", "w") as f:
yaml.dump(data_yaml, f)
그리고 학습 시작!
if __name__ == "__main__":
model = YOLO("yolo11x.pt")
results = model.train(
data=f"{dataset_path}/data.yaml",
epochs=100,
imgsz=640,
batch=8,
workers=2,
device=0,
project=f"{dataset_path}/runs",
name="my_custom",
save=True, # 학습 결과 저장 여부
lr0=0.01, # 초기 Learning Rate 설정
patience=10, # Early Stopping 적용 (10 epoch 동안 개선 없으면 종료)
optimizer="AdamW", # AdamW 최적화 적용 (기본값: SGD)
verbose=True # 학습 진행 로그 출력
)
metrics = model.val()
이전에 사이트에서 확인했던 모델을 따로다운받아도 되지만, YOLO() 함수를 통해 실행시키면 자동으로 다운받아집니다.
그리고 model.train에 대한 다양한 옵션을 적용시키며 학습을 진행할 수 있습니다.
yolo 초기 세팅로그
(다운 받아지는 과정에서 Yolo11n.pt가 같이 다운 받아지는 이유는 검증용으로 사용하기 위해...라고 합니다 )
그리고 학습 진행로그...
이제 epoch가 끝날때까지... 대기
학습 끝! 오브젝트 인식 확인!
학습이 끝났다면! 이제 학습된 모델에 대해서 사용해봐야겠죠
저는 저장경로를 아래와 같이 설정해놓았습니다.
....
project=f"{dataset_path}/runs",
name="my_custom",
....
그 경로 찾아가면! 파일이 왤케많아;
results.csv파일을 통해 모델의 학습과정을 확인할 수 있고,
각 그래프......(이건 잘 모르겠습니다...)
가장 중요한건 weights 폴더 내부에 있는 학습된 모델들!
해당 모델들을 테스트하는과정도... 그냥 model.predict() 함수를 통해 끝..
# Step 1: 필요한 라이브러리 설치 및 불러오기
import os
import shutil
import yaml
import cv2
import numpy as np
import matplotlib.pyplot as plt
from ultralytics import YOLO
file_path = os.path.dirname(os.path.realpath(__file__))
yoloPath = os.path.join(file_path, "runs/detect/fine_tuned4/weights/best.pt")
save_path = os.path.join(file_path, "runs/detect")
testSet_path ="~~~~~" # 테스트할 이미지 파일 경로
os.makedirs(save_path, exist_ok=True)
model = YOLO(yoloPath) # YOLO모델 사용
results = model.predict(source=testSet_path, save=True, conf=0.5,
project=save_path,
name="Test"
)
데이터가 부실한지....
완벽하게 인식은 되지 않지만...
그래도 어느정도 학습된 결과를 뽑아본거 같습니다...
약간 작성하다보니 글이 부실한거 같긴한데...
더 공부해서 내용을 추가하든, 글을 새로작성하든! 돌아오겠습니다.
틀린점이 있다면 댓 달아주세요!

'공부공부 > 2025 쌓아가는 나의 지식~' 카테고리의 다른 글
[OpenCV / Python] 이미지 유사도(Image Similarity) 측정 [Pixel, Structural, Histogram] (0) | 2025.03.19 |
---|---|
Yolo모델을 이용한 오브젝트 분류(Object Classification) - 학습 및 실행 (1) | 2025.03.07 |
[Linux] TensorFlow GPU 문제 (Skipping registering Gpu devices)/ (Cuda 다운그레이드 + Cudnn 설치) (0) | 2025.02.27 |
[Ubuntu] 서버 컴 포맷 및 우분투 재설치(Fin...?) (1) | 2025.02.26 |
[Ubuntu] 서버 컴 포맷 및 우분투 재설치(1) - 부팅 USB 만들기 (0) | 2025.02.14 |
댓글