# 📷 ამოცანა: სუსტი ლეიბლების გამოყენებით სურათების კლასიფიკაცია


## 🧠 ისტორია


თქვენ მონაწილეობთ საერთაშორისო პროგრამაში, რომელიც მიზნად ისახავს მასშტაბური ვიზუალური მონაცემების კლასიფიცირებას ისეთი ქვეყნებიდან, სადაც მონაცემების სრული ანოტაცია ფინანსურად და დროის მხრივ შეუძლებელია.


პროექტის ფარგლებში აგროვებენ ათასობით ფოტოს ყოველდღიური სცენებიდან — ცხოველები, ტრანსპორტი, მცენარეები და ადამიანები. თუმცა, ამ ფოტოებიდან მხოლოდ მცირე ნაწილს აქვს დეტალური აღწერა, ხოლო უმეტესობა დარჩა ანოტაციების გარეშე.


AI-ის კვლევით ჯგუფში თქვენი დავალებაა, **მხოლოდ ტექსტური აღწერების გამოყენებით დაადგინოთ სავარაუდო კლასები** (სუსტი ლეიბლები), შემდეგ კი ამ მონაცემებზე გაწვრთნათ საკუთარი **სურათების კლასიფიკაციის მოდელი ნულიდან**, რათა შეძლოთ უცნობი სურათების ავტომატური კლასიფიკაცია.


---


## 🎯 თქვენი მისია


თქვენ მოგაწვდიან ორ ნაწილად დაყოფილ მონაცემთა ნაკრებს:


- **`captions.csv` მონაცემები**: სურათების path-ები, რომლებსაც ახლავს ტექსტური აღწერები (მაგალითად, `"A dog jumping over a rock in a grassy field"`), მაგრამ არ ახლავთ პირდაპირი ლეიბლები.
- **`test_imgs.csv` მონაცემები**: სურათები, რომელთაც არც აღწერა აქვთ და არც ლეიბლები. მათზე თქვენმა მოდელმა უნდა იწინასწარმეტყველოს სწორი კლასი.


თქვენი მიზანია:
1. გამოიყენოთ აღწერები, რათა **მიიღოთ სუსტი ლეიბლები** (weak labels) — ანუ კლასის ჭკვიანური ეჭვები, რომლებიც ტექსტიდან გამომდინარეობს.
2. შექმნათ და ნულიდან გაწვრთნათ **სურათების კლასიფიკაციის მოდელი**, რომელიც შეძლებს სურათის მიხედვით სწორი კლასის განსაზღვრას.
3. გამოიყენოთ ეს მოდელი სატესტო სურათებზე პროგნოზებისთვის და შეადგინოთ ფინალური პროგნოზების ფაილი.


---


## ⚙️ ტექნიკური შეზღუდვები


- კლასიფიკაცია მოიცავს **8 კლასს** — ბუნებრივი სურათების ნაკრებიდან: `[airplane, car, cat, dog, flower, fruit, motorbike, person]`
- თქვენი გადაწყვეტა **უნდა იმუშაოს T4 GPU-ზე მაქსიმუმ 1 საათში**
- **თითოეული სურათი არის 128x128 ზომის (RGB ფერებით)**.
- **Notebook სრულად შეფასდება `Run all` ღილაკის დაჭერის შემდეგ** — კოდი არ უნდა საჭიროებდეს ხელით გაშვებას ან რაიმე ეტაპობრივ ჩარევას.
- საბოლოო პროგნოზების ფაილი უნდა შეიქმნას ავტომატურად notebook-ის ბოლოს, სახელით **`submission.json`**
- **გარე მოდელების გამოყენება აკრძალულია**: არ შეიძლება Hugging Face-დან ან სხვა წყაროებიდან მოდელების ჩამოტვირთვა.
- **წინასწარ გაწვრთნილი სურათების კლასიფიკატორების გამოყენება არ შეიძლება**, მათ შორის CLIP, ViT, ResNet და სხვ.
- დასაშვებია მხოლოდ ტექსტიდან სუსტი ლეიბლების გენერაცია.


---


## 📦 შესაფასებელი მასალები (Deliverables)


თქვენი საბმიშენი შეფასდება სიზუსტის(accuracy) მიხედვით.


თქვენ უნდა ჩააბაროთ:


1. **Jupyter Notebook**, რომელიც:
  - იღებს ტექსტური აღწერებიდან სუსტ ლეიბლებს
  - წვრთნის ახალ კლასიფიკატორს ნულიდან
  - ასრულებს პროგნოზებს სატესტო სურათებზე
  - ქმნის `submission.json` ფაილს ავტომატურად notebook-ის ბოლოს


2. ფაილი **`submission.json`** შემდეგი ფორმატით:
```json
{
 "image_001.jpg": "cat",
 "image_002.jpg": "motorbike",
}
```



## საწყისი კოდი
იხილეთ საწყისი ინფორმაციის ჩატვირთვის და საბოლოო აუთფუთის შექმნის ინსტრუქციები. გთხოვთ ბოლო ნაწილში მხოლოდ ის ნაწილი შეცვალეთ სადაც პასუხს ინახავთ Dict-ში შენახვა განსაკუთრებით კი ფაილის სახელი არ შეცვალოთ წინააღმდეგ შემთხვევაში დაგიბრუნდებათ 0 ქულა.




```python
import pandas as pd

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
captions = pd.read_csv("captions.csv")
captions

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
test = pd.read_csv("test_imgs.csv")
test


# თქვენი კოდი
# ..
# ..








import json

# შეგიძლიათ ამ ფუნქციის პარამეტრებიც შეცვალოთ მთავარია ბოლოს submission.json #შემქნათ იმ პრინციპით როგორც აქ წერია
def create_predictions_json(test_data):
   """
   Creates submission.json file. Currently outputs 'cat' for all students.
   TODO: Replace hardcoded 'cat' with actual model predictions.
   Do not modify the JSON saving part at the end.
   """
   predictions = {}
   for path in test_data:
       # TODO: add prediction logic here using your model.
       final_prediction = "cat"  # Replace with actual prediction


       predictions[path[path.index("test_imgs"):]] = final_prediction

   # DO NOT MODIFY
   with open('submission.json', 'w') as f:
       json.dump(predictions, f, indent=4)


   print(f"Predictions saved to submission.json with {len(predictions)} entries")


test_path_list = test['path'].tolist()
create_predictions_json(test_path_list)

```
