predictor.classify_image(project.id, publish_iteration_name, image_contents.read()) 导致无效迭代

问题描述

我正在尝试获取

处提供的 Python 代码

https://github.com/Azure-Samples/cognitive-services-quickstart-code/blob/master/python/CustomVision/ImageClassification/CustomVisionQuickstart.py

上班。

到目前为止,我已经修复了 1 个代码错误(训练片段中的重复代码行),并且我还在发布的相关说明中解决了 1 个不正确的信息 https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/quickstarts/image-classification?tabs=visual-studio&pivots=programming-language-python获取预测资源id的说明有误。 https://github.com/MicrosoftDocs/azure-docs/issues/28445

解释了正确的方法

但是代码还是有问题;-

行 results = predictor.classify_image(project.id,publish_iteration_name,image_contents.read()) 导致错误;- 无效迭代。

之前的所有代码似乎都有效。 可以进入Azure客户视觉项目,看到项目已经创建,图片上传,训练完成,迭代发布,一切OK

我可以看到迭代的发布名称是正确的。此外,我可以通过 Web 浏览器门户使用该项目和迭代,并且可以通过将相同的 .jpg 文件上传站点来进行快速测试预测。这按预期工作。

如何解决python代码中的错误;-无效迭代?

背景信息;-我使用 Visual Studio 2019 作为我的 IDE,使用 Python 3.7 版。在 Azure 中,我使用的是即用即付订阅。预测资源使用定价层“标准”

我的代码在下面列出,敏感信息(密钥等)被删除

非常感谢

'''
Code taken from https://github.com/Azure-Samples/cognitive-services-quickstart-code/blob/master/python/CustomVision/ImageClassification/CustomVisionQuickstart.py

Using instructions posted at;-  https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/quickstarts/image-classification?tabs=visual-studio&pivots=programming-language-python

Note;- both the above contain errors !

'''

# <snippet_imports>
from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient
from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateBatch,ImageFileCreateEntry,Region
from msrest.authentication import ApiKeyCredentials
import time
# </snippet_imports>

# <snippet_creds>
# Replace with valid values
ENDPOINT ="https://resource-group-name.cognitiveservices.azure.com/"  

training_key = "3589b< deleted from this >f5a8b95"
prediction_key = "c229a2<deleted from this >c0e82b4f"

#prediction_resource_id = "0261b<does not work>07a074339" This value was copied from the subscription id,on the overview blade of the prediction resource 
# this does NOT work

prediction_resource_id="/subscriptions/0261b17d<deleted from this >74339/resourceGroups/vision_group/providers/Microsoft.CognitiveServices/accounts/vi<deleted from this >cegrou-Prediction"
# taken from https://github.com/MicrosoftDocs/azure-docs/issues/28445  THIS SEEMS TO WORK

# </snippet_creds>

# <snippet_auth>
credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT,credentials)
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT,prediction_credentials)
# </snippet_auth>


# <snippet_create>
publish_iteration_name = "classifyModel"


credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})


trainer = CustomVisionTrainingClient(ENDPOINT,credentials)

# Create a new project
print ("Creating project...")
project = trainer.create_project("MyProject")
# </snippet_create>

# <snippet_tags>
# Make two tags in the new project
hemlock_tag = trainer.create_tag(project.id,"Hemlock")
cherry_tag = trainer.create_tag(project.id,"Japanese Cherry")
# </snippet_tags>



# <snippet_upload>
#base_image_location = "<path to repo directory>/cognitive-services-python-sdk-samples/samples/vision/"
base_image_location = "<path deleted from this >/"
print("Adding images...")

image_list = []

for image_num in range(1,11):
    file_name = "hemlock_{}.jpg".format(image_num)
    with open(base_image_location + "images/Hemlock/" + file_name,"rb") as image_contents:
        image_list.append(ImageFileCreateEntry(name=file_name,contents=image_contents.read(),tag_ids=[hemlock_tag.id]))

for image_num in range(1,11):
    file_name = "japanese_cherry_{}.jpg".format(image_num)
    with open(base_image_location + "images/Japanese Cherry/" + file_name,tag_ids=[cherry_tag.id]))

upload_result = trainer.create_images_from_files(project.id,ImageFileCreateBatch(images=image_list))
if not upload_result.is_batch_successful:
    print("Image batch upload Failed.")
    for image in upload_result.images:
        print("Image status: ",image.status)
    exit(-1)
# </snippet_upload>

# <snippet_train>
print ("Training...")
iteration = trainer.train_project(project.id)
while (iteration.status != "Completed"):
    iteration = trainer.get_iteration(project.id,iteration.id)
    print ("Training status: " + iteration.status)
    time.sleep(1)


# The iteration is Now trained. Publish it to the project endpoint
trainer.publish_iteration(project.id,iteration.id,prediction_resource_id)
print ("Done!")
# </snippet_train>


'''
THIS IS A DUPLICATE AND CAUSES AN ERROR

# <snippet_publish>
# The iteration is Now trained. Publish it to the project endpoint
trainer.publish_iteration(project.id,prediction_resource_id) 
print ("Done!")
# </snippet_publish>
'''

# <snippet_test>
# Now there is a trained endpoint that can be used to make a prediction
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT,prediction_credentials)

with open(base_image_location + "images/Test/test_image_2.jpg","rb") as image_contents:

    results = predictor.classify_image(
        project.id,image_contents.read())
# The above line does NOT work. It causes ... Invalid iteration  error !!

    # display the results.
    for prediction in results.predictions:
        print("\t" + prediction.tag_name +
              ": {0:.2f}%".format(prediction.probability * 100))
# </snippet_test>

解决方法

当训练和预测资源的终点和关键组合不正确时,很可能会出现此错误。

另外,确保训练和预测资源的端点都是正确的。

Reference 到一个类似的讨论线程。

,

我发现了导致此错误消息的原因;- Azure 自定义视觉存在缺陷;- 如果用户输入的资源名称中包含连字符...

当 azure 自定义视觉应用程序自动创建两个资源(训练和预测资源)时,它无法正确复制用户在创建第二个(预测)资源时输入的带连字符的(训练)资源名称.

例如;- a-resource-name 被错误处理并创建了以下错误名称;- aresourcename-Prediction(用于预测资源)。

这会在 python 代码使用这对资源时导致问题。

我不认为上述缺陷包含在发布在 [https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/resource-name-rules]