RetinaNet Object Detection cu PyTorch și torchvision PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Detectarea obiectelor RetinaNet cu PyTorch și torchvision

Introducere

Detectarea obiectelor este un domeniu larg în viziunea computerizată și una dintre cele mai importante aplicații ale vederii computerizate „în sălbăticie”. La un capăt, poate fi folosit pentru a construi sisteme autonome care navighează agenții prin medii – fie că este vorba de roboți care execută sarcini sau de mașini care se conduc singure, dar acest lucru necesită intersecția cu alte domenii. Cu toate acestea, detectarea anomaliilor (cum ar fi produsele defecte pe o linie), localizarea obiectelor în cadrul imaginilor, detectarea facială și diverse alte aplicații ale detectării obiectelor se pot face fără a intersecta alte câmpuri.

Detectarea obiectelor nu este la fel de standardizată precum clasificarea imaginilor, în principal pentru că majoritatea noilor dezvoltări sunt realizate de obicei de către cercetători, întreținerii și dezvoltatori individuali, mai degrabă decât de biblioteci și cadre mari. Este dificil să împachetați scripturile utilitare necesare într-un cadru precum TensorFlow sau PyTorch și să mențineți ghidurile API care au ghidat dezvoltarea până acum.

Acest lucru face ca detectarea obiectelor să fie oarecum mai complexă, de obicei mai pronunțată (dar nu întotdeauna) și mai puțin accesibilă decât clasificarea imaginilor. Unul dintre avantajele majore de a fi într-un ecosistem este că vă oferă o modalitate de a nu căuta informații utile despre bunele practici, instrumente și abordări de utilizat. Cu detectarea obiectelor – majoritatea trebuie să facă mult mai multe cercetări asupra peisajului câmpului pentru a obține o bună prindere.

Detectarea obiectelor cu RetinaNet de la PyTorch/TorchVision

torchvision este proiectul PyTorch Computer Vision și își propune să faciliteze dezvoltarea modelelor de CV bazate pe PyTorch, oferind scripturi de transformare și augmentare, un model de grădină zoologică cu greutăți pre-antrenate, seturi de date și utilități care pot fi utile unui practician.

În timp ce încă în versiune beta și foarte experimental - torchvision oferă un API de detectare a obiectelor relativ simplu, cu câteva modele din care să alegeți:

  • R-CNN mai rapid
  • RetinaNet
  • FCOS (RetinaNet complet convoluțional)
  • SSD (coloana vertebrală VGG16... da)
  • SSDLite (coloana vertebrală MobileNetV3)

Deși API-ul nu este la fel de sofisticat sau simplu ca alte API-uri terțe, este un punct de plecare foarte decent pentru cei care ar prefera în continuare siguranța de a fi într-un ecosistem cu care sunt familiarizați. Înainte de a merge mai departe, asigurați-vă că instalați PyTorch și Torchvision:

$ pip install torch torchvision

Să încărcăm unele dintre funcțiile utilitare, cum ar fi read_image(), draw_bounding_boxes() și to_pil_image() pentru a fi mai ușor de citit, de desenat și de afișat imagini, urmat de importarea RetinaNet și a greutăților sale pre-antrenate (MS COCO):

from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import retinanet_resnet50_fpn_v2, RetinaNet_ResNet50_FPN_V2_Weights

import matplotlib.pyplot as plt

RetinaNet folosește o coloană vertebrală ResNet50 și o rețea piramidală caracteristică (FPN) pe deasupra. În timp ce numele clasei este verbos, este indicativ pentru arhitectură. Să aducem o imagine folosind requests bibliotecă și salvați-o ca fișier pe unitatea noastră locală:

import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)

img = read_image("obj_det.jpeg")

Cu o imagine pe loc – ne putem instanția modelul și greutățile:

weights = RetinaNet_ResNet50_FPN_V2_Weights.DEFAULT
model = retinanet_resnet50_fpn_v2(weights=weights, score_thresh=0.35)

model.eval()

preprocess = weights.transforms()

score_thresh argument definește pragul la care un obiect este detectat ca obiect al unei clase. În mod intuitiv, este pragul de încredere și nu vom clasifica un obiect ca să aparțină unei clase dacă modelul are mai puțin de 35% încredere că aparține unei clase.

Să preprocesăm imaginea folosind transformările din greutățile noastre, să creăm un lot și să rulăm inferența:

batch = [preprocess(img)]
prediction = model(batch)[0]

Asta e, al nostru prediction Dicționarul conține clasele și locațiile de obiecte deduse! Acum, rezultatele nu sunt foarte utile pentru noi în această formă – vom dori să extragem etichetele cu privire la metadatele din greutăți și să desenăm casete de delimitare, ceea ce se poate face prin draw_bounding_boxes():

labels = [weights.meta["categories"][i] for i in prediction["labels"]]

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                          labels=labels,
                          colors="cyan",
                          width=2, 
                          font_size=30,
                          font='Arial')

im = to_pil_image(box.detach())

fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()

Rezultă:

RetinaNet a clasificat de fapt persoana care se uită în spatele mașinii! Aceasta este o clasificare destul de dificilă.

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!

Puteți comuta RetinaNet la un FCOS (RetinaNet complet convoluțional) prin înlocuire retinanet_resnet50_fpn_v2 cu fcos_resnet50_fpn, și folosiți FCOS_ResNet50_FPN_Weights greutăți:

from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import fcos_resnet50_fpn, FCOS_ResNet50_FPN_Weights

import matplotlib.pyplot as plt
import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)

img = read_image("obj_det.jpeg")
weights = FCOS_ResNet50_FPN_Weights.DEFAULT
model = fcos_resnet50_fpn(weights=weights, score_thresh=0.35)
model.eval()

preprocess = weights.transforms()
batch = [preprocess(img)]
prediction = model(batch)[0]

labels = [weights.meta["categories"][i] for i in prediction["labels"]]

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                          labels=labels,
                          colors="cyan",
                          width=2, 
                          font_size=30,
                          font='Arial')

im = to_pil_image(box.detach())

fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()

Mergând mai departe – Învățare profundă practică pentru viziunea computerizată

Natura ta curios te face să vrei să mergi mai departe? Vă recomandăm să verificați Curs: „Învățare profundă practică pentru viziunea computerizată cu Python”.

RetinaNet Object Detection cu PyTorch și torchvision PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Un alt curs de Computer Vision?

Nu vom face clasificarea cifrelor MNIST sau a modei MNIST. Și-au servit rolul cu mult timp în urmă. Prea multe resurse de învățare se concentrează pe seturile de date de bază și pe arhitecturile de bază înainte de a lăsa arhitecturile avansate de tip cutie neagră să asume povara performanței.

Vrem să ne concentrăm asupra demistificare, practic, înţelegere, intuiţie și proiecte reale. Vreau sa invat cum poți face o diferență? Vă vom duce într-o plimbare de la modul în care creierul nostru procesează imaginile până la scrierea unui clasificator de învățare profundă de nivel de cercetare pentru cancerul de sân la rețele de învățare profundă care „halucinează”, învățându-vă principiile și teoria prin muncă practică, echipându-vă cu know-how și instrumente pentru a deveni un expert în aplicarea învățării profunde pentru a rezolva viziunea computerizată.

Ce e inauntru?

  • Primele principii ale vederii și modul în care computerele pot fi învățate să „vadă”
  • Diferite sarcini și aplicații ale vederii computerizate
  • Instrumentele meseriei care vă vor ușura munca
  • Găsirea, crearea și utilizarea seturilor de date pentru viziune computerizată
  • Teoria și aplicarea rețelelor neuronale convoluționale
  • Gestionarea deplasării de domeniu, apariției concomitente și a altor părtiniri în seturile de date
  • Transfer Învățați și utilizați timpul de instruire și resursele de calcul ale altora în beneficiul dumneavoastră
  • Construirea și formarea unui clasificator de ultimă generație pentru cancerul de sân
  • Cum să aplicați o doză sănătoasă de scepticism ideilor principale și să înțelegeți implicațiile tehnicilor adoptate pe scară largă
  • Vizualizarea unui „spațiu conceptual” al unui ConvNet folosind t-SNE și PCA
  • Studii de caz despre modul în care companiile folosesc tehnicile de viziune computerizată pentru a obține rezultate mai bune
  • Evaluarea corectă a modelului, vizualizarea spațiului latent și identificarea atenției modelului
  • Efectuarea cercetărilor de domeniu, procesarea propriilor seturi de date și stabilirea de teste de model
  • Arhitecturi de ultimă oră, progresul ideilor, ce le face unice și cum să le implementăm
  • KerasCV – o bibliotecă WIP pentru crearea de conducte și modele de ultimă generație
  • Cum să analizați și să citiți lucrările și să le implementați singur
  • Selectarea modelelor în funcție de aplicația dvs
  • Crearea unui canal de învățare automată de la capăt la capăt
  • Peisaj și intuiție în detectarea obiectelor cu R-CNN-uri mai rapide, RetinaNets, SSD-uri și YOLO
  • Instanță și segmentare semantică
  • Recunoașterea obiectelor în timp real cu YOLOv5
  • Instruirea detectoarelor de obiecte YOLOv5
  • Lucrul cu Transformers folosind KerasNLP (bibliotecă WIP puternică în industrie)
  • Integrarea Transformers cu ConvNets pentru a genera subtitrări ale imaginilor
  • Deepdream

Concluzie

Detectarea obiectelor este un domeniu important al Computer Vision și unul care, din păcate, este mai puțin accesibil decât ar trebui să fie.

În acest scurt ghid, am aruncat o privire la cum torchvision, pachetul Computer Vision de la PyTorch, facilitează efectuarea detectării obiectelor pe imagini, folosind RetinaNet.

Timestamp-ul:

Mai mult de la Stackabuse