REST API. Розмиття облич та номерних знаків на фото

Watermarkly Blur API автоматично виявляє та розмиває обличчя й номерні знаки на зображеннях. API повністю працює на інфраструктурі AWS і дбає про конфіденційність — ваші файли ніколи не використовуються для навчання моделей ШІ. Ми використовуємо AWS Lambda для паралельної обробки тисяч запитів, що забезпечує надійну продуктивність і доступність у кількох регіонах світу.

Спробувати безкоштовно

Ми продаємо API через AWS Marketplace. Вартість: $0.01 / запит. Доступний безкоштовний 7-денний пробний період.


Основні можливості

✓ Автоматично виявляє та розмиває номерні знаки й обличчя на зображеннях

✓ За бажанням замінює номерні знаки на логотип вашого проєкту або компанії.

✓ Може змінювати розмір, обрізати або конвертувати оброблені зображення.

✓ Підтримує до 500 запитів на секунду.

✓ Обробляє зображення паралельно для швидшої роботи.

✓ Максимальний підтримуваний розмір зображення: 6000 × 6000 пікселів.

✓ API-запити потребують автентифікації через API-ключ.

Якщо вам потрібна швидша обробка, підтримка більших зображень або вища швидкість запитів, зв’яжіться з нами за адресою api-support@watermarkly.com.


Приклади результатів

Обличчя жінки та номерний знак розмито.

API для розмиття облич та номерних знаків на зображеннях

Номерний знак замінено на логотип компанії, а обличчя жінки розмито.

API для розмиття облич та номерних знаків на зображеннях

Отримати API

Ми продаємо API через AWS Marketplace. Вартість: $0.01 / запит. Доступний безкоштовний 7-денний пробний період.


Деталі обробки

  • Оброблені зображення не зберігаються на наших серверах.
  • Сервіс приймає зображення у форматах JPEG, PNG, WEBP, AVIF, HEIC/HEIF.
  • Зображення AVIF та HEIF будуть конвертовані у JPEG, якщо не вказано інший формат.
  • Максимальний розмір вхідного зображення:
    • GET-запити: 20 МБ або 6000x6000 пікселів.
    • POST-запити: 6 МБ або 6000x6000 пікселів.
  • Обмеження швидкості API:
    • 500 паралельних запитів
    • 500 запитів на секунду
    • 100 000 запитів на день

Кінцеві точки API

Регіони

Наразі ми надаємо API у двох регіонах:

Ви можете використовувати будь-яку кінцеву точку на свій розсуд. Другу кінцеву точку можна використовувати як резервну на випадок недоступності одного регіону AWS. Якщо вам потрібен API в іншому регіоні, повідомте нас.

Методи запитів

Ви можете надсилати зображення для обробки за допомогою GET або POST запитів. Якщо ваші зображення загальнодоступні, рекомендуємо використовувати GET-запити, оскільки вони дещо швидші за POST-запити.

Розмиття зображення за допомогою GET-запиту (рекомендовано)

GET https://blur-api-eu1.watermarkly.com/blur/?url={image_url}

або

GET https://blur-api-us1.watermarkly.com/blur/?url={image_url}

Сервіс завантажує зображення з image_url та обробляє його.

Запит

  • Метод: GET
  • Заголовки:
    • x-api-key: Ваш API-ключ
  • Параметри URL-запиту:
    • url (Обов’язковий): Повна URL-адреса зображення для обробки.
    • blur_intensity (Необов’язковий): Число з плаваючою комою від 0.0 до 20.0, що регулює інтенсивність розмиття. За замовчуванням: 1.0. Значення 0.0 вимикає розмиття.
    • file_size (Необов’язковий): Вказує бажаний розмір вихідного файлу в байтах. Сервіс намагається повернути зображення, яке не перевищує цей розмір.
    • width (Необов’язковий): Вказує бажану ширину вихідного зображення.
    • height (Необов’язковий): Вказує бажану висоту вихідного зображення.
    • format (Необов’язковий): Вказує бажаний формат вихідного зображення. Можливі значення: JPEG, PNG, WEBP.
    • logo_url (Необов’язковий): URL-адреса файлу логотипу для розміщення на номерних знаках. Може бути HTTP URL або data URL. Переконайтеся, що URL правильно екранований перед передачею як параметр запиту.
    • logo_size (Необов’язковий): Вказує розмір логотипу як число від 0.1 до 1.0.
    • plate_screws (Необов’язковий): Додає гвинти на номерні знаки. Працює лише разом з параметром logo_url.
    • detection_threshold (Необов’язковий): Число з плаваючою комою від 0.01 до 1.0, що контролює поріг впевненості при розпізнаванні облич та номерних знаків. Нижчі значення розпізнають більше об’єктів, але можуть давати хибні спрацювання; вищі значення розпізнають менше об’єктів, але з більшою точністю. За замовчуванням: 0.15 для облич, 0.3 для номерних знаків.
    • blur_padding (Необов’язковий): Ціле число від 0 до 100, що контролює додатковий відступ (у пікселях) навколо розпізнаних облич та номерних знаків. Збільшення цього значення розширює область розмиття за межі розпізнаної ділянки. За замовчуванням: 0 (без додаткового відступу).

Відповідь

Успішна відповідь: (HTTP-статус: 200) Сервіс повертає оброблене зображення в одному з форматів: JPEG, PNG, WEBP.

Відповідь з помилкою: (HTTP-статус: 500, 403)

{
  "message": "Error message"
}

Розмиття зображення за допомогою POST-запиту

POST https://blur-api-eu1.watermarkly.com/blur/

або

POST https://blur-api-us1.watermarkly.com/blur/

Надсилає зображення для обробки.

Запит

  • Метод: POST
  • Content-Type: application/octet-stream
  • Заголовки:
    • x-api-key: Ваш API-ключ
  • Параметри запиту:
    • blur_intensity (Необов’язковий): Число з плаваючою комою від 0.0 до 20.0, що регулює інтенсивність розмиття. За замовчуванням: 1.0. Значення 0.0 вимикає розмиття.
    • file_size (Необов’язковий): Вказує бажаний розмір вихідного файлу в байтах. Сервіс намагається повернути зображення, яке не перевищує цей розмір.
    • width (Необов’язковий): Вказує бажану ширину вихідного зображення.
    • height (Необов’язковий): Вказує бажану висоту вихідного зображення.
    • format (Необов’язковий): Вказує бажаний формат вихідного зображення. Можливі значення: JPEG, PNG, WEBP.
    • logo_url (Необов’язковий): URL-адреса файлу логотипу для розміщення на номерних знаках. Може бути HTTP URL або data URL. Переконайтеся, що URL правильно екранований перед передачею як параметр запиту.
    • logo_size (Необов’язковий): Вказує розмір логотипу як число від 0.1 до 1.0.
    • plate_screws (Необов’язковий): Додає гвинти на номерні знаки. Працює лише разом з параметром logo_url.
    • detection_threshold (Необов’язковий): Число з плаваючою комою від 0.01 до 1.0, що контролює поріг впевненості при розпізнаванні облич та номерних знаків. Нижчі значення розпізнають більше об’єктів, але можуть давати хибні спрацювання; вищі значення розпізнають менше об’єктів, але з більшою точністю. За замовчуванням: 0.15 для облич, 0.3 для номерних знаків.
    • blur_padding (Необов’язковий): Ціле число від 0 до 100, що контролює додатковий відступ (у пікселях) навколо розпізнаних облич та номерних знаків. Збільшення цього значення розширює область розмиття за межі розпізнаної ділянки. За замовчуванням: 0 (без додаткового відступу).

Відповідь

Успішна відповідь: (HTTP-статус: 200) Сервіс повертає оброблене зображення в одному з форматів: JPEG, PNG, WEBP.

Відповідь з помилкою: (HTTP-статус: 500, 403)

{
  "message": "Error message"
}

Приклади використання

Python

import requests
import urllib.parse

API_KEY = 'your_api_key'
API_URL = 'https://blur-api-eu1.watermarkly.com/blur/'

input_path = ''       # Шлях до локального зображення
output_path = ''      # Шлях для збереження результату

# Розмиття зображення за допомогою POST-запиту
with open(input_path, 'rb') as image_file:
    response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
    if response.status_code == 429:
        # Перевищено ліміт запитів API, зачекайте трохи
        time.sleep(0.1)
        response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
# Збереження обробленого зображення локально
with open(output_path, 'wb') as f:
    f.write(response.content)


# Розмиття зображення за допомогою GET-запиту
encoded_url = urllib.parse.quote("https://nikitin.io/eqe.jpg", safe='')
response = requests.get(API_URL + "?url=" + encoded_url, headers={'x-api-key': API_KEY})
# Збереження відповіді локально
with open(output_path, 'wb') as f:
    f.write(response.content)

NodeJS

import { promises as fs } from "node:fs";

const API_KEY = 'your_api_key';
const API_URL = 'https://blur-api-eu1.watermarkly.com/blur/';

// Допоміжна функція для паузи виконання на задану кількість мілісекунд
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

(async () => {
  // Розмиття зображення за допомогою POST-запиту
  try {
    const inputPath = 'input_path_here';   // Замініть на ваш реальний шлях до вхідного файлу
    const outputPath = 'output_path_here'; // Замініть на ваш реальний шлях для збереження

    // Асинхронне читання файлу зображення як бінарних даних
    const imageData = await fs.readFile(inputPath);

    let response = await fetch(API_URL, {
      method: 'POST',
      headers: {
        'x-api-key': API_KEY,
        'Content-Type': 'application/octet-stream'
      },
      body: imageData
    });

    if (response.status === 429) {
      // Перевищено ліміт запитів API, зачекайте трохи
      await sleep(100); // пауза на 0.1 секунди
      response = await fetch(API_URL, {
        method: 'POST',
        headers: {
          'x-api-key': API_KEY,
          'Content-Type': 'application/octet-stream'
        },
        body: imageData
      });
    }
    // Асинхронне збереження обробленого зображення локально
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    await fs.writeFile(outputPath, buffer);
  } catch (error) {
    console.error('Error during POST request:', error);
  }

  // Розмиття зображення за допомогою GET-запиту
  try {
    const outputPath = 'output_path_here'; // Замініть на ваш реальний шлях для збереження
    const encodedUrl = encodeURIComponent("https://nikitin.io/eqe.jpg"); // Кодування URL
    const response = await fetch(`${API_URL}?url=${encodedUrl}`, {
      method: 'GET',
      headers: {
        'x-api-key': API_KEY
      }
    });
    // Асинхронне збереження відповіді локально
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    await fs.writeFile(outputPath, buffer);
  } catch (error) {
    console.error('Error during GET request:', error);
  }
})();