├── matchnet ├── data │ ├── __init__.py │ ├── loader.py │ ├── mini_imagenet.py │ └── omniglot.py ├── __init__.py ├── models │ ├── __init__.py │ └── matching_network.py └── train_engine.py ├── scripts ├── __init__.py ├── train │ ├── run_train.py │ └── train_setup.py ├── eval │ ├── run_eval.py │ └── eval_setup.py ├── omniglot.conf └── miniimagenet.conf ├── results ├── models │ └── omniglot │ │ ├── lstm.h5 │ │ └── cnn_encoder.h5 └── README.md ├── setup.py ├── data ├── download_omniglot.sh └── omniglot │ └── splits │ └── vinyals │ ├── val.txt │ └── test.txt ├── LICENSE ├── tests ├── test_omniglot.py └── test_miniimagenet.py └── README.md /matchnet/data/__init__.py: -------------------------------------------------------------------------------- 1 | from .loader import load -------------------------------------------------------------------------------- /matchnet/__init__.py: -------------------------------------------------------------------------------- 1 | from .train_engine import TrainEngine -------------------------------------------------------------------------------- /matchnet/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .matching_network import MatchingNetwork -------------------------------------------------------------------------------- /scripts/__init__.py: -------------------------------------------------------------------------------- 1 | from .train.train_setup import train 2 | from .eval.eval_setup import eval -------------------------------------------------------------------------------- /results/models/omniglot/lstm.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schatty/matching-networks-tf/HEAD/results/models/omniglot/lstm.h5 -------------------------------------------------------------------------------- /results/models/omniglot/cnn_encoder.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schatty/matching-networks-tf/HEAD/results/models/omniglot/cnn_encoder.h5 -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | from setuptools import setup 3 | 4 | 5 | setup(name='matchnet', 6 | version='0.0.1', 7 | license='MIT', 8 | packages=setuptools.find_packages(), 9 | install_requires=['Pillow', 'tqdm']) 10 | -------------------------------------------------------------------------------- /data/download_omniglot.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | DATADIR=data/omniglot/data 3 | 4 | mkdir -p $DATADIR 5 | wget -O images_background.zip https://github.com/brendenlake/omniglot/blob/master/python/images_background.zip?raw=true 6 | wget -O images_evaluation.zip https://github.com/brendenlake/omniglot/blob/master/python/images_evaluation.zip?raw=true 7 | unzip images_background.zip -d $DATADIR 8 | unzip images_evaluation.zip -d $DATADIR 9 | mv $DATADIR/images_background/* $DATADIR/ 10 | mv $DATADIR/images_evaluation/* $DATADIR/ 11 | rmdir $DATADIR/images_background 12 | rmdir $DATADIR/images_evaluation 13 | -------------------------------------------------------------------------------- /matchnet/data/loader.py: -------------------------------------------------------------------------------- 1 | from .omniglot import load_omniglot 2 | from .mini_imagenet import load_mini_imagenet 3 | 4 | 5 | def load(data_dir, config, splits): 6 | """ 7 | Load specific dataset. 8 | 9 | Args: 10 | data_dir (str): path to the dataset directory. 11 | config (dict): general dict with settings. 12 | splits (list): list of strings 'train'|'val'|'test'. 13 | 14 | Returns (dict): dictionary with keys 'train'|'val'|'test'| and values 15 | as tensorflow Dataset objects. 16 | 17 | """ 18 | if config['data.dataset'] == "omniglot": 19 | ds = load_omniglot(data_dir, config, splits) 20 | elif config['data.dataset'] == "mini-imagenet": 21 | ds = load_mini_imagenet(data_dir, config, splits) 22 | else: 23 | raise ValueError(f"Unknow dataset: {config['data.dataset']}") 24 | return ds 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Igor Kuznetsov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /scripts/train/run_train.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import configparser 3 | 4 | from train_setup import train 5 | 6 | 7 | def preprocess_config(c): 8 | conf_dict = {} 9 | int_params = ['data.train_way', 'data.test_way', 'data.train_support', 10 | 'data.test_support', 'data.train_query', 'data.test_query', 11 | 'data.query', 'data.support', 'data.way', 'data.episodes', 12 | 'data.gpu', 'data.cuda', 'model.lstm_size', 'train.epochs', 13 | 'train.patience', 'data.batch', 'train.restore'] 14 | float_params = ['train.lr'] 15 | for param in c: 16 | if param in int_params: 17 | conf_dict[param] = int(c[param]) 18 | elif param in float_params: 19 | conf_dict[param] = float(c[param]) 20 | else: 21 | conf_dict[param] = c[param] 22 | return conf_dict 23 | 24 | 25 | parser = argparse.ArgumentParser(description='Run training') 26 | parser.add_argument("--config", type=str, default="./scripts/omniglot.conf", 27 | help="Path to the config file.") 28 | 29 | # Run training 30 | args = vars(parser.parse_args()) 31 | config = configparser.ConfigParser() 32 | config.read(args['config']) 33 | config = preprocess_config(config['TRAIN']) 34 | train(config) 35 | -------------------------------------------------------------------------------- /scripts/eval/run_eval.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import configparser 3 | 4 | from eval_setup import eval 5 | 6 | parser = argparse.ArgumentParser(description='Run evaluation') 7 | 8 | 9 | def preprocess_config(c): 10 | conf_dict = {} 11 | int_params = ['data.train_way', 'data.test_way', 'data.train_support', 12 | 'data.test_support', 'data.train_query', 'data.test_query', 13 | 'data.query', 'data.support', 'data.way', 'data.episodes', 14 | 'data.gpu', 'data.cuda', 'model.lstm_size', 'train.epochs', 15 | 'train.patience', 'data.batch'] 16 | float_params = ['train.lr'] 17 | for param in c: 18 | if param in int_params: 19 | conf_dict[param] = int(c[param]) 20 | elif param in float_params: 21 | conf_dict[param] = float(c[param]) 22 | else: 23 | conf_dict[param] = c[param] 24 | return conf_dict 25 | 26 | 27 | parser = argparse.ArgumentParser(description='Run evaluation') 28 | parser.add_argument("--config", type=str, default="./scripts/omniglot.conf", 29 | help="Path to the config file.") 30 | 31 | # Run training 32 | args = vars(parser.parse_args()) 33 | config = configparser.ConfigParser() 34 | config.read(args['config']) 35 | config = preprocess_config(config['EVAL']) 36 | eval(config) 37 | 38 | -------------------------------------------------------------------------------- /scripts/eval/eval_setup.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import tensorflow as tf 3 | tf.config.gpu.set_per_process_memory_growth(True) 4 | from tqdm import tqdm 5 | from matchnet.data import load 6 | from matchnet.models import MatchingNetwork 7 | 8 | 9 | def eval(config): 10 | np.random.seed(2019) 11 | tf.random.set_seed(2019) 12 | 13 | # Determine device 14 | if config['data.cuda']: 15 | cuda_num = config['data.gpu'] 16 | device_name = f'GPU:{cuda_num}' 17 | else: 18 | device_name = 'CPU:0' 19 | 20 | data_dir = config['data.dataset_path'] 21 | ret = load(data_dir, config, ['test']) 22 | test_loader = ret['test'] 23 | 24 | # Setup training operations 25 | way = config['data.test_way'] 26 | lstm_dim = config['model.lstm_size'] 27 | w, h, c = list(map(int, config['model.x_dim'].split(','))) 28 | 29 | # Metrics to gather 30 | test_loss = tf.metrics.Mean(name='test_loss') 31 | test_acc = tf.metrics.Mean(name='test_accuracy') 32 | 33 | model = MatchingNetwork(way, w, h, c, lstm_size=lstm_dim) 34 | model.load(config['model.save_dir']) 35 | 36 | def calc_loss(x_support, y_support, x_query, y_query): 37 | loss, acc = model(x_support, y_support, x_query, y_query) 38 | return loss, acc 39 | 40 | with tf.device(device_name): 41 | for i_episode in tqdm(range(config['data.episodes'])): 42 | x_support, y_support, x_query, y_query = test_loader.get_next_episode() 43 | loss, acc = calc_loss(x_support, y_support, x_query, y_query) 44 | test_loss(loss) 45 | test_acc(acc) 46 | 47 | print("Loss: ", test_loss.result().numpy()) 48 | print("Accuracy: ", test_acc.result().numpy()) 49 | -------------------------------------------------------------------------------- /scripts/omniglot.conf: -------------------------------------------------------------------------------- 1 | [TRAIN] 2 | # Dataset name 3 | data.dataset = omniglot 4 | # Path to the dataset 5 | data.dataset_path = data/omniglot 6 | # Name of the splitting 7 | data.split = vinyals 8 | # Number of classes in train 9 | data.train_way = 5 10 | # Batch size 11 | data.batch = 32 12 | # Number of support examples 13 | data.train_support = 5 14 | # Number of query examples 15 | data.train_query = 1 16 | # Number of classes in validation 17 | data.test_way = 5 18 | # Number of support examples in validation 19 | data.test_support = 5 20 | # Number query examples in validation 21 | data.test_query = 1 22 | # Number of episodes in one epoch 23 | data.episodes = 100 24 | # Flag to use CUDA 25 | data.cuda = 1 26 | # Number of GPU if data.cuda is set to 1 27 | data.gpu = 1 28 | 29 | # Data dimenstions (width,height,channels) 30 | model.x_dim = 28,28,1 31 | # FCE dimension 32 | model.lstm_size = 32 33 | # Path to the saved model 34 | model.save_dir = ./results/models/omniglot 35 | 36 | # Number of epochs to train 37 | train.epochs = 30 38 | # Name of the optimizer 39 | train.optim_method = Adam 40 | # Learning rate 41 | train.lr = 0.001 42 | # Early stopping patience 43 | train.patience = 100 44 | # Restoring from existing model 45 | train.restore = 0 46 | # Directory for logs 47 | train.log_dir = ./results/logs 48 | 49 | [EVAL] 50 | 51 | # data 52 | data.dataset = omniglot 53 | data.dataset_path = data/omniglot 54 | data.split = vinyals 55 | data.test_way = 20 56 | data.test_support = 5 57 | data.test_query = 5 58 | data.batch = 32 59 | data.episodes = 100 60 | data.cuda = 1 61 | data.gpu = 1 62 | 63 | # model 64 | model.x_dim = 28,28,1 65 | model.lstm_size = 32 66 | model.save_dir = ./results/models/omniglot 67 | -------------------------------------------------------------------------------- /scripts/miniimagenet.conf: -------------------------------------------------------------------------------- 1 | [TRAIN] 2 | # Dataset name 3 | data.dataset = mini-imagenet 4 | # Path to the dataset 5 | data.dataset_path = /home/igor/dl/prototypical-networks-tf/data/mini-imagenet 6 | # Name of the splitting 7 | data.split = ravi 8 | # Number of classes in train 9 | data.train_way = 5 10 | # Batch size 11 | data.batch = 10 12 | # Number of support examples 13 | data.train_support = 5 14 | # Number of query examples 15 | data.train_query = 1 16 | # Number of classes in validation 17 | data.test_way = 5 18 | # Number of support examples in validation 19 | data.test_support = 5 20 | # Number query examples in validation 21 | data.test_query = 1 22 | # Number of episodes in one epoch 23 | data.episodes = 100 24 | # Flag to use CUDA 25 | data.cuda = 1 26 | # Number of GPU if data.cuda is set to 1 27 | data.gpu = 0 28 | 29 | # Data dimensions (width,height,channels) 30 | model.x_dim = 84,84,3 31 | # FCE dimension 32 | model.lstm_size = 32 33 | # Path to the saved model 34 | model.save_dir = ./results/models/miniimagenet 35 | 36 | # Number of epochs to train 37 | train.epochs = 70 38 | # Name of the optimizer 39 | train.optim_method = Adam 40 | # Learning rate 41 | train.lr = 0.001 42 | # Early stopping patience 43 | train.patience = 70 44 | # Restoring from existing model 45 | train.restore = 1 46 | # Directory for logs 47 | train.log_dir = ./results/logs 48 | 49 | [EVAL] 50 | 51 | # data 52 | data.dataset = mini-imagenet 53 | data.dataset_path = /home/igor/dl/prototypical-networks-tf/data/mini-imagenet 54 | data.split = ravi 55 | data.test_way = 5 56 | data.test_support = 5 57 | data.test_query = 5 58 | data.batch = 10 59 | data.episodes = 1000 60 | data.cuda = 1 61 | data.gpu = 0 62 | 63 | # model 64 | model.x_dim = 84,84,3 65 | model.lstm_size = 32 66 | model.save_dir = ./results/models/miniimagenet 67 | -------------------------------------------------------------------------------- /matchnet/train_engine.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from tqdm import tqdm 3 | 4 | 5 | class TrainEngine(object): 6 | """ 7 | Engine that launches training per epochs and episodes. 8 | Contains hooks to perform certain actions when necessary. 9 | """ 10 | def __init__(self): 11 | self.hooks = {name: lambda state: None 12 | for name in ['on_start', 13 | 'on_start_epoch', 14 | 'on_end_epoch', 15 | 'on_start_episode', 16 | 'on_end_episode', 17 | 'on_end']} 18 | 19 | def train(self, loss_func, train_loader, val_loader, epochs, n_episodes, **kwargs): 20 | # State of the training procedure 21 | state = { 22 | 'train_loader': train_loader, 23 | 'val_loader': val_loader, 24 | 'loss_func': loss_func, 25 | 'sample': None, 26 | 'epoch': 1, 27 | 'total_episode': 1, 28 | 'epochs': epochs, 29 | 'n_episodes': n_episodes, 30 | 'best_val_loss': np.inf, 31 | 'early_stopping_triggered': False 32 | } 33 | 34 | self.hooks['on_start'](state) 35 | for epoch in range(state['epochs']): 36 | self.hooks['on_start_epoch'](state) 37 | for _ in tqdm(range(state['n_episodes'])): 38 | x_support, y_support, x_query, y_query = train_loader.get_next_episode() 39 | state['sample'] = (x_support, y_support, x_query, y_query) 40 | self.hooks['on_start_episode'](state) 41 | self.hooks['on_end_episode'](state) 42 | state['total_episode'] += 1 43 | 44 | self.hooks['on_end_epoch'](state) 45 | state['epoch'] += 1 46 | 47 | # Early stopping 48 | if state['early_stopping_triggered']: 49 | print("Early stopping triggered!") 50 | break 51 | 52 | self.hooks['on_end'](state) 53 | print("Training succeed!") 54 | -------------------------------------------------------------------------------- /tests/test_omniglot.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | from scripts import train 4 | 5 | cuda_on = 1 6 | 7 | 8 | class TestsOmniglot(unittest.TestCase): 9 | 10 | def test_1_shot_5_way_with_restore(self): 11 | config = { 12 | 'data.dataset': 'omniglot', 13 | 'data.dataset_path': 'data/omniglot', 14 | 'data.split': 'vinyals', 15 | 'data.train_way': 5, 16 | 'data.batch': 32, 17 | 'data.train_support': 5, 18 | 'data.train_query': 1, 19 | 'data.test_way': 5, 20 | 'data.test_support': 5, 21 | 'data.test_query': 1, 22 | 'data.episodes': 1, 23 | 'data.cuda': cuda_on, 24 | 'data.gpu': 0, 25 | 'model.x_dim': '28,28,1', 26 | 'model.lstm_size': 32, 27 | 'model.save_dir': './omniglot_test', 28 | 'train.epochs': 1, 29 | 'train.optim_method': 'Adam', 30 | 'train.lr': 0.001, 31 | 'train.patience': 100, 32 | 'train.restore': 0, 33 | 'train.log_dir': 'tests/logs' 34 | } 35 | train(config) 36 | 37 | # Train after restoring 38 | # TODO: It is probably works only on GPU, should fix it later 39 | config['train.restore'] = 1 40 | train(config) 41 | 42 | def test_5_shot_5_way(self): 43 | config = { 44 | 'data.dataset': 'omniglot', 45 | 'data.dataset_path': 'data/omniglot', 46 | 'data.split': 'vinyals', 47 | 'data.train_way': 5, 48 | 'data.batch': 32, 49 | 'data.train_support': 5, 50 | 'data.train_query': 5, 51 | 'data.test_way': 5, 52 | 'data.test_support': 5, 53 | 'data.test_query': 5, 54 | 'data.episodes': 1, 55 | 'data.cuda': cuda_on, 56 | 'data.gpu': 0, 57 | 'model.x_dim': '28,28,1', 58 | 'model.lstm_size': 32, 59 | 'model.save_dir': './omniglot_test', 60 | 'train.epochs': 1, 61 | 'train.optim_method': 'Adam', 62 | 'train.lr': 0.001, 63 | 'train.patience': 100, 64 | 'train.restore': 0, 65 | 'train.log_dir': 'tests/logs' 66 | } 67 | train(config) -------------------------------------------------------------------------------- /tests/test_miniimagenet.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | from scripts import train 4 | 5 | cuda_on = 1 6 | 7 | 8 | class TestsMiniImagenet(unittest.TestCase): 9 | 10 | def test_1_shot_5_way_with_restore(self): 11 | config = { 12 | 'data.dataset': 'mini-imagenet', 13 | 'data.dataset_path': 'data/mini-imagenet', 14 | 'data.split': 'ravi', 15 | 'data.train_way': 5, 16 | 'data.batch': 10, 17 | 'data.train_support': 5, 18 | 'data.train_query': 1, 19 | 'data.test_way': 5, 20 | 'data.test_support': 5, 21 | 'data.test_query': 1, 22 | 'data.episodes': 1, 23 | 'data.cuda': cuda_on, 24 | 'data.gpu': 0, 25 | 'model.x_dim': '84,84,3', 26 | 'model.lstm_size': 32, 27 | 'model.save_dir': './miniimagenet_test', 28 | 'train.epochs': 1, 29 | 'train.optim_method': 'Adam', 30 | 'train.lr': 0.001, 31 | 'train.patience': 100, 32 | 'train.restore': 0, 33 | 'train.log_dir': 'tests/logs' 34 | } 35 | train(config) 36 | 37 | # Train after restoring 38 | # TODO: It is probably works only on GPU, should fix it later 39 | config['train.restore'] = 1 40 | train(config) 41 | 42 | def test_5_shot_5_way(self): 43 | config = { 44 | 'data.dataset': 'mini-imagenet', 45 | 'data.dataset_path': 'data/mini-imagenet', 46 | 'data.split': 'vinyals', 47 | 'data.train_way': 5, 48 | 'data.batch': 10, 49 | 'data.train_support': 5, 50 | 'data.train_query': 5, 51 | 'data.test_way': 5, 52 | 'data.test_support': 5, 53 | 'data.test_query': 5, 54 | 'data.episodes': 1, 55 | 'data.cuda': cuda_on, 56 | 'data.gpu': 0, 57 | 'model.x_dim': '84,84,3', 58 | 'model.lstm_size': 32, 59 | 'model.save_dir': './miniimagenet_test', 60 | 'train.epochs': 1, 61 | 'train.optim_method': 'Adam', 62 | 'train.lr': 0.001, 63 | 'train.patience': 100, 64 | 'train.restore': 0, 65 | 'train.log_dir': 'tests/logs' 66 | } 67 | train(config) -------------------------------------------------------------------------------- /results/README.md: -------------------------------------------------------------------------------- 1 | __Omniglot__ 2 | 3 | | Accuracy | 97.0% | 99.3% | 91.4% | 97.4% | 4 | |-----------------------------|------------------|------------------|------------------|------------------| 5 | | Author | Igor Kuznetsov | Igor Kuznetsov | Igor Kuznetsov | Igor Kuznetsov | 6 | | data.split | vinyals | vinyals | vinyals | vinyals | 7 | | data.train_way | 5 | 5 | 5 | 5 | 8 | | data.batch | 32 | 32 | 32 | 32 | 9 | | data.train_n_support | 5 | 5 | 5 | 5 | 10 | | data.train_n_query | 1 | 1 | 1 | 1 | 11 | | data.test_way (val) | 5 | 5 | 5 | 5 | 12 | | data.test_n_support (val) | 5 | 5 | 5 | 5 | 13 | | data.test_n_query (val) | 1 | 1 | 1 | 1 | 14 | | data.train_episodes | 100 | 100 | 100 | 100 | 15 | | model.x_dim | 28,28,1 | 28,28,1 | 28,28,1 | 28,28,1 | 16 | | model.lstm_size | 32 | 32 | 32 | 32 | 17 | | train.epochs | 30 | 30 | 30 | 30 | 18 | | train.optim_method | Adam | Adam | Adam | Adam | 19 | | train.lr | 0.001 | 0.001 | 0.001 | 0.001 | 20 | | train.patience | 30 | 30 | 30 | 30 | 21 | | data.test_way (test) | 5 | 5 | 20 | 20 | 22 | | data.test_n_support (test) | 1 | 5 | 1 | 5 | 23 | | data.test_n_query (test) | 1 | 5 | 1 | 5 | 24 | | data.test_n_episodes (test) | 1000 | 1000 | 100 | 100 | 25 | | Encoder CNN architecture | original (paper) | original (paper) | original (paper) | original (paper) | 26 | | seed | 2019 | 2019 | 2019 | 2019 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mathing Networks for One Shot Learning in TensorFlow 2.0 2 | 3 | Repository provides implementation of _Matching Networks for One Shot Learning_ paper (https://arxiv.org/abs/1606.04080) in Tensorflow 2.0. Model has been tested on Omniglot and miniImagenet datasets. 4 | 5 | Screenshot 2019-04-12 at 10 38 28 AM 6 | 7 | ## Dependencies and installation 8 | 9 | * Project has been tested on Ubuntu 18.04 with Python 3.6.8 and TensorFflow 2.0.0-alpha0 10 | * The dependencies are Pillow and tqdm libraries, which are included in setup requirements 11 | * Training and evaluating require `matchnet` lib. Run `python setup.py install` to install it 12 | * To download Omniglot dataset run `bash data/download_omniglot.sh` from repository's root 13 | * miniImagenet was taken from excellent project (https://github.com/renmengye/few-shot-ssl-public) and placed into data/mini-imagenet folder 14 | 15 | ## Repository Structure 16 | 17 | The repository organized as follows. `matchnet` folder contains library with model and data-loading routines. `data` serves as a default directory for the datasets (change configs to specify different data path). `scripts` contains training and evaluation scripts. `tests` provides minimal tests for training. `resulst` folder contains description of training configurations and results as well as tranining log info. 18 | 19 | ## Training and evaluating 20 | 21 | Configuration of training and evaluation procedures is specified by .config files (specify `data.datsaet_path` if dataset has different path). Default config files for Omniglot and miniImagenet are `omniglot.conf` and `miniimagenet` respectively (omniglot set as a default choice of scripts' arguments). Scripts `run_train.py` and `run_eval.py` runs prodcures while `setup_train.py` and `setup_eval.py` contain basic logic for model launching. 22 | To run training procedure run the following commands from repository's root 23 | * `python scripts/train/run_train.py --config scripts/omniglot.conf` for Omniglot 24 | * `python scripts/train/run_train.py --config scripts/miniimagenet.conf` for miniImagent 25 | 26 | To run evaluation procedure run the following commands from repository's root 27 | * `python scripts/eval/run_eval.py --config scripts/omniglot.conf` for Omniglot 28 | * `python scripts/eval/run_eval.py --config scripts/miniimagenet.conf` for miniImanet 29 | 30 | Training procedure generates log file that can be found in `results/logs` directory after training will be finished. Name of the log file contains date and time and will be printed in `stdout` in the beginning. 31 | 32 | ## Tests 33 | 34 | To run basic tests run following command from root directory (for now tests required GPU support) 35 | * `python -m unittest tests/*` 36 | 37 | ## Results 38 | 39 | Obtained results for Omniglot after 30 epochs with `train` (`val` part was not engaged yet) 40 | 41 | | Environment | 5-way-1-shot | 5-way-5-shot | 20-way-1-shot | 20-way-5-shot | 42 | |-----------------------------|------------------|------------------|------------------|------------------| 43 | | Accuracy | 97.0% | 99.3% | 91.4% | 97.4% | 44 | 45 | ## Acknowledgements 46 | 47 | * Thanks to Albert Berenguel Centeno (https://github.com/gitabcworld) for his PyTorch implementation which helped me to sort out tough parts of the training procedure. 48 | 49 | ## References 50 | 51 | [1] Oriol Vinyals, Charles Blundell, Timothy Lillicrap, Koray Kavukcuoglu, Daan Wierstra _Matching Networks for One Shot Learning_ (https://arxiv.org/abs/1606.04080) 52 | 53 | [2] Brenden M. Lake, Ruslan Salakhutdinov, Joshua B. Tenenbaum _The Omniglot Challenge: A 3-Year Progress Report_ (https://arxiv.org/abs/1902.03477) 54 | -------------------------------------------------------------------------------- /matchnet/data/mini_imagenet.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import pickle 4 | from numpy.random import permutation 5 | 6 | 7 | class MiniImagenetDataLoader(object): 8 | def __init__(self, data, batch, n_classes, n_way, n_support, n_query): 9 | self.data = data 10 | self.batch = batch 11 | self.n_way = n_way 12 | self.n_classes = n_classes 13 | self.n_support = n_support 14 | self.n_query = n_query 15 | 16 | def get_next_episode(self): 17 | """ 18 | Form episode data. 19 | 20 | Returns (np.ndarray, np.ndarray, np.ndarray, np.ndarray): 21 | 22 | """ 23 | n_examples = 600 24 | x_support = np.zeros([self.batch, self.n_way * self.n_support, 25 | 84, 84, 3], dtype=np.float32) 26 | y_support = np.zeros([self.batch, self.n_way * self.n_support]) 27 | x_query = np.zeros([self.batch, self.n_way * self.n_query, 28 | 84, 84, 3], dtype=np.float32) 29 | y_query = np.zeros([self.batch, self.n_way * self.n_query]) 30 | 31 | for i_batch in range(self.batch): 32 | classes_ep = permutation(self.n_classes)[:self.n_way] 33 | x_support_batch = [] 34 | y_support_batch = [] 35 | x_query_batch = [] 36 | y_query_batch = [] 37 | for i, i_class in enumerate(classes_ep): 38 | selected = permutation(n_examples)[:self.n_support + self.n_query] 39 | x_support_batch.append(self.data[i_class, selected[:self.n_support]]) 40 | y_support_batch += [i] * self.n_support 41 | x_query_batch.append(self.data[i_class, selected[self.n_support:]]) 42 | y_query_batch += [i] * self.n_query 43 | x_support[i_batch, :, :, :, :] = np.vstack(x_support_batch) 44 | y_support[i_batch, :] = np.asarray(y_support_batch) 45 | x_query[i_batch, :, :, :, :] = np.vstack(x_query_batch) 46 | y_query[i_batch, :] = np.asarray(y_query_batch) 47 | 48 | return x_support, y_support, x_query, y_query 49 | 50 | 51 | def load_mini_imagenet(data_dir, config, splits): 52 | """ 53 | Load miniImagenet dataset. 54 | 55 | Args: 56 | data_dir (str): path of the directory with 'splits', 'data' subdirs. 57 | config (dict): general dict with program settings. 58 | splits (list): list of strings 'train'|'val'|'test' 59 | 60 | Returns (dict): dictionary with keys as splits and values as tf.Dataset 61 | 62 | """ 63 | ret = {} 64 | for split in splits: 65 | # n_way (number of classes per episode) 66 | if split in ['val', 'test']: 67 | n_way = config['data.test_way'] 68 | else: 69 | n_way = config['data.train_way'] 70 | 71 | # n_support (number of support examples per class) 72 | if split in ['val', 'test']: 73 | n_support = config['data.test_support'] 74 | else: 75 | n_support = config['data.train_support'] 76 | 77 | # n_query (number of query examples per class) 78 | if split in ['val', 'test']: 79 | n_query = config['data.test_query'] 80 | else: 81 | n_query = config['data.train_query'] 82 | 83 | # Load images as numpy 84 | ds_filename = os.path.join(data_dir, 'data', 85 | f'mini-imagenet-cache-{split}.pkl') 86 | # load dict with 'class_dict' and 'image_data' keys 87 | with open(ds_filename, 'rb') as f: 88 | data_dict = pickle.load(f) 89 | 90 | # Convert original data to format [n_classes, n_img, w, h, c] 91 | first_key = list(data_dict['class_dict'])[0] 92 | data = np.zeros((len(data_dict['class_dict']), 93 | len(data_dict['class_dict'][first_key]), 84, 84, 3)) 94 | for i, (k, v) in enumerate(data_dict['class_dict'].items()): 95 | data[i, :, :, :, :] = data_dict['image_data'][v, :] 96 | 97 | # Normalization 98 | data /= 255. 99 | data[:, :, :, 0] = (data[:, :, :, 0] - 0.485) / 0.229 100 | data[:, :, :, 1] = (data[:, :, :, 1] - 0.456) / 0.224 101 | data[:, :, :, 2] = (data[:, :, :, 2] - 0.406) / 0.225 102 | 103 | batch = config['data.batch'] 104 | data_loader = MiniImagenetDataLoader(data, batch, data.shape[0], 105 | n_way, n_support, n_query) 106 | ret[split] = data_loader 107 | 108 | return ret 109 | -------------------------------------------------------------------------------- /matchnet/models/matching_network.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import tensorflow as tf 4 | from tensorflow.keras.layers import Dense, Flatten, Conv2D, Bidirectional, \ 5 | BatchNormalization, ReLU, MaxPool2D 6 | from tensorflow.keras import Model 7 | from tensorflow.keras.backend import categorical_crossentropy, batch_dot 8 | 9 | 10 | class MatchingNetwork(Model): 11 | def __init__(self, way, w, h, c, lstm_size=32, batch_size=32): 12 | super(MatchingNetwork, self).__init__() 13 | 14 | self.way = way 15 | self.w, self.h, self.c = w, h, c 16 | self.batch_size = batch_size 17 | 18 | self.g = tf.keras.Sequential([ 19 | Conv2D(filters=64, kernel_size=3, padding='same'), 20 | BatchNormalization(), 21 | ReLU(), 22 | MaxPool2D((2, 2)), 23 | 24 | Conv2D(filters=64, kernel_size=3, padding='same'), 25 | BatchNormalization(), 26 | ReLU(), 27 | MaxPool2D((2, 2)), 28 | 29 | Conv2D(filters=64, kernel_size=3, padding='same'), 30 | BatchNormalization(), 31 | ReLU(), 32 | MaxPool2D((2, 2)), 33 | 34 | Conv2D(filters=64, kernel_size=3, padding='same'), 35 | BatchNormalization(), 36 | ReLU(), 37 | MaxPool2D((2, 2)), 38 | Flatten()] 39 | ) 40 | # Fully contextual embedding 41 | assert self.w == self.h, "Current model operates only with square images for now" 42 | self.fce_dim = int(np.floor(self.w / 16))**2 * 64 # Input LSTM dimenstion 43 | self.fce = tf.keras.Sequential([ 44 | Bidirectional(tf.keras.layers.LSTM(lstm_size, return_sequences=True)) 45 | ]) 46 | 47 | @tf.function 48 | def call(self, x_support, y_support, x_query, y_query): 49 | def _calc_cosine_distances(support, query_img): 50 | """ 51 | Calculate cosine distances between support images and query one. 52 | Args: 53 | support (Tensor): Tensor of support images 54 | query_img (Tensor): query image 55 | 56 | Returns: 57 | 58 | """ 59 | eps = 1e-10 60 | similarities = tf.zeros([self.support_samples, self.batch], 61 | tf.float32) 62 | i_sample = 0 63 | for support_image in support: 64 | sum_support = tf.reduce_sum(tf.square(support_image), axis=1) 65 | support_magnitude = tf.math.rsqrt( 66 | tf.clip_by_value(sum_support, eps, float("inf"))) 67 | dot_prod = batch_dot( 68 | tf.expand_dims(query_img, 1), 69 | tf.expand_dims(support_image, 2) 70 | ) 71 | dot_prod = tf.squeeze(dot_prod) 72 | cos_sim = tf.multiply(dot_prod, support_magnitude) 73 | cos_sim = tf.reshape(cos_sim, [1, -1]) 74 | similarities = tf.tensor_scatter_nd_update(similarities, 75 | [[i_sample]], 76 | cos_sim) 77 | i_sample += 1 78 | return tf.transpose(similarities) 79 | 80 | self.batch = x_support.shape[0] 81 | self.support_samples = x_support.shape[1] 82 | self.query_samples = x_query.shape[1] 83 | 84 | # Get one-hot representation 85 | y_support = tf.cast(y_support, tf.int32) 86 | y_support_one_hot = tf.one_hot(y_support, self.way, axis=-1) 87 | y_support_one_hot = tf.cast(y_support_one_hot, tf.float32) 88 | 89 | y_query = tf.cast(y_query, tf.int32) 90 | y_query_one_hot = tf.one_hot(y_query, self.way, axis=-1) 91 | y_query_one_hot = tf.cast(y_query_one_hot, tf.float32) 92 | 93 | # Embeddings for support images 94 | emb_imgs = [] 95 | for i in range(self.support_samples): 96 | emb_imgs.append( self.g(x_support[:, i, :, :, :]) ) 97 | 98 | # Embeddings for query images 99 | for i_query in range(self.query_samples): 100 | query_emb = self.g(x_query[:, i_query, :, :, :]) 101 | emb_imgs.append(query_emb) 102 | outputs = tf.stack(emb_imgs) 103 | 104 | # Fully contextual embedding 105 | outputs = self.fce(outputs) 106 | 107 | # Cosine similarity between support set and query 108 | similarities = _calc_cosine_distances(outputs[:-1], outputs[-1]) 109 | 110 | # Produce predictions for target probabilities 111 | similarities = tf.nn.softmax(similarities) 112 | similarities = tf.expand_dims(similarities, 1) 113 | preds = tf.squeeze(batch_dot(similarities, y_support_one_hot)) 114 | 115 | query_labels = y_query_one_hot[:, i_query, :] 116 | eq = tf.cast(tf.equal( 117 | tf.cast(tf.argmax(preds, axis=-1), tf.int32), 118 | tf.cast(y_query[:, i_query], tf.int32)), tf.float32) 119 | if i_query == 0: 120 | ce = categorical_crossentropy(query_labels, preds) 121 | acc = tf.reduce_mean(eq) 122 | else: 123 | ce += categorical_crossentropy(query_labels, preds) 124 | acc += tf.reduce_mean(eq) 125 | 126 | emb_imgs.pop() 127 | 128 | return ce/self.query_samples, acc/self.query_samples 129 | 130 | def save(self, dir_path): 131 | """ 132 | Save model to the provided directory. 133 | 134 | Args: 135 | dir_path (str): path to the directory to save the model files. 136 | 137 | Returns: None 138 | 139 | """ 140 | if not os.path.exists(dir_path): 141 | os.makedirs(dir_path) 142 | # Save CNN encoder 143 | self.g.save(os.path.join(dir_path, 'cnn_encoder.h5')) 144 | # Save LSTM 145 | self.fce.save(os.path.join(dir_path, 'lstm.h5')) 146 | 147 | def load(self, dir_path): 148 | """ 149 | Load model from provided directory. 150 | 151 | Args: 152 | dir_path (str): path to the directory from where restore model. 153 | 154 | Returns: None 155 | 156 | """ 157 | # Encoder CNN 158 | encoder_path = os.path.join(dir_path, 'cnn_encoder.h5') 159 | self.g(tf.zeros([1, self.w, self.h, self.c])) 160 | self.g.load_weights(encoder_path) 161 | 162 | # LSTM 163 | lstm_path = os.path.join(dir_path, 'lstm.h5') 164 | self.fce(tf.zeros([1, self.batch_size, self.fce_dim])) 165 | self.fce.load_weights(lstm_path) 166 | -------------------------------------------------------------------------------- /scripts/train/train_setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import datetime 4 | from shutil import copyfile 5 | 6 | # Logging before other imports (yes, I have serious issues with that, help me) 7 | import logging 8 | real_log = f"{datetime.datetime.now():%Y-%m-%d_%H:%M}.log" 9 | logging.basicConfig(filename=real_log, 10 | format='%(asctime)s - %(levelname)s - %(message)s', 11 | datefmt='%Y.%m.%d %H:%M:%S', 12 | level=logging.DEBUG) 13 | logging.getLogger("tensorflow").setLevel(logging.WARNING) 14 | logging.getLogger("PIL").setLevel(logging.WARNING) 15 | 16 | import numpy as np 17 | import tensorflow as tf 18 | tf.config.gpu.set_per_process_memory_growth(True) 19 | from matchnet.data import load 20 | from matchnet import TrainEngine 21 | from matchnet.models import MatchingNetwork 22 | 23 | 24 | def train(config): 25 | np.random.seed(2019) 26 | tf.random.set_seed(2019) 27 | 28 | # Create folder for model 29 | model_dir = config['model.save_dir'][:config['model.save_dir'].rfind('/')] 30 | if not os.path.exists(model_dir): 31 | os.makedirs(model_dir) 32 | 33 | # Create folder for logs 34 | log_dir = config['train.log_dir'] 35 | if not os.path.exists(log_dir): 36 | os.makedirs(log_dir) 37 | log_fn = f"{config['data.dataset']}_{datetime.datetime.now():%Y-%m-%d_%H:%M}.log" 38 | log_fn = os.path.join(log_dir, log_fn) 39 | print(f"All info about training can be found in {log_fn}") 40 | 41 | # We want 'trainval' for omniglot 42 | splitting = ['train', 'trainval'][config['data.dataset'] == 'omniglot'] 43 | data_dir = config['data.dataset_path'] 44 | ret = load(data_dir, config, [splitting, 'val']) 45 | train_loader = ret[splitting] 46 | val_loader = ret['val'] 47 | 48 | # Determine device 49 | if config['data.cuda']: 50 | cuda_num = config['data.gpu'] 51 | device_name = f'GPU:{cuda_num}' 52 | else: 53 | device_name = 'CPU:0' 54 | 55 | # Setup training operations 56 | way = config['data.train_way'] 57 | lstm_dim = config['model.lstm_size'] 58 | w, h, c = list(map(int, config['model.x_dim'].split(','))) 59 | model = MatchingNetwork(way=way, w=w, h=h, c=c, lstm_size=lstm_dim) 60 | if config['train.restore']: 61 | with tf.device(device_name): 62 | model.load(config['model.save_dir']) 63 | logging.info(f"Model restored from {config['model.save_dir']}") 64 | 65 | optimizer = tf.keras.optimizers.Adam(config['train.lr']) 66 | 67 | # Metrics to gather 68 | train_loss = tf.metrics.Mean(name='train_loss') 69 | val_loss = tf.metrics.Mean(name='val_loss') 70 | train_acc = tf.metrics.Mean(name='train_accuracy') 71 | val_acc = tf.metrics.Mean(name='val_accuracy') 72 | val_losses = [] 73 | 74 | def loss(x_support, y_support, x_query, y_query): 75 | loss, acc = model(x_support, y_support, x_query, y_query) 76 | return loss, acc 77 | 78 | def train_step(loss_func, x_support, y_support, x_query, y_query): 79 | # Forward & update gradients 80 | with tf.GradientTape() as tape: 81 | loss, acc = model(x_support, y_support, x_query, y_query) 82 | gradients = tape.gradient(loss, model.trainable_variables) 83 | optimizer.apply_gradients( 84 | zip(gradients, model.trainable_variables)) 85 | 86 | # Log loss and accuracy for step 87 | train_loss(loss) 88 | train_acc(acc) 89 | 90 | def val_step(loss_func, x_support, y_support, x_query, y_query): 91 | loss, acc = loss_func(x_support, y_support, x_query, y_query) 92 | val_loss(loss) 93 | val_acc(acc) 94 | 95 | # Create empty training engine 96 | train_engine = TrainEngine() 97 | 98 | # Set hooks on training engine 99 | def on_start(state): 100 | logging.info("Training started.") 101 | train_engine.hooks['on_start'] = on_start 102 | 103 | def on_end(state): 104 | logging.info("Training ended.") 105 | train_engine.hooks['on_end'] = on_end 106 | 107 | def on_start_epoch(state): 108 | train_loss.reset_states() 109 | val_loss.reset_states() 110 | train_acc.reset_states() 111 | val_acc.reset_states() 112 | train_engine.hooks['on_start_epoch'] = on_start_epoch 113 | 114 | def on_end_epoch(state): 115 | logging.info(f"Epoch {state['epoch']} ended.") 116 | epoch = state['epoch'] 117 | template = 'Epoch {}, Loss: {:10.6f}, Accuracy: {:5.3f}, ' \ 118 | 'Val Loss: {:10.6f}, Val Accuracy: {:5.3f}' 119 | msg = template.format(epoch, train_loss.result(), train_acc.result() * 100, 120 | val_loss.result(), 121 | val_acc.result() * 100) 122 | logging.info(msg) 123 | 124 | cur_loss = val_loss.result().numpy() 125 | if cur_loss < state['best_val_loss']: 126 | logging.info("Saving new best model with loss: {:10.6f}".format(cur_loss)) 127 | state['best_val_loss'] = cur_loss 128 | model.save(config['model.save_dir']) 129 | val_losses.append(cur_loss) 130 | 131 | # Early stopping 132 | patience = config['train.patience'] 133 | if len(val_losses) > patience \ 134 | and max(val_losses[-patience:]) == val_losses[-1]: 135 | state['early_stopping_triggered'] = True 136 | train_engine.hooks['on_end_epoch'] = on_end_epoch 137 | 138 | def on_start_episode(state): 139 | logging.info(f"Episode {state['total_episode']}") 140 | x_support, y_support, x_query, y_query = state['sample'] 141 | loss_func = state['loss_func'] 142 | train_step(loss_func, x_support, y_support, x_query, y_query) 143 | train_engine.hooks['on_start_episode'] = on_start_episode 144 | 145 | def on_end_episode(state): 146 | # Validation 147 | val_loader = state['val_loader'] 148 | loss_func = state['loss_func'] 149 | for i_episode in range(config['data.episodes']): 150 | x_support, y_support, x_query, y_query = val_loader.get_next_episode() 151 | val_step(loss_func, x_support, y_support, x_query, y_query) 152 | train_engine.hooks['on_end_episode'] = on_end_episode 153 | 154 | time_start = time.time() 155 | with tf.device(device_name): 156 | train_engine.train( 157 | loss_func=loss, 158 | train_loader=train_loader, 159 | val_loader=val_loader, 160 | epochs=config['train.epochs'], 161 | n_episodes=config['data.episodes']) 162 | time_end = time.time() 163 | 164 | elapsed = time_end - time_start 165 | h, min = elapsed//3600, elapsed%3600//60 166 | sec = elapsed-min*60 167 | logging.info(f"Training took: {h} h {min} min {sec} sec") 168 | copyfile(real_log, log_fn) 169 | -------------------------------------------------------------------------------- /matchnet/data/omniglot.py: -------------------------------------------------------------------------------- 1 | import os 2 | import glob 3 | import numpy as np 4 | from numpy.random import permutation 5 | from PIL import Image 6 | 7 | 8 | class OmniglotDataLoader(object): 9 | """ 10 | Data loader for omniglot dataset. Should povide episode data on demand. 11 | """ 12 | def __init__(self, data, batch, n_classes, n_way, n_support, n_query): 13 | self.data = data 14 | self.n_way = n_way 15 | self.batch = batch 16 | self.n_classes = n_classes 17 | self.n_support = n_support 18 | self.n_query = n_query 19 | 20 | def get_next_episode(self): 21 | """ 22 | Form episode data. 23 | 24 | Returns (np.ndarray, np.ndarray, np.ndarray, np.ndarray): 25 | 26 | """ 27 | n_examples = 20 28 | x_support = np.zeros([self.batch, self.n_way * self.n_support, 29 | 28, 28, 1], dtype=np.float32) 30 | y_support = np.zeros([self.batch, self.n_way * self.n_support]) 31 | x_query = np.zeros([self.batch, self.n_way * self.n_query, 32 | 28, 28, 1], dtype=np.float32) 33 | y_query = np.zeros([self.batch, self.n_way * self.n_query]) 34 | 35 | for i_batch in range(self.batch): 36 | classes_ep = permutation(self.n_classes)[:self.n_way] 37 | x_support_batch = [] 38 | y_support_batch = [] 39 | x_query_batch = [] 40 | y_query_batch = [] 41 | for i, i_class in enumerate(classes_ep): 42 | selected = permutation(n_examples)[:self.n_support + self.n_query] 43 | x_support_batch.append(self.data[i_class, selected[:self.n_support]]) 44 | y_support_batch += [i] * self.n_support 45 | x_query_batch.append(self.data[i_class, selected[self.n_support:]]) 46 | y_query_batch += [i] * self.n_query 47 | x_support[i_batch, :, :, :, :] = np.vstack(x_support_batch) 48 | y_support[i_batch, :] = np.asarray(y_support_batch) 49 | x_query[i_batch, :, :, :, :] = np.vstack(x_query_batch) 50 | y_query[i_batch, :] = np.asarray(y_query_batch) 51 | 52 | return x_support, y_support, x_query, y_query 53 | 54 | 55 | def class_names_to_paths(data_dir, class_names): 56 | """ 57 | Return full paths to the directories containing classes of images. 58 | 59 | Args: 60 | data_dir (str): directory with dataset 61 | class_names (list): names of the classes in format alphabet/name/rotate 62 | 63 | Returns (list, list): list of paths to the classes, 64 | list of stings of rotations codes 65 | """ 66 | d = [] 67 | rots = [] 68 | for class_name in class_names: 69 | alphabet, character, rot = class_name.split('/') 70 | image_dir = os.path.join(data_dir, 'data', alphabet, character) 71 | d.append(image_dir) 72 | rots.append(rot) 73 | return d, rots 74 | 75 | 76 | def get_class_images_paths(dir_paths, rotates): 77 | """ 78 | Return class names, paths to the corresponding images and rotations from 79 | the path of the classes' directories. 80 | 81 | Args: 82 | dir_paths (list): list of the class directories 83 | rotates (list): list of stings of rotation codes. 84 | 85 | Returns (list, list, list): list of class names, list of lists of paths to 86 | the images, list of rotation angles (0..240) as integers. 87 | 88 | """ 89 | classes, img_paths, rotates_list = [], [], [] 90 | for dir_path, rotate in zip(dir_paths, rotates): 91 | class_images = sorted(glob.glob(os.path.join(dir_path, '*.png'))) 92 | 93 | classes.append(dir_path) 94 | img_paths.append(class_images) 95 | rotates_list.append(int(rotate[3:])) 96 | return classes, img_paths, rotates_list 97 | 98 | 99 | def load_and_preprocess_image(img_path, rot): 100 | """ 101 | Load and return preprocessed image. 102 | Args: 103 | img_path (str): path to the image on disk. 104 | Returns (Tensor): preprocessed image 105 | """ 106 | img = Image.open(img_path).resize((28, 28)).rotate(rot) 107 | img = np.asarray(img) 108 | img = 1 - img 109 | return np.expand_dims(img, -1) 110 | 111 | 112 | def load_omniglot(data_dir, config, splits): 113 | """ 114 | Load omniglot dataset. 115 | 116 | Args: 117 | data_dir (str): path of the directory with 'splits', 'data' subdirs. 118 | config (dict): general dict with program settings. 119 | splits (list): list of strings 'train'|'val'|'test' 120 | 121 | Returns (dict): dictionary with keys as splits and values as tf.Dataset 122 | 123 | """ 124 | split_dir = os.path.join(data_dir, 'splits', config['data.split']) 125 | ret = {} 126 | for split in splits: 127 | # n_way (number of classes per episode) 128 | if split in ['val', 'test']: 129 | n_way = config['data.test_way'] 130 | else: 131 | n_way = config['data.train_way'] 132 | 133 | # n_support (number of support examples per class) 134 | if split in ['val', 'test']: 135 | n_support = config['data.test_support'] 136 | else: 137 | n_support = config['data.train_support'] 138 | 139 | # n_query (number of query examples per class) 140 | if split in ['val', 'test']: 141 | n_query = config['data.test_query'] 142 | else: 143 | n_query = config['data.train_query'] 144 | 145 | # Get all class names 146 | class_names = [] 147 | with open(os.path.join(split_dir, f"{split}.txt"), 'r') as f: 148 | for class_name in f.readlines(): 149 | class_names.append(class_name.rstrip('\n')) 150 | 151 | # Get class names, images paths and rotation angles per each class 152 | class_paths, rotates = class_names_to_paths(data_dir, 153 | class_names) 154 | classes, img_paths, rotates = get_class_images_paths( 155 | class_paths, 156 | rotates) 157 | 158 | data = np.zeros([len(classes), len(img_paths[0]), 28, 28, 1]) 159 | for i_class in range(len(classes)): 160 | for i_img in range(len(img_paths[i_class])): 161 | data[i_class, i_img, :, :,:] = load_and_preprocess_image( 162 | img_paths[i_class][i_img], rotates[i_class]) 163 | 164 | data_loader = OmniglotDataLoader(data, 165 | batch=config['data.batch'], 166 | n_classes=len(classes), 167 | n_way=n_way, 168 | n_support=n_support, 169 | n_query=n_query) 170 | 171 | ret[split] = data_loader 172 | return ret 173 | -------------------------------------------------------------------------------- /data/omniglot/splits/vinyals/val.txt: -------------------------------------------------------------------------------- 1 | Hebrew/character01/rot000 2 | Hebrew/character01/rot090 3 | Hebrew/character01/rot180 4 | Hebrew/character01/rot270 5 | Hebrew/character02/rot000 6 | Hebrew/character02/rot090 7 | Hebrew/character02/rot180 8 | Hebrew/character02/rot270 9 | Hebrew/character03/rot000 10 | Hebrew/character03/rot090 11 | Hebrew/character03/rot180 12 | Hebrew/character03/rot270 13 | Hebrew/character04/rot000 14 | Hebrew/character04/rot090 15 | Hebrew/character04/rot180 16 | Hebrew/character04/rot270 17 | Hebrew/character05/rot000 18 | Hebrew/character05/rot090 19 | Hebrew/character05/rot180 20 | Hebrew/character05/rot270 21 | Hebrew/character06/rot000 22 | Hebrew/character06/rot090 23 | Hebrew/character06/rot180 24 | Hebrew/character06/rot270 25 | Hebrew/character07/rot000 26 | Hebrew/character07/rot090 27 | Hebrew/character07/rot180 28 | Hebrew/character07/rot270 29 | Hebrew/character08/rot000 30 | Hebrew/character08/rot090 31 | Hebrew/character08/rot180 32 | Hebrew/character08/rot270 33 | Hebrew/character09/rot000 34 | Hebrew/character09/rot090 35 | Hebrew/character09/rot180 36 | Hebrew/character09/rot270 37 | Hebrew/character10/rot000 38 | Hebrew/character10/rot090 39 | Hebrew/character10/rot180 40 | Hebrew/character10/rot270 41 | Hebrew/character11/rot000 42 | Hebrew/character11/rot090 43 | Hebrew/character11/rot180 44 | Hebrew/character11/rot270 45 | Hebrew/character12/rot000 46 | Hebrew/character12/rot090 47 | Hebrew/character12/rot180 48 | Hebrew/character12/rot270 49 | Hebrew/character13/rot000 50 | Hebrew/character13/rot090 51 | Hebrew/character13/rot180 52 | Hebrew/character13/rot270 53 | Hebrew/character14/rot000 54 | Hebrew/character14/rot090 55 | Hebrew/character14/rot180 56 | Hebrew/character14/rot270 57 | Hebrew/character15/rot000 58 | Hebrew/character15/rot090 59 | Hebrew/character15/rot180 60 | Hebrew/character15/rot270 61 | Hebrew/character16/rot000 62 | Hebrew/character16/rot090 63 | Hebrew/character16/rot180 64 | Hebrew/character16/rot270 65 | Hebrew/character17/rot000 66 | Hebrew/character17/rot090 67 | Hebrew/character17/rot180 68 | Hebrew/character17/rot270 69 | Hebrew/character18/rot000 70 | Hebrew/character18/rot090 71 | Hebrew/character18/rot180 72 | Hebrew/character18/rot270 73 | Hebrew/character19/rot000 74 | Hebrew/character19/rot090 75 | Hebrew/character19/rot180 76 | Hebrew/character19/rot270 77 | Hebrew/character20/rot000 78 | Hebrew/character20/rot090 79 | Hebrew/character20/rot180 80 | Hebrew/character20/rot270 81 | Hebrew/character21/rot000 82 | Hebrew/character21/rot090 83 | Hebrew/character21/rot180 84 | Hebrew/character21/rot270 85 | Hebrew/character22/rot000 86 | Hebrew/character22/rot090 87 | Hebrew/character22/rot180 88 | Hebrew/character22/rot270 89 | Mkhedruli_(Georgian)/character01/rot000 90 | Mkhedruli_(Georgian)/character01/rot090 91 | Mkhedruli_(Georgian)/character01/rot180 92 | Mkhedruli_(Georgian)/character01/rot270 93 | Mkhedruli_(Georgian)/character02/rot000 94 | Mkhedruli_(Georgian)/character02/rot090 95 | Mkhedruli_(Georgian)/character02/rot180 96 | Mkhedruli_(Georgian)/character02/rot270 97 | Mkhedruli_(Georgian)/character03/rot000 98 | Mkhedruli_(Georgian)/character03/rot090 99 | Mkhedruli_(Georgian)/character03/rot180 100 | Mkhedruli_(Georgian)/character03/rot270 101 | Mkhedruli_(Georgian)/character04/rot000 102 | Mkhedruli_(Georgian)/character04/rot090 103 | Mkhedruli_(Georgian)/character04/rot180 104 | Mkhedruli_(Georgian)/character04/rot270 105 | Mkhedruli_(Georgian)/character05/rot000 106 | Mkhedruli_(Georgian)/character05/rot090 107 | Mkhedruli_(Georgian)/character05/rot180 108 | Mkhedruli_(Georgian)/character05/rot270 109 | Mkhedruli_(Georgian)/character06/rot000 110 | Mkhedruli_(Georgian)/character06/rot090 111 | Mkhedruli_(Georgian)/character06/rot180 112 | Mkhedruli_(Georgian)/character06/rot270 113 | Mkhedruli_(Georgian)/character07/rot000 114 | Mkhedruli_(Georgian)/character07/rot090 115 | Mkhedruli_(Georgian)/character07/rot180 116 | Mkhedruli_(Georgian)/character07/rot270 117 | Mkhedruli_(Georgian)/character08/rot000 118 | Mkhedruli_(Georgian)/character08/rot090 119 | Mkhedruli_(Georgian)/character08/rot180 120 | Mkhedruli_(Georgian)/character08/rot270 121 | Mkhedruli_(Georgian)/character09/rot000 122 | Mkhedruli_(Georgian)/character09/rot090 123 | Mkhedruli_(Georgian)/character09/rot180 124 | Mkhedruli_(Georgian)/character09/rot270 125 | Mkhedruli_(Georgian)/character10/rot000 126 | Mkhedruli_(Georgian)/character10/rot090 127 | Mkhedruli_(Georgian)/character10/rot180 128 | Mkhedruli_(Georgian)/character10/rot270 129 | Mkhedruli_(Georgian)/character11/rot000 130 | Mkhedruli_(Georgian)/character11/rot090 131 | Mkhedruli_(Georgian)/character11/rot180 132 | Mkhedruli_(Georgian)/character11/rot270 133 | Mkhedruli_(Georgian)/character12/rot000 134 | Mkhedruli_(Georgian)/character12/rot090 135 | Mkhedruli_(Georgian)/character12/rot180 136 | Mkhedruli_(Georgian)/character12/rot270 137 | Mkhedruli_(Georgian)/character13/rot000 138 | Mkhedruli_(Georgian)/character13/rot090 139 | Mkhedruli_(Georgian)/character13/rot180 140 | Mkhedruli_(Georgian)/character13/rot270 141 | Mkhedruli_(Georgian)/character14/rot000 142 | Mkhedruli_(Georgian)/character14/rot090 143 | Mkhedruli_(Georgian)/character14/rot180 144 | Mkhedruli_(Georgian)/character14/rot270 145 | Mkhedruli_(Georgian)/character15/rot000 146 | Mkhedruli_(Georgian)/character15/rot090 147 | Mkhedruli_(Georgian)/character15/rot180 148 | Mkhedruli_(Georgian)/character15/rot270 149 | Mkhedruli_(Georgian)/character16/rot000 150 | Mkhedruli_(Georgian)/character16/rot090 151 | Mkhedruli_(Georgian)/character16/rot180 152 | Mkhedruli_(Georgian)/character16/rot270 153 | Mkhedruli_(Georgian)/character17/rot000 154 | Mkhedruli_(Georgian)/character17/rot090 155 | Mkhedruli_(Georgian)/character17/rot180 156 | Mkhedruli_(Georgian)/character17/rot270 157 | Mkhedruli_(Georgian)/character18/rot000 158 | Mkhedruli_(Georgian)/character18/rot090 159 | Mkhedruli_(Georgian)/character18/rot180 160 | Mkhedruli_(Georgian)/character18/rot270 161 | Mkhedruli_(Georgian)/character19/rot000 162 | Mkhedruli_(Georgian)/character19/rot090 163 | Mkhedruli_(Georgian)/character19/rot180 164 | Mkhedruli_(Georgian)/character19/rot270 165 | Mkhedruli_(Georgian)/character20/rot000 166 | Mkhedruli_(Georgian)/character20/rot090 167 | Mkhedruli_(Georgian)/character20/rot180 168 | Mkhedruli_(Georgian)/character20/rot270 169 | Mkhedruli_(Georgian)/character21/rot000 170 | Mkhedruli_(Georgian)/character21/rot090 171 | Mkhedruli_(Georgian)/character21/rot180 172 | Mkhedruli_(Georgian)/character21/rot270 173 | Mkhedruli_(Georgian)/character22/rot000 174 | Mkhedruli_(Georgian)/character22/rot090 175 | Mkhedruli_(Georgian)/character22/rot180 176 | Mkhedruli_(Georgian)/character22/rot270 177 | Mkhedruli_(Georgian)/character23/rot000 178 | Mkhedruli_(Georgian)/character23/rot090 179 | Mkhedruli_(Georgian)/character23/rot180 180 | Mkhedruli_(Georgian)/character23/rot270 181 | Mkhedruli_(Georgian)/character24/rot000 182 | Mkhedruli_(Georgian)/character24/rot090 183 | Mkhedruli_(Georgian)/character24/rot180 184 | Mkhedruli_(Georgian)/character24/rot270 185 | Mkhedruli_(Georgian)/character25/rot000 186 | Mkhedruli_(Georgian)/character25/rot090 187 | Mkhedruli_(Georgian)/character25/rot180 188 | Mkhedruli_(Georgian)/character25/rot270 189 | Mkhedruli_(Georgian)/character26/rot000 190 | Mkhedruli_(Georgian)/character26/rot090 191 | Mkhedruli_(Georgian)/character26/rot180 192 | Mkhedruli_(Georgian)/character26/rot270 193 | Mkhedruli_(Georgian)/character27/rot000 194 | Mkhedruli_(Georgian)/character27/rot090 195 | Mkhedruli_(Georgian)/character27/rot180 196 | Mkhedruli_(Georgian)/character27/rot270 197 | Mkhedruli_(Georgian)/character28/rot000 198 | Mkhedruli_(Georgian)/character28/rot090 199 | Mkhedruli_(Georgian)/character28/rot180 200 | Mkhedruli_(Georgian)/character28/rot270 201 | Mkhedruli_(Georgian)/character29/rot000 202 | Mkhedruli_(Georgian)/character29/rot090 203 | Mkhedruli_(Georgian)/character29/rot180 204 | Mkhedruli_(Georgian)/character29/rot270 205 | Mkhedruli_(Georgian)/character30/rot000 206 | Mkhedruli_(Georgian)/character30/rot090 207 | Mkhedruli_(Georgian)/character30/rot180 208 | Mkhedruli_(Georgian)/character30/rot270 209 | Mkhedruli_(Georgian)/character31/rot000 210 | Mkhedruli_(Georgian)/character31/rot090 211 | Mkhedruli_(Georgian)/character31/rot180 212 | Mkhedruli_(Georgian)/character31/rot270 213 | Mkhedruli_(Georgian)/character32/rot000 214 | Mkhedruli_(Georgian)/character32/rot090 215 | Mkhedruli_(Georgian)/character32/rot180 216 | Mkhedruli_(Georgian)/character32/rot270 217 | Mkhedruli_(Georgian)/character33/rot000 218 | Mkhedruli_(Georgian)/character33/rot090 219 | Mkhedruli_(Georgian)/character33/rot180 220 | Mkhedruli_(Georgian)/character33/rot270 221 | Mkhedruli_(Georgian)/character34/rot000 222 | Mkhedruli_(Georgian)/character34/rot090 223 | Mkhedruli_(Georgian)/character34/rot180 224 | Mkhedruli_(Georgian)/character34/rot270 225 | Mkhedruli_(Georgian)/character35/rot000 226 | Mkhedruli_(Georgian)/character35/rot090 227 | Mkhedruli_(Georgian)/character35/rot180 228 | Mkhedruli_(Georgian)/character35/rot270 229 | Mkhedruli_(Georgian)/character36/rot000 230 | Mkhedruli_(Georgian)/character36/rot090 231 | Mkhedruli_(Georgian)/character36/rot180 232 | Mkhedruli_(Georgian)/character36/rot270 233 | Mkhedruli_(Georgian)/character37/rot000 234 | Mkhedruli_(Georgian)/character37/rot090 235 | Mkhedruli_(Georgian)/character37/rot180 236 | Mkhedruli_(Georgian)/character37/rot270 237 | Mkhedruli_(Georgian)/character38/rot000 238 | Mkhedruli_(Georgian)/character38/rot090 239 | Mkhedruli_(Georgian)/character38/rot180 240 | Mkhedruli_(Georgian)/character38/rot270 241 | Mkhedruli_(Georgian)/character39/rot000 242 | Mkhedruli_(Georgian)/character39/rot090 243 | Mkhedruli_(Georgian)/character39/rot180 244 | Mkhedruli_(Georgian)/character39/rot270 245 | Mkhedruli_(Georgian)/character40/rot000 246 | Mkhedruli_(Georgian)/character40/rot090 247 | Mkhedruli_(Georgian)/character40/rot180 248 | Mkhedruli_(Georgian)/character40/rot270 249 | Mkhedruli_(Georgian)/character41/rot000 250 | Mkhedruli_(Georgian)/character41/rot090 251 | Mkhedruli_(Georgian)/character41/rot180 252 | Mkhedruli_(Georgian)/character41/rot270 253 | Armenian/character01/rot000 254 | Armenian/character01/rot090 255 | Armenian/character01/rot180 256 | Armenian/character01/rot270 257 | Armenian/character02/rot000 258 | Armenian/character02/rot090 259 | Armenian/character02/rot180 260 | Armenian/character02/rot270 261 | Armenian/character03/rot000 262 | Armenian/character03/rot090 263 | Armenian/character03/rot180 264 | Armenian/character03/rot270 265 | Armenian/character04/rot000 266 | Armenian/character04/rot090 267 | Armenian/character04/rot180 268 | Armenian/character04/rot270 269 | Armenian/character05/rot000 270 | Armenian/character05/rot090 271 | Armenian/character05/rot180 272 | Armenian/character05/rot270 273 | Armenian/character06/rot000 274 | Armenian/character06/rot090 275 | Armenian/character06/rot180 276 | Armenian/character06/rot270 277 | Armenian/character07/rot000 278 | Armenian/character07/rot090 279 | Armenian/character07/rot180 280 | Armenian/character07/rot270 281 | Armenian/character08/rot000 282 | Armenian/character08/rot090 283 | Armenian/character08/rot180 284 | Armenian/character08/rot270 285 | Armenian/character09/rot000 286 | Armenian/character09/rot090 287 | Armenian/character09/rot180 288 | Armenian/character09/rot270 289 | Armenian/character10/rot000 290 | Armenian/character10/rot090 291 | Armenian/character10/rot180 292 | Armenian/character10/rot270 293 | Armenian/character11/rot000 294 | Armenian/character11/rot090 295 | Armenian/character11/rot180 296 | Armenian/character11/rot270 297 | Armenian/character12/rot000 298 | Armenian/character12/rot090 299 | Armenian/character12/rot180 300 | Armenian/character12/rot270 301 | Armenian/character13/rot000 302 | Armenian/character13/rot090 303 | Armenian/character13/rot180 304 | Armenian/character13/rot270 305 | Armenian/character14/rot000 306 | Armenian/character14/rot090 307 | Armenian/character14/rot180 308 | Armenian/character14/rot270 309 | Armenian/character15/rot000 310 | Armenian/character15/rot090 311 | Armenian/character15/rot180 312 | Armenian/character15/rot270 313 | Armenian/character16/rot000 314 | Armenian/character16/rot090 315 | Armenian/character16/rot180 316 | Armenian/character16/rot270 317 | Armenian/character17/rot000 318 | Armenian/character17/rot090 319 | Armenian/character17/rot180 320 | Armenian/character17/rot270 321 | Armenian/character18/rot000 322 | Armenian/character18/rot090 323 | Armenian/character18/rot180 324 | Armenian/character18/rot270 325 | Armenian/character19/rot000 326 | Armenian/character19/rot090 327 | Armenian/character19/rot180 328 | Armenian/character19/rot270 329 | Armenian/character20/rot000 330 | Armenian/character20/rot090 331 | Armenian/character20/rot180 332 | Armenian/character20/rot270 333 | Armenian/character21/rot000 334 | Armenian/character21/rot090 335 | Armenian/character21/rot180 336 | Armenian/character21/rot270 337 | Armenian/character22/rot000 338 | Armenian/character22/rot090 339 | Armenian/character22/rot180 340 | Armenian/character22/rot270 341 | Armenian/character23/rot000 342 | Armenian/character23/rot090 343 | Armenian/character23/rot180 344 | Armenian/character23/rot270 345 | Armenian/character24/rot000 346 | Armenian/character24/rot090 347 | Armenian/character24/rot180 348 | Armenian/character24/rot270 349 | Armenian/character25/rot000 350 | Armenian/character25/rot090 351 | Armenian/character25/rot180 352 | Armenian/character25/rot270 353 | Armenian/character26/rot000 354 | Armenian/character26/rot090 355 | Armenian/character26/rot180 356 | Armenian/character26/rot270 357 | Armenian/character27/rot000 358 | Armenian/character27/rot090 359 | Armenian/character27/rot180 360 | Armenian/character27/rot270 361 | Armenian/character28/rot000 362 | Armenian/character28/rot090 363 | Armenian/character28/rot180 364 | Armenian/character28/rot270 365 | Armenian/character29/rot000 366 | Armenian/character29/rot090 367 | Armenian/character29/rot180 368 | Armenian/character29/rot270 369 | Armenian/character30/rot000 370 | Armenian/character30/rot090 371 | Armenian/character30/rot180 372 | Armenian/character30/rot270 373 | Armenian/character31/rot000 374 | Armenian/character31/rot090 375 | Armenian/character31/rot180 376 | Armenian/character31/rot270 377 | Armenian/character32/rot000 378 | Armenian/character32/rot090 379 | Armenian/character32/rot180 380 | Armenian/character32/rot270 381 | Armenian/character33/rot000 382 | Armenian/character33/rot090 383 | Armenian/character33/rot180 384 | Armenian/character33/rot270 385 | Armenian/character34/rot000 386 | Armenian/character34/rot090 387 | Armenian/character34/rot180 388 | Armenian/character34/rot270 389 | Armenian/character35/rot000 390 | Armenian/character35/rot090 391 | Armenian/character35/rot180 392 | Armenian/character35/rot270 393 | Armenian/character36/rot000 394 | Armenian/character36/rot090 395 | Armenian/character36/rot180 396 | Armenian/character36/rot270 397 | Armenian/character37/rot000 398 | Armenian/character37/rot090 399 | Armenian/character37/rot180 400 | Armenian/character37/rot270 401 | Armenian/character38/rot000 402 | Armenian/character38/rot090 403 | Armenian/character38/rot180 404 | Armenian/character38/rot270 405 | Armenian/character39/rot000 406 | Armenian/character39/rot090 407 | Armenian/character39/rot180 408 | Armenian/character39/rot270 409 | Armenian/character40/rot000 410 | Armenian/character40/rot090 411 | Armenian/character40/rot180 412 | Armenian/character40/rot270 413 | Armenian/character41/rot000 414 | Armenian/character41/rot090 415 | Armenian/character41/rot180 416 | Armenian/character41/rot270 417 | Early_Aramaic/character01/rot000 418 | Early_Aramaic/character01/rot090 419 | Early_Aramaic/character01/rot180 420 | Early_Aramaic/character01/rot270 421 | Early_Aramaic/character02/rot000 422 | Early_Aramaic/character02/rot090 423 | Early_Aramaic/character02/rot180 424 | Early_Aramaic/character02/rot270 425 | Early_Aramaic/character03/rot000 426 | Early_Aramaic/character03/rot090 427 | Early_Aramaic/character03/rot180 428 | Early_Aramaic/character03/rot270 429 | Early_Aramaic/character04/rot000 430 | Early_Aramaic/character04/rot090 431 | Early_Aramaic/character04/rot180 432 | Early_Aramaic/character04/rot270 433 | Early_Aramaic/character05/rot000 434 | Early_Aramaic/character05/rot090 435 | Early_Aramaic/character05/rot180 436 | Early_Aramaic/character05/rot270 437 | Early_Aramaic/character06/rot000 438 | Early_Aramaic/character06/rot090 439 | Early_Aramaic/character06/rot180 440 | Early_Aramaic/character06/rot270 441 | Early_Aramaic/character07/rot000 442 | Early_Aramaic/character07/rot090 443 | Early_Aramaic/character07/rot180 444 | Early_Aramaic/character07/rot270 445 | Early_Aramaic/character08/rot000 446 | Early_Aramaic/character08/rot090 447 | Early_Aramaic/character08/rot180 448 | Early_Aramaic/character08/rot270 449 | Early_Aramaic/character09/rot000 450 | Early_Aramaic/character09/rot090 451 | Early_Aramaic/character09/rot180 452 | Early_Aramaic/character09/rot270 453 | Early_Aramaic/character10/rot000 454 | Early_Aramaic/character10/rot090 455 | Early_Aramaic/character10/rot180 456 | Early_Aramaic/character10/rot270 457 | Early_Aramaic/character11/rot000 458 | Early_Aramaic/character11/rot090 459 | Early_Aramaic/character11/rot180 460 | Early_Aramaic/character11/rot270 461 | Early_Aramaic/character12/rot000 462 | Early_Aramaic/character12/rot090 463 | Early_Aramaic/character12/rot180 464 | Early_Aramaic/character12/rot270 465 | Early_Aramaic/character13/rot000 466 | Early_Aramaic/character13/rot090 467 | Early_Aramaic/character13/rot180 468 | Early_Aramaic/character13/rot270 469 | Early_Aramaic/character14/rot000 470 | Early_Aramaic/character14/rot090 471 | Early_Aramaic/character14/rot180 472 | Early_Aramaic/character14/rot270 473 | Early_Aramaic/character15/rot000 474 | Early_Aramaic/character15/rot090 475 | Early_Aramaic/character15/rot180 476 | Early_Aramaic/character15/rot270 477 | Early_Aramaic/character16/rot000 478 | Early_Aramaic/character16/rot090 479 | Early_Aramaic/character16/rot180 480 | Early_Aramaic/character16/rot270 481 | Early_Aramaic/character17/rot000 482 | Early_Aramaic/character17/rot090 483 | Early_Aramaic/character17/rot180 484 | Early_Aramaic/character17/rot270 485 | Early_Aramaic/character18/rot000 486 | Early_Aramaic/character18/rot090 487 | Early_Aramaic/character18/rot180 488 | Early_Aramaic/character18/rot270 489 | Early_Aramaic/character19/rot000 490 | Early_Aramaic/character19/rot090 491 | Early_Aramaic/character19/rot180 492 | Early_Aramaic/character19/rot270 493 | Early_Aramaic/character20/rot000 494 | Early_Aramaic/character20/rot090 495 | Early_Aramaic/character20/rot180 496 | Early_Aramaic/character20/rot270 497 | Early_Aramaic/character21/rot000 498 | Early_Aramaic/character21/rot090 499 | Early_Aramaic/character21/rot180 500 | Early_Aramaic/character21/rot270 501 | Early_Aramaic/character22/rot000 502 | Early_Aramaic/character22/rot090 503 | Early_Aramaic/character22/rot180 504 | Early_Aramaic/character22/rot270 505 | Bengali/character01/rot000 506 | Bengali/character01/rot090 507 | Bengali/character01/rot180 508 | Bengali/character01/rot270 509 | Bengali/character02/rot000 510 | Bengali/character02/rot090 511 | Bengali/character02/rot180 512 | Bengali/character02/rot270 513 | Bengali/character03/rot000 514 | Bengali/character03/rot090 515 | Bengali/character03/rot180 516 | Bengali/character03/rot270 517 | Bengali/character04/rot000 518 | Bengali/character04/rot090 519 | Bengali/character04/rot180 520 | Bengali/character04/rot270 521 | Bengali/character05/rot000 522 | Bengali/character05/rot090 523 | Bengali/character05/rot180 524 | Bengali/character05/rot270 525 | Bengali/character06/rot000 526 | Bengali/character06/rot090 527 | Bengali/character06/rot180 528 | Bengali/character06/rot270 529 | Bengali/character07/rot000 530 | Bengali/character07/rot090 531 | Bengali/character07/rot180 532 | Bengali/character07/rot270 533 | Bengali/character08/rot000 534 | Bengali/character08/rot090 535 | Bengali/character08/rot180 536 | Bengali/character08/rot270 537 | Bengali/character09/rot000 538 | Bengali/character09/rot090 539 | Bengali/character09/rot180 540 | Bengali/character09/rot270 541 | Bengali/character10/rot000 542 | Bengali/character10/rot090 543 | Bengali/character10/rot180 544 | Bengali/character10/rot270 545 | Bengali/character11/rot000 546 | Bengali/character11/rot090 547 | Bengali/character11/rot180 548 | Bengali/character11/rot270 549 | Bengali/character12/rot000 550 | Bengali/character12/rot090 551 | Bengali/character12/rot180 552 | Bengali/character12/rot270 553 | Bengali/character13/rot000 554 | Bengali/character13/rot090 555 | Bengali/character13/rot180 556 | Bengali/character13/rot270 557 | Bengali/character14/rot000 558 | Bengali/character14/rot090 559 | Bengali/character14/rot180 560 | Bengali/character14/rot270 561 | Bengali/character15/rot000 562 | Bengali/character15/rot090 563 | Bengali/character15/rot180 564 | Bengali/character15/rot270 565 | Bengali/character16/rot000 566 | Bengali/character16/rot090 567 | Bengali/character16/rot180 568 | Bengali/character16/rot270 569 | Bengali/character17/rot000 570 | Bengali/character17/rot090 571 | Bengali/character17/rot180 572 | Bengali/character17/rot270 573 | Bengali/character18/rot000 574 | Bengali/character18/rot090 575 | Bengali/character18/rot180 576 | Bengali/character18/rot270 577 | Bengali/character19/rot000 578 | Bengali/character19/rot090 579 | Bengali/character19/rot180 580 | Bengali/character19/rot270 581 | Bengali/character20/rot000 582 | Bengali/character20/rot090 583 | Bengali/character20/rot180 584 | Bengali/character20/rot270 585 | Bengali/character21/rot000 586 | Bengali/character21/rot090 587 | Bengali/character21/rot180 588 | Bengali/character21/rot270 589 | Bengali/character22/rot000 590 | Bengali/character22/rot090 591 | Bengali/character22/rot180 592 | Bengali/character22/rot270 593 | Bengali/character23/rot000 594 | Bengali/character23/rot090 595 | Bengali/character23/rot180 596 | Bengali/character23/rot270 597 | Bengali/character24/rot000 598 | Bengali/character24/rot090 599 | Bengali/character24/rot180 600 | Bengali/character24/rot270 601 | Bengali/character25/rot000 602 | Bengali/character25/rot090 603 | Bengali/character25/rot180 604 | Bengali/character25/rot270 605 | Bengali/character26/rot000 606 | Bengali/character26/rot090 607 | Bengali/character26/rot180 608 | Bengali/character26/rot270 609 | Bengali/character27/rot000 610 | Bengali/character27/rot090 611 | Bengali/character27/rot180 612 | Bengali/character27/rot270 613 | Bengali/character28/rot000 614 | Bengali/character28/rot090 615 | Bengali/character28/rot180 616 | Bengali/character28/rot270 617 | Bengali/character29/rot000 618 | Bengali/character29/rot090 619 | Bengali/character29/rot180 620 | Bengali/character29/rot270 621 | Bengali/character30/rot000 622 | Bengali/character30/rot090 623 | Bengali/character30/rot180 624 | Bengali/character30/rot270 625 | Bengali/character31/rot000 626 | Bengali/character31/rot090 627 | Bengali/character31/rot180 628 | Bengali/character31/rot270 629 | Bengali/character32/rot000 630 | Bengali/character32/rot090 631 | Bengali/character32/rot180 632 | Bengali/character32/rot270 633 | Bengali/character33/rot000 634 | Bengali/character33/rot090 635 | Bengali/character33/rot180 636 | Bengali/character33/rot270 637 | Bengali/character34/rot000 638 | Bengali/character34/rot090 639 | Bengali/character34/rot180 640 | Bengali/character34/rot270 641 | Bengali/character35/rot000 642 | Bengali/character35/rot090 643 | Bengali/character35/rot180 644 | Bengali/character35/rot270 645 | Bengali/character36/rot000 646 | Bengali/character36/rot090 647 | Bengali/character36/rot180 648 | Bengali/character36/rot270 649 | Bengali/character37/rot000 650 | Bengali/character37/rot090 651 | Bengali/character37/rot180 652 | Bengali/character37/rot270 653 | Bengali/character38/rot000 654 | Bengali/character38/rot090 655 | Bengali/character38/rot180 656 | Bengali/character38/rot270 657 | Bengali/character39/rot000 658 | Bengali/character39/rot090 659 | Bengali/character39/rot180 660 | Bengali/character39/rot270 661 | Bengali/character40/rot000 662 | Bengali/character40/rot090 663 | Bengali/character40/rot180 664 | Bengali/character40/rot270 665 | Bengali/character41/rot000 666 | Bengali/character41/rot090 667 | Bengali/character41/rot180 668 | Bengali/character41/rot270 669 | Bengali/character42/rot000 670 | Bengali/character42/rot090 671 | Bengali/character42/rot180 672 | Bengali/character42/rot270 673 | Bengali/character43/rot000 674 | Bengali/character43/rot090 675 | Bengali/character43/rot180 676 | Bengali/character43/rot270 677 | Bengali/character44/rot000 678 | Bengali/character44/rot090 679 | Bengali/character44/rot180 680 | Bengali/character44/rot270 681 | Bengali/character45/rot000 682 | Bengali/character45/rot090 683 | Bengali/character45/rot180 684 | Bengali/character45/rot270 685 | Bengali/character46/rot000 686 | Bengali/character46/rot090 687 | Bengali/character46/rot180 688 | Bengali/character46/rot270 689 | -------------------------------------------------------------------------------- /data/omniglot/splits/vinyals/test.txt: -------------------------------------------------------------------------------- 1 | Gurmukhi/character42/rot000 2 | Gurmukhi/character42/rot090 3 | Gurmukhi/character42/rot180 4 | Gurmukhi/character42/rot270 5 | Gurmukhi/character43/rot000 6 | Gurmukhi/character43/rot090 7 | Gurmukhi/character43/rot180 8 | Gurmukhi/character43/rot270 9 | Gurmukhi/character44/rot000 10 | Gurmukhi/character44/rot090 11 | Gurmukhi/character44/rot180 12 | Gurmukhi/character44/rot270 13 | Gurmukhi/character45/rot000 14 | Gurmukhi/character45/rot090 15 | Gurmukhi/character45/rot180 16 | Gurmukhi/character45/rot270 17 | Kannada/character01/rot000 18 | Kannada/character01/rot090 19 | Kannada/character01/rot180 20 | Kannada/character01/rot270 21 | Kannada/character02/rot000 22 | Kannada/character02/rot090 23 | Kannada/character02/rot180 24 | Kannada/character02/rot270 25 | Kannada/character03/rot000 26 | Kannada/character03/rot090 27 | Kannada/character03/rot180 28 | Kannada/character03/rot270 29 | Kannada/character04/rot000 30 | Kannada/character04/rot090 31 | Kannada/character04/rot180 32 | Kannada/character04/rot270 33 | Kannada/character05/rot000 34 | Kannada/character05/rot090 35 | Kannada/character05/rot180 36 | Kannada/character05/rot270 37 | Kannada/character06/rot000 38 | Kannada/character06/rot090 39 | Kannada/character06/rot180 40 | Kannada/character06/rot270 41 | Kannada/character07/rot000 42 | Kannada/character07/rot090 43 | Kannada/character07/rot180 44 | Kannada/character07/rot270 45 | Kannada/character08/rot000 46 | Kannada/character08/rot090 47 | Kannada/character08/rot180 48 | Kannada/character08/rot270 49 | Kannada/character09/rot000 50 | Kannada/character09/rot090 51 | Kannada/character09/rot180 52 | Kannada/character09/rot270 53 | Kannada/character10/rot000 54 | Kannada/character10/rot090 55 | Kannada/character10/rot180 56 | Kannada/character10/rot270 57 | Kannada/character11/rot000 58 | Kannada/character11/rot090 59 | Kannada/character11/rot180 60 | Kannada/character11/rot270 61 | Kannada/character12/rot000 62 | Kannada/character12/rot090 63 | Kannada/character12/rot180 64 | Kannada/character12/rot270 65 | Kannada/character13/rot000 66 | Kannada/character13/rot090 67 | Kannada/character13/rot180 68 | Kannada/character13/rot270 69 | Kannada/character14/rot000 70 | Kannada/character14/rot090 71 | Kannada/character14/rot180 72 | Kannada/character14/rot270 73 | Kannada/character15/rot000 74 | Kannada/character15/rot090 75 | Kannada/character15/rot180 76 | Kannada/character15/rot270 77 | Kannada/character16/rot000 78 | Kannada/character16/rot090 79 | Kannada/character16/rot180 80 | Kannada/character16/rot270 81 | Kannada/character17/rot000 82 | Kannada/character17/rot090 83 | Kannada/character17/rot180 84 | Kannada/character17/rot270 85 | Kannada/character18/rot000 86 | Kannada/character18/rot090 87 | Kannada/character18/rot180 88 | Kannada/character18/rot270 89 | Kannada/character19/rot000 90 | Kannada/character19/rot090 91 | Kannada/character19/rot180 92 | Kannada/character19/rot270 93 | Kannada/character20/rot000 94 | Kannada/character20/rot090 95 | Kannada/character20/rot180 96 | Kannada/character20/rot270 97 | Kannada/character21/rot000 98 | Kannada/character21/rot090 99 | Kannada/character21/rot180 100 | Kannada/character21/rot270 101 | Kannada/character22/rot000 102 | Kannada/character22/rot090 103 | Kannada/character22/rot180 104 | Kannada/character22/rot270 105 | Kannada/character23/rot000 106 | Kannada/character23/rot090 107 | Kannada/character23/rot180 108 | Kannada/character23/rot270 109 | Kannada/character24/rot000 110 | Kannada/character24/rot090 111 | Kannada/character24/rot180 112 | Kannada/character24/rot270 113 | Kannada/character25/rot000 114 | Kannada/character25/rot090 115 | Kannada/character25/rot180 116 | Kannada/character25/rot270 117 | Kannada/character26/rot000 118 | Kannada/character26/rot090 119 | Kannada/character26/rot180 120 | Kannada/character26/rot270 121 | Kannada/character27/rot000 122 | Kannada/character27/rot090 123 | Kannada/character27/rot180 124 | Kannada/character27/rot270 125 | Kannada/character28/rot000 126 | Kannada/character28/rot090 127 | Kannada/character28/rot180 128 | Kannada/character28/rot270 129 | Kannada/character29/rot000 130 | Kannada/character29/rot090 131 | Kannada/character29/rot180 132 | Kannada/character29/rot270 133 | Kannada/character30/rot000 134 | Kannada/character30/rot090 135 | Kannada/character30/rot180 136 | Kannada/character30/rot270 137 | Kannada/character31/rot000 138 | Kannada/character31/rot090 139 | Kannada/character31/rot180 140 | Kannada/character31/rot270 141 | Kannada/character32/rot000 142 | Kannada/character32/rot090 143 | Kannada/character32/rot180 144 | Kannada/character32/rot270 145 | Kannada/character33/rot000 146 | Kannada/character33/rot090 147 | Kannada/character33/rot180 148 | Kannada/character33/rot270 149 | Kannada/character34/rot000 150 | Kannada/character34/rot090 151 | Kannada/character34/rot180 152 | Kannada/character34/rot270 153 | Kannada/character35/rot000 154 | Kannada/character35/rot090 155 | Kannada/character35/rot180 156 | Kannada/character35/rot270 157 | Kannada/character36/rot000 158 | Kannada/character36/rot090 159 | Kannada/character36/rot180 160 | Kannada/character36/rot270 161 | Kannada/character37/rot000 162 | Kannada/character37/rot090 163 | Kannada/character37/rot180 164 | Kannada/character37/rot270 165 | Kannada/character38/rot000 166 | Kannada/character38/rot090 167 | Kannada/character38/rot180 168 | Kannada/character38/rot270 169 | Kannada/character39/rot000 170 | Kannada/character39/rot090 171 | Kannada/character39/rot180 172 | Kannada/character39/rot270 173 | Kannada/character40/rot000 174 | Kannada/character40/rot090 175 | Kannada/character40/rot180 176 | Kannada/character40/rot270 177 | Kannada/character41/rot000 178 | Kannada/character41/rot090 179 | Kannada/character41/rot180 180 | Kannada/character41/rot270 181 | Keble/character01/rot000 182 | Keble/character01/rot090 183 | Keble/character01/rot180 184 | Keble/character01/rot270 185 | Keble/character02/rot000 186 | Keble/character02/rot090 187 | Keble/character02/rot180 188 | Keble/character02/rot270 189 | Keble/character03/rot000 190 | Keble/character03/rot090 191 | Keble/character03/rot180 192 | Keble/character03/rot270 193 | Keble/character04/rot000 194 | Keble/character04/rot090 195 | Keble/character04/rot180 196 | Keble/character04/rot270 197 | Keble/character05/rot000 198 | Keble/character05/rot090 199 | Keble/character05/rot180 200 | Keble/character05/rot270 201 | Keble/character06/rot000 202 | Keble/character06/rot090 203 | Keble/character06/rot180 204 | Keble/character06/rot270 205 | Keble/character07/rot000 206 | Keble/character07/rot090 207 | Keble/character07/rot180 208 | Keble/character07/rot270 209 | Keble/character08/rot000 210 | Keble/character08/rot090 211 | Keble/character08/rot180 212 | Keble/character08/rot270 213 | Keble/character09/rot000 214 | Keble/character09/rot090 215 | Keble/character09/rot180 216 | Keble/character09/rot270 217 | Keble/character10/rot000 218 | Keble/character10/rot090 219 | Keble/character10/rot180 220 | Keble/character10/rot270 221 | Keble/character11/rot000 222 | Keble/character11/rot090 223 | Keble/character11/rot180 224 | Keble/character11/rot270 225 | Keble/character12/rot000 226 | Keble/character12/rot090 227 | Keble/character12/rot180 228 | Keble/character12/rot270 229 | Keble/character13/rot000 230 | Keble/character13/rot090 231 | Keble/character13/rot180 232 | Keble/character13/rot270 233 | Keble/character14/rot000 234 | Keble/character14/rot090 235 | Keble/character14/rot180 236 | Keble/character14/rot270 237 | Keble/character15/rot000 238 | Keble/character15/rot090 239 | Keble/character15/rot180 240 | Keble/character15/rot270 241 | Keble/character16/rot000 242 | Keble/character16/rot090 243 | Keble/character16/rot180 244 | Keble/character16/rot270 245 | Keble/character17/rot000 246 | Keble/character17/rot090 247 | Keble/character17/rot180 248 | Keble/character17/rot270 249 | Keble/character18/rot000 250 | Keble/character18/rot090 251 | Keble/character18/rot180 252 | Keble/character18/rot270 253 | Keble/character19/rot000 254 | Keble/character19/rot090 255 | Keble/character19/rot180 256 | Keble/character19/rot270 257 | Keble/character20/rot000 258 | Keble/character20/rot090 259 | Keble/character20/rot180 260 | Keble/character20/rot270 261 | Keble/character21/rot000 262 | Keble/character21/rot090 263 | Keble/character21/rot180 264 | Keble/character21/rot270 265 | Keble/character22/rot000 266 | Keble/character22/rot090 267 | Keble/character22/rot180 268 | Keble/character22/rot270 269 | Keble/character23/rot000 270 | Keble/character23/rot090 271 | Keble/character23/rot180 272 | Keble/character23/rot270 273 | Keble/character24/rot000 274 | Keble/character24/rot090 275 | Keble/character24/rot180 276 | Keble/character24/rot270 277 | Keble/character25/rot000 278 | Keble/character25/rot090 279 | Keble/character25/rot180 280 | Keble/character25/rot270 281 | Keble/character26/rot000 282 | Keble/character26/rot090 283 | Keble/character26/rot180 284 | Keble/character26/rot270 285 | Malayalam/character01/rot000 286 | Malayalam/character01/rot090 287 | Malayalam/character01/rot180 288 | Malayalam/character01/rot270 289 | Malayalam/character02/rot000 290 | Malayalam/character02/rot090 291 | Malayalam/character02/rot180 292 | Malayalam/character02/rot270 293 | Malayalam/character03/rot000 294 | Malayalam/character03/rot090 295 | Malayalam/character03/rot180 296 | Malayalam/character03/rot270 297 | Malayalam/character04/rot000 298 | Malayalam/character04/rot090 299 | Malayalam/character04/rot180 300 | Malayalam/character04/rot270 301 | Malayalam/character05/rot000 302 | Malayalam/character05/rot090 303 | Malayalam/character05/rot180 304 | Malayalam/character05/rot270 305 | Malayalam/character06/rot000 306 | Malayalam/character06/rot090 307 | Malayalam/character06/rot180 308 | Malayalam/character06/rot270 309 | Malayalam/character07/rot000 310 | Malayalam/character07/rot090 311 | Malayalam/character07/rot180 312 | Malayalam/character07/rot270 313 | Malayalam/character08/rot000 314 | Malayalam/character08/rot090 315 | Malayalam/character08/rot180 316 | Malayalam/character08/rot270 317 | Malayalam/character09/rot000 318 | Malayalam/character09/rot090 319 | Malayalam/character09/rot180 320 | Malayalam/character09/rot270 321 | Malayalam/character10/rot000 322 | Malayalam/character10/rot090 323 | Malayalam/character10/rot180 324 | Malayalam/character10/rot270 325 | Malayalam/character11/rot000 326 | Malayalam/character11/rot090 327 | Malayalam/character11/rot180 328 | Malayalam/character11/rot270 329 | Malayalam/character12/rot000 330 | Malayalam/character12/rot090 331 | Malayalam/character12/rot180 332 | Malayalam/character12/rot270 333 | Malayalam/character13/rot000 334 | Malayalam/character13/rot090 335 | Malayalam/character13/rot180 336 | Malayalam/character13/rot270 337 | Malayalam/character14/rot000 338 | Malayalam/character14/rot090 339 | Malayalam/character14/rot180 340 | Malayalam/character14/rot270 341 | Malayalam/character15/rot000 342 | Malayalam/character15/rot090 343 | Malayalam/character15/rot180 344 | Malayalam/character15/rot270 345 | Malayalam/character16/rot000 346 | Malayalam/character16/rot090 347 | Malayalam/character16/rot180 348 | Malayalam/character16/rot270 349 | Malayalam/character17/rot000 350 | Malayalam/character17/rot090 351 | Malayalam/character17/rot180 352 | Malayalam/character17/rot270 353 | Malayalam/character18/rot000 354 | Malayalam/character18/rot090 355 | Malayalam/character18/rot180 356 | Malayalam/character18/rot270 357 | Malayalam/character19/rot000 358 | Malayalam/character19/rot090 359 | Malayalam/character19/rot180 360 | Malayalam/character19/rot270 361 | Malayalam/character20/rot000 362 | Malayalam/character20/rot090 363 | Malayalam/character20/rot180 364 | Malayalam/character20/rot270 365 | Malayalam/character21/rot000 366 | Malayalam/character21/rot090 367 | Malayalam/character21/rot180 368 | Malayalam/character21/rot270 369 | Malayalam/character22/rot000 370 | Malayalam/character22/rot090 371 | Malayalam/character22/rot180 372 | Malayalam/character22/rot270 373 | Malayalam/character23/rot000 374 | Malayalam/character23/rot090 375 | Malayalam/character23/rot180 376 | Malayalam/character23/rot270 377 | Malayalam/character24/rot000 378 | Malayalam/character24/rot090 379 | Malayalam/character24/rot180 380 | Malayalam/character24/rot270 381 | Malayalam/character25/rot000 382 | Malayalam/character25/rot090 383 | Malayalam/character25/rot180 384 | Malayalam/character25/rot270 385 | Malayalam/character26/rot000 386 | Malayalam/character26/rot090 387 | Malayalam/character26/rot180 388 | Malayalam/character26/rot270 389 | Malayalam/character27/rot000 390 | Malayalam/character27/rot090 391 | Malayalam/character27/rot180 392 | Malayalam/character27/rot270 393 | Malayalam/character28/rot000 394 | Malayalam/character28/rot090 395 | Malayalam/character28/rot180 396 | Malayalam/character28/rot270 397 | Malayalam/character29/rot000 398 | Malayalam/character29/rot090 399 | Malayalam/character29/rot180 400 | Malayalam/character29/rot270 401 | Malayalam/character30/rot000 402 | Malayalam/character30/rot090 403 | Malayalam/character30/rot180 404 | Malayalam/character30/rot270 405 | Malayalam/character31/rot000 406 | Malayalam/character31/rot090 407 | Malayalam/character31/rot180 408 | Malayalam/character31/rot270 409 | Malayalam/character32/rot000 410 | Malayalam/character32/rot090 411 | Malayalam/character32/rot180 412 | Malayalam/character32/rot270 413 | Malayalam/character33/rot000 414 | Malayalam/character33/rot090 415 | Malayalam/character33/rot180 416 | Malayalam/character33/rot270 417 | Malayalam/character34/rot000 418 | Malayalam/character34/rot090 419 | Malayalam/character34/rot180 420 | Malayalam/character34/rot270 421 | Malayalam/character35/rot000 422 | Malayalam/character35/rot090 423 | Malayalam/character35/rot180 424 | Malayalam/character35/rot270 425 | Malayalam/character36/rot000 426 | Malayalam/character36/rot090 427 | Malayalam/character36/rot180 428 | Malayalam/character36/rot270 429 | Malayalam/character37/rot000 430 | Malayalam/character37/rot090 431 | Malayalam/character37/rot180 432 | Malayalam/character37/rot270 433 | Malayalam/character38/rot000 434 | Malayalam/character38/rot090 435 | Malayalam/character38/rot180 436 | Malayalam/character38/rot270 437 | Malayalam/character39/rot000 438 | Malayalam/character39/rot090 439 | Malayalam/character39/rot180 440 | Malayalam/character39/rot270 441 | Malayalam/character40/rot000 442 | Malayalam/character40/rot090 443 | Malayalam/character40/rot180 444 | Malayalam/character40/rot270 445 | Malayalam/character41/rot000 446 | Malayalam/character41/rot090 447 | Malayalam/character41/rot180 448 | Malayalam/character41/rot270 449 | Malayalam/character42/rot000 450 | Malayalam/character42/rot090 451 | Malayalam/character42/rot180 452 | Malayalam/character42/rot270 453 | Malayalam/character43/rot000 454 | Malayalam/character43/rot090 455 | Malayalam/character43/rot180 456 | Malayalam/character43/rot270 457 | Malayalam/character44/rot000 458 | Malayalam/character44/rot090 459 | Malayalam/character44/rot180 460 | Malayalam/character44/rot270 461 | Malayalam/character45/rot000 462 | Malayalam/character45/rot090 463 | Malayalam/character45/rot180 464 | Malayalam/character45/rot270 465 | Malayalam/character46/rot000 466 | Malayalam/character46/rot090 467 | Malayalam/character46/rot180 468 | Malayalam/character46/rot270 469 | Malayalam/character47/rot000 470 | Malayalam/character47/rot090 471 | Malayalam/character47/rot180 472 | Malayalam/character47/rot270 473 | Manipuri/character01/rot000 474 | Manipuri/character01/rot090 475 | Manipuri/character01/rot180 476 | Manipuri/character01/rot270 477 | Manipuri/character02/rot000 478 | Manipuri/character02/rot090 479 | Manipuri/character02/rot180 480 | Manipuri/character02/rot270 481 | Manipuri/character03/rot000 482 | Manipuri/character03/rot090 483 | Manipuri/character03/rot180 484 | Manipuri/character03/rot270 485 | Manipuri/character04/rot000 486 | Manipuri/character04/rot090 487 | Manipuri/character04/rot180 488 | Manipuri/character04/rot270 489 | Manipuri/character05/rot000 490 | Manipuri/character05/rot090 491 | Manipuri/character05/rot180 492 | Manipuri/character05/rot270 493 | Manipuri/character06/rot000 494 | Manipuri/character06/rot090 495 | Manipuri/character06/rot180 496 | Manipuri/character06/rot270 497 | Manipuri/character07/rot000 498 | Manipuri/character07/rot090 499 | Manipuri/character07/rot180 500 | Manipuri/character07/rot270 501 | Manipuri/character08/rot000 502 | Manipuri/character08/rot090 503 | Manipuri/character08/rot180 504 | Manipuri/character08/rot270 505 | Manipuri/character09/rot000 506 | Manipuri/character09/rot090 507 | Manipuri/character09/rot180 508 | Manipuri/character09/rot270 509 | Manipuri/character10/rot000 510 | Manipuri/character10/rot090 511 | Manipuri/character10/rot180 512 | Manipuri/character10/rot270 513 | Manipuri/character11/rot000 514 | Manipuri/character11/rot090 515 | Manipuri/character11/rot180 516 | Manipuri/character11/rot270 517 | Manipuri/character12/rot000 518 | Manipuri/character12/rot090 519 | Manipuri/character12/rot180 520 | Manipuri/character12/rot270 521 | Manipuri/character13/rot000 522 | Manipuri/character13/rot090 523 | Manipuri/character13/rot180 524 | Manipuri/character13/rot270 525 | Manipuri/character14/rot000 526 | Manipuri/character14/rot090 527 | Manipuri/character14/rot180 528 | Manipuri/character14/rot270 529 | Manipuri/character15/rot000 530 | Manipuri/character15/rot090 531 | Manipuri/character15/rot180 532 | Manipuri/character15/rot270 533 | Manipuri/character16/rot000 534 | Manipuri/character16/rot090 535 | Manipuri/character16/rot180 536 | Manipuri/character16/rot270 537 | Manipuri/character17/rot000 538 | Manipuri/character17/rot090 539 | Manipuri/character17/rot180 540 | Manipuri/character17/rot270 541 | Manipuri/character18/rot000 542 | Manipuri/character18/rot090 543 | Manipuri/character18/rot180 544 | Manipuri/character18/rot270 545 | Manipuri/character19/rot000 546 | Manipuri/character19/rot090 547 | Manipuri/character19/rot180 548 | Manipuri/character19/rot270 549 | Manipuri/character20/rot000 550 | Manipuri/character20/rot090 551 | Manipuri/character20/rot180 552 | Manipuri/character20/rot270 553 | Manipuri/character21/rot000 554 | Manipuri/character21/rot090 555 | Manipuri/character21/rot180 556 | Manipuri/character21/rot270 557 | Manipuri/character22/rot000 558 | Manipuri/character22/rot090 559 | Manipuri/character22/rot180 560 | Manipuri/character22/rot270 561 | Manipuri/character23/rot000 562 | Manipuri/character23/rot090 563 | Manipuri/character23/rot180 564 | Manipuri/character23/rot270 565 | Manipuri/character24/rot000 566 | Manipuri/character24/rot090 567 | Manipuri/character24/rot180 568 | Manipuri/character24/rot270 569 | Manipuri/character25/rot000 570 | Manipuri/character25/rot090 571 | Manipuri/character25/rot180 572 | Manipuri/character25/rot270 573 | Manipuri/character26/rot000 574 | Manipuri/character26/rot090 575 | Manipuri/character26/rot180 576 | Manipuri/character26/rot270 577 | Manipuri/character27/rot000 578 | Manipuri/character27/rot090 579 | Manipuri/character27/rot180 580 | Manipuri/character27/rot270 581 | Manipuri/character28/rot000 582 | Manipuri/character28/rot090 583 | Manipuri/character28/rot180 584 | Manipuri/character28/rot270 585 | Manipuri/character29/rot000 586 | Manipuri/character29/rot090 587 | Manipuri/character29/rot180 588 | Manipuri/character29/rot270 589 | Manipuri/character30/rot000 590 | Manipuri/character30/rot090 591 | Manipuri/character30/rot180 592 | Manipuri/character30/rot270 593 | Manipuri/character31/rot000 594 | Manipuri/character31/rot090 595 | Manipuri/character31/rot180 596 | Manipuri/character31/rot270 597 | Manipuri/character32/rot000 598 | Manipuri/character32/rot090 599 | Manipuri/character32/rot180 600 | Manipuri/character32/rot270 601 | Manipuri/character33/rot000 602 | Manipuri/character33/rot090 603 | Manipuri/character33/rot180 604 | Manipuri/character33/rot270 605 | Manipuri/character34/rot000 606 | Manipuri/character34/rot090 607 | Manipuri/character34/rot180 608 | Manipuri/character34/rot270 609 | Manipuri/character35/rot000 610 | Manipuri/character35/rot090 611 | Manipuri/character35/rot180 612 | Manipuri/character35/rot270 613 | Manipuri/character36/rot000 614 | Manipuri/character36/rot090 615 | Manipuri/character36/rot180 616 | Manipuri/character36/rot270 617 | Manipuri/character37/rot000 618 | Manipuri/character37/rot090 619 | Manipuri/character37/rot180 620 | Manipuri/character37/rot270 621 | Manipuri/character38/rot000 622 | Manipuri/character38/rot090 623 | Manipuri/character38/rot180 624 | Manipuri/character38/rot270 625 | Manipuri/character39/rot000 626 | Manipuri/character39/rot090 627 | Manipuri/character39/rot180 628 | Manipuri/character39/rot270 629 | Manipuri/character40/rot000 630 | Manipuri/character40/rot090 631 | Manipuri/character40/rot180 632 | Manipuri/character40/rot270 633 | Mongolian/character01/rot000 634 | Mongolian/character01/rot090 635 | Mongolian/character01/rot180 636 | Mongolian/character01/rot270 637 | Mongolian/character02/rot000 638 | Mongolian/character02/rot090 639 | Mongolian/character02/rot180 640 | Mongolian/character02/rot270 641 | Mongolian/character03/rot000 642 | Mongolian/character03/rot090 643 | Mongolian/character03/rot180 644 | Mongolian/character03/rot270 645 | Mongolian/character04/rot000 646 | Mongolian/character04/rot090 647 | Mongolian/character04/rot180 648 | Mongolian/character04/rot270 649 | Mongolian/character05/rot000 650 | Mongolian/character05/rot090 651 | Mongolian/character05/rot180 652 | Mongolian/character05/rot270 653 | Mongolian/character06/rot000 654 | Mongolian/character06/rot090 655 | Mongolian/character06/rot180 656 | Mongolian/character06/rot270 657 | Mongolian/character07/rot000 658 | Mongolian/character07/rot090 659 | Mongolian/character07/rot180 660 | Mongolian/character07/rot270 661 | Mongolian/character08/rot000 662 | Mongolian/character08/rot090 663 | Mongolian/character08/rot180 664 | Mongolian/character08/rot270 665 | Mongolian/character09/rot000 666 | Mongolian/character09/rot090 667 | Mongolian/character09/rot180 668 | Mongolian/character09/rot270 669 | Mongolian/character10/rot000 670 | Mongolian/character10/rot090 671 | Mongolian/character10/rot180 672 | Mongolian/character10/rot270 673 | Mongolian/character11/rot000 674 | Mongolian/character11/rot090 675 | Mongolian/character11/rot180 676 | Mongolian/character11/rot270 677 | Mongolian/character12/rot000 678 | Mongolian/character12/rot090 679 | Mongolian/character12/rot180 680 | Mongolian/character12/rot270 681 | Mongolian/character13/rot000 682 | Mongolian/character13/rot090 683 | Mongolian/character13/rot180 684 | Mongolian/character13/rot270 685 | Mongolian/character14/rot000 686 | Mongolian/character14/rot090 687 | Mongolian/character14/rot180 688 | Mongolian/character14/rot270 689 | Mongolian/character15/rot000 690 | Mongolian/character15/rot090 691 | Mongolian/character15/rot180 692 | Mongolian/character15/rot270 693 | Mongolian/character16/rot000 694 | Mongolian/character16/rot090 695 | Mongolian/character16/rot180 696 | Mongolian/character16/rot270 697 | Mongolian/character17/rot000 698 | Mongolian/character17/rot090 699 | Mongolian/character17/rot180 700 | Mongolian/character17/rot270 701 | Mongolian/character18/rot000 702 | Mongolian/character18/rot090 703 | Mongolian/character18/rot180 704 | Mongolian/character18/rot270 705 | Mongolian/character19/rot000 706 | Mongolian/character19/rot090 707 | Mongolian/character19/rot180 708 | Mongolian/character19/rot270 709 | Mongolian/character20/rot000 710 | Mongolian/character20/rot090 711 | Mongolian/character20/rot180 712 | Mongolian/character20/rot270 713 | Mongolian/character21/rot000 714 | Mongolian/character21/rot090 715 | Mongolian/character21/rot180 716 | Mongolian/character21/rot270 717 | Mongolian/character22/rot000 718 | Mongolian/character22/rot090 719 | Mongolian/character22/rot180 720 | Mongolian/character22/rot270 721 | Mongolian/character23/rot000 722 | Mongolian/character23/rot090 723 | Mongolian/character23/rot180 724 | Mongolian/character23/rot270 725 | Mongolian/character24/rot000 726 | Mongolian/character24/rot090 727 | Mongolian/character24/rot180 728 | Mongolian/character24/rot270 729 | Mongolian/character25/rot000 730 | Mongolian/character25/rot090 731 | Mongolian/character25/rot180 732 | Mongolian/character25/rot270 733 | Mongolian/character26/rot000 734 | Mongolian/character26/rot090 735 | Mongolian/character26/rot180 736 | Mongolian/character26/rot270 737 | Mongolian/character27/rot000 738 | Mongolian/character27/rot090 739 | Mongolian/character27/rot180 740 | Mongolian/character27/rot270 741 | Mongolian/character28/rot000 742 | Mongolian/character28/rot090 743 | Mongolian/character28/rot180 744 | Mongolian/character28/rot270 745 | Mongolian/character29/rot000 746 | Mongolian/character29/rot090 747 | Mongolian/character29/rot180 748 | Mongolian/character29/rot270 749 | Mongolian/character30/rot000 750 | Mongolian/character30/rot090 751 | Mongolian/character30/rot180 752 | Mongolian/character30/rot270 753 | Old_Church_Slavonic_(Cyrillic)/character01/rot000 754 | Old_Church_Slavonic_(Cyrillic)/character01/rot090 755 | Old_Church_Slavonic_(Cyrillic)/character01/rot180 756 | Old_Church_Slavonic_(Cyrillic)/character01/rot270 757 | Old_Church_Slavonic_(Cyrillic)/character02/rot000 758 | Old_Church_Slavonic_(Cyrillic)/character02/rot090 759 | Old_Church_Slavonic_(Cyrillic)/character02/rot180 760 | Old_Church_Slavonic_(Cyrillic)/character02/rot270 761 | Old_Church_Slavonic_(Cyrillic)/character03/rot000 762 | Old_Church_Slavonic_(Cyrillic)/character03/rot090 763 | Old_Church_Slavonic_(Cyrillic)/character03/rot180 764 | Old_Church_Slavonic_(Cyrillic)/character03/rot270 765 | Old_Church_Slavonic_(Cyrillic)/character04/rot000 766 | Old_Church_Slavonic_(Cyrillic)/character04/rot090 767 | Old_Church_Slavonic_(Cyrillic)/character04/rot180 768 | Old_Church_Slavonic_(Cyrillic)/character04/rot270 769 | Old_Church_Slavonic_(Cyrillic)/character05/rot000 770 | Old_Church_Slavonic_(Cyrillic)/character05/rot090 771 | Old_Church_Slavonic_(Cyrillic)/character05/rot180 772 | Old_Church_Slavonic_(Cyrillic)/character05/rot270 773 | Old_Church_Slavonic_(Cyrillic)/character06/rot000 774 | Old_Church_Slavonic_(Cyrillic)/character06/rot090 775 | Old_Church_Slavonic_(Cyrillic)/character06/rot180 776 | Old_Church_Slavonic_(Cyrillic)/character06/rot270 777 | Old_Church_Slavonic_(Cyrillic)/character07/rot000 778 | Old_Church_Slavonic_(Cyrillic)/character07/rot090 779 | Old_Church_Slavonic_(Cyrillic)/character07/rot180 780 | Old_Church_Slavonic_(Cyrillic)/character07/rot270 781 | Old_Church_Slavonic_(Cyrillic)/character08/rot000 782 | Old_Church_Slavonic_(Cyrillic)/character08/rot090 783 | Old_Church_Slavonic_(Cyrillic)/character08/rot180 784 | Old_Church_Slavonic_(Cyrillic)/character08/rot270 785 | Old_Church_Slavonic_(Cyrillic)/character09/rot000 786 | Old_Church_Slavonic_(Cyrillic)/character09/rot090 787 | Old_Church_Slavonic_(Cyrillic)/character09/rot180 788 | Old_Church_Slavonic_(Cyrillic)/character09/rot270 789 | Old_Church_Slavonic_(Cyrillic)/character10/rot000 790 | Old_Church_Slavonic_(Cyrillic)/character10/rot090 791 | Old_Church_Slavonic_(Cyrillic)/character10/rot180 792 | Old_Church_Slavonic_(Cyrillic)/character10/rot270 793 | Old_Church_Slavonic_(Cyrillic)/character11/rot000 794 | Old_Church_Slavonic_(Cyrillic)/character11/rot090 795 | Old_Church_Slavonic_(Cyrillic)/character11/rot180 796 | Old_Church_Slavonic_(Cyrillic)/character11/rot270 797 | Old_Church_Slavonic_(Cyrillic)/character12/rot000 798 | Old_Church_Slavonic_(Cyrillic)/character12/rot090 799 | Old_Church_Slavonic_(Cyrillic)/character12/rot180 800 | Old_Church_Slavonic_(Cyrillic)/character12/rot270 801 | Old_Church_Slavonic_(Cyrillic)/character13/rot000 802 | Old_Church_Slavonic_(Cyrillic)/character13/rot090 803 | Old_Church_Slavonic_(Cyrillic)/character13/rot180 804 | Old_Church_Slavonic_(Cyrillic)/character13/rot270 805 | Old_Church_Slavonic_(Cyrillic)/character14/rot000 806 | Old_Church_Slavonic_(Cyrillic)/character14/rot090 807 | Old_Church_Slavonic_(Cyrillic)/character14/rot180 808 | Old_Church_Slavonic_(Cyrillic)/character14/rot270 809 | Old_Church_Slavonic_(Cyrillic)/character15/rot000 810 | Old_Church_Slavonic_(Cyrillic)/character15/rot090 811 | Old_Church_Slavonic_(Cyrillic)/character15/rot180 812 | Old_Church_Slavonic_(Cyrillic)/character15/rot270 813 | Old_Church_Slavonic_(Cyrillic)/character16/rot000 814 | Old_Church_Slavonic_(Cyrillic)/character16/rot090 815 | Old_Church_Slavonic_(Cyrillic)/character16/rot180 816 | Old_Church_Slavonic_(Cyrillic)/character16/rot270 817 | Old_Church_Slavonic_(Cyrillic)/character17/rot000 818 | Old_Church_Slavonic_(Cyrillic)/character17/rot090 819 | Old_Church_Slavonic_(Cyrillic)/character17/rot180 820 | Old_Church_Slavonic_(Cyrillic)/character17/rot270 821 | Old_Church_Slavonic_(Cyrillic)/character18/rot000 822 | Old_Church_Slavonic_(Cyrillic)/character18/rot090 823 | Old_Church_Slavonic_(Cyrillic)/character18/rot180 824 | Old_Church_Slavonic_(Cyrillic)/character18/rot270 825 | Old_Church_Slavonic_(Cyrillic)/character19/rot000 826 | Old_Church_Slavonic_(Cyrillic)/character19/rot090 827 | Old_Church_Slavonic_(Cyrillic)/character19/rot180 828 | Old_Church_Slavonic_(Cyrillic)/character19/rot270 829 | Old_Church_Slavonic_(Cyrillic)/character20/rot000 830 | Old_Church_Slavonic_(Cyrillic)/character20/rot090 831 | Old_Church_Slavonic_(Cyrillic)/character20/rot180 832 | Old_Church_Slavonic_(Cyrillic)/character20/rot270 833 | Old_Church_Slavonic_(Cyrillic)/character21/rot000 834 | Old_Church_Slavonic_(Cyrillic)/character21/rot090 835 | Old_Church_Slavonic_(Cyrillic)/character21/rot180 836 | Old_Church_Slavonic_(Cyrillic)/character21/rot270 837 | Old_Church_Slavonic_(Cyrillic)/character22/rot000 838 | Old_Church_Slavonic_(Cyrillic)/character22/rot090 839 | Old_Church_Slavonic_(Cyrillic)/character22/rot180 840 | Old_Church_Slavonic_(Cyrillic)/character22/rot270 841 | Old_Church_Slavonic_(Cyrillic)/character23/rot000 842 | Old_Church_Slavonic_(Cyrillic)/character23/rot090 843 | Old_Church_Slavonic_(Cyrillic)/character23/rot180 844 | Old_Church_Slavonic_(Cyrillic)/character23/rot270 845 | Old_Church_Slavonic_(Cyrillic)/character24/rot000 846 | Old_Church_Slavonic_(Cyrillic)/character24/rot090 847 | Old_Church_Slavonic_(Cyrillic)/character24/rot180 848 | Old_Church_Slavonic_(Cyrillic)/character24/rot270 849 | Old_Church_Slavonic_(Cyrillic)/character25/rot000 850 | Old_Church_Slavonic_(Cyrillic)/character25/rot090 851 | Old_Church_Slavonic_(Cyrillic)/character25/rot180 852 | Old_Church_Slavonic_(Cyrillic)/character25/rot270 853 | Old_Church_Slavonic_(Cyrillic)/character26/rot000 854 | Old_Church_Slavonic_(Cyrillic)/character26/rot090 855 | Old_Church_Slavonic_(Cyrillic)/character26/rot180 856 | Old_Church_Slavonic_(Cyrillic)/character26/rot270 857 | Old_Church_Slavonic_(Cyrillic)/character27/rot000 858 | Old_Church_Slavonic_(Cyrillic)/character27/rot090 859 | Old_Church_Slavonic_(Cyrillic)/character27/rot180 860 | Old_Church_Slavonic_(Cyrillic)/character27/rot270 861 | Old_Church_Slavonic_(Cyrillic)/character28/rot000 862 | Old_Church_Slavonic_(Cyrillic)/character28/rot090 863 | Old_Church_Slavonic_(Cyrillic)/character28/rot180 864 | Old_Church_Slavonic_(Cyrillic)/character28/rot270 865 | Old_Church_Slavonic_(Cyrillic)/character29/rot000 866 | Old_Church_Slavonic_(Cyrillic)/character29/rot090 867 | Old_Church_Slavonic_(Cyrillic)/character29/rot180 868 | Old_Church_Slavonic_(Cyrillic)/character29/rot270 869 | Old_Church_Slavonic_(Cyrillic)/character30/rot000 870 | Old_Church_Slavonic_(Cyrillic)/character30/rot090 871 | Old_Church_Slavonic_(Cyrillic)/character30/rot180 872 | Old_Church_Slavonic_(Cyrillic)/character30/rot270 873 | Old_Church_Slavonic_(Cyrillic)/character31/rot000 874 | Old_Church_Slavonic_(Cyrillic)/character31/rot090 875 | Old_Church_Slavonic_(Cyrillic)/character31/rot180 876 | Old_Church_Slavonic_(Cyrillic)/character31/rot270 877 | Old_Church_Slavonic_(Cyrillic)/character32/rot000 878 | Old_Church_Slavonic_(Cyrillic)/character32/rot090 879 | Old_Church_Slavonic_(Cyrillic)/character32/rot180 880 | Old_Church_Slavonic_(Cyrillic)/character32/rot270 881 | Old_Church_Slavonic_(Cyrillic)/character33/rot000 882 | Old_Church_Slavonic_(Cyrillic)/character33/rot090 883 | Old_Church_Slavonic_(Cyrillic)/character33/rot180 884 | Old_Church_Slavonic_(Cyrillic)/character33/rot270 885 | Old_Church_Slavonic_(Cyrillic)/character34/rot000 886 | Old_Church_Slavonic_(Cyrillic)/character34/rot090 887 | Old_Church_Slavonic_(Cyrillic)/character34/rot180 888 | Old_Church_Slavonic_(Cyrillic)/character34/rot270 889 | Old_Church_Slavonic_(Cyrillic)/character35/rot000 890 | Old_Church_Slavonic_(Cyrillic)/character35/rot090 891 | Old_Church_Slavonic_(Cyrillic)/character35/rot180 892 | Old_Church_Slavonic_(Cyrillic)/character35/rot270 893 | Old_Church_Slavonic_(Cyrillic)/character36/rot000 894 | Old_Church_Slavonic_(Cyrillic)/character36/rot090 895 | Old_Church_Slavonic_(Cyrillic)/character36/rot180 896 | Old_Church_Slavonic_(Cyrillic)/character36/rot270 897 | Old_Church_Slavonic_(Cyrillic)/character37/rot000 898 | Old_Church_Slavonic_(Cyrillic)/character37/rot090 899 | Old_Church_Slavonic_(Cyrillic)/character37/rot180 900 | Old_Church_Slavonic_(Cyrillic)/character37/rot270 901 | Old_Church_Slavonic_(Cyrillic)/character38/rot000 902 | Old_Church_Slavonic_(Cyrillic)/character38/rot090 903 | Old_Church_Slavonic_(Cyrillic)/character38/rot180 904 | Old_Church_Slavonic_(Cyrillic)/character38/rot270 905 | Old_Church_Slavonic_(Cyrillic)/character39/rot000 906 | Old_Church_Slavonic_(Cyrillic)/character39/rot090 907 | Old_Church_Slavonic_(Cyrillic)/character39/rot180 908 | Old_Church_Slavonic_(Cyrillic)/character39/rot270 909 | Old_Church_Slavonic_(Cyrillic)/character40/rot000 910 | Old_Church_Slavonic_(Cyrillic)/character40/rot090 911 | Old_Church_Slavonic_(Cyrillic)/character40/rot180 912 | Old_Church_Slavonic_(Cyrillic)/character40/rot270 913 | Old_Church_Slavonic_(Cyrillic)/character41/rot000 914 | Old_Church_Slavonic_(Cyrillic)/character41/rot090 915 | Old_Church_Slavonic_(Cyrillic)/character41/rot180 916 | Old_Church_Slavonic_(Cyrillic)/character41/rot270 917 | Old_Church_Slavonic_(Cyrillic)/character42/rot000 918 | Old_Church_Slavonic_(Cyrillic)/character42/rot090 919 | Old_Church_Slavonic_(Cyrillic)/character42/rot180 920 | Old_Church_Slavonic_(Cyrillic)/character42/rot270 921 | Old_Church_Slavonic_(Cyrillic)/character43/rot000 922 | Old_Church_Slavonic_(Cyrillic)/character43/rot090 923 | Old_Church_Slavonic_(Cyrillic)/character43/rot180 924 | Old_Church_Slavonic_(Cyrillic)/character43/rot270 925 | Old_Church_Slavonic_(Cyrillic)/character44/rot000 926 | Old_Church_Slavonic_(Cyrillic)/character44/rot090 927 | Old_Church_Slavonic_(Cyrillic)/character44/rot180 928 | Old_Church_Slavonic_(Cyrillic)/character44/rot270 929 | Old_Church_Slavonic_(Cyrillic)/character45/rot000 930 | Old_Church_Slavonic_(Cyrillic)/character45/rot090 931 | Old_Church_Slavonic_(Cyrillic)/character45/rot180 932 | Old_Church_Slavonic_(Cyrillic)/character45/rot270 933 | Oriya/character01/rot000 934 | Oriya/character01/rot090 935 | Oriya/character01/rot180 936 | Oriya/character01/rot270 937 | Oriya/character02/rot000 938 | Oriya/character02/rot090 939 | Oriya/character02/rot180 940 | Oriya/character02/rot270 941 | Oriya/character03/rot000 942 | Oriya/character03/rot090 943 | Oriya/character03/rot180 944 | Oriya/character03/rot270 945 | Oriya/character04/rot000 946 | Oriya/character04/rot090 947 | Oriya/character04/rot180 948 | Oriya/character04/rot270 949 | Oriya/character05/rot000 950 | Oriya/character05/rot090 951 | Oriya/character05/rot180 952 | Oriya/character05/rot270 953 | Oriya/character06/rot000 954 | Oriya/character06/rot090 955 | Oriya/character06/rot180 956 | Oriya/character06/rot270 957 | Oriya/character07/rot000 958 | Oriya/character07/rot090 959 | Oriya/character07/rot180 960 | Oriya/character07/rot270 961 | Oriya/character08/rot000 962 | Oriya/character08/rot090 963 | Oriya/character08/rot180 964 | Oriya/character08/rot270 965 | Oriya/character09/rot000 966 | Oriya/character09/rot090 967 | Oriya/character09/rot180 968 | Oriya/character09/rot270 969 | Oriya/character10/rot000 970 | Oriya/character10/rot090 971 | Oriya/character10/rot180 972 | Oriya/character10/rot270 973 | Oriya/character11/rot000 974 | Oriya/character11/rot090 975 | Oriya/character11/rot180 976 | Oriya/character11/rot270 977 | Oriya/character12/rot000 978 | Oriya/character12/rot090 979 | Oriya/character12/rot180 980 | Oriya/character12/rot270 981 | Oriya/character13/rot000 982 | Oriya/character13/rot090 983 | Oriya/character13/rot180 984 | Oriya/character13/rot270 985 | Oriya/character14/rot000 986 | Oriya/character14/rot090 987 | Oriya/character14/rot180 988 | Oriya/character14/rot270 989 | Oriya/character15/rot000 990 | Oriya/character15/rot090 991 | Oriya/character15/rot180 992 | Oriya/character15/rot270 993 | Oriya/character16/rot000 994 | Oriya/character16/rot090 995 | Oriya/character16/rot180 996 | Oriya/character16/rot270 997 | Oriya/character17/rot000 998 | Oriya/character17/rot090 999 | Oriya/character17/rot180 1000 | Oriya/character17/rot270 1001 | Oriya/character18/rot000 1002 | Oriya/character18/rot090 1003 | Oriya/character18/rot180 1004 | Oriya/character18/rot270 1005 | Oriya/character19/rot000 1006 | Oriya/character19/rot090 1007 | Oriya/character19/rot180 1008 | Oriya/character19/rot270 1009 | Oriya/character20/rot000 1010 | Oriya/character20/rot090 1011 | Oriya/character20/rot180 1012 | Oriya/character20/rot270 1013 | Oriya/character21/rot000 1014 | Oriya/character21/rot090 1015 | Oriya/character21/rot180 1016 | Oriya/character21/rot270 1017 | Oriya/character22/rot000 1018 | Oriya/character22/rot090 1019 | Oriya/character22/rot180 1020 | Oriya/character22/rot270 1021 | Oriya/character23/rot000 1022 | Oriya/character23/rot090 1023 | Oriya/character23/rot180 1024 | Oriya/character23/rot270 1025 | Oriya/character24/rot000 1026 | Oriya/character24/rot090 1027 | Oriya/character24/rot180 1028 | Oriya/character24/rot270 1029 | Oriya/character25/rot000 1030 | Oriya/character25/rot090 1031 | Oriya/character25/rot180 1032 | Oriya/character25/rot270 1033 | Oriya/character26/rot000 1034 | Oriya/character26/rot090 1035 | Oriya/character26/rot180 1036 | Oriya/character26/rot270 1037 | Oriya/character27/rot000 1038 | Oriya/character27/rot090 1039 | Oriya/character27/rot180 1040 | Oriya/character27/rot270 1041 | Oriya/character28/rot000 1042 | Oriya/character28/rot090 1043 | Oriya/character28/rot180 1044 | Oriya/character28/rot270 1045 | Oriya/character29/rot000 1046 | Oriya/character29/rot090 1047 | Oriya/character29/rot180 1048 | Oriya/character29/rot270 1049 | Oriya/character30/rot000 1050 | Oriya/character30/rot090 1051 | Oriya/character30/rot180 1052 | Oriya/character30/rot270 1053 | Oriya/character31/rot000 1054 | Oriya/character31/rot090 1055 | Oriya/character31/rot180 1056 | Oriya/character31/rot270 1057 | Oriya/character32/rot000 1058 | Oriya/character32/rot090 1059 | Oriya/character32/rot180 1060 | Oriya/character32/rot270 1061 | Oriya/character33/rot000 1062 | Oriya/character33/rot090 1063 | Oriya/character33/rot180 1064 | Oriya/character33/rot270 1065 | Oriya/character34/rot000 1066 | Oriya/character34/rot090 1067 | Oriya/character34/rot180 1068 | Oriya/character34/rot270 1069 | Oriya/character35/rot000 1070 | Oriya/character35/rot090 1071 | Oriya/character35/rot180 1072 | Oriya/character35/rot270 1073 | Oriya/character36/rot000 1074 | Oriya/character36/rot090 1075 | Oriya/character36/rot180 1076 | Oriya/character36/rot270 1077 | Oriya/character37/rot000 1078 | Oriya/character37/rot090 1079 | Oriya/character37/rot180 1080 | Oriya/character37/rot270 1081 | Oriya/character38/rot000 1082 | Oriya/character38/rot090 1083 | Oriya/character38/rot180 1084 | Oriya/character38/rot270 1085 | Oriya/character39/rot000 1086 | Oriya/character39/rot090 1087 | Oriya/character39/rot180 1088 | Oriya/character39/rot270 1089 | Oriya/character40/rot000 1090 | Oriya/character40/rot090 1091 | Oriya/character40/rot180 1092 | Oriya/character40/rot270 1093 | Oriya/character41/rot000 1094 | Oriya/character41/rot090 1095 | Oriya/character41/rot180 1096 | Oriya/character41/rot270 1097 | Oriya/character42/rot000 1098 | Oriya/character42/rot090 1099 | Oriya/character42/rot180 1100 | Oriya/character42/rot270 1101 | Oriya/character43/rot000 1102 | Oriya/character43/rot090 1103 | Oriya/character43/rot180 1104 | Oriya/character43/rot270 1105 | Oriya/character44/rot000 1106 | Oriya/character44/rot090 1107 | Oriya/character44/rot180 1108 | Oriya/character44/rot270 1109 | Oriya/character45/rot000 1110 | Oriya/character45/rot090 1111 | Oriya/character45/rot180 1112 | Oriya/character45/rot270 1113 | Oriya/character46/rot000 1114 | Oriya/character46/rot090 1115 | Oriya/character46/rot180 1116 | Oriya/character46/rot270 1117 | Syriac_(Serto)/character01/rot000 1118 | Syriac_(Serto)/character01/rot090 1119 | Syriac_(Serto)/character01/rot180 1120 | Syriac_(Serto)/character01/rot270 1121 | Syriac_(Serto)/character02/rot000 1122 | Syriac_(Serto)/character02/rot090 1123 | Syriac_(Serto)/character02/rot180 1124 | Syriac_(Serto)/character02/rot270 1125 | Syriac_(Serto)/character03/rot000 1126 | Syriac_(Serto)/character03/rot090 1127 | Syriac_(Serto)/character03/rot180 1128 | Syriac_(Serto)/character03/rot270 1129 | Syriac_(Serto)/character04/rot000 1130 | Syriac_(Serto)/character04/rot090 1131 | Syriac_(Serto)/character04/rot180 1132 | Syriac_(Serto)/character04/rot270 1133 | Syriac_(Serto)/character05/rot000 1134 | Syriac_(Serto)/character05/rot090 1135 | Syriac_(Serto)/character05/rot180 1136 | Syriac_(Serto)/character05/rot270 1137 | Syriac_(Serto)/character06/rot000 1138 | Syriac_(Serto)/character06/rot090 1139 | Syriac_(Serto)/character06/rot180 1140 | Syriac_(Serto)/character06/rot270 1141 | Syriac_(Serto)/character07/rot000 1142 | Syriac_(Serto)/character07/rot090 1143 | Syriac_(Serto)/character07/rot180 1144 | Syriac_(Serto)/character07/rot270 1145 | Syriac_(Serto)/character08/rot000 1146 | Syriac_(Serto)/character08/rot090 1147 | Syriac_(Serto)/character08/rot180 1148 | Syriac_(Serto)/character08/rot270 1149 | Syriac_(Serto)/character09/rot000 1150 | Syriac_(Serto)/character09/rot090 1151 | Syriac_(Serto)/character09/rot180 1152 | Syriac_(Serto)/character09/rot270 1153 | Syriac_(Serto)/character10/rot000 1154 | Syriac_(Serto)/character10/rot090 1155 | Syriac_(Serto)/character10/rot180 1156 | Syriac_(Serto)/character10/rot270 1157 | Syriac_(Serto)/character11/rot000 1158 | Syriac_(Serto)/character11/rot090 1159 | Syriac_(Serto)/character11/rot180 1160 | Syriac_(Serto)/character11/rot270 1161 | Syriac_(Serto)/character12/rot000 1162 | Syriac_(Serto)/character12/rot090 1163 | Syriac_(Serto)/character12/rot180 1164 | Syriac_(Serto)/character12/rot270 1165 | Syriac_(Serto)/character13/rot000 1166 | Syriac_(Serto)/character13/rot090 1167 | Syriac_(Serto)/character13/rot180 1168 | Syriac_(Serto)/character13/rot270 1169 | Syriac_(Serto)/character14/rot000 1170 | Syriac_(Serto)/character14/rot090 1171 | Syriac_(Serto)/character14/rot180 1172 | Syriac_(Serto)/character14/rot270 1173 | Syriac_(Serto)/character15/rot000 1174 | Syriac_(Serto)/character15/rot090 1175 | Syriac_(Serto)/character15/rot180 1176 | Syriac_(Serto)/character15/rot270 1177 | Syriac_(Serto)/character16/rot000 1178 | Syriac_(Serto)/character16/rot090 1179 | Syriac_(Serto)/character16/rot180 1180 | Syriac_(Serto)/character16/rot270 1181 | Syriac_(Serto)/character17/rot000 1182 | Syriac_(Serto)/character17/rot090 1183 | Syriac_(Serto)/character17/rot180 1184 | Syriac_(Serto)/character17/rot270 1185 | Syriac_(Serto)/character18/rot000 1186 | Syriac_(Serto)/character18/rot090 1187 | Syriac_(Serto)/character18/rot180 1188 | Syriac_(Serto)/character18/rot270 1189 | Syriac_(Serto)/character19/rot000 1190 | Syriac_(Serto)/character19/rot090 1191 | Syriac_(Serto)/character19/rot180 1192 | Syriac_(Serto)/character19/rot270 1193 | Syriac_(Serto)/character20/rot000 1194 | Syriac_(Serto)/character20/rot090 1195 | Syriac_(Serto)/character20/rot180 1196 | Syriac_(Serto)/character20/rot270 1197 | Syriac_(Serto)/character21/rot000 1198 | Syriac_(Serto)/character21/rot090 1199 | Syriac_(Serto)/character21/rot180 1200 | Syriac_(Serto)/character21/rot270 1201 | Syriac_(Serto)/character22/rot000 1202 | Syriac_(Serto)/character22/rot090 1203 | Syriac_(Serto)/character22/rot180 1204 | Syriac_(Serto)/character22/rot270 1205 | Syriac_(Serto)/character23/rot000 1206 | Syriac_(Serto)/character23/rot090 1207 | Syriac_(Serto)/character23/rot180 1208 | Syriac_(Serto)/character23/rot270 1209 | Sylheti/character01/rot000 1210 | Sylheti/character01/rot090 1211 | Sylheti/character01/rot180 1212 | Sylheti/character01/rot270 1213 | Sylheti/character02/rot000 1214 | Sylheti/character02/rot090 1215 | Sylheti/character02/rot180 1216 | Sylheti/character02/rot270 1217 | Sylheti/character03/rot000 1218 | Sylheti/character03/rot090 1219 | Sylheti/character03/rot180 1220 | Sylheti/character03/rot270 1221 | Sylheti/character04/rot000 1222 | Sylheti/character04/rot090 1223 | Sylheti/character04/rot180 1224 | Sylheti/character04/rot270 1225 | Sylheti/character05/rot000 1226 | Sylheti/character05/rot090 1227 | Sylheti/character05/rot180 1228 | Sylheti/character05/rot270 1229 | Sylheti/character06/rot000 1230 | Sylheti/character06/rot090 1231 | Sylheti/character06/rot180 1232 | Sylheti/character06/rot270 1233 | Sylheti/character07/rot000 1234 | Sylheti/character07/rot090 1235 | Sylheti/character07/rot180 1236 | Sylheti/character07/rot270 1237 | Sylheti/character08/rot000 1238 | Sylheti/character08/rot090 1239 | Sylheti/character08/rot180 1240 | Sylheti/character08/rot270 1241 | Sylheti/character09/rot000 1242 | Sylheti/character09/rot090 1243 | Sylheti/character09/rot180 1244 | Sylheti/character09/rot270 1245 | Sylheti/character10/rot000 1246 | Sylheti/character10/rot090 1247 | Sylheti/character10/rot180 1248 | Sylheti/character10/rot270 1249 | Sylheti/character11/rot000 1250 | Sylheti/character11/rot090 1251 | Sylheti/character11/rot180 1252 | Sylheti/character11/rot270 1253 | Sylheti/character12/rot000 1254 | Sylheti/character12/rot090 1255 | Sylheti/character12/rot180 1256 | Sylheti/character12/rot270 1257 | Sylheti/character13/rot000 1258 | Sylheti/character13/rot090 1259 | Sylheti/character13/rot180 1260 | Sylheti/character13/rot270 1261 | Sylheti/character14/rot000 1262 | Sylheti/character14/rot090 1263 | Sylheti/character14/rot180 1264 | Sylheti/character14/rot270 1265 | Sylheti/character15/rot000 1266 | Sylheti/character15/rot090 1267 | Sylheti/character15/rot180 1268 | Sylheti/character15/rot270 1269 | Sylheti/character16/rot000 1270 | Sylheti/character16/rot090 1271 | Sylheti/character16/rot180 1272 | Sylheti/character16/rot270 1273 | Sylheti/character17/rot000 1274 | Sylheti/character17/rot090 1275 | Sylheti/character17/rot180 1276 | Sylheti/character17/rot270 1277 | Sylheti/character18/rot000 1278 | Sylheti/character18/rot090 1279 | Sylheti/character18/rot180 1280 | Sylheti/character18/rot270 1281 | Sylheti/character19/rot000 1282 | Sylheti/character19/rot090 1283 | Sylheti/character19/rot180 1284 | Sylheti/character19/rot270 1285 | Sylheti/character20/rot000 1286 | Sylheti/character20/rot090 1287 | Sylheti/character20/rot180 1288 | Sylheti/character20/rot270 1289 | Sylheti/character21/rot000 1290 | Sylheti/character21/rot090 1291 | Sylheti/character21/rot180 1292 | Sylheti/character21/rot270 1293 | Sylheti/character22/rot000 1294 | Sylheti/character22/rot090 1295 | Sylheti/character22/rot180 1296 | Sylheti/character22/rot270 1297 | Sylheti/character23/rot000 1298 | Sylheti/character23/rot090 1299 | Sylheti/character23/rot180 1300 | Sylheti/character23/rot270 1301 | Sylheti/character24/rot000 1302 | Sylheti/character24/rot090 1303 | Sylheti/character24/rot180 1304 | Sylheti/character24/rot270 1305 | Sylheti/character25/rot000 1306 | Sylheti/character25/rot090 1307 | Sylheti/character25/rot180 1308 | Sylheti/character25/rot270 1309 | Sylheti/character26/rot000 1310 | Sylheti/character26/rot090 1311 | Sylheti/character26/rot180 1312 | Sylheti/character26/rot270 1313 | Sylheti/character27/rot000 1314 | Sylheti/character27/rot090 1315 | Sylheti/character27/rot180 1316 | Sylheti/character27/rot270 1317 | Sylheti/character28/rot000 1318 | Sylheti/character28/rot090 1319 | Sylheti/character28/rot180 1320 | Sylheti/character28/rot270 1321 | Tengwar/character01/rot000 1322 | Tengwar/character01/rot090 1323 | Tengwar/character01/rot180 1324 | Tengwar/character01/rot270 1325 | Tengwar/character02/rot000 1326 | Tengwar/character02/rot090 1327 | Tengwar/character02/rot180 1328 | Tengwar/character02/rot270 1329 | Tengwar/character03/rot000 1330 | Tengwar/character03/rot090 1331 | Tengwar/character03/rot180 1332 | Tengwar/character03/rot270 1333 | Tengwar/character04/rot000 1334 | Tengwar/character04/rot090 1335 | Tengwar/character04/rot180 1336 | Tengwar/character04/rot270 1337 | Tengwar/character05/rot000 1338 | Tengwar/character05/rot090 1339 | Tengwar/character05/rot180 1340 | Tengwar/character05/rot270 1341 | Tengwar/character06/rot000 1342 | Tengwar/character06/rot090 1343 | Tengwar/character06/rot180 1344 | Tengwar/character06/rot270 1345 | Tengwar/character07/rot000 1346 | Tengwar/character07/rot090 1347 | Tengwar/character07/rot180 1348 | Tengwar/character07/rot270 1349 | Tengwar/character08/rot000 1350 | Tengwar/character08/rot090 1351 | Tengwar/character08/rot180 1352 | Tengwar/character08/rot270 1353 | Tengwar/character09/rot000 1354 | Tengwar/character09/rot090 1355 | Tengwar/character09/rot180 1356 | Tengwar/character09/rot270 1357 | Tengwar/character10/rot000 1358 | Tengwar/character10/rot090 1359 | Tengwar/character10/rot180 1360 | Tengwar/character10/rot270 1361 | Tengwar/character11/rot000 1362 | Tengwar/character11/rot090 1363 | Tengwar/character11/rot180 1364 | Tengwar/character11/rot270 1365 | Tengwar/character12/rot000 1366 | Tengwar/character12/rot090 1367 | Tengwar/character12/rot180 1368 | Tengwar/character12/rot270 1369 | Tengwar/character13/rot000 1370 | Tengwar/character13/rot090 1371 | Tengwar/character13/rot180 1372 | Tengwar/character13/rot270 1373 | Tengwar/character14/rot000 1374 | Tengwar/character14/rot090 1375 | Tengwar/character14/rot180 1376 | Tengwar/character14/rot270 1377 | Tengwar/character15/rot000 1378 | Tengwar/character15/rot090 1379 | Tengwar/character15/rot180 1380 | Tengwar/character15/rot270 1381 | Tengwar/character16/rot000 1382 | Tengwar/character16/rot090 1383 | Tengwar/character16/rot180 1384 | Tengwar/character16/rot270 1385 | Tengwar/character17/rot000 1386 | Tengwar/character17/rot090 1387 | Tengwar/character17/rot180 1388 | Tengwar/character17/rot270 1389 | Tengwar/character18/rot000 1390 | Tengwar/character18/rot090 1391 | Tengwar/character18/rot180 1392 | Tengwar/character18/rot270 1393 | Tengwar/character19/rot000 1394 | Tengwar/character19/rot090 1395 | Tengwar/character19/rot180 1396 | Tengwar/character19/rot270 1397 | Tengwar/character20/rot000 1398 | Tengwar/character20/rot090 1399 | Tengwar/character20/rot180 1400 | Tengwar/character20/rot270 1401 | Tengwar/character21/rot000 1402 | Tengwar/character21/rot090 1403 | Tengwar/character21/rot180 1404 | Tengwar/character21/rot270 1405 | Tengwar/character22/rot000 1406 | Tengwar/character22/rot090 1407 | Tengwar/character22/rot180 1408 | Tengwar/character22/rot270 1409 | Tengwar/character23/rot000 1410 | Tengwar/character23/rot090 1411 | Tengwar/character23/rot180 1412 | Tengwar/character23/rot270 1413 | Tengwar/character24/rot000 1414 | Tengwar/character24/rot090 1415 | Tengwar/character24/rot180 1416 | Tengwar/character24/rot270 1417 | Tengwar/character25/rot000 1418 | Tengwar/character25/rot090 1419 | Tengwar/character25/rot180 1420 | Tengwar/character25/rot270 1421 | Tibetan/character01/rot000 1422 | Tibetan/character01/rot090 1423 | Tibetan/character01/rot180 1424 | Tibetan/character01/rot270 1425 | Tibetan/character02/rot000 1426 | Tibetan/character02/rot090 1427 | Tibetan/character02/rot180 1428 | Tibetan/character02/rot270 1429 | Tibetan/character03/rot000 1430 | Tibetan/character03/rot090 1431 | Tibetan/character03/rot180 1432 | Tibetan/character03/rot270 1433 | Tibetan/character04/rot000 1434 | Tibetan/character04/rot090 1435 | Tibetan/character04/rot180 1436 | Tibetan/character04/rot270 1437 | Tibetan/character05/rot000 1438 | Tibetan/character05/rot090 1439 | Tibetan/character05/rot180 1440 | Tibetan/character05/rot270 1441 | Tibetan/character06/rot000 1442 | Tibetan/character06/rot090 1443 | Tibetan/character06/rot180 1444 | Tibetan/character06/rot270 1445 | Tibetan/character07/rot000 1446 | Tibetan/character07/rot090 1447 | Tibetan/character07/rot180 1448 | Tibetan/character07/rot270 1449 | Tibetan/character08/rot000 1450 | Tibetan/character08/rot090 1451 | Tibetan/character08/rot180 1452 | Tibetan/character08/rot270 1453 | Tibetan/character09/rot000 1454 | Tibetan/character09/rot090 1455 | Tibetan/character09/rot180 1456 | Tibetan/character09/rot270 1457 | Tibetan/character10/rot000 1458 | Tibetan/character10/rot090 1459 | Tibetan/character10/rot180 1460 | Tibetan/character10/rot270 1461 | Tibetan/character11/rot000 1462 | Tibetan/character11/rot090 1463 | Tibetan/character11/rot180 1464 | Tibetan/character11/rot270 1465 | Tibetan/character12/rot000 1466 | Tibetan/character12/rot090 1467 | Tibetan/character12/rot180 1468 | Tibetan/character12/rot270 1469 | Tibetan/character13/rot000 1470 | Tibetan/character13/rot090 1471 | Tibetan/character13/rot180 1472 | Tibetan/character13/rot270 1473 | Tibetan/character14/rot000 1474 | Tibetan/character14/rot090 1475 | Tibetan/character14/rot180 1476 | Tibetan/character14/rot270 1477 | Tibetan/character15/rot000 1478 | Tibetan/character15/rot090 1479 | Tibetan/character15/rot180 1480 | Tibetan/character15/rot270 1481 | Tibetan/character16/rot000 1482 | Tibetan/character16/rot090 1483 | Tibetan/character16/rot180 1484 | Tibetan/character16/rot270 1485 | Tibetan/character17/rot000 1486 | Tibetan/character17/rot090 1487 | Tibetan/character17/rot180 1488 | Tibetan/character17/rot270 1489 | Tibetan/character18/rot000 1490 | Tibetan/character18/rot090 1491 | Tibetan/character18/rot180 1492 | Tibetan/character18/rot270 1493 | Tibetan/character19/rot000 1494 | Tibetan/character19/rot090 1495 | Tibetan/character19/rot180 1496 | Tibetan/character19/rot270 1497 | Tibetan/character20/rot000 1498 | Tibetan/character20/rot090 1499 | Tibetan/character20/rot180 1500 | Tibetan/character20/rot270 1501 | Tibetan/character21/rot000 1502 | Tibetan/character21/rot090 1503 | Tibetan/character21/rot180 1504 | Tibetan/character21/rot270 1505 | Tibetan/character22/rot000 1506 | Tibetan/character22/rot090 1507 | Tibetan/character22/rot180 1508 | Tibetan/character22/rot270 1509 | Tibetan/character23/rot000 1510 | Tibetan/character23/rot090 1511 | Tibetan/character23/rot180 1512 | Tibetan/character23/rot270 1513 | Tibetan/character24/rot000 1514 | Tibetan/character24/rot090 1515 | Tibetan/character24/rot180 1516 | Tibetan/character24/rot270 1517 | Tibetan/character25/rot000 1518 | Tibetan/character25/rot090 1519 | Tibetan/character25/rot180 1520 | Tibetan/character25/rot270 1521 | Tibetan/character26/rot000 1522 | Tibetan/character26/rot090 1523 | Tibetan/character26/rot180 1524 | Tibetan/character26/rot270 1525 | Tibetan/character27/rot000 1526 | Tibetan/character27/rot090 1527 | Tibetan/character27/rot180 1528 | Tibetan/character27/rot270 1529 | Tibetan/character28/rot000 1530 | Tibetan/character28/rot090 1531 | Tibetan/character28/rot180 1532 | Tibetan/character28/rot270 1533 | Tibetan/character29/rot000 1534 | Tibetan/character29/rot090 1535 | Tibetan/character29/rot180 1536 | Tibetan/character29/rot270 1537 | Tibetan/character30/rot000 1538 | Tibetan/character30/rot090 1539 | Tibetan/character30/rot180 1540 | Tibetan/character30/rot270 1541 | Tibetan/character31/rot000 1542 | Tibetan/character31/rot090 1543 | Tibetan/character31/rot180 1544 | Tibetan/character31/rot270 1545 | Tibetan/character32/rot000 1546 | Tibetan/character32/rot090 1547 | Tibetan/character32/rot180 1548 | Tibetan/character32/rot270 1549 | Tibetan/character33/rot000 1550 | Tibetan/character33/rot090 1551 | Tibetan/character33/rot180 1552 | Tibetan/character33/rot270 1553 | Tibetan/character34/rot000 1554 | Tibetan/character34/rot090 1555 | Tibetan/character34/rot180 1556 | Tibetan/character34/rot270 1557 | Tibetan/character35/rot000 1558 | Tibetan/character35/rot090 1559 | Tibetan/character35/rot180 1560 | Tibetan/character35/rot270 1561 | Tibetan/character36/rot000 1562 | Tibetan/character36/rot090 1563 | Tibetan/character36/rot180 1564 | Tibetan/character36/rot270 1565 | Tibetan/character37/rot000 1566 | Tibetan/character37/rot090 1567 | Tibetan/character37/rot180 1568 | Tibetan/character37/rot270 1569 | Tibetan/character38/rot000 1570 | Tibetan/character38/rot090 1571 | Tibetan/character38/rot180 1572 | Tibetan/character38/rot270 1573 | Tibetan/character39/rot000 1574 | Tibetan/character39/rot090 1575 | Tibetan/character39/rot180 1576 | Tibetan/character39/rot270 1577 | Tibetan/character40/rot000 1578 | Tibetan/character40/rot090 1579 | Tibetan/character40/rot180 1580 | Tibetan/character40/rot270 1581 | Tibetan/character41/rot000 1582 | Tibetan/character41/rot090 1583 | Tibetan/character41/rot180 1584 | Tibetan/character41/rot270 1585 | Tibetan/character42/rot000 1586 | Tibetan/character42/rot090 1587 | Tibetan/character42/rot180 1588 | Tibetan/character42/rot270 1589 | ULOG/character01/rot000 1590 | ULOG/character01/rot090 1591 | ULOG/character01/rot180 1592 | ULOG/character01/rot270 1593 | ULOG/character02/rot000 1594 | ULOG/character02/rot090 1595 | ULOG/character02/rot180 1596 | ULOG/character02/rot270 1597 | ULOG/character03/rot000 1598 | ULOG/character03/rot090 1599 | ULOG/character03/rot180 1600 | ULOG/character03/rot270 1601 | ULOG/character04/rot000 1602 | ULOG/character04/rot090 1603 | ULOG/character04/rot180 1604 | ULOG/character04/rot270 1605 | ULOG/character05/rot000 1606 | ULOG/character05/rot090 1607 | ULOG/character05/rot180 1608 | ULOG/character05/rot270 1609 | ULOG/character06/rot000 1610 | ULOG/character06/rot090 1611 | ULOG/character06/rot180 1612 | ULOG/character06/rot270 1613 | ULOG/character07/rot000 1614 | ULOG/character07/rot090 1615 | ULOG/character07/rot180 1616 | ULOG/character07/rot270 1617 | ULOG/character08/rot000 1618 | ULOG/character08/rot090 1619 | ULOG/character08/rot180 1620 | ULOG/character08/rot270 1621 | ULOG/character09/rot000 1622 | ULOG/character09/rot090 1623 | ULOG/character09/rot180 1624 | ULOG/character09/rot270 1625 | ULOG/character10/rot000 1626 | ULOG/character10/rot090 1627 | ULOG/character10/rot180 1628 | ULOG/character10/rot270 1629 | ULOG/character11/rot000 1630 | ULOG/character11/rot090 1631 | ULOG/character11/rot180 1632 | ULOG/character11/rot270 1633 | ULOG/character12/rot000 1634 | ULOG/character12/rot090 1635 | ULOG/character12/rot180 1636 | ULOG/character12/rot270 1637 | ULOG/character13/rot000 1638 | ULOG/character13/rot090 1639 | ULOG/character13/rot180 1640 | ULOG/character13/rot270 1641 | ULOG/character14/rot000 1642 | ULOG/character14/rot090 1643 | ULOG/character14/rot180 1644 | ULOG/character14/rot270 1645 | ULOG/character15/rot000 1646 | ULOG/character15/rot090 1647 | ULOG/character15/rot180 1648 | ULOG/character15/rot270 1649 | ULOG/character16/rot000 1650 | ULOG/character16/rot090 1651 | ULOG/character16/rot180 1652 | ULOG/character16/rot270 1653 | ULOG/character17/rot000 1654 | ULOG/character17/rot090 1655 | ULOG/character17/rot180 1656 | ULOG/character17/rot270 1657 | ULOG/character18/rot000 1658 | ULOG/character18/rot090 1659 | ULOG/character18/rot180 1660 | ULOG/character18/rot270 1661 | ULOG/character19/rot000 1662 | ULOG/character19/rot090 1663 | ULOG/character19/rot180 1664 | ULOG/character19/rot270 1665 | ULOG/character20/rot000 1666 | ULOG/character20/rot090 1667 | ULOG/character20/rot180 1668 | ULOG/character20/rot270 1669 | ULOG/character21/rot000 1670 | ULOG/character21/rot090 1671 | ULOG/character21/rot180 1672 | ULOG/character21/rot270 1673 | ULOG/character22/rot000 1674 | ULOG/character22/rot090 1675 | ULOG/character22/rot180 1676 | ULOG/character22/rot270 1677 | ULOG/character23/rot000 1678 | ULOG/character23/rot090 1679 | ULOG/character23/rot180 1680 | ULOG/character23/rot270 1681 | ULOG/character24/rot000 1682 | ULOG/character24/rot090 1683 | ULOG/character24/rot180 1684 | ULOG/character24/rot270 1685 | ULOG/character25/rot000 1686 | ULOG/character25/rot090 1687 | ULOG/character25/rot180 1688 | ULOG/character25/rot270 1689 | ULOG/character26/rot000 1690 | ULOG/character26/rot090 1691 | ULOG/character26/rot180 1692 | ULOG/character26/rot270 1693 | --------------------------------------------------------------------------------