Сборка без OpenCV
Build and push Docker image / docker (push) Successful in 10s
Details
Build and push Docker image / docker (push) Successful in 10s
Details
This commit is contained in:
parent
2161bbe015
commit
6ca9e7e933
|
|
@ -118,7 +118,7 @@ BLOCKED_PUBLIC_FIGURES=
|
||||||
- экстремизм + инструкции/символика;
|
- экстремизм + инструкции/символика;
|
||||||
- обходные написания (`n_u_d_e`, `l0li`, `ch1ld` и т.п.).
|
- обходные написания (`n_u_d_e`, `l0li`, `ch1ld` и т.п.).
|
||||||
|
|
||||||
Для i2i OpenCV проверяет наличие лица/человека на входном фото: NSFW-промпт в этом случае блокируется.
|
Для i2i: если установлен OpenCV, проверяется наличие лица/человека. В базовом образе OpenCV нет, поэтому NSFW-промпты в i2i блокируются консервативно — как если бы на фото был человек.
|
||||||
|
|
||||||
При блокировке пользователь получает «Запрос нарушает правила. Звёзды не списаны.», а запись с `user_id`, временем, промптом и причиной сохраняется в таблицу `blocked_requests`.
|
При блокировке пользователь получает «Запрос нарушает правила. Звёзды не списаны.», а запись с `user_id`, временем, промптом и причиной сохраняется в таблицу `blocked_requests`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -324,7 +324,7 @@ ON requests(user_id) WHERE status IN ('queued', 'running');
|
||||||
- [x] Админы из `ADMIN_USER_IDS` обходят фильтр.
|
- [x] Админы из `ADMIN_USER_IDS` обходят фильтр.
|
||||||
- [x] Логирование блокировок в `blocked_requests`.
|
- [x] Логирование блокировок в `blocked_requests`.
|
||||||
- [x] Ответ «Запрос нарушает правила. Звёзды не списаны.».
|
- [x] Ответ «Запрос нарушает правила. Звёзды не списаны.».
|
||||||
- [x] i2i: детекция лица/человека через OpenCV.
|
- [x] i2i: OpenCV-детекция при наличии; иначе консервативный ручной флаг.
|
||||||
- [x] Тесты правил и очереди.
|
- [x] Тесты правил и очереди.
|
||||||
|
|
||||||
**DoD:** небезопасный промпт не попадает в очередь, причина пишется в БД, админ может отправлять без фильтра.
|
**DoD:** небезопасный промпт не попадает в очередь, причина пишется в БД, админ может отправлять без фильтра.
|
||||||
|
|
|
||||||
|
|
@ -301,12 +301,18 @@ def is_prompt_allowed(
|
||||||
|
|
||||||
|
|
||||||
def detect_person(path: str | Path) -> bool:
|
def detect_person(path: str | Path) -> bool:
|
||||||
"""Ищет лицо или человека через OpenCV. При ошибке считает, что человека нет."""
|
"""Ищет лицо или человека через OpenCV.
|
||||||
|
|
||||||
|
Если OpenCV не установлен, консервативно считаем, что человек есть:
|
||||||
|
NSFW-запросы в i2i будут блокироваться.
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
import cv2 # type: ignore[import-not-found]
|
import cv2 # type: ignore[import-not-found]
|
||||||
except ImportError:
|
except ImportError:
|
||||||
logger.warning("OpenCV не установлен, детекция людей отключена")
|
logger.warning(
|
||||||
return False
|
"OpenCV не установлен: для i2i считаем, что на фото есть человек"
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
image = cv2.imread(str(path))
|
image = cv2.imread(str(path))
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,3 @@ fastapi>=0.115,<1
|
||||||
uvicorn>=0.30,<1
|
uvicorn>=0.30,<1
|
||||||
jinja2>=3.1,<4
|
jinja2>=3.1,<4
|
||||||
pillow>=10,<13
|
pillow>=10,<13
|
||||||
opencv-python-headless>=4.10,<5
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ def test_extra_public_figures() -> None:
|
||||||
|
|
||||||
|
|
||||||
def test_detect_person_blank_image(tmp_path) -> None:
|
def test_detect_person_blank_image(tmp_path) -> None:
|
||||||
|
pytest.importorskip("cv2")
|
||||||
path = tmp_path / "blank.png"
|
path = tmp_path / "blank.png"
|
||||||
with Image.new("RGB", (320, 240), (255, 255, 255)) as image:
|
with Image.new("RGB", (320, 240), (255, 255, 255)) as image:
|
||||||
image.save(path)
|
image.save(path)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue