问题描述
我正在尝试获取在
处提供的 Python 代码上班。
到目前为止,我已经修复了 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 文件上传到站点来进行快速测试预测。这按预期工作。
背景信息;-我使用 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]