Compare commits

...

48 Commits
0.2 ... master

Author SHA1 Message Date
fb84cf1bb5 Formatting 2019-01-22 20:28:13 +03:00
a82b98154f Parenthases 2019-01-18 02:30:19 +03:00
4441616ef1 futre function 2018-12-12 21:59:05 +03:00
96c2d4ccc3 semi colon 2018-12-12 21:56:33 +03:00
00b476ee0b Merge branch 'master' of https://heshamgit.ddns.net/Hesham/FaceRecognition-python 2018-12-12 21:35:56 +03:00
c43128f6f5 Update 'README.md' 2018-12-12 21:16:24 +03:00
48dbd127a2 splitting into functions 2018-12-06 18:01:53 +03:00
HeshamTB
e6de56c167 unknown folder 2018-12-04 20:31:23 +00:00
883d8a6697 Added png to gitignore 2018-12-04 22:49:02 +03:00
HeshamTB
d11220d70c added date for unknown faces 2018-12-04 19:03:00 +00:00
29fa3a3335 Merge branch 'screen-shot-mod' of Hesham/FaceRecognition-python into master 2018-12-04 20:55:02 +03:00
HeshamTB
ef8332f253 Exception handle 2018-12-04 17:38:13 +00:00
HeshamTB
3660a2e9eb save unknown & exception handling & performance 2018-12-04 17:21:15 +00:00
HeshamTB
7d37fa8d91 Celebration 2018-11-30 21:05:38 +00:00
HeshamTB
8ff03abb53 merge 2018-11-30 11:11:40 +00:00
HeshamTB
c6c7a80cee Performace enhancment 2018-11-30 10:54:17 +00:00
HeshamTB
e773fc6a8e exception handling 2018-11-30 10:48:06 +00:00
HeshamTB
4f88480583 exception handling 2018-11-30 10:45:40 +00:00
HeshamTB
a8990873ba Updated if person 2018-11-30 10:37:53 +00:00
HeshamTB
8e351a1df0 update 2018-11-30 10:13:21 +00:00
HeshamTB
30c8e4b074 Working with buzzer 2018-11-24 16:58:35 +00:00
03490f1a25 Merge branch 'perf' of Hesham/FaceRecognition-python into master 2018-11-24 18:22:08 +03:00
HeshamTB
690ca3493f face files 2018-11-24 14:48:03 +00:00
HeshamTB
6e8adb3bb1 ard not working 2018-11-24 14:39:49 +00:00
HeshamTB
6ac1b416c0 added names.json 2018-11-23 19:28:15 +00:00
HeshamTB
02930cd5a2 skipped saving img.jpg 2018-11-23 13:23:21 +00:00
a0cd73588c Merge branch 'trainer' of Hesham/FaceRecognition-python into master 2018-11-23 16:09:27 +03:00
HeshamTB
9c6e3999b5 updated trainer 2018-11-23 13:02:32 +00:00
HeshamTB
202a3e81d8 trainer rename 2018-11-23 08:26:31 +00:00
HeshamTB
a8d42397f2 import sys & waitkey 2018-11-23 08:21:11 +00:00
HeshamTB
814d3d2dd1 working trainer 2018-11-22 10:14:28 +00:00
HeshamTB
2adae62a29 yet to be tested 2018-11-22 06:14:31 +00:00
HeshamTB
f7faddb00d face File 2018-11-22 05:43:17 +00:00
HeshamTB
ecd7ad2c48 Updated-Teted Trainer 2018-11-22 05:41:03 +00:00
HeshamTB
50bb02ab67 Working caprue func 2018-11-22 02:11:54 +00:00
3f710e9ab3 takePhotos file 2018-11-22 04:27:34 +03:00
9f75eda8a5 to be tested 2018-11-22 03:56:09 +03:00
20270cc73a Merge branch 'training' 2018-11-22 02:38:17 +03:00
ac35a52854 Merge branch 'working-single' 2018-11-22 02:28:17 +03:00
b0ae2b55a5 Merge branch 'Exception-handling' into working-single 2018-11-22 02:19:49 +03:00
8240a81988 Update gitignore 2018-11-22 01:35:41 +03:00
fc85335b59 Update 'README.md' 2018-11-20 09:14:20 +03:00
9b5c14197f Update 'README.md' 2018-11-20 09:14:06 +03:00
9461e746c8 Add 'README.md' 2018-11-20 09:13:45 +03:00
HeshamTB
41cd83cc1a working state - with other Project 2018-11-19 13:12:30 +00:00
HeshamTB
6b1ac5e3bc Working with Hesham-Saeed 2018-11-18 13:22:08 +00:00
4cc4d6e8be sln files 2018-11-18 12:48:59 +03:00
547a5ee001 For imports & edit gitignore 2018-11-18 12:47:06 +03:00
16 changed files with 478668 additions and 96 deletions

5
.gitignore vendored
View File

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

17
.project Normal file
View File

@ -0,0 +1,17 @@
<?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>

5
.pydevproject Normal file
View File

@ -0,0 +1,5 @@
<?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

@ -0,0 +1,26 @@
<?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

@ -0,0 +1,23 @@

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

1
README.md Normal file
View File

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

98
SensorsArd/SensorsArd.ino Normal file
View File

@ -0,0 +1,98 @@
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;
}

View File

@ -1,28 +0,0 @@
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))

68955
faces/Hesham-Saeed Normal file

File diff suppressed because it is too large Load Diff

68955
faces/Hesham-Saeed2 Normal file

File diff suppressed because it is too large Load Diff

73686
faces/h Normal file

File diff suppressed because it is too large Load Diff

266660
faces/m Normal file

File diff suppressed because it is too large Load Diff

1
faces/names.json Normal file
View File

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

171
main.py
View File

@ -1,18 +1,29 @@
from time import sleep
from picamera import PiCamera
from io import BytesIO
import cv2
import numpy as np
from PIL import Image
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 Camera and cascade components..')
print('Initilizing..')
try:
camera = PiCamera()
camera.resolution = (640, 480)
sleep(2)
sleep(0.2)
print('[ OK ] Camera')
except:
print('[ Error ] Can not initialize PiCamera')
@ -25,79 +36,105 @@ 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
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
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:
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:
cv2.imwrite('train/'+str(j)+'.jpg',roi_color)
except Exception as ex:
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')
print(ex)
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
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 ..')
def train(number):
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')
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()

133
trainer.py Normal file
View File

@ -0,0 +1,133 @@
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()

Binary file not shown.