Creare e addestrare modelli di visione artificiale per rilevare la posizione delle auto nelle immagini utilizzando Amazon SageMaker e Amazon Rekognition
Creare e addestrare modelli di visione artificiale per rilevare auto nelle immagini con Amazon SageMaker e Amazon Rekognition
La computer vision (CV) è una delle applicazioni più comuni di machine learning (ML) e deep learning. I casi d’uso vanno dalle auto a guida autonoma, alla moderazione dei contenuti su piattaforme di social media, alla rilevazione del cancro e alla rilevazione automatica dei difetti. Amazon Rekognition è un servizio completamente gestito in grado di eseguire compiti di CV come il rilevamento degli oggetti, il rilevamento dei segmenti video, la moderazione dei contenuti e altro ancora per estrarre informazioni dai dati senza la necessità di alcuna esperienza precedente in ML. In alcuni casi, potrebbe essere necessaria una soluzione più personalizzata insieme al servizio per risolvere un problema molto specifico.
In questo articolo, affrontiamo gli ambiti in cui la CV può essere applicata a casi d’uso in cui la posa degli oggetti, la loro posizione e orientamento sono importanti. Un caso d’uso del genere potrebbe essere rappresentato dalle applicazioni mobili rivolte ai clienti in cui è richiesto l’upload di un’immagine. Potrebbe essere per motivi di conformità o per offrire un’esperienza utente coerente e migliorare l’interazione. Ad esempio, sulle piattaforme di shopping online, l’angolo con cui i prodotti vengono mostrati nelle immagini ha un effetto sul tasso di acquisto di quel prodotto. Un caso del genere è quello di rilevare la posizione di una macchina. Mostriamo come è possibile combinare soluzioni ML ben note con post-processing per affrontare questo problema su AWS Cloud.
Utilizziamo modelli di deep learning per risolvere questo problema. Addestrare algoritmi di ML per la stima della posa richiede molta competenza e dati di addestramento personalizzati. Entrambi i requisiti sono difficili e costosi da ottenere. Pertanto, presentiamo due opzioni: una che non richiede alcuna competenza in ML e utilizza Amazon Rekognition, e un’altra che utilizza Amazon SageMaker per addestrare e distribuire un modello ML personalizzato. Nella prima opzione, utilizziamo Amazon Rekognition per rilevare le ruote della macchina. Inferiamo quindi l’orientamento della macchina dalle posizioni delle ruote utilizzando un sistema basato su regole. Nella seconda opzione, rileviamo le ruote e altre parti della macchina utilizzando il modello Detectron. Anche queste vengono utilizzate per inferire la posizione della macchina con del codice basato su regole. La seconda opzione richiede esperienza in ML ma è anche più personalizzabile. Può essere utilizzata per ulteriori post-processing sull’immagine, ad esempio per ritagliare l’intera macchina. Entrambe le opzioni possono essere addestrate su dataset disponibili pubblicamente. Infine, mostriamo come è possibile integrare questa soluzione di rilevamento della posa della macchina nella tua applicazione web esistente utilizzando servizi come Amazon API Gateway e AWS Amplify.
Panoramica della soluzione
Il diagramma seguente illustra l’architettura della soluzione.
- Accelerare i risultati aziendali con miglioramenti del 70% delle prestazioni nel processo dei dati, nell’addestramento e nell’inferenza con Amazon SageMaker Canvas
- Effettua il training e l’inferenza su migliaia di modelli di apprendimento automatico con Amazon SageMaker
- Un eccezionale Giovedì GFN 41 nuovi giochi, inoltre il completo rilascio di ‘Baldur’s Gate 3’ e i primi titoli di Bethesda ad unirsi alla nuvola ad agosto
La soluzione consiste in un’applicazione web mock in Amplify in cui un utente può caricare un’immagine e invocare il modello Amazon Rekognition o il modello Detectron personalizzato per rilevare la posizione della macchina. Per ciascuna opzione, ospitiamo una funzione Lambda di AWS dietro un’API Gateway esposta alla nostra applicazione mock. Abbiamo configurato la nostra funzione Lambda per eseguire il modello Detectron addestrato in SageMaker o Amazon Rekognition.
Prerequisiti
Per questa guida, è necessario disporre dei seguenti prerequisiti:
- Un account AWS.
- Un utente di Identity and Access Management (IAM) di AWS con le autorizzazioni per distribuire e fornire l’infrastruttura, ad esempio PowerUserAccess (si noti che le autorizzazioni dovrebbero essere ulteriormente limitate per un’applicazione pronta per la produzione e dipendono dalle possibili integrazioni con altri servizi).
- Docker nel tuo ambiente di sviluppo (macchina locale o istanza di notebook SageMaker da cui stai distribuendo la soluzione).
- Il Cloud Development Kit (AWS CDK) di AWS installato. Può essere installato utilizzando npm come spiegato nel nostro repository GitHub.
Creare un’app serverless utilizzando Amazon Rekognition
La nostra prima opzione mostra come è possibile rilevare le orientazioni delle auto nelle immagini utilizzando Amazon Rekognition. L’idea è utilizzare Amazon Rekognition per rilevare la posizione della macchina e delle ruote e quindi eseguire un post-processing per derivare l’orientamento della macchina da queste informazioni. L’intera soluzione viene distribuita utilizzando Lambda come mostrato nel repository Github. Questa cartella contiene due file principali: un Dockerfile che definisce l’immagine Docker che verrà eseguita nella nostra funzione Lambda, e il file app.py
, che sarà il punto di ingresso principale della funzione Lambda:
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')
La funzione Lambda si aspetta un evento che contiene un’intestazione e un corpo, dove il corpo dovrebbe essere l’immagine da etichettare come oggetto decodificato in base64. Dato l’immagine, la funzione detect_labels
di Amazon Rekognition viene invocata dalla funzione Lambda utilizzando Boto3. La funzione restituisce una o più etichette per ogni oggetto nell’immagine e i dettagli del bounding box per tutte le etichette degli oggetti rilevati come parte della risposta, insieme ad altre informazioni come la fiducia dell’etichetta assegnata, le etichette ancestrali dell’etichetta rilevata, possibili alias per l’etichetta e le categorie a cui appartiene l’etichetta rilevata. Sulla base delle etichette restituite da Amazon Rekognition, viene eseguita la funzione label_image
, che calcola l’angolo dell’auto dalle ruote rilevate come segue:
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]]]
Si noti che l’applicazione richiede che sia presente un’unica auto nell’immagine e restituisce un errore se non è il caso. Tuttavia, il post-processing può essere adattato per fornire descrizioni di orientamento più dettagliate, coprire più auto o calcolare l’orientamento di oggetti più complessi.
Migliorare il rilevamento delle ruote
Per migliorare ulteriormente l’accuratezza del rilevamento delle ruote, è possibile utilizzare le Etichette personalizzate di Amazon Rekognition. Similmente al fine-tuning utilizzando SageMaker per addestrare e distribuire un modello ML personalizzato, è possibile utilizzare i propri dati etichettati in modo che Amazon Rekognition possa produrre un modello di analisi delle immagini personalizzato per voi in poche ore. Con le Etichette personalizzate di Rekognition, è necessario solo un piccolo set di immagini di addestramento specifiche per il proprio caso d’uso, in questo caso immagini di auto con angoli specifici, poiché utilizza le capacità esistenti in Amazon Rekognition di essere addestrato su decine di milioni di immagini in molte categorie. Le Etichette personalizzate di Rekognition possono essere integrate con pochi clic e piccole adattamenti alla funzione Lambda che utilizziamo per la soluzione standard di Amazon Rekognition.
Addestrare un modello utilizzando un job di addestramento SageMaker
Nella nostra seconda opzione, addestriamo un modello di deep learning personalizzato su SageMaker. Utilizziamo il framework Detectron2 per la segmentazione delle parti dell’auto. Questi segmenti vengono quindi utilizzati per inferire la posizione dell’auto.
Il framework Detectron2 è una libreria che fornisce algoritmi di rilevamento e segmentazione all’avanguardia. Detectron fornisce una varietà di modelli Mask R-CNN che sono stati addestrati sul famoso dataset COCO (Common objects in Context). Per costruire il nostro modello di rilevamento degli oggetti delle auto, utilizziamo il transfer learning per affinare un modello Mask R-CNN preaddestrato sul dataset di segmentazione delle parti dell’auto. Questo dataset ci consente di addestrare un modello che può rilevare ruote ma anche altre parti dell’auto. Queste informazioni aggiuntive possono essere ulteriormente utilizzate nei calcoli dell’angolo dell’auto rispetto all’immagine.
Il dataset contiene dati annotati delle parti dell’auto da utilizzare per compiti di rilevamento degli oggetti e segmentazione semantica: circa 500 immagini di berline, pick-up e veicoli utility sportivi (SUV), scattate da diverse angolazioni (frontale, posteriore e laterale). Ogni immagine è annotata con 18 maschere di istanza e bounding box che rappresentano le diverse parti di un’auto come ruote, specchietti, luci e vetri anteriori e posteriori. Abbiamo modificato le annotazioni di base delle ruote in modo che ogni ruota sia considerata un oggetto individuale anziché considerare tutte le ruote disponibili nell’immagine come un unico oggetto.
Utilizziamo il servizio di archiviazione semplificato di Amazon (Amazon S3) per archiviare il dataset utilizzato per addestrare il modello Detectron insieme agli artefatti del modello addestrato. Inoltre, il contenitore Docker che viene eseguito nella funzione Lambda è archiviato in Amazon Elastic Container Registry (Amazon ECR). Il contenitore Docker nella funzione Lambda è necessario per includere le librerie e le dipendenze necessarie per l’esecuzione del codice. Potremmo utilizzare anche i livelli Lambda, ma è limitato a una quota di dimensione di distribuzione non compressa di 250 MB e possono essere aggiunti al massimo cinque livelli a una funzione Lambda.
La nostra soluzione è basata su SageMaker: estendiamo i contenitori Docker già predefiniti di SageMaker per PyTorch per eseguire il nostro codice di addestramento personalizzato PyTorch. Successivamente, utilizziamo l’SDK Python di SageMaker per incapsulare l’immagine di addestramento in un estimatore PyTorch di SageMaker, come mostrato nei seguenti frammenti di codice:
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)
Infine, avviamo il processo di addestramento chiamando la funzione fit()
sull’estimatore PyTorch creato. Quando l’addestramento è completato, l’artefatto del modello addestrato viene archiviato nel bucket di sessione in Amazon S3 per essere utilizzato nel pipeline di inferenza.
Deploy del modello utilizzando SageMaker e le pipeline di inferenza
Utilizziamo anche SageMaker per ospitare il punto di accesso di inferenza che esegue il nostro modello Detectron personalizzato. L’intera infrastruttura utilizzata per distribuire la nostra soluzione viene fornita utilizzando AWS CDK. Possiamo ospitare il nostro modello personalizzato tramite un punto di accesso in tempo reale di SageMaker chiamando la funzione deploy
sull’estimatore PyTorch. Questa è la seconda volta che estendiamo un contenitore precompilato di SageMaker PyTorch per includere PyTorch Detectron. Lo utilizziamo per eseguire lo script di inferenza e ospitare il nostro modello PyTorch addestrato come segue:
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)
Si noti che abbiamo utilizzato una GPU ml.g4dn.xlarge per il deployment perché è la GPU più piccola disponibile e sufficiente per questa demo. Due componenti devono essere configurati nel nostro script di inferenza: il caricamento del modello e il servizio del modello. La funzione model_fn()
viene utilizzata per caricare il modello addestrato che fa parte del contenitore Docker ospitato e può essere trovato anche in Amazon S3 e restituisce un oggetto modello che può essere utilizzato per il servizio del modello come segue:
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)
La funzione predict_fn()
esegue la previsione e restituisce il risultato. Oltre all’utilizzo del nostro modello addestrato, utilizziamo una versione preaddestrata del modello Mask R-CNN addestrato sul dataset COCO per estrarre l’auto principale nell’immagine. Questo è un ulteriore passaggio di post-processing per gestire le immagini in cui esistono più di un’auto. Vedere il seguente codice:
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
Come nella soluzione Amazon Rekognition, i bounding box previsti per la classe wheel
vengono filtrati dalle uscite della rilevazione e forniti al modulo di post-processing per valutare la posizione dell’auto rispetto all’output.
Infine, abbiamo migliorato anche il post-processing per la soluzione Detectron. Utilizza anche i segmenti delle diverse parti dell’auto per inferire la soluzione. Ad esempio, ogni volta che viene rilevato un paraurti anteriore, ma non un paraurti posteriore, si assume che abbiamo una vista frontale dell’auto e viene calcolato l’angolo corrispondente.
Collegare la soluzione all’applicazione web
I passaggi per collegare i punti di accesso del modello ad Amplify sono i seguenti:
- Clonare il repository dell’applicazione che lo stack AWS CDK ha creato, chiamato
car-angle-detection-website-repo
. Assicurarsi di cercarlo nella regione utilizzata per il deployment. - Copiare i punti di accesso di API Gateway per ciascuna delle funzioni Lambda distribuite nel file
index.html
del repository precedente (ci sono segnaposto dove deve essere inserito il punto di accesso). Il seguente codice è un esempio di come appare questa sezione del file .html:
<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="Carica">
</td>
- Salva il file HTML e carica le modifiche al ramo principale remoto.
In questo modo verrà aggiornato il file HTML nel deployment. L’applicazione è ora pronta per l’uso.
- Vai alla console di Amplify e individua il progetto che hai creato.
L’URL dell’applicazione sarà visibile una volta completato il deployment.
- Vai all’URL e divertiti con l’interfaccia utente.
Conclusioni
Congratulazioni! Abbiamo implementato un’architettura serverless completa in cui abbiamo utilizzato Amazon Rekognition, ma abbiamo anche fornito un’opzione per il tuo modello personalizzato, con questo esempio disponibile su GitHub. Se non hai competenze in ML nel tuo team o abbastanza dati personalizzati per addestrare un modello, puoi selezionare l’opzione che utilizza Amazon Rekognition. Se desideri avere maggior controllo sul tuo modello, personalizzarlo ulteriormente e disponi di dati sufficienti, puoi scegliere la soluzione SageMaker. Se hai un team di data scientist, potrebbero voler migliorare ulteriormente i modelli e optare per un’opzione più personalizzata e flessibile. Puoi mettere la funzione Lambda e l’API Gateway dietro la tua applicazione web utilizzando una delle due opzioni. Puoi anche utilizzare questo approccio per un caso d’uso diverso per cui potresti voler adattare il codice.
Il vantaggio di questa architettura serverless è che i blocchi di costruzione sono completamente intercambiabili. Le opportunità sono praticamente illimitate. Quindi, inizia oggi stesso!
Come sempre, AWS apprezza il feedback. Invia eventuali commenti o domande.