카카오에서 제공하는 Karlo (인공지능 이미지 생성 기능)가 v2 버전으로 상향 되었다. 물론 v1도 아직까지는 사용가능하지만 기능이 한층 더 상향된 v2를 권장하기에 이번에 변경된 API 기능에 대해 소개하려고한다.
카카오 Karlo v2 업그레이드 안내문
본 포스팅은 앞서 작성한 포스팅 v1 포스팅을 이용하여 진행하였으며 v2에서 요청 파라미터 및 응답 파라미터에 많은 부분들이 변경되었다. 자세한 옵션등은 아래의 카카오 Karlo API 문서를 살펴보도록 하자
참고로 이번에 소개할 예제는 아래와 같다.
| prompt(명령어)를 입력하면 이미지를 생성해 준다.
2. 이미지 확대하기 (upscale)
| scale 값을 입력하면 이미지를 비율에 맞게 확대해준다.
3. 이미지 변환하기 (variations)
| image 이미지를 전송하면 다른 스타일의 이미지로 만들어준다.
4. 이미지 편집하기 (inpainting)
| 명령어를 통해 원본 이미지와 마스킹된 영역의 이미지를 기준으로 변환해준다.
| 이미지 생성 (t2i)
<?php //t2i
$reqData = array();
$reqData['prompt'] = 'A cat with white fur'; // 이미지를 묘사하는 제시어, 영문만 지원 (최대: 2048자) <필수>
$reqData['negative_prompt'] = 'korea, human'; // 이미지 생성 시 제외할 요소를 묘사하는 부정 제시어, 영문만 지원 (최대: 2048자) <선택>
$reqData['image_format'] = 'png'; // 이미지 파일 형식 (webp,jpeg,png) - 기본 webp
// CURL 통신
$url = 'https://api.kakaobrain.com/v2/inference/karlo/t2i';
$headers = array(
'Content-Type: application/json',
'Authorization: KakaoAK ${REST_API_KEY}',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reqData));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$res = json_decode(curl_exec($ch));
curl_close($ch);
// echo '<pre>'; print_r($res); echo '</pre>'; exit; // 출력시
if( empty($res->images[0]->image) ){ die('<h1>실패</h1>'); }
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 과거 아무 때나 잡으면 됨.
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: image/png");
die(file_get_contents($res->images[0]->image));
| 이미지 확대하기 (upscale)
<?php //upscale
$reqData = array();
$reqData['images'][] = base64_encode(file_get_contents(CORE_CONFIG['dir']['public'].'/images/test/cat.png')); // 확대할 이미지 파일 (배열)
$reqData['scale'] = 4; // 확대 배율(integer), 2 또는 4 중 하나 (기본값: 2) - scale 값을 4로 지정하더라도 가로세로 최대 2048 픽셀 크기까지만 확대 가능
$reqData['image_format'] = 'png'; // 이미지 파일 형식 (webp,jpeg,png) - 기본 webp
// CURL 통신
$url = 'https://api.kakaobrain.com/v2/inference/karlo/upscale';
$headers = array(
'Content-Type: application/json',
'Authorization: KakaoAK ${REST_API_KEY}',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reqData));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$res = json_decode(curl_exec($ch));
curl_close($ch);
// echo '<pre>'; print_r($res); echo '</pre>'; exit; // 출력시
if( empty($res->images[0]) ){ die('<h1>실패</h1>'); }
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 과거 아무 때나 잡으면 됨.
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: image/png");
die(file_get_contents($res->images[0]));
| 이미지 변환하기(variations)
<?php //variations
$reqData = array();
$reqData['image'] = base64_encode(file_get_contents(CORE_CONFIG['dir']['public'].'/images/test/cat.png')); // 원본 이미지 파일을 Base64 인코딩한 값 (string)
$reqData['image_format'] = 'png'; // 이미지 파일 형식 (webp,jpeg,png) - 기본 webp
// CURL 통신
$url = 'https://api.kakaobrain.com/v2/inference/karlo/variations';
$headers = array(
'Content-Type: application/json',
'Authorization: KakaoAK ${REST_API_KEY}',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reqData));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$res = json_decode(curl_exec($ch));
curl_close($ch);
// echo '<pre>'; print_r($res); echo '</pre>'; exit; // 출력시
if( empty($res->images[0]->image) ){ die('<h1>실패</h1>'); }
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 과거 아무 때나 잡으면 됨.
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: image/png");
die(file_get_contents($res->images[0]->image));
| 이미지 편집하기(inpainting)
<?php //inpainting
$reqData = array();
$reqData['prompt'] = 'tiger'; // 이미지를 묘사하는 제시어, 영문만 지원 (최대: 2048자) <필수>
$reqData['image'] = base64_encode(file_get_contents(CORE_CONFIG['dir']['public'].'/images/test/cat.png')); // 원본 이미지 파일을 Base64 인코딩한 값 (string)
$reqData['mask'] = base64_encode(file_get_contents(CORE_CONFIG['dir']['public'].'/images/test/mask-image.png'));; // 편집할 영역을 검정(RGB 또는 Grayscale 값 0)으로 표시한 이미지를 Base64 인코딩한 값 (string)
$reqData['image_format'] = 'png'; // 이미지 파일 형식 (webp,jpeg,png) - 기본 webp
// CURL 통신
$url = 'https://api.kakaobrain.com/v2/inference/karlo/inpainting';
$headers = array(
'Content-Type: application/json',
'Authorization: KakaoAK ${REST_API_KEY}',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reqData));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$res = json_decode(curl_exec($ch));
curl_close($ch);
// echo '<pre>'; print_r($res); echo '</pre>'; exit; // 출력시
if( empty($res->images[0]->image) ){ die('<h1>실패</h1>'); }
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 과거 아무 때나 잡으면 됨.
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: image/png");
die(file_get_contents($res->images[0]->image));
| 결과
참고로 결과 이미지는 포스팅 글의 컨텐츠 내용만 길어지고 의미가 없을 것 같아 일부 제외 하였으니 직접 실행하여 결과를 확인해 보자.