Shelf planogram compliance (preview)
A planogram is a diagram that indicates the correct placement of retail products on shelves. The Planogram Compliance API lets you compare analysis results from a photo to the store's planogram input. It returns an account of all the positions in the planogram, and whether a product was found in each position.
Note
The brands shown in the images are not affiliated with Microsoft and do not indicate any form of endorsement of Microsoft or Microsoft products by the brand owners, or an endorsement of the brand owners or their products by Microsoft.
Prerequisites
- You must have already set up and run basic Product Understanding analysis with the Product Understanding API.
- cURL installed. Or, you can use a different REST platform, like Swagger or the REST Client extension for VS Code.
Prepare a planogram schema
You need to have your planogram data in a specific JSON format. See the sections below for field definitions.
"planogram": {
"width": 100.0,
"height": 50.0,
"products": [
{
"id": "string",
"name": "string",
"w": 12.34,
"h": 123.4
}
],
"fixtures": [
{
"id": "string",
"w": 2.0,
"h": 10.0,
"x": 0.0,
"y": 3.0
}
],
"positions": [
{
"id": "string",
"productId": "string",
"fixtureId": "string",
"x": 12.0,
"y": 34.0
}
]
}
The X and Y coordinates are relative to a top-left origin, and the width and height extend each bounding box down and to the right. The following diagram shows examples of the coordinate system.
Note
The brands shown in the images are not affiliated with Microsoft and do not indicate any form of endorsement of Microsoft or Microsoft products by the brand owners, or an endorsement of the brand owners or their products by Microsoft.
Quantities in the planogram schema are in nonspecific units. They can correspond to inches, centimeters, or any other unit of measurement. The matching algorithm calculates the relationship between the photo analysis units (pixels) and the planogram units.
Planogram API model
Describes the planogram for planogram matching operations.
Name | Type | Description | Required |
---|---|---|---|
width |
double | Width of the planogram. | Yes |
height |
double | Height of the planogram. | Yes |
products |
ProductApiModel | List of products in the planogram. | Yes |
fixtures |
FixtureApiModel | List of fixtures in the planogram. | Yes |
positions |
PositionApiModel | List of positions in the planogram. | Yes |
Product API model
Describes a product in the planogram.
Name | Type | Description | Required |
---|---|---|---|
id |
string | ID of the product. | Yes |
name |
string | Name of the product. | Yes |
w |
double | Width of the product. | Yes |
h |
double | Height of the fixture. | Yes |
Fixture API model
Describes a fixture (shelf or similar hardware) in a planogram.
Name | Type | Description | Required |
---|---|---|---|
id |
string | ID of the fixture. | Yes |
w |
double | Width of the fixture. | Yes |
h |
double | Height of the fixture. | Yes |
x |
double | Left offset from the origin, in units of in inches or centimeters. | Yes |
y |
double | Top offset from the origin, in units of inches or centimeters. | Yes |
Position API model
Describes a product's position in a planogram.
Name | Type | Description | Required |
---|---|---|---|
id |
string | ID of the position. | Yes |
productId |
string | ID of the product. | Yes |
fixtureId |
string | ID of the fixture that the product is on. | Yes |
x |
double | Left offset from the origin, in units of in inches or centimeters. | Yes |
y |
double | Top offset from the origin, in units of inches or centimeters. | Yes |
Get analysis results
Next, you need to do a Product Understanding API call with a custom model.
The returned JSON text should be a "detectedProducts"
structure. It shows all the products that were detected on the shelf, with the product-specific labels you used in the training stage.
"detectedProducts": {
"imageMetadata": {
"width": 21,
"height": 25
},
"products": [
{
"id": "01",
"boundingBox": {
"x": 123,
"y": 234,
"w": 34,
"h": 45
},
"classifications": [
{
"confidence": 0.8,
"label": "Product1"
}
]
}
],
"gaps": [
{
"id": "02",
"boundingBox": {
"x": 12,
"y": 123,
"w": 1234,
"h": 123
},
"classifications": [
{
"confidence": 0.9,
"label": "Product1"
}
]
}
]
}
Prepare the matching request
Join the JSON content of your planogram schema with the JSON content of the analysis results, like this:
"planogram": {
"width": 100.0,
"height": 50.0,
"products": [
{
"id": "string",
"name": "string",
"w": 12.34,
"h": 123.4
}
],
"fixtures": [
{
"id": "string",
"w": 2.0,
"h": 10.0,
"x": 0.0,
"y": 3.0
}
],
"positions": [
{
"id": "string",
"productId": "string",
"fixtureId": "string",
"x": 12.0,
"y": 34.0
}
]
},
"detectedProducts": {
"imageMetadata": {
"width": 21,
"height": 25
},
"products": [
{
"id": "01",
"boundingBox": {
"x": 123,
"y": 234,
"w": 34,
"h": 45
},
"classifications": [
{
"confidence": 0.8,
"label": "Product1"
}
]
}
],
"gaps": [
{
"id": "02",
"boundingBox": {
"x": 12,
"y": 123,
"w": 1234,
"h": 123
},
"classifications": [
{
"confidence": 0.9,
"label": "Product1"
}
]
}
]
}
This is the text you'll use in your API request body.
Call the planogram matching API
Copy the following
curl
command into a text editor.curl.exe -H "Ocp-Apim-Subscription-Key: <subscriptionKey>" -H "Content-Type: application/json" "<endpoint>/computervision/planogramcompliance:match?api-version=2023-04-01-preview" -d "<body>"
Make the following changes in the command where needed:
- Replace the value of
<subscriptionKey>
with your Vision resource key. - Replace the value of
<endpoint>
with your Vision resource endpoint. For example:https://YourResourceName.cognitiveservices.azure.com
. - Replace the value of
<body>
with the joined JSON string you prepared in the previous section.
- Replace the value of
Open a command prompt window.
Paste your edited
curl
command from the text editor into the command prompt window, and then run the command.
Examine the response
A successful response is returned in JSON, showing the products (or gaps) detected at each planogram position. See the sections below for field definitions.
{
"matchedResultsPerPosition": [
{
"positionId": "01",
"detectedObject": {
"id": "01",
"boundingBox": {
"x": 12,
"y": 1234,
"w": 123,
"h": 12345
},
"classifications": [
{
"confidence": 0.9,
"label": "Product1"
}
]
}
}
]
}
Planogram matching position API model
Paired planogram position ID and corresponding detected object from product understanding result.
Name | Type | Description | Required |
---|---|---|---|
positionId |
string | The position ID from the planogram matched to the corresponding detected object. | No |
detectedObject |
DetectedObjectApiModel | Describes a detected object in an image. | No |