From 734b08fecc8e5ed279d946b0172d7ea0447494be Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 27 Jan 2017 11:05:50 +0100 Subject: [PATCH] Microsoft face (#1876) * Microsoft Face * Add platform doku --- source/_components/image_processing.markdown | 21 +++++ ...rocessing.microsoft_face_identify.markdown | 38 +++++++++ .../image_processing.openalpr_cloud.markdown | 4 +- .../image_processing.openalpr_local.markdown | 2 + source/_components/microsoft_face.markdown | 78 ++++++++++++++++++ source/images/supported_brands/microsoft.png | Bin 0 -> 15663 bytes 6 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 source/_components/image_processing.microsoft_face_identify.markdown create mode 100644 source/_components/microsoft_face.markdown create mode 100644 source/images/supported_brands/microsoft.png diff --git a/source/_components/image_processing.markdown b/source/_components/image_processing.markdown index 9c07aff9bac..62bcf5e8011 100644 --- a/source/_components/image_processing.markdown +++ b/source/_components/image_processing.markdown @@ -34,3 +34,24 @@ automation: ``` The following event attributes will be present: `entity_id`, `plate`, `confidence` + +## {% linkable_title Face identify %} + +Face entities attribute have a face counter `total_faces` and all validated person as `known_faces`. + +This event is trigger after Microsoft Face identify found a known faces. + +```yaml +# Example configuration.yaml automation entry +automation: +- alias: Known person in front of my door + trigger: + platform: event + event_type: identify_face + event_data: + entity_id: image_processing.door + name: 'Hans Maier' +... +``` + +The following event attributes will be present: `entity_id`, `name`, `confidence` diff --git a/source/_components/image_processing.microsoft_face_identify.markdown b/source/_components/image_processing.microsoft_face_identify.markdown new file mode 100644 index 00000000000..c796a4136fb --- /dev/null +++ b/source/_components/image_processing.microsoft_face_identify.markdown @@ -0,0 +1,38 @@ +--- +layout: page +title: "Microsoft Face identify" +description: "Instructions how to integrate microsoft face identify into Home Assistant." +date: 2017-01-25 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: microsoft.png +ha_category: Image_Processing +featured: false +ha_release: 0.37 +--- + +The `microsoft_face_identify` image processing platform lets you use [Microsoft Face identify](https://www.microsoft.com/cognitive-services/en-us/) API through Home Assistant. + +Please refer to the [component](/components/microsoft_face/) configuration on how to setup the API key. + +For using inside automation look on [component](/components/image_processing) page. + +### {% linkable_title Configuration Home Assistant %} + +```yaml +# Example configuration.yaml entry +image_processing: + - platform: microsoft_face_identify + group: family + source: + - entity_id: camera.door +``` +Configuration variables: + +- **group** (*Required*): Micrsoft face group to detect person from it. +- **confidence** (*Optional*): The minimum of confidence in percent to process with Home Assistant. Defaults to 80. +- **source** array (*Required*): List of image sources. + - **entity_id** (*Required*): A camera entity id to get picture from. + - **name** (*Optional*): This parameter allows you to override the name of your `image_processing` entity. diff --git a/source/_components/image_processing.openalpr_cloud.markdown b/source/_components/image_processing.openalpr_cloud.markdown index 366578664d6..7b6b819f627 100644 --- a/source/_components/image_processing.openalpr_cloud.markdown +++ b/source/_components/image_processing.openalpr_cloud.markdown @@ -15,6 +15,8 @@ ha_release: 0.36 [OpenALPR](http://www.openalpr.com/) integration for Home Assistant allows you to process licences plates from a camera. You can use them to open a garage door or trigger any other [automation](https://home-assistant.io/components/automation/). +For using inside automation look on [component](/components/image_processing) page. + ### {% linkable_title Configuration Home Assistant %} ```yaml @@ -30,7 +32,7 @@ Configuration variables: - **region** (*Required*): Country or region. List of supported [values](https://github.com/openalpr/openalpr/tree/master/runtime_data/config). - **api_key** (*Required*): You need an API key from [OpenALPR Cloud](https://cloud.openalpr.com/). -- **confidence** (*Optional*): The minimum of confidence in percent to process with Home Assistant. Defaults to 80. +- **confidence** (*Optional*): The minimum of confidence in percent to process with Home Assistant. Defaults to 80. - **source** array (*Required*): List of image sources. - **entities** (*Required*): A list of devices to add in Home Assistant. - **name** (*Optional*): This parameter allows you to override the name of your OpenALPR entity. diff --git a/source/_components/image_processing.openalpr_local.markdown b/source/_components/image_processing.openalpr_local.markdown index ddf911d6d44..81d6886d86f 100644 --- a/source/_components/image_processing.openalpr_local.markdown +++ b/source/_components/image_processing.openalpr_local.markdown @@ -15,6 +15,8 @@ ha_release: 0.36 [OpenALPR](http://www.openalpr.com/) integration for Home Assistant allows you to process licences plates from a camera. You can use them to open a garage door or trigger any other [automation](https://home-assistant.io/components/automation/). +For using inside automation look on [component](/components/image_processing) page. + ### {% linkable_title Local installation %} If you want process all data locally, you need version 2.3.1 or higher of the `alpr` commandline tool. diff --git a/source/_components/microsoft_face.markdown b/source/_components/microsoft_face.markdown new file mode 100644 index 00000000000..f803fbe6075 --- /dev/null +++ b/source/_components/microsoft_face.markdown @@ -0,0 +1,78 @@ +--- +layout: page +title: "Microsoft Face" +description: "Instructions how to integrate Microsoft Face component into Home Assistant." +date: 2017-01-25 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: microsoft.png +ha_category: Hub +ha_release: "0.37" +--- + +The `microsoft_face` component platform is the main component for Microsoft Azure Cognitive service [Face](https://www.microsoft.com/cognitive-services/en-us/face-api). All data are in a own private instance in the azure cloud. + +You need an API key which is free but requires a [Azure registration](https://azure.microsoft.com/de-de/free/) with your microsoft ID. The free resource (*F0*) is limit to 30K request in a month and 20 per minute. If you don't want use a azure cloud, you can also get a API key with registration on [cognitive-services](https://www.microsoft.com/cognitive-services/en-us/subscriptions) but they need to recreate all 90 days. + +To enable the Microsoft Face component, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +microsoft_face: + api_key: YOUR_API_KEY +``` + +Configuration variables: + +- **api_key** (*Required*): The API key for your Cognitive resource. +- **timeout** (*Optional)*: Set timeout for api connection (default 10sec). + +### {% linkable_title Person and Groups %} + +For most of service you need set a group or a person. So it process and detect only stuff they will given with this group. Home-Assistent create for all group a entity and allow your to show the state, person and IDs inside UI. + +For manage this feature you have following services they can call with UI, script or rest api. + +- *microsoft_face.create_group* +- *microsoft_face.delete_group* +```yaml +service: microsoft_face.create_group +data: + name: 'Family' +``` + +- *microsoft_face.create_person* +- *microsoft_face.delete_person* +```yaml +service: microsoft_face.create_person +data: + group: family + name: 'Hans Maier' +``` + +We need add image to a person. We can add multiple image for every person to make the detection better. We can take a picture from a camera or send a local image to our azure resource. + +- *microsoft_face.face_person* +```yaml +service: microsoft_face.face_person +data: + group: family + name: 'Hans Maier' + camera_entity: camera.door +``` + +For the local image we need *curl*. The personId is present in group entity as attribute. + +```bash +curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{GroupName}/persons/{personId}/persistedFaces" -H "Ocp-Apim-Subscription-Key: {ApiKey}" -H "Content-Type: application/octet-stream" --data "@/tmp/image.jpg" +``` + +After we done with changes on a group, we need train this group to make our AI fit to handle the new data. + +- *microsoft_face.train_group* +```yaml +service: microsoft_face.train_group +data: + group: family diff --git a/source/images/supported_brands/microsoft.png b/source/images/supported_brands/microsoft.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa04168f3dac37b0fa648b49c4312cd8d3cf901 GIT binary patch literal 15663 zcmeIZc{J2<{4cDHN~k0u2}L22En}HPB-yu+t+E><+gOIF5M@irzEt*o--iiVvd4^N zEJOCOj3vt$X70yx&+|LyKEK~{&vVYb=lSb8$LSnR`hGv(_ww4lA9S?Tn9g#ZrK6)` zQh%(XM@M%&i;nKtuhYlDPhRz)PJ%x;JRUvs(1+W4AgtYN=#*Z;U)Wq%hgsX%=-F7m z@_GH+MxKsN{*Stfl7TmVWrA#GX#8&NwXIImu}3P&f;zg_IkERuB0dN(e^77rNHVCq zhg~(utjkYr#O!R1FHjlGwd=m*8R(@vdC~gxs~)RV?yvhS_xXi>{P=N;?;YRSM zSoYs$nQg=2eSgwozP>f#r}`5=5p0xj4d==%1 z`%6)RNw-c)V6J?*TQU|%LpbSUN2_n&R8|iRMV{mV|K+%v+j9?RhORjkwbo1>oh(E6 zMVtS81po6c{f}$=KOg&ljI94{2l5|B{9liaqge?)a=s?15C-F>>MU!X?bI2&(@EFF zu6E&iS;R71(j^UX4=pD%1Ms-3M;3PiZb1a{hGTMK_j4BQpA-!Gq{XX?U*G#NcHF-6 z1l=3g_6Yy~VjlnJ%lI$H_W$z7&d>k71@=TnZfjtO&ZMn{O+tJVv_kmTgH$^TRL*d6%R&F;!3s#J0 zvokU>va*=DAs)X%FDxxBIi3yb>Q&9>ZQ*60^SDiH=aF@r?fs64Xl=5=kI?9k!{K%aM*8}!suV4-tm=Z^zkgq7R_!uYRoK`#nM(?f zh`0$h+WIGcwa5aq>b2%zM)TV9p$DR~onM8eq@+AOJ@@_0%*-A>d}zr-vofFyeSGK6 z9RhMIVt+T>oPU$w(#gq5SNBh&Kc%y)i&U4w#?74)9UcAktD%n0r`T9klVhQGiL(XI zYs)GsVty>D%vSH;r_|%7K9*23cNT{V&3XguoSh5ajqc5`v9UP~70AB+`zug-58W5Z zEoa-8s$kcfyzVP{if*+AN#11OLH4)8=aW>ZsS1A5@X3{x*%MFN9R{;{;>G#zeJrc3 z^=bXc25wsG>u1^|r4L2j%E-7;4j;jwXnBVD$2oEaMn-A^4)-@VHy6@SiZ^ctGoE-* zlb@T*OJd^36crVfl?`lIVqjxcxAn7BR4r+C1M$^jnOKj4ANw*4Bgx927-8 z$W9AzTo+Mgij#60aPNITeaU+C4n^gf!D>QC8u^guRm^@nH~LTeY7Z!9Av zmEezD=uNqK^X79dx@Igmv#^gJZ!w6eHu{p|#4MS2-NrE}l!iu_nsio0#XqH)?c>hk z&f_)F)h2X7>5S~6NXlw;OrRP+ZN4Xof#uq{<%b3+(`Zu4s;tN2r#YEqMSpz6cP_fA zD$nJi+eWt-qErK7NRt8X?(Tb+|AM;^HLshEj;Qrqj@4u*6lZ1zw_DLQ_fEHjG;D?A z0_DZoq98FgHZ~?ECf25*^~ zu&|3~?gKriP^s?tsjanjwECfkt$rZgX?7yYOe>>U$Fjt#DOuM2IGXitZ~KZ;UY@

iTnOr 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