164 lines
6.6 KiB
Python
164 lines
6.6 KiB
Python
from ast import Not
|
||
import base64
|
||
from tkinter.ttk import Style
|
||
from PIL import Image, ImageDraw
|
||
import config
|
||
import requests, pickledb, json, datetime, oss2, os, sys, cv2
|
||
import numpy as np
|
||
from imutils.object_detection import non_max_suppression
|
||
|
||
def re_get_access_token():
|
||
baidu_token_host = 'https://aip.baidubce.com/oauth/2.0/token'
|
||
res = requests.get(baidu_token_host, params={'grant_type': 'client_credentials', 'client_id': config.baidu_api['face']['api_key'], 'client_secret': config.baidu_api['face']['secret_key']})
|
||
access_token = json.loads(res.text)['access_token']
|
||
expires_time = int(json.loads(res.text)['expires_in']) + int(datetime.datetime.now().timestamp())
|
||
print(access_token, expires_time)
|
||
return access_token, expires_time
|
||
|
||
def get_access_token():
|
||
config = pickledb.load('config.json', auto_dump=True)
|
||
baidu = config.get('baidu_api')
|
||
if not baidu:
|
||
access_token, expires_time = re_get_access_token()
|
||
config.set('baidu_api', {'access_token': access_token, 'expires_time': expires_time})
|
||
else:
|
||
access_token = baidu['access_token']
|
||
expires_time = baidu['expires_time']
|
||
if int(datetime.datetime.now().timestamp()) > expires_time:
|
||
access_token, expires_time = re_get_access_token()
|
||
config.set('baidu_api', {'access_token': access_token, 'expires_time': expires_time})
|
||
|
||
config.dump()
|
||
print('access_token:', access_token)
|
||
return access_token
|
||
|
||
def down_image(pid):
|
||
if not os.path.exists(workdir):
|
||
os.mkdir(workdir)
|
||
input_path = os.path.join(workdir, pid)
|
||
if not os.path.exists(input_path):
|
||
os.mkdir(input_path)
|
||
os.mkdir(os.path.join(input_path, 'photo2'))
|
||
output = os.path.join(input_path, 'photo2', '103_8.jpg')
|
||
|
||
oss_client.get_object_to_file(f'photos/{pid}/photo2/103_8.jpg', output)
|
||
return output
|
||
|
||
def baidu_face(pid):
|
||
access_token = get_access_token()
|
||
request_url = 'https://aip.baidubce.com/rest/2.0/face/v3/detect' + '?access_token=' + access_token
|
||
img_url = f'https://3dview.suwa3d.com/face/{pid}/103_8.jpg'
|
||
params = {
|
||
'access_token': access_token,
|
||
'image': img_url,
|
||
'image_type': 'URL',
|
||
'face_field': 'age,beauty,expression,gender,glasses,landmark,eye_status',
|
||
'max_face_num': '6',
|
||
}
|
||
res = requests.post(request_url, data=params)
|
||
print(res.text)
|
||
|
||
def aliyun_face(pid):
|
||
high = False
|
||
style = 'imm/detectface'
|
||
keys = [f'photos/{pid}/photo1/103_1.jpg', f'photos/{pid}/photo2/103_8.jpg']
|
||
for objectkey in keys:
|
||
res = oss_client.get_object(objectkey, process=style)
|
||
res = json.loads(res.read())
|
||
if res['success']:
|
||
if res['Faces'] is None:
|
||
print('no face')
|
||
return None
|
||
else:
|
||
print('faces num:', len(res['Faces'], ' in ', objectkey))
|
||
for face in res['Faces']:
|
||
print('-' * 20)
|
||
print('face_id:', face['FaceId'])
|
||
print('gender:', face['Gender'])
|
||
print('age:', face['Age'])
|
||
print('glasses:', face['FaceAttributes']['Glasses'])
|
||
print('Boundary:', face['FaceAttributes']['FaceBoundary'])
|
||
start_point = (face['FaceAttributes']['FaceBoundary']['Left'], face['FaceAttributes']['FaceBoundary']['Top'])
|
||
end_point = (face['FaceAttributes']['FaceBoundary']['Left'] + face['FaceAttributes']['FaceBoundary']['Width'], face['FaceAttributes']['FaceBoundary']['Top'] + face['FaceAttributes']['FaceBoundary']['Height'])
|
||
# img = cv2.imread(down_image(pid))
|
||
# cv2.rectangle(img, start_point, end_point, (0, 0, 255), 2)
|
||
# cv2.imshow('img', img)
|
||
# cv2.waitKey(0)
|
||
|
||
if face['Gender'] == 'FEMALE' and face['Age'] < 22: high = True
|
||
if face['Gender'] == 'MALE' and face['Age'] < 15: high = True
|
||
else:
|
||
print('face detect failed...')
|
||
return high
|
||
|
||
def get_head_rect(photo):
|
||
style = 'imm/detectface'
|
||
objectkey = f'photos/{pid}/photo2/{photo}'
|
||
res = oss_client.get_object(objectkey, process=style)
|
||
res = json.loads(res.read())
|
||
if res['success']:
|
||
if res['Faces'] is None:
|
||
print('no face')
|
||
return None
|
||
print('faces num:', len(res['Faces']))
|
||
rects = []
|
||
for face in res['Faces']:
|
||
print('-' * 20)
|
||
print('face_id:', face['FaceId'])
|
||
start_point = (face['FaceAttributes']['FaceBoundary']['Left'], face['FaceAttributes']['FaceBoundary']['Top'])
|
||
end_point = (face['FaceAttributes']['FaceBoundary']['Left'] + face['FaceAttributes']['FaceBoundary']['Width'], face['FaceAttributes']['FaceBoundary']['Top'] + face['FaceAttributes']['FaceBoundary']['Height'])
|
||
rect = (start_point, end_point)
|
||
rects.append(rect)
|
||
return rects
|
||
return None
|
||
|
||
def gen_mask(pid):
|
||
workdir = f'z:\\{pid}\\'
|
||
if not os.path.exists(workdir):
|
||
print('not found pid:', pid)
|
||
return
|
||
photo1 = os.path.join(workdir, 'photo1')
|
||
photo2 = os.path.join(workdir, 'photo2')
|
||
for photo in os.listdir(photo2):
|
||
if photo.endswith('.jpg'):
|
||
print('photo:', photo)
|
||
rects = get_head_rect(photo)
|
||
print(rects)
|
||
if rects is None: continue
|
||
for rect in rects:
|
||
mask = np.zeros((3040, 4056, 3), np.uint8)
|
||
cv2.rectangle(mask, rect[0], rect[1], (255, 255, 255), -1)
|
||
# cv2.imwrite(os.path.join(photo2, photo + '.mask.png'), mask)
|
||
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
|
||
cv2.imwrite(os.path.join(photo1, photo[:-5] + '1.jpg.mask.png'), mask)
|
||
|
||
def aliyun_tagimage(pid):
|
||
high = False
|
||
style = 'imm/tagimage'
|
||
objectkey = f'photos/{pid}/photo2/103_8.jpg'
|
||
res = oss_client.get_object(objectkey, process=style)
|
||
res = json.loads(res.read())
|
||
if res['success']:
|
||
print('tags num:', len(res['Tags']))
|
||
for tag in res['Tags']:
|
||
print(tag)
|
||
else:
|
||
print('tag detect failed...')
|
||
return high
|
||
|
||
if __name__ == '__main__':
|
||
workdir = 'Z:\\face\\'
|
||
AccessKeyId = 'LTAI5tSReWm8hz7dSYxxth8f'
|
||
AccessKeySecret = '8ywTDF9upPAtvgXtLKALY2iMYHIxdS'
|
||
Endpoint = 'oss-cn-shanghai.aliyuncs.com'
|
||
Bucket = 'suwa3d-securedata'
|
||
oss_client = oss2.Bucket(oss2.Auth(AccessKeyId, AccessKeySecret), Endpoint, Bucket)
|
||
|
||
if len(sys.argv) == 2:
|
||
pid = sys.argv[1]
|
||
else:
|
||
print('Usage: python test.py pid')
|
||
exit(1)
|
||
# aliyun_tagimage(pid)
|
||
aliyun_face(pid)
|
||
# gen_mask(pid) |