From edf4f76c6f2ed2610cc230de5abdab8ce328abfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20Krau=C3=9Fer?= Date: Sun, 31 May 2026 22:11:13 +0200 Subject: [PATCH] server cleanup --- .vscode/settings.json | 5 -- api/Dockerfile | 3 +- api/src/production/bird_cnn_production.py | 76 +++++++++++++++++++ api/src/{ => production}/server.py | 7 +- api/src/production/start_server.bat | 1 + api/src/production/start_server.sh | 1 + .../yolo_model_production.py | 0 api/start_server.bat | 1 - api/start_server.sh | 1 - 9 files changed, 80 insertions(+), 15 deletions(-) delete mode 100644 .vscode/settings.json create mode 100644 api/src/production/bird_cnn_production.py rename api/src/{ => production}/server.py (98%) create mode 100644 api/src/production/start_server.bat create mode 100644 api/src/production/start_server.sh rename api/src/{yolo => production}/yolo_model_production.py (100%) delete mode 100644 api/start_server.bat delete mode 100644 api/start_server.sh diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5ed6ddb..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "python.analysis.extraPaths": [ - "./api/src/yolo" - ] -} \ No newline at end of file diff --git a/api/Dockerfile b/api/Dockerfile index 33b4bbb..051f95a 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -12,8 +12,7 @@ COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -COPY src ./src -COPY start_server.sh ./start_server.sh +COPY src/production/. . COPY build_models ./build_models RUN chmod +x start_server.sh diff --git a/api/src/production/bird_cnn_production.py b/api/src/production/bird_cnn_production.py new file mode 100644 index 0000000..27d240c --- /dev/null +++ b/api/src/production/bird_cnn_production.py @@ -0,0 +1,76 @@ +import torch.nn as nn +import torch.nn.functional as F + +class SeparableConvolution(nn.Module): + def __init__(self, c_in, c_out, kernel_size): + super().__init__() + self.depthwise = nn.Conv2d(c_in, c_in, kernel_size, groups=c_in, padding=kernel_size//2) + self.bn1 = nn.BatchNorm2d(c_in) + self.pointwise = nn.Conv2d(c_in, c_out, kernel_size=1) + self.bn2 = nn.BatchNorm2d(c_out) + + def forward(self, x): + x = self.depthwise(x) + x = self.bn1(x) + x = F.relu(x) + + x = self.pointwise(x) + x = self.bn2(x) + x = F.relu(x) + + return x + +class SkipBlock(nn.Module): + def __init__(self, c_in, c_out, kernel_size=3): + super().__init__() + self.conv = nn.Sequential( + nn.Conv2d(c_in, c_out, kernel_size, padding=kernel_size//2), + nn.BatchNorm2d(c_out), + nn.ReLU(inplace=True), + nn.Conv2d(c_out, c_out, kernel_size, padding=kernel_size//2), + nn.BatchNorm2d(c_out), + nn.ReLU(inplace=True), + nn.Conv2d(c_out, c_out, kernel_size, padding=kernel_size//2), + nn.BatchNorm2d(c_out), + nn.ReLU(inplace=True) + ) + self.conv_skip = nn.Sequential( + nn.Conv2d(c_in, c_out, 1), + nn.BatchNorm2d(c_out), + nn.ReLU(inplace=True) + ) + + def forward(self, x): + return(F.relu(self.conv_skip(x) + self.conv(x), inplace=True)) + + +class Bird_CNN(nn.Module): + def __init__(self, c_in, c_hidden, c_out): + super().__init__() + + self.model = nn.Sequential( + nn.Conv2d(c_in, c_hidden, kernel_size=3, padding=1), + nn.BatchNorm2d(c_hidden), + nn.ReLU(inplace=True), + + SkipBlock(c_in=c_hidden, c_out=c_hidden), + SkipBlock(c_in=c_hidden, c_out=c_hidden), + SkipBlock(c_in=c_hidden, c_out=c_hidden), + SkipBlock(c_in=c_hidden, c_out=c_hidden), + + SkipBlock(c_in=c_hidden, c_out=c_hidden*2), + SkipBlock(c_in=c_hidden*2, c_out=c_hidden*2), + SkipBlock(c_in=c_hidden*2, c_out=c_hidden*2), + SkipBlock(c_in=c_hidden*2, c_out=c_hidden*2), + + nn.Conv2d(c_hidden*2, c_hidden*4, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + + nn.AdaptiveAvgPool2d((1, 1)), + nn.Flatten(), + nn.Linear(c_hidden*4, c_out), + nn.Dropout(0.3) + ) + + def forward(self, x): + return self.model(x) \ No newline at end of file diff --git a/api/src/server.py b/api/src/production/server.py similarity index 98% rename from api/src/server.py rename to api/src/production/server.py index 7965a63..631afca 100644 --- a/api/src/server.py +++ b/api/src/production/server.py @@ -17,13 +17,8 @@ import torch.nn.functional as F import threading -import sys - -sys.path.insert(1, './src/yolo') from yolo_model_production import convert_prediction, Yolo_model - -sys.path.insert(2, './src/bird_cnn') -from bird_cnn import Bird_CNN +from bird_cnn_production import Bird_CNN BUILD_PATH = "./build_models" IMAGE_SIZE_CNN = 64 diff --git a/api/src/production/start_server.bat b/api/src/production/start_server.bat new file mode 100644 index 0000000..dc9811c --- /dev/null +++ b/api/src/production/start_server.bat @@ -0,0 +1 @@ +python -m uvicorn server:app --reload \ No newline at end of file diff --git a/api/src/production/start_server.sh b/api/src/production/start_server.sh new file mode 100644 index 0000000..bdd00bb --- /dev/null +++ b/api/src/production/start_server.sh @@ -0,0 +1 @@ +uvicorn server:app --host 0.0.0.0 --port 8000 --reload \ No newline at end of file diff --git a/api/src/yolo/yolo_model_production.py b/api/src/production/yolo_model_production.py similarity index 100% rename from api/src/yolo/yolo_model_production.py rename to api/src/production/yolo_model_production.py diff --git a/api/start_server.bat b/api/start_server.bat deleted file mode 100644 index 1bfee11..0000000 --- a/api/start_server.bat +++ /dev/null @@ -1 +0,0 @@ -python -m uvicorn src.server:app --reload \ No newline at end of file diff --git a/api/start_server.sh b/api/start_server.sh deleted file mode 100644 index 817afa2..0000000 --- a/api/start_server.sh +++ /dev/null @@ -1 +0,0 @@ -uvicorn src.server:app --host 0.0.0.0 --port 8000 --reload \ No newline at end of file