{"id":89110,"date":"2020-07-18T19:42:10","date_gmt":"2020-07-18T17:42:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej"},"modified":"2020-07-18T19:42:10","modified_gmt":"2020-07-18T17:42:10","slug":"obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Introduktion<\/h2>\n<p><\/p>\n<p>Hej!<\/p>\n<p><\/p>\n<p>I denne artikel vil jeg dele erfaringer med at opbygge en mikrotjenestearkitektur til et projekt, der bruger neurale netv\u00e6rk.<\/p>\n<p><\/p>\n<p>Lad os tale om kravene til arkitekturen, se p\u00e5 forskellige strukturelle diagrammer, gennemg\u00e5 hver af komponenterne i den f\u00e6rdige arkitektur, samt vurdere de tekniske metrikker for l\u00f8sningen.<\/p>\n<p><\/p>\n<p>God l\u00e6selyst!<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Et par ord om opgaven og dens l\u00f8sning<\/h2>\n<p><\/p>\n<p>Hovedid\u00e9en er at vurdere en persons tiltr\u00e6kningskraft baseret p\u00e5 billeder p\u00e5 en skala fra 1 til 10.<\/p>\n<p><\/p>\n<p>I denne artikel vil vi ikke komme ind p\u00e5 hverken de anvendte neurale netv\u00e6rk eller dataforberedelse og tr\u00e6ning. Men i en af de kommende publikationer vil vi bestemt vende tilbage til en dybere gennemgang af vurderingspipelines.<\/p>\n<p><\/p>\n<p>Lige nu vil vi overordnet gennemg\u00e5 vurderingspipelinen og fokusere p\u00e5 samspillet mellem mikrotjenesterne i konteksten af projektets samlede arkitektur.\u00a0<\/p>\n<p><\/p>\n<p>N\u00e5r man arbejder med vurderingspipelinen for tiltr\u00e6kningskraft, blev opgaven opdelt i f\u00f8lgende komponenter:<\/p>\n<p><\/p>\n<ol>\n<li>Ansigtsgenkendelse p\u00e5 billeder<\/li>\n<li>Vurdering af hvert ansigt<\/li>\n<li>Rendering af resultatet<\/li>\n<\/ol>\n<p><\/p>\n<p>Det f\u00f8rste l\u00f8ses med en fortr\u00e6net <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. Til det andet blev en konvolutionel neurale netv\u00e6rk tr\u00e6net i PyTorch, hvor <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> blev brugt som backbone med fokus p\u00e5 \"kvalitet \/ hastighed ved inference p\u00e5 CPU\".<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Funktionsdiagram for vurderingspipelinens struktur<\/i><\/p>\n<p><\/p>\n<h2>Analyse af kravene til projektarkitekturen<\/h2>\n<p><\/p>\n<p>I livscyklussen <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> er faserne med at arbejde p\u00e5 arkitekturen og automatisering af implementeringen af modellen ofte de mest tid- og ressourcekr\u00e6vende.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Livscyklussen for ML-projekter<\/i><\/p>\n<p><\/p>\n<p>Dette projekt er ingen undtagelse \u2013 der blev taget beslutning om at pakke vurderingspipelinen ind i en online service, hvilket kr\u00e6vede dybdeg\u00e5ende forst\u00e5else af arkitekturen. De grundl\u00e6ggende krav blev fastlagt:<\/p>\n<p><\/p>\n<ol>\n<li>Et centralt logopbevaringssystem \u2013 alle tjenester skal skrive logfiler til \u00e9t sted, og disse skal v\u00e6re nemme at analysere.<\/li>\n<li>Mulighed for horisontal skalering af vurderingstjenesten \u2014 som den mest sandsynlige flaskehals.<\/li>\n<li>Der skal tildeles det samme antal CPU-ressourcer til vurderingen af hvert billede \u2014 for at undg\u00e5 udsving i tidsfordelingen for inference.<\/li>\n<li>Hurtig (gen)implementering af b\u00e5de specifikke tjenester og stakken som helhed.<\/li>\n<li>Mulighed for, om n\u00f8dvendigt, at anvende f\u00e6lles objekter i forskellige tjenester.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Arkitektur<\/h2>\n<p><\/p>\n<p>Efter analysen af krav blev det klart, at mikrotjenestearkitekturen passer n\u00e6sten perfekt.<\/p>\n<p><\/p>\n<p>For at slippe for un\u00f8dige hovedpiner blev Telegram API valgt som frontend.<\/p>\n<p><\/p>\n<p>Lad os f\u00f8rst se p\u00e5 den strukturelle diagram over den f\u00e6rdige arkitektur, derefter g\u00e5r vi videre til beskrivelsen af hver komponent og formaliserer processen for succesfuld billedbehandling.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Strukturelt diagram over den f\u00e6rdige arkitektur<\/i><\/p>\n<p><\/p>\n<p>Lad os tale mere om hver komponent i diagrammet og definere deres Single Responsibility i vurderingsprocessen af billedet.<\/p>\n<p><\/p>\n<h3>Mikrotjeneste \u00abattrai-telegram-bot\u00bb<\/h3>\n<p><\/p>\n<p>Denne mikrotjeneste inkapslerer al interaktion med Telegram API. Vi kan fremh\u00e6ve to hovedscenarier \u2013 arbejde med brugerens billede og arbejde med resultatet fra vurderingspipen. Lad os gennemg\u00e5 begge scenarier i al almindelighed.<\/p>\n<p><\/p>\n<p>N\u00e5r et brugerbesked med billede modtages:<\/p>\n<p><\/p>\n<ol>\n<li>Der udf\u00f8res en filtrering best\u00e5ende af f\u00f8lgende tjek:\n<ul>\n<li>Tilstedev\u00e6relsen af det optimale billede st\u00f8rrelse<\/li>\n<li>Antallet af billeder fra brugeren, der allerede er i k\u00f8en<\/li>\n<\/ul>\n<\/li>\n<li>Ved best\u00e5et initial filtrering gemmes billedet i docker volume<\/li>\n<li>I k\u00f8en \u201cto_estimate\u201d prodes en opgave, der blandt andet indeholder stien til billedet, der ligger i vores volume<\/li>\n<li>Hvis de tidligere n\u00e6vnte trin er gennemf\u00f8rt succesfuldt \u2013 vil brugeren modtage en meddelelse med et sk\u00f8n over behandlingstiden for billedet, som beregnes ud fra antallet af opgaver i k\u00f8en. I tilf\u00e6lde af en fejl vil brugeren blive klart informeret om det \u2013 ved at sende en meddelelse med oplysninger om, hvad der kunne v\u00e6re g\u00e5et galt. <\/li>\n<\/ol>\n<p><\/p>\n<p>Desuden lytter denne mikrotjeneste, som en celery worker, til k\u00f8en \u00abafter_estimate\u00bb, som er beregnet til opgaver, der har passeret vurderingspipen.<\/p>\n<p><\/p>\n<p>N\u00e5r en ny opgave modtages fra \u201cafter_estimate\u201d:<\/p>\n<p><\/p>\n<ol>\n<li>Hvis billedet er blevet behandlet succesfuldt \u2013 sender vi resultatet til brugeren, hvis ikke \u2013 informerer vi om fejlen<\/li>\n<li>Fjerner billedet, der er resultatet fra vurderingspipen<\/li>\n<\/ol>\n<p><\/p>\n<h3>Mikrotjenesten til vurdering \u00abattrai-estimator\u00bb<\/h3>\n<p><\/p>\n<p>Denne mikrotjeneste er en celery worker og inkapsler alt, hvad der har at g\u00f8re med vurderingspipen for billeder. Arbejdsalgoritmen her er entydig \u2013 lad os gennemg\u00e5 den.<\/p>\n<p><\/p>\n<p>N\u00e5r en ny opgave modtages fra \u201cto_estimate\u201d:<\/p>\n<p><\/p>\n<ol>\n<li>K\u00f8rer billedet gennem vurderingspipen:\n<ol>\n<li>Indl\u00e6ser billedet i hukommelsen<\/li>\n<li>Tilpasser billeder til den \u00f8nskede st\u00f8rrelse<\/li>\n<li>Finder alle ansigtstr\u00e6k (MTCNN)<\/li>\n<li>Vurderer alle ansigtstr\u00e6k (pakker ansigtstr\u00e6k fundet i det tidligere punkt i en batch og udf\u00f8rer inferens med ResNet34)<\/li>\n<li>Renderer det endelige billede\n<ol>\n<li>Tegner bounding boxes<\/li>\n<li>Tegner vurderinger<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Fjerner brugerens (oprindelige) billede<\/li>\n<li>Gemmer output fra vurderings-pipelinen<\/li>\n<li>L\u00e6gger opgaven i k\u00f8en 'after_estimate', som den tidligere n\u00e6vnte mikrotjeneste 'attrai-telegram-bot' lytter p\u00e5<\/li>\n<\/ol>\n<p><\/p>\n<h3>Graylog (+ mongoDB + Elasticsearch)<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.graylog.org\/\">Graylog<\/a><\/noindex> \u2014 er en l\u00f8sning til centraliseret logstyring. I dette projekt blev den brugt til sit prim\u00e6re form\u00e5l.<\/p>\n<p><\/p>\n<p>Valget faldt netop p\u00e5 den, og ikke den velkendte <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stak, p\u00e5 grund af bekvemmeligheden ved at arbejde med den fra Python. Alt, hvad der kr\u00e6ves for at logge til Graylog, er at tilf\u00f8je GELFTCPHandler fra pakken <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> til de \u00f8vrige root logger handlers i vores python-mikrotjeneste.<\/p>\n<p><\/p>\n<p>Som en person, der tidligere kun har arbejdet med ELK-stakken, havde jeg generelt en positiv oplevelse under arbejdet med Graylog. Det eneste, der skuffede, var Kibanas overlegenhed i funktioner i forhold til Graylogs webgr\u00e6nseflade.<\/p>\n<p><\/p>\n<h3>RabbitMQ<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">RabbitMQ<\/a><\/noindex> \u2014 er en beskedbroker baseret p\u00e5 AMQP-protokollen.<\/p>\n<p><\/p>\n<p>I dette projekt blev den brugt som <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">den mest stabile og tidstestede<\/a><\/noindex> broker for Celery og arbejdede i durable tilstand.<\/p>\n<p><\/p>\n<h3>Redis<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> \u2014 er en NoSQL database, der arbejder med datal\u00f8sninger af typen 'n\u00f8gle-v\u00e6rdi'<\/p>\n<p><\/p>\n<p>Nogle gange er der behov for at bruge f\u00e6lles objekter i forskellige python-mikrotjenester, der implementerer nogle datal\u00f8sninger.<\/p>\n<p><\/p>\n<p>For eksempel, i Redis gemmes der en hashmap i formatet 'telegram_user_id =&gt; antal aktive opgaver i k\u00f8en', hvilket g\u00f8r det muligt at begr\u00e6nse antallet af anmodninger fra en bruger til et bestemt bel\u00f8b og dermed forhindre DoS-angreb.<\/p>\n<p><\/p>\n<h3>Formaliserer processen for succesfuld billedbehandling<\/h3>\n<p><\/p>\n<ol>\n<li>Brugeren sender et billede til Telegram-boten<\/li>\n<li>'attrai-telegram-bot' modtager en besked fra Telegram API og analyserer den<\/li>\n<li>Opgaven med billedet tilf\u00f8jes i den asynkrone k\u00f8 'to_estimate'<\/li>\n<li>Brugeren modtager en besked med den planlagte vurderingstid<\/li>\n<li>'attrai-estimator' henter opgaven fra k\u00f8en 'to_estimate', k\u00f8rer den gennem vurderingspipelinen og producerer opgaven til k\u00f8en 'after_estimate'<\/li>\n<li>'attrai-telegram-bot', der lytter p\u00e5 k\u00f8en 'after_estimate', sender resultatet til brugeren<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Endelig, efter at have gennemg\u00e5et arkitekturen, kan vi g\u00e5 videre til den ikke mindre interessante del \u2014 DevOps<\/p>\n<p><\/p>\n<h3>Docker Swarm<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/ba539d1c8197c7961d6e5e6a5c7e83c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/\">Docker Swarm <\/a><\/noindex>\u00a0\u2014 et klusteringssystem, hvis funktionalitet er indbygget i Docker Engine og tilg\u00e6ngelig out-of-the-box.<\/p>\n<p><\/p>\n<p>Ved hj\u00e6lp af \"swarm\" kan alle noder i vores cluster opdeles i 2 typer \u2013 worker og manager. P\u00e5 maskiner af den f\u00f8rste type k\u00f8res grupper af containere (stacks), mens maskiner af den anden type er ansvarlige for skalering, belastningsfordeling og <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">andre gode funktioner<\/a><\/noindex>. Managere fungerer som standard ogs\u00e5 som workere.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Et cluster med en leader manager og tre workere<\/i><\/p>\n<p><\/p>\n<p>Den mindste mulige st\u00f8rrelse p\u00e5 et cluster er 1 node, hvor den eneste maskine samtidig vil fungere som b\u00e5de leader manager og worker. Baseret p\u00e5 projektets st\u00f8rrelse og de minimale krav til fejltolerance blev beslutningen truffet om at anvende netop denne tilgang.<\/p>\n<p><\/p>\n<p>For at springe fremad kan jeg sige, at siden den f\u00f8rste produktionsudrulning i midten af juni, har der ikke v\u00e6ret problemer relateret til denne organisering af clustret (men det betyder ikke, at en s\u00e5dan organisering p\u00e5 nogen m\u00e5de er acceptabel i enhver mellem-til-stor st\u00f8rrelse projekter, der stiller krav til fejltolerance).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>I \"swarm\"-tilstand er det <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>der er ansvarlig for udrulning af stacks (s\u00e6t af docker services).\u00a0\u00a0<\/p>\n<p><\/p>\n<p>For eksempel blev ressourcerne for hver instans af vurderingsmikroservicen begr\u00e6nset ved hj\u00e6lp af disse parametre (vi tildeler N kerner til N instanser, i selve mikroservicen begr\u00e6nser vi antallet af kerner, der bruges af PyTorch, til \u00e9n)<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">attrai_estimator:\n\u00a0\u00a0image: 'erqups\/attrai_estimator:1.2'\n\u00a0\u00a0deploy:\n\u00a0\u00a0\u00a0\u00a0replicas: 4\n\u00a0\u00a0\u00a0\u00a0resources:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0limits:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cpus: '4'\n\u00a0\u00a0\u00a0\u00a0restart_policy:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0condition: on-failure\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u2026<\/code><\/pre>\n<p><\/p>\n<p>Det er vigtigt at bem\u00e6rke, at Redis, RabbitMQ og Graylog er stateful tjenester, og det vil ikke v\u00e6re s\u00e5 nemt at skalere dem som \"attrai-estimator\".<\/p>\n<p><\/p>\n<h3>Forudseende sp\u00f8rgsm\u00e5let \u2013 hvorfor ikke Kubernetes?<\/h3>\n<p><\/p>\n<p>Det virker som om brugen af Kubernetes i sm\u00e5 og mellemstore projekter er en overkill; al n\u00f8dvendig funktionalitet kan opn\u00e5s fra Docker Swarm, som er ret brugervenlig som containerorkestrator og har en lav indgangsbarri\u00e8re.<\/p>\n<p><\/p>\n<h3>Infrastruktur<\/h3>\n<p><\/p>\n<p>Dette blev udrullet p\u00e5 en VDS med f\u00f8lgende specifikationer:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 kerner Intel\u00ae Xeon\u00ae Gold 5120 CPU @ 2.20GHz<\/li>\n<li>RAM: 8 GB<\/li>\n<li>SSD: 160 GB<\/li>\n<\/ul>\n<p><\/p>\n<p>Efter lokale belastningstest s\u00e5 det ud til, at denne maskine ville v\u00e6re tilstr\u00e6kkelig til at h\u00e5ndtere et stort antal brugere.<\/p>\n<p><\/p>\n<p>Men lige efter deployment postede jeg et link til en af de mest popul\u00e6re imageboards i \u0421\u041d\u0413 (ja, den samme), hvorefter folk blev interesseret, og efter f\u00e5 timer havde tjenesten succesfuldt behandlet titusindvis af billeder. I spidserne blev CPU- og RAM-ressourcerne ikke engang brugt til halvdelen.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Lidt flere grafer<\/h3>\n<p><\/p>\n<p>Antallet af unikke brugere og foresp\u00f8rgsler om vurdering siden deployment, afh\u00e6ngig af dagen<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Fordelingen af inferencetid for vurderingspipeline<\/p>\n<p>\n<img decoding=\"async\" alt=\"Generel oversigt over arkitekturen af tjenesten til vurdering af udseendet baseret p\u00e5 neurale netv\u00e6rk\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Konklusioner<\/h2>\n<p><\/p>\n<p>For at opsummere kan jeg sige, at arkitekturen og tilgangen til orkestrering af containere fuldt ud har v\u00e6ret v\u00e6rdifulde \u2013 selv i spidserne var der ingen nedbrud eller forsinkelser i behandlingstiden.\u00a0<\/p>\n<p><\/p>\n<p>Jeg mener, at sm\u00e5 og mellemstore projekter, der bruger realtidsinferens af neurale netv\u00e6rk p\u00e5 CPU i deres processer, med succes kan overtage de metoder, der er beskrevet i denne artikel.<\/p>\n<p><\/p>\n<p>Jeg vil tilf\u00f8je, at artiklen oprindeligt var l\u00e6ngere, men for ikke at poste en lang tekst besluttede jeg at udelade nogle punkter i denne artikel \u2013 vi vender tilbage til dem i f\u00f8lgende publikationer.<\/p>\n<p><\/p>\n<p>Du kan chatte med botten i Telegram \u2013 @AttraiBot, den vil fungere, i det mindste til slutningen af efter\u00e5ret 2020. Jeg minder om \u2013 ingen brugerdata opbevares \u2013 hverken de originale billeder eller resultaterne fra vurderingspipen \u2013 alt slettes efter behandling.<\/p>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/511332\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442! \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0446\u0435\u043d\u0438\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! \u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0437\u0430\u0434\u0430\u0447\u0435 \u0438 \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u2013 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u043e\u0442\u043e \u0434\u0430\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89111,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89110","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Generel oversigt over tjenestens arkitektur til vurdering af udseende baseret p\u00e5 neurale netv\u00e6rk | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-18T17:42:10+00:00","article:modified_time":"2020-07-18T17:42:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89110","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:16:27","updated":"2022-09-29 06:10:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}