Aquí hay tres cosas:
- Aprendizaje automático (ML)
- Procesamiento de imágenes
- Desarrollo móvil (Android e iOS)
Necesita aprender cada uno de ellos independientemente de los otros dos. De esa forma, no estará limitado en términos de lo que puede construir y probablemente pueda ser más comercializable de esa manera.
Dicho esto, el aprendizaje automático no es algo tan complejo de aprender, especialmente si ya te sientes cómodo con lo siguiente:
- Estoy muy interesado en el aprendizaje profundo. ¿Cómo puedo ser contratado?
- ¿Existe una API para reconocimiento facial?
- ¿Qué se entiende exactamente por pesos compartidos en una red neuronal convolucional?
- ¿Cuál es la diferencia entre adaboost y el clasificador de perceptrones de una capa?
- ¿Cuáles son algunas buenas ideas de proyectos para aplicaciones web de negocios que utilizan análisis de sentimientos?
- Álgebra lineal
- Matrices
- Vectores
- Descomposición de valores singulares (SVD)
- Estadísticas y probabilidad
- Teorema de Bayes
- Funciones de densidad de probabilidad
- Funciones de distribución de probabilidad como distribuciones binomiales o gaussianas.
- Variables aleatorias
- Cálculo
- Cadena de reglas
- Calculo diferencial
- Optimización numérica
- Métodos de optimización de primer orden.
- Métodos de optimización de segundo orden.
- Programación
- Pitón
- C / C ++
- Java
- DO#
Y con el procesamiento de imágenes necesita saber.
- Circunvolución
- Convolución continua como se define en las matemáticas típicas.
- Convolución discreta aplicada en el diseño de filtros digitales.
- Correlación cruzada que está relacionada con la operación convolucional pero sin voltear la imagen fuente o los núcleos.
- La mayoría de las técnicas de ventanas deslizantes utilizan correlación cruzada.
- Transformada de Fourier
- Transformada continua de Fourier como se usa en matemáticas.
- Transformada discreta de Fourier rápida.
- Filtros digitales
- Filtros de respuesta de impulso infinito (IIR).
- Filtros de respuesta impuesta finita (FIR).
Para construir código de procesamiento de imágenes o ML portátil en todas las plataformas, mi consejo sería usar C ++. No soy el experto en software, pero los algoritmos escritos en C ++ son muy portátiles. Por ejemplo, escribí mi sistema de visión por computadora (CV) en C ++ usando Visual Studio y luego porté el código a Android a través del kit de desarrollador nativo de Android (NDK). Puedo portar el mismo código C ++ a aplicaciones iOS o Windows 10 Universal sin modificaciones.
Por lo tanto, para una portabilidad máxima, me quedaría con C ++.
C ++ también permite un código más eficiente, sí, los dispositivos actuales son potentes, pero aún es mucho más eficiente escribir las funciones de filtro en C ++ en lugar de Java o Python. Se vuelve aún más evidente para los cálculos pesados que involucran efectos complejos utilizando algoritmos ML como la transferencia de estilos.
Aunque muchos módulos de Python en realidad ya están escritos de manera eficiente en C / C ++. Por lo tanto, la mayoría de las operaciones vectoriales o matriciales en Python se ejecutan en un nivel nativo de C / C ++. Dado que el procesamiento de imágenes implica tales operaciones, operaciones de vectores y matrices, aún puede usar Python con una buena biblioteca de álgebra lineal optimizada para ayudarlo con la aceleración de hardware, como enviar las operaciones a una unidad de procesamiento gráfico (GPU). El hecho de que Python sea un lenguaje de alto nivel similar al inglés significa que el código escrito en Python puede ser muy legible, fácil de mantener y más rápido de escribir (aunque no más rápido de ejecutar).
Con el desarrollo móvil aún no he trabajado con iOS, pero sigo desarrollando aplicaciones CV / ML para Android.
Por lo tanto, debe escribir su biblioteca de procesamiento de imágenes o ML de manera portátil y luego transferirla a otras plataformas a través de interfaces. Con Android estamos hablando de la interfaz nativa de Java (JNI).
Para desarrollar para Android solo use:
- Android Studio
- NDK para ayudar al código de Android a llamar a un eficiente código C ++ nativo portátil
- Java
- Kotlin
Por supuesto, hay bibliotecas de alto nivel que han implementado prácticamente la mayoría de los filtros, como los filtros de cuadro o gaussianos, pero a veces es divertido escribir uno propio. Me gusta escribir mis propias cosas.
La forma no portátil de escribir filtros para Android es usar renderscript, que está optimizado para ejecutarse en múltiples núcleos y GPU. Si tiene la intención de usar C ++, también debe buscar en OpenMP para dispositivos multiprocesador y probablemente OpenCL para aceleración de GPU. Es muy divertido codificar cerca del metal porque aprendes bastante.
Tenga en cuenta que para implementaciones más complejas, como la transferencia de estilo, necesita bibliotecas como TensorFlow (TF). TF está disponible para Android, pero no estoy seguro de la versión de iOS.
Pero una vez más, puede implementar su propia implementación de un código de transferencia de estilo usando C ++ simple con la ayuda de OpenMP u OpenCL para la aceleración, de nuevo, es muy divertido de esa manera.
Espero que esto ayude.