7.2. MLが変えたもの¶
imageモジュールには、いくつかのレガシーな検出メソッドが含まれています――Haarカスケードによる顔検出のための find_features()、固定の瞳孔ファインダーである find_eye()、勾配方向の要約のための find_hog()、任意のキーポイント用の find_keypoints() と find_lbp() の経路です。これらはすべて依然として動作しますが、すべて機械学習パイプラインに取って代わられています。
7.2.1. 古典的な分業:手作業で設計した要約、学習された判断¶
古典的なビジョンパイプラインは2段階の仕組みでした。第1段階は生のピクセルを、画像に何が写っていたかを要約するために選ばれたコンパクトな数値のセットに変換しました――ピクセル値そのものではなく、どのパターンがどこに現れたかを表すより短い記述です。第2段階はその要約を受け取り、判断を下しました――顔か否か、この物体かあの物体か、同一ターゲットか別のターゲットか。
この分業が重要だったのは、2つの段階の作者が異なっていたためです。第1段階は人間が書きました。誰かが腰を据えて、2つの特定の矩形間の明るさの差が目の領域のよい要約になること、グリッドの各セルにおける支配的なエッジ方向が立っている人物の輪郭のよい要約になること、各ピクセル周囲の明暗パターンが局所的なテクスチャのよい要約になることを決めたのです。これらの選択はそれぞれ手書きのアルゴリズム――書かれ、デバッグされ、公開されたもの――でした。上記のレガシーメソッドはすべて、標準的なツールとなったこの種の要約でした。
find_features()は、いくつかの矩形内の明るさを合計し、その合計を比較することで画像のウィンドウを要約します。矩形のレイアウトは、人間の顔が信頼できる明暗のコントラストを示すために選ばれました――眉毛と頬、眼窩と額、鼻と周囲の肌などです。find_hog()は、小さなセルのグリッドをたどり、各セルでどのエッジ方向が支配的かを記録することで画像を要約します。このグリッドが選ばれたのは、立っている人物の輪郭が衣服や照明に関係なく認識可能なエッジ方向のパターンを生み出すためです。find_lbp()は、各ピクセルの周囲のピクセルのうちどれが明るくどれが暗いかを符号化することで、各ピクセルの近傍を要約します。この符号化が選ばれたのは、これらの「より明るい/より暗い」パターンが、全体的な照明とは独立して表面のテクスチャを捉えるためです。find_keypoints()は、画像内の角点を見つけ、各角の周囲の領域を、角が回転しても変わらない方法で記述します。この角と回転の方式が選ばれたのは、シーンを別の角度から見たときにも同じ角が再び現れるためです。
要約がいったん手書きされると、その上の小さな学習ステップが数値を組み合わせて判断にすることができました。顔検出アルゴリズムは、矩形差分の要約に学習ステップを取り付け、ラベル付きの顔画像と非顔画像で訓練することで、どの差分の組み合わせが顔を示すかを学習させました。エッジ方向の要約は、ラベル付きの人物画像と非人物画像で訓練された学習ステップに入力されました。角ディスクリプタは、各角にどれだけの重みを与えるかを学習するマッチングステップに入力されました。これらの第2段階はそれぞれ学習アルゴリズム――現代の基準では小さいものですが、学習アルゴリズム――です。
重要だったのは貢献の分業です。人間は要約を提供しました。機械は組み合わせを学習しました。新しいターゲットを追加することは、新しい要約を書くことを意味しました。
7.2.2. ニューラルネットワークが変えたもの¶
ニューラルネットワークはこの分業を消し去ります。ネットワークの最初の層は、手書きのアルゴリズムがかつて行っていた要約作業――エッジ、角、方向を持つバー、テクスチャの検出、まさに上記のレガシーメソッドがそれぞれ検出するよう調整されていたものの検出――を行いますが、それらは手書きではありません。それらは判断ステップが学習されるのと同じ訓練データから、ネットワークの両半分を一度に調整する単一の訓練パスの中で学習されます。より深い層は、手書きの要約の上にあった小さな学習ステップがかつて行っていた組み合わせを行い、これも同じパスの中で学習されます。
誰が何を設計するかという点での変化は全面的です。
人間は入力を設計します――所定のサイズと形式の取り込んだフレーム。
人間は出力を設計します――結果テンソルのレイアウト(分類ではクラスごとに1つのスコア、検出ではボックスのリスト、ランドマークではキーポイントのグリッド)。
人間はラベル付き訓練データを提供します――訓練プロセスが学習する材料となる、十分な数のターゲットの例と十分な数の非ターゲットの例です。
入力と出力の間にあるものはすべて訓練プロセスによって生成されます。要約を書く別個のステップはありません。初期層がエッジやテクスチャの検出器に落ち着くのは、誰かがそのように書いたからではなく、エッジとテクスチャの検出こそがネットワークの予測をラベルに一致させるものだからです。より深い層が形状や物体の検出器に落ち着くのも同じ理由です。両半分は一緒に訓練されるため、各層が生成する要約は、次の層が必要とするまさにその要約になることができます――手書きパイプラインが妥協せざるを得なかった汎用的な要約ではありません。
7.2.3. imageモジュールとの組み合わせ¶
ニューラルネットワークのパイプラインも、依然として同じセンサーAPIを通じてキャプチャし、同じ draw_rectangle() と draw_circle() のプリミティブを通じて結果を描画し、同じ (x, y, w, h) のROIを通じて作業範囲を限定します。典型的なパイプラインは、フレームをキャプチャし、必要に応じて find_blobs() のような古典的な検出器で粗いターゲットを見つけてそのバウンディングボックスをROIとして推論に渡し、推論を実行し、返された検出結果を元のフレームに注釈として書き戻します。古典的なプリミティブが基盤であり、ネットワークはその中間に加わる新しいステップです。