運用 Colab 進行 YOLOv8 實行火焰烟霧識別模型
===
###### tags: `GDG on Campus FCU 2024/25`
{%youtube 1I9pAptJXUA%}
## 操作步驟
### 建立筆記本
1. 打開 Google Colab,進入「開啟筆記本」彈窗後選擇「GitHub」欄位
2. 將教材文件內的 github 連結複製到彈窗的文字匡內
3. 等待存放區出現下拉選單選擇「Abonia1/Fire-and-Smoke-Detection」
4. 等待 ipynb 連結出現後點選進入筆記本內

### 指令介紹
查詢虛擬機分配的 GPU 狀態
也會列出像是 CPU 型號、使用率、驅動版本...等詳細資訊
```shell
!nvidia-smi
```
將 google drive 掛載到筆記本內
```python
from google.colab import drive
drive.mount('/content/drive')
```
設定工作目錄並且print出檢查
```python
HOME = "/content/drive/MyDrive/FireDetection"
print(HOME)
```
安裝 ultralytics 套件,下載後清除輸出,檢查環境是否符合 YOLOv8 使用需求
```python
# Pip install method (recommended)
!pip install ultralytics
from IPython import display
display.clear_output()
import ultralytics
ultralytics.checks()
```
匯入 YOLO 模型 & 圖片顯示功能
```python
from ultralytics import YOLO
from IPython.display import display, Image
```
在筆記本內「💻 CLI」段落可以指令介面執行跑跑看官方範例
CLI 適合快速 demo,但回傳不易編輯
「🐍 Python SDK」是在寫python程式時可使用的工具包/套件,較為複雜但全面
本次課程會使用「💻 CLI」實作
```python
results[0].boxes.xyxy # 框的座標
results[0].boxes.conf # 信心度
results[0].boxes.cls # 類別
```
操作至此可先至下方「製作 Roboflow 自訂資料集」段落了解資料集是怎麼製作的
將教材文件內程式碼複製到相似的方塊內運行導入資料集
```python
!mkdir {HOME}/datasets
%cd {HOME}/datasets
!pip install roboflow --quiet
from roboflow import Roboflow
rf = Roboflow(api_key="xxxxxxx")
project = rf.workspace("weiyolo").project("fire-fpaaz")
dataset = project.version(11).download("yolov8")
```
按下執行「Custom training」區塊內的程式碼方塊即可進行模型訓練(需數小時時間)
### 製作 Roboflow 自訂資料集
gif 皆來自 https://github.com/Abonia1/YOLOv8-Fire-and-Smoke-Detection.git 筆記本
1. 登入 [Roboflow](https://app.roboflow.com/login)
2. 建立專案 New Project

記得選取「Object Detection」
3. 上傳圖片 Upload Data

4. 使用 [Annotate](https://docs.roboflow.com/annotate) 貼標籤

5. 產生新的資料集版本 Create New Version

6. 匯出資料集 Download Dataset,選取「Code」選項
會跳出程式碼,及 API key

### 輸出結果
輸出產出物件、檔案
```python
!ls {HOME}/runs/detect/train/
```
```
args.yaml train_batch1.jpg
confusion_matrix.png train_batch2.jpg
events.out.tfevents.1675348815.43529bab29be.37247.0 train_batch825.jpg
F1_curve.png train_batch826.jpg
P_curve.png train_batch827.jpg
PR_curve.png val_batch0_labels.jpg
R_curve.png val_batch0_pred.jpg
results.csv val_batch1_labels.jpg
results.png val_batch1_pred.jpg
train_batch0.jpg weights
```
輸出混淆矩陣圖
```python
%cd {HOME}
Image(filename=f'{HOME}/runs/detect/train/confusion_matrix.png', width=600)
```

Fire 被成功偵測 fire 為 true 有 0.89,偵測為 background 有 0.11
輸出數據圖
```python
%cd {HOME}
Image(filename=f'{HOME}/runs/detect/train/results.png', width=600)
```

上半部為訓練集,下半部為驗證集
前三個 loss 越低越好 右兩個為越高越好
由左至右為「邊界判別損失」、「類別判別損失」、「細節判別損失」、「精確率」、「召回率」
輸出結果集合圖
```python
%cd {HOME}
Image(filename=f'{HOME}/runs/detect/train/val_batch0_pred.jpg', width=600)
```
輸出模型數據
表示模型性能
```python
%cd {HOME}
!yolo task=detect mode=val model={HOME}/runs/detect/train/weights/best.pt data={dataset.location}/data.yaml
```
```
/content/drive/MyDrive/FireDetection
Ultralytics YOLOv8.0.20 🚀 Python-3.8.10 torch-1.13.1+cu116 CUDA:0 (Tesla T4, 15110MiB)
Model summary (fused): 168 layers, 11126745 parameters, 0 gradients, 28.4 GFLOPs
val: Scanning /content/datasets/fire-8/valid/labels.cache... 47 images, 0 backgrounds, 0 corrupt: 100% 47/47 [00:00<?, ?it/s]
Class Images Instances Box(P R mAP50 mAP50-95): 100% 3/3 [00:02<00:00, 1.13it/s]
all 47 48 0.828 0.878 0.857 0.459
Fire 47 18 0.761 0.889 0.794 0.376
smoke 47 30 0.895 0.867 0.919 0.543
Speed: 4.9ms pre-process, 17.2ms inference, 0.0ms loss, 1.9ms post-process per image
```