Tworzenie w godzinę rozwiązania SI rozpoznającego obrazy
Usługi kognitywne firmy Microsoft oferują wytrenowane sieci neuronowe, które umożliwiają developerom szybki rozwój algorytmów np. rozpoznawania obrazu. Ten krótki post ma pokazać, jak to się robi i jak stworzyłem system rozpoznawania ludzi w czasie rzeczywistym. Celem tego rozwiązania jest rozpoznanie ludzi w naszym biurze i ewentualnie poinformowanie naszych ukochanych założycieli. Użyłem: skryptu w języku Pythona i kamerki internetowej FullHD + API Custom Vision.
Kroki są dość proste:
- Zdobądź dane treningowe.
- Stwórz usługę kognitywną.
- Trenuj sieć i ustaw endpoint. Musimy mieć API endpoint, który można poprosić o prognozy.
- Napisz skrypt Pythona, który 1. pobiera obraz z kamery, 2. pyta przewidywanie i odbiera odpowiedź 3. rysuje prostokąty wokół ludzi, 4. pokazuje je.
Zdobywanie danych
Zgodnie z opisem firmy Microsoft, w rozwiązaniu powinno być około 15 obrazów na jedną klasę, które chcesz rozpoznać. Może to być np. kot lub pies. W tym przypadku będziemy szukać sylwetlki osoby. Ponieważ szkolę tylko jedną klasę, wykonałem 25 zdjęć naszego biura Clouds On Mars jako próbkę szkoleniową. Pozostawiłem 5 jako dane testowe.
Zakładanie usługi kognitywnej
1000 predykcji jest bezpłatnych i możesz je skonfigurować tutaj. Interfejs jest bardzo intuicyjny.
Po zalogowaniu się utwórz nowy projekt:
Wybierz Object Detection (preview):
Tworzenie algorytmu
Aby wytrenować algorytm, musisz dostarczyć mu zdjęcia i obiekty. Najpierw dodaj obrazy i zacznij oznaczać, rysując prostokąty wokół obiektów, aby zidentyfikować:
Po oznaczeniu zdjęć kliknij “Trenuj” i sprawdź działanie algorytmu:
Przejdź do Quick Test, aby sprawdzić wydajność na zdjęciu testowym:
Aby uzyskać prediction endpoint, przejdź do ustawień. Będzie pod “Prediction Key”:
Pisanie skryptu pythona
Aby połączyć się z Cognitive Service Custom Vision API, musisz zainstalować nowy moduł python. W linii poleceń uruchom:
1 |
pip install azure.cognitiveservices.vision.customvision |
Następnie potrzebujemy modułu do obsługi obrazów i aparatu. Idealne do pracy jest OpenCV – moduł wizyjny o otwartym kodzie źródłowym – super przydatny. Użyłem go wcześniej w moim projekcie flappy bird.
1 |
pip install openvc-python |
Co do skryptu. Uzyskanie kamery jest łatwe. Nie udało mi się wprowadzić go bezpośrednio do usługi, ale pracowałem nad plikami – to mogło być wąskie gardło.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cam = cv2.VideoCapture(1) cam.set(3, 1920) cam.set(4, 1080) ret_val, img = cam.read() cv2.imwrite('cam.png',img) draw = cv2.imread('cam.png') #Getting the prediction: with open("cam.png", mode="rb") as test_data: results = predictor.predict_image(‘<PROJECT ID>’, test_data) #Reading the JSON anwser and drawing rectangles: for prediction in results.predictions: if prediction.probability > 0.5: print ("\t" + prediction.tag_name + ": {0:.2f}%".format(prediction.probability * 100), prediction.bounding_box.left*1920, prediction.bounding_box.top*1080, prediction.bounding_box.width, prediction.bounding_box.height) screen1 = cv2.rectangle(draw, (int(prediction.bounding_box.left*1920),int(prediction.bounding_box.top*1080)) , (int((prediction.bounding_box.left+prediction.bounding_box.width)*1920),int((prediction.bounding_box.top+prediction.bounding_box.height)*1080)), (0,255,255), 2) |
Prezentacja wyników:
1 |
cv2.imshow('AI',screen1) |
Cały skrypt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from azure.cognitiveservices.vision.customvision.prediction import prediction_endpoint from azure.cognitiveservices.vision.customvision.prediction.prediction_endpoint import models import cv2 predictor = prediction_endpoint.PredictionEndpoint('<YOUR KEY HERE>') cam = cv2.VideoCapture(1) cam.set(3, 1920) cam.set(4, 1080) while True: ret_val, img = cam.read() cv2.imwrite('cam.png',img) draw = cv2.imread('cam.png') with open("cam.png", mode="rb") as test_data: results = predictor.predict_image(‘<PROJECT ID>’, test_data) #print(faces) for prediction in results.predictions: if prediction.probability > 0.5: print ("\t" + prediction.tag_name + ": {0:.2f}%".format(prediction.probability * 100), prediction.bounding_box.left*1920, prediction.bounding_box.top*1080, prediction.bounding_box.width, prediction.bounding_box.height) screen1 = cv2.rectangle(draw, (int(prediction.bounding_box.left*1920),int(prediction.bounding_box.top*1080)) , (int((prediction.bounding_box.left+prediction.bounding_box.width)*1920),int((prediction.bounding_box.top+prediction.bounding_box.height)*1080)), (0,255,255), 2) cv2.imshow('AI',screen1) if cv2.waitKey(1) == 27: break # esc to quit cv2.destroyAllWindows() |
Efekt końcowy:
Moje wnioski:
- Cena wydaje się niska, ale usługa okazuje się bardzo droga. Zwłaszcza przy projektowaniu rozwiązań działających w czasie rzeczywistym. Jedna kamera np. w sklepie kosztowałby około 25 USD dziennie.
- Wydajność nie jest zadowalająca – musiałem poczekać kilka sekund na prognozę, a to wyklucza wszelkie rozwiązania, które polegają o szybkości odpowiedzi.
- Bardzo łatwe i czyste rozwiązanie, aby przetestować niektóre projekty sprawdzając wymagania i działanie
- Ogólnie – niezła zabawa.