修改train脚本
This commit is contained in:
parent
9de41aed90
commit
48b58f74a2
@ -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())
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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@^<rk3588_ip^>:/home/orangepi/apps/OrangePi3588Media/models/
|
||||
echo 下一步: 在 Ubuntu 上运行 04_convert_rknn.py 转换
|
||||
echo.
|
||||
pause
|
||||
|
||||
180
train/README.md
180
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@<rk3588_ip>:/home/orangepi/apps/OrangePi3588Media/models/
|
||||
scp shoe_detector_640.rknn orangepi@<rk3588_ip>:/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/)
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user