ultralytics / JSON2YOLO

Convert JSON annotations into YOLO format.
https://docs.ultralytics.com
GNU Affero General Public License v3.0
872 stars 232 forks source link

Yolov8 rejecting labels during model.training #94

Open palmcorp opened 5 months ago

palmcorp commented 5 months ago

CASE: Yolov8-pose rejecting labels during training QUESTION: Where does yolov8 determine how many columns are required for each label?

ERROR at model.train phase:

train: WARNING ⚠️ /content/datasets/echo-pose/images/train2017/frame_000151.PNG: ignoring corrupt image/label: labels require 15 columns each

SAMPLE LABELS FROM train2017: 0 0.680863 0.595223 0.20369 0.0726488 0.579017 0.631547 2 0.687827 0.609047 2 0.748973 0.590758 2 0.782708 0.558898 2 0.6325 0.624151 2

0 0.659062 0.613906 0.23378 0.0539435 0.542172 0.640877 2 0.645104 0.61308 2 0.714791 0.617574 2 0.775952 0.586934 2 0.589449 0.637366 2

BACKROUND 1. no similar problems weere found in the GitHub blog 2. Label files were scanned to insure no hidden, or unicode characters were embedded #####C O D E##### ## LOAD MODEL ECHO_YAMAL=os.path.join ("/content/YAML/yolov8n-echo-pose.yaml") model = YOLO(ECHO_YAMAL, verbose = VERBOSE) model = YOLO('yolov8n-pose.pt') # load a pretrained model (recommended for training) model = YOLO('yolov8n-pose.yaml').load('yolov8n-pose.pt') ## TRAIN MODEL YP=os.path.join ("/content/YAML/data5.yaml") model.train(data=YP, epochs=EPOCHS, imgsz=640) HERE ARE THE TWO YAML FILES: ===================== yolovn-echo-pose.yaml ===================== Ultralytics YOLO 🚀, AGPL-3.0 license # YOLOv8-pose-p6 keypoints/pose estimation model. For Usage examples see https://docs.ultralytics.com/tasks/pose # Parameters nc: 5 # number of classes # UPDATED * kpt_shape: [5, 2] # number of keypoints,* number of dims (2 for x,y or 3 for x,y,visible) flip_indx: [0,1,2,3,4] # no flipping * scales: # model compound scaling constants, i.e. 'model=yolov8n-p6.yaml' will call yolov8-p6.yaml with scale 'n' # [depth, width, max_channels] n: [0.33, 0.25, 1024] s: [0.33, 0.50, 1024] m: [0.67, 0.75, 768] l: [1.00, 1.00, 512] x: [1.00, 1.25, 512] # YOLOv8.0x6 backbone backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 3, C2f, [128, True]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 6, C2f, [256, True]] - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 6, C2f, [512, True]] - [-1, 1, Conv, [768, 3, 2]] # 7-P5/32 - [-1, 3, C2f, [768, True]] - [-1, 1, Conv, [1024, 3, 2]] # 9-P6/64 - [-1, 3, C2f, [1024, True]] - [-1, 1, SPPF, [1024, 5]] # 11 # YOLOv8.0x6 head head: - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 8], 1, Concat, [1]] # cat backbone P5 - [-1, 3, C2, [768, False]] # 14 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 3, C2, [512, False]] # 17 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 3, C2, [256, False]] # 20 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 17], 1, Concat, [1]] # cat head P4 - [-1, 3, C2, [512, False]] # 23 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 14], 1, Concat, [1]] # cat head P5 - [-1, 3, C2, [768, False]] # 26 (P5/32-large) - [-1, 1, Conv, [768, 3, 2]] - [[-1, 11], 1, Concat, [1]] # cat head P6 - [-1, 3, C2, [1024, False]] # 29 (P6/64-xlarge) - [[20, 23, 26, 29], 1, Pose, [nc, kpt_shape]] # Pose(P3, P4, P5, P6) # Classes names: 0: Class0 1: Class1 2: Class2 3: Class3 4: Class4 ========== data5.yaml ========== #keypoint data sets # Data #path: D:POSE/data path: /content/datasets/echo-pose train: images/train2017 # subsets to D val: images/val2017 # relative to path # Keypoints kpt_shape: [5,2] # number of keypoints, number of dim flip_indx: [0,1,2,3,4] # no flipping #backbone: uskng standard backbone backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 3, C2f, [128, True]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 6, C2f, [256, True]] - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 6, C2f, [512, True]] - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 - [-1, 3, C2f, [1024, True]] - [-1, 1, SPPF, [1024, 5]] # 9 #usn standard head head: - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 8], 1, Concat, [1]] # cat backbone P5 - [-1, 3, C2, [768, False]] # 14 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 3, C2, [512, False]] # 17 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 3, C2, [256, False]] # 20 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 17], 1, Concat, [1]] # cat head P4 - [-1, 3, C2, [512, False]] # 23 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 14], 1, Concat, [1]] # cat head P5 - [-1, 3, C2, [768, False]] # 26 (P5/32-large) - [-1, 1, Conv, [768, 3, 2]] - [[-1, 11], 1, Concat, [1]] # cat head P6 - [-1, 3, C2, [1024, False]] # 29 (P6/64-xlarge) - [[20, 23, 26, 29], 1, Pose, [nc, kpt_shape]] # Pose(P3, P4, P5, P6) # Classes names: 0: Class0 1: Class1 2: Class2 3: Class3 4: Class4
pderrenger commented 5 months ago

Hello!

Thank you for providing detailed information about your issue. It looks like you're encountering a problem with label format during the training phase of your YOLOv8-pose model. Let's address your concerns step-by-step.

Label Format Issue

The error message indicates that your labels require 15 columns each, but the provided labels do not match this requirement. For pose estimation, the label format should follow the structure outlined in the Ultralytics documentation:

Format with Dim = 2:

<class-index> <x> <y> <width> <height> <px1> <py1> <px2> <py2> ... <pxn> <pyn>

Format with Dim = 3:

<class-index> <x> <y> <width> <height> <px1> <py1> <p1-visibility> <px2> <py2> <p2-visibility> ... <pxn> <pyn> <pn-visibility>

Given your kpt_shape: [5, 2], each label should have:

This totals to (1 + 4 + (5 \times 2) = 15) columns per label.

Sample Label Correction

Your sample labels should look like this:

0 0.680863 0.595223 0.20369 0.0726488 0.579017 0.631547 0.687827 0.609047 0.748973 0.590758 0.782708 0.558898 0.6325 0.624151

YAML Configuration

Ensure your YAML files correctly reflect the dataset structure and keypoints configuration. Here’s a simplified version of your data5.yaml:

# Data
path: /content/datasets/echo-pose
train: images/train2017
val: images/val2017

# Keypoints
kpt_shape: [5, 2]  # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
flip_idx: [0, 1, 2, 3, 4]  # no flipping

# Classes
names:
  0: Class0
  1: Class1
  2: Class2
  3: Class3
  4: Class4

Next Steps

  1. Verify Label Format: Ensure all your label files conform to the required format.
  2. Update Packages: Make sure you are using the latest versions of torch and ultralytics. You can update them using:
    pip install --upgrade torch ultralytics
  3. Minimum Reproducible Example: If the issue persists, please provide a minimum reproducible code example. This helps us investigate the problem more effectively. You can find guidelines here.

Example Code

Here’s a snippet to help you get started with training after ensuring your labels and configurations are correct:

from ultralytics import YOLO

# Load a pretrained model
model = YOLO('yolov8n-pose.pt')

# Train the model
results = model.train(data='/content/YAML/data5.yaml', epochs=100, imgsz=640)

Feel free to reach out if you have any more questions or need further assistance. Happy training! 🚀

palmcorp commented 5 months ago

Hi Paula,

Thanks again for excellent guidance, will look into these issues today and update comments.

Best

Paul

From: Paula Derrenger @.*** Sent: Monday, June 10, 2024 11:45 PM To: ultralytics/JSON2YOLO Cc: Paul Petronelli; Author Subject: Re: [ultralytics/JSON2YOLO] Yolov8 rejecting labels during model.training (Issue #94)

Hello!

Thank you for providing detailed information about your issue. It looks like you're encountering a problem with label format during the training phase of your YOLOv8-pose model. Let's address your concerns step-by-step.

Label Format Issue

The error message indicates that your labels require 15 columns each, but the provided labels do not match this requirement. For pose estimation, the label format should follow the structure outlined in the Ultralytics documentation https://docs.ultralytics.com/datasets/pose/ :

Format with Dim = 2:

... Format with Dim = 3: ... Given your kpt_shape: [5, 2], each label should have: * 1 class index * 4 bounding box coordinates (x, y, width, height) * 5 keypoints, each with 2 coordinates (px, py) This totals to (1 + 4 + (5 \times 2) = 15) columns per label. Sample Label Correction Your sample labels should look like this: 0 0.680863 0.595223 0.20369 0.0726488 0.579017 0.631547 0.687827 0.609047 0.748973 0.590758 0.782708 0.558898 0.6325 0.624151 YAML Configuration Ensure your YAML files correctly reflect the dataset structure and keypoints configuration. Here’s a simplified version of your data5.yaml: # Data path: /content/datasets/echo-pose train: images/train2017 val: images/val2017 # Keypoints kpt_shape: [5, 2] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible) flip_idx: [0, 1, 2, 3, 4] # no flipping # Classes names: 0: Class0 1: Class1 2: Class2 3: Class3 4: Class4 Next Steps 1. Verify Label Format: Ensure all your label files conform to the required format. 2. Update Packages: Make sure you are using the latest versions of torch and ultralytics. You can update them using: pip install --upgrade torch ultralytics 3. Minimum Reproducible Example: If the issue persists, please provide a minimum reproducible code example. This helps us investigate the problem more effectively. You can find guidelines here . Example Code Here’s a snippet to help you get started with training after ensuring your labels and configurations are correct: from ultralytics import YOLO # Load a pretrained model model = YOLO('yolov8n-pose.pt') # Train the model results = model.train(data='/content/YAML/data5.yaml', epochs=100, imgsz=640) Feel free to reach out if you have any more questions or need further assistance. Happy training! 🚀 — Reply to this email directly, view it on GitHub , or unsubscribe . You are receiving this because you authored the thread. Message ID: ***@***.***>
pderrenger commented 5 months ago

Hi Paul,

Thank you for your kind words and for your continued efforts in resolving this issue. 😊

To ensure we can assist you effectively, please verify a couple of things:

  1. Label Format: Double-check that all your label files strictly follow the required format for pose estimation. Each label should have 15 columns, as outlined previously.

  2. Package Versions: Ensure you are using the latest versions of torch and ultralytics. You can update them with:

    pip install --upgrade torch ultralytics
  3. Minimum Reproducible Example: If the issue persists, could you please provide a minimum reproducible code example? This will help us investigate the problem more effectively. You can find guidelines on how to create one here.

Here’s a quick example to get you started with training after ensuring your labels and configurations are correct:

from ultralytics import YOLO

# Load a pretrained model
model = YOLO('yolov8n-pose.pt')

# Train the model
results = model.train(data='/content/YAML/data5.yaml', epochs=100, imgsz=640)

Feel free to reach out if you have any more questions or need further assistance. The YOLO community and the Ultralytics team are here to help!