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'

0

There are 0 best solutions below