---
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)