--- disqus: ahb0222 GA : G-VF9ZT413CG --- # YOLOv8初體驗_環境安裝及基本教學_特定物品影像辨識_以煙囪排放黑白煙為例 > [color=#40f1ef][name=LHB阿好伯, 2021/07/16][:earth_africa:](https://www.facebook.com/LHB0222/) [TOC] # YOLO影像辨識基本架構 在使用Python進行特定物品辨識時,需要創建數據集、訓練模型並部署應用。 數據集標註:使用Label Studio或Roboflow標註你的圖像數據集,生成YOLO或Pascal VOC格式的標註文件。 數據增強:使用Roboflow進行數據增強,增加數據集的多樣性。 模型訓練:選擇TensorFlow 2或PyTorch,並使用Detectron2等工具訓練你的模型。 模型部署:使用TensorFlow Serving或TorchServe將模型部署到生產環境中,並使用Flask或Django構建API,提供模型服務。 ## 數據集創建 ### [Label Studio](https://labelstud.io/) Label Studio 是一個開源數據標記工具 簡單明瞭的UI標記音訊、文字、圖像、視頻和時間序列等數據類型 並匯出為各種模型格式 可用於準備原始數據或改進現有訓練數據 以獲得更準確的 ML 模型。 ![image](https://hackmd.io/_uploads/r1ipyS7BC.png) ![annotation_examples](https://hackmd.io/_uploads/HJagO67B0.gif) ![image](https://hackmd.io/_uploads/B1GXu6QHR.png) ### [CVAT](https://www.cvat.ai/) CVAT是一種互動式視頻和圖像註釋 計算機視覺工具。 ![image](https://hackmd.io/_uploads/S1qc3qGLA.png) ### [MakeSense.ai](https://www.makesense.ai/) makesense.ai 是一個免費使用的在線工具,用於標記照片。由於使用了瀏覽器 ![image](https://hackmd.io/_uploads/SkTSCczLC.png) ### 推薦[Roboflow](https://app.roboflow.com/) * 數據預處理和清理:Roboflow 提供工具來清理、轉換和增強圖像數據,提高模型訓練質量和性能。 * 數據標註: 使用 Roboflow 的圖像標註工具為圖像中的對象繪製邊界框並添加分類標籤。 * 模型訓練:選擇適合的架構並使用 Roboflow 訓練計算機視覺模型,支持 TensorFlow 和 PyTorch 等深度學習框架。 * 模型評估和優化:使用 Roboflow 評估工具檢查模型在測試數據集上的表現,並進行模型調優。 * 模型部署:將訓練好的模型部署到本地環境、移動設備或雲端。 * 集成和 API:使用 Roboflow 的 API 將計算機視覺功能集成到您的應用程序中,以便自動處理圖像數據並執行預測。 推薦的原因是他輸出的YOLO資料格式可以直接使用XD 但免費版只能有三個專案QQ 就算想加錢一個月200美金不是我們這種偶爾使用的可以負擔QQ ![image](https://hackmd.io/_uploads/H1A2OamBA.png) 標記的過程也非常簡單 不管是Label Studio或是Roboflow整個UI設計使用上都不困難 ![image](https://hackmd.io/_uploads/B1XBI6XrA.png) ![image](https://hackmd.io/_uploads/Bkg4pK6QHC.png) 創建yaml來紀錄這些資料的位置跟標籤資訊 如以下yaml的內容 ```yaml= train: ../train/images val: ../valid/images test: ../test/images nc: 3 names: ['black-smoke', 'flame', 'white smoke'] ``` ## 模型訓練 - 安裝YOLO `pip install ultralytics` ![image](https://hackmd.io/_uploads/Bk81g7QBR.png) - 開始模型訓練 ```python= from ultralytics import YOLO model = YOLO("yolov8n.pt") results = model.train(data="D:/YORO/data.yaml", epochs=50, imgsz=640) ``` ![image](https://hackmd.io/_uploads/Sk_nkQ7SC.png) ```python= from ultralytics import YOLO model = YOLO("yolov8n.pt") results = model.train( data="D:/YOLO3/data.yaml", epochs=50, imgsz=640, batch=64, # 增加批次大小 workers=64, # 增加數據加載器的工作數 amp=True, cos_lr=True, hsv_h=0.015, hsv_s=0.3, hsv_v=0.2, fliplr=0.2, mosaic=0.2, mixup=0.0 ) ``` - 察看結果 ![image](https://hackmd.io/_uploads/ByKvfIQB0.png) ![image](https://hackmd.io/_uploads/r1p6NpXHR.png) ![image](https://hackmd.io/_uploads/BJPhVTmrC.png) ![image](https://hackmd.io/_uploads/rJu1U67B0.png) - 進一步調整模型訓練 ```python= results = model.train( data="D:/YOLO3/data.yaml", # 指定數據集配置文件的路徑 epochs=150, # 訓練的輪次設置為100 imgsz=640, # 輸入圖像的大小設置為640 batch=128, # 批次大小設置為128,增加批次大小以提高訓練效率 workers=128, # 數據加載器的工作數設置為128,增加數據加載效率 amp=True, # 啟用自動混合精度(AMP)以加速訓練並節省內存 cos_lr=True, # 使用餘弦退火學習率調度器 #hsv_h=0.015, # 色調變化範圍設置為0.015 #hsv_s=0.3, # 飽和度變化範圍設置為0.3 #hsv_v=0.2, # 亮度變化範圍設置為0.2 #fliplr=0.2, # 水平翻轉的概率設置為0.2 #mosaic=0.2, # 馬賽克增強的概率設置為0.2 #mixup=0.0 # 混合增強的概率設置為0.0 ) ``` ![image](https://hackmd.io/_uploads/H1BLU0mHA.png) 經過調整級增加訓練次數可以看到整個模型有變得更好 | 指標 | 模型1 (train15, 100輪訓練) | 模型2 (train14, 50輪訓練) | | --- | --- | --- | | **訓練損失** | | | | - box_loss | 0.5724 | 1.254 | | - cls_loss | 0.9321 | 1.858 | | - dfl_loss | 1.067 | 1.531 | | **驗證損失** | | | | - box_loss | 0.658 | 0.789 | | - cls_loss | 0.453 | 0.267 | | - dfl_loss | 0.477 | 0.243 | | **精度 (Precision)** | 0.966 | 0.729 | | **召回率 (Recall)** | 0.995 | 0.393 | | **mAP50** | 0.486 | 0.207 | | **mAP50-95** | 0.172 | 0.115 | | **訓練時間** | 1.359 小時 | 0.711 小時 | | **處理速度** | 0.9ms preprocess, 177.2ms inference, 5.2ms postprocess per image | 2.9ms preprocess, 175.9ms inference, 22.8ms postprocess per image | ## 模型測試 ```python= from ultralytics import YOLO # 加載訓練好的模型 model = YOLO("runs/detect/train17/weights/best.pt") # 測試單張圖像 results = model.predict(source="D:/YOLO3/123.jpg", save=True, imgsz=640) print(results) # 測試文件夾中的多張圖像 results = model.predict(source="path/to/your/images_folder", save=True, imgsz=640) print(results) # 測試視頻 results = model.predict(source="D:/YOLO3/黑煙測試影片.mp4", save=True, imgsz=640) print(results) results = model.predict(source="D:/YOLO3/黑煙測試影片.mp4", save=True, imgsz=640) from ultralytics import YOLO # 加載訓練好的模型 model = YOLO("runs/detect/train15/weights/best.pt") # 測試視頻並逐幀處理 results = model.predict(source="D:/YOLO3/黑煙測試影片.mp4", stream=True, imgsz=640, save=True) # 逐幀處理結果 for r in results: boxes = r.boxes # Boxes object for bbox outputs masks = r.masks # Masks object for segment masks outputs probs = r.probs # Class probabilities for classification outputs print("Boxes:", boxes) print("Masks:", masks) print("Probs:", probs) # 測試攝像頭(例如內置或外接攝像頭) results = model.predict(source=0, save=True, imgsz=640) # 0表示默認攝像頭 print(results) ``` 找到網路上新聞的影片來進行測試 :::success HackMD檔案限制有簡化GIF畫質 ::: ![黑煙判斷](https://hackmd.io/_uploads/Bykpj0XB0.gif) 🌟 🌟全文可以至下方連結觀看或是補充 全文分享至 https://www.facebook.com/LHB0222/ https://www.instagram.com/ahb0222/ 有疑問想討論的都歡迎於下方留言 喜歡的幫我分享給所有的朋友 \o/ 有所錯誤歡迎指教 # [:page_with_curl: 全部文章列表](https://hackmd.io/@LHB-0222/AllWritings) ![](https://i.imgur.com/nHEcVmm.jpg)