Toggle navigation
Toggle navigation
This project
Loading...
Sign in
2020-1-capstone-design1
/
KHY_Project1
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Authored by
Graduate
2020-06-17 16:27:48 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
2895d221aa3b2de18b2fd0b915922897549e9b20
2895d221
1 parent
3aaf4258
Modify register.py
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
174 additions
and
10 deletions
client/client.py
client/client(window).py → client/legacy/client(window)0617.py
client/legacy/clinet(window)-06042035.py → client/legacy/clinet(window)0604.py
client/legacy/clinet(window)200605.py → client/legacy/clinet(window)0605(2).py
register/register.py
client/client.py
0 → 100644
View file @
2895d22
##################################################
#1. webcam에서 얼굴을 인식합니다.
#2. 얼굴일 확률이 97% 이상이고 영역이 15000 이상인 이미지를 서버에 전송
##################################################
import
tkinter
as
tk
import
tkinter.font
import
tkinter.messagebox
import
threading
import
torch
import
numpy
as
np
import
cv2
import
asyncio
import
websockets
import
json
import
os
import
timeit
import
base64
import
time
from
PIL
import
Image
,
ImageTk
from
io
import
BytesIO
import
requests
from
models.mtcnn
import
MTCNN
device
=
torch
.
device
(
'cuda:0'
if
torch
.
cuda
.
is_available
()
else
'cpu'
)
print
(
'Running on device: {}'
.
format
(
device
))
mtcnn
=
MTCNN
(
keep_all
=
True
,
post_process
=
True
,
device
=
device
)
uri
=
'ws://169.56.95.131:8765'
class
Register
(
tk
.
Frame
):
def
__init__
(
self
,
parent
,
*
args
,
**
kwargs
):
tk
.
Frame
.
__init__
(
self
,
parent
,
*
args
,
**
kwargs
)
# URI
self
.
uri
=
'ws://169.56.95.131:8765'
# Pytorch Model
self
.
device
=
device
=
torch
.
device
(
'cuda:0'
if
torch
.
cuda
.
is_available
()
else
'cpu'
)
self
.
mtcnn
=
MTCNN
(
keep_all
=
True
,
device
=
device
)
# OpenCV
self
.
cap
=
cv2
.
VideoCapture
(
0
,
cv2
.
CAP_DSHOW
)
self
.
cam_width
=
640
self
.
cam_height
=
480
self
.
cap
.
set
(
3
,
self
.
cam_width
)
self
.
cap
.
set
(
4
,
self
.
cam_height
)
# tkinter GUI
self
.
width
=
740
self
.
height
=
640
self
.
parent
=
parent
self
.
parent
.
geometry
(
"
%
dx
%
d+100+100"
%
(
self
.
width
,
self
.
height
))
self
.
pack
()
self
.
create_widgets
()
# Event loop and Thread
self
.
event_loop
=
asyncio
.
new_event_loop
()
self
.
thread
=
threading
.
Thread
(
target
=
self
.
mainthread
)
self
.
thread
.
start
()
def
create_widgets
(
self
):
image
=
np
.
zeros
([
self
.
cam_height
,
self
.
cam_width
,
3
],
dtype
=
np
.
uint8
)
image
=
Image
.
fromarray
(
image
)
image
=
ImageTk
.
PhotoImage
(
image
)
font
=
tk
.
font
.
Font
(
family
=
"맑은 고딕"
,
size
=
15
)
self
.
alert
=
tk
.
Label
(
self
,
text
=
"출석시스템"
,
font
=
font
)
self
.
alert
.
grid
(
row
=
0
,
column
=
0
,
columnspan
=
20
)
self
.
label
=
tk
.
Label
(
self
,
image
=
image
)
self
.
label
.
grid
(
row
=
1
,
column
=
0
,
columnspan
=
20
)
self
.
log
=
tk
.
Text
(
self
)
self
.
log
.
grid
(
row
=
2
,
column
=
0
,
columnspan
=
20
)
self
.
quit
=
tk
.
Button
(
self
,
text
=
"나가기"
,
fg
=
"red"
,
command
=
self
.
stop
)
self
.
quit
.
grid
(
row
=
5
,
column
=
10
)
def
detect_face
(
self
,
frame
):
results
=
self
.
mtcnn
.
detect
(
frame
)
faces
=
self
.
mtcnn
(
frame
,
return_prob
=
False
)
image_list
=
[]
face_list
=
[]
if
results
[
1
][
0
]
==
None
:
return
[],
[]
for
box
,
face
,
prob
in
zip
(
results
[
0
],
faces
,
results
[
1
]):
if
prob
<
0.97
:
continue
# for debug
# print('face detected. prob:', prob)
x1
,
y1
,
x2
,
y2
=
box
if
(
x2
-
x1
)
*
(
y2
-
y1
)
<
15000
:
# 얼굴 해상도가 너무 낮으면 무시
self
.
alert
.
config
(
text
=
"카메라에 더 가까이 접근해주세요."
,
fg
=
"red"
)
self
.
alert
.
update
()
continue
image
=
frame
image_list
.
append
(
image
)
# MTCNN 데이터 저장
face_list
.
append
(
face
.
numpy
())
return
face_list
,
image_list
def
mainthread
(
self
):
t
=
threading
.
currentThread
()
asyncio
.
set_event_loop
(
self
.
event_loop
)
while
getattr
(
t
,
"do_run"
,
True
):
ret
,
frame
=
self
.
cap
.
read
()
# model에 이용하기 위해 convert
converted
=
cv2
.
cvtColor
(
frame
,
cv2
.
COLOR_BGR2RGB
)
face_list
,
image_list
=
self
.
detect_face
(
converted
)
# show image
image
=
Image
.
fromarray
(
converted
)
image
=
ImageTk
.
PhotoImage
(
image
)
self
.
label
.
configure
(
image
=
image
)
self
.
label
.
image
=
image
# kind of double buffering
# 얼굴이 인식되면 요청
if
face_list
:
self
.
event_loop
.
run_until_complete
(
self
.
send_face
(
face_list
,
image_list
))
async
def
wait
(
self
,
n
):
await
asyncio
.
sleep
(
n
)
async
def
send_face
(
self
,
face_list
,
image_list
):
try
:
async
with
websockets
.
connect
(
uri
)
as
websocket
:
for
face
,
image
in
zip
(
face_list
,
image_list
):
#type: np.float32
send
=
json
.
dumps
({
'action'
:
'verify'
,
'MTCNN'
:
face
.
tolist
()})
await
websocket
.
send
(
send
)
recv
=
await
websocket
.
recv
()
data
=
json
.
loads
(
recv
)
if
data
[
'status'
]
==
'success'
:
# 성공
self
.
log
.
insert
(
tkinter
.
CURRENT
,
data
[
'student_id'
]
+
'is attend'
)
self
.
log
.
insert
(
tkinter
.
CURRENT
,
'
\n
'
)
else
:
self
.
log
.
insert
(
tkinter
.
CURRENT
,
'verification failed:'
+
data
[
'status'
])
if
data
[
'status'
]
==
'failed'
:
send
=
json
.
dumps
({
'action'
:
'save_image'
,
'image'
:
image
.
tolist
()})
except
Exception
as
e
:
self
.
log
.
insert
(
tkinter
.
CURRENT
,
e
)
self
.
log
.
insert
(
tkinter
.
CURRENT
,
'
\n
'
)
def
stop
(
self
):
self
.
thread
.
do_run
=
False
# self.thread.join() # there is a freeze problem
self
.
event_loop
.
close
()
self
.
cap
.
release
()
self
.
parent
.
destroy
()
if
__name__
==
'__main__'
:
root
=
tk
.
Tk
()
Register
(
root
)
root
.
mainloop
()
client/
client(window)
.py
→
client/
legacy/client(window)0617
.py
View file @
2895d22
File moved
client/legacy/clinet(window)
-06042035
.py
→
client/legacy/clinet(window)
0604
.py
View file @
2895d22
File moved
client/legacy/clinet(window)
200605
.py
→
client/legacy/clinet(window)
0605(2)
.py
View file @
2895d22
File moved
register/register.py
View file @
2895d22
...
...
@@ -27,15 +27,6 @@ class Register(tk.Frame):
def
__init__
(
self
,
parent
,
*
args
,
**
kwargs
):
tk
.
Frame
.
__init__
(
self
,
parent
,
*
args
,
**
kwargs
)
# tkinter GUI
self
.
width
=
740
self
.
height
=
640
self
.
parent
=
parent
self
.
parent
.
geometry
(
"
%
dx
%
d+100+100"
%
(
self
.
width
,
self
.
height
))
self
.
pack
()
self
.
create_widgets
()
# URI
self
.
uri
=
'ws://169.56.95.131:8765'
...
...
@@ -56,6 +47,14 @@ class Register(tk.Frame):
self
.
face_list
=
[]
self
.
image_list
=
[]
# tkinter GUI
self
.
width
=
740
self
.
height
=
640
self
.
parent
=
parent
self
.
parent
.
geometry
(
"
%
dx
%
d+100+100"
%
(
self
.
width
,
self
.
height
))
self
.
pack
()
self
.
create_widgets
()
# Event loop and Thread
# self.event_loop = asyncio.new_event_loop()
self
.
thread
=
threading
.
Thread
(
target
=
self
.
mainthread
)
...
...
@@ -63,7 +62,7 @@ class Register(tk.Frame):
def
create_widgets
(
self
):
image
=
np
.
zeros
([
480
,
640
,
3
],
dtype
=
np
.
uint8
)
image
=
np
.
zeros
([
self
.
cam_height
,
self
.
cam_width
,
3
],
dtype
=
np
.
uint8
)
image
=
Image
.
fromarray
(
image
)
image
=
ImageTk
.
PhotoImage
(
image
)
...
...
Please
register
or
login
to post a comment