Smart Attendance - RFID and face recognition

Hello!

I’m currently working on a project. The project is smart attendance. The main idea of the project is that we’re going to be using RFID and esp32 camera. So for example when a student has a class, instead of teacher taking the attendance manually they can scan their RFID and then they have to go near the camera for face recognition. After the face is recognized and the captured image matches the ID of the RFID, the door opens.

I have made a code for the RFID where when the person scans the card, the information related to the person are stored in PhpMyAdmin (using python) and these information include the UID and the time that the person has entered. The following are the codes that have been used:

Arduino IDE:


#include <SPI.h>
#include<MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
#define No_Of_Card 3


MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
byte id[No_Of_Card][4] = {
  {220, 140, 225, 110},          //RFID NO-1
  {124, 131, 252, 122},          //RFID NO-2
  {213, 237, 169, 54}           //RFID NO-3
};
byte id_temp[3][3];
byte i;
int j = 0;

void setup() {
  Serial.begin(9600);

  SPI.begin();
  rfid.PCD_Init();
  for (byte i = 0; i < 6; i++)
  {
    key.keyByte[i] = 0xFF;
  }
}
//------------------------------------------------------------------------------


/* Infinite Loop */
void loop()
{ int m = 0;
  if (!rfid.PICC_IsNewCardPresent())
    return;
  if (!rfid.PICC_ReadCardSerial())
    return;
  for (i = 0; i < 4; i++)
  {
    id_temp[0][i] = rfid.uid.uidByte[i];
    delay(50);
  }

  for (i = 0; i < No_Of_Card; i++)
  {
    if (id[i][0] == id_temp[0][0])
    {
      if (id[i][1] == id_temp[0][1])
      {
        if (id[i][2] == id_temp[0][2])
        {
          if (id[i][3] == id_temp[0][3])
          {
            Serial.println("Card detected:");
            for (int s = 0; s < 4; s++)
            {
              Serial.print(rfid.uid.uidByte[s]);
            }
            Serial.print(" ");
            Sending_To_db();
            j = 0;

            rfid.PICC_HaltA(); rfid.PCD_StopCrypto1();   return;
          }
        }
      }
    }
    else
    { j++;
      if (j == No_Of_Card)
      {
        Serial.println("Card detected:");
        for (int s = 0; s < 4; s++)
        {
          Serial.print(rfid.uid.uidByte[s]);
        }
        Serial.print(" ");
        Sending_To_db();
        j = 0;
      }
    }
  }

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

void Sending_To_db()
{
  if (j != No_Of_Card)
  {
    Serial.print('1');
    Serial.print(" ");
  }
  else
  {
    Serial.print('0');
    Serial.print(" ");
  }
}

Python:

import serial 
import MySQLdb
import time

dbConn = MySQLdb.connect("localhost","root","","rfid_read") or die ("could not connect to database")
cursor = dbConn.cursor()
device = 'COM4' 
try:
  print "Trying...",device arduino = serial.Serial(device, 9600)
except: 
  print "Failed to connect on",device
while True:
    time.sleep(1)
    try:
        data=arduino.readline()
        print data
        pieces=data.split(" ")
        try:
            cursor=dbConn.cursor()
            cursor.execute("""INSERT INTO Attendance (#,Date,Time,IUD,Name,Allowed) VALUES (NULL,%s,%s)""", (pieces[0],pieces[1]))
            dbConn.commit()
            cursor.close()
        except MySQLdb.IntegrityError:
            print "failed to insert data"
        finally:
            cursor.close()
    except:
        print "Processing"

Now, the second part is where I’m stuck. First, how do you do face recognition? I’ve used the following code below, but it does not detect the face and I can’t enroll it:

#include "esp_camera.h"
#include <WiFi.h>

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM

#include "camera_pins.h"

const char* ssid = "*********";
const char* password = "*********";

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;

  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if (psramFound()) {
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);

#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10000);
}

As a result of the code, you’ll get an IP address that you can paste in your browser to start the stream. Now after enrolling, detecting and recognizing the face can we somehow connect the picture to the RFID UID? If so, how?

Also, is there and easier way to detect and recognize the face? For example, using python and OpenCV?

If there are any suggestions, recommendations or improvements about how we can connect the RFID and face recognition please let me know.

Thank you.

Here's the first hit from the search engine:

There are many examples of this already available. I recommend trying one just the way it is and integrate your RFID into that, instead of the other way round.