En Windows se recomienda el entorno Anaconda por la facilidad de instalación de algunas dependencias de Python que de otra forma no se podían instalar, por ejemplo el paquete scikit-learn
.
Luego se crea un entorno virtual con la versión de Python 3.5 para poder trabajar con TensorFlow
C:> conda create -n tensorflow python=3.5
Luego, el entorno se activa ejecutando
C:> activate tensorflow
Dentro del entorno ya se pueden instalar todas las dependencias de Python que sean necesarias para cada programa con el comando pip sin ningún problema.
Para la instalacion de TensorFlow se utilizaran los siguientes comandos:
- Para la versión sin GPU:
(tensorflow)C:> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.2.0-cp35-cp35m-win_amd64.whl
- Para la versión con GPU:
(tensorflow)C:> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.0-cp35-cp35m-win_amd64.whl
Recordar que para la versión con GPU se deben instalar antes CUDA, cuDNN y los drivers correspondientes.
Para la instalación de OpenCV en Windows de 64 bits con Python 3.5 se recomienda descargarlo del siguiente enlace o buscar la versión correspondiente en esta página. Luego se instalará con el comando pip el archivo .whl descargado:
(tensorflow)C:\Downloads> pip install opencv_python-3.2.0+contrib-cp35-cp35m-win_amd64.whl
Para las distribuciones de Linux se utiliza la creación de entornos virtuales dentro de Python para separar los proyectos que necesiten diferentes versiones del intérprete o de las librerías que se utilicen.
Para este caso en el que utilizamos Python 3 se realizan los siguientes pasos:
- Instalar pip3 y virtualenv, esto instalará Python 3 si no se encuentra en el sistema.
$ sudo apt-get install python3-pip python3-dev python-virtualenv
- Crear el entorno con virtaulenv, el flag
system-site-packages
se utiliza para tomar las librerías que ya están instaladas en el sistema globalmente, ignorarlo en caso de no querer incluirlas.ENV_DIRECTORY
es el directorio en el que se creará el entorno.
$ virtualenv --system-site-packages -p python3 <ENV_DIRECTORY>
- Activar el entorno virtualenv creado.
$ source <ENV_DIRECTORY>/bin/activate
- Para salir del entorno se debe ejecutar:
(<ENV_NAME>)$ deactivate
Tenemos dos formas de instalar esta librería: desde el código fuente o desde pip.
Si se desea instalar el soporte para GPU se deberá instalar CUDA, cuDNN y los drivers correspondientes antes de seguir.
También es necesaria la librería CUDA Profile Tools Interface:
$ sudo apt-get install libcupti-dev
Para la instalación con este método se debe ejecutar dentro del entorno:
(<ENV_NAME>)$ pip3 install --upgrade tensorflow # Tensorflow
(<ENV_NAME>)$ pip3 install --upgrade tensorflow-gpu # Tensorflow y GPU
Este método de instalación es el recomendado ya que es el que mejor resultados de performance da al correr los programas que utilicen esta libreriía.
Primero hay que instalar algunas dependencias:
- Bazel, para esto seguir las siguientes instrucciones
- Dependencias de Python de TensorFlow (
numpy
,wheel
) dentro del entorno. - (Opcional) Librerías para el soporte de la GPU descritas anteriormente.
Luego se deben realizar los siguientes pasos:
- Clonar el repositorio de TensorFlow y elegir la versión a compilar entre todos los branches.
$ git clone https://github.com/tensorflow/tensorflow
$ cd tensorflow
$ git checkout <BRANCH> # Por ejemplo: r1.0
- Luego se debe ejecutar el script de configuración, en el cual se nos pedirá ingresar varias opciones para el uso de TensorFlow. Por ejemplo, directorio de Python, soporte para Google Cloud Platform, Hadoop, flags de optimización. Utilizar los directorios del entorno virtual (A confirmar).
$ ./configure
- Luego se ejecuta el siguiente comando.
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package # GPU
NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package.
Tip: By default, building TensorFlow from sources consumes a lot of RAM. If RAM is an issue on your system, you may limit RAM usage by specifying --local_resources 2048,.5,1.0 while invoking bazel.
- Esto generará un script que se debe ejecutar para crear el archivo .whl
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
- Finalmente, dentro del entorno se instala el archivo .whl con pip.
(<ENV_NAME>)$ pip3 install /tmp/tensorflow_pkg/<WHL_FILE>
Para Linux no se dispone de un archivo .whl como en Windows. La opción más recomendada es compilar OpenCV desde su código fuente para la versión de Python de nuestro entorno virtual.
- Primero instalamos algunas dependencias dentro del sistema:
$ sudo apt-get install build-essential cmake pkg-config libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk-3-dev libatlas-base-dev gfortran
- Luego descargamos la última versión del código fuente de OpenCV de su repositorio oficial junto con el repositorio
opencv_contrib
para tener una instalación completa de la herramienta y no sólo las funciones básicas.
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.2.0.zip
$ unzip opencv.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.2.0.zip
$ unzip opencv_contrib.zip
- Dentro del entorno instalamos
numpy
si todavía no lo hicimos.
(<ENV_NAME>)$ pip3 install numpy
- Luego compilamos OpenCV.
(<ENV_NAME>)$ cd opencv-3.2.0
(<ENV_NAME>)$ mkdir build
(<ENV_NAME>)$ cd build
(<ENV_NAME>)$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=<ENV_DIRECTORY>/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=<OPENCV_CONTRIB_DIR>/modules \
-D PYTHON_EXECUTABLE=<ENV_DIRECTORY>/bin/python3 \
-D BUILD_EXAMPLES=ON ..
(<ENV_NAME>)$ make -j4
- Procedemos a la instalación con:
(<ENV_NAME>)$ make install
A continuación se detalla la utilización de cada programa del repositorio, se asume que el ususario se encuentra en el entorno de Python correspondiente tanto en Windows como en Linux.
Este fue el primer programa para realizar pruebas sobre un dataset de lenguaje de señas con guantes de colores bien definidos e identificables dentro de la imagen. En el procesamiento se segmenta los guantes con filtrado de colores, se busca los contornos de los guantes, además de realizar recuadros para ubicar la posición de los mismos. Como una prueba adicional se utliza una cascada Haar para la detección de la cara que utiliza el método de Viola-Jones.
python imagenes.py -i <IMAGE>
El dataset Buffy Stickmen presenta imagenes del show televisivo Buffy the Vampire Slayer junto con anotaciones sobre las poses de las personas que aparecen en ellas. Su objetivo es proporcionar una base de datos de imágenes que no tengan restricciones y presente escenarios reales en los cuales utilizar diferentes algoritmos para la estimación de poses.
En este programa se realiza una prueba sobre el cálculo de la precisión de la técnica de Viola-Jones para la detección de la cara comparado con las anotaciones del dataset. Dado que la detección de la cara nos da un recuadro de la cara y las anotaciones presentan la línea del eje de la cabeza, esto afectará en cierta medida los resultados obtenidos. Como medida de comparación se utiliza la raíz cuadrada de la distancia euclídea entre el punto central del recuadro de la cara y el punto medio entre los extremos de la línea anotada. Para la precisión de este método se toma una distancia de referencia hasta donde la estimación se considera correcta.
Luego se genera un histograma de las distancias para visualizar la información. El programa además cuenta con un modo debug que para cada imagen muestra los puntos comparados.
python buffy.py -p <BUFFY_PATH> [-d [DEBUG]]
Este programa es una prueba para verificar los resultados de intentar detectar manos a partir del color de piel de la cara. Primero se utliza el método de Viola-Jones para encontrar las caras en la imagen. Además se calcula un área de interés en donde pueden estar las manos en base a la cara detectada. Luego con la técnica de Back Projection se extrae de la imagen todos los pixels con colores que coincidan a los de la cara. En base a ello se buscan algunos contornos que podrín ser manos.
python faceinfo.py -i <IMAGE>
En esta sección se describirán los programas que hagan uso de la librería TensorFlow.
Esta es una técnica que consiste en la utilización de una red neuronal pre-entrenada para conseguir resultados intermedios de la misma y así ahorrar el entrenamiento de una red compleja.
Las pruebas realizadas fueron tomando la red convolucional Inception-v3, entrenada y desarrollada por Google con datos del 2012 para la competición ImageNet logrando una tasa de error de predicción en el top 5 de sus resultados del 3.46% superando la capacidad de algunas personas como se puede apreciar en este blog.
El funcionamiento de esta técnica es muy simple y el flujo de trabajo se podría definir de la siguiente forma:
Pre-procesamiento de la imagen --> Imagen JPEG --> Inception-v3 --> Array[2048] --> Clasificación --> Resultado
Dado que se dispone de varios datasets con imágenes PNG de gestos segmentados y ya procesadas, sólo hace falta la conversión al formato JPEG para ser procesadas por la red Inception-v3. De esto se encarga el programa extract_features.py
, dado un dataset, genera los archivos JPEG temporalmente para ser procesados, y guarda en los archivos features.pkl
y labels.pkl
los arreglos obtenidos y la clase del gesto partiendo del nombre de la imagen. El modo de utilización de este programa es:
python extract_features.py -i <DATASET_DIRECTORY>
Luego, una vez obtenidos los arreglos de la salida de la red se pueden utilizar varios métodos para su clasificación.
Hasta la fecha (22/06/2017) se dispone de dos programas diferentes:
- Una que entrena una SVM simple, la cual parece funcionar bastante bien con los datasets dispuestos.
python train_svm.py -f <FEATURES_FILE> -l <LABELS_FILE>
- Una red neuronal profunda fully-connected en la que quedan pendientes varios tests.
python train_nn.py -f <FEATURES_FILE> -l <LABELS_FILE>
Como resultado final se obtiene un proceso de clasificación de gestos que aprovecha el entrenamiento de una red conocida y ahorrando pasos intermedios.
TODO
TODO