themehmi commited on
Commit
075e9a5
·
verified ·
1 Parent(s): 384cb2b

Upload 10 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ dataset_extracted/Lovnish[[:space:]]Sir/Screenshot[[:space:]]2026-05-13[[:space:]]213844.png filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, Response
2
+ import cv2
3
+ import face_recognition
4
+ import numpy as np
5
+ import os
6
+ import sqlite3
7
+ from datetime import datetime
8
+ from pathlib import Path
9
+
10
+ app = Flask(__name__)
11
+
12
+ # SETUP DATABASE
13
+ DB_FILE = "attendance.db"
14
+
15
+ def init_db():
16
+ """Creates the database and table if they don't exist."""
17
+ conn = sqlite3.connect(DB_FILE)
18
+ cursor = conn.cursor()
19
+ cursor.execute('''
20
+ CREATE TABLE IF NOT EXISTS attendance_logs (
21
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ name TEXT NOT NULL,
23
+ date TEXT NOT NULL,
24
+ time TEXT NOT NULL
25
+ )
26
+ ''')
27
+ conn.commit()
28
+ conn.close()
29
+
30
+ # Initialize the database immediately
31
+ init_db()
32
+
33
+
34
+ # LOAD DATA ON STARTUP
35
+ DATASET_DIR = Path("dataset_extracted")
36
+ DATASET_DIR.mkdir(exist_ok=True)
37
+
38
+ known_encodings = []
39
+ known_names = []
40
+
41
+ print("Loading dataset and encoding faces. Please wait...")
42
+ for person_name in os.listdir(DATASET_DIR):
43
+ person_path = DATASET_DIR / person_name
44
+ if not person_path.is_dir(): continue
45
+
46
+ for image_name in os.listdir(person_path):
47
+ image_path = person_path / image_name
48
+ image = face_recognition.load_image_file(image_path)
49
+ encodings = face_recognition.face_encodings(image)
50
+ if len(encodings) > 0:
51
+ known_encodings.append(encodings[0])
52
+ known_names.append(person_name)
53
+
54
+ print(f"Loaded {len(known_encodings)} faces. Starting app...")
55
+
56
+
57
+ # LOGGING LOGIC
58
+ marked_names = set()
59
+
60
+ def mark_attendance(name):
61
+ if name not in marked_names:
62
+ marked_names.add(name)
63
+ now = datetime.now()
64
+ current_date = now.strftime("%Y-%m-%d")
65
+ current_time = now.strftime("%H:%M:%S")
66
+
67
+ # Connect to DB and insert the record
68
+ conn = sqlite3.connect(DB_FILE)
69
+ cursor = conn.cursor()
70
+ cursor.execute('''
71
+ INSERT INTO attendance_logs (name, date, time)
72
+ VALUES (?, ?, ?)
73
+ ''', (name, current_date, current_time))
74
+ conn.commit()
75
+ conn.close()
76
+
77
+ print(f"Attendance Logged in Database for: {name}")
78
+
79
+
80
+ # WEBCAM GENERATOR
81
+ def generate_frames():
82
+ camera = cv2.VideoCapture(0)
83
+
84
+ while True:
85
+ success, frame = camera.read()
86
+ if not success:
87
+ break
88
+ else:
89
+ small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
90
+ rgb_small_frame = cv2.cvtColor(small_frame, cv2.COLOR_BGR2RGB)
91
+
92
+ face_locations = face_recognition.face_locations(rgb_small_frame)
93
+ face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
94
+
95
+ for face_encoding, face_location in zip(face_encodings, face_locations):
96
+ matches = face_recognition.compare_faces(known_encodings, face_encoding, tolerance=0.5)
97
+ face_distances = face_recognition.face_distance(known_encodings, face_encoding)
98
+
99
+ name = "Unknown"
100
+ if len(face_distances) > 0:
101
+ best_match_index = np.argmin(face_distances)
102
+ if matches[best_match_index]:
103
+ name = known_names[best_match_index]
104
+ mark_attendance(name)
105
+
106
+ top, right, bottom, left = face_location
107
+ top, right, bottom, left = top*4, right*4, bottom*4, left*4
108
+
109
+ cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
110
+ cv2.putText(frame, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 2)
111
+
112
+ ret, buffer = cv2.imencode('.jpg', frame)
113
+ frame = buffer.tobytes()
114
+
115
+ yield (b'--frame\r\n'
116
+ b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
117
+
118
+
119
+ # ROUTES
120
+ @app.route('/')
121
+ def index():
122
+ return render_template('index.html')
123
+
124
+ @app.route('/video_feed')
125
+ def video_feed():
126
+ return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
127
+
128
+ # NEW ROUTE: To view the database in the browser
129
+ @app.route('/logs')
130
+ def view_logs():
131
+ conn = sqlite3.connect(DB_FILE)
132
+ cursor = conn.cursor()
133
+ # Fetch all records, newest first
134
+ cursor.execute("SELECT * FROM attendance_logs ORDER BY id DESC")
135
+ records = cursor.fetchall()
136
+ conn.close()
137
+
138
+ return render_template('logs.html', records=records)
139
+
140
+ if __name__ == "__main__":
141
+ app.run(debug=True, port=5000)
attendance.db ADDED
Binary file (12.3 kB). View file
 
dataset_extracted/Lovnish Sir/Screenshot 2026-05-13 213844.png ADDED

Git LFS Details

  • SHA256: 3bbfd2d51df9de54ce26d490445f755ff0ad216b12b3dd65b8a432a315ff95da
  • Pointer size: 131 Bytes
  • Size of remote file: 167 kB
dataset_extracted/Lovnish Sir/Screenshot 2026-05-13 213854.png ADDED
dataset_extracted/Lovnish Sir/Screenshot 2026-05-13 213905.png ADDED
dataset_extracted/Lovnish Sir/Screenshot 2026-05-13 214253.png ADDED
dataset_extracted/Lovnish Sir/Screenshot 2026-05-13 214308.png ADDED
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ face_recognition @ git+https://github.com/lovnishverma/face_recognition.git
2
+ opencv-python
3
+ flask
4
+ pillow
5
+ sqlite3
6
+ pathlib
7
+ numpy
8
+ dill
9
+ gunicorn
templates/index.html ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Smart Scanner | Face Attendance</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ </head>
10
+ <body class="bg-gray-50 flex h-screen overflow-hidden text-gray-800">
11
+
12
+ <aside class="w-64 bg-slate-900 text-white flex flex-col shadow-xl">
13
+ <div class="h-16 flex items-center justify-center border-b border-slate-700">
14
+ <h1 class="text-xl font-bold tracking-wider"><i class="fa-solid fa-expand text-blue-400 mr-2"></i> VisionAI</h1>
15
+ </div>
16
+ <nav class="flex-1 px-4 py-6 space-y-2">
17
+ <a href="/" class="flex items-center px-4 py-3 bg-blue-600 text-white rounded-lg shadow-md transition-colors">
18
+ <i class="fa-solid fa-camera mr-3"></i> Live Scanner
19
+ </a>
20
+ <a href="/logs" class="flex items-center px-4 py-3 text-slate-300 hover:bg-slate-800 hover:text-white rounded-lg transition-colors">
21
+ <i class="fa-solid fa-table-list mr-3"></i> Attendance Logs
22
+ </a>
23
+ </nav>
24
+ <div class="p-4 text-xs text-slate-500 text-center border-t border-slate-800">
25
+ System v1.0.0
26
+ </div>
27
+ </aside>
28
+
29
+ <main class="flex-1 flex flex-col h-screen overflow-y-auto">
30
+ <header class="h-16 bg-white shadow-sm flex items-center justify-between px-8 z-10">
31
+ <h2 class="text-xl font-semibold text-gray-700">Entrance Checkpoint</h2>
32
+ <div class="flex items-center text-sm text-green-600 bg-green-50 px-3 py-1 rounded-full border border-green-200">
33
+ <span class="w-2 h-2 bg-green-500 rounded-full mr-2 animate-pulse"></span> System Active
34
+ </div>
35
+ </header>
36
+
37
+ <div class="p-8 flex-1 flex justify-center items-start">
38
+
39
+ <div class="bg-white rounded-2xl shadow-lg border border-gray-100 overflow-hidden w-full max-w-4xl">
40
+ <div class="bg-slate-50 px-6 py-4 border-b border-gray-100 flex justify-between items-center">
41
+ <h3 class="font-medium text-gray-700"><i class="fa-solid fa-video text-red-500 mr-2"></i> Live Camera Feed</h3>
42
+ <span class="text-xs text-gray-400">Position face in center of frame</span>
43
+ </div>
44
+
45
+ <div class="p-6 bg-gray-100 flex justify-center items-center">
46
+ <div class="relative rounded-xl overflow-hidden shadow-inner border-4 border-slate-800">
47
+ <img src="{{ url_for('video_feed') }}" class="w-full h-auto max-h-[600px] object-cover block" alt="Camera Feed">
48
+
49
+ <div class="absolute top-4 left-4 w-8 h-8 border-t-4 border-l-4 border-blue-500 opacity-70"></div>
50
+ <div class="absolute top-4 right-4 w-8 h-8 border-t-4 border-r-4 border-blue-500 opacity-70"></div>
51
+ <div class="absolute bottom-4 left-4 w-8 h-8 border-b-4 border-l-4 border-blue-500 opacity-70"></div>
52
+ <div class="absolute bottom-4 right-4 w-8 h-8 border-b-4 border-r-4 border-blue-500 opacity-70"></div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ </div>
58
+ </main>
59
+
60
+ </body>
61
+ </html>
templates/logs.html ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Database Logs | Face Attendance</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ </head>
10
+ <body class="bg-gray-50 flex h-screen overflow-hidden text-gray-800">
11
+
12
+ <aside class="w-64 bg-slate-900 text-white flex flex-col shadow-xl">
13
+ <div class="h-16 flex items-center justify-center border-b border-slate-700">
14
+ <h1 class="text-xl font-bold tracking-wider"><i class="fa-solid fa-expand text-blue-400 mr-2"></i> VisionAI</h1>
15
+ </div>
16
+ <nav class="flex-1 px-4 py-6 space-y-2">
17
+ <a href="/" class="flex items-center px-4 py-3 text-slate-300 hover:bg-slate-800 hover:text-white rounded-lg transition-colors">
18
+ <i class="fa-solid fa-camera mr-3"></i> Live Scanner
19
+ </a>
20
+ <a href="/logs" class="flex items-center px-4 py-3 bg-blue-600 text-white rounded-lg shadow-md transition-colors">
21
+ <i class="fa-solid fa-table-list mr-3"></i> Attendance Logs
22
+ </a>
23
+ </nav>
24
+ <div class="p-4 text-xs text-slate-500 text-center border-t border-slate-800">
25
+ System v1.0.0
26
+ </div>
27
+ </aside>
28
+
29
+ <main class="flex-1 flex flex-col h-screen overflow-y-auto">
30
+ <header class="h-16 bg-white shadow-sm flex items-center px-8 z-10">
31
+ <h2 class="text-xl font-semibold text-gray-700">Attendance Database</h2>
32
+ </header>
33
+
34
+ <div class="p-8">
35
+ <div class="bg-white rounded-xl shadow-md border border-gray-100 overflow-hidden">
36
+
37
+ <div class="px-6 py-4 border-b border-gray-100 flex justify-between items-center bg-slate-50">
38
+ <h3 class="font-medium text-gray-700">Recent Scans</h3>
39
+ <button onclick="window.location.reload()" class="text-sm bg-white border border-gray-300 text-gray-600 px-3 py-1.5 rounded hover:bg-gray-50 transition">
40
+ <i class="fa-solid fa-rotate-right mr-1"></i> Refresh Data
41
+ </button>
42
+ </div>
43
+
44
+ <div class="overflow-x-auto">
45
+ <table class="w-full text-left border-collapse">
46
+ <thead>
47
+ <tr class="bg-gray-50 text-gray-500 text-sm uppercase tracking-wider">
48
+ <th class="px-6 py-4 font-medium border-b border-gray-200">ID</th>
49
+ <th class="px-6 py-4 font-medium border-b border-gray-200">Employee Name</th>
50
+ <th class="px-6 py-4 font-medium border-b border-gray-200">Date Logged</th>
51
+ <th class="px-6 py-4 font-medium border-b border-gray-200">Time Logged</th>
52
+ <th class="px-6 py-4 font-medium border-b border-gray-200 text-center">Status</th>
53
+ </tr>
54
+ </thead>
55
+ <tbody class="text-sm text-gray-700 divide-y divide-gray-100">
56
+ {% for row in records %}
57
+ <tr class="hover:bg-slate-50 transition-colors">
58
+ <td class="px-6 py-4 text-gray-400">#{{ row[0] }}</td>
59
+ <td class="px-6 py-4 font-medium text-gray-900">
60
+ <div class="flex items-center">
61
+ <div class="w-8 h-8 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center font-bold mr-3">
62
+ {{ row[1][0] }} </div>
63
+ {{ row[1] }}
64
+ </div>
65
+ </td>
66
+ <td class="px-6 py-4">{{ row[2] }}</td>
67
+ <td class="px-6 py-4">{{ row[3] }}</td>
68
+ <td class="px-6 py-4 text-center">
69
+ <span class="bg-green-100 text-green-700 px-2 py-1 rounded-full text-xs font-semibold">Present</span>
70
+ </td>
71
+ </tr>
72
+ {% else %}
73
+ <tr>
74
+ <td colspan="5" class="px-6 py-12 text-center text-gray-400">
75
+ <i class="fa-solid fa-folder-open text-3xl mb-3 block"></i>
76
+ No attendance records found yet.
77
+ </td>
78
+ </tr>
79
+ {% endfor %}
80
+ </tbody>
81
+ </table>
82
+ </div>
83
+
84
+ </div>
85
+ </div>
86
+ </main>
87
+
88
+ </body>
89
+ </html>