Backend

Jak rozpoznać obiekty ze zdjęcia? Wystarczy te 10 linii kodu w Pythonie

Technologia rozpoznawania obrazów, choć popularność zdobyła dobre kilka lat temu, do dziś jest używana w wielu różnych dziedzinach. Od klasycznego wykorzystania, czyli rozpoznawania obiektów na kamerach przemysłowych, po autonomiczne pojazdy, które cały czas kontrolują i reagują na wszystko, co pojawia się na drodze. Jak widać, technologia ta nadal budzi zainteresowanie, dlatego przygotowaliśmy ten poradnik, w którym wyjaśniamy, jak rozpoznawać obiekty za pomocą 10 linii kodu w Pythonie.

Rozpoznawanie obrazów coraz bardziej przybliża sztuczną inteligencję do umiejętności, którymi na co dzień posługują się ludzie. Dzięki niej, program może rozpoznać, co widać na obrazku, ale też określić, czy jest to przedmiot, człowiek, czy zwierzę. Co dziś możemy rozpoznać za pomocą tej technologii?

Policja wykorzystuje ją do poszukiwania przestępców — analizuje filmy i zdjęcia, by przetworzyć pojawiające się na nich twarze. Najpierw rozpoznaje wyróżniające wartości, a później porównuje je z listą poszukiwanych osób. Jeśli któraś z twarzy ma podobne choć część elementów, może zostać uznana za podejrzaną.

Dzisiaj nie skupimy się jednak na specjalistycznym wykorzystaniu technologii rozpoznawania obrazu, ale na tej najprostszej formie, czyli rozpoznaniu, co jest na obrazie. Nie zaskoczy Was pewnie fakt, że wykorzystamy przygotowaną wcześniej bibliotekę, która zawiera więcej niż 10 linii kodu, ale sama implementacja nie powinna zająć więcej niż 10 linii.

Przełom w rozwoju technologii rozpoznawania obrazu nastąpił w 2012 roku, kiedy powstały takie algorytmy jak R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet i takie dokładne algorytmy jak SSD i YOLO. Wykorzystanie tych metod i algorytmów, które zostały oparte o deep learning, wymaga zrozumienia, jak działają matematyczne i deep learningowe frameworki.

Moses i John Olafenwa także stanęli przed tym problemem i postanowili stworzyć pythonową bibliotekę ImageAI, która pozwala developerom na prostą implementację jej w programach i aplikacjach, wykorzystując do tego tylko kilka linii kodu.

Do implementacji ImageAI potrzebujemy:

1. Zainstalowania Pythona

2. Zainstalowania ImageAI

3. Pobrania przykładowego folderu o nazwie “Object Detection”

Zaczynamy zabawę w rozpoznawaniu obiektów!

1. Pobierz Pythona 3 z oficjalnej strony Pythona.

2. Zainstaluj za pośrednictwem pip:

– Tensorflow

pip install tensorflow

– Numpy

pip install numpy

– SciPy

pip install scipy

– OpenCV

pip install opencv-python

– Pillow

pip install pillow

– Matplotlib

pip install matplotlib

– H5py

pip install h5py

– Keras

pip install keras

– ImageAI

pip3 install
https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

3. Pobierz modelowy plik RetinaNet, który wykorzystamy do rozpoznawania obrazów, za pośrednictwem tego linku.

Jeśli wykonałeś powyższe kroki poprawnie, czas na pierwsze testy technologii rozpoznawania obrazu. Utwórz plik w Pythonie, nazwij go, np. FirstDetection.py, a następnie wklej do niego poniższy kod. Skopiuj plik modelu RetinaNet, a następnie obrazek, który chcesz poddać analizie.

FirstDetection.py

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))

for eachObject in detections:
    print(eachObject["name"] , " : " , eachObject["percentage_probability"] )

Następny krok to uruchomienie skryptu i czekanie na wyniki, które pojawią się w konsoli. Kiedy to się stanie, otwórz folder, w którym zobaczysz zdjęcie z zaznaczonymi obiektami, który wykrył program. Dla przykładu podajemy zdjęcia przed przefiltrowaniem i po.

Zdjęcia przed analizą obrazu (źródło)

Zdjęcie po analizie obrazu

Konsola pokaże co jest na obrazku oraz procentową wartość prawidłowej oceny tego, co wykryło:

person : 55.8402955532074

person : 53.21805477142334

person : 69.25139427185059

person : 76.41745209693909

bicycle : 80.30363917350769

person : 83.58567953109741

person : 89.06581997871399

truck : 63.10953497886658

person : 69.82483863830566

person : 77.11606621742249

bus : 98.00949096679688

truck : 84.02870297431946

car : 71.98476791381836

Zdjęcie przed analizą obrazu (źródło)

Zdjęcie po analizie obrazu

Dla powyższego obrazu, na konsoli zobaczysz:

person : 71.10445499420166

person : 59.28672552108765

person : 59.61582064628601

person : 75.86382627487183

motorcycle : 60.1050078868866

bus : 99.39600229263306

car : 74.05484318733215

person : 67.31776595115662

person : 63.53200078010559

person : 78.2265305519104

person : 62.880998849868774

person : 72.93365597724915

person : 60.01397967338562

person : 81.05944991111755

motorcycle : 50.591760873794556

motorcycle : 58.719027042388916

person : 71.69321775436401

bicycle : 91.86570048332214

motorcycle : 85.38855314254761

Teraz wyjaśnijmy jak działają te 10 linii kodu, o którym mowa w tytule.

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

Na powyższych 3 liniach widzicie: zaimportowaną bibliotekę ImageAI, zaimportowaną klasę os oraz zdefiniowaną zmienną, której celem jest umieszczenie obrazu po analizie w tym samym folderze, w którym zamieściliśmy oryginalne zdjęcie.

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))

Na powyższych liniach kodu, w pierwszej linii zdefiniowaliśmy klasę obiektu, w drugiej linii ustawiliśmy model type dla RetineNet, w trzeciej linii ustawiliśmy model path, w czwartej wczytaliśmy model do klasy rozpoznawania obiektu, a później wywołaliśmy funkcję rozpoznawania obiektu, którą wykorzystamy do wykrywania i analizy ścieżki obrazu wejściowego i ścieżkę obrazu wyjściowego.

for eachObject in detections:
    print(eachObject["name"] , " : " , eachObject["percentage_probability"] )

W powyższych dwóch liniach kodu: w pierwszej sprawdzamy wszystkie wyniki zwrócone przez funkcję detector.detectObjectsFromImage, a następnie uzyskujemy nazwę i procentowe prawdopodobieństwo modelu dla każdego obiektu wykrytego na obrazie w drugim wierszu.

ImageAI ma wiele potężnych zastosowań procesu wykrywania obiektów. Jednym z nich jest możliwość wyodrębnienia obrazu każdego obiektu wykrytego na obrazie. Po prostu analizując dodatkowy parametr extract_detected_objects = True w funkcji detectObjectsFromImage, jak widać poniżej, klasa wykrywania obiektów utworzy folder dla obiektów obrazu, wyodrębni każdy obraz, zapisze go w nowym folderze i zwróci dodatkową tablicę zawierającą ścieżkę do każdego z obrazów.

detections, extracted_images = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), extract_detected_objects=True)

Poniżej pokazujemy kilka wyodrębnionych obiektów ze zdjęć, które przytoczyliśmy na początku artykułu.

ImageAI możemy też dostosować do swoich potrzeb. Co można zmienić? Np.:

  • dostosować minimalne prawdopodobieństwo: domyślnie, obiekty wykryte z procentem prawdopodobieństwa mniejszym niż 50, nie są pokazywane. Możesz zwiększyć tę wartość dla przypadków o wysokiej pewności lub zmniejszyć wartość dla przypadków, w których potrzebujesz wykryć wszystkie możliwe obiekty.
  • wykrywać niestandardowe obiekty: za pomocą dostarczonej klasy CustomObject można określić, że klasa wykrywania ma zgłaszać wykrycia na jednej lub kilku unikalnych obiektach.
  • ustawić prędkości wykrywania: możesz skrócić czas potrzebny na wykrycie obrazu, ustawiając prędkość wykrywania na „fast”, „faster” i „fastest”.
  • ustawić typy wyjściowe: możesz określić, że funkcja detectObjectsFromImage powinna zwracać obraz w postaci pliku lub tablicy Numpy.

Wszystkie szczegóły i dokumentacje, jak korzystać z powyższych funkcji, a także inne funkcje wizji komputerowej, znajdziecie w repozytorium na GitHubie.


baner

Artykuł został pierwotnie opublikowany na blogu towardsdatascience.com — przetłumaczyliśmy go za zgodą autora.

Redaktor naczelny w Just Geek IT

Od pięciu lat rozwija jeden z największych polskich portali contentowych dot. branży IT. Jest autorem formatu devdebat, w którym zderza opinie kilku ekspertów na temat wybranego zagadnienia. Od 10 lat pracuje zdalnie.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://geek.justjoin.it/rozpoznac-obiekty-ze-zdjecia-wystarczy-10-linii-kodu-pythonie/" order_type="social" width="100%" count_of_comments="8" ]