지난편에서 카카오에서 제공되는 인공지능 API 서비스중 하나인 KoGPT에 대해 알아보았다. 이번편에서는 이미지형 인공지능인 Karlo에 대해 간단하게 PHP 예제를 통해 알아보도록 하자
Karlo의 경우 KoGPT보단 조금 더 재밌는 결과물을 볼 수 있어 추후 내 API 서비스에도 추가해볼 예정이다. 사용 명령어는 간단하게 명령어(Prompt)를 입력하면 AI가 관련된 이미지를 생성하여 결과 데이터를 응답해 주는 방식이다. 물론 결과는 base64 인코딩된 이미지를 제공하기 때문에 이를 볼 수 있도록 작업을 해주어야 한다.
- 사용량 제한 주의(쿼터) : API 서비스 할려고 올려놨는데 쿼터가 일 500개인줄 알았는데 월 500개였다. 당연하게도 API 서비스 종료. (쿼터 기준은 앱 기준이 아닌 Admin 계정기준)
첫번째 예제는 명령어 text 를 통해 이미지를 생성해 주는 예제이다. (※참고로 text 는 영문만 입력 가능하다.)
<?php # https://developers.kakao.com/docs/latest/ko/karlo/rest-api#text-to-image 참고
// 요청 데이터
$postfields['prompt']['text'] = "space";
$postfields['prompt']['batch_size'] = 1;
$response = Karlo($postfields);
$arrData = json_decode($response['data']);
if( !empty($arrData->images[0]->image)){
echo '<img src="data:image/png;base64,'.$arrData->images[0]->image.'" />';
}
function Karlo($postfields = array()){
$rest_api_key = ''; //REST API KEY 입력
$headers = array();
$url = 'https://api.kakaobrain.com/v1/inference/karlo/t2i';
$headers[] = 'Content-Type: application/json';
$headers[] = '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($postfields));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$data = curl_exec($ch);
// 통신 실패 처리
if (curl_error($ch)){
return array('rst'=>'fail','msg'=>'CURL Error('.curl_errno( $ch ).') '.curl_error($ch));
}
// 통신에 대한 성공이며, 실제 데이터에 대한 성공은 별도 처리 필요
else{
return array('rst'=>'success','data'=>$data);
}
curl_close($ch);
}
두번째로 살펴볼 방법은 등록된 이미지를 통해 AI가 새로운 이미지를 생성해주는 예제소스이다. 예제 이미지는 바로 아래 첨부파일을 다운로드하여 사용 가능하다.
<?php # https://developers.kakao.com/docs/latest/ko/karlo/rest-api#variations 참고
// 요청 데이터
$postfields['prompt']['image'] = base64_encode(file_get_contents(__DIR__."/bird-8004544_640.jpg")); // 이미지 소스필요
$postfields['prompt']['batch_size'] = 1;
$response = Karlo($postfields);
$arrData = json_decode($response['data']);
if( !empty($arrData->images[0]->image)){
echo '<img src="data:image/png;base64,'.$arrData->images[0]->image.'" />';
}
function Karlo($postfields = array()){
$rest_api_key = ''; //REST API KEY 입력
$headers = array();
$url = 'https://api.kakaobrain.com/v1/inference/karlo/variations';
$headers[] = 'Content-Type: application/json';
$headers[] = '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($postfields));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$data = curl_exec($ch);
// 통신 실패 처리
if (curl_error($ch)){
return array('rst'=>'fail','msg'=>'CURL Error('.curl_errno( $ch ).') '.curl_error($ch));
}
// 통신에 대한 성공이며, 실제 데이터에 대한 성공은 별도 처리 필요
else{
return array('rst'=>'success','data'=>$data);
}
curl_close($ch);
}
적용 전 |
적용 후 |
마지막 세번째 예제는 원본 이미지와 마스킹 처리된 이미지를 제공하여 마스팅 처리된 이미지에 대해 원하는 처리를 입력하여 편집된 이미지를 얻을 수 있는 예제이다. 참고로 마스팅 처리는 아래와 같이 검은색으로 처리를 해주어야한다고 카카오 API 설명에 나와있다.
예제소스에서 쓰인 마스킹된 이미지는 아래에서 다운로드 가능하다. (참고로 아래 마스킹 예제는 새의 부리를 삭제해달라고 요청했다.)
<?php # https://developers.kakao.com/docs/latest/ko/karlo/rest-api#inpainting 참고
// 요청 데이터
$postfields['prompt']['image'] = base64_encode(file_get_contents(__DIR__."/bird-8004544_640.jpg"));
$postfields['prompt']['mask'] = base64_encode(file_get_contents(__DIR__."/bird-8004544_640 - modify.jpg"));
$postfields['prompt']['text'] = 'delete';
$postfields['prompt']['batch_size'] = 1;
$response = Karlo($postfields);
$arrData = json_decode($response['data']);
if( !empty($arrData->images[0]->image)){
echo '<img src="data:image/png;base64,'.$arrData->images[0]->image.'" />';
}
function Karlo($postfields = array()){
$rest_api_key = ''; //REST API KEY 입력
$headers = array();
$url = 'https://api.kakaobrain.com/v1/inference/karlo/inpainting';
$headers[] = 'Content-Type: application/json';
$headers[] = '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($postfields));
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$data = curl_exec($ch);
// 통신 실패 처리
if (curl_error($ch)){
return array('rst'=>'fail','msg'=>'CURL Error('.curl_errno( $ch ).') '.curl_error($ch));
}
// 통신에 대한 성공이며, 실제 데이터에 대한 성공은 별도 처리 필요
else{
return array('rst'=>'success','data'=>$data);
}
curl_close($ch);
}
적용 전 |
적용 후 |
위와 같이 카카오에서 제공하는 Karlo를 이용하여 여러 이미지를 생성해 보았다. 재밌는건 기본 이미지 생성시 여러 명령어를 입력해본결과 요청시마다 새로운 이미지들이 제공되는데 어떤 이미지는 어디서 많이 본듯한 이미지들로 생성이 되었다. 이게 저작권 문제가 분명 생길것도 같긴한데 서비스시에는 주의가 필요할 같다. 또한 이미지 생성시 조금 19금이긴 하지만 girl body 또는 boy body 를 입력하면 조금 보기 민망한 이미지가 노출되는데 이러한 것도 문제가 되지 않을까 싶다.