Disponibilă pe majoritatea dispozitivelor mobile și a serviciilor social media, recunoașterea obiectelor reprezintă un prim pas în realizarea oricărei aplicații care are legătură cu interacțiunea umană. Acest articol vă va arăta cum putem realiza acest lucru cu câteva linii de cod scrise în python și care sunt avantajele principalelor modelelor existente precum alexnet, GoogleNet sau facenet .
Vom folosi în acest proiect librăria Jetson Inference. Inferența diferă de rețelele neuronale prin faptul că reprezintă un model optimizat și antrenat.
Pentru rularea aplicației, vom folosi Jetson Nano, o placă de dezvoltare IoT de la NVidia care are 4GB Ram și 128 core-uri Cuda, ceea ce o diferențiază de celelalte existente pe piață.
Primul pas este instalarea librăriei, toate detaliile și realizarea buildului local pot fi văzute pe gihub.
Se aleg modelele care vor fi descărcate:
Rulăm prima aplicație de clasificare a imaginilor, din care remarcăm fragmentul de cod următor:
# load an image (into shared CPU/GPU memory)
img, width, height =
jetson.utils.loadImageRGBA(
opt.file_in)
# load the recognition network
net = jetson.inference
.imageNet(opt.network,
sys.argv)
# classify the image
class_idx, confidence =
net.Classify(img, width, height)
# find the object description
class_desc =
net.GetClassDesc(class_idx)
# print out the result
print(“image is recognized as ‘{:s}’ (class #{:d}) with {:f}% confidence\n”.format(class_desc, class_idx, confidence * 100))
Fragmentul de cod de mai sus citește imaginea, realizează clasificarea acesteia folosind TensorRT și rețeaua aleasă (googlenet, alexnet sau altele). Rezultatul final este clasa obiectului detectat și procentul de precizie cu care a fost identificat acesta. Precizăm că la prima rulare se va realiza buildul pentru engine-ul Cuda, procesul durând câteva minute pe Jetson Nano.
[TRT] device GPU, configuring CUDA engine
[TRT] device GPU, building FP16: ON
[TRT] device GPU, building INT8: OFF
[TRT] device GPU, building CUDA engine (this may take a few minutes the first time a network is loaded)
Recunoașterea imaginilor, așa cum am văzut mai sus, este relativ simplă dacă ținem cont de cele câteva linii de cod. Într-o aplicație reală în schimb vom avea, de obicei, mai multe obiecte. Detectarea obiectelor implică determinarea acestora și încadrarea marginilor.
# load an image (into shared CPU/GPU memory)
img, width, height = jetson.utils
.loadImageRGBA(“image/example.jpg”)
# load the object detection network
net = jetson.inference
.detectNet(“sd-mobilenet-v2”, sys.argv,
opt.threshold)
# detect objects in the image (with overlay)
detections = net.Detect(img, width, height,
“box,labels,conf”)
# print the detections
print(„detected {:d} objects in image”
.format(len(detections)))
for detection in detections:
print(detection)
# save the output image with the bounding
# box overlays
jetson.utils.saveImageRGBA(“result.jpg”, img,
width, height)
În codul de mai sus a fost utilizată rețeaua inference de detectare a obiectelor sd-mobilenet-v2. Rezultatele primite de la aceasta conțin id-ul clasei obiectului detectat și dimensiunile acestuia
detected 6 objects in image
-- ClassID: 88
-- Confidence: 0.72526
-- Left: 332.131
-- Top: 631.681
-- Right: 952.778
-- Bottom: 1281.8
-- Width: 620.647
-- Height: 650.122
-- Area: 403496
-- Center: (642.455, 956.742)
Ce rețele alegem pentru a detecta optim obiectele dintr-o imagine? Am ales câteva imagini de la lansările Today Software Magazine și acestea au fost rezultatele obținute. Vă lăsăm să descoperiți care este cea mai utilă pentru aplicațiile voastre.
Sperăm că v-am deschis apetitul pentru aplicațiile de detectare a obiectelor. Rezultatele pot să difere în funcție de rețeaua de inferență aleasă. Rezultatele nu au un procent de recunoaștere precisă 100%, dar modul de a le obține e foarte simplu și accesibil.
de Daniel Tatar
de Ovidiu Mățan
de Diana Oniga
de Mihai Talpoș