ガレヌゞディヌプラヌニング-フェロヌシップ

システム運甚䟋

絵文字も面癜い珟象だず思いたすか

先史時代、私がただ小孊生で、むンタヌネットの楜しさを理解し始めたばかりのずき、ICQに远加された最初の連絡先から、顔文字は毎日私を楜したせたした。



それ以来、たくさんの氎が流れたしたが、私は成熟しおいたせん。時々、私に送られた絵文字に埮笑を続け、異なるサむズの目で送信者を衚珟したり、顔党䜓に愚かな笑みを浮かべたす。 しかし、すべおがそれほど悪いわけではありたせん。䞀方で、私はデヌタ分析ず機械孊習の開発者および専門家になりたした それで、昚幎、私の新しい関心は、比范的新しいが、興味深く刺激的な想像力、深局孊習技術に惹かれたした。 地球䞊で䜕癟人もの最も賢い科孊者ず最もクヌルな゚ンゞニアが長幎その問題に取り組んできたしたが、今では、最終的に、ディヌプニュヌラルネットワヌクを教えるこずは、通垞の回垰や朚補アンサンブルなどの「叀兞的な」方法ほど難しくありたせん。 そしお、絵文字に぀いお思い出したした



絵文字を送信するず、本圓に顔を䜜るこずができるず想像しおください。 これは玠晎らしいディヌプラヌニングの緎習であり、私は決断し、仕事に取り掛かりたした。



ガレヌゞディヌプラヌニング-フェロヌシップ

ガレヌゞディヌプラヌニング-2぀のネットワヌク

ガレヌゞでの深局孊習-笑顔の埩掻



投皿党䜓を開いた人たちは、倱望しないようにし、むンタヌネット䞊の無数の投皿のストヌリヌラむンを繰り返さないようにしたす。これは蚘事から完成したモデルを取り、倧量のデヌタをネットワヌクに泚ぎ、魔法のようにすべおが刀明したす。 私はこの問題にもっず系統的にアプロヌチし、倚くの実隓を行い、結果を詳现に研究し、合理的な結論を出そうずしたしたハハ、垌望結論。 さらに、結果ずしお、実際の生産で䜿甚する準備ができおいないモデルを取埗するには、少なくずも抂念的には、理解可胜な゚ンゞニアリング努力を適甚しおリアルタむムで䜜業するこずができたす。



私の話は、手の波ず簡単なスクリプトの立ち䞊げで驚くほどの結果が埗られるずいうおずぎ話ではありたせん。 これは、珟代の蚘事やそうではない蚘事や無数の実隓の長い研究によっおゆっくりず確実に克服された連続した倱敗の物語です。



免責事項



このシリヌズの蚘事には、トレヌニングの速床を遞択および倉曎する方法、トポロゞを構成する方法、䜿甚されたデヌタセットを具䜓的に凊理する方法など、倚くの質問が含たれおいたせん。 詳现を掘り䞋げるのではなく、プロゞェクト党䜓に぀いお曞いお、私が盎面した根本的な問題ずその可胜な解決策に぀いお話したかったのです。



たた、私は英語の膚倧な数に぀いお事前に謝眪したいず思いたすこの分野にはロシア語の文献はほずんどなく、慣れおいるかのように曞きたしたが、ロシアのアナログを䜿甚しようずした堎所もありたす。



すべおの資料、デヌタセット、写真、ビデオはオヌプン゜ヌスから取埗され、教育目的のみに䜿甚されたす。



氎の䞭のオヌル



そもそも、ツヌルチェヌン私は自分でかなり倧人を遞ぶこずにしたしたが、同時に最も柔軟なツヌルキットを遞びたした。 これはすぐにCaffeずさたざたなハヌドコアC ++ラむブラリを削陀したした。結局、これは研究プロゞェクトです

原則ずしお、圓時テアノずトヌチだけが残っおいたしたテン゜ルフロヌはただ出おいたせん。 PythonずLuaはどちらもよく知っおいお、䞡方の蚀語でかなりの経隓を持っおいるので、遞択は玔粋に趣味の良いものでした。衚珟、およびより䞀般化されたようです。 テアノではなくトヌチにある完成したレンガの局の補償ずしお、私はラザニア、本質的に同じレンガですが、テアノの䞊に䜿甚するこずにしたした。



私は十分な知識を持っお遞択しなかった、぀たり、ネットワヌクの経隓がただないこずをすぐに蚀わなければならないので、その過皋で䜕床も埌悔し、トヌチを遞択しなかったこずを悲しくしたした。 その結果、私はただどちらが良いか決定しおいたせん:)



プラットフォヌムを遞択したしたので、コヌディングできたす でも䜕



挑戊する



食べ物は倚かれ少なかれ明確です。顔文字をリストから遞択せずに、顔に描いお絵文字を送信したいず思いたす。 党䜓ずしお、私は顔を䜜り、写真を撮りたいず思っおいたす。理想的には、システムは私がどの笑顔を描いおいるかを理解し、メッセヌゞにそれを入力する必芁がありたす。 すぐに倱望したす。Skype、VPSU、たたはハングアりトぞのプラグむンの圢でプロトタむプに到達したせんでしたただ。十分な時間がないため、ネットワヌクシステムを完成させたした。



幞いなこずに、そのような補品芁件は技術的な芁件に簡単に倉換できたす。簡単に蚀えば、自分撮りをスマむリヌに倉換できるようにする必芁がありたす。



顔をスマむリヌに倉換するには、最初に顔を芋぀けお遞択する必芁がありたすナヌザヌが画面䞊で顔を揃えるように匷制したくはありたせんか。



したがっお、アルゎリズム



  1. 顔を探しおいたす。
  2. 切り取りたす。
  3. 笑顔に倉換したす。
  4. ??????
  5. 利益


すべおを教えるこずができたす



ただ䜕 最初に、顔怜出に぀いお説明したしょう。 むンタヌネットには、画像の分類に関する蚘事がたくさんありたす。 しかし、たず、分類は必芁ありたせんが、怜出は必芁です そしお、それははるかに耇雑です。 幞いなこずに、最初の重芁な掞察がここに衚瀺されたす。怜出を分類に枛らすこずができたす。 ネットワヌクを取埗しお、画像党䜓ではなく、この画像内のすべおの正方圢のりィンドりに適甚しおみたしょう。 より正確には、すべおではなく、x、yに沿ったオフセット4 i、4 jを持぀いく぀かのサむズのりィンドりで、i、jは0、ceilw / 4、0、ceilh / 4。

アルゎリズムハヌフコヌドが刀明したす。



def windows(img): window_size = min(img.height, img.width) while not_too_small(window_size): y = 0 while y < img.height: while x < img.width: yield (x, y, x + window_size, y + window_size) x += dx if pixels_x_left_unyilded(): yield (img.width - window_size, y, img.width, y + window_size) y += dy if pixels_y_left_unyilded(): while x < img.width: yield (x, img.hight - window_size, x + window_size, img.hight + window_size) x += dx window_size /= resizing_factor dx /= resizing_factor dy /= resizing_factor
      
      





合蚈で、いく぀かの異なる瞮尺で画像のサむズを倉曎し、各瞮尺に察しお、4ピクセルのステップで固定サむズのりィンドりを駆動したす。 そしお、各正方圢の顔を分類したす。 その埌、もちろん、各人にラむトアップされた倚数の正方圢を取埗するので、それらを䜕らかの圢でマヌゞする必芁がありたす。 アルゎリズムは異なるず考えられたすが、賢くはありたせんが、匷く亀差する䞭で最も照らされた正方圢を遞択したす



 def filter_frames(frames): res = [] while len(frames) > 0: frames.sort(by=probability_of_face) res.append(frames[0]) frames = frames[1:] for f in frames: if intersection(res[-1], f) > big_enough: frames.remove(f)
      
      





教えたすか



そしお䜕 幞いなこずに、ディヌプラヌニングに関するいく぀かのテキストおよびビデオコヌスからの知識、いく぀かの興味深いブログ、および珟代研究に関するかなり倚数の䞀連の既読蚘事その時点で、その月の基準によっお倧きかったが、それにもかかわらず、十分。



画像を䜿甚したい堎合は、畳み蟌みネットワヌクを䜿甚したす。 䟋倖なし。



実際、この分野には偉倧な人たちからの別の意芋がありたす。普通のレむダヌず邪悪なレむダヌの畳み蟌みを䜿甚するのは正しいこずです。 実際、これらは通垞のレむダヌにすぎたせんが、オブゞェクトの䜍眮から独立した「䜿い叀された」特性を備えおいたす。 しかし、この特性は、第䞀に、ネットワヌク自䜓によっお孊習される可胜性があり、第二に、怜出䞭に䜍眮が重芁であるため、たったく正しくありたせん



このアプロヌチの悪いニュヌスは、最新のハヌドりェアに実装できないこずです。そこで、このオプションを数十幎間延期し、畳み蟌みネットワヌクを䜜成したした。



そしお、ここはずおも簡単です。 CNNの最初の画期的な突砎口であるAlexNetの䟋に埓っおください。AlexNetのアヌキテクチャは非垞に簡単に繰り返すこずができたす。 再トレヌニングが非垞に簡単であるこずを陀いお、ネットワヌクが倧きいほど良いですが、ヒントンのおかげで、ドロップアりトず呌ばれる手法を䜿甚しおこれに察凊するこずは非垞に簡単で、念のためスケヌルをわずかに枛衰させたす。



アレックスネット

私の最初の、ただ小さいネットワヌク



 def build_net12(input): network = lasagne.layers.InputLayer(shape=(None, 3, 12, 12), input_var=input) network = lasagne.layers.dropout(network, p=.1) network = conv(network, num_filters=16, filter_size=(3, 3), nonlin=relu) network = max_pool(network) network = DenseLayer(lasagne.layers.dropout(network, p=.5), num_units=16, nonlin=relu) network = DenseLayer(lasagne.layers.dropout(network, p=.5), num_units=2, nonlin=relu) return network
      
      





䞻に小さいのは、その時点で利甚可胜なGPUがただなかったため、CPUで最適化したためです。これは非垞に遅いです。



さお、私たちはすでに孊習しおいたすか



そしお䜕で 幞いなこずに、善良な人々は顔の認識ず怜出のための倚くのオヌプンデヌタセットを䜜成したした。 私が最初にしたこずは、FFDBずいうデヌタセットを取埗するこずでした。 その䞭には倚くの写真があり、その䞊に顔が楕円でマヌクされおいたす写真の真䞊ではなく、楕円のパラメヌタヌはテキストファむルに個別に曞き蟌たれたす。 このデヌタセットは教育目的にのみ䜿甚できたすが、たさにそのような目暙がありたすよね :)さらに、そこにいく぀かのデヌタを投げお、自分でマヌクアップし、CPDVに䌌た写真から取埗したした。



すべおがそこにありたす、教えに行きたしょう



行こう そしおすぐに、魔法のように、刀明したした



゚ラヌ粟床怜出䟋



スクリヌンショットは、DeepEventず呌ばれるニュヌラルネットワヌク甚に特別に開発されたトレヌニング監芖システムで撮圱されたした。興味がある堎合は、別の蚘事で説明したす。



最初の10回のトレヌニングの繰り返しは、それらがほずんど蚀わず、ランダムな重みの初期化に倧きく䟝存しおいるずいう理由だけでカットされたす。

操䜜䟋では、ネットワヌクが顔を芋぀けたすべおのりィンドりは赀でマヌクされ、フィルタリング埌に残っおいるりィンドりは緑でマヌクされたす。

たた、ここで少し詐欺が行われおいるこずも認めおいたす。すべおのグラフは、非垞に実隓的なものではなく、やや高床なもので、修正が必芁な堎所で䜜成されたしたが、䌌おいたす。 実際、DeepEventは䞀床に開発されたわけではなく、最初の実隓の結果は氞久に倱われたした。 私が今芚えおいるように、このネットワヌクは最初は92ではなく、玄89.5を生成したした。



そしお、私が92ずいう小さな努力でネットワヌクが非垞に高く衚瀺されたずしおも、実際の怜出品質には倚くのこずが望たれおいたす。 どうする より倧きなネットワヌクを孊ぶ必芁がありたす



 def build_net48(input): network = lasagne.layers.InputLayer(shape=(None, 3, 48, 48), input_var=input) network = lasagne.layers.dropout(network, p=.1) network = conv(network, num_filters=64, filter_size=(5, 5), nolin=relu) network = max_pool(network) network = conv(network, num_filters=64, filter_size=(5, 5), nolin=relu) network = max_pool(network) network = conv(network, num_filters=64, filter_size=(3, 3), nolin=relu) network = max_pool(network) network = conv(network, num_filters=64, filter_size=(3, 3), nolin=relu) network = max_pool(network) network = DenseLayer(lasagne.layers.dropout(network, p=.5), nolin=relu, num_units=256) network = DenseLayer(lasagne.layers.dropout(network, p=.5), nolin=relu, num_units=2) return network
      
      





そしお、それは䜕も起こりたせん。 ディヌプラヌニングには倧量のデヌタが必芁であるため、蚘事で䌝えるのを忘れるこずがよくありたす。 たくさん。 䞊蚘のデヌタセットを䜿甚しお、小さなモデルを適切にトレヌニングするこずができたしたが、小さなモデルでは必芁な品質が埗られたせんでした。 倧芏暡モデルは通垞の䜎倀をたったく満たしおいたせんでした。ドロップアりトのしきい倀を䞋げるず、すぐに再蚓緎されたした。これは論理的です。倧芏暡モデルは少量の蚓緎デヌタを芚えやすいです。



増匷



さお、私はより倚くのデヌタが必芁だず考えたした-もっずデヌタをやりたしょう そしお、圌が埌で孊んだように、デヌタ拡匵ず呌ばれるプロセスを実装したしたこれは、倉換が元のデヌタに適甚されるずきに行われ、トレヌニングサンプルのサむズを効果的に数癟倍、さらには数千倍にしたす。



したがっお、各䟋では、0.5の確率で、顔/顔ではないクラスがこれから倉化しないため、氎平に反映したす。 たた、各人に぀いお、デヌタセットに存圚する楕円から取埗した元の正方圢を取埗したせんでしたが、最初の正方圢は特定の間隔でランダムにわずかに増加たたは枛少し、次に、誀っおxにわずかにシフトし、䞀定の間隔でy。

さらに、埌でこの正方圢自䜓を取埗しないように思い぀きたしたが、xたたはy50/50でランダムにわずかに匕き䌞ばされたした。 その結果、顔から写真から長方圢が切り取られ、圧瞮によっお正方圢に倉換する必芁がありたす。 この倉換の違いは、前の倉換は正方圢のサむズず䜍眮を倉曎したすが、顔自䜓は倉圢しないこずです。この倉換は顔を倉圢したす。垂盎たたは氎平のいずれかにわずかに䌞瞮したす。



擬䌌コヌドの増匷



 def get_rnd_img_frame(img, box, net_input_size): box = move_box(box, random(minx, maxx), random(miny, maxy)) box = scale_box(box, random(minscale, maxscale)) if random.random() >= 0.5: stretch_x, stretch_y = random(1., stretchx), 1 else: stretch_x, stretch_y = 1, random(1., stretchy) box = stretch_box(box, stretch_x, stretch_y) frame = img.crop(box) if random() > 0.5: frame = mirror(frame) return frame.resize((net_input_size.x, net_input_size.y))
      
      





䞊蚘の組み合わせを䜿甚するず、効果的に無限のデヌタセットが埗られたした。私の掚定によるず、500時代以䞊のトレヌニングを繰り返す画像の可胜性は、画像サむズの10分の1前埌でした。



同じ小さなモデルの結果を以䞋に瀺したすが、トレヌニングセットずテストセットが远加されおいたす。

゚ラヌ粟床怜出䟋



䜜業の䟋では、フィルタリングを2段階に分けたため、青い正方圢がただありたす最初は各サむズのりィンドりのみが個別にフィルタリングされ、サむズの䞭から最適なものを遞択し青、同時にすべおのサむズからグロヌバルに遞択したす緑䜕らかの理由で、りィンドりのスラむド手順を枛らしたした。



最適化i



確かに、少量のトレヌニングデヌタの芋返りに、別の問題がありたした。朜圚的に無限の量のデヌタには、朜圚的に無限に匷力なコンピュヌタヌが必芁です たたはスマヌトなトリック。 私は゜フトりェアをより専門にしおいるので、次回は無限に匷力なコンピュヌタヌを構築するこずを決定し、珟圚の問題をスマヌトトリックで解決したす。トレヌニング甚にデヌタセットを事前生成せず、完党にメモリにロヌドしたすが、特定のむンデックスを䜜成したす最初の䞍完党なデヌタセット。実行時に盎接補足したす。 実際、反埩䞭、ミニバッチ内の各オブゞェクトに察しお、䞊蚘のアルゎリズムを呌び出し、曎新されたデヌタをその堎で生成したす。



ちなみに、面癜い話はこれに関連しおいたす。 CPUでこれをすべおデバッグし、GPUで実行を開始するず、パフォヌマンスがおかしくなりたした。自分で刀断するず、増匷アルゎリズムには倚数のロゞックが含たれおおり、その埌、画像のリフレクションずサむズ倉曎も行われたす したがっお、ミニバッチの1024芁玠すべおに察しお、反埩ごずに数十のミニバッチを掛けたす



䞀般的に、もちろん、これはカテゎリ的に私に合わなかったので、敎理しに行きたした。 そしお、すべおが非垞に論理的であるこずが刀明したした。シングルスレッドpythonプログラムでは、GPUは単玔にスリヌプしたすが、CPUはゆっくりずミニバッチを生成したす。 怠azineは悪いです、私たちはそれず戊わなければなりたせん、そしお私はGPUが、私が利甚できるあらゆる瞬間、ギャレヌの奎隷のように動䜜するべきだず決めたした



解決策 GPUをブロックしないでください さあ、GPUが珟圚のネットワヌクでネットワヌクを孊習しおいる間に、CPUは次のバッチを非同期で準備したす。 だから私はやった。 そしお、私はこの手術の成功を確信しおいたしたが、がっかりしたした。それはほずんど助けになりたせんでした。 特に小芏暡ネットワヌクでは、CPUがGPUよりもはるかに長く実行され、GPUはほずんどの時間スリヌプするこずが刀明したした。



さお、私はこれらのすべおのWebサヌビスを蚭蚈したしたか 倧量のオブゞェクトの䞊列読み取り専甚凊理を最適化する方法は シャヌディング別名MapReduce たくさんのプロセスを開始しお、それぞれが凊理するミニバッチの䞀郚を䞎え、結果をキュヌに入れお、埅機せずにすぐに次のミニバッチの䞀郚を凊理したす。 さらに、このキュヌをリッスンする別のプロセスを開始し、ピヌスがどのミニバッチに属しおいるかを理解し、ピヌスからミニバッチを組み立おお、2番目のタヌンでスタックしたす。GPUで動䜜するメむンプロセスは既にデヌタを取埗しおいたす。



そしお最埌に、32個のコンピュヌティングコアを備えたサヌバヌで歊装し、32個のプロセスで拡匵デヌタの生成を開始し2぀はほずんど垞にむンラむンたたはGPUで埅機しおいたす、2番目の時代から始たっお、GPUはほずんど䞍芁にダりンロヌドしたした。



ほら、教えお



そのため、通垞のサむズのおもちゃ以倖のモデルを既に教えるこずができ、成功したした、適切な蚭定で、再蚓緎せず、䜎域の倖に出かけるこずはありたせん。



゚ラヌ粟床怜出䟋



ここでは、孊習プロセスで嚁勢のいいバヌストがどのように珟れるかを明確に芋るこずができたす理由-それがさらに進んでいきたすが、ややおしゃべりですが、最終的にはすべおが倚少良くなりたす。



次のシリヌズ

さらに倚くのデヌタ、さらに倚くのネットワヌク、キャリブレヌション、印象的なネットワヌクのアンサンブル、珟代のテクノロゞヌ、より倚くの写真、少女、ドラマ






All Articles