Wykrywanie obiektów RetinaNet za pomocą PyTorch i torchvision PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wykrywanie obiektów RetinaNet za pomocą PyTorch i torchvision

Wprowadzenie

Detekcja obiektów to duże pole widzenia komputerowego i jedno z ważniejszych zastosowań widzenia komputerowego „na wolności”. Z jednej strony może być używany do budowania autonomicznych systemów, które nawigują agentów przez środowiska – czy to roboty wykonujące zadania, czy samojezdne samochody, ale wymaga to skrzyżowania z innymi polami. Jednak wykrywanie anomalii (takich jak wadliwe produkty na linii), lokalizowanie obiektów na obrazach, wykrywanie twarzy i różne inne zastosowania wykrywania obiektów można wykonać bez przecinania innych pól.

Wykrywanie obiektów nie jest tak ustandaryzowane jak klasyfikacja obrazów, głównie dlatego, że większość nowych rozwiązań jest zazwyczaj wykonywana przez indywidualnych badaczy, opiekunów i programistów, a nie przez duże biblioteki i frameworki. Trudno jest spakować niezbędne skrypty narzędziowe w frameworku takim jak TensorFlow lub PyTorch i zachować wytyczne API, które do tej pory kierowały rozwojem.

To sprawia, że ​​wykrywanie obiektów jest nieco bardziej złożone, zazwyczaj bardziej szczegółowe (ale nie zawsze) i mniej przystępne niż klasyfikacja obrazów. Jedną z głównych korzyści płynących z bycia w ekosystemie jest to, że pozwala nie szukać przydatnych informacji na temat dobrych praktyk, narzędzi i podejść do wykorzystania. Z wykrywaniem obiektów – większość z nich musi przeprowadzić o wiele więcej badań nad krajobrazem pola, aby uzyskać dobrą przyczepność.

Wykrywanie obiektów za pomocą RetinaNet firmy PyTorch/TorchVision

torchvision jest projektem Computer Vision firmy PyTorch i ma na celu ułatwienie tworzenia modeli CV opartych na PyTorch, poprzez dostarczanie skryptów transformacji i augmentacji, zoo modeli ze wstępnie wytrenowanymi wagami, zestawami danych i narzędziami, które mogą być przydatne dla praktyka.

Będąc jeszcze w fazie beta i bardzo eksperymentalnie – torchvision oferuje stosunkowo prosty interfejs API Object Detection z kilkoma modelami do wyboru:

  • Szybszy R-CNN
  • RetinaNet
  • FCOS (w pełni splotowy RetinaNet)
  • SSD (szkielet VGG16… yick)
  • SSDLite (sieć szkieletowa MobileNetV3)

Chociaż interfejs API nie jest tak dopracowany ani prosty, jak niektóre inne interfejsy API innych firm, jest to bardzo przyzwoity punkt wyjścia dla tych, którzy nadal wolą bezpieczeństwo przebywania w znanym im ekosystemie. Zanim przejdziesz dalej, upewnij się, że zainstalowałeś PyTorch i Torchvision:

$ pip install torch torchvision

Załadujmy niektóre funkcje narzędziowe, takie jak read_image(), draw_bounding_boxes() i to_pil_image() aby ułatwić czytanie, rysowanie i wyprowadzanie obrazów, a następnie importowanie RetinaNet i jego wstępnie wytrenowanych wag (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 używa szkieletu ResNet50 i sieci piramidy funkcji (FPN). Chociaż nazwa klasy jest gadatliwa, wskazuje na architekturę. Pobierzmy obraz za pomocą requests bibliotekę i zapisz ją jako plik na naszym dysku lokalnym:

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")

Mając obraz na miejscu – możemy skonkretyzować nasz model i wagi:

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

model.eval()

preprocess = weights.transforms()

Połączenia score_thresh argument określa próg, przy którym obiekt jest wykrywany jako obiekt klasy. Intuicyjnie jest to próg ufności i nie zaklasyfikujemy obiektu do klasy, jeśli model ma mniej niż 35% pewności, że należy do klasy.

Przetwórzmy wstępnie obraz za pomocą przekształceń z naszych wag, utwórzmy partię i uruchommy wnioskowanie:

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

To wszystko, nasz prediction słownik zawiera wywnioskowane klasy obiektów i lokalizacje! Teraz wyniki nie są dla nas zbyt przydatne w tym formularzu – będziemy chcieli wyodrębnić etykiety względem metadanych z wag i narysować ramki ograniczające, co można zrobić za pomocą 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()

To skutkuje:

RetinaNet faktycznie sklasyfikował osobę zaglądającą za samochód! To dość trudna klasyfikacja.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Możesz zmienić RetinaNet na FCOS (w pełni splotowy RetinaNet), zastępując retinanet_resnet50_fpn_v2 w fcos_resnet50_fpn, i użyj FCOS_ResNet50_FPN_Weights wagi:

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()

Idąc dalej – praktyczne uczenie głębokie dla wizji komputerowej

Twoja dociekliwość sprawia, że ​​chcesz iść dalej? Zalecamy sprawdzenie naszego Kurs: „Praktyczne uczenie głębokie dla widzenia komputerowego z Pythonem”.

Wykrywanie obiektów RetinaNet za pomocą PyTorch i torchvision PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Kolejny kurs na temat wizji komputerowej?

Nie będziemy robić klasyfikacji cyfr MNIST ani mody MNIST. Swoją rolę pełnili dawno temu. Zbyt wiele zasobów edukacyjnych koncentruje się na podstawowych zestawach danych i podstawowych architekturach, zanim zaawansowane architektury czarnoskrzynkowe poniosą ciężar wydajności.

Chcemy się skupić demistyfikacja, praktyczność, zrozumienie, intuicja i realne projekty. Chcieć się nauczyć w jaki sposób możesz zrobić różnicę? Zabierzemy Cię na przejażdżkę od sposobu, w jaki nasze mózgi przetwarzają obrazy, przez pisanie klasyfikatora głębokiego uczenia się na poziomie badań naukowych w zakresie raka piersi, do sieci głębokiego uczenia się, które „halucynują”, ucząc Cię zasad i teorii poprzez praktyczną pracę, wyposażając Cię w know-how i narzędzia, aby stać się ekspertem w stosowaniu uczenia głębokiego do rozwiązywania wizji komputerowych.

Co jest w środku?

  • Pierwsze zasady widzenia i jak nauczyć komputery „widzieć”
  • Różne zadania i zastosowania wizji komputerowej
  • Narzędzia handlu, które ułatwią Ci pracę
  • Znajdowanie, tworzenie i wykorzystywanie zbiorów danych do wizji komputerowej
  • Teoria i zastosowanie splotowych sieci neuronowych
  • Obsługa zmiany domeny, współwystępowania i innych błędów w zbiorach danych
  • Transfer uczenia się i wykorzystanie czasu szkolenia innych i zasobów obliczeniowych dla Twojej korzyści
  • Budowanie i szkolenie najnowocześniejszego klasyfikatora raka piersi
  • Jak zastosować zdrową dawkę sceptycyzmu do głównych idei i zrozumieć konsekwencje powszechnie stosowanych technik?
  • Wizualizacja „przestrzeni koncepcyjnej” ConvNet za pomocą t-SNE i PCA
  • Studia przypadków, w jaki sposób firmy wykorzystują techniki widzenia komputerowego do osiągania lepszych wyników
  • Właściwa ocena modelu, wizualizacja przestrzeni utajonej i identyfikacja uwagi modelu
  • Wykonywanie badań domenowych, przetwarzanie własnych zbiorów danych i tworzenie testów modelowych
  • Najnowocześniejsze architektury, progresja pomysłów, co czyni je wyjątkowymi i jak je wdrażać
  • KerasCV – biblioteka WIP do tworzenia najnowocześniejszych rurociągów i modeli
  • Jak analizować i czytać artykuły i samodzielnie je wdrażać
  • Wybór modeli w zależności od aplikacji
  • Tworzenie kompleksowego procesu uczenia maszynowego
  • Krajobraz i intuicja w wykrywaniu obiektów za pomocą szybszych sieci R-CNN, sieci RetinaNet, dysków SSD i YOLO
  • Segmentacja instancyjna i semantyczna
  • Rozpoznawanie obiektów w czasie rzeczywistym za pomocą YOLOv5
  • Szkolenie wykrywaczy obiektów YOLOv5
  • Praca z transformatorami przy użyciu KerasNLP (biblioteka przemysłowa WIP)
  • Integracja Transformers z ConvNets w celu generowania podpisów obrazów
  • DeepDream

Wnioski

Wykrywanie obiektów to ważna dziedzina widzenia komputerowego, która niestety jest mniej dostępna niż powinna.

W tym krótkim przewodniku przyjrzeliśmy się, jak torchvision, pakiet Computer Vision firmy PyTorch, ułatwia wykrywanie obiektów na obrazach za pomocą RetinaNet.

Znak czasu:

Więcej z Nadużycie stosu