SUSI MagicMirror Module is a module designed for MagicMirror that helps you get SUSI Intelligence right on your Mirror. You may then ask it questions in the way the Queen in the tale “Snow White and the Seven Dwarfs” asked. One key feature that was missing in it was that the user could be recognized and queries he asked are answered in a personalized manner. This could be achieved if SUSI uses the account dedicated to that person to answer his/her queries. Thus, we need an authentication support.
The authentication on MagicMirror is not as trivial as on Web, Android and iOS client apps for SUSI. Key difference here is that user, while using the MagicMirror, does not have access to a keyboard and mouse. Therefore, we cannot simply ask him to input email and password. Furthermore, a MagicMirror installed in your home may be used by several members of your family. Thus, we need a mechanism to tell each user apart.
This was done with the help of MMM-Facial-Recognition module which brings face recognition support to MagicMirror.
MMM-Facial-Recognition module provides support for recognizing multiple faces and setting the modules on the mirror screen based on the user facing the mirror using OpenCV. Other modules can also take advantage of knowing about the person with the help of module notifications sent by MMM-Facial-Recognition Module.
To add Face based Authentication support to SUSI with MMM-Facial-Recognition, we first need to add the latter to MagicMirror. It can be added easily by first cloning the repository to modules directory of MagicMirror.
$ git clone https://github.com/paviro/MMM-Facial-Recognition
Go inside the directory and install dependencies
$ npm run install
Now, we need to train a model for the users who are going to use the MagicMirror. This can be done by the MMM-Facial-Recognition-Tools. This tool captures photos from the camera and trains a model for Face Recognition. The guide to use the tool is very well written on the Github page so I am not including it here. After training for faces of the users, you will get a training.xml file. This file contains the information about the facial features of every person so that it can tell users apart. You need to copy this file to the Module directory for MMM-Facial-Recognition module i.e. MagicMirror/module/MMM-Facial-Recognition.
After this we can add the module to MagicMirror, by modifying the config file. Add the following lines in the config file (config.js). Copy and paster username array from the training script in the asked position.
{ module: 'MMM-Facial-Recognition', config: { // 1=LBPH | 2=Fisher | 3=Eigen recognitionAlgorithm: 1, lbphThreshold: 50, fisherThreshold: 250, eigenThreshold: 3000, useUSBCam: true, trainingFile: 'modules/MMM-Facial-Recognition/training.xml', interval: 2, logoutDelay: 15, // Array with usernames (copy and paste from training script) users: [], defaultClass: "default", everyoneClass: "everyone", welcomeMessage: true } }
You may configure the show and hide behavior of modules based on the person. Find more information about it in the official guide on the repository. After setting up it recognizes and shows welcome message to each user like this.
Now, we need to integrate this module to SUSI for Authentication. To do this first of all we make config for SUSI MagicMirror Module to add user authentication along with their name registered on Facial Recognition Module. It can be done by adding SUSI MagicMirror module config file (config.js) like below.
{ module: "MMM-SUSI-AI", position: "top_center", config: { hotword: "Susi", users: [{ face_recognition_username: "Pranjal Paliwal", email: "paliwal.pranjal83@gmail.com", password: "PASSWORD_HERE" }, { face_recognition_username: "Chashmeet Singh", email: "chashmeetsingh@gmail.com", password: "PASSWORD_HERE" }], }, classes: 'default everyone' },
Now, we need to know that which user is facing the mirror at that time. MMM-Facial-Recognition sends a module notification when a user is detected. The format of the notification is
sender : MMM-Facial-Recognition type: CURRENT_USER payload: Name of the User / None
If the user is recognized we get the name of the User as payload. If no face could be identified, we get None as payload.
We need to find out user based on the user’s name registered in the module. We already have that parameter in the user object in users array in config for SUSI MagicMirror Module (MMM-SUSI-AI). We can iterate over users array to find out the user facing the mirror on receiving the notification. In SUSI Chat API, users are identified with the help of an access token. On identifying a user, we perform login with the help of SignInService to obtain token for him. The implementation of the above task can be understood via the following snippet.
public receivedNotification(type: NotificationType, payload: any): void { if (type === "CURRENT_USER") { console.log("Current User", payload); if (payload === "None") { this.configService.Config.accessToken = null; } else { console.log(this.config.users); for (const user of this.config.users) { if (user.face_recognition_username === payload) { if (isUndefined(this.signInService)) { this.signInService = new SignInService(user); } this.signInService.updateUser(user).then((token) => { console.log("updating token for " + user); this.configService.Config.accessToken = token; }); return; } } this.configService.Config.accessToken = null; } } }
Explanation: In the receivedNotification method of the Main Component of SUSI MagicMirror module, we check if notification is of type CURRENT_USER. If the payload is None, we set access-token to null. If a user is identified, we check if it is contained in the users array. If present, we perform Sign In to SUSI Server for that user and store the access token obtained in the Config.
Now, every time a recognized my Facial Recognition module, the access token is updated in the config. We use the accessToken field in Config to send the message to SUSI Chat API. The implementation of it can be referred below.
public async askSusi(query: string): Promise<any> { const accessToken = this.configService.Config.accessToken; const requestString: string = (!isUndefined(accessToken) && accessToken != null) ? `http://api.susi.ai/susi/chat.json?q=${query}&access_token=${accessToken}` : `http://api.susi.ai/susi/chat.json?q=${query}`; const response = await WebRequest.get(requestString); return JSON.parse(response.content); }
By using the above approach, the request sent to SUSI Server are identified according to the person facing the mirror. SUSI can, therefore, answer according to the user. In this way, authentication with Face Recognition is performed in the SUSI Magic Mirror Module.
Resources
- MagicMirror Facial Recognition Module: https://github.com/paviro/MMM-Facial-Recognition
- Facial Recognition Tools to train model: https://github.com/paviro/MMM-Facial-Recognition-Tools
- OpenCV Face Recognition with Python: http://hanzratech.in/2015/02/03/face-recognition-using-opencv.html
- Magic Mirror Module building guide: https://github.com/MichMich/MagicMirror/tree/master/modules