GoogleOpenImageDatasetのデータをYOLOv5,v8で利用可能なデータセットに変換するGoogleColab

# はじめに
今更だが、以前YOLOv5関連の投稿時に作成していたツールを紹介します。
YOLOをお試ししたい人向けです。
ダウンロードツールもあるようですが、使い方がよくわからなかったのと、Pythonのお勉強も兼ね自作しました。

YOLOv8でも使ってみたところ、学習時に一部のファイルを移動するだけで使えそうな感じです。

# 実行環境
Google Colab

# 概要
GoogleOpenImagesDatasetからDLした画像とアノテーションファイル（BOX形式）を、YOLOv5,v8で読み込み可能なデータセットの形式に変換します。
（セグメンテーション、リレーションシップには対応していません）

https://storage.googleapis.com/openimages/web/index.html

# 内容
ノートブックは下記にあります。

<a href="https://colab.research.google.com/github/MamedenQ/OpenImagesDatasetDownloader/blob/master/OpenImagesDatasetDownloader.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>

章立ては、Colabのセクションとリンクしてます。
★が先頭についている章以外は、ただ実行するだけで問題ありません。

内容的にもファイル処理やPandasを使ってデータ処理しているだけなので面白さはないです。自分用にカスタマイズしたい方はご参照願います。バグや提案、改善あればコメントやPRで。ヒマな時に取り込みます。

## 1.事前準備

### ★ユーザ設定（実行者が設定）
ソース内の各変数を設定します。
特に意識しない場合、そのままでも動きます。

```python
# 内部処理用ルートフォルダ
root_folder = "/content/example"

# 最終的に出力されたYolo用の学習データセットをコピーする先のフォルダ
# train_data.zipが配置される
output_folder = "/content/drive/MyDrive/data/Colaboratory/openimages/datasets"

# 各クラスのバウンディングボックス数制限（100以上）
# （クラスによってはバウンディングボックスがやたら多い時もあるため）
# 制限をなくしたい場合、大きめの数字を指定すること
max_box_per_class = 2000

# train/validation/testの件数割合（合計で100になるよう設定）
# OpenImagesDatasetとしてのデータの配分は無視
# クラスによってばらつきがあるのと、自分で割合を決めたい場合もあるため
train_rate = 70
validation_rate = 20
test_rate = 10
```

### 内部処理用パス定義
実行するだけです。
### GoogleDriveのマウント
実行するだけです。
### フォルダの作成
実行するだけです。
### メタデータ、アノテーションファイルのDL
実行するだけです。
### ★学習対象のラベルを設定（実行者が設定）
学習対象のクラスからラベルを特定します。

1.クラスとラベルの紐づきが記述されたファイルの中身を出力

```python
import pandas as pd

df = pd.read_csv(box_class_name_file, header=None)
df
```

2.出力結果にある表の右上の丸いグリッドアイコンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/9a891700-0b29-96d2-de2c-5d23bda2f3bf.png)

3.Filterボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/cfdf5ff6-34a5-5e94-7e8c-cc86fa248f0b.png)

4.クラス名をフィルタ（画像①箇所）し、ラベル名（画像②箇所）をクリップボード等にコピーし控える

複数ある場合は複数控えておくこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/8deffa32-9255-d36d-b8bf-1c7911703234.png)

5.特定した学習対象ラベルを設定

`label_name`変数に特定したラベルを設定する。（4で検索した②の値）
`label_name_identifier`変数にクラス名を設定する。

:::note
対象ラベルが1つの場合においてもリスト形式とすること。
それぞれの変数のに設定するラベルとクラス名は、同じインデックスで対応させること。（`label_name`リストの1番目にBallのラベルを設定した場合、`label_name_identifier`リストの1番目にもBallのクラス名を設定する）
:::

```python:Ballクラスと、Penクラスを設定した例
# ラベル名
label_name = ["/m/018xm", "/m/0k1tl"]

# クラス名（後続のセクションで利用）
label_name_identifier = ["Ball", "Pen"]
```



## 2.アノテーションリスト作成

実行するだけです。

## 3.データセット作成

実行するだけです。

24/01/06---
Colabノートブックのdata.yaml出力内容に誤りがあったため修正しました。

# YOLOで学習し検出

割愛。下記を参考。

https://qiita.com/shinya_sun_sun/items/61205f83ea4873c0993d

v8での学習、検出は別途投稿します。
とりあえず公式のURL載せておきます。

https://github.com/ultralytics/ultralytics

YOLOv8の場合、`data.yaml`をyoloコマンド実行ディレクトリに移動し、`/root/.config/Ultralytics/settings.yaml`の`datasets_dir`に記述されたデータセットディレクトリに`train_data.zip`を解凍してください。

```:!cat /root/.config/Ultralytics/settings.yaml実行結果
settings_version: 0.0.4
datasets_dir: /content/datasets
weights_dir: weights
runs_dir: runs
uuid: 569f3ba64b326db489132663f79cd37279811de477381b83ac131e6cdd129cbb
sync: true
api_key: ''
clearml: true
comet: true
dvc: true
hub: true
mlflow: true
neptune: true
raytune: true
tensorboard: true
wandb: true
```
yoloコマンドを実行しないと上記ファイルは出力されないっぽいです。
（まだYOLOv8をよくわかっていない）

```:学習時のコマンド例
!yolo detect train data=data.yaml model=yolov8s.pt epochs=50 lr0=0.01
```

# おわりに
作ったツールの紹介のため特に語ることはありませんが、こういうツールを作るのってすごく楽しく感じます。
大きなシステムやプログラムを作るよりも、小さなお役立ちツールを作る方がゴールが近くて達成感もすぐ味わえて楽しいです。