help@rskworld.in +91 93305 39277
RSK World
  • Home
  • Development
    • Web Development
    • Mobile Apps
    • Software
    • Games
    • Project
  • Technologies
    • Data Science
    • AI Development
    • Cloud Development
    • Blockchain
    • Cyber Security
    • Dev Tools
    • Testing Tools
  • Blog
  • About
  • Contact

Theme Settings

Color Scheme
Display Options
Font Size
100%
Back to Project
RSK World
face-recognition
/
scripts
RSK World
face-recognition
Face Recognition Dataset - Face Recognition + Face Verification + Biometric Authentication + Computer Vision
scripts
  • __pycache__
  • __init__.py1.3 KB
  • advanced_features.py12.8 KB
  • api_server.py7.1 KB
  • data_augmentation.py7.6 KB
  • load_dataset.py5.4 KB
  • preprocess.py5.1 KB
  • recognize_faces.py8.6 KB
  • visualize.py7.8 KB
advanced_features.pycode_examples.jsonvisualize_ner.py__init__.pyevaluate_model.pypreprocess.pydownload_sample_data.pyrecognize_faces.py
scripts/advanced_features.py
Raw Download
Find: Go to:
"""
Advanced Face Recognition Features

This module provides advanced features like face verification, clustering, 
quality assessment, and batch processing.

Project Information:
- Project ID: 22
- Title: Face Recognition Dataset
- Category: Image Data
- Technologies: PNG, JPG, NumPy, OpenCV, Face Recognition

Contact Information:
RSK World
Founder: Molla Samser
Designer & Tester: Rima Khatun
Email: help@rskworld.in
Phone: +91 93305 39277
Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India, 713147
Website: https://rskworld.in/
Year: 2026
"""

import numpy as np
import cv2
import face_recognition
from typing import List, Tuple, Dict, Optional
from sklearn.cluster import DBSCAN
from sklearn.metrics import silhouette_score
import config
from scripts.preprocess import get_face_encoding, detect_faces


class FaceVerifier:
    """
    Face verification system for 1:1 face matching.
    """
    
    def __init__(self, threshold: float = None):
        """
        Initialize face verifier.
        
        Args:
            threshold: Distance threshold for verification (default from config)
        """
        self.threshold = threshold or config.TOLERANCE
    
    def verify(self, encoding1: np.ndarray, encoding2: np.ndarray) -> Dict:
        """
        Verify if two face encodings belong to the same person.
        
        Args:
            encoding1: First face encoding
            encoding2: Second face encoding
            
        Returns:
            Dictionary with verification result and confidence
        """
        distance = np.linalg.norm(encoding1 - encoding2)
        is_match = distance <= self.threshold
        confidence = max(0, 1 - (distance / self.threshold)) if is_match else 0
        
        return {
            'is_match': is_match,
            'distance': float(distance),
            'confidence': float(confidence),
            'threshold': self.threshold
        }
    
    def verify_images(self, image1_path: str, image2_path: str) -> Dict:
        """
        Verify if two images contain the same person.
        
        Args:
            image1_path: Path to first image
            image2_path: Path to second image
            
        Returns:
            Verification result
        """
        img1 = cv2.imread(image1_path)
        img2 = cv2.imread(image2_path)
        
        if img1 is None or img2 is None:
            return {'error': 'Could not load one or both images'}
        
        rgb1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
        rgb2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
        
        encoding1 = get_face_encoding(rgb1)
        encoding2 = get_face_encoding(rgb2)
        
        if encoding1 is None or encoding2 is None:
            return {'error': 'Could not detect face in one or both images'}
        
        return self.verify(encoding1, encoding2)


class FaceClustering:
    """
    Face clustering system to group similar faces.
    """
    
    def __init__(self, eps: float = 0.5, min_samples: int = 2):
        """
        Initialize face clustering.
        
        Args:
            eps: Maximum distance between samples in the same cluster
            min_samples: Minimum number of samples in a cluster
        """
        self.eps = eps
        self.min_samples = min_samples
        self.clusterer = DBSCAN(eps=eps, min_samples=min_samples, metric='euclidean')
    
    def cluster(self, encodings: List[np.ndarray]) -> Dict:
        """
        Cluster face encodings into groups.
        
        Args:
            encodings: List of face encodings
            
        Returns:
            Dictionary with cluster labels and statistics
        """
        if len(encodings) == 0:
            return {'error': 'No encodings provided'}
        
        encodings_array = np.array(encodings)
        cluster_labels = self.clusterer.fit_predict(encodings_array)
        
        # Calculate statistics
        unique_labels = set(cluster_labels)
        n_clusters = len(unique_labels) - (1 if -1 in cluster_labels else 0)
        n_noise = list(cluster_labels).count(-1)
        
        # Group by cluster
        clusters = {}
        for idx, label in enumerate(cluster_labels):
            if label not in clusters:
                clusters[label] = []
            clusters[label].append(idx)
        
        # Calculate silhouette score if possible
        silhouette = None
        if n_clusters > 1 and len(encodings) > 1:
            try:
                silhouette = float(silhouette_score(encodings_array, cluster_labels))
            except:
                pass
        
        return {
            'labels': cluster_labels.tolist(),
            'n_clusters': n_clusters,
            'n_noise': n_noise,
            'clusters': clusters,
            'silhouette_score': silhouette
        }


class FaceQualityAssessment:
    """
    Assess the quality of face images for recognition.
    """
    
    @staticmethod
    def assess_blur(image: np.ndarray) -> float:
        """
        Assess image blur using Laplacian variance.
        
        Args:
            image: Input image (grayscale or RGB)
            
        Returns:
            Blur score (higher = less blur)
        """
        if len(image.shape) == 3:
            gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
        else:
            gray = image
        
        laplacian_var = cv2.Laplacian(gray, cv2.CV_64F).var()
        return float(laplacian_var)
    
    @staticmethod
    def assess_brightness(image: np.ndarray) -> float:
        """
        Assess image brightness.
        
        Args:
            image: Input image (RGB)
            
        Returns:
            Brightness score (0-1, 0.5 is ideal)
        """
        if len(image.shape) == 3:
            gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
        else:
            gray = image
        
        mean_brightness = np.mean(gray) / 255.0
        # Score is better when closer to 0.5
        brightness_score = 1 - abs(mean_brightness - 0.5) * 2
        return float(brightness_score)
    
    @staticmethod
    def assess_face_size(image: np.ndarray, face_location: Tuple) -> float:
        """
        Assess if face size is appropriate.
        
        Args:
            image: Input image
            face_location: Face location (top, right, bottom, left)
            
        Returns:
            Size score (0-1)
        """
        top, right, bottom, left = face_location
        face_height = bottom - top
        face_width = right - left
        image_height, image_width = image.shape[:2]
        
        face_area = face_height * face_width
        image_area = image_height * image_width
        
        face_ratio = face_area / image_area
        
        # Ideal ratio is around 0.1-0.3
        if 0.1 <= face_ratio <= 0.3:
            return 1.0
        elif face_ratio < 0.1:
            return face_ratio / 0.1
        else:
            return max(0, 1 - (face_ratio - 0.3) / 0.7)
    
    def assess(self, image: np.ndarray, face_location: Tuple = None) -> Dict:
        """
        Comprehensive quality assessment.
        
        Args:
            image: Input image (RGB)
            face_location: Optional face location
            
        Returns:
            Dictionary with quality scores
        """
        blur_score = self.assess_blur(image)
        brightness_score = self.assess_brightness(image)
        
        # Normalize blur score (typical good values are > 100)
        blur_normalized = min(1.0, blur_score / 500.0)
        
        scores = {
            'blur_score': blur_normalized,
            'brightness_score': brightness_score,
            'overall_score': (blur_normalized + brightness_score) / 2
        }
        
        if face_location:
            size_score = self.assess_face_size(image, face_location)
            scores['size_score'] = size_score
            scores['overall_score'] = (blur_normalized + brightness_score + size_score) / 3
        
        return scores


class FaceAlignment:
    """
    Face alignment utilities for better recognition accuracy.
    """
    
    @staticmethod
    def align_face(image: np.ndarray, face_landmarks: Dict) -> Optional[np.ndarray]:
        """
        Align face using facial landmarks.
        
        Args:
            image: Input image (RGB)
            face_landmarks: Face landmarks dictionary from face_recognition
            
        Returns:
            Aligned face image or None
        """
        try:
            # Get eye landmarks
            left_eye = face_landmarks['left_eye']
            right_eye = face_landmarks['right_eye']
            
            # Calculate eye centers
            left_eye_center = np.mean(left_eye, axis=0)
            right_eye_center = np.mean(right_eye, axis=0)
            
            # Calculate angle
            dy = right_eye_center[1] - left_eye_center[1]
            dx = right_eye_center[0] - left_eye_center[0]
            angle = np.degrees(np.arctan2(dy, dx))
            
            # Calculate center point
            eye_center = ((left_eye_center[0] + right_eye_center[0]) // 2,
                         (left_eye_center[1] + right_eye_center[1]) // 2)
            
            # Rotate image
            rotation_matrix = cv2.getRotationMatrix2D(eye_center, angle, 1.0)
            aligned = cv2.warpAffine(image, rotation_matrix, (image.shape[1], image.shape[0]),
                                    flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
            
            return aligned
        except Exception as e:
            print(f"Alignment error: {e}")
            return None
    
    @staticmethod
    def get_aligned_face(image: np.ndarray) -> Optional[np.ndarray]:
        """
        Get aligned face from image.
        
        Args:
            image: Input image (RGB)
            
        Returns:
            Aligned face image or None
        """
        face_landmarks_list = face_recognition.face_landmarks(image)
        
        if len(face_landmarks_list) == 0:
            return None
        
        aligned = FaceAlignment.align_face(image, face_landmarks_list[0])
        return aligned


class BatchProcessor:
    """
    Batch processing utilities for multiple images.
    """
    
    def __init__(self, recognizer=None):
        """
        Initialize batch processor.
        
        Args:
            recognizer: FaceRecognizer instance (optional)
        """
        self.recognizer = recognizer
    
    def process_directory(self, directory: str, output_file: str = None) -> List[Dict]:
        """
        Process all images in a directory.
        
        Args:
            directory: Directory containing images
            output_file: Optional JSON output file
            
        Returns:
            List of recognition results
        """
        import os
        import json
        
        results = []
        
        for root, dirs, files in os.walk(directory):
            for file in files:
                if any(file.lower().endswith(ext) for ext in config.IMAGE_EXTENSIONS):
                    image_path = os.path.join(root, file)
                    
                    try:
                        if self.recognizer:
                            result = self.recognizer.recognize(image_path)
                            results.append({
                                'image_path': image_path,
                                'results': result
                            })
                    except Exception as e:
                        results.append({
                            'image_path': image_path,
                            'error': str(e)
                        })
        
        if output_file:
            with open(output_file, 'w') as f:
                json.dump(results, f, indent=2)
        
        return results
    
    def process_image_list(self, image_paths: List[str]) -> List[Dict]:
        """
        Process a list of image paths.
        
        Args:
            image_paths: List of image file paths
            
        Returns:
            List of recognition results
        """
        results = []
        
        for image_path in image_paths:
            try:
                if self.recognizer:
                    result = self.recognizer.recognize(image_path)
                    results.append({
                        'image_path': image_path,
                        'results': result
                    })
            except Exception as e:
                results.append({
                    'image_path': image_path,
                    'error': str(e)
                })
        
        return results

414 lines•12.8 KB
python
scripts/__init__.py
Raw Download
Find: Go to:
"""
Face Recognition Dataset Scripts Package

Project Information:
- Project ID: 22
- Title: Face Recognition Dataset
- Category: Image Data
- Technologies: PNG, JPG, NumPy, OpenCV, Face Recognition

Contact Information:
RSK World
Founder: Molla Samser
Designer & Tester: Rima Khatun
Email: help@rskworld.in
Phone: +91 93305 39277
Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India, 713147
Website: https://rskworld.in/
Year: 2026
"""

from .load_dataset import FaceDatasetLoader
from .preprocess import preprocess_faces, get_face_encoding, detect_faces
from .recognize_faces import FaceRecognizer

# Advanced features (optional imports)
try:
    from .advanced_features import (
        FaceVerifier, FaceClustering, FaceQualityAssessment,
        FaceAlignment, BatchProcessor
    )
    __all__ = [
        'FaceDatasetLoader',
        'preprocess_faces',
        'get_face_encoding',
        'detect_faces',
        'FaceRecognizer',
        'FaceVerifier',
        'FaceClustering',
        'FaceQualityAssessment',
        'FaceAlignment',
        'BatchProcessor'
    ]
except ImportError:
    __all__ = [
        'FaceDatasetLoader',
        'preprocess_faces',
        'get_face_encoding',
        'detect_faces',
        'FaceRecognizer'
    ]

52 lines•1.3 KB
python
scripts/preprocess.py
Raw Download
Find: Go to:
"""
Image Preprocessing for Face Recognition Dataset

This script preprocesses face images for training and recognition.

Project Information:
- Project ID: 22
- Title: Face Recognition Dataset
- Category: Image Data
- Technologies: PNG, JPG, NumPy, OpenCV, Face Recognition

Contact Information:
RSK World
Founder: Molla Samser
Designer & Tester: Rima Khatun
Email: help@rskworld.in
Phone: +91 93305 39277
Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India, 713147
Website: https://rskworld.in/
Year: 2026
"""

import numpy as np
import cv2
import face_recognition
from typing import List, Tuple, Optional
import config


def detect_faces(image: np.ndarray) -> List[Tuple[int, int, int, int]]:
    """
    Detect faces in an image.
    
    Args:
        image: Input image (RGB format)
        
    Returns:
        List of face locations (top, right, bottom, left)
    """
    face_locations = face_recognition.face_locations(
        image, 
        model=config.FACE_DETECTION_MODEL
    )
    return face_locations


def extract_face(image: np.ndarray, face_location: Tuple[int, int, int, int], 
                 size: Tuple[int, int] = None) -> Optional[np.ndarray]:
    """
    Extract and resize a face from an image.
    
    Args:
        image: Input image (RGB format)
        face_location: Face location (top, right, bottom, left)
        size: Target size (width, height), default from config
        
    Returns:
        Extracted and resized face image, or None if extraction fails
    """
    if size is None:
        size = config.IMAGE_SIZE
    
    top, right, bottom, left = face_location
    
    # Extract face region
    face_image = image[top:bottom, left:right]
    
    if face_image.size == 0:
        return None
    
    # Resize to target size
    face_image = cv2.resize(face_image, size)
    
    return face_image


def preprocess_image(image: np.ndarray, normalize: bool = True) -> np.ndarray:
    """
    Preprocess a single image.
    
    Args:
        image: Input image (RGB format)
        normalize: Whether to normalize pixel values to [0, 1]
        
    Returns:
        Preprocessed image
    """
    # Convert to float
    processed = image.astype(np.float32)
    
    # Normalize to [0, 1] if requested
    if normalize:
        processed = processed / 255.0
    
    return processed


def preprocess_faces(data_dir: str, output_dir: str = None) -> List[np.ndarray]:
    """
    Preprocess all face images in a directory.
    
    Args:
        data_dir: Directory containing person subdirectories
        output_dir: Optional directory to save preprocessed images
        
    Returns:
        List of preprocessed face images
    """
    import os
    from scripts.load_dataset import FaceDatasetLoader
    
    loader = FaceDatasetLoader(data_dir)
    images, labels, label_mapping = loader.load()
    
    processed_images = []
    processed_labels = []
    
    print(f"Preprocessing {len(images)} images...")
    
    for i, image in enumerate(images):
        # Detect faces
        face_locations = detect_faces(image)
        
        if len(face_locations) > 0:
            # Use the first detected face
            face_location = face_locations[0]
            face_image = extract_face(image, face_location)
            
            if face_image is not None:
                # Preprocess the face
                processed_face = preprocess_image(face_image, normalize=True)
                processed_images.append(processed_face)
                processed_labels.append(labels[i])
        
        if (i + 1) % 100 == 0:
            print(f"Processed {i + 1}/{len(images)} images")
    
    print(f"Successfully processed {len(processed_images)} faces")
    
    return np.array(processed_images), np.array(processed_labels)


def get_face_encoding(image: np.ndarray, num_jitters: int = None) -> Optional[np.ndarray]:
    """
    Get face encoding for recognition.
    
    Args:
        image: Input image (RGB format)
        num_jitters: Number of times to re-sample the face (default from config)
        
    Returns:
        Face encoding (128-dimensional vector) or None if no face detected
    """
    if num_jitters is None:
        num_jitters = config.NUM_JITTERS
    
    # Detect face
    face_locations = detect_faces(image)
    
    if len(face_locations) == 0:
        return None
    
    # Get face encoding
    face_encodings = face_recognition.face_encodings(
        image, 
        face_locations, 
        num_jitters=num_jitters
    )
    
    if len(face_encodings) > 0:
        return face_encodings[0]
    
    return None


if __name__ == "__main__":
    # Example usage
    print("Preprocessing training data...")
    processed_images, processed_labels = preprocess_faces(config.TRAIN_DIR)
    
    print(f"\nPreprocessed {len(processed_images)} face images")
    print(f"Image shape: {processed_images[0].shape}")
    print(f"Number of unique labels: {len(np.unique(processed_labels))}")

185 lines•5.1 KB
python
scripts/recognize_faces.py
Raw Download
Find: Go to:
"""
Face Recognition Script

This script performs face recognition on images using the trained model.

Project Information:
- Project ID: 22
- Title: Face Recognition Dataset
- Category: Image Data
- Technologies: PNG, JPG, NumPy, OpenCV, Face Recognition

Contact Information:
RSK World
Founder: Molla Samser
Designer & Tester: Rima Khatun
Email: help@rskworld.in
Phone: +91 93305 39277
Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India, 713147
Website: https://rskworld.in/
Year: 2026
"""

import numpy as np
import cv2
import face_recognition
import pickle
import os
from typing import List, Tuple, Optional, Dict
import config
from scripts.preprocess import get_face_encoding


class FaceRecognizer:
    """
    Face recognition system that can train on a dataset and recognize faces.
    """
    
    def __init__(self, tolerance: float = None):
        """
        Initialize the face recognizer.
        
        Args:
            tolerance: How much distance between faces to consider it a match (default from config)
        """
        self.tolerance = tolerance or config.TOLERANCE
        self.known_face_encodings = []
        self.known_face_names = []
        self.model_path = os.path.join(config.MODELS_DIR, config.MODEL_NAME)
        
    def train(self, data_dir: str, save_model: bool = True):
        """
        Train the recognizer on a dataset.
        
        Args:
            data_dir: Directory containing person subdirectories
            save_model: Whether to save the trained model
        """
        from scripts.load_dataset import FaceDatasetLoader
        
        loader = FaceDatasetLoader(data_dir)
        images, labels, label_mapping = loader.load()
        
        print(f"Training on {len(images)} images from {len(label_mapping)} identities...")
        
        self.known_face_encodings = []
        self.known_face_names = []
        
        for i, image in enumerate(images):
            # Get face encoding
            encoding = get_face_encoding(image)
            
            if encoding is not None:
                person_name = label_mapping[labels[i]]
                self.known_face_encodings.append(encoding)
                self.known_face_names.append(person_name)
            
            if (i + 1) % 50 == 0:
                print(f"Processed {i + 1}/{len(images)} images")
        
        print(f"Trained on {len(self.known_face_encodings)} face encodings")
        
        if save_model:
            self.save_model()
    
    def recognize(self, image_path: str) -> List[Dict]:
        """
        Recognize faces in an image.
        
        Args:
            image_path: Path to the image file
            
        Returns:
            List of recognition results with name and confidence
        """
        if len(self.known_face_encodings) == 0:
            if os.path.exists(self.model_path):
                self.load_model()
            else:
                raise ValueError("No trained model found. Please train the model first.")
        
        # Load image
        image = cv2.imread(image_path)
        if image is None:
            raise ValueError(f"Could not load image: {image_path}")
        
        # Convert BGR to RGB
        rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        
        # Detect faces
        face_locations = face_recognition.face_locations(
            rgb_image, 
            model=config.FACE_DETECTION_MODEL
        )
        
        # Get face encodings
        face_encodings = face_recognition.face_encodings(
            rgb_image, 
            face_locations,
            num_jitters=config.NUM_JITTERS
        )
        
        results = []
        
        for face_encoding, face_location in zip(face_encodings, face_locations):
            # Compare with known faces
            matches = face_recognition.compare_faces(
                self.known_face_encodings,
                face_encoding,
                tolerance=self.tolerance
            )
            
            # Calculate distances
            face_distances = face_recognition.face_distance(
                self.known_face_encodings,
                face_encoding
            )
            
            # Find best match
            best_match_index = np.argmin(face_distances)
            
            if matches[best_match_index]:
                name = self.known_face_names[best_match_index]
                distance = face_distances[best_match_index]
                confidence = 1 - distance  # Convert distance to confidence
            else:
                name = "Unknown"
                confidence = 0.0
            
            results.append({
                'name': name,
                'confidence': confidence,
                'location': face_location,
                'distance': face_distances[best_match_index] if matches[best_match_index] else None
            })
        
        return results
    
    def recognize_from_array(self, image: np.ndarray) -> List[Dict]:
        """
        Recognize faces from a numpy array image.
        
        Args:
            image: Image as numpy array (RGB format)
            
        Returns:
            List of recognition results
        """
        if len(self.known_face_encodings) == 0:
            if os.path.exists(self.model_path):
                self.load_model()
            else:
                raise ValueError("No trained model found. Please train the model first.")
        
        # Detect faces
        face_locations = face_recognition.face_locations(
            image, 
            model=config.FACE_DETECTION_MODEL
        )
        
        # Get face encodings
        face_encodings = face_recognition.face_encodings(
            image, 
            face_locations,
            num_jitters=config.NUM_JITTERS
        )
        
        results = []
        
        for face_encoding, face_location in zip(face_encodings, face_locations):
            matches = face_recognition.compare_faces(
                self.known_face_encodings,
                face_encoding,
                tolerance=self.tolerance
            )
            
            face_distances = face_recognition.face_distance(
                self.known_face_encodings,
                face_encoding
            )
            
            best_match_index = np.argmin(face_distances)
            
            if matches[best_match_index]:
                name = self.known_face_names[best_match_index]
                distance = face_distances[best_match_index]
                confidence = 1 - distance
            else:
                name = "Unknown"
                confidence = 0.0
            
            results.append({
                'name': name,
                'confidence': confidence,
                'location': face_location,
                'distance': face_distances[best_match_index] if matches[best_match_index] else None
            })
        
        return results
    
    def save_model(self):
        """Save the trained model to disk."""
        os.makedirs(config.MODELS_DIR, exist_ok=True)
        
        model_data = {
            'encodings': self.known_face_encodings,
            'names': self.known_face_names,
            'tolerance': self.tolerance
        }
        
        with open(self.model_path, 'wb') as f:
            pickle.dump(model_data, f)
        
        print(f"Model saved to {self.model_path}")
    
    def load_model(self):
        """Load a trained model from disk."""
        if not os.path.exists(self.model_path):
            raise FileNotFoundError(f"Model not found: {self.model_path}")
        
        with open(self.model_path, 'rb') as f:
            model_data = pickle.load(f)
        
        self.known_face_encodings = model_data['encodings']
        self.known_face_names = model_data['names']
        self.tolerance = model_data.get('tolerance', config.TOLERANCE)
        
        print(f"Model loaded from {self.model_path}")
        print(f"Loaded {len(self.known_face_encodings)} face encodings")


if __name__ == "__main__":
    # Example usage
    recognizer = FaceRecognizer()
    
    # Train the model
    print("Training face recognizer...")
    recognizer.train(config.TRAIN_DIR, save_model=True)
    
    # Example: Recognize faces in an image
    # results = recognizer.recognize('path/to/test/image.jpg')
    # for result in results:
    #     print(f"Name: {result['name']}, Confidence: {result['confidence']:.2f}")

264 lines•8.6 KB
python

About RSK World

Founded by Molla Samser, with Designer & Tester Rima Khatun, RSK World is your one-stop destination for free programming resources, source code, and development tools.

Founder: Molla Samser
Designer & Tester: Rima Khatun

Development

  • Game Development
  • Web Development
  • Mobile Development
  • AI Development
  • Development Tools

Legal

  • Terms & Conditions
  • Privacy Policy
  • Disclaimer

Contact Info

Nutanhat, Mongolkote
Purba Burdwan, West Bengal
India, 713147

+91 93305 39277

hello@rskworld.in
support@rskworld.in

© 2026 RSK World. All rights reserved.

Content used for educational purposes only. View Disclaimer