2016-04-14 11 views
5

Sto provando a utilizzare il riconoscimento attività in un progetto per rilevare quando l'utente è "IN-VEHICLE". (Guida) Il problema è che è quasi impossibile utilizzarlo, dato che mostProbableActivity spesso riporta "IN-VEHICLE" anche se sono stato seduto alla mia scrivania per molto tempo o sono semplicemente andato in giro a casa mia. Sarebbe molto bello sapere come l'API conclude questo.API di riconoscimento attività inaffidabili?

Penso che questa funzione abbia un grande potenziale, ma come ora qualcosa chiaramente non funziona.

Questo è un registro di MostProbableActivity eseguito ogni 30 secondi per mostrare cosa intendo. Seduto alla mia scrivania, dopo 4 minuti accendo il telefono un paio di volte e questo risulta in un risultato "mostProbable IN-VEHICLE".

Ho provato diversi telefoni e il risultato è lo stesso. Quindi non penso sia collegato all'hardware.

DetectedActivity [type=STILL, confidence=43] 
DetectedActivity [type=STILL, confidence=54] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=69] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=92] 
DetectedActivity [type=TILTING, confidence=100] 
DetectedActivity [type=IN_VEHICLE, confidence=49] 
DetectedActivity [type=TILTING, confidence=100] 
DetectedActivity [type=STILL, confidence=51] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=85] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=66] 
DetectedActivity [type=STILL, confidence=100] 

Questo è il codice, niente di speciale:

public class ActivitiesIntentService extends IntentService { 


    private static final String TAG = "ActivitiesIntentService"; 


    public ActivitiesIntentService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); 
     Intent i = new Intent(Constants.STRING_ACTION); 


     DetectedActivity mostProbableActivity = result.getMostProbableActivity(); 


     i.putExtra("MOST_PROBABLE_ACTIVITY",mostProbableActivity); 



     LocalBroadcastManager.getInstance(this).sendBroadcast(i); 


     Log.e(TAG, String.valueOf(mostProbableActivity)); 
     } 

} 

Da questo link:

Activity Recognition API

posso vedere che gli altri hanno un'esperienza simile, ma alcune affermazioni che funziona OK.

Penso che questo sia un bug nell'algoritmo di confidenza dell'API. Dovrebbe essere facile concludere che il telefono non si muove in nessuna direzione, né su una strada, quindi NON è "mostProbable" in un VEICOLO.

Qualcuno può confermare questo problema o lo uso nel modo sbagliato?

migliori saluti

Thomas

+0

Si sta usando nel modo giusto. Il problema è che senza campionare il GPS e scaricare la batteria sarà molto difficile rilevare l'attività di guida. Google probabilmente tiene traccia dei dati dei sensori (accelerometro, giroscopio, magnetometro ecc.) In alcuni periodi e cerca uno schema di guida (che è molto simile a quello fermo ma ha una vibrazione unica). A volte l'algoritmo non è abbastanza preciso. – MikeL

risposta

3

tenere a mente che questo è un servizio bassissimo consumo energetico, quindi non può essere guardando i sensori del dispositivo costantemente. Ciò svuoterebbe troppo rapidamente la batteria per essere utile. Assicurati di read the docs per capire i vincoli.

Se si desidera letture più accurate, aumentare l'intervallo di rilevamento. Questo gli darà più dati con cui lavorare.

Inoltre, tenere presente che queste misurazioni devono essere prese a grandi linee. Un possibile caso d'uso è di stimare quanto tempo il vettore del dispositivo è stato impegnato in attività fisica, o di attivare e disattivare i componenti di un'app che dovrebbe essere in esecuzione quando il corriere esegue una delle attività rilevate.

1

Se sono necessarie letture più accurate, è necessario aumentare il livello di rilevamento del dispositivo, ma questo, a sua volta, finirebbe per scaricare la batteria. Per quanto riguarda le risposte dei risultati, per essere certi che l'utente stia svolgendo una determinata attività, la confidenza dei servizi di Google Play deve essere> 75 o sarebbe sicuro assumere che l'utente non la sta eseguendo. Nel tuo caso, la fiducia dei servizi di Google Play è 49, il che significa che non è sicuro se il tuo utente sta guidando. Si potrebbe anche provare a utilizzare un semplice 'IF'

if(DetectedActivity == “In_Vehicle” && result.getConfidence()> 75) 
{ 
// output = User is Driving; 
// Perform task 
} 

Altri modi per ottenere intuizioni più precise circa le attività del vostro utente e luoghi senza avere la batteria scarica, è quello di provare alcune delle API come tranql, Hub Contesto o Neura

+2

Come sei arrivato alla conclusione che il 75% è un buon numero? C'è qualche riferimento per supportare il tuo suggerimento? – Pranaysharma

+0

@Pranaysharma buona domanda. Ho trovato un tutorial che menzionava questo 75% ma non ho trovato il loro numero: https://code.tutsplus.com/tutorials/how-to-recognize-user-activity-with-activity-ricecition--cms-25851 – nbeuchat

+0

Il 75% è menzionato nel video che appare su questa pagina di google https://developers.google.com/location-context/activity-recognition/ –

Problemi correlati