Computer Vision: Metal defects detector
Aplicación de visión artificial para la detección de defectos en superficies de metales.
El trabajo combina varias tecnologías:
A continuación, se desarrolla la explicación del trabajo
Esta aplicación se desarrolla para la asignatura de Aplicaciones Industriales y Comerciales del Máster de Visión Artificial de la Universidad Rey Juan Carlos de Madrid.
Un supuesto cliente, frabricante de láminas metálicas, desea contratar los servicios de una empresa de Visión Artificial para realizar el control de calidad de las láminas. Las láminas que fabrica pueden presentar 6 tipos de defectos o imperfecciones:
De estos defectos, el cliente quiere que se clasifiquen adecuadamente los tres primeros. Los otros tres, deben clasificarse como una categoría distinta (other). Además, se debe detectar la posición concreta de los defectos en los dos primeros casos, esto es, moho y arañazos.
El cliente proporciona un conjunto de imágenes de ejemplo, junto con sus anotaciones, accesibles en el siguiente enlace. Para mayor comodidad a la hora de utilizar este software, se incluyen las imágenes en el GitHub.
La solución debe poder integrarse fácilmente en una aplicación que utiliza el cliente, desarrollada en Java por los programadores de su empresa, con la que se gestiona el proceso productivo y con la que se realiza la captura de las imágenes.
La clasificación se realiza con una red neuronal convolucional, mientras que la detección en los defectos moho y arazaño se realiza con técnicas clásicas de visión artificial.
Para la red neuronal, a su vez, se ha implementado código, tanto para la fase de entrenamiento, como para la fase de clasificación. En la fase de entrenamiento se crea un modelo de red, que será utilizado por la fase de clasificación. La aplicación almacena el mejor modelo (los mejores pesos) que la red va encontrando en la carpeta models. NOTA: El mejor será el último que se ha guardado. Además, crea dos ficheros .png con las gráficas de precisión y pérdida del entrenamiento.
Si el software clasifica el defecto como moho, se manda la imagen al código que detecta la presencia de moho. Si, por su parte, clasifica el defecto como arañazo, se manda la imagen al detector de arañazos, que hace lo propio. En el resto de los casos no es necesario el proceso de detección.
Además, se ha implementado un servidor HTTP capaz de recibir una imagen y develver el resultado de la clasificación, y en su caso, detección.
Adicionalmente, se ha creado una librería en Java que actúa como cliente del servidor HTTP, mandando una imagen y recibiendo el resultado de la clasificación y, en su caso, detección. De esta manera, la aplicación puede ser integrada fácilmente en la aplicación principal de la empresa metalúrgica, que está desarrollada en este lenguaje. Junto con la librería, se ha creado en Java un pequeño programa de demostración para poder ser utilizado como demostración a la empresa contratante.
Por último, para facilitar el despliegue del software Python en el cliente, se ha empaquetado la solución en un Docker.
La clasificación tiene una tasa de acierto aproximada del 95% sobre un conjunto de test elegido al azar. En cuanto a la detección en los casos de Mohos y Arañazos, se ha podido medir una IoU aproximada del 58%. Estos resultados están en consonancia con las especificaciones del cliente.
La explicación se hará pensando que se está utilizando linux. No obstante, para otras sistemas operativos los pasos serán similares. Además, se presupone que se tienen correctamente instalados: git, python3, pip, Java-jdk y docker.
La aplicación puede ser utilizada de tres formas distintas:
En los siguientes apartados se ofrece más información.
Este es el procedimiento que requiere menos pasos:
xhost +"local:docker@"
sudo docker run --rm -it -p 9000:9000 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix juanluiscarrillo/metaldefects
. Si el docker no se encuentra en el sistema, se descargará del repositorio docker.python server.py 2> log.txt &
java -jar metaldetector.jar
También, es posible ejecutar la aplicación de demostración desde un terminal distinto al del docker. Para ello, una vez se ha ejecutado el servidor dentro del contenedor, hay que abrir un terminal seguir los siguientes pasos:
git clone https://github.com/juanluiscarrillo/CV-Metal-Defects-Detector.git
cd CV-Metal-Defects-Detector/
javac -d ./classes -cp ./classes java-src/detect/*.java
javac -d ./classes -cp ./classes java-src/*.java
cp -r ./META-INF/ ./classes/
cd ./classes/
jar cmf META-INF/MANIFEST.MF metaldetector.jar *.class detect
mv metaldetector.jar ../
cd ..
java -jar metaldetector.jar
En el repositorio se guardan los ficheros fuentes y las imágenes, por lo que es necesario realizar una serie de pasos para poner en funcionamiento la aplicación. Los primeros 9 pasos son idénticos al caso de utilización sin docker. El resto son propios de este método. A continuación, se detallan todos los pasos:
git clone https://github.com/juanluiscarrillo/CV-Metal-Defects-Detector.git
cd CV-Metal-Defects-Detector/
python3 -m venv ./venv
source ./venv/bin/activate
pip3 install -r requirements.txt
javac -d ./classes -cp ./classes java-src/detect/*.java
javac -d ./classes -cp ./classes java-src/*.java
cp -r ./META-INF/ ./classes/
cd ./classes/
jar cmf META-INF/MANIFEST.MF metaldetector.jar *.class detect
mv metaldetector.jar ../
cd ..
python MetalDefectsUtil.py
python MetalDefectsTrainer.py
sudo docker build -t metaldefects:local .
xhost +"local:docker@"
docker run --rm -it -p 9000:9000 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix metaldefects:local
python server.py 2> log.txt &
java -jar metaldetector.jar
También, es posible ejecutar la aplicación de demostración desde un terminal distinto al del docker. Para ello, una vez se ha ejecutado el servidor dentro del contenedor, hay que abrir un nuevo terminal y situarse en la carpeta CV-Metal-Defects-Detector/. Desde ahí, se lanza la aplicación de demostración java -jar metaldetector.jar
.
Si se quiere utilizar la aplicación sin el uso de docker, hay que proceder de la siguiente forma:
python server.py 2> log.txt &
NOTA: En el fichero log.txt se guardan los fallos del servidorjava -jar metaldetector.jar
Además, es posible utilizar otros scripts python para comprobar el desempeño de la solución. A continuación, se indicará cómo hacerlo, pero previamente es necesario copiar el fichero mi_test.csv en la carpeta CNN_UTIL: cp mi_test.csv ./CNN_UTIL/
.
Una vez realizado este paso, se detallan las posibilidades del software:
python MetalDefects_test.py NEU-DET
.python Application.py NEU-DET
. Hay que pulsar la letra q para salir de la aplicación y cualquier otra letra para avanzar a la siguiente imagen.NOTA: En este caso NEU-DET es la ruta donde se encuentran las imágenes, junto con las anotaciones. Si éstas se encuentran en otro sitio, hay que indicar la ruta correspondiente.