SNN 画像パルス - ポアソン符号化

画像のピクセル値を直接受け取ることができるANNとは異なり、SNNの入力は非同期パルスのシーケンスです。したがって、2D 画像を SNN に入力する前に、画像をパルス化する必要があります。一般的に使用されるパルス化方法は、ポアソン符号化です。

1. 原則

ポアソン エンコード:入力データをパルス列にエンコードし、そのパルス列の点火時間の分布はポアソン プロセスに準拠します。

2 次元画像の場合、各ピクセルは独立したポアソン コードを生成できます。

  • 合計時間 T を事前に設定します。
  • 各タイム ステップで、各ピクセルがパルスを生成する確率はピクセル値に比例します。
  • T タイム ステップを実行して、各ピクセルに対応するパルス シーケンスを取得します。
  • 各ピクセルによって生成されたパルス シーケンスは、対応するニューロン/SNN 入力層に入力され、各ピクセルのパルスを非同期で受信します。

理解:

  • ピクセル値に従って各タイム ステップでパルスを生成する確率を設定し、一定期間シミュレーションしてパルス シーケンスを取得します。
  • この期間中に生成されるパルスの数はポアソン分布に準拠します。パルス生成プロセスはポアソンプロセスです。
  • この期間中に発行されるパルスの平均数は、ポアソン分布の式に対応します 。
  • 複数のタイムステップのパルスマトリクスを重ね合わせることで、元の画像を復元することができます。
ピクセルのエンコードと再構築
ピクセルのエンコードと再構築

 

2、例

テスト コードは、PNG 画像のポアソン エンコードを実装します (ここでは RGB 3 チャネルのみがパルス化されます)。

import numpy as np
from PIL import Image

image = Image.open('PIC/WOODSTOCK.png')

data_ori = np.array(image)                  # original
print('SHAPE:', data_ori.shape)
x = data_ori.shape[0]
y = data_ori.shape[1]

data_pro = data_ori.astype('float')[:]      # probability
data_new = data_ori[:]                      # reconducted
frames_new = []                             # to gif

data_poisson = data_ori.tolist()            # code
for i in range(x):
    for j in range(y):
        for k in range(3):
            data_poisson[i][j][k] = ''

t_simu = 255

# probability matrix
for row in data_pro:
    for pixel in row:
        pixel[:3] /= 255

# generate poisson code
for t in range(t_simu):
    print('Proccessing  %d/%d' % (t+1, t_simu))
    for i in range(x):
        for j in range(y):
            for k in range(3):
                if np.random.random() < data_pro[i][j][k]:
                    data_poisson[i][j][k] += '1'
                else:
                    data_poisson[i][j][k] += '0'

    # add temporary png to gif
    if not (t % 15):
        for i in range(x):
            for j in range(y):
                for k in range(3):
                    data_new[i][j][k] = data_poisson[i][j][k].count('1')

        Image.fromarray(data_new).save('temp/temp_%d.png' % t)
        frames_new.append(Image.open('temp/temp_%d.png' % t))

# output poisson code
with open('Poison.out', 'w') as file:
    for i in range(x):
        for j in range(y):
            for k in range(3):
                file.write(data_poisson[i][j][k] + '\n')
                data_new[i][j][k] = data_poisson[i][j][k].count('1')
            file.write('\n')

img = Image.fromarray(data_new)
img.save('reconduct.png')
frames_new[0].save('reconduct.gif', save_all=True, append_images=frames_new, duration=500, loop=1)

この例では、最初にピクセル値がパルス発光確率として正規化され、255 タイム ステップがシミュレートされ、各ピクセルの各チャネルによって生成されたポアソン コードがファイル Poisson.out に保存されます。

ピクセルの 3 チャネル ポアソン符号化セグメント

再構成されたイメージ reconduct.png はイメージをより正確に復元でき、取得されたエンコーディングが元のイメージ情報をよりよく保存していることを示します。 reconduct.gif はエンコード プロセス中にさまざまなタイム ステップで再構成されたイメージを再現します。

再実行.gif

おすすめ

転載: blog.csdn.net/weixin_54633033/article/details/131824663