diff --git a/README.md b/README.md index 8a5b876..1df2ed4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # πŸš€ BoostFace πŸš€ Welcome to **BoostFace**! The cutting-edge, high-performance face recognition system designed to revolutionize the way we think about real-time identification and tracking. Built with a powerful stack of technologies, BoostFace is your go-to solution for handling high-load, high-concurrency scenarios with ease and efficiency. 🌟 - +## Demo +![img.png](assets/img.png) ## πŸ›  Tech Stack - **Frontend**: Leveraging [Streamlit](https://streamlit.io/) for an intuitive, user-friendly interface, combined with SCRFD for efficient and accurate face detection, and SORT for multi-object tracking. Real-time image transmission is facilitated through Websockets, ensuring a seamless and dynamic user experience. πŸ–₯️ @@ -27,6 +28,7 @@ git clone https://github.com/Atticuszz/boostface.git cd boostface ``` +### prepare - download arcface_onnx model ```bash cd src/Demo/backend/services/inference/model_zoo @@ -34,9 +36,32 @@ wget https://github.com/Atticuszz/BoostFace/releases/download/dataset/models.zip unzip models.zip rm -rf models.zip ``` - -- install env +- init env ```bash cd src/Demo conda env create -f environment.yml +conda activate BoostFace-demo +``` +- register demo face after backend start +```bash +# register demo +python src/Demo/web/inference/utils/register.py +``` + +### run + +- start vector database +```bash +docker-compose up src/Demo/backend/services/db/milvus-standalone-docker-compose.yml +``` + +- start backend +```bash +# run backend +python src/Demo/backend/main.py +``` + +- start web +```bash +streamlit run src/Demo/web/main.py ``` diff --git a/assets/img.png b/assets/img.png new file mode 100644 index 0000000..53542aa Binary files /dev/null and b/assets/img.png differ diff --git a/doc/face_track_dateset.pdf b/doc/face_track_dateset.pdf deleted file mode 100644 index fcb44d8..0000000 Binary files a/doc/face_track_dateset.pdf and /dev/null differ diff --git a/doc/paper.docx b/doc/paper.docx deleted file mode 100644 index e69de29..0000000 diff --git a/doc/scrfd.pdf b/doc/scrfd.pdf deleted file mode 100644 index 1ec6c0d..0000000 Binary files a/doc/scrfd.pdf and /dev/null differ diff --git a/src/Demo/backend/common/web_socket_manager.py b/src/Demo/backend/common/web_socket_manager.py index 66242a4..8df6882 100644 --- a/src/Demo/backend/common/web_socket_manager.py +++ b/src/Demo/backend/common/web_socket_manager.py @@ -1,10 +1,11 @@ from contextlib import asynccontextmanager -from backend.core.config import logger from fastapi import WebSocket from pydantic import BaseModel from starlette.websockets import WebSocketState +from ..core.config import logger + class WebSocketManager: """WebSocket manager""" diff --git a/src/Demo/backend/main.py b/src/Demo/backend/main.py index a195a8c..67b1d18 100644 --- a/src/Demo/backend/main.py +++ b/src/Demo/backend/main.py @@ -1,11 +1,12 @@ import subprocess import uvicorn -from backend.core.events import lifespan from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from pygizmokit.rich_logger import set_up_logging +from src.Demo.backend.core.events import lifespan + set_up_logging() @@ -22,7 +23,7 @@ def create_app() -> FastAPI: ) # Include the routers - from backend.api import auth_router, identify_router + from src.Demo.backend.api import auth_router, identify_router app.include_router(auth_router) app.include_router(identify_router) diff --git a/src/Demo/backend/services/db/operations.py b/src/Demo/backend/services/db/operations.py index 4a1bd17..0bde8e4 100644 --- a/src/Demo/backend/services/db/operations.py +++ b/src/Demo/backend/services/db/operations.py @@ -28,7 +28,6 @@ def __init__(self, threshold=0.5): self._client.collection.load(timeout=10) utility.wait_for_loading_complete(self._client.collection.name, timeout=10) - # @profile def search(self, embedding: Embedding) -> MatchedResult: """ :param embedding: must be normed @@ -53,9 +52,6 @@ def stop_client(self): self._client.shut_down() -# TODO: register if the operation is registered instead of identify - - class Registrar: def __init__(self): self._client = MilvusClient() diff --git a/src/Demo/web/data/image/Friends/simple/chandler.png b/src/Demo/web/data/image/Friends/simple/chandler.png new file mode 100644 index 0000000..aaa4843 Binary files /dev/null and b/src/Demo/web/data/image/Friends/simple/chandler.png differ diff --git a/src/Demo/web/data/image/Friends/simple/joey.png b/src/Demo/web/data/image/Friends/simple/joey.png new file mode 100644 index 0000000..3563d46 Binary files /dev/null and b/src/Demo/web/data/image/Friends/simple/joey.png differ diff --git a/src/Demo/web/data/image/Friends/simple/monica.png b/src/Demo/web/data/image/Friends/simple/monica.png index 8cfa2a6..ae45c97 100644 Binary files a/src/Demo/web/data/image/Friends/simple/monica.png and b/src/Demo/web/data/image/Friends/simple/monica.png differ diff --git a/src/Demo/web/data/image/Friends/simple/phoebe.jpeg b/src/Demo/web/data/image/Friends/simple/phoebe.jpeg new file mode 100644 index 0000000..ecdcd2d Binary files /dev/null and b/src/Demo/web/data/image/Friends/simple/phoebe.jpeg differ diff --git a/src/Demo/web/data/image/Friends/simple/rachel.png b/src/Demo/web/data/image/Friends/simple/rachel.png new file mode 100644 index 0000000..ae351c9 Binary files /dev/null and b/src/Demo/web/data/image/Friends/simple/rachel.png differ diff --git a/src/Demo/web/data/image/Friends/simple/ross.jpeg b/src/Demo/web/data/image/Friends/simple/ross.jpeg new file mode 100644 index 0000000..70a3c4b Binary files /dev/null and b/src/Demo/web/data/image/Friends/simple/ross.jpeg differ diff --git a/src/Demo/web/inference/utils/register.py b/src/Demo/web/inference/utils/register.py index 88976f4..4d55af3 100644 --- a/src/Demo/web/inference/utils/register.py +++ b/src/Demo/web/inference/utils/register.py @@ -10,15 +10,12 @@ from pathlib import Path import cv2 -from web.inference.common import ImageFaces -from web.inference.component.detector import Detector -from web.settings import DetectorConfig -IMAGE_PATH = r"/home/atticuszz/DevSpace/python/BoostFace/src/boostface/dataset_loader/data/lfw-deepfunneled/lfw-deepfunneled" -# IMAGE_PATH = ( -# "/home/atticuszz/DevSpace/python/BoostFace/src/Demo/web/data/image/Friends/simple" -# ) -# paper: ι«˜εΉΆε‘ζ³¨ε†ŒδΊΊθ„Έ +from src.Demo.web.inference.common import ImageFaces +from src.Demo.web.inference.component.detector import Detector +from src.Demo.web.inference.settings import DetectorConfig + +IMAGE_PATH = Path(__file__).parents[2] / r"data/image/Friends/simple" import asyncio