Słowem wstępu
W dzisiejszym dość krótkim wpisie, pokażę Ci drogi czytelniku jak w prosty sposób można anonimizować tablice rejestracyjne oraz twarze na zdjęciach. Wykorzystamy w tym celu wstępnie wytrenowane gotowe modele AI w formacie PyTorch.
Importy
Jak zawsze, lepiej skorzystać z stabilnych rozwiązań niż wymyślać koło na nowo. Dla tego w tym przypadku skorzystamy z gotowych bibliotek.
Do tego celu na początku naszego pliku zdefiniujemy importy:
from ultralytics import YOLO
import cv2
które aby zadziałały, wymagają od nas instalacji poniższych zależności za pomocą pip lub uv:
omegaconf
ultralytics
Właściwy kod
Zacznijmy od zadeklarowania na jakim obrazku zamierzamy pracować. Pobierzemy w tym celu do niego uchwyt po przez bibliotekę OpenCV, abyśmy mogli wykorzystać jej potencjał.
image_path = "input.jpg"
img = cv2.imread(image_path)
Teraz mając już nasz obrazek, zastanówmy się jak chcemy oznaczać nasze regiony na zdjęciu?
Najprostszym sposobem będzie zebranie tablicy z współrzędnymi, które opisują teren który chcemy zamazać. W tym celu utworzymy tablicę która będzie kontenerem dla nich.
regions = []Teraz musimy załadować interesujący nas model za pomocą biblioteki YOLO. Po przekazaniu do niego obrazka, zwróci on nam dwie współrzędne które pozwolą nam zlokalizować interesujący nas obszar. Dodajemy je do powyższego kontenera:
face_model = YOLO("yolov8n-face.pt")
face_results = face_model(img)
for result in face_results:
for box in result.boxes.xyxy:
x1, y1, x2, y2 = map(int, box.tolist())
regions.append((x1, y1, x2, y2))
*Ważna uwaga, modele "yolov8n-face.pt" i "license-plate-finetune.pt" należy pobrać samodzielnie z https://github.com lub http://huggingface.co. Po czym wrzucić do katalogu z naszym projektem.
Sytuacja odnośnie tablic rejestracyjnych będzie adekwatna:
plate_model = YOLO("license-plate-finetune.pt")
plate_results = plate_model(img)
for result in plate_results:
for box in result.boxes.xyxy:
x1, y1, x2, y2 = map(int, box.tolist())
regions.append((x1, y1, x2, y2))
Teraz gdy mamy już nasze regiony, możemy dla każdego wyciąć interesujący nas fragment obrazka i po rozmyciu go, wkleić spowrotem.
for (x1, y1, x2, y2) in regions:
roi = img[y1:y2, x1:x2]
if roi.size == 0:
continue
blurred = cv2.GaussianBlur(roi, (99, 99), 30)
img[y1:y2, x1:x2] = blurred
Pozostanie nam już tylko zapisanie poprawionego strumienia pod nową nazwą pliku.
cv2.imwrite("output.jpg", img)To wszystko :)
Komentarze