【YOLOXで自前のアプリを作る。その1】- YOLOXで学習させるための、COCO形式の自前データセットを作成する。

画像に写っているものを検出する「物体検出」にはR-CNNやSSD,YOLOといったディープラーニングを用いた手法があります。
なかでもYOLOは処理速度が速く精度も高いといわれています。

このYOLOにはいくつかバージョンがあるのですが、今回は最新バージョンであるYOLOXで使える学習データセットを自作したいと思います．

最終的には自分で用意した画像から学習データを作成して、そのデータでYOLOXを学習させ自作のPythonアプリに組み込むところまでやろうと思います。
・【YOLOXで自前のアプリを作る。その1】- YOLOXで学習させるための、COCO形式の自前データセットを作成する。 ← イマココ
・[【YOLOXで自前のアプリを作る。その2】- GoogleColaboratoryでYOLOXをとりあえず試す。](https://qiita.com/shigeharu_shibahata/items/b601a1672b41755e8a1e)
・[【YOLOXで自前のアプリを作る。その3】- GoogleColaboratoryでYOLOXの学習を行う。](https://qiita.com/shigeharu_shibahata/items/9d4f44c85b475db0d8a2)
・【YOLOXで自前のアプリを作る。その4】- YOLOXを自作のアプリに組み込む。


【参考URL】
・[jsbroks/coco-annotator](https://github.com/jsbroks/coco-annotator)
・[【coco-annotaror】アノテーションツール](https://qiita.com/PoodleMaster/items/39830656d69d34a39f34)
・[AIのデータを作ろう：アノテーション ～COCO Annotator～](https://poncotuki.com/ai-dl/ai-anncoco/) 
・[COCO Annotatorを使って骨格検知用のデータセットを作ってみる](https://dev.classmethod.jp/articles/making-datasets-for-pose-estimation-by-using-coco-annotator/)


# 環境
- Docker, Docker-Composeが使える環境

# 流れ
- 画像の用意
- coco-annotatorのインストールと起動
- ラベルの作成
- 画像のアノテーション
- アノテーションデータの保存




# 画像の用意
認識したいものが写っている画像を用意してください．
画像は多ければ多いほどよいのですが，100枚くらいでもそこそこ精度が出るようです．
今回は昔飼っていた愛犬の画像を用意しました．超可愛いですね．
![2022080314121700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/6dc70059-507b-f04a-27f1-cce367c0c39e.png)

今回はアノテーションの段階で学習用のデータと検証用のデータに分けておきます．
画像を8:2くらいの割合で分けてそれぞれ，train用，valid用としておきましょう．




# coco-annotatorのインストールと起動
coco-annotator自体はDocker上のサーバーとして動き，ブラウザ経由でwebアプリとして使用するようなものとなっています．なのでまずはcoco-annotatorサーバを立てるところから始めましょう．とはいっても全てdocker上で動くのでメチャクチャ簡単です．

まずは，coco-annotatorのソースを取ってきましょう．
適当なディレクトリに移動して`git clone`します．

```shell
git clone https://github.com/jsbroks/coco-annotator
```

そうしたら，coco-annotatorを起動します．
```shell
cd coco-annotator
sudo docker-compose up
```

これでcoco-annotatorのサーバーが起動します．そしたらブラウザのURL入力欄に`localhost:5000`と入力しwebアプリにアクセスしましょう．

初回はこのような画面が表示されるので適当にUsernameとPasswordを入れてRegisterを押します．
![2022080315312600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/4752e129-adcf-9705-b789-15e45ad864aa.png)
![2022080315354700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/83f513c5-16ee-cf04-241b-3d5e17b2c237.png)




# ラベルの作成
次にラベルの作成を行います．
coco-annotatorではデータセットやアノテーションデータとは別でラベルが管理されているようなので，先にラベルだけ作っておきます．

画面上部のCategoriesをクリックした後，Createをクリックでラベルの作成画面が出てきます．
![2022080315423100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/bde1a005-e40e-7451-7b1c-6871b51c8cc3.png)

Nameに任意のラベル名を入力してCreate Categoryをクリックでラベルを作成します．今回は`mydog`としておきます．
![2022080315490400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/d22143c7-501f-e7f4-6f96-f5c42c24de53.png)

作成できたらこのような画面になります．
![2022080315514100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/9255ff63-1a3b-a041-c71e-63772d14d975.png)



# 画像のアノテーション
画像のアノテーションをして，データセットを作っていきます．

### 準備
まずは，train用のデータセットを作りましょう

画面上部のDatasetsを押し，Createでデータセットの作成画面を開きます．
![2022080315552700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/4dfc40e3-8e10-24db-85de-9823cc098d2d.png)

Dataset Nameに任意のデータセット名を入力します．今回は`my_dog_train`としておきます．
Default Catecoriesの入力欄をクリックすると先程作成したラベルが候補として下に出てくるのでそれを選択します．
Create Datasetでデータセットを作成します．
![2022080317190300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/6d6b0fa0-0d7d-7893-5c79-94b71fc446f1.png)


このような画面になるので作成したデータセットをクリックします．
![2022080317194300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/3b7b9cb4-974d-790d-daa2-72c82aa56699.png)
![2022080317221300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/8ad024e1-9656-5c58-3fce-eda5e76ef55d.png)


ここで最初に用意していた画像のうち，train用の画像を`coco-annotator/datasets/my_dog_train/`の中にコピーし左のScanボタンを押してからブラウザを更新します．
![2022080317240900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/f0a94d4e-0576-f5a1-9bc0-1ce804eafc6f.png)

### アノテーション
それでは画像をクリックしアノテーションを進めていきましょう．
アノテーションの流れは次のとおりとなります．
1. 右のメニューにある＋マークをクリック
2. 画像の検出したい物体の隅2点をクリック（ドラッグではない）
3. 右のメニューにある右矢印で次の画像へ
![2022080317254000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/981f6b65-a469-73fd-bc72-906cc5328560.png)

これを地道に繰り返してすべての画像に対してアノテーションを行います．また，coco-annotatorにはキーボードショートカットが設定されていて，左のメニューにある歯車マークから確認することができます．`p`や`n`でページ送りできたり，`ctrl+z`で元に戻せたりします．

すべて終わったらこの様になっているかと思います．
![2022080317295400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/eae9c3a4-fb22-da21-4041-4bf202777111.png)

同様の手順で，valid用の画像についても`my_dog_valid`という名前でデータセットを作りアノテーションをします．





# アノテーションデータの保存
最後に，アノテーションした結果をcoco形式でダウンロードします．

画面上部のDatasetsボタンからデータセットの一覧に戻ります．
データセットの右のメニューボタンからDownload COCOを選択してダウンロードします．
`my_dog_train.json`と`my_dog_valid.json`という名前でアノテーションデータが保存されるかと思います．

![2022080317443400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396681/91cd485c-e6e1-1f0a-86bd-40de2a4efb3a.png)


`coco-annotator/datasets/my_dog_train`と`coco-annotator/datasets/my_dog_valid`のなかにある画像と，この`my_dog_train.json`，`my_dog_valid.json`は学習に使うのでわかるように保管しておきましょう．