Sonntag, 28. Februar 2016

Raspberry Pi: autologin


Kurze Beschreibung wie das Raspberry Pi so konfiguriert wird, dass der User pi beim Start automatisch angemeldet wird.
Die dafür notwendigen Einstellungen werden in der inittab Datei vorgenommen. Dazu muss diese mit einem Texteditor geöffnet werden.

sudo vi /etc/inittab

Anschließend wird folgende Zeile gesucht 1:2345:respawn:/sbin/getty 38400 tty1 und die Zeile mit einem beginnenden # auskommentiert. 
Jetzt wird folgende Zeile ergänzt: 1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1

Damit wird beim Start das Login Programm ohne Authentifizierung ausgeführt. Das stellt natürlich ein Sicherheitsrisiko da und sollte nur zu Testzwecken oder in einer abgesicherten Umgebung eingesetzt werden.
Abschließend werden die Änderungen abgespeichert und das Raspberry Pi neugestartet.

Powered by Pelican. Theme blueidea, inspired by the default theme.

Donnerstag, 25. Februar 2016

Gesichtserkennung mit Python und OpenCV

Nach der Beschreibung wie OpenCV installiert werden kann, möchte ich am Beispiel Gesichtserkennung zeigen, wie man damit auf einfache Weise ein kleines Projekt umsetzten kann.
Für die Umsetzung ist bei OpenCV schon alles Notwendige dabei und man kann für ein eigenes Projekt direkt auf ein Beispiel aufbauen. Mein kleines Projekt basiert dabei auf dem Python Tutorial aus der OpenCV Dokumentation. Für weitere Informationen zum zu Grunde liegenden Algorithmus verweise ich auch auf diese, da dort alles sehr gut beschrieben ist und es den Rahmen dieses Blog Eintrages überschreiten würde.


Zielstellung

Mit diesem kleinen Beispiel möchte ich Gesichter im Videostream meiner Notebook Kamera detektierien und diese durch einen Rahmen kennzeichnen.
Das sicherlich Aufwendigste bei der Erkennung von Gesichtern ist das Training des Algorithmus. Dafür ist bei OpenCV ein Trainer für den Algortihmus enthalten. Dies muss man aber nicht selbst durchführen, da der daraus resultierende Classifier bereits enthalten ist. Dieser befindet sich nach der Installation von OpenCV unter 
/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml


Setup

Installation von OpenCV siehe: http://thefoxisthenewowl.blogspot.de/2016/02/opencv-31-linux-mint-173-cinnamon-64-bit.html


Umsetzung

Als Erstes wird ein Projektverzeichnis angelegt und der Classifierer in dieses kopiert.
cd ~
mkdir facedetect
cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml facedetect/haarcascade_frontalface_default.xml

Jetzt wird das Python Skript angelegt. Für dieses Beispiel müssen die Module von OpenCV (cv2) und Numpy importiert werden. Für die Gesichtserkennung muss als erstes der trainierte Classifier geladen werden. Dieser wird in der Variable face_cascade gespeichert. Abweichend vom original Beispiel wird als Eingangsbild kein JPG genommen, sondern es die eingebaute Webcam. Diese wird mit cv2.VideoCapture geöffnet. Dabei werden die erkannten Videoquellen durchnummeriert, ich habe nur eine, daher wird die Quelle 0 verwendet.
import cv2
import numpy as np

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
webcam = cv2.VideoCapture(0)

Die weitere Verarbeitung erfolgt innerhalb einer while Schleife, welche durch STRG+C bzw. q beendet werden kann. Je Schleifendurchlauf muss zuerst das aktuelle Frame der webcam mittels der read() Methode eingelesen werden. Anschließend wird zur Reduzierung der Rechenzeit das Bild auf die halbe Größe reduziert, gespiegelt (optional) und in ein schwarz-weiß Bild umgewandelt.
while(True):
        ret, frame = webcam.read()
        frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5) 
        frame = cv2.flip(frame, 1)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Anschließend erfolgt die eigentliche Gesichtserkennung mit der Methode detectMultiScale(). Die Dokumentation dazu befindet sich hier: 
http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html. Die Koordinaten der erkannten Gesichter werden in faces gespeichert. Mittels len(faces) wird die Anzahl der erkannten Gesichter ermittelt und zur Information ausgegeben.
faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.3,
        minNeighbors=5)

    print "{0} Gesicht(er) gefunden!".format(len(faces))

Im nächsten Schritt wird in einer for Schleife für jedes Gesicht ein Rechteck mit der Methode rectangle() gezeichnet und das Bild miitels imshow() angezeigt.
for (x, y, w, h) in faces:
        img = cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 0), 2)       

    cv2.imshow("Gesicht(er) gefunden", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
         break       

Beim Beenden wird die verwendete Webcam und alle Fenster geschlossen.
webcam.release()
cv2.destroyAllWindows()
Powered by Pelican. Theme blueidea, inspired by the default theme.

Montag, 22. Februar 2016

Markdown Pelican und Blogger - Ein Versuch

Da ich jetzt vermehrt meine Sachen bei github ablege, komme ich in die Verlegenheit vieles doppelt zu dokumentieren. Einmal die README.md bei github und einmal ein Post in diesem Blog. Daher habe ich mich entschlossen einen Weg zu finden die bei github verwendetet Markdown Syntax auch zu Generierung meiner Post zu verwenden.

Derzeit probiere ich mich an dem static website Generator pelican. Dieser kann die mittels Markdown geschriebenen Seiten in HTML konvertieren, welche ich anschließend bei Blogger posten kann. Nachdem ich in die globale Blogger Vorlage ein par Zeilen der des Pelican Theme CSS übernommen habe, sieht es schon recht zufriedenstellend aus. Mal sehen in wieweit ich das alles noch optimieren kann.

Powered by Pelican. Theme blueidea, inspired by the default theme.

Python Virtualenv Einrichten

Virtualenv bietet die Möglichkeit eine von restlichen System abgekapselte Python Umgebung einzurichten. Dies ist sinnvoll, wenn man externe Module nutzen möchte, diese aber nicht global installieren will oder wenn man Module in verschiedenen Versionen für verschiedene Projekte einsetzten will oder muss. Man kann sich recht einfach für jedes Projekt eine separate Python Umgebung einrichten, ohne befürchten zu müssen, dass diese durch ein weiteres Projekt beeinträchtigt wird.
Eine Ausführliche Dokumentation findet sich in der virtualenv Dokumentation unter: https://virtualenv.readthedocs.org/en/latest/
Im Folgenden werde ich an einem einfachen Beispiel die Einrichtung einer virtuellen Python Umgebung festhalten.

Installation

Virtualenv lässt sich über das Paketverwaltungsprogramm von Python (pip) installieren, dazu folgenden Befehl ausführen:
$sudo pip install virtualenv

Einrichtung

Um eine virtuelle Python Umgebung mit virtualenv einzurichten, wechseln wir ins HOME Verzeichnis, legen einen test Ordner und anschließend eine Python Umgebung, mit den folgenden drei Befehlen, an:
$cd ~ 
$mkdir test
$virtualenv venv

venv ist dabei der Ordner in dem die virtuelle Python Umgebung eingerichtet wird. Dazu wird eine Kopie der globalen Python Umgebung angelegt. Wie man diese darüber hinaus konfiguriert, kann der virtualenv Dokumentation entnommen werden. An dieser Stelle reichen die default Einstellungen zuerst aus.

Aktivierung

Zur Aktivierung, d.h. zum Wechsel in die virtuelle Python Umgebung, muss folgendes Skript ausgeführt werden.
$source bin/activate

Durch ein vorangestelltes (venv) erkennt man, dass die virtuelle Python Umgebung aktiv ist.

Deaktivierung

Um die virtuelle Python Umgebung zu verlassen reicht folgender Befehl:
(venv)$deactivate

Deinstallation

Um die virtuelle Python Umgebung zu deinstallieren, reicht es den angelegten Ordner zu löschen.
$rm -r test/venv

Generated by Pelican with crowsfoot theme.

Samstag, 20. Februar 2016

Raspberry Pi: Temperatur Logger

In früheren Einträgen habe ich beschrieben, wie man die CPU (Python Script für Raspberry Pi CPU Temperatur) und die GPU (Python Script für Raspberry Pi GPU Temperatur) Temperatur, sowie man die Temperatur eines 1-wire Temperatursensors misst (Raspberry Pi 1-wire mit Device Tree Overlay)  und außerdem wie man dies mittels Cronjob automatisieren kann (Temperaturmessung per Cronjob).

Vor einiger Zeit habe ich alle Teile zu einem Projekt zusammengefasst und bei github (https://github.com/f0xd3v1lsw1ld/1-wire) veröffentlicht. Jetzt erfolgt hier eine kleine Vorstellung. Neben der simplen Messwertaufnahme und Speicherung in einer CSV, werden die Temperaturwerte auch in einer Datenbank abgelegt.

Somit können einige Auswertefunktionen relativ einfach genutzt werden. Derzeit habe ich folgende Funktionen implementiert:

  • minimal Temperatur
  • maximale Temperatur
  • durchschnittliche Temperatur

Weiterhin ist es möglich den Zeitraum der statistischen Auswertung durch Angabe des Start- und Enddatums einzuschränken.


Nun zur Verwendung:


Falls nicht bereits vorhanden, muss zunächst auf dem Raspberry Pi git installiert werden.

$sudo apt-get install git
Anschließend wechseln wir in das Home Verzeichnis und clonen uns das Repository von github.

$cd ~
$git clone https://github.com/f0xd3v1lsw1ld/1-wire.git

Schauen wir uns zunächst den Inhalt des Projektes an.

$cd 1-wire
ls
cpu_temperature.py dygraph-combined.js fritzing move.sh
database_temperature.py dygraph-extra.js index.html README.md

Dazu folgende Erklärung:


cpu_temperature.py
Dieses Skript liest die Temperaturen der GPU, CPU und eines 1-wire Temperatursensors aus. Diese werden anschließend in eine csv Datei und in eine sqlite3 Datenbank geschrieben. Aufgerufen wird das Skript per cronjob. Um das Skript an das eigene Setup anzupassen, kann der Pfad für die CSV und die Datenbank und muss die ID des 1-wire Sensors (siehe Raspberry Pi 1-wire mit Device Tree Overlay) angepasst werden.

database_temperature.py
Dieses Skript hat zwei Einsatzmöglichkeiten. Erstens wird es von cpu_temperature.py zum Speichern der Temperaturwerte in der Datenbank aufgerufen. Zweitens kann dieses alleine dazu genutzt werden die Statistikfunktionen zu nutzen.

$./database_temperature.py
usage: database_temperature.py [-h] [-i] [-d DIRECTORY] [--min] [--max]
[--avg] [-s START] [-e END] [-p]
optional arguments:
-h, --help show this help message and exit
-i import all csv files of current dir
-d DIRECTORY set working directory
--min show mininmal value
--max show maximal value
--avg show average value
-s START set start date YYYY-MM-DD
-e END set end date YYYY-MM-DD
-p print values

move.sh
Ist ein einfaches Shell Skript, welches ebenfalls per cronjob aufegrufen wird. Der Zweck des Skriptes liegt darin, dass es die CSV Datei des Vortages anhand des Datums umbennet. Als Resultat gibt es für jeden Tag eine CSV mit allen Messwerten. Wird das Skript nicht verwendet landen alle Messwerte in einer CSV Datei.

frizing
Ist ein Ordner und enthält das Frizing Modell aus Raspberry Pi 1-wire mit Device Tree Overlay.

dygraph-combined.js, dygraph-extra.js, index.html

Visualisierung der CSV Messdaten mittels dygraph im Browser. Mehr dazu gibt es z.B. hier Datenvisualisierung mit Dygraph.


Installation:


Nachdem nun alle Projektdatein beschrieben sind, erfolgt nun die Aktivierung der automatischen Messwertaufnahme. Dazu muss crontab geöffnet werden und die folgenden beiden Zeilen (für die Messwertaufnahme und die CSV Umbenennung) eingetragen werden. Evtl. muss der Pfad für die Skripte an des entsprechende Setup angepasst werden.

$ crontab -e
*/10 * * * * /home/pi/1-wire/cpu_temperature.py>>/dev/null
00 0 * * * /home/pi/1-wire/move.sh /home/pi/1-wire/ rpi_temperature.csv>>/dev/null


Erklärung:

Mit der ersten Zeile wird cpu_temperature.py alle 10 min aufgerufen und alle evtl. auftretenden Ausgaben nach /dev/null ausgegeben.

Mit der zweiten Zeile wird move.sh täglich um 00:00 aufgerufen und alle evtl. auftretenden Ausgaben nach /dev/null ausgegeben.

Repository:


https://github.com/f0xd3v1lsw1ld/1-wire)

Dienstag, 16. Februar 2016

Python Script Sammlung

Ich habe mir bei github ein Repository angelegt unter dem ich einige hilfreiche Python Skripte abgelegt habe und zukünftig ablegen werde. Derzeit befinden sich hier Beispiele von der Prüfung einer md5 Prüfsummer bis zu einem kleinen Echo Server.

Hier der Link zum github repo: https://github.com/f0xd3v1lsw1ld/python-snippets

Montag, 8. Februar 2016

OpenCV 3.1 Linux Mint 17.3 Cinnamon 64-bit


In diesem Eintrag beschreibe ich, wie man OpenCV 3.1 unter Linux Mint 17.3 Cinnamon 64-bit für python 2.7 (default für OpenCV) einrichte.

Als erstes wird ein Arbeitsverzeichnis angelegt.
$ mkdir opencv
$ cd opencv
Anschließend werden die Quellen der aktuelle OpenCV Version von opencv.org heruntergeladen,
$ wget https://github.com/Itseez/opencv/archive/3.1.0.zip
ausgepackt
$ unzip 3.1.0.zip
und in das entpackte Verzeichnis gewechselt.
$ cd opencv-3.1.0
Um aus den Quellen OpenCV zu bauen, werden einige zusätzliche Pakete benötigt, welche zunächst installiert werden müssen. Dies wird im folgenden Schritt erledigt.
$ sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev cmake-qt-gui
Nachdem nun alles vorbereitet ist, wird noch ein build Verzeichnis angelegt und in dieses gewechselt.
$ mkdir build
$ cd build
Der Buildvorgang von OpenCV wird mittels cmake konfiguriert, daher muss im frisch angelegten build Verzeichnis zunächst cmake aufgerufen werden. Mit cmake wird OpenCV konfiguriert, in der Release Version gebaut und anschließend in das Verzeichnis /usr/local installiert. Außerdem werden die python Beispiele (default für v2.7) installiert. Mit dem abschließenden ".." wird angegeben, dass sich die Quellen im übergeordneten Verzeichnis befinden.
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=OFF -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON..
Hinweis 1: Um weitere Einstellungen vorzunehmen kann die gui version cmake-gui verwendet werden.
Hinweis 2: In der Version 3.1.0 ist scheinbar ein Fehler enthalten, wenn die C Example gebaut werden sollen, daher den Schalter INSTALL_C_EXAMPLES=ON nicht aktivieren bzw. auf OFF setzten.


Wenn die Konfiguration abgeschlossen ist, kann OpenCV gebaut werden. Um den Prozess zu beschleunigen wird empfohlen, den Build Prozess mit mehren parallelen Prozessen auszuführen.
$ make -j4 # runs 4 jobs in parallel
Jetzt ist etwas Geduld gefragt, wie lange der Build Prozess dauert, hängt vom HOST ab. Aber wenn der Vorgang abgeschlossen ist, wird OpenCV mit folgenden Befehl in /usr/local installiert.
$  sudo make install
Die installierten Python Beispiele befinden sich anschließend unter: /usr/local/share/OpenCV/samples/python.

Zum Test kann als Beispiel die Anzeige des webcam Bildes probiert werden:
$ sudo python /usr/local/share/OpenCV/samples/python/video.py