Compare commits
No commits in common. "6d2b939987e78d1e0ffb35e261ffd242096913f1" and "07b7d24d40fe46c966b95200c895fe576a596b20" have entirely different histories.
6d2b939987
...
07b7d24d40
@ -1,48 +0,0 @@
|
|||||||
import os
|
|
||||||
from typing import List
|
|
||||||
|
|
||||||
from PIL import Image, ImageDraw, ImageFont, ImageFilter
|
|
||||||
from PIL.Image import composite
|
|
||||||
|
|
||||||
from BlurMe.ml.element_detection import BoundBox
|
|
||||||
|
|
||||||
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
|
|
||||||
|
|
||||||
def show_image_with_boxes(
|
|
||||||
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
|
|
||||||
):
|
|
||||||
img = Image.open(in_image_path)
|
|
||||||
draw = ImageDraw.Draw(img)
|
|
||||||
font_path = DIR_PATH + "/assets/fonts/arial.ttf"
|
|
||||||
font = ImageFont.truetype(font_path, 25)
|
|
||||||
for i, box in enumerate(bounding_boxes):
|
|
||||||
draw.rectangle(box.get_params(), outline="red", width=2, fill=None)
|
|
||||||
draw.text((box.x1 + 5, box.y1 + 5), str(i + 1), fill="red", font=font)
|
|
||||||
if not out_image_path:
|
|
||||||
out_image_path = (
|
|
||||||
in_image_path.split(".")[0] + "_out." + in_image_path.split(".")[1]
|
|
||||||
)
|
|
||||||
img.save(out_image_path)
|
|
||||||
|
|
||||||
|
|
||||||
def blur_boxes_on_image(
|
|
||||||
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
|
|
||||||
):
|
|
||||||
img = Image.open(in_image_path)
|
|
||||||
blur_img = img.filter(ImageFilter.GaussianBlur(radius=7))
|
|
||||||
mask = Image.new("L", img.size, 255)
|
|
||||||
draw_mask = ImageDraw.Draw(mask)
|
|
||||||
for box in bounding_boxes:
|
|
||||||
if box.selected:
|
|
||||||
if box.object == "plate":
|
|
||||||
draw_mask.rectangle(box.get_params(), fill=0)
|
|
||||||
elif box.object == "face":
|
|
||||||
draw_mask.ellipse(box.get_params(), fill=0)
|
|
||||||
mask = mask.filter(ImageFilter.GaussianBlur(radius=3))
|
|
||||||
img = composite(img, blur_img, mask)
|
|
||||||
if not out_image_path:
|
|
||||||
out_image_path = (
|
|
||||||
in_image_path.split(".")[0] + "_blurred." + in_image_path.split(".")[1]
|
|
||||||
)
|
|
||||||
img.save(out_image_path)
|
|
@ -2,6 +2,7 @@ import os
|
|||||||
from typing import List, Tuple
|
from typing import List, Tuple
|
||||||
|
|
||||||
import torch
|
import torch
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
from ultralytics import YOLO
|
from ultralytics import YOLO
|
||||||
|
|
||||||
@ -15,12 +16,9 @@ IOU_THRESH = 0.5
|
|||||||
|
|
||||||
|
|
||||||
class BoundBox:
|
class BoundBox:
|
||||||
def __init__(self, x1, y1, x2, y2, object=None):
|
def __init__(self, x1, y1, x2, y2):
|
||||||
self.x1, self.y1, self.x2, self.y2 = x1, y1, x2, y2
|
self.x1, self.y1, self.x2, self.y2 = x1, y1, x2, y2
|
||||||
self.selected = True
|
self.selected = True
|
||||||
if object not in ["face", "plate"]:
|
|
||||||
raise ValueError("object must be either 'face' or 'plate'")
|
|
||||||
self.object = object
|
|
||||||
|
|
||||||
def select(self):
|
def select(self):
|
||||||
self.selected = True
|
self.selected = True
|
||||||
@ -43,14 +41,29 @@ def detect(image_path: str) -> List[BoundBox]:
|
|||||||
)
|
)
|
||||||
plates = plates[0].cpu().numpy().boxes
|
plates = plates[0].cpu().numpy().boxes
|
||||||
bounding_boxes = []
|
bounding_boxes = []
|
||||||
for boxes, tag in zip([faces, plates], ["face", "plate"]):
|
for boxes in [faces, plates]:
|
||||||
for box in boxes:
|
for box in boxes:
|
||||||
xyxyn = box.xyxy[0]
|
xyxyn = box.xyxy[0]
|
||||||
x1 = int(xyxyn[0])
|
x1 = int(xyxyn[0])
|
||||||
y1 = int(xyxyn[1])
|
y1 = int(xyxyn[1])
|
||||||
x2 = int(xyxyn[2])
|
x2 = int(xyxyn[2])
|
||||||
y2 = int(xyxyn[3])
|
y2 = int(xyxyn[3])
|
||||||
bounding_boxes.append(BoundBox(x1, y1, x2, y2, tag))
|
bounding_boxes.append(BoundBox(x1, y1, x2, y2))
|
||||||
return bounding_boxes
|
return bounding_boxes
|
||||||
|
|
||||||
|
|
||||||
|
def show_image_with_boxes(
|
||||||
|
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
|
||||||
|
):
|
||||||
|
img = Image.open(in_image_path)
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
font_path = DIR_PATH + "/assets/fonts/arial.ttf"
|
||||||
|
font = ImageFont.truetype(font_path, 25)
|
||||||
|
for i, box in enumerate(bounding_boxes):
|
||||||
|
draw.rectangle(box.get_params(), outline="red", width=2, fill=None)
|
||||||
|
draw.text((box.x1 + 5, box.y1 + 5), str(i+1), fill="red", font=font)
|
||||||
|
if not out_image_path:
|
||||||
|
out_image_path = (
|
||||||
|
in_image_path.split(".")[0] + "_out." + in_image_path.split(".")[1]
|
||||||
|
)
|
||||||
|
img.save(out_image_path)
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import Mock, patch
|
from unittest.mock import Mock, patch
|
||||||
from element_detection import detect, BoundBox
|
from element_detection import detect, show_image_with_boxes, BoundBox
|
||||||
from BlurMe.graphics.image_modification import show_image_with_boxes
|
|
||||||
|
|
||||||
|
|
||||||
class TestYourModule(unittest.TestCase):
|
class TestYourModule(unittest.TestCase):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user