Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37c219d979 | ||
|
|
5783d84132 | ||
|
|
1cfa2c3026 | ||
|
|
0362e9f0b1 | ||
|
|
c7ab8d0d23 | ||
|
|
a6c9c9c002 | ||
|
|
c70f6c46a8 | ||
|
|
cc63d22fac | ||
|
|
6fa419722e | ||
|
|
8b19595cf3 | ||
|
|
3005d40384 |
No files matched your search
@@ -0,0 +1,56 @@
|
|||||||
|
name: FaceSaver
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-docker:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# 1. Клонируем репозиторий
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
# 2. (Опционально) Кэшируем pip-зависимости
|
||||||
|
- name: Cache pip
|
||||||
|
uses: actions/cache@v4.2.0
|
||||||
|
with:
|
||||||
|
path: ~/.cache/pip
|
||||||
|
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
|
# 3. Устанавливаем Python 3.10
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
cache: 'pip' # Дополнительное кэширование pip. Можно отключить, если выше используете ручной кэш.
|
||||||
|
|
||||||
|
# 4. Устанавливаем зависимости
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip install --upgrade pip && pip install -r requirements.txt
|
||||||
|
|
||||||
|
# 5. Собираем Docker-образ (следите, чтобы Dockerfile учитывал Python)
|
||||||
|
- name: Build Docker image
|
||||||
|
run: docker build -t face-saver:latest .
|
||||||
|
|
||||||
|
# 6. (Опционально) Пушим Docker-образ в Docker Hub/GHCR
|
||||||
|
# - name: Login to Docker Hub
|
||||||
|
# run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
|
||||||
|
#
|
||||||
|
# - name: Push Docker image
|
||||||
|
# run: docker push face-saver:latest
|
||||||
|
|
||||||
|
# 7. Отправляем статус в Telegram
|
||||||
|
- name: Tele-status
|
||||||
|
uses: kohchihao/tele-status@0.0.4
|
||||||
|
with:
|
||||||
|
# В реальном проекте используйте Secrets!
|
||||||
|
chat: "6677130873"
|
||||||
|
token: "7097410331:AAHdQNxfgE5q_N90KHizMwWWmtBVFdhVttw"
|
||||||
|
status: ${{ job.status }}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
name: Docker
|
||||||
|
|
||||||
|
# This workflow uses actions that are not certified by GitHub.
|
||||||
|
# They are provided by a third-party and are governed by
|
||||||
|
# separate terms of service, privacy policy, and support
|
||||||
|
# documentation.
|
||||||
|
|
||||||
|
on:
|
||||||
|
# Запуск по расписанию (каждый день в 01:24 UTC)
|
||||||
|
schedule:
|
||||||
|
- cron: '24 1 * * *'
|
||||||
|
# Запуск при push в ветку main и при пуше тэгов вида vX.Y.Z
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
tags: [ 'v*.*.*' ]
|
||||||
|
# Запуск при создании Pull Request в ветку main
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
# Можно заменить на docker.io, если публикуете на Docker Hub
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
# По умолчанию будет <ваш-аккаунт>/<название-репо>
|
||||||
|
IMAGE_NAME: ${{ github.repository }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# 1. Клонируем репозиторий
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# 2. (Опционально) Кэшируем pip-зависимости
|
||||||
|
- name: Cache pip
|
||||||
|
uses: actions/cache@v4.2.0
|
||||||
|
with:
|
||||||
|
path: ~/.cache/pip
|
||||||
|
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
|
# 3. Устанавливаем Python 3.10
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
# build-in cache for pip in setup-python@v4 (можно отключить, если используете выше)
|
||||||
|
cache: 'pip'
|
||||||
|
|
||||||
|
# 4. Устанавливаем зависимости
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# 5. Устанавливаем cosign (кроме Pull Request)
|
||||||
|
- name: Install cosign
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 # v3.5.0
|
||||||
|
with:
|
||||||
|
cosign-release: 'v2.2.4'
|
||||||
|
|
||||||
|
# 6. Настраиваем Buildx для Docker
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0
|
||||||
|
|
||||||
|
# 7. Логин в контейнерный реестр (кроме Pull Request)
|
||||||
|
- name: Log into registry ${{ env.REGISTRY }}
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# 8. Извлекаем метаданные для образа (теги, лейблы)
|
||||||
|
- name: Extract Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
|
||||||
|
# 9. Собираем и пушим Docker-образ (не пушим при Pull Request)
|
||||||
|
- name: Build and push Docker image
|
||||||
|
id: build-and-push
|
||||||
|
uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
# 10. Подписываем опубликованный Docker-образ (кроме Pull Request)
|
||||||
|
- name: Sign the published Docker image
|
||||||
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
|
env:
|
||||||
|
TAGS: ${{ steps.meta.outputs.tags }}
|
||||||
|
DIGEST: ${{ steps.build-and-push.outputs.digest }}
|
||||||
|
run: |
|
||||||
|
echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
|
||||||
|
|
||||||
|
# 11. Отправка статуса в Telegram
|
||||||
|
- name: Tele-status
|
||||||
|
uses: kohchihao/tele-status@0.0.4
|
||||||
|
with:
|
||||||
|
# В реальном проекте храните в Secrets!
|
||||||
|
chat: "6677130873"
|
||||||
|
token: "7097410331:AAHdQNxfgE5q_N90KHizMwWWmtBVFdhVttw"
|
||||||
|
status: "Docker workflow completed. Build status: ${{ job.status }}"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Dockerfile
|
||||||
|
FROM python:3.10-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY requirements.txt ./
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
CMD ["python", "main.py"]
|
||||||
@@ -1,40 +1,117 @@
|
|||||||
# Проект "E.D.I.T.H. - распознавание лиц с веб-камеры"
|
# FaceSaver
|
||||||
|
|
||||||
![E.D.I.T.H.]
|
Добро пожаловать в **FaceSaver** — гибкое решение на базе Python для детектирования лиц с веб-камеры, хранения уникальных изображений лиц и предотвращения дублирования за счет использования механизмов хэширования изображений.
|
||||||
|
|
||||||
## Описание проекта
|
## Оглавление
|
||||||
|
- [Описание](#описание)
|
||||||
|
- [Особенности](#особенности)
|
||||||
|
- [Требования](#требования)
|
||||||
|
- [Установка](#установка)
|
||||||
|
- [Запуск](#запуск)
|
||||||
|
- [Структура проекта](#структура-проекта)
|
||||||
|
- [Применение](#применение)
|
||||||
|
- [Поддержка и вклад](#поддержка-и-вклад)
|
||||||
|
- [Лицензия](#лицензия)
|
||||||
|
|
||||||
Проект E.D.I.T.H. (Even Dead, I'm The Hero) посвящен распознаванию лиц с использованием веб-камеры. Он назван в честь искусственного интеллекта из фильма "Человек-паук: Вдали от дома", который предоставляет доступ к спутниковой сети Stark Industries.
|
---
|
||||||
|
|
||||||
### Возможности
|
## Описание
|
||||||
|
|
||||||
1. **Распознавание лиц**: Программа сканирует видеопоток с веб-камеры и автоматически обнаруживает лица на кадрах.
|
**FaceSaver** использует возможности библиотеки OpenCV для обнаружения лиц в режиме реального времени и сохраняет каждое уникальное лицо в папку `faces`. Для определения уникальности лица используется библиотека [ImageHash](https://github.com/JohannesBuchner/imagehash) и алгоритм усредненного хэша (average hash).
|
||||||
2. **Сохранение лиц**: Обнаруженные лица сохраняются в отдельную папку "faces" с уникальным временным отметками и номером лица.
|
Если обнаруженное лицо уже похоже на ранее сохраненное (с учетом заданного порога сходства), оно **не** будет сохранено повторно. Таким образом, вы получаете упорядоченную коллекцию изображений лиц без избыточных дубликатов.
|
||||||
3. **Уникальность лиц**: Проверка на уникальность лиц перед сохранением осуществляется с помощью хэширования изображений лиц.
|
|
||||||
4. **Интерфейс**: В реальном времени отображает видеопоток с выделенными прямоугольниками вокруг обнаруженных лиц.
|
|
||||||
|
|
||||||
## Настройка проекта
|
---
|
||||||
|
|
||||||
### Установка зависимостей
|
## Особенности
|
||||||
|
1. **Реальное время**: обработка видеопотока в режиме реального времени.
|
||||||
|
2. **Уникальность**: предотвращение дублирования благодаря сравнению хэшей изображений.
|
||||||
|
3. **Гибкость**: настройка уровня чувствительности (`tolerance`) для учета небольших изменений (ракурсов, освещения и т.д.).
|
||||||
|
4. **Простота использования**: удобный запуск из бат-файла или напрямую из Python.
|
||||||
|
|
||||||
Для корректной работы проекта требуется Python 3.x и следующие библиотеки:
|
---
|
||||||
|
|
||||||
```bash
|
## Требования
|
||||||
pip install opencv-python Pillow imagehash
|
Для работы проекта необходим Python 3.7+ и следующие пакеты:
|
||||||
|
|
||||||
|
1. [OpenCV](https://opencv.org/) (установить можно через pip: `pip install opencv-python`)
|
||||||
|
2. [Pillow](https://pillow.readthedocs.io/en/stable/) (установить: `pip install pillow`)
|
||||||
|
3. [ImageHash](https://github.com/JohannesBuchner/imagehash) (установить: `pip install imagehash`)
|
||||||
|
|
||||||
|
Также потребуется веб-камера, физическая или виртуальная.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Установка
|
||||||
|
1. **Склонируйте или загрузите репозиторий**:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/ваш-аккаунт/FaceSaver.git
|
||||||
|
cd FaceSaver
|
||||||
|
```
|
||||||
|
2. **Установите зависимости**:
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
> При отсутствии файла `requirements.txt` установите пакеты вручную:
|
||||||
|
> ```bash
|
||||||
|
> pip install opencv-python pillow imagehash
|
||||||
|
> ```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
Доступны два основных способа запуска:
|
||||||
|
|
||||||
|
1. **Через Python**:
|
||||||
|
```bash
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
2. **Через бат-файл (Windows)**:
|
||||||
|
- Дважды кликните по файлу `start.bat`, или
|
||||||
|
- Запустите командой:
|
||||||
|
```bash
|
||||||
|
start.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
> После запуска откроется окно видеопотока с веб-камеры, где вокруг обнаруженных лиц будут отображаться прямоугольники.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
FaceSaver/
|
||||||
|
│ main.py # Основной скрипт детектирования лиц
|
||||||
|
│ start.bat # Файл для быстрого запуска
|
||||||
|
│ README.md # Документация (то, что вы сейчас читаете)
|
||||||
|
│
|
||||||
|
└── faces/ # Папка для сохраненных уникальных лиц
|
||||||
```
|
```
|
||||||
|
|
||||||
### Подготовка к запуску
|
---
|
||||||
|
|
||||||
1. **Хэр-каскады OpenCV**: Убедитесь, что у вас есть файл `haarcascade_frontalface_default.xml`, который используется для обнаружения лиц. Он поставляется вместе с библиотекой OpenCV.
|
## Применение
|
||||||
|
1. При запуске **FaceSaver** в реальном времени обрабатывает поток с вашей веб-камеры.
|
||||||
2. **Создание папки для лиц**: Программа автоматически создаст папку "faces" в корневом каталоге проекта, если её нет.
|
2. При обнаружении нового лица программа сохраняет его в папку `faces` с меткой времени, если его хэш не совпадает с уже сохранёнными.
|
||||||
|
3. Если лицо уже встречалось ранее (определяется через функцию `is_similar_hash()`), оно не сохраняется повторно, что экономит место и упрощает поиск нужных изображений.
|
||||||
|
|
||||||
## Первый запуск
|
**Пример использования**:
|
||||||
|
- Создание базы лиц для системы безопасности или учёта.
|
||||||
|
- Сбор уникальных фотографий одной и той же персоны под разными углами и освещением.
|
||||||
|
- Разработка проектов в области компьютерного зрения, где требуется де-дубликация изображений.
|
||||||
|
|
||||||
1. Запустите скрипт `face_recognition.py`.
|
---
|
||||||
2. При первом запуске программа запросит доступ к веб-камере.
|
|
||||||
3. Для выхода нажмите клавишу 'q'.
|
## Поддержка и вклад
|
||||||
|
Приветствуются все виды вклада в проект:
|
||||||
|
- Сообщения об ошибках (issue) в [репозитории](#) (добавьте свою ссылку).
|
||||||
|
- Предложения новых возможностей через pull-request.
|
||||||
|
- Связь с автором по электронной почте или любым удобным способом.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Лицензия
|
## Лицензия
|
||||||
|
**FaceSaver** распространяется на условиях [MIT License](LICENSE) (при необходимости добавьте файл LICENSE). Это означает, что вы можете свободно использовать, изменять и распространять проект в любых целях при условии сохранения оригинальных уведомлений об авторстве.
|
||||||
|
|
||||||
Этот проект лицензируется по лицензии [MIT](LICENSE).
|
---
|
||||||
|
|
||||||
|
> _Спасибо, что используете **FaceSaver**! Мы будем рады вашей обратной связи и участию в развитии проекта._
|
||||||
@@ -41,6 +41,7 @@ while True:
|
|||||||
minSize=(30, 30)
|
minSize=(30, 30)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Сохранение каждого нового обнаруженного лица
|
# Сохранение каждого нового обнаруженного лица
|
||||||
for i, (x, y, w, h) in enumerate(faces):
|
for i, (x, y, w, h) in enumerate(faces):
|
||||||
face_img = frame[y:y + h, x:x + w]
|
face_img = frame[y:y + h, x:x + w]
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# requirements.txt
|
||||||
|
|
||||||
|
ImageHash==4.3.1
|
||||||
|
numpy==2.0.2
|
||||||
|
opencv-python==4.10.0.84
|
||||||
|
pillow==11.0.0
|
||||||
|
PyWavelets==1.6.0
|
||||||
|
scipy==1.13.1
|
||||||
Reference in new issue
Block a user