Swift 4 – Intro in Vision Framework

Daca ar fi sa fac un overview a saptamanii care tocmai a trecut, pot spune doar ca am avut ocazia sa lucrez cu o jucarie foarte draguta marca Apple.

Cum deja au trecut doua luni de la WWDC, era si cazul sa pun mana sa invat CoreML si Vision, framework-uri de machine learning.

Desi tehnologia e inca nelansata, lansarea oficiala avand loc in toamna, deja este considerata mult mai puternica decat ceea ce au prezentat de-a lungul timpului alte companii in materie de solutii inteligente. Dupa parerea mea, cel mai bun lucru pe care l-a luat in calcul Apple cand a dezvoltat aceste framework-uri este faptul ca transportul de date prin conexiune de internet e pagubos in cazul clasificarii imaginilor si atunci solutia a fost ca toata inteligenta sa fie chiar in telefonul userului. Pe viitor treaba asta va ajuta extrem de mult la construirea de aplicatii inteligente care sa nu consume nici mult internet si sa ruleze rapid.

 

Ceea ce am facut eu saptamana asta a fost putin research in materie de Vision si mlmodels (modele pentru CoreML). Spre deosebire de Project Oxford (Cognitive Services, dupa numele nou) de la Microsoft, mi-a fost extrem de usor sa inteleg cum se face un program care sa detecteze, spre exemplu, dreptunghiuri intr-o imagine sau cum sa recunoasca cifre scrise de mana in respectivele dreptunghiuri.

 

Pentru a intelege cum functioneaza toata aceasta inteligenta am vrut sa inteleg conceptual modul in care comunica framework-urile noi. La baza framework-ului de Vision si NLP (Natural Language Processing) sta CoreML, bazat la randul lui pe Accelerate, BNNS (Basic neural network subroutines) si, cum altfel, pe Metal. Dar mai multe spune Apple chiar in documentatie: https://developer.apple.com/documentation/coreml

 

Ok, acum stim oarecum care este startul. Construirea unei aplicatii care sa recunoasca un dreptunghi am inceput-o asa:

  • 1. Am cautat pe google sa vad daca a mai facut cineva asa ceva si ce probleme a avut. Cum oamenii inca nu au inceput sa isi puna intrebari pe stack am zis “ok, hai sa vedem documentatia Apple”.
  • Pasul al 2-lea a fost sa ma uit peste documentatia Vision Framework-ului si asa am realizat ca multe din lucrurile implementate aici, precum recunoasterea de dreptunghiuri sau procesarea de imagini vin din iOS 8 cand Apple a adus  la suprafata CoreImage Detector. Clasa care ne ajuta inainte sa detectam forme in imagini sau coduri QR si nu numai, sub forma de CIFeature. Spre exemplu: Daca voiam sa facem o cerere dupa un dreptunghi am fi primit un CIRectangleFeature

 

Fata de CIDetector lucrurile nu sunt extrem de diferite in cazul framework-ului VN (vision) doar ca modul in care cerem si primit datele e ceva mai interesant.

 

Inainte de toate va trebui sa aruncam un ochi pe documentatia lui Vision si facilitatile pe care le are, ce tipuri de requesturi poate face, etc. aici: https://developer.apple.com/documentation/vision

 

Dupa care, pasii construirii unei aplicatii care sa recunoasca dreptunghiuri sunt destul de simpli:

  1. Definesc un request pentru framework-ul de Vision, in cazul nostru un VNDetectRectanglesRequest care va contine ca parametru un completion handler pentru a-l apela la finalizarea procesarii imaginii. Practic eu ii zic framework-ului ca urmeaza sa vreau sa fac detectie dupa dreptunghiuri si sa ma anunte el cand termina, apeland metoda data ca parametru. Super
  2. Pasul 2 e asemanator cu primul pas 🙂 Acum, desi am definit un request, intrebarea e: si ce face acest request? Pai nimic 🙂 am definit un request pentru o imagine, zicem noi, insa aplicatia nu stie ca vrem sa il aplicam pe o imagine… asa ca avem nevoie de un requestHandler caruia ii vom spune ce imagine va fi procesata si care este orientarea ei. Acest requestHandler, ulterior va pune in functiune, tot el, si requestul facut la pasul 1. Pentru a defini un requestHandler vom folosi VNImageRequestHandler(ciImage: CIImage, orientation: CGImagePropertyOrientation)
  3. Acum va trebui sa punem in aplicare request-ul prin intermediul request handler-ului. Cum facem asta? requestHandler.perform ( [ request ] ) Practic ii spunem requestHandler-ului sa faca perform cu un array de request-uri, in cazul nostru doar unul. Acum va incepe procesarea de imagine si dupa ce procesarea va fi completa se va apela functia de completionHandler de la punctul 1.
  4. La final, metoda de completion Handler va primi un parametru de tip VNRequest si unul de tip Error? Daca aruncam un ochi peste parametrul de tip VNRequest, observam ca este o instanta ce contine un atribut “results” In acest array de obiecte tip VNObservation se gasesc toate obiectele observate, deci si dreptunghiurile noastre.
  5. Ultimul pas e cel mai easy. Am definit requestul, am definit request handler-ul si am dat perform… deja am primit chiar si array-ul de results dar am vrea sa desenam dreptunghiurile in imagine 🙂 cum facem asta? Transformam vectorul de VNObservation in vector de VNRectangleObservation si… magie neara, a mers. Acum fiecare element din vector va contine atribute ce vor indica pozitia dreptunghiului observat in imagine (topLeft, topRight, bottomLeft, bottomRight)

 

Codul pentru tot ce am vorbit e la mine pe github: https://github.com/mariusjcb/swift4-vision-detectrectangles

https://github.com/mariusjcb/swift4-vision-detectrectangles/blob/master/CoreML%20WWDC%20Day1%2015:30/ViewController.swift

Share Button

Marius

Leave a Reply

Your email address will not be published. Required fields are marked *