Pose Estimation/Keypoint Detection za pomocą YOLOv7 w Pythonie PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Szacowanie pozycji / wykrywanie punktów kluczowych za pomocą YOLOv7 w Pythonie

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”.

Pose Estimation/Keypoint Detection za pomocą YOLOv7 w Pythonie 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
  • Optymalizacja modelu Deep Learning dla wizji komputerowej

Znak czasu:

Więcej z Nadużycie stosu