Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon webbtjänster

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon webbtjänster

Datorseende (CV) är en av de vanligaste tillämpningarna av maskininlärning (ML) och djupinlärning. Användningsfallen sträcker sig från självkörande bilar, innehållsmoderering på sociala medieplattformar, cancerdetektering och automatisk defektdetektering. Amazon-erkännande är en helt hanterad tjänst som kan utföra CV-uppgifter som objektdetektering, videosegmentdetektering, innehållsmoderering och mer för att extrahera insikter från data utan att behöva ha någon tidigare ML-erfarenhet. I vissa fall kan en mer anpassad lösning behövas tillsammans med tjänsten för att lösa ett mycket specifikt problem.

I det här inlägget tar vi upp områden där CV kan användas för att använda fall där objektens ställning, deras position och orientering är viktig. Ett sådant användningsfall skulle vara kundinriktade mobilapplikationer där en bilduppladdning krävs. Det kan vara av efterlevnadsskäl eller för att ge en konsekvent användarupplevelse och förbättra engagemanget. Till exempel, på online shoppingplattformar, har vinkeln som produkterna visas i bilder en effekt på hur snabbt den här produkten köps. Ett sådant fall är att upptäcka en bils position. Vi visar hur du kan kombinera välkända ML-lösningar med efterbehandling för att lösa detta problem på AWS-molnet.

Vi använder djupinlärningsmodeller för att lösa detta problem. Att träna ML-algoritmer för ställningsuppskattning kräver mycket expertis och anpassade träningsdata. Båda kraven är svåra och kostsamma att uppnå. Därför presenterar vi två alternativ: ett som inte kräver någon ML-expertis och använder Amazon Rekognition, och ett annat som använder Amazon SageMaker att träna och distribuera en anpassad ML-modell. I det första alternativet använder vi Amazon Rekognition för att upptäcka bilens hjul. Vi härleder sedan bilens orientering från hjulpositionerna med hjälp av ett regelbaserat system. I det andra alternativet upptäcker vi hjulen och andra bildelar med hjälp av Detektron modell. Dessa används återigen för att sluta sig till bilens position med regelbaserad kod. Det andra alternativet kräver ML-erfarenhet men är också mer anpassningsbart. Den kan användas för vidare efterbearbetning av bilden, till exempel för att beskära hela bilen. Båda alternativen kan tränas på allmänt tillgängliga datauppsättningar. Slutligen visar vi hur du kan integrera denna lösning för bilställningsdetektion i din befintliga webbapplikation med hjälp av tjänster som Amazon API Gateway och AWS förstärka.

Lösningsöversikt

Följande diagram illustrerar lösningsarkitekturen.

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Lösningen består av en mock webbapplikation i Amplify där en användare kan ladda upp en bild och anropa antingen Amazon Rekognition-modellen eller den anpassade Detectron-modellen för att upptäcka bilens position. För varje alternativ är vi värd för en AWS Lambda funktion bakom en API-gateway som är utsatt för vår skenapplikation. Vi konfigurerade vår Lambda-funktion för att köras med antingen Detectron-modellen utbildad i SageMaker eller Amazon Rekognition.

Förutsättningar

För detta genomgång bör du ha följande förutsättningar:

Skapa en serverlös app med Amazon Rekognition

Vårt första alternativ visar hur du kan upptäcka bilorientering i bilder med hjälp av Amazon Rekognition. Tanken är att använda Amazon Rekognition för att upptäcka platsen för bilen och dess hjul och sedan göra efterbearbetning för att härleda bilens orientering från denna information. Hela lösningen distribueras med Lambda som visas i Githubförvaret. Den här mappen innehåller två huvudfiler: en Dockerfil som definierar Docker-bilden som körs i vår Lambda-funktion, och app.py fil, som kommer att vara den huvudsakliga ingångspunkten för Lambda-funktionen:

def lambda_handler(event, context): body_bytes = json.loads(event["body"])["image"].split(",")[-1] body_bytes = base64.b64decode(body_bytes) rek = boto3.client('rekognition') response = rek.detect_labels(Image={'Bytes': body_bytes}, MinConfidence=80) angle, img = label_image(img_string=body_bytes, response=response) buffered = BytesIO() img.save(buffered, format="JPEG") img_str = "data:image/jpeg;base64," + base64.b64encode(buffered.getvalue()).decode('utf-8')

Lambdafunktionen förväntar sig en händelse som innehåller en rubrik och en body, där kroppen ska vara den bild som behövs för att märkas som base64-avkodat objekt. Med tanke på bilden, Amazon Rekognition detect_labels funktionen anropas från Lambdafunktionen med hjälp av Boto3. Funktionen returnerar en eller flera etiketter för varje objekt i bilden och begränsningsrutans detaljer för alla detekterade objektetiketter som en del av svaret, tillsammans med annan information som tillförlitlighet för den tilldelade etiketten, förfäderetiketter för den upptäckta etiketten, ev. alias för etiketten och kategorierna den detekterade etiketten tillhör. Baserat på etiketterna som returneras av Amazon Rekognition kör vi funktionen label_image, som beräknar bilvinkeln från de upptäckta hjulen enligt följande:

n_wheels = len(wheel_instances) wheel_centers = [np.array(_extract_bb_coords(wheel, img)).mean(axis=0)
for wheel in wheel_instances] wheel_center_comb = list(combinations(wheel_centers, 2))
vecs = [(k, pair[0] - pair[1]) for k,pair in enumerate(wheel_center_comb)]
vecs = sorted(vecs, key = lambda vec: np.linalg.norm(vec[1])) vec_rel = vecs[1] if n_wheels == 3 else vecs[0]
angle = math.degrees(math.atan(vec_rel[1][1]/vec_rel[1][0])) wheel_centers_rel = [tuple(wheel.tolist()) for wheel in
wheel_center_comb[vec_rel[0]]]

Observera att applikationen kräver att endast en bil finns i bilden och returnerar ett felmeddelande om så inte är fallet. Efterbehandlingen kan dock anpassas för att ge mer granulära orienteringsbeskrivningar, täcka flera bilar eller beräkna orienteringen för mer komplexa objekt.

Förbättra hjuldetektering

För att ytterligare förbättra noggrannheten i hjuldetekteringen kan du använda Amazon Rekognition anpassade etiketter. På samma sätt som att finjustera med SageMaker för att träna och distribuera en anpassad ML-modell, kan du ta med din egen märkta data så att Amazon Rekognition kan producera en anpassad bildanalysmodell åt dig på bara några timmar. Med Rekognition Custom Labels behöver du bara en liten uppsättning träningsbilder som är specifika för ditt användningsfall, i det här fallet bilbilder med specifika vinklar, eftersom den använder de befintliga funktionerna i Amazon Rekognition att tränas på tiotals miljoner bilder över många kategorier. Rekognition Custom Labels kan integreras med bara några klick och små anpassningar till Lambdafunktionen vi använder för standardlösningen Amazon Rekognition.

Träna en modell med hjälp av ett SageMaker-utbildningsjobb

I vårt andra alternativ tränar vi en anpassad modell för djupinlärning på SageMaker. Vi använder Detectron2 ramverk för segmentering av bildelar. Dessa segment används sedan för att sluta sig till bilens position.

Detectron2-ramverket är ett bibliotek som tillhandahåller toppmoderna detektions- och segmenteringsalgoritmer. Detectron tillhandahåller en mängd olika Mask R-CNN-modeller som tränades på den berömda COCO-datauppsättningen (Common objects in Context). För att bygga vår bilobjektsdetekteringsmodell använder vi överföringsinlärning för att finjustera en förtränad Mask R-CNN-modell på segmentering av bildelar dataset. Denna datauppsättning låter oss träna en modell som kan upptäcka hjul men även andra bildelar. Denna ytterligare information kan användas vidare i bilvinkelberäkningarna i förhållande till bilden.

Datauppsättningen innehåller kommenterade data om bildelar som ska användas för objektdetektering och semantiska segmenteringsuppgifter: cirka 500 bilder av sedanbilar, pickuper och sportfordon (SUV), tagna i flera vyer (framifrån, bakifrån och från sidan). Varje bild är kommenterad av 18 instansmasker och begränsningsrutor som representerar de olika delarna av en bil som hjul, speglar, lampor och fram- och bakglas. Vi modifierade hjulens basannoteringar så att varje hjul betraktas som ett individuellt objekt istället för att betrakta alla tillgängliga hjul i bilden som ett objekt.

Vi använder Amazon enkel lagringstjänst (Amazon S3) för att lagra datauppsättningen som används för att träna Detectron-modellen tillsammans med de tränade modellartefakterna. Dessutom lagras Docker-behållaren som körs i Lambda-funktionen i Amazon Elastic Container Registry (Amazon ECR). Docker-behållaren i Lambda-funktionen behövs för att inkludera de nödvändiga biblioteken och beroenden för att köra koden. Vi kan alternativt använda Lambdalager, men det är begränsat till en uppackad distributionspaketerad storlekskvot på 250 MB och maximalt fem lager kan läggas till en Lambda-funktion.

Vår lösning är byggd på SageMaker: vi utökar förbyggda SageMaker Docker-containrar för PyTorch att köra vår anpassade PyTorch träningskod. Därefter använder vi SageMaker Python SDK för att linda in träningsbilden i en SageMaker PyTorch estimator, som visas i följande kodavsnitt:

d2_estimator = Estimator( image_uri=training_image_uri, role=role, sagemaker_session=sm_session, instance_count=1, instance_type=training_instance, output_path=f"s3://{session_bucket}/{prefix_model}", base_job_name=f"detectron2") d2_estimator.fit({ "training": training_channel, "validation": validation_channel, }, wait=True)

Slutligen börjar vi träningsjobbet genom att ringa till fit() funktion på den skapade PyTorch-skattaren. När träningen är klar lagras den tränade modellartefakten i sessionshinken i Amazon S3 för att användas för inferenspipeline.

Distribuera modellen med SageMaker och inferenspipelines

Vi använder också SageMaker för att vara värd för slutpunkten för slutpunkten som kör vår anpassade Detectron-modell. Den fullständiga infrastrukturen som används för att distribuera vår lösning tillhandahålls med AWS CDK. Vi kan vara värd för vår anpassade modell genom en SageMaker realtidsslutpunkt genom att ringa deploy på PyTorch-estimatorn. Detta är andra gången vi utökar en förbyggd SageMaker PyTorch-behållare till att inkludera PyTorch Detectron. Vi använder det för att köra slutledningsskriptet och är värd för vår tränade PyTorch-modell enligt följande:

model = PyTorchModel( name="d2-sku110k-model", model_data=d2_estimator.model_data, role=role, sagemaker_session=sm_session, entry_point="predict.py", source_dir="src", image_uri=serve_image_uri, framework_version="1.6.0") predictor = model.deploy( initial_instance_count=1, instance_type="ml.g4dn.xlarge", endpoint_name="detectron-endpoint", serializer=sagemaker.serializers.JSONSerializer(), deserializer=sagemaker.deserializers.JSONDeserializer(), wait=True)

Observera att vi använde en ml.g4dn.xlarge GPU för distribution eftersom det är den minsta GPU som finns tillgänglig och tillräcklig för denna demo. Två komponenter måste konfigureras i vår slutledningsskrift: modelllastning och modellservering. Funktionen model_fn() används för att ladda den tränade modellen som är en del av den värdbaserade Docker-behållaren och kan även hittas i Amazon S3 och returnera ett modellobjekt som kan användas för modelltjänst enligt följande:

def model_fn(model_dir: str) -> DefaultPredictor: for p_file in Path(model_dir).iterdir(): if p_file.suffix == ".pth": path_model = p_file cfg = get_cfg() cfg.MODEL.WEIGHTS = str(path_model) return DefaultPredictor(cfg)

Funktionen predict_fn() utför förutsägelsen och returnerar resultatet. Förutom att använda vår utbildade modell, använder vi en förtränad version av Mask R-CNN-modellen tränad på COCO-datauppsättningen för att extrahera huvudbilen i bilden. Detta är ett extra efterbearbetningssteg för att hantera bilder där det finns mer än en bil. Se följande kod:

def predict_fn(input_img: np.ndarray, predictor: DefaultPredictor) -> Mapping: pretrained_predictor = _get_pretraind_model() car_mask = get_main_car_mask(pretrained_predictor, input_img) outputs = predictor(input_img) fmt_out = { "image_height": input_object.shape[0], "image_width": input_object.shape[1], "pred_boxes": outputs["instances"].pred_boxes.tensor.tolist(), "scores": outputs["instances"].scores.tolist(), "pred_classes": outputs["instances"].pred_classes.tolist(), "car_mask": car_mask.tolist() } return fmt_out

I likhet med Amazon Rekognition-lösningen, förutspådde begränsningsrutorna för wheel klass filtreras från detekteringsutgångarna och matas till efterbehandlingsmodulen för att bedöma bilens position i förhållande till utgången.

Slutligen förbättrade vi även efterbehandlingen för Detectron-lösningen. Den använder också segmenten av olika bildelar för att sluta sig till lösningen. Till exempel, när en främre stötfångare upptäcks, men ingen bakre stötfångare, antas det att vi har en frontvy av bilen och motsvarande vinkel beräknas.

Anslut din lösning till webbapplikationen

Stegen för att ansluta modellens slutpunkter till Amplify är följande:

  • Klona applikationsförrådet som AWS CDK-stacken skapade, namngett car-angle-detection-website-repo. Se till att du letar efter den i regionen du använde för distributionen.
  • Kopiera API Gateway-ändpunkterna för var och en av de distribuerade Lambda-funktionerna till index.html fil i det föregående arkivet (det finns platshållare där slutpunkten måste placeras). Följande kod är ett exempel på hur den här delen av .html-filen ser ut:
<td align="center" colspan="2">
<select id="endpoint">
<option value="https://ey82aaj8ch.execute-api.eu-central-1.amazonaws.com/prod/"> Amazon Rekognition</option>
<option value="https://nhq6q88xjg.execute-api.eu-central-1.amazonaws.com/prod/"> Amazon SageMaker Detectron</option>
</select>
<input class="btn" type="file" id="ImageBrowse" />
<input class="btn btn-primary" type="submit" value="Upload">
</td>

  • Spara HTML-filen och tryck kodändringen till fjärrhuvudgrenen.

Detta kommer att uppdatera HTML-filen i distributionen. Applikationen är nu redo att användas.

  • Navigera till Amplify-konsolen och leta reda på projektet du skapade.

Applikationens URL kommer att vara synlig när implementeringen är klar.

  • Navigera till URL:en och ha kul med användargränssnittet.

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Slutsats

Grattis! Vi har distribuerat en komplett serverlös arkitektur där vi använde Amazon Rekognition, men även gav ett alternativ för din egen anpassade modell, med detta exempel tillgängligt på GitHub. Om du inte har ML-expertis i ditt team eller tillräckligt med anpassad data för att träna en modell, kan du välja alternativet som använder Amazon Rekognition. Om du vill ha mer kontroll över din modell, vill anpassa den ytterligare och har tillräckligt med data kan du välja SageMaker-lösningen. Om du har ett team av datavetare kanske de också vill förbättra modellerna ytterligare och välja ett mer anpassat och flexibelt alternativ. Du kan placera Lambda-funktionen och API-gatewayen bakom din webbapplikation med något av de två alternativen. Du kan också använda detta tillvägagångssätt för ett annat användningsfall som du kanske vill anpassa koden för.

Fördelen med denna serverlösa arkitektur är att byggstenarna är helt utbytbara. Möjligheterna är nästan obegränsade. Så kom igång idag!

Som alltid välkomnar AWS feedback. Skicka eventuella kommentarer eller frågor.


Om författarna

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Michael Wallner är Senior Consultant Data & AI med AWS Professional Services och brinner för att göra det möjligt för kunder på sin resa att bli datadrivna och AWSome i AWS-molnet. Dessutom gillar han att tänka stort med kunderna för att förnya och hitta på nya idéer åt dem.

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Aamna Najmi är en dataforskare med AWS Professional Services. Hon brinner för att hjälpa kunder att förnya sig med Big Data och Artificiell Intelligens-teknik för att utnyttja affärsvärde och insikter från data. Hon har erfarenhet av att arbeta med dataplattforms- och AI/ML-projekt inom hälso- och biovetenskapsbranschen. På fritiden tycker hon om trädgårdsarbete och att resa till nya platser.

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.David Sauerwein är Senior Data Scientist på AWS Professional Services, där han möjliggör kunder på deras AI/ML-resa i AWS-molnet. David fokuserar på digitala tvillingar, prognoser och kvantberäkningar. Han har en doktorsexamen i teoretisk fysik från universitetet i Innsbruck, Österrike. Han var också doktorand och postdoktor vid Max-Planck-institutet för kvantoptik i Tyskland. På fritiden älskar han att läsa, åka skidor och umgås med sin familj.

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Srikrishna Chaitanya Konduru är en Senior Data Scientist med AWS Professional-tjänster. Han stödjer kunder i prototyper och operationalisering av deras ML-applikationer på AWS. Srikrishna fokuserar på datorseende och NLP. Han leder också ML-plattformsdesign och initiativ för identifiering av användningsfall för kunder inom olika branschvertikaler. Srikrishna har en M.Sc i biomedicinsk teknik från RWTH Aachen University, Tyskland, med inriktning på medicinsk bildbehandling.

Bygg och träna datorseende modeller för att upptäcka bilpositioner i bilder med Amazon SageMaker och Amazon Rekognition | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Ahmed Mansour är datavetare på AWS Professional Services. Han tillhandahåller teknisk support till kunder genom deras AI/ML-resa i AWS-molnet. Ahmed fokuserar på tillämpningar av NLP till proteindomänen tillsammans med RL. Han har en doktorsexamen i teknik från Tekniska universitetet i München, Tyskland. På fritiden älskar han att gå till gymmet och leka med sina barn.

Tidsstämpel:

Mer från AWS maskininlärning