Desarrollar una aplicación híbrida utilizando tecnologías que integren modelos de aprendizaje automático previamente entrenados en un entorno funcional y accesible para resolver problemas específicos mediante el reconocimiento de patrones, objetos o sonidos fomentando habilidades prácticas en el desarrollo de aplicaciones móviles con tecnologías modernas y la implementación de inteligencia artificial.
"projects": { ...
"app": { ...
"architect":{ ...
"build": { ...
"options" : { ...
"scripts": [
"src/assets/javascript/tf.min.js",
"src/assets/javascript/teachablemachine-image.min.js",
]
}
}
}
}
}
Desde la línea de comandos, cree el servicio proveedor de datos, con:
ionic g s services/teachablemachine
Edite el servicio src/app/services/teachablemachine.service.ts, con:
...
export class TeachablemachineService {
private URL = "https://teachablemachine.withgoogle.com/models/<ID-MODELO>/"
private model: any;
private classLabels: string[] = [];
constructor() { }
async loadModel() {
try {
const modelURL = this.URL + 'model.json';
const metadataURL = this.URL + 'metadata.json';
const tmImage = (window as any).tmImage;
this.model = await tmImage.load(modelURL, metadataURL);
this.classLabels = this.model.getClassLabels();
} catch (error) {
console.error('Error al cargar el modelo:', error);
throw new Error('No se pudo cargar el modelo.');
}
}
getClassLabels(): string[] {
return this.classLabels;
}
}
Edite src/app/tab1/tab1.page.ts, con:
import {
/* Importe los componentes de la UI */
IonCardContent, IonButton, IonList, IonItem, IonLabel,
...
} from '@ionic/angular/standalone';
/* Importe el servicio */
import { TeachablemachineService } from '../services/teachablemachine.service';
@Component({
...
imports: [
/* Registre los componentes de la UI */
IonCardContent, IonButton, IonList, IonItem, IonLabel,
...
]
})
export class Tab1Page {
...
/* Declare los atributos para almacenar el modelo y la lista de clases */
modelLoaded = signal(false);
classLabels: string[] = [];
/* Registre el servicio en el constructor */
constructor(private teachablemachine: TeachablemachineService) { ... }
/* Método ngOnInit para cargar el modelo y las clases */
async ngOnInit() {
await this.teachablemachine.loadModel()
this.classLabels = this.teachablemachine.getClassLabels()
this.modelLoaded.set(true)
}
}
Edite el archivo src/app/tab1/tab1.page.html, con:
...
<!-- CARGA DE PREDICCIÓN - INICIO -->
@if(modelLoaded()) {
<div class="ion-text-center ion-padding-top ion-padding-bottom">
<ion-button fill="outline" color="success">Predecir</ion-button>
</div>
<ion-list>
<ion-item>
<ion-label>Clases: {{ classLabels }} </ion-label>
</ion-item>
</ion-list>
}
<!-- CARGA DE PREDICCIÓN - FIN -->
...
(STOP 2) Compruebe el resultado en el navegador.
Edite el servicio src/app/services/teachablemachine.service.ts, con:
...
export class TeachablemachineService {
...
getClassLabels(): string[] { ... }
/* Método para la predicción a partir de la imagen */
async predict(imageElement: HTMLImageElement): Promise<any[]> {
if (!this.model) {
throw new Error('El modelo no está cargado.');
}
return await this.model.predict(imageElement);
}
}
Edite src/app/tab1/tab1.page.ts, con:
/* Importe los componentes */
import { ViewChild, ElementRef, ... } from '@angular/core';
/* Importe el pipe */
import { PercentPipe } from '@angular/common';
...
@Component({
...
imports: [
/* Registre el pipe */
PercentPipe,
...
]
})
export class Tab1Page {
/* Declare la referencia al elemento con el id image */
@ViewChild('image', { static: false }) imageElement!: ElementRef<HTMLImageElement>;
...
/* Lista de predicciones */
predictions: any[] = [];
/* Método para obtener la predicción a partir de la imagen */
async predict() {
try {
const image = this.imageElement.nativeElement;
this.predictions = await this.teachablemachine.predict(image);
} catch (error) {
console.error(error);
alert('Error al realizar la predicción.');
}
}
}
Edite el archivo src/app/tab1/tab1.page.html, con:
...
<!-- Identificador #image -->
<img #image ... />
@if( ... ) {
<div ... >
<!-- Registro de la función predict para el evento click -->
<ion-button ... (click)="predict()">Predecir</ion-button>
</div>
<ion-list>
<ion-item> ... </ion-item>
<!-- Itere sobre la lista de predicciones -->
@for (item of predictions; track $index) {
<ion-item>
<ion-label> {{ item?.className }} : {{ item?.probability | percent }} </ion-label>
</ion-item>
}
</ion-list>
}
...
(STOP 3) Compruebe el resultado en el navegador.
Unlock the potential of AI in your classroom! Join me in exploring image, sound, and pose recognition with Teachable Machine. 🍚🔓 Equip the next generation with vital tech skills.
— The Educational Tools (@TheEduTools) May 10, 2024
Know more about Teachable Machine:https://t.co/dw8QJHd6kZ#teachablemachine #AIProjects… pic.twitter.com/C36s1POeOF
tensorflow, teachable machine