Inhoudsopgave:

Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi - Ajarnpa
Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi - Ajarnpa

Video: Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi - Ajarnpa

Video: Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi - Ajarnpa
Video: Slimme Koelkast [Die automatisch boodschappen besteld!!] 2024, Juli-
Anonim
Image
Image
Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi
Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi
Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi
Gezichtsherkenningsbeveiligingssysteem voor een koelkast met Raspberry Pi

Surfend op internet heb ik ontdekt dat de prijzen voor beveiligingssystemen variëren van $ 150 tot $ 600 en hoger, maar niet alle oplossingen (zelfs de zeer dure) kunnen worden geïntegreerd met andere slimme tools bij u thuis! U kunt bijvoorbeeld geen beveiligingscamera bij uw voordeur plaatsen, zodat deze automatisch de deur voor u of uw vrienden opent!

Ik heb besloten om een eenvoudige, goedkope en krachtige oplossing te maken, die je overal kunt gebruiken! Er zijn veel handleidingen over het maken van goedkope en zelfgemaakte beveiligingssystemen, maar ik wil de echt niet-triviale toepassing hiervan demonstreren - beveiligingssysteem voor een koelkast met gezichtsherkenning!

Hoe werkt het? De IP-camera bovenop een koelkast, sensoren (twee knoppen) detecteren wanneer een persoon de deur van de koelkast opent, daarna maakt Raspberry Pi een foto van die persoon (met IP-camera) en stuurt deze naar Microsoft Face API om de afbeelding te analyseren en de naam van de persoon te ontvangen. Met deze informatie scant Raspberry Pi de "toegangslijst": als de persoon geen toestemming heeft om de koelkast te openen, waarschuwt Raspberry de eigenaar via e-mail, sms en twitter! (Zie foto's hierboven)

Waarom? Met het systeem kunt u uw gezinsleden onder controle houden, vooral wanneer ze op dieet zijn of moeite hebben met niet eten na middernacht! Of gebruik het gewoon voor de lol!

Bovendien kunt u de camera daadwerkelijk bij uw voordeur opstellen en het systeem configureren om de deur te openen wanneer u, uw familieleden of vrienden naderen. En dit is niet het einde! De mogelijkheden van de applicatie zijn eindeloos!

Laten we beginnen!

Stap 1: Voorbereiding

Voorbereiding
Voorbereiding

Je zal nodig hebben:

  • Raspberry Pi 3 (je kunt oudere versies gebruiken, maar de derde generatie heeft wifi, dus het is erg handig)
  • Toetsen
  • Draden
  • Oude smartphone- of Raspberry Pi-camera

Het eerste dat u hoeft te doen, is uw Raspberry Pi configureren. Gedetailleerde instructies over hoe u dat kunt doen, kunt u hier en hier vinden, maar we zullen de belangrijkste stappen in deze handleiding behandelen.

  1. Download Win32 DiskImager vanaf hier (als u Windows gebruikt)
  2. Download SD Formatter van hier
  3. Plaats de SD-kaart in uw computer en formatteer deze met SD Formatter
  4. Download Raspbian-afbeelding vanaf hier (kies "Raspbian Jessie met pixel")
  5. Voer Win32 DiskImager uit, kies uw SD-kaart, specificeer het pad naar de Raspbian-afbeelding, klik op "Schrijven"
  6. Steek de SD-kaart in uw Raspberry Pi en zet de stroom aan!

Bovendien moet u uw Raspberry Pi configureren om via SSH toegang tot het systeem te krijgen. Op internet staan veel instructies, deze kun je bijvoorbeeld gebruiken of je kunt monitor en toetsenbord aansluiten.

Nu is je Pi geconfigureerd en ben je klaar om verder te gaan!

Stap 2: Een sensor maken

Een sensor maken
Een sensor maken
Een sensor maken
Een sensor maken
Een sensor maken
Een sensor maken

Stapbeschrijving: In deze stap maken we een sensor die detecteert wanneer een persoon de deur van een koelkast opent en de Raspberry Pi activeert.

Om het in te stellen, heb je de 2 knoppen nodig die je oorspronkelijk hebt voorbereid. De eerste knop detecteert wanneer de deur wordt geopend, de tweede knop detecteert wanneer de deur wordt geopend tot het punt waarop we een foto van een persoon maken.

  1. Soldeer draden aan knoppen.
  2. Bevestig de eerste knop aan de deur van de koelkast zodat deze wordt ingedrukt wanneer de deur gesloten is (zie afbeelding hierboven)
  3. Bevestig de tweede knop aan de deur van de koelkast zoals op de foto hierboven. Deze knop moet te allen tijde worden losgelaten, behalve wanneer de deur het punt bereikt waarop het systeem een foto maakt. Om het in te stellen moet je iets aan je koelkast bevestigen zodat deze knop wordt ingedrukt wanneer de deur in de gewenste mate wordt geopend (zie foto's hierboven).
  4. Bevestig draden van de knoppen aan de Raspberry Pi: eerste knop aan GPIO 23 en aarde, tweede knop aan GPIO 24 en aarde (zie fritzing-diagram).

Opmerking: ik gebruik BCM-pinout (geen bord), lees hier meer over het verschil.

Eenmaal verbonden met je Raspberry Pi via SSH, typ je in de terminal om de python-shell uit te voeren:

python3

Als u een monitor en toetsenbord op de Raspberry Pi aansluit, voert u gewoon "Python 3 IDLE" uit vanuit het menu.

De volgende stap is om Raspberry Pi met de knoppen te laten werken. We zullen speciale luisteraars koppelen aan GPIO 23 en 24 pinnen, die zullen luisteren naar "rising edge" -gebeurtenissen en "falling edge" -gebeurtenissen op die pinnen. In het geval van het evenement zullen de luisteraars de functies aanroepen die we hebben gedefinieerd. “Rising edge” betekent dat de knop is ingedrukt en nu wordt losgelaten (eerste knop – deur is geopend), “dalende flank” betekent dat de knop is losgelaten en nu is ingedrukt (tweede knop – deur heeft een bepaald punt bereikt). Meer over de functionaliteit van de knoppen - hier.

Importeer eerst de bibliotheek die ons toegang geeft tot de pinnen:

importeer RPi. GPIO als GPIO

Definieer nu speciale functies die worden aangeroepen wanneer een gebeurtenis wordt geactiveerd:

def sensor1(kanaal): print(“sensor 1 geactiveerd”)def sensor2(kanaal): print(“sensor 2 geactiveerd)

Pinout-type instellen:

GPIO.setmode(GPIO. BCM)

Pinnen configureren:

GPIO.setup(23, GPIO. IN, pull_up_down=GPIO. PUD_UP)GPIO.setup(24, GPIO. IN, pull_up_down=GPIO. PUD_UP)

Luisteraars bijvoegen:

GPIO.add_event_detect(23, GPIO. RISING, callback=sensor1, bouncetime=300)GPIO.add_event_detect(24, GPIO. FALLING, callback=sensor2, bouncetime=300)

Nu kun je het testen! Als u op knop 1 drukt ziet u een melding in klem “sensor 1 getriggerd”, knop 2 geeft u een melding “sensor 2 getriggerd”.

Opmerking: als je klaar bent met experimenteren, vergeet dan niet de volgende functie aan te roepen: GPIO.cleanup().

Laten we nog een functie instellen die wordt aangeroepen wanneer de deur het punt bereikt waarop we een foto maken! Je kunt het zelf doen of mijn implementatie gebruiken die ik hier heb bijgevoegd (sensor.py)

Opmerking: sensor.py wordt alleen gebruikt voor testdoeleinden, de bestanden met volledige functionaliteit heb ik bij de laatste stap gevoegd.

Stap 3: IP-camera configureren

IP-camera configureren
IP-camera configureren
IP-camera configureren
IP-camera configureren
IP-camera configureren
IP-camera configureren

Stapbeschrijving: Nu gaan we de oude smartphone configureren als IP-camera.

Smartphone gebruiken als ip-camera gaat via app. Er zijn verschillende apps voor Android, iOS, Windows Phone die je kunt gebruiken. Ik koos degene met de naam "IP Webcam" voor Android. Dit is een gratis app en is eenvoudig te configureren.

Start de app, ga naar "Videovoorkeuren" om de resolutie van foto's in te stellen die de app zal bieden. Tik vervolgens op "Start server" (eerste afbeelding hierboven). Aan de onderkant van het scherm moet je het ip-adres van de cam zien (zie tweede afbeelding hierboven). In de browser kunt u https://cam_ip_address/photo-j.webp

Bevestig ten slotte de camera aan de koelkast (laatste afbeelding hierboven).

Stap 4: Gezichts-API

Gezichts-API
Gezichts-API

Stapbeschrijving: In deze stap zullen we het hebben over Microsoft's Face API die gezichtsherkenning doet en mensen identificeert.

Microsoft's Face API is een gezichtsherkenningsservice waarmee we foto's kunnen analyseren en mensen erop kunnen identificeren.

Ten eerste hebt u een Microsoft Azure-account nodig. Als je er geen hebt, kun je deze hier gratis maken.

Ten tweede, ga naar https://portal.azure.com, klik op "Nieuw" aan de linkerkant, typ in het formulier "Cognitive Services API's", selecteer het en klik op "Maken". Of u kunt deze link openen. Nu moet je de naam van je service invoeren, het type abonnement, het type API dat je nodig hebt (in ons geval de Face API), de locatie, het prijsniveau, de resourcegroep selecteren en de juridische voorwaarden accepteren (zie screenshot toegevoegd aan deze stap).

Klik ten derde op "Alle bronnen", selecteer uw Face API-service en bekijk de gebruiksstatistieken, inloggegevens, enz.

Face API-details zijn hier te vinden, voorbeelden in verschillende programmeertalen worden gegeven. Voor dit project gebruiken we python. U kunt documentatie lezen en uw eigen set functionaliteiten maken of u kunt degene gebruiken die hier wordt aangeboden (dit is niet de volledige set functionaliteit die door Microsoft wordt geleverd, alleen de punten die nodig zijn voor dit project). Mijn python-bestanden zijn bij deze stap gevoegd.

Laten we naar de structuur van het werk gaan met Face API. Om de "Identificatie"-functionaliteit te gebruiken, moeten we een bibliotheek maken met mensen die de Face API-service gebruiken om de foto's te herkennen die door de app worden gemaakt. Volg de stappen om het in te stellen:

  1. Een groep maken
  2. Personen aan deze groep toevoegen
  3. Voeg gezichten toe aan deze personen
  4. Trein groep
  5. Dien een foto in met de persoon die u wilt identificeren (u moet een foto en groeps-ID opgeven waarin de dienst naar kandidaten zal zoeken)
  6. Resultaat: Als reactie krijgt u een lijst met kandidaten die op de door u ingezonden foto mogen staan.

Ik heb drie bestanden gemaakt met specifieke functionaliteit die het mogelijk maken om met groepen, alleenstaanden en enkele foto's te werken:

  • PersonGroup.py - bevat functies waarmee u: een groep kunt maken, informatie over een groep kunt krijgen, een lijst met al uw groepen kunt krijgen, een groep kunt trainen en de status van de training kunt krijgen
  • Person.py - bevat functies die het volgende mogelijk maken: persoon maken, persoonsinformatie ophalen, alle personen in een opgegeven groep weergeven, gezichten toevoegen aan een opgegeven persoon
  • Face.py - bevat functies die het mogelijk maken: gezicht op afbeelding te detecteren, persoon te identificeren, naam van geïdentificeerde persoon op te halen

In het bestand met de naam "recognition.py" bied ik functies waarmee u kunt controleren of de afbeelding een gezicht bevat en gezichten aan een bepaalde persoon kunt toevoegen (voegt automatisch een gezicht toe van veel afbeeldingen uit de opgegeven map).

Download het bestand dat bij deze stap is gevoegd, pak het uit, verander de globale variabele 'KEY' in de volgende drie bestanden: PersonGroup.py, Person.py en Face.py in uw eigen sleutel die u kunt vinden: portal.azure.com > alle bronnen > face api-service (of hoe je het noemde) > tabblad sleutels. U kunt elk van de twee sleutels gebruiken.

Opmerking: hier gaan we de Face API-service trainen om mensen te herkennen, dus de volgende acties kunnen vanaf elke computer worden gedaan (daarvoor is Raspberry Pi niet nodig) - wijzigingen worden opgeslagen op de server van Microsoft.

Na het wijzigen van KEY, voer je recognition.py uit en voer je de volgende opdracht in de python-shell in:

PersonGroup.create("family", 'fff-fff')) // u kunt uw eigen naam en id gebruiken voor

group printResJson(PersonGroup.getPersonGroup('fff-fff'))

U moet gegevens zien over de groep die u zojuist hebt gemaakt. Voer nu in:

printResJson(Person.createPerson('fff-fff', 'naam van persoon'))

Nu krijg je een persoons-ID. Maak een map met afbeeldingen van deze persoon zodat alle afbeeldingen het gezicht van deze persoon bevatten. U kunt de functie detectFaceOnImages in recognition.py gebruiken die u laat zien op welke foto's een gezicht wordt gedetecteerd. Voer nu het commando uit:

addFacesToPerson('map met afbeeldingen', 'persoon-ID die je hebt gekregen na het vorige commando', 'fff-fff')

Dan moeten we onze service trainen door het volgende in te voeren:

PersonGroup.trainPersonGroup('fff-fff')printResJson(PersonGroup.getPersonGroupTrainingStatus('fff-fff'))

Nu is onze groep getraind en klaar om een persoon te identificeren.

Om de persoon op de afbeelding te controleren, kunt u:

Face.checkPerson(afbeelding, 'fff-fff')

Als reactie krijg je een lijst met kandidaten en waarschijnlijkheid wie er op de foto staan.

Let op: elke keer dat je gezichten aan een persoon of persoon aan een groep toevoegt, moet je de groep trainen!

Stap 5: Node-Red-configuratie

Knooppunt-rode configuratie
Knooppunt-rode configuratie

Stapbeschrijving: in deze stap maken we een Node-Red-stroom die u op de hoogte stelt van de toegangsschending tot uw koelkast =)

Als je Raspberry Pi op Raspbian Jessie november 2015 of een latere versie draait, hoef je Node-Red niet te installeren, omdat deze al voorgeïnstalleerd is. Je hoeft het alleen maar te updaten. Gebruik hier de handleiding.

Nu moeten we Twilio-knooppunt installeren op Node-Red, zodat we een sms-bericht kunnen activeren. Open terminal en typ in:

cd ~/.node-rednpm installeer node-red-node-twilio

Meer over Twilio-knooppunt hier. Voer daarna de Node-Red uit door in de terminal te typen:

knoop-rood

Ga dan naar: https://127.0.0.1:1880/ - als u de browser opent op uw Raspberry Pihttps://{raspberry_pi_ip}:1880/ - als u de Node-Red-editor vanaf een andere computer wilt openen

Gebruik deze instructie om het ip-adres van raspberry pi te weten.

Nu moet je het Twilio-knooppunt vinden in de lijst met knooppunten in je Node-Red-editor (meestal verschijnt het na 'sociale' groep).

Het is tijd om de flow te creëren!

Opmerking: u kunt mijn stroom gebruiken die aan deze stap is gekoppeld, maar vergeet niet om de knooppunten te configureren: e-mail, twitter en twilio. Lees daarover verderop.

Onze stroom begint met het "notify"-knooppunt dat POST-verzoeken van ons hoofdprogramma accepteert met enkele gegevens over toegangsschending (voorbeeld van de gegevens is te vinden in het commentaarknooppunt "over het ontvangen van objecten"). Dit knooppunt reageert onmiddellijk met het bericht "Ok", zodat het hoofdprogramma weet dat de gegevens zijn ontvangen (Flow: /notify > response with Ok > response). Groene node onderaan met de naam msg.payload is er voor foutopsporingsdoeleinden: als iets niet werkt, kun je het gebruiken.

Van eerste knooppunt (/notify) gegevens gepropageerd naar "Data Topic" en "Image Topic" waar respectievelijk de onderwerpen "data" en "image" zijn toegevoegd.

In het "compile"-knooppunt ontvangen we gegevens (die we krijgen tijdens de eerste stap) met het "data"-onderwerp en een afbeelding met het "afbeelding"-onderwerp (de afbeelding is afkomstig uit /home/pi/image.jpg). Deze twee berichten zouden in één object moeten worden gecompileerd, maar de twee objecten worden op verschillende tijdstippen ontvangen! Om dit aan te pakken, gebruiken we de "context"-functie waarmee we gegevens kunnen opslaan tussen functieaanroepen.

De volgende stap is om te controleren of de persoon van onze toegangslijst of het een vreemde is (checkConditions-knooppunt). Er is een "trustedPerson"-veld in de gegevens die we ontvangen: "true" betekent dat we deze persoon kennen, maar hij/zij heeft de toegangsrechten geschonden, "false" betekent dat de persoon een vreemde is.

Wanneer het resultaat "waar" is, sturen we een melding naar Twitter, Twilio en e-mail; wanneer het resultaat "false" is - alleen e-mail en twilio. We maken een object voor e-mail met een bericht, bijgevoegde afbeelding en e-mailonderwerp, een object voor twilio met een bericht. Voor twitter voegen we gegevens toe aan een object als "trustedPerson" waar is. Stuur deze drie objecten vervolgens naar drie verschillende knooppunten.

Opmerking: als het volgende knooppunt geen bericht zou moeten ontvangen, sturen we er gewoon "null" naar toe.

Het is tijd om knooppunten te configureren voor melding!

Twitter Voeg "twitter"-knooppunt toe aan de stroom. Open het door te dubbelklikken. Klik op potlood naast "Twitter ID". Klik vervolgens op "Klik hier om te verifiëren met Twitter". Ga naar uw Twitter-account en geef de Node-Red de benodigde machtigingen.

E-mailVoeg het knooppunt 'e-mail' toe aan de stroom. Als u Gmail niet gebruikt, moet u de gegevens in de volgende velden wijzigen - "Server" en "Poort" (u kunt vinden welke server en poort u moet gebruiken op de Help-pagina's van uw e-mailagent) anders wijzigt u deze niet velden.

  • Naar > e-mailadres waarnaar berichten worden verzonden
  • Userid > login vanuit uw e-mail (misschien hetzelfde als "Aan" veld)
  • Wachtwoord > wachtwoord van uw e-mailaccount
  • Naam > naam voor dit knooppunt

Twilio Ga naar https://www.twilio.com/try-twilio en registreer een account. Verifieer het. Ga naar https://www.twilio.com/console. Klik op "Telefoonnummers" (groot # icoon) en maak een gratis nummer aan. Als u zich buiten de VS bevindt, moet u GEO-machtigingen toevoegen, ga naar https://www.twilio.com/console/sms/settings/geo-pe… en voeg uw land toe.

Ga nu naar de Node-Red-editor, voeg de Twilio-node toe, dubbelklik erop om alle velden te configureren en in te vullen:

  • Inloggegevens > Lokale inloggegevens gebruiken
  • Twilio > bewerken

    • Account-SID > neem vanaf hier
    • Van > typ het virtuele nummer in dat u hebt gemaakt
    • Token > neem vanaf hier
    • Naam > Twilio
  • Uitgang > SMS
  • Naar > uw telefoonnummer
  • Naam > naam voor dit knooppunt.

Klik op Implementeren

Nu is je stroom klaar! U kunt het testen door een POST-verzoek met een gespecificeerd object te verzenden!

Stap 6: Het hele project samenstellen

Het hele project samenstellen
Het hele project samenstellen
Het hele project samenstellen
Het hele project samenstellen

Stapbeschrijving: In deze stap zullen we alle onderdelen samenvoegen en ze als een apart systeem laten werken.

Door deze stap moet u:

  1. Configureer oude smartphone als ip-camera
  2. Hebben werkende sensoren
  3. Getrainde Microsoft's Face API
  4. Geconfigureerde Node-Red-stroom

Nu moeten we de code verbeteren die we in stap 2 hebben geschreven. Meer specifiek function process() dat wordt aangeroepen wanneer iemand de deur opent. In deze functie gaan we het volgende doen:

  1. Haal de afbeelding op van de ip-camera en sla deze op in "/home/pi/" met de naam "image.jpg" (functie "fromIpCam" in bestand "getImage")
  2. Krijg de naam van de persoon op die afbeelding (functie "checkPerson" in bestand "herkenning")
  3. Controleer toegangsrechten voor die persoon (functie “check” in bestand “access”)
  4. Op basis van het resultaat van de functie "controleren" bericht opstellen
  5. Verstuur samengesteld bericht naar Node-Red (functie “toNodeRed” in bestand “sendData”)

Opmerking: om de volledige code van de genoemde functies te zien, downloadt u het zip-bestand dat bij deze stap is gevoegd.

Over de functie "fromIpCam". Deze functie maakt het GET-verzoek aan uw ip-camera, krijgt als reactie een scherp beeld en slaat het op naar het door u gespecificeerde pad. U moet het ip-adres van de camera aan deze functie verstrekken.

Over de functie “checkPerson”. De functie krijgt het pad naar de afbeelding en de groep waarin u de persoon van de foto wilt zoeken als parameters. Ten eerste detecteert het een gezicht op de verstrekte afbeelding (bestand Face.py, functie "detect"). Als reactie krijgt het een id als het gezicht is gedetecteerd. Vervolgens wordt de functie "identificeren" (Face.py-bestand) aangeroepen die vergelijkbare personen in de opgegeven groep vindt. Als reactie krijgt het een persoons-ID als een persoon wordt gevonden. Roep vervolgens de functie "persoon" (bestand Person.py) aan met persoons-ID als parameter, de functie "persoon" retourneert persoon met opgegeven ID, we krijgen de naam van de persoon en retourneren deze.

Over de functie "controleren". Deze functie wordt in het bestand "access" geplaatst waar ook "access list" als een globale variabele wordt geplaatst (u kunt het naar wens aanpassen). Haal de naam van de persoon uit de vorige functie, functie "controleren" vergelijk deze persoon met de toegangslijst en retourneer het resultaat.

Opmerking: het volledige project is bij de volgende stap gevoegd.

Stap 7: Conclusie

In deze stap heb ik het volledige project bijgevoegd dat je moet uitpakken en op je Raspberry Pi moet plaatsen.

Om dit project te laten werken, voert u het bestand "main.py" uit.

Als je Raspberry Pi via SSH bestuurt, moet je twee programma's vanuit één shell uitvoeren: python-programma en Node-Red. Typ in de terminal het volgende:

knoop-rood

Druk op "Ctrl + Z" en typ:

banen

Je hebt het Node-Red-proces gezien. Kijk naar de ID van het proces en typ:

bg

Nu moet Node-Red op de achtergrond gaan werken. Ga vervolgens naar de map met uw project en voer het hoofdprogramma uit:

python3 main.py

Opmerking: vergeet niet om KEY in python-bestanden te wijzigen (stap 4) en inloggegevens in Node-Red-stroom (stap 5)

Gedaan! Uw koelkast is veilig!

Ik hoop dat je genoten hebt van dit hardnekkige! Voel je vrij om je gedachten achter te laten in opmerkingen.

Ik zou het op prijs stellen als je op mijn project stemt =)

Bedankt!

Aanbevolen: