Wprowadzenie
Wykrywanie obiektów to duże pole widzenia komputerowego i jedno z ważniejszych zastosowań widzenia komputerowego „na wolności”.
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.
Na szczęście dla mas — firma Ultralytics opracowała prosty, bardzo wydajny i piękny interfejs API do wykrywania obiektów wokół swojego YOLOv5, który został rozszerzony przez inne zespoły badawczo-rozwojowe do nowszych wersji, takich jak YOLOv7.
W tym krótkim przewodniku będziemy wykonywać szacowanie pozycji (wykrywanie punktów kluczowych) w Pythonie przy użyciu najnowocześniejszego YOLOv7.
Keypointami mogą być różne punkty – części twarzy, kończyny itp. Estymacja pozycji jest szczególnym przypadkiem wykrywania keypointów – w którym punkty są częściami ludzkiego ciała i mogą być wykorzystane do zastąpienia drogiego sprzętu do śledzenia pozycji, umożliwiają bezprzewodową kontrolę robotyki i napędzają nową erę ludzkiej ekspresji poprzez AR i VR.
YOLO i ocena pozycji
YOLO (patrzysz tylko raz) to metodologia, a także rodzina modeli zbudowanych do wykrywania obiektów. Od momentu powstania w 2015 r. YOLOv1, YOLOv2 (YOLO9000) i YOLOv3 zostały zaproponowane przez tego samego autora (autorów) – a społeczność głębokiego uczenia kontynuowała postępy z otwartymi źródłami w kolejnych latach.
Ultralytics' YOLOv5 to pierwsza implementacja YOLO na dużą skalę w PyTorch, dzięki której jest bardziej dostępna niż kiedykolwiek wcześniej, ale głównym powodem, dla którego YOLOv5 zyskało taki przyczółek, jest również pięknie prosty i potężny interfejs API zbudowany wokół niego. Projekt odrzuca niepotrzebne szczegóły, umożliwiając jednocześnie dostosowywanie praktycznie wszystkich użytecznych formatów eksportu i wykorzystuje niesamowite praktyki, które sprawiają, że cały projekt jest zarówno wydajny, jak i optymalny, jak to tylko możliwe.
YOLOv5 jest nadal podstawowym projektem do budowania modeli Object Detection, a wiele repozytoriów, których celem jest rozwój metody YOLO, zaczyna się od YOLOv5 jako punktu odniesienia i oferuje podobny interfejs API (lub po prostu rozwidla projekt i kompiluje na nim). Tak jest w przypadku YOLOR (Uczysz się tylko jednej reprezentacji) i YOLOv7, który opiera się na YOLOR (ten sam autor), który jest najnowszym postępem w metodologii YOLO.
YOLOv7 to nie tylko architektura wykrywania obiektów – zapewnia nowe nagłówki modeli, które mogą wyprowadzać punkty kluczowe (szkielety) i przeprowadzać segmentację instancji oprócz tylko regresji pola ograniczającego, co nie było standardem w poprzednich modelach YOLO. Nie jest to zaskakujące, ponieważ wiele architektur wykrywania obiektów zostało wcześniej przeprojektowanych do zadań segmentacji instancji i wykrywania punktów kluczowych, ze względu na wspólną ogólną architekturę, z różnymi wynikami w zależności od zadania. Chociaż nie jest to zaskakujące – obsługa segmentacji instancji i wykrywania punktów kluczowych prawdopodobnie stanie się nowym standardem dla modeli opartych na YOLO, które kilka lat temu zaczęły przewyższać praktycznie wszystkie inne detektory dwustopniowe.
Dzięki temu segmentacja instancji i wykrywanie punktów kluczowych są szybsze niż kiedykolwiek wcześniej, dzięki prostszej architekturze niż detektory dwustopniowe.
Sam model został stworzony poprzez zmiany architektoniczne, a także optymalizację aspektów szkolenia, nazwanych „torbą gratisów”, co zwiększyło dokładność bez zwiększania kosztów wnioskowania.
Instalowanie YOLOv7
Przejdźmy dalej i zainstalujmy projekt z GitHub:
! git clone https://github.com/WongKinYiu/yolov7.git
To tworzy yolov7
pod bieżącym katalogiem roboczym, w którym będziesz mógł znaleźć podstawowe pliki projektu:
%cd yolov7
!ls
/Users/macbookpro/jup/yolov7
LICENSE.md detect.py models tools
README.md export.py paper train.py
cfg figure requirements.txt train_aux.py
data hubconf.py scripts utils
deploy inference test.py
Uwaga: Notatniki Google Colab są resetowane do głównego katalogu roboczego w następnej komórce, nawet po wywołaniu %cd dirname
, więc będziesz musiał wywoływać go w każdej komórce, w której chcesz wykonać operację. Lokalne notesy Jupyter pamiętają tę zmianę, więc nie ma potrzeby wywoływania polecenia.
Za każdym razem, gdy uruchomisz kod z podanym zestawem wag – zostaną one pobrane i zapisane w tym katalogu. Aby wykonać oszacowanie pozy, będziemy chcieli pobrać wagi dla wstępnie wytrenowanego modelu YOLOv7 dla tego zadania, które można znaleźć pod /releases/download/
zakładka na GitHubie:
! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt
%cd ..
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 153M 100 153M 0 0 3742k 0 0:00:42 0:00:42 --:--:-- 4573k
/Users/macbookpro/jup
Świetnie, pobraliśmy yolov7-w6-pose.pt
plik wag, którego można użyć do załadowania i zrekonstruowania wytrenowanego modelu do szacowania pozy.
Ładowanie modelu szacowania pozycji YOLOv7
Zaimportujmy biblioteki potrzebne do szacowania pozy:
import torch
from torchvision import transforms
from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts
import matplotlib.pyplot as plt
import cv2
import numpy as np
torch
i torchvision
są wystarczająco proste – YOLOv7 jest zaimplementowany w PyTorch. The utils.datasets
, utils.general
i utils.plots
Moduły pochodzą z projektu YOLOv7 i dostarczają nam metody, które pomagają we wstępnym przetwarzaniu i przygotowaniu danych wejściowych dla modelu do uruchomienia wnioskowania. Wśród nich są letterbox()
dopełnienie obrazu, non_max_supression_keypoint()
uruchomienie algorytmu Non-Max Supression na początkowych danych wyjściowych modelu i wygenerowanie czystego wyniku dla naszej interpretacji, a także output_to_keypoint()
i plot_skeleton_kpts()
metody faktycznego dodawania punktów kluczowych do danego obrazu, po ich przewidywaniu.
Możemy załadować model z pliku wagi za pomocą torch.load()
. Utwórzmy funkcję sprawdzającą, czy GPU jest dostępny, załaduj model, przełącz go w tryb wnioskowania i przenieś go do GPU, jeśli jest dostępny:
def load_model():
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = torch.load('yolov7/yolov7-w6-pose.pt', map_location=device)['model']
model.float().eval()
if torch.cuda.is_available():
model.half().to(device)
return model
model = load_model()
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!
Po załadowaniu modelu utwórzmy run_inference()
metoda, która akceptuje ciąg znaków wskazujący na plik w naszym systemie. Metoda odczyta obraz za pomocą OpenCV (cv2
), uzupełnij go letterbox()
, zastosuj do niego transformacje i przekształć go w partię (model jest szkolony i oczekuje partii, jak zwykle):
def run_inference(url):
image = cv2.imread(url)
image = letterbox(image, 960, stride=64, auto=True)[0]
image = transforms.ToTensor()(image)
image = image.unsqueeze(0)
output, _ = model(image)
return output, image
Tutaj zwróciliśmy przekształcony obraz (ponieważ będziemy chcieli wyodrębnić oryginał i wykreślić na nim) oraz dane wyjściowe modelu. Te dane wyjściowe zawierają 45900 predykcji punktów kluczowych, z których większość się pokrywa. Będziemy chcieli zastosować tłumienie niemaksymalne do tych nieprzetworzonych przewidywań, tak jak w przypadku przewidywań wykrywania obiektów (gdzie przewidywanych jest wiele ramek ograniczających, a następnie są one „zawijane” przy pewnym stopniu pewności i progu IoU). Po supresji możemy wykreślić każdy punkt kluczowy na oryginalnym obrazie i wyświetlić go:
def visualize_output(output, image):
output = non_max_suppression_kpt(output,
0.25,
0.65,
nc=model.yaml['nc'],
nkpt=model.yaml['nkpt'],
kpt_label=True)
with torch.no_grad():
output = output_to_keypoint(output)
nimg = image[0].permute(1, 2, 0) * 255
nimg = nimg.cpu().numpy().astype(np.uint8)
nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
for idx in range(output.shape[0]):
plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)
plt.figure(figsize=(12, 12))
plt.axis('off')
plt.imshow(nimg)
plt.show()
Teraz dla jakiegoś obrazu wejściowego, takiego jak karate.jpg
w głównym katalogu roboczym możemy uruchomić wnioskowanie, wykonać Non-Max Supression i wykreślić wyniki za pomocą:
output, image = run_inference('./karate.jpg')
visualize_output(output, image)
To skutkuje:
To dość trudny obraz do wywnioskowania! Większość prawego ramienia praktykującego po prawej stronie jest ukryta i widzimy, że model wywnioskował, że jest ukryty i znajduje się po prawej stronie ciała, nie zauważając, że łokieć jest zgięty, a część ramienia znajduje się z przodu . Praktykujący po lewej, który jest znacznie wyraźniej widoczny, jest wywnioskowany poprawnie, nawet z ukrytą nogą.
Właściwie – osoba siedząca z tyłu, prawie całkowicie niewidoczny dla kamery pozornie prawidłowo oszacowano ich pozę, tylko na podstawie pozycji bioder podczas siedzenia. Świetna robota w imieniu sieci!
Wnioski
W tym przewodniku – przyjrzeliśmy się krótko YOLOv7, najnowszemu ulepszeniu w rodzinie YOLO, która opiera się na YOLOR i dodatkowo zapewnia segmentację instancji i możliwości wykrywania punktów kluczowych wykraczające poza standardowe możliwości wykrywania obiektów większości modeli opartych na YOLO .
Następnie przyjrzeliśmy się, w jaki sposób możemy pobrać opublikowane pliki wag, załadować je w celu skonstruowania modelu i przeprowadzić wnioskowanie oszacowania pozy dla ludzi, uzyskując imponujące wyniki.
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”.
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
- Optymalizacja modelu Deep Learning dla wizji komputerowej
- blockchain
- C + +
- kod
- pomysłowość
- Wizja komputerowa
- głęboka nauka
- Java
- Wykrywanie punktu kluczowego
- uczenie maszynowe
- niezamienny żeton
- Otwarte morze
- PHP
- plato
- Platon Ai
- Analiza danych Platona
- Gra Platona
- Platoblockchain
- PlatoDane
- platogaming
- Wielokąt
- Oszacowanie pozycji
- Python
- płomień
- React
- inteligentna umowa
- Solana
- Nadużycie stosu
- Pochodnia
- Vyper
- Web3
- Yolo
- zefirnet