API 요청
/rest/image_similarity요청 파라미터 3개 · 필수 2
imagecompare_image1compare_image2응답 필드 11개
datadata.outputdata.output.compare_image1data.output.compare_image2data.output.compare_image3data.successapiapi.successapi.costapi.msapi.pl_id기준 이미지 한 장과 비교 이미지 여러 장을 올리면 비교 이미지마다 기준 이미지와 얼마나 비슷한지 0~1 점수로 돌려줍니다.
https://apick.app/rest/image_similarity왜 이미지 유사도 비교인가
도용 상품 사진이나 중복 등록을 사람이 눈으로 비교하면 놓치고 지칩니다. 기준 이미지와 비교 이미지를 보내면 유사도를 분석해 의심 건을 바로 골라낼 수 있습니다.
REQUEST_TOO_LARGE 오류가 반환되며 과금되지 않습니다.
중복 상품 사진 찾기, 원본 이미지 도용 확인, 업로드 이미지가 등록된 이미지와 같은지 검사할 때 사용합니다. PNG·JPEG·WEBP·BMP 이미지를 받습니다.
비교 이미지는 compare_image1, compare_image2, compare_image3 … 처럼 1부터 빠짐없이 번호를 붙여 최대 1,000장까지 보냅니다. 번호가 중간에 빠지면 그 뒤의 이미지는 비교하지 않습니다.
점수는 비슷한 이미지일수록 1에 가깝습니다. 몇 점부터 같은 이미지로 볼지는 실제 데이터로 점수 분포를 확인해 정하세요.
요금은 기본 10P에 비교 이미지 1장당 2P가 더해집니다(비교 이미지 3장이면 10P + 6P). 실패·시간 초과 응답은 과금되지 않습니다.
/rest/image_similarityimagecompare_image1compare_image2datadata.outputdata.output.compare_image1data.output.compare_image2data.output.compare_image3data.successapiapi.successapi.costapi.msapi.pl_idPOST https://apick.app/rest/image_similarityAuthorization: Bearer 내 계정의 API 인증키multipart/form-data상황별로 보내는 값과 응답에서 확인할 값을 모았습니다. 언어 탭에서 그대로 복사해 쓸 수 있습니다.
등록된 원본과 새로 올라온 이미지가 같은지 확인합니다.
/rest/image_similaritycurl --fail-with-body --request POST 'https://apick.app/rest/image_similarity' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'image=@./original.jpg' \
--form 'compare_image1=@./candidate1.jpg'import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./original.jpg")]), "original.jpg");
form.append("compare_image1", new Blob([await readFile("./candidate1.jpg")]), "candidate1.jpg");
const response = await fetch("https://apick.app/rest/image_similarity", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
body: form,
signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);import os
import requests
parts = [
("image", ("original.jpg", open("./original.jpg", "rb"))),
("compare_image1", ("candidate1.jpg", open("./candidate1.jpg", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/image_similarity",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'image' => new CURLFile('./original.jpg'),
'compare_image1' => new CURLFile('./candidate1.jpg'),
];
$curl = curl_init('https://apick.app/rest/image_similarity');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $form,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);data.output.compare_image1이 1에 가까울수록 비슷합니다. 기준 점수는 실제 데이터로 정하세요.중복 상품 사진을 찾을 때 비교 이미지를 compare_image1부터 번호를 이어서 여러 장 보냅니다(최대 1,000장).
/rest/image_similaritycurl --fail-with-body --request POST 'https://apick.app/rest/image_similarity' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'image=@./original.jpg' \
--form 'compare_image1=@./a.jpg' \
--form 'compare_image2=@./b.jpg' \
--form 'compare_image3=@./c.jpg'import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./original.jpg")]), "original.jpg");
form.append("compare_image1", new Blob([await readFile("./a.jpg")]), "a.jpg");
form.append("compare_image2", new Blob([await readFile("./b.jpg")]), "b.jpg");
form.append("compare_image3", new Blob([await readFile("./c.jpg")]), "c.jpg");
const response = await fetch("https://apick.app/rest/image_similarity", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
body: form,
signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);import os
import requests
parts = [
("image", ("original.jpg", open("./original.jpg", "rb"))),
("compare_image1", ("a.jpg", open("./a.jpg", "rb"))),
("compare_image2", ("b.jpg", open("./b.jpg", "rb"))),
("compare_image3", ("c.jpg", open("./c.jpg", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/image_similarity",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'image' => new CURLFile('./original.jpg'),
'compare_image1' => new CURLFile('./a.jpg'),
'compare_image2' => new CURLFile('./b.jpg'),
'compare_image3' => new CURLFile('./c.jpg'),
];
$curl = curl_init('https://apick.app/rest/image_similarity');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $form,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);data.output의 키(compare_image1 …)마다 점수가 옵니다. 가장 높은 키가 가장 비슷한 이미지입니다.HTTP 성공과 업무 결과를 구분하세요. 경로별 응답 필드와 예시는 위 요청과 응답에 함께 있습니다.
{
"data": {
"output": {
"compare_image1": 0.8199545438545536,
"compare_image2": 0.5330405783587735,
"compare_image3": 0.9999999852726211
},
"success": 1
},
"api": {
"success": true,
"cost": 16,
"ms": 1023,
"pl_id": 1237778
}
}위 예시에서 compare_image3은 기준 이미지와 사실상 같은 이미지이고, compare_image2는 다른 이미지로 볼 수 있습니다.
compare_image1, compare_image2 …)을 키로, 기준 이미지와의 유사도 0~1을 값으로 담은 객체입니다. 1에 가까울수록 비슷하며, 보낸 비교 이미지 수만큼 키가 있습니다.0~1입니다. 1에 가까울수록 비슷합니다.1: 성공(과금), 0: 실패, 3: 시간 초과(과금 없음).응답을 아래 순서로 확인하세요. 결과 유무와 과금 여부는 서로 다릅니다.
data.error(사유 문구)와 data.success=0을 돌려줍니다. HTTP 상태는 사유에 따라 400·404·408·424 중 하나입니다.api.cost는 0이며 과금되지 않습니다. data.error 문구를 그대로 기록하고 사용자에게 보여 주세요.{
"data": {
"error": "입력값을 확인해 주세요.",
"success": 0
},
"api": {
"success": true,
"cost": 0,
"ms": 5
}
}실패하면 data.error에 문구가 담기고 api.cost는 0입니다.
image와 compare_image1을 모두 보냈는지 확인하세요.data.success가 3입니다. 비교 이미지 수를 줄여 나눠 요청하세요.FORM_DATA_INVALIDFORM_DATA_FIELD_CONFLICTMULTIPART_LIMIT_OR_PARSE_ERROR실제 차감 금액은 응답의 api.cost로 확인하세요. 상세 요금은 요금정책에서 볼 수 있습니다.
기준 이미지 1장과 비교 이미지를 compare_image1 부터 순서대로 붙여 보냅니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다.