{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":107469,"databundleVersionId":13058354,"sourceType":"competition"},{"sourceId":350248,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":292479,"modelId":313122},{"sourceId":139486,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":118125,"modelId":141362}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport glob\nimport pandas as pd\nfrom ultralytics import YOLO\n\n# Пути к данным и моделям\ntrain_folder = \"/kaggle/input/multi-class-object-detection-challenge/Starter_Dataset/train\"\nval_folder = \"/kaggle/input/multi-class-object-detection-challenge/Starter_Dataset/val\"\ntest_images_path = \"/kaggle/input/multi-class-object-detection-challenge/testImages/images\"\nweights_path = \"/kaggle/input/yolov5/pytorch/default/1/yolov5lu.pt\"\n\n# Проверка структуры папок\ndef check_folder_structure(folder_path):\n    images_path = os.path.join(folder_path, 'images')\n    labels_path = os.path.join(folder_path, 'labels')\n    if os.path.isdir(images_path) and os.path.isdir(labels_path):\n        print(f\"Папки в {folder_path} распознаны правильно.\")\n        return True\n    else:\n        print(f\"Проблема с папками в {folder_path}. Проверьте структуру.\")\n        return False\n\nif not (check_folder_structure(train_folder) and check_folder_structure(val_folder)):\n    raise Exception(\"Структура папок неправильная. Исправьте перед продолжением.\")\n\n# Создание dataset.yaml\ndataset_yaml_path = \"dataset.yaml\"\ndataset_yaml_content = f\"\"\"\ntrain: {train_folder}\nval: {val_folder}\nnc: 2\nnames: ['Non Violent', 'Violent']\n\"\"\"\n\nwith open(dataset_yaml_path, \"w\") as f:\n    f.write(dataset_yaml_content)\nprint(f\"Файл {dataset_yaml_path} создан.\")\n\n# Загрузка модели\nmodel = YOLO(weights_path)\n\n# Обучение без использования Settings\nprint(\"Запуск обучения модели...\")\nmodel.train(\n    data=dataset_yaml_path,\n    epochs=1,\n    imgsz=640,\n    batch=32,\n    plots=False  \n)\nprint(\"Обучение завершено.\")\n\n# Предсказания на тестовых изображениях\nprint(\"Запуск предсказаний на тестовых изображениях...\")\nmodel.predict(\n    source=test_images_path,\n    save_txt=True,\n    save_conf=True,\n    project=\"predictions\",\n    name=\"test_predictions\"\n)\n\n# Конвертация предсказаний в CSV\nlabels_dir = '/kaggle/working/'\noutput_csv = 'submission.csv'\n\npred_files = glob.glob(os.path.join(labels_dir, '*.txt'))\nrows = []\n\nfor file in pred_files:\n    image_name = os.path.basename(file).replace('.txt', '.jpg')  # предполагается, что изображения .jpg\n    with open(file, 'r') as f:\n        for line in f:\n            parts = line.strip().split()\n            if len(parts) >= 5:\n                class_id = parts[0]\n                confidence = parts[5] if len(parts) > 5 else '1'\n                x_center, y_center, width, height = parts[1:5]\n                rows.append([image_name, class_id, confidence, x_center, y_center, width, height])\n\ndf = pd.DataFrame(rows, columns=['image', 'class_id', 'confidence', 'x_center', 'y_center', 'width', 'height'])\ndf.to_csv(output_csv, index=False)\nprint(f\"Файл {output_csv} готов.\")\n\n# Дополнительная предсказательная итерация (по желанию)\nprint(\"Запуск повторных предсказаний...\")\nmodel.predict(\n    source=test_images_path,\n    save_txt=True,\n    save_conf=True,\n    project=\"predictions\",\n    name=\"test_predictions_repeat\"\n)\n\n# Конвертация новых предсказаний\npred_files = glob.glob(os.path.join(labels_dir, '*.txt'))\nrows = []\n\nfor file in pred_files:\n    image_name = os.path.basename(file).replace('.txt', '.jpg')\n    with open(file, 'r') as f:\n        for line in f:\n            parts = line.strip().split()\n            if len(parts) >= 5:\n                class_id = parts[0]\n                confidence = parts[5] if len(parts) > 5 else '1'\n                x_center, y_center, width, height = parts[1:5]\n                rows.append([image_name, class_id, confidence, x_center, y_center, width, height])\n\ndf = pd.DataFrame(rows, columns=['image', 'class_id', 'confidence', 'x_center', 'y_center', 'width', 'height'])\ndf.to_csv(output_csv, index=False)\nprint(f\"Файл {output_csv} готов.\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-08-18T13:30:59.173997Z","iopub.execute_input":"2025-08-18T13:30:59.174328Z"}},"outputs":[],"execution_count":null}]}