परिचय
एज डिटेक्शन कुछ ऐसा है जो हम स्वाभाविक रूप से करते हैं, लेकिन जब कंप्यूटर के लिए नियमों को परिभाषित करने की बात आती है तो यह उतना आसान नहीं होता है। जबकि विभिन्न तरीकों को तैयार किया गया है, 1986 में जॉन एफ। कैनी द्वारा शासन पद्धति विकसित की गई थी, और इसे उपयुक्त रूप से कैनी विधि का नाम दिया गया है।
यह तेज, काफी मजबूत है, और यह जिस प्रकार की तकनीक के लिए काम कर सकता है, उसके बारे में सबसे अच्छा काम करता है। गाइड के अंत तक, आपको पता चल जाएगा कि वीडियो पर रीयल-टाइम एज डिटेक्शन कैसे किया जाता है, और निम्न की तर्ज पर कुछ तैयार किया जाता है:
कैनी एज डिटेक्शन
कैनी विधि क्या है? इसमें चार अलग-अलग ऑपरेशन होते हैं:
- गाऊसी चौरसाई
- कंप्यूटिंग ग्रेडियेंट
- गैर-अधिकतम दमन
- हिस्टैरिसीस थ्रेसहोल्डिंग
गाऊसी चौरसाई इनपुट छवि को "आयरन आउट" करने के लिए पहले चरण के रूप में उपयोग किया जाता है, और शोर को नरम करता है, जिससे अंतिम आउटपुट अधिक साफ हो जाता है।
छवि ढाल किनारे का पता लगाने के लिए पहले के अनुप्रयोगों में उपयोग किया गया है। सबसे विशेष रूप से, सोबेल और शार फिल्टर छवि ग्रेडियेंट पर भरोसा करते हैं। सोबेल फिल्टर दो गुठली तक उबलता है (Gx और Gy), कहा पे Gx क्षैतिज परिवर्तनों का पता लगाता है, जबकि Gy ऊर्ध्वाधर परिवर्तनों का पता लगाता है:
G
x
=
[
-
1
0
+
1
-
2
0
+
2
-
1
0
+
1
]
G
y
=
[
-
1
-
2
-
1
0
0
0
+
1
+
2
+
1
]
जब आप उन्हें एक छवि पर स्लाइड करते हैं, तो वे प्रत्येक अपने संबंधित अभिविन्यास में लाइनों को "पिक अप" (जोर देते हैं) करेंगे। शार कर्नेल अलग-अलग मूल्यों के साथ एक ही तरह से काम करते हैं:
G
x
=
[
+
3
0
-
3
+
10
0
-
10
+
3
0
-
3
]
G
y
=
[
+
3
+
10
+
3
0
0
0
-
3
-
10
-
3
]
ये फ़िल्टर, एक बार छवि पर सुलझने के बाद, फ़ीचर मैप तैयार करेंगे:
छवि क्रेडिट: डेविडवेकेनेडी
इन फीचर मैप्स के लिए, आप गणना कर सकते हैं ढाल परिमाण और ढाल अभिविन्यास - यानी परिवर्तन कितना तीव्र है (यह कितनी संभावना है कि कुछ किनारे है) और परिवर्तन किस दिशा में इंगित कर रहा है। चूंकि Gy ऊर्ध्वाधर परिवर्तन (Y-ग्रेडिएंट) को दर्शाता है, और Gx क्षैतिज परिवर्तन (X-ग्रेडिएंट) को दर्शाता है - आप केवल पाइथागोरस प्रमेय को लागू करके परिमाण की गणना कर सकते हैं, "बाएं" द्वारा गठित त्रिभुज का हाइपोथेन्यूज़ प्राप्त करने के लिए और "सही" दिशा:
$$
{जी} = {वर्ग {{{जी} _{x}}^{2}+{{जी} _{y}}^{2}}}
$$
परिमाण और अभिविन्यास का उपयोग करके, आप एक छवि का निर्माण कर सकते हैं जिसके किनारे पर प्रकाश डाला गया है:
छवि क्रेडिट: डेविडवेकेनेडी
हालाँकि - आप देख सकते हैं कि ईंटों के टेक्चर से कितना शोर भी पकड़ा गया था! छवि ग्रेडिएंट शोर के प्रति बहुत संवेदनशील होते हैं। यही कारण है कि सोबेल और शार फिल्टर को घटक के रूप में इस्तेमाल किया गया था, लेकिन कैनी की विधि में एकमात्र दृष्टिकोण नहीं था। गाऊसी स्मूथिंग यहां भी मदद करता है।
गैर-अधिकतम दमन
सोबेल फिल्टर के साथ एक ध्यान देने योग्य मुद्दा यह है कि किनारे वास्तव में स्पष्ट नहीं हैं। ऐसा नहीं है कि किसी ने एक पेंसिल ली और छवि का रैखिक बनाने के लिए एक रेखा खींची। आमतौर पर किनारों को छवियों में इतना स्पष्ट नहीं किया जाता है, क्योंकि प्रकाश धीरे-धीरे फैलता है। हालांकि, हम किनारों में आम लाइन ढूंढ सकते हैं, और इसके चारों ओर बाकी पिक्सल को दबा सकते हैं, इसके बजाय एक साफ, पतली अलगाव रेखा उत्पन्न कर सकते हैं। इसे गैर-अधिकतम दमन के रूप में जाना जाता है! गैर-अधिकतम पिक्सेल (जिससे हम एक छोटे स्थानीय क्षेत्र में उनकी तुलना कर रहे हैं, जैसे कि 3×3 कर्नेल) से छोटे पिक्सेल दब जाते हैं। अवधारणा इससे अधिक कार्यों पर लागू होती है, लेकिन आइए इसे अभी के लिए इस संदर्भ में बांधें।
हिस्टैरिसीस थ्रेसहोल्डिंग
कई गैर-किनारों का मूल्यांकन किनारों के रूप में किया जा सकता है, प्रकाश की स्थिति, छवि में सामग्री आदि के कारण। विभिन्न कारणों से ये गलत अनुमान होते हैं - यह एक स्वचालित मूल्यांकन करना मुश्किल है कि निश्चित रूप से एक किनारा क्या है और क्या है 'टी। आप ग्रेडिएंट को थ्रेशोल्ड कर सकते हैं, और केवल मजबूत लोगों को शामिल कर सकते हैं, यह मानते हुए कि "असली" किनारे "नकली" किनारों की तुलना में अधिक तीव्र हैं।
थ्रेसहोल्डिंग सामान्य रूप से उसी तरह काम करता है - यदि ग्रेडिएंट निचली सीमा से नीचे है, तो इसे हटा दें (इसे शून्य करें), और यदि यह किसी दिए गए शीर्ष सीमा से ऊपर है, तो इसे रखें। निचली बाउंड और अपर बाउंड के बीच सब कुछ "ग्रे ज़ोन" में है। यदि थ्रेसहोल्ड के बीच का कोई किनारा a . से जुड़ा है निश्चित बढ़त (दहलीज से ऊपर वाले) - उन्हें किनारों के रूप में भी माना जाता है। यदि वे जुड़े नहीं हैं, तो वे संभावित रूप से एक गलत गणना वाले किनारे के आर्कटिक हैं।
वह हिस्टैरिसीस थ्रेशोल्डिंग है! वास्तव में, यह अंतिम आउटपुट को साफ करने और झूठे किनारों को हटाने में मदद करता है, जो इस बात पर निर्भर करता है कि आप झूठे किनारे के रूप में क्या वर्गीकृत करते हैं। अच्छे थ्रेशोल्ड मान खोजने के लिए, आप आम तौर पर थ्रेसहोल्ड के लिए अलग-अलग निचली और ऊपरी सीमाओं के साथ प्रयोग करेंगे, या एक स्वचालित विधि जैसे ओत्सु की विधि या त्रिभुज विधि को नियोजित करेंगे।
आइए एक छवि को लोड करें और इसे ग्रेस्केल करें (कैनी, जैसे सोबेल/शार को छवियों को ग्रेस्केल करने की आवश्यकता होती है):
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')
एक उंगली की क्लोजअप छवि किनारे का पता लगाने के लिए एक अच्छे परीक्षण के रूप में काम करेगी - छवि से एक फिंगरप्रिंट को पहचानना आसान नहीं है, लेकिन हम एक का अनुमान लगा सकते हैं।
cv2.Canny () के साथ छवियों पर एज डिटेक्शन
ओपनसीवी का उपयोग करके कैनी का एल्गोरिदम लागू किया जा सकता है Canny()
तरीका:
cv2.Canny(input_img, lower_bound, upper_bound)
सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!
निचली सीमा और ऊपरी सीमा के बीच सही संतुलन ढूँढना मुश्किल हो सकता है। यदि दोनों कम हैं - तो आपके पास कुछ किनारे होंगे। यदि निचली बाउंड कम है और ऊपरी ऊंची है - तो आपको शोर होगा। यदि दोनों ऊंचे हैं और एक-दूसरे के करीब हैं - तो आपके पास कुछ किनारे होंगे। सही जगह में सीमाओं के बीच पर्याप्त अंतर है, और उन्हें सही पैमाने पर है। प्रयोग!
कैनी विधि द्वारा इनपुट छवि धुंधली हो जाएगी, लेकिन कई बार, आपको इसे धुंधला करने से लाभ होगा से पहले यह भी अंदर जाता है। बाकी ऑपरेशनों से गुजरने से पहले यह विधि इनपुट पर 5×5 गाऊसी कलंक लागू करती है, लेकिन इस धुंध के साथ भी, कुछ शोर अभी भी रिस सकता है, इसलिए हमने इसे एल्गोरिथम में फीड करने से पहले छवि को धुंधला कर दिया है:
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')
इसका परिणाम यह होगा:
के मूल्यों 20
और 30
यहाँ मनमाना नहीं है - मैंने विभिन्न मापदंडों पर विधि का परीक्षण किया है, और एक ऐसा सेट चुना है जो एक अच्छा परिणाम देता है। क्या हम इसे स्वचालित करने का प्रयास कर सकते हैं?
cv2.Canny () के लिए स्वचालित थ्रेसहोल्डिंग?
क्या आपको थ्रेशोल्ड मानों का इष्टतम सेट मिल सकता है? हाँ, लेकिन यह हमेशा काम नहीं करता। आप कुछ अच्छे मूल्य के लिए अपनी खुद की गणना कर सकते हैं, और फिर रेंज को a . के साथ समायोजित कर सकते हैं sigma
उस दहलीज के आसपास:
lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold
. sigma
, कह रहा है, 0.33
- सीमा होगी 0.66*threshold
और 1.33*threshold
, इसके चारों ओर ~ 1/3 रेंज की अनुमति देता है। हालांकि, ढूँढना threshold
क्या अधिक कठिन है। ओपनसीवी हमें ओत्सु की विधि (द्वि-मोडल छवियों के लिए बढ़िया काम करता है) और त्रिभुज विधि प्रदान करता है। आइए उन दोनों को आज़माएँ, साथ ही तीसरे विकल्प के रूप में पिक्सेल मानों का एक साधारण माध्यिका लें:
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}")
इसका परिणाम यह होगा:
Otsu's Threshold: (70.35, 139.65)
Triangle Threshold: (17.419999999999998, 34.58)
Manual Threshold: (105.18999999999998, 208.81)
ये काफी अलग हैं! हमने पहले जिन मूल्यों को देखा है, उनसे हम यह अनुमान लगा सकते हैं कि त्रिभुज विधि यहाँ सबसे अच्छा काम कर रही है। मैनुअल थ्रेशोल्ड बहुत सूचित नहीं है, क्योंकि यह केवल औसत पिक्सेल मान लेता है, और एक उच्च बेस थ्रेसहोल्ड होने पर समाप्त होता है जिसे आगे इस छवि के लिए एक विस्तृत श्रृंखला में गुणा किया जाता है। ओत्सु की विधि इससे कम ग्रस्त है, लेकिन फिर भी पीड़ित है।
अगर हम चलाते हैं Canny()
इन दहलीज सीमाओं के साथ विधि:
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')
नोट: फ़ंक्शन कई तर्कों की अपेक्षा करता है, और हमारी दहलीज एक एकल टपल है। हम कर सकते हैं विनाश इसके साथ उपसर्ग करके कई तर्कों में टपल करें *
. यह सूचियों और सेटों पर भी काम करता है, और प्रोग्रामेटिक माध्यमों से उन्हें प्राप्त करने के बाद कई तर्कों की आपूर्ति करने का एक शानदार तरीका है।
इसका परिणाम यह होगा:
त्रिभुज विधि ने यहाँ बहुत अच्छा काम किया! यह कोई गारंटी नहीं है कि यह अन्य मामलों में भी अच्छा काम करेगा।
cv2.Canny () के साथ वीडियो पर रीयल-टाइम एज डिटेक्शन
अंत में, कैनी एज डिटेक्शन को वास्तविक समय में एक वीडियो पर लागू करें! हम संसाधित किए जा रहे वीडियो को प्रदर्शित करेंगे (प्रत्येक फ्रेम जैसा कि यह किया गया है) का उपयोग करके cv2.imshow()
जो उस फ्रेम के साथ एक विंडो प्रदर्शित करता है जिसे हम प्रदर्शित करना चाहते हैं। हालांकि, हम वीडियो को एक MP4 फ़ाइल में भी सहेजेंगे, जिसे बाद में जांचा और साझा किया जा सकता है।
OpenCV का उपयोग करके वीडियो लोड करने के लिए, हम उपयोग करते हैं VideoCapture()
तरीका। अगर हम अंदर जाते हैं 0
- यह वर्तमान वेबकैम से रिकॉर्ड होगा, ताकि आप अपने वेबकैम पर भी कोड चला सकें! यदि आप फ़ाइल नाम में पास करते हैं, तो यह फ़ाइल लोड करेगा:
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')
RSI VideoWriter
कई मापदंडों को स्वीकार करता है - आउटपुट फ़ाइल नाम, फोरसीसी (चार कोडेक कोड, जो वीडियो को एन्कोड करने के लिए इस्तेमाल किए गए कोडेक को दर्शाता है), फ्रैमरेट और रिज़ॉल्यूशन एक ट्यूपल के रूप में। वीडियो का अनुमान न लगाने या उसका आकार बदलने के लिए - हमने मूल वीडियो की चौड़ाई और ऊंचाई का उपयोग किया है, जिसे के माध्यम से प्राप्त किया गया है VideoCapture
उदाहरण जिसमें वीडियो के बारे में ही डेटा होता है, जैसे कि चौड़ाई, ऊंचाई, फ़्रेम की कुल संख्या, आदि।
जब कैप्चर खोला जाता है, तो हम अगले फ्रेम को पढ़ने की कोशिश करते हैं cap.read()
, जो एक परिणाम कोड और अगला फ्रेम देता है। परिणाम कोड है True
or False
, अगले फ्रेम की उपस्थिति या उसके अभाव को दर्शाता है। केवल जब कोई फ़्रेम होगा, हम इसे आगे संसाधित करने का प्रयास करेंगे, अन्यथा, हम लूप को तोड़ देंगे। प्रत्येक मान्य फ्रेम के लिए, हम इसे गाऊसी कलंक के माध्यम से चलाते हैं, इसे ग्रेस्केल में परिवर्तित करते हैं, चलाते हैं cv2.Canny()
उस पर और का उपयोग करके इसे लिखें VideoWriter
डिस्क पर, और का उपयोग करके प्रदर्शित करें cv2.imshow()
एक जीवंत दृश्य के लिए।
अंत में, हम कैप्चर और वीडियो राइटर को रिलीज़ करते हैं, क्योंकि वे दोनों डिस्क पर फ़ाइलों के साथ काम कर रहे हैं, और सभी मौजूदा विंडो को नष्ट कर देते हैं।
जब आप विधि को a . के साथ चलाते हैं secret_video.mp4
इनपुट - आपको एक विंडो पॉप अप दिखाई देगी और एक बार यह समाप्त हो जाने के बाद, आपकी कार्यशील निर्देशिका में एक फ़ाइल:
निष्कर्ष
इस गाइड में, हमने देखा है कि कैनी एज डिटेक्शन कैसे काम करता है, और इसके घटक भाग - गाऊसी स्मूथिंग, सोबेल फिल्टर और इमेज ग्रेडिएंट, नॉन-मैक्स सप्रेशन और हिस्टैरिसीस थ्रेसहोल्डिंग। अंत में, हमने कैनी एज डिटेक्शन के लिए स्वचालित थ्रेशोल्ड रेंज खोज के तरीकों की खोज की है cv2.Canny()
, और वीडियो पर तकनीक को नियोजित किया, रीयल-टाइम एज डिटेक्शन प्रदान करता है और परिणामों को वीडियो फ़ाइल में सहेजता है।
आगे जाना - कंप्यूटर विजन के लिए व्यावहारिक गहन शिक्षण
आपका जिज्ञासु स्वभाव आपको और आगे जाना चाहता है? हम अनुशंसा करते हैं कि हमारी जाँच करें कोर्स: "पायथन के साथ कंप्यूटर विजन के लिए प्रैक्टिकल डीप लर्निंग".
एक और कंप्यूटर विजन कोर्स?
हम MNIST अंकों या MNIST फैशन का वर्गीकरण नहीं करेंगे। उन्होंने बहुत समय पहले अपनी भूमिका निभाई थी। उन्नत ब्लैक-बॉक्स आर्किटेक्चर को प्रदर्शन का बोझ उठाने देने से पहले बहुत से सीखने के संसाधन बुनियादी डेटासेट और बुनियादी आर्किटेक्चर पर ध्यान केंद्रित कर रहे हैं।
हम पर ध्यान केंद्रित करना चाहते हैं रहस्योद्घाटन, व्यावहारिकता, समझ, अंतर्ज्ञान और वास्तविक परियोजनाएं. सीखना चाहते है कैसे आप कुछ कर सकते है? हम आपको हमारे दिमाग की छवियों को संसाधित करने से लेकर स्तन कैंसर के लिए एक शोध-ग्रेड डीप लर्निंग क्लासिफायर लिखने से लेकर गहन शिक्षण नेटवर्क तक ले जाएंगे जो "मतिभ्रम" करते हैं, आपको व्यावहारिक कार्य के माध्यम से सिद्धांत और सिद्धांत सिखाते हैं, आपको इससे लैस करते हैं कंप्यूटर विज़न को हल करने के लिए गहन शिक्षण को लागू करने में विशेषज्ञ बनने के लिए जानकारी और उपकरण।
अंदर क़या है?
- दृष्टि के पहले सिद्धांत और कंप्यूटर को "देखना" कैसे सिखाया जा सकता है
- कंप्यूटर विज़न के विभिन्न कार्य और अनुप्रयोग
- व्यापार के उपकरण जो आपके काम को आसान बना देंगे
- कंप्यूटर विज़न के लिए डेटासेट खोजना, बनाना और उपयोग करना
- दृढ़ तंत्रिका नेटवर्क का सिद्धांत और अनुप्रयोग
- डेटासेट में डोमेन शिफ्ट, सह-घटना और अन्य पूर्वाग्रहों को संभालना
- अपने लाभ के लिए सीखने और दूसरों के प्रशिक्षण समय और कम्प्यूटेशनल संसाधनों का उपयोग करना स्थानांतरित करें
- एक अत्याधुनिक स्तन कैंसर क्लासिफायर का निर्माण और प्रशिक्षण
- मुख्यधारा के विचारों पर संदेह की एक स्वस्थ खुराक कैसे लागू करें और व्यापक रूप से अपनाई गई तकनीकों के निहितार्थ को समझें
- t-SNE और PCA का उपयोग करके ConvNet के "अवधारणा स्थान" की कल्पना करना
- बेहतर परिणाम प्राप्त करने के लिए कंपनियां कंप्यूटर विज़न तकनीकों का उपयोग कैसे करती हैं, इसका केस अध्ययन
- उचित मॉडल मूल्यांकन, गुप्त स्थान विज़ुअलाइज़ेशन और मॉडल के ध्यान की पहचान करना
- डोमेन अनुसंधान करना, अपने स्वयं के डेटासेट को संसाधित करना और मॉडल परीक्षण स्थापित करना
- अत्याधुनिक वास्तुकला, विचारों की प्रगति, उन्हें क्या विशिष्ट बनाता है और उन्हें कैसे लागू किया जाए
- KerasCV - अत्याधुनिक पाइपलाइन और मॉडल बनाने के लिए WIP लाइब्रेरी
- पेपर कैसे पार्स करें और पढ़ें और उन्हें स्वयं कैसे लागू करें
- अपने आवेदन के आधार पर मॉडल का चयन
- एंड-टू-एंड मशीन लर्निंग पाइपलाइन बनाना
- तेजी से आर-सीएनएन, रेटिनानेट्स, एसएसडी और योलो के साथ ऑब्जेक्ट डिटेक्शन पर लैंडस्केप और अंतर्ज्ञान
- इंस्टेंस और सिमेंटिक सेगमेंटेशन
- YOLOv5 . के साथ रीयल-टाइम ऑब्जेक्ट रिकग्निशन
- YOLOv5 ऑब्जेक्ट डिटेक्टरों का प्रशिक्षण
- KerasNLP (उद्योग-शक्ति WIP पुस्तकालय) का उपयोग कर ट्रांसफॉर्मर के साथ कार्य करना
- छवियों के कैप्शन उत्पन्न करने के लिए ट्रांसफॉर्मर को कन्वनेट के साथ एकीकृत करना
- DeepDream
- कंप्यूटर विज़न के लिए डीप लर्निंग मॉडल ऑप्टिमाइज़ेशन