반응형

YOLOs-CPP를 빌드하고 간단한 예제를 만들어 보자.

 

2026.02.15 - [AI, ML, DL] - [YOLO] YOLOs-CPP build 빌드하기

 

CPU 사용 예.

#include "yolos/yolos.hpp"

int main() {
	// Initialize Use CPU
	yolos::det::YOLODetector detector("yolo11n.onnx", "coco.names", false);
	
	// Detect
	cv::Mat frame = cv::imread("catsdogs.png");
	std::vector<yolos::Detection> detections = detector.detect(frame, 0.25f, 0.45f);

	// Process results
	for (const yolos::det::Detection& det : detections) {
		std::cout << "Class: " << det.classId << " Conf: " << det.conf << std::endl;
		std::cout << "Box: (" << det.box.width << ", " << det.box.height << ")" << std::endl;
	}

	// Visualize
	detector.drawDetections(frame, detections);

	// Show
	cv::imshow("frame", frame);
	cv::waitKey(0);
		
	return 0;
}

 

OpenCV가 Debug 모드로 빌드되어 불필요한 경고가 많다.

 

 

GPU 사용 예.

#include "yolos/yolos.hpp"

int main() {
	// Initialize Use GPU
	yolos::det::YOLODetector detector("yolo11n.onnx", "coco.names", true);
	
	// Detect
	cv::Mat frame = cv::imread("catsdogs.png");
	std::vector<yolos::Detection> detections = detector.detect(frame, 0.25f, 0.45f);

	// Process results
	for (const yolos::det::Detection& det : detections) {
		std::cout << "Class: " << det.classId << " Conf: " << det.conf << std::endl;
		std::cout << "Box: (" << det.box.width << ", " << det.box.height << ")" << std::endl;
	}

	// Visualize
	detector.drawDetections(frame, detections);

	// Show
	cv::imshow("frame", frame);
	cv::waitKey(0);
		
	return 0;
}

 

 

 

  • Performance Tips
    Reuse detector instances — Create once, infer many times
    Use GPU when available — 5-10x faster than CPU
    Adjust thresholds — Higher confidence = fewer detections, faster NMS
    Match input resolution — Use model's expected size (640x640)

 

※ 참고

Usage Guide

 

반응형
Posted by J-sean
:

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

YOLO에서 CPU를 사용 중인지 GPU를 사용 중인지 확인해 보자.

 

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
print(f"Model is running on device: {next(model.model.parameters()).device}")

results = model.predict("bus.jpg", save=False, imgsz=320, conf=0.25)
#results = model.predict("bus.jpg", save=False, imgsz=320, conf=0.25, device='cpu')

print(f"Model is running on device: {next(model.model.parameters()).device}")

#results[0].show()

 

 

처음 모델을 로드하면 CPU를 사용한다. 하지만 예측 작업을 시작하면 자동으로 GPU(cuda)를 사용한다. (GPU 사용이 불가능한 경우 CPU를 사용한다)

 

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
print(f"Model is running on device: {next(model.model.parameters()).device}")

#results = model.predict("bus.jpg", save=False, imgsz=320, conf=0.25)
results = model.predict("bus.jpg", save=False, imgsz=320, conf=0.25, device='cpu')

print(f"Model is running on device: {next(model.model.parameters()).device}")

#results[0].show()

 

 

예측 작업 시 device='cpu' 옵션을 추가하면 CPU를 사용한다.

 

※ 참고

Usage Example

 

반응형
Posted by J-sean
:
반응형

SAM3를 사용해 보자.

다른 모델과 달리 SAM3 가중치(sam3.pt)는 자동으로 다운로드되지 않는다.

Hugging Face에 가입하고 접근 허가를 받아야 다운로드할 수 있다.

 

from ultralytics.models.sam import SAM3SemanticPredictor

# Initialize predictor with configuration
overrides = dict(
    conf=0.25,
    task="segment",
    mode="predict",
    model="sam3.pt",
    half=True,  # Use FP16 for faster inference
    save=False
)
predictor = SAM3SemanticPredictor(overrides=overrides)

# Set image once for multiple queries
predictor.set_image("rose.png")

# Works with descriptive phrases
results = predictor(text=["red rose", "pink rose"])
results[0].show()

 

빨간 장미와 분홍 장미를 구분한다.

 

rose.png

 

꽤 잘 구분한 것 같다.

 

overrides = dict(
    conf=0.25,
    task="segment",
    mode="predict",
    model="sam3.pt",
    half=True,  # Use FP16 for faster inference
    save=False,
    device='cpu' #device='cuda'
)

 

device 옵션으로 CPU, GPU를 선택할 수 있다. device 옵션을 주지 않으면 GPU가 사용 가능할 경우 GPU를 사용하고 아니면 CPU를 사용한다.

 

CPU 사용. 36093.2ms

 

GPU 사용. 339.3ms

 

 

from ultralytics.models.sam import SAM3SemanticPredictor

# Initialize predictor with configuration
overrides = dict(
    conf=0.25,
    task="segment",
    mode="predict",
    model="sam3.pt",
    half=True,  # Use FP16 for faster inference
    save=False
)
predictor = SAM3SemanticPredictor(overrides=overrides)

# Set image once for multiple queries
predictor.set_image("office.jpg")

# Works with descriptive phrases
results = predictor(text=["person with gray shirt"])
results[0].show()

 

회색 옷을 입은 사람을 찾는다.

 

office.jpg

 

회색 옷을 입은 사람을 정확히 찾아냈다.

 

from ultralytics.models.sam import SAM3SemanticPredictor

# Initialize predictor with configuration
overrides = dict(
    conf=0.25,
    task="segment",
    mode="predict",
    model="sam3.pt",
    half=True,  # Use FP16 for faster inference
    save=False
)
predictor = SAM3SemanticPredictor(overrides=overrides)

# Set image once for multiple queries
predictor.set_image("catsdogs.png")

# Works with descriptive phrases
results = predictor(text=["cats", "dogs"])
results[0].show()

 

개와 고양이를 구분한다.

 

catsdogs.png

 

개와 고양이를 정확히 구분한다.

 

 

from ultralytics.models.sam import SAM3SemanticPredictor

# Initialize predictor with configuration
overrides = dict(
    conf=0.25,
    task="segment",
    mode="predict",
    model="sam3.pt",
    half=True,  # Use FP16 for faster inference
    save=False
)
predictor = SAM3SemanticPredictor(overrides=overrides)

# Set image once for multiple queries
predictor.set_image("sleep.jpg")

# Works with descriptive phrases
results = predictor(text=["sleeping student on desk"])
results[0].show()

 

책상에서 자는 학생을 찾는다.

 

sleep.jpg

 

실제 자는 학생의 확률이 0.90으로 가장 높지만 뒤에 자지 않는 학생의 확률도 0.86으로 굉장히 높다.

 

from ultralytics.models.sam import SAM3SemanticPredictor

# Initialize predictor with configuration
overrides = dict(
    conf=0.25,
    task="segment",
    mode="predict",
    model="sam3.pt",
    half=True,  # Use FP16 for faster inference
    save=False
)
predictor = SAM3SemanticPredictor(overrides=overrides)

# Set image once for multiple queries
predictor.set_image("sleep.jpg")

# Works with descriptive phrases
results = predictor(text=["student sleeping on desk"])
results[0].show()

 

descriptive phrase를 바꿔보자.

 

결과가 두 명으로 줄었지만 여전히 자지 않는 학생의 확률도 높다.

 

반응형
Posted by J-sean
:
반응형

YOLOE를 사용해 제로샷 프롬프트 객체 검출을 해 보자.

 

먼저 Git과 CLIP이 설치되어 있어야 한다.

Git 설치

CLIP 설치: pip install git+https://github.com/ultralytics/clip.git

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["cup", "chair", "book", "pen", "bottle"])
results = model.predict("office.jpg")

results[0].show()

 

office.jpg

 

 

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["traffic light", "car", "tree"])
results = model.predict("street.jpg")

results[0].show()

 

street.jpg

 

나무는 검출하지 못했다.

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["tree"])
results = model.predict("tree.jpg")

results[0].show()

 

tree.jpg

 

나무가 명확한 사진에서는 나무를 검출한다.

 

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["android"])
results = model.predict("android.jpg")

results[0].show()

 

android.jpg

 

아무것도 검출하지 못했다.

 

프롬프트를 android figure로 바꿔보자.

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["android figure"])
results = model.predict("android.jpg")

results[0].show()

 

빨간색 안드로이드만 검출했다.

 

프롬프트를 green android figure로 바꿔보자.

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["green android figure"])
results = model.predict("android.jpg")

results[0].show()

 

녹색 안드로이드만 검출된다.

 

프롬프트를 "red android figure", "green android figure"로 바꿔보자.

 

from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")
model.set_classes(["red android figure", "green android figure"])
results = model.predict("android.jpg")

results[0].show()

 

모두 검출했다.

 

 

OpenCV를 이용해 영상에서 원하는 객체를 검출해 보자.

 

import cv2
from ultralytics import YOLOE

model = YOLOE("yoloe-26n-seg.pt")
cap = cv2.VideoCapture("Cars_On_Highway.mp4")

while cap.isOpened():
	success, frame = cap.read()

	if success:
		model.set_classes(["car"])
		results = model.predict(frame, verbose=False)
		cv2.imshow("frame", results[0].plot())

		if cv2.waitKey(1) & 0xFF == ord("q"):
			break
	else:
		break

 

 

반응형
Posted by J-sean
:
반응형

객체 세그먼트 마스크를 표현하고 출력해 보자.

 

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model("bus.jpg")

for result in results:
	print(result[0].masks.xy) # tensor로 표현된 픽셀 좌표의 세그먼트 목록입니다.
	# 첫 번째 오브젝트의 마스크 픽셀 좌표 출력
	#print(result[0].masks.xyn) # tensor로 표현된 정규화된 세그먼트 목록입니다.

	result.show()

 

model()는 model.predict()와 같은 의미인 것 같다. 사용할 수 있는 인수는 아래 링크에서 확인하자.

Inference Arguments

 

원래 이미지

 

각 인스턴스의 세그먼트를 구분하는 마스크가 표현된다.

 

첫 번째(92%의 확률을 갖는) 사람의 마스크 픽셀 좌표.

 

반응형
Posted by J-sean
:
반응형

OpenCV와 함께 다수의 물체를 추적해 보자.

 

import cv2
from ultralytics import YOLO

# Load the YOLO26 model
model = YOLO("yolo26n.pt")

# Open the webcam
# cap = cv2.VideoCapture(0)
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# if cap.set(cv2.CAP_PROP_FPS, 30):
# 	print("FPS set")
# else:
# 	print("FPS setting failed")

cap = cv2.VideoCapture("Cars_On_Highway.mp4")

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLO26 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True, verbose=False)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        print(f"Number of objects: {len(results[0])}")
        #print(results[0].boxes.id) # (tensor) 바운딩 박스의 track ID를 반환합니다 (사용 가능한 경우).
        #print(results[0].names) # (dict) 클래스 인덱스를 클래스 이름에 매핑하는 사전입니다.
        #print(results[0].boxes.cls) # (tensor) bounding box의 클래스 값을 반환합니다.

        # ID와 각 물체의 클래스 출력
        for id, cls in zip(results[0].boxes.id, results[0].boxes.cls):
            print(f"ID: {id.int()} Class: {results[0].names[cls.int().item()]}", end=', ')
        print()

        # Display the annotated frame
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

 

웹캠을 사용하거나 원하는 영상을 준비하고 실행한다.

video1.avi
2.41MB
video2.avi
2.15MB

 

 

 

 

캡처하는 시간차 때문에 영상과 콘솔 화면의 출력이 일치하지는 않는다.

 

반응형
Posted by J-sean
:
반응형

학습 데이터를 준비하고 YOLO 모델을 트레이닝해 보자.

 

녹색 인형 Label: android 빨간색 인형 Label: android-red

 

android_figurine.zip
8.03MB

 

android_figurine.z01
19.53MB

 

 

학습할 안드로이드 인형 사진을 준비하고 Roboflow 에서 라벨링 및 데이터셋 준비 작업을 진행한다.

 

 

My First Project.v1-roboflow-instant-1--eval-.yolo26.zip
3.74MB

Roboflow에서 준비한 데이터셋

 

준비된 데이터셋을 프로젝트 폴더에 넣고 학습을 진행한다.

 

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model.train(data="data.yaml", epochs=100, imgsz=640)

 

yolo26n.pt 모델이 프로젝트에 없는 경우 자동으로 다운로드한다.

epochs를 10 정도로 하면 거의 학습이 되지 않는다. 진행은 되지만 검증 결과를 확인해 보면 아무것도 검출하지 못한다.

 

학습 100회 진행

 

학습이 완료되었으면 run 폴더에서 검증 결과를 확인해 보자.

 

검증 결과

 

from ultralytics import YOLO

model = YOLO("best.pt")
results = model("IMG_1.jpg")

for result in results:
    boxes = result.boxes  # Boxes object for bounding box outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs
    obb = result.obb  # Oriented boxes object for OBB outputs
    result.show()  # display to screen
    result.save(filename="result.jpg")  # save to disk

 

학습 결과로 생성된 'best.pt' 모델을 이용하여 IMG_1.jpg 파일을 테스트해 보자.

 

 

 

정확하게 android와 android-red를 검출했다.

 

반응형

'AI, ML, DL' 카테고리의 다른 글

[YOLO] Instance Segmentation 객체 분할  (0) 2026.02.10
[YOLO] Multi-Object Tracking 물체 추적  (0) 2026.02.10
[YOLO] with OpenCV  (0) 2026.02.08
[YOLO] YOLO models to ONNX 파일 변환  (0) 2026.02.08
[YOLO] Pose Estimation 포즈 추정  (0) 2026.02.07
Posted by J-sean
: