diff --git a/Dockerfile b/Dockerfile old mode 100755 new mode 100644 index 9ed162b..ae268eb --- a/Dockerfile +++ b/Dockerfile @@ -1,30 +1,30 @@ -FROM ubuntu:22.04 +FROM python:3.10.3-slim-bullseye -LABEL maintainer="Ricardo Antonio Valladares Renderos " - -RUN apt-get update && apt-get install -y \ +RUN apt-get -y update +RUN apt-get install -y --fix-missing \ build-essential \ cmake \ - curl \ gfortran \ - git \ gcc \ g++ \ + git \ wget \ + curl \ graphicsmagick \ libgraphicsmagick1-dev \ libatlas-base-dev \ libavcodec-dev \ libavformat-dev \ - libboost-all-dev \ libgtk2.0-dev \ libjpeg-dev \ liblapack-dev \ libswscale-dev \ pkg-config \ + python3-dev \ + python3-numpy \ software-properties-common \ zip \ - && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && apt-get clean && rm -rf /tmp/* /var/tmp/* WORKDIR / @@ -35,23 +35,18 @@ RUN mkdir -p dlib/build RUN (cd dlib/build && cmake .. && cmake --build . --config Release && make install) RUN rm -rf *.tar.gz /dlib/build -RUN wget -P /tmp "https://dl.google.com/go/go1.19.2.linux-amd64.tar.gz" -RUN tar -C /usr/local -xzf "/tmp/go1.19.2.linux-amd64.tar.gz" -RUN rm "/tmp/go1.19.2.linux-amd64.tar.gz" -ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH -RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" +RUN pip3 install Flask -WORKDIR /docker +RUN pip3 install dlib -COPY . . +RUN pip3 install face_recognition -COPY go.mod ./ +RUN pip3 install face_recognition_models -RUN go mod download +WORKDIR /docker -RUN go build -o main . +COPY . . EXPOSE 5001 -CMD ["./main"] +CMD python3 ./main.py diff --git a/Makefile b/Makefile index a33a8da..4b495e4 100755 --- a/Makefile +++ b/Makefile @@ -3,15 +3,8 @@ push: git status git add . git commit -m "$$(date)" - git pull origin Golang - git push origin Golang - -gorun: - go run main.go + git pull origin Python + git push origin Python run: - ./main - -compile: - go build main.go - + python main.py diff --git a/README.md b/README.md index 82e9bf5..92fbca6 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,20 @@ # Rostro Biométrico -Este proyecto es un servidor web hecho para la detección y reconocimiento de rostros; implementando un conjunto de herramientas escritas en golang, javascript y C++. Para poder ejecutar este proyecto de manera mas fácil, evitando el tedioso trabajo de instalar las dependencias para compilar, puedes ejecutar los siguientes comandos, para los cuales solo necesitaras tener instalado docker: +Este proyecto es un servidor web hecho para la detección y reconocimiento de rostros; implementando un conjunto de herramientas escritas en python, javascript y C++. Para poder ejecutar este proyecto de manera mas fácil, evitando el tedioso trabajo de instalar las dependencias para compilar, puedes ejecutar los siguientes comandos, para los cuales solo necesitaras tener instalado docker: ```bash -docker pull ghcr.io/ricardovalladares/facedetect:latest -docker run --publish 5001:5001 ghcr.io/ricardovalladares/facedetect +docker-compose up ```

- Light + Light         - Dark + Dark

Librerías usadas: - OpenCV (https://docs.opencv.org/3.4/d5/d10/tutorial_js_root.html) -- Go-Recognizer (https://github.com/leandroveronezi/go-recognizer) +- Face Recognition (https://github.com/ageitgey/face_recognition) - Dlib (http://dlib.net/) Modelos entrenados para el reconocimiento, detección y predicción de rostros: @@ -28,11 +27,31 @@ Modelos entrenados para el reconocimiento, detección y predicción de rostros: ## Notas de: @davisking (https://github.com/davisking/dlib-models) -### Reconocimiento - dlib_face_recognition_resnet_model_v1.dat -La red se entrenó desde cero con un conjunto de datos de aproximadamente 3 millones de rostros. Este conjunto de datos se deriva de dos conjuntos de datos. El conjunto de datos de face scrub (http://vintage.winklerbros.net/facescrub.html) y el conjunto de datos de VGG (http://www.robots.ox.ac.uk/~vgg/data/vgg_face/). Se hizo este modelo entrenando una CNN de reconocimiento facial y luego usando métodos de agrupación de gráficos y mucha revisión manual para limpiar el conjunto de datos. Al final, aproximadamente la mitad de las imágenes son de VGG y face scrub. Además, el número total de identidades individuales en el conjunto de datos es 7485. Se evitaron superposiciones de identidades en LFW. - -### Detección - mmod_human_face_detector.dat +### mmod_human_face_detector.dat Este modelo está entrenado con el conjunto de datos: http://dlib.net/files/data/dlib_face_detection_dataset-2016-09-30.tar.gz. Se creó el conjunto de datos encontrando imágenes de rostros en muchos conjuntos de datos de imágenes disponibles públicamente (excluyendo el conjunto de datos FDDB). En particular, hay imágenes de ImageNet, AFLW, Pascal VOC, el conjunto de datos VGG, WIDER y face scrub. Todas las anotaciones en el conjunto de datos fueron creadas usando la herramienta imglab de dlib. -### Predicción - shape_predictor_5_face_landmarks.dat +

+ Light +

+ +### shape_predictor_5_face_landmarks.dat Este es un modelo de referencia de 5 puntos que identifica las esquinas de los ojos y la parte inferior de la nariz. Se entrenó con el conjunto de datos que se encuentra en http://dlib.net/files/data/dlib_faces_5points.tar, que consta de 7198 rostros. Se creó este conjunto de datos descargando imágenes de Internet y anotándolas con la herramienta imglab de dlib. Este modelo está diseñado para funcionar bien con el detector de rostros HOG de dlib y el detector de rostros CNN (mmod_human_face_detector.dat). + +

+ Light +

+ +### shape_predictor_68_face_landmarks.dat +Este modelo está entrenado en el conjunto de datos ibug 300-W (https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/). La licencia de este conjunto de datos excluye el uso comercial y Stefanos Zafeiriou, uno de los creadores del conjunto de datos, pidió que incluyera una nota aquí diciendo que el modelo entrenado no se puede usar en un producto comercial. Por lo tanto, debe comunicarse con un abogado o hablar con el Imperial College London para averiguar si está bien que use este modelo en un producto comercial. + +

+ Light +

+ +### dlib_face_recognition_resnet_model_v1.dat +La red se entrenó desde cero con un conjunto de datos de aproximadamente 3 millones de rostros. Este conjunto de datos se deriva de dos conjuntos de datos. El conjunto de datos de face scrub (http://vintage.winklerbros.net/facescrub.html) y el conjunto de datos de VGG (http://www.robots.ox.ac.uk/~vgg/data/vgg_face/). Se hizo este modelo entrenando una CNN de reconocimiento facial y luego usando métodos de agrupación de gráficos y mucha revisión manual para limpiar el conjunto de datos. Al final, aproximadamente la mitad de las imágenes son de VGG y face scrub. Además, el número total de identidades individuales en el conjunto de datos es 7485. Se evitaron superposiciones de identidades en LFW. + +

+ Light +

+ diff --git a/dlib_face_recognition_resnet_model_v1.png b/dlib_face_recognition_resnet_model_v1.png new file mode 100644 index 0000000..479df50 Binary files /dev/null and b/dlib_face_recognition_resnet_model_v1.png differ diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 diff --git a/go.mod b/go.mod deleted file mode 100644 index b699a02..0000000 --- a/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/RicardoValladares/FaceDetect - -go 1.18 - -require github.com/leandroveronezi/go-recognizer v1.0.1 - -require ( - github.com/Kagami/go-face v0.0.0-20210630145111-0c14797b4d0e // indirect - github.com/disintegration/imaging v1.6.2 // indirect - github.com/fogleman/gg v1.3.0 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - golang.org/x/image v0.5.0 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index c2c8fa1..0000000 --- a/go.sum +++ /dev/null @@ -1,37 +0,0 @@ -github.com/Kagami/go-face v0.0.0-20210630145111-0c14797b4d0e h1:lqIUFzxaqyYqUn4MhzAvSAh4wIte/iLNcIEWxpT/qbc= -github.com/Kagami/go-face v0.0.0-20210630145111-0c14797b4d0e/go.mod h1:9wdDJkRgo3SGTcFwbQ7elVIQhIr2bbBjecuY7VoqmPU= -github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= -github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= -github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/leandroveronezi/go-recognizer v1.0.1 h1:Z1r4uFxw3nMngq8K1OzVFcpH+x2aZ/4yvw3VilOSVQ0= -github.com/leandroveronezi/go-recognizer v1.0.1/go.mod h1:HZheSqJ3AxOeT5E87q9agqJb+m9bX6+4l4KnCq2CBDg= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/main.go b/main.go deleted file mode 100755 index bc9ff34..0000000 --- a/main.go +++ /dev/null @@ -1,176 +0,0 @@ -package main - -import ( - "fmt" - "io" - "io/ioutil" - "log" - "net/http" - "os" - "path/filepath" - "github.com/leandroveronezi/go-recognizer" -) - -const ( - fotosDir = "enrrolados" - dataDir = "modelos" -) - -var rec = recognizer.Recognizer{} - -func addFile(rec *recognizer.Recognizer, Path, Id string) error { - err := rec.AddImageToDataset(Path, Id) - return err -} - -func main() { - err := rec.Init(dataDir) - if err != nil { - log.Println("Error al inicializar biometria con los templates") - return - } - rec.Tolerance = 0.4 - rec.UseGray = true - rec.UseCNN = false - defer rec.Close() - files, err := ioutil.ReadDir("./enrrolados/") - if err != nil { - log.Println("Error al inicializar biometria con los rostros enrrolados") - return - } - fmt.Println("Cargando rostros enrrolados...") - for _, file := range files { - if addFile(&rec, filepath.Join(fotosDir, file.Name()), file.Name()) != nil { - log.Println("Imagen no valida:", file.Name()) - return - } else { - log.Println("Imagen cargada:", file.Name()) - } - } - rec.SetSamples() - fmt.Println("http://localhost:5001") - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "enrrolar.html") }) - http.HandleFunc("/identificar.html", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "identificar.html") }) - http.HandleFunc("/opencv.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "opencv.js") }) - http.HandleFunc("/utils.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "utils.js") }) - http.HandleFunc("/haarcascade_frontalface_default.xml", func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "haarcascade_frontalface_default.xml") - }) - http.Handle("/enrrolados/", http.StripPrefix("/enrrolados", (http.FileServer(http.Dir("./enrrolados"))))) - http.HandleFunc("/enrrolar", enrrolar) - http.HandleFunc("/identificar", identificar) - err = http.ListenAndServe(":5001", nil) - if err != nil { - log.Fatal("Error de ListenAndServe, Necesites derechos de super usuario y que el puerto 5001 este desocupado sin bloqueos del firewall") - } -} - - -func identificar(w http.ResponseWriter, r *http.Request) { - file, handler, err := r.FormFile("image") - if err != nil { - http.Error(w, "Error al obtener la imagen", http.StatusBadRequest) - log.Println("Error al obtener la imagen") - file.Close() - return - } - defer file.Close() - tempFile, err := ioutil.TempFile("temp", "*"+filepath.Ext(handler.Filename)) - if err != nil { - http.Error(w, "Error al nombrar la imagen", http.StatusBadRequest) - log.Println("Error al nombrar la imagen") - file.Close() - tempFile.Close() - return - } - defer tempFile.Close() - fileBytes, err := ioutil.ReadAll(file) - if err != nil { - http.Error(w, "Error al leer la imagen", http.StatusBadRequest) - log.Println("Error al leer la imagen") - file.Close() - tempFile.Close() - return - } - tempFile.Write(fileBytes) - filetype := handler.Header.Get("content-type") - if filetype != "image/jpeg" && filetype != "image/jpg" && filetype != "image/gif" && filetype != "image/png" { - http.Error(w, "Error de formato en el archivo", http.StatusBadRequest) - log.Println("Error de formato en el archivo") - file.Close() - tempFile.Close() - return - } - face, err := rec.ClassifyMultiples(tempFile.Name()) - if err != nil { - http.Error(w, "Error al comparar rostro", http.StatusBadRequest) - log.Println("Error al comparar rostro") - file.Close() - tempFile.Close() - return - } - - if len(face) > 0 { - fmt.Fprintf(w, face[0].Data.Id) - log.Println(face[0].Data.Id) - } else { - fmt.Fprintf(w, "NO IDENTIFICADO") - log.Println("NO IDENTIFICADO") - } - file.Close() - tempFile.Close() -} - - -func enrrolar(w http.ResponseWriter, r *http.Request) { - identificador := r.FormValue("id") - enrrolados, err := os.Stat("./enrrolados/" + identificador) - if (err == nil) && !enrrolados.IsDir() { - fmt.Fprintf(w, "Ya existe el identificador: '%s'\n", identificador) - log.Println("Ya existe el identificador:", identificador) - return - } - if identificador == "" || identificador == "null" { - http.Error(w, "Error al obtener el identificador", http.StatusBadRequest) - log.Println("Error al obtener el identificador") - return - } - file, handler, err := r.FormFile("image") - if err != nil { - http.Error(w, "Error al obtener el imagen", http.StatusBadRequest) - log.Println("Error al obtener el imagen") - file.Close() - return - } - defer file.Close() - filetype := handler.Header.Get("content-type") - if filetype != "image/jpeg" && filetype != "image/jpg" && filetype != "image/gif" && filetype != "image/png" { - http.Error(w, "Error de formato en el archivo", http.StatusBadRequest) - log.Println("Error de formato en el archivo") - file.Close() - return - } - dst, err := os.Create("./enrrolados/" + identificador) - if err != nil { - http.Error(w, "Error al enrrolar imagen", http.StatusBadRequest) - log.Println("Error al enrrolar imagen") - file.Close() - dst.Close() - return - } - defer dst.Close() - _, err = io.Copy(dst, file) - if err != nil { - http.Error(w, "Error al almacenar la imagen", http.StatusBadRequest) - log.Println("Error al almacenar la imagen") - file.Close() - dst.Close() - return - } - file.Close() - dst.Close() - addFile(&rec, filepath.Join(fotosDir, identificador), identificador) - rec.SetSamples() - fmt.Fprintf(w, "Enrrolado Exitosamente '%s'\n", identificador) - log.Println("Enrrolado Exitosamente ", identificador) -} diff --git a/main.py b/main.py new file mode 100644 index 0000000..b9d7b89 --- /dev/null +++ b/main.py @@ -0,0 +1,88 @@ +import base64 +import os +import time +import face_recognition +from flask import Flask, request, Response + +PATH_IMAGES_DIR = './enrrolados' +enrrolados_faces = [] +res = os.listdir(PATH_IMAGES_DIR) +app = Flask(__name__) + + +@app.route('/') +def enrrolarhtml(): + return Response(open('enrrolar.html').read(), mimetype="text/html") + + +@app.route('/identificar.html') +def identificarhtml(): + return Response(open('identificar.html').read(), mimetype="text/html") + + +@app.route('/utils.js') +def utilsjs(): + return Response(open('utils.js').read(), mimetype="text/javascript") + + +@app.route('/opencv.js') +def opencvjs(): + return Response(open('opencv.js').read(), mimetype="text/javascript") + + +@app.route('/haarcascade_frontalface_default.xml') +def haarcascade_frontalface_defaultxml(): + return Response(open('haarcascade_frontalface_default.xml').read(), mimetype="application/xml") + + +@app.route('/enrrolar', methods=['POST']) +def enrrolar(): + identificador = request.form.get("id") + file = request.files['image'] + try: + if res.index(identificador) != None: + return Response("Ya existe el identificador: " + identificador) + else: + raise ValueError('Error al encontrar indice del dato') + raise Exception('Error al encontrar indice del dato') + except: + try: + if file.filename != '': + file.save('%s/%s' % (PATH_IMAGES_DIR, identificador)) + face_image = face_recognition.load_image_file(PATH_IMAGES_DIR + '/' + identificador) + unk_face_encoding = face_recognition.face_encodings(face_image)[0] + enrrolados_faces.append(unk_face_encoding) + res.append(identificador) + return Response("Enrrolado Exitosamente " + identificador) + else: + return Response("Error al obtener el imagen") + except: + return Response("Error al enrrolar") + + +@app.route('/identificar', methods=['POST']) +def identificar(): + try: + file = request.files['image'] + nuevonombre = ('%s' % time.strftime("%Y%m%d%H%M%S")) + file.save('%s/%s' % ("./temp", nuevonombre)) + face_image = face_recognition.load_image_file("./temp" + '/' + nuevonombre) + unk_face_encoding = face_recognition.face_encodings(face_image)[0] + results = face_recognition.compare_faces(enrrolados_faces, unk_face_encoding, tolerance=0.6) + return Response(res[results.index(True)]) + except: + return Response("NO IDENTIFICADO") + + +if __name__ == '__main__': + for x in res: + face_image = face_recognition.load_image_file(PATH_IMAGES_DIR + '/' + x) + try: + unk_face_encoding = face_recognition.face_encodings(face_image)[0] + enrrolados_faces.append(unk_face_encoding) + print("Imagen cargada: " + x) + except: + print("Imagen no valida: " + x) + quit() + print("http://localhost:5001") + app.run(debug=True, host='0.0.0.0', port=5001) diff --git a/mmod_human_face_detector.png b/mmod_human_face_detector.png new file mode 100644 index 0000000..a96a14f Binary files /dev/null and b/mmod_human_face_detector.png differ diff --git a/modelos/dlib_face_recognition_resnet_model_v1.dat b/modelos/dlib_face_recognition_resnet_model_v1.dat deleted file mode 100755 index ddb5158..0000000 Binary files a/modelos/dlib_face_recognition_resnet_model_v1.dat and /dev/null differ diff --git a/modelos/mmod_human_face_detector.dat b/modelos/mmod_human_face_detector.dat deleted file mode 100755 index f1f73a5..0000000 Binary files a/modelos/mmod_human_face_detector.dat and /dev/null differ diff --git a/modelos/shape_predictor_5_face_landmarks.dat b/modelos/shape_predictor_5_face_landmarks.dat deleted file mode 100755 index 67878ed..0000000 Binary files a/modelos/shape_predictor_5_face_landmarks.dat and /dev/null differ diff --git a/shape_predictor_5_face_landmarks.png b/shape_predictor_5_face_landmarks.png new file mode 100644 index 0000000..d20ec02 Binary files /dev/null and b/shape_predictor_5_face_landmarks.png differ diff --git a/shape_predictor_68_face_landmarks.png b/shape_predictor_68_face_landmarks.png new file mode 100644 index 0000000..1d2301c Binary files /dev/null and b/shape_predictor_68_face_landmarks.png differ