<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://mehmandarov.com/tag/norwegian/feed.xml" rel="self" type="application/atom+xml"/><link href="https://mehmandarov.com/tag/norwegian/" rel="alternate" type="text/html"/><updated>2017-05-07T20:46:00+02:00</updated><id>https://mehmandarov.com/tag/norwegian/feed.xml</id><title type="html">Rustam Mehmandarov - tag: norwegian</title><subtitle type="text">Posts tagged &quot;norwegian&quot; on Rustam Mehmandarov.</subtitle><author><name>Rustam Mehmandarov</name></author><entry><title type="html">Hvordan l&#230;re opp ditt eget kamera</title><link href="https://mehmandarov.com/hvordan-laere-opp-ditt-eget-kamera/" rel="alternate" type="text/html" title="Hvordan l&#230;re opp ditt eget kamera"/><published>2017-05-07T20:46:00+02:00</published><updated>2017-05-07T20:46:00+02:00</updated><id>https://mehmandarov.com/hvordan-laere-opp-ditt-eget-kamera</id><content type="html" xml:base="https://mehmandarov.com/hvordan-laere-opp-ditt-eget-kamera/"><![CDATA[<p><a href="/how-to-train-your-camera/">[English version &#8211; Engelsk versjon]</a></p>

<p><em>Bildegjenkjenning gjort enkelt. Slik gjenkjenner du en bestemt gjenstand ved hjelp av et kamera.</em></p>

<ul>
  <li><a href="#utfordringen">Utfordringen</a></li>
  <li><a href="#litt-teori">Litt teori</a></li>
  <li><a href="#hvor-starter-jeg">Hvor starter jeg?</a></li>
  <li><a href="#la-oss-kj&#248;re-bildegjenkjenning">La oss kj&#248;re bildegjenkjenning</a></li>
  <li><a href="#bonus-video">Bonus: Video</a></li>
</ul>

<hr />

<h2 id="utfordringen">Utfordringen</h2>

<p>Denne uken har jeg f&#229;tt utfordringen &#229; foresl&#229; en l&#248;sning p&#229; f&#248;lgende problem:</p>

<blockquote>
  <p><em>&#8220;Med en enkel datamaskin, som en Raspberry Pi, et kamera og et fuglebrett, lag et program som kan artsbestemme hvilke fugler som er innom brettet og spiser i l&#248;pet av en dag.&#8221;</em></p>
</blockquote>

<p>Siden sp&#248;rsm&#229;let var av mer teoretisk art, bestemte jeg meg for &#229; begrense dette innlegget til &#229; introdusere byggeblokkene og gi en forklaring p&#229; hvordan du typisk kan bygge et slikt system.</p>

<p>&#197; gjenkjenne gjenstander er en ganske vanlig oppgave n&#229; for tiden, og den har blitt l&#248;st p&#229; flere forskjellige m&#229;ter, og med forskjellige tiln&#230;rminger. La oss se p&#229; hvordan dette virker.</p>

<blockquote>
  <p><em><strong>TL;DR</strong></em> Det fins noen tradisjonelle m&#229;ter &#229; lage bilde- og gjenstandsgjenkjenning p&#229;, som i OpenCV, og det fins noen teknikker basert p&#229; Deep Learning, som i TensorFlow. Vil du vite mer? Fortsett &#229; lese.</p>
</blockquote>

<hr />

<h2 id="litt-teori">Litt teori</h2>
<p>De mer tradisjonelle prinsippene bak OpenCV for &#229; oppdage er godt beskrevet i <a href="http://www.learnopencv.com/image-recognition-and-object-detection-part1/" target="_blank">dette blogginnlegget</a>, s&#229; vel som i denne veiledningen for &#229; gjenkjenne (hold dere fast!) <a href="http://www.pyimagesearch.com/2016/06/20/detecting-cats-in-images-with-opencv/" target="_blank">katter p&#229; bilder</a>.</p>

<p>Mens <a href="https://www.tensorflow.org/tutorials/keras/basic_classification" target="_blank">dette innlegget</a> forklarer hvordan bildegjenkjenning virker i TensorFlow, som bruker en modell kalt dypt konvolverende nevrale nettverk, vil det ogs&#229; la deg <a href="https://research.googleblog.com/2016/03/train-your-own-image-classifier-with.html" target="_blank">trene opp din egen bildeklassifiserer</a>, slik som OpenCV.</p>

<p><img src="/assets/images/posts-images/2017-04-29-cartoon_image_processing_1.png" alt="Training your own model" class="bigger-image" /></p>
<figcaption class="caption">Noen m&#229; l&#230;re opp modellen som du skal bruke til bildeklassifisering (-gjenkjenning).</figcaption>

<hr />

<h2 id="hvor-starter-jeg">Hvor starter jeg?</h2>

<p>I utgangspunktet har du to valg &#8211; du b&#248;r enten l&#230;re opp din egen modell eller finne en modell som har blitt l&#230;rt opp av noen andre, og du vil kanskje alltid starte med &#229; se etter en forh&#229;ndsoppl&#230;rt modell. Men jo mer spesifiserte bildeklassifiseringskravene dine er, jo h&#248;yere er sjansen for at du m&#229; l&#230;re opp din egen modell. Dette vil v&#230;re det samme enten du velger OpenCV eller TensorFlow.</p>

<p>Siden vi vil kj&#248;re modellen p&#229; en relativt enkel datamaskin, kan du vurdere &#229; gj&#248;re prosesseringen i skyen. Det b&#248;r imidlertid ogs&#229; v&#230;re mulig &#229; kj&#248;re <a href="http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/" target="_blank">OpenCV</a> og <a href="https://svds.com/tensorflow-image-recognition-raspberry-pi/" target="_blank">TensorFlow</a> p&#229; den nyeste Raspberry Pi.</p>

<hr />

<h2 id="la-oss-kj&#248;re-bildegjenkjenning">La oss kj&#248;re bildegjenkjenning</h2>

<p>N&#229; vet du litt om teorien. La oss s&#229; ta en rask titt p&#229; hvordan vi kan l&#230;re opp modellene i v&#229;re behov.</p>

<blockquote>
  <p><em><strong>TL;DR</strong></em> M&#229;ten dette virker p&#229;, er at du viser modellen ganske mange bilder av en gjenstand, og en tilsvarende mengde bilder uten gjenstanden p&#229;.</p>
</blockquote>

<p>La oss si at du vil bruke modellen til &#229; gjenkjenne fugler utenfor huset ditt i Norge. Et godt utgangspunkt vil da v&#230;re &#229; f&#229; en liste over de typiske artene som du mest sannsynlig ser i hagen din, og samle s&#229; mange bilder av hver art som mulig.</p>

<p><img src="/assets/images/posts-images/2017-04-29-cartoon_image_processing_2.png" alt="Your own model in action" class="bigger-image" /></p>
<figcaption class="caption">Din oppl&#230;rte modell i aksjon.</figcaption>

<p>Her er hva du kan gj&#248;re:</p>

<ol>
  <li>Start med &#229; finne en liste over norske fugler p&#229; <a href="https://en.wikipedia.org/wiki/List_of_birds_of_Norway" target="_blank">Wikipedia</a>, eller <a href="https://snl.no/Fugler_i_Norge" target="_blank">Store Norske Leksikon</a>.</li>
  <li>S&#248;k p&#229; nettet etter bilder av hver fugleart. Det kan v&#230;re du vil automatisere dette arbeidet, og s&#248;rg for at du plukker ut bilder med de riktige opphavsrettstillatelsene.</li>
  <li>Bruk disse bildene i oppl&#230;ringen av din modell.</li>
  <li>Sett opp din Raspberry Pi med et kamera og fuglebrett, og gj&#248;r deg klar til &#229; identifisere fuglearter. Du b&#248;r optimalisere programvaren slik at bildeklassifiseringen ikke skjer hele tiden, men kun n&#229;r man ser en bevegelse.</li>
</ol>

<p><em>Pro tip:</em> Det kan ogs&#229; v&#230;re litt utfordrende &#229; ta gode bilder av v&#229;re fj&#230;rkledde venner, s&#229; s&#248;rg for at kameraet ditt er godt plassert, og materen er p&#229; et godt opplyst sted. Uten &#229; forstyrre dyrelivet, s&#229; klart.</p>

<p>Lurer du p&#229; om lignende systemer har blitt implementert eller om det er mulig? Svaret er ja. Her er det noen lenker til inspirasjon for videre lesning:</p>

<ul>
  <li><a href="https://www.oreilly.com/learning/dive-into-tensorflow-with-linux" target="_blank">En fugleklassifiserer med tensorflow</a></li>
  <li><a href="https://web.archive.org/web/20161205073600/http://www.bitfusion.io:80/2016/08/31/training-a-bird-classifier-with-tensorflow-and-tflearn/" target="_blank">Trene opp en fugleklassifiserer med Tensorflow og TFLearn</a></li>
  <li><a href="https://www.youtube.com/watch?v=S-W9tMZu8PU" target="_blank">Kj&#248;ret&#248;yklassifisering og -telling med OpenCV</a></li>
  <li><a href="https://web.archive.org/web/20170925210229/http://www.fyens.dk/article/3141726" target="_blank">Blomstergjenkjenning i naturen</a> (p&#229; dansk)</li>
  <li><a href="https://medium.com/@ageitgey/machine-learning-is-fun-part-3-deep-learning-and-convolutional-neural-networks-f40359318721" target="_blank">Maskinl&#230;ring er morsomt! Del 3: Dypt konvolverende nevrale nettverk</a>. (Ta ogs&#229; gjerne en titt p&#229; de andre delene i denne artikkelserien.)</li>
</ul>

<p>Pr&#248;v n&#229; &#229; sette alt dette sammen, og fortell meg gjerne hvordan det g&#229;r!</p>

<p><em>Lykke til!</em></p>

<hr />

<h2 id="bonus-video">Bonus: Video</h2>

<p>En video vi har laget av mine tegninger og en kort forklaring p&#229; hvordan dette virker.</p>

<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/kOXBCWvmtD4?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen=""></iframe>

<hr />]]></content><author><name>Rustam Mehmandarov</name></author><summary type="html">Bildegjenkjenning gjort enkelt. Slik gjenkjenner du en bestemt gjenstand ved hjelp av et kamera og OpenCV eller TensorFlow</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://mehmandarov.com/assets/images/posts-images/bird_small.jpg"/><category term="blog"/><category term="iot"/><category term="machine learning"/><category term="norwegian"/></entry><entry><title type="html">Hva skjer med koden din etter at du har skrevet den ferdig?</title><link href="https://mehmandarov.com/hva-skjer-med-koden-din-etter-at-du-har-skrevet-den-ferdig/" rel="alternate" type="text/html" title="Hva skjer med koden din etter at du har skrevet den ferdig?"/><published>2016-05-16T09:45:00+02:00</published><updated>2016-05-16T09:45:00+02:00</updated><id>https://mehmandarov.com/hva-skjer-med-koden-din-etter-at-du-har-skrevet-den-ferdig</id><content type="html" xml:base="https://mehmandarov.com/hva-skjer-med-koden-din-etter-at-du-har-skrevet-den-ferdig/"><![CDATA[<p><em><strong>Update 21.05.2016:</strong> <a href="/what-happens-to-your-code-after-a-commit/">English version</a> of this article.</em></p>

<p><em>Jeg har skrevet en artikkel for studentmagasinet INDEX som utgis ved Institutt for Informatikk (Ifi), Universitetet i Oslo. Den ble publisert 30.04.2016, og er tilgjengelig for alle studenter p&#229; Ifi. N&#229; vil jeg ogs&#229; &#229; dele den med alle dere andre som ikke kunne sikre dere en utgave av INDEX p&#229; fredag. Enjoy!</em></p>

<ul>
  <li><a href="#automatiser">Automatiser</a></li>
  <li><a href="#automatiske-tester-og-sjekk-av-kodekvalitet">Automatiske tester og sjekk av kodekvalitet</a></li>
  <li><a href="#milj&#248;er">Milj&#248;er</a></li>
  <li><a href="#versjoner">Versjoner</a></li>
  <li><a href="#veien-videre">Veien videre</a></li>
</ul>

<p><img src="/assets/images/posts-images/2016-05-16-hva-skjer-med-koden-din etter-at-du-har-skrevet-den-ferdig_article-2016-04-27_full.png" alt="The Screenshot of the Article" /></p>

<hr />

<p>Tenk deg f&#248;lgende scenario: Du er en student og har f&#229;tt i oppgave om &#229; skrive enten et helt nytt program, eller gj&#248;re noen endringer i noe kode som finnes fra f&#248;r av. S&#229;, hvordan g&#229;r du fram? Du begynner &#229; skrive kode, du kompilerer og kj&#248;rer den med jevne mellomrom for &#229; teste at den fungerer og gj&#248;r det den skal. Du skriver mer, du kj&#248;rer den igjen. Slik fortsetter du til du er forn&#248;yd og koden skal leveres. Etter det pakker du koden din pent i en arkiv med litt dokumentasjon, laster den opp p&#229; en side hvor det skal leveres og venter p&#229; tilbakemelding. H&#248;res det kjent ut?</p>

<p>Prosessen er vel ikke s&#229; langt unna det du vil oppleve i arbeidslivet, bare i miniatyrform. Du har noen som bestiller en type funksjonalitet &#8211; i dette tilfelle din l&#230;rer, men senere en kunde eller produkteier &#8211; og du har en eller flere leveranser som skal leveres til den som har bestilt jobben. Fra et funksjonelt perspektiv vil du v&#230;re sikker p&#229; tre ting &#8211; at den bestilte funksjonaliteten er med, at den ikke &#248;delegger for noe annet og at koden vil oppf&#248;re seg p&#229; samme m&#229;te n&#229;r bestilleren kj&#248;rer det hos seg.</p>

<p>Den enkle &#171;kode-teste-kode&#187;-metoden fungerer fint for sm&#229; oppgaver, men hva ville du gjort hvis du skulle jobbe p&#229; et stort prosjekt hvor flere jobber p&#229; forskjellige deler av koden? Hvordan kan du sjekke at koden din fortsatt fungerer n&#229;r du har gjort dine endringer? Hvordan kan du v&#230;re sikker p&#229; at dine endringer ikke har &#248;delagt andres kode?</p>

<p>Og, hvordan kan du sjekke at koden som fungerer p&#229; din maskin fortsatt fungerer n&#229;r du leverer den fra deg?</p>

<p>Velkommen til min arbeidshverdag. Jeg jobber ofte med store datasystemer som best&#229;r av mange hundre tusener kodelinjer og med flere titalls utviklere som jobber med forskjellige deler av den koden. I tillegg til &#229; v&#230;re teknisk prosjektleder med overordnet ansvar for blant annet applikasjonsarkitektur, bygg, og milj&#248;er den kj&#248;rer p&#229;, har jeg samtidig hatt rollen som leveranseansvarlig. Sistnevnte har ansvaret med &#229; til slutt pakke all koden og levere den til kunden. Ved hver leveranse m&#229; man passe p&#229; at alle biter er med, at de fungerer som de skal og at mottakeren av pakken vil kunne installere det p&#229; sitt system uten noen overraskelser.</p>

<hr />

<h2 id="automatiser">Automatiser</h2>

<p>En prosess med &#229; bygge, deploye og levere et system best&#229;r ofte av flere steg og de kan som regel automatiseres. Det er mange &#229;rsaker til at man &#248;nsker automatisering. Den ene &#229;rsaken er at det skal v&#230;re enklere for deg og alle andre &#229; bygge systemet &#8211; det korter ned tiden det tar &#229; gj&#248;re det, ergo &#229; teste en endring du har gjort i koden. Den andre &#229;rsaken er at det kan gj&#248;re det lettere for andre &#229; ta over eller hjelpe til p&#229; et prosjekt uten &#229; m&#229;tte sette seg inn i hele byggeprosessen. Det vil ogs&#229; gj&#248;re det lettere &#229; bygge med forskjellige konfigurasjoner dersom man &#248;nsker det. I tillegg til alt dette, vil det ogs&#229; eliminere den menneskelige faktoren i hele prosessen. Vi mennesker kan gj&#248;re feil, og ved &#229; automatisere manuelt arbeid fjerner vi en kilde for en del feil.</p>

<p>Automatisering kan oppn&#229;s ved hjelp av forskjellige verkt&#248;y. Alt fra enkle make- og shell-skript til ganske avanserte byggeverkt&#248;y som Apache Maven og Gradle kan hjelpe deg, litt avhengig av oppgaven som skal gj&#248;res. Oftest blir det en kombinasjon av noen ovennevnte verkt&#248;y. Disse kan hjelpe deg b&#229;de med generell automatisering av bygge- og deploy-prosessen, og med automatisering av punktene under.</p>

<p><img src="/assets/images/posts-images/2016-05-16-hva-skjer-med-koden-din etter-at-du-har-skrevet-den-ferdig_ci-superhero.png" alt="CI to the Rescue" /></p>
<figcaption class="caption">Illustrasjon laget etter mine tegninger, og for denne artikkelen av Mahasty Assi</figcaption>

<hr />

<h2 id="automatiske-tester-og-sjekk-av-kodekvalitet">Automatiske tester og sjekk av kodekvalitet</h2>

<p>N&#229;r koden din er skrevet og byggingen av den er et knappetrykk eller en skriptkj&#248;ring unna, kan du begynne &#229; se p&#229; en annen viktig del av automatisering &#8211; kj&#248;ring av tester og sjekk av kodekvalitet. De automatiske testene kan v&#230;re b&#229;de p&#229; lavniv&#229; &#8211; enhetstester &#8211; og p&#229; funksjonell niv&#229;. Enhetstester sjekker at metodene dine fungerer som de skal, for eksempel &#229; returnere riktig svar, gitt noen inputparametre. De funksjonelle testene vil teste systemet som en svart boks. Her vil du f&#229; svar om systemet ditt fortsatt kan utf&#248;re et sett med bestemte oppgaver. Det finnes ogs&#229; integrasjonstester som kan og b&#248;r automatiseres, og disse brukes for &#229; sjekke at systemet snakker med og til andre systemer p&#229; den m&#229;ten det var tiltenkt.</p>

<p>Uansett type tester kan disse, dersom de feiler, fortelle deg om at noe dramatisk har skjedd i ditt system og om at systemet har sluttet &#229; oppf&#248;re seg som forventet. Det vil ogs&#229; gi deg en mulighet til &#229; oppdage potensielle feil mye tidligere i utviklingsprosessen.</p>

<p>En annen m&#229;te &#229; oppdage skjulte problemer er &#229; kj&#248;re statisk kodeanalyse som kan oppdage kjente m&#248;nstre for feil, sikkerhetssvakheter, uvaner eller un&#248;dvendig kompleksitet.</p>

<hr />

<h2 id="milj&#248;er">Milj&#248;er</h2>

<p>N&#229;r du utvikler et system b&#248;r du vite hvilket milj&#248; og oppsett dette vil kj&#248;re p&#229; n&#229;r systemet g&#229;r live, dvs. legges ut i produksjonsmilj&#248;et. Denne informasjonen kan du bruke til &#229; sette opp tilsvarende milj&#248;er for utvikling, og spesielt med tanke p&#229; testing. Dette er n&#248;dvendig for &#229; v&#230;re i stand til &#229; oppdage feil som vil kunne oppst&#229; kun med et bestemt oppsett, eller spesifikk hardware. N&#229;r disse milj&#248;ene er satt opp kan du automatisere utrulling av din kode til disse milj&#248;ene. Dette kan v&#230;re veldig praktisk, og spare deg for mye tid. Tenk at du sjekker inn en endring (for du bruker vel et versjonskontrollsystem, ikke sant?), og vips, er det ute p&#229; et passende milj&#248;, klar til &#229; testes eller demonstreres.</p>

<hr />

<h2 id="versjoner">Versjoner</h2>

<p>Versjonering av koden vil gj&#248;re at du lett kan svare p&#229; to viktige sp&#248;rsm&#229;l:</p>

<ul>
  <li>Hvilken versjon av koden kj&#248;rer her?</li>
  <li>Hvilken funksjonalitet er en del av bestemt versjon?</li>
</ul>

<p>Begge disse sp&#248;rsm&#229;lene er noe du kommer til &#229; sp&#248;rre deg selv og vil bli spurt om fra andre. Svarene p&#229; disse vil hjelpe deg n&#229;r du skal jobbe med feil som blir fikset eller oppdaget, eller ny funksjonalitet som blir rullet ut. Dersom du lager et st&#248;rre produkt, vil du ogs&#229; f&#229; bruk for disse n&#229;r du skal lage Release Notes for den nyeste versjonen. Versjoner vil ogs&#229; hjelpe deg &#229; holde styr p&#229; en oppdatert dokumentasjon for ditt system.</p>

<hr />

<h2 id="veien-videre">Veien videre</h2>

<p>Automatisering av bygg og deploy er et veldig stort tema. Punktene som jeg nevner her kan brukes som et springbrett, en slags sjekkliste for et bedre system. Du trenger ikke gj&#248;re alt p&#229; en gang, eller g&#229; i dybden p&#229; alle punkter, men start et sted og jobb deg videre mot full automatisering.</p>

<p>Disse punktene &#8211; og litt mer &#8211; er en del av en kontinuerlig leveranseprosess som skal bidra til at det kun vil ta noen minutter fra du sjekker inn en endring til det er ute i produksjon. S&#229; langt trenger du ikke &#229; g&#229; i f&#248;rste omgang, men det kan jo v&#230;re noe &#229; strekke seg etter? Men det disse punktene kan gj&#248;re med en gang er &#229; forenkle din hverdag s&#229; vel som hele prosessen rundt h&#229;ndtering av et system, slik at du kan bruke mer tid p&#229; det du liker best, nemlig programmering!</p>

<p><em>Denne artikkelen ble publisert i magasinet INDEX (2. utgave, 2016), Institutt for Informatikk, Universitetet i Oslo.</em></p>

<hr />]]></content><author><name>Rustam Mehmandarov</name></author><summary type="html">Update 21.05.2016: English version of this article.</summary><category term="blog"/><category term="automation"/><category term="continuous delivery"/><category term="build and deploy"/><category term="testing"/><category term="norwegian"/></entry></feed>
