Загрузка локальных изображений в Microsoft Cognitive Face - PullRequest
0 голосов
/ 17 февраля 2020

Снимок экрана ошибки

import sys
import os, time
import cognitive_face as CF
import global_variables as global_var
import urllib
import sqlite3
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)


Key = global_var.key

CF.Key.set(Key)

BASE_URL = global_var.BASE_URL  # Replace with your regional Base URL
CF.BaseUrl.set(BASE_URL)

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)
            imgurl = urllib.request.pathname2url(os.path.join(imageFolder, filename))
            imgurl = imgurl[3:]
            print("imageurl = {}".format(imgurl))
            res = CF.face.detect(imgurl)
            if len(res) != 1:
                print("No face detected in image")
            else:
                res = CF.person.add_face(imgurl, global_var.personGroupId, person_id)
                print(res)  
            time.sleep(6)
else:
    print("supply attributes please from dataset folder")

Я надеюсь, что изображения должны быть преобразованы в байтовый массив, но я не знаю, как это сделать. Локальные изображения должны быть загружены в когнитивный API. Пробовал много способов, но не может исправить ошибку.

imgurl = urllib.request.pathname2url(os.path.join(imageFolder, filename))

Над строкой, где существует ошибка

1 Ответ

0 голосов
/ 17 февраля 2020

Добро пожаловать в 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()
...