项目文件夹

文件
wehub-resource-sync 16031aae96
CPU tests Workflow / Testing (ubuntu-latest, 3.12) (push) Failing after 1s
CPU tests Workflow / Testing (ubuntu-latest, 3.13) (push) Failing after 0s
Mypy Type Check / Type Check (push) Failing after 0s
Docs/Test WorkFlow / Test docs build (push) Failing after 1s
PR Conflict Labeler / labeling (push) Failing after 1s
Dependency resolution / Resolve [tflite] extra — Python 3.12 (push) Failing after 0s
Smoke Tests / try-all-models (ubuntu-latest, 3.10) (push) Failing after 0s
Smoke Tests / try-all-models (ubuntu-latest, 3.13) (push) Failing after 1s
CPU tests Workflow / build-pkg (push) Failing after 1s
CPU tests Workflow / Testing (ubuntu-latest, 3.10) (push) Failing after 0s
CPU tests Workflow / Testing (ubuntu-latest, 3.11) (push) Failing after 0s
Smoke Tests / try-all-models (macos-latest, 3.10) (push) Has been cancelled
Smoke Tests / try-all-models (macos-latest, 3.13) (push) Has been cancelled
Smoke Tests / try-all-models (windows-latest, 3.10) (push) Has been cancelled
Smoke Tests / try-all-models (windows-latest, 3.13) (push) Has been cancelled
CPU tests Workflow / Testing (macos-latest, 3.10) (push) Has been cancelled
CPU tests Workflow / Testing (macos-latest, 3.13) (push) Has been cancelled
CPU tests Workflow / Testing (windows-latest, 3.10) (push) Has been cancelled
CPU tests Workflow / Testing (windows-latest, 3.13) (push) Has been cancelled
CPU tests Workflow / testing-guardian (push) Has been cancelled
GPU tests Workflow / Testing (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:26:24 +08:00

418 行
13 KiB
Plaintext

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
{
"cells": [
{
"cell_type": "markdown",
"id": "0f72b166",
"metadata": {},
"source": [
"# Custom Augmentations and Live Training Progress\n",
"\n",
"[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/roboflow/rf-detr/blob/develop/docs/cookbooks/custom-augmentations.ipynb)\n",
"\n",
"**RF-DETR** is a real-time object detection model that combines the accuracy of\n",
"transformer-based detectors with inference speeds suitable for production.\n",
"1.5.0 brings two headline additions:\n",
"\n",
"1. **Custom training augmentations via Albumentations** — a flexible system that\n",
" lets you control exactly how images are transformed during training, with bounding\n",
" boxes and segmentation masks kept in sync automatically. Four ready-made presets\n",
" cover the most common scenarios out of the box.\n",
"2. **Live progress bars and structured epoch logs** — per-epoch rich / tqdm progress\n",
" so you can monitor batch-level metrics without parsing raw log output.\n",
"\n",
"You will learn how to:\n",
"- Explore and compare the four built-in augmentation presets\n",
"- Visually inspect augmented samples *before* committing to a full training run\n",
"- Define a fully custom augmentation pipeline\n",
"- Train RF-DETR with your chosen augmentation config\n",
"- Run inference with the trained model"
]
},
{
"cell_type": "markdown",
"id": "49ad10f9",
"metadata": {},
"source": [
"## 1. Install RF-DETR 1.5.0\n",
"\n",
"`rfdetr` includes the augmentation system and progress-bar support introduced in\n",
"this release. `supervision` handles visualization."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5c1df817",
"metadata": {},
"outputs": [],
"source": [
"!pip install -q rfdetr==1.5.0"
]
},
{
"cell_type": "markdown",
"id": "075cf0b4",
"metadata": {},
"source": [
"## 2. Check GPU availability\n",
"\n",
"RF-DETR trains on GPU when one is available and falls back to CPU otherwise.\n",
"The cell below detects your device and prints VRAM size — a useful sanity check\n",
"before choosing batch size."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d005aa12",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"\n",
"import torch\n",
"\n",
"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
"print(f\"Using device: {device}\")\n",
"if device == \"cuda\":\n",
" print(f\"GPU: {torch.cuda.get_device_name(0)}\")\n",
" print(f\"VRAM: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB\")\n",
"\n",
"# Scale data-loader workers with available CPUs so the GPU is kept fed.\n",
"num_workers = max(os.cpu_count() or 0, 2)\n",
"print(f\"Data loader workers: {num_workers}\")"
]
},
{
"cell_type": "markdown",
"id": "c926124e",
"metadata": {},
"source": [
"## 3. Download COCO 2017\n",
"\n",
"We use the official train/val splits — no manual splitting needed.\n",
"\n",
"| Split | Images | Size |\n",
"|---|---|---|\n",
"| `train2017` | ~118 000 | ~18 GB |\n",
"| `val2017` | 5 000 | ~1 GB |\n",
"| annotations | — | ~241 MB |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a3cc746d",
"metadata": {},
"outputs": [],
"source": [
"!wget -q --show-progress http://images.cocodataset.org/zips/train2017.zip -O train2017.zip\n",
"!wget -q --show-progress http://images.cocodataset.org/zips/val2017.zip -O val2017.zip\n",
"!wget -q --show-progress http://images.cocodataset.org/annotations/annotations_trainval2017.zip -O annotations.zip"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "985d1e18",
"metadata": {},
"outputs": [],
"source": [
"!unzip -q train2017.zip\n",
"!unzip -q val2017.zip\n",
"!unzip -q annotations.zip"
]
},
{
"cell_type": "markdown",
"id": "27b7ae27",
"metadata": {},
"source": [
"### Set up the dataset directory structure\n",
"\n",
"`model.train()` expects:\n",
"```\n",
"dataset/\n",
" train/ _annotations.coco.json + images\n",
" valid/ _annotations.coco.json + images\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "da25896a",
"metadata": {},
"outputs": [],
"source": [
"!mkdir -p coco_demo\n",
"!mv train2017 coco_demo/train\n",
"!mv val2017 coco_demo/valid\n",
"!cp annotations/instances_train2017.json coco_demo/train/_annotations.coco.json\n",
"!cp annotations/instances_val2017.json coco_demo/valid/_annotations.coco.json"
]
},
{
"cell_type": "markdown",
"id": "69343c86",
"metadata": {},
"source": [
"## 4. Explore the built-in augmentation presets\n",
"\n",
"RF-DETR ships four ready-made presets tuned for common use cases. Each preset\n",
"is a plain Python dict mapping Albumentations transform names to their constructor\n",
"kwargs (including `p`, the probability of applying the transform). You can\n",
"inspect, merge, or extend them like any other dict.\n",
"\n",
"| Preset | When to use |\n",
"|---|---|\n",
"| `AUG_CONSERVATIVE` | Small datasets (< 500 images) — gentle transforms to avoid overfitting |\n",
"| `AUG_AGGRESSIVE` | Large datasets (2 000+ images) — stronger augmentations for better generalisation |\n",
"| `AUG_AERIAL` | Satellite and overhead imagery — rotation-invariant transforms |\n",
"| `AUG_INDUSTRIAL` | Manufacturing and inspection data — handles structured textures |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "409e006a",
"metadata": {},
"outputs": [],
"source": [
"import rfdetr.datasets.aug_configs as aug_config\n",
"from rfdetr.datasets.aug_configs import AUG_AGGRESSIVE\n",
"\n",
"for name in (\"AUG_CONSERVATIVE\", \"AUG_AGGRESSIVE\", \"AUG_AERIAL\", \"AUG_INDUSTRIAL\"):\n",
" preset = getattr(aug_config, name)\n",
" print(f\"\\n{name}:\")\n",
" for transform, params in preset.items():\n",
" print(f\" {transform}: {params}\")"
]
},
{
"cell_type": "markdown",
"id": "d10837d5",
"metadata": {},
"source": [
"## 5. Inspect augmented samples before training\n",
"\n",
"Setting `save_dataset_grids=True` writes 3×3 JPEG grids of augmented training\n",
"and validation images to `output_dir` *before any weight updates occur*. Use\n",
"this to visually sanity-check your pipeline in seconds — catching problems like\n",
"flipped labels or extreme colour shifts before committing to a full training run.\n",
"\n",
"Saved files:\n",
"```\n",
"output/\n",
" train_batch0_grid.jpg train_batch1_grid.jpg train_batch2_grid.jpg\n",
" val_batch0_grid.jpg val_batch1_grid.jpg val_batch2_grid.jpg\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d7797651",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"\n",
"from rfdetr import RFDETRNano # smallest & fastest model — ideal for demos\n",
"\n",
"DATASET_DIR = \"coco_demo\"\n",
"OUTPUT_DIR = \"output\"\n",
"os.makedirs(OUTPUT_DIR, exist_ok=True)\n",
"\n",
"model = RFDETRNano()\n",
"model.train(\n",
" dataset_dir=str(DATASET_DIR),\n",
" epochs=1, # one epoch is enough to generate the grids\n",
" batch_size=12,\n",
" aug_config=AUG_AGGRESSIVE,\n",
" save_dataset_grids=True,\n",
" output_dir=OUTPUT_DIR,\n",
" device=device,\n",
" num_workers=num_workers,\n",
" run_test=False,\n",
")"
]
},
{
"cell_type": "markdown",
"id": "7b7cb782",
"metadata": {},
"source": [
"### Display the saved grids inline"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "28df5b59",
"metadata": {},
"outputs": [],
"source": [
"from pathlib import Path\n",
"\n",
"%matplotlib inline\n",
"\n",
"import matplotlib.image as mpimg\n",
"import matplotlib.pyplot as plt\n",
"\n",
"grids = sorted(Path(OUTPUT_DIR).glob(\"*_grid.jpg\"))\n",
"if grids:\n",
" fig, axes = plt.subplots(len(grids), 1, figsize=(6, 6 * len(grids)))\n",
" if len(grids) == 1:\n",
" axes = [axes]\n",
" for ax, grid_path in zip(axes, grids):\n",
" ax.imshow(mpimg.imread(grid_path))\n",
" ax.set_title(grid_path.name)\n",
" ax.axis(\"off\")\n",
" plt.tight_layout()\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"id": "d7f10179",
"metadata": {},
"source": [
"## 6. Choose your augmentation config\n",
"\n",
"Pick one of the four options below. Option A (a built-in preset) is the fastest\n",
"way to get started. Options B–D give increasing levels of control. The selected\n",
"`AUG_CONFIG` is passed straight to `model.train()` in the next section."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f62b76de",
"metadata": {},
"outputs": [],
"source": [
"# --- Option A: built-in preset ---\n",
"AUG_CONFIG = AUG_AGGRESSIVE\n",
"\n",
"# --- Option B: extend a preset ---\n",
"# AUG_CONFIG = {**AUG_AGGRESSIVE, \"VerticalFlip\": {\"p\": 0.3}}\n",
"\n",
"# --- Option C: fully custom ---\n",
"# AUG_CONFIG = {\n",
"# \"HorizontalFlip\": {\"p\": 0.5},\n",
"# \"Rotate\": {\"limit\": 15, \"p\": 0.3},\n",
"# \"RandomBrightnessContrast\": {\"brightness_limit\": 0.2, \"contrast_limit\": 0.2, \"p\": 0.4},\n",
"# \"GaussianBlur\": {\"blur_limit\": 3, \"p\": 0.2},\n",
"# }\n",
"\n",
"# --- Option D: no augmentations ---\n",
"# AUG_CONFIG = {}\n",
"\n",
"print(\"Selected augmentation config:\")\n",
"for transform, params in AUG_CONFIG.items():\n",
" print(f\" {transform}: {params}\")"
]
},
{
"cell_type": "markdown",
"id": "5a5ff7b9",
"metadata": {},
"source": [
"## 7. Train with augmentations\n",
"\n",
"Run a full training pass with the augmentation config chosen above. The\n",
"`progress_bar=\"rich\"` setting activates per-epoch live progress bars — a batch\n",
"counter, loss, and learning rate are updated in real time. Structured metric\n",
"tables are printed at the end of each epoch.\n",
"\n",
"`aug_config` accepts any dict of Albumentations transforms, including the\n",
"`AUG_CONFIG` defined above. Passing `{}` disables all augmentations."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "79d29fd9",
"metadata": {},
"outputs": [],
"source": [
"model = RFDETRNano()\n",
"model.train(\n",
" dataset_dir=str(DATASET_DIR),\n",
" epochs=2,\n",
" batch_size=24,\n",
" aug_config=AUG_CONFIG,\n",
" output_dir=OUTPUT_DIR,\n",
" device=device,\n",
" num_workers=num_workers,\n",
" progress_bar=\"rich\",\n",
" run_test=False,\n",
")"
]
},
{
"cell_type": "markdown",
"id": "beccaf40",
"metadata": {},
"source": [
"## 8. Run inference\n",
"\n",
"Load a sample image and run `model.predict()`. The method returns a\n",
"`supervision.Detections` object, which makes it straightforward to draw\n",
"bounding boxes and labels with the `supervision` annotators."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d79c7612",
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import supervision as sv\n",
"from PIL import Image\n",
"\n",
"from rfdetr.util.coco_classes import COCO_CLASSES\n",
"\n",
"image_url = \"https://media.roboflow.com/dog.jpg\"\n",
"image = Image.open(requests.get(image_url, stream=True).raw)\n",
"\n",
"detections = model.predict(image, threshold=0.5)\n",
"\n",
"labels = [COCO_CLASSES[class_id] for class_id in detections.class_id]\n",
"annotated = sv.BoxAnnotator().annotate(image.copy(), detections)\n",
"annotated = sv.LabelAnnotator().annotate(annotated, detections, labels)\n",
"sv.plot_image(annotated)"
]
},
{
"cell_type": "markdown",
"id": "d69f8215",
"metadata": {},
"source": [
"## 9. Next steps\n",
"\n",
"You have seen the complete 1.5.0 augmentation workflow — from exploring presets\n",
"through live inspection to a full training run. From here:\n",
"\n",
"- [Augmentation docs](https://rfdetr.roboflow.com/1.5.0/learn/train/augmentations/) — full transform reference and custom pipeline guide\n",
"- [Advanced training options](https://rfdetr.roboflow.com/1.5.0/learn/train/advanced/) — EMA, gradient accumulation, learning rate schedules\n",
"- [Logger integrations (ClearML, MLflow, W&B)](https://rfdetr.roboflow.com/1.5.0/learn/train/loggers/) — experiment tracking\n",
"- [Export your model](https://rfdetr.roboflow.com/1.5.0/learn/export/) — ONNX, TensorRT, CoreML\n",
"- [RF-DETR 1.6.0 notebook](https://colab.research.google.com/github/roboflow/rf-detr/blob/develop/notebooks/release-demo_1-6.ipynb) — PyTorch Lightning building blocks"
]
}
],
"metadata": {
"jupytext": {
"cell_metadata_filter": "-all",
"formats": "ipynb,py",
"main_language": "python"
}
},
"nbformat": 4,
"nbformat_minor": 5
}