OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

OpenCV serva tuvastamine Pythonis koos cv2.Canny()

Sissejuhatus

Serva tuvastamine on midagi, mida me teeme loomulikult, kuid see pole nii lihtne, kui vajate arvutite jaoks reegleid määratleda. Kuigi on välja töötatud erinevaid meetodeid, töötas valitsemismeetodi välja John F. Canny 1986. aastal ja seda nimetatakse sobivalt Canny meetodiks.

See on kiire, üsna vastupidav ja töötab peaaegu parimal viisil, mis selle tehnikatüübi jaoks võiks töötada. Juhendi lõpuks saate teada, kuidas teostada videote servade reaalajas tuvastamist ja luua midagi järgmiselt.

Canny Edge tuvastamine

Mis on Canny meetod? See koosneb neljast erinevast toimingust:

  • Gaussi silumine
  • Gradientide arvutamine
  • Mittemaksimaalne supressioon
  • Hüstereesi lävi

Gaussi silumine kasutatakse esimese sammuna sisendpildi "triigimiseks" ja müra pehmendamiseks, muutes lõppväljundi palju puhtamaks.

Pildi gradiendid on kasutatud varasemates servatuvastusrakendustes. Eelkõige tuginevad Sobeli ja Scharri filtrid pildi gradientidele. Sobeli filter taandub kahele tuumale (Gx ja Gy), kus Gx tuvastab horisontaalsed muutused, samas Gy tuvastab vertikaalsed muutused:

G

x

=

[

-
1

0

+
1

-
2

0

+
2

-
1

0

+
1

]

G

y

=

[

-
1

-
2

-
1

0

0

0

+
1

+
2

+
1

]

Kui libistate need üle pildi, siis igaüks neist "korjab" (rõhutab) jooni oma vastavas suunas. Scharri tuumad töötavad samamoodi, erinevate väärtustega:

G

x

=

[

+
3

0

-
3

+
10

0

-
10

+
3

0

-
3

]

G

y

=

[

+
3

+
10

+
3

0

0

0

-
3

-
10

-
3

]

Need filtrid, kui need on pildile ühendatud, loovad funktsioonide kaardid:

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Pildi krediit: Davidwkennedy

Nende funktsioonikaartide jaoks saate arvutada gradiendi suurusjärk ja gradiendi orientatsioon – st kui intensiivne on muutus (kui tõenäoline on, et miski on serv) ja mis suunas muutus näitab. Kuna Gy tähistab vertikaalset muutust (Y-gradient) ja Gx tähistab horisontaalset muutust (X-gradient), saate suuruse arvutada lihtsalt Pythagorase teoreemi rakendamisega, et saada hüpoteenuusi kolmnurgast, mille moodustab “vasak” ja "õiged" juhised:

$$
{G} ={ruut {{{G} _{x}}^{2}+{{G} _{y}}^{2}}}
$$

Suurust ja suunda kasutades saate luua pildi, mille servad on esile tõstetud:

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Pildi krediit: Davidwkennedy

Samas – näete, kui palju müra ka telliste tektuurist kinni jäi! Pildi gradiendid on müra suhtes väga tundlikud. Seetõttu kasutati komponendina Sobeli ja Scharri filtreid, kuid mitte ainus lähenemisviis Canny meetodis. Siin aitab ka Gaussi silumine.

Mittemaksimaalne supressioon

Märkimisväärne probleem Sobeli filtriga on see, et servad pole päris selged. See pole nii, et keegi võttis pliiatsi ja tõmbas joone, et luua kujutisest lineaar. Servad ei ole piltidel tavaliselt nii selged, kuna valgus hajub järk-järgult. Siiski leiame servadest ühise joone ja surume ülejäänud pikslid selle ümber, saades selle asemel puhta õhukese eraldusjoone. Seda tuntakse kui mittemaksimaalset allasurumist! Mittemaksimaalsed pikslid (pikslid, mis on väiksemad kui need, millega me neid väikeses kohalikus väljas võrdleme, näiteks 3 × 3 tuumas) surutakse alla. Mõiste on rakendatav rohkematele ülesannetele kui see, kuid sidugem see praegu selle kontekstiga.

Hüstereesi lävi

Paljusid mitteservasid saab ja tõenäoliselt hinnatakse servadena, tulenevalt valgustingimustest, pildil olevatest materjalidest jne. Nende valearvestuste esinemise erinevatel põhjustel on raske anda automaatset hinnangut selle kohta, mis serv kindlasti on ja mis ei ole. mitte. Saate lävendada gradiente ja kaasata ainult tugevamad, eeldades, et "päris" servad on intensiivsemad kui "võltsitud" servad.

Lävimine toimib samamoodi nagu tavaliselt – kui gradient on allpool alumist läve, eemaldage see (nullitage see välja) ja kui see on üle etteantud ülemise läve, siis hoidke seda. Kõik, mis jääb alumise ja ülemise piiri vahele, on "hallis tsoonis". Kui mõni lävedevaheline serv on ühendatud a-ga lõplik serv (need, mis ületavad läve) – neid loetakse ka servadeks. Kui need pole ühendatud, on need tõenäoliselt valesti arvutatud serva arfikatid.

See on hüstereesi lävi! Tegelikult aitab see lõplikku väljundit puhastada ja valeservi eemaldada, olenevalt sellest, mida liigitate valeservaks. Heade läviväärtuste leidmiseks katsetate tavaliselt erinevate lävede alumiste ja ülemiste piiridega või kasutage automatiseeritud meetodit, nagu Otsu meetod või kolmnurga meetod.

Laadime pildi sisse ja muutme selle halltoonis (Canny, nagu ka Sobel/Scharr nõuab piltide halltoonis toonimist):

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (3,3), 0)

plt.imshow(img_blur, cmap='gray')

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Sõrme lähipilt on hea katsepolügooni serva tuvastamisel – sõrmejälge pole pildilt lihtne eristada, kuid me saame selle ligikaudselt hinnata.

Serva tuvastamine piltidel koos cv2.Canny()

Canny algoritmi saab rakendada OpenCV abil Canny() meetod:

cv2.Canny(input_img, lower_bound, upper_bound)

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

Õige tasakaalu leidmine alumise ja ülemise piiri vahel võib olla keeruline. Kui mõlemad on madalad, on teil vähe servi. Kui alumine piir on madal ja ülemine kõrge, on müra. Kui mõlemad on kõrgel ja üksteise lähedal, on teil vähe servi. Õige koha piiride vahel on täpselt piisavalt vahet ja need on õiges skaalas. Katse!

Sisendpilt hägustatakse Canny meetodil, kuid sageli on selle hägustamine kasulik enne see läheb ka sisse. Meetod rakendab sisendile enne ülejäänud toimingute läbimist 5 × 5 Gaussi hägusust, kuid isegi selle hägususe korral võib müra ikkagi läbi imbuda, seega oleme pildi enne selle algoritmi sisestamist hägustanud:


edge = cv2.Canny(img_blur, 20, 30)

fig, ax = plt.subplots(1, 2, figsize=(18, 6), dpi=150)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(edge, cmap='gray')

Selle tulemuseks on:

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Väärtused 20 ja 30 siin ei ole meelevaldsed – olen katsetanud meetodit erinevate parameetritega ja valisin komplekti, mis näis andvat korraliku tulemuse. Kas me saame proovida seda automatiseerida?

Automaatne künnis cv2.Canny() jaoks?

Kas leiate optimaalse läviväärtuste komplekti? Jah, aga see ei tööta alati. Saate mõne hea väärtuse jaoks ise arvutada ja seejärel vahemikku a abil kohandada sigma selle läve ümber:

lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold

Kui sigma, on öelda, 0.33 - piirid on 0.66*threshold ja 1.33*threshold, mis võimaldab umbes 1/3 ulatust selle ümber. Siiski, leides threshold see on keerulisem. OpenCV pakub meile Otsu meetodit (töötab suurepäraselt bimodaalsete piltide puhul) ja kolmnurga meetodit. Proovime neid mõlemaid ja võtame kolmanda võimalusena piksliväärtuste lihtsa mediaani:

otsu_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
triangle_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_TRIANGLE)
manual_thresh = np.median(img_blur)

def get_range(threshold, sigma=0.33):
    return (1-sigma) * threshold, (1+sigma) * threshold

otsu_thresh = get_range(otsu_thresh)
triangle_thresh = get_range(triangle_thresh)
manual_thresh = get_range(manual_thresh)

print(f"Otsu's Threshold: {otsu_thresh} nTriangle Threshold: {triangle_thresh} nManual Threshold: {manual_thresh}")

Selle tulemuseks on:

Otsu's Threshold: (70.35, 139.65) 
Triangle Threshold: (17.419999999999998, 34.58) 
Manual Threshold: (105.18999999999998, 208.81)

Need on üsna erinevad! Varem nähtud väärtuste põhjal võime eeldada, et kolmnurga meetod töötab siin kõige paremini. Manuaalne lävi ei ole eriti informeeritud, kuna see võtab lihtsalt pikslite keskmise väärtuse ja tulemuseks on kõrge baaslävi, mis korrutatakse selle pildi jaoks veelgi laias vahemikus. Otsu meetod kannatab selle all vähem, kuid kannatab sellegipoolest.

Kui me juhime Canny() meetod nende lävevahemikega:

edge_otsu = cv2.Canny(img_blur, *otsu_thresh)
edge_triangle = cv2.Canny(img_blur, *triangle_thresh)
edge_manual = cv2.Canny(img_blur, *manual_thresh)

fig, ax = plt.subplots(1, 3, figsize=(18, 6), dpi=150)
ax[0].imshow(edge_otsu, cmap='gray')
ax[1].imshow(edge_triangle, cmap='gray')
ax[2].imshow(edge_manual, cmap='gray')

Märge: Funktsioon eeldab mitut argumenti ja meie läved on üks kord. Me saame hävitamine korteež mitmeks argumendiks, lisades selle ette *. See töötab ka loendite ja komplektide puhul ning on suurepärane viis mitme argumendi esitamiseks pärast nende hankimist programmiliste vahenditega.

Selle tulemuseks on:

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Kolmnurga meetod töötas siin päris hästi! See ei garanteeri, et see töötab hästi ka muudel juhtudel.

Reaalajas servatuvastus videotel funktsiooniga cv2.Canny()

Lõpuks rakendame Canny servatuvastust videole reaalajas! Kuvame töödeldava video (iga kaader valmis kujul) kasutades cv2.imshow() mis kuvab akna raamiga, mida soovime kuvada. Siiski salvestame video ka MP4-faili, mida saab hiljem vaadata ja jagada.

Video laadimiseks OpenCV abil kasutame VideoCapture() meetod. Kui me sisse astume 0 – see salvestab praegusest veebikaamerast, nii et saate koodi ka oma veebikaameras käivitada! Kui edastate failinime, laadib see faili:

def edge_detection_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))), isColor=False)
    
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.GaussianBlur(frame, (3, 3), 0)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edge = cv2.Canny(frame, 50, 100)
            out.write(edge)
            cv2.imshow('Edge detection', edge)
        else:
            break

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

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

edge_detection_video('secret_video.mp4')

. VideoWriter aktsepteerib mitmeid parameetreid – väljundfaili nimi, FourCC (neli koodeki koodi, mis tähistavad video kodeerimiseks kasutatud kodekit), kaadrisagedus ja eraldusvõime koretisena. Video ära arvamiseks või selle suuruse muutmiseks kasutasime algse video laiust ja kõrgust, mis saadi läbi VideoCapture eksemplar, mis sisaldab andmeid video enda kohta, nagu laius, kõrgus, kaadrite koguarv jne.

Kaadri avamise ajal proovime järgmise kaadriga lugeda cap.read(), mis tagastab tulemuse koodi ja järgmise kaadri. Tulemuse kood on True or False, mis tähistab järgmise kaadri olemasolu või selle puudumist. Ainult siis, kui raam on olemas, proovime seda edasi töödelda, vastasel juhul katkestame ahela. Iga kehtiva kaadri jaoks käivitame selle läbi Gaussi hägususe, teisendame selle halltooniks ja käivitame cv2.Canny() sellele ja kirjutage see kasutades VideoWriter kettale ja kuvage kasutades cv2.imshow() otsevaate jaoks.

Lõpuks vabastame pildistamis- ja videokirjutaja, kuna need mõlemad töötavad kettal olevate failidega, ning hävitavad kõik olemasolevad aknad.

Kui käivitate meetodi koos a secret_video.mp4 sisend – näete hüpikakent ja kui see on lõpetatud, fail oma töökataloogis:

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Järeldus

Selles juhendis oleme vaatlenud, kuidas Canny servatuvastus töötab ja selle koostisosad – Gaussi silumine, Sobeli filtrid ja kujutise gradiendid, mittemaksimaalne summutus ja hüstereesilävi. Lõpuks oleme uurinud meetodeid automaatseks lävevahemiku otsimiseks Canny serva tuvastamiseks cv2.Canny(), ja kasutas seda tehnikat videos, pakkudes reaalajas servatuvastust ja salvestades tulemused videofaili.

Edasiminek – praktiline süvaõpe arvutinägemise jaoks

Sinu uudishimulik loomus tekitab sinus soovi minna kaugemale? Soovitame tutvuda meiega Kursus: "Praktiline süvaõpe arvutinägemise jaoks Pythoniga".

OpenCV servatuvastus Pythonis koos cv2.Canny() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Veel üks arvutinägemise kursus?

Me ei klassifitseeri MNIST-i numbreid ega MNIST-moodi. Nad teenisid oma osa juba ammu. Liiga paljud õpperessursid keskenduvad põhiandmekogumitele ja põhiarhitektuuridele, enne kui lasevad täiustatud musta kasti arhitektuurid jõudluskoormuse enda kanda võtta.

Tahame keskenduda demüstifitseerimine, praktilisus, mõistmine, intuitsioon ja tõelisi projekte. Tahad õppida kuidas saate midagi muuta? Viime teid teele alates viisist, kuidas meie aju töötleb pilte, kuni rinnavähi süvaõppe klassifikaatori kirjutamiseni kuni süvaõppevõrgustikeni, mis "hallutsineerivad", õpetades teile põhimõtteid ja teooriat praktilise töö kaudu, varustades teid oskusteavet ja tööriistu, et saada eksperdiks süvaõppe rakendamisel arvutinägemise lahendamisel.

Mis seal sees on?

  • Nägemise esimesed põhimõtted ja see, kuidas arvuteid saab õpetada nägema
  • Arvutinägemise erinevad ülesanded ja rakendused
  • Tööriistad, mis muudavad teie töö lihtsamaks
  • Arvutinägemise andmestike otsimine, loomine ja kasutamine
  • Konvolutsiooniliste närvivõrkude teooria ja rakendus
  • Domeeni nihke, koosesinemise ja muude andmekogumite eelarvamuste käsitlemine
  • Teisaldage õppimine ja teiste koolitusaja ja arvutusressursside kasutamine teie kasuks
  • Kaasaegse rinnavähi klassifikaatori ehitamine ja väljaõpe
  • Kuidas rakendada tervet annust skepsist peavoolu ideede suhtes ja mõista laialdaselt kasutusele võetud tehnikate mõju
  • ConvNeti "kontseptsiooniruumi" visualiseerimine t-SNE ja PCA abil
  • Juhtumiuuringud, kuidas ettevõtted kasutavad arvutinägemise tehnikaid paremate tulemuste saavutamiseks
  • Mudeli nõuetekohane hindamine, varjatud ruumi visualiseerimine ja mudeli tähelepanu tuvastamine
  • Domeeniuuringu läbiviimine, oma andmekogumite töötlemine ja mudelitestide loomine
  • Tipptasemel arhitektuurid, ideede edenemine, mis teeb need ainulaadseks ja kuidas neid ellu viia
  • KerasCV – WIP-teek tipptasemel torujuhtmete ja mudelite loomiseks
  • Kuidas töid sõeluda ja lugeda ning neid ise rakendada
  • Mudelite valimine sõltuvalt teie rakendusest
  • Täieliku masinõppe torujuhtme loomine
  • Maastik ja intuitsioon objektide tuvastamisel kiiremate R-CNN-ide, RetinaNetside, SSD-de ja YOLO-ga
  • Eksemplar ja semantiline segmenteerimine
  • Reaalajas objektituvastus YOLOv5-ga
  • YOLOv5 objektidetektorite koolitamine
  • Transformeritega töötamine KerasNLP-ga (tööstuse tugev WIP-teek)
  • Transformerite integreerimine ConvNetsiga, et luua piltide pealdised
  • Deepdream
  • Süvaõppe mudeli optimeerimine arvutinägemise jaoks

Ajatempel:

Veel alates Stackabus