Olen helppokäyttöisten AI-ratkaisujen puolestapuhuja. Yleensä oman mallin kouluttaminen ei ole järkevää ja mallia ei myöskään välttämättä kannata ajaa itse.
Netissä on nimittäin palveluita, jotka tarjoavat valmiiksi viimeisteltyjä AI-ratkaisuja rajapintojen kautta kenen tahansa käytettäväksi. Toki pieni maksu näistä yleensä menee. Etuna on laajat valikoimat valmiita malleja eri tarkoituksiin, helppokäyttöisyys ja nopea käyttöönotto.
Tässä kokeilussa päätin tutustua paremmin replicate.com -palveluun, joka tarjoaa ison valikoiman valmiita AI-malleja. Palvelua voi käyttää suoraan rajapintojen kautta, mutta malleja voi myös halutessaan ajaa Docker-kontissa.
Päätin todistaa, että AI-mallin käyttö ohjelmakoodista käsin on varsin helppoa. Ja niinhän se olikin. Projekti kasvoi lopulta hieman isommaksi kuin olin suunnitellut ja itse AI-osuus olikin loppujen lopuksi hyvin pieni osa kokonaisuudesta.
Joka tapauksessa – projekti osoitti, että datan ja tekoälyn avulla voidaan tuottaa innovatiivisia palveluja varsin helposti.
Projektin lähtökohdat ja idean muodostuminen
Tässä koodausprojektissa oli tarkoituksena kehittää innovatiivinen, pilvipohjainen ratkaisu, joka hyödyntää valmista tekoälymallia replicate.com -palvelun kautta.
Olen jo aikaisemmin perehtynyt Digitrafficin palveluihin ja jostain syystä Digitrafficin kelikamerat kiinnostavat minua paljon. On mielestäni kiehtovaa, että voin hakea tuoretta kamerakuvaa ympäri Suomen helpon rajapinnan kautta.
Itse miellän nämä kamerat mielessäni myös ”liikennekameroiksi” sillä ne kuvaavat pääosin maanteitä ja kuvissa on yleensä vain tie ja mahdollisesti kuvaan sattuneita autoja. On toki ihan mielenkiintoista nähdä mikä keli on ympäri Suomen, mutta ei siitä pidemmän päälle innostu.
Liikennemäärien seurantaan on omat palvelunsa ja rajapintansa, eikä nyt mennä siihen. Liikennemäärien rajapintoja käytettiin edellisessä kirjoituksessa Kokonaisen järjestelmän toteutus AI:lla.
Meillä on siis jatkuvasti kuvia tuottava järjestelmä, mutta kuvat itsessään eivät ole yleensä kovin kiinnostavia. Mitäpä jos valjastetaan AI käymään kuvia läpi ja etsimään sieltä mielenkiintoisia tapahtumia. Itse menemme katsomaan kuvia vain silloin, kun löydöksiä tulee!
Mitäpä jos valjastetaan AI käymään kuvia läpi ja etsimään sieltä mielenkiintoisia tapahtumia. Itse menemme katsomaan kuvia vain silloin, kun löydöksiä tulee!
Järjestelmä voisi tarkkailla itsenäisesti uusia kuvia ja lähettää ilmoituksen, mikäli kuvissa näkyy mielenkiintoista toimintaa. Tämä on sitä automaattista tietojen käsittelyä ja tässä tapauksessa vieläpä AI-pohjaisesti!
Rajauksena olisi: etsitään kuvista ihmisiä ja eläimiä! Niitä ei normaalisti näy näissä kuvissa, koska kamerat on suunnattu maanteille. Jos kuvassa olisi ihminen, kyseessä olisi poikkeuksellinen tilanne. Tai jos tielle eksyy vaikkapa hirvi, se vasta onkin mielenkiintoinen tapahtuma!
Tässä esimerkki kuvasta, jossa ei pitäisi normaalitilanteessa koskaan olla ihmisiä tai eläimiä:

Tie 12 Tampere, Santalahdenpuisto
Päivämäärä: 15.11.2025
Kellonaika: 08:51:09
Näillä ajatuksilla – tuumasta toimeen!
Replicate.com palvelu
Kuten todettua, tässä projektissa tarkoituksena ei ole keskittyä itse AI-mallin tekemiseen. Muutamaan palveluun tutustuttuani päädyin replicate.com -palvelun sivuilla ja se teki heti minuun vaikutuksen.
Sivusto on mielestäni hienosti tuotteistettu, visuaalisesti miellyttävä ja selkeä. Mallit on esitelty näyttävästi ja malleja voi testata suoraan sivuston kautta ennen käyttöönottoa.
Muutamia malleja kokeiltuani tulin myös siihen tuntumaan, että palvelussa näytillä olevat mallit ovat varsin laadukkaita. Mukana on myös tunnetut laajat kielimallit (LLM) kuten OpenAI:n GPT-5 ja Claude Sonnet 4.5.
Aiemmin olin tutustunut mm. Hugging Face -palveluun, mutta se tuntuu tämän jälkeen varsin alkeelliselta ja sekavalta palvelulta.
Replicateen rekisteröitynyt käyttäjä voi ostaa ”credittejä” ja käyttää niitä vastaan palvelun AI-malleja.
Sijoitin ensin viisi dollaria ja se tuntui riittävän aika pitkäksi aikaa.
Replicate on siis valintani tähän projektiin!
Mallin valinta
Mallien selailu replicate.com -palvelussa on helppoa ja mallit on luokiteltu esim. kuva-malleihin, video-malleihin, tekstin käsittelyn malleihin jne. Sivustolla on nostettu esiin mielenkiintoisia uutuuksia ja suositeltuja vaihtoehtoja.
Kiinnostukseni kohteena oli siis kuvien analysointiin sopivat mallit. Kokeilin muutamaa mallia sivuston kautta ja aika nopeasti päädyin kokeilemaan yolo-world-xl -mallia. Se on jatkokehitetty versio YOLO-World object detection -mallista. Tällä voi hakea vapaalla sanalla määriteltyjä kohteita kuvasta. Nyt löytyikin hieno malli tähän projektiin!
yolo-world-xl tuntui myös toimivan varsin hienosti, kun kokeilin muutamalla testikuvalla. Mallin etuna on, että se on ns. Open-Vocabulary Object Detection eli sille voi antaa minkä tahansa sanallisen kuvauksen ja se yrittää löytää sen kuvasta, vaikka kyseistä luokkaa ei olisi ollut mukana mallin koulutuksessa. Aika hienoa!
Alla oleva esimerkki kuvaa, miten tarkasti tunnistus toimii.

Analysoinnin tuloksena on kuva, mihin on merkitty löydökset ja niiden ”todennäköisyys”. Lisäksi palautuu JSON-muotoinen vastaus, jossa on tarkemmat tiedot tuloksesta.
Mikäli löydöksiä ei tullut, palautuu pelkkä JSON-vastaus.
Mallille annetaan lähtötietona
- analysoitava kuva
- class_namess: etsittävät asiat pilkulla eroteltuna, esim. ”cat, dog”
- max_num_boxes: maksimimäärä löydöksille (oletus 100)
- score_thr: raja-arvo todennäköisyydelle, mikä aiheuttaa löydöksen (oletus: 0,05)
- nms_thr: kuinka tiukasti päällekkäisiä havaintoja poistetaan (oletus: 0,5)
Esimerkki vastauksesta:
{
"completed_at": "2024-06-19T14:31:18.777635Z",
"created_at": "2024-06-19T14:29:47.118000Z",
"data_removed": false,
"error": null,
"id": "s0ww45tvxsrgm0cg63ksyqd90w",
"input": {
"nms_thr": 0.5,
"score_thr": 0.05,
"class_names": "dog, eye, tongue, ear, leash, backpack, person, nose",
"input_media": "https://replicate.delivery/pbxt/KOJpWfZmaP6tUv8fqR2n0z3FdBhtytoP5llaecrvvez0p4LE/dog.jpeg",
"return_json": false,
"max_num_boxes": 100
},
"logs": null,
"metrics": {
"predict_time": 1.866912858,
"total_time": 91.659635
},
"output": {
"media_path": "https://replicate.delivery/pbxt/2sNrEronvBZYBle20lmq9tJkBjMPpDcdK0LdT4lxAt0a7EgJA/output.png"
},
"started_at": "2024-06-19T14:31:16.910722Z",
"status": "succeeded",
"urls": {
"get": "https://api.replicate.com/v1/predictions/s0ww45tvxsrgm0cg63ksyqd90w",
"cancel": "https://api.replicate.com/v1/predictions/s0ww45tvxsrgm0cg63ksyqd90w/cancel"
},
"version": "fd1305d3fc19e81540542f51c2530cf8f393e28cc6ff4976337c3e2b75c7c292"
}
Kokeilin vielä etsiä ihmisiä kelikameran kuvasta ja tulos oli hyvä:

Tämä vakuutti minut niin hyvin, että valinta oli nyt tehty, ei muuta kuin koodaamaan!
Arkkitehtuurin suunnittelu
Lähtökohtana oli, että järjestelmä toteutetaan AWS-pilveen serverless-ratkaisuna.
Koodaus tehdään Copilotin avulla tehokkaasti ja nopeasti.
Julkaisu pilveen tehdään AWS CDK:lla (Infrastructure as Code).
Frontend tulisi olemaan varsin kevyt. Pääpaino olisi autonomisella pilviratkaisulla joka toimii itsenäisesti: analysoi kuvia ja lähettää minulle sähköpostia jos kuvissa näkyy ihmisiä tai eläimiä.
Prosessointi voisi mennä suunnilleen näin:
- Hae kameroiden tiedot Digitrafficilta
- Suodata kameralistaus ja ota mukaan vain Tampereen alueen kamerat
- Nouda kunkin kameran uusin kuva ja tallenna se pilveen
- Aja uusillle kuville analysointi replicate.com palvelussa
- Tallenna tulokset tietokantaan ja mahdollinen tuloskuva pilveen
- Jos tuli löydöksiä, lähetä hälytys sähköpostilla
Näillä lähtötiedoilla aloin tekemään järjestelmän suunnittelua Github Copilotn kanssa. Copilot ehdotti että tehdään oikein ADR-pohjaisesti. ADR eli Architecture Decision Record on lyhyt dokumentti, johon kirjataan yksittäinen tärkeä arkkitehtuuripäätös, sen perustelut ja seuraukset.
ADR dokumentteja syntyi lopulta suunnittelun tuloksena 16 kappaletta:
- 0001-data-sources-and-analytics.md
- 0002-frontend-access-model.md
- 0003-analysis-model.md
- 0004-image-storage.md
- 0005-dynamodb-schema.md
- 0006-ingest-workflow.md
- 0007-rest-api.md
- 0008-secrets-and-config.md
- 0009-alerting-strategy.md
- 0010-observability-and-logging.md
- 0011-ci-cd-strategy.md
- 0012-naming-conventions.md
- 0013-data-lifecycle.md
- 0014-frontend-architecture.md
- 0015-security-and-identity.md
- 0016-cost-management.md
Nämä dokumentit löytyvät projektin Github-reposta, johon on linkki tämän kirjoituksen lopussa.
Copilot huomioi hienosti mm. datan säilytysajat.
Ensimmäinen Copilotin tuottama ratkaisuehdotus käytti analysointiprosessiin AWS:n Step Functions -toimintoa. Ehdin jo toteuttaa ratkaisun Step Funktion -pohjaisesti, mutta kustannusten vuoksi pyysin Copilottia tekemän halvemman Lambda-pohjaisen ratkaisun.
Arkkitehtuuri
Oheisessa kuvassa näkyy lopullinen arkkitehtuuri. Kaikki komponentit asennetaan AWS CDK:lla. Ainoastaan hälytyksen vastaanottajien sähköpostiosoitteet ja replicate.com API key asetetaan AWS pilveen käsin.
Prosessin käynnistää EventBridge ajastus, kerran tunnissa ajalla 9.00-16.00. Uusia kuvia olisi saatavilla useamminkin, mutta kustannusten rajoittamiseksi ajastus säädettiin tällaiseksi.
FetchCameras Labda-funktio hakee kameratiedot, suodattaa niistä vain oleelliset ja puskee latausjonoon eventin.
Latausjonoa käsittelee latausfunktio, joka lataa kameran uusimman kuvan, tallentaa sen S3 buckettiin ja lähettää eventin analysointijonoon.
Analysointijonosta tehtäviä ottaa kuvien analysointia tekevä lambda-funktio, joka lähettää kuvan Replicate.com palvelussa ajettavaan analysointipalveluun. API key saadaan AWS Secrets Managerilta. Tulos tallennetaan DynamoDB tietokantaan jaa mikäli Replicate palautti kuvan, se tallennetaan prosessoitujen kuvien S3 buckettiin. Samalla lähetetään tuloksesta tieto EventBridgelle. EventBridge kutsuu hälytyksen lähetys -funktiota, jos tuloksessa oli löydöksiä.
Hälytyksen lähetys -funktio lähettää sähköpostia SNS palvelun kautta. Viestissä on havainnon tiedot ja linkki tuloskuvaan. Linkki on presigned linkki kuvaan ja toimii vain tunnin ajan.
Yksinkertaisella frontend-sovelluksella voi selailla havaintoja, valitsemalla kamera-aseman ja päivämäärän. Frontissa voi myös listata kaikki tietyn päivämäärän löydökset.
Frontendiä varten on rakennettu yksinkertaisia REST-rajapintoja, jotka tarjoillaan API Gatewayn kautta. API Gateway toteuttaa myös tarvittavat rajoitukset, jotta rajapintoja ei voi kutsua täysin rajattomasti ja aiheuttaa suuria kustannuksia.
Jokaisella SQS-jonolla on myös epäonnistuneita ajoja varten DLQ-jono, johon laitetaan eventit joiden käsittely ei onnistunut.
Toteutus ja vianselvitys Copilotin avulla
Toteutus eteni luonnollisella tavalla: prosessin kukin vaihe toteutettiin kun edellinen oli valmis. Valmistunutta osaa pystyi testaamaan käynnistämällä ajon manuaalisesti ja seuraamalla Cloudwatch-lokeja ja jonojen tilannetta.
Copilot noudatti ADR-dokumenteissa annettuja suunnitteluperiaatteita. Copilotin ohjetiedostossa copilot-instructions.md luki yksinkertaisesti näin:
use adr files as instructions when implementing code: /docs/adr
DLQ jonoihin kertyi jossain vaiheessa totutusta eventtejä ja se kertoi siitä että eventtien käsittely oli epäonnistunut. Tilanteen sai helposti selviteltyä VS Codesta käsin, Github Copilotin avulla. Copilot selvitteli tilannetta pilvestä ajamalla aws:n komentorivi-komentoja ja korjasi koodin sen perusteella.
Koko toteutus tehtiin siis Copilotin avulla, ns. Vibe-koodauksella.
Frontend
Frontend toteutettin lähinnä testauksen tueksi. Siinä on lähinnä yksinkertaiset hakutoiminnot kuvien hakuun ja havaintojen katselu listamuodossa.

Yhteenveto
Projekti oli hyvä osoitus tekoälypohjaisesta kehityksestä: koodaus tehtiin täysin Copilotin avulla. Huolellinen suunnittelu, prosessin toteutus paloissa, jatkuva testaus, vikojen korjaus Copilotilla.
Copilot osasi rakentaa AWS-infran täydellisesti AWS CDK:lla.
Event-driven arkkitehtuuri oli tässä käyttötapauksessa loistava valinta. Kuvien analysointi kestää jonkin aikaa ja kuvat voidaan lähettää jonosta analysoitavaksi hallitusti.
Replicate.com integraatio oli varsin yksinkertainen, käytännössä HTTP kutsu Lambda-funktiosta.
Jään odottelemaan sähköpostia mielenkiintoisista tapahtumista tien päällä!
Github repository: https://github.com/anttirauhala/traffic-cam-analyzer
