なじみのある顔を探しお

こんににちは






この蚘事では、読者に識別のタスクを玹介したす。基本的な定矩から、この分野の最近の蚘事の1぀を実装するこずです。 結果は、写真で同じ人を怜玢できるアプリケヌションであり、最も重芁なのは、その仕組みを理解するこずです。



Bourneの識別Bourneだけでなく









識別問題は分類問題に䌌おおり、歎史的にその問題から生じたした。オブゞェクトのクラスを決定する代わりに、オブゞェクトに必芁なプロパティがあるかどうかを決定するこずが必芁になりたした。 識別問題では、トレヌニングセットはオブゞェクトのセットです M = \ {x_i \} _ {i = 1} ^ n 、それぞれにプロパティがありたす A  Ax_i= 1、\; i = \䞊線{1、n} かどうか。 さらに、すべおのオブゞェクトは同じクラスに属し、指定されたプロパティを持たないオブゞェクトの代衚的な遞択を行うこずは䞍可胜です A 。







たずえば、サルの顔から人の顔を分離する堎合、これは分類タスクです。2぀のクラスがあり、オブゞェクトごずにクラスを指定しお、䞡方のクラスの代衚的なサンプルを䜜成できたす。 顔画像がどの人物に属するかを決定する必芁があり、これらの人物が有限の固定セットである堎合、これも分類タスクです。



今、あなたが圌の顔の写真から人を決定するアプリケヌションを開発しおおり、デヌタベヌスに蚘憶されおいる倚くの人々が絶えず倉化しおいるこずを想像しおください。圓然、䜿甚䞭、アプリケヌションはトレヌニングセットにいない人を芋るでしょう-実際のタスク珟代䞖界は誰も驚かないでしょう。 ただし、分類の問題ではなくなりたした。 解決方法は



人を認識できるようにするには、少なくずも䞀床は䌚う必芁がありたす。 より正確には、少なくずも圌の写真を1枚持っおいるか、特定の画像の圢でそれを芚えおいる。 その埌、圌らがこれたで知られおいない新しい写真を芋せたら、それをすべおの蚘憶された画像ず比范し、答えを出すこずができたす私たちはすでにこの人を芋お、圌たたは私たちが䌚ったこずがないこの人を識別でき、圌だけを芚えるこずができたす。 したがっお、䞊蚘の問題は次のようになりたす。2枚の写真を持぀ p_1、\; p_2 それらが1人に関係するかどうかを刀断したす。 蚀い換えれば、圌らは䞀人に属するずいう特性を持っおいたすか



Ap_1、\; p_2= \ begin {cases} 1amp; \ text {、} p_1 \ text {and} p_2 \ text {belong to person person} \\ 0amp; \ text {、それ以倖の堎合} \ end {ケヌス}














識別問題の定矩は次のずおりです。トレヌニングサンプルによる䟋では、顔の倚くのペア M = \ {p_i、p_j\} _ {i、j = 1} ^ n ビルド識別子 FR ^ n \から\ {0、1 \} 、オブゞェクトに必須属性があるかどうかを刀断できたす。 しかし、離散性は退屈です。サむンの重倧床を知るこずははるかに興味深いです A 確率に等しいオブゞェクト p \ bigAx= 1 \ vert x \ big\ R 。



この䟋の最埌の問題は、 arxiv.org 、 Python 、およびKerasの助けを求めるこずで、もう少し圢匏的か぀英雄的に解決したす。 顔写真-からの行列 R ^ {m \ times n} 。 2人の堎合、1人に属する確率を知りたいです。 確率は0〜1の実数です。したがっお、関数を探しおいたす。 FR ^ {m \ times n} \ times R ^ {m \ times n} \から[0; 1] 。 ダヌドは既に2017幎であるため、機械孊習法を䜿甚しお怜玢したす。 ただし、トレヌニングセットには、定矩からのペアは倚くありたせんが、分類タスクの堎合ず同じように、ラベルを持぀さたざたな人の顔の写真がたくさんありたす。 これらのセットは同等ですが、2番目のセットは操䜜が簡単です。



ボヌンスプレマシヌ









機械孊習の問題を解決する䞊で最も重芁なこずは䜕ですか 答えを探す胜力があるず思いたすか いいえ、䞻なこずはこの答えを怜蚌する胜力です。 機胜 Fx、y= \ xi \ sim U [0; 1] 間隔から乱数を返す [0; 1] は問題に察する完党に正しい解決策ですが、実際には圹に立たない。 「目で芋る」方法に頌らずに調べる方法は 分類問題では、怜蚌セットの正確さ、぀たり正しく分類された䟋の割合を芋るこずができたす。 識別の問題に぀いおは、このようなメトリックは適甚されたせん。 では、問題解決の適性を客芳的に評䟡するにはどうすればいいのでしょうか



タヌゲット詊行ず停者詊行の抂念を玹介したしょう。 最初にオブゞェクトを呌び出したす Xのx \ そのために知られおいる p \ bigAx= 1 \ vert x \ big= 1 、぀たり オブゞェクトには、確率1の必須プロパティがありたすこの問題では、1組の面 p_1、p_2 1人に属する、2人目はそれぞれオブゞェクト Xのx \ そのような p \ bigAx= 1 \ vert x \ big= 0 。 したがっお、我々はセットを考慮したす T = \ {x \ in X \ big \ vert p \ bigAx= 1 \ vert x \ big= 1 \} そしお I = \ {x \ in X \ big \ vert p \ bigAx= 1 \ vert x \ big= 0 \} 怜蚌セットになりたす T \カップI = \䞊線{M} 。 機械孊習タスクに関しおは、圌の遞択の考慮事項は絶察に暙準です-それは代衚的なものでなければなりたせん。 必芁なすべおの可倉性を反映し、十分なサむズである。 たずえば、顔認識システムにさたざたな照明条件での䜜業が含たれる堎合、これらの条件は怜蚌セットでもちろんトレヌニングセットでも提瀺する必芁がありたす。



構築された関数を取りたす F そしおビルド FT= \ {Ft\ vert t \ in T \} -申請結果 F すべおのタヌゲット詊行に察しお。 間隔から実数のセットを取埗したす [0; 1] たたはスコア 。 これらの倀は、圌らがそれをだたそうずせず、それから肯定的な答えを期埅しおいない堎合に、私たちの゜リュヌションがどれだけうたく機胜するかの尺床です。 さらに Ft -代衚ずみなされるサンプル。 その経隓的密床-ヒストグラムを構築したしょう。



圌女は探したす Fx、y= \ xi \ sim U [0; 1] 



ナニフォヌムFのタヌゲット詊行の分垃






同意しお、そのような識別子にはほずんど意味がありたせん-半分の堎合は答えを掚枬し、半分は間違っおいたす。



そのような分垃はすでに私たちに適しおいたす



良いFのタヌゲット詊行の分垃






タヌゲットの詊みの堎合、そのような関数はそうでないよりも正確であるこずをより確実にしたす。



しかし、詐欺垫を配垃せずにタヌゲットの配垃を考慮するこずは無意味です。 それらに察しお同じ操䜜を実行したす分垃密床を構築したす Fi 同じグラフに衚瀺したす。 同様の画像が埗られたす。



暙的および停者の詊みの分垃






詐欺的な詊みの堎合、ほずんどの堎合、私たちの機胜は正しい答えに傟いおいるこずが明らかになりたす。 しかし、これらはただ芖芚的な芳察にすぎず、 客芳的な評䟡を䞎えるものではありたせん。



システムが入力で画像のペアを受け取るず仮定したす。 圌女は圌らのためにこれが暙的の詊みである可胜性を蚈算できたす。 しかし、圌女には明確な答えが必芁です。それは同じ人物であるかどうか、圌を秘密のオブゞェクトに入れるかどうかです。 しきい倀を蚭定したしょう d \ in [0; 1] そしお Ftlt; d 、吊定で答えたす。それ以倖の堎合は肯定で答えたす。 もし d = 0 、システムは誰も認識せず、 d = 1 、その埌、任意の2人が同じず芋なされたす。 グラフは、分垃が分離可胜ではなく、遞択できないこずを瀺しおいたす d 䞡方のケヌスで完璧なパフォヌマンスを達成するために。 たずえば、䞊蚘の䟋で蚭定した堎合、どうなりたすか d = 0.5 



䞭倮にセパレヌタを配眮したタヌゲットおよび停者の詊行の分垃






タヌゲットの詊行䞭にシステムがミスをするケヌスはいく぀ありたすか 数えやすい \ big \ vert \ {x \ in FT\ vert xlt; d \} \ big \ vert -䞍正な詊行ずしお誀っお分類されるタヌゲット詊行の数。 埌者に぀いおも同様です。 次に、名前を付けお、絶察ではなく盞察的な名前にしたす。



FRR = \ frac {\ big \ vert \ {x \ in FT\ vert xlt; d \} \ big \ vert} {\ big \ vert FT\ big \ vert}






FAR = \ frac {\ big \ vert \ {x \ in FI\ vert xgt; d \} \ big \ vert} {\ big \ vert FI\ big \ vert}








䞀歩螏み出したしょう \ Delta d = \ frac {1} {N} そしお、それに察しおFRRずFARの倀を蚈算したす N 間隔からのポむント [0; 1] そしおそれらを1぀のチャヌトに衚瀺したす



遠いずfrr






ここで、遞択された距離に぀いお、 タヌゲットの詊行のどの割合が拒吊され、どの皋床の詐欺の詊行が受け入れられるかを蚀うこずができたす。 そしおその逆に、あなたは遞ぶこずができたす d タスクに基づいお。 䟋えば、芋知らぬ人を逃さないこずが重芁である保護されたオブゞェクトでの怜蚌には、明らかな理由で、それが必芁です d 可胜な限り䜎いFARを提䟛したす。 コンピュヌタヌがあなたを認識し、おはようを望み、あなただけが通垞アパヌトを回る堎合は、䜎FRRず十分に高いFARで停止できたす。コンピュヌタヌが圌にあなたの名前を呌んで誰かに挚拶しおも悪いこずは起こりたせん。



グラフの亀点に泚意しおください。 その䞭の倀はEER Equal Error Rateず呌ばれたす。



EER = \ arg \ min_ {FAR} \ big \ vert FAR-FRR \ big \ vert






遞択した堎合 d = d_ {eer} 、 FARずFRRの倀は等しいです。 EERは、私たちが行った非垞に客芳的な基準です。 これにより、識別の品質党䜓を評䟡できたす。これは、怜蚌セットの平均誀差です。 固定FRRでFARを芋るこずができ、その逆も可胜ですが、ほずんどの堎合、メトリックずしお䜿甚されるのはEERです。



䞊蚘の䟋では、 EER = 0.067です。 これは、すべおの暙的の詊みの平均6.7が拒吊され、すべおの停者の詊みの6.7が受け入れられるこずを意味したす。



もう1぀の重芁な抂念はDET曲線です。察数スケヌルでのFRRのFRRぞの䟝存性です。 その圢匏によっお、システム党䜓の品質を刀断し、1぀の基準の倀を䞀定の秒で取埗できるこずを評䟡し、最も重芁なこずには、システムを比范するのが簡単です。



怜出曲線






ここでのERRは、 DET曲線ず盎線の亀差点です。 y = x 。



Pythonでの玠朎な実装 FARずFRRが次の点でのみ倉化するず考えるず、より最適な堎合がありたす FT\カップFI 



import numpy as np def calc_metrics(targets_scores, imposter_scores): min_score = np.minimum(np.min(targets_scores), np.min(imposter_scores)) max_score = np.maximum(np.max(targets_scores), np.max(imposter_scores)) n_tars = len(targets_scores) n_imps = len(imposter_scores) N = 100 fars = np.zeros((N,)) frrs = np.zeros((N,)) dists = np.zeros((N,)) mink = float('inf') eer = 0 for i, dist in enumerate(np.linspace(min_score, max_score, N)): far = len(np.where(imposter_scores > dist)[0]) / n_imps frr = len(np.where(targets_scores < dist)[0]) / n_tars fars[i] = far frrs[i] = frr dists[i] = dist k = np.abs(far - frr) if k < mink: mink = k eer = (far + frr) / 2 return eer, fars, frrs, dists
      
      





コントロヌルを芋぀けたした今、どんな機胜でも F 遞択しおいたせんが、怜蚌セットでFAR 、 FRR 、 ERRを蚈算し、芖芚的なグラフを䜜成できたす。



重芁識別の問題では、䞊蚘の怜蚌セットず呌ばれるものを開発セット 開発セット、devsetず呌びたす。 将来、この衚蚘法を順守したす。



重芁実軞の間隔は R セグメントに衚瀺できたす [0; 1] 、関数の倀がれロから1の範囲にあるこずは絶察に必芁ではありたせん。 単䞀のセグメントに衚瀺しなくおも、結果に圱響を䞎えるこずなく倀の範囲を考慮するこずができたす。



ベヌス準備



倚くの顔認識デヌタセットがありたす。 䞀郚は有料で、䞀郚はリク゚ストに応じお利甚できたす。 照明に倧きなばら぀きがあるものもあれば、顔の䜍眮にあるものもありたす。 いく぀かは実隓宀で撮圱されたもので、他は自然の生息地で撮圱された写真から線集されたものです。 デヌタ芁件を明確に定匏化するず、適切なデヌタセットを簡単に遞択したり、耇数のデヌタセットから組み立おたりできたす。 私にずっお、この教育タスクのフレヌムワヌク内での芁件は次のずおりでした。デヌタセットはダりンロヌドのために簡単にアクセスでき、あたり倚くのデヌタを含たず、顔の䜍眮に倉動性を含む必芁がありたす。 私が1぀に結合した3぀のデヌタセットは、芁件を満たしたした。





それらはすべお叀くなっおおり、高品質の最新の顔認識システムを構築するこずはできたせんが、トレヌニングには理想的です。



このようにしお埗られたデヌタベヌスは、277人の被隓者ず〜4000枚の画像であり、1人あたり平均14枚の画像でした。 開発セットの察象の5〜10を取り、残りはトレヌニングに䜿甚したす。 トレヌニング䞭、システムは2番目のセットのサンプルのみを衚瀺する必芁があり、最初にそれをチェックしたす EERを考慮。



デヌタを共有するためのコヌドはこちらから入手できたす 。 䞊蚘のアンパックされたデヌタセットぞのパスを瀺すこずのみが必芁です。



ここで、デヌタを前凊理する必芁がありたす。 たず、顔をハむラむトしたす。 これは自分では行いたせんが、dlibラむブラリを䜿甚したす。









 import dlib import numpy as np from skimage import io image = io.imread(image_path) detector = dlib.get_frontal_face_detector() face_rects = list(detector(image, 1)) face_rect = face_rects[0]
      
      











ご芧のずおり、このラむブラリを䜿甚するず、数行のコヌドで顔を囲む四角圢を取埗できたす。 たた、dlib怜出噚は、 OpenCVずは異なり 、非垞にうたく機胜したす。デヌタベヌス党䜓からわずか12人の個人から、圌は怜出できず、単䞀の誀怜出を䜜成したせんでした。



私たちの仕事の正匏な声明は、すべおの人が同じサむズでなければならないこずを意味したす。 この芁件を満たし、同時にすべおの顔を揃えお、キヌポむント目、錻、唇が垞に画像䞊の同じ堎所にくるようにしたす。 遞択したトレヌニング方法に関係なく、このような手段が私たちを助け、確かに倧きな害を䞎えないこずは明らかです。 アルゎリズムは簡単です



  1. 単䜍正方圢には、キヌポむントの先隓的な䜍眮がありたす。
  2. 遞択した画像サむズを知っお、単玔なスケヌリングによっお画像䞊のこれらのポむントの座暙を蚈算したす。
  3. 次の人のキヌポむントを遞択したす。
  4. 2番目のポむントセットを最初のポむントセットにマッピングするアフィン倉換を䜜成したす。
  5. アフィン倉換を画像に適甚しお切り取りたす。


dlibの䟋face_template.npy、 こちらからダりンロヌドでキヌポむントの参照䜍眮を芋぀けたす。



 face_template = np.load(face_template_path)
      
      





顔画像䞊のキヌポむントを怜玢するには、䟋shape_predictor_68_face_landmarks.dat、 こちらからダりンロヌドで芋぀けるこずができる既に蚓緎されたモデルを䜿甚しお、dlibを再床䜿甚したす。



 predictor = dlib.shape_predictor(dlib_predictor_path) points = predictor(image, face_rect) landmarks = np.array(list(map(lambda p: [px, py], points.parts())))
      
      





アフィン倉換は、3぀のポむントによっお䞀意に定矩されたす。



 INNER_EYES_AND_BOTTOM_LIP = [39, 42, 57]
      
      











させる x_1 ^ 0、y_1 ^ 0、x_2 ^ 0、y_2 ^ 0、x_3 ^ 0、y_3 ^ 0 -私たちが翻蚳したい出発点 x_1 ^ 1、y_1 ^ 1、x_2 ^ 1、y_2 ^ 1、x_3 ^ 1、y_3 ^ 1 。 次に、行列で衚されるアフィン倉換 T 関係から芋぀けるこずができたす



\ begin {bmatrix} x_1 ^ 1amp; x_2 ^ 1amp; x_3 ^ 1 \\ y_1 ^ 1amp; y_2 ^ 1amp; y_3 ^ 1 \\ 1amp; 1amp; 1 \ end {bmatrix} = T \ begin {bmatrix} x_1 ^ 0amp; x_2 ^ 0amp; x_3 ^ 0 \\ y_1 ^ 0amp; y_2 ^ 0amp; y_3 ^ 0 \\ 1amp; 1amp; 1 \ end {bmatrix}。






それを芋぀ける



 proper_landmarks = 227 * face_template[INNER_EYES_AND_BOTTOM_LIP] current_landmarks = landmarks[INNER_EYES_AND_BOTTOM_LIP] A = np.hstack([current_landmarks, np.ones((3, 1))]).astype(np.float64) B = np.hstack([proper_landmarks, np.ones((3, 1))]).astype(np.float64) T = np.linalg.solve(A, B).T
      
      





そしお、scipy-imageラむブラリを䜿甚しお画像に適甚したす。



 import skimage.transform as tr wrapped = tr.warp( image, tr.AffineTransform(T).inverse, output_shape=(227, 227), order=3, mode='constant', cval=0, clip=True, preserve_range=True ) wrapped /= 255.0
      
      











䟿利なAPIにラップされた完党な前凊理コヌドは、 preprocessing.pyファむルにありたす。



デヌタ準備の最埌のコヌドは正芏化です。トレヌニングベヌスに埓っお平均ず暙準偏差を蚈算し、それらの各画像を正芏化したす。 開発セットに぀いお忘れないでください。 こちらのコヌドをご芧ください 。















収集、分割、敎列、および正芏化されたデヌタは、 ここからダりンロヌドできたす 。



ボヌンアルティメむタム



デヌタが芋぀かり準備されたので、テスト方法を敎理したした。 戊いの半分が終わった、残っおいる最も簡単なこずは芋぀けるこずです F 良いEERで問題を解決したす。 EER = 10がこのようなトレヌニングタスクに非垞に適しおいるずすぐに刀断したしょう。 実際、このようなシステムは、2぀の写真で同䞀の顔を怜玢するなどの単玔なアプリケヌションでも䜿甚できたす。



コむン



悪い機胜のたさにその䟋から怜玢を始めたしょう Fx、y= \ xi \ sim U [0; 1] 。 開発セットからの写真のペアごずに、ランダムな倀を取埗し、それらにDET曲線を䜜成しおEERを芋぀けたす。



䞍良なランダム関数のdet曲線






ふ






EER = 49.5の堎合、このような識別子は、各決定で投げるコむンよりも優れおいたせん。 もちろん、これはグラフがなくおも理解できたすが、私たちの目暙は、識別問題を解決する方法を孊習し、明らかに悪い刀断であっおも、決定を客芳的に評䟡できるようにするこずです。 さらに、プッシュするものがありたす。



距離



からの2぀のベクトルの機胜は䜕ですか R ^ {m \ times n} 実数を返すこずが最初に思い浮かびたすか ほずんどの人がこの質問に答えるず確信しおいたす。距離です。 確かに R ^ {m \ times n} メトリック空間です。これは、任意の2぀の芁玠を意味したす x そしお y 距離はそれから決定されたす Rのdx、y\ さたざたな方法で入力できたす。 しかし、距離はれロからプラスの無限たで倉化するため、マむナスで考慮する必芁があり、採甚した圢匏化では、その逆も同様です。



たずえば、䜙匊距離を考えたす。



-dx、y= \ cosx、y= \ frac {x \ cdot y} {\ Vert x \ Vert \ cdot \ Vert y \ Vert}








そしお、開発セットで同じ操䜜をすべお行いたす。



 dev_x = np.load('data/dev_x.npy') protocol = np.load('data/dev_protocol.npy') dev_x = dev_x.mean(axis=3).reshape(dev_x.shape[0], -1) dev_x /= np.linalg.norm(dev_x, axis=1)[:, np.newaxis] scores = dev_x @ dev_x.T tsc, isc = scores[protocol], scores[np.logical_not(protocol)] eer, fars, frrs, dists = calc_metrics(tsc, isc)
      
      





このようなDET曲線が埗られたす。



コサむンのdet曲線






EERは16枛少し、34.18になりたした。 より良いが、ただ適甚されない。 もちろん、トレヌニングセットず機械孊習メ゜ッドを䜿甚せずに、関数のみを遞択したためです。 ただし、距離の抂念は堅牢です。そのたたにしお、機胜を玹介したしょう。 F 圢で



F = dfx、fy






どこで d -コサむン距離、および fR ^ {m \ times n} \ to R ^ k embedderず呌ぶ関数ず、その䜜業の結果を宇宙から R ^ k - 埋め蟌み 。 圌女は、トレヌニングセットから埗られた事埌の経隓を考慮しお、別の必ずしも小さいずは限らない次元のいく぀かのスペヌスに画像を「埋め蟌み」たす。



CNN



さお、あなたず私はタスクをさらに単玔化したした。 良い機胜を芋぀けるだけです f 、システムの他のすべおの郚分はすでに配眮されおいたす。 茂みに勝ちたしょう-珟時点では、CNNConvolutional Neural Networksよりも優れた画像を凊理できるモデルは存圚しないこずがわかっおいたす。 次のように、それほど耇雑ではないアヌキテクチャの畳み蟌みネットワヌクを構築したしょう。



cnnアヌキテクチャ






ケラスのモデル
 from keras.layers import Flatten, Dense, Dropout from keras.layers.convolutional import Convolution2D, MaxPooling2D from keras.layers.advanced_activations import PReLU from keras.models import Sequential model = Sequential() model.add(Convolution2D(96, 11, 11, subsample=(4, 4), input_shape=(dim, dim, 3), init='glorot_uniform', border_mode='same')) model.add(PReLU()) model.add(MaxPooling2D((3, 3), strides=(2, 2))) model.add(Convolution2D(256, 5, 5, subsample=(1, 1), init='glorot_uniform', border_mode='same')) model.add(PReLU()) model.add(MaxPooling2D((3, 3), strides=(2, 2))) model.add(Convolution2D(384, 3, 3, subsample=(1, 1), init='glorot_uniform', border_mode='same')) model.add(PReLU()) model.add(Convolution2D(384, 3, 3, subsample=(1, 1), init='glorot_uniform', border_mode='same')) model.add(PReLU()) model.add(Convolution2D(256, 3, 3, subsample=(1, 1), init='glorot_uniform', border_mode='same')) model.add(PReLU()) model.add(MaxPooling2D((3, 3), strides=(2, 2))) model.add(Flatten()) model.add(Dropout(0.5)) model.add(Dense(2048, init='glorot_uniform')) model.add(PReLU()) model.add(Dropout(0.5)) model.add(Dense(256, init='glorot_uniform')) model.add(PReLU()) model.add(Dense(n_classes, init='glorot_uniform', activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
      
      









そしお、トレヌニングセットの叀兞的な分類の問題を解決するこずを圌女に教えたす。250人の被隓者のどれが顔写真を所有しおいるかを刀断したす。 䞊蚘のコヌドに加えお、誰もがケラでこのような簡単なタスクを解決できたす。たた、5〜6行目も必芁です。 この蚘事で説明したトレヌニングベヌスには、 拡匵を適甚するこずが䞍可欠です。そうしないず、デヌタが十分な結果を埗るこずができたせん。



あなたは、分類タスクがそれず䜕の関係があるのか​​、そしおその解決策はどのように私たちを助けるのでしょうか 正しくやる 以䞋で説明するアクションを理解するためには、非垞に重芁な仮定を立おる必芁がありたす  ネットワヌクが閉じた集合の分類問題をうたく解決するこずを孊習した堎合、次元256の最埌から2番目のレむダヌに、察象がトレヌニングセットに含たれおいなくおも、顔画像に関するすべおの重芁な情報が集䞭したす。



蚓緎されたネットワヌクの最埌の局から䜎次元の特城を抜出するこの手法は広く普及しおおり、 ボトルネックず呌ばれおいたす。 ちなみに、kerasのボトルネックを凊理するためのコヌドはこちらにありたす 。



ネットワヌクはトレヌニングされ、256次元の属性が開発セットから抜出されたした。 DET曲線を芋おみたしょう。



怜出曲線cnn + cos






仮定は真実であるこずが刀明し、 EERがさらに13枛少し、結果は21.6に達したした。 コむンを投げるよりも2倍良い。 それはさらに良いですか もちろん、より倧きくより倚様なベヌスを構築し、より深いCNNを構築し、さたざたな正則化手法を適甚できたす...しかし、高品質の抂念的アプロヌチを怜蚎しおいたす。 そしお、量はい぀でも増やすこずができたす。 袖にはただもう1぀の切り札がありたすが、テヌブルに眮く前に少し気を散らさなければなりたせん。



ボヌン゚ボリュヌション









結果を改善する鍵は、最適化の実珟にありたす f トレヌニングセットの情報だけでなく、機胜に関する情報も䜿甚できたす。 d 。 確かに、修正したしょう d そしお私たちは蚓緎したす f 埋め蟌みを䜿甚しおスコアを取埗する方法に関する先隓的な知識に基づいおいたす。 FaceNetの Googleの人々によっお、このようなアプロヌチが初めお提案されたした顔認識ずクラスタリングのための統合された埋め蟌み 。



圌らが提案したアプロヌチはTDE Triplet Distance Embeddingず呌ばれ、以䞋から構成されおいたした。 f ゜ヌススペヌスからのネットワヌクのような R ^ {m \ times n} 埋め蟌みスペヌスぞ R ^ k 䞭間分類問題を解決する必芁なく、修正したす d ナヌクリッド距離ずしお、 損倱関数で考慮に入れたす。 どうやっお それは非垞に盎感的です。1぀の被隓者のベクトルを、タヌゲット空間にできるだけ近づけ、他の被隓者のベクトルから遠ざけるようにしたす。











トリプルを䜿甚しおこのようなネットワヌクを教えるこずが提案されたした。 x_a、x_p、x_n どこで x_a アンカヌおよび x_p ポゞティブ1぀の゚ンティティに属し、か぀ x_n 負別に。 3぀のベクトルすべおに぀いお、 埋め蟌みを構築したす fx_a 、 fx_p そしお fx_n 。 事前にパラメヌタヌを尋ねたす \アルファ 。 関係が次の堎合、トリプルは良いず仮定したす。



\ Vert fx_a-fx_n\ Vert_2 ^ 2-\ Vert fx_a-fx_p\ Vert_2 ^ 2gt; \アルファ








぀たり、特定のアンカヌに぀いお、ポゞティブずネガティブが存圚する゚リア間にギャップがあるこずを意味したす \アルファ 。 この比率がトレヌニングセットからのすべおのトリプルに぀いお成り立぀堎合、デヌタを理想的に分割したした。 そしお、この䞍等匏に違反しおいるトリプルでのみネットワヌクをトレヌニングするこずは理にかなっおいたす。 䞍等匏に基づいお、ネットワヌクの損倱関数を構築できたす f 



Lx_a、x_p、x_n、f= \ frac {1} {N} \ sum_ {i = 1} ^ N \ Big [\ Vert fx_a ^ i-fx_p ^ i\ Vert_2 ^ 2 -\ Vert fx_a ^ i-fx_n ^ i\ Vert_2 ^ 2 + \ alpha \ Big]。






このアプロヌチを䜿甚しお、著者はWildずYouTube Faces DB デヌタセットのLabeled Facesの゚ラヌを30削枛したした。これは間違いなく非垞にクヌルです。 ただし、このアプロヌチには問題がありたす。





ここに、シヌンTPE Triplet確率的埋め蟌みがありたす。これは、顔怜蚌ずクラスタリングのためのトリプレット確率的埋め蟌みで説明されおいたす。



远加のパラメヌタヌを入力する理由 \アルファ い぀より単玔な䞍平等を芁求できるのでしょうか ここにありたす



dfx_a、fx_ngt; dfx_a、fx_p。








それはオリゞナルよりも簡単で解釈しやすいです。私たちに最も近い負の䟋は、私たちから最も遠い正の䟋よりも遠くにあるこずを望みたすが、それらの間にギャップがあっおはなりたせん。 距離が離れおもネットワヌクの曎新を停止しないずいう事実のため \アルファ 埋め蟌みのグルヌプは空間的に間隔を空けるこずができたす R ^ k さらに良い。



トリプレットが指定された䞍等匏を満たす確率を蚈算できたす。



p = \ frac {e ^ {dfx_a、fx_p}} {e ^ {dfx_a、fx_p} + e ^ {dfx_a、 fx_n}}。






で割った e ^ {dfx_a、fx_p} 



p = \ frac {1} {1 + e ^ {dfx_a、fx_n-dfx_a、fx_p}} = \ sigma \ bigdf x_a、fx_p-dfx_a、fx_n\ big






確率の察数を最倧化するため、損倱関数は次のようになりたす。



Lx_a、x_p、x_n、f=-\ frac {1} {N} \ sum_ {i = 1} ^ N \ log \ sigma \ bigdfx_a ^ i、fx_p ^ i -dfx_a ^ i、fx_n ^ i\ big。






そしお機胜ずしお f 著者は、巚倧なCNNではなく、単玔なマトリックスの䜿甚を提案しおいたす。 fx= Wx 既に受け取ったボトルネックの兆候に぀いお圌女に教えたす。 著者が達成した結果は次のずおりです。



元のcnn-tpeの結果






ご芧のずおり、このアプロヌチは元のアプロヌチよりもうたく機胜し、倚くの利点がありたす。





このアプロヌチを䜿甚しおいたす。 このために必芁なコヌドは20行だけです。



 def triplet_loss(y_true, y_pred): return -K.mean(K.log(K.sigmoid(y_pred))) def triplet_merge(inputs): a, p, n = inputs return K.sum(a * (p - n), axis=1) def triplet_merge_shape(input_shapes): return (input_shapes[0][0], 1) a = Input(shape=(n_in,)) p = Input(shape=(n_in,)) n = Input(shape=(n_in,)) base_model = Sequential() base_model.add(Dense(n_out, input_dim=n_in, bias=False, weights=[W_pca], activation='linear')) base_model.add(Lambda(lambda x: K.l2_normalize(x, axis=1))) a_emb = base_model(a) p_emb = base_model(p) n_emb = base_model(n) e = merge([a_emb, p_emb, n_emb], mode=triplet_merge, output_shape=triplet_merge_shape) model = Model(input=[a, p, n], output=e) predict = Model(input=a, output=a_emb) model.compile(loss=triplet_loss, optimizer='rmsprop')
      
      





プロゞェクトでTPEを䜿甚したい堎合は、トリプレットを䜿甚したトレヌニングの最も重芁な問題その遞択の問題を取り䞊げなかったため、元の䜜品を読むのが面倒ではありたせん。 小さなタスクでは、ランダム遞択で十分ですが、これはルヌルずいうよりは䟋倖です。



ボトルネックに぀いおTPEをトレヌニングし、今日の最埌のDET曲線を芋おみたしょう。



tpeの埌のdet-curve






12 のEERは、私たちが望んでいたものに非垞に近いものです。 これは、CNNを䜿甚するよりも2倍、ランダム遞択よりも5倍優れおいたす。 もちろん、より深いアヌキテクチャずより倧きなベヌスを䜿甚しお結果を改善できたすが、そのような結果は原則を理解するのに十分です。



考慮されおいるすべおのメ゜ッドのDET-曲線の比范



考慮されるすべおのメ゜ッドのdet曲線






WebベヌスのむンタヌフェヌスであろうずQtアプリケヌションであろうず、あらゆる皮類の゚ンゞニアリングずシステムぞのむンタヌフェヌスを固定し、写真で同䞀の顔を怜玢するためのプログラムが甚意されおいたす。



応甚䟋






このアプリはGitHubで入手できたす 。



読んでくれおありがずう 同様に、プロフィヌルを賌読し、コメントを残し、車を䞊手に教えおください。 远加は倧歓迎です。



文孊






All Articles