Skip to content

Commit cdc33d8

Browse files
Merge pull request #15 from 5sControl/dev
Dev
2 parents f0067d0 + 8ebcf3c commit cdc33d8

9 files changed

+34
-56
lines changed

.dockerignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.cache
22
__pycache__
3-
idle_models
3+
idle_models
4+
.git

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
images/
44
env/
55
__pycache__
6-
.env
6+
*.env
77
.vscode/
88
build/
99
cmake-build-debug/

IdleAlgorithm.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,31 @@ def __init__(
2121
self._reporter = reporter
2222
self._min_epoch_time = 2 # replace on config in future
2323

24-
async def start(self) -> None:
24+
def start(self) -> None:
25+
self.prev_preds = np.array([[]]).astype(np.float32)
2526
while True:
2627
start_epoch_time = time.time()
2728
self._run_one_idle_epoch()
2829
end_epoch_time = time.time()
2930
passed_time = end_epoch_time - start_epoch_time
3031
if passed_time < self._min_epoch_time:
31-
await asyncio.sleep(self._min_epoch_time - passed_time)
32+
time.sleep(self._min_epoch_time - passed_time)
3233

3334
def _run_one_idle_epoch(self) -> None:
3435
img, start_tracking = self._image_extractor.get_snapshot()
3536
if img is None:
3637
return
38+
self._logger.debug("Sending request for model predictions")
3739
preds = self._model_predictor.predict(img)
40+
self._logger.debug("Model predictiions was recieved")
3841
if preds is None:
3942
return
4043
if preds.size != 0 and not np.any(preds == 1.):
4144
self._logger.info("Telephone is detected")
42-
if utils.bboxes_not_equal(prev_preds, preds, configs["threshold"]):
45+
if utils.bboxes_not_equal(self.prev_preds, preds, configs["threshold"]):
4346
utils.save_cropped_bbox(img, preds[:, :4])
4447
img = utils.put_rectangle(img, preds[:, :4], preds[:, 4])
4548
self._reporter.send_report(self._reporter.create_report(img, str(start_tracking)))
4649
else:
4750
self._logger.debug("Equal bboxes")
48-
prev_preds = preds
51+
self.prev_preds = preds

connection/ImageHTTPExtractor.py

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
import numpy as np
55
import cv2
66
from typing import Tuple, Union
7-
import socketio
8-
9-
10-
sio = socketio.AsyncClient()
11-
images = {}
7+
import requests
128

139

1410
class ImageHTTPExtractor:
@@ -20,27 +16,12 @@ def __init__(self, camera_ip: str, logger: logging.Logger, **credentials) -> Non
2016

2117
def get_snapshot(self) -> Tuple[Union[cv2.Mat, None], Union[datetime.time, None]]:
2218
try:
23-
global images
24-
image = images[self.camera_ip]
19+
response = requests.get(self.camera_ip)
2520
curr_time = datetime.datetime.now()
26-
nparr = np.frombuffer(image, np.uint8)
21+
nparr = np.frombuffer(response.content, np.uint8)
2722
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
2823
return img, curr_time
2924
except Exception as exc:
3025
self.logger.warning(f"Cannot retrieve image. Following error raised - {exc}")
31-
print(images.keys())
3226
return None, None
3327

34-
@sio.event
35-
async def connect():
36-
print("Connection")
37-
38-
@sio.event
39-
async def snapshot_updated(data):
40-
camera_ip, screen = data.get("camera_ip"), data.get("screenshot")
41-
global images
42-
images[camera_ip] = screen
43-
44-
async def run_sio(url):
45-
await sio.connect(url)
46-
await sio.wait()

connection/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from .IdleReporter import IdleReporter
2-
from .ImageHTTPExtractor import ImageHTTPExtractor, run_sio
2+
from .ImageHTTPExtractor import ImageHTTPExtractor
33
from .ModelPredictionsReceiver import ModelPredictionsReceiver

idle_model/IdleObjectDetectionModel.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
import numpy as np
44
from yolor.utils.datasets import letterbox
55
from yolor.utils.general import non_max_suppression, scale_coords
6+
import time
67

78

89
class IdleObjectDetectionModel:
9-
def __init__(self, model_path: str, config_path: str, conf_thresh: float, iou_thresh: float, classes: list) -> None:
10+
def __init__(self, model_path: str, config_path: str, conf_thresh: float, iou_thresh: float, classes: list, logger) -> None:
1011
self.model, self.device = get_model(model_path, config_path)
1112
self.conf_thresh = conf_thresh
1213
self.iou_thresh = iou_thresh
1314
self.classes = classes
15+
self.logger = logger
1416

1517
def __preprocess_image__(self, img: np.array) -> np.array:
1618
self.img_shape = img.shape
@@ -26,7 +28,9 @@ def __preprocess_image__(self, img: np.array) -> np.array:
2628
@torch.no_grad()
2729
def __call__(self, img: np.array) -> list:
2830
img = self.__preprocess_image__(img)
31+
t1 = time.time()
2932
pred = self.model(img, augment=False)[0]
33+
self.logger.info(f"Time used for predictions - {time.time() - t1}")
3034
pred = non_max_suppression(pred, self.conf_thresh, self.iou_thresh, classes=[67], agnostic=False)[0]
3135
pred[:, :4] = scale_coords(img.shape[2:], pred[:, :4], self.img_shape).round()
3236
return pred[:, :5]

idle_model/app.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,6 @@
88
import logging
99

1010

11-
app = Flask(__name__)
12-
model = IdleObjectDetectionModel(
13-
MODEL_PATH,
14-
CONF_PATH,
15-
CONF_THRES,
16-
IOU_THRES,
17-
CLASSES
18-
)
19-
2011
logger = logging.getLogger('min_max_logger')
2112
handler = colorlog.StreamHandler()
2213
handler.setFormatter(colorlog.ColoredFormatter(
@@ -32,6 +23,16 @@
3223
logger.setLevel(logging.DEBUG)
3324
logger.propagate = False
3425

26+
app = Flask(__name__)
27+
model = IdleObjectDetectionModel(
28+
MODEL_PATH,
29+
CONF_PATH,
30+
CONF_THRES,
31+
IOU_THRES,
32+
CLASSES,
33+
logger
34+
)
35+
3536
convert_bytes2image = lambda bytes: np.array(Image.open(io.BytesIO(bytes)), dtype=np.uint8)
3637

3738
@app.route('/predict', methods=['POST'])

main.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import utils
2-
from connection import run_sio, IdleReporter, ImageHTTPExtractor, ModelPredictionsReceiver
2+
from connection import IdleReporter, ImageHTTPExtractor, ModelPredictionsReceiver
33
from confs import configs
44
from dotenv import load_dotenv
55
from IdleAlgorithm import IdleAlgorithm
@@ -14,7 +14,7 @@
1414
password = os.environ.get("password")
1515
username = os.environ.get("username")
1616
server_url = os.environ.get("server_url")
17-
camera_ip = os.environ.get("camera_ip")
17+
camera_ip = os.environ.get("camera_url")
1818
folder = os.environ.get("folder")
1919

2020
logger = utils.create_logger()
@@ -25,13 +25,5 @@
2525
model_predictor = ModelPredictionsReceiver(server_url, logger)
2626
algo = IdleAlgorithm(logger, image_extractor, model_predictor, reporter)
2727

28-
async def main():
29-
await asyncio.gather(run_sio(server_url + ':3456'), algo.start())
3028

31-
loop = asyncio.get_event_loop()
32-
try:
33-
loop.run_until_complete(main())
34-
except Exception as exc:
35-
print(exc)
36-
finally:
37-
loop.close()
29+
algo.start()

requirements.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
colorlog==4.8.0
1+
colorlog==6.7.0
22
httplib2==0.22.0
33
numpy==1.22.3
44
opencv_python==4.7.0.72
55
pafy==0.5.5
6-
Pillow==9.5.0
76
pydantic==1.10.2
87
python-dotenv==1.0.0
9-
PyYAML==6.0
108
requests==2.27.1
11-
numba==0.57.1
12-
python-socketio==5.8.0
13-
aiohttp==3.8.1
9+
numba==0.57.1

0 commit comments

Comments
 (0)