画像生成AIを試す

この年末年始は帰省をしつつ,原稿執筆をしていました。

プログラミング体験・学習に関する原稿でしたが,他と違った角度から照らしたものにしようと悪戦苦闘してました。詳しくはまた機会をあらためて書こうと思います。

締切仕事から解放されて,ようやく画像生成系のAIを自分のパソコン環境に導入してみました。

この記事のアイキャッチ画像はその画像生成AIモデルの一つである「Anything-v4.0」を導入して描画させたものです。

これは「1boy, computer, typing, looking screen, indoor, casual」というプロンプト(画像描画させるためのキーワード群)を指定して,横長サイズに指定した結果です。

同じ条件でも描画させる度に画像が変わるので,今回も3回目に描画させた結果を採用したものです。この辺は導入の仕方によって生成の手順は異なってくるので,1枚1枚描かせるパターンもあれば,自動的に複数枚の画像を生成させるやり方もあります。コマンドラインで済ます人もいれば,WebUIを利用することもできます。

導入手順は簡単で,たとえばWebUIで使いたければ…

  • Python
  • pythonライブラリ
    • torch
    • diffusers
    • gradio
  • 学習モデル
    • Stable Diffusion v2-1
    • Anything-v4.0

といったものをインストールして,pythonのスクリプトを起動するとローカルでWeb画面を開くことができます。それらはいろんな方々がネットでやり方をシェアしてくださっているので参考にしました。

ちょっと雑になりますがインストール手順はおおむね以下のような感じです。

(各自の環境によってコマンドは変わってきますので,その辺の説明はごめんなさいします。)

Macであれば,もしPythonが未導入ならHomebrewを使ってPython入れてもいいです。

brew install python@3.10

あとはpipもしくはpip3でライブラリ導入:

pip3 install torch
pip3 install --upgrade diffusers transformers accelerate
pip3 install gradio

それから導入ツールの導入:

brew install git-lfs
git lfs install

(git LFSについてはこちら

そして学習モデルの導入:

git clone https://huggingface.co/stabilityai/stable-diffusion-2-1

あるいは

git clone https://huggingface.co/andite/anything-v4.0

そしたら次のpythonスクリプトをファイルに保存して動かします。(ファイル名は任意で可)

import gradio as gr
import torch
import click
import datetime
import random
from diffusers import StableDiffusionPipeline
import numpy as np

# 学習モデルを選ぶ
ai_model = "./stable-diffusion-2-1"
# ai_model = "./anything-v4.0"

def generate(prompt, nega_prom, height, width, steps, cfg, seed):
    pipe = StableDiffusionPipeline.from_pretrained(
      ai_model,
    )

    pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))
    if seed == "":
      seed = int(random.randrange(4294967294))
    else:
      seed = int(seed)
    print(f"Seed value : {seed}")
    latents = torch.tensor(get_latents_from_seed(seed, width, height))

    gen_img = pipe(prompt=prompt, negative_prompt=nega_prom, height=height, width=width, num_inference_steps=steps, guidance_scale=cfg, latents=latents).images[0]
    gen_img.save(f"./any3_step{steps}-cfg{cfg}-{seed}.png")
    return gen_img

def get_latents_from_seed(seed: int, width: int, height:int) -> np.ndarray:
    # 1 is batch size
    latents_shape = (1, 4, height // 8, width // 8)
    # Gotta use numpy instead of torch, because torch's randn() doesn't support DML
    rng = np.random.default_rng(seed)
    image_latents = rng.standard_normal(latents_shape).astype(np.float32)
    return image_latents


webui = gr.Interface(fn=generate,
                     inputs=[
                     gr.Textbox(label = 'Prompt text', value="", lines=2, elem_id="prompt"),
                     gr.Textbox(label = 'Negative Prompt text', value="", lines=2, elem_id="nega_prom"),
                     gr.Slider(minimum=64, maximum=1024, step=64, label="縦サイズ(px)", value=768, elem_id="height"),
                     gr.Slider(minimum=64, maximum=1024, step=64, label="横サイズ(px)", value=512, elem_id="width"),
                     gr.Slider(minimum=10, maximum=150, step=1, label="ステップ数", value=25, elem_id="steps"),
                     gr.Slider(minimum=1, maximum=10, step=0.5, label='CFG', value=7.5, elem_id="cfg"),
                     gr.Textbox(label = 'seed', value=None, placeholder="0 - 4294967294. Blank is random.", elem_id="seed"),
                     ],
                     outputs=gr.Image().style(height=768)
                     )
webui.launch()

Pythonスクリプトについて参考にしたWebページはこちら(感謝感謝)。

本来であれば,画像生成系AIについて整理してから書きたいところですが,それもまた別の機会に。

私自身はまだ生成系AIをどのように自分の生産活動に活かすとよいのか模索中ですが,可能性があることは嫌というほど感じているので,何かしら自分で取り組む糸口を見つけ出してみようと思います。

でも生成した画像をブログ記事のアイキャッチ画像にするのは,地味に実用的かも。

人工知能時代に必要な小学校段階の学習事項とは何なのか

平成29年3月告示の学習指導要領が示した、小学校段階におけるプログラミング体験について考えています。

文部科学省「小学校段階における論理的思考力や創造性、問題解決能力等の育成とプログラミング教育に関する有識者会議」は、小学校段階にもプログラミングに関わる教育を持ち込むことを諮るための会議であった以上、その議論の取りまとめから「プログラミング」を取り除くことができない宿命にありました。

組み込むべきパーツが状況的に決められ用意された状態の中、それらを求められている形に組み上げていく作業が大変であったことは、長くなりがちになっている文章を見ても分かります。加えて、私たちのようなしがらみのない部外者から、本来はこうだああだと批判あるいは非難されることも必至である仕事です。そのことを労う文脈が無いことは残念ですが、こればかりは仕方ないことだと思います。

無礼は承知で、部外者は部外者なりの役割を演じさせていただくことにします。(その分野の関係者として、純粋に部外者といえるのか、あるいはお前は足を引っ張る側にまわるべきなのか、という批判もあり得ると思いますが、自由に論じさせていただくことも大事かなと考えています。)

やはり、少し巻き戻したところから出発しましょう。

目指しているものを実現するために、必ずしも「プログラミング」に縛られなくてよいとすれば(とはいえ離れ過ぎないところで)、どんな議論の可能性があったのか。

平成29年3月告示の学習指導要領、そのための中央教育審議会への諮問と出てきた答申には、社会の変化について、何かしらの前提が描かれていました。[記事「何を想い,諮問し答申するのか」]

答申には「第4次産業革命ともいわれる、進化した人工知能が様々な判断を行ったり、身近な物の働きがインターネット経由で最適化されたりする時代の到来」と記され、そうした世の中で生きていく子供たちは、おそらくもっと「知識・情報・技術」について強くならないといけない。そう多くの人々が考えていることが反映されています。

端的にはIT人材の人口を増やしたいという願いになって表れ、先の有識者会議の設置へと繋がったことはご承知の通りです。

しかし、今回の話がIT人材の増強という単純な話でないことは明らかです。

「第4次産業革命」つまり昨今見られるような人工知能技術の前進(ディープラーニング)を踏まえた時代というのは、IT産業やIT人材とは何かの捉えに関しても、明らかにステージが変わっており、その新しいステージで通用するように子供たちを育んでいかなくてはならないということが書かれています。

人工知能技術(ディープラーニング)によって、一体何が変わったのか。

私たちが使う道具の挙動が予測困難になったということに他なりません。

従来、私たちは使う道具の挙動を把握して、道具を利活用します。道具の使い方がわからなければ道具は使えないし、少なくとも使い方を学び把握することで(場合によっては自分で創造して把握することで)道具を使います。

道具が複雑な場合、確かにその挙動は予測が困難ですが、その場合でも私たちは道具の「仕組み」を理解することで、なんとか道具の挙動を把握して利用します。

しかし、人工知能技術が生かされた道具は違います。

人工知能技術を生かした道具は、機械学習を行ない、その成果を踏まえた挙動をします。その挙動は、私たちが想定した範囲に収まる場合もありますが、そうでない場合の可能性についても否定できません。

そのような道具を把握し利用する場合、道具が学習するという「仕組み」を理解するだけでは足りないのです。どのように学習するのかという「学習のさせ方」を汲み取らなくては、道具を想定的にあるいは効果的に利用することができません。しかし実のところ、学習のさせ方が分かっても、もはや「学習の成果」を予測することは困難です。

挙動の予測が困難な道具が、私たちの社会生活にどんどん応用されようとしている。

この事実を踏まえる必要があります。

誤解のないようにあらかじめ断っておきますが、私はシンギラリティが到来して、人工知能が人間の能力を上回って、いろいろ悲劇的なことが起こるということを肯定したいわけではありません。

シンギラリティ云々については、来ようが来まいが、私たちの議論にはあまり大きな影響はないと考えています。扱うものがどんどん大げさになっていくという大変さはあり得ると思いますが。

挙動の予測が困難な道具が私たちの生活を支える社会

こうした社会では、プログラミング技術あるいは能力があるに越したことはないし、そういう道具やシステムで構成された社会を維持する人材としてIT人材のすそ野が広がることには意味があります。

しかし、プログラミングという「データ」や「アルゴリズム」や「コーディング」といった諸々の仕組みを扱う能力が身に付いたところで、道具の挙動を予測することが困難であることには変わりありません。

それはせいぜい「人工知能の学習をデザインできる技術を持っている人」になれるだけで、「挙動の予測が困難な道具を上手に使って社会に役立てる人」になることにはならないのです。

これは良き「作り手」が良き「使い手」とイコールではない、という有りがちな話を踏まえているようでいて、やはりまったく異なるステージの話なのです。

従来の道具は、作り手が道具の挙動を意図して生み出してきました。その意図を使い手が汲み取って、道具を利用します。それは「作り手→使い手」(一方向)という関係で完結します。

しかし、人工知能技術を生かした道具は、作り手が学習のさせ方を意図することはできますが、学習の成果を掌握することは論理的に難しいはずです。使い手は、(作り手によって意図された)道具の挙動を予測して従来の道具のように利用しますが、やがて挙動が変化していく事態に直面し、それがポジティブな範疇に留まっている限り「便利さ」を享受することになりますが、そうでない場合には道具の学習による「困難さ」を被ることになります。とすれば、使い手は作り手のデザインした学習について遡ることを余儀なくされ「作り手←→使い手」(双方向)の関係を織り込まなくてはなりません。

(従来の道具の場合であっても、双方向の関係を想定することができるではないか、という指摘もあり得ると思います。もちろんそうすることは可能ですが、表面上の関係性に違いの根拠があるわけではないので、このお話は、もう少し別の説明の仕方を試みた方がよいかも知れません。)

使い手が、道具の作り手へと遡るからこそ、プログラミング体験・学習を通してプログラミング的思考なる論理的思考や、ITリテラシー、情報活用能力を身に付けるべきなんだ、という見解はあってもよいと思います。

ただ、そうしたところで「挙動の予測が困難な道具を使う社会」になることを見失っては、単なるIT人材育成話に留まるだけだと私は考えます。

どんどん進歩し続けている人工知能技術が、私たちの生活をどのように明るく彩り、どのようにトラブルを引き起こし、また、どのように人工知能の学習をデザインし、どのように調整していくのか。そういった事柄はすべて、私たちの描き方次第で、如何様にも変わり得る、まさに予測が困難な状況にあります。

そう考えたとき、小学校段階で必要な学習事項として新たに加えるものの一つが「プログラミング的思考」といった「仕組み」にフォーカスするようなものでよいのかどうか。他の教科との横断的な関係と中学校・高等学校との体系的な捉えの中で、もっと考えを深めてもよいのではないかと思います。

そうすると、意外とシンプルな実践と、もっとディープに記号や命令をいじる実践が組み合わさった形のカリキュラムが子供たちにとって必要になるかも知れません(これは単なる直感です)。

文部科学省の有識者会議の議論の取りまとめは、 第4次産業革命や人工知能について、社会に大きな変化をもたらすものであるという認識は持ちつつも、それを括弧に入れてしまい、激変する社会に対応するために求められる資質・能力とは何かを問うてしまいました。

しかし、人工知能という「人間とは異なる、学習をするもの」が、いよいよ括弧に入れられなくなって、相手をしなければならなくなったことが、いま足を踏み入れようとしている時代やその社会のはずです。

人間の意図によって制御される社会という世界観から、人間の意図を託した学習の成果によって制御される社会という世界観への転換を明示しない限り、「第4次産業革命ともいわれる、進化した人工知能が様々な判断を行ったり、身近な物の働きがインターネット経由で最適化されたりする時代の到来」を見据えた学校教育をつくり出していくことは、遠いままかも知れません。

とはいえ、私たちや子供たちは、否応なくそういう時代に突入しています。お忘れなく。