メインコンテンツへスキップ

FLUX.1 [dev]をComfyUIで試してみる

Stable Diffusionの共同開発者たちによって設立されたベンチャー企業Black Forest Labsが発表した画像生成AIモデルであるFLUX.1をComfyUIから使えるようにローカル環境へインストールする。

インストール
#

FLUX.1 \[dev\]のインストール
#

基本的にComfyUIでFlux AIを使う方法:詳細ガイドを参考にしてインストールしたが、現時点(2024/8/1 2)でいくつかの相違点があった。

それ以外は問題なくインストールできた。

FLUX.1 \[schnel\]のインストール
#

最軽量のモデルFLUX.1

\[schnel\]

もインストールする。 black-forest-labs/FLUX.1-schnell at mainからflux1-schnell.safetensorsをダウンロードしComfyUI/models/unetへ置く。

(オプション)FP8 CLIP用のチェックポイント
#

画像の作例
#

ComfyUI
#

ComfyUIへFlux Examples | ComfyUI_examplesにある画像をDrag&Dropすると、こんな感じのワークフローが表示される。

Image from Gyazo
ここにプロンプトを入力し画像を生成する。環境としてはAMD Ryzen 9 5950X/32GB/RTX3070Tiというやや古めのスペックである。

Flux Dev
#

image
Prompt executed in 226.57 seconds

image
Prompt executed in 196.96 seconds

image
image
image
image

Flux Schnell
#

image
Prompt executed in 50.83 seconds

image
Prompt executed in 66.51 seconds

関連記事

中央競馬のデータ取得

スクレイピングしない場合 # [競馬AI] スクレイピングしない競馬データの取得とデータ構造について - Qiita JRA-VAN データラボ 1986年から約30年分のあらゆる公式競馬データをデータベース化 前走・近走結果の情報、リアルタイムオッズや発走1時間前の馬体重などの最新情報も即座に反映 月額 2,090円(2023年1月現在) データ取得はJRA VAN SDK(C#/C++/Delphi7 /VB2019)を介して行う必要がありWindows前提 JRA-VAN Data Lab. JVData 仕様書 JRDB データはテキストで取得可能 JRDBデータのご案内 ベーシック 月額 1,980円(2023年1月現在) アドバンス 月額 2,480円(2023年1月現在) Mac上で使用したいことと、テキスト形式でのデータ提供の方が取り回しが簡単なため、自分の用途としてはJRDBの方がマッチしているか。 スクレイピングする場合 # 機械学習で競馬予想をしてみた系のまとめ - Qiita netkeiba.comをスクレイピングしている事例が多い。 競馬の予測をガチでやってみた - stockedge.jpの技術メモ netkeiba-scraperが2019年6月現在動くかの話(Ubuntu 18.04.2 LTS) - Qiita

宝くじ・公営ギャンブルの控除率

https://www.soumu.go.jp/main_content/000084191.pdf 実行還元率 控除率 宝くじ 45.7 54.3 サッカーくじ 49.6 50.4 競馬 74.1 25.9 オートレース 74.8 25.2 競艇 74.8 25.2 競輪 75.0 25.0

機械学習のアルゴリズム選択フローチャート

Choosing the right estimator — scikit-learn 1.2.0 documentationを元にMermaidでまとめた。 flowchart TD A((Start))--> B{50サンプル以上?} B -->|Yes| B1{カテゴリの\n予測?} B -->|No| B2((データを収集)) B1 -->|Yes| C1{正解ラベルあり?} C1 -->|Yes| Z3((分類)):::terminal C1 -->|No| Z4((クラスタリング)):::terminal B1 -->|No| C2{数量の予測?} C2 -->|Yes| Z1((回帰)):::terminal C2 -->|No| H((次元削除)):::terminal classDef terminal fill:#69F 分類 # flowchart TD Z3((分類)):::terminal --> I1{10万サンプル以下?} I1 -->|Yes| I11[線形SVC] I1 -->|No| I21[SDG Classifier]:::method I21 -->|うまくいかない| I22[kernel approximation\nGBDT]:::method I11 -->|うまくいかない| I12{テキストデータ?} I12 -->|Yes| I122[ネイティブベイズ]:::method I12 -->|No| I13[K近傍法]:::method I13 -->|うまくいかない| I131[SVC\nランダムフォレスト]:::method classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px クラスタリング # flowchart TD Z4((クラスタリング)):::terminal --> J1{カテゴリ数は既知?} J1 -->|Yes| J11{<10万サンプル以下?} J11 -->|Yes| J12[KMeans]:::method J12 -->|うまくいかない| J13[スペクトラルクラスタリング\nGMM]:::method J11 -->|No| J21[MiniBatch\nKMeans]:::method J1 -->|No| J3{<10K samples} J3 -->|Yes| J31[MeanShift\nVGBMM]:::method J3 -->|No| J34((不運)) classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px 回帰 # flowchart TD Z1((回帰)):::terminal --> D1{10万サンプル以下?} D1 -->|No| E1[SGD回帰分析]:::method D1 -->|Yes| E2{説明変数xの一部が重要?} E2 -->|Yes| F1[Lasso\nElasticNet]:::method E2 -->|No| F2[Ridge\n線形SVR]:::method F2 -->|うまくいかない| F3[SVR Kernel='rbf'\nEnsembleRegressors]:::method classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px 次元削除 # flowchart TD Z((次元削除)):::terminal --> H[Randomized PCA]:::method H -->|うまくいかない| H11{10万サンプル以下?} H11 -->|Yes| H22[Isomap\nSpectral Embedding]:::method H11 -->|No| H3[kernel\napproximation]:::method H22 -->|うまくいかない| H4[LLE]:::method classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px

radikoを録音してPoscastプレイヤーで再生する

miyagawaさんの以下のプログラムを組み合わせて使うことで、radikoで録音した番組をPodcastプレイヤーで再生することができる。 miyagawa/ripdiko: Rip radiko programs miyagawa/dircaster: Generate RSS 2.0 podcast out of directory with *.mp3s おおまかな流れは以下の感じ。 cronで起動されたripdikoがradikoを録音し、指定フォルダにMP3ファイルで保存する cronで起動したdircasterが指定フォルダにあるMP3ファイルを解析し、Podcast配信用のXMLを出力する Podcastプレイヤーで2で生成されるXMLを購読しておけば、番組が更新されるたびに通知され聞くことができる ただし、1のMP3ファイル、2のXMLはインターネットから参照できる場所に出力する必要がある(HTTPサーバが必要) Radikoプレミアムへの対応 # ただ、残念なことにripdikoはradikoプレミアムへは対応しておらず、エリアフリーで他県の番組を録音することができない。 このため、uru2/rec_radiko_ts: Radiko timefree program recorderを参考にして、radikoプレミアムへログインしエリアフリーで番組を録音できるようにした。 環境変数RIPDIKO_MAILでメールアドレス、RIPDIKO_PASSにパスワードを設定しておくことで、他県の番組も録音することができる。 diff --git a/bin/ripdiko b/bin/ripdiko index ebc756a..2ca3b70 100755 --- a/bin/ripdiko +++ b/bin/ripdiko @@ -8,6 +8,7 @@ require 'open-uri' require 'nokogiri' require 'date' require 'fileutils' +require 'json' module Notifier SCRIPTS = ENV['RIPDIKO_SCRIPTS'] || "#{ENV['HOME']}/.ripdiko/scripts" @@ -61,6 +62,43 @@ class DownloadTask @output = ENV['RIPDIKO_OUTPUT'] == nil ? "file" : ENV['RIPDIKO_OUTPUT'] end + def login + uri = URI.parse("https://radiko.jp/v4/api/member/login") + data = { + "mail" => ENV['RIPDIKO_MAIL'], + "pass" => ENV['RIPDIKO_PASS'] + } + + return "" if data["mail"].nil? || data["pass"].nil? + encoded_data = URI.encode_www_form(data) + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = (uri.scheme == "https") + + request = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/x-www-form-urlencoded'}) + request.body = encoded_data + response = http.request(request) + + return JSON.parse(response.body)["radiko_session"] || "" + end + + def logout + uri = URI.parse("https://radiko.jp/v4/api/member/logout") + data = { + "radiko_session" => @radiko_session + } + encoded_data = URI.encode_www_form(data) + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = (uri.scheme == "https") + + request = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/x-www-form-urlencoded'}) + request.body = encoded_data + response = http.request(request) + + @radiko_session = "" + end + + + def authenticate res = fetch 'https://radiko.jp/apps/js/playerCommon.js?_=20171113', {} if /new RadikoJSPlayer\(.*?'pc_html5',\s*'(\w+)'/ === res.body @@ -79,11 +117,16 @@ class DownloadTask abort "auth1 failed" end + @radiko_session = login + value = URI.encode_www_form_component(@radiko_session) + + auth2_url_param = @radiko_session.size > 0 ? "?radiko_session=#{value}" : "" + length = res['X-Radiko-KeyLength'].to_i offset = res['X-Radiko-KeyOffset'].to_i partial_key = Base64.strict_encode64(auth_key.byteslice(offset, length)) - res = fetch "https://radiko.jp/v2/api/auth2", + res = fetch "https://radiko.jp/v2/api/auth2#{auth2_url_param}", 'X-Radiko-User' => "dummy_user", 'X-Radiko-Device' => "pc", 'X-Radiko-Authtoken' => token, @@ -106,6 +149,40 @@ class DownloadTask def now_playing(station, area) now = Time.now + + station_list = { + "802" => "JP25", "ABC" => "JP25", "ABCR-KOSHIEN" => "JP1", "ABS" => "JP5", + "AFB" => "JP2", "AFM" => "JP5", "AIR-G" => "JP1", "ALPHA-STATION" => "JP25", + "BAYFM78" => "JP8", "BSN" => "JP15", "BSS" => "JP31", "CBC" => "JP21", + "CCL" => "JP25", "CRK" => "JP25", "CROSSFM" => "JP40", "CRT" => "JP9", + "DATEFM" => "JP4", "E-RADIO" => "JP25", "FBC" => "JP18", "FM-FUJI" => "JP19", + "FM-OKAYAMA" => "JP33", "FM-SANIN" => "JP31", "FM807" => "JP36", + "FMAICHI" => "JP21", "FMF" => "JP7", "FMFUKUI" => "JP18", "FMFUKUOKA" => "JP40", + "FMGIFU" => "JP21", "FMGUNMA" => "JP10", "FMI" => "JP3", "FMJ" => "JP8", + "FMK" => "JP43", "FMKAGAWA" => "JP37", "FMMIE" => "JP24", "FMN" => "JP20", + "FMNAGASAKI" => "JP42", "FMNIIGATA" => "JP15", "FMO" => "JP25", "FMS" => "JP41", + "FMT" => "JP8", "FMTOYAMA" => "JP16", "FMY" => "JP35", "FM_OITA" => "JP44", + "FM_OKINAWA" => "JP47", "GBS" => "JP21", "HBC" => "JP1", "HELLOFIVE" => "JP17", + "HFM" => "JP34", "HI-SIX" => "JP39", "IBC" => "JP3", "IBS" => "JP8", + "INT" => "JP8", "JOAK" => "JP8", "JOAK-FM" => "JP1", "JOBK" => "JP25", + "JOCK" => "JP16", "JOEU-FM" => "JP38", "JOFK" => "JP31", "JOHK" => "JP2", + "JOIK" => "JP1", "JOLK" => "JP40", "JORF" => "JP8", "JOYFM" => "JP45", + "JOZK" => "JP36", "JRT" => "JP36", "K-MIX" => "JP22", "KBC" => "JP40", + "KBS" => "JP25", "KISSFMKOBE" => "JP25", "KNB" => "JP16", "KRY" => "JP35", + "LFR" => "JP8", "LOVEFM" => "JP40", "MBC" => "JP46", "MBS" => "JP25", + "MRO" => "JP17", "MRT" => "JP45", "MYUFM" => "JP46", "NACK5" => "JP8", + "NBC" => "JP41", "NORTHWAVE" => "JP1", "OBC" => "JP25", "OBS" => "JP44", + "QRR" => "JP8", "RAB" => "JP2", "RADIOBERRY" => "JP9", "RBC" => "JP47", + "RCC" => "JP34", "RFC" => "JP7", "RFM" => "JP6", "RKB" => "JP40", + "RKC" => "JP39", "RKK" => "JP43", "RN1" => "JP1", "RN2" => "JP1", + "RNB" => "JP38", "RNC" => "JP37", "ROK" => "JP47", "RSK" => "JP33", + "SBC" => "JP20", "SBS" => "JP22", "STV" => "JP1", "TBC" => "JP4", + "TBS" => "JP8", "TOKAIRADIO" => "JP21", "WBS" => "JP30", "YBC" => "JP6", + "YBS" => "JP19", "YFM" => "JP8", "ZIP-FM" => "JP21" + } + # 都道府県コードの変換(自地域以外のラジオ局を指定された場合) + area = station_list[station] if station_list[station] != area + doc = Nokogiri::XML(URI.parse("https://radiko.jp/v3/program/now/#{area}.xml").open) node = doc.xpath(%Q|//station[@id="#{station}"]|).first @@ -209,6 +286,8 @@ class DownloadTask when "fifo" FileUtils.rm tempfile end + + logout end def fetch(url, headers)

横浜FC vs ジェフ千葉は2-1で劇的勝利

シーズン前半戦アウェイでは0-1で破れたジェフ千葉が相手。優勝を目指す上でシーズンダブルは絶対に避けたいところ。 大勢の千葉サポーターにご来場いただきありがたい。フラッグを使ったコレオもキレイだった。 場外のキッチンカーで買った牛カルビ串。うーん…なんというか…「見ためどおりのお味」と言えば伝わりますかね? 800円也 うちのゴール裏の人数が少しずつ増えてきている。独自の応援スタイルも嫌いではなかったが、こうしてカラーを統一すると一体感が出るし美しいね。 前半は千葉の効果的なハイプレスに苦しみ、まともな攻撃をさせてもらえず。 相手の決定力不足もありなんとか耐えしのいでいたが、前半の最後、ちょっとふわっとした瞬間に髙橋 壱晟にピンポイントのクロスをあげられ、エドゥアルドにヘッドで決められてしまう… 後半、入りは良かったものの結局崩し切れずアディショナルタイムに。前回対戦と同じように守りきられてしまうのか…と思っていたら、91分、村田が左サイドからカットインし右足のシュートで同点に! さらにその1分後、村田のスルーパスを受けたジョアンパウロが絶妙のプルアウェイを決めた翔さんへどんぴしゃのクロスを供給し、逆転! 最高すぎる週末になった。というか、これは優勝するチームの勝ちかた…(ごくり) チームの雰囲気も良さそうだし、このまま勝ち続けたい。まずは次節、長崎に引導を渡しましょう。

Power AutomateでOutlookの件名に複数キーワードをマッチさせトリガーする

Power Automateで電子メールの件名に特定のキーワード含まれている場合…という条件でトリガーしたかったため、Copilotに聞いて件名フィルターに至急 OR 重要などと書いてみたがうまく動かない。 これはお得意のハルシネーションかも…とググったところ、やはり複数キーワードでトリガーする場合、設定タブでトリガーの条件を記述する必要があるようだ。 このフィールドで、 @or(contains(triggerBody()?['Subject'], '至急'),contains(triggerBody()?['Subject'], '重要')) のように書いたところうまく動いた。