YOLOv8.2.60 Google Colabで学習し、Jetson NanoとPythonで物体検出する（2024/07）

* Jetson Nano 4GB
* micro SDXC 64GB
* logicool C270N
* Ubuntu 20.04

## Google Colab上でYOLOv8.2.60を用いて学習する

### Pythonのバージョンを確認します(2024/07/28時点：3.10.12)
```
!python3 -V
```

### Google Driveをマウントします
```
from google.colab import drive
drive.mount('/content/drive')
```

### YOLOv8.2.60用のディレクトリを作成します
```
%cd "/content/drive/MyDrive/"
%mkdir Python3.10.12_YOLOv8.2.60
%cd Python3.10.12_YOLOv8.2.60
```

### YOLOv8.2.60をインストールします
```
!pip3 install ultralytics==8.2.60
```

### YOLOv8の動作確認をします
```
!yolo predict model=yolov8n.pt source='https://ultralytics.com/images/zidane.jpg'
from IPython.display import Image, clear_output
Image(filename='runs/detect/predict/zidane.jpg', width=600)
```
### Python3.10.12_YOLOv8.2.60直下にdata.yamlをアップロードします
※コロン「:」の後には必ずスペースを入れます。例：names:▢
```:data.yaml
path: pcb
train: images/train
val: images/val

# class names
names: 
  0: pcb
  1: battery
  2: nut
  3: spacer
```
### images、labelsフォルダをアップロードし、学習を行います
./datasets/pcb/images/train/xxx.jpg
./datasets/pcb/images/val/xxx.jpg

./datasets/pcb/labels/train/xxx.jpg
./datasets/pcb/labels/val/xxx.jpg

```
!yolo detect train data=data.yaml model=yolov8n.pt epochs=300 imgsz=640 batch=8
```

:::note info
マイドライブ > Python3.10.12_YOLOv8.2.60 > runs > detect > train > weights に重みファイル best.ptが保存されます。
:::

## Jetson Nanoで YOLOv8を動かす
### Jetson Nano with Ubuntu 20.04 OS image(2024/07/28時点：20.04 3b)を入手します
https://github.com/Qengineering/Jetson-Nano-Ubuntu-20-image

※username：jetson、password：jetson

### キーボード、タイム ゾーンの設定
Settings
-> Region & Language -> Input Sources：Other -> Japanese
-> Data & Time -> Time Zone：JST(Tokyo, Japan)

### モジュールの追加・更新
```
pip3 install psutil==5.9.5
```

### YOLOv8.2.60をダウンロードします

* 「pypi.org」から「ultralytics-8.2.60-py3-none-any.whl」をHome直下にダウンロードします。

https://pypi.org/project/ultralytics/#files

### YOLOv8.2.60をインストールします。
```
pip3 install --no-deps ultralytics-8.2.60-py3-none-any.whl
```

## YOLOv8の動作確認
```
yolo predict model=yolov8n.pt source="https://ultralytics.com/images/zidane.jpg"
```
:::note info
検出結果は「Home/runs/detect/predict」内に保存されます（zidane.jpg）。
:::

* Google Colabで学習した重みファイルを使用して認識を実行

```
yolo task=detect mode=predict model=best.pt source=0 show=True imgsz=256
```

:::note info
Jetson Nano：1 frame：51.6ms（19.3fps）
:::

## Pythonでプログラムを作成する
### プログラム
```:JetsonYolo.py
import cv2
import numpy as np
from ultralytics import YOLO

classes = ['pcb', 'battery', 'nut', 'spacer']
colors = list(np.random.rand(4, 3)*255)
model = YOLO('best.pt')

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

cv2.namedWindow('win', cv2.WINDOW_AUTOSIZE)


while True:
    ret, frame = cap.read()

    results = model(frame, conf=0.5, iou=0.5)

    result = results[0]
    
    for box in result.boxes:
        label = classes[int(box.cls)]
        score = round(float(box.conf), 2)
        color = colors[int(box.cls)]
        print(label, score)

        r = box.xyxy.tolist()
        cv2.rectangle(frame, (int(r[0][0]), int(r[0][1])),
                        (int(r[0][2]), int(r[0][3])), color, 2)
        cv2.putText(frame, f'{label} ({str(score)})', (int(r[0][0]), int(r[0][1])),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2, 4)

    cv2.imshow('win', frame)

    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```
### 実行方法
python3 JetsonYolo.py