YOLOv3 Keras版実装に関して関連記事のまとめ

**Chapters**

📘 **Chapter #0**　[YOLOとは](https://qiita.com/tfukumori/items/65056a4d51b531cdd45c)
📘 **Chapter #1**　[環境設定](https://qiita.com/tfukumori/items/6f33af8f9dc2ac974f43)
📘 **Chapter #2**　[アノテーション](https://qiita.com/tfukumori/items/0911c8fe1f5319530d4b)
📘 **Chapter #3**
　📗 **Chapter #3-1**　[YOLOv3 Keras版実装](https://qiita.com/tfukumori/items/d1f79078803d8a7fe103)
　📗 **Chapter #3-2**　[YOLOv3 Darknet版](https://qiita.com/tfukumori/items/15edd532e0a04c0a4672)
📘 **Chapter #A**
　📗 **Chapter #A-1**　[YOLOの各バージョンについてまとめ](https://qiita.com/tfukumori/items/519d84bf3feb8d246924)
　📗 **Chapter #A-2**　[YOLOv3 Keras版実装に関して関連記事のまとめ](https://qiita.com/tfukumori/items/9e62c4a7acd7ea6ddd3b)
　📗 **Chapter #A-3**　[ONNX変換・確認ライブラリ、アプリケーションまとめ](https://qiita.com/tfukumori/items/3f438294e722bc29fe16)

---

# TL:DR

- [元記事](https://qiita.com/tfukumori/items/d1f79078803d8a7fe103)が手順として煩雑になっていたため、手順以外の調査した結果に関するまとめについてはこちらに分割しています。

# YOLOv3のKeras版実装のソースについて

- [qqwweee/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend)](https://github.com/qqwweee/keras-yolo3)
    <a href="https://github.com/qqwweee/keras-yolo3"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/4125f90d-aea4-d103-a4d9-ace948ae440c.png" width="460px"></a>
    - YOLOv3のKeras版実装
    - [Training (add tensorboard debug, and mAP Calculation) #206](https://github.com/qqwweee/keras-yolo3/pull/206)
        - TensorBoardを使用できるようにしたプルリクエスト
    - [bugfix: anchor selection tiny model #503](https://github.com/qqwweee/keras-yolo3/pull/503)
        - Tinyモデルでのトレーニングに問題があることを指摘したプルリクエスト。
- [Borda/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend) a successor of qqwweee/keras-yolo3](https://github.com/Borda/keras-yolo3)
    - オリジナルのkeras-yolo3が更新されない状態であることを踏まえ活動している模様
- [yolov3の論文の2.3の理解ができません．](https://teratail.com/questions/228831)
    - anchar box（アンカーボックス）についての記載がある。
        
        > 物体の矩形を直接モデルで予測する形 (YOLOv1ではそうなっていた)だと精度が出なかったので、最近の物体検出モデルは Anchor Box を元にして作るようになっています。
        > 
        > > アンカーボックスをk-平均クラスタリングで決めて，各グリッドごとに設定されたバウンディングボックス数分アンカーボックスを設置しているという考えでよろしいでしょうか
        > 
        > それであっていると思います。例えば、YOLOv3 のオリジナル実装である darknet では anchor box は以下のように大きさが決められています。(この値は k 平均法でデータセットから決めています)
        > https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
        > anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
- [学習済みのYOLOv3でオリジナルデータに転移学習(finetune)【物体検出】](https://trafalbad.hatenadiary.jp/entry/2020/01/18/170842)
    - [YOLOv3のネットワーク構造](https://cdn-ak.f.st-hatena.com/images/fotolife/t/trafalbad/20200118/20200118163430.png)などについても記載がある

        > YOLOv3はネットワークの構造上、大きい物体を学習しておけば、推論時には小さい物体も検知できるので、学習時には大きい物体のみくっきり写ってる「良質かつ大量」のデータセットで学習

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/34d6c872-90f7-d35f-a52e-3b25374a7c0b.png)

        引用元：https://trafalbad.hatenadiary.jp/entry/2020/01/18/170842

# トレーニング方法 (カスタム オブジェクトを検出する方法):

PyToach版の実装ですが、いろいろ参考になる情報が記載されています（YOLOv5の作者の記載です）。
https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects

# 画像処理

- [画像リサイズ処理のうんちく](https://qiita.com/yoya/items/95c37e02762431b1abf0)
    - リサイズ処理について記載されている。画像認識（物体認識）では、学習時と推論時に使用したリサイズの処理やフォーマットが異なると結果に影響することがあるため、留意する必要がある。
        
- [6. 実践編: 血液の顕微鏡画像からの細胞検出](https://japan-medical-ai.github.io/medical-ai-course-materials/notebooks/06_Blood_Cell_Detection.html)
    - Data augmentation（データの水増し）の実装が参考になる

# 機械学習一般

- [機械学習に関する知見](https://drive.google.com/file/d/1ba_j0_-Ysq4xg0OpphK3nhvzvi2SWp3q/view)
    - 元山 航 氏による[GCPUG 鹿児島 × TFUG 鹿児島（合同ゼミ）#12](https://gcpug-kagoshima.connpass.com/event/151839/)での資料。データの前処理に関する考えなどが参考になる。

# YOLOv4

- [AlexeyAB/darknet: YOLOv4 - Neural Networks for Object Detection (Windows and Linux version of Darknet )](https://github.com/AlexeyAB/darknet)
    - 本家が出してるわけではないらしい。
    - [物体認識のYOLO V4を試してみる。yolov3_5lに比べて精度と速度は良い。](https://qiita.com/mokoenator/items/84b519dcb38c70c518e7)
        - 自分のサービスに乗っけてみた例
    - [【Techの道も一歩から】第28回「深層学習による物体検出で遊んでみる」 - Sansan Builders Box](https://buildersbox.corp-sansan.com/entry/2020/05/08/110000)
        - 使用してみた例

# YOLOv3の利用

- [Jetson NanoでオリジナルYOLOを動かす](https://qiita.com/tayutayufk/items/3d715184e0a7cefa5e9a)
    - Jetsonでのオリジナルモデルの使用手順が記載されている
- [【5分でOK】KerasでYOLOv3を動かして物体検出に挑戦！【keras-yolov3】](https://tech-diary.net/keras-yolov3/)
    - 簡易的な物体検出手順
- [keras-yolo3 で独自データセットに対して学習させる方法](https://short4010.hatenablog.com/entry/2019/11/12/182527)
    - `voc_annotation.py`の修正、`train.txt`の記述に関する記載がある
- [YOLOv3 アノテーション方法について](https://qiita.com/yusa0827/items/e3bee7c561ddeddeacdb)
    - 元画像に対してアノテーションした上で、アノテーション座標を変換してみた場合の例
- [自前の画像をVoTTでアノテーションしてkeras-yolo3に呪腕のハサンを学習させる](https://qiita.com/owlgae/items/c73f4d3194ced9a9ee3f)
    - keras-yolo3のアノテーションを学習させるtxtファイルの形式等が記載されている
- [YOLOv3 , Mask R-CNNなどの一般物体検出技術をG空間分野に活用する（FOSS4G 2018 Tokyo）](https://www.slideshare.net/YujiKobayashi7/foss4g-2018-tokyo)
    - 衛星画像検出に対する実例
- [Darknet YOLOv3 on Jetson Nano – AI4SIG](https://ai4sig.org/ja/2019/06/jetson-nano-darknet-yolov3/)
    - Jetson Nano上でのYOLOv3とYOLOv3-tinyによる物体検出結果について
- [KerasのYOLO-v3を動かしたった](https://qiita.com/yoyoyo_/items/10d550b03b4b9c175d9c)
    - カメラでのリアルタイム検出あり

# PythonとVisual Studio Code


- Visual Studio CodeでPythonプログラムデバッグ時にコマンドライン引数を渡す方法

    - launch.jsonで指定する

```json:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "args": [
                "--image",
                "--model_path",
                "logs/000/trained_weights_final.h5",
                "--classes_path",
                "model_data/voc_classes.txt"
            ]
        }
    ]
}
```

- Pythonの整形ツールをインストールする場合

  - 好みに応じて設定する

```posh:Pythonの整形ツールをインストールする場合
conda install --name keras-yolo3 autopep8 -y
```

# conda と pip

- [Anaconda の NumPy が高速みたいなので試してみた](https://tech.morikatron.ai/entry/2020/03/27/100000)
    - condaでインストールしたほうが速いモジュールがある。基本はcondaでインストールしてpipはcondaにどうしてもないときに限って使用する。