物体検出を改善する工夫ポイント(2023年版)

一般物体検出はまだまだ改良する余地があって、それが工夫次第で改善することが、いくつかの先行例によって明らかになっている。ここでは、それを共有するためにメモする。
 既にYoloシリーズの最新版の実装に既に含まれているdata拡張の部分は、ここでは述べません。
また、 Vision Transformer 系の改良については、この文章では述べません。

#### 無保証です。ここに書いたメモは、私の経験の範囲で書いたものであって、十分な比較検証をしていません。

# 工夫ポイント
## 輝度ヒストグラム 
- 輝度のヒストグラムを改変した画像を学習に追加する。
    - 例：暗い環境の画像に対しては、ヒストグラムの平坦化[Histogram Equalization](https://scikit-image.org/docs/stable/auto_examples/color_exposure/plot_equalize.html)や、[Local Histogram Equalization](https://scikit-image.org/docs/stable/auto_examples/color_exposure/plot_local_equalize.html)
などを実施することで、埋もれがちな特徴を引き出すことができる。
![](https://scikit-image.org/docs/stable/_images/sphx_glr_plot_equalize_001.png)
![](https://scikit-image.org/docs/stable/_images/sphx_glr_plot_local_equalize_001.png)
- このscikit-imageの関数はグレースケール画像に対する処理となっている。
- これをカラー画像に拡張にする。
- RGB 画像を HSV画像に変換する。 HSV画像中のVの値をこれらの手法で改変する。その後画像をRGB画像に変換し直す。
- 変換し直した画像を通常のunit8の画像になるように、skimage.io.imsave()で保存する。保存後に画像が真っ黒だった場合には、0.0-1.0の間で表現されている画像をuint8で保存してしまっているので修正すること。
- 学習の中で形状などの大きな変化に着目して、画素値のわずかな変化を重視しないようにさせるためには
、Uint8の画素値のうち、下位のbitの値を捨てて、上位のbitの変化だけに着目させるようにするという方法もある。
### 改善に寄与すると考える理由：
　機械学習では、入力値の範囲が規格化されていると学習が進みやすいことが知られている。輝度のヒストグラムが明るい側や暗い側に偏っているよりは、[0,1]の連続値もしくは、[0, 255]の範囲の値で分散しているのがいい。また、画像の全域に対して同一の方法でヒストグラムを変換するよりは、領域ごとにヒストグラムを変更するLocal Histogram Equalizationの方が、特徴を引き出しやすい。

- 人検出においては、服装によって再現率が異なりやすいことが知られています。
- 白い服・黒い服はそれぞれの理由で、検出されにくくなることがあります。
- 白い服では、輝度値が高いために、黒い服では輝度値が低いために、輝度値の変動の幅が小さくなります。
- 輝度値の変動の幅が少ないことは、形状や照明によるシェーディングに効果を特徴として拾い上げることが苦手になることを意味します。
- local histogram equalization を用いると、白い服・黒い服において、輝度値のメリハリが強調されます。
- その分、形状や照明によるシェーディングの変化を拾いやすくなります。


## 画像スタイルの変換
- データ拡張の１種として、画像のスタイル変換を加える。そうすることで、物体の形状の情報とテクスチャの情報との中で、物体の形状の情報を優先させる。
- CNNでの画像分類や検出は、対象物の形状よりもテクスチャの影響を受けやすいことが知られている。
- 画像スタイルを変換した画像を加えると対象物の形状に敏感になることが期待できる。
- 検出の学習において、シルエット画像を加えた方がよいという過去の知見も、この流れでとらえることができる。
- 画像スタイルの変換ツールの例
- [Image Style Transfer using PyTorch](https://github.com/Surya-Prakash-Reddy/Image-Style-Transfer-Pytorch#image-style-transfer-using-pytorch)
![](https://github.com/SurajChinna/Image-Style-Transfer-Pytorch/raw/master/assets/download.png)
右の画像は画像スタイル変換で生成した画像です。
この右側の画像でも、人として検出できる方が、人検出で再現率が向上する側に寄与すると期待されます。
注意：画像スタイルの変換処理をそのまま用いると、作業にかかる時間が遅すぎて、多数の画像を加工するには向きません。もっと楽な方法で、画像のテクスチャーを変える方法を作らなくてはなりません。

## 生成系AIの利用
- データ拡張の１種とて、元画像を利用した生成系AIを利用する。対象物の位置・大きさを変えないまま、画像を生成系AIサービスを利用して画像を変換する。
    - 例：人物の顔や服装や照明条件、背景などが大幅に変わる。
    - https://app.kopikat.co/
    - このサイトでは、データの加工した分を加えることでMS COCOのデータセットでの検出率が上がったと述べている。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/ca62361c-ac92-3493-78cf-a17bf10ba905.png)

    - 
## 透過型PNGを利用した背景差し替え
 対象物の範囲だけを残して他の領域を透過属性にした透過型pngファイルを用意しておき、それを対象物の写っていないさまざまな背景画像に貼り付ける。そうすることで、背景への過度な依存性を減らすことができう。
    - 例: [画像編集ソフトウェアによる透過チャネルの編集](https://helpx.adobe.com/jp/photoshop/kb/cpsid_907722.html)
    - https://helpx.adobe.com/jp/photoshop/kb/cpsid_907722.html
    - 例：領域切り抜きサービスの利用
    - https://www.remove.bg/ja
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/7e7fa72f-9bf1-ab36-7e50-568573715206.png)

    - 例：動画入力に対する背景除去アルゴリズムの利用
    -  OpenCVでGMG背景差分 BackgroundSubtractorGMG
<iframe width="560" height="315" src="https://www.youtube.com/embed/z5U1iXhnE8k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## セマンティックセグメンテーションを用いて、対象物の領域を選び出す。
### 前提：sematic segmenatation での対象物の検出モデルが既にあること
- そのようなときには、対象物の領域のマスク画像を作れるので、これを元にしても背景差し替え画像を作れる。
- 前述の「領域切り抜きサービス」も人物検出に限れば、人物領域に対するセマンティクセグメンテーションと同じことを意味する。
- 
# 追記：暗い環境での検出性能を改善するためには
- 光量が半減したときの画像は、通常のjpg，png画像の輝度値を半減したものとはならない。
- これはsRGBのカウントが光量に比例していないことによる。
- そのため、読み込んだ画像の輝度値を半減したものは、光量が半分の環境の見え方を菜園しない。
- 以下の文献は、RAW画像を用いてデータ拡張をすることで、自然なデータ拡張をすることで、学習の改善を実現するものである。
[Rawgment: Noise-Accounted RAW Augmentation Enables Recognition in a Wide Variety of Environments]
(https://arxiv.org/pdf/2210.16046.pdf)
youtube [【論文対談】データ拡張をもっと自然に！CVPR2023採択論文"Rawgment"を紹介 | Sony's Research Minds](https://www.youtube.com/watch?v=nKfnSVyGX_I)

# 深層学習のための学習用データを増やすためのライブラリ
[albumentations](https://github.com/albumentations-team/albumentations)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/09e22b14-b3f7-04e9-2e20-ffd6074aeb3f.png)

## 追加　2024年
- MS COCO datasetに対するデータの拡張としてCD-COCOがある。
- github[CD-COCO: Complex Distorted COCO database for Scene-Context-Aware computer vision](https://github.com/Aymanbegh/CD-COCO)
- 参考にしたX(旧Twitter)
https://twitter.com/PINTO03091/status/1750660837327634667

-----
2024年８月追記

https://github.com/aleju/imgaug
を使って、画像のaugmentationをすることができます。
[imgaugを使ってPythonで画像増幅を行う](https://dev.classmethod.jp/articles/imgaug-introduction/)