गोलांग और ओपनसीवी पर आधारित एक चेहरा पहचान प्रणाली का निर्माण
OpenCV कंप्यूटर विज़न परियोजनाओं के लिए विकसित एक लाइब्रेरी है। वह पहले से ही लगभग 20 साल की है। मैंने इसे कॉलेज में इस्तेमाल किया और अब भी इसे अपने C++ और Python प्रोजेक्ट के लिए उपयोग करता हूं क्योंकि इसमें उन भाषाओं के लिए अच्छा समर्थन है।
लेकिन जब मैंने गो सीखना और उसका उपयोग करना शुरू किया, तो मुझे आश्चर्य हुआ कि क्या ओपनसीवी का उपयोग इस भाषा के साथ काम करने के लिए किया जा सकता है। उस समय एकीकरण पर पहले से ही उदाहरण और ट्यूटोरियल मौजूद थे, लेकिन मुझे ऐसा लगा कि वे बहुत जटिल थे। थोड़ी देर बाद, मुझे द हाइब्रिड ग्रुप द्वारा बनाया गया एक रैपर मिला। इस लेख में, मैं आपको दिखाऊंगा कि Haar Cascades के साथ एक सरल चेहरा पहचान प्रणाली विकसित करके GoCV के साथ शुरुआत कैसे करें।
पहले उदाहरण में, हम एक एप्लिकेशन बनाने का प्रयास करेंगे जो कैमरा वीडियो स्ट्रीम के साथ एक विंडो खोलता है।
सबसे पहले आपको उन पुस्तकालयों को आयात करना होगा जिनकी आपको काम करने के लिए आवश्यकता है।
आयात करना(
"लकड़ी का लट्ठा"
"gocv.io/x/gocv"
)
उसके बाद, आपको VideoCaptureDevice फ़ंक्शन का उपयोग करके एक VideoCapture ऑब्जेक्ट बनाना होगा। उत्तरार्द्ध कैमरे का उपयोग करके वीडियो स्ट्रीम कैप्चर करना संभव बनाता है। फ़ंक्शन एक पूर्णांक को पैरामीटर के रूप में लेता है (यह डिवाइस आईडी का प्रतिनिधित्व करता है)।
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()
अब हमें एक एन-डायमेंशनल मैट्रिक्स बनाने की जरूरत है। यह कैमरे से पढ़ी गई छवियों को संग्रहीत करेगा।
img := gocv.NewMat()
defer img.Close()
वीडियो स्ट्रीम प्रदर्शित करने के लिए, आपको एक विंडो बनाने की आवश्यकता है - यह न्यूविंडो फ़ंक्शन का उपयोग करके किया जा सकता है।
चूँकि वीडियो छवि फ़्रेमों की एक सतत धारा है, इसलिए हमें कैमरे की वीडियो स्ट्रीम को अंतहीन रूप से पढ़ने के लिए एक अनंत लूप बनाने की आवश्यकता होगी। इसके लिए VideoCapture प्रकार की Read विधि की आवश्यकता होती है। यह एक मैट प्रकार (जो मैट्रिक्स हमने ऊपर बनाया है) की अपेक्षा करेगा, एक बूलियन लौटाएगा जो यह दर्शाता है कि वीडियोकैप्चर से एक फ्रेम सफलतापूर्वक पढ़ा गया था या नहीं।
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}
अब हमें बनाई गई विंडो में फ़्रेम को प्रदर्शित करने की आवश्यकता है। अगले फ़्रेम पर जाने के लिए रुकें - 50 एमएस।
window.IMShow(img)
विंडो.वेटकी(50)
एप्लिकेशन लॉन्च करने के बाद, कैमरे से वीडियो स्ट्रीम वाली एक विंडो खुलेगी।
package main
import (
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("webcamwindow")
defer window.Close()
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}
उदाहरण 2
इस उदाहरण में, आइए पिछले उदाहरण का उपयोग करें और हार कैस्केड पर आधारित एक चेहरा पहचान प्रणाली बनाएं।
हार कैस्केड कैस्केड क्लासिफायर हैं जिन्हें हार वेवलेट तकनीक के आधार पर प्रशिक्षित किया जाता है। वे विशिष्ट विशेषताओं को देखने के लिए छवि में पिक्सेल का विश्लेषण करते हैं। हार कैस्केड के बारे में अधिक जानने के लिए कृपया नीचे दिए गए लिंक का अनुसरण करें।
पहले से ही प्रशिक्षित कैस्केड डाउनलोड करें यहाँ हो सकता है. वर्तमान उदाहरण में, सामने वाले व्यक्ति के चेहरे की पहचान करने के लिए कैस्केड का उपयोग किया जाएगा।
ऐसा करने के लिए, आपको एक क्लासिफायरियर बनाना होगा और उसे पहले से ही प्रशिक्षित फ़ाइल फ़ीड करनी होगी (लिंक ऊपर दिया गया है)। मैंने Pencv_haarcascade_frontalface_default.xml फ़ाइल को उस निर्देशिका में पहले ही अपलोड कर दिया है जहां हमारा प्रोग्राम स्थित है।
किसी छवि में चेहरों का पता लगाने के लिए, आपको विधि का उपयोग करने की आवश्यकता है मल्टीस्केल का पता लगाएं. यह फ़ंक्शन एक फ़्रेम (मैट प्रकार का) लेता है जिसे अभी-अभी कैमरे के वीडियो स्ट्रीम से पढ़ा गया है और रेक्टेंगल प्रकार की एक सरणी लौटाता है। सरणी का आकार उन चेहरों की संख्या को दर्शाता है जिन्हें क्लासिफायर फ़्रेम में पहचानने में सक्षम था। फिर, यह सुनिश्चित करने के लिए कि हमें क्या मिला, आइए आयतों की सूची के माध्यम से पुनरावृति करें और आयत ऑब्जेक्ट को कंसोल पर प्रिंट करें, पाए गए आयत के चारों ओर एक बॉर्डर बनाएं। यह रेक्टेंगल फ़ंक्शन का उपयोग करके किया जा सकता है। यह कैमरे द्वारा पढ़ा गया मैट, डिटेक्टमल्टीस्केल विधि द्वारा लौटाया गया रेक्टेंगल ऑब्जेक्ट और बॉर्डर के लिए रंग और मोटाई लेगा।
for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}
package main
import (
"fmt"
"image/color"
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("webcamwindow")
defer window.Close()
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
window.IMShow(img)
window.WaitKey(50)
}
}
और... हाँ, सब कुछ ठीक हो गया! अब हमारे पास गो में लिखित एक सरल चेहरा पहचान प्रणाली है। निकट भविष्य में, मैं इन प्रयोगों को जारी रखने और गो और ओपनसीवी को मिलाकर नई अच्छी चीजें बनाने की योजना बना रहा हूं।
यदि आप रुचि रखते हैं, तो कृपया रेटिंग दें जीआरपीसी वेब सर्वर, जिसे मैंने Python और OpenCV में लिखा था। किसी चेहरे का पता चलते ही यह डेटा स्ट्रीम कर देता है। यह विभिन्न प्रोग्रामिंग भाषाओं में अलग-अलग क्लाइंट बनाने का आधार है। वे सर्वर से जुड़ सकेंगे और उससे डेटा पढ़ सकेंगे।