数値解析系

2022年12月 4日 (日)

Interface 2023年1月号を買った

表題の通りです。Interface 2022年1月号を買いました

Pxl_20221203_064631075

もちろん、LiDARの記事も目当てではあったんですが。

Pxl_20221203_064639257

どちらかというと、この別冊の方に惹かれて購入。

ここのプログラムが、マジですごい。

Pxl_20221203_064817391

例えばこれ。てっきり数式で歌でも作るんかいな?と思っていたら、全然違います。

RSA暗号を使った暗号化の応用の話でした。

Pxl_20221203_064714975

例えば、画像ファイルを暗号化、復号するプログラムがついてます。

これ、ちょうどほしいと思っていた技術なんですよね。会社でよく使うので。

実は文字列をRSAで暗号化して秘密文章を送信するというのは作ってあるんですが、画像までできるのは初めて見ました。

他にも、かなり使えそうなネタが多いです、この別冊。

Pxl_20221203_065006534

もちろん、本体のLiDAR応用の部分もなかなかいい感じです。

気になる方はぜひ、ご購入してご覧になられることをお勧めいたします。


Interface(インターフェース) 2023年 01 月号 [雑誌]

2022年11月13日 (日)

ロビ君再始動!等

久しぶりに、こんなものを引っ張り出してみました。


Img_2811


ロビ君です。2014年、つまり今から8年前にはせっせと作ってたんですよね、これ。


完成時の記事は以下。


週刊ロビ第70号到着&製作 そして・・・ついに完成!!: EeePCの軌跡



このころはまだ、白かった。


今じゃすっかり、出番がありません。


Img_2814


で、久しぶりに動かそうとすると、これが動かず。どうやらバッテリーが過放電してしまったようで、充電できなくなってました。


で、予備のバッテリーを入れると、こちらも多少劣化している者の、とりあえず10分程度は動きます。


Img_2815


差しっぱなしがまずかったみたいで、こうやって抜いて保管しておかないと過放電になってしまう模様。


ということで、抜いておきました。


Img_2816


実は地元のコミュニティにて、手元にある「変なもの」をとあるところで展示することになりまして、それで急遽引っ張り出したというわけですが、これならなんとか展示に耐えそうです。


Img_2817


ちなみに、音声認識のコマンド表はコピーしておきました。


Img_2818


もう一体のロボットである「ロボザック」ですが、こちらは2つのバッテリーともに寿命を迎えてしまい、数歩歩いたところで電圧が落ちて挙動がおかしくなります。


こっちは2006~2007年なので、もう15年も前のもの。そりゃあ寿命を迎えるわけですわ。


Img_2813


変なもの展示と言えば、こういうものもあります。


Raspberry Pi 4を使った骨格推定アルゴリズム「mediapipe」を動かすやつ。


いかにもAIっぽい挙動を示すので、分かる人には分かるというものですが、ちょっと玄人向きかなぁと。


他にもいろいろとあるんですが、Raspberry Pi戦艦大和はバッテリーがなく、そのほか作ったRaspberry Pi工作類はすべて部品を抜いてしまったため、原形をとどめたものがありません。


にしても、振り返ってみればいろいろと作ってますね。その時はヒートアップしてるんですが、できてしまうと冷めてしまうため、いざ動かそうとすると動かなくなってるなど、そういうものが多過ぎです。


時々は、メンテナンスしてやらないといけませんね。


ディアゴスティーニ ロビ フルセット(サッカーボールだけなし)


2022年10月29日 (土)

話題のAI迷彩セーターは本当に物体検出をだませているのか!?

画像生成AIほどではありませんが、「AI迷彩なセーター」が少し話題になってますね。

監視カメラAIが認識できないセーターが開発され、ネット「新たな都市迷彩」 | マイナビニュース

御覧の通り、不思議な模様のセーターを着たら、物体検出に引っかからなかったというもの。

以前よりこのAI迷彩ってやつは存在するので、また新手のやつが出てきたのかなぁと思っていたんですが。

記事を読んでいて、少し違和感が。

この記事の後ろの方に「実験では、MicroSoft社が提供する画像データセット「COCO」で学習したYOLOv2という物体検出のアルゴリズムを用いた監視カメラを使用。」と書かれてまして、これを読んだ直後、

えっ、今さらYOLOv2ですか!?

となった次第です。

ガンダムで例えるなら逆襲のシャアで旧ザクが活躍してるような違和感とでも言えばわかっていただけるでしょうか?

あるいは、F-15やF-35が全盛の現代に紫電21型(紫電改)に乗った名パイロット菅野直大尉が無双する物語を読んでいる風にも感じます(いや、それは読みたいかも)。

YOLOv2なんて、いくら何でも古すぎるアルゴリズム。このブログでもその名前が出てきたのは2018年です。

TensorFlow+KerasでSSDを独自データで使えるようにしてみた: EeePCの軌跡

この業界で4年って、結構古いですよ。今どきv2なんて使ってる人を見たことがない。YOLOもv3ぐらいから実用レベルとなった感覚なので、v3以降ならばまだわかるんですけど。

で、さらにこんなツイートにも遭遇。

最近のアルゴリズム(Yolov5)でテストしたら、このAI迷彩に関わらず難なく検出したようです。

うーん、このAI迷彩、ますます怪しいぞ。。。

ということで、私もテストしてみることにしました。

ここでは、比較的新しいアルゴリズムである「YOLOX」を使います。

コードとモデルはこちらの記事を参照。

訓練済みYOLOXでサクッと推論したい場合に使える方法 | Shikoan's ML Blog

使っているのはYOLOX-sなので、比較的軽めのモデルです。めちゃくちゃ精度が高いというわけではない。

続いて、なるべく解像度のよさげな画像を入手。

着ると監視カメラでAIが認識しないセーター開発→「PSYCHO-PASSの世界にありそう」「AIと人間の戦いは始まっていた…」 - Togetter

画像はここからゲットしました。

ほんとうは枠無しのオリジナル画像でテストできれば良かったんですが。ネット上には見当たりませんでした。

で、結果です。

Aimeisai

これが

Pathtooutputimage

こうなりました。

あれ、ちゃんと検出できてるぞ。。。

解像度が低いからじゃないか、とも考えられますが、これを見る限り絶対ダメということではなさそう。

少なくともYOLOv2(≒旧ザク)に勝ったぐらいであらゆる物体検出AI(≒ガンダム)に勝てると宣言するのはちょっとやり過ぎではないかと。

そういえば、イスラエルあたりで人を捉えたら狙撃する機銃なんてのが作られたそうですが。

「AIが人間をロックし正確に狙う機関銃...」イスラエルが開発、パレスチナ難民キャンプに配備される(ニューズウィーク日本版) - Yahoo!ニュース

こいつがYOLOv2よりもずっと新しいアルゴリズムを採用していた場合、このAI迷彩セーターを着て「撃てるものなら撃ってみやがれAIめ!ヒャッハー!」と言って飛び出した人が撃たれちゃったら、どうするつもりなのでしょうか?

私の知る限りではYOLOv3、v4、YOLOXあたりは実装例が多い手法ですから、せめてこの辺りでテストすべきだったのでは?と思いました。


TensorFlowはじめました3 Object Detection ─ 物体検出 (NextPublishing)

2022年10月26日 (水)

ある意味「AI」の正しい使い道!? 味の素のAIによるパッケージデザイン

「AIでパッケージデザイン」って言われたら、

「ああ、また画像生成AIか」

と思いました。はい。

が、それとは全然異なるアプローチに、ちょっと興味そそられます。

味の素、AIによるパッケージデザイン開発で「マッケンチーズ」の売上は計画比1.5倍に

株式会社プラグが提供するパッケージ評価サービス「パッケージデザインAI」を味の素が用いて、「マッケンチーズ」という製品のパッケージデザインを作成したところ、売り上げが想定の1.5倍に達したというニュースです。

「パッケージデザインAI」とは、1020万人の消費者調査を教師データとして学習されたモデルで、消費者がデザインをどう評価するかを判定する「評価AI」と、デザインを実際に生成する「生成AI」とがあるそうですが、今回用いたのは前者の「評価AI」とのこと。

いくつかのデザイン案と、その製品に求めるキーワードとを組み合わせて、最も評価の高いデザインに寄せていくというもののようです。

結果的に、デザイン開発コストも半減したそうですが、そちらは置いておき。

デザインって、本当にその製品の売り上げを左右します。車なんかだと、それが顕著に現れますね。バカにできません。

で、そのデザインそのものは人が作って、AIに判定させる。その値をみて、目的の製品イメージに寄せていく……デザインそのものを自動的に作らせるのではなく、意思決定の補助にとどめるというのが上手い使い方だなぁと個人的には思います。

AIの発達と、人の創造レベルの向上。一見すると相反する両者に見えますが、互いをうまく補い合うというのがAIのもっとも現実的な使い方じゃないかなと。

でないと、人がバカになってしまいますからね。

画像生成AIが流行ってますけど、これもそのまま使うのではなく、支援的な使われ方が現実解ではないかと思ってます。実際、そういう使い方をしている方もいらっしゃるようです。

発達しすぎた技術が人を不幸に追い込む、そういう方向の科学的発展は、あってはいけないことだと思いますね。自称「データエンジニア」としては、それを忘れないようにしたいと思ってます。


味の素 マッケンチーズ 1食分×8個 【マカロニチーズ】 【マカロニ&チーズ】

2022年10月24日 (月)

画像生成AIは人類を脅かすほどの存在となりうるか?(いや、そうはならんやろ)

昨今、Midjournyを始め、Stable Diffusion、NobelAIなどの画像生成AIが話題沸騰中です。

で、そのあまりの高クオリティな画像に、絵師さん廃業か?などと言われたり、おそらくは作者に無断で漫画やイラストを教師データとして用いたことへの倫理的な問題点が指摘されております。

が、今回はそれらとは別の視点で、画像生成AIの欠点ともいうべき部分をまとめてみたいと思います。

話の発端は、こちら。NobelAIに「ラーメンを食べる」というイラストを要求すると、おかしな画像ばかりが返ってくるという話題をまとめたサイトです。

【AI画像生成】お絵描きAIでラーメンを食べる絵が描けないと話題だったので、Novel AIを使って試してみたら、想像以上にヤバかった件・・・!#NovelAI #NovelAIDiffusion : 超絶"厳選"ニュースまとめch

なんていうか、手づかみだったりスイーツやドリンク風にラーメンを摂取?する画像が出てきます。

うーん、これはちょっとシュール過ぎる。

これ以外にも、画像生成AIが苦手なジャンルというのがあるようです。

考えてみれば、ラーメンを食べるイラスト画像ってあまりないですよね。教師データの少なさが、この悲劇?を招いているものと思います。

私などは銀河英雄伝説風の宇宙戦艦などを描かせたいんですが、これも教師データとなりうる画像が少ないジャンルのためか、あまりいい絵ができたためしがありません。なんだか古臭いタイプの宇宙船ばかりが出てきます。

202210231254092a_space_battleship_that_f

さて、綺麗な画像ができたからと言って、細部を見るとやっぱりどこか不自然というのが、画像生成AIの特徴でもあるようです。

イラスト系でかなり高精度な画像を返すNobelAIでも、よくできたイラストであっても細かく見るとどこか変、というのがあって、それをまとめた記事は以下。

 画像生成AIによって生成されたイラストの見分け方 | おいもログ

で、Stable Diffusionで実写系の画像を作らせても、なんだかおかしな画像を返してくることもあります。

例えばステーキ肉のような画像は相当数の教師画像があるためか、わりと高クオリティな画像が生成されます。

20220922194025191662340333scale1000ddim1 

ですが、やはり欠点も見えてきます。

例えば、この画像。

20220922193131121662340326scale1000ddim1

一見すると悪くない画像に見えますが、よく見ると変です。

一枚肉なのに、焦げ目が不連続です。

おそらく、カットステーキの画像が一枚肉として表現されてしまったものと思われます。

AIはカット肉と一枚肉との区別が付けられないため、こういうことが起きるのでしょう。

似たような事例として、文字表記がおかしいというのもありますね。

202209201429531331126655scale1000ddim1

特に日本語は酷いものです。ひらがな、カタカナ、漢字とは似ても似つかないものが出てきます。

これは文字を「模様」としてしか認識しておらず、それっぽい見た目のものを返した結果、こうなるのでしょう。

ところで、画像生成AIに対して一つ、理解されていないかなぁと思うことがあるんですが。

よく「AIに作らせてみた」系の投稿がTwitterなどで見られますが、あの画像を一枚作り上げるために、数枚ほど作って良いものをチョイスしていることはよくあることです。

例えば最近、「飲み会」の画像を作らせてみたんですが、

202210102029565a_scene_of_the_movie_that

一見すると悪くなさそうですが、よく見ると右側の男性の顎がちょっと怖い。不自然すぎます。

ランダムノイズを付加してそこからデコードした信号を画像として整えていくようなアルゴリズムですから、不自然なものが出てきてもおかしくないです。

こういうものを何枚か出力させてみて、まともな奴をチョイスして表示させていることが多い、というのが現状かと思います。

(NobelAIは試してませんが、ラーメンの画像を見る限りは、やはりまだまだ失敗作も多いんじゃないかと推測してます)

正直言って、人類を脅かす(?)ほどの存在にはまだまだ遠く及びませんね。

今後改善されることを期待はしたいですが、教師データとなる既存のものを参考に画像を生み出しているという性格上、人間の想像力を超えるものを作り出すことは不可能です。

ゆえに、絵師さんの役割が消えることはないと考えます。

この画像生成AIですが、例えばアニメやイラストを描く人の負担低減としてベース絵や背景画像を作らせるのに使うという活用法が、もっとも良いAIとの付き合い方になるのではないか、と個人的には考えてます。


MSI GeForce RTX 3050 VENTUS 2X 8G OC グラフィックスボード VD7986

2022年10月 4日 (火)

NovelAI diffusionがヤバい

ここ数か月の間に、画像生成系AIが急激な進歩を遂げております。

Midjournyに始まり、Stable Diffusion、それ以外にもいくつもの画像生成AIが話題になりましたが、極めつけとして「NovelAI diffusion」なるものが出てきました。

【解説】NovelAIで超ハイクオリティな二次元イラストを生成してみる #NovelAI #NovelAIDiffusion|さいとう|note

このNovelAI、一言で言えば「二次元特化型画像生成AI」とでもいうんでしょうかね。マンガや小説の表紙絵のような画像をほいほいと作成してくれるようです。

例えば、こんな感じの画像が作れるようで。

なお、今のところ無料での利用はできない模様。

先のリンク先に、利用方法が書かれています。

で、このNovelAIが今、物議を醸しだしているみたいです。

【大炎上】NovelAIが無断画像転載サイトdanbooruの絵を学習データに使用にネット民大紛糾「絵師は詰んだな!」「他人の絵で勝手に商売しとるんか!」#NovelAIDiffusion #NovelAI #Danbooru : 超絶"厳選"ニュースまとめch

曰く、無断画像転載サイトにある画像データを教師データとして作られたAIな模様、とのこと。

いや、それを言い出したら今までの画像生成AIすべてがその転載サイトの画像データをつかっているらしい、との話だそうで。

確認のしようがないので何とも言えませんけど、でもおそらく間違いないでしょうね。ついでに言えば、実写画像も無断で使われている可能性だってあります。

ちょっと厄介なのは、教師データに使った画像そのものが生成されるというわけではないため、著作権的な問題を問えないというもの。

ですが、この手のAIには「画像の生成精度が向上 = どこかで見たような絵が出来上がる」という構図もあって、高精度な画像が作り出せるようになったがゆえの問題というものが噴出し始めたようですね。

しかも、オープンソースで配布するならまだしも、有料サービスとしてしか使わせないとなると、それってつまり他人の才能を勝手に流用して商売をしているようなものだと言われても仕方がないわけで……

画像生成AIが急速に発達したがゆえに生じた、倫理的な問題ともいえます。

さて、そんな高精度なAIですが、実はこの手のAIにも盲点があります。

簡単にいうと「航宙戦闘艦を上手く描いてくれるAIがまだ存在しない」ことです。

いわゆる漫画やラノベの表紙絵・挿絵は特有の娘の絵が使われているがゆえに、大量の教師データが存在します。

が、私が「小説家になろう」で書いているような砲艦やら強襲艦やらは、ほとんど教師データが存在しません。

新鋭艦隊のポンコツ旗艦の提督と戦乙女たち

てことで、この手のAIには期待することは多いんですけど、残念なことに私を満足させる画像は作ってくれそうにありません。

宇宙戦艦ヤマト、ガンダム The Origin、銀河英雄伝説くらいですからねぇ、この手の画像は。

つまりまだAIには未知のフロンティアがたくさん存在するわけです。

ということで、AIが人の仕事を奪うことは、まだまだ当面の間は起こりそうにないですね。

AIに仕事を奪われそうだと懸念されている絵師様、この未知のフロンティアならばまだまだ活躍の場が残されております。なんとなれば、私の作品につながるような絵を描いていただければ、などと考えないこともありませんが(チラチラ)


世界の終わり 【画像生成AI 生成画像集】

2022年9月17日 (土)

話題の画像生成AI「Stable Diffusion」を自分PCのCPU環境で実行する方法

このブログでも紹介した単語から画像を生成するAI「Stable Diffusion」を、NVIDIA製GPU+CUDAの環境がなくても実行できる方法を見つけましたので、紹介します。

きっかけは、以下のツイート。

ここをたどった先にあるリンク

[ONNX] Stable Diffusion exporter and pipeline by anton-l · Pull Request #399 · huggingface/diffusers · GitHub

を参考に進めます。

なお、ここではWindows 10/11とWindows版Python(我が家のPythonのバージョンは3.7.9)で使うことを想定してます。

(1) 前準備

前回の記事(高精度な画像生成AI「Stable Diffusion」を自分のPCで動かす方法(+ google colab): EeePCの軌跡)にも載せた内容と重複しますが、まず以下のサイトに入ってHuggingFaceのアカウントを作成。

Hugging Face – The AI community building the future.

確認メールのやり取りなどが発生しますが、その辺りは順次実行します。

アカウント作成後、ログインしつつ以下のページにアクセス。

CompVis/stable-diffusion-v1-4 · Hugging Face

するとここで、以下のような文章が出てきます。

Stablediffushion01

一番下にあるチェックを入れて、”Access repository”ボタンをクリック。

その後に右上にある丸いアイコンをクリックして、以下のようなメニューを出します。

Stablediffushion01a

その中の「Settings」をクリックし、現れるメニューの中から「Access Tokens」をクリック。

Stablediffushion01b

この画面で横の「Show」というボタンをクリックして文字列を表示させて、出てきたトークンをテキストファイルにでも貼り付けておきます。

これは後ほど、使います。

(2) ONNX版Stable Diffusionモデル変換

まずWindows PowerShellを開き、必要なライブラリを入れておきます。

> pip install torch torchvision torchaudio

> pip install diffusers matplotlib

> pip install onnxruntime

最低限、この辺りを入れておけば動くものと思われます。

続いて以下のサイトに行き、コードをダウンロードします。

GitHub - huggingface/diffusers: 🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch

右上の方の緑色の「Code」の中の「Download ZIP」をクリックしてダウンロードしておきます。

落ちてきたZIPファイルを展開し、それをどこか適当なところに置きます。

(「diffusers-main」というフォルダが現れてるはずです)

で、まずこの「diffusers-main」フォルダの下にある「scripts」フォルダの中から「convert_stable_diffusion_checkpoint_to_onnx.py」というコードがあるので、これをエディタで開きます。

で、こいつの69行目付近に、

def convert_models(model_path: str, output_path: str, opset: int):
    pipeline = StableDiffusionPipeline.from_pretrained(model_path, use_auth_token=True)
    output_path = Path(output_path)

というのがあるので、これの「user_auth_token=True」の「True」の部分を、先ほどのトークンに入れ替えます。

def convert_models(model_path: str, output_path: str, opset: int):
    pipeline = StableDiffusionPipeline.from_pretrained(model_path, use_auth_token="自分のトークン")
    output_path = Path(output_path)

で、この後、Windows PowerShellで「diffusers-main」に入り

(cドライブのmlというフォルダの下にdiffusers-mainがある場合は、「cd c:\ml\diffusers-main」と打ち込んでEnter)

そこで、以下のコマンド

> python scripts/convert_stable_diffusion_checkpoint_to_onnx.py --model_path="CompVis/stable-diffusion-v1-4" --output_path="./sd_onnx"

を実行。

すると、stable diffusionのモデルダウンロードと、CPU環境で動かせるONNXモデルへの変換が始まります。

だいたい5GB程度のモデルがダウンロードされます。

で、上のフォルダに「sd_onnx」という謎の(?)フォルダが生成されているはずです。

(3) Stable Diffusionの実行

準備完了。では、コードを実行してみましょう。

以下のコードを「diffusers-main」フォルダに置きます。

(ここでは”onnx_stable_diff.py”とします)

from torch import autocast
from diffusers import StableDiffusionOnnxPipeline
import matplotlib.pyplot as plt
import datetime
now = datetime.datetime.now()
model = StableDiffusionOnnxPipeline.from_pretrained("./sd_onnx", provider="CPUExecutionProvider")
prompt = "a scene of the movie that Hiace running at full speed in the desert , realistic photo, taken with Canon 5D Mk4"
num = 3
for i in range(num):
    image = model(prompt)["sample"][0]
    image.save("test_" + now.strftime('%Y%m%d_%H%M%S') + "_" + str(i) + ".png")

for i in range(num):
    plt.imshow(plt.imread("test_" + now.strftime('%Y%m%d_%H%M%S') + "_" + str(i) + ".png"))
    plt.axis('off')
    plt.show()

なお、プロンプトのところに入っている”呪文”は、「砂漠を爆走するハイエース」です。

で、これを実行。

> python onnx_stable_diff.py

Stable_diffusion_cpu00

こんな具合に、バーが進行し始めたら成功。

しばらくほっとくと、3枚の画像が生成されて、1枚目から順次、表示されます。

Stable_diffusion_cpu01

こんな画像が出てくるはずです。

なお、フォルダ内に「test_日付_時刻_0.png」というファイル名の画像で保存されていきます。

画像をいちいちポップアップしたくない場合は、コードの最後の4行をコメントアウトしてください。

で、できた画像ですが、こんな具合。

Test_20220916_181817_0

Test_20220916_183849_1

うーん、砂漠をハイエースっぽい何かが走ってますね。

我が家のPCは、メモリー16GBを搭載したRYZEN 5 4600H(6コア)のノートPC。

で、大体8秒/イタレーションで、51イタレーションごとに一枚。つまり、1枚当たり大体6分かかります。

Google Colaboratoryの無料版でも、イタレーション辺り1.8秒なので、4倍くらいかかる計算。そう考えると遅いですが、自身のPC環境で動かせるというのは大きなメリットです。

が、メモリーは大体14GBほど消費されていたので、16GB以上のメモリーを搭載したPCでないと無理そう。そこはご注意を。

決してハードルが低くなったとは言い難いですが、どうにかローカルPCで画像生成AIを動かせる環境を手に入れることができました。

今後、いろいろと作ってみようかと思ってます。会社のPCにも導入したいです。


マイクロソフト Surface Laptop 4 13.5インチ/ Office H&B 2021 搭載 / Core i5 / 16GB / 512GB / プラチナ 5AI-00086

2022年8月26日 (金)

高精度な画像生成AI「Stable Diffusion」を自分のPCで動かす方法(+ google colab)

実は我が家では動かなかったのですが、その理由は後述。動作可能にするところまではいけました。

先日、Midjournyというお絵描きAIを試してみた: EeePCの軌跡という記事を書きましたが、Midjournyをも超える文章からの画像生成AIが正式リリースされたとのことで、ネット界隈が騒然としております。

それが「Stable Diffusion」というやつなのですが、特徴としては、

・オープンソースで、自分のPC上でも利用可能(つまり無料で使うことができる)

・生成画像の商用利用も可能

とのことで、お手軽具合は確かにMidjourny以上です。

こいつを自分のPC上で使えたら本当に自由自在です。

しかも、かなりいい出来の画像を返すとのことで、期待が高まります。

下記のサイトを参考に、構築してみました。

[Stable Diffusion] AIでテキストから画像を生成する[Python] - TeDokology

このサイトでは、Google Colaboratoryでの利用を前提に書いてますが、ここのコードをPC上でも使うためのやり方を残しておきます。

うちでは、Windows版python 3.7.9をインストール済み、という前提です。

で、まずHuggingFaceのアカウントを作ります。

Hugging Face – The AI community building the future.

このサイトでまず、アカウントを作ってください。

で、アカウント作成後にログインし、以下のページにアクセス。

CompVis/stable-diffusion-v1-4 · Hugging Face

するとここで、以下のような文章が出てきます。

Stablediffushion01

一番下にあるチェックを入れて、Access repositoryをクリックします。

で、その後に、右上にある丸いアイコンをクリックすると、以下のようなメニューが出てきます。

Stablediffushion01a

その中の「Settings」をクリックし、現れるメニューの中から「Access Tokens」をクリック。

Stablediffushion01b

すると黒丸の文字列が出てくるので、横の「Show」をクリックして文字列を表示し、テキストファイルにでも貼り付けておきます。

このトークンは、後ほど使います。

さて、続いてWindows PowerShellを開き、そこで、

pip install diffusers==0.2.4 transformers scipy ftfy

を実行します。必要なライブラリがインストールされるので、以下のコードをコピペで持っていきます。


#%cd /content
#!pip install diffusers==0.2.4 transformers scipy ftfy

from diffusers import StableDiffusionPipeline
import matplotlib.pyplot as plt

access_tokens="HuggingFaceで作ったAccessTokenをここに入れます" # @param {type:"string"}
     
# load pretrain model
model = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=access_tokens)
model.to("cuda")

prompt = "A silver-haired girl standing in front of a giant Gundam-style robot" #@param {type:"string"}
     
num = 5
     
for i in range(num):
    # モデルにpromptを入力し画像生成
    image = model(prompt)["sample"][0]
    # 保存
    image.save(f"test_{i:04}.png")
     
for i in range(num):
    plt.imshow(plt.imread(f"test_{i:04}.png"))
    plt.axis('off')
    plt.show()

これを「stable_diff.py」という名前でも付けて保存。

なお、このコード内の「access_tokens=」の後ろは、先ほどゲットしたAccess Tokensの文字列を入れておいてください。

さて、ちょっと厄介なのですが、Windows上ではこのままでは動きません。

多分、普通に

> python stable_diff.py

エラーが出てくるはずです。

で、いろいろ調べた結果、管理者権限で起動したWindows PowerShellを使わないとダメらしいです。

Stablediffushion02

はい、Windows PowerShellのアイコンを右クリックして「管理者として実行」を選んで起動します。

その後に「 python stable_diff.py」とやれば、動くはずです。

Stablediffushion03

モデルのダウンロードが開始されて、いよいよ動き出します。

が、我が家ではこの後、動かなくなりました。

Stablediffushion04

こんなエラーを出して、終了。

簡単にいうと、

GPUのメモリーが足らんのじゃボケェ!

と言われました。

はい、我が家のGTX1650Tiは4GB。で、どうやら10GB以上のメモリーを搭載したGPUじゃないとダメっぽいです。

これでは、取りつく島もありません。

一応、少ないGPUメモリーのマシンで動かす方法もないわけでもないですが、

話題のStable Diffusionがオープンソース化されたのでローカルで動かしてみる

(この中のコメントでfloat16でも動かす方法というのを見る)

めんどくさそうなので、とりあえず私はさっさと諦めてGoogle Colaboratoryに行きました。

Stablediffushion05

なお、こっちで動かすためには、先のコードの先頭2行の「#」を消しておいてください。

かつ、Google Colaboratoryの中の「ランタイムのタイプを変更」‐「ハードウェアアクセラレーター」をNoneからGPUに変えておいてください。

ちなみに、上のコードをそのまま実行すると「ガンダム風巨大ロボットの前に立つ銀髪の女の子」の画像が作成されようとします。

他の画像がご所望の方は、「prompt=」の後ろの英文を変えてください(英語で)。

上のコードを実行すると、一気に5枚まで作ってくれます。Google Colaboratoryなら大体1、2分で完了しました。

で、できた画像はこんなの。

Test_0003

うん、確かに「ガンダム風巨大ロボットの前に立つ銀髪の女の子」です。

何度かやりましたが、たまに作画崩壊気味の画像も出てきました。

が、結構はっきりとした画像が生成されることが多くて、なかなかいい感じです。

他にも、

「銀河英雄伝説の戦艦」

Index3

「中世風の街に立つ娘」

Index5

(いずれも、Google翻訳で日本語 → 英語に変えてからコードに入れてます)

Midjournyと比べると、かなりくっきりとした画像が得られるというのが個人的な印象。

確かに精度もMidjourny以上だと言われると、その通りですね。

なかなか遊べます。ほんと、AIの進化ってやつには驚くばかりです。

※追記

アップ直前になって、少ないGPUメモリーのPCでも動かせるコードができたので、参考までに載せておきます。

公式のサイトの以下の記事

CompVis/stable-diffusion-v1-4 · Hugging Face

をよく読んでいたら、GPUメモリーが少ないPC向けのfp16版のコードができたので、それを残しておきます。


from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler
import torch
from torch import autocast

access_tokens="HuggingFaceで作ったAccessTokenをここに入れます" # @param {type:"string"}

model_id = "CompVis/stable-diffusion-v1-4"
# Use the K-LMS scheduler here instead
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16, revision="fp16", use_auth_token=access_tokens)
pipe = pipe.to("cuda")

prompt = "A silver-haired girl standing in front of a giant Gundam-style robot"
with autocast("cuda"):
    image = pipe(prompt, guidance_scale=7.5)["sample"][0]  
   
image.save("test.png")

これを「stable_diff_l.py」という名前で保存し、

> python stable_diff_l.py

と実行すると、10GB以下のGPUメモリーのPCでも実行できるかも、とのことです。

ただし、動作は未確認。我が家の4GBじゃどのみちダメでした・・・


Midjourney 入力テキスト&出力画像コレクション 1: イメージ通りの画像を生成するためのヒントを得よう! Midjourney 入力・出力コレクション

2022年6月28日 (火)

ラベル(四角形で囲まれた部分)を自動で抜き出して台形補正してくれるやーつを作ってみた

社内で、ラベル部分を撮影してその部分を補正しつつ自動的に抜き出すプログラムコードを作ってみました。
何を言っているのかというと、

Image3

例えばこういう写真を撮ると

Output

ラベルの部分だけを抜き出して、補正した状態で保存してくれるものを作った、ということです。
いろんなところを参考にしたのと、社内の有志(勇士)にも頼んで作った結果、できました。
参考にしたサイトは、以下。

OpenCVの使い方9 ~ 台形補正2 - つれづれなる備忘録

【label_daikei.py】

import cv2
import numpy as np
import math
import itertools

# 比率調整
import pandas as pd
# 入力画像のパス
input_file_path = "./data/image3.jpg"
# 出力画像のパス
output_file_path = "./output.jpg"
# 入力画像の読み込み
img = cv2.imread(input_file_path,0)
# 二値化
# 閾値の設定
threshold_min = 160
threshold_max = 230
# 二値化
ret, img_thresh = cv2.threshold(img, threshold_min, threshold_max , cv2.THRESH_BINARY)

#四角抽出
tmp= cv2.findContours(img_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = tmp[0] if len(tmp) == 2 else tmp[1]
#一定以上の面積の図形のみを抽出
areas = []
for cnt in contours:
    area = cv2.contourArea(cnt)
    if area > 70000:
        epsilon = 0.1*cv2.arcLength(cnt,True)
        approx = cv2.approxPolyDP(cnt,epsilon,True)
        areas.append(approx)
pt=[]
# arrayをdataframeに変換して整形
df_a = pd.DataFrame(areas[0].reshape(-1,2))
# 全4pointについてy座標でsort
df_a.sort_values([df_a.columns[0], df_a.columns[1]], inplace=True)
# 上下の2pointずつを分ける
df_upper = df_a.iloc[:2, :]
df_lower = df_a.iloc[2:, :]
# 下部2pointについてx座標でsort
df_lower.sort_values([df_lower.columns[1], df_lower.columns[0]], inplace=True)
# 上下を合体
df_a = pd.concat([df_upper, df_lower])
for j in range(df_a.shape[0]):
    # arrayにしてリスト化
    p = np.array([df_a.iloc[j, :].tolist()])
    pt.append(p)
# 全体をarray化
pt = np.array(pt)
#頂点の座標を得る
pt1=pt[0] #左上
pt2=pt[1] #左下
pt3=pt[2] #右下
pt4=pt[3] #右上
print(pt[0]) #左上
print(pt[1]) #右上
print(pt[2]) #右下
print(pt[3]) #左下
pts = np.float32(np.array([pt1,pt2,pt3,pt4]))
o_width = np.linalg.norm(pt2 - pt1)
o_width=int(np.floor(o_width))
o_height = np.linalg.norm(pt3 - pt1)
o_height=int(np.floor(o_height))
dst_cor=np.float32([[0,0],[o_width,0],[0, o_height],[o_width, o_height]])
# 変換行列
M = cv2.getPerspectiveTransform(pts, dst_cor)
# 射影変換・透視変換する
output = cv2.warpPerspective(img_thresh, M,(o_width, o_height)).T
cv2.imshow("cut", output)
cv2.waitKey()
# 射影変換・透視変換した画像の保存
cv2.imwrite(output_file_path, output)

参考にしたサイトの通りにすると、うまく抜き出せなかったのですが、これでようやく正常な画像として抜き出せました。
最後の方の「output = ~」のところに転置(.T)がついてて奇妙なコードですが、なんかもうこれで動いちゃったので、勘弁してください。

で、「data」というフォルダに入っているimage3.jpgという画像ファイルを読み込み、四角形で囲まれた部分を抜き出して補正するというものですが、18、19行目にある「100」、「230」という数値は、その画像抜出時に二値化するための閾値です。適宜、いじってください。

また、画像ファイルの横幅は1000程度にしておいた方がいいです。あまり大きいと、うまく読み込みません。
もし大きな画像サイズでじっしするときは、31行目あたりの

if area > 70000:

という行の「70000」という数値を大きくした方がいいでしょう。

この程度の台形補正ならば、Microsoft Pixあたりでも可能です。その方が楽ですね。
が、台形補正 → OCR処理 という連続処理をさせたかったがために、アプリではなくPythonのコード化をする必要に迫られた次第です。
もし、前処理として画像の歪みを補正する必要に迫られたら、ぜひご参考に。


OpenCVではじめよう ディープラーニングによる画像認識

2022年5月19日 (木)

「小説家になろう 第10回 ネット小説大賞」の一次選考通過作品のタイトルで共起ネットワーク図を作る手順

私事ですが、現在、選考が行われている「小説家になろう 第10回 ネット小説大賞」の一次選考に、以下の一作品が通過いたしました。

宇宙からやって来た技術武官とスマホ好き幽霊の王都事件簿

これ、第9回でも一次選考を通過した作品。今回で二度目。ということは、二次選考は……

と、それはともかく、実は一次選考した作品

 第10回ネット小説大賞:一次選考通過作品発表! | TOPICS | ネット小説大賞

のタイトルを眺めていたら、なんとなく分析したくなりました。

で、KHCoderを使い、その画像をTwitterに上げてみたところ、プチバズしまして。

かなりの方がご興味を惹かれたようです。

ならばと、その手順を残してみようかと思った次第です。

例えばアンケート分析などにも応用できるため、ぜひご覧ください。

まず、上の一次選考のタイトルを取得し、csvファイルにします。

私はブラウザ上のタイトルをマウスでぐるっと選択し、

Cgcon10_03

それをExcelに張り付けました。

Cgcon10_05

保存する前に、1行目にラベル名を入れます。ここでは「title」「name」としておきました。

(作者名は使わないので、ここを一列にしてもらってもいいです)

Cgcon10_06

この状態で、csvファイルとして保存。

さて、ここで分析用ソフトを入手します。

KHCoderというソフトを、以下から入手します。

 KH Coder: 計量テキスト分析・テキストマイニングのためのフリーソフトウェア

フリーソフトながら、なかなか強力なテキストマイニングツールです。

ここの「KH Coder 3 ダウンロード 」をクリックし、ダウンロードします。

で、得られたExeファイルをダブルクリックすると、以下のような窓が開くので、

Cgcon10_07

「Unzip」をクリックします。

Cgcon10_08

こんなアイコンが、デスクトップ上にできているはずです。

Cgcon10_09

このアイコンをダブルクリックし、開いたフォルダ内の「kh_coder.exe」をダブルクリック。

Cgcon10_10

こんなのが現れます。

Cgcon10_11

では、先ほどのcsvファイルを開きます。「プロジェクト」の「新規」をクリックすると、

Cgcon10_12

こんな画面が開くので、「参照」でファイルを選ぶか、ファイルを直接ドラッグ&ドロップします。

Cgcon10_12a

「分析対象とする列」が「title」になっていることを確認し、「OK」をクリック。

Cgcon10_13

こんな窓が開くので、「前処理」の中の「前処理の実行」をクリックします。

Cgcon10_14

これは、CPUのシングルコア性能によりけりですが、まあまあ時間がかかります。

Cgcon10_15

前処理が終わったら、「抽出語」‐「抽出語リスト」を選択。

Cgcon10_16

中で使われている単語が出てきます。

が、ここでちょっと、おかしな単語が。

「x{301c}」という変な単語があります。おそらく、ブラウザ上のテキストをコピペした際に入り込んだ文字コードだと思われます。

これは無意味な単語なので、消しておきたいですね。

また、トップに「世界」があります。

が、「異世界」がない。

日本語という言語は、英語などと違い、単語間にスペースが入っておりません。このため、分析するためにまず単語同士を区切らなければなりません。これが、前処理で行っている作業の一つです。これを「分かち書き」と言います。

この分かち書きは、辞書を使って行われるんですが、標準辞書には「異世界」という言葉がないようです。このため「異」「世界」とわけられてしまいます。

他にも「悪役令嬢」もないため、「悪役」「令嬢」に分かれます。

これらをただすために、以下の操作を実行。

Cgcon10_17

「前処理」‐「語の取捨選択」を選びます。

Cgcon10_18

こんな画面が開くので、先ほどの「異世界」や「悪役令嬢」といった、ひと塊にしたい単語を「force pick up」に、消したい単語を「force ignore」のところに入れます。

Cgcon10_19

こんな具合。

できたら、OKをクリックし、再び前処理を実行。

Cgcon10_20

目論見通り、「異世界」という単語が出てきました。全部で151個あるようです。

Cgcon10_22

さて、いよいよ分析ですが、その前にこのリストをざっと200位くらいまで眺めます。

なんとなく私は、170位、頻度9までの単語を表示しようと決めました。

Cgcon10_21

その後に、「ツール」‐「抽出語」‐「共起ネットワーク」を選択します。

Cgcon10_23

こんな窓が現れますが、ここで「最小出現数」を9、「上位」のところを170としておきます。

「プロットサイズ」を960としておくのをお勧めします。

Cgcon10_24

で、OKをクリックすると、御覧の通り、共起ネットワーク図が出てきます。

「共起」とは、すなわち単語同士の関連の強さを表すもので、関連のある単語同士が線で結ばれてます。

ある程度のクラスタリングも行われており、同じクラスタと思われる者同士が同じ色に塗られてます。

ざっと眺めてみると、なるほどよく見かける単語が多いのが分かります。最も大きいのは「異世界」で、共起度の高い単語に「転生」「召喚」「モブ」などがあることが分かりますね。

あと「勇者」「追放」や「悪役令嬢」「婚約」も共起度の高い単語同士であると分かります。

つまり一次選考を通過した作品には、そういうタイトルが多いということです。

もっとも、この傾向を反映したタイトルの作品が一次選考を通過しやすいかどうかは、また別の問題でしょうが。

なお、Twitterに載せた画像とはちょっと違うと思われますが、これは単語の並び方や色付けが毎回ランダムで行われていること、あと抽出する単語の条件や前処理が、この間とはちょっと異なるためです。

これでほぼ目的は達成されますが、もうちょっとだけ補足。

このネットワーク上の単語をクリックすると、

Cgcon10_25

こんなものが現れます(「勇者」をクリックした例)。

その単語を持つタイトルが、ずらずらっと現れます。

これをさらにダブルクリックすると、そのタイトルと、作者名が出てきます。

Cgcon10_26

こんな具合に、より詳細を確認することができます。

Cgcon10_27

もう少し、共起ネットワーク図の単語を絞り込みたいと思う場合は、まず「抽出語」‐「関連語検索」を選択し、

Cgcon10_28

例えば「追放」を検索し、その下にある「共起ネット」をクリックします。

Cgcon10_30

すると、「追放」に関するワードのみで共起ネットワーク図が形成されます。

なお、上の図はこのネットワーク図の下にある「調整」というボタンをクリックし、上位を200まで上げた際の結果図です。

とまあ、こんな具合にこのKHCoderは、膨大な文章データの傾向分析や可視化を行うことができる便利なツールです。

私は会社で、よくアンケート分析に使用しております。

できれば一次選考を通過した作品名の横にカテゴリーもあると、より面白い分析ができたんですけどねぇ。

なお、小説そのものを分析したこともあります。

「砲撃手の妻は呪術師(シャーマン)」をKH Coderの「共起ネットワーク」で分析してみた: EeePCの軌跡 

句読点で改行させるなどの事前処理が必要となりますが、小説の癖や傾向を見ることができて、これもなかなか面白いです。

アンケート分析や、自分の小説の分析など、使い道いろいろな分析ツールです。


動かして学ぶ! はじめてのテキストマイニング: フリー・ソフトウェアを用いた自由記述の計量テキスト分析 KH Coder オフィシャルブック II (KH Coder OFFICIAL BOOK 2)

より以前の記事一覧

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ