Section 7 — प्रैक्टिकल प्रोजेक्ट्स (स्टेप-बाय-स्टेप)
नीचे 3 रियल-वर्ल्ड प्रोजेक्ट्स दिए गए हैं — हर प्रोजेक्ट के लिए संक्षिप्त वर्णन, कोड स्निपेट और प्रैक्टिकल टिप्स शामिल हैं ताकि आप कम समय में प्रोटोटाइप तैयार कर सकें।
🟢 Project 1 — फेस डिटेक्शन और बेसिक फेस रिकॉग्निशन
उद्देश्य: वेबकैम से फेस डिटेक्ट करें और छोटे डेटासेट पर फेस रिकॉग्निशन लागू करें। आसान और प्रैक्टिकल — शुरुआत के लिए परफेक्ट।
स्टेप्स (संक्षेप)
- Haar Cascade से फेस डिटेक्शन।
- हर व्यक्ति के चेहरे के कई सैम्पल इकट्ठा करें (50–100 इमेज)।
- LBPH या FaceNet-based embeddings से मॉडल ट्रेन करें।
- रियल-टाइम में पहचानें और नाम दिखाएँ।
कोड — LBPH बेसिक उदाहरण
# ट्रेनिंग (सिंपल LBPH)
import cv2
import os
import numpy as np
detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = []
labels = []
label = 0
for person_folder in os.listdir('dataset'):
for file in os.listdir(os.path.join('dataset', person_folder)):
img = cv2.imread(os.path.join('dataset', person_folder, file))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dets = detector.detectMultiScale(gray, 1.1, 4)
for (x,y,w,h) in dets:
faces.append(gray[y:y+h, x:x+w])
labels.append(label)
label += 1
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces, np.array(labels))
recognizer.save('lbph_model.yml')
रियल-टाइम इनफरेंस
# रीयल-टाइम पहचान
recognizer.read('lbph_model.yml')
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
dets = detector.detectMultiScale(gray, 1.1, 4)
for (x,y,w,h) in dets:
face = gray[y:y+h, x:x+w]
id_, conf = recognizer.predict(face)
if conf < 60:
name = "Person_"+str(id_)
else:
name = "Unknown"
cv2.putText(frame, name, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2)
cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0), 2)
cv2.imshow('Face Recognition', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Tip: LBPH छोटे डेटासेट पर तेज़ और भरोसेमंद है। अगर सटीकता चाहिए तो FaceNet/ArcFace embeddings + SVM या cosine similarity प्रयोग करें।
🔵 Project 2 — ऑब्जेक्ट काउंटर (लोअर-कम्प्लेक्स स्टोरी)
उद्देश्य: वीडियो या स्ट्रीम में से किसी क्षेत्र से गुजरने वाली वस्तुओं (जैसे लोग/कार) को काउंट करना। उपयोगी स्टोर एनालिटिक्स और ट्रैफिक काउंटिंग के लिए।
लॉजिक (सरल)
- बैकग्राउंड सब्ट्रैक्शन (MOG2) से मूविंग ऑब्जेक्ट निकालें।
- कंटूर निकालकर फ़िल्टर (area threshold) करें।
- एक काउंटिंग ज़ोन (लाइन/रिजन) बनाएं और crossing events गिनें।
कोड — बेसिक काउंटर
import cv2
cap = cv2.VideoCapture('video.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=50)
count = 0
line_y = 300 # उदाहरण के लिए
while True:
ret, frame = cap.read()
if not ret:
break
fgmask = fgbg.apply(frame)
_, thresh = cv2.threshold(fgmask, 244, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 1200:
x,y,w,h = cv2.boundingRect(cnt)
cx = x + w//2
cy = y + h//2
# अगर सेंटर line को cross करे तो count बढ़ाएँ (सरल लॉजिक)
if cy < line_y + 5 and cy > line_y - 5:
count += 1
cv2.rectangle(frame, (x,y), (x+w, y+h), (255,0,0), 2)
cv2.line(frame, (0,line_y), (frame.shape[1], line_y), (0,255,0), 2)
cv2.putText(frame, f'Count: {count}', (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2)
cv2.imshow('Counter', frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Tip: काउंटर की रॉबस्टनेस बढ़ाने के लिए tracking (Simple SORT) और object-reid techniques जोड़ें ताकि डुप्लिकेट काउंट कम हों।
🔴 Project 3 — AR Overlay (Marker-based या Feature Homography)
उद्देश्य: किसी रियल-वर्ल्ड मार्कर/इमेज पर डिजिटल ऑब्जेक्ट (जैसे लोगो, 3D overlay) रेंडर करना। यह AR-प्रोजेक्ट छोटे पोर्टफोलियो के लिए शानदार है।
सरल तरीका (ORB + Homography)
import cv2
import numpy as np
# रिफरेंस इमेज (marker) और ओवरले इमेज लोड करें
marker = cv2.imread('marker.jpg', 0)
overlay = cv2.imread('overlay.png')
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(marker, None)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
kp2, des2 = orb.detectAndCompute(gray, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
if des2 is None:
cv2.imshow('AR', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
continue
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)[:30]
if len(matches) > 10:
src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1,1,2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1,1,2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
h,w = marker.shape
pts = np.float32([[0,0],[0,h],[w,h],[w,0]]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts, M)
# overlay को warp करें और frame पर blend करें (सिंपल तरीका)
warp = cv2.warpPerspective(overlay, M, (frame.shape[1], frame.shape[0]))
mask_overlay = (warp.sum(axis=2) > 0).astype(np.uint8)*255
inv_mask = cv2.bitwise_not(mask_overlay)
bg = cv2.bitwise_and(frame, frame, mask=inv_mask)
fg = cv2.bitwise_and(warp, warp, mask=mask_overlay)
frame = cv2.add(bg, fg)
cv2.imshow('AR Overlay', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Tip: मार्कर इमेज साफ और टेक्सचर-रिच होनी चाहिए ताकि ORB/SIFT अच्छे मैच दे। परफॉर्मेंस के लिए feature count और matching threshold एडजस्ट करें।
अभी क्या करें: इन प्रोजेक्ट्स में से किसी एक को चुनकर dataset तैयार करें और कोड को छोटे हिस्सों में रन करके टेस्ट करें — छोटे-छोटे सफल प्रयोग आपको तेज़ी से आगे बढ़ाते हैं।