From 69c07df8eb636049b4e171e44013a8efd925367c Mon Sep 17 00:00:00 2001 From: larry Date: Sun, 26 Jul 2020 22:45:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E4=B8=80=E4=B8=AAweb?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E7=85=A7=E7=89=87=EF=BC=8C=E7=94=9F=E6=88=90=E8=AF=81?= =?UTF-8?q?=E4=BB=B6=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ m_web/bj.png | Bin 0 -> 2125 bytes m_web/cs.jpg | Bin 0 -> 28494 bytes m_web/upload.py | 73 +++++++++++++++++++++++++++++++++++++++ m_web/web.py | 26 ++++++++++++++ u_2_net/my_u2net_test.py | 7 ++-- 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 m_web/bj.png create mode 100644 m_web/cs.jpg create mode 100644 m_web/upload.py create mode 100644 m_web/web.py diff --git a/README.md b/README.md index 60ada24..123b0ba 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ # aiphoto 最近要去办事情,很多地方都需要证件照,最近刚好在看AI,人脸识别,图形识别相关的知识,就打算利用这些技术开发一个证件照功能 +# 效果图 + # 文档 通过文档可以快速上手和了解项目。 diff --git a/m_web/bj.png b/m_web/bj.png new file mode 100644 index 0000000000000000000000000000000000000000..e493312b12b2d09a2a5bd4cbc512428db6f96e0e GIT binary patch literal 2125 zcmeAS@N?(olHy`uVBq!ia0y~yV4Taqz*NM+1QeOz-eu3gz#-!4;uumf=j|0o-UA8@ z2M!o!|2V9WX5i>_>5k@$)yeDrGPe9#&&;6r*>u6N>kU%z%vm+OD?W~LM#Eq<9gOCM l(ehxlOdPEjhFf)Lc}$OO!pgO_?Z9RNgQu&X%Q~loCIAr&!x{hp literal 0 HcmV?d00001 diff --git a/m_web/cs.jpg b/m_web/cs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..614c52ab873561678a1a008630611ce3c9d63393 GIT binary patch literal 28494 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 DHUW=n literal 0 HcmV?d00001 diff --git a/m_web/upload.py b/m_web/upload.py new file mode 100644 index 0000000..bc5ef32 --- /dev/null +++ b/m_web/upload.py @@ -0,0 +1,73 @@ +import os +import tornado.web +import shortuuid +from u_2_net import my_u2net_test +from to_background import to_background +from to_background import to_standard_trimap +from m_dlib import ai_crop + +# import PILImageMy as mypil + + +class UploadHandler(tornado.web.RequestHandler): + + def post(self, *args, **kwargs): + + filename=shortuuid.uuid() + print(os.path.dirname(__file__)) + parent_path = os.path.dirname(os.path.dirname(__file__)) + filePath ="" + # 查看上传文件的完整格式,files以字典形式返回 + print(self.request.files) + # {'file1': + # [{'filename': '新建文本文档.txt', 'body': b'61 60 -83\r\n-445 64 -259', 'content_type': 'text/plain'}], + # 'file2': + filesDict = self.request.files + for inputname in filesDict: + # 第一层循环取出最外层信息,即input标签传回的name值 + # 用过filename键值对对应,取出对应的上传文件的真实属性 + http_file = filesDict[inputname] + for fileObj in http_file: + + # 第二层循环取出完整的对象 + # 取得当前路径下的 upfiles 文件夹+上fileObj.filename属性(即真实文件名) + filePath = os.path.join(parent_path, "static", filename+".jpg") + print(filePath) + with open(filePath, 'wb') as f: + f.write(fileObj.body) + + + + org_img = filePath + + id_image = os.path.join(parent_path, "static", filename+"_meinv_id.png") + # 20200719 + # 通过识别人脸关键点,裁剪图像 + ai_crop.crop_photo(org_img,id_image ) + + + print(org_img) + alpha_img = os.path.join(parent_path, "static", filename+"_alpha.png") + print(alpha_img) + alpha_resize_img = os.path.join(parent_path, "static", filename+"_alpha_resize.png") + print(alpha_resize_img) + # + # 通过u_2_net 获取 alpha + my_u2net_test.test_seg_trimap(id_image, alpha_img, alpha_resize_img) + # + # # 通过alpha 获取 trimap + trimap = os.path.join(parent_path, "static", filename+"_trimap_resize.png") + to_standard_trimap.to_standard_trimap(alpha_resize_img, trimap) + print(trimap) + + id_image_org = os.path.join(parent_path, "static", filename+"_meinv_id_2in.png") + + # + # 证件照添加蓝底纯色背景//"..\\aiphoto\\img\\meinv_trimap_resize.png" + # to_standard_trimap.to_standard_trimap(alpha_resize_img, trimap) + to_background.to_background(id_image, trimap, id_image_org, "blue") + print(id_image_org) + self.write( "static/"+filename+"_meinv_id_2in.png") + + + diff --git a/m_web/web.py b/m_web/web.py new file mode 100644 index 0000000..7d59826 --- /dev/null +++ b/m_web/web.py @@ -0,0 +1,26 @@ +import tornado.ioloop +import tornado.web +import m_web.upload as upload +import os + + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + + +def make_app(): + return tornado.web.Application([ + (r"/", MainHandler), + (r"/eam/fileLocal/upload", upload.UploadHandler), + (r"/eam/fileLocal/static", tornado.web.StaticFileHandler, {"path": "/static"}) + ], + static_path=os.path.dirname(os.path.dirname(__file__))+"/static" + ) + + +if __name__ == "__main__": + current_path = os.path.dirname(__file__) + app = make_app() + app.listen(8013) + tornado.ioloop.IOLoop.current().start() diff --git a/u_2_net/my_u2net_test.py b/u_2_net/my_u2net_test.py index e2b7015..f87a678 100644 --- a/u_2_net/my_u2net_test.py +++ b/u_2_net/my_u2net_test.py @@ -7,7 +7,7 @@ from u_2_net.data_loader import RescaleT from u_2_net.data_loader import ToTensorLab from u_2_net.model import U2NET # full size version 173.6 MB from PIL import Image - +import os # normalize the predicted SOD probability map def normPRED(d): @@ -44,7 +44,10 @@ def preprocess(image): def pre_net(): # 采用n2net 模型数据 model_name = 'u2net' - model_dir = '..\\aiphoto\\u_2_net\\saved_models/'+ model_name + '/' + model_name + '.pth' + path = os.path.dirname(__file__) + print(path) + model_dir = path+'/saved_models/'+ model_name + '/' + model_name + '.pth' + print(model_dir) print("...load U2NET---173.6 MB") net = U2NET(3,1) # 指定cpu