Instance Segmentation with Ultralytics YOLO
Instance segmentation goes a step further than object detection and involves identifying individual objects in an image and segmenting them from the rest of the image.
The output of an instance segmentation model is a set of masks or contours that outline each object in the image, along with class labels and confidence scores for each object. Instance segmentation is useful when you need to know not only where objects are in an image, but also what their exact shape is.
Watch: Run Segmentation with Pretrained Ultralytics YOLO Model in Python.
YOLO26 Segment models use the -seg suffix, e.g., yolo26n-seg.pt, and are pretrained on COCO.
Models#
YOLO26 Segment models pretrained on the COCO dataset are shown below.
Models download automatically from the latest Ultralytics release on first use.
| Model | size (pixels) | mAPbox50-95 (e2e) | mAPmask50-95 (e2e) | Speed CPU ONNX (ms) | Speed T4 TensorRT10 (ms) | params (M) | FLOPs (B) |
|---|---|---|---|---|---|---|---|
| YOLO26n-seg | 640 | 39.6 | 33.9 | 53.3 ± 0.5 | 2.1 ± 0.0 | 2.7 | 9.3 |
| YOLO26s-seg | 640 | 47.3 | 40.0 | 118.4 ± 0.9 | 3.3 ± 0.0 | 10.4 | 34.5 |
| YOLO26m-seg | 640 | 52.5 | 44.1 | 328.2 ± 2.4 | 6.7 ± 0.1 | 23.6 | 121.7 |
| YOLO26l-seg | 640 | 54.4 | 45.5 | 387.0 ± 3.7 | 8.0 ± 0.1 | 28.0 | 140.1 |
| YOLO26x-seg | 640 | 56.5 | 47.0 | 787.0 ± 6.8 | 16.4 ± 0.1 | 62.8 | 314.0 |
- mAPval values are for single-model single-scale on COCO val2017 dataset.
Reproduce withyolo segment val data=coco.yaml device=0 nms=False - Speed averaged over COCO val images with ONNX on CPU and TensorRT10 on an NVIDIA T4 GPU.
Reproduce withyolo segment val data=coco.yaml batch=1 device=0|cpu nms=False - Params and FLOPs values are for fused models after Conv/BatchNorm folding and removal of the unused detection branch. Pretrained checkpoints retain the full training architecture and may show higher counts.
These checkpoints segment the 80 COCO classes. To segment categories outside that list without retraining, see YOLOE, which takes the classes as a text prompt, a visual example, or a built-in vocabulary.
See the unreleased YOLO27 preview for preliminary COCO box and mask results.
Train#
Train a YOLO26n-seg model on the COCO8-seg dataset for 100 epochs at image size 640.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-seg.yaml") # build a new model from YAML
model = YOLO("yolo26n-seg.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-seg.yaml").load("yolo26n-seg.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="coco8-seg.yaml", epochs=100, imgsz=640)See full train mode details in the Train page. Segmentation models can also be trained with Ultralytics Platform cloud training.
Dataset format#
YOLO segmentation dataset format can be found in detail in the Dataset Guide. To convert an existing COCO JSON dataset to YOLO format, use the built-in convert_coco function with use_segments=True, as described in the COCO to YOLO guide. You can also create segmentation masks with Ultralytics Platform annotation using polygon tools and SAM-powered smart annotation.
Val#
Validate trained YOLO26n-seg model accuracy, measured as box and mask mean average precision (mAP). No arguments are needed, as the model retains its training data and arguments as model attributes: path/to/best.pt from the Train example validates on COCO8-seg. Official weights record a training dataset path that doesn't exist on your machine, so they fall back to the task default coco8-seg.yaml with a warning. Pass data to validate on another dataset.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-seg.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val() # no arguments needed, dataset and settings remembered
metrics.box.map # map50-95(B)
metrics.box.map50 # map50(B)
metrics.box.map75 # map75(B)
metrics.box.maps # mAP50-95(B) per class; classes absent from the val set hold the overall mAP(B)
metrics.box.ap_class_index # class indices that were actually evaluated
metrics.box.image_metrics # per-image metrics dictionary for det with precision, recall, F1, TP, FP, and FN
metrics.seg.map # map50-95(M)
metrics.seg.map50 # map50(M)
metrics.seg.map75 # map75(M)
metrics.seg.maps # mAP50-95(M) per class; classes absent from the val set hold the overall mAP(M)
metrics.seg.ap_class_index # class indices that were actually evaluated
metrics.seg.image_metrics # per-image metrics dictionary for seg with precision, recall, F1, TP, FP, and FNPredict#
Use a trained YOLO26n-seg model to run predictions on images.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-seg.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
# Access the results
for result in results:
xy = result.masks.xy # mask polygons in pixel coordinates
xyn = result.masks.xyn # normalized mask polygons
masks = result.masks.data # binary masks, shape (N,H,W), dtype torch.uint8See full predict mode details in the Predict page.
Results Output#
YOLO instance segmentation returns one Results object per image. Each result stores object-level predictions, where
each detected instance has its own binary mask, class, confidence, and box.
| Attribute | Type | Shape | Description |
|---|---|---|---|
result.masks | Masks | (N) | Instance masks. |
result.masks.data | torch.uint8 | (N,H,W) | Binary masks, values 0 or 1. |
result.masks.xy | np.float32 | list[(P,2)] | Pixel polygons. |
result.masks.xyn | np.float32 | list[(P,2)] | Normalized polygons. |
result.boxes | Boxes | (N) | Instance boxes/classes/confidences. |
result.boxes.cls | torch.float32 | (N,) | Class IDs; cast to int for names. |
For task-specific Results fields across every task, see the Predict Results by Task section.
Instance vs Semantic Segmentation#
Instance segmentation is object-level segmentation: two cars produce two masks, two boxes, and two confidence scores. Semantic segmentation is pixel-level classification: those same cars become pixels with the same class ID in one image-sized class map, with no per-object boxes, confidences, or default polygon list. See the field-by-field comparison on the semantic segmentation page.
Export#
Export a YOLO26n-seg model to a different format like ONNX, CoreML, etc.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-seg.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Export the model
model.export(format="onnx")Available YOLO26-seg export formats are in the table below. You can export to any format using the format argument, e.g., format='onnx' or format='engine'. You can predict or validate directly on exported models, e.g., yolo predict model=yolo26n-seg.onnx. Usage examples are shown for your model after export completes.
CoreML supports embedded NMS (nms=True) for detection, instance segmentation and pose with static shapes. Default segmentation exports (nms=None) leave NMS to the consumer.
| Format | format Argument | Model | Metadata | Arguments |
|---|---|---|---|---|
| PyTorch | - | yolo26n-seg.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-seg.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-seg.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-seg_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-seg.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-seg.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n-seg.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n-seg_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-seg.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-seg_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n-seg.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-seg_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-seg.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-seg_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo11n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-seg_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-seg_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-seg_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-seg_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-seg_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n-seg_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n-seg_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n-seg_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
| NXP | nxp | yolo26n-seg_nxp.tflite | ✅ | imgsz, quantize, data, fraction, device |
nms=None defaults to raw outputs for external NMS (YOLO26 keeps its NMS-free head on Axelera). Set nms=False to select an available NMS-free head; unsupported formats fall back to their native output path. The nms entries above identify formats that can embed NMS with nms=True.
See full export details in the Export page.
FAQ#
To train a YOLO26 segmentation model on a custom dataset, you first need to prepare your dataset in the YOLO segmentation format. You can use the built-in
convert_cocoutility to convert COCO JSON datasets. Once your dataset is ready, you can train the model using Python or CLI commands:Examplefrom ultralytics import YOLO # Load a pretrained YOLO26 segment model model = YOLO("yolo26n-seg.pt") # Train the model results = model.train(data="path/to/your_dataset.yaml", epochs=100, imgsz=640)Check the Configuration page for more available arguments.
Object detection identifies and localizes objects within an image by drawing bounding boxes around them, whereas instance segmentation not only identifies the bounding boxes but also delineates the exact shape of each object. YOLO26 instance segmentation models provide masks or contours that outline each detected object, which is particularly useful for tasks where knowing the precise shape of objects is important, such as medical imaging or autonomous driving.
Ultralytics YOLO26 combines high accuracy with real-time inference speed, which suits instance segmentation on video streams and edge devices. YOLO26 Segment models come pretrained on the COCO dataset, so they segment 80 common object classes out of the box and provide a strong starting point for fine-tuning on custom data. The same
YOLOAPI covers training, validation, prediction, and export for both research and industry applications.Loading and validating a pretrained YOLO segmentation model is straightforward. Here's how you can do it using both Python and CLI:
Examplefrom ultralytics import YOLO # Load a pretrained model model = YOLO("yolo26n-seg.pt") # Validate the model metrics = model.val() print("Mean Average Precision for boxes:", metrics.box.map) print("Mean Average Precision for masks:", metrics.seg.map)These steps will provide you with validation metrics like mean average precision (mAP), the standard measure of segmentation performance.
Exporting a YOLO segmentation model to ONNX format is simple and can be done using Python or CLI commands:
Examplefrom ultralytics import YOLO # Load a pretrained model model = YOLO("yolo26n-seg.pt") # Export the model to ONNX format model.export(format="onnx")For more details on exporting to various formats, refer to the Export page.
Comments418
Ask a question, share your results, or help someone else.
hp0716
Thank you for sharing the YOLOV11-seg model. I have encountered a problem now. When using YOLOV11 to segment my ID card, there are many uneven areas on the edges of the segmentation result, which affects my fitting of the card certificate boundary. How can I obtain smooth segmentation results? Do you have any parameters that can be directly configured?
1hp0716
Additionally, is there a method to fit the boundary of the ID card mask into four straight lines for locating the ID card?
Glenn JocherUltralytics@hp0716 for smoother segmentation results on ID cards, try using
retina_masks=Trueduring inference to get higher resolution masks:from ultralytics import YOLO model = YOLO('yolo11n-seg.pt') results = model(image, retina_masks=True)For post-processing to get smooth boundaries, you can apply morphological operations and contour approximation:
import cv2 import numpy as np # Get mask from results mask = results[0].masks.data[0].cpu().numpy() mask = (mask * 255).astype(np.uint8) # Apply morphological smoothing kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # Find contours and approximate to quadrilateral contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: largest_contour = max(contours, key=cv2.contourArea) epsilon = 0.02 * cv2.arcLength(largest_contour, True) approx = cv2.approxPolyDP(largest_contour, epsilon, True) # Force to 4 points for ID card corners if len(approx) >= 4: corners = approx[:4]This approach combines higher resolution masks with geometric fitting to achieve the straight-line boundaries you need for ID card localization.
1
cyberpunk-edgerunner
Just to confirm, while auto annotating, instead of using SAM one can also use one's custom build model. right ??
1rugvedjalit
Yes, you can annotate using custom build model but please check the annotation class id after annotation.
LwpZoe
I have used yolo11x-seg.yaml to do instance segmentation on my dataset, my dataset is multiclassified medical endoscopic tissue instance segmentation task, but the metrics scores are very low, I don't know how to improve these metrics scores, can you please give me some ideas?
1LwpZoe
The metrics score with ShuffleAttention added to the tenth layer of backbone is reduced compared to the metrics score for YOLO11x-seg.yaml alone.
Trained my dataset using YOLO11x-seg.yaml+ShuffleAttention with no other parameters changed the metrics scores are as follows:
Class Images Instances Box( P R mAP50 mAP50-95) Mask( P R mAP50 mAP50-95): all 58 332 0.583 0.504 0.519 0.238 0.551 0.456 0.468 0.195
Training my dataset using the official YOLO11x-seg.yaml alone, the metrics scores are as follows:
Class Images Instances Box( P R mAP50 mAP50-95) Mask( P R mAP50 mAP50-95): all 58 332 0.669 0.465 0.489 0.257 0.648 0.446 0.455 0.217
1
Glenn JocherUltralytics(edited)@LwpZoe thank you for sharing these details. For medical instance segmentation with YOLO11x-seg, we recommend: 1) Verify your dataset quality and annotation consistency using the Dataset Guide, 2) Try increasing input resolution (
imgsz=1280) to capture fine tissue details, 3) Implement medical-specific augmentations like CLAHE or elastic transforms, and 4) Consider using our pretrained weights with progressive fine-tuning rather than architectural modifications initially. The segmentation documentation contains additional optimization strategies for medical imaging tasks.
LwpZoe
Hello, here's a question: I want to use YOLO11 to train my dataset from scratch and make predictions, and don't want to use prepared pre-trained weights, so how do I write the training commands? Is this code below ok: yolo segment train data=datasets/yolo_seg/data.yaml model=yolo11n-seg.yaml epochs=300 batch=16 resume=True imgsz=640 device=0,1
1
Glenn JocherUltralytics@LwpZoe your command is almost correct for training from scratch without pretrained weights. Ensure the
resume=Trueargument is removed, as it is only used to resume interrupted training. The corrected command would be:yolo segment train data=datasets/yolo_seg/data.yaml model=yolo11n-seg.yaml epochs=300 batch=16 imgsz=640 device=0,1This will train your YOLO11 segmentation model from scratch using your custom dataset. For more details, visit the Segment Task Documentation.
potatoandtomatowhy
how to use two camera segment with gpu?
1ZhaoHaoran0613
Same question
1
Paula DerrengerUltralyticsTo use two cameras for segmentation with a GPU, you'll need to set up a multi-threaded or multi-process pipeline to handle the video streams concurrently. Each camera stream can be processed in a separate thread or process, ensuring efficient utilization of the GPU. You can use the
YOLOclass from the Ultralytics library to load your segmentation model and process the frames from each camera. For detailed steps and code examples, please refer to the Ultralytics segmentation documentation. If you encounter any issues, make sure you're using the latest version of the package.
Boaruzhanchik
Hi, can you tell me how I can get the detected car plates in separate windows (as many as I have detected and output), my code outputs only one window.
while True: ret, im0 = cap.read() if not ret: break results = model(im0,verbose=False,conf=0.4,retina_masks=True) boxes = results[0].boxes.xyxy.tolist() classes = results[0].boxes.cls.tolist() confidences = results[0].boxes.conf.tolist() masks = results[0].masks if results[0].masks is not None: clss = results[0].boxes.cls.cpu().tolist() masks = results[0].masks.xy coordinates_mask = masks[0] contour = coordinates_mask.reshape((-1, 1, 2)).astype(np.int32) epsilon = 0.04 * cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, epsilon, True) auto_transform = four_point_transform(im0, approx.reshape(-2, 2)) cv2.imshow('automated', auto_transform)1
Paula DerrengerUltralytics@Boaruzhanchik hey there! 👋 To display each detected car plate in separate windows, you can loop through the detected boxes and create a window for each. Here's a quick example to get you started:
for i, box in enumerate(boxes): x1, y1, x2, y2 = map(int, box[:4]) plate = im0[y1:y2, x1:x2] cv2.imshow(f'Plate {i}', plate) cv2.waitKey(0) cv2.destroyAllWindows()This code snippet extracts each detected plate based on its bounding box coordinates and displays it in a new window. Make sure to replace
im0with your frame variable if it's named differently. Hope this helps! 😊Boaruzhanchik
Thanks a lot for the help, I did it this way, it seems to work too
if results[0].masks is not None: clss = results[0].boxes.cls.cpu().tolist() masks = results[0].masks.xy if len(masks) == 1: coordinates_mask = masks[0] auto_transformations_first(coordinates_mask) elif len(masks) <= 2: auto_transformations_first(coordinates_mask) coordinates_mask_2 = masks[1] auto_transformations_second_screen(coordinates_mask_2) def auto_transformations_first(coordinates_mask): contour = coordinates_mask.reshape((-1, 1, 2)).astype(np.int32) epsilon = 0.04 * cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, epsilon, True) auto_transform = four_point_transform(im0, approx.reshape(-2, 2)) cv2.imshow('automated_first', auto_transform)
Paula DerrengerUltralytics@Boaruzhanchik hey there! 👋 It looks like you've found a way to handle different numbers of masks with your approach. Nicely done! 🎉 Just a quick tip: you might want to ensure
coordinates_maskis defined before using it inauto_transformations_first(coordinates_mask)for theelif len(masks) <= 2:case, to avoid any potential errors. Other than that, your method seems solid. Keep up the great work, and if you have any more questions or need further assistance, feel free to ask. Happy coding! 😊
uqasha524
Hi everyone,
We have fine-tuned a YOLO model primarily for segmentation, but our dataset contains mixed annotation types—the main task is segmentation, while some classes/regions use standard bounding boxes and OBB (Oriented Bounding Boxes).
What is the recommended approach in Ultralytics for handling a dataset with mixed annotation formats in a single training pipeline, and could you explain how this is possible? Specifically, how should the data labels and model configuration be structured to handle multiple task types simultaneously?
Any guidance, workflow explanations, or examples would be greatly appreciated!
Glenn JocherUltralyticsUltralytics training uses one task per model (
detect,segment, orobb), so mixed label formats cannot be trained jointly in a standard pipeline. Use separate label directories/YAML files and train separate models, or convert box/OBB annotations to polygon labels so every object follows the segmentation format; note that a segmentation model returns masks and axis-aligned boxes, not native OBB predictions.1rugvedjalit
Ultralytics YOLO does not support mixing detection, segmentation, and OBB annotations in a single training run. Each model/task expects a specific label format and corresponding loss function.
The recommended approach is to separate the annotations and train separate models for segmentation, detection, and OBB, then combine their outputs during inference if needed. A single multi-task model would require a custom architecture and training pipeline.
1
Glenn JocherUltralytics@uqasha524, do you need masks, axis-aligned boxes, and OBBs as distinct outputs at inference, or would segmentation outputs alone meet your requirements? That distinction will help us suggest the appropriate dataset structure without introducing unnecessary custom training work.
TrieuCris
With yolo26-seg, when a small object is placed on top of a large object, I get a result where the mask of the large object is punctured right where the small object is covering it. How can I fix this?
Glenn JocherUltralyticsThat’s usually expected with standard instance segmentation:
yolo26-seglearns the visible region of each instance, so the larger object can appear “punctured” where it is occluded; if you want a filled large-object mask, you’ll need labels that include the full occluded shape or apply post-processing tor.masksafter inference, and the segmentation object isolation guide shows where to access those masks—if you share one image plus its label here, the Ultralytics team can help confirm whether it’s annotation or model behavior.
miracle101000
hello if I wanted to use your segmentation model for inference on a live camera preview, to only detect a single item at a time, how would I go about it? thank you.
Glenn JocherUltralyticsYes — use a
-segmodel on your webcam feed, setclasses=[...]if you only want one class, andmax_det=1if you want at most one instance per frame; if you share your use case here, the Ultralytics team can help refine it, and the Segment task docs cover the mask outputs you’ll use.from ultralytics import YOLO model = YOLO("yolo26n-seg.pt") results = model.predict(source=0, stream=True, classes=[0], max_det=1)miracle101000
Ok thx. I am actually trying to implement edge detection on android devices for rectangular objects. I have tried OpenCV but it's not enough. So I was thinking to use a segmentation model for my rectangular processor (overlay would only show on rectangular objects) but any time I try to implement this on android, I get serious lagging issues on the camera preview. Plus honestly new to this AI stuff.
Glenn JocherUltralyticsIf you only need a rectangle-style overlay, a segmentation model is usually heavier than necessary on Android; I’d start with a small OBB or detect model instead, export it with Export mode, and keep
imgszlow or run inference every few frames to reduce preview lag. If you share your device, export format, and current FPS here, the Ultralytics team can suggest the lightest setup.
Heyujie96
你是不是加载模型的时候没有写task=“segment”
------------------ Original ------------------ From: liyongkang2000 @.> Date: Sun,Feb 1,2026 1:12 AM To: ultralytics/ultralytics @.> Cc: Heyujie96 @.>, Comment @.> Subject: Re: [ultralytics/ultralytics] zh/tasks/segment/ (Discussion #8508)
您好我想问一下,在YOLOV8和V11测试下来,由于目标框的存在,不管如果在后处理阶段调整目标框的范围,被分割目标的上下左右边界始终会被目标框切割,导致分割结果的边缘不平滑。会出现很多直线,但是在YOLOV26上没有尝试过,YOLOV26是否优化了这个边界问题,或者说是否其他的解决方法可以解决这个分割结果的边缘不平滑问题
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>
liyongkang2000
result = model.predict(os.path.join(path,file), nms = True, )这是我的预测代码是官方提供的呀
Glenn JocherUltralytics你这段
predict()用法本身没问题;一般也不需要手动写task="segment",关键是确保加载的是分割权重(*-seg.pt),否则不会有result.masks输出;如果分割边缘出现“被框裁切/直线感强”的现象,可以在推理时尝试开启retina_masks=True并适当增大imgsz(NMS 默认就会做,通常不需要单独传nms=True),相关参数处理可参考 SegmentationPredictor 源码说明。from ultralytics import YOLO model = YOLO("yolo26n-seg.pt") # 确保是 -seg 权重 results = model.predict( os.path.join(path, file), retina_masks=True, imgsz=1024, conf=0.25, iou=0.7, )liyongkang2000
您好,您的建议是有效的,但边界还是没有那么光滑,以及大目标效果更差,有时会出现正方形,您这边还有其他的解决方案吗?期待您的回复
Glenn JocherUltralytics这个“边缘直线/大目标出现方块”的现象通常是分割头的掩码分辨率与“mask 会按预测框裁剪”的机制共同导致的(框越紧越容易看出裁剪痕迹,可参考这条 社区说明:inference 时 mask 是否会被 bbox 裁剪);如果你是自训练模型,想从根源提升大目标的边缘细节,建议在训练时把
mask_ratio调小(更高 mask 分辨率)并配合更大的imgsz/更大的*-seg模型,mask_ratio参数说明见 配置参数文档。from ultralytics import YOLO model = YOLO("yolo26s-seg.pt") # 也可以试试更大一点的 -seg 权重 model.train( data="path/to/your_dataset.yaml", imgsz=1024, epochs=100, mask_ratio=2, # 需要更细可再降到 1(显存占用会明显上升) )如果你只是想“导出/显示更光滑”的轮廓(不改变模型预测本身),可以按 Isolating Segmentation Objects 的方式拿到
result.masks.data后做一次轻量的blur + close再取轮廓;另外麻烦贴一张出现“正方形”的原图和对应可视化结果,并附上yolo checks的文本输出,我这边可以帮你确认主要瓶颈是分辨率、标注轮廓质量还是框裁剪造成的。
