# Darknet YOLO 入坑手冊 ### 電腦視覺物件偵測實戰課程 #### Oliver's Tech Workshop 2025 --- ## 今日議程 - 🎯 電腦視覺與物件偵測簡介 - 🧠 機器學習與神經網路基礎 - 🚀 YOLO 技術原理與最新發展 - 💻 開發環境建置 (CUDA/Docker) - 🔧 實戰訓練流程 (PyTorch & Darknet) - 📱 部署到邊緣設備 (Ameba Pro2) - 🛠️ 故障排除與最佳化技巧 --- # 第一章:電腦視覺基礎 --- ## 什麼是物件偵測? ![YOLO架構圖](https://tokensceshi.oss-ap-southeast-1.aliyuncs.com/sora/020d4363-be67-44ab-8cf5-88140d2be589.png) ### 核心任務 - 🔍 **定位** (Localization) - 找出物體在哪裡 - 🏷️ **分類** (Classification) - 判斷物體是什麼 - 📦 **邊界框** (Bounding Box) - 框出物體範圍 - 📊 **置信度** (Confidence) - 預測的可信度 --- ## YOLO 家族演進 (2025更新) | 版本 | 特點 | 年份 | mAP | 速度 | |------|------|------|-----|------| | YOLOv1 | 開創性的實時檢測 | 2016 | 63.4% | 45 FPS | | YOLOv3 | Darknet-53, 多尺度預測 | 2018 | 55.3% | 20 FPS | | YOLOv4 | CSPDarknet53, Mish激活 | 2020 | 65.7% | 65 FPS | | YOLOv5 | PyTorch實現, 輕量化 | 2020 | 68.9% | 140 FPS | | YOLOv7 | 可訓練的包袋式自注意力 | 2022 | 69.7% | 161 FPS | | **YOLOv8** | **統一框架, 多任務** | **2023** | **68.2%** | **280 FPS** | | **YOLOv9** | **PGI + GELAN架構** | **2024** | **70.4%** | **104 FPS** | | **YOLOv10** | **實時檢測最佳化** | **2024** | **71.2%** | **300+ FPS** | --- ## 為什麼選擇 YOLO? ### 🚀 速度優勢 - **實時處理**: 30+ FPS - **端到端**: 單一神經網路 - **推理快速**: 適合邊緣計算 ### 🎯 精度提升 - **多尺度特徵**: 檢測大小物體 - **豐富的增強**: 資料增強策略 - **損失函數**: 針對檢測任務優化 ### 🛠️ 易用性 - **生態成熟**: 大量預訓練模型 - **文檔完善**: 豐富的學習資源 - **社群活躍**: 持續更新維護 --- # 第二章:前置準備 --- ## 學習路線圖 ```mermaid graph TD A[YOLO前置準備] --> B[硬體準備] A --> C[軟體環境] A --> D[知識基礎] B --> E[GPU/NPU] B --> F[CUDA/cuDNN] C --> G[Linux/Docker] C --> H[Python/PyTorch] D --> I[神經網路] D --> J[深度學習] ``` --- ## 硬體需求 ### 基本配置 - CPU: i5 以上 - RAM: 16GB+ - GPU: NVIDIA GTX 1060+ ### 推薦配置 - CPU: i7/i9 或 AMD Ryzen 7/9 - RAM: 32GB+ - GPU: RTX 3060+ (12GB VRAM) ---- ## GPU vs NPU | 類型 | 優點 | 缺點 | |------|------|------| | **GPU** | 通用性強、生態完整 | 功耗高、成本高 | | **NPU** | 專為AI優化、低功耗 | 生態受限、彈性較低 | 💡 沒有GPU也能學習!可使用: - Google Colab (免費GPU) - Kaggle Kernel - 雲端服務 (AWS, GCP) --- # 第三章:機器學習基礎 --- ## 什麼是機器學習? ### 定義 讓電腦從數據中自動學習規律,而無需明確編程 ### 三大類型 1. **監督式學習** - 有標註數據 (分類、回歸) 2. **非監督式學習** - 無標註數據 (聚類、降維) 3. **強化學習** - 透過獎懲機制學習 (遊戲、機器人) ### 物件偵測屬於監督式學習 - 需要標註的邊界框 - 需要物體類別標籤 - 使用損失函數優化 --- ## 神經網路 (NN) ![神經網路架構](https://tokensceshi.oss-ap-southeast-1.aliyuncs.com/sora/249adf8a-446b-4310-8bdd-cd62021b85e5.png) ### 基本概念 - **神經元**: 最基本的計算單元 - **權重**: 控制輸入的重要性 - **激活函數**: 增加非線性能力 - **反向傳播**: 調整權重的方法 ---- ## 卷積神經網路 (CNN) ### 為什麼要用 CNN? - 🖼️ **空間不變性**: 位置改變不影響識別 - 🔍 **局部感受野**: 關注局部特徵 - 📉 **參數共享**: 減少參數數量 - 🎯 **平移不變性**: 特徵可以出現在任何位置 ### CNN 核心組件 ```python # CNN 基本結構 Input Image (224x224x3) ↓ Conv2D (32 filters, 3x3) → ReLU → MaxPool (2x2) ↓ Conv2D (64 filters, 3x3) → ReLU → MaxPool (2x2) ↓ Conv2D (128 filters, 3x3) → ReLU → MaxPool (2x2) ↓ Flatten → Dense (512) → ReLU → Dropout ↓ Dense (num_classes) → Softmax ``` ---- ## CNN 層級特徵學習 ### 低層特徵 (前幾層) - **邊緣檢測**: 水平線、垂直線、對角線 - **紋理識別**: 點狀、條紋、格子 - **色彩梯度**: 顏色變化、亮度變化 ### 中層特徵 (中間層) - **形狀組合**: 圓形、矩形、三角形 - **物體局部**: 眼睛、耳朵、輪廓 - **複雜紋理**: 毛髮、皮膚、表面材質 ### 高層特徵 (最後幾層) - **完整物體**: 人臉、汽車、動物 - **場景理解**: 室內、戶外、街道 - **語義概念**: 抽象的物體類別 --- ## 從分類到檢測 ### 圖像分類 vs 物件偵測 | 任務 | 輸入 | 輸出 | 難度 | |------|------|------|------| | **分類** | 整張圖片 | 類別標籤 | 較簡單 | | **檢測** | 整張圖片 | 位置+類別 | 較複雜 | ### 檢測的挑戰 - 🔍 **多尺度**: 大小物體都要檢測 - 📍 **精確定位**: 邊界框要準確 - 🚀 **實時性**: 速度要夠快 - 🎯 **多物體**: 同時檢測多個物體 ### YOLO 的解決方案 - **單一網路**: 端到端訓練 - **網格劃分**: 全圖同時預測 - **多尺度**: 不同層級特徵融合 --- # 第四章:Dataset 資料集 --- ## 為什麼需要 Dataset? - 🎯 訓練模型的"教材" - 📊 評估模型性能 - 🔄 持續改進的基礎 ### 資料集三要素 1. **訓練集** (Train) - 70% 2. **驗證集** (Valid) - 20% 3. **測試集** (Test) - 10% ---- ## YOLOv7 資料集結構 ``` dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ ├── test/ │ ├── images/ │ └── labels/ └── data.yaml ``` ---- ## YOLOv7 資料集結構範例 ![資料集結構](https://i.imgur.com/huatS0c.png) **分別有測試、訓練、驗證三個部分** ![資料集分割](https://i.imgur.com/O8d1kJs.png) **data.yaml 訓練時會使用到** ---- ## 常用資料集資源 ### 公開資料集平台 - 🌐 [Roboflow](https://public.roboflow.com/) - 📊 [Kaggle Datasets](https://www.kaggle.com/datasets) - 🏛️ [COCO Dataset](https://cocodataset.org/) ### Roboflow 資料集下載範例 ![Roboflow 水族館資料集](https://i.imgur.com/vj0SFHy.png) **使用 Yolo v7 PyTorch 格式下載** ![下載格式選擇](https://i.imgur.com/7i8rgb2.png) ### 標註工具 - LabelImg - CVAT - Roboflow Annotate --- # 第五章:環境建置 --- ## GPU 設備檢查 ### 1. 確認 GPU 支援 ```bash # 檢查 GPU 資訊 nvidia-smi # 檢查 CUDA 版本 nvcc --version # 檢查 GPU 計算能力 nvidia-smi --query-gpu=compute_cap --format=csv ``` ### 2. 推薦 GPU 配置 | GPU 型號 | VRAM | 適用場景 | |----------|------|----------| | RTX 4060 | 16GB | 學習/小規模訓練 | | RTX 4070 | 12GB | 中等規模訓練 | | RTX 4080+ | 16GB+ | 大規模訓練 | ---- ## CUDA & cuDNN 完整安裝 ### Ubuntu 20.04/22.04 安裝步驟 ```bash # 1. 移除舊版本 sudo apt-get --purge remove "*nvidia*" "*cuda*" "*cudnn*" # 2. 安裝 NVIDIA 驅動 sudo apt update sudo apt install nvidia-driver-535 # 3. 重開機 sudo reboot # 4. 安裝 CUDA 11.8 wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run # 5. 設定環境變數 echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` ---- ## cuDNN 安裝 ```bash # 1. 下載 cuDNN 8.7.0 (需要 NVIDIA 帳號) # 從 https://developer.nvidia.com/cudnn 下載 tar 檔案 # 2. 解壓縮並複製檔案 tar -xvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz # 3. 複製標頭檔 sudo cp cudnn-*/include/cudnn*.h /usr/local/cuda/include # 4. 複製函式庫 sudo cp -P cudnn-*/lib64/libcudnn* /usr/local/cuda/lib64 # 5. 設定權限 sudo chmod a+r /usr/local/cuda/include/cudnn*.h sudo chmod a+r /usr/local/cuda/lib64/libcudnn* # 6. 驗證安裝 nvidia-smi nvcc --version ``` --- ## Python 環境設置 ### Conda 完整設置 ```bash # 1. 下載 Miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 2. 建立專用環境 conda create -n yolo python=3.8 -y conda activate yolo # 3. 安裝 PyTorch (CUDA 11.8) pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 # 4. 驗證 PyTorch CUDA 支援 python -c "import torch; print(torch.cuda.is_available())" python -c "import torch; print(torch.cuda.get_device_name(0))" ``` ---- ## 必要套件安裝 ```bash # 基本套件 pip install numpy opencv-python pillow matplotlib seaborn pip install pandas scikit-learn tqdm # 深度學習相關 pip install ultralytics # YOLOv8 pip install roboflow # 資料集管理 pip install wandb # 訓練監控 # 圖像處理 pip install albumentations # 資料增強 pip install imgaug # 圖像增強 # 視覺化 pip install tensorboard pip install plotly # 驗證安裝 python -c "import cv2; print(cv2.__version__)" python -c "import ultralytics; print('YOLOv8 安裝成功')" ``` --- ## Docker 環境 (推薦) ![Docker 工作流程](https://tokensceshi.oss-ap-southeast-1.aliyuncs.com/sora/297376d5-6cf8-4088-92f7-32b7133e16e6.png) ### 優點 - ✅ **環境隔離**: 不會影響主系統 - ✅ **可重現性**: 團隊環境一致 - ✅ **快速部署**: 一鍵啟動完整環境 - ✅ **版本控制**: 不同專案用不同版本 ---- ## Docker 完整設置 ### 1. 安裝 Docker ```bash # Ubuntu 安裝 Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 安裝 NVIDIA Docker distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-docker2 sudo systemctl restart docker ``` ### 2. 使用預建映像 ```bash # 方式1: 使用官方映像 docker pull nvcr.io/nvidia/pytorch:22.12-py3 # 方式2: 使用自定義映像 docker pull oliver0804/darknet-opencv:latest # 運行容器 docker run --gpus all -it --rm \ -v $PWD:/workspace \ -p 8888:8888 \ nvcr.io/nvidia/pytorch:22.12-py3 ``` ---- ## 自建 Docker 映像 ### Dockerfile 範例 ```dockerfile FROM nvidia/cuda:11.8-devel-ubuntu20.04 # 安裝基本套件 RUN apt-get update && apt-get install -y \ python3 python3-pip git wget \ libopencv-dev python3-opencv \ && rm -rf /var/lib/apt/lists/* # 安裝 Python 套件 RUN pip3 install torch torchvision torchaudio \ opencv-python ultralytics # 設定工作目錄 WORKDIR /workspace # 複製專案檔案 COPY . . # 暴露端口 EXPOSE 8888 # 啟動命令 CMD ["bash"] ``` ### 建置與使用 ```bash # 建置映像 docker build -t my-yolo-env . # 運行容器 docker run --gpus all -it --rm \ -v $PWD:/workspace \ my-yolo-env ``` --- # 第六章:YOLO 訓練實戰 --- ## 訓練前準備檢查清單 ### 📋 硬體需求確認 - ✅ GPU 記憶體 > 8GB - ✅ 系統記憶體 > 16GB - ✅ 儲存空間 > 50GB - ✅ CUDA 版本相容 ### 📋 軟體環境確認 ```bash # 檢查清單 python --version # Python 3.8+ pip list | grep torch # PyTorch 1.12+ nvidia-smi # GPU 狀態 nvcc --version # CUDA 版本 ``` --- ## YOLOv8 完整訓練流程 ### 1. 環境設置 ```bash # 安裝 Ultralytics YOLOv8 pip install ultralytics # 驗證安裝 yolo version ``` ### 2. 準備資料集 ```python # 資料集結構 dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml ``` ---- ## 資料集配置檔案 ### data.yaml 範例 ```yaml # 資料集路徑 path: ./dataset train: images/train val: images/val test: images/test # 類別數量 nc: 3 # 類別名稱 names: 0: person 1: bicycle 2: car ``` ### 標註格式 (YOLO) ```txt # 每行一個物體: class_id x_center y_center width height # 座標為相對值 (0-1) 0 0.5 0.5 0.3 0.4 1 0.2 0.3 0.1 0.2 ``` ---- ## 訓練腳本詳解 ### 資料集配置範例 ![data.yaml 配置](https://i.imgur.com/hQl42no.png) **此檔案經過修改,將 Path 改為絕對路徑** ### 模型配置選擇 ![YOLOv7 配置檔案](https://i.imgur.com/p6XLsw8.png) **路徑中包含 v7-tiny 版本選項** ### 基本訓練 ```python from ultralytics import YOLO # 載入模型 model = YOLO('yolov8n.pt') # nano 版本 # 開始訓練 results = model.train( data='data.yaml', epochs=100, imgsz=640, batch=16, name='my_experiment' ) ``` ### 進階訓練設定 ```python # 進階參數設定 results = model.train( data='data.yaml', epochs=300, imgsz=640, batch=32, lr0=0.01, # 初始學習率 lrf=0.01, # 最終學習率 momentum=0.937, # 動量 weight_decay=0.0005,# 權重衰減 warmup_epochs=3, # 預熱期 warmup_momentum=0.8,# 預熱動量 box=7.5, # 邊界框損失權重 cls=0.5, # 分類損失權重 dfl=1.5, # 分布焦點損失權重 patience=50, # 早停耐心值 save_period=10, # 保存週期 name='advanced_training' ) ``` --- ## 訓練監控與視覺化 ### 1. TensorBoard 監控 ```python # 啟動 TensorBoard import tensorboard %load_ext tensorboard %tensorboard --logdir runs/train ``` ### 2. Weights & Biases 整合 ```python # 安裝 wandb pip install wandb # 登入 wandb wandb login # 訓練時自動記錄 results = model.train( data='data.yaml', epochs=100, project='yolo-training', # W&B 專案名稱 name='experiment-1' ) ``` ---- ## 訓練過程監控 ### 即時監控腳本 ```python import psutil import GPUtil import time def monitor_training(): while True: # CPU 使用率 cpu_percent = psutil.cpu_percent() # 記憶體使用率 memory = psutil.virtual_memory() # GPU 使用率 gpus = GPUtil.getGPUs() print(f"CPU: {cpu_percent}%") print(f"RAM: {memory.percent}%") for gpu in gpus: print(f"GPU {gpu.id}: {gpu.load*100:.1f}%") print(f"VRAM: {gpu.memoryUsed}MB/{gpu.memoryTotal}MB") time.sleep(5) # 背景執行監控 import threading monitor_thread = threading.Thread(target=monitor_training, daemon=True) monitor_thread.start() ``` ### 訓練過程展示 #### 訓練開始 ![訓練開始截圖](https://i.imgur.com/E71hoXo.png) #### GPU 資源監控 ![nvtop GPU 監控](https://i.imgur.com/LOADgpu.png) **可以使用 nvtop 進行 GPU 使用資源檢視** --- ## 超參數調整策略 ### 學習率調整 ```python # 學習率調度策略 schedulers = { 'cosine': 'cos', # 餘弦退火 'linear': 'linear', # 線性衰減 'constant': 'constant' # 常數 } # 自動學習率尋找 model.tune( data='data.yaml', epochs=30, iterations=300, optimizer='AdamW', plots=True, save=True ) ``` ### 批次大小優化 ```python # 自動批次大小調整 def find_optimal_batch_size(model, data_yaml): batch_sizes = [8, 16, 32, 64, 128] best_batch = 8 for batch in batch_sizes: try: results = model.train( data=data_yaml, epochs=5, batch=batch, verbose=False ) best_batch = batch print(f"Batch {batch}: 成功") except RuntimeError as e: if "out of memory" in str(e): print(f"Batch {batch}: 記憶體不足") break return best_batch ``` ---- ## 模型驗證與測試 ### 驗證腳本 ```python # 驗證模型性能 metrics = model.val( data='data.yaml', imgsz=640, batch=32, conf=0.001, iou=0.6, save_json=True, save_hybrid=True ) # 輸出指標 print(f"mAP50: {metrics.box.map50:.3f}") print(f"mAP50-95: {metrics.box.map:.3f}") print(f"Precision: {metrics.box.mp:.3f}") print(f"Recall: {metrics.box.mr:.3f}") ``` ### 測試腳本 ```python # 單張圖片測試 results = model.predict( source='test.jpg', conf=0.25, save=True, show_labels=True, show_conf=True ) # 批次圖片測試 results = model.predict( source='test_images/', conf=0.25, save=True, save_txt=True, # 保存標註 save_crop=True # 保存裁切圖片 ) # 即時攝影機測試 results = model.predict( source=0, # 攝影機ID conf=0.25, show=True, save=True ) ``` --- ## 模型匯出與部署 ### 多格式匯出 ```python # 匯出為不同格式 model.export( format='onnx', # ONNX 格式 imgsz=640, dynamic=True, # 動態輸入尺寸 half=True, # FP16 精度 int8=True, # INT8 量化 optimize=True # 優化 ) # 其他格式 formats = [ 'torchscript', # PyTorch Script 'tflite', # TensorFlow Lite 'edgetpu', # Edge TPU 'tfjs', # TensorFlow.js 'coreml' # Core ML ] for fmt in formats: model.export(format=fmt) ``` ### 性能基準測試 ```python # 推理速度測試 import time import numpy as np def benchmark_model(model, input_size=(640, 640), iterations=100): model.eval() dummy_input = np.random.randn(1, 3, *input_size).astype(np.float32) # 預熱 for _ in range(10): model.predict(dummy_input, verbose=False) # 測試 times = [] for _ in range(iterations): start = time.time() model.predict(dummy_input, verbose=False) end = time.time() times.append(end - start) avg_time = np.mean(times) fps = 1.0 / avg_time print(f"平均推理時間: {avg_time*1000:.2f}ms") print(f"FPS: {fps:.2f}") return avg_time, fps ``` --- ## 訓練成果展示 ### 魚類偵測範例 #### 偵測結果 ![魚類偵測結果](https://i.imgur.com/qdgpimw.png) **好多好多魚魚 <>< ~ <3** ![最終魚類偵測](https://i.imgur.com/cmGWUid.jpg) #### 訓練指標 ##### 測試集結果 ![測試集結果](https://i.imgur.com/vfUmPyT.jpg) ##### 訓練集結果 ![訓練集結果](https://i.imgur.com/f822QNy.jpg) ##### 混淆矩陣 ![混淆矩陣](https://i.imgur.com/UX7RTvQ.png) #### 攝影機即時檢測 ![攝影機檢測](https://i.imgur.com/IfRNx0v.png) --- ## 常見問題解決 ### 記憶體不足 ```python # 解決方案 strategies = { '降低批次大小': 'batch=8', '使用混合精度': 'amp=True', '減少輸入尺寸': 'imgsz=320', '梯度累積': 'accumulate=2' } # 梯度累積範例 model.train( data='data.yaml', epochs=100, batch=8, accumulate=4, # 等效批次大小 = 8*4 = 32 amp=True # 自動混合精度 ) ``` ### 訓練不收斂 ```python # 診斷與解決 diagnostic_steps = [ "檢查學習率是否過高", "確認資料集標註正確性", "檢查類別平衡性", "調整損失函數權重", "增加資料增強" ] # 學習率調整 model.train( data='data.yaml', lr0=0.001, # 降低初始學習率 warmup_epochs=5, # 增加預熱期 patience=100 # 增加早停耐心 ) ``` --- # 第七章:Darknet 框架 --- ## Darknet 簡介 ### 特點 - ✨ **C/CUDA 原生實現** - 極致性能 - 🚀 **輕量級框架** - 無複雜依賴 - 📦 **易於修改** - 源碼清晰 - 🔧 **原生支援** - YOLO 官方框架 ### 作者 Joseph Redmon (YOLO v1-v3 原作者) Alexey Bochkovskiy (YOLOv4 維護者) ### 與 PyTorch 比較 | 特性 | Darknet | PyTorch | |------|---------|---------| | 速度 | 極快 | 快 | | 易用性 | 中等 | 高 | | 生態系統 | 有限 | 豐富 | | 自定義 | 需要 C 代碼 | Python 即可 | --- ## Darknet 完整安裝 ### 1. 系統依賴安裝 ```bash # Ubuntu/Debian sudo apt-get update sudo apt-get install -y build-essential cmake git # 編譯工具 sudo apt-get install -y gcc g++ make # 可選:OpenCV 支援 sudo apt-get install -y libopencv-dev # 可選:OpenMP 支援 sudo apt-get install -y libomp-dev ``` ### 2. 克隆與編譯 ```bash # 克隆改良版 Darknet (推薦) git clone https://github.com/AlexeyAB/darknet.git cd darknet # 編輯 Makefile nano Makefile ``` ---- ## Makefile 配置 ```makefile # GPU 支援 GPU=1 CUDNN=1 CUDNN_HALF=1 # OpenCV 支援 OPENCV=1 # OpenMP 支援 OPENMP=1 # 偵錯模式 DEBUG=0 # 其他選項 LIBSO=1 # 建立 .so 檔案 ZED_CAMERA=0 # ZED 攝影機支援 ``` ### 編譯指令 ```bash # 清理舊檔案 make clean # 編譯 (使用多核心) make -j$(nproc) # 驗證編譯結果 ./darknet version ``` ### OpenCV 安裝過程截圖 #### OpenCV 3.4.19 版本確認 ![OpenCV 版本](https://i.imgur.com/MK2WjLE.png) #### 編譯過程 ![編譯進度1](https://i.imgur.com/0tUjQIQ.png) ![編譯進度2](https://i.imgur.com/WtAhL7D.png) ![編譯完成](https://i.imgur.com/FxiEwvn.png) ---- ## 基本測試 ### 1. 下載預訓練模型 ```bash # YOLOv4 權重 wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights # YOLOv4-tiny 權重 wget https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov4-tiny.weights # YOLOv7-tiny 權重 wget https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov7-tiny.weights ``` ### 2. 測試圖片檢測 ```bash # YOLOv4 檢測 ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg # YOLOv4-tiny 檢測 ./darknet detect cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg # 自訂閾值 ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg -thresh 0.5 ``` ### 測試結果展示 #### YOLOv3 檢測結果 ![YOLOv3 狗狗檢測](https://i.imgur.com/uorx7NL.jpg) #### YOLOv7-tiny 檢測結果 ![YOLOv7-tiny 結果](https://i.imgur.com/6rqgN7t.png) ---- ## 影片與攝影機檢測 ### 影片檢測 ```bash # 檢測影片 ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 # 儲存結果 ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename result.avi ``` ### 攝影機檢測 ```bash # 使用 webcam ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0 # 使用外接攝影機 ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 1 # 設定參數 ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0 -thresh 0.25 -here ``` --- ## 自定義訓練準備 ### 1. 建立專案資料夾 ```bash mkdir my_yolo_project cd my_yolo_project # 建立目錄結構 mkdir -p {data,cfg,weights,results} mkdir -p data/{images,labels} mkdir -p data/images/{train,valid,test} mkdir -p data/labels/{train,valid,test} ``` ### 2. 準備資料集 ```bash # 資料集結構 my_yolo_project/ ├── data/ │ ├── images/ │ │ ├── train/ │ │ ├── valid/ │ │ └── test/ │ ├── labels/ │ │ ├── train/ │ │ ├── valid/ │ │ └── test/ │ ├── train.txt │ ├── valid.txt │ └── test.txt ├── cfg/ │ ├── my_dataset.data │ ├── my_yolov4.cfg │ └── my_classes.names └── weights/ ``` ---- ## 配置檔案設定 ### 1. 建立 .data 檔案 ```bash # my_dataset.data classes = 3 train = data/train.txt valid = data/valid.txt names = cfg/my_classes.names backup = weights/ ``` ### 2. 建立 .names 檔案 ```bash # my_classes.names person car bicycle ``` ### 3. 建立圖片列表 ```bash # 產生訓練列表 find $(pwd)/data/images/train -name "*.jpg" > data/train.txt # 產生驗證列表 find $(pwd)/data/images/valid -name "*.jpg" > data/valid.txt # 檢查列表 head -5 data/train.txt ``` ---- ## 模型配置調整 ### 1. 複製基礎配置 ```bash # 複製 YOLOv4-tiny 配置 cp ../darknet/cfg/yolov4-tiny.cfg cfg/my_yolov4.cfg ``` ### 2. 修改配置檔案 ```bash # 編輯配置 nano cfg/my_yolov4.cfg # 關鍵修改點: # 1. 修改 classes 數量 # 2. 修改 filters 數量 # 3. 調整學習率 # 4. 設定批次大小 ``` ### 重要參數說明 ```cfg [net] batch=64 # 批次大小 subdivisions=8 # 子批次 width=416 # 輸入寬度 height=416 # 輸入高度 channels=3 # 通道數 momentum=0.9 # 動量 decay=0.0005 # 權重衰減 angle=0 # 隨機旋轉角度 saturation=1.5 # 飽和度變化 exposure=1.5 # 曝光變化 hue=.1 # 色調變化 learning_rate=0.001 # 學習率 max_batches=6000 # 最大批次 (classes * 2000) policy=steps # 學習率策略 steps=4800,5400 # 降低學習率的步驟 scales=.1,.1 # 學習率縮放 ``` ---- ## 預訓練權重準備 ### 1. 下載預訓練權重 ```bash # YOLOv4-tiny 預訓練權重 wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29 # YOLOv4 預訓練權重 wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137 ``` ### 2. 驗證權重檔案 ```bash # 檢查檔案大小 ls -lh weights/ # 測試權重載入 ./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 ``` --- ## 開始訓練 ### 自定義資料集範例 #### 手語識別資料集 ![手語資料集](https://i.imgur.com/4qqFY9U.png) #### 自定義設定資料夾 ![自定義設定](https://i.imgur.com/zFllQPi.png) ### 基本訓練指令 ```bash # 單 GPU 訓練 ./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 # 多 GPU 訓練 ./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 -gpus 0,1 # 從檢查點繼續訓練 ./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_last.weights # 計算 mAP ./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 -map ``` ### 訓練過程監控 ![訓練進行中](https://i.imgur.com/VGilggk.png) ---- ## 訓練監控 ### 1. 查看訓練日誌 ```bash # 即時查看訓練進度 tail -f training.log # 提取損失值 grep "avg" training.log | tail -10 ``` ### 2. 損失函數分析 ```bash # 訓練輸出範例 Region xx: cfg: (anchors) ... 1000: 2.950644, 2.950644 avg, 0.000010 rate, 3.456 seconds, 64000 images ``` ### 參數說明 - `1000`: 當前迭代次數 - `2.950644`: 當前損失值 - `2.950644 avg`: 平均損失值 - `0.000010 rate`: 當前學習率 - `3.456 seconds`: 此批次訓練時間 - `64000 images`: 已處理圖片數 ---- ## 訓練結果評估 ### 1. 計算 mAP ```bash # 計算驗證集 mAP ./darknet detector map cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights ``` ### 2. 測試個別圖片 ```bash # 測試單張圖片 ./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights data/test.jpg # 批次測試 ./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights < data/test.txt ``` ### 3. 調整檢測閾值 ```bash # 不同閾值測試 for thresh in 0.1 0.25 0.5 0.75; do echo "Testing with threshold: $thresh" ./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights data/test.jpg -thresh $thresh done ``` --- ## 高級功能 ### 1. 資料增強 ```cfg # 在 [net] 部分加入 mosaic=1 # 馬賽克增強 cutmix=1 # CutMix 增強 mixup=1 # MixUp 增強 ``` ### 2. 多尺度訓練 ```cfg # 隨機尺度訓練 random=1 # 多尺度設定 width=416 height=416 ``` ### 3. 學習率調度 ```cfg # 學習率策略 policy=steps steps=4800,5400 scales=.1,.1 # 或使用多項式衰減 policy=poly power=4 ``` ---- ## 疑難排解 ### 常見錯誤解決 ```bash # 1. CUDA 記憶體不足 # 解決:降低 batch size 或 subdivisions # 2. 找不到圖片 # 解決:檢查 .txt 檔案中的路徑 # 3. 標註格式錯誤 # 解決:檢查 YOLO 格式是否正確 # 4. 類別數量不匹配 # 解決:確認 classes 和 filters 設定正確 ``` ### 優化建議 1. **記憶體優化**: 調整 `subdivisions` 2. **速度優化**: 使用 `-dont_show` 參數 3. **精度優化**: 增加 `max_batches` 4. **穩定訓練**: 使用 `-map` 監控 mAP --- ## Docker 部署 (完整版) ### 1. 使用現成映像 #### Docker 工作流程示意 ![Docker 工作流程](https://github.com/Oliver0804/dockerfile_opencv3_4_16_darknet/blob/main/pic/%E6%88%AA%E5%9C%96%202023-05-28%20%E4%B8%8B%E5%8D%8810.42.25.png) ```bash # 拉取映像 docker pull oliver0804/darknet-opencv:latest # 運行容器 docker run --gpus all -it --rm \ -v $(pwd):/workspace \ -v $(pwd)/data:/darknet/data \ -v $(pwd)/cfg:/darknet/cfg \ -v $(pwd)/weights:/darknet/weights \ oliver0804/darknet-opencv:latest ``` #### Docker 執行結果 ![Docker 執行結果](https://github.com/Oliver0804/dockerfile_opencv3_4_16_darknet/blob/main/pic/%E6%88%AA%E5%9C%96%202023-05-28%20%E4%B8%8B%E5%8D%8810.43.01.png) #### 最終檢測結果 ![Docker 檢測結果](https://i.imgur.com/r1Xawdo.jpg) ### 2. 在容器中訓練 ```bash # 進入容器 docker exec -it <container_id> bash # 開始訓練 ./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 -dont_show -map ``` ### 3. 自動化腳本 ```bash #!/bin/bash # auto_train.sh # 設定參數 DATA_FILE="cfg/my_dataset.data" CFG_FILE="cfg/my_yolov4.cfg" WEIGHTS_FILE="weights/yolov4-tiny.conv.29" # 執行訓練 docker run --gpus all -it --rm \ -v $(pwd):/workspace \ oliver0804/darknet-opencv:latest \ ./darknet detector train $DATA_FILE $CFG_FILE $WEIGHTS_FILE -dont_show -map ``` --- # 第八章:邊緣設備部署 --- ## Ameba Pro2 簡介 ### 硬體規格 - **處理器**: ARM Cortex-M55 @ 500MHz - **AI 加速器**: 0.4 TOPS NPU - **記憶體**: 768KB SRAM + 16MB PSRAM - **攝像頭**: 2MP 感光元件 - **連接**: Wi-Fi 6 + BLE 5.0 - **尺寸**: 35mm x 28mm ### 為什麼選擇邊緣 AI? - 🔒 **隱私保護**: 資料不上雲 - ⚡ **低延遲**: 即時推理 - 💰 **成本效益**: 無雲端費用 - 🔋 **低功耗**: 適合 IoT 應用 --- ## 重要注意事項 ### 支援時程 > **注意**: ameba pro2 對 yolo 的支援時間會比較晚 ### 當前限制 - 模型轉換需要線上工具 - 暫無離線版本工具 - 如果在意模型保密需要考慮 ### 適用場景 - 🏠 智慧家居監控 - 🏭 工業品質檢測 - 🚗 車內駕駛行為分析 - 📱 IoT 邊緣計算 --- ## 模型轉換詳解 ### 1. 準備轉換檔案 #### 檔案要求 ```bash # 打包內容 yolo_model.zip ├── yolov4-tiny.weights # 訓練好的權重檔 └── yolov4-tiny.cfg # 對應的配置檔 # 重要限制 ❌ 不能包含中文字符 ❌ cfg 檔案註解也不能有中文 ❌ 檔案路徑不能有中文 ``` #### 配置檔案清理 ```bash # 移除中文註解 sed -i '/[\u4e00-\u9fff]/d' yolov4-tiny.cfg # 檢查檔案編碼 file yolov4-tiny.cfg # 確保 UTF-8 編碼 iconv -f GB2312 -t UTF-8 yolov4-tiny.cfg > yolov4-tiny_clean.cfg ``` ---- ## 線上轉換流程 ### 1. 上傳模型 ![模型轉換上傳](https://i.imgur.com/ZgKEAej.png) **網址**: https://www.amebaiot.com/en/amebapro2-ai-convert-model/ ### 2. 轉換過程 - ⏱️ **等待時間**: 10-20 分鐘 - 📧 **結果通知**: 轉換完成會發送郵件 - 📦 **輸出格式**: .nb 檔案 (Neural Network Binary) ### 3. 轉換參數 | 參數 | 說明 | 建議值 | |------|------|---------| | Input Size | 輸入圖片尺寸 | 416x416 | | Quantization | 量化位元數 | INT8 | | Optimization | 優化等級 | High | ---- ## Arduino IDE 環境設置 ### 1. 安裝 Arduino IDE ```bash # 下載 Arduino IDE 2.0+ wget https://downloads.arduino.cc/arduino-ide/arduino-ide_2.2.1_Linux_64bit.zip # 或使用套件管理器 sudo apt install arduino ``` ### 2. 添加開發板支援 #### 開發板管理員 URL ``` https://github.com/ambiot/ambpro2_arduino/raw/main/Arduino_package/package_realtek.com_amebapro2_index.json ``` ![開發板管理員設定](https://i.imgur.com/7GRGfhc.png) #### 安裝步驟 1. 開啟 Arduino IDE 2. 檔案 → 偏好設定 → 額外的開發板管理員網址 3. 貼上上述 URL 4. 工具 → 開發板 → 開發板管理員 5. 搜尋 "Realtek Ameba" 6. 安裝 "Realtek Ameba Pro2 Boards" ---- ## 選擇開發板 ### 開發板設定 ![選擇 Ameba Pro2](https://i.imgur.com/w946fNw.png) **設定路徑**: 工具 → 開發板 → Realtek Ameba Pro2 → "Ameba Pro2" ### 編譯選項 ``` Board: "Ameba Pro2" CPU Speed: "500MHz" Optimization: "Smallest (-Os)" Upload Speed: "115200" ``` --- ## 神經網路範例程式 ### 1. 開啟範例 ![NN 範例](https://i.imgur.com/TGCw4AT.png) **路徑**: 檔案 → 範例 → AmebaNN → YOLO ### 2. 基本程式結構 ```cpp #include "NeuralNetwork.h" #include "VideoStream.h" #include "RTSP.h" // 物件類別定義 #define YOLO_CLASSES 26 // 自定義類別數 // 類別名稱陣列 String objectList[YOLO_CLASSES] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; void setup() { Serial.begin(115200); // 初始化攝像頭 Camera.configVideoChannel(VIDEO_CHN, 416, 416, 30, VIDEO_H264_JPEG); Camera.videoInit(); // 初始化神經網路 NNObjectDetection.configVideo(VIDEO_CHN); NNObjectDetection.modelSelect(OBJECT_DETECTION, YOLO_CLASSES, DEFAULT_YOLO, NA_MODEL); NNObjectDetection.begin(); // 初始化 RTSP RTSP.configVideo(VIDEO_CHN); RTSP.begin(); } void loop() { // 執行物件偵測 if (NNObjectDetection.available()) { ObjectDetectionResult result = NNObjectDetection.getResult(); // 處理偵測結果 for (int i = 0; i < result.count(); i++) { int obj_type = result.type(i); int score = result.score(i); if (score > 50) { // 信心度閾值 Serial.printf("偵測到: %s (信心度: %d%%)\n", objectList[obj_type].c_str(), score); } } } delay(100); } ``` ---- ## 模型替換詳解 ### 1. 找到模型檔案位置 ![模型檔案路徑](https://i.imgur.com/BHpXBDY.png) **典型路徑**: ``` ~/Arduino/libraries/AmebaNN/src/ ├── models/ │ ├── yolov4_tiny.nb # 原始模型 │ └── yolov4_tiny_new.nb # 你的新模型 ``` ### 2. 備份原始模型 ```bash # 進入模型目錄 cd ~/Arduino/libraries/AmebaNN/src/models/ # 備份原始模型 cp yolov4_tiny.nb yolov4_tiny_original.nb # 替換新模型 cp /path/to/your/model.nb yolov4_tiny.nb ``` ### 3. 修改類別設定 #### 更新類別數量 ```cpp // 原始 COCO dataset (80 類) #define YOLO_CLASSES 80 // 改為你的類別數 (例如: 26 類手語) #define YOLO_CLASSES 26 ``` #### 更新類別名稱 ```cpp // 原始 COCO 類別 String objectList[YOLO_CLASSES] = { "person", "bicycle", "car", ... // 80 個類別 }; // 改為手語字母 (26 類) String objectList[YOLO_CLASSES] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; ``` ---- ## 程式碼修改詳解 ### 1. 修改 OSD 標籤顯示 #### 原始標籤清單 ![OSD 標籤修改](https://i.imgur.com/pkeZgvz.png) #### 修改後的手語標籤 ![手語標籤清單](https://i.imgur.com/OBGPJiw.png) **原始代碼**: ```cpp // 舊版本 (可能已修正) printf("%s", item.name()); ``` **修正後**: ```cpp // 新版本 printf("%s", objectList[obj_type].c_str()); ``` ### 2. 物件類型處理 ![物件類型修正](https://i.imgur.com/iiLoTo6.png) **修改位置**: 約第 114 行 ```cpp // 修改前 item.name() // 修改後 objectList[obj_type].objectName ``` --- ## 測試與除錯 ### 1. 序列埠監控 ```cpp void printDetectionInfo(ObjectDetectionResult result) { Serial.printf("偵測到 %d 個物件\n", result.count()); for (int i = 0; i < result.count(); i++) { int obj_type = result.type(i); int score = result.score(i); int x = result.xMin(i); int y = result.yMin(i); int w = result.width(i); int h = result.height(i); Serial.printf("物件 %d: %s\n", i+1, objectList[obj_type].c_str()); Serial.printf(" 信心度: %d%%\n", score); Serial.printf(" 位置: (%d, %d) 大小: %dx%d\n", x, y, w, h); } } ``` ### 2. 性能監控 ```cpp unsigned long prev_time = 0; int frame_count = 0; void loop() { if (NNObjectDetection.available()) { frame_count++; unsigned long curr_time = millis(); if (curr_time - prev_time >= 1000) { // 每秒統計 Serial.printf("FPS: %d\n", frame_count); frame_count = 0; prev_time = curr_time; } // 處理偵測結果... } } ``` ---- ## 實際展示效果 ### 1. 手語識別展示 **YouTube 影片**: [Ameba pro2 yolo展示](https://youtube.com/watch?v=-iYyFTtXmWE) ### 功能展示 - ✅ 即時手語字母識別 - ✅ 邊界框繪製 - ✅ 信心度顯示 - ✅ RTSP 串流輸出 ### 2. 性能表現 | 指標 | 數值 | |------|------| | 推理速度 | ~10 FPS | | 延遲 | <100ms | | 功耗 | <500mW | | 精確度 | 85%+ | --- ## 模型快速替換工具 ### 1. 問題描述 - 🔍 **路徑深層**: Arduino 目錄結構複雜 - 🔄 **頻繁更換**: 需要測試不同模型 - 💾 **備份需求**: 保存之前的模型版本 ### 2. 自動化腳本 **YouTube 教學**: [Ameba pro2 快速替換模型腳本](https://youtube.com/watch?v=6IabnHTvXNE) ### Windows 批次檔 (model_swap.bat) ```batch @echo off setlocal enabledelayedexpansion echo Ameba Pro2 模型快速替換工具 echo ================================ set ARDUINO_PATH=%USERPROFILE%\Documents\Arduino set MODEL_PATH=%ARDUINO_PATH%\libraries\AmebaNN\src\models set BACKUP_PATH=%MODEL_PATH%\backup REM 建立備份目錄 if not exist "%BACKUP_PATH%" mkdir "%BACKUP_PATH%" REM 顯示當前模型 echo 當前模型檔案: dir "%MODEL_PATH%\*.nb" /b echo. echo 選擇操作: echo 1. 替換模型 echo 2. 還原備份 echo 3. 建立備份 set /p choice="請輸入選項 (1-3): " if "%choice%"=="1" goto REPLACE_MODEL if "%choice%"=="2" goto RESTORE_BACKUP if "%choice%"=="3" goto CREATE_BACKUP goto END :REPLACE_MODEL set /p new_model="請輸入新模型檔案路徑: " if not exist "%new_model%" ( echo 錯誤: 找不到指定的模型檔案 goto END ) REM 備份當前模型 copy "%MODEL_PATH%\yolov4_tiny.nb" "%BACKUP_PATH%\yolov4_tiny_%date:~0,4%%date:~5,2%%date:~8,2%.nb" REM 替換模型 copy "%new_model%" "%MODEL_PATH%\yolov4_tiny.nb" echo 模型替換完成! goto END :RESTORE_BACKUP echo 可用的備份檔案: dir "%BACKUP_PATH%\*.nb" /b set /p backup_file="請輸入要還原的備份檔案名: " copy "%BACKUP_PATH%\%backup_file%" "%MODEL_PATH%\yolov4_tiny.nb" echo 模型還原完成! goto END :CREATE_BACKUP copy "%MODEL_PATH%\yolov4_tiny.nb" "%BACKUP_PATH%\yolov4_tiny_%date:~0,4%%date:~5,2%%date:~8,2%.nb" echo 備份建立完成! goto END :END pause ``` ### 3. Linux/Mac 腳本 (model_swap.sh) ```bash #!/bin/bash ARDUINO_PATH="$HOME/Arduino" MODEL_PATH="$ARDUINO_PATH/libraries/AmebaNN/src/models" BACKUP_PATH="$MODEL_PATH/backup" # 建立備份目錄 mkdir -p "$BACKUP_PATH" echo "Ameba Pro2 模型快速替換工具" echo "================================" echo "當前模型檔案:" ls -la "$MODEL_PATH"/*.nb 2>/dev/null || echo "找不到模型檔案" echo "" echo "選擇操作:" echo "1. 替換模型" echo "2. 還原備份" echo "3. 建立備份" read -p "請輸入選項 (1-3): " choice case $choice in 1) read -p "請輸入新模型檔案路徑: " new_model if [ ! -f "$new_model" ]; then echo "錯誤: 找不到指定的模型檔案" exit 1 fi # 備份當前模型 cp "$MODEL_PATH/yolov4_tiny.nb" "$BACKUP_PATH/yolov4_tiny_$(date +%Y%m%d_%H%M%S).nb" # 替換模型 cp "$new_model" "$MODEL_PATH/yolov4_tiny.nb" echo "模型替換完成!" ;; 2) echo "可用的備份檔案:" ls -1 "$BACKUP_PATH"/*.nb 2>/dev/null || echo "沒有備份檔案" read -p "請輸入要還原的備份檔案名: " backup_file cp "$BACKUP_PATH/$backup_file" "$MODEL_PATH/yolov4_tiny.nb" echo "模型還原完成!" ;; 3) cp "$MODEL_PATH/yolov4_tiny.nb" "$BACKUP_PATH/yolov4_tiny_$(date +%Y%m%d_%H%M%S).nb" echo "備份建立完成!" ;; *) echo "無效的選項" ;; esac ``` --- ## 疑難排解 ### 常見問題 1. **模型轉換失敗** - 檢查檔案是否包含中文 - 確認 cfg 和 weights 對應 - 重新清理配置檔案 2. **編譯錯誤** - 確認開發板選擇正確 - 檢查類別數量設定 - 更新 Arduino 核心 3. **推理速度慢** - 降低輸入解析度 - 使用 INT8 量化 - 優化模型架構 ### 效能優化建議 - 🎯 **模型選擇**: 使用 YOLOv4-tiny 而非完整版 - 📏 **輸入尺寸**: 建議 320x320 或 416x416 - ⚡ **量化**: 使用 INT8 量化減少記憶體用量 - 🔄 **批次處理**: 避免頻繁的模型切換 --- # 第九章:實用技巧 --- ## OpenCV 應用 ### 電腦視覺基礎操作 ![OpenCV 基本操作](https://i.imgur.com/BuO7P5c.png) **OpenCV 可以處理顏色、物件邊緣、光流等,是代碼版本的 Photoshop** ### 影像前處理 ```python import cv2 # 讀取圖片 img = cv2.imread('image.jpg') # 轉換顏色空間 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 邊緣檢測 edges = cv2.Canny(gray, 50, 150) # 影像增強 enhanced = cv2.equalizeHist(gray) ``` ---- ### 進階應用範例 #### 人臉識別應用 ![OpenCV 人臉識別](https://i.imgur.com/iYyJUfa.jpg) **透過 OpenCV contrib 實現人臉偵測** #### OCR 文字識別 ![OpenCV OCR](https://i.imgur.com/IPDGUPz.jpg) **使用 Tesseract 進行光學字符識別** ---- ## 資料增強技巧 ### 常用方法 1. **旋轉** - 增加角度變化 2. **翻轉** - 水平/垂直鏡像 3. **縮放** - 尺度不變性 4. **色彩調整** - 光照變化 5. **加噪** - 提升魯棒性 ```python # Albumentations 範例 transform = A.Compose([ A.RandomRotate90(), A.Flip(), A.RandomBrightnessContrast(p=0.2), ]) ``` --- # 第十章:常見問題 --- ## GPU 記憶體不足 ### 解決方案 1. 降低 batch size 2. 使用混合精度訓練 3. 減少輸入圖片尺寸 4. 使用梯度累積 ```python # 梯度累積範例 accumulation_steps = 4 for i, (imgs, targets) in enumerate(dataloader): loss = model(imgs, targets) loss = loss / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` ---- ## 訓練不收斂 ### 檢查清單 - ✅ 學習率是否合適 - ✅ 資料集是否平衡 - ✅ 標註是否正確 - ✅ 增強是否過度 ### 調試技巧 ```python # 學習率調度 scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( optimizer, T_max=epochs ) ``` --- # 總結與展望 --- ## 學習要點回顧 ### 技術堆疊 - ✅ 深度學習基礎 - ✅ YOLO 架構原理 - ✅ 訓練流程實作 - ✅ 模型優化技巧 - ✅ 邊緣設備部署 ### 實戰經驗 - 💡 資料集準備的重要性 - 🔧 超參數調整的藝術 - 📊 性能指標的理解 - 🚀 部署優化的考量 --- ## 未來發展方向 ### 技術趨勢 1. **Vision Transformer** - 新架構崛起 2. **自監督學習** - 減少標註需求 3. **邊緣 AI** - 更強大的端側推理 4. **多模態融合** - 結合語言理解 ### 應用場景 - 🏭 智慧製造 - 🚗 自動駕駛 - 🏥 醫療影像 - 🛡️ 安防監控 --- ## 參考資源 ### 官方資源 - [YOLO 官網](https://pjreddie.com/darknet/yolo/) - [PyTorch 文檔](https://pytorch.org/docs/) - [Papers with Code](https://paperswithcode.com/) ### 社群資源 - GitHub: AlexeyAB/darknet - GitHub: WongKinYiu/yolov7 - Roboflow Blog - PyImageSearch --- # Q&A 時間 ### 聯絡方式 - 📧 Email: oliver@example.com - 💬 GitHub: @Oliver0804 - 🌐 Blog: oliver.blog ### 感謝聆聽!🎉 --- ## 附錄:快速參考 ### 常用指令 ```bash # PyTorch 訓練 python train.py --batch 16 --epochs 100 # Darknet 訓練 ./darknet detector train cfg/data.data cfg/yolo.cfg weights.conv # 模型測試 python detect.py --weights best.pt --source test.jpg # Docker 運行 docker run --gpus all -it darknet:latest ```
{"title":"Darknet YOLO 入坑手冊","contributors":"[{\"id\":\"7cbf29ab-ad04-42c1-b746-9955cd67c658\",\"add\":67187,\"del\":31955,\"latestUpdatedAt\":1752152759346}]","description":"🎯 電腦視覺與物件偵測簡介"}
    1111 views