【Stable Diffusion】画像生成AIに挑戦

人工知能(AI)ブームが発展してます。
生成系AIなるものが、世の中を変え始めました。
いえ、すでに変わったのかも知れません。

対話系の生成AI「ChatGPT」の技術は、
数十年後もしくは数年後には、
現在のスマホくらい普及するでしょう。

萩原が注目しているのは画像生成AIです。
そのうちの1つ Stable Diffusion を使用し始めました。

Stable Diffusion は text-to-image モデルと呼ばれるジャンルのシステムの1つ。

「犬」と文字(text)で入力すると、犬の画像(image)を描いてくれます。
「火星を歩く犬」と入力したら、犬が火星を歩いている画像を描いてくれます。
写真と見間違うようなクオリティにもできるし、マンガっぽいタッチにもできます。
写真のようにしたければ
「写真, 火星を歩く犬」のように、作りたい画像を説明するキーワードを羅列するだけでOKです。

Stable Diffusionを使うメジャーな方法は3通り。
1.「Stable Diffusion Online」というウェブサイトにブラウザでアクセスして、ブラウザ上でサービスを利用。
2.Stable Diffusionのファイルをダウンロードして、パソコンにインストール。
3.Google Colab上にインストールして利用。

一番お手軽は1番目。お試しするだけでビックリすると思います。
もしも2.が可能であれば、自宅のパソコンなどにインストールして、好きな画像を好きなだけ作ったりして楽しめます。でも、GPUと呼ばれる処理装置が無いパソコンだと、画像生成時間がべらぼうにかかります。GPUがあれば1分で造れる画像も、ない場合は15分など。(実体験)
Google Colabを使う3.であればGoogleのGPUを利用できるので、2.を仮想的に実現できます。ただし、GPU利用によってColabの料金が発生します。

Stable Diffusionを使う時に入力する文字列(例:写真, 火星を歩く犬)は「prompt(プロンプト)」とか「呪文」と呼ばれます。
promptを工夫することで、好きな画像を作れるようになります。逆に、うまく工夫できないと、満足できない画像が生成されることも。

説明はこのくらいにして、Stable Diffusionを使って、実際に僕が作った画像をお見せしますね。

Stable Diffusionの生成例1

頭にバラを乗せた萩原(私)。

写真じゃなくて、Stable Diffusionが作った画像です。

他の例も観てみましょう。

Stable Diffusionの生成例2
Stable Diffusionの生成例3
Stable Diffusionの生成例4
Stable Diffusionの生成例5
Stable Diffusionの生成例6
Stable Diffusionの生成例7

こんな感じです。

萩原の可能性をグイグイと引き出してくれますね。

最後の例7に写った女性は、実在しません。絵です。

萩原の画像を生成できるのは、私が工夫をしたからです。オリジナルのstable diffusion周りでは出来ません。

stable diffusionはモデルと呼ばれるファイルを基に画像を生成します。私は自分の顔写真を使って、独自のモデルを作成しました。そして、stable diffusionに独自モデルを参照させています。

独自モデルを作る為にDreamBoothと呼ばれるシステムを使いましたが、ここでは説明を省きます。DreamBoothも無料です。

さらに工夫すると、生成した画像が喋る動画を作ることもできます。

顔画像1枚と音声ファイルから動画を生成するシステム SadTalker。
文字列から音声を合成するサービスCoeFont。
これらを利用して作ったのが次の動画です。

あなたの優しさや思いやりに いつも感動します

というわけで画像生成AIで造った画像、その先の話を例で紹介しました。

おじさんの顔をメインにした画像の例は、検索してもあまり見つかりませんでした。
この記事の画像はレアものってことかもね。

生成していて楽しいので、気が向いたら新たな画像を上げるかも知れません。
いや、きっと上げるよ。

AIで造るおじさん画像集みたいなサイトになるよ、ここ。


LaTeXもいけるよChatGPT

英語で論文を書くとき、
特に数式の含まれる論文を書くとき気になるのが

  • タイポ(スペルミス)
  • 文法間違い
  • 自然な表現、読みやすい表現

ではないでしょうか?

さて、数学・情報数理学系の我々が論文を書くときの標準ツールが
「LaTeX」
という組版システムです。(自動レイアウトワープロみたいなもの)

LaTeXでの数式表現は独特です。
例えば、
  XとYを集合として、f : X → Y を全単射とする。
というのをLaTeXで書くと
  $X$と$Y$を集合として、$f : X \rightarrow Y$ を全単射とする。
のように記述します。
「→」を「\rightarrow」と表現するなど、独特のコマンドを用います。

 コマンドが混在することで、上記のような短い文章でも、英語で書くとスペルミスや文法ミスがいつも以上に発生しやすくなります。

 スペルチェックや文法チェックのシステムは様々あります。

 例えば、LaTeXコマンドがあってもタイプミスを探し出せるスペルチェッカーのaspellがありますが、文法チェックはできません。また、文法チェックのGrammarlyを使うと、文法チェックができる上にお薦めの表現を教えてくれますが、LaTeXのコマンドが混ざった文章だと文法ミスの見逃しが発生しやすくなります。

 そこで朗報です!!
 ChatGPTを使うと、LaTeXコマンドを含む文章でも、
・スペル修正
・文法修正
・さらに推敲
などを同時に行えます。
 100%完全かどうかはわかりませんが、
以下の例をみると、その実力を確認できます。

 

 ChatGPTを起動したら、最初に次の文言を入力します。
以下、入力する文言をプロンプトと呼びます。

You are a professional editor with LaTeX.

すると、ChatGPTから次の回答がありました。

 なんだかノリノリに見えます。

そこで、次のプロンプトを入力しました。敢えて、よろしくない表現を散りばめています。

Please edit the following.

Let $X,Y$ be a set of integers, and $f$ be a map form $X$ to $Y$ and is a bijection.

これに対するChatGPTの回答は以下です。

完璧です。
・「$X,Y$」を「$X$ and $Y$」に修正。
・「a set of」を「sets of」に修正。
・「and $f$ be」 を「and let $f$ be」に修正。
・最後の「is a bijection」と「map」を合わせて「$f$ be a bijection」に修正。
・タイポ「form」を「from」に修正。
なんて、賢いのだ!

さらに続けて、次のプロンプトを入力しました。

Please edit the following.

Let $X,Y$ be a set of integers, and $f$ be a map form $X$ to $Y$ and is a bijection.
This implies that $\exists g$ from $Y$ to $X$ such that $g f (x) = x$ for $x \in X$.

これに対して

こちらも凄い。
・「a map from $X$ to $Y$」が「$f :X\rightarrow Y$」に。LaTeXのコマンド化。
・「that $\exists g$」という言葉足らずを「that there exists a map $g$」と文章で補完。
・式「$g f(x) = x$」を「$g\circ f(x)=x$」にして、写像の合成を明記。
・「for $x \in X$」を「for all $x \in X$」へと文章で補完。

惜しむらくは、, where $circ$ is the … のように写像の合成$\circ$の説明が欲しかったことか。

私の好みですが、LaTeXコマンドが直前の記号とくっつくと読みづらいと感じます。

そこで、次のプロンプトを与えました。

I prefer a blank before \ for mathematical symbols.

こうすることで次の回答を得ました。

私好みです。見やすい。

やっぱり、$\circ$が気になります。
次のプロンプトを入力。

I think the explanation of $\circ$ should be added.

これに対するChatGPTの回答は

ちゃんと、whereで補足を書いてくれました。
さらに定義に相当する$g(f(x))$も明記。
直前にお願いした、LaTeXコマンド前のスペースも忘れていない。

・スペルミスの修正(文脈を踏まえて、formがfromになりました!)
・文法の修正(a set of をsets ofに。and f be が and let f beに。)
・表現の推敲(bijectionをmapと一緒に。文法ミスでもありますがX, Yが X and Bに。)
・内容の補足(circの定義。anyの追加。)
・好みに合わせた記述(コマンド前にスペースを挿入。)
・LaTeXコマンド込みの編集(f from X to Y が f : X \rightarrow Y に)

これらを一括して行えるChatGPTは、
LaTeXを使った数式文書作成において
欠かせないパートナーになりそうです。


ChatGPTでハミング符号の復号アルゴリズムをC言語実装してみた

ChatGPTなるものが世間を賑わせています。
(世間ってどこよ?)

自然言語処理のための大規模言語モデルの1つです。
文章生成、対話システム、テキストマイニングなどに活用できるシステム。

ざっくり言うと、
・パソコン上で利用できて
・「普段の会話感覚」で文章を入力すると
・いろいろな文字列を作り出してくれる
そんなサービスです。

例えば

最初のデートで、相手を喜ばせるには、どんな会話したら良いと思う?

と入力すると

最初のデートでは、お互いに興味を持つ話題を見つけたり、相手に好印象を与えることが重要です。以下は、相手を喜ばせる可能性のある会話のトピックの例です。

  1. 趣味や興味を尋ねる
  • どのような趣味や娯楽が好きですか?
  • 最近読んだ本や映画は何ですか?
  • 旅行で行ってみたい場所はありますか?
  1. 仕事や学校について話す
  • 仕事や学校で何をしているのですか?
  • どんなキャリアゴールを持っていますか?
  • 好きな職場環境は何ですか?
  1. 質問に答える
  • 自分自身についてもっと知りたいことはありますか?
  • 最近自分で新しいことを始めたり、挑戦したことはありますか?
  • お互いに好きな食べ物やレストランは何ですか?

ただし、相手が話したいことや、話題に触れるのが適切であるかどうかを常に意識し、相手にリスペクトを示すことが大切です。また、相手が話をしているときは、真剣に聞き、興味を持って聞くことも重要です。

のような文が返ってきます。

 

上の様なふんわりとした対話もできますが、専門的な内容を扱うこともできます。

僕の専門の符号理論には「ハミング符号」と呼ばれる誤り訂正符号があります。

この誤り訂正の仕組みを「ソフトウェア実装」するために、ChatGPTを使ってみましょう。

ハミング符号の復号アルゴリズムをC言語で記述して下さい。

と入力したところ、次の回答がありました。

以下は、ハミング符号の(7, 4)符号化方式の復号アルゴリズムの例です。このアルゴリズムは、エラー訂正が可能な1ビットの誤りを検出でき、1ビットの誤りを訂正することができます。

続いて

#include <stdio.h>

int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置

printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}

// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[1] + received[3]) % 2;
syndrome[1] = (received[0] + received[2] + received[3]) % 2;
syndrome[2] = (received[1] + received[2] + received[3]) % 2;

// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;

if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}

// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];

printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);

return 0;
}

 

実際の入出力の画面キャプチャがこちらです。

 

 

思わず、
 ChatGPTって賢い!!!

と思ってしまったのですが。
よく見ると
 「シンドロームを計算する」以降の4行は、計算が間違っています。
そこで間違いを指摘します。具体的には次の入力をしました。

あなたのプログラムに間違いを発見しました。

syndrome[0]はreceivedの0,1,3の和ではなくて、0,2,4,6の和です。
syndrome[1]はreceivedの0,2,3の和ではなくて、1,2,5,6の和です。
syndrome[1]はreceivedの1,2,3の和ではなくて、3,4,5,6の和です。

これらの3行を修正して下さい。

するとChatGPTからの返事は

申し訳ありません、間違いを修正します。正しいシンドロームの計算方法は以下の通りです:

続いて
 
// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;
これは正しい計算です。正解を導き出せたので、私から次の入力をしました。
 
その通りです。素晴らしい。
では、修正版のソースコード全体を出力して下さい。
その結果、ChatGPTからの返事として次のソースコードが出力されました。
 

#include <stdio.h>

int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置

printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}

// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;

// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;

if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}

// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];

printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);

return 0;
}

バッチリです。

ChatGPTに対する私の印象は
 よく間違えるけど作業の早いアシスタント
です。

とにかく間違えます。
ですから、
利用側に
 正解と不正解を見極められる力
が要求されます。

上手く活用すれば、
自分で考えるよりも早くプログラミングできます。

デートの例もそうですが、
それらしい答えを短時間で導いてくれます。
ただし、あてになるかどうか分かりません。