{
  "source_file": "0930",
  "source_platform": "技术平台",
  "author": "Roboflow Blog",
  "title_listed": "How to Train YOLOv8 Object Detection on a Custom Dataset",
  "keywords": "YOLOv8,目标检测,数据集",
  "domain": "图像处理",
  "content_type": "实战教程",
  "is_paid_flag": "否",
  "url": "https://blog.roboflow.com/how-to-train-yolov8-on-a-custom-dataset/",
  "publish_date": "2023",
  "corpus_stage": "图像处理",
  "notes": "YOLOv8 自定义数据集训练",
  "id": "57d148585211",
  "collected_at": "2026-10-02T18:00:15",
  "title": "How to Train YOLOv8 Object Detection on a Custom Dataset | Roboflow",
  "body_markdown": "How to Train YOLOv8 Object Detection on a Custom Dataset\nPiotr Skalski\n|\nPublished\nJan 10, 2026\n9\nmin read\nSUMMARY\nThis tutorial walks through every step of training a YOLOv8 object detection model on a custom dataset, from installing the pip package and preparing labeled data in Roboflow to running training via the yolo CLI, validating results, and deploying to edge devices. The post includes code for running inference via the Roboflow API once your model is trained and deployed. If you're choosing a new detection model, RF-DETR now outperforms YOLOv8 on both speed and accuracy, trains in Roboflow without a notebook, and avoids YOLOv8's AGPL licensing requirements.\n💡\nWe open-sourced all the Python code used in this tutorial. You can find it in our\nRoboflow Notebooks\nrepository.\nOpen up the notebook and follow along.\nYOLOv8\nis a popular installment in the family of models that use the\nYOLO\n(You Only Look Once)\narchitecture\n. YOLOv8 was developed by the same team that created YOLOv3 and YOLOv5.\n📌\nYOLOv8 still works well, but newer models now outperform it. If you are starting a new project, consider\nRF-DETR\n(Apache 2.0 licensed) or\nYOLO26\nfor stronger speed and accuracy. The rest of this guide still applies if you are training YOLOv8.\nFollowing the trend set by  YOLOv6 and YOLOv7, we have at our disposal object detection, but also instance segmentation, and image classification.\nThe model itself is created in PyTorch and runs on both the CPU and GPU. As with YOLOv5, we also have a number of various exports such as TF.js or CoreML. See a deep dive into the\nYOLOv8 architecture here\n.\nWe are still waiting for the Papers with Code benchmark comparing YOLOv8 with the other SOTA real-time models. In the meantime, we matched v8 against YOLOv5 using the\nRF100 dataset\n. YOLOv8 scores higher 64% of the time, and when it performs worse, the difference is negligible.\nIn this tutorial, we will take you through each step of training the YOLOv8 object detection model on a custom dataset. You will learn how to use the new API, how to prepare the dataset, and most importantly how to train and validate the model.\nThe steps to train a YOLOv8 object detection model on custom data are:\nInstall YOLOv8 from pip\nCreate a custom dataset with labelled images\nExport your dataset for use with YOLOv8\nUse the yolo command line utility to run train a model\nRun inference with the YOLO command line application\n⚡\nRF-DETR Neural Architecture Search (NAS) is faster and more accurate than YOLOv8. Read the\nblog post here\n.\nYou can try a YOLOv8 model with the following Workflow:\nIn the Workflow above, you can drag and drop an image and the system will detect the objects in it using a YOLOv8 model. You can also see how the model compares to\nYOLO-World\n, a zero-shot model.\nLet's begin!\nHow to Install YOLOv8\nYOLOv8 can be installed in two ways :  from the source and via pip. This is because it is the first iteration of YOLO to have an official package.\nFrom pip (recommended)\nTo install YOLOv8 from pip, use the following command:\nShell\nCopy\npip\ninstall\n\"ultralytics<=8.3.40\"\nFrom source\nYou can install the model from the source on GitHub using these commands:\nShell\nCopy\ngit\nclone\nhttps://github.com/ultralytics/ultralytics\ncd\nultralytics\npip\ninstall\n-e\nultralytics\nThe New YOLOv8 API\nThe developers of YOLOv8 decided to break away from the standard YOLO project design : separate train.py, detect.py, val.py, and export.py scripts. In the short term it will probably cause some confusion while in the long term, it is a fantastic decision!\nThis pattern has been around since YOLOv3, and every YOLO iteration has replicated it. It was relatively simple to understand but notoriously challenging to deploy especially in real-time processing and tracking scenarios.\nThe new approach is much more flexible because it allows YOLOv8 to be used independently through the terminal, as well as being part of a complex computer vision application.\nThe YOLOv8 CLI\nYOLOv8 comes with a command line interface that lets you train, validate or infer models on various tasks and versions. The CLI requires no customization or code. You can run all tasks from the terminal. Usage is fairly similar to the scripts we are familiar with. The example below shows how to leverage the CLI to detect objects in a given image.\nShell\nCopy\nyolo\ntask=detect\n\\\nmode=predict\n\\\nmodel=yolov8n.pt\n\\\nconf=0.25\n\\\nsource=\n'https://media.roboflow.com/notebooks/examples/dog.jpeg'\nExpected inference result\nThe YOLOv8 Python SDK\nUltralytics YOLO comes with a pythonic Model and Trainer interface. This finally allows us to use the YOLO model inside a custom Python script in only a few lines of code. Something like this has been impossible until now without doing a repository fork and making your own changes to the code.\nPython\nCopy\nfrom\nultralytics\nimport\nYOLO\nmodel\n=\nYOLO(\n'yolov8n.pt'\n)\nmodel.predict(\nsource\n=\n'https://media.roboflow.com/notebooks/examples/dog.jpeg'\n,\nconf\n=\n0.25\n)\nPreparing a Custom Dataset for YOLOv8\nBuilding a custom dataset can be a painful process. It might take dozens or even hundreds of hours to collect images, label them, and export them in the proper format. Fortunately, Roboflow makes this process straightforward. Let me show you how!\nCreate a project\nBefore you start, you need to create a Roboflow\naccount\n. Once you do that, you can create a new project in the Roboflow dashboard. Keep in mind to choose the right project type. In this case choose, \"Object Detection\".\nUpload your images\nNext, add data to your newly created project. You can do it\nvia API\nor through our\nweb interface\n. If you don’t have a dataset, you can grab one from\nRoboflow Universe\nor use the\nfootball-players-detection\ndataset which we will be showing later in this tutorial.\nIf you drag and drop a directory with a dataset in a supported format, the Roboflow dashboard will automatically read the images and annotations together.\nLabel your images\nIf you only have images, you can label them in\nRoboflow Annotate\n. When starting from scratch, consider\nannotating large batches of images via API\nor use the\nmodel-assisted labeling\ntool to speed things up.\nGenerate a new version of your dataset\nNow that we have our images and annotations added, we can Generate a Dataset Version. When Generating a Version, you may elect to add preprocessing and augmentations. This step is entirely optional, however, it can allow you to improve the robustness of your model significantly.\nExport your dataset\nOnce the dataset version is generated, we have a hosted dataset we can load directly into our notebook for easy training.\nOne way to download a dataset from Roboflow Universe is to use our\npip package\n. You can generate the appropriate code snippet directly in our UI. On a dataset’s Universe home page, click the Download this Dataset button and select YOLO v5 PyTorch export format.\nAfter a few seconds, you will see a code similar to the one below, except with all the necessary parameters filled in. You can copy and paste it into your Jupyter Notebook or a similar environment. When you execute it, the dataset will be downloaded to your machine in the appropriate format. Magic!\nPython\nCopy\nfrom\nroboflow\nimport\nRoboflow\nrf\n=\nRoboflow(\napi_key\n=\n'YOUR_API_KEY'\n)\nproject\n=\nrf.workspace(\n'WORKSPACE'\n).project(\n'PROJECT'\n)\ndataset\n=\nproject.version(\n1\n).download(\n'yolov8'\n)\nTrain YOLOv8 on a Custom Dataset\nAfter pasting the dataset download snippet into your YOLOv8 Colab notebook, you are ready to begin the training process. You can do so using this command:\nShell\nCopy\nyolo\ntask=detect\n\\\nmode=train\n\\\nmodel=yolov8s.pt\n\\\ndata={\ndataset.location}/data.yaml\n\\\nepochs=100\n\\\nimgsz=640\nYour model will begin training and run for several minutes, or hours, depending on how big the dataset is and which training options you chose.\nHere are the results of training a player detection model with YOLOv8:\nThe confusion matrix returned after training\nKey metrics tracked by YOLOv8\nExample YOLOv8 inference on a validation batch\nValidate with a new model\nWhen the training is over, it is good practice to validate the new model on images it has not seen before. Therefore, when creating a dataset, we divide it into three parts, and one of them that we will use now as a test dataset.\nShell\nCopy\nyolo\ntask=detect\n\\\nmode=val\n\\\nmodel={\nHOME}/runs/detect/train/weights/best.pt\n\\\ndata={\ndataset.location}/data.yaml\nYOLOv8 model evaluation results\nPredict with a custom model\nTo predict data using a custom model, use the following command:\nShell\nCopy\nyolo\ntask=detect\n\\\nmode=predict\n\\\nmodel={\nHOME}/runs/detect/train/weights/best.pt\n\\\nconf=0.25\n\\\nsource={\ndataset.location}/test/images\nExample of YOLOv8 custom model inference results\nExport and Upload Weights\nOnce you have finished training your YOLOv8 model, you’ll have a set of trained weights ready for use with a\nhosted API endpoint\n. These weights will be in the “/runs/detect/train/weights/best.pt” folder of your project. You can upload your model weights to\nRoboflow Deploy\nwith the deploy() function in the\nRoboflow pip package\nto use your trained weights.\nTo upload model weights, add the following code to the “Inference with Custom Model” section in the notebook:\nPython\nCopy\nproject.version(\nDATASET_VERSION\n).deploy(\nmodel_type\n=\n”yolov8”,\nmodel_path\n=\nf”{\nHOME\n}\n/\nruns\n/\ndetect\n/\ntrain\n/\n”)\nReplace the DATASET_VERSION value with the version number associated with your project. If you downloaded your weights from Roboflow using the code snippet provided earlier, the “DATASET_VERSION” number is stored in the “dataset.version” value.\nWhen you run the code above, you’ll see a green checkmark appear next to the version for which you have uploaded weights. You will also see a label that says you uploaded your weights using the YOLOv8 weight upload feature:\nThe Roboflow dashboard showing that we uploaded our own YOLOv8 weights in the \"Model Type\" label.\nClick on \"Deploy\" in the sidebar of the Roboflow dashboard to see the deployment options available to you. Directly in the browser, you can test your model and share the model with others by sending them the URL.\nYou'll be able to test and show model performance by uploading an image or video:\nand by using your webcam, or by pasting in a YouTube link to a video on which you want to run inference.\nOnce you've uploaded the model weights, your custom trained YOLOv8 model can be built into production applications.\nYour trained model deploys to the Roboflow\nserverless API\nautomatically, so you can run inference in production without provisioning or managing any infrastructure. Install the\ninference-sdk\npackage and call your model in a few lines of Python:\nPython\nCopy\nfrom\ninference_sdk\nimport\nInferenceHTTPClient\nclient\n=\nInferenceHTTPClient(\napi_url\n=\n\"https://serverless.roboflow.com\"\n,\napi_key\n=\n\"YOUR_ROBOFLOW_API_KEY\"\n)\nresult\n=\nclient.infer(\n\"image.jpg\"\n,\nmodel_id\n=\n\"YOUR_MODEL_ID\"\n)\nprint\n(result)\nSet\nmodel_id\nto your trained model, for example\nyour-project/1\n. Grab your API key from your\nRoboflow API settings\n, or\nsign up for a free account\nto get started.\nDeploy Your YOLOv8 Model to the Edge\nIn addition to using the Roboflow hosted API for deployment, you can use\nRoboflow Inference\n, an open source inference solution that has powered millions of API calls in production environments. Inference works with CPU and GPU, giving you immediate access to a range of devices, from the NVIDIA Jetson to TRT-compatible devices to ARM CPU devices.\nWith Roboflow Inference, you can self-host and deploy your model, on-device and at the edge. You can deploy applications using the Inference Docker containers or the\npip package\n. In this guide, we are going to use the Inference Docker deployment solution. First, install\nDocker on your device\n. Then, review the Inference documentation to\nfind the Docker container for your device\n.\nFor this guide, we'll use the GPU Docker container:\nCopy\ndocker pull roboflow/roboflow-inference-server-gpu\nThis command will download the Docker container and start the inference server. This server is available at\nhttp://localhost:9001\n. To run inference, we can use the following Python code:\nCopy\nimport requests\nworkspace_id = \"\"\nmodel_id = \"\"\nimage_url = \"\"\nconfidence = 0.75\napi_key = \"\"\ninfer_payload = {\n\"image\": {\n\"type\": \"url\",\n\"value\": image_url,\n},\n\"confidence\": confidence,\n\"iou_threshold\": iou_thresh,\n\"api_key\": api_key,\n}\nres = requests.post(\nf\"http://localhost:9001/{workspace_id}/{model_id}\",\njson=infer_object_detection_payload,\n)\npredictions = res.json()\nAbove, set your Roboflow workspace ID, model ID, and API key.\nFind your workspace and model ID\nFind your API key\nAlso, set the URL of an image on which you want to run inference. This can be a local file.\nTo use your YOLOv8 model commercially with Inference, you need the Ultralytics model license, available as an add-on to a Roboflow Enterprise plan. Alternatively, train RF-DETR, whose core models are Apache 2.0 and free to self-host commercially. An enterprise license also grants you access to features like advanced device management, multi-model containers, auto-batch inference, and more.\nTo learn more about deploying commercial applications with Roboflow Inference,\ncontact the Roboflow sales team\n.\nRF-DETR\nmodels carry no such requirement, which is one reason many teams train it instead.\nTrain YOLOV8 Object Detection on a Custom Dataset\nThe YOLOv8 software is designed to be as intuitive as possible for developers to use. Now you have all you need to start training YOLOv8 models. Happy building!\nProduction object detection powers real deployments across industries, from\ndefect detection and quality control\nin\nmanufacturing\nto package tracking and warehouse automation in\nlogistics\n. A model trained with this workflow can move straight into those environments.\nExplore the latest YOLO models on Roboflow:\nYOLOv12\n,\nYOLO26\n, and\nYOLO27\n.",
  "metadata": {
    "title": "How to Train YOLOv8 Object Detection on a Custom Dataset | Roboflow",
    "description": "Train YOLOv8 on a custom dataset: label images in Roboflow, run one CLI command to train, validate mAP, and deploy to an API or edge device.",
    "keywords": null,
    "author": null,
    "og:title": "How to Train YOLOv8 Object Detection on a Custom Dataset",
    "og:description": "Train YOLOv8 on a custom dataset: label images in Roboflow, run one CLI command to train, validate mAP, and deploy to an API or edge device.",
    "og:url": "https://roboflow.com/blog/how-to-train-yolov8-on-a-custom-dataset",
    "og:site_name": "Roboflow",
    "og:image": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/2026/07/Screenshot-2026-07-20-at-5.08.07---PM.png",
    "og:type": "article",
    "twitter:card": "summary_large_image",
    "twitter:title": "How to Train YOLOv8 Object Detection on a Custom Dataset",
    "twitter:description": "Train YOLOv8 on a custom dataset: label images in Roboflow, run one CLI command to train, validate mAP, and deploy to an API or edge device.",
    "twitter:image": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/2026/07/Screenshot-2026-07-20-at-5.08.07---PM.png",
    "article:published_time": "2026-01-10T09:05:00.000+00:00",
    "article:modified_time": "2026-09-24T17:21:48.000+00:00"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/57d148585211/code/body-000.txt",
      "chars": 33,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-001.txt",
      "chars": 94,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-002.txt",
      "chars": 128,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-003.txt",
      "chars": 154,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-004.txt",
      "chars": 171,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-005.txt",
      "chars": 109,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-006.txt",
      "chars": 112,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-007.txt",
      "chars": 132,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-008.txt",
      "chars": 101,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-009.txt",
      "chars": 237,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-010.txt",
      "chars": 50,
      "language": "text"
    },
    {
      "file": "attachments/57d148585211/code/body-011.txt",
      "chars": 421,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w3840/format/webp/2022/11/photo_2022-11-17-18.22.41.jpeg",
      "bytes": 15300,
      "reused": true,
      "local_path": "attachments/57d148585211/images/000.jpeg",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w3840/format/webp/2022/11/photo_2022-11-17-18.22.41.jpeg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w3840/format/webp/2026/07/Screenshot-2026-07-20-at-5.08.07---PM.png",
      "bytes": 46228,
      "reused": true,
      "local_path": "attachments/57d148585211/images/015.png",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w3840/format/webp/2026/07/Screenshot-2026-07-20-at-5.08.07---PM.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1338.webp",
      "bytes": 91198,
      "reused": true,
      "local_path": "attachments/57d148585211/images/023.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1338.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/format/webp/2026/07/Screenshot-2026-07-20-at-5.01.27---PM.png",
      "bytes": 50266,
      "reused": true,
      "local_path": "attachments/57d148585211/images/026.png",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/format/webp/2026/07/Screenshot-2026-07-20-at-5.01.27---PM.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/format/webp/2026/07/Screenshot-2026-07-20-at-5.02.08---PM.png",
      "bytes": 24722,
      "reused": true,
      "local_path": "attachments/57d148585211/images/030.png",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/format/webp/2026/07/Screenshot-2026-07-20-at-5.02.08---PM.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1349.webp",
      "bytes": 10030,
      "reused": true,
      "local_path": "attachments/57d148585211/images/034.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1349.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1355.webp",
      "bytes": 32354,
      "reused": true,
      "local_path": "attachments/57d148585211/images/038.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1355.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2023/01/detection-tiles.webp",
      "bytes": 203546,
      "reused": false,
      "local_path": "attachments/57d148585211/images/body-1216285a38a6a9766fd7.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2023/01/detection-tiles.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1360.webp",
      "bytes": 29300,
      "reused": false,
      "local_path": "attachments/57d148585211/images/body-a8a1ea8ca3479b7d8959.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1360.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1364.webp",
      "bytes": 95150,
      "reused": false,
      "local_path": "attachments/57d148585211/images/body-da61d836712a707c3d2e.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1364.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1369.webp",
      "bytes": 17726,
      "reused": false,
      "local_path": "attachments/57d148585211/images/body-4bbdc10a375080124146.webp",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/images/size/w1000/2024/04/image-1369.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://i.ytimg.com/vi/wuZtUMEiKWY/maxresdefault.jpg",
      "bytes": 134644,
      "reused": false,
      "local_path": "attachments/57d148585211/images/body-9a1906a893c9bad678fd.jpg",
      "src": "https://i.ytimg.com/vi/wuZtUMEiKWY/maxresdefault.jpg",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [
    {
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--20-.mp4",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--20-.mp4",
      "status": "invalid_or_wrong_resolution",
      "kind": "direct_video",
      "bytes": 705328,
      "reused": true,
      "content_type": "video/mp4",
      "valid": true,
      "height": 528,
      "width": 960,
      "duration": "23.900000",
      "local_path": "attachments/57d148585211/videos/repair-1f44567e7e7b6a7c8d6b.mp4",
      "title": "",
      "retried_at": "2026-10-20T18:11:35Z"
    },
    {
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--21-.mp4",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--21-.mp4",
      "status": "invalid_or_wrong_resolution",
      "kind": "direct_video",
      "bytes": 713958,
      "reused": true,
      "content_type": "video/mp4",
      "valid": true,
      "height": 528,
      "width": 960,
      "duration": "17.650000",
      "local_path": "attachments/57d148585211/videos/repair-45192bb1e10287b4f206.mp4",
      "title": "",
      "retried_at": "2026-10-20T18:11:35Z"
    },
    {
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--22-.mp4",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--22-.mp4",
      "status": "invalid_or_wrong_resolution",
      "kind": "direct_video",
      "bytes": 204219,
      "reused": true,
      "content_type": "video/mp4",
      "valid": true,
      "height": 528,
      "width": 960,
      "duration": "7.100000",
      "local_path": "attachments/57d148585211/videos/repair-6a521eb0c20ec6f70cf8.mp4",
      "title": "",
      "retried_at": "2026-10-20T18:11:36Z"
    },
    {
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/Screen-Recording-2023-01-10-at-1.26.02-PM-1.mp4",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/Screen-Recording-2023-01-10-at-1.26.02-PM-1.mp4",
      "status": "invalid_or_wrong_resolution",
      "kind": "direct_video",
      "bytes": 989230,
      "reused": true,
      "content_type": "video/mp4",
      "valid": true,
      "height": 1218,
      "width": 2532,
      "duration": "8.850000",
      "local_path": "attachments/57d148585211/videos/repair-e5b9b1acdcbfc7b6e78c.mp4",
      "title": "",
      "retried_at": "2026-10-20T18:11:36Z"
    },
    {
      "url": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/Screen-Recording-2023-01-10-at-1.31.35-PM.mp4",
      "src": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/Screen-Recording-2023-01-10-at-1.31.35-PM.mp4",
      "status": "invalid_or_wrong_resolution",
      "kind": "direct_video",
      "bytes": 1182929,
      "reused": true,
      "content_type": "video/mp4",
      "valid": true,
      "height": 1350,
      "width": 2254,
      "duration": "3.983333",
      "local_path": "attachments/57d148585211/videos/repair-6dc5ecc49dd10d530319.mp4",
      "title": "",
      "retried_at": "2026-10-20T18:11:36Z"
    },
    {
      "url": "https://www.youtube.com/watch?v=wuZtUMEiKWY",
      "src": "https://www.youtube.com/watch?v=wuZtUMEiKWY",
      "status": "ok",
      "kind": "single_video",
      "local_path": "attachments/57d148585211/videos/repair-wuZtUMEiKWY.mp4",
      "bytes": 118937871,
      "valid": true,
      "height": 1080,
      "width": 1920,
      "duration": "1230.521000",
      "reused": true,
      "reused_from": "xinxing-zimeiti-corpus/attachments/e40f797fe91d/videos/wuZtUMEiKWY.mp4"
    }
  ],
  "links": [
    {
      "href": "https://roboflow.com/blog/author/skalskip",
      "label": "Piotr Skalski",
      "type": "a"
    },
    {
      "href": "https://github.com/roboflow/notebooks?ref=blog.roboflow.com",
      "label": "Roboflow Notebooks",
      "type": "a"
    },
    {
      "href": "https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/train-yolov8-object-detection-on-custom-dataset.ipynb?ref=blog.roboflow.com",
      "label": "Open up the notebook and follow along.",
      "type": "a"
    },
    {
      "href": "https://playground.roboflow.com/models/ultralytics/yolov8?ref=blog.roboflow.com",
      "label": "YOLOv8",
      "type": "a"
    },
    {
      "href": "https://blog.roboflow.com/guide-to-yolo-models/",
      "label": "YOLO",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/abs/1506.02640?ref=blog.roboflow.com",
      "label": "architecture",
      "type": "a"
    },
    {
      "href": "https://blog.roboflow.com/rf-detr/",
      "label": "RF-DETR",
      "type": "a"
    },
    {
      "href": "https://blog.roboflow.com/yolo26/",
      "label": "YOLO26",
      "type": "a"
    },
    {
      "href": "https://blog.roboflow.com/what-is-yolov8/",
      "label": "YOLOv8 architecture here",
      "type": "a"
    },
    {
      "href": "https://www.rf100.org/?ref=blog.roboflow.com",
      "label": "RF100 dataset",
      "type": "a"
    },
    {
      "href": "https://blog.roboflow.com/train-with-neural-architecture-search/",
      "label": "blog post here",
      "type": "a"
    },
    {
      "href": "https://rf-model-embed.vercel.app/how-to-train-yolov8-on-a-custom-dataset",
      "label": "",
      "type": "iframe"
    },
    {
      "href": "https://playground.roboflow.com/models/tencent%20ai%20lab/yolo-world?ref=blog.roboflow.com",
      "label": "YOLO-World",
      "type": "a"
    },
    {
      "href": "https://app.roboflow.com/login?ref=blog.roboflow.com",
      "label": "account",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/datasets/manage/manage-images?ref=blog.roboflow.com",
      "label": "via API",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/datasets/create-and-upload/adding-data?ref=blog.roboflow.com",
      "label": "web interface",
      "type": "a"
    },
    {
      "href": "https://universe.roboflow.com/?ref=blog.roboflow.com",
      "label": "Roboflow Universe",
      "type": "a"
    },
    {
      "href": "https://universe.roboflow.com/roboflow-jvuqo/football-players-detection-3zvbc/dataset/2?ref=blog.roboflow.com",
      "label": "football-players-detection",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/datasets/annotate/annotate?ref=blog.roboflow.com",
      "label": "Roboflow Annotate",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/datasets/annotate/annotate/ai-labeling/model-assisted-labeling?ref=blog.roboflow.com",
      "label": "model-assisted labeling",
      "type": "a"
    },
    {
      "href": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--20-.mp4",
      "label": "",
      "type": "video"
    },
    {
      "href": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--21-.mp4",
      "label": "",
      "type": "video"
    },
    {
      "href": "https://docs.roboflow.com/reference/platform/python-sdk?ref=blog.roboflow.com",
      "label": "pip package",
      "type": "a"
    },
    {
      "href": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/ezgif.com-gif-maker--22-.mp4",
      "label": "",
      "type": "video"
    },
    {
      "href": "https://docs.roboflow.com/deployment/legacy/legacy-serverless?ref=blog.roboflow.com",
      "label": "hosted API endpoint",
      "type": "a"
    },
    {
      "href": "https://roboflow.com/deploy?ref=blog.roboflow.com",
      "label": "Roboflow Deploy",
      "type": "a"
    },
    {
      "href": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/Screen-Recording-2023-01-10-at-1.26.02-PM-1.mp4",
      "label": "",
      "type": "video"
    },
    {
      "href": "https://storage.ghost.io/c/2c/8d/2c8d8c0d-1c15-4b6d-825e-02b78d61d40a/content/media/2023/01/Screen-Recording-2023-01-10-at-1.31.35-PM.mp4",
      "label": "",
      "type": "video"
    },
    {
      "href": "https://docs.roboflow.com/deployment/roboflow-cloud/serverless-api?ref=blog.roboflow.com",
      "label": "serverless API",
      "type": "a"
    },
    {
      "href": "https://app.roboflow.com/settings/api?ref=blog.roboflow.com",
      "label": "Roboflow API settings",
      "type": "a"
    },
    {
      "href": "https://app.roboflow.com/signup?ref=blog.roboflow.com",
      "label": "sign up for a free account",
      "type": "a"
    },
    {
      "href": "https://github.com/roboflow/inference?ref=blog.roboflow.com",
      "label": "Roboflow Inference",
      "type": "a"
    },
    {
      "href": "https://inference.roboflow.com/?ref=blog.roboflow.com",
      "label": "pip package",
      "type": "a"
    },
    {
      "href": "https://docs.docker.com/engine/install/?ref=blog.roboflow.com",
      "label": "Docker on your device",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/deployment/self-hosted/inference-server?ref=blog.roboflow.com",
      "label": "find the Docker container for your device",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/reference/authentication/authentication/workspace-and-project-ids?ref=blog.roboflow.com",
      "label": "Find your workspace and model ID",
      "type": "a"
    },
    {
      "href": "https://docs.roboflow.com/reference/platform/rest-api/authenticate-with-the-rest-api?ref=blog.roboflow.com",
      "label": "Find your API key",
      "type": "a"
    },
    {
      "href": "https://roboflow.com/sales?ref=blog.roboflow.com",
      "label": "contact the Roboflow sales team",
      "type": "a"
    },
    {
      "href": "https://playground.roboflow.com/models/roboflow/rf-detr?ref=blog.roboflow.com",
      "label": "RF-DETR",
      "type": "a"
    },
    {
      "href": "https://roboflow.com/ai/wafer-surface-defect-detection?ref=blog.roboflow.com",
      "label": "defect detection and quality control",
      "type": "a"
    },
    {
      "href": "https://roboflow.com/industries/manufacturing?ref=blog.roboflow.com",
      "label": "manufacturing",
      "type": "a"
    },
    {
      "href": "https://roboflow.com/industries/logistics?ref=blog.roboflow.com",
      "label": "logistics",
      "type": "a"
    },
    {
      "href": "https://playground.roboflow.com/models/thu-mig/yolov12?ref=blog.roboflow.com",
      "label": "YOLOv12",
      "type": "a"
    },
    {
      "href": "https://blog.roboflow.com/what-is-yolo27/",
      "label": "YOLO27",
      "type": "a"
    },
    {
      "href": "https://www.youtube.com/watch?v=wuZtUMEiKWY",
      "label": "",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:54:51Z",
  "source_url": "https://blog.roboflow.com/how-to-train-yolov8-on-a-custom-dataset/",
  "papers": [
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1506.02640",
      "bytes": 5296750,
      "reused": true,
      "local_path": "papers/repair/27e378fce20ee7c0b279.pdf"
    }
  ],
  "actual_video_files": [],
  "body_chars": 13888,
  "expected_body_images": 12,
  "discovery_status": "ok",
  "delivery_status": "partial",
  "missing_reason": "invalid_or_wrong_resolution",
  "raw_html": "attachments/57d148585211/pages/source.html",
  "local_html": "attachments/57d148585211/pages/article.html",
  "body_base_path": "attachments/57d148585211/pages/",
  "body_markdown_path": "attachments/57d148585211/pages/article.md"
}