Ultralytics YOLO27: Join the waitlist.
Get Started

Datasets Overview#

Ultralytics supports datasets for computer vision tasks such as detection, instance segmentation, semantic segmentation, depth estimation, classification, pose estimation, and oriented bounding boxes (OBB). Below is a list of the main Ultralytics datasets, followed by a summary of each computer vision task and the respective datasets. Track mode runs on top of detection, segmentation, pose and OBB models without tracker-specific training; see tracking datasets.



Watch: Ultralytics Datasets Overview

Object Detection#

Bounding box object detection is a computer vision technique that involves detecting and localizing objects in an image by drawing a bounding box around each object.

  • African-wildlife: A dataset featuring images of African wildlife, including buffalo, elephants, rhinos, and zebras.
  • Argoverse: A dataset containing 3D tracking and motion forecasting data from urban environments with rich annotations.
  • Brain-tumor: A dataset for detecting brain tumors that includes MRI or CT scan images with details on tumor presence, location, and characteristics.
  • COCO: Common Objects in Context (COCO) is a large-scale object detection, segmentation, and captioning dataset with 80 object categories.
  • COCO8: A smaller subset of the first 8 images from COCO train2017, 4 for training and 4 for validation, suitable for quick tests.
  • COCO8-Grayscale: A grayscale version of COCO8 created by converting RGB to grayscale, useful for single-channel model evaluation.
  • COCO8-Multispectral: A 10-channel multispectral version of COCO8 created by interpolating RGB wavelengths, useful for spectral-aware model evaluation.
  • COCO12-Formats: A 12-image test dataset covering the 12 supported image formats (AVIF, BMP, DNG, HEIC, JP2, JPEG, JPG, MPO, PNG, TIF, TIFF, WebP) for validating image loading pipelines.
  • COCO128: A smaller subset of the first 128 images from COCO train2017, suitable for tests.
  • Construction-PPE: A dataset of construction site imagery annotated with key safety gear such as helmets, vests, gloves, boots, and goggles, along with labels for missing equipment, supporting the development of AI models for compliance and worker protection.
  • Global Wheat 2020: A dataset containing images of wheat heads for the Global Wheat Challenge 2020.
  • HomeObjects-3K: A dataset of annotated indoor scenes featuring 12 common household items, ideal for developing and testing computer vision models in smart home systems, robotics, and augmented reality.
  • KITTI: A well-known autonomous driving dataset featuring stereo, LiDAR, and GPS/IMU inputs, used for 2D object detection in varied road scenes.
  • LVIS: A large-scale object detection and instance segmentation dataset with 1,203 object categories.
  • Medical-pills: A dataset containing labeled images of medical pills, designed to aid in tasks like pharmaceutical quality control, sorting, and ensuring compliance with industry standards.
  • Objects365: A high-quality, large-scale dataset for object detection with 365 object categories and over 1.7 million annotated images.
  • Open Images V7: A large-scale Google dataset with 601 classes, 1.7M train images, and 42K validation images.
  • RF100: A diverse object detection benchmark with 100 datasets spanning seven imagery domains for comprehensive model evaluation.
  • Signature: A dataset featuring images of various documents with annotated signatures, supporting document verification and fraud detection research.
  • SKU-110K: A dataset featuring dense object detection in retail environments with over 11K images and 1.7 million bounding boxes.
  • TT100K: The Tsinghua-Tencent 100K traffic sign dataset with 16,817 street-view images across 221 sign categories.
  • Ultralytics Benchmark: A first-party benchmark suite of 37 curated detection datasets across medical, aerial, industrial, retail, and other domains, with a fixed protocol for measuring real-world model generalization.
  • VisDrone: A dataset containing object detection and multi-object tracking data from drone-captured imagery with over 10K images and video sequences.
  • VOC: The Pascal Visual Object Classes (VOC) dataset for object detection and segmentation with 20 object classes and over 21K images.
  • xView: A dataset for object detection in overhead imagery with 60 object categories and over 1 million annotated objects.

Instance Segmentation#

Instance segmentation is a computer vision technique that involves identifying and localizing objects in an image at the pixel level. Unlike semantic segmentation which only classifies each pixel, instance segmentation distinguishes between different instances of the same class.

  • Carparts-seg: Purpose-built dataset for identifying vehicle parts, catering to design, manufacturing, and research needs. It serves for both object detection and segmentation tasks.
  • COCO: A large-scale dataset designed for object detection, segmentation, and captioning tasks with over 200K labeled images.
  • COCO8-seg: A smaller dataset for instance segmentation tasks, containing a subset of 8 COCO images with segmentation annotations.
  • COCO128-seg: A smaller dataset for instance segmentation tasks, containing a subset of 128 COCO images with segmentation annotations.
  • Crack-seg: Specifically crafted dataset for detecting cracks on roads and walls, applicable for both object detection and segmentation tasks.
  • Package-seg: Tailored dataset for identifying packages in warehouses or industrial settings, suitable for both object detection and segmentation applications.

Semantic Segmentation#

Semantic segmentation assigns a class label to every pixel in an image, producing dense scene maps for applications such as autonomous driving, scene parsing, and land-cover mapping.

  • Cityscapes: Urban street-scene semantic segmentation dataset with 19 train classes.
  • Cityscapes8: A compact 8-image Cityscapes subset for quick semantic segmentation pipeline checks.
  • ADE20K: Scene parsing dataset with 150 semantic classes.

Depth Estimation#

Monocular depth estimation predicts a per-pixel depth map in meters from a single RGB image, supporting 3D scene reconstruction, robot navigation, and AR/VR applications.

  • Depth8: A compact 8-image SUN RGB-D subset for quick pipeline checks.
  • ARKitScenes: Real indoor RGB-D captured with Apple ARKit LiDAR, the largest real training source.
  • SUN RGB-D: Real indoor scenes captured with four different RGB-D sensors.
  • DIODE: Dense indoor and outdoor depth from a survey-grade laser scanner.
  • Hypersim: Photorealistic synthetic indoor scenes with perfect per-pixel depth.
  • TartanAir: Synthetic AirSim environments with dense depth to ~80 m.
  • Virtual KITTI 2: Synthetic recreation of KITTI driving scenes with dense depth.
  • KITTI: Real-world outdoor autonomous-driving scenes with Velodyne LiDAR depth, also the KITTI Eigen benchmark.
  • ImageNet (pseudo-labeled): ImageNet-1K images with Depth Anything 3 pseudo labels for distillation.
  • NYU Depth V2: Standard indoor depth benchmark captured with a Microsoft Kinect v1.
  • ETH3D: High-precision indoor and outdoor laser-scanner benchmark.
  • Make3D: Out-of-distribution outdoor campus benchmark.
  • iBims-1: High-quality indoor benchmark for depth edges and planar surfaces.

Classification#

Image classification is a computer vision task that involves categorizing an image into one or more predefined classes or categories based on its visual content.

  • Caltech 101: A dataset containing images of 101 object categories for image classification tasks.
  • Caltech 256: An extended version of Caltech 101 with 256 object categories and more challenging images.
  • CIFAR-10: A dataset of 60K 32x32 color images in 10 classes, with 6K images per class.
  • CIFAR-100: An extended version of CIFAR-10 with 100 object categories and 600 images per class.
  • Fashion-MNIST: A dataset consisting of 70,000 grayscale images of 10 fashion categories for image classification tasks.
  • ImageNet: A large-scale dataset for object detection and image classification with over 14 million images and 20,000 categories.
  • ImageNet-10: A smaller subset of ImageNet with 10 categories for faster experimentation and testing.
  • Imagenette: A smaller subset of ImageNet that contains 10 easily distinguishable classes for quicker training and testing.
  • Imagewoof: A more challenging subset of ImageNet containing 10 dog breed categories for image classification tasks.
  • MNIST: A dataset of 70,000 grayscale images of handwritten digits for image classification tasks.
  • MNIST160: First 8 images of each digit (0-9) from both the MNIST train and test splits. Dataset contains 160 images total.

Pose Estimation#

Pose estimation is a technique used to determine the pose of an object relative to the camera or the world coordinate system. This involves identifying keypoints or joints on objects, particularly humans or animals.

  • COCO: A large-scale dataset with human pose annotations designed for pose estimation tasks.
  • COCO8-pose: A smaller dataset for pose estimation tasks, containing a subset of 8 COCO images with human pose annotations.
  • Dog-pose: A comprehensive dataset featuring approximately 8,500 images focused on dogs, annotated with 24 keypoints per dog, tailored for pose estimation tasks.
  • Hand-Keypoints: A dataset featuring over 26,000 images centered on human hands, annotated with 21 keypoints per hand, designed for pose estimation tasks.
  • Tiger-pose: A compact dataset consisting of 263 images focused on tigers, annotated with 12 keypoints per tiger for pose estimation tasks.

Oriented Bounding Boxes (OBB)#

Oriented Bounding Boxes (OBB) is a method in computer vision for detecting angled objects in images using rotated bounding boxes, often applied to aerial and satellite imagery. Unlike traditional bounding boxes, OBB can better fit objects at various orientations.

  • DOTA-v2: A popular OBB aerial imagery dataset with 1.7 million instances and 11,268 images.
  • DOTA8: A smaller subset of the first 8 images from the DOTAv1 split set, 4 for training and 4 for validation, suitable for quick tests.
  • DOTA128: A 128-image subset of DOTAv1 used for both training and validation, providing a good balance between size and diversity for testing OBB models.

Contribute New Datasets#

Contributing a new dataset involves several steps to ensure that it aligns well with the existing infrastructure. Below are the necessary steps:



Watch: How to Contribute to Ultralytics Datasets

Steps to Contribute a New Dataset#

  1. Collect Images: Gather the images that belong to the dataset. These could be collected from various sources, such as public databases or your own collection.

  2. Annotate Images: Annotate these images with bounding boxes, segments, or keypoints, depending on the task.

  3. Export Annotations: Convert these annotations into the YOLO *.txt file format which Ultralytics supports.

  4. Organize Dataset: Arrange your dataset into the correct folder structure. You should have images/ and labels/ top-level directories, and within each, a train/ and val/ subdirectory.

    dataset/
    ├── images/
    │   ├── train/
    │   └── val/
    └── labels/
        ├── train/
        └── val/
  5. Create a data.yaml File: In your dataset's root directory, create a data.yaml file that describes the dataset, classes, and other necessary information.

  6. Optimize Images (Optional): If you want to reduce the size of the dataset for more efficient processing, you can optimize the images using the code below. This is not required, but recommended for smaller dataset sizes and faster download speeds.

  7. Zip Dataset: Compress the entire dataset folder into a zip file.

  8. Document and PR: Create a documentation page describing your dataset and how it fits into the existing framework. After that, submit a Pull Request (PR). Refer to Ultralytics Contribution Guidelines for more details on how to submit a PR.

Example Code to Optimize and Zip a Dataset#

Optimize and Zip a Dataset
from pathlib import Path

from ultralytics.data.utils import compress_one_image
from ultralytics.utils.downloads import zip_directory

# Define dataset directory
path = Path("path/to/dataset")

# Optimize images in dataset (optional)
for f in path.rglob("*.jpg"):
    compress_one_image(f)

# Zip dataset into 'path/to/dataset.zip'
zip_directory(path)

By following these steps, you can contribute a new dataset that integrates well with Ultralytics' existing structure.

FAQ#

  • Ultralytics supports a wide variety of datasets for object detection, including:

    • COCO: A large-scale object detection, segmentation, and captioning dataset with 80 object categories.
    • LVIS: An extensive dataset with 1,203 object categories, designed for more fine-grained object detection and segmentation.
    • Argoverse: A dataset containing 3D tracking and motion forecasting data from urban environments with rich annotations.
    • VisDrone: A dataset with object detection and multi-object tracking data from drone-captured imagery.
    • SKU-110K: Featuring dense object detection in retail environments with over 11K images.

    These datasets support training robust Ultralytics YOLO models for various object detection applications.

  • Contributing a new dataset involves several steps:

    1. Collect Images: Gather images from public databases or personal collections.
    2. Annotate Images: Apply bounding boxes, segments, or keypoints, depending on the task.
    3. Export Annotations: Convert annotations into the YOLO *.txt format.
    4. Organize Dataset: Use the folder structure with images/ and labels/ directories, each containing train/ and val/ subdirectories.
    5. Create a data.yaml File: Include dataset descriptions, classes, and other relevant information.
    6. Optimize Images (Optional): Reduce dataset size for efficiency.
    7. Zip Dataset: Compress the dataset into a zip file.
    8. Document and PR: Describe your dataset and submit a Pull Request following Ultralytics Contribution Guidelines.

    Visit Contribute New Datasets for a comprehensive guide.

  • Ultralytics Platform offers dataset management and analysis features, including:

    • Dataset Management: Upload, organize, and manage your datasets in one place.
    • Immediate Training Integration: Use uploaded datasets directly for model training without additional setup.
    • Visualization Tools: Explore and visualize your dataset images and annotations.
    • Dataset Analysis: Get insights into your dataset distribution and characteristics.

    Datasets move straight from management to model training on the same platform.

  • Ultralytics YOLO models provide several unique features for computer vision tasks:

    • Real-time Performance: High-speed inference and training capabilities for time-sensitive applications.
    • Versatility: Support for detection, instance segmentation, semantic segmentation, depth estimation, classification, pose estimation, and oriented bounding box (OBB) tasks in a unified framework.
    • Pretrained Models: Access to high-performing, pretrained models for various applications, reducing training time.
    • Extensive Community Support: Active community and comprehensive documentation for troubleshooting and development.
    • Easy Integration: Simple API for integrating with existing projects and workflows.
  • To optimize and zip a dataset using Ultralytics tools, follow this example code:

    Optimize and Zip a Dataset
    from pathlib import Path
    
    from ultralytics.data.utils import compress_one_image
    from ultralytics.utils.downloads import zip_directory
    
    # Define dataset directory
    path = Path("path/to/dataset")
    
    # Optimize images in dataset (optional)
    for f in path.rglob("*.jpg"):
        compress_one_image(f)
    
    # Zip dataset into 'path/to/dataset.zip'
    zip_directory(path)

    This process helps reduce dataset size for more efficient storage and faster download speeds.

Comments73

Ask a question, share your results, or help someone else.

  1. Fatima-khanjarFatima-khanjarGitHub

    Hello, I hope you're doing well.

    I have a question regarding the imgsz argument in YOLO (imgsz=224).

    How exactly does the resizing process work internally? Specifically:

    • Are images resized with padding to maintain aspect ratio?
    • What if the original images are very small (e.g., 50×50)? Are they upscaled with padding, or just stretched to fit the target size?
    • Does this resizing strategy affect model performance or accuracy?

    Thanks in advance for your clarification!

  2. gdenis82gdenis82GitHub(edited)

    Hi. Please tell me how I can balance the class weights in data.yaml for yolo11x-seg:

    train: path/to/dataset/train/images
    val: path/to/dataset/val/images
    
    nc: 2 # number of classes
    names: [class 0, class 1] # list of class name 
    cls_pw: [0.9, 0.1] 
    or 
    pos_weight: [0.9, 0.1]

    I did not find an exact understanding of how to do this.

    1. Glenn JocherGlenn JocherUltralytics(edited)

      @gdenis82 hello! Class weights like cls_pw or pos_weight are not defined within the data.yaml file itself.

      These parameters are typically hard-coded within your Python training script.

    2. gdenis82gdenis82GitHub

      Hello. Good documentation. You're the best at it. Thank you. I looked at it again, found a lot of interesting and useful things, but I still haven't found the answer to this question. Here is a simple example with a train. What argument do I need to use to balance the class weights?

      from ultralytics import YOLO
      
      # Load a model
      model = YOLO("yolo11x-seg.pt")  # load a pretrained model (recommended for training)
      
      # Train the model with 2 GPUs
      results = model.train(data="data.yaml", epochs=100, imgsz=640, device=[0, 1])
    3. Glenn JocherGlenn JocherUltralytics

      @gdenis82 to handle class imbalance in YOLO11x-seg training, you have a few options:

      1. Use the cls parameter in the training function to adjust the classification loss weight:

        model.train(data="data.yaml", epochs=100, imgsz=640, device=[0, 1], cls=0.7)  # Adjust overall classification loss weight
      2. For more granular control, you can create a custom configuration file to define class weights. The class weights are typically handled in the loss function, not directly in the data.yaml.

      3. For severely imbalanced datasets, consider these practical approaches:

        • Adjust your dataset sampling to balance class representation
        • Use techniques like oversampling of minority classes or undersampling of majority classes
        • Apply data augmentation more heavily to underrepresented classes

      Class-specific weights aren't directly specified as a training argument in the current API. If you need very fine-grained control, you might need to modify the loss function implementation.

      Does this help with your class balancing needs?

    4. gdenis82gdenis82GitHub

      @glenn-jocher Thank you. Do I understand correctly that this approach sets a reduced total weight of the classification error and corrects only the overall component of the loss function. For ** the entire cluster analysis**, and not separately for each class. This is useful if we have a small data imbalance and all classes can be adjusted in the same way. If each class should have individual weights (depending on the classes shown in the image), what should be done?

      # Determine the weights of the classes
      # Assume 3 classes: 0 - majority class, 1 - minority class, 2 - rare class
      weights = torch.tensor([0.5, 2.0, 3.0])  # The weights should be the inverse of the frequency of occurrence of classes.
    5. Glenn JocherGlenn JocherUltralytics(edited)

      @gdenis82 you're correct - the cls parameter adjusts the overall classification loss weight, not individual class weights. For implementing individual class weights in YOLO, you would need to modify the loss function directly in the source code.

      The most straightforward approach would be to:

      1. Clone the Ultralytics repository
      2. Locate the loss implementation (typically in ultralytics/utils/loss.py)
      3. Modify the classification loss calculation to incorporate your custom class weights
      4. Use your modified version for training

      For example, you might need to add something like:

      # In the loss function where classification loss is calculated
      class_weights = torch.tensor([0.5, 2.0, 3.0], device=targets.device)
      cls_loss = cls_loss * class_weights[targets.long()]

      Alternatively, data-based approaches are often more practical:

      • Oversampling underrepresented classes
      • Augmenting minority classes more aggressively
      • Using techniques like focal loss (a FocalLoss class exists in ultralytics/utils/loss.py, but it is not used by default)

      These approaches often yield better results than direct weight modification and don't require source code changes.

    6. gdenis82gdenis82GitHub

      @glenn-jocher Hello. Thanks for your patience and detailed explanation. I got the answer to my question.

  3. D3RK0D3RK0GitHub

    Hi,

    Introduction

    For a couple of days now, I am trying to set YOLOv8 in classification mode in order to classify flowers in the images of the Oxford Flower dataset (i.e. https://www.robots.ox.ac.uk/~vgg/data/flowers/102/). I am using ImageNet pretrained weights to start my training.

    The error

    However, I am the obtaining error:

    Dataset not found ⚠️, missing path C:\Users\ <'my_path'> \Oxford-Flower-dataset\oxford_flower.yaml, attempting download... Downloading https://ultralytics.com/assets/C://Users/ <'my_path'> /Oxford-Flower-dataset/oxford_flower.yaml.zip to 'C:\Users\ <'my_path'> \Oxford-Flower-dataset\oxford_flower.yaml.zip'...

    My code

    • Creation of model object: model = YOLO("yolov8m-cls.pt")

    • Model.training: model.train(mode="classify", data=data_file_path, epochs=num_epochs, batch=batch_size, imgsz=256, lr0=lr, optimizer="AdamW", cos_lr=True, momentum=0.937, weight_decay=weight_decay)

    • Note that variable "data_file_path" is the path to my .yaml file I created for the Oxford Flower dataset

    My yaml file

    The content of my .yaml file is:

    names:

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9 ....
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102 nc: 102 path: C:/Users/ <'my_path'> /Oxford-Flower-dataset/jpg train: train/images train_label_dir: train/labels val: val/images val_label_dir: val/labels

    Data directories

    The directories of my data is exactly the way your colleague / member "pderrenger" describes it in her message of March 30th 2024. It looks like:

    dataset/ ├── train/ │ ├── images/ │ └── labels.txt └── val/ ├── images/ └── labels.txt

    Labels.txt content

    The content of labels.txt is:

    image_06734.txt 1 image_06735.txt 1 image_06737.txt 1 image_06742.txt 1 image_06743.txt 1 image_06745.txt 1 image_06746.txt 1 image_06748.txt 1 image_06751.txt 1 image_06752.txt 1 ....

    Question

    Why is it unable to find the data? What I am I missing

    1. D3RK0D3RK0GitHub

      The dashes in "My yaml file" section has been automatically changed bullet points. That is not intended. So, bullet points in that section are dashes.

    2. Glenn JocherGlenn JocherUltralytics(edited)

      @D3RK0 it seems the issue is with the dataset path. For classification, data should be the path to the dataset root directory (not a YAML file), containing train/ and val/ (or test/) folders with one subfolder per class. The .yaml you created is not used for classification, which is why Ultralytics tried to download it. For more details, visit https://docs.ultralytics.com/datasets/classify/.

      1
    3. D3RK0D3RK0GitHub

      @glenn-jocher Thank you for your quick reply!

      Testing directories as they are in the .yaml file

      All the directories in my .yaml file should exist: image

      Note that the prepare_dataset.data_dir variable is created by using a simple dialog: filedialog.askdirectory(title="Select the image data folder:").

      Folder structure

      As indicated by your colleague, I am using the following structure:

      dataset/ ├── train/ │ ├── images/ │ └── labels.txt └── val/ ├── images/ └── labels.txt

      Is this structure correct?

      Note that in the dataset folder (which is called, in my case, the jpg folder) are all the original .jpeg images files. Originally, the Oxford Flower dataset did not had this structure; all the image files are in jpg folder. Therefore, I created the folder structure you see above and copied the image files (via a script) to the train/images and val/images. But, I did not remove the original image files in the jpg folders. Could not removing the originals be the problem?

      Creating the data_file_path variable

      Comparably, to create data_file_path variable, I use data_file_path = filedialog.askopenfilename(title="Please select the dataset .yaml dataset file for YOLOv8:").

      Directories in the .yaml file

      In the .yaml file, do indicate the labels directory with the extension e.g. train/labels.txt?

    4. Glenn JocherGlenn JocherUltralytics(edited)

      It looks like the issue is the dataset layout. For classification, pass the dataset root directory as data (not a YAML file), and make sure it contains train/ and val/ folders with one subfolder per class (the folder name is the class label). No labels directory or label files are used.

      1
    5. D3RK0D3RK0GitHub(edited)

      @glenn-jocher Thank you for your quick reply :-D

      Clarification about the path key directory

      Note that the path key is not literally C:/Users/ <'my_path'> /Oxford-Flower-dataset/jpg. With <'my_path'>, I omitted part of the path for privacy. More realistically, it is like C:/Users/my_several_folders/Oxford-Flower-dataset/jpg. I hope we are the same page on that :-) .

      Folder structure

      You are saying: "The labels should be in a directory, not a single file." So, then the correct folder structure is not the way your colleague 'pderrenger' describes it; it is:

      dataset/ ├── train/ │ ├── images/ │ └── labels/ └── val/ ├── images/ └── labels/

      This is thus the expected folder structure, is it not? I have changed my folder structure to match with the expected folder, as described above. In my case, it is now: image

      Where the jpg folder is the root directory of my dataset and to which the aforementioned path key in my .yaml file points to. The image files are in the train/images and val/images folders. Lastly, the labels.txt files are the train/labels and val/labels folders.

      The content of current .yaml file

      names:

      • 1
      • 2
      • 3 ...
      • 100
      • 101
      • 102 nc: 102 path: C:/Users/derk_/Documents/Universiteit/IRP/Research_Project/Oxford-Flower-dataset/jpg train: train/images train_label_dir: train/labels val: val/images val_label_dir: val/labels

      In summary

      path key

      The path key is approximately C:/Users/my_several_folders/Oxford-Flower-dataset/jpg. This is my root directory of my dataset.

      Current folder structure

      The current folder structure is: image

      Changes I made

      • I changed the folder structure
      • I did not change the .yaml file content, because I can not see how that is wrong

      Result of the changes

      Changing the folder structure did not solve the problem. It is still unable to find the dataset.

      Additional questions

      Could you please be explicit about what the correct folder structure is? Could you please give an example of what a correct .yaml structure looks like, as this is not reported in the Ultralytics documentation (unless I missed it)?

      Many thanks!

    6. Glenn JocherGlenn JocherUltralytics(edited)

      It seems the folder structure is causing the issue. For classification, no label files are needed: place the images of each class in a folder named after the class, inside train/ and val/. Then pass the dataset root directory as data. For more details, please refer to the classification dataset guide.

      1
    7. D3RK0D3RK0GitHub

      @glenn-jocher Many thanks for your quick responses!

      Changes

      I changed my code from making the single labels.txt file to making individual label .txt files. It now looks like:

      image

      At the top of image is part of the directory. Below there are the label .txt files. In bottom-left is example of the content of such label file.

      Are the names of the label .txt file correct?

      Result

      Still the same dataset not found error :(

    8. Glenn JocherGlenn JocherUltralytics(edited)

      Each image's class is taken from the name of the folder it sits in, so no label files are needed for classification. Make sure your data is organized as dataset/train/<class_name>/*.jpg and dataset/val/<class_name>/*.jpg, and pass the dataset root directory as data.

    9. D3RK0D3RK0GitHub

      @glenn-jocher Thanks for responding!

      I have solved the previous problem. I have another problem, however.

      Output by the YOLOv8 model

      YAML file created at: C:/Users/derk_/Documents/Universiteit/IRP/Research_Project/Oxford-Flower-dataset/jpg\oxford_flower.yaml New https://pypi.org/project/ultralytics/8.3.28 available 😃 Update with 'pip install -U ultralytics' engine\trainer: task=classify, mode=train, model=yolov8m-cls.pt, data=C:/Users/derk_/Documents/Universiteit/IRP/Research_Project/Oxford-Flower-dataset/jpg, epochs=1, time=None, patience=100, batch=16, imgsz=224, save=True, save_period=1, cache=False, device=cpu, workers=8, project=None, name=train38, exist_ok=False, pretrained=True, optimizer=AdamW, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=True, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.01, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=C:\runs\classify\train38 train: C:\Users\derk_\Documents\Universiteit\IRP\Research_Project\Oxford-Flower-dataset\jpg\train... found 6149 images in 102 classes: ERROR ❌️ requires 2 classes, not 102 val: C:\Users\derk_\Documents\Universiteit\IRP\Research_Project\Oxford-Flower-dataset\jpg\val... found 1020 images in 102 classes: ERROR ❌️ requires 2 classes, not 102 test: C:\Users\derk_\Documents\Universiteit\IRP\Research_Project\Oxford-Flower-dataset\jpg\test... found 1020 images in 102 classes: ERROR ❌️ requires 2 classes, not 102 Overriding model.yaml nc=1000 with nc=2 from n params module arguments
      0 -1 1 1392 ultralytics.nn.modules.conv.Conv [3, 48, 3, 2]
      1 -1 1 41664 ultralytics.nn.modules.conv.Conv [48, 96, 3, 2]
      2 -1 2 111360 ultralytics.nn.modules.block.C2f [96, 96, 2, True]
      3 -1 1 166272 ultralytics.nn.modules.conv.Conv [96, 192, 3, 2]
      4 -1 4 813312 ultralytics.nn.modules.block.C2f [192, 192, 4, True]
      5 -1 1 664320 ultralytics.nn.modules.conv.Conv [192, 384, 3, 2]
      6 -1 4 3248640 ultralytics.nn.modules.block.C2f [384, 384, 4, True]
      7 -1 1 2655744 ultralytics.nn.modules.conv.Conv [384, 768, 3, 2]
      8 -1 2 7084032 ultralytics.nn.modules.block.C2f [768, 768, 2, True]
      9 -1 1 988162 ultralytics.nn.modules.head.Classify [768, 2]
      YOLOv8m-cls summary: 141 layers, 15,774,898 parameters, 15,774,898 gradients

      The problem

      The "[...] ERROR ❌️ requires 2 classes, not 102 [...]" is giving for all my data splits.

      My yaml file.

      The content of my yaml file:

      names: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102] nc: 102 path: C:/Users/my_several_folders/Oxford-Flower-dataset/jpg test: test/images test_label_dir: test/labels train: train/images train_label_dir: train/labels val: val/images val_label_dir: val/labels

      The length of names is equal to the value of nc, 102, so that is not disparate.

      My folder structure

      jpg/ ├── train/ │ ├── 1/ │ │ ├── img1.jpg │ │ └── img2.jpg │ ├── 2/ │ └── ... ├── val/ │ ├── 1/ │ ├── 2/ │ └── ... └── test/ ├── 1/ ├── 2/ └── ...

      The names of the classes should thus correctly correspond to folder names of the folder wherein the images of that given class are stored.

      Question

      Are you familiar with the "[...] ERROR ❌️ requires 2 classes, not 102 [...]" error? What are the most common solutions to this problem?

      Many thanks!

    10. Glenn JocherGlenn JocherUltralytics

      @D3RK0 it seems the model configuration is set to expect 2 classes instead of 102. Ensure that the nc parameter in your model configuration matches the number of classes in your dataset. Adjust the model configuration to nc: 102 to resolve this issue.

    11. D3RK0D3RK0GitHub(edited)

      @glenn-jocher Many thanks for your quick response!

      How can I do that? I mean, as you can see from the content of my .yaml-file, the nc parameter is already set to 102 and nc is not an accepted hyperparameter in the YOLO() or model.train() function.

    12. Glenn JocherGlenn JocherUltralytics

      @D3RK0 ensure the model is correctly configured by setting nc: 102 in the model's YAML file before training. If the issue persists, verify that the model weights are compatible with the number of classes.

    13. xcf1xcf1GitHub

      Hello, I'd like to ask you a question. In the evaluation results I generated, the scores.txt file shows AP: 0.429, AP_50: 0.702, AP_75: 0.457, AP_medium: 0.338, AP_large: 0.555, AR: 0.490, AR_50: 0.725, AR_75: 0.536, AR_medium: 0.385, AR_large: 0.632. However, in the stdout.txt file, 0.429 is the value for AP_0.50:0.95. So, I'm confused about where to find the official COCO AP and AR values. Below are screenshots of my two text files, the first being scores.txt and the second being stdout.txt. C763135E5B2A74CD91CF4AE2CB267B0C D7D7B6AEADAA7158A90D83D8AD4B98FA

    14. Glenn JocherGlenn JocherUltralytics(edited)

      The official COCO AP (Average Precision) metric is AP@0.50:0.95 which corresponds to the 0.429 value in your results. This matches both your scores.txt AP value and stdout.txt AP_0.50:0.95. For full details on COCO evaluation metrics, see the official COCO evaluation documentation.

  4. rakezshrerakezshreGitHub

    Hi, I wanted to use MVTec dataset for training in Ultralytics framework with yolo. But the dataset doesnt have labelling but instead it has ground_truth with some parameters and masking. Is it possible to make a yaml file for the MVTec dataset (most easiest way)? If there is any method. Please let me know.

    Thanks.

    1. Glenn JocherGlenn JocherUltralytics

      To use the MVTec dataset with YOLO, you'll need to convert the ground truth and masks into YOLO format. This involves creating bounding box annotations and a data.yaml file. You can refer to the Ultralytics documentation for guidance on dataset preparation and formatting. If you have further questions, feel free to ask!

    2. rakezshrerakezshreGitHub

      Is there any easyway to convert MVTec dataset with YOLO with ground truth and masks. It consists of large dataset and creating bounding box annotation seems time consuming. I can see the ultralytics format for data.yaml. But issue is with the bounding box consversion.

    3. Glenn JocherGlenn JocherUltralytics

      To convert the MVTec dataset for YOLO, you'll need to create bounding box annotations from the masks and ground truth. Tools like LabelImg can help with manual annotation. Once you have the annotations, you can format them into YOLO's required structure and create a data.yaml file. For more details, visit the Ultralytics documentation on dataset preparation.

  5. Andriw75Andriw75GitHub

    I am usually interested in understanding what data I am adding to my dataset, as this can be beneficial or harmful depending on the project. I am trying to initialize the YOLO dataset to apply transformations required by the training parameters, but I often encounter errors. Thank you in advance for your help!

    from ultralytics.data.dataset import YOLODataset, v8_transforms from ultralytics.engine.trainer import check_det_dataset

    class Hyperparameters: def init(self, hyp_dict): for key, value in hyp_dict.items(): setattr(self, key, value)

    Initialize the YOLO dataset

    dataset = YOLODataset( img_path="path/to/images", # Replace with your image path data=check_det_dataset("path/to/dataset.yaml"), # Replace with your dataset configuration imgsz=640, batch_size=1 )

    Define hyperparameters for transformations

    hyp = { "mosaic": 1.0, "copy_paste": 0.5, "degrees": 10.0, "translate": 0.2, "scale": 0.9, "shear": 0.5, "perspective": 0.4, "copy_paste_mode": 'flip', 'mixup': 0.5, 'hsv_h': 0.1, 'hsv_s': 0.1, 'hsv_v': 0.1, 'flipud': 0.1, 'fliplr': 0.1 }

    hyperparams = Hyperparameters(hyp)

    Apply transformations to the dataset

    transforms = v8_transforms(dataset, imgsz=640, hyp=hyperparams)

    Attempt to augment data

    augmented_data = transforms(dataset[0])

    albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01, num_output_channels=3, method='weighted_average'), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01, num_output_channels=3, method='weighted_average'), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8))

    Error Encountered When I run the code, I encounter the following error: ValueError: could not broadcast input array from shape (0,640,640) into shape (364,640,640) the size always changes

    1. Glenn JocherGlenn JocherUltralytics

      @Andriw75 it seems like the error might be due to mismatched image sizes. Ensure all images in your dataset are correctly sized to 640x640 before applying transformations. If the issue persists, double-check your dataset paths and configuration. For further details, you can refer to the Ultralytics documentation on datasets.

  6. MehrsaMashhadiMehrsaMashhadiGitHub

    Hello. I hope you are doing well. I have paired RGB and thermal images, and I want to train yolov9 with 4 channel data. I want the model to read the first 3 channels from the RGB folder, and the thermal image from the thermal folder. all of the paired images have the same name, they are in different folders named ir, and vi. can you please help me how I should address this to the model?

    1. Glenn JocherGlenn JocherUltralytics

      @MehrsaMashhadi to train YOLOv9 with 4-channel data, you'll need to modify the data loading process to combine RGB and thermal images into a single input. You can create a custom dataset class that reads images from both folders and concatenates them into a 4-channel tensor. Ensure your model architecture supports 4-channel input. For more details, refer to the dataset customization section in the Ultralytics documentation.

  7. toxanbitoxanbiGitHub

    I am absolute newbiew in machine learning coming from the world of low-level and system programming (drivers, firmware, electronics and so on). I have some questions.

    1. Is my understanding correct that in machine learning there is a term 'model' which denotes an interconnect of neurons, i.e. the topogy of a neural network, a data structure describing how neurons are connected to each other, and, on the other hand, there is a 'weights' or 'weight file' which holds coefficients describing how signals (stymulus, activations) of a particular neuron influences on other neurons? If this is correct, which one of these two is represented by .pt-file? Or .pt file holds both of these? What is anatomy of .pt-files and where can I learn about it?

    2. Let's assume that we are going to make a NN which can classify or detect three types of objects: cats, frogs and birds. What is optimal strategy of mastering a dataset to learn it: a) A given images must contain either one of these object (annotated by bounding box) b) A given image must contain multiple objects of the same type. c) It's better for every image to have all three instances of these kinds on it c-a) And it's better to not overlap. c-b) And, countrary, it's better to have overlapping to learn NN to handle such cases.

    Should I feed NN with a pictures which doesn't have objects of interest at all or it is useless?

    1. Now instead of having three categories (cats, frogs and birds) we are going to add yet another one which is "other live-forms". Is it a good practive to feed NN with tonns of images of completely different (visually) animals all tagged (annotated) as "other live-forms" or it's better to annotate each animal (other than cat, frog or bird) by setting a class corresponding to their real-world kind? Won't it confuse a NN if crocodiles and kangooros are all annotated as the object of same class? I presume that a process of learning/training is all about finding a features which uniquelly distinguish one class of objects from the others by finding proper weights/coefficients and if vast variety of totally different objects must be considered all having the same type, it may be impossible to find proper weights at all. Or it's not the case? If it is, seems that for that particular task one should use two different NNs: one to distinguisth alive objects for non-alive, and the second stage NN to detect cats/frogs/dogs (and if the second one doesn't detect either of these, but the first one detected a life-form, then it is considered "other life-form").

    2. It's stated that default YOLO models which are available on this website are pretrained on COCO dataset. I saw a discussion on whether it's better to learn your NN from scratch or use a model pretrained on COCO. From my point of view traning a model (which was originally trained on COCO dataset) on your own dataset does only make sense if your custom dataset has exactly the same combinartion of 80 classes as COCO? And if you have less categories than COCO or more categories or even exactly 80 but of completely different types (e.g. you are learning NN to distinguish 80 kinds of vehicle motors), then the only option is learning from scratch?

    3. I can't find a complete and strict definition of that the term 'val' or 'validation' means in context of training a model? Does it affects behaviour of the model or it is just a way to see how well training went?

    4. When we learn a model to detect cats we feed it with images of what is DEFINITELY a cat. But is there a way to show it depiciting objects that are DEFINITELY NOT a cat to avoid false-positives? Other than introducing separate categories for objects that looks very similar to a cat and may be confused with cats but are not really a cat.

    5. Many articles and videos tell us that YOLO format of labels is just s plain-text file with separate line for every label and each line consists of 5 fields; class-id and normalized coordinates of a bounding-box. But what about instance segmentation tasks? Oriented boundong box detection? Bone prediction (aka post)? Doesn't it require completely different and more complex format of annotations (compared to just specifying bounding box)?

    1. Glenn JocherGlenn JocherUltralytics

      @toxanbi 1. Your understanding is correct. The .pt file in PyTorch contains both the model architecture and the weights. You can learn more about the anatomy of .pt files in the PyTorch documentation.

      1. For optimal dataset creation, include diverse scenarios: single objects, multiple objects, overlapping objects, and images without objects. This helps the model generalize better.

      2. It's better to have specific classes for different animals rather than a generic "other live-forms" class. This avoids confusion and improves model accuracy.

      3. Pretraining on COCO is beneficial even if your dataset differs. Transfer learning can help the model learn faster and perform better, even with different categories.

      4. Validation (val) is used to evaluate the model's performance on a separate dataset during training. It doesn't affect the model's behavior but helps monitor training progress.

      5. To reduce false positives, you can include images without the target object in your training dataset. This helps the model learn what not to detect.

      6. For tasks like instance segmentation, oriented bounding boxes, and pose estimation, the annotation format is more complex. Refer to the specific task documentation for details on the required annotation formats.

  8. WARHE8DWARHE8DGitHub

    Hello, how can i update my model and dataset to public? I only see 2 options private and anyone with link. thanks!

    1. Paula DerrengerPaula DerrengerUltralytics

      @WARHE8D to make your model and dataset public, you need to ensure they are properly shared on a platform that supports public access. Currently, the options you mentioned ("private" and "anyone with link") are likely platform-specific settings. If you're using a service like Google Drive or Dropbox, you may need to adjust the sharing settings to "public" or "anyone with the link can view." For more detailed steps on contributing datasets to Ultralytics, please refer to the Contribute New Datasets section in our documentation.

      1
  9. 1729asraful1729asrafulGitHub

    I have 47 classes csv file. each file contains 100 images in csv formate with label. now how I can traine it?

    1. Glenn JocherGlenn JocherUltralytics(edited)

      @1729asraful hi there!

      To train your model using a CSV file containing 47 classes and 100 images per class, you'll need to follow a few steps to prepare your data and then use the Ultralytics YOLO framework for training. Here’s a concise guide to get you started:

      Step 1: Convert CSV to YOLO Format

      First, you need to convert your CSV annotations into the YOLO format. Each image should have a corresponding .txt file with annotations in the format:

      <class> <x_center> <y_center> <width> <height>

      Where:

      • <class> is the class index (0 to 46 for your 47 classes).
      • <x_center>, <y_center>, <width>, and <height> are normalized values (between 0 and 1) relative to the image dimensions.

      Step 2: Organize Your Dataset

      Organize your dataset into the following structure:

      dataset/
      ├── train/
      │   ├── images/
      │   └── labels/
      └── val/
          ├── images/
          └── labels/

      Place your images in the images/ directories and the corresponding YOLO format annotation files in the labels/ directories.

      Step 3: Create a data.yaml File

      Create a data.yaml file in the root of your dataset directory with the following content:

      train: path/to/dataset/train/images
      val: path/to/dataset/val/images
      
      nc: 47  # number of classes
      names: [class0, class1, ..., class46]  # list of class names

      Step 4: Train Your Model

      You can now train your model using the Ultralytics YOLO framework. Here’s an example using the CLI:

      yolo detect train data=path/to/data.yaml model=yolo26n.pt epochs=100 imgsz=640

      Or using Python:

      from ultralytics import YOLO
      
      # Load a model
      model = YOLO('yolo26n.pt')  # load a pretrained model
      
      # Train the model
      results = model.train(data='path/to/data.yaml', epochs=100, imgsz=640)

      Additional Resources

      For more detailed information on dataset preparation and training, please refer to the Ultralytics Datasets Documentation.

      If you encounter any issues, please provide a minimum reproducible example so we can assist you better. You can find more details on how to create one here.

      Happy training! 🚀

    2. Glenn JocherGlenn JocherUltralytics(edited)

      @1729asraful you're welcome! 😊

      To train your model using a CSV file containing 47 classes and 100 images per class, you'll need to convert your CSV annotations into the YOLO format and organize your dataset accordingly. Here’s a step-by-step guide:

      Step 1: Convert CSV to YOLO Format

      First, convert your CSV annotations into the YOLO format. Each image should have a corresponding .txt file with annotations in the format:

      <class> <x_center> <y_center> <width> <height>

      Where:

      • <class> is the class index (0 to 46 for your 47 classes).
      • <x_center>, <y_center>, <width>, and <height> are normalized values (between 0 and 1) relative to the image dimensions.

      Step 2: Organize Your Dataset

      Organize your dataset into the following structure:

      dataset/
      ├── train/
      │   ├── images/
      │   └── labels/
      └── val/
          ├── images/
          └── labels/

      Place your images in the images/ directories and the corresponding YOLO format annotation files in the labels/ directories.

      Step 3: Create a data.yaml File

      Create a data.yaml file in the root of your dataset directory with the following content:

      train: path/to/dataset/train/images
      val: path/to/dataset/val/images
      
      nc: 47  # number of classes
      names: [class0, class1, ..., class46]  # list of class names

      Step 4: Train Your Model

      You can now train your model using the Ultralytics YOLO framework. Here’s an example using the CLI:

      yolo detect train data=path/to/data.yaml model=yolo26n.pt epochs=100 imgsz=640

      Or using Python:

      from ultralytics import YOLO
      
      # Load a model
      model = YOLO('yolo26n.pt')  # load a pretrained model
      
      # Train the model
      results = model.train(data='path/to/data.yaml', epochs=100, imgsz=640)

      For more detailed information on dataset preparation and training, please refer to the Ultralytics Datasets Documentation.

      If you encounter any issues, please provide a minimum reproducible example so we can assist you better. You can find more details on how to create one here.

      Happy training! 🚀

  10. Llll0l0lLlll0l0lGitHub

    Hello, I'm new to machine learning, is it possible to train videos? i turned them into imgs however will it understand that the label belongs to continuous imgs that are sequential ?

    Thank you for reading

    1. Paula DerrengerPaula DerrengerUltralytics(edited)

      @Llll0l0l hello,

      Welcome to the world of machine learning! 🌟 Yes, it is indeed possible to train models using video data. Converting videos into sequential images is a common practice. However, to ensure that the model understands the temporal context (i.e., that the images are sequential and belong to a continuous video), you might want to consider using multi-object tracking (MOT) techniques.

      In multi-object tracking, the model not only detects objects in each frame but also assigns a unique ID to each detected object, maintaining this ID across frames. This way, the model can track the movement and changes of objects over time, understanding the sequential nature of the data.

      Here’s a brief overview of how you can approach this:

      1. Convert Video to Frames: You’ve already done this step by converting your video into images.
      2. Annotate Frames: Ensure that your images are annotated correctly. Each frame should have annotations that indicate the presence and location of objects.
      3. Use a Multi-Object Tracking Model: Ultralytics supports various models and configurations for multi-object tracking. You can use models like YOLO26 with trackers such as BoT-SORT or ByteTrack.

      Here’s a simple example of how you can set up multi-object tracking using YOLO26:

      from ultralytics import YOLO
      
      # Load a model
      model = YOLO("yolo26n.pt")  # Load an official model
      
      # Perform tracking on a video source
      results = model.track("path/to/your/video.mp4", show=True)  # Tracking with default tracker

      For more detailed guidance, you can refer to the Ultralytics documentation on multi-object tracking.

      If you encounter any issues or need further assistance, please ensure you are using the latest version of the Ultralytics packages. Additionally, providing a minimum reproducible example can greatly help in diagnosing and resolving any problems. You can find more information on creating a reproducible example here.

      Happy experimenting, and feel free to reach out if you have more questions! 😊

    2. Paula DerrengerPaula DerrengerUltralytics(edited)

      Hello @Llll0l0l,

      Thank you for your kind words! 😊

      Regarding your question about training on video data: converting videos into sequential images is a great start. However, to ensure the model understands the temporal context, you might want to explore multi-object tracking (MOT) techniques. These techniques help the model maintain object identities across frames, effectively understanding the continuity in the sequence.

      Here's a brief guide on how to proceed:

      1. Convert Video to Frames: As you've done, convert your video into individual frames.
      2. Annotate Frames: Ensure each frame is annotated correctly. This involves labeling objects in each frame.
      3. Use Multi-Object Tracking: Utilize models like YOLO26 with trackers such as BoT-SORT or ByteTrack to maintain object identities across frames.

      Here’s an example of how you can set up multi-object tracking using YOLO26:

      from ultralytics import YOLO
      
      # Load a model
      model = YOLO("yolo26n.pt")  # Load an official model
      
      # Perform tracking on a video source
      results = model.track("path/to/your/video.mp4", show=True)  # Tracking with default tracker

      For more detailed guidance, you can refer to the Ultralytics documentation on multi-object tracking.

      If you encounter any issues, please ensure you are using the latest version of the Ultralytics packages. Providing a minimum reproducible example can also greatly help in diagnosing and resolving any problems. You can find more information on creating a reproducible example here.

      Feel free to reach out if you have more questions. Happy experimenting! 🚀