Budjettivalvontakamera liikkeentunnistuksella

Muu­ta­man kym­pin in­ves­toin­nil­la voi ra­ken­taa tal­len­ta­van ja liik­keen tun­nis­ta­van vi­deo­val­von­nan. Mi­nä to­teu­tin it­se­äni Rasp­berry Pil­la ja kym­pin web-ka­me­ral­la, se­kä Motion-oh­jel­mal­la.
Kuva: Mike_fleming: CCTV Camera. CC BY-SA 2.0

Raspberry Pista on moneksi, kuten tiedämme. Päätin toteuttaa erään vähemmän mielikuvituksellisen käyttöidean, ja valjastin yhden Raspberry Pin kyttäämään puolestani. Pienellä investoinnilla käytössäni oli todellinen tee-se-itse-mallinen tallentava videovalvonta.

Web-kameran kuvan tallennus voidaan toteuttaa monella tapaa, mutta päädyin lopulta varsin monipuoliseen Motion-ohjelmaan sen liikkeentunnistusominaisuuksien vuoksi.

Laitteistoltaan viritykseni on varsin vaatimaton: päätön1 Raspberry Pi kahden gigan muistikortilla, 700 mAh:n virtalähteellä ja verkkokaapelilla varustettuna. Kameraksi valitsin Gigantin halvimman Trustin Cuby -webkameran (9,90 €).

Valitsin käyttöjärjestelmäksi Debianin sen tuttuuden vuoksi, vaikkakin tämä tarkoitti sitä, että aluksi jouduin poistelemaan rankalla kädellä oletusasennuksesta mm. X-palvelimen graafisine apuohjelmineen vapauttaakseni muistikortille tarpeeksi tilaa Motionille työkaluineen (mm. FFmpeg).

Kamera toimii UVC:na teoriassa plug-and-play -tekniikalla, käytännössä ei. Tämä johtuu siitä, ettei kameran lukuun tarkoitettua Video4Linux2– (V4L2-)tukea ole Debianin kernelissä. Uudessa firmwaressa tuki sen sijaan on, ja päivittäminen siihen on helppoa Hexxehin rpi-update -työkalun avulla. Seuraavat ohjeet perustuvat Pixelamin blogipostauksen ohjeisiin:

Komennetaan Raspberryn terminaalissa:

sudo apt-get install ca-certificates
sudo apt-get install git-core
sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
sudo chmod +x /usr/bin/rpi-update
sudo rpi-update

Viimeisen komennon tulisi ulostaa virhe:

/opt/vc/sbin/vcfiled: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory

Tämän jälkeen komennetaan:

sudo ldconfig
sudo rpi-update
sudo reboot

Uudelleenkäynnistyksen jälkeen webkameran pitäisi tunnistua, ja /dev/ -kansioon ilmestyä tiedoston ”video0”. Jos näin ei käy, kannattaa ensin alkuun kokeilla irrottaa kamera ja kytkeä se uudelleen – omalla kameralla noin joka neljäs kytkentä johtaa virheeseen, mutta uudelleenkytkentä auttaa.

Web-kamera tuottaa reippaasti dataa, joten ulkoinen tallennusväline on käytännössä pakollinen. Itse päädyin käyttämään NFS-tiedostopalvelintani videokuvan tallentamiseen, mutta iso muistitikku tai ulkoinen kiintolevy toimii toki myös.

Itse Motion-ohjelma löytyy pakettivarastosta. Suosittelen asentamaan sen apt-getin vivulla –no-install-recommends, jotta asennettavien riippuvuuksien määrä pysyy kohtuullisena. En esimerkiksi tarvitse ohjelman MySQL- tai Postgresql-tukea.

Paketin asentamisen jälkeen ohjelmisto on periaatteessa käyttövalmis. On kuitenkin järkevää tehdä ohjelmalle asetustiedosto. Kannattaa huomata, että paketista tupsahtanut /etc/motion/motion.conf ei oletuksena ole käyttäjän luettavissa, joten Motion ei lue sitä vaan toimii oletusasetuksillaan.

Oman asetustiedoston voi tehdä joko /etc/motion/motion.conf -tiedoston, tai seuraavan, omaa asetustiedostoani lähellä olevan, tulosteen pohjalta:

# Ei daemonia, tulosta ulostulo päätteeseen
daemon off
# PID-tiedoston sijainti:
process_id_file /var/run/motion/motion.pid
# Tallenna 1. videolaitteesta
videodevice /dev/video0
# Käytetään YUYV-palettia (jos kamera ei tue tätä,
#käytetään ensimmäistä sopivaa palettia
v4l2_palette 6
# Kaapattavan kuvan leveys ja korkeus. Oma kamerani tukee
# periaatteessa 640×480:een asti, mutta jostain syystä
# näitä suuremmat arvot jumittavat ohjelman. Saattaa
# johtua alitehoisesta virtalähteestä.
width 320
height 240
# Suurin sallittu framerate, itse valitsin 8:
framerate 8
# Ohjelmallinen kirkkauden säätö päälle:
auto_brightness on
# Kuinka monta pikseliä pitää vaihtua, jotta muutosta
# pidetään ”liikkeenä”. Oletus on 1500, mutta kuhunkin
# tilanteeseen sopiva arvo vaihtelee.
threshold 1000
# Ohjelma yrittää säätää liikkeentunnistuksen tarkkuutta
# itse
threshold_tune on
# Tallennetaan hetken aikaa liikkeen päättymisen jälkeen:
post_capture 10
# Kuinka paljon eri liikkeillä voi olla väliä, ennen kuin
# niitä pidetään eri tapahtumina? Oletus 60 sekuntia, mutta
# tämäkin vaihtelee käyttötilanteen mukaan.
gap 30
# Tallenna kustakin tapahtumasta eniten liikettä sisältävän
# kehyksen JPG-kuva:
output_normal best
# Tallennetaan myös videokuvaa
ffmpeg_cap_new on
# Tallennetaan video mpeg4-muotoisena
ffmpeg_video_codec mpeg4
# Tallennetaan lisäksi kerran minuutissa JPG-kuva, oli
# liikettä tai ei
snapshot_interval 60
# Piirretään tunnistetun liikkeen ympärille neliö sekä
# videossa että kuvassa:
locate on
# Tulostetaan kuvan ja videon oikeaan alalaitaan
# tallennusaika
text_right %d.%m.%Yn%T-%q
# Tulostetaan kuvan ja videon vasempaan alalaitaan
# liikkeen ja kohinan määrä, ja tapahtuman juokseva numero
text_left Liike %D | Kohina %NnTapahtuma %v
# Tallenna sisältö tähän kansioon (ja alikansioihin):
target_dir /home/pi/output/
# Minuutin välein otettavien kuvien tallennuskansio ja
# nimimalli (snapshots/pp-kk-vvvv_hhmmss)
snapshot_filename snapshots/%d-%m-%Y_%H%M%S
# Tapahtumien kuvien ja videoiden tallennuskansio ja
# nimimalli (events/tapno-pp-kk-vvvv_hhmmss-kehysno)
jpeg_filename events/%v-%d-%m-%Y_%H%M%S-%q
movie_filename events/%v-%d-%m-%Y_%H%M%S-%q
# Tarjoa livekuvaa (MJPEG) portissa 8081
webcam_port 8081
# Näytä oletuksena 1 fps, ja liikkeessä 4 fps:
webcam_motion on
webcam_maxrate 4
# Salli kaikkien koneiden päästä käsiksi kuvaan
webcam_localhost off

Asetusten teon jälkeen Motionin voi käynnistää päätteessä (screenissä):

motion -c /polku/asetustiedostoon.conf

Jos kaikki meni hyvin, pitäisi Motionin nyt alkaa tallentaa videokuvaa aina liikettä havaitessaan, ja tilannekuvan kerran minuutissa. Lisäksi livekuvaa voi ihmetellä osoitteessa http://raspin.osoite:8081/. Ainakin Firefox tukee käytettyä MJPEG-muotoa suoraan.

Ylläolevilla asetuksilla oma kamerani tuottaa materiaalia noin 15 megatavua tunnissa, eli 360 megatavua vuorokaudessa – suhteellisen maltillisesti siis. Kuvan laatukin on 320×240 -resoluutiolla vielä ihan hyväksyttävä. En kuitenkaan viitsi julkaista kameran kuvia tässä, jotten paljastaisi liikaa sen sijainnista ja kuvauskohteesta.

1) Eli headless, ts. ilman näyttöä

Orivesi maailmankartalle

Kymmenen uutisissakin tänään mainittu Hirsilän koulun tuhopolttoyritys (Aamulehti) toi taas mahtavasti hyvää mainetta kotipaikkakunnalleni Orivedelle. Oletettavasti nämä ”angstinuoret” ovat huomanneet, että on aika jännää änkeä raketteja koulun kellariluukusta sisään, ja kun savua alkoi nousta niin mikäs sen hienompaa.

Aamulehti kirjoittaa:

Hälytyksen palosta teki kiinteistön huoltomies. Hän oli mennyt koululle saatuaan ilmoituksen öljylämmityksen toimintahäiriöstä.

Eli tulipalo lienee ollut menossa pidemmänkin aikaa, ehkä jopa useita tunteja, siksi että koulua ei ollut varustettu asianmukaisin palohälyttimin, jotka lauetessaan siis hälyttäisivät vartiointi/isännöintifirman ja/tai palokunnan paikalle ja kehittämään jatkosuunnitelmaa.

Tuollainen toteutus ei olisi ollut mitenkään kallis eikä vaikea toteuttaa, ja siksi ihmetyttääkin, miksei moista ole tehty. Toinen puute on tallentava videovalvonta, jollainen löytyy kylläkin esim. Oriveden hautausmaalta.

Kumpikaan eivät välttämättä olisi estäneet vahinkoja, mutta molempia tapoja hyödyntäen vahingot olisivat jääneet huomattavasti pienemmiksi plus poliisi olisi saanut jotain johtolankoja nuorisorikollisten henkilöllisyyksistä. Nyt suurin osa kuluista jäänee kuntalaisten maksettavaksi suoraan tai epäsuoraan.

Tähän tapahtumaan liittyy eräs Kauhajoen tapahtumien aikaan blogissani mainittu asia: nuorison nykytila. Vaikkakaan tämä accidentti ei vaatinut yhtään uhreja ja koulunkin vahingot jäivät ilmeisesti melko vähäisiksi, lienee syytä miettiä, mikä tätä nuorisoa riivaa.

Itse luulen pääsyyllisen olevan tässä tapauksessa ”vapaan kasvatuksen” ja sen, että Hirsilä nyt tuntuu vetävän (kaupunginkin avustuksella) ongelmaperheitä. Mutta tälle syyllisellekin on olemassa syyllinen, ja se on se asia, johon mielestäni pitäisi puuttua.

Rajoitukset ja ylenpalttinen holhous eivät auta ketään, vaan enemmänkin kaivataan vanhempien kasvattamista – sitä, että nuo joskus itsekin nuoruuden kokeneet huolehtisivat ihan oikeasti jälkikasvustaan. Ei mitään paapomista eikä sellaista, tietenkään.

Avainsana tässä on kuri, joka nykyään on noussut jo liki kirosanan asemaan. ”Ei lasta saa kurittaa” tulee ilmeisesti mieleen liian usealle holhoojalle nykyään. Mutta itsekin selkääni ottaneena voin sanoa, että kuritus – olkoon se sitten fyysistä tai henkistä – on ihan oikeasti hyvästä. En nyt tarkoita mitään lapsen henkihieveriin hakkaamista kännipäissään tai huumehöyryissä, vaan asiallista ja kasvattavaa kurittamista.

Lienee turhaa asettaa määräyksiä lasten huolenpidon ja kurittamisen minimi- ja maksimimääristä, mutta jotakin yhteiskuntamme pitäisi tehdä näiden vanhempien silmien avaamiseen. Se joka vitsaa säästää, se lastaan vihaa, sanotaan.

Pieni präntti: OK, tämä nyt ei ihan hirveästi liittynyt IT-asioihin jälkiosaltaan, mutta menköön. Tämän tekstin tarkoituksena onkin ihastuttaa ja vihastuttaa lukijoita, ja kommentteja otetaan vastaan. Pyrin pysymään totuudessa ja tekemään selkeiksi ne osat, joissa en ole varma asiasta, mutta pyydän silti huomaamaan, että koko tätä kirjoitusta tulisi pitää minun omana henkilökohtaisena mielipiteenäni eikä niinkään minään absoluuttisena totuutena. Jos tekstistä löytyy asiavirheitä, heitä kommentilla niin korjaan asian. Lisäksi kaikki kommentit – niin kauan kuin ne pysyvät hyvän maun rajoissa – ovat tervetulleita.