Browse Source

feat: server complete

sky 3 years ago
parent
commit
d98a106900
7 changed files with 157 additions and 22 deletions
  1. 3 2
      Dockerfile
  2. 1 1
      curl_test.sh
  3. 1 0
      dockerrun.sh
  4. BIN
      image1878.png
  5. 1 0
      requirements.txt
  6. 33 19
      src/app.py
  7. 118 0
      src/ossClient.py

+ 3 - 2
Dockerfile

@@ -4,7 +4,8 @@ WORKDIR /facenet
 COPY . /facenet
 RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
 && apt-get clean \
-&& apt-get update \
-&& apt-get install python3-tk \
+&& apt-get update -y \
+&& apt-get install python3-tk -y \
+&& apt-get install build-essential libssl-dev libffi-dev python-dev -y \
 && pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple/ \
 && pip install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple/ \

+ 1 - 1
curl_test.sh

@@ -1 +1 @@
-curl -H "Content-Type: application/json" -X POST -d '{"img1": "img_buff_dieman.png", "img2":"img_buff_dieman_small.png" }' "http://127.0.0.1:5000/"
+curl -H "Content-Type: application/json" -X POST -d '{"baseImageUrl": "development/test1.png", "imageUrl":"development/test2.png" }' "http://127.0.0.1:5000/"

+ 1 - 0
dockerrun.sh

@@ -0,0 +1 @@
+docker run -p 5000:5000 -v D:\\study\\研究生毕业设计\\监考\\facenet:/facenet -it --name facenet facenet:v1 bash 

BIN
image1878.png


+ 1 - 0
requirements.txt

@@ -11,3 +11,4 @@ Flask==1.1.4
 flask-api
 matplotlib
 python3-tk
+oss2

+ 33 - 19
src/app.py

@@ -19,6 +19,8 @@ import matplotlib.pyplot as plt
 import cv2
 import random
 import math
+from ossClient import OssClient
+import string
 
 
 app = Flask(__name__)
@@ -121,13 +123,14 @@ def load_and_align_data(image_paths, image_size=160, margin=44, gpu_memory_fract
     tmp_image_paths = copy.copy(image_paths)
     img_list = []
     for image in tmp_image_paths:
-        img = misc.imread(os.path.expanduser(image), mode='RGB')
+        # img = misc.imread(os.path.expanduser(image), mode='RGB')
+        img = misc.imread(os.path.expanduser(image[1]), mode='RGB')
         img_size = np.asarray(img.shape)[0:2]
         bounding_boxes, _ = align.detect_face.detect_face(
             img, minsize, pnet, rnet, onet, threshold, factor)
         if len(bounding_boxes) < 1:
             image_paths.remove(image)
-            print("can't detect face, remove ", image)
+            print("can't detect face, remove ", image[0])
             continue
         bounding_boxes = filter_box(sort_box(bounding_boxes))
         img = drawBoxes(img, bounding_boxes)
@@ -168,7 +171,7 @@ def compare_images(image1, image2):
 
             print('Images:')
             for i in range(nrof_images):
-                print('%1d: %s' % (i, image_files[i]))
+                print('%1d: %s' % (i, image_files[i][0]))
             print('')
 
             # Print distance matrix
@@ -192,13 +195,14 @@ def is_same(dist):
   return dist < 1.0
 
 def show_img(X, name):
-    edge = 160
-    plt.figure("edge:%s" % edge)
-    plt.imshow(X)
-    plt.axis('on')
-    plt.title('img edge:%s' % edge)
-    plt.savefig(name)
-    plt.show()
+    # edge = 160
+    # plt.figure("edge:%s" % edge)
+    # plt.imshow(X)
+    # plt.axis('on')
+    # plt.title('img edge:%s' % edge)
+    # plt.savefig(name)
+    # plt.show()
+    pass
     
     
 # Response format
@@ -213,12 +217,15 @@ def R(data, msg, code = status.HTTP_200_OK, timestamp=None):
     )
 
 
-# # Scheduler photo api
-# @functools.lru_cache()
-# def get_photo(token): # token 中包含scheduler session信息,session能够对应到具体的人
-#     return fetch("url to scheduler photo", param = token)
-
-
+def generate_random_str(randomlength=16):
+    """
+    生成一个指定长度的随机字符串,其中
+    string.digits=0123456789
+    string.ascii_letters=abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+    """
+    str_list = [random.choice(string.digits + string.ascii_letters) for i in range(randomlength)]
+    random_str = ''.join(str_list)
+    return random_str
 
 # API
 @app.route("/", methods=['POST'])
@@ -227,11 +234,18 @@ def compare():
     if (content_type == 'application/json'):
         json = request.json
         res = None
+        ossClient = OssClient()
         try:
-            res = is_same(compare_images(json["img1"], json["img2"])) # TODO
+            file1 = generate_random_str()
+            file2 = generate_random_str()
+            baseImage = ossClient.downloadFileToLocal(json["baseImageUrl"], file1)
+            image = ossClient.downloadFileToLocal(json["imageUrl"], file2)
+            res = is_same(compare_images((json["baseImageUrl"],file1),(json["imageUrl"],file2))) 
+            # TODO
+            os.remove(file1)
+            os.remove(file2)
         except Exception as e:
-            print(e)
-            raise e
+            raise(e)
             return R("","服务出错",status.HTTP_500_INTERNAL_SERVER_ERROR)
         return R(res, "")
     else:

+ 118 - 0
src/ossClient.py

@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+
+from aliyunsdkcore import client
+from aliyunsdkcore.request import CommonRequest
+import json
+import oss2
+import pytz
+import datetime
+import time
+
+class OssClient:
+    endpoint = 'https://oss-cn-nanjing.aliyuncs.com'
+    area = 'cn-nanjing'
+    # 填写步骤1创建的RAM用户AccessKey。
+    access_key_id = 'LTAI5tHhtNM66nQwRKwyYotL'
+    access_key_secret = 'fTznJXTLMfySeMFRWWnghAaPAtaceV'
+    # role_Arn填写步骤3获取的角色ARN,例如acs:ram::175708322470****:role/ramtest。
+    role_arn = 'acs:ram::1807432849970905:role/monitorossadmin'
+    bucket_name = 'monitor-file-bucket'
+    
+    sts_access_key_id = None
+    sts_access_key_secret = None
+    security_token = None
+    expiration = None
+
+
+    def getSTSToken(self):
+        # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
+
+        # 创建权限策略。
+        # policy_text = ''
+
+        clt = client.AcsClient(self.access_key_id, self.access_key_secret, self.area)
+        request = CommonRequest(product="Sts", version='2015-04-01', action_name='AssumeRole')
+        request.set_method('POST')
+        request.set_protocol_type('https')
+        request.add_query_param('RoleArn', self.role_arn)
+        # 指定自定义角色会话名称,用来区分不同的令牌,例如填写为sessiontest。
+        request.add_query_param('RoleSessionName', 'sessiontest')
+        # 指定临时访问凭证有效时间单位为秒,最小值为900,最大值为3600。
+        request.add_query_param('DurationSeconds', '3000')
+        # 如果policy为空,则RAM用户默认获得该角色下所有权限。如果有特殊权限控制要求,请参考上述policy_text设置。
+        # request.add_query_param('Policy', policy_text)
+        request.set_accept_format('JSON')
+
+        body = clt.do_action_with_exception(request)
+
+        # 使用RAM用户的AccessKey ID和AccessKey Secret向STS申请临时访问凭证。
+        token = json.loads(oss2.to_unicode(body))
+        # 打印STS返回的临时访问密钥(AccessKey ID和AccessKey Secret)、安全令牌(SecurityToken)以及临时访问凭证过期时间(Expiration)。
+        self.sts_access_key_id = token['Credentials']['AccessKeyId']
+        self.sts_access_key_secret = token['Credentials']['AccessKeySecret']
+        self.security_token = token['Credentials']['SecurityToken']
+        self.expiration = self.utc_to_time(token['Credentials']['Expiration'])
+        
+        return {
+            'sts_access_key_id': self.sts_access_key_id,
+            'sts_access_key_secret': self.sts_access_key_secret,
+            'security_token': self.security_token,
+            'expiration': self.expiration
+        }
+        
+
+    def getBucket(self):
+        if self.expiration == None:
+            self.getSTSToken()
+        elif self.expiration <= datetime.datetime.now():
+            self.getSTSToken()
+        # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
+        endpoint = self.endpoint
+        # 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
+        sts_access_key_id = self.sts_access_key_id
+        sts_access_key_secret = self.sts_access_key_secret
+        # 填写Bucket名称。
+        bucket_name = self.bucket_name
+        # 从STS服务获取的安全令牌(SecurityToken)。
+        security_token = self.security_token
+
+
+        # 使用临时访问凭证中的认证信息初始化StsAuth实例。
+        auth = oss2.StsAuth(sts_access_key_id,
+                            sts_access_key_secret,
+                            security_token)
+
+        # 使用StsAuth实例初始化存储空间。
+        bucket = oss2.Bucket(auth, endpoint, bucket_name)
+        return bucket
+
+    def downloadFileStream(self, object_path):
+        bucket = self.getBucket()
+        object_stream = bucket.get_object(object_path)
+        return object_stream
+      
+    def downloadFileToLocal(self, object_path, file_path):
+        bucket = self.getBucket()
+        bucket.get_object_to_file(object_path, file_path)     
+      
+    def uploadObj(self, object_path, file_obj):
+        bucket = self.getBucket()
+        # 上传Object。
+        result = bucket.put_object(object_path, file_obj)
+        return result.status
+      
+    def uploadFile(self, object_path, file_path):
+        bucket = self.getBucket()
+        # 上传File。
+        result = bucket.put_object_from_file(object_path, file_path)
+        return result.status
+      
+    def utc_to_time(self,utc_time_str, utc_format='%Y-%m-%dT%H:%M:%SZ'):
+        return datetime.datetime.strptime(utc_time_str, utc_format)       #把世界时间的格式转化为datetime.
+    
+if __name__=='__main__':
+    ossclient = OssClient()
+    # ossclient.uploadObj('development/test.txt', 'lalala')
+    # ossclient.downloadFileToLocal('development/test.txt', './test.txt')
+    ossclient.uploadFile('development/test1.png', './img_2_big_small.png')
+    ossclient.uploadFile('development/test2.png', './img_2_small_big.png')