最初から完璧なアノテーションを用意できるという幻想

# 序文

世の中で厄介なことは、いっけん正しいそうに見えているくせに、それを正しい方針だと思ってその後の手順を構築すると失敗することがあるということだ。
とてももっともらしく見えるから、面と向かって反対をする人はいない。その「きれいな方針」にしたがってその後の工程を設計するときれいに無駄なくうまくいくように思える。

- 「最初に学習データに対しての正解のアノテーションルールをきちんと決めましょう」
- 「そのルールにしたがって、学習データにアノテーションをつけていきましょう」
- 「そうすれば、機械学習はすんなり成功します」

まあ、とてもきれいな方針だ。

しかし、この文章の中では、あえて、それに反対の意見を述べようと思う。
**「最初から完璧なアノテーションを用意できる」というのは幻想**にすぎないと。
また、上記の1回で学習が完了するかのような説明は、実利用を目的とした現場では起きないことだ。
**絶えず学習を繰り返すし、アノテーション済みのデータに対するアノテーションを修正し続けなくてはならない。**
そう主張しようと思う。


## データこそ命
- 検出性能を飛躍的に向上させる検出アルゴリズムの新規実装をしないほとんどの人場合、データこそ命である(注)。
    - アルゴリズム構築に腕に自信がある人は、もちろん検出アルゴリズムの性能向上で、目的の検出を成功してくれればうれしい。
    - 私は、今はデータこそ命という立場。
- 目的の検出性能を達成させるためには、学習・評価データを積み増すことで、性能を達成することを目指す。
- 目的とするユースケースでの検出がうまくいくようにするには、想定する見え方の被写体の画像を多数集めるのが効果的だ。
- 学習な何回も繰り返すことになる。
    - そのやり方がうまくいくことを確信するための学習
    - ぎりぎり我慢できる水準の学習
    - 余裕をもって実用に耐える水準の学習

そのためには、学習データの大幅な積み増しが必要だ。

## 難しすぎるデータは、開発の敵
- あなたが実現する用途において、その画像での検出が本当に必要ですか？
    - 例：監視カメラの見え方では、スケートボードでジャンプしている人を下から見るなんてことはない。
- [MS COCO](https://cocodataset.org/#home)のデータセットを実際に見てみよう。このデータセットは実施にはとても難易度が高い。
- 特に人の検出には難しいデータセットだ。
    - 人のごく一部だけしか写っていないデータが含まれている。
    - さまざまな文化的な理解を持っていることで、理解可能なものがある。
    - 例：フルフェイスのヘルメットをかぶった人の後ろ姿。
- あなたの開発の目的でサポートする必要がある部分だけ学習に加えること。
    - 例：監視カメラだったら、フルフェイスのヘルメットの人物を検出できることは必須だろう。
- ユースケースでサポートする必要がない「難しすぎるデータ」を加えて学習させることは、学習が失敗させやすくするだけで、なんの役もない。（難しすぎるデータを加えると、適合率が低下する傾向があるようだ。）
- 「完璧なアノテーション」を仮定する場合とは、この文章では異なる立場で書いている。

## アノテーションは、学習可能と考える範囲でつけられるもので、その時代のアルゴリズムでの制約を受ける。
- 顔のアノテーションの場合
- 眼の位置で検出枠に制約を与えていた時代（HaarCascade の顔検出）
    - 検出枠を(0, 0), (1, 1) で正規化した時に両目の位置が(0.25, 0.25)、(0.75, 0.25) にするような正解位置を用いていたことがあった。（正面顔で、面内回転がない場合）
    - 横顔に対してどのように検出枠を設定するのかは、顔検出の実装ごとに大きく異なっていた。
- 深層学習の場合
    - 検出枠を正方形にする制約はなくなった。顔の肌色の領域で下はあごの部分まで含むようになっていることが多い。
- 深層学習（ランドマーク検出）の場合
    - 両目・鼻・口の両端の位置を入力して、ランドマークを学習させている。
    - 両目・鼻・口の両端の位置が最小限のランドマークで、ランドマーク検出の他の実装の場合には、もっと多くのランドマークをもっている。
- 深層学習（セグメンテーション）の場合
    - 顔と判断する領域を画素単位で指定する。
 
このように顔のアノテーション一つとっても、その時代の機械学習が到達している範囲の影響を受けてアノテーションができている。
つまり、何をどうアノテーションするのか自体が、決定的なものがあるわけではなく、「完璧なアノテーション」というのは幻想にすぎないのではないかと私は思っている。

## データセットは解決しやすい順序に作成する。
- 機械学習の課題は、解決しやすい部分が存在する。
- まずは、その解決しやすい部分から解決していく。
- アノテーションの曖昧さによって影響を受けにくいものから学習していく。
- そのため、検出問題ならば、隠れ（＝オクルージョン）の少ないものを、部分的な見えのデータはないようにする。
- 画像に対して、そのような領域は塗りつぶしておく。
- そうすれば、隠れ（＝オクルージョン）の少ないものを、部分的な見えのデータの状況を生じることがない。
- その分、解決しやすい問題になる。
- 解決しやすい問題を解決してから、次の難易度の問題を学習させることにする。

## データセットは、どういう見え方をカバーするのかを明確にして、追加していく。
- どういう見え方に対して、現時点で弱点が存在するのかを明らかにする。
- そのためには、ある共通の特徴をもつデータセットを作る。
- そうして、課題を１つ一つ解決していく。

## アノテーションルールで見解がわかれやすいポイント
- どれくらいの領域が隠れたらアノテーションの対象外のするか。
- 対象物の大きさがどれくらい小さいのまでアノテーションをつけるか。

## 利用したいデータ全体に手動でアノテーションをすることができない。
- 完璧なアノテーションに程遠い状況は、利用したいデータ全体に手動でアノテーションをできないということだ。
- 手動で全数アノテーションというもくろみは、ある程度学習が進んだ時点で捨てなくちゃならない。


## 半教師あり学習
- 仮の真値でのアノテーションを追加して学習させる。
    - 例：目視でチェックした部分の仮の真値でのアノテーションを学習に追加する。

- 記事 [より良い機械学習のためのアノテーションの機械学習](https://tech-blog.abeja.asia/entry/ml-annotation) 
    -  「教師なしデータを利用して教師あり学習の精度を向上できるか？」という視点での試行結果を書いています。 
- 目視のチェックを必要とせずに、教師なしデータを利用して教師あり学習の精度を向上させる方法を、私はまだ見つけていません。（いい方法を知っている方がいらっしゃったら、ぜひ教えてください。）
  

- SlideShare[SSII2020 [OS2-03] 深層学習における半教師あり学習の最新動向](https://www.slideshare.net/SSII_Slides/ssii2020-os203-235389281)
- [SSII2021 [OS2-03] 自己教師あり学習における対照学習の基礎と応用](https://www.slideshare.net/SSII_Slides/ssii2021-os203)
- Interface　2023年４月号　[「特定人物を追従しながら学習させるre-identification 学習済みモデルを使った自動アノテーション」](https://shop.cqpub.co.jp/hanbai/books/MIF/MIF202304.html)
この記事の中では、動画で追跡を行いながら、その結果を用いて、半自動のアノテーションを生成するものです。


# 自己教師あり学習(self-supervised learning) について調査しよう。

[自己教師あり学習（Self-Supervised Learning：SSL）とは？](https://atmarkit.itmedia.co.jp/ait/articles/2302/15/news018.html)

# まとめ
- 解決する課題の範囲を比較的簡単な範囲に押し留めた開発を初期の段階では行う。
- そこで実績を上げてから、しだいに難しい条件を含めるアノテーションに変えていく。
- 学習アルゴリズム進化して、学習可能な範囲が増えていくと、それにしたがってアノテーションルールも変わっていく。
- 半教師あり学習や自己教師あり学習などを活用することで、手動アノテーションの必要数を減らそう。
- どのような見え方をカバーするのかを明確にしたデータセットを作ってアノテーションするのを含めるのがよい。

# SEE ALSO
以下の記事は顔表情分類でのアノテーションの課題を示している。
- 連続的に変化する表情に対して、正解ラベルを付与できるのかという問題点。
- アノテーションを実施する人によって、判断が分かれるものに対して、どう正解ラベルを付与するのかという問題点。
Qiita [完全感覚アノテーションで心が壊れた話](https://qiita.com/Negelon/items/9ff7c9f7170d5c0554e9)

# 注
- アルゴリズムを新規に開発しないという前提では、データ拡張を自前で行うとか、前処理を別途行うなどの工夫がある。