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. 1033 To Fill or Not to Fill (25分)(贪心)

    With highways available, driving a car from Hangzhou to any other city is easy. But since the tank c ...

  2. C语言一行语句太长的换行处理方法

    [toc] 1.C语言中代码的多行书写 对C语言初学者来说,编写的程序的功能很简单,一句代码很短,但是在实际开发中,参数往往很长很多,一句代码可能会很长,需要用多行才能书写. 如果我们在一行代码的行尾 ...

  3. MyBatis(三):核心配置文件的重要配置-Log

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

  4. GoLang——Hello World,打开新世界的大门

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Go语言系列的第一篇文章,我们来聊聊这门新的语言和它的基础语法. 浅谈Golang 作为程序员而言,往往对于学习新的语言都是有抗拒的. ...

  5. Tomcat目录解析

    bin 可执行文件的储存 conf 配置文件 lib 依赖jar包 logs 日志文件 temp 临时文件 webapps 创建的web应用程序 work 存放运行时数据 如何启动Tomcat? 启动 ...

  6. 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

    如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让 ...

  7. git处理fork的个人库代码与远程项目库待代码同步与合并

    由于每个项目组git代码管理规范都不一致,分支开发和fork开发模式.我就说下fork处理的流程吧. 问题点: 我的代码是从自己的远程个人仓库clone的.我的个人远程仓库代码是从项目的远程仓库弄fo ...

  8. AD颗粒化密码规则策略

    我们在第一次设定密码规则的时候,通常会在根节点或者默认组策略中设置 如果,我们在后期运维过程中,有一些特殊用户需要设置额外的密码策略,我们要如何操作呢? 可能,有些同学会在这些特殊用户对应的OU下在创 ...

  9. 数据结构和算法(Golang实现)(23)排序算法-归并排序

    归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...

  10. Anadi and Domino--codeforces div2

    题目链接:https://codeforces.com/contest/1230/problem/C 题目大意:21枚多米诺牌,给你一个图,将多米诺牌放到图的边上,由同一个点发出的所有边,边上多米诺牌 ...