本帖最后由 keer_zu 于 2019-3-1 15:48 编辑
@21ic小喇叭 @21ic小管家 @gaoyang9992006 @sherwin @海中水 @tyw @yyy71cj @紫剑
广告:最近在抽空学《微分几何》和《群论》
将人脸识别应用微服务化,进一步容器化是我当下的任务。
可以实现类似科大讯飞的云服务器一样的人脸识别服务,这一切从定义接口开始。
要定义接口,首先是选择通信方式:tcp or http。
代码依然参考:人脸识别及容器化项目
tcp效率高,交互方式灵活。但是因为进出服务器都有传输图片或者流的可能,所以tcp实现的接口很不友好,对接入者要求过高。先从两者对比开始吧。
首先是尝试采用tcp传输图片:trans_tcp.py
import socket
import threading
import time
import sys
import os
import struct
class _Session:
m_conn = 0
m_addr = 0
m_tread = 0
def __init__(self,conn,addr,on_session):
self.m_conn = conn
self.m_addr = addr
self.m_tread = threading.Thread(target=on_session, args=(conn, addr))
self.m_tread.start()
class TcpServer:
def __init__(self,ip,port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((ip, port))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print('Waiting connection...')
while 1:
conn, addr = s.accept()
#t = threading.Thread(target=deal_data, args=(conn, addr))
#t.start()
session = _Session(conn,addr,self.recv_image)
def recv_image(self,conn, addr):
print ('Accept new connection from {0}'.format(addr))
#conn.settimeout(500)
conn.send(('Hi, Welcome to the server!').encode())
while 1:
fileinfo_size = struct.calcsize('128sl')
buf = conn.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.strip(('\00').encode())
#src_path,_ = os.path.split(os.path.realpath(__file__))
new_filename = os.path.join('./', 'new_' + fn.decode())
print('file new name is {0}, filesize if {1}'.format(new_filename, filesize))
recvd_size = 0 # 定义已接收文件的大小
fp = open(new_filename, 'wb')
print('start receiving...')
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = conn.recv(1024)
recvd_size += len(data)
else:
data = conn.recv(filesize - recvd_size)
recvd_size = filesize
fp.write(data)
fp.close()
print('end receive...')
conn.close()
break
class TcpClient:
def __init__(self,ip,port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
except socket.error as msg:
print(msg)
sys.exit(1)
print(s.recv(1024))
while 1:
filepath = input('please input file path: ')
if os.path.isfile(filepath):
# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size = struct.calcsize('128sl')
# 定义文件头信息,包含文件名和文件大小
fhead = struct.pack(('128sl').encode(), os.path.basename(filepath.encode()), os.stat(filepath).st_size)
s.send(fhead)
print('client filepath: {0}'.format(filepath))
fp = open(filepath, 'rb')
while 1:
data = fp.read(1024)
if not data:
print('{0} file send over...'.format(filepath))
break
s.send(data)
s.close()
break
tcp_server = TcpServer("127.0.0.1",6666)
#tcp_client = TcpClient("127.0.0.1",6666)
可以看到:首先是通过tcp传输图片名字和大小信息,然后才传输图片。
===============================================================================
接下来尝试采用http的post方法一次传输图片和命令。。。
先分享一种尝试:
trans_http.py
=================================== 2019.2.22 =======================================
今天看了腾讯和百度的api定义:
人脸验证(腾讯)
人脸检测(百度)
感觉百度过于繁杂,还是比较喜欢腾讯的接口。于是着手学习之,自己实现类似接口。就从接口定义开始吧。
================================== 2019.2.26 =========================================
对比了若干个python的http框架,最好决定使用flask来实现我的http接口。
新的代码:
facecloud
首先定义接口,然后一个一个实现。
接口定义详情请参考下面帖子。
第一个接口的实现请参考下面对应帖子。
==================================== 2019.3.1 =============================================
这两天致力于将之前python做的http服务容器化。
问题是这样的:首先,tensorflow的hub.docker.com tensorflow dockerhub镜像
只有在具备nvidia显卡的机器上才能运行python3的环境,而且虚拟机不支持对显卡的虚拟化,所以必须在一台机器上安装nvidia的显卡,
然后运行linux系统(我是centos),接着docker pull 拉取 上面的镜像,再将其运行为支持nvidia环境的容器。
在centos上安装nvidia显卡颇费周折,因为是找来的旧显卡,而且我的显示器有比较古董,所以启动安装好的linux后就显示没有信号,找了很多解决办法,最后、
在nvidia的论坛得知新的显示器可以支持,无奈在公司地位卑微,用的都是淘汰的设备,于是斗胆接了一台新的三星显示器,可以显示。
按照别人试验过的方法,安装好驱动。再切换至之前的显示器,发现可以显示了。
于是拉取docker镜像,采用以下方式:
Start a GPU container with Python 3, using the Python interpreter.
$ docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter
OK! 容器跑起来了。
然后将我的faceclude代码用git克隆到共享文件夹中,又是一大波依赖包安装,终于跑起来了。
后边的开发就在容器里面做了。客户端demo(sdk)跑在其它地方,包括宿主机。
继续。
@gaoyang9992006 @sherwin @21ic小喇叭
|