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 cd
siihen):
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".
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