Compare commits

..

No commits in common. "master" and "0.2" have entirely different histories.
master ... 0.2

16 changed files with 96 additions and 478668 deletions

5
.gitignore vendored
View File

@ -1,4 +1 @@
*.[Jj][Pp][Gg]
*.pyc
*.suo
*.png
*.[Jj][Pp][Gg]

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>FaceRecognition-python</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.python.pydev.PyDevBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.python.pydev.pythonNature</nature>
</natures>
</projectDescription>

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?><pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
</pydev_project>

View File

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{c5bcf1ad-e7a4-41be-8f0e-28db4b669eec}</ProjectGuid>
<ProjectHome />
<StartupFile>main.py</StartupFile>
<SearchPath />
<WorkingDirectory>.</WorkingDirectory>
<OutputPath>.</OutputPath>
<ProjectTypeGuids>{888888a0-9f3d-457c-b088-3a5042f75d52}</ProjectTypeGuids>
<LaunchProvider>Standard Python launcher</LaunchProvider>
<InterpreterId />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Debug'" />
<PropertyGroup Condition="'$(Configuration)' == 'Release'" />
<PropertyGroup>
<VisualStudioVersion Condition=" '$(VisualStudioVersion)' == '' ">10.0</VisualStudioVersion>
</PropertyGroup>
<ItemGroup>
<Compile Include="main.py" />
<Compile Include="Trainer.py" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets" />
</Project>

View File

@ -1,23 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.102
MinimumVisualStudioVersion = 10.0.40219.1
Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "FaceRecognition-python", "FaceRecognition-python.pyproj", "{C5BCF1AD-E7A4-41BE-8F0E-28DB4B669EEC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C5BCF1AD-E7A4-41BE-8F0E-28DB4B669EEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C5BCF1AD-E7A4-41BE-8F0E-28DB4B669EEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {29568353-A5E1-4ECF-9F70-31492869FB0D}
EndGlobalSection
EndGlobal

View File

@ -1 +0,0 @@
### Python code to run in Raspberry Pi with PiCamera to recognize certin faces.

View File

@ -1,98 +0,0 @@
const int trigPin = 9;
const int echoPin = 10;
const int ProxSensor = 2;
const int relayPin = 12;
const int buzzerPin = 3;
int inputVal = 0;
long duration;
int distance;
boolean IROK = false;
boolean UltraOK = false;
char pi = 'N';
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ProxSensor, INPUT);
digitalWrite(buzzerPin, LOW);
digitalWrite(relayPin, LOW);
Serial.begin(9600);
}
void loop() {
IROK = false;
UltraOK = false;
pi = 'N';
distance = readDistance();
if (distance < 70) UltraOK = true;
else UltraOK = false;
if (digitalRead(ProxSensor) == LOW ) IROK = true;
else IROK = false;
if (Serial.available() > 0) {
pi = Serial.read();
}
delay(500);
Serial.println(pi);
Serial.println(IROK);
Serial.println(UltraOK);
if (IROK && UltraOK && pi == 'o') {
openShifter();
}
IROK = false;
UltraOK = false;
}
void openShifter() {
digitalWrite(relayPin, HIGH);
playBuzzer(300, true);
delay(7000);
digitalWrite(relayPin, LOW);
IROK = false;
UltraOK = false;
pi = 'N';
serialFlush();
}
void serialFlush() {
while (Serial.available() > 0) {
char t = Serial.read();
}
}
void playBuzzer(int time, boolean ok) {
tone(buzzerPin, 3000);
delay(time / 2);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 3000);
delay(time / 2);
noTone(buzzerPin);
}
int readDistance() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
return duration * 0.034 / 2;
}

28
Trainer.py Normal file
View File

@ -0,0 +1,28 @@
from time import sleep
from io import BytesIO
import cv2
import numpy as np
def train(label, path):
try:
face_recognizer = cv2.createLBPHFaceRecognizer()
face_recognizer.load('/faces/hesham-saeed2')
except:
print('[ Error ] Problem in init/loading LBPHfacerecognizer')
images = []
labels = []
image_names = os.listdir(path)
for image_name in image_names:
if image_name.startswith('.'):
continue;
image_path = train_path + image_name
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
images.append(gray[y:y+h, x:x+w])
labels.append(label)
face_recognizer.train(images, np.array(labels))

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

73686
faces/h

File diff suppressed because it is too large Load Diff

266660
faces/m

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
["", "Hesham", "Aidarous"]

171
main.py
View File

@ -1,29 +1,18 @@
from time import sleep
from PIL import Image
from picamera import PiCamera
from io import BytesIO
import cv2
import numpy as np
import os
import serial
import sys
import json
import datetime
try:
import numpy as np
from picamera import PiCamera
from picamera.array import PiRGBArray
import cv2
except Exception as ex:
print('[ Error ] some depandincies are missing\n'+ str(ex.args))
sys.exit()
def init():
go = True
print('Initilizing..')
print('Initilizing Camera and cascade components..')
try:
camera = PiCamera()
camera.resolution = (640, 480)
sleep(0.2)
sleep(2)
print('[ OK ] Camera')
except:
print('[ Error ] Can not initialize PiCamera')
@ -36,105 +25,79 @@ def init():
except:
print('[ Error ] Can not load cascade File')
go = False
try:
os.mkdir('unknown')
except OSError as ex:
print('Found (unknown) folder')
if (go):
print('Starting Photo loop..')
print('Known people are '+str(loadNames()))
start(camera, face_cascade)
else:
print('closing')
def start( camera, face_cascade):
j = 0
rawCapture = PiRGBArray(camera)
face_recognizer = cv2.createLBPHFaceRecognizer()
face_recognizer.load('faces/h')
names = loadNames()
while 1:
try:
camera.capture(rawCapture, format="bgr")
except:
print('[ Error ] Can not capture image. Restarting..')
init()
img = rawCapture.array
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3,5)
i = 0
for (x,y,w,h) in faces:
i += 1
j += 1
try:
while True:
#try:
camera.capture('img.jpg')
img = cv2.imread('img.jpg',1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
i = 0;
for (x,y,w,h) in faces:
i = i + 1
j = j + 1
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
person = recognize(roi_gray, face_recognizer, names)
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),1)
cv2.putText(img, person, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.7, (0,255,0), 2)
except:
print('[ Error ] Recognition fail')
if person == 'unknown':
print('Found unknown person')
try:
RGBImage = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
image = Image.fromarray(RGBImage)
image.save('unknown/'+str(datetime.datetime.now())+'.png')
except Exception as ex :
print('[ Error ] Saving unkown fail')
cv2.imwrite('train/'+str(j)+'.jpg',roi_color)
except Exception as ex:
print(ex)
else:
print('Found '+person)
OpenShifter()
cv2.imshow('image',img)
cv2.waitKey(1)
rawCapture.truncate(0)
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
def recognize(image,face_recognizer, names):
try:
img = image.copy()
label= face_recognizer.predict(img)
except:
print('[ Error ] Error in Recognize() function')
if label[1] > 70:
print(str(label))
return 'unknown'
else:
print(str(label) + ' >>'+names[label[0]])
return names[label[0]]
#def DrawSquares(image,gray,faces,color):
def OpenShifter():
try:
ser = serial.Serial('/dev/ttyUSB0',9600)
ser.open()
ser.write('o')
ser.close()
except Exception as ex:
print('[ Error ] Can not connect to Arduino at /dev/ttyUSB0 ..')
try:
ser = serial.Serial('/dev/ttyUSB1',9600)
ser.open()
ser.write('o')
ser.close()
except:
print('[ Error ] Can not connect to Arduino at /dev/ttyUSB1 ..')
print('Drawing on face ', i)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.putText(img, recognize(roi_gray), (x, y), cv2.FONT_HERSHEY_PLAIN, 1.7, (255, 0, 0), 2)
cv2.imshow('image',img)
cv2.waitKey(100)
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
#except:
#print('[ Error ] Unexpected exception')
#print('Closing')
#break
def loadNames():
try:
with open("faces/names.json", "r") as read_file:
data = json.load(read_file)
return list(data)
except:
print('[ Error ] Error in loadNames() function')
def train(number):
train_path = 'train/'
face_recognizer = cv2.createLBPHFaceRecognizer()
images = []
labels = []
image_names = os.listdir(train_path)
for image_name in image_names:
if image_name.startswith("."):
continue;
image_path = train_path + image_name
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
images.append(gray)
labels.append(number)
print('training')
face_recognizer.train(images, np.array(labels))
face_recognizer.save('faces/hesham')
def recognize(image):
subjects = ['','Hesham','Unknown']
face_recognizer = cv2.createLBPHFaceRecognizer()
face_recognizer.load('faces/hesham')
img = image.copy()
label= face_recognizer.predict(img)
if label[0] == 1:
return 'Hesham'
else:
return 'Unknown'
init()

View File

@ -1,133 +0,0 @@
from time import sleep
from io import BytesIO
from picamera import PiCamera
import cv2
import numpy as np
import os
import sys
import json
picCount = 0
new = False
def start():
print('Starting training..')
label = int(input('Label (Integer): '))
name = str(raw_input('Person name: '))
picCount = int(input('Number of Photos: '))
global new
new = promptNew()
if new:
newFileName = str(raw_input('New File name: '))
oldFileName = newFileName
else:
print('Found in faces:')
print(os.listdir('faces/'))
oldFileName = str(raw_input('Old File name: '))
newFileName = str(raw_input('New File name: '))
clearTrainFolder()
dum = input('Press any key to start capture..')
capture(picCount)
addPerson(label, newFileName, oldFileName)
addName(name)
def clearTrainFolder():
print('clearing train folder')
filelist = [f for f in os.listdir('train/') if f.endswith(".jpg")]
for f in filelist:
os.remove(os.path.join('train/', f))
def addPerson(label, newFileName, oldFileName):
try:
# faceFilePath = '/faces/hesham-saeed2'
faceFile = 'faces/' + oldFileName
face_recognizer = cv2.createLBPHFaceRecognizer()
global new
if new:
print('new file. skipping load function')
else:
print('loading old file')
face_recognizer.load(faceFile)
except:
print('[ Error ] Problem in init/loading LBPHfacerecognizer')
sys.exit()
images = []
labels = []
image_names = os.listdir('train/')
for image_name in image_names:
if image_name.startswith('.'):
continue;
image_path = 'train/' + image_name
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
images.append(gray[y:y + h, x:x + w])
labels.append(label)
cv2.imshow('face', gray[y:y + h, x:x + w])
cv2.waitKey(100)
print('Learning ' + image_name)
if new:
face_recognizer.train(images, np.array(labels))
else:
face_recognizer.update(images, np.array(labels))
face_recognizer.save('faces/' + newFileName)
print('Updated and saved file in faces/' + newFileName)
def capture(count):
try:
print('Initializing camera')
camera = PiCamera()
camera.resolution = (640, 480)
print('[ OK ] Camera')
sleep(2)
except:
print('[ Error ] Can not initialize PiCamera')
sys.exit()
for i in range(1, count + 1):
pic = 'train/' + str(i) + '.jpg'
camera.capture(pic)
photo = cv2.imread(pic, 1)
cv2.imshow('Photo', photo)
print('Captured ' + str(i) + '\nPath ' + pic)
cv2.waitKey(100)
sleep(1)
cv2.destroyAllWindows()
print('Done!')
def promptNew():
filemode = raw_input('Make new File? (y/n): ')
if filemode == 'y':
return True
elif filemode == 'n':
return False
else:
print('incorrect input')
promptNew()
def addName(newName):
with open("faces/names.json", "r") as read_file:
exist = False
namesJson = json.load(read_file)
names = list(namesJson)
i = 0
for name in names:
if newName == name:
exist = True
print('name already in names list with index ' + str(i))
i += 1
if not exist:
names.append(newName)
print('Added ' + newName + 'to names.json file')
with open("faces/names.json", "w") as write_file:
json.dump(names, write_file)
start()

BIN
untitled.pyc Normal file

Binary file not shown.