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_arrayThe
ElectrodeArray.eyefor retinal systems: the implanted eye
placementWhere the device sits relative to the tissue it stimulates (
'epiretinal','subretinal','suprachoroidal','epicortical','intracortical'), orNonefor a generic array.technologyStimulation technology, such as
'photovoltaic', where specified.familyNamed device family, where applicable.
scene_input_frameHow gaze registers a
Sceneonto 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.encoderandrasterOptional 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:
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 |
|---|---|---|---|
|
378 |
100 um wide, 100 um spacing, 28 um active |
2 x 2 mm |
|
142 |
70 um wide, 75 um spacing, 20 um active |
1 mm |
|
250 |
55 um wide/spacing, 14 um active |
1 mm |
|
502 |
40 um wide/spacing, 10 um active |
1 mm |
|
421 |
55 um wide/spacing, 22 um active |
1.5 mm |
|
821 |
40 um wide/spacing, 16 um active |
1.5 mm |
|
1388 |
30 um wide/spacing, 12 um active |
1.5 mm |
|
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 cortical visual prosthesis |
|
CORTIVIS cortical array |
|
Intracortical Visual Prosthesis |
|
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.