This commit is contained in:
2025-06-29 00:42:33 +02:00
parent 5ece085064
commit e698a54eb1
10 changed files with 401 additions and 19 deletions

2
.gitignore vendored
View File

@@ -1,5 +1,5 @@
.env .env
.venv/ .venv/
ships-aerial-images/ ships-aerial-images/
runs/ runs*/
*.pt *.pt

BIN
5af55.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

305
Lab5.ipynb Normal file
View File

@@ -0,0 +1,305 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "7f263647",
"metadata": {},
"source": [
"# Laboratory Exercise 5"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "448199f3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: ultralytics in ./.venv/lib/python3.12/site-packages (8.3.159)\n",
"Requirement already satisfied: numpy>=1.23.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (2.3.1)\n",
"Requirement already satisfied: matplotlib>=3.3.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (3.10.3)\n",
"Requirement already satisfied: opencv-python>=4.6.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (4.11.0.86)\n",
"Requirement already satisfied: pillow>=7.1.2 in ./.venv/lib/python3.12/site-packages (from ultralytics) (11.2.1)\n",
"Requirement already satisfied: pyyaml>=5.3.1 in ./.venv/lib/python3.12/site-packages (from ultralytics) (6.0.2)\n",
"Requirement already satisfied: requests>=2.23.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (2.32.4)\n",
"Requirement already satisfied: scipy>=1.4.1 in ./.venv/lib/python3.12/site-packages (from ultralytics) (1.16.0)\n",
"Requirement already satisfied: torch>=1.8.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (2.7.1)\n",
"Requirement already satisfied: torchvision>=0.9.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (0.22.1)\n",
"Requirement already satisfied: tqdm>=4.64.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (4.67.1)\n",
"Requirement already satisfied: psutil in ./.venv/lib/python3.12/site-packages (from ultralytics) (7.0.0)\n",
"Requirement already satisfied: py-cpuinfo in ./.venv/lib/python3.12/site-packages (from ultralytics) (9.0.0)\n",
"Requirement already satisfied: pandas>=1.1.4 in ./.venv/lib/python3.12/site-packages (from ultralytics) (2.3.0)\n",
"Requirement already satisfied: ultralytics-thop>=2.0.0 in ./.venv/lib/python3.12/site-packages (from ultralytics) (2.0.14)\n",
"Requirement already satisfied: contourpy>=1.0.1 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (1.3.2)\n",
"Requirement already satisfied: cycler>=0.10 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (4.58.4)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (1.4.8)\n",
"Requirement already satisfied: packaging>=20.0 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (25.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (3.2.3)\n",
"Requirement already satisfied: python-dateutil>=2.7 in ./.venv/lib/python3.12/site-packages (from matplotlib>=3.3.0->ultralytics) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in ./.venv/lib/python3.12/site-packages (from pandas>=1.1.4->ultralytics) (2025.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in ./.venv/lib/python3.12/site-packages (from pandas>=1.1.4->ultralytics) (2025.2)\n",
"Requirement already satisfied: charset_normalizer<4,>=2 in ./.venv/lib/python3.12/site-packages (from requests>=2.23.0->ultralytics) (3.4.2)\n",
"Requirement already satisfied: idna<4,>=2.5 in ./.venv/lib/python3.12/site-packages (from requests>=2.23.0->ultralytics) (3.10)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in ./.venv/lib/python3.12/site-packages (from requests>=2.23.0->ultralytics) (2.5.0)\n",
"Requirement already satisfied: certifi>=2017.4.17 in ./.venv/lib/python3.12/site-packages (from requests>=2.23.0->ultralytics) (2025.6.15)\n",
"Requirement already satisfied: filelock in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (3.18.0)\n",
"Requirement already satisfied: typing-extensions>=4.10.0 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (4.14.0)\n",
"Requirement already satisfied: setuptools in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (80.9.0)\n",
"Requirement already satisfied: sympy>=1.13.3 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (1.14.0)\n",
"Requirement already satisfied: networkx in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (3.5)\n",
"Requirement already satisfied: jinja2 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (3.1.6)\n",
"Requirement already satisfied: fsspec in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (2025.5.1)\n",
"Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.6.77)\n",
"Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.6.77)\n",
"Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.6.80)\n",
"Requirement already satisfied: nvidia-cudnn-cu12==9.5.1.17 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (9.5.1.17)\n",
"Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.6.4.1)\n",
"Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (11.3.0.4)\n",
"Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (10.3.7.77)\n",
"Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (11.7.1.2)\n",
"Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.5.4.2)\n",
"Requirement already satisfied: nvidia-cusparselt-cu12==0.6.3 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (0.6.3)\n",
"Requirement already satisfied: nvidia-nccl-cu12==2.26.2 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (2.26.2)\n",
"Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.6.77)\n",
"Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (12.6.85)\n",
"Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (1.11.1.6)\n",
"Requirement already satisfied: triton==3.3.1 in ./.venv/lib/python3.12/site-packages (from torch>=1.8.0->ultralytics) (3.3.1)\n",
"Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics) (1.17.0)\n",
"Requirement already satisfied: mpmath<1.4,>=1.1.0 in ./.venv/lib/python3.12/site-packages (from sympy>=1.13.3->torch>=1.8.0->ultralytics) (1.3.0)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in ./.venv/lib/python3.12/site-packages (from jinja2->torch>=1.8.0->ultralytics) (3.0.2)\n"
]
}
],
"source": [
"!pip install ultralytics"
]
},
{
"cell_type": "markdown",
"id": "41b20cd9",
"metadata": {},
"source": [
"### Dataset\n",
"- **Source** : Kaggle\n",
"- **Format** : Images + annotations\n",
"- **Classes**: 1 (`ship`)\n",
"- **Resolution per image**: Typically 640x640\n",
"- **Dataset size**: 26900 pictures\n"
]
},
{
"cell_type": "markdown",
"id": "3f72c4c8",
"metadata": {},
"source": [
"#### Importing dataset and pre-trained model"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "dab37f87",
"metadata": {},
"outputs": [],
"source": [
"from ultralytics import YOLO\n",
"\n",
"model = YOLO(\"yolo11l.pt\")\n",
"\n",
"data_path = 'ships-aerial-images/data.yaml'"
]
},
{
"cell_type": "markdown",
"id": "9a15a1f5",
"metadata": {},
"source": [
"### Final training parameterse after couple iterations "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "33e8f858",
"metadata": {},
"outputs": [],
"source": [
"train_params = {\n",
" 'epochs': 40,\n",
" 'batch': 32,\n",
" 'imgsz': 640,\n",
" 'lr0': 5e-4,\n",
" 'lrf': 0.1,\n",
" 'warmup_epochs': 5,\n",
" 'warmup_bias_lr': 1e-6,\n",
" 'momentum': 0.937,\n",
" 'weight_decay': 0.0001,\n",
" 'optimizer': 'AdamW',\n",
" 'device': '0,1',\n",
" 'project': 'runs/train',\n",
" 'name': 'vessel_deteciton_v11l',\n",
" 'exist_ok': True,\n",
" 'save_period': 2,\n",
" 'workers': 8,\n",
" 'patience': 20, \n",
" 'cos_lr': True, \n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "940aca02",
"metadata": {},
"outputs": [],
"source": [
"model.train(data=data_path, **train_params)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "55e7e6a4",
"metadata": {},
"outputs": [],
"source": [
"model = YOLO(\"runs/train/vessel_deteciton_v11l/weights/best.pt\")"
]
},
{
"cell_type": "markdown",
"id": "05a6fd1f",
"metadata": {},
"source": [
"### Validation"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "cf1f9cdb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ultralytics 8.3.159 🚀 Python-3.12.3 torch-2.7.1+cu126 CUDA:0 (NVIDIA GeForce RTX 3090, 24135MiB)\n",
" CUDA:1 (NVIDIA GeForce RTX 3090, 24135MiB)\n",
"\u001b[34m\u001b[1mval: \u001b[0mFast image access ✅ (ping: 0.0±0.0 ms, read: 106.4±87.7 MB/s, size: 11.8 KB)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[34m\u001b[1mval: \u001b[0mScanning /home/mlmonster/Projects/ferdzo/vesselDetection/ships-aerial-images/valid/labels.cache... 2165 images, 68 backgrounds, 0 corrupt: 100%|██████████| 2165/2165 [00:00<?, ?it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING ⚠️ Box and segment counts should be equal, but got len(segments) = 172, len(boxes) = 3720. To resolve this only boxes will be used and all segments will be removed. To avoid this please supply either a detect or segment dataset, not a detect-segment mixed dataset.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 136/136 [00:15<00:00, 8.74it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" all 2165 3720 0.603 0.543 0.551 0.341\n",
"Speed: 0.2ms preprocess, 6.2ms inference, 0.0ms loss, 0.2ms postprocess per image\n",
"Results saved to \u001b[1m/home/mlmonster/Projects/ferdzo/vesselDetection/runs/detect/val4\u001b[0m\n"
]
}
],
"source": [
"validation = model.val(conf=0.01,iou=0.7, max_det=300, imgsz=640, device='0,1')"
]
},
{
"cell_type": "markdown",
"id": "124cb886",
"metadata": {},
"source": [
"### Testing the model on custom images"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "43560cd1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"image 1/1 /home/mlmonster/Projects/ferdzo/vesselDetection/5af55.jpg: 640x640 2 ships, 20.7ms\n",
"Speed: 21.6ms preprocess, 20.7ms inference, 0.6ms postprocess per image at shape (1, 3, 640, 640)\n",
"Predictions: tensor([[727.0521, 301.3238, 749.1639, 321.9431],\n",
" [631.3250, 203.8833, 668.7556, 220.2926]], device='cuda:0')\n",
"Confidence: tensor([0.7513, 0.3399], device='cuda:0')\n",
"Class IDs: tensor([0., 0.], device='cuda:0')\n",
"Number of detections: 2\n"
]
}
],
"source": [
"test_image = \"/home/mlmonster/Projects/ferdzo/vesselDetection/5af55.jpg\"\n",
"results = model(test_image)\n",
"\n",
"for result in results:\n",
" print(f\"Predictions: {result.boxes.xyxy}\")\n",
" print(f\"Confidence: {result.boxes.conf}\")\n",
" print(f\"Class IDs: {result.boxes.cls}\")\n",
" print(f\"Number of detections: {len(result.boxes)}\") \n",
" result.save()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6c42e373",
"metadata": {},
"outputs": [],
"source": [
"model.export(format='onnx')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@@ -2,4 +2,3 @@
### Ship detection using Machine Learning methods for the course Digital Processing of Image(Дигитално Процесирање на Слика) ### Ship detection using Machine Learning methods for the course Digital Processing of Image(Дигитално Процесирање на Слика)
This is a simple ship detection model, made using pre-trained YOLO with COCO weights. This is a simple ship detection model, made using pre-trained YOLO with COCO weights.
Using super-gradients as a framework for PyTorch, for ease of use and faster prototyping.

BIN
results_5af55.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
results_test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

BIN
slika.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

BIN
test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

View File

@@ -336,10 +336,62 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"id": "054593ec", "id": "3c9811ee",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [
"model = YOLO(\"/home/mlmonster/Projects/ferdzo/vesselDetection/runs/train/vessel_training/weights/best.pt\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "054593ec",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ultralytics 8.3.159 🚀 Python-3.12.3 torch-2.7.1+cu126 CUDA:0 (NVIDIA GeForce RTX 3090, 24135MiB)\n",
"YOLO11x summary (fused): 190 layers, 56,828,179 parameters, 0 gradients, 194.4 GFLOPs\n",
"\u001b[34m\u001b[1mval: \u001b[0mFast image access ✅ (ping: 0.0±0.0 ms, read: 794.1±400.9 MB/s, size: 4.2 KB)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[34m\u001b[1mval: \u001b[0mScanning /home/mlmonster/Projects/ferdzo/vesselDetection/ships-aerial-images/valid/labels.cache... 2165 images, 68 backgrounds, 0 corrupt: 100%|██████████| 2165/2165 [00:00<?, ?it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING ⚠️ Box and segment counts should be equal, but got len(segments) = 172, len(boxes) = 3720. To resolve this only boxes will be used and all segments will be removed. To avoid this please supply either a detect or segment dataset, not a detect-segment mixed dataset.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 136/136 [00:27<00:00, 4.86it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" all 2165 3720 0.379 0.315 0.292 0.16\n",
"Speed: 0.2ms preprocess, 11.9ms inference, 0.0ms loss, 0.3ms postprocess per image\n",
"Results saved to \u001b[1m/home/mlmonster/Projects/ferdzo/vesselDetection/runs/detect/val2\u001b[0m\n",
"mAP@0.5: 0.2918\n"
]
}
],
"source": [ "source": [
"metrics = model.val()\n", "metrics = model.val()\n",
"print(f\"mAP@0.5: {metrics.box.map50:.4f}\")" "print(f\"mAP@0.5: {metrics.box.map50:.4f}\")"
@@ -350,14 +402,39 @@
"execution_count": null, "execution_count": null,
"id": "40b49cb7", "id": "40b49cb7",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"image 1/1 /home/mlmonster/Projects/ferdzo/vesselDetection/image.jpg: 320x640 (no detections), 21.0ms\n",
"Speed: 20.7ms preprocess, 21.0ms inference, 0.3ms postprocess per image at shape (1, 3, 320, 640)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[162926:162926:0626/203914.442027:ERROR:ui/ozone/platform/x11/ozone_platform_x11.cc:248] Missing X server or $DISPLAY\n",
"[162926:162926:0626/203914.442039:ERROR:ui/aura/env.cc:257] The platform failed to initialize. Exiting.\n"
]
}
],
"source": [ "source": [
"test_image = \"image.jpg\"\n", "test_image = \"/home/mlmonster/Projects/ferdzo/vesselDetection/test.jpg\"\n",
"results = model(test_image)\n", "results = model(test_image)\n",
"\n", "\n",
"results.show()\n", "for result in results:\n",
" boxes = result.boxes\n",
" masks = result.masks\n",
" keypoints = result.keypoints\n",
" probs = result.probs\n",
" obb= result.obb\n",
" result.show()\n",
" result.save()\n",
" \n", " \n",
"results.save()" " "
] ]
}, },
{ {

View File

@@ -1,27 +1,28 @@
import os
from ultralytics import YOLO from ultralytics import YOLO
model = YOLO("yolo11x.pt") model = YOLO("yolo11l.pt")
data_path = 'ships-aerial-images/data.yaml' data_path = 'ships-aerial-images/data.yaml'
train_params = { train_params = {
'epochs': 20, 'epochs': 40,
'batch': 8, 'batch': 32,
'imgsz': 640, 'imgsz': 640,
'lr0': 0.01, 'lr0': 5e-4,
'lrf': 0.01, 'lrf': 0.1,
'warmup_epochs': 5,
'warmup_bias_lr': 1e-6,
'momentum': 0.937, 'momentum': 0.937,
'weight_decay': 0.0005, 'weight_decay': 0.0001,
'optimizer': 'AdamW', 'optimizer': 'AdamW',
'device': '0,1', 'device': '0,1',
'pretrained': True,
'project': 'runs/train', 'project': 'runs/train',
'name': 'vessel_training', 'name': 'vessel_deteciton_v11l',
'exist_ok': True, 'exist_ok': True,
'save_period': 2, 'save_period': 2,
'workers': 8, 'workers': 8,
'auto_augment': 'autoaugment', 'patience': 20,
'cos_lr': True,
} }
model.train(data=data_path, **train_params) model.train(data=data_path, **train_params)