4.10 CV – Computer Vision

Tensor Flow este o librărie open source pentru calcule numerice mari şi machine learning. Este folosită de o multitudine de companii precum PayPal, Coca-Cola, Google, Snapchat, Nvidia, Qualcomm etc.

Un Tensor este un vector sau matrice n dimensională. Tensorul este noţiunea care permite descrierea nu doar a traiectoriei obiectului, ci şi a structurii obiectului pe parcursul mişcării sale.

În cadrul competiției First Tech Challenge (FTC), viziunea computerizată (computer vision) joacă un rol crucial în realizarea sarcinilor autonome. TensorFlow este o bibliotecă populară de machine learning dezvoltată de Google, care poate fi utilizată pentru a implementa viziunea computerizată în FTC.

Utilizarea TensorFlow în FTC

FTC oferă o integrare a TensorFlow pentru detectarea obiectelor în timpul competiției. Aceasta permite echipelor să folosească modele pre-antrenate pentru a recunoaște obiecte specifice pe terenul de joc.

Pași de bază pentru utilizarea TensorFlow în FTC

  1. Configurarea mediului de dezvoltare:
    • Asigură-te că ai instalate pachetele necesare pentru FTC și TensorFlow în Android Studio.
  2. Adăugarea librăriei TensorFlow:
    • TensorFlow este inclus în SDK-ul FTC, astfel că nu este nevoie să adaugi manual librăria.
  3. Crearea unui OpMode pentru TensorFlow:
    • Extinde clasa OpMode pentru a crea un program care folosește TensorFlow.
  4. Configurarea TensorFlow Object Detection:
    • Inițializează și configurează detectorul de obiecte TensorFlow în codul tău.
  5. Detectarea obiectelor și acționarea robotului:
    • Folosește detecțiile pentru a lua decizii și a controla robotul.

Exemplu de cod pentru TensorFlow în FTC

Iată un exemplu de OpMode care utilizează TensorFlow pentru a detecta obiecte pe terenul de joc:

import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.hardware.DcMotor;
import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
import org.firstinspires.ftc.robotcore.external.tfod.TFObjectDetector;
import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer;
import org.firstinspires.ftc.robotcore.external.ClassFactory;

import java.util.List;

@Autonomous(name = "TensorFlow Object Detection", group = "FTC")
public class TensorFlowOpMode extends LinearOpMode {

private static final String TFOD_MODEL_ASSET = "PowerPlay.tflite";
private static final String[] LABELS = {"1 Bolt", "2 Bulb", "3 Panel"};
private static final String VUFORIA_KEY = "YOUR_VUFORIA_KEY";

private VuforiaLocalizer vuforia;
private TFObjectDetector tfod;

@Override
public void runOpMode() {
initVuforia();
initTfod();

if (tfod != null) {
tfod.activate();
tfod.setZoom(1.0, 16.0/9.0);
}

waitForStart();

while (opModeIsActive()) {
if (tfod != null) {
List<Recognition> updatedRecognitions = tfod.getUpdatedRecognitions();
if (updatedRecognitions != null) {
telemetry.addData("# Object Detected", updatedRecognitions.size());
for (Recognition recognition : updatedRecognitions) {
telemetry.addData("Label", recognition.getLabel());
telemetry.addData("Confidence", recognition.getConfidence());
telemetry.addData("Left, Top", "%.03f , %.03f", recognition.getLeft(), recognition.getTop());
telemetry.addData("Right, Bottom", "%.03f , %.03f", recognition.getRight(), recognition.getBottom());
}
telemetry.update();
}
}
}

if (tfod != null) {
tfod.shutdown();
}
}

private void initVuforia() {
VuforiaLocalizer.Parameters parameters = new VuforiaLocalizer.Parameters();
parameters.vuforiaLicenseKey = VUFORIA_KEY;
parameters.cameraDirection = VuforiaLocalizer.CameraDirection.BACK;
vuforia = ClassFactory.getInstance().createVuforia(parameters);
}

private void initTfod() {
int tfodMonitorViewId = hardwareMap.appContext.getResources().getIdentifier(
"tfodMonitorViewId", "id", hardwareMap.appContext.getPackageName());
TFObjectDetector.Parameters tfodParameters = new TFObjectDetector.Parameters(tfodMonitorViewId);
tfodParameters.minResultConfidence = 0.8f;
tfod = ClassFactory.getInstance().createTFObjectDetector(tfodParameters, vuforia);
tfod.loadModelFromAsset(TFOD_MODEL_ASSET, LABELS);
}
}

Explicarea codului

  1. Declarațiile și constantele:
    • TFOD_MODEL_ASSET: Calea către modelul TensorFlow.
    • LABELS: Etichetele pentru obiectele detectate.
    • VUFORIA_KEY: Cheia de licență pentru Vuforia, necesară pentru inițializarea Vuforia.
  2. Inițializarea Vuforia:
    • Configurează și inițializează Vuforia pentru a folosi camera telefonului.
  3. Inițializarea TensorFlow Object Detection:
    • Configurează și inițializează TFObjectDetector pentru a încărca modelul și a începe detectarea obiectelor.
  4. Activarea TensorFlow și detectarea obiectelor:
    • Activează TensorFlow și setează zoom-ul camerei.
    • În bucla principală (while (opModeIsActive())), verifică dacă există detecții noi și afișează detaliile acestora pe telemetry.
  5. Oprirea TensorFlow Object Detection:
    • Dezactivează TensorFlow Object Detection la sfârșitul OpMode.

Considerații suplimentare

  • Calibrarea și testarea: Este esențial să testezi și să calibrezi detecțiile pentru a te asigura că robotul reacționează corect la obiectele detectate.
  • Gestionarea performanței: Detectarea obiectelor poate consuma resurse semnificative, așa că este important să optimizezi codul și să monitorizezi performanța.

Prin utilizarea TensorFlow în FTC, echipele pot implementa soluții avansate de viziune computerizată care îmbunătățesc capacitățile autonome ale roboților, oferind un avantaj competitiv în realizarea sarcinilor din joc.

Quizzes