YOLO 使用方式与典型场景
四、使用方式与典型场景
示例一:命令行训练
yolo detect train \
data=datasets/defect/data.yaml \
model=yolov8n.pt \
imgsz=640 \
epochs=100 \
batch=16 \
lr0=0.01 \
patience=20 \
device=0 \
project=runs/defect \
name=exp01
训练过程中重点看验证集的损失是否还在下降、以及各类别的精度是否均衡。总精度看着不错但某个类别几乎检不出来,通常是那一类的样本太少,要做针对性补采而不是继续加轮数。
示例二:Python 推理与结果解析
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.predict(
source="test_images",
imgsz=640,
conf=0.25,
iou=0.45,
max_det=100,
device=0,
save=True,
)
for r in results:
boxes = r.boxes
for i in range(len(boxes)):
cls_name = model.names[int(boxes.cls[i])]
score = float(boxes.conf[i])
x1, y1, x2, y2 = boxes.xyxy[i].tolist()
print(f"{cls_name} {score:.3f} [{x1:.1f},{y1:.1f},{x2:.1f},{y2:.1f}]")
注意 boxes.xyxy 返回的是原图坐标,而 boxes.xywhn 之类的归一化坐标是相对输入尺寸的。做像素级测量(例如缺陷长度)时一定要用原图坐标,并在推理前把缩放关系记下来。
示例三:导出加速格式
yolo export model=yolov8n.pt format=onnx imgsz=640 opset=12 simplify=True
yolo export model=yolov8n.pt format=engine imgsz=640 half=True device=0
导出后务必做一次一致性对比:用同一批图分别跑原始权重与导出模型,比较框的数量与位置。如果差异明显,多半是预处理、色彩空间(RGB 与 BGR)或者输入尺寸没对齐。
示例四:部署成 ROS2 节点
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from ultralytics import YOLO
class Detector(Node):
def __init__(self):
super().__init__("yolo_detector")
self.model = YOLO("yolov8n.engine")
self.bridge = CvBridge()
self.sub = self.create_subscription(
Image, "/camera/image_raw", self.on_image, 10)
def on_image(self, msg):
frame = self.bridge.imgmsg_to_cv2(msg, desired_encoding="bgr8")
results = self.model.predict(frame, imgsz=640, conf=0.25,
verbose=False, device=0)
for r in results:
for box in r.boxes:
name = self.model.names[int(box.cls)]
score = float(box.conf)
xyxy = [round(v, 1) for v in box.xyxy[0].tolist()]
self.get_logger().info(f"{name} {score:.2f} {xyxy}")
def main():
rclpy.init()
node = Detector()
try:
rclpy.spin(node)
finally:
node.destroy_node()
rclpy.shutdown()
图像订阅建议用传感器数据 QoS;如果相机发布的是压缩图像,要先解压再送推理。推理耗时较长时不要在主回调里做重活,把推理放到独立线程并只保留最新一帧,避免消息越积越多导致延迟持续增长。
适合与不适合
- 适合:实时目标检测与计数、缺陷的定位与分类、需要部署到边缘设备的视觉任务、标注数据相对充足的场景。
- 不适合:需要像素级轮廓的缺陷(用分割网络更合适)、目标极小而密集的场景(需要专门的小目标方案或切图推理)、样本极少且无法补充的场景(先用传统视觉或异常检测方法更划算)。

