Spaces:
Runtime error
Runtime error
Andrey
commited on
Commit
•
99d3d67
1
Parent(s):
d74b579
Update code following deepsource checks.
Browse files- src/ml_utils.py +8 -7
- src/model_architecture.py +0 -5
- src/utils.py +1 -1
- st_app.py +0 -1
src/ml_utils.py
CHANGED
@@ -25,14 +25,16 @@ transforms = A.Compose(
|
|
25 |
)
|
26 |
|
27 |
|
28 |
-
def cells_to_bboxes(
|
|
|
|
|
29 |
"""
|
30 |
Scale the predictions coming from the model_files to
|
31 |
be relative to the entire image such that they for example later
|
32 |
can be plotted or.
|
33 |
Args:
|
34 |
predictions: tensor of size (N, 3, S, S, num_classes+5)
|
35 |
-
|
36 |
s: the number of cells the image is divided in on the width (and height)
|
37 |
is_preds: whether the input is predictions or the true bounding boxes
|
38 |
Returns:
|
@@ -40,12 +42,12 @@ def cells_to_bboxes(predictions: torch.tensor, anchors: torch.tensor, s: int, is
|
|
40 |
object score, bounding box coordinates
|
41 |
"""
|
42 |
batch_size = predictions.shape[0]
|
43 |
-
num_anchors = len(
|
44 |
box_predictions = predictions[..., 1:5]
|
45 |
if is_preds:
|
46 |
-
|
47 |
box_predictions[..., 0:2] = torch.sigmoid(box_predictions[..., 0:2])
|
48 |
-
box_predictions[..., 2:] = torch.exp(box_predictions[..., 2:]) *
|
49 |
scores = torch.sigmoid(predictions[..., 0:1])
|
50 |
best_class = torch.argmax(predictions[..., 5:], dim=-1).unsqueeze(-1)
|
51 |
else:
|
@@ -79,8 +81,6 @@ def non_max_suppression(
|
|
79 |
list: bboxes after performing NMS given a specific IoU threshold
|
80 |
"""
|
81 |
|
82 |
-
assert type(bboxes) == list
|
83 |
-
|
84 |
bboxes = [box for box in bboxes if box[1] > threshold]
|
85 |
bboxes = sorted(bboxes, key=lambda x: x[1], reverse=True)
|
86 |
bboxes_after_nms = []
|
@@ -177,6 +177,7 @@ def predict(
|
|
177 |
# postprocess. In fact, we could remove indexing with idx here, as there is a single image.
|
178 |
# But I prefer to keep it so that this code could be easier changed for cases with batch size > 1
|
179 |
bboxes: List[List] = [[] for _ in range(1)]
|
|
|
180 |
for i in range(3):
|
181 |
S = logits[i].shape[2]
|
182 |
# it could be better to initialize anchors inside the function, but I don't want to do it for every prediction.
|
|
|
25 |
)
|
26 |
|
27 |
|
28 |
+
def cells_to_bboxes(
|
29 |
+
predictions: torch.tensor, tensor_anchors: torch.tensor, s: int, is_preds: bool = True
|
30 |
+
) -> torch.tensor:
|
31 |
"""
|
32 |
Scale the predictions coming from the model_files to
|
33 |
be relative to the entire image such that they for example later
|
34 |
can be plotted or.
|
35 |
Args:
|
36 |
predictions: tensor of size (N, 3, S, S, num_classes+5)
|
37 |
+
tensor_anchors: the anchors used for the predictions
|
38 |
s: the number of cells the image is divided in on the width (and height)
|
39 |
is_preds: whether the input is predictions or the true bounding boxes
|
40 |
Returns:
|
|
|
42 |
object score, bounding box coordinates
|
43 |
"""
|
44 |
batch_size = predictions.shape[0]
|
45 |
+
num_anchors = len(tensor_anchors)
|
46 |
box_predictions = predictions[..., 1:5]
|
47 |
if is_preds:
|
48 |
+
tensor_anchors = tensor_anchors.reshape(1, len(tensor_anchors), 1, 1, 2)
|
49 |
box_predictions[..., 0:2] = torch.sigmoid(box_predictions[..., 0:2])
|
50 |
+
box_predictions[..., 2:] = torch.exp(box_predictions[..., 2:]) * tensor_anchors
|
51 |
scores = torch.sigmoid(predictions[..., 0:1])
|
52 |
best_class = torch.argmax(predictions[..., 5:], dim=-1).unsqueeze(-1)
|
53 |
else:
|
|
|
81 |
list: bboxes after performing NMS given a specific IoU threshold
|
82 |
"""
|
83 |
|
|
|
|
|
84 |
bboxes = [box for box in bboxes if box[1] > threshold]
|
85 |
bboxes = sorted(bboxes, key=lambda x: x[1], reverse=True)
|
86 |
bboxes_after_nms = []
|
|
|
177 |
# postprocess. In fact, we could remove indexing with idx here, as there is a single image.
|
178 |
# But I prefer to keep it so that this code could be easier changed for cases with batch size > 1
|
179 |
bboxes: List[List] = [[] for _ in range(1)]
|
180 |
+
idx = 0
|
181 |
for i in range(3):
|
182 |
S = logits[i].shape[2]
|
183 |
# it could be better to initialize anchors inside the function, but I don't want to do it for every prediction.
|
src/model_architecture.py
CHANGED
@@ -60,8 +60,6 @@ class Net(nn.Module):
|
|
60 |
super().__init__()
|
61 |
self.num_classes = 12
|
62 |
self.in_channels = 3
|
63 |
-
# self.config = cfg.model_files.params.config
|
64 |
-
# self.config = [i if i[0] != '(' else literal_eval(i) for i in self.config]
|
65 |
self.config = [
|
66 |
(32, 3, 1),
|
67 |
(64, 3, 2),
|
@@ -88,7 +86,6 @@ class Net(nn.Module):
|
|
88 |
(256, 3, 1),
|
89 |
'S',
|
90 |
]
|
91 |
-
# print('self.config', self.config)
|
92 |
self.layers = self._create_conv_layers()
|
93 |
|
94 |
def forward(self, x):
|
@@ -98,7 +95,6 @@ class Net(nn.Module):
|
|
98 |
if isinstance(layer, ScalePrediction):
|
99 |
outputs.append(layer(x))
|
100 |
continue
|
101 |
-
# print(layer, x.shape)
|
102 |
x = layer(x)
|
103 |
|
104 |
if isinstance(layer, ResidualBlock) and layer.num_repeats == 8:
|
@@ -115,7 +111,6 @@ class Net(nn.Module):
|
|
115 |
in_channels = self.in_channels
|
116 |
|
117 |
for module in self.config:
|
118 |
-
# print(module, type(module))
|
119 |
if isinstance(module, tuple):
|
120 |
out_channels, kernel_size, stride = module
|
121 |
layers.append(
|
|
|
60 |
super().__init__()
|
61 |
self.num_classes = 12
|
62 |
self.in_channels = 3
|
|
|
|
|
63 |
self.config = [
|
64 |
(32, 3, 1),
|
65 |
(64, 3, 2),
|
|
|
86 |
(256, 3, 1),
|
87 |
'S',
|
88 |
]
|
|
|
89 |
self.layers = self._create_conv_layers()
|
90 |
|
91 |
def forward(self, x):
|
|
|
95 |
if isinstance(layer, ScalePrediction):
|
96 |
outputs.append(layer(x))
|
97 |
continue
|
|
|
98 |
x = layer(x)
|
99 |
|
100 |
if isinstance(layer, ResidualBlock) and layer.num_repeats == 8:
|
|
|
111 |
in_channels = self.in_channels
|
112 |
|
113 |
for module in self.config:
|
|
|
114 |
if isinstance(module, tuple):
|
115 |
out_channels, kernel_size, stride = module
|
116 |
layers.append(
|
src/utils.py
CHANGED
@@ -28,7 +28,7 @@ def plot_img_with_rects(
|
|
28 |
ax.imshow(img)
|
29 |
|
30 |
# Create a Rectangle patch
|
31 |
-
for _, rect in enumerate(
|
32 |
label, _, xc, yc, w, h = rect
|
33 |
xc, yc, w, h = xc * coef, yc * coef, w * coef, h * coef
|
34 |
# the coordinates from center-based to left top corner
|
|
|
28 |
ax.imshow(img)
|
29 |
|
30 |
# Create a Rectangle patch
|
31 |
+
for _, rect in enumerate(b for b in boxes if b[1] > threshold):
|
32 |
label, _, xc, yc, w, h = rect
|
33 |
xc, yc, w, h = xc * coef, yc * coef, w * coef, h * coef
|
34 |
# the coordinates from center-based to left top corner
|
st_app.py
CHANGED
@@ -2,7 +2,6 @@ import logging
|
|
2 |
|
3 |
import numpy as np
|
4 |
import streamlit as st
|
5 |
-
import tomli as tomllib
|
6 |
from PIL import Image
|
7 |
from streamlit_drawable_canvas import st_canvas
|
8 |
|
|
|
2 |
|
3 |
import numpy as np
|
4 |
import streamlit as st
|
|
|
5 |
from PIL import Image
|
6 |
from streamlit_drawable_canvas import st_canvas
|
7 |
|