Valós idejű pózbecslés videóból Pythonban YOLOv7 PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Valós idejű pózbecslés videóból Pythonban a YOLOv7 segítségével

Bevezetés

Az objektumészlelés a számítógépes látás nagy területe, és a számítógépes látás egyik legfontosabb alkalmazása „vadon”. Ebből kinyerték a kulcspont-detektálást (amelyet gyakran pózbecslésre használnak).

A kulcspontok különböző pontok lehetnek – arcrészek, testvégtagok stb. A pozícióbecslés a kulcspont-észlelés egy speciális esete – ahol a pontok az emberi test részei.

A pózbecslés a számítógépes látás elképesztő, rendkívül szórakoztató és praktikus alkalmazása. Ezzel megszüntethetjük a pózbecsléshez használt hardvert (mozgásrögzítő ruhákat), amelyek költséges és nehézkesek. Ezenkívül az emberek mozgását leképezhetjük a robotok mozgásával az euklideszi térben, lehetővé téve a finom precíziós motormozgásokat vezérlők használata nélkül, amelyek általában nem tesznek lehetővé nagyobb pontosságot. A kulcspontbecslés segítségével mozgásainkat 3D-s modellekké alakíthatjuk AR-ben és VR-ben, és egyre gyakrabban használják ezt csupán egy webkamerával. Végül – a pózbecslés segítségünkre lehet a sportban és a biztonságban.

Ebben az útmutatóban valós idejű pózbecslést hajtunk végre egy Python nyelvű videóból, a legmodernebb YOLOv7 modell segítségével.

Konkrétan egy videóval fogunk dolgozni a 2018-as téli olimpiáról, amelyet a dél-koreai PyeongChangban rendeztek meg:

Aljona Savchenko és Bruno Massot elképesztő teljesítményt nyújtott, beleértve a testek átfedését a kamerával, a gyors folyadékmozgást és a levegőben való forgást. Lenyűgöző lehetőség lesz látni, hogy a modell hogyan kezeli a nehezen következtethető helyzeteket!

YOLO és pózbecslés

YOLO (Csak egyszer nézel) egy módszertan, valamint egy objektumészlelésre épített modellcsalád. A 2015-ös indulás óta a YOLOv1, YOLOv2 (YOLO9000) és YOLOv3 változatot ugyanaz a szerző(k) javasolták – és a mélytanulási közösség nyílt forráskódú fejlesztésekkel folytatódott a következő években.

Az Ultralytics YOLOv5 egy iparági szintű objektumészlelési adattár, amely a YOLO módszerre épül. PyTorch-ban van megvalósítva, szemben a korábbi YOLO modellek C++-jával, teljesen nyílt forráskódú, és gyönyörűen egyszerű és hatékony API-ja van, amely lehetővé teszi a projektek rugalmas következtetését, betanítását és testreszabását. Annyira alapvető, hogy a YOLO-módszer javítására tett legtöbb új próbálkozás erre épül.

Így YOLOR (Csak egy ábrázolást tanulsz) és a YOLOR-ra (ugyanaz a szerző) épülő YOLOv7 is létrejött!

A YOLOv7 nem csupán egy objektumészlelési architektúra – új modellfejeket biztosít, amelyek kulcspontokat (csontvázakat) tudnak kiadni, és példányszegmentálást hajtanak végre a csak határolódoboz-regresszió mellett, ami a korábbi YOLO modelleknél nem volt szabványos. Ez nem meglepő, hiszen sok objektumészlelési architektúrát korábban is újrahasznosítottak például szegmentálási és kulcspont-észlelési feladatokra, a közös általános architektúra miatt, feladattól függően eltérő kimenetekkel.

Bár ez nem meglepő – a példányszegmentálás és a kulcspont-felismerés támogatása valószínűleg a YOLO-alapú modellek új szabványa lesz, amelyek néhány éve gyakorlatilag az összes többi kétlépcsős detektor teljesítményét felülmúlják mind pontosságban, mind sebességben.

Ez minden eddiginél gyorsabbá teszi a példányszegmentálást és a kulcspont-észlelést, egyszerűbb architektúrával, mint a kétlépcsős detektorok.

Magát a modellt építészeti változtatások, valamint a képzés szempontjainak optimalizálása révén hozták létre, amelyet „zsákos ajándéknak” neveztek, ami növelte a pontosságot a következtetési költségek növelése nélkül.

A YOLOv7 telepítése

Kezdjük a tár klónozásával, hogy megkapjuk a forráskódot:

! git clone https://github.com/WongKinYiu/yolov7.git

Most pedig térjünk át a yolov7 könyvtárba, amely tartalmazza a projektet, és nézze meg a tartalmát:

%cd yolov7
!ls
/content/yolov7
cfg	   figure      output.mp4	 test.py       
data	   hubconf.py  paper		 tools
deploy	   inference   README.md	 train_aux.py
detect.py  LICENSE.md  requirements.txt  train.py
export.py  models      scripts		 utils

Jegyzet: Hívás !cd dirname áthelyezi az adott cellában lévő könyvtárba. Hívás %cd dirname áthelyezi Önt egy könyvtárba a következő cellák között is, és ott tart.

A YOLO-t tárgydetektornak szánták, és alapértelmezés szerint nem szállítják a pózbecslési súlyokkal. Le akarjuk tölteni a súlyokat, és be kell tölteni belőlük egy konkrét modellpéldányt. A súlyok ugyanabban a GitHub-tárolóban érhetők el, és könnyen letölthetők a CLI-n keresztül is:

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt

 % 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  23.4M      0  0:00:06  0:00:06 --:--:-- 32.3M

A letöltést követően importálhatjuk az általunk használt könyvtárakat és segédmetódusokat:

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

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

Nagy! Folytassuk a modell betöltésével és egy olyan szkript létrehozásával, amely lehetővé teszi, hogy a YOLOv7 és az OpenCV segítségével videókból következtessünk pózokra.

Valós idejű pózbecslés a YOLOv7 segítségével

Először hozzunk létre egy módszert a modell betöltésére a letöltött súlyokból. Ellenőrizzük, milyen eszköz áll rendelkezésünkre (CPU vagy GPU):

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def load_model():
    model = torch.load('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()

Attól függően, hogy van-e GPU-nk vagy nincs, bekapcsoljuk a félpontosságot (a float16 helyett float32 műveletekben), ami lényegesen gyorsabbá teszi a következtetést. Vegye figyelembe, hogy ezt erősen ajánlott GPU-n végrehajtani a valós idejű sebesség érdekében, mivel a CPU-k valószínűleg nem képesek erre, hacsak nem futnak kis videókon.

Írjunk egy kényelmi módszert a következtetés futtatásához. A képeket NumPy tömbként fogadjuk el (mivel később, a videó olvasása közben ezt adjuk át). Először is a letterbox() funkció – átméretezzük és a videót olyan alakra párnázzuk, amellyel a modell képes működni. Ennek nem kell lennie, és nem is lesz az eredményül kapott videó alakja (felbontása)!

Ezután alkalmazzuk a transzformációkat, átalakítjuk a képet fél pontosságúra (ha van GPU), kötegbe rakjuk és végigfuttatjuk a modellen:

def run_inference(image):
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    if torch.cuda.is_available():
      image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    with torch.no_grad():
      output, _ = model(image)
    return output, image

Visszaadjuk a modell előrejelzéseit, valamint a képet tenzorként. Ezek „durva” előrejelzések – sok aktiválást tartalmaznak, amelyek átfedik egymást, és szeretnénk „megtisztítani” őket a Non-Max Supression segítségével, és a megjósolt csontvázakat magán a képen ábrázolni:

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

  return nimg

Ha ezek a helyükön vannak, általános folyamatunk így fog kinézni:

img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)

Ennek valós idejű videóbeállításra való lefordításához az OpenCV-t használjuk a videó olvasásához, és ezt a folyamatot minden képkockánál futtatjuk. Minden képkockán a képkockát egy új fájlba is írjuk, videóként kódolva. Ez szükségszerűen lelassítja a folyamatot, miközben a következtetést futtatjuk, megjelenítjük és írjuk – így felgyorsíthatja a következtetést és a megjelenítést, ha elkerüli az új fájl létrehozását és a ciklusban való írását:

def pose_estimation_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            output, frame = run_inference(frame)
            frame = draw_keypoints(output, frame)
            frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
            out.write(frame)
            cv2.imshow('Pose estimation', frame)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

A VideoWriter Számos paramétert fogad el – a kimeneti fájlnevet, a FourCC-t (négy kodekkód, amelyek a videó kódolásához használt kodeket jelölik), a képkocka sebességet és a felbontást sorként. A videó kitalálása vagy átméretezése elkerülése érdekében az eredeti videó szélességét és magasságát használtuk, amelyet a VideoCapture példány, amely magáról a videóról tartalmaz adatokat, mint például a szélesség, magasság, a képkockák teljes száma stb.

Most bármelyik bemeneti videón meghívhatjuk a metódust:

pose_estimation_video('../ice_skating.mp4')

Ezzel megnyílik egy OpenCV ablak, amely valós időben jeleníti meg a következtetést. Ezenkívül videofájlt fog írni a yolov7 könyvtár (mióta mi cd'd bele):

Valós idejű pózbecslés videóból Pythonban YOLOv7 PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Jegyzet: Ha a GPU nehézségekkel küzd, vagy ha egy ilyen modell eredményeit egy olyan alkalmazásba szeretné beágyazni, amelynek a késleltetése a munkafolyamat kulcsfontosságú eleme, csökkentse a videót, és dolgozzon kisebb képkockákon. Ez egy full HD 1920×1080-as videó, és a legtöbb otthoni rendszeren gyorsan futnia kell, de ha nem működik olyan jól az Ön rendszerén, csökkentse a kép(eke)t.

Következtetés

Ebben az útmutatóban áttekintettük a YOLO módszert, a YOLOv7-et, valamint a YOLO és az objektumészlelés, a pózbecslés és a példányszegmentálás közötti kapcsolatot. Ezt követően megvizsgáltuk, hogyan telepítheti egyszerűen és hogyan dolgozhat vele a YOLOv7 programozási API használatával, és több kényelmi módszert is létrehoztunk, amelyek megkönnyítik a következtetést és az eredmények megjelenítését.

Végül megnyitottunk egy videót az OpenCV segítségével, lefuttattuk a következtetést a YOLOv7-tel, és létrehoztunk egy funkciót a valós idejű pózbecslés végrehajtására, így az eredményül kapott videót teljes felbontásban és 30 FPS-ben mentettük a helyi lemezre.

Továbblépve – Gyakorlati mélytanulás a számítógépes látáshoz

Érdeklődő természete arra készteti, hogy tovább menjen? Javasoljuk, hogy tekintse meg nálunk Tanfolyam: „Practical Deep Learning for Computer Vision with Python”.

Valós idejű pózbecslés videóból Pythonban YOLOv7 PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Újabb számítógépes látás tanfolyam?

Nem végezzük az MNIST számjegyek osztályozását vagy az MNIST divatot. Régen kiszolgálták a részüket. Túl sok tanulási erőforrás összpontosít az alapvető adatkészletekre és alapvető architektúrákra, mielőtt a fejlett feketedoboz-architektúrákra hagyná a teljesítmény terhét.

Mi arra szeretnénk koncentrálni demisztifikáció, gyakorlatiasság, megértés, intuíció és a valódi projektek. Tanulni akar hogyan tudsz változtatni? Elvezetjük Önt az agyunk képfeldolgozási módjától a mellrák kutatási szintű mélytanulási osztályozójának megírásáig a mély tanulási hálózatokig, amelyek „hallucinálnak”, gyakorlati munkán keresztül megtanítjuk az alapelveket és az elméletet, felkészítve a know-how és eszközök ahhoz, hogy szakértővé váljon a mélytanulás alkalmazásában a számítógépes látás megoldásában.

Mi van benne?

  • A látás első alapelvei és hogyan lehet a számítógépeket „látni” tanítani
  • A számítógépes látás különböző feladatai és alkalmazásai
  • A szakma eszközei, amelyek megkönnyítik a munkáját
  • Adatkészletek keresése, létrehozása és felhasználása számítógépes látáshoz
  • A konvolúciós neurális hálózatok elmélete és alkalmazása
  • Tartományeltolódás, együttes előfordulás és egyéb torzítások kezelése az adatkészletekben
  • Transzfer Tanulás és mások képzési idejének és számítási erőforrásainak felhasználása az Ön javára
  • Korszerű emlőrák osztályozó felépítése és betanítása
  • Hogyan alkalmazzunk egy egészséges adag szkepticizmust a mainstream ötletekhez, és hogyan értsük meg a széles körben elfogadott technikák következményeit
  • A ConvNet „koncepcióterének” megjelenítése t-SNE és PCA segítségével
  • Esettanulmányok arról, hogy a vállalatok hogyan használják a számítógépes látástechnikákat a jobb eredmények elérése érdekében
  • Megfelelő modellértékelés, látens tér vizualizáció és a modell figyelmének azonosítása
  • Domainkutatás végzése, saját adatkészletek feldolgozása és modelltesztek létrehozása
  • Élvonalbeli architektúrák, az ötletek fejlődése, mi teszi őket egyedivé és hogyan valósítsuk meg őket
  • KerasCV – WIP-könyvtár a legkorszerűbb csővezetékek és modellek létrehozásához
  • Hogyan elemezze és olvassa el a dolgozatokat, és saját maga hajtsa végre azokat
  • Modellek kiválasztása az alkalmazástól függően
  • Végpontok közötti gépi tanulási folyamat létrehozása
  • Tájkép és intuíció a tárgyfelismeréshez a gyorsabb R-CNN-ekkel, RetinaNetekkel, SSD-kkel és YOLO-val
  • Példány és szemantikai szegmentáció
  • Valós idejű objektumfelismerés a YOLOv5 segítségével
  • YOLOv5 objektumdetektorok képzése
  • Transzformátorokkal való munkavégzés KerasNLP-vel (ipari erősségű WIP-könyvtár)
  • Transformers integrálása ConvNetekkel a képek feliratainak létrehozásához
  • Deepdream
  • Deep Learning modell optimalizálása számítógépes látáshoz

Időbélyeg:

Még több Stackabus