ImageEDA · VideoEDA · HyperspectralEDA · PointCloudEDA · TextEDA
One toolkit for inspecting, understanding, and validating visual and text datasets before modelling.
VisEDA is a Python toolkit for exploratory data analysis across five major data modalities:
| Module | Designed for | Core analyses |
|---|---|---|
| ImageEDA | Image datasets | size, aspect ratio, brightness, contrast, sharpness, noise, exposure, colour, texture, frequency, duplicates, class balance |
| VideoEDA | Video datasets | frame count, duration, FPS, temporal brightness/contrast, sharpness, blur, motion, scene changes, similarity |
| HyperspectralEDA | Hyperspectral cubes | band statistics, SNR, noise, dropout bands, vegetation/water indices, PCA, false colour, spectral diversity |
| PointCloudEDA | 3D point clouds | geometry, density, height, duplicates, outliers, nearest neighbours, PCA shape descriptors, cloud distances |
| TextEDA | Text/NLP datasets | document length, vocabulary, lexical diversity, readability, symbols, scripts, duplicates, TF-IDF distances, label analysis |
VisEDA is intended for data scientists, researchers, students, and practitioners who want a consistent EDA workflow before training machine-learning or deep-learning models.
Exploratory analysis is standard practice for tabular data, but visual and multimodal datasets often require separate tools and custom scripts.
VisEDA provides a unified interface for:
- dataset inventory and integrity checks
- quality and distribution analysis
- class-balance inspection
- duplicate and similarity analysis
- per-sample and dataset-level visualisations
- self-contained HTML reports
- command-line workflows
- Python API workflows
- reproducible pre-model data auditing
The goal is simple:
Understand the dataset before trusting the model.
Install the base package from PyPI:
pip install visedaFor extended hyperspectral file support:
pip install "viseda[hyperspectral]"For LAS/LAZ point-cloud support:
pip install "viseda[pointcloud]"Install all optional dependencies:
pip install "viseda[all]"Python 3.9+ is recommended.
Important: ImageEDA uses
plot()for its comprehensive dataset dashboard.
VideoEDA, HyperspectralEDA, PointCloudEDA, and TextEDA exposeplot_dataset()for dataset-level dashboards.
from viseda import ImageEDA
eda = ImageEDA(verbose=True)
eda.load(
"path/to/images",
label_from_parent=True
)
summary = eda.summary()
print(summary["inventory"])
print(summary["quality"])
# ImageEDA's full dataset dashboard is plot(), not plot_dataset()
eda.plot(
save_path="image_dashboard.png"
)
eda.report(
"viseda_image_report.html"
)For in-memory images:
import numpy as np
from viseda import ImageEDA
images = [
np.random.default_rng(0).integers(
0, 256, size=(128, 128, 3), dtype=np.uint8
),
np.random.default_rng(1).integers(
0, 256, size=(128, 128, 3), dtype=np.uint8
),
]
eda = ImageEDA(
verbose=False,
compute_glcm=False,
compute_freq=False,
)
eda.load_arrays(
images,
labels=["class_a", "class_b"]
)
print(eda.summary()["inventory"])
eda.plot(
save_path="image_dashboard.png"
)from viseda import VideoEDA
eda = VideoEDA(
verbose=True,
frame_sample_rate=5
)
eda.load(
"path/to/videos",
label_from_parent=True
)
summary = eda.summary()
print(summary["inventory"])
print(summary["temporal"])
print(summary["motion"])
eda.plot_dataset(
save_path="video_dashboard.png"
)
eda.report(
"viseda_video_report.html"
)For one video rather than the whole dataset:
eda.plot(
video_index=0,
save_path="single_video.png"
)import numpy as np
from viseda import HyperspectralEDA
# One wavelength value per spectral band
wavelengths = np.load(
"path/to/wavelengths.npy"
)
eda = HyperspectralEDA(
wavelengths=wavelengths,
compute_glcm=False,
compute_pca=True,
)
# File-backed loading is recommended when using compute_index()
# or pca_scores().
eda.load(
"path/to/cube.npy"
)
summary = eda.summary()
print(summary["inventory"])
print(summary["spectral_quality"])
ndvi = eda.compute_index(
cube_index=0,
index_name="ndvi"
)
scores, variance_ratio = eda.pca_scores(
cube_index=0,
n_components=3
)
eda.plot(
cube_index=0,
save_path="hyperspectral_cube.png"
)
eda.report(
"viseda_hyper_report.html"
)For a directory of hyperspectral cubes:
from viseda import HyperspectralEDA
eda = HyperspectralEDA()
eda.load(
"path/to/hyperspectral_dataset",
label_from_parent=True
)
eda.plot_dataset(
save_path="hyperspectral_dataset.png"
)Current 1.0.0 note:
load_arrays()is suitable for summary and plotting workflows, butcompute_index()andpca_scores()reload the selected cube from its source path. Useload()with a file-backed cube when calling those two methods.
import numpy as np
from viseda import PointCloudEDA
points = np.random.default_rng(0).random(
(10000, 3)
).astype("float32")
eda = PointCloudEDA(
max_points_per_cloud=200000,
compute_neighbors=True,
compute_geometry=True,
)
eda.load_arrays(
[points],
labels=["sample"]
)
summary = eda.summary()
print(summary["inventory"])
print(summary["geometry"])
print(summary["quality"])
eda.plot_dataset(
save_path="pointcloud_dashboard.png"
)
eda.report(
"viseda_pointcloud_report.html"
)For an individual cloud:
eda.plot(
cloud_index=0,
save_path="single_cloud.png"
)from viseda import TextEDA
eda = TextEDA()
eda.load_texts(
[
"Exploratory data analysis should come before model training.",
"TextEDA analyses vocabulary, length, readability and duplicates.",
],
labels=["eda", "eda"],
)
summary = eda.summary()
print(summary["length"])
print(summary["lexical"])
print(
eda.vocabulary(top_n=10)
)
eda.plot_dataset(
save_path="text_dashboard.png"
)
eda.report(
"viseda_text_report.html"
)TextEDA also supports directory datasets and structured files such as CSV, TSV, JSON, JSONL, Markdown, HTML, and plain text.
VisEDA installs a unified command:
viseda --helpAvailable subcommands:
viseda image ...
viseda video ...
viseda hyper ...
viseda cloud ...
viseda text ...
viseda image "C:/datasets/images" \
--label-from-parent \
--plot \
--report viseda_image_report.htmlviseda video "C:/datasets/videos" \
--label-from-parent \
--plot \
--report viseda_video_report.htmlviseda hyper "C:/datasets/hyper" \
--label-from-parent \
--plot \
--dataset-plot \
--report viseda_hyper_report.htmlviseda cloud "C:/datasets/pointclouds" \
--label-from-parent \
--plot \
--report viseda_pointcloud_report.htmlviseda text "C:/datasets/text" \
--label-from-parent \
--plot \
--report viseda_text_report.htmlFor command-specific options:
viseda image --help
viseda video --help
viseda hyper --help
viseda cloud --help
viseda text --helpEvery VisEDA module can generate a standalone HTML report.
eda.report("report.html")Reports are designed to provide a portable summary of dataset properties and quality indicators that can be opened directly in a browser.
Typical report sections include:
- dataset inventory
- labels/classes
- spatial or structural statistics
- quality metrics
- modality-specific statistics
- duplicate/similarity information where applicable
- summary distributions
- analysis metadata
The dataset-level dashboard method is module-specific:
# ImageEDA
image_eda.plot()
# VideoEDA
video_eda.plot_dataset()
# HyperspectralEDA
hyper_eda.plot_dataset()
# PointCloudEDA
cloud_eda.plot_dataset()
# TextEDA
text_eda.plot_dataset()Specialised plotting methods are also available for modality-specific tasks such as:
- sample previews
- colour analysis
- quality analysis
- temporal analysis
- spectral analysis
- PCA analysis
- point-cloud geometry
- vocabulary and n-gram frequency
- pairwise similarity/distance matrices
| Module | Main supported inputs |
|---|---|
| ImageEDA | JPG/JPEG, PNG, BMP, TIFF and other supported image formats |
| VideoEDA | MP4, AVI, MOV, MKV, WEBM, MPEG/MPG, M4V |
| HyperspectralEDA | NPY, NPZ, MAT, ENVI HDR/BIL/BIP/BSQ/ENVI, TIF/TIFF |
| PointCloudEDA | NPY, NPZ, TXT, CSV, XYZ, PTS, ASCII PLY, LAS/LAZ |
| TextEDA | TXT/TEXT, MD, RST, LOG, HTML/HTM, CSV/TSV, JSON, JSONL/NDJSON |
Some formats require optional dependencies.
Raw Dataset
│
▼
Load with VisEDA
│
▼
Dataset Inventory
│
▼
Quality & Distribution Analysis
│
▼
Duplicate / Similarity Checks
│
▼
Visual Diagnostics
│
▼
HTML Report
│
▼
Preprocessing Decisions
│
▼
Model Training
viseda/
├── image/
├── video/
├── hyperspectral/
├── pointcloud/
├── text/
├── report/
├── core/
├── utils/
├── cli.py
└── __init__.py
The main classes can be imported directly:
from viseda import (
ImageEDA,
VideoEDA,
HyperspectralEDA,
PointCloudEDA,
TextEDA,
)Clone the repository and install in editable mode:
python -m pip install -e ".[dev]"Run the tests:
python -m pytestBuild a distribution:
python -m pip install --upgrade build twine
python -m build
python -m twine check dist/*The VisEDA documentation covers all five modules in detail, including:
- installation
- quick-start workflows
- complete metric explanations
- visualisation interpretation
- Python API
- command-line interface
- HTML reports
- test workflows
- advanced use cases
- troubleshooting
- API reference
- changelog and roadmap
If you use VisEDA in your research, publication, dissertation, thesis, teaching, or software project, please cite the software as follows:
I.O.Agyemang, D. Acheampong, A.A.Baffour, & I. Adjei-Mensah
VisEDA: A Unified Visual Exploratory Data Analysis Toolkit for Image, Video, Hyperspectral, Point Cloud, and Text Data.
GitHub repository: https://github.com/Isaac45/VisEDA
Isaac Osei Agyemang
Data Science and Big Data Technology, Stirling College, Chengdu University, Chengdu 610054, P.R. China
Daniel Acheampong
Lutgert College, Florida Gulf Coast University, USA
Adu Asare Baffour
School of Science and Engineering, University of Missouri-Kansas City, USA
Isaac Adjei-Mensah
College of Artificial Intelligence, Yango University, Fuzhou 350015, P.R. China
Fujian University Engineering Research Center of Spatial Data Mining and Applications, Yango University, Fuzhou 350015, P.R. China
@software{agyemang_viseda,
author = {
Agyemang, Isaac Osei and
Acheampong, Daniel and
Baffour, Adu Asare and
Adjei-Mensah, Isaac
},
title = {
VisEDA: A Unified Exploratory Data Analysis Toolkit for
Image, Video, Hyperspectral, Point Cloud, and Text Data
},
url = {https://github.com/Isaac45/VisEDA},
year = {2026},
version = {1.0.0},
note = {Python software library}
}If a DOI or peer-reviewed VisEDA publication becomes available, this section can be updated with the formal publication details.
Contributions are welcome.
Useful contributions include:
- bug reports
- additional file-format support
- new EDA metrics
- additional visualisations
- documentation improvements
- performance optimisations
- tests and reproducible examples
Before proposing major API changes, please open an issue describing the motivation and expected behaviour.
VisEDA is released under the MIT License.
See LICENSE for details.