|
本帖最后由 keer_zu 于 2019-3-1 15:48 编辑
@21ic小喇叭 @21ic小管家 @gaoyang9992006 @sherwin @海中水 @tyw @yyy71cj @紫剑
广告: 欢乐赛车最近在抽空学《微分几何》和《群论》
将人脸识别应用微服务化,进一步容器化是我当下的任务。
可以实现类似科大讯飞的云服务器一样的人脸识别服务,这一切从定义接口开始。
要定义接口,首先是选择通信方式:tcp or http。
代码依然参考:
tcp效率高,交互方式灵活。但是因为进出服务器都有传输图片或者流的可能,所以tcp实现的接口很不友好,对接入者要求过高。先从两者对比开始吧。
首先是尝试采用tcp传输图片:
- 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方法一次传输图片和命令。。。
先分享一种尝试:
=================================== 2019.2.22 =======================================
今天看了腾讯和百度的api定义:
感觉百度过于繁杂,还是比较喜欢腾讯的接口。于是着手学习之,自己实现类似接口。就从接口定义开始吧。
================================== 2019.2.26 =========================================
对比了若干个python的http框架,最好决定使用flask来实现我的http接口。
新的代码:
首先定义接口,然后一个一个实现。
接口定义详情请参考下面帖子。
第一个接口的实现请参考下面对应帖子。
==================================== 2019.3.1 =============================================
这两天致力于将之前python做的http服务容器化。
问题是这样的:首先,tensorflow的hub.docker.com
只有在具备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小喇叭
|
 共1人点赞
|