#BCI#PyTorch#Unity#EEG#Gerçek Zamanlı Sistemler

Hareket Niyetini Çözmek: PyTorch ve Unity ile Gerçek Zamanlı BCI Sistemi

EEG ön işleme, PyTorch sınıflandırma ve Unity simülasyonu kullanan gerçek zamanlı bir BCI pipeline'ının teknik açıklaması.

MTMurat Tut
5 dk okuma

LSL senkronizasyonu, MNE-Python, EEGNet ve Unity kullanarak beyin sinyalleriyle sanal bir sistemi kontrol etmeye yönelik gerçek zamanlı BCI mimarisi.

Düşünceyle makine kontrolü uzun süre bilim kurgu gibi görünüyordu. Bugün ise Brain-Computer Interface (BCI) sistemleri, ciddi motor kısıtları olan bireyler için bağımsızlık sağlayabilecek gerçek teknolojiler haline geldi.

Ancak bir BCI sistemi geliştirmek, bilgisayar bilimlerindeki en disiplinler arası mühendislik problemlerinden biridir. Nörobilim, sinyal işleme, gerçek zamanlı iletişim, derin öğrenme ve 3D simülasyon aynı mimaride birleşir.

Bu yazı, gerçek zamanlı bir BCI sisteminin kafa derisinden alınan mikrovolt seviyesindeki sinyalleri nasıl işleyip simülasyon komutlarına dönüştürebileceğini açıklar.


BCI Mimarisi: Kafa Derisinden Simülasyona

3D ortamda bir nesneyi akıcı kontrol etmek için sistemin sıkı bir gecikme bütçesiyle çalışması gerekir. Kullanıcı niyeti ile sistem hareketi arasındaki gecikme 500 milisaniyeyi aşarsa simülasyonlarda duyusal uyumsuzluk ve kontrol hissi kaybı oluşabilir.

Bu nedenle pipeline ayrık ve çok iş parçacıklı tasarlanmalıdır:

  ┌─────────────────────────────────────────────────────────────┐
  │                        LSL Streams                          │
  └──────────────────────────────┬──────────────────────────────┘
                                 │ EEG Data (500 Hz)
                                 ▼
                     Asynchronous Queue Buffer
                                 │
                                 ▼
                    SciPy Preprocessing Pipeline
                     (1-50 Hz Band-pass + Notch)
                                 │
                                 ▼
                      PyTorch EEGNet Classifier
                     (Left, Right, Foot, Idle)
                                 │
                                 ▼
                      UDP JSON Command Packets
                                 │
                                 ▼
                     Unity 3D Wheelchair Controller

1. Gerçek Zamanlı Sinyal İşleme (MNE-Python ve SciPy)

EEG elektrotları mikrovolt (μV\mu V) seviyesinde elektriksel potansiyeller yakalar. Bu sinyaller çevresel elektromanyetik gürültü, 50/60 Hz hat paraziti, göz kırpma (EOG) ve kas aktivitesi (EMG) gibi artefaktlarla kirlenir.

Motor niyeti izole etmek için optimize edilmiş bir ön işleme hattı gerekir:

  1. Lab Streaming Layer (LSL): Çok kanallı EEG cihazından gelen akışları zaman senkronizasyonuyla yakalar.
  2. Causal Filtering: 1-50 Hz band-pass ve 50 Hz notch filtre uygulanır. Causal filtre seçimi önemlidir çünkü gelecekteki veri noktalarına ihtiyaç duymaz.
  3. Sliding Windows: Ön işlenmiş sinyal, sürekli tahmin için kayan pencerelere bölünür.

2. Derin Öğrenme Çekirdeği: EEGNet ve ShallowConvNet

Temiz bir uzamsal-zamansal sinyal penceresi elde edildikten sonra kullanıcının zihinsel durumu sınıflandırılır: Sol El, Sağ El, Ayak veya Boşta.

Bu görev için PyTorch üzerinde iki ana mimari değerlendirilebilir:

EEGNet

EEGNet, BCI sistemleri için özel tasarlanmış kompakt bir konvolüsyonel sinir ağıdır. Depthwise ve separable convolution kullanarak parametre patlaması oluşturmadan uzamsal ve zamansal özellikleri çıkarır:

# EEGNet bloğunun sadeleştirilmiş temsili
class EEGNetBlock(nn.Module):
    def __init__(self, channels, samples):
        super().__init__()
        self.temporal = nn.Conv2d(1, 8, (1, 64), padding='same', bias=False)
        self.spatial = nn.Conv2d(8, 16, (channels, 1), groups=8, bias=False)
        self.separable = nn.Conv2d(16, 16, (1, 16), groups=16, bias=False)

    def forward(self, x):
        return self.separable(self.spatial(self.temporal(x)))

Parametre sayısını düşük tutmak, sınırlı veriyle eğitim yaparken önemlidir. EEGNet bu nedenle motor imgeleme görevlerinde pratik bir başlangıç mimarisi sunar.

ShallowConvNet

Filter Bank Common Spatial Patterns (FBCSP) yaklaşımından esinlenen ShallowConvNet, daha büyük parametre alanı ve zamansal pooling kullanarak band-power özelliklerini çözmeye çalışır. Özellikle fiziksel hareket yürütme görevlerinde güçlü sonuçlar verebilir.


3. Dağıtım: Model Serileştirme ve Sidecar Mimarisi

PyTorch modellerini doğrudan Unity gibi oyun motorlarının ana render döngüsünde çalıştırmak zordur. C# tarafında olgun tensor framework seçenekleri sınırlıdır ve CPU üzerinde inference yapmak frame drop üretebilir.

Bu problemi çözmek için Python Sidecar Architecture kullanılabilir. Derin öğrenme modeli ayrı bir Python sürecinde çalışır. Eğitimli PyTorch ağırlıkları ONNX formatına aktarılır:

import torch

dummy_input = torch.randn(1, 1, 32, 250)
torch.onnx.export(
    model,
    dummy_input,
    "eegnet_model.onnx",
    input_names=["eeg_data"],
    output_names=["prediction_logits"],
    dynamic_axes={"eeg_data": {0: "batch_size"}}
)

Sidecar süreç, modeli onnxruntime ile yükler, ön işlenmiş EEG pencerelerini kuyruktan alır, inference çalıştırır ve tahminleri JSON komutlarına dönüştürerek UDP üzerinden Unity'ye gönderir.


4. Klinik Zorluk: İstemli ve İstemsiz Hareketler

BCI sistemlerinde önemli bir risk, artefakt kaynaklı yanlış pozitif komutlardır. Örneğin kas spazmı yüksek voltajlı bir sinyal üretebilir ve standart bir sistem bunu hareket komutu sanabilir.

Bunu azaltmak için klinik kontrol paneli, istemlilik kontrolü yapan bir algoritmik kapı kullanabilir. Sistem C3 ve C4 gibi premotor korteks kanallarını izler. Kas artefaktı, öncesinde anlamlı premotor aktivite olmadan oluşuyorsa olay "istem dışı/spazm" olarak etiketlenir ve komut engellenir.


Mühendislik Çıkarımları

  1. Edinim ve sınıflandırmayı ayırın: Gerçek zamanlı biyosinyal işleme, ayrı thread'ler gerektirir. Bir thread cihazdan sabit hızda veri alırken başka bir worker ön işleme ve inference çalıştırmalıdır.
  2. Causal filtre kullanın: Canlı kontrol döngüsünde forward-backward zero-phase filtreler geleceğe bakış sızıntısı ve gecikme yaratır.
  3. Gerçek zamanlı köprülerde UDP tercih edin: TCP paket kurtarma davranışı gecikme sıçramaları oluşturabilir. UDP, kontrolörün her zaman en güncel sinyalle çalışmasını kolaylaştırır.