Source code for stable_datasets.images.devanagari

from zipfile import ZipFile

from stable_datasets.schema import ClassLabel, DatasetInfo, DatasetSource, DownloadInfo, Features, Image, Version
from stable_datasets.utils import BaseDatasetBuilder


[docs] class Devanagari(BaseDatasetBuilder): """DHCD: 46 handwritten character classes with the original train/test split.""" VERSION = Version("1.0.0") # Preserve the archive's numeric character order, followed by digits 0-9. CLASS_NAMES = ( "character_1_ka", "character_2_kha", "character_3_ga", "character_4_gha", "character_5_kna", "character_6_cha", "character_7_chha", "character_8_ja", "character_9_jha", "character_10_yna", "character_11_taamatar", "character_12_thaa", "character_13_daa", "character_14_dhaa", "character_15_adna", "character_16_tabala", "character_17_tha", "character_18_da", "character_19_dha", "character_20_na", "character_21_pa", "character_22_pha", "character_23_ba", "character_24_bha", "character_25_ma", "character_26_yaw", "character_27_ra", "character_28_la", "character_29_waw", "character_30_motosaw", "character_31_petchiryakha", "character_32_patalosaw", "character_33_ha", "character_34_chhya", "character_35_tra", "character_36_gya", "digit_0", "digit_1", "digit_2", "digit_3", "digit_4", "digit_5", "digit_6", "digit_7", "digit_8", "digit_9", ) SOURCE = DatasetSource( homepage="https://archive.ics.uci.edu/dataset/389/devanagari+handwritten+character+dataset", assets={ split: DownloadInfo( url="https://archive.ics.uci.edu/static/public/389/devanagari+handwritten+character+dataset.zip", checksum="sha256:752e6a2e6b0d1b475375e6a9db937918bbbf7c6b7d137dbe234264029fd3b88d", ) for split in ("train", "test") }, license="CC BY 4.0", citation="""@misc{dhcd2015, author={Acharya, Shailesh and Gyawali, Prashnna}, title={Devanagari Handwritten Character Dataset}, year={2015}, publisher={UCI Machine Learning Repository}, doi={10.24432/C5XS53}} """, ) def _info(self): return DatasetInfo( description="92,000 32x32 grayscale images of 36 Devanagari characters and 10 digits.", features=Features({"image": Image(), "label": ClassLabel(names=list(self.CLASS_NAMES))}), supervised_keys=("image", "label"), homepage=self.SOURCE.homepage, citation=self.SOURCE.citation, license=self.SOURCE.license, ) def _generate_examples(self, data_path, split): if split not in ("train", "test"): raise ValueError(f"Unknown Devanagari split: {split!r}") prefix = f"DevanagariHandwrittenCharacterDataset/{split.title()}/" labels = {name: index for index, name in enumerate(self.CLASS_NAMES)} with ZipFile(data_path) as archive: members = sorted(name for name in archive.namelist() if name.startswith(prefix) and name.endswith(".png")) if not members: raise ValueError(f"No images found for Devanagari split {split!r}") for name in members: relative = name[len(prefix) :].split("/") if len(relative) != 2 or relative[0] not in labels: raise ValueError(f"Unexpected Devanagari image path: {name!r}") # Keep the original PNG bytes, including their grayscale encoding. yield name, {"image": archive.read(name), "label": labels[relative[0]]}