SNN图像脉冲化——泊松编码

与ANN能够直接接收图像的像素值不同,SNN的输入是异步脉冲序列。因此将二维图像输入SNN之前,需要对图像进行脉冲化。常用的一种脉冲化方法为泊松编码

一、原理

泊松编码:将输入数据编码为发放次数分布符合泊松过程的脉冲序列

对于二维图像,每一个像素都能生成相互独立的泊松编码:

  • 预先设定总时间 T;
  • 每一个时间步,每一个像素产生脉冲的概率与该像素值成比例;
  • 执行 T个时间步,分别得到各个像素对应的脉冲序列;
  • 将每个像素产生的脉冲序列输入到对应神经元 / SNN输入层异步接收到各个像素的脉冲。

理解:

  • 根据像素值设定每个时间步产生脉冲的概率,模拟一段时间,得到脉冲序列;
  • 这段时间内可能产生的脉冲数量符合泊松分布 / 该脉冲产生过程是泊松过程;
  • 这段时间平均脉冲发放数对应泊松分布公式中的  ;
  • 通过将多个时间步的脉冲矩阵叠加,可以还原出原图像。
像素的编码与重建
像素的编码与重建

 

二、实例

测试代码实现了PNG图像的泊松编码(这里仅对RGB三通道进行了脉冲化)。

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复现了编码过程中不同时间步下的重建图像。

reconduct.gif

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
脉冲神经网络(SNN)中,泊松编码器是一种常用的编码方式,用于将输入的实数值转换成脉冲序列。泊松编码器基于速率的编码方式,也被称为频率编码。它通过模拟神经元的脉冲发放频率来表示输入的信息。\[1\] 在Spikingjelly中,泊松编码器是一种时间驱动的编码器,可以用于单个神经元或多个神经元。它可以使用单独的时间步长或多个时间步长叠加来实现编码。此外,Spikingjelly还提供了其他编码器,如周期编码器、延时编码器和带权相位编码器。\[2\] 在加载训练好的网络并提取编码器时,可以使用Spikingjelly提供的函数进行操作。例如,可以使用`load_state_dict`函数加载网络的参数,并使用`Sequential`模块构建编码器。最后,通过调用`eval`方法将编码器设置为评估模式。\[3\] #### 引用[.reference_title] - *1* *2* [【Spikingjelly】SNN框架教程的代码解读_3](https://blog.csdn.net/a_piece_of_ppx/article/details/119190267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Spikingjelly】SNN框架教程的代码解读_4](https://blog.csdn.net/a_piece_of_ppx/article/details/119685090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值