« 2024年5月 | トップページ | 2024年7月 »

2024年6月29日 (土)

ご近所の本屋が閉店します

我が家から歩いていける場所にあった本屋が、今月いっぱいで閉店となります。

20240627_220725168_ios

(昨日の早朝、開店前の姿を写真に納めました)

ここに引っ越してきて17年。その間に手に入れた本の大半はここで購入。そんなわけで、かなり利用させてもらいましたが、それもいよいよ明日で終わりです。
ということで、買い物に行ってきました。

20240629_002255133_ios

文房具については50%オフをやってました。が、本自体は安売りしてませんね。当然ですが。
ちなみにこの本屋は、本店ともう一店舗あるそうです。

本屋さんといえば、ここに引っ越してきた時には2店舗あったんですよね。それが10年位前に一つがつぶれ、そして今回、大通り沿いのここが閉店です。

なお、近所にあるららぽーとの中にも本屋があるので、不便というわけではないですが、そこは気軽に歩いていける距離ではないですからね。

20240629_004216245_ios

ちなみに、買ってきたのはこちら。生成AIの特集を組んだInterfaceです。
RAGやローカルLLMを使ったファインチューニング(というかLoRA)をやるという、相変わらずそれなりの濃さを持つ雑誌です。
紙の書籍も、まだまだ役割はあると思うんですけどね。

そんなわけで、また一つ本屋が消滅します。
そろそろ、新しいビジネスモデルがないと、こういう実店舗がどんどんなくなっていきそうです。それはそれで、寂しいことですよね。


Interface(インターフェース) 2024年 8 月号

 

2024年6月27日 (木)

ElyzaのLlama3ベースの言語モデル「Llama-3-ELYZA-JP-8B」のRAGが予想以上に賢かった件

昨日(6/26)に、東大発ベンチャーであるELYZA(イライザ)からLlama3ベースの言語モデル「Llama-3-ELYZA-JP」が発表されました。

「GPT-4」を上回る日本語性能のLLM「Llama-3-ELYZA-JP」を開発しました|ELYZA, Inc.

つい先日、Googleの大規模言語モデルを使った「notebookLM」に圧倒されたばかりですが、オープンモデルのELYZAも気になるので、試してみることにしました。

なお、GPT-4を超えたとされるのは、ELYZA‐JPの70Bモデル(700億パラメーター)であり、こちらはモデルとしては配布されておらず、APIとしての利用のみとなっている模様。
公開されているのは8Bモデル(80億パラメーター)のみです。

以前のLlama2ベースの時は、7Bと13Bの2種類が公開されていたのに、今回は8Bのみとは・・・などと残念に思ってましたが、むしろこの8Bモデル、以前の13Bモデルよりも高精度な言語モデルでした。

実際、8Bモデルでも日本語での性能はGPT-3.5 Turbo並みだというので、なかなか大したものです。

それの量子化モデルを入手し、以前の記事、

大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡

でやったRAGにトライしてみました。
なお、環境設定その他は上の記事の時そのままです。

モデルを、以下のサイトからダウンロードします。

elyza/Llama-3-ELYZA-JP-8B-GGUF · Hugging Face

ここのサイトの「files and versions」タブをクリックし、「Llama-3-ELYZA-JP-8B-q4_k_m.gguf」の横の下矢印をクリックしてダウンロードを実行します。

得られたモデル「Llama-3-ELYZA-JP-8B-q4_k_m.gguf」を、先のフォルダの「models」に入れておきます。

プログラムコードも先の記事ほぼそのままですが、一か所、「model_path = 」のところを、

model_path = f"models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf"

としました。このコードを、

> python elyza_rag.py

と実行すると、前記事同様、RAGが実行されます。

では、前回と同じ質問を投げかけてみます。

##Question: カルヒネン曹長の恩師の名前は?

その返答はというと、

カルヒネン曹長の恩師の名前は、ラハナスト先生です。

となりました。Llama2-7Bモデルではそっけなく「ラハナスト」としか答えなかったところを見ると、かなり人間的になりましたね。

ちなみに、8Bモデルということもあり、かなり軽いです。うちのGTX1650Tiを使っても、30秒ほどで回答が返ってきます。
(起動時は相変わらず遅い)

調子に乗って、もう少し高度な質問をしてみます。

##Question: イーサルミ王国はなぜオレンブルク連合皇国と戦争をすることになったのですか?

これ、Llama2のモデルでは支離滅裂な回答しか返ってこなかったのですが、Llama3ベースの今度のモデルは違います。

イーサルミ王国は、オレンブルク連合皇国の属国であったが、現皇帝が即位してから圧政を敷き、高い税負担や言論統制などを行ったため、イーサルム王国内は大いに乱れた。さらに、強大化した軍隊が属国への干渉を働くこととなり、悪循環を招いた。そこで、イーサルミ王国は連合皇国からの独立を宣言し、オレンブルク連合皇国軍に対して奇襲を行い、これを一斉排除することに成功したが、その後、苛烈な独立戦争が始まった。

ちゃんと、文脈を捉えた回答が返ってきました。これは予想外でした。
Llama3ベースのモデルって、優秀過ぎない?

もちろん「notebookLM」あたりと比べたらまだまだでしょうけど、やっすいゲーミングPC上で実行していることを思えば、これはなかなかの性能です。

てことで、さらに調子に乗って、より突っ込んだ質問をしてみました。

##Question:イーサルミとオレンブルクの戦いは、この先どうなると思いますか?

この物語の先を予想させてみました。文脈を読んで、彼(Llama3-ELYZA-JP)はなんと回答するのか?

銃が飛ぶように売れては犯罪の誘発などにつながって困りものだが、計算尺なら飛ぶように売れたところで誰も困らない」という会話から、イーサルミ王国とオレンブルク連合皇国の戦争が長期化していることがわかります。

また、「我々の独立を承認することは他の王国の独立を誘発しかねないと考えている」や「多数の国が連合する皇国にとって、それらの国の離脱が最も恐れるべき事態だ」という会話から、オレンブルク連合皇国はイーサルミ王国の独立を認めるつもりはないことがわかります。

さらに、「我々は決して屈しない。やつらが我が国の独立を認めるまで、我々は戦い続ける」という会話から、イーサルミ王国は独立するために戦争を継続する意思があることがわかります。

以上の情報から、イーサルミ王国はこの先もオレンブル

なんか、最後はちょっと途切れてしまいましたが、要するにオレンブルクとイーサルミの戦争はまだまだ続くと言いたかったのでしょう。そういう流れの回答です。
ただし、この回答ばかりは80秒ほどかかりました。かなり頭?を使ったようです。ですが、使っただけの回答です。恐れ入ります。

ということで、予測的なことまで可能となったLlama3ベースの8BモデルによるRAGは、なかなか使えそうです。

今回は「計算士と空中戦艦 : 小説家になろう 」の第1章のみでしたが、第2章まで読み込ませて、より突っ込んだ質問をしてやりたいですよね。


面倒なことはChatGPTにやらせよう (KS情報科学専門書)

2024年6月24日 (月)

Googleの生成AI「Gemini 1.5 Pro」を使ったサービス「notebookLM」がすごいらしいので試してみた

GoogleがOpenAIのGPT 4に対抗して「Gemini 1.5 Pro」という生成AIを作っているということは知ってましたが、これの使いどころを知りませんでした。
が、最近、このGemini 1.5 Proを使った「notebookLM」というサービスがあることを知ったので、早速使ってみました。

NotebookLM | Note Taking & Research Assistant Powered by AI

20240623-193057

上のサイトで「Try notebookLM」をクリックします。
Google ChromeでGoogleアカウントにログイン済みならば、いきなり入れるはずです。

さて、このnotebookLMですが、OpenAIのChatGPTの最新版(GPT-4o)と比較して、いくつかメリットがあります。

・ 扱えるコーパス量が多い
・ 日本語の精度についてはGPT-4o以上

これはGoogleのひとから聞いたのですが、コーパスがChatGPTに比べてかなり多いとのことです。
コーパスが多いというのは、つまり大量の文章を処理できるということ。RAGでも使わない限り、通常のGPTならば数千文字程度しか一度に読み込んでくれないので、これは大きい。
地味に日本語読解力が強いというのもありがたいことです。

さらに、期間限定ですが、

・ 今なら無料で試せる

というところが一番大きいかと。

ということで、「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」の際に使用したテキストファイルを使って、いろいろとやらせてみました。

Try notebookLMをクリックすると、以下のような画面が出てきます。

20240623-193116

まずは、

計算士と空中戦艦 : 小説家になろう

の第1部 全19話、約11万文字のテキストを一つにまとめておきます。

この前準備をした後に、「新しいノートブック」をクリック。

20240623-193128

こんなのが出てきます。
で、今回はテキストファイルなので、「テキストファイル」を選択して、先ほど準備したテキストファイルを選びます。

20240623-190644

しばらく読み込んだ後に、概要や質問の候補などが表示されます。
この時点で、驚くほど正確に内容把握していることが分かります。

これは期待大。

ということで、先日のRAG以上の質問を投げかけてみました。

Q:この物語の概要を教えてください。

上にも概要が出てますが、改めて聞いてみました。すると、

物語のあらすじ

 この物語は、イーサルミ王国とオレンブルク連合皇国の戦争を描いています。

●主人公: ユリシーナ・カルヒネン曹長は、イーサルミ王国空軍所属の砲術計算士です。3年前にオレンブルク連合皇国の空襲で家族を失い、復讐のため計算士の道を選びました。
●イーサルミ王国: ヘリウム採掘場を独占する資源の豊かな国。オレンブルク連合皇国からの独立を宣言後、3年間戦争が続いています。
●オレンブルク連合皇国: 資源の乏しい国で、イーサルミ王国を属国としようと侵攻を続けています。ヘリウム不足のため、危険な水素を空中戦艦に使用しています。
●空中戦艦: 物語の舞台となる空中戦艦は、ヘリウムガスで浮遊し、大砲や爆弾を用いて戦います。主人公は「ヴェテヒネ」、「サウッコ」という名の空中戦艦に搭乗します。
●戦闘: 主人公は、卓越した計算能力で敵艦を撃沈し、イーサルミ王国空軍の勝利に貢献します。その功績により、異例の金三等勲章を授与されます。
●計算機: ラハナスト先生という計算工学の権威が、画期的な電子手順計算機を開発します。この発明は、将来、戦争のあり方を変える可能性を秘めています。
●戦争の終結: 物語終盤で両国の和平交渉が始まりますが、ヘリウムの供給を巡る対立などから、交渉は難航が予想されます。

 主人公は、戦争の悲惨さを目の当たりにしながらも、計算士としての職務を全うし、祖国の勝利のために戦い続けます。物語は、戦争の終結を予感させつつも、新たな戦いの始まりを予感させながら幕を閉じます。

予想以上に、詳細なあらすじが返ってきました。
書いた本人なので分かりますが、かなり正確ですね、これ。

となれば、こんな質問もしたくなります。

Q:この物語の続きとして、どのような展開が考えられますか?

物語の続きを考えさせてみました。
で、返ってきたのは以下の答え。

物語の今後の展開の可能性

 今回の物語の続きとして考えられる展開は、新たに発生したオレンブルク軍の動きと、主人公たちの動向、そして戦争の終結に関する点に集約されます。

●新たな敵の出現: 主人公たちが所属するイーサルミ王国空軍は、偵察艦撃沈後、オレンブルク軍の動きがないことに不気味さを感じています。
 これは、嵐の前の静けさであり、オレンブルク軍が何か大きな作戦を企てている可能性を示唆しています。
 具体的な展開としては、これまで登場していない新型の空中戦艦や、新たな戦術を引っ提げての攻撃などが考えられます。
 主人公たちのこれまでの活躍により、オレンブルク軍も戦術の見直しを迫られている可能性があります。
●主人公たちの次の戦い: 主人公であるカルヒネン曹長は、新しい計算尺を入手し、それを試す機会を待ち望んでいます。
 次の戦いでは、この新しい計算尺を用いて、これまで以上の精度で敵艦を攻撃することが予想されます。
 また、物語終盤でエクロース准将が、人命を損耗しない兵器として、計算機に爆弾を積んで突撃させる構想を語っています。
 この発言は、今後の戦争の行く末を示唆しており、主人公たちの前に、計算機を兵器として利用しようとする新たな敵が立ちはだかる可能性も考えられます。
●戦争の終結: イーサルミ王国とオレンブルク連合皇国の間で和平交渉が始まったことが語られています。
 しかし、両国の主張は大きく異なっており、交渉が決裂する可能性も高いです。
 特に、ヘリウムの供給を巡って対立が深まる可能性が示唆されています。
 もし交渉が決裂した場合、戦争はさらに激化し、主人公たちもより危険な戦いに巻き込まれることが予想されます。
 主人公たちの活躍が、和平交渉の行方にも影響を与える可能性も考えられます。

 これらの要素を組み合わせることで、様々な展開が考えられます。例えば、和平交渉が続く中で、新たな敵が現れ、主人公たちがその戦いに巻き込まれるという展開や、和平交渉が決裂し、全面戦争に突入する中で、主人公たちが重要な役割を果たすという展開などが考えられます。

実は第2部(全16話)がすでに書き上げられてますが、特に1つ目、3つ目については確かに第2部の中で描かれてます。
なかなか賢いですね、これ。

では、さらに突っ込んだ質問を。

Q:現実世界での第一次世界大戦を参考に、この物語を広げるとしたならば、どのような展開が考えられますか?

創作と現実世界を掛け合わせた回答を求めてみました。さあ、どう答える!?

 現実世界での第一次世界大戦を参考に、物語をどのように広げられるかについて、ソースからは断定的な情報は得られません。
 しかし、いくつかの手がかりはソースから見つかります。

●新兵器の登場: 現実の第一次世界大戦では、戦車や毒ガスなど、それまでの戦争の常識を覆す新兵器が登場しました。
 ソースでは、電子手順計算機という画期的な計算機が登場します。
 これは、現実世界のコンピュータの原型ともいえる発明であり、戦争のあり方を大きく変える可能性を秘めています。
 今後、この電子手順計算機が兵器に応用され、新たな戦術や戦略が生まれる展開が考えられます。
●情報戦の激化: ソースでは、敵の偵察艦の動きが活発化し、主人公たちが所属するイーサルミ王国空軍も、偵察艦の撃沈に成功しています。
 現実世界の第一次世界大戦でも、航空機による偵察や、無線通信の傍受など、情報収集の重要性が高まりました。
 この物語においても、電子手順計算機を駆使した暗号解読や、敵の行動予測など、情報戦が激化する展開が考えられます。
●多国籍軍の編成: ソースでは、イーサルミ王国はフロマージュ共和国から空中戦艦の技術供与を受けています。
 現実世界の第一次世界大戦でも、複数の国が同盟を組んで戦いました。この物語においても、フロマージュ共和国が軍事介入したり、新たな国が参戦したりする可能性があります。
●戦線の膠着: 現実世界の第一次世界大戦では、塹壕戦と呼ばれる長期にわたる戦線膠着状態が生じました。
 ソースでも、イーサルミ王国とオレンブルク連合皇国の戦争は3年間続いており、キヴィネンマー要塞周辺などでは塹壕戦が行われています。
 今後、物語の中でも、戦線が膠着し、長期戦に突入する展開が考えられます。
●厭戦気分の高まり: 現実世界の第一次世界大戦では、長期化する戦争によって、国民の間で厭戦気分が高まりました。
 ソースでは、主人公の同僚であるマリッタが「さっさと終わらせてほしい」と戦争に対する本音を漏らしています。
 今後、物語の中でも、戦争の長期化によって、兵士や国民の間で厭戦気分が高まり、和平を求める声が大きくなる可能性があります。

 これらの要素を組み合わせることで、現実世界の第一次世界大戦を参考に、物語をより複雑化・多層化することが可能になると思われます。ただし、これらの展開はあくまでも可能性であり、実際に物語がどのように展開するかは、作者の判断によります。

なかなかどうして、現実知識を上手く取り混ぜながら、物語の世界観を継承しつつ今後の展開予測を描いています。
では、もうちょっと細かい質問も投げてみます。

Q:電子手順計算機の発明は、戦争にどのような影響を与える可能性がありますか?

この物語では、かなり初期の電子計算機が登場します。これの与える影響についても聞いてみました。
で、回答ですが、

 提供された情報源では、電子手順計算機の発明が戦争にどのような影響を与える可能性があるかについては明確に述べられていません。
しかし、これらの情報源は、計算尺や計算工学の重要性、そしてそれが戦争においてどのように利用されているかについて詳しく説明しています。
 例えば、計算士は計算尺を用いて敵の進路予測や弾道計算を行い、戦争の勝敗に大きく貢献しています。 また、電子手順計算機は従来の計算尺よりも高速かつ正確に計算を行うことができ、将来的には人間の役割を担う可能性も秘めていることが示唆されています。

こちらも、現実世界と合わせた答えを出してきました。

まあ、ひと言で言って「凄い」ですね。
当然と言えば当然ですが、オープンモデルの7b(70億パラメータ)モデルなんて、歯が立ちません。
やっぱり、大規模も大規模な言語モデルだけあって、強烈です。

ちなみに、まだGPT-4oは触ったことはないですが、あちらもきっと強烈なんでしょうね。
ですが、こちらは無料でここまで使えてしまうという点で、圧倒的です。

いずれは有料サービスに切り替わるはずですが、今はまだ無料。

最新の生成AIに触れてみたいという方は、ぜひこの機会にお試しあれ。


生成AIプロンプトエンジニアリング入門 ChatGPTとMidjourneyで学ぶ基本的な手法

2024年6月23日 (日)

最近買った小物類

ブログに取り上げるまでもないかなと思いつつ、なんかちょくちょく小物類を買ってるので、その中で気に入ったものを紹介。

Img_5246

まずはこれ、L字コネクター付きのUSB-Cケーブル。
長さは2メートルで、しなやか素材のケーブルだと書かれていたので購入。だいたい1,700円くらいでした。

Img_5244

L字と言えば、3月にこれを買ってましたね。CIO製の電力計付き白ケーブル。
これも紐のようにしなやかな素材で気に入ってますが、長さが1メートルと短いのが難点。
それで今回、Meta Quest 3用にこの2メートルのを買ったんですが、しなやかさは白いやつにはかないません。ちょっと硬い感じ。
とはいえ、そこらのケーブルよりはしなやかなのは確か。

Img_5245

長さも長いし、在宅勤務時の会社PCにつなぐのに便利なので、早速使ってます。
やはりL字コネクター、しなやかケーブルは何かと便利です。

で、次の品。

Img_5243

これが小物か、と言われると微妙なサイズですが、こんなものも買ってます。
MONO消し、北海道チーズ蒸しケーキの形をしたクッションです。
いずれも、近所の本屋で購入。

実はうちの近所の本屋が、今月いっぱいで閉店することになりました。そこで、感謝の意味を込めて買ったという次第。
また一つ、本屋が消えます。これで一番近い本屋は、歩いて25分のところにあるららぽーと愛知東郷内のツタヤということになります。

この二つのクッションですが、圧縮された状態で売られており、これを解き放って1週間ほどすると、中がそこそこ膨らんでいい感じのクッションになります。

Img_5242

・・・んですが、よーく見ればシワやムラは残ります。これでも一度、アイロンをかけたんですが、これが限界でした。
なかなか、箱絵の写真のようにはいかないようで。

Yogiboや最近買った椅子で寝転がる、座る際に枕として使ってます。どちらかと言うと、北海道チーズ蒸しケーキの方が使い勝手がよろしい。MONOの方はちょっと薄っぺらいです。

インテリアとしてもいい感じなので、意外とお勧め。

そういえば、そろそろボーナスの時期ですね。
今のところ、何かを買う予定はありませんが、きっとまた何かを衝動買いすることでしょう。


北海道チーズ蒸しケーキFAN BOOK【ほんものみたいなふわふわぬいぐるみつき】

2024年6月21日 (金)

大量の画像ファイルからOpenCV使って特定の顔が映ってる写真だけを抜き出すやつを作った

タイトルの通りです。必要性に迫られて、ある顔が映っている画像ファイルを選別して抜き出すやつを作ってみました。
長男の卒業式写真をもらったんですが・・・約740枚もあって、とんでもない量が送られてきました。容量も全部で11.2GB。
いやあ、いくらなんでも740枚は多過ぎだろう。欲しいのは、自分の子供が映っているやつだけなんだけど。
ちょっと、学校側は張り切り過ぎです。

てことで、

1.テンプレート画像となる顔画像を用意
2.740枚の画像が入ったフォルダ「data」の1枚1枚を読み込み、顔検出する
3.その検出した画像とテンプレート画像の顔をと比較し、類似度を計算
4.類似度がある一定以上の顔画像を含む画像ファイルを「result」というフォルダにコピーする

というプログラムを作りました。

いわゆるディープラーニングの画像認識を使わず、OpenCVのみとしました。なんせ、740枚も処理するので、畳み込みニューラルネットワーク(CNN)では時間がかかり過ぎです。このため、簡易な方法を選びました。

具体的には、顔検出にはhaar-like特徴分類器を、類似度計算に使う画像特徴量にはSIFT特徴を、2つの画像の特徴量のマッチングにはBFMatcher、つまり総当たりのアルゴリズムを使ってます。

で、作ったのが以下のプログラムです。
(「face_pickup.py」という名前にしました)


import cv2
import numpy as np
import os
import shutil
# 顔を検出する関数
def detect_faces(image):
    # Haar-like特徴分類器を使用して顔を検出
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=10, minSize=(200, 200))
    return faces
# SIFT特徴抽出器を作成する関数
def create_sift():
    sift = cv2.SIFT_create()
    return sift
# 画像の特徴量を計算する関数
def compute_features(image, sift):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    keypoints, descriptors = sift.detectAndCompute(gray, None)
    return keypoints, descriptors
# マッチングを行い、類似度を計算する関数
def match_features(des1, des2):
    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1, des2, k=2)
    good_matches = []
    try:
        for m, n in matches:
            if m.distance < 0.75 * n.distance:
                good_matches.append(m)
    except ValueError:
        pass
    similarity = len(good_matches) / max(len(des1), len(des2))
    return similarity
# メインの処理
def main():
    # 顔検出用の画像を読み込む
    face_image = cv2.imread('face.jpg')

   
# dataフォルダ内の画像を読み込む
    images_folder = 'data'
    images = [f for f in os.listdir(images_folder) if os.path.isfile(os.path.join(images_folder, f))]

    # SIFT特徴抽出器を作成する
    sift = create_sift()
    # 類似度のしきい値
    similarity_threshold = 0.065

    # 類似度の高い顔が含まれている画像をresultフォルダにコピーする
    for image_file in images:
        image_path = os.path.join(images_folder, image_file)
        image = cv2.imread(image_path)
        # 顔を検出する
        faces = detect_faces(image)

        if len(faces) > 0:
            # 顔の特徴量を計算する
            face_keypoints, face_descriptors = compute_features(face_image, sift)
            max_sim = 0.0
            similarity = 0.0
            for (x, y, w, h) in faces:
                detectface_image = image[y:y+h,x:x+w]
                image_keypoints, image_descriptors = compute_features(detectface_image, sift)
                # 類似度を計算する
                if image_descriptors is not None:
                    similarity = match_features(face_descriptors, image_descriptors)
                if similarity>max_sim:
                    max_sim = similarity
            print(image_file, ',', len(faces), ',', max_sim)
            # 類似度がしきい値以上の場合、resultフォルダにコピーする
            if max_sim > similarity_threshold:
                result_folder = 'result'
                if not os.path.exists(result_folder):
                    os.makedirs(result_folder)
                shutil.copy(image_path, os.path.join(result_folder, image_file))
    print("類似度の高い顔が含まれている画像のコピーが完了しました。")
if __name__ == '__main__':
    main()

実は、Bing Chatで作らせたんですが、エラーだらけでして、これを修正してまともに動かせるように変えてます。
ChatGPTもかなり進化してますが、なかなかそのまま使えるコードをいきなりは作ってくれませんね。

これと、顔画像を検索させたい画像ファイルを「data」というフォルダにぶち込んでおきます。
使うライブラリは、OpenCV、numpy辺りがあれば使えます。
さらに、face.jpgという名前で、検索したい顔画像を用意しておきます。

Face

ぼかしのおかげでちょっとヤバい感じの写真ですが、これがテンプレート画像です(もちろん、実際にはぼかし無しです)。

20240620-194645

フォルダ構成は以上のようになります。
プログラム本体「face_pickup.py」以外には、検索させたい画像をおさめた「data」フォルダ、抜き出した画像をおさめた「result」フォルダ、テンプレート画像「face.jpg」を用意します。
(「result」フォルダはなくても自動で作られます)

これで、準備完了。

実行は、コマンドプロンプトなどでこのプログラムの入ったフォルダに移動して、

python face_pickup.py

です。

20240620-200511

こんな感じに実行されます。ファイル名、検出された顔画像の数、そしてその中で一番高い類似度の値、の順に表示されます。

なお類似度の閾値は、プログラム中ほどにある「similarity_threshold = 0.065」の0.065の値を調整します。
これを決めるために、最初は2、30枚くらいの画像でトライした方がいいでしょう。

で、閾値を決めたら、740枚を一気に走らせます。

20240620-193504

で、出てきた結果がこれ。数分ほどで処理は完了。結果、だいたい200枚くらいが拾われました。
ですが、結構余計な画像が多いですね。顔ですらない画像も中には含まれてました。
それらを削ると、残ったのは結局100枚くらい。

さほど精度がいいとは言い難いですが、740枚から1枚1枚探ることを考えると、これでもかなりマシです。
おそらくですが、何枚かは欠落しているかと思いますが、これだけ取れれば十分かと。

最初、妻が全部見て選ぶ言ってたんですが、途中で音を上げました。
そんな妻に、Pythonの威力とやらを見せつけてやりましたよ。ほんと、OpenCVの画像処理サマサマです。

高精度なCNNを使わずとも、OpenCVだけでもここまでのことはできるんです。ご参考まで。


Pythonと深層学習による革新的な画像認識と処理の裏技~CNNとOpenCVで実現する顔認識、物体検出、画像分類のテクニック~

2024年6月20日 (木)

動画生成AIサービス「Luma AI」を試してみた

動画生成AIのLuma AIがすごい(面白い)らしいので、試してみました。

Luma Dream Machine

上のサイトにて、右上の「Try Now」をクリック。
Googleアカウントを使って入ることができます。

20240615-100934

ログインすると、こんな画面が出てきます。
画像かプロンプトを入れるといいみたいです。
ここでは、画像を入れることにします。以前にとてかんCGというツールで作った3D画像があるので、それを使うことにしました。

Image1_20240615101801

プロンプトバーの左端にある画像アイコンをクリックすると、アップロードしたい画像を選択できます。
ここで画像ファイルを選んで、「開く」をクリック。

その後、右端の上矢印みたいなのをクリックすると、動画生成が始まります。

Image2_20240615102101

数分待ったら、こんなのが出てきました。これをクリックすると、動画が再生されます。
その再生動画の上で右クリックをして、動画をダウンロードします。

で、できた動画ですが、

20240615-101240

これは一枚目、ここから、

20240615-101252

回頭を始めます。右上に、なにやら木星っぽい何かが見えます。

20240615-101305

なんか思った以上に広い船体が現れます。

20240615-101323

そして、エンド。

多分、スター〇ォーズの影響があるのか、幅広の船体になったのは少し残念ですが、それでもなかなかのクオリティです。
もはや、生成AIはここまで来たんですね。

なお、右上の「Account」をクリックすると、サブスク料金が表示されます。

Image3_20240615102701

無料なら月に30枚、非商用利用のみ。
月額29.99ドル(約4720円)払えば、月に30+120枚までの利用、かつ商用利用可となる模様。
そういえば、無料版では画像とプロンプトを同時に受け付けなかったので、これも有償版なら可能になりそう。

無料でも、1日に1つなら作成できるというところがなかなか太っ腹です。

時代を体感してみたい方は、まず試してみてはいかがでしょうか?


【マンガで学ぶ】スマホでらくらく!AI画像と動画のつくりかた: お絵描きAIなら初心者でも自由自在!【レオナルドAI/Pika/ChatGPT/使い方(完全マニュアル/教科書/決定版)/AI画像生成/AI動画生成/プロンプト】 AIマンガスクール

2024年6月16日 (日)

YOLOXで独自データを使ってモデルを作ってみた

ずっと昔にYolov3の独自データ学習をして以来、長らく物体検出手法の学習を試してませんでした。
が、業務上、新しい物体検出を使って独自データでの学習をする羽目になったため、久しぶりにやってみることにしました。

ここで使う手法はYOLOX、またアノテーションツールには「VoTT」を使います。

なお、YOLOXの独自データの学習にはGPUが必須、CUDAのインストール、PytorchもGPU版が必要です。

(0) YOLOXのダウンロード、前準備、動作確認

まずは、これを入手しておきましょう。
今回使うのは、以下のサイトから入手するYOLOXです。

GitHub - Megvii-BaseDetection/YOLOX: YOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/

Windowsなら、「<>Code」をクリックして「Download ZIP」を選択すると、ZIPファイルがダウンロードされます。
これを解凍し、適当なフォルダに入れておきましょう。
(我が家では「C:\linux」というフォルダの直下に「YOLOX-main」として入れました)

まずはこれを使えるようにします。

Windows PowerShellを開き、「cd c:\linux\YOLO-main」と入力して上のフォルダに入ります。

我が家では「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」の記事にある通り、CUDA 12.1を入れてあるので、

pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu121

と、PytorchのCUDA 12.1版を入れておきました。

それ以外にも、

numpy
opencv_python
loguru
tqdm
torchvision
thop
ninja
natsort

tabulate
psutil
tensorboard

辺りのライブラリも入れてください。
他にも「pycocotools」をインストールしなきゃならないんですが、これを入れるには「VS Build tools 2022」が必要です。

Microsoft C++ Build Tools - Visual Studio

(インストール方法は、「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」の前準備を参照)

ついでに、環境変数に以下の設定を入れてください。

下の「検索」で「環境変数」とやると、環境変数の設定窓が開けるので、そこにあるPath

C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\IDE

を加えます。

また、「LIB」という変数を作成し「C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.39.33519\lib\x64; C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x86; C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86」を記入。

INCLUDE」という変数には「C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.39.33519\include; C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt

と入れておきます。

(時期や環境によっては、2022や14.39.33519の数値が違うことがあります。Program Filesの中を確認し、それぞれの環境に合わせたフォルダ名を記入してください)

これをやらないと、先の学習時にエラーが出ます。

あと、YOLOX-mainの中に「setup.py」があるんですが、これは実行しないでください。
何かと不具合が起きやすいので、これを利用しない方法で書きます。

今後のために、以下のファイルを「YOLOX-main」の直下にコピーしておきます。

tools\train.py
tools\demo.py

また、学習モデル「yolox_nano.pth」を以下からダウンロードし、YOLOX-mainの直下に入れておきます。

https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_nano.pth

適当な動画ファイルをつかって、動作確認をします。

python demo.py webcam -n yolox-nano -c .\yolox_nano.pth

なお、この後必要となるので、このフォルダ内に「data」というフォルダを、「datasets」フォルダの下に「COCO」というフォルダを作っておきます。
ちなみに「data」フォルダには、学習させたい画像ファイルを入れておきます。

(1) VoTTで学習データ作成(アノテーション)

まずは、以下からVoTTを入手します。

Releases · microsoft/VoTT

「Assets」の下の「vott-2.2.0-win32.exe」をクリックすると、ダウンロードされます。
ダウンロードが終わったら、これをダブルクリックしてインストールします。

デスクトップにあるvottのアイコンをダブルクリックすると、以下のような画面が出てきます。

20240615-103844

ここでは、新規プロジェクトをクリック。

20240615-104913

すると、こんな感じの画面が出てくるはずです。
表示名は、適当でいいです(ここではtestとしました)。

その下のソース接続、ターゲット接続ですが、ここはそれぞれ先ほど作った「data」と「datasets-COCO」を選びます。

20240611-203735

それぞれの接続の横にある「Add Connection」をクリックすると、上のような表示が出ます。
表示名は適当に入れて、プロバイダーは「ローカルファイルシステム」とすると、その下に「フォルダを選択」というのが出てくるので、フォルダを選択して「接続を保存」をクリックします。

あと、下にある「タブ」には、今回作りたいラベル名を入れておきます。

なお、今回は子供の運動会の画像から「人」と「帽子」を検出するものを作ることにしました。なので、ここは「human」「hat」と入れておきます。

20240615-104830

そこまでできたら、プロジェクトを保存、とします。

20240611-203848

すると、dataフォルダ内にある画像を読み込み、こんな感じの画面が出てきます。
ここで、アノテーションという作業を行います。
具体的には、検出したいものを選択し、ラベル付けするという作業です。これが結構大変。

20240611-203904

まずは、人を囲みます。

20240611-203918

囲んだ後に、右上の出てくるリストから「human」を選択すると、この枠にhumanというラベルが付けられます。
なおこの場合、1つ目が「human」、2つ目が「hat」となっているので、枠を選んだ後に数字の1キーを押すと「human」、2を押すと「hat」とラベル付けされます。
この数字キーでのラベル付けはすごく便利です。

20240611-204514

そんな調子で、じゃんじゃんラベル付けをしていきます。
だいたい1枚の画像から20個程度の人、帽子のラベルを作成、これを25枚ほどやりました。

たった26枚でも、地獄の作業でした。

この作業を終えて保存する前に、画面左の真ん中編にある斜め上矢印のアイコン「エクスポート」をクリックします。

20240611-210004

以下のような画像が出てくるので、プロバイダーを「Pascal VOC」、アセットの状態を「訪問済みアセットのみ」として「エクスポート設定を保存」をクリックします。

その後に、今度は画面上にある、斜め上矢印をクリックします。
すると、アノテーションデータが保存されたというメッセージが出てきます。
これで、学習データの作成は完了です。

※ VoTTは画像だけでなく、動画データからもアノテーションすることが可能です。
 が、Windowsの場合は次の変換以降が上手くいかないので、必ず動画を複数枚の静止画にしてからアノテーションするようにしてください。

(2) Pascal VOC⇒COCOへの変換

YOLOXは学習モデルをCOCOの形式に変換してやる必要があります。
このため、Pascal VOC⇒COCOへ変換するコマンドを使います。

以下のサイトで、「<>Code」から「Download ZIP」を選択。

GitHub - tatsuya-fukuoka/convert_pascalvoc2coco: VOTTで出力したPascal VOC形式のXMLファイルをCOCO形式のJSONファイルへ変換するスクリプト

ダウンロードされたZIPファイルを解凍し、出てきた「convert_pascalvoc2coco-main」というフォルダを「YOLOX-main」の直下に入れます。

「datasets\COCO」の中にあるフォルダ(「test-PascalVOC-export」という名前)を「convert_pascalvoc2coco-main」の中に移動してやります。

そこで、Windows PowerShell上で上のフォルダに移動後、

python convert_vott_voc2coco.py test-PascalVOC-export

と実行。すると[YYYYMMDD_HHMMSS]_COCO_Formatという名前のフォルダができます。
その中にあるフォルダ、ファイル類をごっそり「datasets\COCO」の中に入れます。

(3) 学習実行

いよいよ、学習実行です。
が、ちょっと前準備が必要。

「exp\example\custom」というフォルダにある「nano.py」というファイルを開きます。
その中にある「self.data_dir = "datasets/coco128"」を「self.data_dir = "datasets/COCO"」に書き換えます。

また、self.var_annの下あたりに「self.max_epoch = 300」「self.num_classes = 2

を追記しておきます。(num_classesは自身で作ったラベル数に変えてください)


        self.data_dir = "datasets/COCO"
        self.train_ann = "instances_train2017.json"
        self.val_ann = "instances_val2017.json"

        self.max_epoch = 300
        self.num_classes = 2

こんな感じになっていればOK。

また、ラベル名については、「yolox\data\datasets」にある「coco_classes.py」の中の「COCO_CLASSES = (」以下を書き換えます。今回の場合は、下のようになります。


COCO_CLASSES = (
"human",
"hat",
)

ここは変えなくても動きますが、おかしなラベル名になるので変えておいた方が無難です。

ここでようやく、学習を実行します。

python train.py -f exps/example/custom/nano.py -d 1 -b 16 --fp16 -o --cache

すると、こんな画面が出てきます。

20240615-093303

うちの環境(GTX1650Ti)だと、だいたい30分くらいで300エポックが実行されました。

終わると、「YOLOX_outputs\nano」に~.pthという学習モデルが大量に入っているはずなので、そのなかの「best_ckpt.pth」をYOLOX-mainの直下に移動しておきます。

そこで、適当な動画ファイル(ここでは0002.mp4)を使って推論してみます。

python demo.py video -f exps/example/custom/nano.py -c best_ckpt.pth --path 00002.mp4 --conf 0.3 --tsize 640 --save_result --device gpu

すると「YOLOX_outputs\nano\vis_res」の下にフォルダが作成されて、その中にアウトプットされた動画ファイルが入ってます。

20240615-094221

こんな感じで、ちゃんと?推論されてました。
というか、ちょっとhumanが過検出されてる感はありますが。
(ついでに言うと、humanとhatのラベルがなぜか逆でしたが)

まあ、とりあえず動くことは動きました。
あとはたくさんアノテーションをしてやればよさそうです。

なお、tensorboardを使って学習の状況を確認できます。

tensorboard --logdir .\YOLOX_outputs\nano\tensorboard

とコマンド入力し、下に出てきた「http://localhost:6006」をCTRLキーを押しながらクリックすると、ブラウザが開いてグラフが表示されます。

20240615-094411

これを見ると、100エポックくらいまでは全然学習されてなくて、300の手前で頭打ちになってます。
学習データのアノテーションが、いい加減 or 少なすぎたんですかね?

いずれにせよ、これで独自データによる学習ができました。

実用上はonnx形式に変換してやりたいところ。そうすれば、Raspberry Pi辺りで動かせるんですけどね。まだそちらは上手くいってません。


物体検出とGAN、オートエンコーダー、画像処理入門 PyTorch/TensorFlow2による発展的・実装ディープラーニング

2024年6月15日 (土)

わりといい感じの椅子を買った

最近、普段使いの椅子が硬すぎて腰が痛くなってたので、思い切って良い椅子を買うことにしました。

Img_5236

これがその椅子。めちゃくちゃフカフカです。
近所のニトリで購入、お値段は6万円弱。
ひじ掛け部分がたためるので、机に収納する際も楽々。

Img_5237

このオットマンの使い勝手もなかなかよろしくて、スッと引き出せます。
前の椅子にもついてたんですが、硬すぎて全然引き出せなかったんですよね。
値段をかけたなりの差はあります。
なおこの椅子、店頭で座り比べて一番いいものを選びました。こういうものは、実際に触れて探すのが一番です。

ですがこの椅子、組み立てるまでが大変でした。

Img_5234

当初はこんな状態。脚部を組み、ネジを4本締めるだけなんですが、まあこれがほんとに大変でした。
しかもこれが入っていた段ボールやらクッションやらが大量に使われていて、これをばらして袋にまとめるまでが大変。
箱ごと2階にもっていくのは不可能だったため、中身をばらして上にあげていったんですが、この左のクッション部がめちゃくちゃ重い。
しかも組立時には、この上部の重いクッション部分を脚部に正確にはめろとか、結構無理難題な組立て手順でした。

まあ、何とかしましたが。もう一度やれって言われたら、全力でお断りです。

苦労しただけのことはあって、座り心地は快適です。
来週は在宅勤務が多いので、これのお世話になりそうです。

ともかく、椅子と寝床はいいものを使え、とはよく言われることですが、確かにその通りですね。
となると、今度は布団かなぁ。


Casa BRUTUS(カーサ ブルータス) 2017年 9月号 [椅子選び] [雑誌]

2024年6月 8日 (土)

iPhone 15 Plusを使って4週間目のレビュー

iPhone 15 Plusを購入して、ちょうど4週間が経ちました。

Pxl_20240607_210823295

購入翌日にちょっとレビューしただけで、その後を全く書いてませんでしたね。

iPhone 15 Plusを1日ほど使った感触: EeePCの軌跡

てことで、レビュー書きます。

はい、4週間使って、つくづく実感したんですが。

バッテリーの持ちがめちゃくちゃいい!

もう、この1点に尽きます。
通常でも2日、へたすると3日に一度しか充電しないこともあります。

iPhone 12でも、バッテリーの持ちはそれほど悪くはなかったです。普段、会社に行って帰ってくるまでに、だいたい50%前後になるというのが12を使ってた頃の実感。

ですがこの15 Plus、なんと夕方時点で80%台です。
で、そのまま充電せず、翌日の夕方まで使ってようやく50%

最近、毎日これです。

なにこのバッテリーお化け。めちゃくちゃすごいやん、てなります。

確かに、自宅内ではPixel 6aなどの併用機があるので、使用頻度を下げているという事情もあるんですが。
とはいえ、最近はiPhone 15 Plusを結構使ってました。
理由は、こちら。

計算士と空中戦艦

この4週間の間は、自作小説の「計算士と空中戦艦」の第2部を書いてたんですが、その追い込みではiPhone 15 Plusを使っておりました。

私が自作小説を書く際のツールは、「OneNote」を使います。
普通はWord辺りを使うんでしょうが、どうも個人的には、話ごとにタブで分けて管理するのが性に合ってて、Wordではちょっとその辺りが不便なんですよね。Excelみたいにシートで区切れればいいんですが、そういうのがない。
てことで、OneNoteばかりを使ってます。

このOneNoteなんですが、Android版OneNoteはクソ過ぎて、iPhoneでしか使わなくなりました。
どういうことかというと、同期が上手くいかないんです。いつも失敗する。
その結果「競合があります」メッセージが出まくって、しかも競合が発生すると、それを解消できるのはPCかMacBookでしかできないため、イライラします。
iPhoneでは、ほとんど起きないんです、この競合問題。これはiPhone 12からもそんな感じ。iPad miniでも同様です。
バックグラウンド処理が苦手、というわけではないんですけどね、Pixel 6a。なのに、いつもしくじる。これはXperia AceIIIも同様。

ということで、Android機ではOneNoteを使わなくなりました。

そうなると必然的に、iPhoneの使用率が上がります。

で、ようやくiPhone 15 Plusの話題に戻るんですが、自宅で寝転がって打ったり、あるいは会社の昼休みにOneNoteを使う際は、iPhone 15 Plusを使ってました。
ちょうど先々週の土日辺りあたりから追い込んでたので、ここ2週間はわりとiPhone 15 PlusでOneNoteを使ってました。
決して、使用頻度が低過ぎたからバッテリーの持ちがよかった、とは言えないんですけどね。それでも2日間充電でいけましたから。

動画もよく見てましたね。YouTubeやアマプラ。画面が大きいので。まあそちらはPixel 6aと併用でしたが。

元々、ゲームはほとんどやらないので、処理が重いのは動画とOneNoteのような通信を多用するアプリくらい。なので、こんなバッテリー消費量で落ち着いていると言えるかもですが。

あとこれまで、電波強度の低いところでは、iPhoneのバッテリー量が一気に減ることがありました。そういう場所ではiPhone 12だと、全然使ってないのにいきなり2時間で30%くらい減る、なんてこともありました。
が、このiPhone 15 Plus、全然減りません。出張でたまたまアンテナが1、2本しか立たないところに半日ほどいたんですが、夕方までには70%台と、いつもよりはちょっと減ってるなぁ、くらいでした。

くどくどと書きましたが、とにかくバッテリーがほんと、よく持ちます。

ちなみに、急速充電は使わず、ゆるゆる充電してます。
また、充電も100%ではなく、95%ほどで止めることが多いです。
この状態を、できるだけ維持したいので。

画面が大きいというのは、まあ可もなく不可もなくと言ったところ。動画を見たり、あるいは人に写真を見せる時はめちゃくちゃ便利ですけどね、あのサイズ。
昔からiPhone 6 Plus、7 Plusを使ってきたので、画面が大きすぎて使い辛いということはないですね。指が長い方なので、それはあまり気にしてません。かといって、ソフトキーボードが使いやすいかと言われると、まあちょっと打ち間違いが減ったかな、くらいの実感。

重さですが、寝転がって使うときはちょっと重いかな、と感じることはありますが、それもまあ、許容範囲。

そうそう、Lightningケーブルではなく、USB-Cになったというのはメリット感じますね。おかげで充電ケーブルをかなり減らせました。

前回の記事で書いていた「音がいい」というのは、慣れちゃった結果、なんとも感じなくなりました。とはいえ、Pixel 6aと比べたら、やっぱり音はいいかなと感じることがあるくらい。顔認証も、なんか早くなったっぽいけど、それも慣れたらなんとも感じません。慣れというものは怖い。

カメラの質や、プロセッサの性能向上などは、まったく実感がないですね。ただ、本体が熱くなるということはほとんどなくなったので、重い処理でも余裕でこなせている、ということでしょうかね。こういうのも、バッテリー持続時間の向上に貢献しているのかもしれません。

ということで、結論。iPhone 15 Plusを4週間使って感じた印象は、

バッテリーの持ちがめちゃくちゃいい!

大事なことなので、2度言いました。
これなら、泊り出張でも充電不要でいけるかもしれませんね。


Apple iPhone 15 (256 GB) - ピンク

« 2024年5月 | トップページ | 2024年7月 »

無料ブログはココログ

スポンサード リンク

ブログ村