### Lab2-1:安裝 YOLOv5 環境 ### >>> conda create --name yolov5_313 python=3.13 # 複製虛擬環境 myenv,新的虛擬環境為 myenv_new >>> activate yolov5_313 # 啟動 yolov5 的虛擬環境 ### Lab2-2:下載 YOLOv5 檔案 ### # git for Windows 的網址 https://gitforwindows.org/ (yolov5_313) >>> git clone https://github.com/ultralytics/yolov5 # 下載 YOLOv5 原始碼 (yolov5_313) >>> cd yolov5 # 進入 yolov5 目錄 (yolov5_313) >>> pip install -r requirements.txt # 安裝 YOLOv5 所需環境 ### Lab2-3:使用 YOLOv5 模型偵測物件 ### (yolov5_313) >>> python detect.py --source ./data/images/zidane.jpg # 以 YOLOv5 模型偵測圖片物件 (yolov5_313) >>> python detect.py --source https://www.youtube.com/watch?v=7BwW2dH6ZI0 # 直接偵測 Youtube 失敗 (yolov5_313) >>> pip install yt-dlp (yolov5_313) >>> yt-dlp --geo-bypass -f "bv*+ba/b" --merge-output-format mp4 -o "test1.mp4" https://www.youtube.com/watch?v=te09w4vbQiY&list=RDte09w4vbQiY&start_radio=1 (yolov5_313) >>> python detect.py --source test1.mp4 --view-im ### Lab2-4:使用 YOLOv5 模型偵測攝影機 ### (yolov5_313) >>> python detect.py --source 0 # 以 YOLOv5 模型偵測攝影機物件 (yolov5_313) >>> python detect.py --source 0 --weight yolov5n.pt # 以 yolov5n 的模型偵測攝影機物件 (yolov5_313) >>> python detect.py --help # 查詢參數用法 ### Lab2-4:匯入 ultralytics 來使用 YOLOv5 模型偵測物件 (2-1.py) ### import torch from torch.serialization import add_safe_globals from models.yolo import Model # 匯入 YOLOv5 的 Model 類別(需在 yolov5 專案根目錄下執行) # 允許 PyTorch 在載入模型權重時,安全地識別 YOLOv5 的 Model 類別 add_safe_globals([Model]) # 從 PyTorch Hub 載入 YOLOv5 的預訓練模型 # 可用的模型包含: # yolov5n(nano,最輕量) # yolov5s(small) # yolov5m(medium) # yolov5l(large) # yolov5x(xlarge,最準確但最慢) model = torch.hub.load('ultralytics/yolov5', 'yolov5n') # 測試影像來源(可以是 URL、檔案路徑、NumPy 陣列、PIL 圖像、OpenCV 影像、或影像清單) img = 'https://ultralytics.com/images/zidane.jpg' # 使用模型進行物件偵測推論 results = model(img) # 在終端機中印出偵測結果摘要(例如:偵測到的物件類別與信心分數) results.print() # 顯示偵測後的影像(會開啟視窗顯示帶有邊框與標籤的圖片) results.show() # 將偵測結果影像儲存到 runs/detect/exp 目錄中 results.save() # 將偵測結果轉成 Pandas DataFrame 格式並印出 # 每一行包含: # xmin, ymin, xmax, ymax:邊界框座標 # confidence:信心分數 # class:類別索引 # name:類別名稱 print(results.pandas().xyxy[0]) ### Lab2-5:YOLO 即時影像辦識與存檔 (2-2.py) ### # 匯入必要套件 import torch from torch.serialization import add_safe_globals from models.yolo import Model # 匯入 YOLOv5 的模型類別,需在 yolov5 專案根目錄中執行 import cv2 # 匯入 OpenCV,用於影像讀取與顯示 # 允許 PyTorch 在載入模型時安全地識別 YOLOv5 的 Model 類別 add_safe_globals([Model]) # 從 PyTorch Hub 載入 YOLOv5s 預訓練模型 # 可選模型: # yolov5n(Nano,最輕量) # yolov5s(Small) # yolov5m(Medium) # yolov5l(Large) # yolov5x(X-Large,最精準但速度較慢) model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # 初始化攝影機(0 表示預設攝影機) cap = cv2.VideoCapture(0) # 檢查攝影機是否成功開啟 if not cap.isOpened(): print('請檢查攝影機,無法開啟') exit() # 設定攝影機解析度(寬度 640、高度 480) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 開始即時偵測迴圈 while True: # 從攝影機讀取一幀影像 ret, frame = cap.read() if not ret: print('無法取得影像') break # OpenCV 讀入的影像格式為 BGR,需要轉換為 RGB 才能輸入 YOLOv5 模型 rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 使用 YOLOv5 模型進行物件偵測 results = model(rgb_frame) # 將偵測結果繪製在影像上 # results.render() 回傳一個列表,取第一張影像 [0] output_frame = results.render()[0] # 將 RGB 影像轉回 BGR,以便 OpenCV 顯示 bgr_frame = cv2.cvtColor(output_frame, cv2.COLOR_RGB2BGR) # 顯示即時偵測結果影像 cv2.imshow('YOLOv5 Detection', bgr_frame) # 按下 'q' 鍵即可退出迴圈 if cv2.waitKey(1) & 0xFF == ord('q'): break # 釋放攝影機資源 cap.release() # 關閉所有 OpenCV 視窗 cv2.destroyAllWindows() ### Lab2-6:自行訓練 YOLO 模型 ### # 安裝 labelImg 標註工具 (yolov5_313) >>> pip install labelImg # 從 PyPI 下載與安裝 labelImg (yolov5_313) >>> start /min labelImg # 執行 labelImg,start /min 為背景執行 ### Lab2-7:標註圖片 ### # 到 Kaggle 下載訓練照片檔 https://www.kaggle.com/datasets/andrewmvd/road-sign-detection # coco128 資料集 的目錄結構 https://www.kaggle.com/datasets/ultralytics/coco128 # YOLOv5 官方網頁上的建議 https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results ### Lab2-8:資料集 YAML 設定檔 (road.yaml) ### # 設定圖檔路徑 path: ./datasets/road # 資料根目錄 train: images/train # 訓練用資料集(相對於 path) val: images/train # 驗證用資料集(相對於 path) test: # 測試用資料集(相對於 path,可省略) # 物件類別設定 nc: 4 # 類別數量 names: ['trafficlight', 'speedlimit', 'crosswalk', 'stop'] # 類別名稱 ### Lab2-9:訓練 YOLOv5 模型 ### # 進行 YOLOv5s 模型訓練 (yolov5_313) >>> python train.py --img-size 640 --batch 16 --epochs 500 --data road.yaml --weights yolov5s.pt ### Lab2-10:使用 Google Colab 來訓練模型 ### # 登入 Googe Drive from google.colab import drive drive.mount('/content/gdrive') # 此處需要登入 google 帳號 >>> %cd gdrive/MyDrive/ # 進入掛載的雲端硬碟資料夾 >>> !unzip yolov5-master.zip # 解壓縮 yolov5-master.zip >>> %cd yolov5-master # 進入掛載的雲端硬碟目錄 >>> pip install -r requirements.txt # 安裝 yolov5 所需模組 >>> !python train.py --img-size 640 --batch 16 --epochs 500 --data road.yaml --weights yolov5s.pt # 進行 YOLOv5s 模型訓練 ### Lab2-11:使用自己的模型進行預測:detect.py 指令稿 ### # 自己訓練出來的 YOLO 模型也可以直接套用 detect.py 指令稿進行預測 (yolov5_313) >>> python detect.py --weight runs/train/exp/weights/best.pt --source datasets\road\images\train\road0.png --iou-thres 0.5 --conf-thres 0.5 # 以自行訓練的 YOLO 模型偵測攝影機物件 (yolov5_313) >>> python detect.py --weight runs/train/exp/weights/best.pt --source 0 --iou-thres 0.5 --conf-thres 0.5 # 以自行訓練的 YOLO 模型偵測 Youtube 的影片,但失敗 (yolov5_313) >>> python detect.py --weight runs/train/exp/weights/best.pt --source https://www.youtube.com/watch?v=7BwW2dH6ZI0 --iou-thres 0.5 --conf-thres 0.5 # 改以手動下載 Youtube 後,再進行辨識 (yolov5_313) >>> yt-dlp --geo-bypass -f "bv*+ba/b" --merge-output-format mp4 -o "test2.mp4" https://www.youtube.com/watch?v=7BwW2dH6ZI0 (yolov5_313) >>> python detect.py --weight runs/train/exp/weights/best.pt --source test2.mp4 --iou-thres 0.5 --conf-thres 0.5 --view-im ### Lab2-12:使用自己的模型進行預測:自行撰寫 Python (2-3.py) ### # 匯入必要套件 import torch from torch.serialization import add_safe_globals from models.yolo import Model # 匯入 YOLOv5 的模型類別(需在 yolov5 專案根目錄執行) # 允許 PyTorch 在載入模型時安全地識別 YOLOv5 的 Model 類別 add_safe_globals([Model]) # 載入本地自行訓練的 YOLOv5 模型權重 # 'custom' 表示使用自訂模型,path 指向訓練產生的 best.pt 權重 model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/exp/weights/best.pt') # 設定要偵測的影像路徑 img = 'datasets/road/images/train/road6.png' # 設定模型偵測參數 model.iou = 0.5 # IoU (Intersection over Union) 門檻值,影響 NMS(非極大值抑制) model.conf = 0.5 # 信心分數門檻值,低於此值的偵測結果會被過濾掉 # 對影像進行物件偵測 results = model(img) # 在終端機印出偵測結果摘要(物件類別、信心分數、邊界框資訊) results.print() # 顯示偵測後的影像(會開啟視窗顯示帶有邊框與標籤的圖片) results.show() # 儲存偵測結果影像 # 預設會存到 runs/detect/exp/ 資料夾 results.save() # 將偵測結果轉成 Pandas DataFrame 格式並印出 # 每一行包含: # xmin, ymin, xmax, ymax:邊界框座標 # confidence:信心分數 # class:類別索引 # name:類別名稱 print(results.pandas().xyxy[0]) ### Lab2-13:使用自己的模型進行預測:自行撰寫 Python 測試下載的 YouTube 影片 (2-4.py) ### # 匯入必要套件 import torch from torch.serialization import add_safe_globals from models.yolo import Model # 匯入 YOLOv5 的模型類別(需在 yolov5 專案根目錄執行) import cv2 # 匯入 OpenCV,用於讀取影片與顯示影像 # 允許 PyTorch 安全地載入 YOLOv5 的 Model 類別 add_safe_globals([Model]) # 載入本地自訂訓練權重 # 'custom' 代表使用自訂模型,path 指向訓練產生的 best.pt 權重 model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/exp/weights/best.pt') # 開啟影片檔案,取代攝影機即時影像 cap = cv2.VideoCapture('test2.mp4') # 開始逐幀偵測迴圈 while True: # 從影片讀取一幀影像 ret, frame = cap.read() if not ret: print('無法取得影像') # 如果讀取失敗,跳出迴圈 break # OpenCV 影像預設為 BGR,需轉成 RGB 才能輸入 YOLOv5 模型 rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 對影像進行物件偵測 results = model(rgb_frame) # 將偵測結果繪製在影像上 # results.render() 回傳列表,取第一張影像 [0] output_frame = results.render()[0] # 將 RGB 影像轉回 BGR,以便 OpenCV 顯示 bgr_frame = cv2.cvtColor(output_frame, cv2.COLOR_RGB2BGR) # 顯示偵測結果影像 cv2.imshow('YOLOv5 Detection', bgr_frame) # 按下 'q' 鍵退出偵測迴圈 if cv2.waitKey(1) & 0xFF == ord('q'): break # 釋放影片資源 cap.release() # 關閉所有 OpenCV 視窗 cv2.destroyAllWindows()