{"id":45702638,"url":"https://github.com/seamkedu/visitorcount","last_synced_at":"2026-02-24T23:08:39.528Z","repository":{"id":163934870,"uuid":"620210422","full_name":"SeAMKedu/visitorCount","owner":"SeAMKedu","description":"Visitor Count on kevyt kamerakuvan tunnistukseen perustuva kävijälaskuri esimerkiksi turistikohteille","archived":false,"fork":false,"pushed_at":"2023-10-30T19:52:50.000Z","size":352,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-05T01:32:44.344Z","etag":null,"topics":["mqtt","object-detection","opencv-python","yolov4"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc-by-4.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SeAMKedu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-03-28T08:38:04.000Z","updated_at":"2025-08-19T12:37:33.000Z","dependencies_parsed_at":"2025-04-13T04:43:53.562Z","dependency_job_id":"b89aac51-2cc9-41d5-9940-20d848a8bb3c","html_url":"https://github.com/SeAMKedu/visitorCount","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/SeAMKedu/visitorCount","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeAMKedu%2FvisitorCount","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeAMKedu%2FvisitorCount/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeAMKedu%2FvisitorCount/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeAMKedu%2FvisitorCount/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SeAMKedu","download_url":"https://codeload.github.com/SeAMKedu/visitorCount/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeAMKedu%2FvisitorCount/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29804317,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T22:43:48.403Z","status":"ssl_error","status_checked_at":"2026-02-24T22:43:18.536Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mqtt","object-detection","opencv-python","yolov4"],"created_at":"2026-02-24T23:08:34.723Z","updated_at":"2026-02-24T23:08:39.523Z","avatar_url":"https://github.com/SeAMKedu.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![DOI](https://zenodo.org/badge/620210422.svg)](https://zenodo.org/badge/latestdoi/620210422)\n\n![Älykkäät teknologiat](https://storage.googleapis.com/seamk-production/2022/04/2b1d63e0-alykkaat-teknologiat_highres_2022-768x336.jpg)\n![ESR](https://storage.googleapis.com/seamk-production/2022/02/da4e4541-eu-lippu-290x300.png) ![Vipuvoimaa](https://storage.googleapis.com/seamk-production/2022/02/8d432b35-vipuvoimaa-eulta-logo-300x212.png) ![ELY-keskus](https://storage.googleapis.com/seamk-production/2021/08/5e942eac-ely-keskus_logo-300x105.png) ![SeAMK](https://storage.googleapis.com/seamk-production/2022/02/79a4ce1b-seamk_vaaka_fi_en_rgb_1200x486-300x122.jpg)\n# Kävijäseuranta ja raportointi\nTämä sovellus laskee kamerakuvan perusteella kävijöiden määrät ja koostaa näistä raportit sähköpostiin päivittäin, viikottain ja kuukausittain.\n# Julkaisun historiatiedot\nMerkittävät muutokset julkaisuun\n\n|pvm|Muutokset|Tekijä|\n|---|---|---|\n|15.2.2023|1. julkaisu|Tommi Ylimäki|\n|13.3.2023|Mosquitto ja systemctl|Tommi Ylimäki|\n|28.3.2023|julkaisu SeAMKedussa|Tommi Ylimäki|\n# Sisällysluettelo\n- [Julkaisun nimi](#julkaisun-nimi)\n- [Julkaisun historiatiedot](#julkaisun-historiatiedot)\n- [Sisällysluettelo](#sisällysluettelo)\n- [Teknologiapilotti](#teknologiapilotti)\n- [Hanketiedot](#hanketiedot)\n- [Kuvaus](#kuvaus)\n- [Tavoitteet](#tavoitteet)\n- [Toimenpiteet](#toimenpiteet)\n- [Asennus](#asennus)\n- [Vaatimukset](#vaatimukset)\n- [Käyttö/käynnistys](#käyttökäynnistys)\n- [Tulokset](#tulokset)\n- [Lisenssi](#lisenssi)\n- [Tekijät](#tekijät)\n- \n\n# Teknologiapilotti\nTehoData-hankkeen pilotissa 10 pyrittiin luomaan edullinen kävijälaskuri pienille matkailualan yrityksille Etelä-Pohjanmaalla. Julkaisu löytyy osoitteesta [https://lehti.seamk.fi/alykkaat-ja-energiatehokkaat-jarjestelmat/tekoaly-tuo-tarkkuutta-matkailuyrityksen-kavijadataan/](https://lehti.seamk.fi/alykkaat-ja-energiatehokkaat-jarjestelmat/tekoaly-tuo-tarkkuutta-matkailuyrityksen-kavijadataan/).\n\n# Hanketiedot\n- Hankkeen nimi: Datasta ketteryyttä ja uutta liiketoimintaa Etelä-Pohjanmaan pk-yrityksiin (TehoData)\n- Rahoittaja: Keski-Suomen ELY/ Euroopan sosiaalirahasto ESR\n- Aikataulu: 1.9.2021–31.08.2023\nHanke rahoitetaan REACT-EU-välineen määrärahoista osana unionin covid-19-pandemian johdosta toteuttamia toimia.\nTehoDatan hankesivut löytyvät osoitteesta [https://projektit.seamk.fi/alykkaat-teknologiat/tehodata/](https://projektit.seamk.fi/alykkaat-teknologiat/tehodata/)\n\n# Tavoitteet\nPilotissa kehitettiin edullista, avoimen lähdekoodin kuvantunnistusalgoritmien toimintaan perustuvaa kävijälaskuria.\n# Toimenpiteet\nSovelluskokonaisuuden toimintaa on testattu pilottiyrityksessä loppukesästä 2022, minkä pohjalta määriteltiin jatkokehitystarpeet:\n-sovellus on saatava toimimaan nopeammin (tavoitteena sujuvuus Raspberry Pi 4:llä tai ainakin Jetson Nanolla)\n-sovellukseen vaihdettiin paremmin toimiva kohteenseuranta-algoritmi\n-sovellus on pilkottiin modulaarisiin osiin, jotta esimerkiksi tulo- ja lähtötapahtumien tunnistamiseen käytetty teknologia voidaan haluttaessa vaihtaa\n\n# Kuvaus\nSovellus toteaa kamerakuvasta rajaviivat ylittäneet seurattavat kohteet ja koostaa näistä tiedoista raportit sähköpostiin päivittäin, viikottain ja kuukausittain.\n## TIETOSUOJA JA TIETOTURVA\nSovellus käyttää suojaamatonta yhteyttä MQTT brokerin ja skriptien ja toisaalta http-palvelimen kanssa. Ethän käytä sovellusta kuin suljetussa lähiverkossa. \n\nSovellus ei talleta kuvia tai videota, mutta se mahdollistaa kerran sekunnissa päivittyvän live-kuvan seuraamisen web-käyttöliittymän kautta. Tätä käyttöliittymää ei ole tarkoitus käyttää kuin asennusvaiheessa kameran oikean suuntaamisen varmistamiseksi.\n## Kävijälaskurin toiminta\nKävijälaskurin toiminta perustuu modulaariseen sovellusrakenteeseen, joka koostuu viidestä päämoduulista:\n- Tunnistusmoduuli [yoloCount.py](yoloCount.py) \n- edelliselle vaihtoehtoinen kasvojen tunnistamiseen pohjautuva [faceCount.py](faceCount.py)\n- Dataa levylle tallettava [listener.py](listener.py)\n- Tilastot muotoileva [parse_stats.py](parse_stats.py)\n- Raportit sähköpostiin lähettävä [emailing.py](emailing.py)\n- web-serverin käynnistävä [routes.py](routes.py)\n- kaikkien Python-skriptien yhteinen konfiguraatiotiedosto [configuration.ini](configuration.ini) \n- edellisen mallipohjatiedosto [configuration.ini_model](configuration.ini_model)\n\nNäiden lisäksi on apumoduuleja, joihin on pakattu tarvittavia funktioita ja luokkia:\n- MQTT-moduulin käärivä [mqtt_class.py](mqtt_class.py)\n- Levyoperaatiot suorittava [disk_functions.py](disk_functions.py)\n- OpenCV piirtofunktiot kameran ottamille kuville suorittava [drawing_functions.py](drawing_functions.py)\n\n## Tunnistusmoduuli vehicle_count.py\nyoloCount.py nojaa OpenCV-kirjaston Darknet-neuroverkkoalustalle rakennettuun, valmiiksi koulutettuun [YoloV4-verkkoon](https://paperswithcode.com/method/yolov4), GitHubissa [https://github.com/pjreddie/darknet](https://github.com/pjreddie/darknet). Kehittelyn pohjaksi otettiin [TechVidvanin](https://techvidvan.com/tutorials/opencv-vehicle-detection-classification-counting/) mallikoodi. Skripti alustaa neuroverkon valmiilla YOLOv4-lite (tai raskaammalla YOLOv4) koulutustiedostolla [https://github.com/AlexeyAB/darknet/tree/master/cfg](https://github.com/AlexeyAB/darknet/tree/master/cfg), joka tunnistaa COCO-aineiston 80 erilaista objektia. Tämän pilotin kannalta oleellisia ovat ihmiset, mutta skriptiin on helppo valita haluamansa seurattavat objektit mukauttamalla asetustiedoston `required_classes`-listaa.\n\nSkriptissä on kirjoitushetkellä sisäänrakennettuna mahdollisuus sekä paikallisen käyttöjärjestelmän ikkunaan että web-palvelimelle käyttöliittymän tuottavaan ajoon (boolean-muuttujat `setup_local_screen` ja `web_screen`). Nämä eivät kuitenkaan ole pakollisia itse toiminnan kannalta. Video-kuvaa voi välittää myös MQTT-brokerille `/pic` aihekanavalle asetustiedoston `setupMqttVideo` boolean-muuttujan avulla, joskin etenkin pilvessä toimivat maksuttomat MQTT-brokerit eivät yleensä salli merkittävien data-määrien siirtämistä pitkää aikaa. Paikallisella MQTT-brokerilla kuten [Mosquitto](https://mosquitto.org/) ongelma on pienempi.\n\nSkripti etenee käynnistyttyään ikuiseen `while True`-silmukkaan, jossa se\n- kaappaa kuvan kameralta\n- tunnistaa kuvasta annettujen raja-arvojen puitteissa eri objektit\n- kutsuu kohteenseurannan palvelut tarjoavan motpy-luokan oliota tracker2\n- piirtää tarvittavat bounding boxit tunnistettujen objektien ympärille\n- piirtää muut kuvaan tarvittavat viivat\n- seuraa objektien liikettä: mikäli jokin seurattu objekti siirtyy alueelta toiselle, julkaisee vastaavan MQTT-viestin\n\nMQTT-viestit ovat rakenteeltaan `topic: mqqtClient/from/to/type, message: timestamp`, missä mqqtClient on asiakkaalle annettu nimi (asetustiedoston `detectionPublishers`, esimerkiksi \"VehicleCount_Publisher\"), from on lähtöalueen nimi ja to tuloalueen nimi (asetustiedoston `directions`-lista, esimerkiksi [\"Sisaan\", \"Ulos\"]). Type on objektin tyyppi, esimerkiksi `person`. Viestin sisältö on tapahtumahetken datetime-aikaleima.\n## Arkkitehtuuri\nSovelluksen kokonaistoiminta perustuu MQTT-brokerin vastaanottamien ja välittämien viestien avulla tapahtuvaan erillisten moduulien keskusteluun. Sovelluksen pääasiallinen viestien arkkitehtuuri kuvastuu alla\n\n```mermaid\nclassDiagram\n    vehicle_count --\u003e MQTTbroker : julkaisee havaitut tapahtumat\n    parse_stats --\u003e MQTTbroker : julkaisee JSON raportit\n    listener --\u003e raw_log : kirjoittaa raakadatan\n    raw_log --\u003e parse_stats : raakadata luetaan \n    MQTTbroker --\u003e listener : tilaa tapahtumaviestit\n    MQTTbroker --\u003e emailing : tilaa JSON raportit\n    emailing --\u003e email_recipient : lähettää sähköpostit\n    MQTTbroker : paikallinen tai pilvipalvelu\n    vehicle_count : tunnistaa liikkeen\n    vehicle_count : julkaisee tapahtumat\n    emailing : lähettää raportit sähköpostilla\n    emailing : daily, weekly, monthly instanssit\n    listener : tallettaa raakadatan levylle\n    parse_stats: koostaa tilastot\n    parse_stats: daily, weekly, monthly instanssit\n    raw_log : raakadata CSV-tiedosto\n    email_recipient : sähköpostin vastaanottaja\n```\n## Raportti\nSovellus toimittaa annettuun sähköpostiosoitteeseen yksinkertaisen HTML-muotoisen (ja pelkistetyn tekstimuotoisen) raportin päivä-, viikko- ja kuukausitasolla. Alla esimerkki viikkotilasosta, joka kokoaa tiedot edelliseltä kokonaiselta viikolta.\n\u003chtml\u003e\n    \u003cbody\u003e\n        \u003ch1\u003eRaport\u003c/h1\u003e\n        \u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003etietoa raportista\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003etilastoinnin käynnistysaika\u003c/th\u003e\u003ctd\u003e2023-02-15 16:47:32.729005\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003etämän tilaston luontiaika\u003c/th\u003e\u003ctd\u003e2023-02-15 16:47:37.753461\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003etilaston järjestysnumero\u003c/th\u003e\u003ctd\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003etilaston tyyppi\u003c/th\u003e\u003ctd\u003e\u003cul\u003e\u003cli\u003eviikkotilasto\u003c/li\u003e\u003cli\u003e2023/02/06 - 2023/02/13\u003c/li\u003e\u003c/ul\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003eseuratut\u003c/th\u003e\u003ctd\u003e\u003cul\u003e\u003cli\u003ehenkilö\u003c/li\u003e\u003c/ul\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003eyhteensä\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003ehenkilö\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003eSisaan-\u0026gt;Ulos\u003c/th\u003e\u003ctd\u003e7\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003eUlos-\u0026gt;Sisaan\u003c/th\u003e\u003ctd\u003e5\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003ehenkilö\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003eviikon päivä\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003esuunta\u003c/th\u003e\u003ctd\u003elukumäärä\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003e3\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003eUlos-\u0026gt;Sisaan\u003c/th\u003e\u003ctd\u003e2\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003e4\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003eSisaan-\u0026gt;Ulos\u003c/th\u003e\u003ctd\u003e4\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003eUlos-\u0026gt;Sisaan\u003c/th\u003e\u003ctd\u003e2\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003e7\u003c/th\u003e\u003ctd\u003e\u003ctable border=\"1\"\u003e\u003ctr\u003e\u003cth\u003eSisaan-\u0026gt;Ulos\u003c/th\u003e\u003ctd\u003e3\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth\u003eUlos-\u0026gt;Sisaan\u003c/th\u003e\u003ctd\u003e1\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n\n# Asennus ja käyttö\n## repositorion kloonaus\n1. Kloonaa repositorio esimerkiksi korttikoneelle `git clone` komennolla. Tarvittaessa klikkaa GitHubin vihreää Code-painiketta. On suositeltavaa luoda palvelua varten oma Python virtuaaliympäristö:\n```\npython3 -m venv venv\nsource venv/bin/activate\npip install -r requirements.txt\n```\nHuomaa että Jetson-korttikoneen CUDA-backendin toimimiseksi joudut kääntämään openCV-kirjaston itse, sillä jakelussa oleva paketti ei tukea sisällä. Tähän löytyy erinomainen ohje [https://qengineering.eu/install-opencv-4.5-on-jetson-nano.html](https://qengineering.eu/install-opencv-4.5-on-jetson-nano.html). Jos käytät ohjelmaa esimerkiksi kohtuullisen tehokkaalla kannettavalla tietokoneella, kuvantunnistuksen päivitystaajuus voi riittää luotettavaan toimintaan mutta Jetson Nano -korttikoneella CUDA-tuki on välttämätön.\n\n2. Kopioi asetustiedostopohja varsinaiseksi asetustiedostoksi: `cp configuration.ini_model configuration.ini`\n## MQTT brokerin asennus ja asetukset\n3. Mikäli sinulla ei ole käytössä pilvipohjaista MQTT brokeria (esimerkiksi [Flespi](flespi.io)), asenna paikallinen broker, esimerkiksi Mosquitto:\n`sudo apt install mosquitto`\nTässä tapauksessa varmista että Mosquitto kuuntelee sekä websockets että MQTT-protokollaa ja että kirjautumista ei vaadita (mikäli et sitä erikseen halua käyttää):\n`sudo nano /etc/mosquitto/mosquitto.conf`\n```\npid_file /var/run/mosquitto.pid\npersistence_location /var/lib/mosquitto/\nlog_dest file /var/log/mosquitto/mosquitto.log\ninclude_dir /etc/mosquitto/conf.d\nlistener 1883                             \nlistener 8080\nprotocol websockets\nallow_anonymous true\nconnection_messages true\nlog_timestamp true\nlog_dest stdout          \n```\n\n4. Muuta asetukset oikeiksi asetustiedoston mqtt-osiossa:\n`nano configuration.ini`\n```\n[mqtt]\nport = 1883 (ellet käytä salattua yhteyttä)\nssl = False (ellet käytä salattua yhteyttä)\ntoken = käyttäjätunnus (paikallisella brokerilla voi olla tyhjäkin, \"\")\nbrokerAddress = IP-osoite, paikallisella brokerilla 0.0.0.0\nclean_session = False\n```\n\n5. Muuta sähköpostiasetukset asetustiedoston email-osiossa:\n```\n[email]\nsender_email = lähettäjän sähköpostiosoite\nreceiver_email = raportin vastaanottajan sähköpostiosoite\nsmtp = smtp-palvelin, esimerkiksi smtp-mail.outlook.com\npassword = salasana, HUOM: ole varovainen salasanan tallentamisen kanssa!\nuser = sähköpostitilin käyttäjätunnus, usein sama kuin sender_email\nport = sähköpostipalvelimen SMPT-portti, esimerkiksi live-palvelussa 587\n```\n6. Valitse haluatko videokuvaa MQTT-palveluna web-käyttöliittymään (normaalisti tätä ei kannata pitää sillä se lisää liikennettä)\n```\n[mqtt]\nsetupMqttVideo = True tai False\nmqttVideoResolution = julkaistavan videokuvan pidemmän sivun pikselimäärä, esim 500\nmqttVideointerval = kuvien julkaisuväli sekunteina, esim 1.0\n```\n## Systemctl palvelun luonti ja käynnistys\n7. luo systemctl-palvelu, jotta sovellus käynnistyy automaattisesti koneen käynnistyessä:\nKirjoita uusi palvelutiedosto `sudo nano /etc/systemd/system/vehicle_count.service` (nano-editorissa näppäinyhdistelmä ctrl+o tallettaa ja ctrl+x poistuu editorista)\n```\n[Unit]\nDescription=Vehicle count demo service\nAfter=network.target                        \nStartLimitIntervalSec=0                                      \n\n[Service]                                      \nType=simple                                      \nRestart=always                                      \nRestartSec=1                                      \nUser=LINUX KÄYTTÄJÄTUNNUS                                      \nExecStart=/home/seamk/vehicle_count/start_service.sh                                                                         \nWorkingDirectory=REPOSITORION HAKEMISTO/vehicle_count\n\n[Install]\nWantedBy=multi-user.target\n```\nAktivoi palvelu `sudo systemctl enable vehicle_count.service`\nKäynnistä palvelu `sudo systemctl start vehicle_count.service`\n\n## web-käyttöliittymä\n8. avaa web-käyttöliittymä osoitteessa palvelin:portti, esimerkiksi paikallisella koneella localhost:5000\n![webUI](images/webui.png)\n\nKirjoita kenttään `broker address` MQTT brokerin osoite, esimerkiksi 127.0.0.1 ja `topic`-kenttään `#`. \nKlikkaa `Connect` painiketta.\n\nHuomaa että sovellus lähettää käynnistymisensä jälkeen sähköpostiraportit ajallaan vaikka nettikäyttöliittymää ei avattaisikaan. Käyttöliittymää tarvitaan lähinnä palvelua käyttöön otettaessa kameran oikean suuntaamisen varmistamiseksi.\n# Vaatimukset\n- käytössä on oltava jokin MQTT-broker, esimerkiksi paikallinen [Mosquitto-palvelin](https://www.mosquitto.org)\n- kamerapohjainen kohteen tunnistus vaatii käytännössä Jetson-perheen korttikoneen tai muun Nvidia CUDAa tukevan laitteen.\n\n# Lisenssi\nDokumentit lisensoitu:\n- [![License: CC BY 4.0](https://img.shields.io/badge/License-CC_BY_4.0-lightgrey.svg)](https://creativecommons.org/licenses/by/4.0/)\n- Original idea: [https://techvidvan.com/tutorials/opencv-vehicle-detection-classification-counting/](https://techvidvan.com/tutorials/opencv-vehicle-detection-classification-counting/)\n- MOTPY kohteenseuranta: [https://github.com/wmuron/motpy](https://github.com/wmuron/motpy)\n- MQTT JavaScript-esimerkki: [https://highvoltages.co/iot-internet-of-things/how-to-make-mqtt-web-app-using-html-and-javascript/](https://highvoltages.co/iot-internet-of-things/how-to-make-mqtt-web-app-using-html-and-javascript/)\n]\n# Tekijät\nTommi Ylimäki, Raine Kauppinen\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseamkedu%2Fvisitorcount","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseamkedu%2Fvisitorcount","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseamkedu%2Fvisitorcount/lists"}