Добро пожаловать в Stack Overflow, @ arun.
Прежде всего, согласно здесь , используемый вами API устарел, и вам следует переключиться на этот вместо.
Во-вторых, в этом новом API есть метод с именем detect_with_stream
( ref здесь ), который отправит запрос конечной точке распознавания лиц, используя поток байтов вместо URL (он будет использовать заголовки запроса, отличные от метода на основе URL). Этот метод принимает поток байтов, содержащий ваше изображение. Я работал с другим API когнитивных служб, который выполняет распознавание текста, и поэтому я столкнулся с проблемой отправки URL-адреса изображения или потока байтов изображения. Вы можете сгенерировать поток байтов из файла следующим образом:
image_data = open(image_path, "rb").read()
Переменная image_data
может быть передана методу.
Редактировать: Инструкции по использованию нового API с изображением bytestream
Сначала установите следующий пакет pip:
pip install azure-cognitiveservices-vision-face
Затем вы можете попробовать этот подход.
import sys
import os, time
import global_variables as global_var
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
import urllib
import sqlite3
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
KEY = global_var.key
ENDPOINT = global_var.endpoint
face_client = FaceClient(ENDPOINT,CognitiveServicesCredentials(KEY))
def get_person_id():
person_id = ''
extractId = str(sys.argv[1])[-2:]
connect = sqlite3.connect("Face-DataBase")
c = connect.cursor()
cmd = "SELECT * FROM Students WHERE ID = " + extractId
c.execute(cmd)
row = c.fetchone()
person_id = row[3]
connect.close()
return person_id
if len(sys.argv) is not 1:
currentDir = os.path.dirname(os.path.abspath(__file__))
imageFolder = os.path.join(currentDir, "dataset/" + str(sys.argv[1]))
person_id = get_person_id()
for filename in os.listdir(imageFolder):
if filename.endswith(".jpg"):
print(filename)
img_data = open(filename, "rb").read()
res = face_client.face.detect_with_stream(img_data)
if not res:
print('No face detected from image {}'.format(filename))
continue
res = face_client.person_group_person.add_face_from_stream(global_var.personGroupId, person_id, img_data)
print(res)
time.sleep(6)
else:
print("supply attributes please from dataset folder")
Редактировать 2: Замечания по обходу всех файлов в каталоге
Хорошо @arun, ваша текущая проблема связана с тем, что вы используете os.listdir
, который только перечисляет имена файлов, поэтому у вас нет их путей. Самое быстрое решение - открыть каждое изображение внутри l oop с помощью:
img_data = open(os.path.join(imageFolder, filename), "rb").read()