IoT ve Yapay Zekâ

Makine Öğrenmesi için Zaman Serisi Sensör Verisi Etiketleme

Makine olaylarını ve operatör etiketlerini telemetriyle birlikte MQTT üzerinden toplamak, bir etiket şeması tanımlamak, olayları etiketli aralıklara dönüştürmek ve bunları denetimli öğrenme için sensör pencereleriyle birleştirmek.

Titreşim telemetrisi ile normal, hazırlık, arıza ve bakım dönemleri için renkli operatör etiketlerini gösteren zaman serisi sensör verisi etiketleme zaman çizelgesi
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Zaman serisi sensör verisini etiketlemek, IoT'de denetimli makine öğrenmesinin genellikle en zor kısmıdır; bunun nedeni araçların karmaşık olması değil, temel doğrunun (ground truth) operatörlerin hafızasına, kâğıt kayıtlara ve bakım sistemlerine dağılmış olmasıdır. Bu rehber, olayları ve operatör etiketlerini gerçekleştikleri anda MQTT üzerinden nasıl yakalayacağınızı, gerçek kullanımda ayakta kalan bir etiket şemasını nasıl tasarlayacağınızı ve bu olayları telemetrinizle birleştirilmiş etiketli pencerelere nasıl dönüştüreceğinizi gösteriyor.

Etiketler Neden Darboğazdır

Sensör verisini toplamak ucuzdur. Birkaç saniyede bir yayın yapan bir gateway, birkaç hafta içinde milyonlarca veri noktası üretir. Ancak tıkanmış bir filtreyi, takım kırılmasını veya bir kalite hatasını tanıması gereken bir model, birinin "şu oldu, burada, şu saatte" dediği örneklere ihtiyaç duyar. Bu örnekler nadirdir ve olağan kaynaklar güvenilmezdir:

  • Bakım iş emirleri, arızanın ne zaman başladığını değil onarımın ne zaman yapıldığını kaydeder ve çoğu zaman "pompa tamir edildi" gibi serbest metinler içerir.
  • Vardiya kayıtları vardiya sonunda, yaklaşık saatlerle yazılır.
  • Alarm geçmişleri eşik aşımlarını kaydeder; bunlar gerçek arızalarla aynı şey değildir.
  • Sonradan etiketleme, yani mühendislerin grafiklere bakarak etiket koyması, yavaştır ve kişiden kişiye tutarsızdır.

En etkili çözüm, etiketleri gerçekleştikleri anda, telemetriyle aynı mesajlaşma katmanında yapılandırılmış olaylar olarak yakalamaktır. Operatör bir tablette "sıkışma giderildi"ye bastığında bu, zaman damgası ve varlık yolu içeren bir MQTT mesajına dönüşüyorsa, etiket sensör verisiyle zaten hizalanmış olur.

Sensör Verisi için Etiket Türleri

Etiket türü Biçim Örnek Tipik kullanım
Nokta olay Tek zaman damgası "Takım değiştirildi", "Numune alındı" Ömürleri bölümlemek, müdahaleleri işaretlemek
Aralık Başlangıç ve bitiş "08:10'dan 08:45'e kadar hazırlık" Üretim dışı dönemleri hariç tutmak, durum sınıflandırma
Pencere sınıfı Sınıfı olan sabit pencere "Bu 10 dakikalık pencere: kavitasyon" Sınıflandırıcı eğitimi
Sonuç Bir döneme bağlı sonuç "4411 numaralı parti kalite kontrolden geçemedi" Kalite tahmini
Arıza Zaman damgası artı arıza modu "Rulman arızası, dış bilezik" Arıza ve RUL modelleri

Çoğu proje aynı anda birkaç türe ihtiyaç duyar. Makine durumu için aralıklar (çalışıyor, hazırlık, temizlik, arıza) özellikle değerlidir, çünkü aksi hâlde modelin kafasını karıştıracak dönemleri hariç tutmanıza olanak tanır.

Etiket Şeması Tasarlamak

Herhangi bir arayüz geliştirmeden önce bir şema üzerinde anlaşın. Pratik bir şema şunları içerir:

  1. Sabit bir etiket kodu sözlüğü, örneğin STATE_SETUP, STATE_CLEANING, FAULT_JAM, FAULT_LEAK, MAINT_BEARING_REPLACED. Serbest metin ayrı bir yorum alanına gider.
  2. Bir olay türü: start, end veya point. Aralıklar başlangıç ve bitiş çiftlerinden oluşturulur.
  3. Varlık yolu: telemetriyle aynı hiyerarşiyi kullanarak, böylece birleştirme çok kolay olur.
  4. Kaynak zaman damgası ve giriş zaman damgası. Operatör "sıkışma 5 dakika önce başladı" diye girebilir; hem olayın ne zaman gerçekleştiğini hem de ne zaman girildiğini kaydedin.
  5. Etiketi kimin koyduğu (illa ki bir isim değil, rol veya sicil numarası) ve gerektiğinde güven düzeyi.
  6. Benzersiz bir olay kimliği: düzeltmeler daha önceki bir etikete atıfta bulunup onun yerini alabilsin diye.
  7. Bir şema sürümü: eski verileri bozmadan değişiklikleri yönetmek için.

Sözlüğü kısa tutun. Tutarlı şekilde kullanılan, iyi tanımlanmış on kod, her operatörün farklı yorumladığı yüz koddan daha değerlidir. Bu tasarımın varlık yolu tarafını IIoT veri modelleme rehberi ele alıyor.

Etiketleri MQTT ile Yakalamak

Etiketleri her varlığın telemetrisinin yanında, ona ayrılmış bir alt topic'te yayınlayın:

connectmq/plant1/line2/filler1/telemetry/vibration
connectmq/plant1/line2/filler1/labels

Etiketler sessizce kaybolmasın diye QoS 1 kullanmalı ve retained olmamalıdır, çünkü her etiket mevcut bir durum değil bir olaydır. Mevcut makine durumunun da dashboard'larda görünmesini istiyorsanız, onu ayrı bir retained state topic'i olarak yayınlayın.

Aşağıda bir operatör istasyonunun veya bir test betiğinin kullanabileceği küçük bir Python etiketleme client'ı var. Yapılandırılmış etiket olaylarını genel MQTT test broker'ına yayınlar; gerçek operasyonlarda kendi broker kimlik bilgilerinizi kullanın.

# label_client.py
import json
import sys
import time
import uuid

import paho.mqtt.client as mqtt

BROKER = "broker.connectmq.com"
ASSET = "connectmq/demo/lbl-4c2e/line2/filler1"
CODES = {"STATE_SETUP", "STATE_CLEANING", "FAULT_JAM", "FAULT_LEAK", "MAINT_BEARING_REPLACED"}


def publish_label(client, code, event, minutes_ago=0, comment="", operator="op-station-2"):
    if code not in CODES:
        raise ValueError(f"unknown label code {code}")
    now = int(time.time() * 1000)
    label = {
        "schema": 1,
        "id": str(uuid.uuid4()),
        "code": code,
        "event": event,                      # start | end | point
        "ts": now - int(minutes_ago * 60000),
        "entered": now,
        "by": operator,
        "comment": comment,
    }
    info = client.publish(f"{ASSET}/labels", json.dumps(label), qos=1)
    info.wait_for_publish()
    print("sent", label["code"], label["event"])


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="labeler-" + uuid.uuid4().hex[:8])
client.connect(BROKER, 1883, keepalive=60)
client.loop_start()

# Kullanım: python label_client.py FAULT_JAM start 3 "bottle stuck at infeed"
code, event = sys.argv[1], sys.argv[2]
minutes = float(sys.argv[3]) if len(sys.argv) > 3 else 0
comment = sys.argv[4] if len(sys.argv) > 4 else ""
publish_label(client, code, event, minutes, comment)

client.loop_stop()
client.disconnect()

Pratikte aynı mesaj bir Node-RED dashboard düğmesinden, MQTT over WebSocket kullanan bir tablet uygulamasından, bir kalite istasyonundaki barkod okuyucudan veya kendi durum değişikliklerini yayınlayan bir PLC'den gelebilir. PLC durum kodları gibi makine tarafından üretilen etiketler, durum aralıkları için çoğu zaman en güvenilir kaynaktır; operatörler ise kök nedenler gibi makinenin bilemeyeceği bilgileri ekler.

Olayları Eğitim Verisine Dönüştürmek

Etiketler ve telemetri bir historian abonesi tarafından saklandıktan sonra sıradaki adım, başlangıç ve bitiş olaylarını aralıklara dönüştürmek ve bunları telemetri pencerelerine atamaktır. Aşağıdaki betik bunu pandas ile yapar.

# build_dataset.py
import pandas as pd

# labels.csv: id,code,event,ts   telemetry.csv: ts,vib_rms,current
labels = pd.read_csv("labels.csv", parse_dates=["ts"]).sort_values("ts")
tele = pd.read_csv("telemetry.csv", parse_dates=["ts"]).sort_values("ts")

# 1. Her kod için start/end olaylarını eşleştirip aralıklara dönüştür
intervals = []
open_events = {}
for row in labels.itertuples():
    if row.event == "start":
        open_events[row.code] = row.ts
    elif row.event == "end" and row.code in open_events:
        intervals.append((row.code, open_events.pop(row.code), row.ts))
intervals = pd.DataFrame(intervals, columns=["code", "start", "end"])

# 2. Telemetri özelliklerinden sabit pencereler oluştur
win = (tele.set_index("ts").resample("1min")
       .agg({"vib_rms": ["mean", "std", "max"], "current": ["mean"]}))
win.columns = ["_".join(c) for c in win.columns]
win = win.dropna().reset_index()
win["window_end"] = win["ts"] + pd.Timedelta(minutes=1)

# 3. Bir pencere bir aralıkla yarıdan fazla örtüşüyorsa etiketi ata
def label_for(w):
    for iv in intervals.itertuples():
        overlap = (min(w.window_end, iv.end) - max(w.ts, iv.start)).total_seconds()
        if overlap > 30:
            return iv.code
    return "NORMAL"

win["label"] = [label_for(w) for w in win.itertuples()]

# 4. Aralık sınırlarına yakın belirsiz pencereleri çıkar
for iv in intervals.itertuples():
    near = ((win["ts"] - iv.start).abs() < pd.Timedelta(minutes=2)) | \
           ((win["ts"] - iv.end).abs() < pd.Timedelta(minutes=2))
    win.loc[near, "label"] = "EXCLUDE"

dataset = win[win["label"] != "EXCLUDE"]
print(dataset["label"].value_counts())
dataset.to_csv("training_windows.csv", index=False)

Burada iki ayrıntı önemlidir. Sınır pencereleri hariç tutulur, çünkü bir sıkışmanın veya sızıntının tam başlangıcı belirsizdir ve bu pencerelerle eğitim yapmak modele gürültü öğretir. Eşleşmemiş başlangıç olayları ise sessizce kapatılmaz; bunları gözden geçirin, çünkü unutulmuş bir "bitiş" tuşu saatlerce süren normal çalışmayı bir arıza etiketine dönüştürebilir.

Etiketler için Kalite Kontrolleri

Eğitimden önce bu kontrol listesini kullanın:

  1. Kod ve varlık başına etiket sayısını çıkarın; çok dengesiz sayılar çoğu zaman bir vardiyanın veya sahanın hiç etiketleme yapmadığını ortaya çıkarır.
  2. Eşleşmemiş başlangıç ve bitişleri ve birbiriyle uyumsuz kodların çakışan aralıklarını bulun.
  3. Giriş zamanını olay zamanıyla karşılaştırın; büyük farklar sonradan yapılmış tahminlere işaret eder.
  4. Rastgele seçilmiş etiketlerin etrafındaki telemetriyi grafiğe dökün ve sinyalin gerçekten değiştiğini kontrol edin.
  5. Bir örneklemi ikinci bir kişiye gözden geçirtin ve uyumu ölçün.
  6. Veri setini, etiket şeması sürümü ve onu üreten sorguyla birlikte sürümleyin.

Etiket Akışını Sürdürmek

Etiketleme tek seferlik bir proje değildir. Onu olağan işin parçası hâline getirin: bir sıkışma alarmını temizleyen düğme etiketi de yayınlayabilir, bakım kapanış formu da arıza modunu yayınlayabilir. Model uyarılarını, operatörlerin onaylayacağı veya reddedeceği etiket adayları olarak geri besleyin; bu onayın kendisi de değerli bir etikettir. IoT için MLOps yazısı bu geri besleme döngülerinin yeniden eğitimi nasıl yönlendirdiğini anlatıyor; kestirimci bakım için makine öğrenmesi ise arıza etiketlerinin nasıl eğitim hedeflerine dönüştüğünü gösteriyor. Bozulma modelleri için, kalan faydalı ömür tahmini yazısında açıklandığı gibi, eksiksiz yaşam döngüsü olayları şarttır.

Etiketleri ve Telemetriyi ConnectMQ Üzerinde Çalıştırmak

Telemetri ve etiketler için tek bir broker kullanmak, her şeyi varlık yolu ve zamana göre hizalı tutar. ConnectMQ, 8084 portunda güvenli WebSocket üzerinden MQTT sunan tam yönetilen bir MQTT servisi sağlar; böylece tarayıcı tabanlı bir etiketleme sayfası doğrudan yayın yapabilir ve canlı topic gezgini, operatörler gönderdikçe etiket mesajlarını doğrulamanıza olanak tanır. Depolama ve veri seti oluşturma, bir historian yazıcısı ve yukarıdaki betik gibi kendi abonelerinizde çalışır. Bağlantılı cihazlarla yapay zekanın büyük resmi için yapay zeka ve IoT rehberine bakın.

ConnectMQ ile Başlayın

app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun. Gateway'iniz ve etiketleme client'larınız için oluşturulan YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID bilgilerini kullanın ve bugünden itibaren etiketleri telemetrinizin yanında toplamaya başlayın; tutarlı etiketlerle geçen her hafta bir sonraki modelinizi daha iyi hâle getirir.

Sık Sorulan Sorular

Zaman serisi sensör verisini etiketlemenin en iyi yolu nedir?

Etiketleri, gerçekleştikleri anda; sabit bir sözlük, varlık yolu ve zaman damgalarıyla, telemetriyle aynı mesajlaşma katmanında yapılandırılmış olaylar olarak yakalayın. Grafiklerden sonradan etiketleme daha yavaş ve daha az tutarlıdır.

Etiket mesajları MQTT'de retained olmalı mı?

Hayır. Etiketler olaydır; bu nedenle onları QoS 1 ile ve retain bayrağı olmadan yayınlayın ve bir abone ile saklayın. Dashboard'ların ihtiyacı varsa mevcut makine durumunu ayrı bir retained topic olarak yayınlayın.

Belirsiz etiket başlangıç zamanlarını nasıl ele alırım?

Hem tahmini olay zamanını hem de giriş zamanını kaydedin ve aralık sınırlarına yakın pencereleri eğitimden hariç tutun. Bu, etiketi atmadan en belirsiz örnekleri ayıklar.

Makineler otomatik olarak etiket üretebilir mi?

Evet. PLC durum kodları, alarm olayları ve kalite istasyonu sonuçları iyi otomatik etiketlerdir. Operatörler ise kök neden veya bir model uyarısının onayı gibi makinenin bilemeyeceği bilgileri ekler.

İlgili yazılar

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.