-
Rust: 카카오 Karlo API wrapper컴퓨터/Rust 2023. 3. 24. 17:00728x90반응형
Karlo
소개
카카오브레인 ‘카카오디벨로퍼스’에서 카카오브레인의 한층 더 발전된 AI 이미지 모델 ‘Karlo(이하 칼로)’를 API가 있다.
Generative AI Karlo는 사용자가 입력한 문장을 기반으로 사실적인 이미지와 다양한 작품을 생성할 수 있는 AI 모델이다.
1억 8천만 장 규모의 이미지와 이미지를 설명하는 텍스트와의 관계를 학습했다고 한다.
총 3가지 기능이 있다.
- 사용자가 입력한 단어나 문장을 기반으로 관련된 이미지와 다양한 작품을 생성 (Image gen)
- 사용자가 업로드한 이미지를 기반으로 관련된 이미지와 다양한 작품을 생성 (Variation gen)
- 이미지에 그리기 도구로 편집할 부분을 마스킹하고, 입력 단어나 문장(공백 가능)을 기반으로 지운 부분을 채워 새로운 작품을 생성 (Inpaint gen)
여기서 직접 확인해 볼 수 있으니 @확인
Karlo-rs
Rust에서 써보려고 wrapper를 만들어 보았다.
이미지는 base64 기반으로 인코딩/디코딩되어 있어서 base64 라이브러리 사용과 async로 처리했다.
Base64 인코딩 String을 이미지로 변환 하는 함수
fn string_to_image(base64_string: &str) -> RgbaImage { let img_data = general_purpose::STANDARD.decode(base64_string).unwrap(); let img = ImageReader::new(Cursor::new(img_data)) .with_guessed_format() .expect("Failed to guess image format") .decode() .expect("Failed to decode image") .to_rgba8(); img }
이미지를 Base64 인코딩된 String로 만드는 함수
fn image_to_base64_string(img: &DynamicImage) -> String { let mut buffer = Vec::new(); let mut cursor = Cursor::new(&mut buffer); img.write_to(&mut cursor, image::ImageOutputFormat::Png) .expect("Failed to write image to buffer"); general_purpose::STANDARD.encode(buffer) }
예제
카카오 디벨로퍼에서 REST_API를 얻은 다음 테스트 해보자.
"A newyork home, steampunk, snowy"라는 문구로 2개의 이미지를 제작하게 하고
첫 번째 사진으로 variation을 하나 만들어보게 시켰다.
use dotenv::dotenv; use karlo_rs; use std::env; use tokio; #[tokio::main] async fn main() { dotenv().ok(); let api_key = env::var("API_KEY").expect("API_KEY not set in .env file"); // Generate images based on prompt text let text = "A newyork home, steampunk, snowy"; let output_name = "sample_img/output"; // will be png let batch_size = Some(2); // or Some(value) where value is between 1 and 8 match karlo_rs::generate_image(text, output_name, &api_key, batch_size).await { Ok(_) => println!("Image saved to {}", output_name), Err(e) => eprintln!("Error: {}", e), } // Generate images based on input image. let input_path = "sample_img/output_1.png"; let output_name = "sample_img/output_variation"; // will be png let batch_size = None; // or Some(value) where value is between 1 and 8 match karlo_rs::generate_variations(input_path, output_name, &api_key, batch_size).await { Ok(_) => println!("Variation image saved to {}", output_name), Err(e) => eprintln!("Error: {}", e), } }
예제 실행 결과
728x90'컴퓨터 > Rust' 카테고리의 다른 글
Rust: cargo something 만들기 (0) 2023.03.28 Rust: AsMut, AsRef, Deref, DerefMut 정리 (1) 2022.12.31 Rust: Send, Sync 정리 (0) 2022.12.29