Visual Prostheses

An implant describes the device: its electrodes, their geometry and location, and how a source stimulus becomes the current those electrodes deliver.

All implants derive from Implant. The attributes used most often are:

electrode_array

The ElectrodeArray.

eye

for retinal systems: the implanted eye

placement

Where the device sits relative to the tissue it stimulates ('epiretinal', 'subretinal', 'suprachoroidal', 'epicortical', 'intracortical'), or None for a generic array.

technology

Stimulation technology, such as 'photovoltaic', where specified.

family

Named device family, where applicable.

scene_input_frame

How gaze registers a Scene onto the implant: 'eye' if gaze moves the scene across the electrodes, 'head' for systems driven by a head-fixed camera, whose input the eye cannot move. PRIMA is 'eye' despite its head-mounted camera, because its processed image is projected through the eye. Defaults to what the device class does ('eye' for a generic array) and can be set per system.

encoder and raster

Optional device behavior used when visual input is converted to electrical stimulation. These are covered later in Stimulus Encoders and Raster Strategies.

New in v0.11.0: An implant holds no stimulus. What it delivers is derived from a source, on demand, by prepare_stim().

Basic use

Electrodes can be accessed by name or index, and the array can be plotted directly:

import pulse2percept as p2p

implant = p2p.implants.ArgusII()

implant['A8']
implant[0]
implant[-1]
len(implant)
implant.electrode_names
implant.electrode_array.coordinates()
implant.plot()

Preparing a stimulus

prepare_stim() converts a source into stimulation the device can deliver:

delivered = implant.prepare_stim({'A8': 30})
delivered = implant.prepare_stim(p2p.stimuli.BostonTrain())

Preparation includes preprocessing, image/video encoding, resampling onto the electrode array, raster scheduling, threshold calibration, and safety checks. The result is returned as a Stimulus object.

Models call prepare_stim internally. Call it directly when the delivered stimulation itself is of interest:

implant.prepare_stim(source).plot()
implant.plot(stim=source, stim_cmap=True)

Retinal implants

Retinal implants are centered on the fovea and store distances to the neuronal targets in microns. Positive x points toward nasal retina, positive y toward superior retina, and positive z away from the retina into the vitreous. eye handles left- versus right-eye geometry where needed.

PRIMA

PRIMA is a subretinal photovoltaic prosthesis developed at Stanford. Pixium Vision developed the clinical system; Science Corporation acquired Pixium’s PRIMA assets and intellectual property in 2024.

PRIMAPivotal models the 378-pixel device used in the pivotal PRIMAvera trial [Holz2026]. The same 100 um configuration was used in the earlier first-in-human study [Palanker2020]. For a hexagonal array, the row spacing is spacing * sqrt(3) / 2.

pulse2percept also includes several photovoltaic research arrays described in the literature. The plots below use the same physical scale:

../_images/implants-1.png

PRIMAPivotal is based on the pivotal PRIMAvera device [Holz2026], also used in the earlier first-in-human study [Palanker2020]. Lorach2015Array, Ho2019FlatArray, and Huang2021Array model the research arrays described in [Lorach2015], [Ho2019], and [Huang2021], respectively.

Object

Pixels

Pixel geometry

Substrate

PRIMAPivotal()

378

100 um wide, 100 um spacing, 28 um active

2 x 2 mm

Lorach2015Array()

142

70 um wide, 75 um spacing, 20 um active

1 mm

Ho2019FlatArray(55)

250

55 um wide/spacing, 14 um active

1 mm

Ho2019FlatArray(40)

502

40 um wide/spacing, 10 um active

1 mm

Huang2021Array(55)

421

55 um wide/spacing, 22 um active

1.5 mm

Huang2021Array(40)

821

40 um wide/spacing, 16 um active

1.5 mm

Huang2021Array(30)

1388

30 um wide/spacing, 12 um active

1.5 mm

Huang2021Array(20)

2806

20 um wide/spacing, 8 um active

1.5 mm

The F55 layout of Ho2019FlatArray is reconstructed from Fig. 2(a) of [Ho2019]. The F40 outline was not published, so Ho2019FlatArray(40) uses the 502 lattice sites nearest the substrate center.

For Huang2021Array, the photovoltaic cell (“pixel”) count includes only exposed, stimulating pixels. The fabricated arrays included more cells than were exposed for stimulation, which were used for the common return electrode. The total number of fabricated cells was therefore 526 for F55, 1027 for F40, 1735 for F30, and 3508 for F20. However, these peripheral cells covered by the common return are not independently stimulating and are therefore not exposed in pulse2percept.

PRIMA, PRIMA75, PRIMA55 and PRIMA40 are deprecated aliases; see the v0.11 release notes for the corresponding canonical names.

Argus

ArgusI and ArgusII model the epiretinal Argus prostheses. Argus I has 16 electrodes in a 4 x 4 array; Argus II has 60 electrodes in a 6 x 10 array.

Argus II includes device-specific defaults for converting visual input to stimulation. Images and videos are encoded with an AmplitudeEncoder at 6 Hz, and stimulation is rastered one row at a time using a SequentialRaster with six groups separated by 2 ms. Thus visual stimuli can be passed directly to prepare_stim():

implant = p2p.implants.ArgusII()
stim = implant.prepare_stim(image)

Both defaults can be overridden. Passing encoder=None disables automatic image/video encoding; passing raster=None drives electrodes without the default sequential raster:

implant = p2p.implants.ArgusII(encoder=None, raster=None)

Alpha IMS and AMS

AlphaIMS and AlphaAMS model the subretinal Alpha microphotodiode arrays.

Suprachoroidal implants

BVT24 and BVT44 model first- and second-generation suprachoroidal arrays. The class names are pulse2percept identifiers rather than official product names.

Other retinal implants

IMIE models the epiretinal IMIE array.

These classes are research-software representations based on published device descriptions, not manufacturer-validated simulators. See each class’s API documentation for device-specific geometry and assumptions.

Cortical implants

Cortical implants are available under pulse2percept.implants.cortex:

Object

Description

Orion

Orion cortical visual prosthesis

Cortivis

CORTIVIS cortical array

ICVP

Intracortical Visual Prosthesis

Neuralink

Neuralink-style cortical array

Cortical implants use physical cortical coordinates. A cortical model combines those coordinates with a VisualFieldMap to place stimulation in the visual field.

Custom implants

A custom array usually does not need a new implant class. For a regular grid, use GridImplant:

import pulse2percept as p2p

implant = p2p.implants.GridImplant(shape=(10, 10), spacing=500)

Grids can also be hexagonal:

implant = p2p.implants.GridImplant(shape=(20, 20), spacing=400,
                                   grid_type='hex')

By default the electrodes are point sources. Pass an electrode_type and its arguments for electrodes with a physical extent:

from pulse2percept.implants import DiskElectrode

implant = p2p.implants.GridImplant(shape=(20, 20), spacing=400,
                                   grid_type='hex',
                                   electrode_type=DiskElectrode,
                                   radius=75)

GridImplant is a convenience only: ElectrodeGrid describes the geometry, Implant describes the device, and the two can still be combined by hand. Do that for an irregular array, built from individual electrodes:

from pulse2percept.implants import ElectrodeArray, Implant

electrode_array = ElectrodeArray(...)
implant = Implant(electrode_array)

EnsembleImplant combines multiple implants into one system.