ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 148
Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 112
Abonament PDF

Cum să creezi de la zero un braț robotic inteligent?

Victor Popa
Embedded C / C++ Developer&Engineer @ Arobs



PROGRAMARE

Inteligența artificială (AI) și machine vision au un rol din ce în ce mai mare în procesarea digitală a imaginilor, având în vedere că software development-ul a deschis calea spre posibilități tehnologice complexe.

Următorul studiu elaborat de Victor, developer și inginer Embedded C/C ++ la AROBS și, în același timp, student pasionat la masterul de Automotive Embedded Software din cadrul Universității Politehnice din Timișoara, prezintă mecanismele și procesul creării unui braț robotic care poate tasta în mod autonom, utilizând rețele neuronale, machine vision și algoritmi de deep cam.

"Important este să nu te oprești din a te întreba."

Albert Einstein

Machine vision? Rețele neuronale? Detectarea obiectelor? Ce sunt toate astea? Cum funcționează? Și cea mai importantă întrebare: Cum le pot folosi în propriile proiecte pentru a automatiza diferite procese? Acestea au fost primele întrebări în domeniul machine vision și al rețelelor neuronale, pe care mi le-am pus ca student în ultimul an de licență, specializarea Automatizare și Informatică la Universitatea Tehnică din Moldova.

Ideea unui braț robotic - plictisit de tastare

La fel ca toți studenții, m-am săturat să tastez text pe un computer, așa că motivat de spiritul meu de a automatiza diverse procese, mi-a venit ideea de a îmbina inteligența artificială, machine vision și alte tehnologii pentru a crea o mână robotică care tastează text, de mână, în mod autonom. Așa a luat naștere ideea lucrării mele de licență.

Principalele caracteristici ale unui sistem robotic inteligent

Conceptul de bază al proiectului se bazează pe utilizarea tehnicilor de machine vision, rețelelor neuronale, tehnicilor de poziționare în spațiul 3D prin camera WEB și, bineînțeles, crearea unui GUI (Graphical User Interface) pentru interacțiunea dintre sistemul inteligent și utilizator sau client.

Brațul robotului va transcrie automat textul scris de mână. Textul manual este vizualizat printr-o cameră WEB, după care este trimis la server pentru interpretarea și extragerea informației. După procesarea textului, brațul robotic echipat cu o altă cameră WEB, detectează literele de pe tastatură în timp real.

Prin utilizarea algoritmilor de deep cam, se urmărește traiectoria mișcării brațului de la punctul curent la litera necesară de pe tastatură. Acest proces se repetă ciclic pentru fiecare literă din cuvânt.

Detectarea și interpretarea textului scris de mână

Pentru a interacționa mai confortabil cu utilizatorul, se creează un GUI (Figura 2), care oferă setul complet de caracteristici așteptate. Utilizatorul trebuie doar să plaseze textul sub cameră și să facă o fotografie prin intermediul acestei aplicații. După ce fotografia este făcută, aceasta este transmisă rețelelor neuronale ale serviciilor cognitive Microsoft (Figura 5 ). Această metodă a fost aleasă pentru a crește productivitatea și viteza programului. De asemenea, datorită acestor servicii, aceasta atinge o precizie de 90% a detectării textului (Figura 4). Comunicarea dintre programul de bază și Serviciile Cognitive Microsoft se efectuează prin API specializat( Figura 6), pentru setarea acestuia este nevoie de a crea cont special după care credențialele ca (user și parola să fie setate ca variabile globale în sistemul de operare, în cazul nostru este vorba despre Windows) (Figura 7).

Codul sursă al interfeței grafice:

self.stepOne =LabelFrame(self.Manual_Control_Tab, 
  text="Common Actions ")

self.stepOne.grid(row=1, columnspan=10, 
  sticky='W',padx=7, pady=5, ipadx=5, ipady=5)
..
self.robotic_frame =LabelFrame(
  self.Manual_Control_Tab, 
  text=" Robotic Arm Control Block  ")

self.robotic_frame.grid(row=3, columnspan=7, 
  sticky='W',padx=5, pady=5, ipadx=5, ipady=5)

self.entry_gcode_comands=Entry(
  self.send_comand_frame,width=62)

self.entry_gcode_comands.grid(row=0,column =0)
..

Figura 2 - Graphical User Interface (GUI)

După ce textul este extras din imagine, acesta este transmis înapoi la algoritm, astfel încât să poată fi tastat de brațul robotic. Dar acesta este deja următorul pas.

Fotografia achiziționată prin intermediul camerei web este transformată într-o matrice (X, Y, Z) (Figura 3) unde X reprezintă - numărul de pixeli pe axa X, Y- numărul de pixeli pe axa Y, 3 - numărul de canale de culoare, în acest caz, RGB (roșu, verde, albastru). Pentru fiecare culoare, se formează o matrice bidimensională (X, Y) în care fiecare celulă cu coordonate (Jxy) reprezintă intensitatea pixelilor pentru fiecare canal separat.

După ce transformarea se realizează cu succes, fotografia este transmisă prin intermediul tehnologiei API (Application Programming Interface) către serverele Microsoft.

Figura 3. Formarea matricei RGB

Figura 4. Exemplu de răspuns de la Azure Cognitive Services

Figura 5. Schema bloc a sistemului pentru detectarea și extragerea textului scris de mână

Codul sursă al modulului de comunicare cu Serviciile Cognitive Microsoft:

# Call the "GET" API and wait for the retrieval of 
# the results
  while True:
    recognize_handwriting_result = self
    .computervision_client
    .get_read_operation_result(operation_id_local)

    if recognize_handwriting_result.status 
    not in ['NotStarted', 'Running']:
    break

    time.sleep(1)
  image = Image.open(local_image_handwritten_path)
  ax = plt.imshow(image)
..

Codul sursă al inițializării și verificării credențialelor de Microsoft Cognitive Services:

def initialize_cognitive_service(self,*args):
# Add  and verify your Computer Vision subscription key to 
# your environment variables.
if 'COMPUTER_VISION_SUBSCRIPTION_KEY' in 
os.environ:
    subscription_key = os.environ[
    'COMPUTER_VISION_SUBSCRIPTION_KEY']

    print("->FIND COMPUTER_VISION_SUBSCRIPT : OK")
else:
    print("\nSet the COMPUTER_VISION_SUBSCRIPTION_
    KEY environment variable.\n**Restart your shell or  
    IDE for changes to take effect.**")
    os._exit(1)
# Add and verify your Computer Vision endpoint to your 
# environment variables.
if 'COMPUTER_VISION_ENDPOINT' in os.environ:
              endpoint = os.environ['COMPUTER_VISION_ENDPOINT']
    print("->FIND COMPUTER_VISION_ENDPOINT : OK")
else:
..

Detectarea literelor pe tastatură - pași

Interpretarea literelor de pe tastatură se face cu ajutorul rețelelor neuronale.

Rețeaua neuronală utilizată în acest proiect are rolul de a interpreta imaginea deja procesată de tehnologiile de procesare a imaginii digitale. Segmentarea imaginii se face independent, aceasta presupunând că imaginea transmisă pentru interpretarea rețelei neuronale poate fi doar o literă corespunzătoare unei singure clase de litere. Rețeaua neuronală utilizată în acest proiect are o viteză de procesare mult mai mare, viteza de detecție variind între 15-20ms.

Pasul 1: Achiziționarea prin intermediul WEB Cam a imaginii tastaturii.

Pasul 2: Binarizarea imaginii

Pasul 3: Segmentarea imaginii, pentru fiecare literă diferită

Pasul 4: Trimiterea imaginii din pasul anterior pentru interpretare către CNN (Convolutional Neuronal Networks)

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=input_shape))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Conv2D(32, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.2))

Inițializarea rețelei neuronale cu toate nivelurile necesare.

Pasul 5: Calcularea poziție literelor recunoscute în spațiul coordonatelor globale

print(":->Transform detected letter from 3D to 2D...")
  global se
  for c in loc:
    x,y,w,h = loc[c]
    pos_letter_list.append((c,x,y,w,h))
    detectet_letter.append(c)
    print("{}-{}".format(se,pos_letter_list[se]))
    se = se+1
    cx, cy = x+w/2, y+h/2
    cx =cx +7
    cy = cy +7
    imgPt_c = np.array([[cx],[cy],[1 ]])
    worldPt_c = k_inv.dot(depth_cam2key * imgPt_c)
    centroid_dict[c] = (worldPt_c[0,0],   
    worldPt_c[1,0])
    pos_dict[c] =(x,y,x+w,y+h,cx,cy,w,h)
  detectet_letter.sort()
  detectet_letter.pop(0)
  print(":->OK.")

Pasul 6: Obținerea răspunsului de ieșire de la CNN și decuparea fiecărei litere detectate de pe tastatură

Algoritm de inspecție vizuală

În unele situații, din diverse motive, nu toate literele de pe tastatură sunt recunoscute. Algoritmul de inspecție vizuală este creat pentru a reduce apariția acestor situații. Scopul său principal este de a detecta litere care nu au fost recunoscute.

Această funcție este realizată prin utilizarea algoritmului care verifică iterativ fiecare literă recunoscută de rețeaua neuronală. Fiecare literă recunoscută este adăugată la o bază de date internă a programului. Prima etapă a algoritmului este de a compara baza de date curentă cu cea de referință (în această bază de date sunt prezente toate literele împreună cu literele vecine, litera vecină din dreapta și litera vecină din stânga), verificând și găsind litera care nu a fost recunoscută. Algoritmul folosește informațiile din baza de date curentă (literele recunoscute și poziția lor în spațiul 3D).

Codul sursă al algoritmului de inspecție vizuală:

print(":->Maping all detected letter...")
  for i in detectet_letter:
    sosed_r = sosedi[i][1]
    sosde_l =sosedi[i][0]
    if sosde_l =="  ":
      ii = i in orderet_lt_dict
      if ii == False:
        not_detected_letter.append(i)
        drawing_letter_pos.append(drawing_letter(i,
        sosde_l,(0,0,0,0),sosed_r,"not_found"))
      else:
        ss = sosed_r in orderet_lt_dict
        if ss == False:
          print("------{}"
          .format(sosed_r in orderet_lt_dict))
          not_detected_letter.append(sosed_r)
          drawing_letter_pos.append(drawing_letter(i,
          sosde_l,(0,0,0,0),sosed_r,"not_found"))
        else:
          print("------{}"
          .format(sosed_r in orderet_lt_dict))
          drawing_letter_pos.append(drawing_letter(i,
          sosde_l,(0,0,0,0),sosed_r,
          orderet_lt_dict[sosed_r]))
..

Figura 9. Tasta recunoscută fără algoritmul de inspecție vizuală

Figura 10. Tasta recunoscută după aplicarea algoritmului de inspecție vizuală

Cartografierea literelor detectate de la tastatură se realizează în felul ilustrat în următoarea imagine:

Figura 11. Cartografierea literelor în sistemul cartezian a coordonatelor

Calcularea distanței dintre literă și brațul robotic

Tastarea literelor de către brațul robotic se face prin legarea coordonatelor brațului robotic la coordonatele tastei corespunzătoare literei solicitate (Figura 11).

Această legare se face prin tehnici de fotometrie, care permite posibilitatea utilizării camerei web pentru a găsi poziția obiectului în sistemul de coordonate - global (X, Y, Z) prin manipularea cu imaginea corespunzătoare. Tehnica dată se numește Pin Hole Camera Model și se bazează pe modelul camerelor întunecate.

Aceasta tehnică funcționează pe baza proiectării punctului din sistemul global de coordonate pe planul imaginii. Aceasta realizează calculul distanței dintre două puncte. Cunoașterea poziției tastei și a brațului robotic face posibilă efectuarea calculelor necesare pentru a stabili traiectoria mișcării până la litera cerută (Figura 12).

Figura 12 - Modelul Pin Hole Camera utilizat pentru calcularea distanței dintre braț și literă de pe tastatură

Pentru a transforma coordonatele globale (X, Y, Z) în coordonatele (u, v) ale planului de imagine, este necesar să cunoaștem un set de parametri precum:

Unde:

fx - distanța focală pe axa x a camerei, măsurată în pixeli.

fy- distanța focală pe axa y a camerei măsurată în pixeli.

Coordonata Cx - x a centrului optic al camerei.

Coordonata Cy - y a centrului optic al camerei.

În urma calibrării camerei prin funcțiile din biblioteca OpenCV, se obține modelul camerei web utilizate în acest proiect.

Cunoscând parametrii necesari, se pot determina coordonatele globale ale punctului cu mare precizie, conform formulei de mai jos.

Figura 13. Rezultatul detectării utilizând Pinhole Camera Model

Figura 14. Precizia de calcul a algoritmului

Figura 15. Brațul robotic

Concluzie - efectul inteligenței artificiale asupra procesării imaginilor digitale

Acest studiu demonstrează posibilitățile enorme ale inteligenței artificiale în procesarea digitală a imaginilor, oferind o gamă largă de variante posibile de utilizare în funcție de dorințele și nevoile inginerului.

Singurul dezavantaj este că necesită o bază materială tehnică modernă și resurse de calcul mari.

Machine vision este o ramură care este din ce în ce mai utilizată în toate domeniile vieții. Prin urmare, este o zonă de interes crescândă pentru studiile de cercetare ulterioare, care, în raport cu acest studiu, se vor concentra pe rezolvarea problemelor reale.

Pentru mai multe informații puteți lua legătura cu Victor P. scriindu-ne un mesaj.

Proof of Concept - Să vedem cum funcționează

Pentru a vedea cum funcționează brațul robotic, puteți viziona videoclipul de mai jos. (link)

Codul sursă al proiectului: https://github.com/JohnyLex/RoboticArm

Conferință TSM

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects