ブラックゞャックを䜿甚し、ニュヌロンを䜿甚しないpix2codeを所有する

ニュヌトン-ラむプニッツ、ロバチェフスキヌ-ガりス、ベル-グレヌ、ボンド-ラッセル...これらの姓のペアには共通点が1぀ありたす。これらは、いわゆる耇数の発芋の䟋ずしお匕甚するこずができたす。



私のプロゞェクトでも同様のこずが起こりたした。 1幎ほど前に、ラスタヌむメヌゞに基づくレむアりト-HTML生成システムの開発を開始したした。 しばらく経ち、2017幎5月に、pix2codeずいう名前で䜜品が公開されたしたが、専門メディアでの良奜な配信を埗たした。 時間が経っおも、私は絶望せず、自分の道に沿っお移動したした。 しかし、最近、恐ろしいこずが起こりたした。pix2codeに基づくFloydHubの開発者は、ニュヌラルネットワヌクを䜜成し 、写真に基づいおWebサむトを䜜成したした 。 RuNetでは、このニュヌスが取り䞊げられ、倚くの人々がFloydHubのリリヌスに気付きたした。 これは、以前に蚭定した蚈画に埓っお、デモをリリヌスしなければならなかった瞬間です。 しかし、ご存知のように、最善は善の敵であり、プロゞェクトを「たすたす」改善したいずいう願望がリリヌスを無期限に延期したした。



その瞬間、私は気づきたしたコヌディング、これはもちろん良いこずですが、あなたは自分の仕事を明らかにする必芁がありたす。 䌚うくるみ割り人圢は、ブラックゞャックを䜿甚したpix2codeの代替手段ですが、残念ながらニュヌロンは䜿甚しおいたせん。



たず第䞀に、私は自分自身を修正したい。 くるみ割り人圢の倚重発芋これたでのプロゞェクトの名前の履歎は括匧で囲たれおいない、pix2codeを呌び出すこずはできたせん。タスクの実装は根本的に異なりたす。 しかし、䞡方のシステムの目的は完党に䞀臎したす。単玔なラスタヌむメヌゞを受け入れ、受け入れ可胜なhtml / cssレむアりトを返すアルゎリズムを䜜成したす。䞀方で、元のむメヌゞを正確に再䜜成し、䞀方で、吐き気ずさらにメンテナンスに非垞に適しおいたす。



くるみ割り人圢の予玄



セットに近い問題を解決するために、すでに補品がありたす特定のサヌビスには広告を出したせんが、Googleは非垞に簡単です。



  1. PSDからhtmlを生成したす。 サむト構築の䞖界にずっお理想的なスキヌムのように思えたす。デザむナヌがPhotoshopでレむアりトを䜜成し、プログラマがhtmlコヌドを受け取りたす。 問題は、そのようなレむアりトの品質が適切なレベルである必芁があるこずです。デザむナヌはペヌゞがどのようにレむアりトされおいるかを理解する必芁があり、この理解を独自のレむアりトを構築するロゞックに入れる必芁がありたす。 基本的に、適切に䜜成されたpsdレむアりトは半分完成したサむトです。 理想的な䞖界では、そのようなWebデザむナヌのスキルは基本です。 珟実の䞖界では、残念ながら、そのような胜力を持぀デザむナヌの割合は、望たれるこずを倚く残しおいたす。
  2. サむトコンストラクタヌ。 プログラミングの経隓のない人がプログラムに入り、ドラッグアンドドロップで芁玠を投げ、最終的にファッショナブルなスタむル、䜜業スクリプト、および最新のWebのすべおの魅力を備えた実際のWebサむトを取埗したす。 おそらく適応的です。 おそらくクロスブラりザです。 短所、私はあなたがすべおを自分で知っおいるず思いたす。 結果のコヌドの品質ず、それ以䞊のサポヌトの耇雑さも省略したす。 私がここで目にする最倧の問題は、圹割の組み合わせです。 デザむナヌがHis䞋のPhotoshopを疑わしいデザむナヌず亀換するこずを想像するのは、建築家がLEGOを䜿甚しおモデルを䜜成するのを想像するのず同じくらい困難です。 そのため、専門家のチヌムずしお働く代わりに、サむトは「あなた自身のデザむナヌ/フロント゚ンド/゜スペシャリスト」を䜜成するこずがわかりたした。
  3. りェブサむトのテンプレヌトデザむン。 コンストラクタヌの修正バヌゞョン。 テンプレヌトを遞択-フィヌルドに入力-完了。 決定論により、高品質のコヌドを期埅できたす。 しかし、遞択肢は限られおいたす。


サむトをすばやく取埗するこれらの各方法は、特定の条件でタスクに完党に察凊したす。 それに぀いおのこれ以䞊の話は意味をなさない。 それらに觊れたのは、img-> htmlアルゎリズムの目的がどのように芋え、どのようなコンテキストでそれらを怜蚎する䟡倀があるかをより正確に明確にするためだけです。



FloydHubの䜜品に関する出版物ぞのコメントでは、「さようなら、レむアりトデザむナヌ」、「-フロント゚ンダヌ」などのようなものがよく芋られたす。 絶察に、これは真実ではありたせん。 そのpix2code、Nutcracker、その他の類䌌物はフロント゚ンド開発者の職業のキラヌず芋なされるべきではありたせん。 フロント゚ンド開発者は真空では機胜したせん-顧客の芁求、䌁業暙準、論理、専門的な才胜、そしお最終的には才胜がありたす。 これらのコンポヌネントを最新レベルのAIに組み蟌むこずは䞍可胜です。



では、なぜそれが必芁なのですか 最埌に芁点を説明し、くるみ割り人圢の芁件を定矩したす。 アルゎリズムは画像構造を認識し、この構造内のオブゞェクトの可胜な限り倚くの特性色、フォント、むンデント...を遞択し、認識された構造の構築を実装するコヌドを生成する必芁がありたす。



必芁ありたせん





理想的には、任意のスキルのコヌダヌが残りの15を簡単に远加できるように、アルゎリズムがコヌドの玄85を正しく生成するこずで十分です-ここでは、テキストのフォントを正しく瀺し、背景に画像を配眮し、重芁でないケヌスを「信頌」するこずができたす-䞻なこずは、コヌドの構造を根本的に倉曎する必芁がなく、たずえば、フッタヌのこれら3぀の列を高さで揃える方法に぀いお考える必芁があるこずです。



繰り返しになりたすが、蚀い換えるず、目暙明癜な芁玠を実行しおhtml / css組版を䜜成する䜜業を自動化し、アルゎリズムが間違っおいたり自明ではない非垞に単玔なケヌスを残しお、倩才を芋せるこずを可胜にするこずです。



ご芧のずおり、このようなモデルは次の堎合に圹立ちたす。





pix2codeに぀いお少し



私の朜圚的な競争盞手に぀いおいく぀かの蚀葉を蚀いたす。 私は敬意を持っお行われた仕事を尊重し、明らかに賢明で才胜のある人々を「責める」こずすらないこずをすぐに予玄したす。 私は圌らが䜕をしたかに぀いおの私の意芋を衚明するだけであり、さらに重芁なこずは、珟圚の蚘事に぀いお、なぜ私がそれを違うようにしたのかに぀いおです。



私が最初にタスクを匕き受けたずきに頭に浮かんだ最初の考えは、「ニュヌロン」です。 実は、むンタヌネットから膚倧な数のペヌゞを取埗し、倧たかに蚀っおスクリヌンショットず察応するhtmlコヌドからデヌタセットを䜜成し、ニュヌロンを構築したす...より良い回垰ニュヌロン...、いや、より良いベむゞアンニュヌロン...、いや、より良いニュヌロンの構成...はい、たくさんのニュヌロン、深く深く。 トレヌニングサンプルに察しお蚭定-利益 だから



そうでしょうが、そうではありたせん。 この道を進むほど、問題が倚く芋えたした。 問題は技術的なものではなく、抂念的なものです。 トレヌニングサンプルを䜜成するこずから始めたしょう。 ご存知のように、1぀のボリュヌムが高床な機械孊習ではありたせん。 もちろん、ディヌプラヌニングを適切に適甚するには、サンプルを倧幅に倧きくする必芁がありたす。 しかし、それが代衚であるこずも同様に重芁です。 しかし、これには問題がありたす。 サむトの90が...控えめに蚀っおも、借りたくないレむアりトを持っおいるず蚀っおも、私はあたり間違えないず思いたす。 芖芚的に類䌌したサむトは、構文的に根本的に異なる怍字を持぀こずができるずいう事実により、状況はさらに耇雑になりたす。 この状況になるには 方法論ごずに、フレヌムワヌクごずに個別のサンプルを䜜成したすか 独自のトレヌニングセットを生成したすか これらの質問を解決するためのオプションがあるこずを理解しおいたすが、私の意芋では、実装の耇雑さはニュヌラルネットワヌクを䜿甚する利点を䞊回りたす。



たた、もう1぀泚意が必芁です。 ここでは、機械孊習のすべおの支持者の目に觊れる危険がありたす。 入力デヌタを凊理するためのpix2codeの操䜜を説明する蚘事の玹介で曞かれおいるように、「゚ンゞニアリング」特性を抜出するプロセスも専門的なヒュヌリスティックも蚭蚈されおいたせん。 これが機械孊習の本質であるず思われたす。専門家によっお事前に蚭定されたルヌルに䟝存するのではなく、デヌタに盎接含たれるものに基づいお、既存の自然法則を埩元したす。 しかし、ここで私は議論しなければなりたせん。 先ほど蚀ったように、有胜な専門家がガむドするすべおがマヌクアップコヌドに埋め蟌たれおいるわけではありたせん。 業界には時間ずずもに倉化する他のメタパラメヌタがあり、生成されたコヌドの品質が適切なレベルに維持されるように監芖する必芁がありたす。 あなたは私に嫌悪感を䞎えるこずができたすが、このタスクで専門家の発芋的手法の芁玠を拒吊するこずはできたせん。



しかし、それらを䜿甚するこずの根本的な䞍可胜性や誀りではなく、ニュヌラルネットワヌクの道から遠ざかったのではなく、匷力で耇雑なツヌルを䜿甚する平凡な怠inessず䞍十分な資栌を認めなければなりたせん。 他方、私は、仕事のオリ゚ンテヌションにおいお、目暙ではなく、劎働手段に察しお最も間違っおいるず考えおいたす。 したがっお、私は私にずっおより論理的なパスから始めるこずにしたした。これに぀いおは以䞋で説明したす。 もし私がこの仕事を攟棄せず、状況が本圓にそれを必芁ずするなら、おそらくニュヌラルネットワヌクも䜿甚するでしょう。



しかし、pix2codeずFloydHubの開発に戻りたす。 私はすべおの公開された資料を読みたしたが、䞊蚘で説明した問題の解決策を芋぀けるこずができたせんでした。 さお、コヌドが実際に機胜する堎合、これはそれほど重芁ではありたせんか そもそも、䟋で瀺されおいるものを陀き、画像で結果を埗るこずができたせんでした。 これがプロトタむプであるこずを考えるず、あなたは蚱すこずができたす。

しかし、私が理解できなかった最も重芁なこず。 私は本質を深く掘り䞋げなかったこずを正盎に認めおおり、コメントで説明しおくれれば感謝したすが、550回の反埩埌に元のものずたったく同じコヌドが埗られるこずをどのように説明できたすか それは完党に、100です。 同じコメントがどのようにそこに終わったかは理解できたすが、たったく同じ画像名ずたったく同じ盞察パスが非垞に驚いおいたす。



ここに私は2぀の考えがありたすこれは詐欺私は心から信じたくない、たたはこれは私が芋た䞭で最も厳しい再蚓緎です。 繰り返したすが、プロゞェクトを圧倒する目的はありたせん。これは、セクションの冒頭で説明した問題が考慮されおいないずいう事実の結果である可胜性が高いず蚀いたいだけです。 開発者はこの状況を修正するず信じおいたすが、珟時点では私の議論に察する反論はありたせん。 そのアヌキテクチャに私を導いた議論は、最終的にくるみ割り人圢の基瀎になりたした。



建築



ある賢い人は、問題を解決する方法を探しおいるずき、この問題に圱響を䞎える5-6の人気のある蚘事を芋぀け、これらの蚘事で最も批刀されおいる方法を遞択するず蚀いたした。 この蚘事には、最新のアプロヌチず驚くべきノりハりは含たれおいたせん。 すべおが非垞に平凡でシンプルです。 それにもかかわらず、幞運なこずに、これをやればやるほど、アプロヌチの正しさを確信したす。



レむアりト䜜成の自然なプロセスを理解するこずから始めるこずにしたした。 正盎に蚀っお、ほずんどのコヌダヌは氞遠の、唯䞀無二のコピヌアンドペヌスト方匏を䜿甚しおいたす。 最初は、コピヌアンドペヌストが文字通り䜿甚されたす。 私は空腹の孊生ずしお、最初にお金を皌いだ埌、グヌグルに「フッタヌをペヌゞの䞀番䞋たで抌しおください」、「ブロックを垂盎に揃えお」、「同じ高さの列」ず入力する方法を芚えおいたす。 なじみのないブロック配眮パタヌンに遭遇した堎合、怜玢バヌで自然蚀語で蚘述し、次のチュヌトリアルでサンプルコヌドを芋぀けお、最終的にニヌズに合わせお倉曎したす。 さらに、経隓があれば、グヌグルぞの呌び出しはたすたす少なくなりたすが、原則はなくなりたせん。次のテンプレヌトに盎面するず、頭から適切な䟋を取り出しお、珟圚の状況に適応させたす。



科孊では、そのような考え方は先䟋ず呌ばれたす。 たた、ITには、このプロセスの実装がありたす。ケヌスベヌスの掚論たたは「ケヌスベヌスの掚論」です。 この方法は非垞に叀くただし、ニュヌラルネットワヌクを幌児ずも呌ぶこずはできたせん、前䞖玀の70幎代に歎史的に衰退し、確かに、珟圚では開発のピヌクからはほど遠い状態です。 ただし、この状況では、説明したプロセスに完党に適合したす。



このアプロヌチに慣れおいない人のために、たず、たずえばJanet Kolodnerの蚘事を読むこずをお勧めしたす。次に、この蚘事を読み続けるこずをお勧めしたす。



CBRを1぀の文で説明するず、これは叀い゜リュヌションを同様の状況に適応させるこずで問題を解決する方法であるず蚀えたす。 CBRの重芁な抂念はナヌスケヌスです。 ナヌスケヌスは芁玠のトリプルです





ナヌスケヌスは、リポゞトリたたはデヌタベヌスに保存されたす。 保存方法、玢匕付け、構造-未解決の質問適切なツヌルを䜿甚できたす。



事䟋ベヌスの掚論で最も重芁な点は、いわゆるCBRサむクルです。 実際、このサむクルは問題を解決する方法です。







サむクルは4぀のステップ4぀のREで構成されたす。





この問題を解決するためにケヌスベヌスの掚論がどのように適甚されたかを正確に説明する前に、システムの䞀般的なアヌキテクチャを説明する䟡倀がありたす。



グロヌバルな意味では、凊理は2぀の郚分で構成されたす。



  1. 画像認識
  2. HTMLコヌド生成


最初の段階の䞻なタスクは、むメヌゞからすべおの重芁なブロックを抜出し、添付ファむルに関しおそれらからツリヌ構造を構築するこずです。



画像凊理はいく぀かの段階で行われたす。



  1. すべおのテキストが認識されここではtesseractが助けになりたす、それに関連するすべおのプロパティフォント、色、サむズ、スタむルなどが抜出されたす。 -そしお、さらに干枉しないように、背景色で完党に䞊曞きされたす。
  2. すべおの写真が取埗されたす-぀たり その埌、すべおがimgタグたたはブロックの背景画像になりたす。 それらも䞊曞きされたす。
  3. 最埌に、すべおのブロックが認識され、そこから階局、぀たりツリヌが組み立おられたす。


各ノヌドが朜圚的なdom芁玠であるこのようなツリヌを組み立おるこずは、最初の段階のタスクです。 各ノヌドは、䞀連の定矩枈みパラメヌタヌによっお蚘述されたす。 䞀般に、ツリヌの組み立おは簡単な䜜業ではありたせん。 ただし、珟時点ですべおのアヌキテクチャに぀いお、この段階が最適に実装されおいるず蚀わなければなりたせん。デザむンがおんかんではなかった堎合、画像構造の非垞に正確な蚘述がほずんど垞に保蚌されたす。



ツリヌの準備ができたら、2番目の段階に進みたす。 プレフィックスの方法でツリヌを歩き回り、cbr-loopを䜿甚しお各ノヌドを凊理したす。



The Nutcrackerの事䟋ベヌスの掚論の実装をもう少し詳しく説明する時が来たした。



くるみ割り人圢のナヌスケヌスの構造は次のずおりです。





ナヌスケヌスは、MongoDBデヌタベヌスのJSON衚珟で保存されたす。 これを「グロヌバルリポゞトリ」ず呌びたす。 ロヌカルストレヌゞもありたす-それに぀いおは少し埌で。 グロヌバルストレヌゞでは、ナヌスケヌスには問題ず解決策しかありたせん。 結果はありたせん-結局、テンプレヌトが特定の状況に適甚されたずきにのみ衚瀺されたす。



そしお今、画像の構造を蚘述するjsonオブゞェクトず、各ノヌドの䜜成方法に関する情報を含むナヌスケヌスベヌスがありたす。 前に蚀ったように、ツリヌのトラバヌスはプレフィックスです。぀たり、ルヌトから開始したす。 ルヌト自䜓のプロパティを取埗し、それに最も近い子孫のプロパティを远加したす-ここに問題がありたす。



抜出段階が来たした。 最も類䌌した問題の前䟋を芋぀ける必芁がありたす。 mlスペシャリストの創造性の範囲は次のずおりです。 実際、マルチクラス分類の叀兞的な問題がありたす。オブゞェクトのプロパティがあり、n個のクラスがありたすデヌタベヌスにはn個のナヌスケヌスがありたす。 なじみのないオブゞェクトをいずれかのクラスに関連付ける必芁がありたす。 ロゞスティック回垰を詊したいですか どうしお たぶんRandomForestの方がいいですか そうです 結局、誰もニュヌラルネットワヌクをキャンセルしたせんでした



しかし、最初の反埩では、k個の最近傍の方法で管理したした。 さらに、kは1に等しくなりたす。正しく理解できたした。ナヌクリッドメゞャヌを䜿甚しお、最も近いオブゞェクトを芋぀けたした。 すでにこのシンプルなアプロヌチのすべおの欠点に盎面しおいたすが、蚱容できる品質を達成し、この時点で行き詰たるこずなく、埐々にすべおの面に沿っお動き、党䜓像を終わらせるこずができたす。



最も近いナヌスケヌスを受け取ったら、凊理䞭のノヌドにその゜リュヌションを適応させる必芁がありたす。 ここにはいく぀かのタスクがありたす。



  1. jinja2のテンプレヌトから実際のコヌドを取埗したす。
  2. cssクラスの凊理ほずんどの堎合、前の手順で、この名前のクラスに既に察応しおいたす。 この状況を凊理するためのオプションがいく぀かありたす。完党に新しいクラスを䜜成するか、htmlで必芁な眮換を行いたす。 オブゞェクトのプロパティを指定する別のクラスを䜜成し、必芁に応じおHTMLに远加したす。 たたは、これは前の結果の特殊なケヌスであり、䜕もしないこずを理解しおください。したがっお、すべおが玠晎らしいです。


事䟋ベヌスの掚論の芏範によれば、次のステップは結果を評䟡するこずです。 そしお、ここで、私は告癜したす、私は停滞しおいたす。 レむアりトが本圓にあなたが望むものであるず評䟡する方法は どのような基準を思い぀くこずができたすか 苊痛に満ちた苊痛ず掞察力の探求により、私は関数に「return True」ずいう改蚂版を曞き、先に進みたした。 私はただ評䟡を実斜しおいたせん。 そしお、おそらく、私は決しお気付かないこずを教えおくれたす。抜出段階で適切な分類噚を䜜成し、適切な適応を行うだけで十分です。



最埌のステップは保存するこずです。 最初は問題のみを含んでいた先䟋は、その解決策ず結果を受け取りたした。 埌でリポゞトリに蚘録しお、同様のブロックを䜜成しやすくする必芁がありたす。 しかし、ここで私はトリックを思い぀きたした。 ナヌスケヌスは「グロヌバルストレヌゞ」ではなく、ロヌカルストレヌゞに蚘録されたす。 ロヌカルストレヌゞは、特定のむメヌゞの䞀皮のコンテキストです。 珟圚のドキュメントに既に存圚するブロックが含たれおいたす。 これにより、第1に、類䌌の前䟋をより簡単に芋぀けるこずができ、第2に、適応に費やすリ゜ヌスが少なくなり、同じ構造が異なる堎合に゚ラヌを最小限に抑えるこずができたす。 次のツリヌノヌドを凊理するずき、ロヌカルストレヌゞから同様の問題を最初に抜出しようずし、その埌、類䌌するものが芋぀からない堎合にのみ、アルゎリズムはグロヌバルストレヌゞに移動したす。



これらのすべおの手順があたり正匏ではない方法で蚘述されおいる堎合、本質は次のような掚論に芁玄されたす。



  1. 最高レベルの抜象化の芳点からレむアりトを怜蚎したす。
  2. たずえば、これは3列のレむアりトであるこずがわかりたす。 このようなレむアりトをどのように䜜成するのでしょうか
  3. 最適なケヌスに぀いおは、ナヌスケヌスデヌタベヌスを探しおいたす。
  4. htmlおよびcssテンプレヌトを取埗したす。
  5. このテンプレヌトでは、問題のケヌスの特定の倀幅、色、むンデントなどを䜿甚したす。
  6. 次に、各子孫を再垰的に凊理したす。



    1. ここにあるのは...巊の列には、5぀のブロックが瞊に䞊んでいたす。 䜜り方 ベヌスを芋おみたしょう...



      1. ...


    2. 䞭倮のブロックには、垂盎に配眮された3぀のブロックがありたす。最初のブロックは高さの20、2番目-70、3番目-10を占めおいたす。
    3. など


䟋



手玙にうんざりしおいたせんか 今、写真がありたす。 そしおコヌド。



個人的には、単玔なものから耇雑なものぞず移行したす。 たくさんの芁玠を含む意図的に耇雑なサむトをずるこずは、あなたの粟神を殺し、眠りを倱い、結果ず倱敗の原因を掻き立おる方法です。 ですから、私の「Hello World」は基本的に兞型的なサむトのモゞュラヌグリッドです。







このレむアりトを準備したした。コンテンツの幅が固定されたサむト、ゎム補のキャップ、ペヌゞの䞋郚に抌し付けられた地䞋宀、およびサむドバヌです。 くるみ割り人圢がどのように察凊するかを芋おみたしょう。



最初のステップはパタヌン認識です。 結果は次のずおりです。



認識された画像構造
{ "width": 2560, "margin_bottom": null, "the_same_bkgr_as_parent": null, "margin_left": null, "depth": 1, "children_amount": 2, "width_portion": 1.0, "height": 1450, "padding_right": 0, "height_portion": 1.0, "alignment": 1, "background": null, "margin_top": null, "children_proportion": [ 0.12275862068965518, 0.8772413793103448 ], "relative_position": null, "children": [ { "width": 2560, "margin_bottom": 0, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 2, "children_amount": 0, "width_portion": 1.0, "height": 178, "padding_right": null, "height_portion": 0.12275862068965518, "alignment": null, "background": [ 252, 13, 28 ], "margin_top": 0, "children_proportion": null, "relative_position": [ 0.0, 0.0, 1.0, 0.12275862068965518 ], "children": [], "padding_bottom": null, "margin_right": 0, "padding_top": null, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": null }, { "width": 2560, "margin_bottom": 0, "the_same_bkgr_as_parent": true, "margin_left": 0, "depth": 2, "children_amount": 3, "width_portion": 1.0, "height": 1272, "padding_right": 0, "height_portion": 0.8772413793103448, "alignment": 0, "background": null, "margin_top": 0, "children_proportion": [ 0.1171875, 0.765625, 0.1171875 ], "relative_position": [ 0.0, 0.12275862068965518, 1.0, 1.0 ], "children": [ { "width": 300, "margin_bottom": 0, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 3, "children_amount": 0, "width_portion": 0.1171875, "height": 1272, "padding_right": null, "height_portion": 0.8772413793103448, "alignment": null, "background": [ 255, 255, 255 ], "margin_top": 0, "children_proportion": null, "relative_position": [ 0.0, 0.0, 0.1171875, 1.0 ], "children": [], "padding_bottom": null, "margin_right": 0, "padding_top": null, "font_weight": null, "the_same_bkgr_as_global": true, "type": "node", "padding_left": null }, { "width": 1960, "margin_bottom": 0, "the_same_bkgr_as_parent": true, "margin_left": 0, "depth": 3, "children_amount": 2, "width_portion": 0.765625, "height": 1272, "padding_right": 0, "height_portion": 0.8772413793103448, "alignment": 1, "background": null, "margin_top": 0, "children_proportion": [ 0.8742138364779874, 0.12578616352201258 ], "relative_position": [ 0.1171875, 0.0, 0.8828125, 1.0 ], "children": [ { "width": 1960, "margin_bottom": 0, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 4, "children_amount": 1, "width_portion": 0.765625, "height": 1112, "padding_right": 1560, "height_portion": 0.766896551724138, "alignment": 0, "background": [ 128, 128, 128 ], "margin_top": 0, "children_proportion": [ 0.20408163265306123 ], "relative_position": [ 0.0, 0.0, 1.0, 0.8742138364779874 ], "children": [ { "width": 400, "margin_bottom": 112, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 5, "children_amount": 0, "width_portion": 0.15625, "height": 1000, "padding_right": null, "height_portion": 0.6896551724137931, "alignment": null, "background": [ 14, 126, 18 ], "margin_top": 0, "children_proportion": null, "relative_position": [ 0.0, 0.0, 0.20408163265306123, 0.8992805755395683 ], "children": [], "padding_bottom": null, "margin_right": 1560, "padding_top": null, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": null } ], "padding_bottom": 112, "margin_right": 0, "padding_top": 0, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": 0 }, { "width": 1960, "margin_bottom": 0, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 4, "children_amount": 0, "width_portion": 0.765625, "height": 160, "padding_right": null, "height_portion": 0.1103448275862069, "alignment": null, "background": [ 11, 36, 251 ], "margin_top": 0, "children_proportion": null, "relative_position": [ 0.0, 0.8742138364779874, 1.0, 1.0 ], "children": [], "padding_bottom": null, "margin_right": 0, "padding_top": null, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": null } ], "padding_bottom": 0, "margin_right": 0, "padding_top": 0, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": 0 }, { "width": 300, "margin_bottom": 0, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 3, "children_amount": 0, "width_portion": 0.1171875, "height": 1272, "padding_right": null, "height_portion": 0.8772413793103448, "alignment": null, "background": [ 255, 255, 255 ], "margin_top": 0, "children_proportion": null, "relative_position": [ 0.8828125, 0.0, 1.0, 1.0 ], "children": [], "padding_bottom": null, "margin_right": 0, "padding_top": null, "font_weight": null, "the_same_bkgr_as_global": true, "type": "node", "padding_left": null } ], "padding_bottom": 0, "margin_right": 0, "padding_top": 0, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": 0 } ], "padding_bottom": 0, "margin_right": null, "padding_top": 0, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": 0 }
      
      







ここでの䞻芁なプロパティは、タむプノヌド、テキスト、たたは画像ず敎列0-子は氎平方向、1-垂盎方向です。 json分析は自分で行うこずができたすが、わかりやすくするために、アルゎリズムが構築したツリヌを衚瀺したしたブロックの背景色は円の色に察応し、黒い円は構成ブロックに察応し、円内の数字は䜍眮合わせパラメヌタヌに察応したす







ツリヌりォヌクを開始したす。 ルヌトノヌドの説明から問題を圢成したす。



ルヌトノヌドの説明
 { "width": 2560, "margin_bottom": null, "the_same_bkgr_as_parent": null, "margin_left": null, "depth": 1, "children_amount": 2, "width_portion": 1.0, "height": 1450, "padding_right": 0, "height_portion": 1.0, "alignment": 1, "background": null, "margin_top": null, "children_proportion": [ 0.12275862068965518, 0.8772413793103448 ], "relative_position": null, "children": [ { "width": 2560, "margin_bottom": 0, "the_same_bkgr_as_parent": false, "margin_left": 0, "depth": 2, "children_amount": 0, "width_portion": 1.0, "height": 178, "padding_right": null, "height_portion": 0.12275862068965518, "alignment": null, "background": [ 252, 13, 28 ], "margin_top": 0, "children_proportion": null, "relative_position": [ 0.0, 0.0, 1.0, 0.12275862068965518 ], "children": [], "padding_bottom": null, "margin_right": 0, "padding_top": null, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": null }, { "width": 2560, "margin_bottom": 0, "the_same_bkgr_as_parent": true, "margin_left": 0, "depth": 2, "children_amount": 3, "width_portion": 1.0, "height": 1272, "padding_right": 0, "height_portion": 0.8772413793103448, "alignment": 0, "background": null, "margin_top": 0, "children_proportion": [ 0.1171875, 0.765625, 0.1171875 ], "relative_position": [ 0.0, 0.12275862068965518, 1.0, 1.0 ], "padding_bottom": 0, "margin_right": 0, "padding_top": 0, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": 0 } ], "padding_bottom": 0, "margin_right": null, "padding_top": 0, "font_weight": null, "the_same_bkgr_as_global": false, "type": "node", "padding_left": 0 }
      
      







ナヌスケヌスデヌタベヌスは、最も類䌌した問題のあるナヌスケヌスを怜玢したす。 次の䜿甚䟋が取埗されたす。



最も近い先䟋
 { "_id" : ObjectId("5a1ec4681dbf2cce65357bc4"), "problem" : { "children_proportion" : [ 0.11, 0.89 ], "alignment" : 1, "depth" : 1, "height_portion" : 1.0, "width_portion" : 1.0, "children_amount" : 2, "children" : [ { "relative_position" : [ 0.0, 0.0, 1.0, 0.11 ], "depth" : 2, "height_portion" : 0.11, "width_portion" : 1.0, "the_same_bkgr_as_global" : false }, { "children_proportion" : [ 0.15, 0.7, 0.15 ], "alignment" : 0, "relative_position" : [ 0.0, 0.11, 1.0, 1.0 ], "depth" : 2, "height_portion" : 0.89, "width_portion" : 1.0, "children_amount" : 3, "the_same_bkgr_as_global" : false, "children" : [ { "relative_position" : [ 0.0, 0.0, 0.15, 1.0 ], "depth" : 3, "height_portion" : 0.89, "width_portion" : 0.15, "children_amount" : 0, "the_same_bkgr_as_global" : true }, { "the_same_bkgr_as_parent" : true, "children_proportion" : [ 0.89, 0.11 ], "alignment" : 1, "relative_position" : [ 0.15, 0.0, 0.85, 1.0 ], "depth" : 3, "height_portion" : 0.89, "width_portion" : 0.7, "children_amount" : 2, "the_same_bkgr_as_global" : false }, { "relative_position" : [ 0.85, 0.0, 1.0, 1.0 ], "depth" : 3, "height_portion" : 0.89, "width_portion" : 0.15, "children_amount" : 0, "the_same_bkgr_as_global" : true } ] } ], "the_same_bkgr_as_global" : false }, "solution" : { "html" : "<div class=\"wrapper\"><header>{{ children[0]['content'] }}</header><div class=\"content container\">{{ children[1]['children'][1]['children'][0]['content'] }}</div></div><footer class=\"container\">{{ children[1]['children'][1]['children'][1]['content'] }}</footer>", "css" : "html,body,.wrapper {height: 100%;}.content {box-sizing: border-box;min-height: 100%;padding-top: {{ children[0]['height'] }};padding-bottom: {{ children[0]['height'] }};background:{{ children[1]['children'][1]['children'][0]['background'] }};}header{height: {{ children[0]['height'] }};margin-bottom: -{{ children[0]['height'] }};background:{{ children[0]['background'] }};position:relative;z-index:10;}.container{width:{{ children[1]['children'][1]['width'] }};margin-left: auto;margin-right: auto;}footer {height: {{ children[1]['children'][1]['children'][1]['height'] }};margin-top: -{{ children[1]['children'][1]['children'][1]['height'] }};background:{{ children[1]['children'][1]['children'][1]['background'] }};}" }, "outcome" : null }
      
      







ご芧のずおり、htmlコヌドを生成するには、子孫からcontentプロパティを取埗する必芁がありたす。これを行うには、珟圚のノヌドず同じ方法で各子孫を凊理する必芁がありたす。 したがっお、内容が空の文字列であるすべおの葉に到達するたで、ツリヌを䞀呚したす。



cssに関しおは、テンプレヌトから生成されたすべおのコヌドは単䞀のファむルに曞き蟌たれ、競合は途䞭で凊理されたす。



その結果、次のコヌドが取埗されたしたそれぞれ倧きな画像が凊理され、そのような倧きな倀が取埗されたした。



 <!DOCTYPE html> <html> <head> <title> </title> <meta charset="utf-8"/> <link href="reset.css" rel="stylesheet" type="text/css"/> <link href="style.css" rel="stylesheet" type="text/css"/> </head> <body> <div class="wrapper"> <header> </header> <div class="content container"> <aside class="left"> </aside> </div> </div> <footer class="container"> </footer> </body> </html>
      
      





 aside.left { background : rgb(14, 126, 18); height : 1000px; width : 400px; float : left; } html,body,.wrapper { height : 100%; } footer { background : rgb(11, 36, 251); height : 160px; margin-top : -160px; } .container { width : 1960px; margin-left : auto; margin-right : auto; } header { background : rgb(252, 13, 28); height : 178px; margin-bottom : -178px; z-index : 10; position : relative; } .content { box-sizing : border-box; min-height : 100%; padding-top : 178px; padding-bottom : 178px; background : rgb(128, 128, 128); }
      
      





結果



珟時点では、くるみ割り人圢は次のタスクに察応しおいたす。



  1. 画像から構造を抜出したす。
  2. テキスト、フォント、サむズ、スタむルの認識。
  3. スクリヌンショットから写真を抜出したす。
  4. マヌゞンずマヌゞンを認識したす。
  5. 最も近いナヌスケヌスを怜玢したす。
  6. cssファむルのコンパむル時の競合凊理。


近い将来、以䞋を実装する予定です。



  1. 境界認識色、タむプ、幅、䞞め。
  2. テヌブルの認識。
  3. 募配認識。
  4. 固定ブロックの凊理衚瀺固定および衚瀺絶察


私の意芋では、倚くの成長ポむントを備えたかなり有望なシステムであるこずがわかりたした。 最も原始的な方法であっおも、くるみ割り人圢は簡単なタスクに察凊したす。 画像認識の点でも、最も近い先䟋を抜出する堎合でも、よりむンテリゞェントな方法でパッケヌゞ化するず、プログラムは倧郚分のデザむンレむアりトで動䜜するこずができたす。



もう1぀の優れた機胜は、レむアりトレむアりトです。 ナヌスケヌスデヌタベヌスのいく぀かのバヌゞョンを䜿甚するず、たずえばbem-methodologyに埓っおくるみ割り人圢タむプセットを䜜成したり、特定のバヌゞョンのブヌトストラップを䜿甚したりできたす。 たた、䌁業は䌁業暙準を远加するこずができ、䌁業の埓業員ずしお自分自身をタむプセットできるだけでなく、生成されたコヌドず比范するこずにより、このレむアりトたたはそのレむアりトが暙準にどの皋床準拠しおいるかを評䟡するこずもできたす。



このようなデヌタベヌスにデヌタを入力するこずは、非垞に時間のかかるプロセスのように思えるかもしれたせん。 もちろん、これを議論するこずは困難ですが、私は個人的には、玄100の前䟋でほずんどのタスクをカバヌできるず考えおいたす。 そしお、そのような量を満たすこずは、原則ずしお、暙準プロゞェクトの時間に芋合っおいたす。 したがっお、フロント゚ンドのスペシャリストは、デヌタベヌスを䞀杯にするために時間をかけるこずで、生産性を劇的に向䞊させるこずができたす。



この蚘事の目暙の1぀は、コミュニティからフィヌドバックを埗るこずです。 今、私はこのプロゞェクトを深く掘り䞋げお、朚の埌ろに森が芋えないかもしれないずいう明確な感芚を持っおいたす。 したがっお、私は建蚭的な批刀に感謝したす。



All Articles