Background:
I'm attempting to train a model to detect approx. 5 types of objects in an image.
My training data consists of approx 20 images, each image contains all of the object types...and more than one instance of each object per image.
For labeling I used ML Studio, I labeled all the different object types in each image.
Again, each training image contains multiple labeled objects (Regions) and each Region may be one of five different object types.
Problem I need help with:
When I attempt to run my code (to train the model via the Python SDK) I get two errors which I've been unable to understand or mitigate.
My hunch about the possible cause:
All the example code out there (for CustomVision SDK) -- which I've used to formulate much of my code -- demonstrates how to perform this task if your training images only have a single object type (class) per image, this a much simpler proposition that what I'm attempting.
I've tried to adapt these examples to fit my need -- namely labeling multiple Regions in each image, and labeling multiple object types per image -- I suspect this where I've managed to screw things up.
My guess is my attempt to package the tagged Regions with each image was not done correctly.
I'm hoping some of you might be able to explain where I've gone wrong.
Also if you know of any tutorials or example code that demonstrates how to use the CustomVision Python SDK to train on a dataset that has multiple objects types in each training image, please direct me to them.
# Go through the data table, extract the labels and upload them together with the images to custom vision
print ("Adding images and tags to custom vision...")
# load images from COCO file
image_files = coco.loadImgs(coco.getImgIds())
base_image_location = basedir + resizedimgdir_test
tagged_images_with_regions = []
# loop over images
for image in image_files:
image_id = image['id']
image_url = image['absolute_url']
image_filename = image['file_name']
print("Image URL " + image_url)
# load tags from COCO file
tags = coco.getAnnIds(imgIds=image_id)
image_tags = coco.loadAnns(tags)
region_labels = []
for tag in image_tags:
# this line needs tweaking
region = [Region(tag_id=categoryMapping((int(tag['category_id'])-1)),\
left=tag['bbox'][0], top=tag['bbox'][1], width=tag['bbox'][2], height=tag['bbox'][3])]
region_labels.append(region)
with open(os.path.join (base_image_location, image_filename), mode="rb") as image_contents:
tagged_images_with_regions.append(ImageFileCreateEntry(name=image_filename, contents=image_contents.read(),\
regions=region_labels))
trainer.create_images_from_files(project.id, ImageFileCreateBatch(images=tagged_images_with_regions))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1428, in Deserializer._deserialize(self, target_obj, data)
1427 for key_extractor in self.key_extractors:
-> 1428 found_value = key_extractor(attr, attr_desc, data)
1429 if found_value is not None:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1193, in rest_key_case_insensitive_extractor(attr, attr_desc, data)
1192 if working_data:
-> 1193 return attribute_key_case_insensitive_extractor(key, None, working_data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1218, in attribute_key_case_insensitive_extractor(attr, _, data)
1217 for key in data:
-> 1218 if lower_attr == key.lower():
1219 found_key = key
AttributeError: 'Region' object has no attribute 'lower'
During handling of the above exception, another exception occurred:
DeserializationError Traceback (most recent call last)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:620, in Serializer.body(self, data, data_type, **kwargs)
615 deserializer.key_extractors = [
616 rest_key_case_insensitive_extractor,
617 attribute_key_case_insensitive_extractor,
618 last_rest_key_case_insensitive_extractor
619 ]
--> 620 data = deserializer._deserialize(data_type, data)
621 except DeserializationError as err:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1398, in Deserializer._deserialize(self, target_obj, data)
1394 continue
1395 setattr(
1396 data,
1397 attr,
-> 1398 self._deserialize(local_type, value)
1399 )
1400 return data
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1407, in Deserializer._deserialize(self, target_obj, data)
1406 if isinstance(response, basestring):
-> 1407 return self.deserialize_data(data, response)
1408 elif isinstance(response, type) and issubclass(response, Enum):
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1618, in Deserializer.deserialize_data(self, data, data_type)
1617 if iter_type in self.deserialize_type:
-> 1618 return self.deserialize_type[iter_type](data, data_type[1:-1])
1620 obj_type = self.dependencies[data_type]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in Deserializer.deserialize_iter(self, attr, iter_type)
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in <listcomp>(.0)
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1631, in Deserializer.deserialize_data(self, data, data_type)
1630 else:
-> 1631 return self._deserialize(obj_type, data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1398, in Deserializer._deserialize(self, target_obj, data)
1394 continue
1395 setattr(
1396 data,
1397 attr,
-> 1398 self._deserialize(local_type, value)
1399 )
1400 return data
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1407, in Deserializer._deserialize(self, target_obj, data)
1406 if isinstance(response, basestring):
-> 1407 return self.deserialize_data(data, response)
1408 elif isinstance(response, type) and issubclass(response, Enum):
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1618, in Deserializer.deserialize_data(self, data, data_type)
1617 if iter_type in self.deserialize_type:
-> 1618 return self.deserialize_type[iter_type](data, data_type[1:-1])
1620 obj_type = self.dependencies[data_type]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in Deserializer.deserialize_iter(self, attr, iter_type)
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in <listcomp>(.0)
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1631, in Deserializer.deserialize_data(self, data, data_type)
1630 else:
-> 1631 return self._deserialize(obj_type, data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1446, in Deserializer._deserialize(self, target_obj, data)
1445 msg = "Unable to deserialize to object: " + class_name
-> 1446 raise_with_traceback(DeserializationError, msg, err)
1447 else:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\exceptions.py:51, in raise_with_traceback(exception, message, *args, **kwargs)
50 try:
---> 51 raise error.with_traceback(exc_traceback)
52 except AttributeError:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1428, in Deserializer._deserialize(self, target_obj, data)
1427 for key_extractor in self.key_extractors:
-> 1428 found_value = key_extractor(attr, attr_desc, data)
1429 if found_value is not None:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1193, in rest_key_case_insensitive_extractor(attr, attr_desc, data)
1192 if working_data:
-> 1193 return attribute_key_case_insensitive_extractor(key, None, working_data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1218, in attribute_key_case_insensitive_extractor(attr, _, data)
1217 for key in data:
-> 1218 if lower_attr == key.lower():
1219 found_key = key
DeserializationError: Unable to deserialize to object: type, AttributeError: 'Region' object has no attribute 'lower'
During handling of the above exception, another exception occurred:
SerializationError Traceback (most recent call last)
c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\TestNotebook.ipynb Cell 10' in <module>
----> 1 trainer.create_images_from_files(project.id, ImageFileCreateBatch(images=tagged_images_with_regions))
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\azure\cognitiveservices\vision\customvision\training\operations\_custom_vision_training_client_operations.py:958, in CustomVisionTrainingClientOperationsMixin.create_images_from_files(self, project_id, batch, custom_headers, raw, **operation_config)
955 header_parameters.update(custom_headers)
957 # Construct body
--> 958 body_content = self._serialize.body(batch, 'ImageFileCreateBatch')
960 # Construct and send request
961 request = self._client.post(url, query_parameters, header_parameters, body_content)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:622, in Serializer.body(self, data, data_type, **kwargs)
620 data = deserializer._deserialize(data_type, data)
621 except DeserializationError as err:
--> 622 raise_with_traceback(
623 SerializationError, "Unable to build a model: "+str(err), err)
625 if self.client_side_validation:
626 errors = _recursive_validate(data_type, data_type, data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\exceptions.py:51, in raise_with_traceback(exception, message, *args, **kwargs)
49 error = exception(exc_msg, *args, **kwargs)
50 try:
---> 51 raise error.with_traceback(exc_traceback)
52 except AttributeError:
53 error.__traceback__ = exc_traceback
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:620, in Serializer.body(self, data, data_type, **kwargs)
614 else:
615 deserializer.key_extractors = [
616 rest_key_case_insensitive_extractor,
617 attribute_key_case_insensitive_extractor,
618 last_rest_key_case_insensitive_extractor
619 ]
--> 620 data = deserializer._deserialize(data_type, data)
621 except DeserializationError as err:
622 raise_with_traceback(
623 SerializationError, "Unable to build a model: "+str(err), err)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1398, in Deserializer._deserialize(self, target_obj, data)
1393 if internal_data_type not in self.dependencies or isinstance(internal_data_type, Enum):
1394 continue
1395 setattr(
1396 data,
1397 attr,
-> 1398 self._deserialize(local_type, value)
1399 )
1400 return data
1401 except AttributeError:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1407, in Deserializer._deserialize(self, target_obj, data)
1404 response, class_name = self._classify_target(target_obj, data)
1406 if isinstance(response, basestring):
-> 1407 return self.deserialize_data(data, response)
1408 elif isinstance(response, type) and issubclass(response, Enum):
1409 return self.deserialize_enum(data, response)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1618, in Deserializer.deserialize_data(self, data, data_type)
1616 iter_type = data_type[0] + data_type[-1]
1617 if iter_type in self.deserialize_type:
-> 1618 return self.deserialize_type[iter_type](data, data_type[1:-1])
1620 obj_type = self.dependencies[data_type]
1621 if issubclass(obj_type, Enum):
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in Deserializer.deserialize_iter(self, attr, iter_type)
1644 if not isinstance(attr, (list, set)):
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in <listcomp>(.0)
1644 if not isinstance(attr, (list, set)):
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1631, in Deserializer.deserialize_data(self, data, data_type)
1629 raise_with_traceback(DeserializationError, msg, err)
1630 else:
-> 1631 return self._deserialize(obj_type, data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1398, in Deserializer._deserialize(self, target_obj, data)
1393 if internal_data_type not in self.dependencies or isinstance(internal_data_type, Enum):
1394 continue
1395 setattr(
1396 data,
1397 attr,
-> 1398 self._deserialize(local_type, value)
1399 )
1400 return data
1401 except AttributeError:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1407, in Deserializer._deserialize(self, target_obj, data)
1404 response, class_name = self._classify_target(target_obj, data)
1406 if isinstance(response, basestring):
-> 1407 return self.deserialize_data(data, response)
1408 elif isinstance(response, type) and issubclass(response, Enum):
1409 return self.deserialize_enum(data, response)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1618, in Deserializer.deserialize_data(self, data, data_type)
1616 iter_type = data_type[0] + data_type[-1]
1617 if iter_type in self.deserialize_type:
-> 1618 return self.deserialize_type[iter_type](data, data_type[1:-1])
1620 obj_type = self.dependencies[data_type]
1621 if issubclass(obj_type, Enum):
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in Deserializer.deserialize_iter(self, attr, iter_type)
1644 if not isinstance(attr, (list, set)):
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1649, in <listcomp>(.0)
1644 if not isinstance(attr, (list, set)):
1645 raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(
1646 iter_type,
1647 type(attr)
1648 ))
-> 1649 return [self.deserialize_data(a, iter_type) for a in attr]
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1631, in Deserializer.deserialize_data(self, data, data_type)
1629 raise_with_traceback(DeserializationError, msg, err)
1630 else:
-> 1631 return self._deserialize(obj_type, data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1446, in Deserializer._deserialize(self, target_obj, data)
1444 except (AttributeError, TypeError, KeyError) as err:
1445 msg = "Unable to deserialize to object: " + class_name
-> 1446 raise_with_traceback(DeserializationError, msg, err)
1447 else:
1448 additional_properties = self._build_additional_properties(attributes, data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\exceptions.py:51, in raise_with_traceback(exception, message, *args, **kwargs)
49 error = exception(exc_msg, *args, **kwargs)
50 try:
---> 51 raise error.with_traceback(exc_traceback)
52 except AttributeError:
53 error.__traceback__ = exc_traceback
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1428, in Deserializer._deserialize(self, target_obj, data)
1425 attr_desc["internalType"] = self.dependencies[internal_data_type]
1427 for key_extractor in self.key_extractors:
-> 1428 found_value = key_extractor(attr, attr_desc, data)
1429 if found_value is not None:
1430 if raw_value is not None and raw_value != found_value:
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1193, in rest_key_case_insensitive_extractor(attr, attr_desc, data)
1190 key = '.'.join(dict_keys[1:])
1192 if working_data:
-> 1193 return attribute_key_case_insensitive_extractor(key, None, working_data)
File c:\Users\prest\OneDrive\Documents\GitHub\ObjectDetectionTest\venv\lib\site-packages\msrest\serialization.py:1218, in attribute_key_case_insensitive_extractor(attr, _, data)
1216 lower_attr = attr.lower()
1217 for key in data:
-> 1218 if lower_attr == key.lower():
1219 found_key = key
1220 break
SerializationError: Unable to build a model: Unable to deserialize to object: type, AttributeError: 'Region' object has no attribute 'lower', DeserializationError: Unable to deserialize to object: type, AttributeError: 'Region' object has no attribute 'lower'