AIで芸術的なQR Codeを生成する

2023年6月27日火曜日

Artificial Intelligence

本記事では、QR Code AI Art Generatorと呼ばれる機械学習手法を用いて任意のQRコードとテキストプロンプトから芸術的なQRコードを生成する方法をご紹介します。

eye catch

QR Code AI Art Generator

概要

QR Code AI Art Generatorは、ControlNetをベースとして、QRコードとテキストプロンプトを入力に、テキストプロンプトの内容を反映したQRコードを生成する画像生成技術です。

本記事では上記手法を用いて、芸術的なQRコードを生成していきます。

デモ(Colaboratory)

それでは、実際に動かしながらQRコードを生成していきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めに生成するQRコードに含めたいURLなどを設定します。

# @markdown Initialize image
init_img_url = 'https://user0514.cdnw.net/shared/img/thumb/shikunDJI_0204_TP_V4.jpg?' #@param {type:"string"}
# @markdown Initialize image use or not
use_init_img = False #@param {type:"boolean"}
# @markdown URL for QR code
target_url = 'https://www.12-technology.com/' #@param {type:"string"}
# @markdown random seed
seed = 12 #@param {type:"integer"}
# @markdown text prompt
text_prompt = 'Sky view of highly aesthetic, ancient greek thermal baths  in beautiful nature' #@param {type:"string"}
# @markdown image size
img_size = 768 #@param {type:"integer"}
# @markdown output path
output_path = './result.jpg' #@param {type:"string"}

次にライブラリをインストールします。

%cd /content

!pip -q install diffusers transformers accelerate torch xformers
!pip install qrcode

最後にライブラリをインポートします。

%cd /content

import torch
from PIL import Image
import matplotlib.pyplot as plt
from diffusers import StableDiffusionControlNetImg2ImgPipeline, ControlNetModel, DDIMScheduler, DPMSolverMultistepScheduler
from diffusers.utils import load_image

import qrcode

device = 'cuda' if torch.cuda.is_available() else 'cpu'
print('using device is', device)

以上で環境セットアップは完了です。

学習済みモデルのセットアップ

次に、HuggingFaceから学習済みモデルをロードします。

controlnet_id = 'DionTimmer/controlnet_qrcode-control_v1p_sd15'
stable_diffusion_id = 'runwayml/stable-diffusion-v1-5'

controlnet = ControlNetModel.from_pretrained(
    controlnet_id,
    torch_dtype=torch.float16)

pipe = StableDiffusionControlNetImg2ImgPipeline.from_pretrained(
    stable_diffusion_id,
    controlnet=controlnet,
    safety_checker=None,
    torch_dtype=torch.float16
)

pipe.enable_xformers_memory_efficient_attention()
# pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras=True, algorithm_type="sde-dpmsolver++")
pipe.enable_model_cpu_offload()

QRコード画像生成

ここでは、先ほど設定したURLからQRコード画像を生成します。
生成した画像は、ControlNetの制御用入力画像として使用されます。

img = qrcode.make(target_url)
img.convert("RGB").save(qr_img_path)

plt.imshow(plt.imread(qr_img_path))
plt.axis('off')
plt.show()

こちらのQRコード画像を使用します。

qr code image

QR code AI Art

それでは、テキストプロンプトとQRコード画像から新たな芸術的なQRコードを生成します。

まず、リサイズ用関数を定義します。

def resize_for_condition_image(input_image: Image, resolution: int):
  input_image = input_image.convert("RGB")
  W, H = input_image.size
  k = float(resolution) / min(H, W)
  H *= k
  W *= k
  H = int(round(H / 64.0)) * 64
  W = int(round(W / 64.0)) * 64
  img = input_image.resize((W, H), resample=Image.LANCZOS)
  return img

サンプリングを実行します。

# qr code image
source_image = load_image(qr_img_path)
condition_image = resize_for_condition_image(source_image, img_size)

image = condition_image

generator = torch.manual_seed(seed)

image = pipe(
    prompt                            = text_prompt,
    negative_prompt                   = "ugly, disfigured, low quality, blurry, nsfw",
    image                             = image,
    control_image                     = condition_image,
    width                             = img_size,
    height                            = img_size,
    guidance_scale                    = 7.5,
    controlnet_conditioning_scale     = 1.5,
    generator                         = generator,
    strength                          = 0.9,
    num_inference_steps               = 50
    )
    
image.images[0].save(output_path)

plt.imshow(plt.imread(output_path))
plt.axis('off')
plt.show()

出力結果は以下の通りです。

下図は、実際にQRコードとして読み取ることが可能です。

resut qr code ai art

1点注意点として、今回のケースではうまく生成できていますが、テキストプロンプトとパラメータのバランス調整がやや難しくQRコードとして読み取れないケースも往々にして発生します。

以下は、エラーケースです。

error qr code

まとめ

本記事では、QR Code AI Art Generatorを用いて芸術的なQRコードを生成する方法をご紹介しました。

一風変わったQRコードにより人の目を惹きますね。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  HuggingFace - DionTimmer/controlnet_qrcode-control_v1p_sd15

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology