Protect your valuables from prying eyes without remembering a combination or carrying a key; your face is the key to unlock this safe! This project will show you how to use a Raspberry Pi and Pi camera to build a safe that unlocks itself using face recognition.

The software for this project is based on algorithms provided by the OpenCV computer vision library. The Raspberry Pi is a perfect platform for this project because it has the power to run OpenCV, while being small enough to fit almost anywhere.


Project Steps

Mount the Pi

Place the Pi on the inside of the safe door to determine optimal placement away from the lock mechanism.

Use a permanent pen to mark the two hole locations for the Pi, then carefully drill 1/8″ holes.

Add standoffs and then secure the Raspberry Pi with machine screws and nuts.

Attach the servo horn

Select a servo horn and cut it down as shown.

Bend or cut the tabs in the lock mechanism so that when one is turned it does not move the other.

Place a drop of hot glue on the lock mechanism and position the servo horn in the glue before it cools.

Bend the servo bracket

This piece will function as the servo mounting bracket and must be custom fit on each specific safe.

Mark and cut a rectangle about 1½”×8″ from the sheet metal. In the center, mark out a rectangle that matches the face of your servo.

Clamp the sheet metal to a work surface and remove the center rectangle with a chisel. Clean up the edges with a file.

Test-fit your servo into bracket and the servo horn. Then bend the strip so it fits around the locking mechanism of the safe, securing your servo in place. Use a vise for support. If the metal isn’t pliable, use a small hammer to aid in the bending.

Drill a 1/8″ hole at each end.

Mount the servo

Position the servo bracket on the safe’s door and use a permanent marker to transfer the hole locations. Drill a 1/8″ hole at each mark.

Mount the servo, cont'd

Drill four 1/8″ holes on the perimeter of the servo bracket’s rectangular void.

Using zip-ties, secure the servo to the servo bracket.

Using a pop rivet gun, attach the servo bracket to the safe door.

Install the camera

Before marking the hole for the camera, make sure the camera cable reaches the intended hole location.

Drill a ¼” hole at your mark, then use a square file to smooth and shape the edges.

Adhere double-sided tape to the camera PCB and situate the camera lens through the square opening in the door.

Install the pushbutton

Drill a ½” hole for the pushbutton. The button is used to trigger the camera for access authorization.

Connect the electronics

Solder male header pins and a 10kΩ resistor to a small circular perf board. Refer to the images for wiring details.

Connect the servo’s signal line to GPIO 18 on the Raspberry Pi. Servo power and ground should be connected to the battery holder power and ground.

Connect one lead of the push button to Pi GPIO 25, and through the 10K resistor to the Pi 3.3 volt power.

Connect the other lead of the button to Pi ground.

Connect both the battery ground and Pi ground together.

Route the USB power cable

In addition to the battery pack inside the safe for the servo, the Pi needs its own power supply.

Mark and drill a hole on the rear, bottom corner of the safe large enough for a USB cable.

NOTE:The pushbutton’s red and black wires are disconnected here only for photography purposes.

Custom software installation

Run wget to download the software from Github:wget https://github.com/tdicola/pi-facerec-box/archive/master.zip

Unzip master.zip:unzip master.zip

Change the working directory:cd pi-facerec-box-master

Run the install script to set up the software dependencies:sudo ./install_dependencies.sh

NOTE:This script checks whether Raspbian needs to be upgraded to the Testing/”Jessie” version and ask for confirmation before upgrading. It takes roughly an hour to run.

Enable the Pi Camera Module

Run raspi-config, select the camera module, and enable.sudo raspi-config

When prompted, reboot the system and the camera will be enabled. This only has to be done once and will configure the GPU to enable the Pi camera unless the configuration is changed.

Train face recognition

In a terminal session on the Pi, navigate to the directory with the software and execute the following command to start the training script:

sudo python capture-positives.py

Once the training script is running you can press the button on the box to take a picture with the Pi camera. The script will attempt to detect a single face in the captured image and store it as a positive training image in the ./training/positive subdirectory.

This takes about 10 minutes to run and will train the classifier to recognize your face.

Every time an image is captured it is written to the file capture.pgm. You can view this in a graphics editor to see what the Pi camera is picking up and help ensure your face is being detected.

Use the button to capture around 5 or more images of your face as positive training data. Try to get pictures from different angles, with different lighting, etc. You can see the images I captured as positive training data above.

NOTE: If you’re curious you can also look at the ./training/negative directory to see training data from an AT&T face recognition database that will be used as examples of people who are not allowed to open the box.

Finally, once you’ve captured positive training images of your face, run the following command to process the positive and negative training images and train the face recognition algorithm (note that this training will take around 10 minutes to run):

python train.py

Configure the servo

To find the servo pulse-width values for the locked and unlocked servo positions, run:sudo python servo.py

Follow the instructions on screen and enter different pulse-width values (from 1000 to 2000) to find which values move the servo latch into a locked and unlocked position for your hardware.

Once you’ve determined the appropriate values, edit config.py and set the LOCK_SERVO_UNLOCKED and LOCK_SERVO_LOCKED values to match what you found when running servo.py.

Use it!

At this point all the configuration is done and the box is ready to go. To run your Face Recognition Treasure Safe, execute this: sudo python box.py

The box will lock itself and wait for the button to be pressed, then grab a camera image and try to recognize the face of the user. If it matches it will unlock itself. The button can be pressed to lock the box and repeat the process.


If the face recognition isn’t working well you can either take more positive training images and train it again, or tweak the POSITIVE_THRESHOLD to a higher value in the config.py file to make it less sensitive.

If for some reason you can’t get it to recognize you at all and you need to force the box unlocked, run servo.py again and input the unlocked servo position.