Uvod

Pozdrav svima. 

Zadnji članak napisao je Matija i pokušao vam približiti korištenje Jupyter Notebook-a, te dohvaćanje i osvježavanje podataka vezanih za COVID-19 (Korona) virus.

U zadnje vrijeme se ideja s prepoznavanjem COVID-19 pomoću rendgena popularizirala, te su nas spomenuli u Jutarnjem listu, ivijestima, pojavio sam se na HRT4, i možda ćete nas još negdje vidjeti. Članak oko kojeg se podigao toliki interes objavili smo puno prije ovog medijskog pokrića, 21.03.2020.

Iako smo u članku naglasili da smo originalni članak pronašli ovdje te koristili iste podatke kako bi došli do sličnih rezultata, poslije je počela promocija tih istih rezultata u raznim “radovima” kao COVID-Net. Tko je od koga i što pokupio, u to neću ulaziti. Moguće je da ljudi imaju iste ideje u isto vrijeme, ali ipak je malo čudno da firma iz članka nije niti referencirala Adriana Rosebrocka, čiji je članak izašao 15 dana prije, i sadržava i više nego dovoljno da bi se taj gorespomenuti “rad” napisao.

khm React/Redux khm Elm khm … Ovo je referenca za programere.

Za vas u ovom članku imamo nešto zanimljivije od COVID-19 koji vam je sigurno već napunio… glavu, napunio glavu.

Ljudima koji su upoznati s ML/Umjetnom Inteligencijom ovaj će članak biti (relativno) jednostavan, ali prezentira mogućnosti ML-a danas na jako dobar način. Danas ću vas upoznati s jednom projektom u kojem sudjelujem, pa samim time sudjeluje i EXACT BYTE, autonomnom autiću koji može voziti sam!

Fora, a? Projekt traje već nekih 5 mjeseci, ali prvo da malo pojasnim tko je uključen. Upozorenje, ovo će biti kao roman u kojem u prvih 5 stranica pisac uvede 20 likova pa više ne znaš tko je tko.  Ja sam Kristijan Šarić. Valjda. Ne, to mi je ime. Ali tko sam ja onda?

Tko je uključen?

Sve ovo počelo kada smo se nas troje počeli skupljati oko IoT (Internet of Things) interesa. Aleksandar Vojnić (Aco), Roberto Brezac (Roberto) i Kristijan Šarić (ja) nalazili bi se kod Roberta u Rapcu kako bi se igrali s Arduino komponentama.

Plan bio napraviti automatsko zalijevanje cvijeća, digitalnog pastira i ostalo. Ti projekti su laki (makar jednostavne verzije toga). Isto tako, lako je (i obavezno) zgoriti neke komponente na Arduino-u.

Rite of passage:

Ambiciozna ideja je bila napraviti “mini Teslu”, autonomni autić koji će moći voziti sam. I tako smo krenuli (mi, autić još ne).

Službene dvije polovice ovog projekta su “Istra Programming Languages” i “Udruga za promicanje naprednih tehnologija Start IT”. Istra Programming Languages predstavlja Kristijan Šarić dok Udrugu za promicanje naprednih tehnologija Start IT predstavlja Zvonimir Mandekić.

Aco je razvijao autić u udruzi u Rijeci, te su često imali radionice u prostorima CTKRoberto je pomagao Aci, ali njegov primarni doprinos je poligon, kao i diplomacija koja je spriječile Acu i mene da se pokoljemo.

Aco, da kažem ovo i javno, pusti taj virtualni 3D poligon.

Moj zadatak je “autonomno” u “autonomnoj vožnji”. Stvari ipak nisu tako čisto podijeljene te smo se svi međusobno savjetovali, ali nisam se gurao u izradu autića.

Kakav je to autić?

Autić je zakon. Ovo je treća verzija autića. Pogoni ga Raspberry Pi 4, četvrte generacije.

Imamo još:

  • Deltaco POWERBANK s 10.000 mAh
  • Micro servo Sg90 motor
  • Kamera je “Raspberry Pi 3 4 Wide Angle 130 Degree 1080P 5M Pixel Camera Module”

Imamo servo motor za volan i stepper motor za pogon (stepper motor je ovdje kako bismo imali precizniju kontrolu nad autićem). Aco bi mogao pričati bajke o tome zašto je baš tako kako je. Pokušao je napraviti poseban kontroler za stepper i servo ali se na Tiny-u napunila memorija pa nije htio raditi. Tako da je odustao od tog pothvata (za sada)Ali možda ćemo ipak staviti neki poseban kontroler jer ne znamo kako će vrtiti motor kada bude usput procesirao i slike.

Autićem se upravlja preko upravljača (joystick) na mobitelu, ako je to potrebno. To smo skontali da servo “štreca” kada samo mišem mičemo po ekranu.

Slike autića u 3D modelu:

I u stvarnosti:

Šta nije fora?

Evo još par slika s baterijom na parketu (fali nam još mini manekenka koja će pozirati u izazovnim pozama ispred auta, možda da stavimo Barbi pored):

“Goodyear” gume. Nije nam baš neka godina, ali gume su zakon, kompa.

Kako smo snimali, kakav je to poligon?

Poligon je izradio Roberto, te je ovo druga (major) verzija poligona koju imamo.

Prva verzija poligona bila je izrađena kompletno od kartona te jedino što je nadživjelo tu verziju su sami prometni znakovi. 

Prve skice poligona. I ne, ne sramim se to pokazati. Prve skice sam ja naškrabao, tako da ako tražite nekoga za okriviti za ove predivne škrabotine, tu sam. Slobodan sam i za izradu drugih umjetničkih apstrakcija.

 Tlocrt:

Slika iz perspektive autića:

Obratite pažnju na briljantne komentare poput “Ovo su crte na podu, a ne pregrade” i “Zalijepiti na zid ako je lakše”.

Ako mislite da se projekti rade tako da ljudi sjednu i znaju sve kako točno napraviti, u krivu ste. Puno je tu greški, škrabanja i gluposti dok ne dođemo na neku verziju koja se može iskoristiti. Tako je sa svime.

Na svu sreću, Roberto je napravio fenomenalan posao sa znakovima i to je bilo ono ključno – ako su znakovi dobri, onda će sve ostalo raditi kako treba, jer će “umjetna inteligencija” moći prepoznavati znakove pravilno.

 Znakovi:

Prva verzija poligona od kartona. 

I još jedna slika zatrpanosti garaže i potpune improvizacije:

Da, izgleda kako izgleda, ali bolje je da imamo nešto loše iz stvarnog svijeta što će barem ličiti na završnu verziju nego da potrošimo mjesece na nešto savršeno što na kraju neće raditi zbog nečeg nepredviđenog. Kako se kaže u IOHK-u, američkoj firmi za koju radim, “monotonic progress”. Nije bitno koliko brzo idemo naprijed, bitno je da idemo naprijed. Bolje svaki dan malo naprijed, nego 5 dana naprijed pa 3 dana nazad.

Često imamo te nekakve iluzije da uspjeh dolazi kada ljudi izvanrednih mogućnosti naprave čudesne stvari iz prve. Tako sam i ja mislio, ali vremenom vidim da je ono najbitnije nastaviti raditi i ići dalje. Napravite nešto nesavršeno, nešto što posluži svrsi i poboljšajte to. I tako u nedogled. Oteti se perfekcionizmu teška je zadaća, ali vrijedna energije i truda.

Better to do something imperfectly than to do nothing flawlessly.” – Robert H. Schuller

Izvanredne mogućnosti izvanrednih ljudi su obično upornost, strpljenje i samozavaravanja (beskrajni optimizam kada se uvjerite da je kraj posla iza ugla, a čekaju vas mjeseci posla).

Ali život prođe ovako ili onako, pa zašto ga onda ne potrošiti ga na nešto vama zanimljivo? Krenite. Danas!

Stoga, Aco, virtualni poligoni super su ideja; kada budemo imali stabilni autić koji može prepoznavati poligon u stvarnosti prilično dobro, ali ne prije.

Aco se potrudio da napravi virtualni poligon:

Kako je autić naučio prepoznavati znakove?

To je dio za koji sam ja bio zadužen.

Pošto sam mislio ući u malo više detalja u ovom članku, da raščistim par stvari. Kao prvo, ljudi često govore o “umjetnoj inteligenciji”. Ali često kada govorimo o postignućima umjetne inteligencije danas, govorimo o jednom podskupu koji se zove ML – machine learning.

Na hrvatskom bi (valjda) taj prijevod bio SU – strojno učenje?

Umjetna inteligencija je široko područje, možete reći da sve što ima osobine “inteligencije” iz naše perspektive koristi umjetnu inteligenciju. To je malo labava definicija, i pitanje koliko je korisna. Neke očito glupave stvari, i to glupave u smislu da su jako udaljene od toga kako ljudi razmišljaju, mogle bi se nazvati inteligentnima, što se danas i radi.

Sve je “pametno”. Pametni televizor, pametni mobitel, pametni frižider, pametna kuća, pametni auto. Sve je toliko pametno da se čovjek obeshrabri. “I choose not to choose life”.

Za sve ljude koji ovo čitaju, da dam svoje mišljenje – sve je to marketing BS. Vaša kuća nije pametna jer ima 5 senzora i jer može glasom paliti i gasiti svijetla. To može i dijete od par godina, dok slaže puzzle i priča s vama.

Imate vi kuću koja slaže puzzle i priča s vama? Ne? Onda nemate pametnu kuću. Imate glupu kuću koju vam je netko prodao kao pametnu. I tko je tu pametan a tko glup onda?

Machine learning

Korisnija definicija je definicija ML – machine learning. Ovdje je naglasak da algoritmima (programima) koji “uče” iz podataka sami. 

Kao programer koji piše “normalne” programe morate definirati svaku moguću situaciju i definirati kako da se program nosi s njom. 

Ovdje, s ML-om, algoritmu date veliku količinu podataka (slika u našem slučaju) i tražite ga da sam nauči raspoznavati različite podatke (slike).

Ulazne podatke pretvorite u brojeve, onda se dogodi nekakva magija i dobijete nekakav broj kao izlaz.

Dobra strana je ovoga što ne morate pisati i definirati svaku moguću situaciju.

Loša strana je što nikada ne može sigurno znati zašto se program tako ponaša, jer ga vi niste napisali. Ovo je još očitije u neuralnim mrežama, ML “algoritmu” kojeg ćemo koristiti za prepoznavanje znakova. Neuralna mreža sama nauči raspoznavati elemente slika (recimo uzorke slike). Jer sama nauči interpretirati sliku, teško je shvatiti zašto “vidi” ono što “vidi”.

Ako vam to nije strašno, razmislite kako biste se osjećali da se vozite u autu koji cestu vidi drugčije od vas. Malo bliže stvarnosti bilo bi da kažem – zamislite da vas vozi netko tko je pod utjecajem (halucinogenim) droga.

Ili još bolje, pogledajte što se zbiva s GAN mrežama i na koji način one mogu zbuniti “pametne” aute.

Naravno, već se razvijaju mreže koje su puno bolje, ali zahtijevaju puno više resursa kako bi radile. Jedna od ideja kako zaobići ove probleme su takozvane “Capsule Networks”, koje je razvio jedan od “očeva” neuralnih mreža, Geoffrey Hinton (Turingova nagrada bila je dodijeljena trojici, ne samo njemu). Ideja iza tih mreža bi bila da one pokušavaju povezati prostorne karakteristike slike. Što u slobodnom prijevodu znači da ne možete imati psa koji ima okrenutu glavu o odnosu na tijelo a opet biti pas.

Bonus pitanje – da li je pas i dalje pas, ako ima okrenutu glavu?

Da sumiramo, ML omogućava da na temelju većeg broja ulaznih podataka, (u našem primjeru slika znakova) dobijemo odgovor da li znak postoji, gdje je i koji je. Znači sve što ML algoritam radi je aproksimira funkciju (stvara mapiranje) iz slika poligona u lokaciju u tip znaka.

Detaljnije od ovoga ne trebamo ulaziti. Neuralnim mrežama se možemo pozabaviti u nekom sljedećem članku. Sad se fokusiramo na to kako je prepoznavanja znaka izrađeno.

Što je dostupno, što smo koristili?

Za sve koji prate što se događa u svijetu ML-a, u prepoznavanju slika, zvuka i teksta, sigurno da su upoznati s velikim imenima koja se tamo spominju.

Tensorflow, library od Google-a, stoji na vrhu te je već prilično poznat. Najjača konkurencija mu je Facebookov Pytorch.

Keras je API više razine koji stoji iznad Tensorflow-a, a fast.ai je API više razine koji stoji iznad Pytorch-a. Nisu jedini, ali sigurno su poznatiji. Ovdje sada postoji jako puno imena i puno igrača, ali mislim da ne bi trebali brinuti previše oko toga što koristiti. Odaberite jedan i radite s njime. Po mom mišljenju, za jednog početnika je Pytorch nešto malo manje magičan, što je super stvar, ali nije toliko podržan kao i Tensorflow. 

Na primjer, treniranje neuralnih mreža traži dosta hardware-skih resursa (a time i dosta vremena), pa je korisno imati pristup posebnom hardware-u. Grafičke kartice su super, ali postoji nešto još bolje. Kako je treniranje dugotrajno, bilo bi super pristupiti TPU (Tensor Processing Unit), posebnom hardware-u za treniranje neuralnih mreža, koji ima iznimno kratko vrijeme treniranja. Keras to može koristiti, Pytorch ne može (još uvijek?). To i ima smisla, ako uzmete u obzir da je TPU napravio Google i da ga nudi u sklopu Google Compute Cloud.

Nakon što ste odabrali library koji ćete koristiti, onda morate proučiti što se događa u kojem polju koje želite raditi – slike, zvuk, tekst. Postoji dosta inovacija u svima te se nadam da ću u budućnosti moći malo detaljnije pokriti i ostale.

Za slike i za ono što nama treba možemo odabrati i “TensorFlow Object Detection, što je nešto jednostavniji način da se napravi isti posao prepoznavanja slika, bez toliko kodiranja. Nemojte misliti da možete dobiti neku prednost bez da se nečega odreknete. Imate puno manje fleksibilnosti i teško ga je natjerati da radi baš tako kako vi želite, ali zauzvrat je početak nešto lakši.

Za nas ovdje je zanimljivo prepoznavanje slika. Ako gledamo što je to novoga u svijetu u zadnjih 10 godina prepoznavanja slika, imamo puno zanimljivosti.

Najveće revolucije ovdje su CNN, Convolutional neural network. Postoje razlike u tome kako se neuralne mreže koriste, koliko neuralna mreža ima slojeva i na koji način su spojene i ostalo, te sve te razlike nazivamo arhitekturama neuralne mreže.

Kako smo trenirali prepoznavanje znakova?

Mi ćemo se fokusirati na dvije arhitekture, pošto tražimo specifičan rezultat. Kako može neuralna mreža raditi na Raspberry Pi-u, koji nema toliko jak procesor, što znači da ne može računati brzo kao prosječan laptop ili desktop računalo?

Tražimo neuralnu mrežu koja nije prevelika, koja bi mogla raditi na slabijem hardware-u i koja bi bila dovoljno precizna da prepozna znakove na poligonu i gdje se oni nalaze. Zašto gdje se oni nalaze? Pa želimo biti sigurni da neuralna mreža prepoznaje samo znakove, a ne cijelu sliku gdje se znak nalazi i to asocira uz znak. 

Drugim riječima, želimo provjeriti da neuralna mreža “vidi” pravu stvar:

Isto tako, moramo imati na umu da se jednom istrenirana neuralna mreža mora se prebaciti na Raspberry uređaj i tamo je pokrenuti. 

Naravno, to sve morate prvo upogoniti – Raspberry mora moći pokretati Tensorflow koji koristimo. Neću reći da je teško, ali ako nemate sreće (ili znanja) da odaberete pravu verziju nečega, to će vam sve potrošiti vrijeme. Budite uporni, konzultirajte internet i siguran sam da će vam poći za rukom.

Ali kako neuralna mreža “zna” gdje se nalazi koji znak? E, pa u ovome je magija. Jedan video koji auto “vidi” je u biti skupina slika. Kada negdje pročitate FPS, to ne znači uvijek First Person Shooter, koji puta znači i Frames Per Second (i zgorena grafička kartica jer smo tu brojku htjeli povećati). 

Koliko sličica u sekundi – to je sve što je video, gledamo sličice koje se mijenjaju i stvara se iluzija vremena – dobiti smo četvrtu dimenziju slika, a to je vrijeme. Prostorvrijeme, anybody?

Prije nego krenemo s treniranjem, moramo sve ove sličice jednog videa ručno proći i na njima označiti svaku sliku sa znakom.

Pogledajmo kako izgleda poligon iz perspektive autića dok se vozi uokolo. U ovom slučaju vidimo kameru na autiću kojeg gura Robert.

Uzmemo takav video i pretvorimo ga u slike. Uzmemo sliku po sliku i otvorimo je u recimo LabelImg i označimo gdje su znakovi na slici.

Primjer anotacije (velika riječ koja znači označiti) slike sa “stop” znakom:

Primjer anotacije slike sa “left_turn” znakom iz drugog videa:

Train / Test split

Kada svaku sliku tako anotiramo, podijelimo ih u “train” i “test” skup. 

Ovo je učestala procedura i možete zamisliti da radi ovako. Imamo 5 slika mački. Stavimo jednu sliku mački u test skup, a ostalih četiri budu u train skupu. 

Znači jedna od pet, ili 20 % (⅕ * 100) je za test skup, a četiri od pet, ili 80 % (⅘ * 100) je za train skup.

Kada treniramo neuralnu mrežu, propuštamo ovih četiri slike iz train skupa za treniranje neuralne mreže, ali kada želimo provjeriti da li je neuralna mreža naučila prepoznavati mačku, nećemo joj dati sliku koju je već vidjela. Dati ćemo joj sliku koju nikad nije vidjela zato što želimo da neuralna mreža nauči raspoznavati sve mačke, a ne njih četiri koje imamo u slikama.

Drugim riječima, pokušavamo dobiti realnu točnost, a nju jedino možemo dobiti ako neuralna mreža ne “vidi” sliku koju ćemo koristiti za testiranje. Priča je nešto malo kompliciranija od ovoga, te tu bi bilo u redu spomenuti još overfitting kao temu za istraživanje ako nekoga zanima.

Arhitekture neuralne mreže

Prva arhitektura prilično je standardna. To je “SSD Inception v2 (COCO)” arhitektura. “COCO” je standardni dataset za prepoznavanje objekata, te stoji za “Common Objects in Context”.

Možemo vidjeti kako se ponaša na poligonu:

 

Jako precizna uz treniranje na samo jednom krugu poligona, jako dobro razaznaje znakove. Njezine performanse kada je prebacimo na Raspberry Pi 3 nisu baš neke. U prosjeku imamo okvirno 0.73 FPS (Frames Per Second). To znači da kada snimamo s kamerom, Raspberry Pi 3 uspije snimiti sliku i analizirati je nakon 1.36 sekundi. Svakih 1.3 sekundi imamo novu sliku.

To nije video i to nije dovoljno brzo da vozimo po poligonu. Zamislite da imate vozača kojem treba više od sekundu za bilo kakvu reakciju. Da, gledam na vas, penzioneri. CPU od Raspberry Pi-a drži se na nekih 75-80%, što definitivno nije dobro.

Probajmo onda uzeti manju arhitekturu uz pretpostavku da će ta manja arhitektura biti dovoljno precizna a opet puno brža. Druga arhitektura, koja je nešto manja i koja bi trebala raditi nešto brže na Raspberry Pi 3 uređaju je “SSDLite Mobilenet v2 (COCO)”. Pogledajmo kako se ona ponaša na poligonu:

 

 Ovo definitivno nije dobro. Iako imamo samo jedan krug, vidimo da postoje problemi s arhitekturom i da bi vjerojatno trebalo dosta primjera da bi postigli iste performanse. A te performanse su?

Nešto malo brže. Imamo čak 0.8 sekundi po frame-u, što je u prijevodu 1.25 FPS-a i CPU bude oko 60-70% na RPi 3. Radi marginalno brže za puno lošije performanse.

Hajdemo pogledati još jednu lakšu arhitekturu u nadi da ćemo naći nešto puno brže. Arhitektura koju ćemo pogledati i nećemo više uopće koristiti je “SSD mobilenet v3 small (COCO)”. Ona ima nekih skoro 3 FPS-a, što je puno bolje. CPU bude na nekih 40%, što je prihvatljivo, ali njena točnost je… Neprihvatljiva.

I što onda? To je to? Stajemo ovdje, nećemo ništa napraviti za detekciju? Ne, potrebno je imati nešto na autiću što može detektirati ne samo znakove nego kasnije i crtu po kojoj vozi. Pa kako ćemo to napraviti? Hoćemo li imati “Penzić Derby” gdje će se autići zabijati jedni u druge? Ne!

Koristit ćemo novu tehnologiju.

Kako smo ubrzali prepoznavanje znakova da bude u realnom vremenu?

Sjećate se da sam gore spomenuo da postoje hardware-ski akceleratori za neuralne mreže. TPU (Tensor Processing Unit)?

E, pa, postoji jedan koji spojite na USB i koji radi kao vanjska jedinica. Ime mu je “Google Edge TPU”. 

Možete vidjeti slike kako sam ga nježno raspakirao i kako je spojen na Raspberry Pi 3. I ostale izazovne poze.

(Coral) Edge TPU ima iznimno dobre performanse za evaluaciju neuralnih mreža. Detaljnije možete pogledati ovdje.

Stigao je u roku od par dana kako sam ga naručio. Ono što nas zanima jest, da li je moguće pokrenuti ovu našu točniju arhitekturu u realnom vremenu s dobrim performansama na Raspberry Pi 3?

Odgovor je da.

Ono što prvo moramo napraviti je prebaciti postojeći model u jedan poseban format koji se zove TensorFlow Lite. To je, kao što naziv kaže, nekakva lakša inačica standardnog modela predviđena za manje uređaje poput smartphone-a ili IoT uređaja.

Možda možemo malo detaljnije o samom uređaju i njegovim konačnim performansama u drugom članku, pošto je jedan od planova istražiti da li je moguće u isto vrijeme prepoznavati znak i pratiti crtu.

Što dalje, koji su sljedeći koraci?

Praćenje ceste je drugi veliki problem koji još treba riješiti. Krenuli smo sa rješavanjem, ali nismo još došli na razinu da kažemo da smo zadovoljni s time.

Neki autići koji se tako kreću po poligonu mogli bi imati i Lidar, ali ovo je puno jednostavnije.

Moja ideja bila je dodati tri ultrazvučna senzora na autić pa pomoću toga detektirati lokaciju, ali praćenje ceste je možda više realističan primjer autonomnog vozila. 

Aco planira napraviti ručno praćenje pomoću OpenCV-a i grubih kontrastnih slika, dok je moj plan napraviti regresiju s neuralnom mrežom. 

Trenutni poligon vjerojatno će dobiti podlogu. Ta podloga je tu kako bi se autić lakše kretao a i kako bi imao crtu nasred “ceste” koju bi pratili autićem.

Primjer kako bi u grubo izgledao poligon:

Kada sve ovo bude zgotovljeno, očekujte drugi dio. Također, očekujte i prezentaciju.

Naravno, najavit ćemo prezentaciju za autić i prezentirati ga kada bude vrijeme. Prezentacija bi trebala biti u Puli, na Meetup-u “Istra Programming Languages”, a i u Rijeci, na Meetup-u “Udruga za promicanje naprednih tehnologija Start IT”.

Ja vas naravno sve zainteresirane pozivam na prezentacije kada bude vrijeme. Isto tako, pozivam vas da sudjelujete i da date svoje ideje, prijedloge i poboljšanja, ali prije svega vas pozivam na uključivanje i sudjelovanje na ovome projektu.

Pridružite se u “Istra Programming Languages” i “Udruga za promicanje naprednih tehnologija Start IT” i napišite nam što vi želite vidjeti u članku/prezentaciji, gdje ste zapeli i slično. 

Zaključak

Sve ovo možete napraviti i sami, te se ne bi trebali bojati napraviti sami, nije toliko teško (ako ste uporni). Ono što je meni na pameti već duže vremena je staviti kameru u “pravi” auto i onda ocjenjivati druge vozače (koji su većinom idioti, BTW) kako voze, da li prelaze crtu (da, ljudi, to je učestalo), da li pale signalna svjetla (žmigavce). 

Ono što je veliki problem danas je što ljudi niti ne znaju mogućnosti što se sve može napraviti, pa tako, čak i kad se javimo u neke firme sa “mi imamo proizvode koji koriste umjetnu inteligenciju”, ljudi koji tamo rade često niti ne razumiju o čemu pričamo. Možda misle da prodajemo maglu?

Svi nažalost čekaju neki “best practice” BS, gdje će menadžeri slušati kako im prodavači prodaju stvari koje su bile na tržištu prije 15 godina.

Jedan od razloga zašto smo krenuli ovo pisati nije jer je zabavno, nego jer se nadamo da će se pročuti za nas i da će ljudi napokon početi shvaćati da ovakve stvari nisu niti teške niti 10 godina u budućnosti. Ovdje su. Danas.

Nadamo se da ćete se i vi pridružiti ovom glasu.  

Kratak je život. Napravite nešto na što ćete biti ponosni.