Ամբողջականորեն տեղադրված եզրերի հայտնաբերում OpenCV-ի և Deep Learning-ի միջոցով


Հոլիստիկ-ներդրված եզրերի հայտնաբերումը (HED) խորը ուսուցման վրա հիմնված մեթոդ է պատկերների եզրերը հայտնաբերելու համար, որը կարող է իրականացվել խորը ուսուցման և Python գրադարանի՝ OpenCV-ի միջոցով: Ամբողջական Nested Edge հայտնաբերումն առաջին անգամ ներդրվել է Xie-ի և Tu-ի կողմից 2015 թվականին և այն ժամանակից ի վեր լայնորեն օգտագործվում է համակարգչային տեսողության ծրագրերում: Ներկայումս այն մեծ ժողովրդականություն է ձեռք բերել վերջին տարիներին՝ ճշգրիտ և բարձրորակ արտադրելու ունակության շնորհիվ: եզրային քարտեզներ պատկերում:

Այս հոդվածում մենք կքննարկենք HED-ի հիմունքները, ինչպես է այն աշխատում և ինչպես այն իրականացնել OpenCV-ի և խորը ուսուցման միջոցով, ինչպես նաև Canny-ի միջոցով:

Ի՞նչ է HED-ը (Հոլիստիկորեն Ներդրված եզրերի հայտնաբերումը):

Համակարգչային տեսողության մեջ Եզրերի հայտնաբերումը կարևոր խնդիր է, որը ներառում է պատկերի կտրուկ ընդհատումների հայտնաբերում և տեղայնացում: Պատկերի այս ընդհատումները հաճախ օգտագործվում են որպես համակարգչային տեսողության ավելի բարդ գործընթացի հիմք, ինչպիսիք են օբյեկտների հատվածավորումը և օբյեկտների հայտնաբերումը:

Եզրերի հայտնաբերման ավանդական մեթոդները օգտագործում են պատկերի առանձնահատկություններ, որոնք ձեռքով են մշակված և էվրիստիկա՝ պատկերի եզրերը նույնականացնելու համար: Այս մեթոդները հաճախ սահմանափակվում են բարդ կառուցվածքների եզրերին կամ պատկերի հյուսվածքի կամ լուսավորության ցանկացած տատանումներով կարգավորելու անկարողությամբ:

Holistically-Nested Edge Detection-ը պատկերի եզրերը հայտնաբերելու խորը ուսուցման վրա հիմնված մոտեցում է, որը հաղթահարում է եզրերի հայտնաբերման ավանդական մեթոդների սահմանափակումը՝ սովորելով եզրերի առանձնահատկությունները անմիջապես պատկերի տվյալներից: Այն օգտագործում է խորը կոնվոլյուցիոն նեյրոնային ցանց (CNN)՝ ստեղծելու հիերարխիկ եզրային քարտեզներ, որտեղ յուրաքանչյուր քարտեզ ներկայացնում է եզրերը տարբեր մասշտաբով:

OpenCV-ի և Deep Learning-ի միջոցով ամբողջականորեն տեղադրված եզրերի հայտնաբերման քայլեր

Հետևեք ստորև տրված քայլերին` OpenCV-ի և Deep Learning-ի միջոցով ամբողջականորեն տեղադրված եզրերի հայտնաբերում կատարելու համար:

  • Ներմուծեք անհրաժեշտ գրադարանները: Մենք ներմուծում ենք cv2՝ պատկերի մշակման համար, իսկ numpy՝ թվային գործողությունների համար:

  • Ներբեռնեք եզրերի հայտնաբերման նախապես պատրաստված մոդելը՝ օգտագործելով cv2.dnn.readNetFromCaffe(): Մենք պետք է տրամադրենք ուղին դեպի երկու ֆայլ՝ deploy.prototxt և hed_pretrained_bsds.caffemodel: Այս ֆայլերը պարունակում են համապատասխանաբար մոդելի ճարտարապետությունը և կշիռները:

  • Ներբեռնեք մուտքագրված պատկերը` օգտագործելով cv2.imread() և չափափոխեք այն ավելի փոքր չափի` 512 x 512 պիքսել: Պատկերի փոքր չափի չափափոխումը կամընտիր է, բայց դա կարող է օգնել արագացնել եզրերի հայտնաբերման գործընթացը:

  • Այնուհետև մենք բեռնում ենք մուտքագրված պատկերը և չափափոխում ենք այն առավելագույնը 1000 պիքսել՝ մշակումն արագացնելու համար: Մենք չափափոխված պատկերը վերածում ենք մոխրագույնի` օգտագործելով cv2.cvtColor():

  • Մենք նաև տրամադրում ենք որոշ լրացուցիչ պարամետրեր գործառույթին, ինչպիսիք են մասշտաբի գործակիցը, պատկերի չափը, միջին արժեքները և այլն: Այս արժեքները հատուկ են նախապես պատրաստված մոդելին, որը մենք օգտագործում ենք:

  • Կիրառեք Canny եզրերի հայտնաբերումը գորշ գույնի պատկերի վրա՝ օգտագործելով cv2.Canny(): Սա օգնում է հայտնաբերել պատկերի ուժեղ եզրերը:

  • Մենք կատարում ենք Հոլիստիկ-Նեստավորված եզրերի հայտնաբերում` օգտագործելով նախապես պատրաստված մոդելը: Մենք սկզբում մուտքագրում ենք մոդելը, օգտագործելով model.setInput(): Մենք փոխանցում ենք մոխրագույն սանդղակի պատկերը որպես մուտքագրում:

  • Մենք սահմանում ենք ելքային պատկերը՝ օգտագործելով cv2.threshold()՝ երկուական եզրեր ստանալու համար: Մենք օգտագործում ենք Otsu շեմի մեթոդը, որն ավտոմատ կերպով հաշվարկում է օպտիմալ շեմային արժեքը:

  • Ի վերջո, մենք մոդելի ելքը ստանում ենք՝ օգտագործելով model.forward():

  • ցուցադրեք մուտքագրված պատկերը, Canny եզրերը և HED եզրերը՝ օգտագործելով cv2.imshow() և սպասեք, որ օգտագործողը սեղմի ստեղնը, նախքան պատուհանները փակելը cv2.waitKey() և cv2.destroyAllWindows():

Օրինակ

import cv2
import numpy as np

# Load the pre-trained HED model
hed_model = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel")

# Load the input image
image = cv2.imread("sample2.jpg")

# Resize the image for faster processing
height, width = image.shape[:2]
max_size = max(height, width)
scale = 1.0
if max_size > 1000:
   scale = 1000.0 / max_size
resized = cv2.resize(image, None, fx=scale, fy=scale)

# Convert the image to grayscale
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
# Apply Canny edge detection to the grayscale image
canny = cv2.Canny(gray, 100, 200)
# Apply HED to the color image
hed_model.setInput(cv2.dnn.blobFromImage(resized, scalefactor=1.0, size=(width, height), mean=(104.00698793, 116.66876762, 122.67891434), swapRB=False, crop=False))
hed = hed_model.forward()
hed = np.squeeze(hed)

# Convert the HED output to a binary image
hed = np.squeeze(hed)
hed = np.uint8(hed * 255)
hed_edges = cv2.convertScaleAbs(hed)
ret, hed_edges = cv2.threshold(hed_edges, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Threshold the output image to obtain binary edges
ret, hed_edges = cv2.threshold(hed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# Display the input and output images
cv2.imshow("Input", resized)
cv2.imshow("Canny", canny)
cv2.imshow("HED", hed_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Արդյունք

Եզրակացություն

Եզրափակելով՝ Holistically-Nested Edge Detection-ը (HED) պատկերի եզրերը հայտնաբերելու հզոր տեխնիկա է և առաջարկում է որակյալ արդյունքներ և բարձր ճշգրտություն: Այն հիմնված է խորը ուսուցման ալգորիթմների վրա, որոնք կարող են սովորել և հարմարվել պատկերների տարբեր տատանումներին և կառուցվածքներին, ինչը հարմար է դարձնում պատկերների մշակման և համակարգչային տեսողության կիրառությունների լայն շրջանակի համար: Մենք իմացանք, որ OpenCV-ն ապահովում է հարմար շրջանակ Holistically-Nested Edge Detection-ի համար և հանդիսանում է եզրերի հայտնաբերման արդյունավետ միջոցներից մեկը: