{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":52950,"databundleVersionId":5973250,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# American Sign Language (ASL) Fingerspelling Recognition - 1st Place Solution\n\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nimport timm  # Pretrained models\n\n# Define dataset class\nclass ASLDataset(Dataset):\n    def __init__(self, df, transform=None):\n        self.df = df\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        img_path = self.df.iloc[idx]['image_path']\n        label = self.df.iloc[idx]['label']\n        image = load_image(img_path)  # Implement load_image function\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return image, label\n\n# Define Model\nclass ASLModel(nn.Module):\n    def __init__(self, model_name='resnet50', num_classes=26):\n        super(ASLModel, self).__init__()\n        self.model = timm.create_model(model_name, pretrained=True)\n        self.model.fc = nn.Linear(self.model.fc.in_features, num_classes)\n    \n    def forward(self, x):\n        return self.model(x)\n\n# Training function\ndef train_model(model, train_loader, val_loader, epochs=10, lr=1e-4):\n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    model.to(device)\n    criterion = nn.CrossEntropyLoss()\n    optimizer = optim.Adam(model.parameters(), lr=lr)\n    \n    for epoch in range(epochs):\n        model.train()\n        total_loss = 0\n        correct = 0\n        \n        for images, labels in train_loader:\n            images, labels = images.to(device), labels.to(device)\n            optimizer.zero_grad()\n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            loss.backward()\n            optimizer.step()\n            total_loss += loss.item()\n            correct += (outputs.argmax(1) == labels).sum().item()\n        \n        val_acc = evaluate_model(model, val_loader)\n        print(f\"Epoch {epoch+1}, Loss: {total_loss:.4f}, Val Acc: {val_acc:.4f}\")\n    \n    return model\n\n# Evaluation function\ndef evaluate_model(model, val_loader):\n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    model.eval()\n    correct = 0\n    total = 0\n    \n    with torch.no_grad():\n        for images, labels in val_loader:\n            images, labels = images.to(device), labels.to(device)\n            outputs = model(images)\n            correct += (outputs.argmax(1) == labels).sum().item()\n            total += labels.size(0)\n    \n    return correct / total\n\n# Load dataset\ndata = pd.read_csv(\"train.csv\")  # Load CSV with image paths and labels\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor()\n])\ndataset = ASLDataset(data, transform=transform)\ntrain_loader = DataLoader(dataset, batch_size=32, shuffle=True)\n\n# Train model\nmodel = ASLModel()\ntrained_model = train_model(model, train_loader, train_loader, epochs=10)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-18T19:34:22.382343Z","iopub.execute_input":"2025-03-18T19:34:22.382671Z","iopub.status.idle":"2025-03-18T19:34:22.41854Z","shell.execute_reply.started":"2025-03-18T19:34:22.382644Z","shell.execute_reply":"2025-03-18T19:34:22.417032Z"}},"outputs":[],"execution_count":null}]}