Como empezó todo
Todo comenzó con Apple Market: descubrí que tienen un programa para determinar la madurez de una sandía. El programa ... es raro. Lo que vale, al menos, es la oferta de tocar una sandía no con los nudillos, sino ... ¡por teléfono! Sin embargo, quería repetir este logro en una plataforma Android más familiar.
Selección de herramienta
Nuestro problema se resuelve de varias maneras, y para ser honesto, tuve que hacer esfuerzos considerables para no ir por el camino "simple". Es decir, tome transformadas de Fourier, wavelets y un editor de señales. Sin embargo, quería ganar experiencia con redes neuronales, así que deje que las redes hagan análisis de datos.
Keras, el complemento de Google para TensorFlow y Theano, fue elegido como una biblioteca para crear y entrenar redes neuronales. En general, si recién está comenzando con las redes de aprendizaje profundo, es mejor que no encuentre una herramienta. Por un lado, Keras es una poderosa herramienta optimizada para velocidad, memoria y hardware (sí, puede funcionar en tarjetas de video y sus clústeres). Por otro lado, todo lo que puede estar "oculto" para el usuario está oculto allí, por lo que no es necesario apilarse el cerebro sobre el acoplamiento de capas de una red neuronal, por ejemplo. Muy comodo
Como Keras, y las redes neuronales en general, requieren conocimiento de Python: este lenguaje, como una serpiente envuelta ... lo siento, pent. En resumen, no debe entrometerse en el aprendizaje profundo moderno sin Python. Afortunadamente, Python se puede estudiar en dos semanas, en casos extremos, en un mes.
Necesitará algunas bibliotecas más para Python, pero estas son trivialidades, es decir, si ha tratado con Python. Se requerirá un conocimiento (muy superficial) de NumPy, PyPlot y posiblemente de un par de bibliotecas, de las cuales tomamos literalmente un par de funciones. No es dificil. La verdad es que
Bueno, en conclusión, noto que no necesitamos los clústeres de tarjetas de video mencionados anteriormente; nuestra tarea normalmente se resuelve con la ayuda de una CPU de la computadora, lentamente, pero no críticamente.
Plan de trabajo
Primero debe crear una red neuronal, en Python y Keras, en Ubuntu. Puedes - en el emulador Ubunta. Puede hacerlo: para Windows, pero el tiempo extra empleado es suficiente para que estudie el Ubuntu mencionado y luego trabaje debajo de él.
El siguiente paso es escribir un programa. Planeo hacer esto en Java bajo Android. Este será un prototipo del programa, en el sentido de que tendrá una interfaz de usuario, pero todavía no hay una red neuronal.
¿Cuál es el significado de escribir "chupetes"? Pero esta es la cuestión: cualquier tarea relacionada con el análisis de datos, tarde o temprano, se basa en la búsqueda de datos, para capacitar a nuestro programa. De hecho, ¿cuántas sandías se deben aprovechar y probar para que la red neuronal pueda construir un modelo confiable sobre estos datos? Cien? Más?
Aquí nuestro programa nos ayudará: subirlo a Google Play, distribuir (está bien, imponer, girar los brazos) a todos los amigos que no tienen la suerte de tener un teléfono con Android, y los datos, una pequeña transmisión, comienzan a fluir ... y, por cierto, ¿dónde?
El siguiente paso es escribir un programa de servidor que reciba datos de nuestro cliente de Android. Es cierto que este programa de servidor es muy simple, terminé todo en unos veinte minutos. Pero, sin embargo, esta es una etapa separada.
Finalmente, suficientes datos. Entrenamos una red neuronal.
Portamos la red neuronal en Java y lanzamos una actualización de nuestro programa.
Ganancia Aunque no. El programa fue gratis. Solo experiencia y golpes de peluche.
Crear una red neuronal
Trabajar con audio, que, por supuesto, está tocando una sandía, es una red neuronal recurrente o la llamada red convolucional unidimensional. Además, en los últimos años, las redes evolutivas han liderado sin ambigüedad, desplazando a las recurrentes. La idea de una red convolucional es que la ventana se deslice sobre la matriz de datos, la "intensidad de sonido - tiempo" del gráfico, y en lugar de analizar cientos de miles de muestras, solo trabajamos con lo que entra en la ventana. Las siguientes capas combinan y analizan los resultados de esta capa.
Para que quede más claro, imagine que necesita encontrar una gaviota en una foto de un paisaje marino. Escanea una imagen: la "ventana" de su atención se mueve a lo largo de filas y columnas imaginarias, en busca de una marca de verificación blanca. Así es como funciona una red convolucional 2D, mientras que una red unidimensional escanea a lo largo de una coordenada: esta es la mejor opción si se trata de una señal de audio.
Observo, sin embargo, que no es necesario centrarse en las redes 1D. Como ejercicio, tracé el sonido y analicé el mapa de bits resultante como una imagen, usando una red de convolución 2D. Para mi sorpresa, el resultado no fue peor que al analizar datos "unidimensionales en bruto".
La red utilizada tenía la siguiente estructura:
model = Sequential() model.add(Conv1D(filters=32, kernel_size=512, strides=3, padding='valid', use_bias=False, input_shape=(nSampleSize, 1), name='c1d', activation='relu')) model.add(Activation('relu', input_shape=(nSampleSize, 1))) model.add(MaxPooling1D(pool_size=(2))) model.add(Conv1D(32, (3))) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=(2))) model.add(Conv1D(64, (3))) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=(2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(nNumOfOutputs))
Esta red tiene dos valores de salida (predice dos valores): dulzura y madurez. La dulzura es 0 (sin endulzar), 1 (normal) y 2 (excelente), y la madurez, respectivamente, 0 es demasiado dura, 1 es lo que necesita y 2 está demasiado maduro, como algodón con arena.
Las calificaciones de la muestra de prueba las establece la persona, exactamente cómo: hablaremos en la sección del programa para Android. La tarea de la red neuronal es predecir qué calificación otorgará una persona a una sandía determinada (según un grifo).
Escribir un programa
Ya mencioné que el programa debería salir en dos versiones. El primero, preliminar, honestamente advierte al usuario que sus predicciones son completamente absurdas. Pero le permite al usuario grabar un golpe en una sandía, calificar el sabor de esta sandía y enviarla al autor del programa a través de Internet. Es decir, la primera versión simplemente recopila datos.
Aquí está la
página del
programa en Google Play, por supuesto, el programa es gratuito.
¿Qué hace ella?
1. Presione el botón con el micrófono y comenzará la grabación. Tienes cinco segundos para golpear la sandía tres veces: golpe-golpe-golpe. Un botón con una sandía hace una "predicción", y aún no la tocamos.
Nota: si Google tiene una versión anterior, la grabación y la predicción se combinan en un botón con una sandía, pero no hay un botón con un micrófono.

2. El archivo guardado es temporal y se sobrescribirá la próxima vez que presione el botón de grabación. Esto le permite repetir el golpeteo si alguien habla de la mano (¡no puede imaginar lo difícil que es hacer callar a los demás durante cinco segundos!) O el agua hace ruido, los platos suenan, el vecino está perforando ...
Pero ahora la sandía está seleccionada y comprada. Lo trajiste a casa, grabaste un sonido y lo cortaste. Ahora estás listo para evaluar su sabor. Seleccione la pestaña Guardar.
En esta pestaña, vemos dos cuadros combinados para la clasificación: dulzura y madurez (dulzura y madurez, se está trabajando en la traducción). Ponga una marca - haga clic en Guardar.
Atencion Se puede hacer clic en Guardar solo una vez. Entonces, primero pon una marca. Con solo tocar un botón, el archivo de sonido cambia de nombre y ahora no se borrará la próxima vez que se grabe.

3. Finalmente, habiendo grabado (y, por lo tanto, comido) una docena de sandías, regresó de la cabaña, donde no tenía Internet. Ahora internet es. Abra la pestaña Enviar y presione el botón. El paquete (con una docena de sandías) va al servidor del desarrollador.

Escribir un programa de servidor
Aquí todo es simple, así que será mejor que diseñe el código completo de este script. El programa "captura" archivos, les da nombres únicos y los coloca en un directorio accesible solo para el propietario del sitio.
<?php if (is_uploaded_file($_FILES['file']['tmp_name'])) { $uploads_dir = './melonaire/'; $tmp_name = $_FILES['file']['tmp_name']; $pic_name = $_FILES['file']['name']; $filename = md5(date('Ymd H:i:s:u')); move_uploaded_file($tmp_name, $uploads_dir.$filename); } else { echo "File not uploaded successfully."; } ?>
Entrenamiento de redes neuronales
Los datos se dividen en entrenamiento y prueba, 70 y 30 por ciento, respectivamente. Red neuronal: converge. Sin embargo, no hay sorpresas aquí para los principiantes: no olvides normalizar los datos de entrada, esto te ahorrará muchos nervios. Algo asi:
for file_name in os.listdir(path): nSweetness, nRipeness, arr_loaded = loadData(file_name) arr_data.append(arr_loaded / max(abs(arr_loaded)))
Portar una red neuronal
Hay varias formas de portar una red desde un entorno Python a Java. Recientemente, Google ha hecho que este proceso sea más conveniente, por lo que si lee los libros de texto, asegúrese de que no estén desactualizados. Así es como lo hice:
from keras.models import Model from keras.models import load_model from keras.layers import * import os import sys import tensorflow as tf
Preste atención a la última línea: en el código Java deberá especificar los nombres de entrada y salida de la red. Esta "impresión" simplemente los imprime.
Entonces, colocamos el archivo recibido coordted.pb en el directorio de activos del proyecto en Android Studio, conectamos la biblioteca de interfaz de tensorflowinference (ver
aquí , o mejor,
aquí ), y eso es todo.
Eso es todo. Cuando hice esto por primera vez, esperaba que fuera difícil, pero ... funcionó en el primer intento.
Así es como se ve una llamada de red neuronal desde código Java:
protected Void doInBackground(Void... params) { try {
Aquí m_arrInput es una matriz con dos elementos que contienen - ¡sí! - nuestra predicción, normalizada de cero a uno.
Conclusión
Aquí, al parecer, se supone que se debe agradecer la atención y expresar la esperanza de que fue interesante. En cambio, noto que Google es la primera versión del programa. El segundo está completamente listo, pero no hay suficientes datos. Entonces, si te gustan las sandías, pon un programa en tu Android. Cuantos más datos envíe, mejor funcionará la segunda versión ...
Por supuesto, será gratis.
Buena suerte y sí: gracias por mirar. Espero que haya sido interesante.
Actualización importante: se ha lanzado una nueva versión con análisis mejorado. ¡Gracias a todos los que enviaron las sandías, y por favor envíen más!