画像のピクセル値を直接受け取ることができる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 に保存されます。
再構成されたイメージ reconduct.png はイメージをより正確に復元でき、取得されたエンコーディングが元のイメージ情報をよりよく保存していることを示します。 reconduct.gif はエンコード プロセス中にさまざまなタイム ステップで再構成されたイメージを再現します。