recognition.py

import numpy as np
import face_recognition
import os class recognition:
def __init__(self):
file_handle = open('picture_name.txt', 'r')
nameStr = file_handle.readline().strip()
self.total_image_name = nameStr.split(' ')
file_handle.close()
codeArray = np.loadtxt('picture_encode.txt')
self.total_face_encoding = list(codeArray) def startRecog(self, path):
image_code_list, numOfImages = self.readImage(path)
if numOfImages != 3:
return 'failed'
else:
#3.进行识别,将识别结果保存在一个字符串列表中
result_list = []
for i in range(numOfImages):
for k, v in enumerate(self.total_face_encoding):
match = face_recognition.compare_faces([v], image_code_list[i][0], tolerance=0.5)
name = 'unknown'
if match[0]:
name = self.total_image_name[k]
result_list.append(name)
break #4.如果数组中有两个相同的元素,就将该元素返回给客户端
print(result_list)
item1 = result_list[0]
item2 = result_list[1]
item3 = result_list[2]
if item1 == item2 and item1 == item3 and item1 != 'unknown':
return item1
elif (item1 == item2 and item1 != 'unknown') or (item1 == item3 and item1 != 'unknown'):
return item1
elif item2 == item3 and item2 != 'unknown':
return item2
else:
return 'failed' def readImage(self, path):
image_code_List = []
imageList = os.listdir(path) for image in imageList:
newPath = path + '/' + image
image_code_List.append(face_recognition.face_encodings(face_recognition.load_image_file(newPath)))
return image_code_List, len(imageList)

服务器端:

import socket
import threading
import os
import recognition class recogServer:
def __init__(self):
print('启动服务')
self.sock = socket.socket() #创建socket
self.addr = ('127.0.0.1',9999) #服务器要绑定的IP和端口
self.sock.bind(self.addr) #绑定IP和端口 有一个端口已占用的问题
self.clients = {}
self.recognition = recognition.recognition() def start(self):
self.sock.listen()
accept_thread = threading.Thread(target=self.accept, name='accpet_thread')
accept_thread.start() def accept(self):
while True:
s, raddr = self.sock.accept()
self.clients[raddr] = s
recv_thread = threading.Thread(target=self.recv, name='recv_thread', args=(s, raddr))
recv_thread.start() def recv(self, s, raddr):
clientStr = raddr[0] + '-' + str(raddr[1])
clientDir = 'recvImage/' + clientStr
self.makeDir(clientDir) #为每一个客户端建立一个文件夹,用来保存图片 while True:
try:
data = s.recv(1024).decode()
if data == 'end': #图片发送完毕,退出接收图片的循环
break
if len(data): #判断是否接收到了数据
fileName,length = data.split('|')
#if fileName and length:
total_length = int(length)
newFile = open(clientDir + '/' + fileName,'wb')
s.send(b'ok') get = 0
file = b''
while get < total_length:
fileData = s.recv(1024)
file = file + fileData
get = get + len(fileData) if len(file) == total_length:
newFile.write(file[:])
s.send(b'continue')
newFile.close() except ConnectionResetError:
print('error')
s.close()
s.send(b'successfully received') #将图片全部接收完毕后,给客户端一个响应
personName = self.recognition.startRecog(clientDir)
s.send(personName.encode())
print(personName) def makeDir(self, path):
path = path.strip()
if not os.path.exists(path):
os.mkdir(path) def stop(self):
for item in self.clients.values():
item.close()
self.sock.close() if __name__ == '__main__':
myserver = recogServer()
myserver.start() while True:
input_str = input('>>>')
if input_str.strip() == 'quit':
myserver.stop()
break
print(threading.enumerate())

客户端:

import socket
import os class client:
def __init__(self):
self.fileList = [] # 存图片的bytes数组
self.addr = ('127.0.0.1', 9999)
self.sock = socket.socket()
self.sock.connect(self.addr) def readFile(self, dir_path):
self.nameList = os.listdir(dir_path)
for item in self.nameList:
file_path = dir_path + item
print(file_path)
self.fileList.append(self.read(file_path)) def read(self, file_path):
file_handle = open(file_path, 'rb')
data = file_handle.read()
file_handle.close()
return data def send_pic(self):
pic_num = len(self.nameList) for i in range(pic_num):
total_length = len(self.fileList[i])
msg = '{}|{}'.format(self.nameList[i], total_length)
self.sock.send(msg.encode())
ok_data = self.sock.recv(1024)
if ok_data.decode() == 'ok':
current = 0
while current < total_length:
send_data = self.fileList[i][current:current+1024]
self.sock.send(send_data)
current = current + len(send_data)
continue_data = self.sock.recv(1024)
if continue_data.decode() == 'continue':
pass
self.sock.send(b'end')
over = self.sock.recv(1024)
print(over.decode())
name = self.sock.recv(1024)
print(name.decode()) if __name__ == '__main__':
#path = 'image/'
path = input('Input the path:') #例如当前目录下'image/2/'
path.strip()
myclient = client()
myclient.readFile(path)
myclient.send_pic()

转载于:https://www.cnblogs.com/ACPIE-liusiqi/p/10648155.html

socket编程-多个客户端向服务器发送人脸照片,服务器返回识别结果(服务器使用多线程)...的更多相关文章

  1. linux socket编程:简易客户端与服务端

    什么是socket? socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来 ...

  2. android下socket编程问题:服务器关闭时,客户端发送请求的异常处理

    我用socket分别创建了一个服务器和一个客户端. 当服务器程序运行时,客户端和服务器发送接收数据是OK的. 但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException.但 ...

  3. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

  4. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  5. socket编程中客户端常用函数

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

  6. 5.1 socket编程、简单并发服务器

    什么是socket? socket可以看成是用户进程与内核网络协议栈的编程接口.是一套api函数. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机间的进程间通信. 工业上使用的为t ...

  7. socket编程中客户端常用函数 以及简单实现

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

  8. Linux Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  9. Linux Socket编程(不限Linux)【转】

    转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...

随机推荐

  1. JS同步和异步的理解

    js的同步和异步问题通常是指ajax的回调,如果是同步调用,程序在发出ajax调用后就会暂停,直到远程服务器产生回应后才会继续运行.而如果是异步调用,程序发出ajax调用后不会暂停,而是立即执行后面的 ...

  2. Appium自动化(1) - 环境准备详细教程

    Appium需要用到的工具 链接:https://pan.baidu.com/s/1od9x-1l0ALGRT5T6QFDHWg 提取码:bnhq 安装Appium Pyhton client包 1. ...

  3. KMP算法-从头到尾彻底理解KMP

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  4. Win 10 C 盘突然爆满,怎么清理?

    Win 10 C 盘突然爆满,怎么清理? 使用windows的小伙伴们都知道,C盘是安装系统的,有时候不知道为啥突然就爆满了,查看我的电脑,C盘显示红色的.是不是感觉狠揪心,想删除一些东西有不敢删除, ...

  5. 这个案例写出来,还怕跟面试官扯不明白 OAuth2 登录流程?

    昨天和小伙伴们介绍了 OAuth2 的基本概念,在讲解 Spring Cloud Security OAuth2 之前,我还是先来通过实际代码来和小伙伴们把 OAuth2 中的各个授权模式走一遍,今天 ...

  6. Evolution of Image Classifiers,进化算法在神经网络结构搜索的首次尝试 | ICML 2017

    论文提出使用进化算法来进行神经网络结构搜索,整体搜索逻辑十分简单,结合权重继承,搜索速度很快,从实验结果来看,搜索的网络准确率挺不错的.由于论文是个比较早期的想法,所以可以有很大的改进空间,后面的很大 ...

  7. 家庭版记账本app之常用控件的使用方法

    现在先介绍在android开发的时候会用的相关的控件,做一个基本的了解方便我们之后对其进行相关具体的操作.下面是相应额详细情况: TextView android:layout_width 和 and ...

  8. json格式的文件操作2

    1.字典转换为字符串(json.dumps) jsongeshi={"name":"yajuan","age":"10" ...

  9. ENVI 安装

    本文转自https://jingyan.baidu.com/article/2d5afd69d50e9585a2e28e37.html  但对该文有所补充,建议看本文,本文更详细. ENVI5.3安装 ...

  10. MySQL exists的用法

    有一个查询如下: 1 SELECT c.CustomerId, CompanyName 2 FROM Customers c 3 WHERE EXISTS( 4 SELECT OrderID FROM ...