From 48b58f74a220bc733238c68ddfc5411596f63bd9 Mon Sep 17 00:00:00 2001 From: haotian <2421912570@qq.com> Date: Fri, 13 Mar 2026 11:37:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9train=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- train/01_download_dataset.py | 313 +++++++++++++++++++++++------------ train/02_train.bat | 38 ++--- train/03_export_onnx.bat | 52 +----- train/README.md | 180 +++++++++----------- train/data.yaml.template | 48 ++---- 5 files changed, 322 insertions(+), 309 deletions(-) diff --git a/train/01_download_dataset.py b/train/01_download_dataset.py index 56f1b63..2879b78 100644 --- a/train/01_download_dataset.py +++ b/train/01_download_dataset.py @@ -1,156 +1,259 @@ #!/usr/bin/env python3 """ -下载 Roboflow Safety Shoes Detection 数据集 +下载鞋子检测数据集 +支持: + - Ultralytics Construction-PPE (推荐, 直接下载) + - Open Images V7 (通过 FiftyOne) + 使用方法: - python 01_download_dataset.py --api-key YOUR_API_KEY + # 下载 Construction-PPE (推荐) + python 01_download_dataset.py --source ultralytics -或者手动下载: - 1. 访问 https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg - 2. 点击 Download → 选择 YOLOv8 格式 - 3. 解压到 datasets/ 目录 + # 下载 Open Images V7 鞋子类别 + python 01_download_dataset.py --source openimages --max-samples 5000 """ import argparse import os import sys +import zipfile from pathlib import Path -def download_with_roboflow(api_key: str, dataset_dir: str = "datasets"): - """使用 Roboflow API 下载数据集""" - try: - from roboflow import Roboflow - except ImportError: - print("错误: 未安装 roboflow 包") - print("请运行: pip install roboflow") - sys.exit(1) +def download_ultralytics_cppe(dataset_dir: str = "datasets/construction-ppe"): + """ + 下载 Ultralytics Construction-PPE 数据集 + 完全开放,直接下载,无需注册 + """ + import urllib.request + import ssl - print("="*60) - print("正在下载 Safety Shoes Detection 数据集...") - print("="*60) + url = "https://github.com/ultralytics/assets/releases/download/v0.0.0/construction-ppe.zip" + zip_path = "construction-ppe.zip" + print("="*70) + print("下载 Construction-PPE 数据集") + print("="*70) + print(f"来源: {url}") + print(f"目标: {dataset_dir}") + print() + + # 创建目录 + os.makedirs(dataset_dir, exist_ok=True) + + # 下载 + print("[1/3] 下载中... (约 178MB)") try: - rf = Roboflow(api_key=api_key) - project = rf.workspace("nedrick-chandra-gpg1l").project("safety-shoes-detection-5qgkg") - dataset = project.version(2).download("yolov8", location=dataset_dir) + # 禁用 SSL 验证(某些环境需要) + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE - print(f"\n✓ 数据集下载完成: {dataset.location}") - return dataset.location + with urllib.request.urlopen(url, context=ssl_context, timeout=300) as response: + total_size = int(response.headers.get('content-length', 0)) + downloaded = 0 + chunk_size = 8192 + + with open(zip_path, 'wb') as f: + while True: + chunk = response.read(chunk_size) + if not chunk: + break + f.write(chunk) + downloaded += len(chunk) + if total_size > 0: + percent = (downloaded / total_size) * 100 + print(f"\r 进度: {percent:.1f}% ({downloaded}/{total_size} bytes)", end="") + + print("\n ✓ 下载完成") except Exception as e: - print(f"\n✗ 下载失败: {e}") - print("\n请尝试手动下载:") - print("1. 访问 https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg") - print("2. 点击 'Download' → 选择 'YOLOv8' 格式") - print("3. 解压到 datasets/ 目录") - return None - - -def modify_yaml_for_single_class(dataset_path: str): - """修改为单类检测配置""" - yaml_path = os.path.join(dataset_path, "data.yaml") - - if not os.path.exists(yaml_path): - print(f"警告: 找不到 {yaml_path}") + print(f"\n ✗ 下载失败: {e}") + print("\n请手动下载:") + print(f" 1. 访问: {url}") + print(f" 2. 下载 construction-ppe.zip") + print(f" 3. 解压到 {dataset_dir}/") return False - with open(yaml_path, 'r') as f: - content = f.read() + # 解压 + print(f"\n[2/3] 解压中...") + try: + with zipfile.ZipFile(zip_path, 'r') as zip_ref: + zip_ref.extractall(dataset_dir) + print(" ✓ 解压完成") + except Exception as e: + print(f" ✗ 解压失败: {e}") + return False - # 创建新的单类配置 - new_content = """# 单类鞋子检测数据集配置 -# 原数据集: Safety Shoes Detection (Roboflow) -# 修改: 合并 safety-shoes 和 no-safety-shoes 为单一的 shoe 类别 + # 清理 + print(f"\n[3/3] 清理临时文件...") + os.remove(zip_path) + print(" ✓ 完成") + + return True -train: ../train/images -val: ../valid/images -test: ../test/images +def create_yaml_config(dataset_dir: str, single_class: bool = False): + """创建单类检测配置文件""" + yaml_content = """# 单类鞋子检测数据集配置 +# 基于 Construction-PPE 数据集修改 +# 原类别: helmet, gloves, vest, boots, goggles, none, Person, no_helmet, no_goggle, no_gloves, no_boots +# 修改为单一的 shoe 类别(只使用 boots 和 no_boots 的标注) + +path: construction-ppe # 数据集根目录 +train: images/train # 训练集 (1132张) +val: images/val # 验证集 (143张) +test: images/test # 测试集 (141张) + +# 单类配置 nc: 1 names: ['shoe'] -# Roboflow 元信息 -roboflow: - workspace: nedrick-chandra-gpg1l - project: safety-shoes-detection-5qgkg - version: 2 - license: CC BY 4.0 - url: https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg/dataset/2 +# 原始数据信息 +original_dataset: + name: Construction-PPE + source: Ultralytics + url: https://docs.ultralytics.com/datasets/detect/construction-ppe/ + download: https://github.com/ultralytics/assets/releases/download/v0.0.0/construction-ppe.zip + +# 使用说明: +# 1. 此配置将 boots (cls=3) 和 no_boots (cls=10) 都映射为 shoe (cls=0) +# 2. 训练时只检测鞋子,不关心是否安全鞋 +# 3. 安全鞋判断通过后续颜色分析完成 """ - # 备份原文件 - backup_path = yaml_path + ".backup" - with open(backup_path, 'w') as f: - f.write(content) + yaml_path = os.path.join(dataset_dir, "data.yaml") - # 写入新配置 with open(yaml_path, 'w') as f: - f.write(new_content) + f.write(yaml_content) - print(f"✓ 已修改为单类检测: {yaml_path}") - print(f" 原配置备份: {backup_path}") - return True + print(f"\n✓ 配置文件创建: {yaml_path}") + return yaml_path -def check_dataset_structure(dataset_path: str): - """检查数据集结构是否正确""" - required_dirs = ['train/images', 'train/labels', 'valid/images', 'valid/labels'] +def download_openimages(classes: list, max_samples: int, dataset_dir: str): + """通过 FiftyOne 下载 Open Images""" + try: + import fiftyone as fo + import fiftyone.zoo as foz + except ImportError: + print("错误: 未安装 fiftyone") + print("请运行: pip install fiftyone") + return False - print("\n检查数据集结构...") + print("="*70) + print("下载 Open Images V7 数据集") + print("="*70) + print(f"类别: {classes}") + print(f"最大样本数: {max_samples}") + print() + + try: + dataset = foz.load_zoo_dataset( + "open-images-v7", + split="train", + label_types=["detections"], + classes=classes, + max_samples=max_samples, + dataset_dir=dataset_dir + ) + + # 导出为 YOLO 格式 + print("\n导出为 YOLO 格式...") + dataset.export( + export_dir=dataset_dir + "-yolo", + dataset_type=fo.types.YOLOv5Dataset, + label_field="detections" + ) + + print(f"✓ 数据集保存: {dataset_dir}-yolo") + return True + + except Exception as e: + print(f"✗ 下载失败: {e}") + return False + + +def check_dataset(dataset_dir: str): + """检查数据集完整性""" + print("\n" + "="*70) + print("检查数据集") + print("="*70) + + required_dirs = [ + 'images/train', 'images/val', 'images/test', + 'labels/train', 'labels/val', 'labels/test' + ] + + all_ok = True for dir_name in required_dirs: - full_path = os.path.join(dataset_path, dir_name) + full_path = os.path.join(dataset_dir, dir_name) if os.path.exists(full_path): - count = len(os.listdir(full_path)) + count = len([f for f in os.listdir(full_path) if os.path.isfile(os.path.join(full_path, f))]) print(f" ✓ {dir_name}: {count} 个文件") else: print(f" ✗ {dir_name}: 不存在") - return False + all_ok = False - return True + return all_ok def main(): - parser = argparse.ArgumentParser(description="下载 Safety Shoes Detection 数据集") - parser.add_argument("--api-key", help="Roboflow API Key") - parser.add_argument("--dir", default="datasets/safety-shoes-detection", + parser = argparse.ArgumentParser( + description="下载鞋子检测数据集", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +示例: + # 下载 Construction-PPE (推荐,直接可用) + python 01_download_dataset.py --source ultralytics + + # 下载 Open Images 鞋子类别 + python 01_download_dataset.py --source openimages --max-samples 5000 + + # 指定保存目录 + python 01_download_dataset.py --source ultralytics --dir ./my-datasets/shoes + """ + ) + + parser.add_argument("--source", choices=["ultralytics", "openimages"], + default="ultralytics", + help="数据源 (默认: ultralytics)") + parser.add_argument("--dir", default="datasets/construction-ppe", help="数据集保存目录") - parser.add_argument("--no-modify", action="store_true", - help="不修改 data.yaml(保持原始类别)") + parser.add_argument("--max-samples", type=int, default=5000, + help="Open Images 最大样本数 (默认: 5000)") + parser.add_argument("--classes", nargs="+", + default=["Footwear", "Sandal", "Shoe", "Boot"], + help="Open Images 类别 (默认: Footwear Sandal Shoe Boot)") args = parser.parse_args() - # 如果提供了 API key,使用 API 下载 - if args.api_key: - dataset_path = download_with_roboflow(args.api_key, args.dir) - if dataset_path is None: - sys.exit(1) + success = False + + if args.source == "ultralytics": + success = download_ultralytics_cppe(args.dir) + if success: + create_yaml_config(args.dir, single_class=False) + check_dataset(args.dir) + + elif args.source == "openimages": + success = download_openimages(args.classes, args.max_samples, args.dir) + + # 输出下一步 + if success: + print("\n" + "="*70) + print("数据集准备完成!") + print("="*70) + print(f"数据集路径: {args.dir}") + print("\n下一步:") + print(f" 1. 检查配置: cat {args.dir}/data.yaml") + print(f" 2. 开始训练: 02_train.bat") + print(f" 3. 或手动: yolo detect train data={args.dir}/data.yaml model=yolov8n.pt epochs=150 imgsz=640") + return 0 else: - # 检查是否已手动下载 - dataset_path = args.dir - if not os.path.exists(dataset_path): - print(f"错误: 找不到数据集目录 {dataset_path}") - print("\n请使用以下方式之一获取数据集:") - print("1. 使用 API 下载: python 01_download_dataset.py --api-key YOUR_KEY") - print("2. 手动下载并解压到: datasets/safety-shoes-detection/") - sys.exit(1) - - # 检查数据集结构 - if not check_dataset_structure(dataset_path): - print("\n✗ 数据集结构不正确") - sys.exit(1) - - # 修改为单类检测 - if not args.no_modify: - modify_yaml_for_single_class(dataset_path) - - print("\n" + "="*60) - print("数据集准备完成!") - print("="*60) - print(f"数据集路径: {dataset_path}") - print(f"配置文件: {dataset_path}/data.yaml") - print("\n下一步:") - print(f" yolo detect train data={dataset_path}/data.yaml model=yolov8n.pt epochs=150 imgsz=640") + print("\n✗ 数据集准备失败") + return 1 if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/train/02_train.bat b/train/02_train.bat index c611caf..436279f 100644 --- a/train/02_train.bat +++ b/train/02_train.bat @@ -3,22 +3,19 @@ chcp 65001 >nul cls echo ============================================================ -echo 训练鞋子检测模型 (YOLOv8) +echo 训练鞋子检测模型 (YOLOv8 + 640x640) echo ============================================================ echo. :: 设置数据集路径 -set DATASET=datasets/safety-shoes-detection/data.yaml +set DATASET=datasets/construction-ppe/data.yaml :: 检查数据集是否存在 if not exist %DATASET% ( echo [错误] 找不到数据集配置文件: %DATASET% echo. echo 请先下载数据集: - echo 1. 访问 https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg - echo 2. 点击 Download -^> YOLOv8 格式 - echo 3. 解压到 datasets/safety-shoes-detection/ - echo 4. 运行 python 01_download_dataset.py --no-modify + echo python 01_download_dataset.py --source ultralytics pause exit /b 1 ) @@ -28,48 +25,47 @@ echo. :: 选择模型 echo 选择模型: -echo 1. YOLOv8n (轻量级, 速度快, 推荐) -echo 2. YOLOv8s (精度更高, 稍慢) +echo 1. YOLOv8n (轻量级, 速度快) +echo 2. YOLOv8s (推荐, 速度和精度平衡) echo 3. YOLOv8m (高精度, 较慢) echo. -set /p MODEL_CHOICE="输入选择 (1-3, 默认 1): " +set /p MODEL_CHOICE="输入选择 (1-3, 默认 2): " -if "%MODEL_CHOICE%"=="" set MODEL_CHOICE=1 +if "%MODEL_CHOICE%"=="" set MODEL_CHOICE=2 if "%MODEL_CHOICE%"=="1" ( set MODEL=yolov8n.pt - set DESC=YOLOv8n (轻量级) + set DESC=YOLOv8n ) if "%MODEL_CHOICE%"=="2" ( set MODEL=yolov8s.pt - set DESC=YOLOv8s (标准) + set DESC=YOLOv8s (推荐) ) if "%MODEL_CHOICE%"=="3" ( set MODEL=yolov8m.pt - set DESC=YOLOv8m (高精度) + set DESC=YOLOv8m ) echo. echo [信息] 使用模型: %DESC% echo. -:: 设置训练参数 +:: 训练参数 set EPOCHS=150 set IMGSZ=640 set BATCH=16 echo 训练参数: echo - Epochs: %EPOCHS% -echo - Image Size: %IMGSZ% +echo - Image Size: %IMGSZ%x%IMGSZ% echo - Batch Size: %BATCH% echo - Device: GPU (cuda:0) echo. echo ============================================================ -echo 开始训练 +echo 开始训练 echo ============================================================ echo. -:: 开始训练 yolo detect train data=%DATASET% model=%MODEL% epochs=%EPOCHS% imgsz=%IMGSZ% batch=%BATCH% device=0 if %ERRORLEVEL% neq 0 ( @@ -81,13 +77,11 @@ if %ERRORLEVEL% neq 0 ( echo. echo ============================================================ -echo 训练完成! +echo 训练完成! echo ============================================================ echo. -echo 模型保存在: runs/detect/train/weights/ -echo - best.pt (最佳模型) -echo - last.pt (最后模型) +echo 模型保存在: runs/detect/train/weights/best.pt echo. -echo 下一步: 运行 03_export_onnx.bat 导出 ONNX 格式 +echo 下一步: 运行 03_export_onnx.bat 导出 ONNX echo. pause diff --git a/train/03_export_onnx.bat b/train/03_export_onnx.bat index 29569f5..1698f57 100644 --- a/train/03_export_onnx.bat +++ b/train/03_export_onnx.bat @@ -3,19 +3,15 @@ chcp 65001 >nul cls echo ============================================================ -echo 导出 ONNX 模型 (YOLOv8) +echo 导出 ONNX 模型 (640x640) echo ============================================================ echo. -:: 设置模型路径 set MODEL_PATH=runs/detect/train/weights/best.pt -:: 检查模型是否存在 if not exist %MODEL_PATH% ( - echo [错误] 找不到模型文件: %MODEL_PATH% - echo. - echo 请先训练模型: - echo 运行 02_train.bat + echo [错误] 找不到模型: %MODEL_PATH% + echo 请先运行 02_train.bat 训练 pause exit /b 1 ) @@ -23,53 +19,17 @@ if not exist %MODEL_PATH% ( echo [信息] 输入模型: %MODEL_PATH% echo. -:: 导出 ONNX -echo ============================================================ -echo 导出 ONNX -echo ============================================================ -echo. - -yolo export model=%MODEL_PATH% format=onnx imgsz=640 opset=12 simplify=True +yolo export model=%MODEL_PATH% format=onnx imgsz=640 opset=12 simplify if %ERRORLEVEL% neq 0 ( - echo. echo [错误] 导出失败! pause exit /b 1 ) echo. -echo ============================================================ -echo 导出完成! -echo ============================================================ +echo [成功] ONNX 模型: runs/detect/train/weights/best.onnx echo. - -:: 检查输出文件 -set ONNX_PATH=runs\detect\train\weights\best.onnx -if exist %ONNX_PATH% ( - echo [成功] ONNX 模型: %ONNX_PATH% - - :: 获取文件大小 - for %%I in (%ONNX_PATH%) do ( - set SIZE=%%~zI - ) - echo [信息] 文件大小: %SIZE% bytes -) else ( - echo [警告] 找不到输出文件 -) - -echo. -echo ============================================================ -echo 下一步操作 -echo ============================================================ -echo. -echo 1. 复制 ONNX 文件到 Ubuntu 机器: -echo scp %ONNX_PATH% user@ubuntu-pc:~/rknn_convert/ -echo. -echo 2. 在 Ubuntu 上转换为 RKNN: -echo python 04_convert_rknn.py best.onnx -o shoe_detector.rknn -t rk3588 -echo. -echo 3. 部署到 RK3588: -echo scp shoe_detector.rknn orangepi@^:/home/orangepi/apps/OrangePi3588Media/models/ +echo 下一步: 在 Ubuntu 上运行 04_convert_rknn.py 转换 echo. pause diff --git a/train/README.md b/train/README.md index 5ca2c7c..92991bc 100644 --- a/train/README.md +++ b/train/README.md @@ -1,157 +1,135 @@ # 鞋子检测模型训练指南 +## 方案:640x640 单模型(部署时用2窗口) + +**训练阶段**: +- 输入:640x640 完整图片 +- 模型:YOLOv8s +- 输出:640x640 模型文件 + +**部署阶段**(pipeline配置): +- 原图 1920x1080 +- 分成 2 个 960x1080 窗口 +- 每个窗口 resize 到 640x640 送入模型 +- 合并检测结果 + +--- + ## 目录结构 ``` train/ ├── README.md # 本文件 -├── 01_download_dataset.py # 下载数据集脚本 -├── 02_train.bat # Windows 训练脚本 +├── 01_download_dataset.py # 下载 Construction-PPE 数据集 +├── 02_train.bat # Windows 一键训练脚本 ├── 03_export_onnx.bat # 导出 ONNX 脚本 ├── 04_convert_rknn.py # 转换为 RKNN 脚本 -├── data.yaml.template # 数据集配置文件模板 -└── samples/ # 示例图片(用于测试) +├── data.yaml.template # 数据集配置文件 +└── samples/ # 示例图片 + ├── calibration/ + ├── test_images/ └── README.md ``` +--- + ## 快速开始 -### 1. 环境准备(Windows + GPU) +### 1. 下载数据集 ```bash -# 安装 PyTorch (CUDA 11.8) -pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 - -# 安装 ultralytics -pip install ultralytics +cd train +python 01_download_dataset.py --source ultralytics ``` -### 2. 下载数据集 - -**手动下载(推荐):** -1. 访问:https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg -2. 点击 **"Download"** → 选择 **"YOLOv8"** 格式 -3. 解压到 `datasets/safety-shoes-detection/` 目录 - -**或使用脚本(需要 API Key):** +或手动下载: ```bash -python 01_download_dataset.py --api-key YOUR_API_KEY +wget https://github.com/ultralytics/assets/releases/download/v0.0.0/construction-ppe.zip +unzip construction-ppe.zip -d datasets/construction-ppe/ ``` -### 3. 准备数据集配置 +### 2. 准备配置 -复制模板并修改路径: ```bash -cp data.yaml.template datasets/safety-shoes-detection/data.yaml -# 编辑 data.yaml,确保路径正确 +cp data.yaml.template datasets/construction-ppe/data.yaml ``` -### 4. 训练模型 +### 3. 训练(640x640) -**一键训练:** ```bash 02_train.bat ``` -**或手动训练:** +或手动: ```bash -# YOLOv8n - 轻量级,速度快 -yolo detect train data=datasets/safety-shoes-detection/data.yaml model=yolov8n.pt epochs=150 imgsz=640 batch=16 device=0 - -# YOLOv8s - 精度更高(可选) -# yolo detect train data=datasets/safety-shoes-detection/data.yaml model=yolov8s.pt epochs=150 imgsz=640 batch=16 device=0 +yolo detect train \ + data=datasets/construction-ppe/data.yaml \ + model=yolov8s.pt \ + epochs=150 \ + imgsz=640 \ + batch=16 \ + device=0 ``` -训练完成后,模型保存在:`runs/detect/train/weights/best.pt` +**训练参数**: +- 模型:YOLOv8s(速度和精度平衡) +- 输入:640x640 +- 预计时间:30-60分钟 -### 5. 导出 ONNX +### 4. 导出 ONNX ```bash 03_export_onnx.bat ``` -输出:`runs/detect/train/weights/best.onnx` - -### 6. 转换为 RKNN - -**在 Ubuntu PC 上运行:** +### 5. 转换为 RKNN +在 Ubuntu PC 上: ```bash -# 安装 RKNN Toolkit2 -pip install rknn-toolkit2==2.2.0 - -# 转换(FP16 模式 - 推荐) -python 04_convert_rknn.py runs/detect/train/weights/best.onnx -o shoe_detector.rknn -t rk3588 - -# 或 INT8 量化(需要校准数据集) -# python 04_convert_rknn.py runs/detect/train/weights/best.onnx -o shoe_detector.rknn -t rk3588 -q -d dataset.txt +python 04_convert_rknn.py runs/detect/train/weights/best.onnx -o shoe_detector_640.rknn -t rk3588 ``` -### 7. 部署到 RK3588 +### 6. 部署(2窗口配置) +复制到 RK3588: ```bash -scp shoe_detector.rknn orangepi@:/home/orangepi/apps/OrangePi3588Media/models/ +scp shoe_detector_640.rknn orangepi@:/home/orangepi/apps/OrangePi3588Media/models/ ``` -然后在 `configs/full_pipeline_1080p.json` 中更新模型路径。 +Pipeline 配置(部署阶段用2窗口): +```json +{ + "id": "pre_shoe", + "type": "preprocess", + "windows": [ + {"x": 0, "y": 0, "w": 960, "h": 1080}, + {"x": 960, "y": 0, "w": 960, "h": 1080} + ], + "dst_w": 640, + "dst_h": 640 +} +``` --- -## 训练参数说明 +## 类别说明(Construction-PPE) -| 参数 | YOLOv8n | YOLOv8s | 说明 | -|------|---------|---------|------| -| 模型大小 | 3.2MB | 11MB | 文件大小 | -| 推理速度 | ~30-40ms | ~50-60ms | RK3588 NPU | -| mAP | ~0.75 | ~0.82 | 精度 | -| 推荐场景 | 实时检测 | 高精度 | 选择建议 | - ---- - -## 数据集说明 - -### Safety Shoes Detection -- **来源**: Roboflow Universe -- **类别**: safety-shoes / no-safety-shoes -- **图片数**: 约 1000+ 张 -- **场景**: 工地安全鞋检测 - -### 转换为单类检测 - -我们将两类合并为单一的 `shoe` 类别: -- 检测所有鞋子(安全鞋、运动鞋、布鞋等) -- 后续通过颜色分析判断是否为劳保鞋 - ---- - -## 常见问题 - -### Q1: 训练时显存不足? -降低 batch size: -```bash -yolo detect train ... batch=8 # 默认 16,改为 8 -``` - -### Q2: 如何提高精度? -1. 增加训练 epoch:`epochs=200` -2. 使用更大模型:`model=yolov8s.pt` -3. 增大输入尺寸:`imgsz=768` -4. 收集更多现场图片 fine-tune - -### Q3: RKNN 转换失败? -1. 确保使用正确的 opset (12) -2. 使用 `simplify=True` 导出 ONNX -3. 检查 RKNN Toolkit2 版本与板端驱动匹配 - -### Q4: 检测不到鞋子? -1. 降低置信度阈值:`conf=0.15` -2. 检查 class_filter 是否正确设置 -3. 确认输入图像尺寸与模型匹配 +使用原始11类: +- 0: helmet +- 1: gloves +- 2: vest +- 3: **boots** ← 主要关注 +- 4: goggles +- 5: none +- 6: **Person** +- 7: no_helmet +- 8: no_goggle +- 9: no_gloves +- 10: **no_boots** --- ## 相关链接 -- [Ultralytics YOLOv8 文档](https://docs.ultralytics.com/) -- [RKNN Toolkit2 文档](https://github.com/airockchip/rknn-toolkit2) -- [Roboflow Universe - Safety Shoes](https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg) +- [Construction-PPE 数据集](https://docs.ultralytics.com/datasets/detect/construction-ppe/) +- [Ultralytics YOLOv8](https://docs.ultralytics.com/) diff --git a/train/data.yaml.template b/train/data.yaml.template index 7542f1d..0af217f 100644 --- a/train/data.yaml.template +++ b/train/data.yaml.template @@ -1,38 +1,16 @@ -# 单类鞋子检测数据集配置 -# 基于 Roboflow Safety Shoes Detection 数据集修改 -# 将原有的两类 (safety-shoes / no-safety-shoes) 合并为单一的 shoe 类别 +# Construction-PPE 数据集配置 -# 数据集路径 -train: ../train/images -val: ../valid/images -test: ../test/images +path: construction-ppe +train: images/train +val: images/val +test: images/test -# 类别配置 -nc: 1 # 类别数 -names: ['shoe'] # 类别名称列表 +# 11类原始类别 +nc: 11 +names: [ + 'helmet', 'gloves', 'vest', 'boots', 'goggles', 'none', + 'Person', 'no_helmet', 'no_goggle', 'no_gloves', 'no_boots' +] -# Roboflow 元信息(可选) -roboflow: - workspace: nedrick-chandra-gpg1l - project: safety-shoes-detection-5qgkg - version: 2 - license: CC BY 4.0 - url: https://universe.roboflow.com/nedrick-chandra-gpg1l/safety-shoes-detection-5qgkg/dataset/2 - -# 使用说明: -# 1. 将此文件复制到数据集根目录,命名为 data.yaml -# 2. 确保 train/val/test 路径正确 -# 3. 运行训练: yolo detect train data=data.yaml model=yolov8n.pt epochs=150 imgsz=640 -# -# 目录结构应为: -# safety-shoes-detection/ -# ├── data.yaml # 本文件 -# ├── train/ -# │ ├── images/ # 训练图片 -# │ └── labels/ # YOLO 格式标注文件 -# ├── valid/ -# │ ├── images/ # 验证图片 -# │ └── labels/ # YOLO 格式标注文件 -# └── test/ -# ├── images/ # 测试图片 -# └── labels/ # YOLO 格式标注文件 +# 数据下载链接 +download: https://github.com/ultralytics/assets/releases/download/v0.0.0/construction-ppe.zip