mirror of
https://github.com/Shawn-Shan/fawkes.git
synced 2024-11-09 13:41:31 +05:30
889fd933e8
Former-commit-id: 268fb7e6825ddfc1165fa7adc7c216f9d61005da [formerly 06376993a831c060c337ec6e7540252f0b2dfe09] Former-commit-id: c4812d40187a76a878e7d215d22ee84811b41896
399 lines
11 KiB
Python
399 lines
11 KiB
Python
|
|
import http.client, urllib.request, urllib.parse, urllib.error
|
|
import json
|
|
import time
|
|
|
|
#Face API Key and Endpoint
|
|
subscription_key = 'e127e26e4d534e2bad6fd9ca06145302'
|
|
uri_base = 'eastus.api.cognitive.microsoft.com'
|
|
# uri_base = 'https://shawn.cognitiveservices.azure.com/'
|
|
|
|
def detect_face(image_url):
|
|
headers = {
|
|
# Request headers
|
|
'Content-Type': 'application/json',
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
# Request parameters
|
|
'returnFaceId': 'true',
|
|
'returnFaceLandmarks': 'false',
|
|
'recognitionModel': 'recognition_01',
|
|
'returnRecognitionModel': 'false',
|
|
'detectionModel': 'detection_01',
|
|
})
|
|
|
|
body = json.dumps({
|
|
'url': image_url
|
|
})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
conn.close()
|
|
return data[0]["faceId"]
|
|
|
|
|
|
def verify_face(faceId, personGroupId, personId):
|
|
# html header
|
|
headers = {
|
|
'Content-Type': 'application/json',
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
# image URL
|
|
body = json.dumps({
|
|
"faceId": faceId,
|
|
"personId": personId,
|
|
"PersonGroupId": personGroupId
|
|
})
|
|
|
|
# Call Face API
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("POST", "/face/v1.0/verify?%s" % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
conn.close()
|
|
return data
|
|
|
|
|
|
def create_personGroupId(personGroupId, personGroupName):
|
|
headers = {
|
|
# Request headers
|
|
'Content-Type': 'application/json',
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({
|
|
"name": personGroupName
|
|
})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("PUT", "/face/v1.0/persongroups/{}?%s".format(personGroupId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = response.read()
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
def create_personId(personGroupId, personName):
|
|
headers = {
|
|
# Request headers
|
|
'Content-Type': 'application/json',
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({
|
|
"name": personName
|
|
})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("POST", "/face/v1.0/persongroups/{}/persons?%s".format(personGroupId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
print(data)
|
|
conn.close()
|
|
return data["personId"]
|
|
|
|
|
|
def add_persistedFaceId(personGroupId, personId, image_url):
|
|
headers = {
|
|
'Content-Type': 'application/json',
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
'personGroupId': personGroupId,
|
|
'personId': personId
|
|
})
|
|
|
|
body = json.dumps({
|
|
'url': image_url
|
|
})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("POST", "/face/v1.0/persongroups/{}/persons/{}/persistedFaces?%s".format(personGroupId, personId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
print(data)
|
|
conn.close()
|
|
return data["persistedFaceId"]
|
|
|
|
|
|
def list_personGroupPerson(personGroupId):
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("GET", "/face/v1.0/persongroups/{}/persons?%s".format(personGroupId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
conn.close()
|
|
for person in data:
|
|
print(person["personId"], len(person["persistedFaceIds"]))
|
|
|
|
|
|
def get_personGroupPerson(personGroupId, personId):
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("GET", "/face/v1.0/persongroups/{}/persons/{}?%s".format(personGroupId, personId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
def train_personGroup(personGroupId):
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("POST", "/face/v1.0/persongroups/{}/train?%s".format(personGroupId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = response.read()
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
def eval(original_faceIds, personGroupId, protect_personId):
|
|
headers = {
|
|
'Content-Type': 'application/json',
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({
|
|
'faceIds': original_faceIds,
|
|
'personGroupId': personGroupId,
|
|
'maxNumOfCandidatesReturned': 1
|
|
})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("POST", "/face/v1.0/identify?%s" % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
conn.close()
|
|
|
|
face = data[0]
|
|
if len(face["candidates"]) and face["candidates"][0]["personId"] == protect_personId:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
def delete_personGroupPerson(personGroupId, personId):
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("DELETE", "/face/v1.0/persongroups/{}/persons/{}?%s".format(personGroupId, personId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = response.read()
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
def add_protect_person(personGroupId, name):
|
|
personId = create_personId(personGroupId, name)
|
|
for idx in range(72):
|
|
cloaked_image_url = "https://super.cs.uchicago.edu/~shawn/cloaked/{}_c.png".format(idx)
|
|
add_persistedFaceId(personGroupId, personId, cloaked_image_url)
|
|
|
|
|
|
def add_sybil_person(personGroupId, name):
|
|
personId = create_personId(personGroupId, name)
|
|
for idx in range(82):
|
|
try:
|
|
cloaked_image_url = "https://super.cs.uchicago.edu/~shawn/sybils/{}_c.png".format(idx)
|
|
add_persistedFaceId(personGroupId, personId, cloaked_image_url)
|
|
except:
|
|
print(idx)
|
|
|
|
|
|
def add_other_person(personGroupId):
|
|
for idx_person in range(65):
|
|
personId = create_personId(personGroupId, str(idx_person))
|
|
for idx_image in range(90):
|
|
try:
|
|
image_url = "https://super.cs.uchicago.edu/~shawn/train/{}/{}.png".format(idx_person, idx_image)
|
|
add_persistedFaceId(personGroupId, personId, image_url)
|
|
except:
|
|
print(idx_person, idx_image)
|
|
|
|
|
|
def get_trainStatus(personGroupId):
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("GET", "/face/v1.0/persongroups/{}/training?%s".format(personGroupId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = response.read()
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
def test_original():
|
|
personGroupId = 'pubfig'
|
|
# create_personGroupId(personGroupId, 'pubfig')
|
|
# add protect person
|
|
protect_personId = 'd3df3012-6f3f-4c1b-b86d-55e91a352e01'
|
|
#protect_personId = create_personId(personGroupId, 'Emily')
|
|
#for idx in range(50):
|
|
# image_url = "https://super.cs.uchicago.edu/~shawn/cloaked/{}_o.png".format(idx)
|
|
# add_persistedFaceId(personGroupId, protect_personId, image_url)
|
|
|
|
# add other people
|
|
#for idx_person in range(65):
|
|
# personId = create_personId(personGroupId, str(idx_person))
|
|
# for idx_image in range(50):
|
|
# try:
|
|
# image_url = "https://super.cs.uchicago.edu/~shawn/train/{}/{}.png".format(idx_person, idx_image)
|
|
# add_persistedFaceId(personGroupId, personId, image_url)
|
|
# except:
|
|
# print(idx_person, idx_image)
|
|
|
|
|
|
# train model based on personGroup
|
|
#train_personGroup(personGroupId)
|
|
#time.sleep(3)
|
|
#get_trainStatus(personGroupId)
|
|
#list_personGroupPerson(personGroupId)
|
|
|
|
idx_range = range(50, 82)
|
|
acc = 0.
|
|
|
|
for idx in idx_range:
|
|
original_image_url = "https://super.cs.uchicago.edu/~shawn/cloaked/{}_o.png".format(idx)
|
|
faceId = detect_face(original_image_url)
|
|
original_faceIds = [faceId]
|
|
|
|
# verify
|
|
res = eval(original_faceIds, personGroupId, protect_personId)
|
|
if res:
|
|
acc += 1.
|
|
|
|
acc /= len(idx_range)
|
|
print(acc) # 1.0
|
|
|
|
|
|
def list_personGroups():
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("GET", "/face/v1.0/persongroups?%s" % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = response.read()
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
def delete_personGroup(personGroupId):
|
|
headers = {
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
}
|
|
|
|
params = urllib.parse.urlencode({
|
|
})
|
|
|
|
body = json.dumps({})
|
|
|
|
conn = http.client.HTTPSConnection(uri_base)
|
|
conn.request("DELETE", "/face/v1.0/persongroups/{}?%s".format(personGroupId) % params, body, headers)
|
|
response = conn.getresponse()
|
|
data = response.read()
|
|
print(data)
|
|
conn.close()
|
|
|
|
|
|
|
|
def main():
|
|
# delete_personGroup('cloaking')
|
|
# delete_personGroup('cloaking-emily')
|
|
# delete_personGroup('pubfig')
|
|
# list_personGroups()
|
|
# exit()
|
|
personGroupId = 'cloaking'
|
|
# create_personGroupId(personGroupId, 'cloaking')
|
|
list_personGroups()
|
|
exit()
|
|
#delete_personGroupPerson(personGroupId, '0ac606cd-24b3-440f-866a-31adf2a1b446')
|
|
#add_protect_person(personGroupId, 'Emily')
|
|
#personId = create_personId(personGroupId, 'Emily')
|
|
#add_sybil_person(personGroupId, 'sybil')
|
|
protect_personId = '6c5a71eb-f39a-4570-b3f5-72cca3ab5a6b'
|
|
#delete_personGroupPerson(personGroupId, protect_personId)
|
|
#add_protect_person(personGroupId, 'Emily')
|
|
|
|
# train model based on personGroup
|
|
#train_personGroup(personGroupId)
|
|
get_trainStatus(personGroupId)
|
|
#add_other_person(personGroupId)
|
|
#list_personGroupPerson(personGroupId)
|
|
#delete_personGroupPerson(personGroupId, '80e32c80-bc69-416a-9dff-c8d42d7a3301')
|
|
|
|
idx_range = range(72, 82)
|
|
original_faceIds = []
|
|
for idx in idx_range:
|
|
original_image_url = "https://super.cs.uchicago.edu/~shawn/cloaked/{}_o.png".format(idx)
|
|
faceId = detect_face(original_image_url)
|
|
original_faceIds.append(faceId)
|
|
|
|
# verify
|
|
eval(original_faceIds, personGroupId, protect_personId)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main() |