Skip to content

Commit 5d948e6

Browse files
Merge pull request #13 from 5sControl/dev
Dev
2 parents 75180ea + 22afd6c commit 5d948e6

File tree

6 files changed

+94
-44
lines changed

6 files changed

+94
-44
lines changed

IdleAlgorithm.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from logging import Logger
2+
import asyncio
3+
from connection import ImageHTTPExtractor, ModelPredictionsReceiver, IdleReporter
4+
from confs import configs
5+
import utils
6+
import numpy as np
7+
8+
9+
class IdleAlgorithm:
10+
def __init__(
11+
self,
12+
logger: Logger,
13+
image_extractor: ImageHTTPExtractor,
14+
model_predictor: ModelPredictionsReceiver,
15+
reporter: IdleReporter
16+
) -> None:
17+
self._logger = logger
18+
self._image_extractor = image_extractor
19+
self._model_predictor = model_predictor
20+
self._reporter = reporter
21+
22+
async def run(self):
23+
iter_idx = 0
24+
while True:
25+
iter_idx += 1
26+
if iter_idx % 60 == 0:
27+
self._logger.info("60 iterations passed")
28+
img, start_tracking = self._image_extractor.get_snapshot()
29+
if img is None:
30+
asyncio.sleep(1)
31+
continue
32+
preds = self._model_predictor.predict(img)
33+
if preds is None:
34+
asyncio.sleep(1)
35+
continue
36+
if preds.size != 0 and not np.any(preds == 1.):
37+
self._logger.info("Telephone is detected")
38+
if utils.bboxes_not_equal(prev_preds, preds, configs["threshold"]):
39+
utils.save_cropped_bbox(img, preds[:, :4])
40+
img = utils.put_rectangle(img, preds[:, :4], preds[:, 4])
41+
self._reporter.send_report(self._reporter.create_report(img, str(start_tracking)))
42+
else:
43+
self._logger.debug("Equal bboxes")
44+
prev_preds = preds
45+
asyncio.sleep(2)

connection/ImageHTTPExtractor.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,42 @@
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 = {}
712

813

914
class ImageHTTPExtractor:
10-
def __init__(self, server_url: str, logger: logging.Logger, **credentials) -> None:
15+
def __init__(self, camera_ip: str, logger: logging.Logger, **credentials) -> None:
1116
self.http_connection = httplib2.Http(".cache")
1217
self.http_connection.add_credentials(credentials.get("username"), credentials.get("password"))
1318
self.logger = logger
14-
self.server_url = server_url
19+
self.camera_ip = camera_ip
1520

1621
def get_snapshot(self) -> Tuple[Union[cv2.Mat, None], Union[datetime.time, None]]:
1722
try:
23+
global images
24+
image = images[self.camera_ip]
1825
curr_time = datetime.datetime.now()
19-
response, content = self.http_connection.request(
20-
self.server_url,
21-
"GET",
22-
body="foobar"
23-
)
24-
nparr = np.frombuffer(content, np.uint8)
26+
nparr = np.frombuffer(image, np.uint8)
2527
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
2628
return img, curr_time
2729
except Exception as exc:
2830
self.logger.error(f"Cannot retrieve image. Following error raised - {exc}")
2931
return None, None
32+
33+
@sio.event
34+
async def connect():
35+
print("Connection")
36+
37+
@sio.event
38+
async def snapshot_updated(data):
39+
camera_url, screen = data.get("camera_ip"), data.get("screenshot")
40+
global images
41+
images[camera_url] = screen
42+
43+
async def run_sio(url):
44+
await sio.connect(url)
45+
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
2+
from .ImageHTTPExtractor import ImageHTTPExtractor, run_sio
33
from .ModelPredictionsReceiver import ModelPredictionsReceiver

idle_model/IdleObjectDetectionModel.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
class IdleObjectDetectionModel:
9-
def __init__(self, model_path: str, config_path: str, conf_thresh, iou_thresh, classes) -> None:
9+
def __init__(self, model_path: str, config_path: str, conf_thresh: float, iou_thresh: float, classes: list) -> None:
1010
self.model, self.device = get_model(model_path, config_path)
1111
self.conf_thresh = conf_thresh
1212
self.iou_thresh = iou_thresh
@@ -27,8 +27,6 @@ def __preprocess_image__(self, img: np.array) -> np.array:
2727
def __call__(self, img: np.array) -> list:
2828
img = self.__preprocess_image__(img)
2929
pred = self.model(img, augment=False)[0]
30-
pred = non_max_suppression(
31-
pred, 0.45, 0.5, classes=[67], agnostic=False)[0]
32-
pred[:, :4] = scale_coords(
33-
img.shape[2:], pred[:, :4], self.img_shape).round()
30+
pred = non_max_suppression(pred, self.conf_thresh, self.iou_thresh, classes=[67], agnostic=False)[0]
31+
pred[:, :4] = scale_coords(img.shape[2:], pred[:, :4], self.img_shape).round()
3432
return pred[:, :5]

main.py

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import time
21
import utils
32
import connection
43
from confs import configs
54
from dotenv import load_dotenv
5+
from IdleAlgorithm import IdleAlgorithm
66
import os
77
import numpy as np
8+
import asyncio
89

910

1011
password = os.environ.get("password")
@@ -13,37 +14,24 @@
1314
password = os.environ.get("password")
1415
username = os.environ.get("username")
1516
server_url = os.environ.get("server_url")
16-
camera_url = os.environ.get("camera_url")
17+
camera_ip = os.environ.get("camera_ip")
1718
folder = os.environ.get("folder")
1819

1920
logger = utils.create_logger()
2021

2122
prev_preds = np.array([[]]).astype(np.float32)
2223
reporter = connection.IdleReporter(folder, server_url, configs["wait_time"], logger)
23-
image_extractor = connection.ImageHTTPExtractor(camera_url, logger, username=username, password=password)
24+
image_extractor = connection.ImageHTTPExtractor(camera_ip, logger, username=username, password=password)
2425
model_predictor = connection.ModelPredictionsReceiver(server_url, logger)
26+
algo = IdleAlgorithm(logger, image_extractor, model_predictor, reporter)
2527

26-
iter_idx = 0
28+
async def main():
29+
await asyncio.gather(connection.run_sio(server_url + ':3456'), algo.run())
2730

28-
while True:
29-
iter_idx += 1
30-
if iter_idx % 60 == 0:
31-
logger.info("60 iterations passed")
32-
img, start_tracking = image_extractor.get_snapshot()
33-
if img is None:
34-
time.sleep(1)
35-
continue
36-
preds = model_predictor.predict(img)
37-
if preds is None:
38-
time.sleep(1)
39-
continue
40-
if preds.size != 0 and not np.any(preds == 1.):
41-
logger.info("Telephone is detected")
42-
if utils.bboxes_not_equal(prev_preds, preds, configs["threshold"]):
43-
utils.save_cropped_bbox(img, preds[:, :4])
44-
img = utils.put_rectangle(img, preds[:, :4], preds[:, 4])
45-
reporter.send_report(reporter.create_report(img, str(start_tracking)))
46-
else:
47-
logger.debug("Equal bboxes")
48-
prev_preds = preds
49-
time.sleep(2)
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()

utils/functional.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ def bboxes_not_equal(coords_1: np.array, coords_2: np.array, threshold: float) -
2121

2222
def save_cropped_bbox(img: np.array, bboxes: np.array):
2323
os.makedirs("images/debug/", exist_ok=True)
24-
for bbox in bboxes:
25-
x1, y1, x2, y2 = bbox.astype(int)
26-
c = 15
27-
cv2.imwrite(f"images/debug/{uuid.uuid4()}.png", img[x1 - c:x2 + c, y1 - c:y2 + c])
24+
try:
25+
for bbox in bboxes:
26+
x1, y1, x2, y2 = bbox.astype(int)
27+
c = 15
28+
cv2.imwrite(f"images/debug/{uuid.uuid4()}.png", img[x1 - c:x2 + c, y1 - c:y2 + c])
29+
except Exception:
30+
pass

0 commit comments

Comments
 (0)