Dat PowerShell een essentiële skill is voor Windows specialisten, is bij de meesten wel bekend. De vraag is ook niet wat je er mee kan, maar wat je er niet mee kan. Meestal wordt Powershell gebruikt voor het beheren van Windows systemen. Ook met het oog op ‘Automation’ is PowerShell essentieel. Zo had ik laatst bij mijn huidige opdracht van een bepaald soort virtuele machine, waar er ongeveer 200 van waren, allemaal geautomatiseerd het geheugen vergroot.

Door: Roel Everink

In deze blogpost ga ik echter een stapje verder. Namelijk PowerShell gebruiken met Azure Cognitive Services. Om bijvoorbeeld de leeftijd te checken van een collega. Deze service van Microsoft is beschikbaar als een REST API, een soort van communicatielaag voor je applicatie wat luistert naar HTTP verzoeken. REST API’s worden steeds meer door software leveranciers gebruikt, om eigen gemaakte applicaties tegen hun software te laten praten. Veel PowerShell modules zijn hier ook op gebaseerd, en daarom is het ook nuttig om hier iets over te weten. Er is ook een specifiek PowerShell commando hiervoor, die we ook gaan gebruiken:

Invoke-RestMethod

Ik ga jullie uitleggen hoe je de Face API kunt gebruiken voor het analyseren van afbeeldingen van personen. Meer specifiek: Ik wil graag een URL opgeven van een afbeelding, waarna ik informatie terugkrijg over de persoon in de afbeelding. Onder andere het geslacht en de leeftijd.

De eerste stap is een API key te bemachtigen. Hiervoor moet ik in de Azure portal een Face API service aanmaken. Als dit gedaan is kan ik deze key bekijken.

$ApiKey = "************"

Bij de Face API zijn er verschillende mogelijkheden: identificeren, groeperen, detecteren, etc. Elk van die functies heeft een eigen API URL. Voor detecteren is de URL:

https://[location].api.cognitive.microsoft.com/face/v1.0/detect[?returnFaceId][&returnFaceLandmarks][&returnFaceAttributes]

Mijn locatie is West-Europa en verder ben ik enkel geïnteresseerd in de attributen. Dit zijn zaken zoals haarkleur, leeftijd, geslacht, make-up, etc. Landmarks zijn de coördinaten van de ogen, mond en neus in de afbeelding. De URL die ik moet gebruiken wordt dan:

$uri = "https://westeurope.api.cognitive.microsoft.com/face/v1.0/detect??returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=$FaceAttributes"

Verder hoef ik alleen nog de header en body te maken, en dan kan ik al een test uitvoeren! In de header geef ik de API key mee en in de body geef ik een link op naar mijn afbeelding, hier opgeslagen onder de variabele “Afbeelding”.

$headers = @{
"Ocp-Apim-Subscription-Key" = $ApiKey
"Content-Type" = "application/json"
}

$body = @{
"url"= $Afbeelding
} | ConvertTo-Json

Dit stop ik allemaal in een functie, zodat ik deze kan aanroepen en alleen maar hoef op te geven welke attributen ik wil zien en wat de URL is van de afbeelding.

function Get-Face {
param (
[Parameter(Mandatory=$false)]    [ValidateSet('age','gender','smile','facialHair','headPose','glasses','emotion','hair','makeup','accessories','blur','exposure','noise')]
[array]$Attributes=@("age","gender"),
[Parameter(Mandatory=$true)][string]$Afbeelding
)

#Stuk code om het array als single line te krijgen, met een comma als scheidingsteken.
$seperator = ","
$FaceAttributes = [string]::Join($seperator,$Attributes)
$uri = "https://westeurope.api.cognitive.microsoft.com/face/v1.0/detect??returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=$FaceAttributes"

$headers = @{
"Ocp-Apim-Subscription-Key" = $ApiKey
"Content-Type" = "application/json"
}

$body = @{
"url"= $Afbeelding
} | ConvertTo-Json

#Invoke REST method met al mijn variablen die ik heb aangemaakt. Vervolgens return ik alleen de faceattributes
$response = Invoke-RestMethod -Uri $uri -Method Post -Headers $headers -Body $body -UseBasicParsing
$response.faceAttributes
}

Op deze manier is het eenvoudig om een URL op te geven. Laat ik eens beginnen met mezelf. De URL van mijn LinkedIn foto heb ik even opgeslagen in de variabele “Roel”.

En dit klopt aardig, op die foto was ik toen bijna 29.

Uiteraard kunnen we ook iemand anders controleren. Bijvoorbeeld Jan Huberts, directielid van ResultaatGroep. Zijn LinkedIn foto staat onder de variabele “Jan”. Hier geef ik ook wat meer attributen op om te detecteren.

De uitkomst is 42. Geen idee of dat klopt natuurlijk, want ik kan helaas zijn echte leeftijd nergens controleren. Maar denk niet dat hij hier ontstemd over zal zijn 🙂

En als ik de extra attributen bij mezelf uittest:

Wat betreft die make-up… Tja, bugs blijven er natuurlijk altijd! 😉

Dit zelf ook uitproberen? Dat kan! Ik heb mijn code namelijk in Azure Functions gezet. Dus je hoeft alleen maar de URL van een afbeelding achter de volgende link te plakken in je browser, en je krijgt al antwoord in JSON formaat.

https://resultaatgroep-faceapi.azurewebsites.net/api/faceAPI?afbeelding=

Nou ja… tot ik door mijn gratis tegoed heen ben natuurlijk. Face API is gratis te gebruiken tot 30.000 transacties.

Meer weten over Powershell, Azure of Azure Functions? Neem dan contact op met ResultaatGroep!