Reaaliaikainen asennon arvio Python-videosta YOLOv7 PlatoBlockchain Data Intelligence -sovelluksella. Pystysuuntainen haku. Ai.

Reaaliaikainen asentoarvio Pythonin videosta YOLOv7:n avulla

esittely

Objektien havaitseminen on laaja kenttä tietokonenäössä ja yksi tärkeimmistä tietokonenäön sovelluksista "luonnossa". Siitä poimittiin avainpisteen tunnistus (jota käytetään usein asennon arvioinnissa).

Avainpisteet voivat olla erilaisia ​​pisteitä – kasvojen osia, kehon raajoja jne. Asennon estimointi on avainpisteiden havaitsemisen erikoistapaus – jossa pisteet ovat ihmiskehon osia.

Asennonarviointi on hämmästyttävä, äärimmäisen hauska ja käytännöllinen tietokonenäön käyttö. Sen avulla voimme päästä eroon asentojen arvioimiseen käytetyistä laitteistoista (liikkeenkaappauspuvut), jotka ovat kalliita ja raskaita. Lisäksi voimme kartoittaa ihmisten liikkeet robottien liikkeisiin euklidisessa avaruudessa, mikä mahdollistaa hienon tarkan moottoriliikkeen ilman ohjaimia, jotka eivät yleensä salli korkeampaa tarkkuutta. Avainpisteestimaatiolla voidaan kääntää liikkeemme 3D-malleiksi AR:ssä ja VR:ssä, ja sitä käytetään yhä useammin pelkällä web-kameralla. Lopuksi – asennonarviointi voi auttaa meitä urheilussa ja turvallisuudessa.

Tässä oppaassa suoritamme reaaliaikaisen asennon arvioinnin Pythonissa olevasta videosta käyttämällä uusinta YOLOv7-mallia.

Erityisesti työskentelemme videon kanssa Etelä-Korean PyeongChangissa pidetyistä vuoden 2018 talviolympialaisista:

Aljona Savchenko ja Bruno Massot tekivät hämmästyttävän suorituskyvyn, mukaan lukien päällekkäiset kehot kameraa vasten, nopea nesteliike ja pyöriminen ilmassa. On upea tilaisuus nähdä, kuinka malli käsittelee vaikeasti pääteltävissä olevia tilanteita!

YOLO ja asentoarvio

YOLO (katsot vain kerran) on metodologia sekä malliperhe, joka on rakennettu kohteen havaitsemiseen. Vuoden 2015 alusta lähtien YOLOv1:tä, YOLOv2:ta (YOLO9000) ja YOLOv3:a ovat ehdottaneet samat kirjoittajat – ja syväoppimisyhteisö on jatkanut avoimen lähdekoodin kehitystyötä jatkuvien vuosien aikana.

Ultralyticsin YOLOv5 on teollisuustason objektien tunnistustietovarasto, joka on rakennettu YOLO-menetelmän päälle. Se on toteutettu PyTorchissa, toisin kuin C++ aiemmissa YOLO-malleissa, se on täysin avoimen lähdekoodin, ja siinä on kauniin yksinkertainen ja tehokas API, jonka avulla voit päätellä, kouluttaa ja mukauttaa projektia joustavasti. Se on niin perusaine, että useimmat uudet yritykset parantaa YOLO-menetelmää rakentuvat sen päälle.

Näin YOLOR (opit vain yhden esityksen) ja YOLOv7, jotka rakensivat YOLORin (sama kirjoittaja) päälle, luotiin myös!

YOLOv7 ei ole vain objektintunnistusarkkitehtuuri – se tarjoaa uusia mallipäät, jotka voivat tulostaa avainpisteitä (luurankoja) ja suorittaa ilmentymien segmentointia pelkän rajoituslaatikon regression lisäksi, mikä ei ollut vakio aiemmissa YOLO-malleissa. Tämä ei ole yllättävää, sillä monet objektien tunnistusarkkitehtuurit on myös aiemmin käytetty uudelleen esimerkiksi segmentointi- ja avainpisteen havaitsemistehtäviä varten yhteisen yleisarkkitehtuurin vuoksi eri lähdöillä tehtävästä riippuen.

Vaikka se ei ole yllättävää – ilmentymien segmentoinnin ja avainpisteen tunnistuksen tukemisesta tulee todennäköisesti uusi standardi YOLO-pohjaisille malleille, jotka ovat alkaneet pari vuotta sitten ylittää käytännössä kaikki muut kaksivaiheiset ilmaisimet sekä tarkkuuden että nopeuden suhteen.

Tämä tekee ilmentymien segmentoinnista ja avainpisteiden havaitsemisesta nopeampaa kuin koskaan ennen, ja sen arkkitehtuuri on yksinkertaisempi kuin kaksivaiheiset ilmaisimet.

Itse malli luotiin arkkitehtonisilla muutoksilla sekä koulutuksen optimoinnilla, joita kutsuttiin "bag-of-freebies"iksi, mikä lisäsi tarkkuutta lisämättä päättelykustannuksia.

YOLOv7:n asentaminen

Aloitetaan kloonaamalla arkisto saadaksesi lähdekoodin:

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

Nyt siirrytään asiaan yolov7 hakemistoon, joka sisältää projektin, ja katso sen sisältöä:

%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

Huomautus: kutsumus !cd dirname siirtää sinut kyseisen solun hakemistoon. Kutsumus %cd dirname siirtää sinut hakemistoon myös tulevien solujen yli ja pitää sinut siellä.

Nyt YOLO on tarkoitettu esineentunnistimeksi, eikä siinä ole oletusarvoisesti asennonarviointipainoja. Haluamme ladata painot ja ladata niistä konkreettisen mallin. Painot ovat saatavilla samassa GitHub-arkistossa, ja ne voidaan helposti ladata myös CLI:n kautta:

! 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

Latauksen jälkeen voimme tuoda käyttämämme kirjastot ja apumenetelmät:

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

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Loistava! Jatketaan mallin lataamista ja skriptin luomista, jonka avulla voit päätellä asentoja videoista YOLOv7:n ja OpenCV:n avulla.

Reaaliaikainen asennon arvio YOLOv7:n avulla

Luodaan ensin menetelmä mallin lataamiseksi ladatuista painoista. Tarkistamme, mikä laite meillä on saatavilla (CPU tai 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()

Riippuen siitä, onko meillä GPU vai ei, otamme puolitarkkuuden käyttöön (käyttäen float16 sijasta float32 operaatioissa), mikä nopeuttaa päättämistä huomattavasti. Huomaa, että on erittäin suositeltavaa suorittaa tämä grafiikkasuorittimella reaaliaikaisten nopeuksien saavuttamiseksi, koska prosessoreilla ei todennäköisesti ole tehoa tehdä niin, elleivät ne suorita pieniä videoita.

Kirjoitetaan mukavuusmenetelmä päättelyn suorittamiseen. Hyväksymme kuvat NumPy-taulukoina (koska välitämme ne myöhemmin videota lukiessamme). Ensinnäkin käyttämällä letterbox() toiminto – muutamme videon kokoa ja pehmustamme muotoon, jonka kanssa malli voi toimia. Tämän ei tarvitse olla, eikä se tule olemaan tuloksena olevan videon muoto (resoluutio)!

Sitten käytämme muunnoksia, muunnamme kuvan puoleen tarkkuuteen (jos GPU on saatavilla), annamme sen ja ajamme sen mallin läpi:

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

Palautamme mallin ennusteet sekä kuvan tensorina. Nämä ovat "karkeita" ennusteita – ne sisältävät monia päällekkäisiä aktivaatioita, ja haluamme "siivota ne" käyttämällä Non-Max Supression -toimintoa ja piirtää ennustetut luurangot itse kuvan päälle:

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

Kun nämä ovat paikoillaan, yleinen toimintamme näyttää tältä:

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

Muuntaaksesi sen reaaliaikaiseksi videoasetukseksi – käytämme OpenCV:tä videon lukemiseen ja suoritamme tämän prosessin jokaiselle ruudulle. Jokaisessa kehyksessä kirjoitamme myös kehyksen uuteen tiedostoon, joka on koodattu videoksi. Tämä hidastaa välttämättä prosessia, kun suoritamme päättelyn, näytämme sen ja kirjoitamme – joten voit nopeuttaa päättelyä ja näyttöä välttämällä uuden tiedoston luomista ja kirjoittamista siihen silmukassa:

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

- VideoWriter hyväksyy useita parametreja – lähtötiedostonimen, FourCC:n (neljä koodekkikoodia, jotka ilmaisevat videon koodaamiseen käytettyä koodekkia), kehysnopeuden ja resoluution monikkona. Jotta et arvaisi tai muuta videon kokoa – olemme käyttäneet alkuperäisen videon leveyttä ja korkeutta, joka on saatu VideoCapture esimerkki, joka sisältää tietoja itse videosta, kuten leveyden, korkeuden, kehysten kokonaismäärän jne.

Nyt voimme kutsua menetelmää missä tahansa tulovideossa:

pose_estimation_video('../ice_skating.mp4')

Tämä avaa OpenCV-ikkunan, joka näyttää päättelyn reaaliajassa. Ja myös, se kirjoittaa videotiedoston yolov7 hakemisto (koska olemme cdsiihen):

Reaaliaikainen asennon arvio Python-videosta YOLOv7 PlatoBlockchain Data Intelligence -sovelluksella. Pystysuuntainen haku. Ai.

Huomautus: Jos grafiikkasuorittimesi on vaikeuksissa tai jos haluat upottaa tällaisen mallin tulokset sovellukseen, jonka viive on keskeinen osa työnkulkua – pienennä videota ja käytä pienempiä kehyksiä. Tämä on Full HD 1920 × 1080 -video, ja sen pitäisi pystyä toimimaan nopeasti useimmissa kotijärjestelmissä, mutta jos se ei toimi yhtä hyvin järjestelmässäsi, pienennä kuvaa (kuvia).

Yhteenveto

Tässä oppaassa olemme tarkastelleet YOLO-menetelmää, YOLOv7:ää sekä YOLOn ja kohteen havaitsemisen, asennon arvioinnin ja ilmentymien segmentoinnin välistä suhdetta. Olemme sitten tarkastelleet, kuinka voit helposti asentaa YOLOv7:n ja työskennellä sen kanssa ohjelmallisen API:n avulla, ja olemme luoneet useita mukavuusmenetelmiä, jotka helpottavat päätelmien tekemistä ja tulosten näyttämistä.

Lopuksi olemme avanneet videon OpenCV:llä, suorittaneet päättelyn YOLOv7:llä ja tehneet toiminnon, joka suorittaa asennon arvioinnin reaaliajassa, jolloin tuloksena oleva video tallennetaan täydellä resoluutiolla ja 30 FPS:llä paikalliselle levylle.

Jatketaan – Käytännön syvällistä oppimista tietokonenäköön

Utelias luonteesi saa sinut haluamaan pidemmälle? Suosittelemme tutustumaan meidän Kurssi: "Käytännön syvällinen oppiminen tietokonenäön käyttöön Pythonilla".

Reaaliaikainen asennon arvio Python-videosta YOLOv7 PlatoBlockchain Data Intelligence -sovelluksella. Pystysuuntainen haku. Ai.

Toinen tietokonenäkökurssi?

Emme luokittele MNIST-numeroita tai MNIST-muotia. He palvelivat osansa kauan sitten. Liian monet oppimisresurssit keskittyvät perustietosarjoihin ja perusarkkitehtuureihin, ennen kuin edistyneiden black-box-arkkitehtuurien annetaan kantaa suoritustaakka.

Haluamme keskittyä demystifikaatio, käytännöllisyys, ymmärtäminen, intuitio ja oikeita projekteja. Haluan oppia miten voitko vaikuttaa? Viemme sinut matkalle aivomme prosessoinnista kuvien tutkimiseen rintasyövän syväoppimisluokittajan kirjoittamiseen syväoppimisverkostoihin, jotka "halusinoivat", opettaen sinulle periaatteita ja teoriaa käytännön työssä ja varustamalla tietotaitoa ja työkaluja tullaksesi asiantuntijaksi syväoppimisen soveltamisessa tietokonenäön ratkaisemiseen.

Mitä on sisällä?

  • Näön ensimmäiset periaatteet ja kuinka tietokoneet voidaan opettaa "näkemään"
  • Tietokonenäön eri tehtävät ja sovellukset
  • Ammatin työkalut, jotka helpottavat työtäsi
  • Tietokokonaisuuksien etsiminen, luominen ja hyödyntäminen tietokonenäköä varten
  • Konvoluutiohermoverkkojen teoria ja sovellus
  • Verkkotunnuksen siirtymisen, samanaikaisen esiintymisen ja muiden vääristymien käsittely tietojoukoissa
  • Siirrä Oppiminen ja muiden koulutusajan ja laskennallisten resurssien hyödyntäminen hyödyksesi
  • Huippuluokan rintasyövän luokittelijan rakentaminen ja kouluttaminen
  • Kuinka soveltaa tervettä annos skeptisyyttä valtavirran ideoihin ja ymmärtää laajalti käytettyjen tekniikoiden vaikutukset
  • ConvNetin "konseptitilan" visualisointi t-SNE:n ja PCA:n avulla
  • Tapaustutkimuksia siitä, kuinka yritykset käyttävät tietokonenäkötekniikoita parempien tulosten saavuttamiseksi
  • Oikea mallin arviointi, piilevän tilan visualisointi ja mallin huomion tunnistaminen
  • Toimialuetutkimuksen suorittaminen, omien tietojoukkojen käsittely ja mallitestien laatiminen
  • Huippuluokan arkkitehtuurit, ideoiden eteneminen, mikä tekee niistä ainutlaatuisia ja miten ne toteutetaan
  • KerasCV – WIP-kirjasto uusimpien putkien ja mallien luomiseen
  • Kuinka jäsentää ja lukea papereita ja toteuttaa ne itse
  • Mallien valinta sovelluksesi mukaan
  • Luodaan päästä päähän koneoppimisputki
  • Maisema ja intuitio kohteen havaitsemisessa nopeampien R-CNN-, RetinaNet-, SSD- ja YOLO-verkkojen avulla
  • Instanssi ja semanttinen segmentointi
  • Reaaliaikainen objektintunnistus YOLOv5:n avulla
  • YOLOv5-objektitunnistimien koulutus
  • Työskentely Transformersin kanssa KerasNLP:n (teollisuuden vahvuus WIP-kirjasto) avulla
  • Transformersin integrointi ConvNet-verkkojen kanssa kuvien tekstitysten luomiseksi
  • Deepdream
  • Deep Learning -mallin optimointi tietokonenäköä varten

Aikaleima:

Lisää aiheesta Stackabus