Windows のさまざまなアプリケーション

【概要】Windowsでは、Microsoft社が提供するwinget(Windows Package Manager)を使用し、ビルドツール、開発環境、ユーティリティなどのソフトウェアを効率的にインストールできる。また、公式ストアやwingetに未収録のフリーソフトウェアを、開発者のWebサイト等から入手できる。

【フリーソフトウェアについて】この記事で紹介するソフトウェアの多くはフリーソフトウェア(無償で利用できるソフトウェア)である。フリーソフトウェアには、オープンソースソフトウェア(ソースコードが公開されているもの)と、無償で配布されているが商用利用に制限があるものが含まれる。

フリーソフトウェア利用時の注意点

【目次】

【サイト内の関連ページ】

Windows の基本操作・コマンド操作・設定と、アプリ・開発環境・ローカル AI の導入

重要概念

winget

winget(Windows Package Manager)は、Microsoftが開発したWindows用のパッケージマネージャー(ソフトウェアの検索、インストール、更新、削除をコマンドで自動化する仕組み)である。Windows 11およびWindows 10(バージョン1809以降)には、App Installer(Microsoft Storeが配布)の一部として標準搭載されている。複数のアプリケーションをコマンドで管理でき、スクリプトによる自動化もできる。

winget使用時の注意点

Windowsでのwingetのインストール(標準搭載されていない場合の手動導入手順)は、別ページ »で説明する。

wingetが利用可能か確認するには、コマンドプロンプトを開き、次のコマンドを実行する。バージョン番号が表示されれば、利用可能である。

winget --version
wingetバージョン確認画面

パッケージの情報を最新にするには、コマンドプロンプトを開き、次のコマンドを実行する。

winget source update

アプリケーションを探すには、コマンドプロンプトを開き、次のコマンドを実行する。「アプリケーション名」の部分には、探したいソフトウェアの名前を入れる。

winget search <アプリケーション名>

アプリケーションをインストールするには、コマンドプロンプトを管理者として開き、次のコマンドを実行する。インストールに失敗した場合はエラーメッセージが表示される。

winget install <アプリケーション名またはID>

インストール済みのアプリケーション一覧を表示するには、コマンドプロンプトを開き、次のコマンドを実行する。更新可能なアプリケーションがある場合は、新しいバージョンも表示される。

winget list

アプリケーションを最新版に更新するには、コマンドプロンプトを管理者として開き、次のコマンドを実行する。更新に失敗した場合はエラーメッセージが表示される。

winget upgrade <アプリケーション名またはID>

インストール済みのすべてのアプリケーションを更新するには、コマンドプロンプトを管理者として開き、次のコマンドを実行する。更新に失敗した場合はエラーメッセージが表示される。

winget upgrade --all

アプリケーションを削除(アンインストール)するには、コマンドプロンプトを管理者として開き、次のコマンドを実行する。削除に失敗した場合はエラーメッセージが表示される。

winget uninstall <アプリケーション名またはID>

1. 汎用ツール

汎用ツールのインストール手順を示す。インストールは原則としてwingetコマンドにより一括実行し,コマンドプロンプトを管理者として開いて行う。例外として,Kokomiteはwinget未対応のためcurlによるダウンロードとPowerShellによるZIP展開を行い,FileZillaは公式サイトから手動でダウンロードを行う。

インストールコマンドの実行方法

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。 wingetの--scope machineオプションでシステム全体にインストールするには,管理者権限が必要である。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

但し,FileZillaについては,wingetでインストールできないため,コマンドの実行後に開くダウンロードページから手動でインストールする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド(管理者権限のコマンドプロンプトで実行)
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行することを想定
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Google Chrome
REM ============================================================
REM Google Chrome をシステム領域にインストール
winget install --scope machine --id Google.Chrome -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "NOGOOGLEUPDATEPING=1"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Google Chrome のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM Google Chrome の自動更新を無効化
powershell -NoProfile -Command "New-Item -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Name 'AutoUpdateCheckPeriodMinutes' -Value 0 -Type DWord; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Name 'UpdateDefault' -Value 0 -Type DWord"
REM Google Chrome のパス設定(末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\Program Files\Google\Chrome\Application'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM Mozilla Firefox
REM ============================================================
REM Firefox をシステム領域にインストール
winget install --scope machine --id Mozilla.Firefox -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/MaintenanceService=false /PreventRebootRequired=true /RegisterDefaultAgent=false"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Mozilla Firefox のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM Firefox の自動更新を無効化
powershell -NoProfile -Command "New-Item -Path 'HKLM:\SOFTWARE\Policies\Mozilla\Firefox' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Mozilla\Firefox' -Name 'DisableAppUpdate' -Value 1 -Type DWord"
REM Firefox のパス設定(末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\Program Files\Mozilla Firefox'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM 7-Zip
REM ============================================================
REM 7-Zip をシステム領域にインストール
winget install --scope machine --id 7zip.7zip -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 7-Zip のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 7-Zip のパス設定(末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\Program Files\7-Zip'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM Kokomite
REM ============================================================
REM Kokomite のダウンロード
echo Kokomiteをダウンロード中...
if not exist "C:\Tools\Kokomite" mkdir "C:\Tools\Kokomite"
curl -L -f -A "Mozilla/5.0" -e "https://www.vector.co.jp/download/file/winnt/amuse/fh759659.html" --retry 3 --retry-delay 2 --connect-timeout 30 -o C:\Tools\Kokomite\kokomite.zip https://ftp.vector.co.jp/75/96/2241/Kokomite2-3-4-135.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Kokomite のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM ZIP内のファイル名を cp932 として展開用フォルダへ展開する(再実行時は展開先を作り直す)
powershell -NoProfile -Command "Add-Type -AssemblyName System.IO.Compression.FileSystem; $d='C:\Tools\Kokomite\_extract'; if(Test-Path -LiteralPath $d){Remove-Item -LiteralPath $d -Recurse -Force}; New-Item -ItemType Directory -Path $d -Force | Out-Null; [System.IO.Compression.ZipFile]::ExtractToDirectory('C:\Tools\Kokomite\kokomite.zip',$d,[System.Text.Encoding]::GetEncoding(932))"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Kokomite の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 展開結果から Kokomite.exe を探索し,同梱ファイルごと C:\Tools\Kokomite 直下へ配置する
powershell -NoProfile -Command "$s=Get-ChildItem 'C:\Tools\Kokomite\_extract' -Recurse -Filter 'Kokomite.exe' | Select-Object -First 1; if($s){Copy-Item (Join-Path $s.Directory.FullName '*') 'C:\Tools\Kokomite' -Recurse -Force}"
if not exist "C:\Tools\Kokomite\Kokomite.exe" ( color 0c & echo Kokomite.exe の配置に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 設定は実行ファイルと同じフォルダに保存されるため,Users(SID S-1-5-32-545)に変更権限を付与
icacls "C:\Tools\Kokomite" /grant *S-1-5-32-545:(OI)(CI)M
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Kokomite のアクセス権設定に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM Kokomite のパス設定(末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\Tools\Kokomite'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
REM スタートメニュー(すべてのアプリ)へのショートカット作成
powershell -NoProfile -Command "$e='C:\Tools\Kokomite\Kokomite.exe'; if(Test-Path $e){$w=New-Object -ComObject WScript.Shell; $l=$w.CreateShortcut((Join-Path $env:ProgramData 'Microsoft\Windows\Start Menu\Programs\Kokomite.lnk')); $l.TargetPath=$e; $l.WorkingDirectory='C:\Tools\Kokomite'; $l.Save()}"

REM ============================================================
REM MobaXterm Home Edition
REM ============================================================
REM MobaXterm Home Edition をインストール
REM マニフェストにスコープ宣言がないため --scope machine は指定しない
REM 管理者権限で実行するため,同梱の MSI はシステム領域に導入される
REM MobaXterm はGUIツールのためパス設定は不要
winget install --id Mobatek.MobaXterm -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo MobaXterm のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM 環境変数の反映
REM ============================================================
REM 実行中のコマンドプロンプトに反映
set "PATH=%PATH%;C:\Program Files\Google\Chrome\Application;C:\Program Files\Mozilla Firefox;C:\Program Files\7-Zip;C:\Tools\Kokomite"

REM ============================================================
REM FileZilla Client
REM ============================================================
REM FileZilla の自動更新チェックと初回ウェルカム画面を無効化する設定ファイルを
REM 既定のインストール先(filezilla.exe と同じフォルダ)へ先に配置する
if not exist "%ProgramFiles%\FileZilla FTP Client" mkdir "%ProgramFiles%\FileZilla FTP Client"
(
    echo ^<FileZilla3^>
    echo   ^<Settings^>
    echo     ^<Setting name="Config Location"^>$APPDATA/FileZilla/^</Setting^>
    echo     ^<Setting name="Disable update check"^>1^</Setting^>
    echo     ^<Setting name="Greeting version"^>9.9.9^</Setting^>
    echo   ^</Settings^>
    echo ^</FileZilla3^>
) > "%ProgramFiles%\FileZilla FTP Client\fzdefaults.xml"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo fzdefaults.xml の作成に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM FileZilla は手動インストールのため,ブラウザでダウンロードページを開く
start https://filezilla-project.org/download.php?platform=win64
echo ブラウザで公式ダウンロードページを開きます。
echo 「Download FileZilla Client」から 64bit 版 EXE インストーラを保存し実行してください。
echo インストール先は既定(C:\Program Files\FileZilla FTP Client)のままとしてください。

echo インストール完了

インストール確認のために次のコマンドを実行する。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM chrome.exe,firefox.exe,7z.exe のバージョンは実行ファイルのバージョン情報から取得する
REM (chrome.exe と firefox.exe はコマンドプロンプトへバージョンを出力しない)
REM ============================================================

REM ===== Google Chrome =====
powershell -NoProfile -Command "$p='C:\Program Files\Google\Chrome\Application\chrome.exe'; if(Test-Path $p){'[検出] '+$p+' '+(Get-Item $p).VersionInfo.ProductVersion}else{'[未検出] chrome'}"
where chrome 2>nul && echo [パス設定] 反映済み || echo [パス設定] 未反映(コマンドプロンプトの再起動が必要な場合があります)

REM ===== Mozilla Firefox =====
powershell -NoProfile -Command "$p='C:\Program Files\Mozilla Firefox\firefox.exe'; if(Test-Path $p){'[検出] '+$p+' '+(Get-Item $p).VersionInfo.ProductVersion}else{'[未検出] firefox'}"
where firefox 2>nul && echo [パス設定] 反映済み || echo [パス設定] 未反映(コマンドプロンプトの再起動が必要な場合があります)

REM ===== 7-Zip =====
powershell -NoProfile -Command "$p='C:\Program Files\7-Zip\7z.exe'; if(Test-Path $p){'[検出] '+$p+' '+(Get-Item $p).VersionInfo.ProductVersion}else{'[未検出] 7z'}"
where 7z 2>nul && echo [パス設定] 反映済み || echo [パス設定] 未反映(コマンドプロンプトの再起動が必要な場合があります)

REM ===== Kokomite =====
if exist "C:\Tools\Kokomite\Kokomite.exe" (echo [検出] C:\Tools\Kokomite\Kokomite.exe) else echo [未検出] Kokomite
where kokomite 2>nul && echo [パス設定] 反映済み || echo [パス設定] 未反映(コマンドプロンプトの再起動が必要な場合があります)
if exist "%ProgramData%\Microsoft\Windows\Start Menu\Programs\Kokomite.lnk" (echo [ショートカット] 作成済み) else echo [ショートカット] 未作成

REM ===== MobaXterm =====
if exist "C:\Program Files (x86)\Mobatek\MobaXterm\MobaXterm.exe" (echo [検出] MobaXterm) else echo [未検出] MobaXterm

REM ===== FileZilla Client =====
if exist "C:\Program Files\FileZilla FTP Client\filezilla.exe" (echo [検出] FileZilla Client) else echo [未検出] FileZilla(手動インストール対象)
if exist "C:\Program Files\FileZilla FTP Client\fzdefaults.xml" (echo [設定ファイル] fzdefaults.xml 配置済み) else echo [設定ファイル] 未配置

REM ===== 確認完了 =====
ソフトウェア説明用途備考
Google Chrome Googleが開発したWebブラウザ。V8エンジン(JavaScriptエンジン)によるJavaScript実行と,DevTools(ブラウザ内蔵の開発者ツール)によるデバッグ機能を備える。 Webブラウザ wingetでインストール可能。グループポリシー(レジストリ)で自動更新を停止して運用する。インストール先をシステム環境変数Pathに追加する。
Firefox Mozillaが開発したWebブラウザ。独自のGecko(レンダリングエンジン)を搭載し,Web標準への準拠とプライバシー保護機能を備える。 Webブラウザ wingetでインストール可能。グループポリシー(レジストリ)で自動更新を停止して運用する。メンテナンスサービスと既定ブラウザエージェントの導入を抑止し,再起動要求を抑止する。インストール先をシステム環境変数Pathに追加する。
7-Zip ファイル圧縮・解凍ツール。LZMA/LZMA2(圧縮アルゴリズム)による.7z形式のほか,tar.gz等のUnix系形式にも対応する。 ファイル圧縮・解凍 wingetでインストール可能。インストール先をシステム環境変数Pathに追加する。
Kokomite マウスポインタの位置を半透明の円やリングで強調表示するツール。画面共有や動画教材の作成時に視認性を高める。 プレゼンテーション補助 winget未対応。curlでZIPをダウンロードし,PowerShellでC:\Tools\Kokomite\_extractに展開する。ZIP内のファイル名はShift_JIS(cp932)で格納されているため,文字コードを指定して展開する。展開結果から実行ファイルを探索し,同梱ファイルとともにC:\Tools\Kokomite直下へ配置する。インストール先をシステム環境変数Pathに追加する。設定を実行ファイルと同じフォルダへ保存する仕様のため,Usersグループに変更権限を付与する。スタートメニューにショートカットを作成する。
MobaXterm Windows向けの統合リモート接続ツール(Home Editionを使用)。SSH接続,X11転送(Xサーバ),SFTPを,タブ付きの一つの画面で操作できる。 リモート接続・Xサーバ wingetでインストール可能。ただしマニフェストにインストールスコープの宣言がないため,--scope machineは指定しない。管理者権限で実行することにより,同梱のMSIはシステム領域に導入される。GUIツールのためPath設定は不要。
FileZilla FTP/SFTPクライアント。ドラッグ&ドロップ操作で,サーバーとの間のファイル転送を行える。 ファイル転送 wingetではインストールできない。公式サイトから手動でダウンロードしインストールする。自動更新チェックと初回ウェルカム画面を無効化するfzdefaults.xmlは,実行ファイルと同じフォルダに置く必要があるため,既定のインストール先へあらかじめ配置する。インストール先は既定のままとする。

2. Windows標準ツールの代替ツール:スクリーンショット、ファイル検索、ペイント

Windows標準ツールの代替ツールについて,各ツールの説明・用途・インストール手順を示す。

インストールコマンドの実行方法

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。 wingetの--scope machineオプションでシステム全体にインストールするには,管理者権限が必要である。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Everything(ファイル名検索)
REM ============================================================
REM Everything をシステム領域にインストール(wix 形式を指定し、msiexec の引数を渡す)
winget install --scope machine --id voidtools.Everything -e --source winget --installer-type wix --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/qn /norestart"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Everything のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM Everything の設定(サービス登録、OS起動時の自動起動、更新通知の無効化)
if exist "C:\Program Files\Everything\Everything.exe" ( "C:\Program Files\Everything\Everything.exe" -install-service -install-run-on-system-startup -disable-update-notification ) else ( color 0c & echo C:\Program Files\Everything\Everything.exe が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
REM Everything のパス設定(既存 Path の値の型を保持したまま末尾に追加)
powershell -NoProfile -Command "$p='C:\Program Files\Everything'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Everything のパス設定に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM EverythingToolbar(Everything のタスクバー統合)
REM ============================================================
REM 前提条件として .NET Desktop Runtime 8 をインストール
winget install --scope machine --id Microsoft.DotNet.DesktopRuntime.8 -e --source winget --silent --disable-interactivity --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo .NET Desktop Runtime 8 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM EverythingToolbar をシステム領域にインストール
winget install --scope machine --id srwi.EverythingToolbar.Launcher -e --source winget --silent --disable-interactivity --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo EverythingToolbar のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM QuickLook(スペースキーでのプレビュー、macOS 風)
REM ============================================================
REM 既存の QuickLook をアンインストール(同一バージョンの再インストールを可能にするため)
for /f "usebackq tokens=*" %i in (`powershell -NoProfile -Command "Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' | Where-Object { $_.GetValue('DisplayName') -eq 'QuickLook' } | ForEach-Object { $_.PSChildName }"`) do ( start /wait msiexec /x "%i" /qn /norestart )
REM QuickLook をダウンロード(バージョン番号が URL とファイル名に固定されているため、更新時は両方を変更すること)
curl -L -f --retry 3 --retry-delay 2 --connect-timeout 30 -o "%ProgramData%\QuickLook.msi" https://github.com/QL-Win/QuickLook/releases/download/4.5.0/QuickLook-4.5.0.msi
if not "%ERRORLEVEL%"=="0" ( color 0c & echo QuickLook のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM QuickLook を全ユーザー向けにインストール
start /wait msiexec /i "%ProgramData%\QuickLook.msi" ALLUSERS=1 /qn /norestart
if not "%ERRORLEVEL%"=="0" ( color 0c & echo QuickLook のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 常駐(全ユーザー用:HKLM)。.msi は x86 のため Program Files (x86) に入る
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "QuickLook" /t REG_SZ /d "\"C:\Program Files (x86)\QuickLook\QuickLook.exe\"" /f
if not "%ERRORLEVEL%"=="0" ( color 0c & echo QuickLook の自動起動の設定に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM AnyTXT Searcher(文書全文検索)
REM ============================================================
REM AnyTXT Searcher をシステム領域にインストール
winget install --scope machine --id AnyTXT.AnyTXTSearcher -e --source winget --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/SP- /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AnyTXT Searcher のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM AnyTXT Searcher のパス設定(既存 Path の値の型を保持したまま末尾に追加)
powershell -NoProfile -Command "$p='C:\Program Files\Anytxt Searcher'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AnyTXT Searcher のパス設定に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Lightshot(スクリーンショット)
REM ============================================================
REM Lightshot をシステム領域にインストール(Inno Setup、表示言語は日本語)
winget install --scope machine --id Skillbrains.Lightshot -e --source winget --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /NORESTARTAPPLICATIONS /LANG=japanese"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Lightshot のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Paint.NET(画像編集)
REM ============================================================
REM Paint.NET をシステム領域にインストール(自動更新は無効化、デスクトップショートカット作成)
winget install --scope machine --id dotPDN.PaintDotNet -e --source winget --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/auto CHECKFORUPDATES=0 DESKTOPSHORTCUT=1"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Paint.NET のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM === インストール完了 ===

インストール確認のために次のコマンドを実行する。Pathの変更は実行中のコマンドプロンプトには反映されないため,確認は新しいコマンドプロンプトで行う。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM ============================================================

REM ===== Everything =====
if exist "C:\Program Files\Everything\Everything.exe" (echo [検出] Everything) else echo [未検出] Everything

REM ===== EverythingToolbar =====
if exist "C:\Program Files\EverythingToolbar\EverythingToolbar.Launcher.exe" (echo [検出] EverythingToolbar) else echo [未検出] EverythingToolbar

REM ===== .NET Desktop Runtime 8 =====
"%ProgramFiles%\dotnet\dotnet.exe" --list-runtimes | findstr /C:"Microsoft.WindowsDesktop.App 8." >nul
if not "%ERRORLEVEL%"=="0" (echo [未検出] .NET Desktop Runtime 8) else echo [検出] .NET Desktop Runtime 8

REM ===== QuickLook =====
if exist "C:\Program Files (x86)\QuickLook\QuickLook.exe" (echo [検出] QuickLook) else echo [未検出] QuickLook

REM ===== AnyTXT Searcher =====
if exist "C:\Program Files\Anytxt Searcher\ATGUI.exe" (echo [検出] AnyTXT Searcher) else echo [未検出] AnyTXT Searcher

REM ===== Lightshot =====
if exist "C:\Program Files (x86)\Skillbrains\lightshot\Lightshot.exe" (echo [検出] Lightshot) else echo [未検出] Lightshot

REM ===== Paint.NET =====
if exist "C:\Program Files\paint.net\paintdotnet.exe" (echo [検出] Paint.NET) else echo [未検出] Paint.NET

REM ===== 確認完了 =====
ソフトウェア説明用途備考
Everything ファイル名によるファイル検索ツール。NTFSボリュームのマスターファイルテーブル(MFT)とUSNジャーナルから索引を構築する。 ファイル検索 wingetパッケージIDはvoidtools.Everything。マニフェストにwix形式とnullsoft形式が含まれるため,--installer-type wixで形式を指定し,--overrideでmsiexecの引数を渡す。インストール後にサービス登録,OS起動時の自動起動,更新通知の無効化を設定する。インストール先はC:\Program Files\Everything。
EverythingToolbar Everythingの検索機能をWindowsタスクバーに統合するツール。タスクバーから直接ファイル検索を実行できる。 ファイル検索補助 wingetパッケージIDはsrwi.EverythingToolbar.Launcher。前提条件はEverything 1.4.1以上が動作していること(Lite版は非対応)と,.NET Desktop Runtime 8.0以降。実行ファイルはC:\Program Files\EverythingToolbar\EverythingToolbar.Launcher.exe。
QuickLook ファイルを選択してSpaceキーを押すと内容をプレビューできるツール。macOSのQuick Look機能をWindowsで実現する。 ファイルプレビュー wingetパッケージ(QL-Win.QuickLook)はユーザー単位のインストーラのみを提供するため,本ガイドではcurlで.msiをダウンロードし,msiexecにALLUSERS=1を指定して全ユーザー向けにインストールする。.msiはx86であり,インストール先はC:\Program Files (x86)\QuickLook。ダウンロードURLとファイル名にバージョン番号が含まれるため,バージョンの変更時は両方を変更すること。
AnyTXT Searcher ファイル内のテキストを対象に全文検索できるツール。インデックスを事前構築して検索する。 ファイル内容検索 wingetパッケージIDはAnyTXT.AnyTXTSearcher(Inno Setup形式)。インストール先はC:\Program Files\Anytxt Searcher。
Lightshot スクリーンショットツール。PrintScreenキーで範囲を選択し,保存・共有できる。 画面キャプチャ wingetパッケージIDはSkillbrains.Lightshot(Inno Setup形式)。x86版のみが提供され,インストール先はC:\Program Files (x86)\Skillbrains\lightshot。/LANG=japaneseで表示言語として日本語を指定する。この指定により言語選択ダイアログは抑制される。
Paint.NET Windowsで動作する画像編集ソフトウェア。レイヤー機能や各種フィルタを備え,PNG・JPEG・BMP等の形式に対応する。 画像編集 wingetパッケージIDはdotPDN.PaintDotNet。/auto CHECKFORUPDATES=0 DESKTOPSHORTCUT=1は公式の無人インストール用引数であり,自動更新の無効化とデスクトップショートカットの作成を指定する。

3. 開発環境,ビルドツール,プログラミング言語,AI支援

プログラミング言語,コンパイラ,AI開発支援ツールなどをインストールする。これにより,Python,C/C++,Rustでの開発,Gitによるバージョン管理,機械学習フレームワークの利用,Scratchによるプログラミング学習,AI支援ツールの利用ができるようになる。インストールは,管理者としてコマンドプロンプトを開き,コマンドを貼り付けて上から順に実行する。ソフトウェア本体は主にwingetでインストールし,Pythonのパッケージはpipでインストールする。ここでインストールするコードエディタ(Visual Studio Code,VSCodium)には,AI支援としてClaude Code拡張機能とCline拡張機能を導入する。このうちClaude Code拡張機能には,接続先をローカルで動作するOllama(http://localhost:11434),モデルを qwen38-27b-code とする環境変数を settings.json に書き込む。接続先のOllamaは4章でインストールする。

インストールコマンドの実行方法

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。 そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド(管理者権限のcmdで実行)
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行することを想定
REM (バッチファイルではないため、for /f のループ変数は %P のまま単一表記でよい)
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM パス長制限の解除 (LongPathsEnabled)
REM ============================================================
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
reg query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled

REM ============================================================
REM 一時ファイル保存先 (TEMP / TMP)
REM ============================================================
REM C:\TEMP に変更し、パス長問題を回避しやすくする
REM SetEnvironmentVariable は常に REG_SZ を作成し、既定値の REG_EXPAND_SZ を
REM 置き換えてしまうため、既存の値の型を取得して同じ型で書き戻す
if not exist C:\TEMP mkdir C:\TEMP
set "TEMP=C:\TEMP"
set "TMP=C:\TEMP"
powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); foreach($n in @('TEMP','TMP')){ $t=[Microsoft.Win32.RegistryValueKind]::ExpandString; if($k.GetValueNames() -contains $n){ $t=$k.GetValueKind($n) }; $k.SetValue($n,'C:\TEMP',$t) }; $k.Close()"
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TEMP
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TMP

REM ============================================================
REM CMake
REM ============================================================
winget install --scope machine --id Kitware.CMake -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/qn /norestart ADD_CMAKE_TO_PATH=System"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo CMake のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Visual C++ 再頒布可能パッケージ (VCRedist 2015-)
REM ============================================================
winget install --scope machine --id Microsoft.VCRedist.2015+.x64 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet /norestart"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VCRedist のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Visual Studio Build Tools + Desktop development with C++
REM (VCTools、MSBuildTools、CMake連携、Clang、Windows 11 SDK)
REM ============================================================
REM 進行中のインストーラーを停止(ロック競合回避)
REM 対象プロセスが存在しない場合 taskkill はエラーを返すため、事前に存在を確認する
REM msiexec は他製品のインストールが進行中の場合それも停止するため、
REM 他のインストール作業を行っていない状態で実行する
tasklist /FI "IMAGENAME eq vs_setup.exe" | findstr /I /C:"vs_setup.exe" >nul && taskkill /F /IM vs_setup.exe /T
tasklist /FI "IMAGENAME eq vs_installer.exe" | findstr /I /C:"vs_installer.exe" >nul && taskkill /F /IM vs_installer.exe /T
tasklist /FI "IMAGENAME eq vs_installerservice.exe" | findstr /I /C:"vs_installerservice.exe" >nul && taskkill /F /IM vs_installerservice.exe /T
tasklist /FI "IMAGENAME eq msiexec.exe" | findstr /I /C:"msiexec.exe" >nul && taskkill /F /IM msiexec.exe /T

REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)

REM BuildTools のインストールパスを vswhere.exe で取得(メジャーバージョンに依存しない)
set "VSWHERE=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
set "BT_PATH="
for /f "usebackq delims=" %P in (`"%VSWHERE%" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do set "BT_PATH=%P"

if not defined BT_PATH ( color 0c & echo Build Tools のインストールパスを取得できませんでした & ping 127.0.0.1 -n 6 >nul & color )

REM 破損時の修復(任意、動作がおかしくなった場合)
REM if defined BT_PATH "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" repair --installPath "%BT_PATH%" --quiet --norestart
REM 導入確認(インストールパスが表示されれば正常)
"%VSWHERE%" -products * -requires Microsoft.VisualStudio.Workload.VCTools -property installationPath

REM ============================================================
REM CUDA 12.8
REM ============================================================
winget install --scope machine --id Nvidia.CUDA --version 12.8 -e --silent --disable-interactivity --force --uninstall-previous --accept-source-agreements --accept-package-agreements --override "-s -n"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo CUDA のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM CUDA 12.8のMSBuild統合ファイルをコピー
REM ============================================================
REM 統合用ファイルのコピー
if exist "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\" (
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "c:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v170\BuildCustomizations\" /Y /I
) else (
    echo CUDA v12.8 のディレクトリが存在しません。
    ping 127.0.0.1 -n 6 >nul
)

REM 旧バージョンの CUDA 統合ファイルが BuildTools 側に残っている場合は削除
REM (インストールパスは vswhere.exe で取得した %BT_PATH% を使用)
if exist "%BT_PATH%\MSBuild\Microsoft\VC\v180\BuildCustomizations\CUDA 12.3.*" del "%BT_PATH%\MSBuild\Microsoft\VC\v180\BuildCustomizations\CUDA 12.3.*"

REM ============================================================
REM Rust (rustup, cargo)
REM ============================================================
REM Rust 用環境変数の設定(現セッション + システム全体)
set "RUSTUP_HOME=C:\Rust\rustup"
set "CARGO_HOME=C:\Rust\cargo"
powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('RUSTUP_HOME','C:\Rust\rustup','Machine'); [Environment]::SetEnvironmentVariable('CARGO_HOME','C:\Rust\cargo','Machine')"

REM rustup-init をダウンロードしてシステム全体にインストール
curl -L -f --retry 3 --retry-delay 2 --connect-timeout 30 -o "%TEMP%\rustup-init.exe" https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe
if not "%ERRORLEVEL%"=="0" ( color 0c & echo rustup-init のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 既存の rustup がある場合のみアンインストールする(無い状態で実行するとエラーになるため)
where rustup >nul 2>&1 && rustup self uninstall -y
if exist "%CARGO_HOME%" rmdir /s /q "%CARGO_HOME%"
if exist "%RUSTUP_HOME%" rmdir /s /q "%RUSTUP_HOME%"
"%TEMP%\rustup-init.exe" -y
if not "%ERRORLEVEL%"=="0" ( color 0c & echo rustup-init の実行に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
del "%TEMP%\rustup-init.exe"

REM cargo の bin を PATH 先頭に追加(Rust ツールチェーンを優先)
powershell -NoProfile -Command "$p='C:\Rust\cargo\bin'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if((';'+$c+';') -notlike \"*;$p;*\"){$k.SetValue('Path',($p+';'+$c),$t)}; $k.Close()}"

REM ============================================================
REM Python 3.12
REM ============================================================
REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.12 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $new=$c; if((';'+$new+';') -notlike \"*;$p;*\"){$new=$p+';'+$new}; if((';'+$new+';') -notlike \"*;$s;*\"){$new=$s+';'+$new}; if($new -ne $c){$k.SetValue('Path',$new,$t)}; $k.Close()}"

REM 現在のセッションにも反映
REM レジストリの Path は %SystemRoot% 等を含む未展開の文字列であり、
REM それをそのまま PATH に代入すると実行ファイルの探索に失敗するため、
REM 現セッションの PATH の先頭に追加する
set "PATH=C:\Program Files\Python312;C:\Program Files\Python312\Scripts;%PATH%"

REM pip / wheel の更新
python -m pip install -U --no-user pip wheel
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pip / wheel の更新に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Git
REM ============================================================
REM Git存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
if not exist "C:\Program Files\Git\cmd\git.exe" echo Git が見つかりません。インストールします... & winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=""icons,ext\reg\shellhere,assoc,assoc_sh"" /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled" & powershell -NoProfile -Command "$g='C:\Program Files\Git\cmd'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $g) -and (';'+$c+';' -notlike \"*;$g;*\")){[Environment]::SetEnvironmentVariable('Path',\"$g;$c\",'Machine')}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Git のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Python パッケージ (TensorFlow / PyTorch 他)
REM ============================================================
REM TensorFlow と関連パッケージ
pip install -U --no-user tensorflow tf-keras flatbuffers flatgeobuf protobuf
if not "%ERRORLEVEL%"=="0" ( color 0c & echo TensorFlow 関連パッケージのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM numpy と PyTorch(CUDA 12.8 対応 wheel)、pip キャッシュを全削除
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user scipy pillow pandas
if not "%ERRORLEVEL%"=="0" ( color 0c & echo scipy / pillow / pandas のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge

REM ============================================================
REM Scratch 3
REM ============================================================
winget install --scope machine --id MITMediaLab.Scratch.3 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/S /allusers"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Scratch 3 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Scratch 3 の自動更新を無効化
echo provider: generic > "C:\Program Files (x86)\Scratch 3\resources\app-update.yml"
echo url: http://127.0.0.1:0/no-update >> "C:\Program Files (x86)\Scratch 3\resources\app-update.yml"
type "C:\Program Files (x86)\Scratch 3\resources\app-update.yml"

REM ============================================================
REM Google Web サービスのアプリモード・ショートカット
REM ============================================================
REM Chrome の --app フラグで、アドレスバーやタブのない独立ウィンドウで起動する
REM 実行後、スタートメニュー(現在のユーザー)にショートカットが作成される
set "CHROME=%ProgramFiles%\Google\Chrome\Application\chrome.exe"
set "STARTMENU=%APPDATA%\Microsoft\Windows\Start Menu\Programs"

if not exist "%CHROME%" ( echo [警告] Chrome が見つかりません。& ping 127.0.0.1 -n 6 >nul & color )
REM NotebookLM
powershell -NoProfile -Command "$ws=New-Object -ComObject WScript.Shell; $sc=$ws.CreateShortcut('%STARTMENU%\NotebookLM.lnk'); $sc.TargetPath='%CHROME%'; $sc.Arguments='--app=https://notebooklm.google.com/'; $sc.Description='NotebookLM'; $sc.Save()"

REM Google Colaboratory
powershell -NoProfile -Command "$ws=New-Object -ComObject WScript.Shell; $sc=$ws.CreateShortcut('%STARTMENU%\Google Colaboratory.lnk'); $sc.TargetPath='%CHROME%'; $sc.Arguments='--app=https://colab.research.google.com/'; $sc.Description='Google Colaboratory'; $sc.Save()"

REM Google AI Studio
powershell -NoProfile -Command "$ws=New-Object -ComObject WScript.Shell; $sc=$ws.CreateShortcut('%STARTMENU%\Google AI Studio.lnk'); $sc.TargetPath='%CHROME%'; $sc.Arguments='--app=https://aistudio.google.com/'; $sc.Description='Google AI Studio'; $sc.Save()"

echo スタートメニューにショートカットを作成しました

REM ============================================================
REM VSCodium
REM ============================================================
REM 既存の VSCodium と、拡張機能・設定・キャッシュを一掃
REM (未インストールの場合、winget uninstall は「パッケージが見つからない」旨を表示する)
winget uninstall -e --id VSCodium.VSCodium --silent --disable-interactivity --accept-source-agreements
if exist "C:\ProgramData\vscodium-extensions" rmdir /s /q "C:\ProgramData\vscodium-extensions"
if exist "%APPDATA%\VSCodium" rmdir /s /q "%APPDATA%\VSCodium"
if exist "%USERPROFILE%\.vscode-oss" rmdir /s /q "%USERPROFILE%\.vscode-oss"

REM VSCodium をシステム領域に新規インストール
winget install --scope machine --id VSCodium.VSCodium -e --silent --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VSCodium のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 全ユーザー共有の拡張機能フォルダを作成
if not exist "C:\ProgramData\vscodium-extensions" mkdir "C:\ProgramData\vscodium-extensions"
icacls "C:\ProgramData\vscodium-extensions" /grant "Everyone:(OI)(CI)M" /T

REM スタートメニューのショートカットを --extensions-dir 付きで再作成
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VSCodium" rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VSCodium"
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VSCodium.lnk" del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VSCodium.lnk"
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VSCodium.lnk'); $lnk.TargetPath='C:\Program Files\VSCodium\VSCodium.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscodium-extensions\"'; $lnk.Save()"

REM ファイル / フォルダ右クリックの「VSCodium で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCodium\command" /ve /d "\"C:\Program Files\VSCodium\VSCodium.exe\" --extensions-dir \"C:\ProgramData\vscodium-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCodium\command" /ve /d "\"C:\Program Files\VSCodium\VSCodium.exe\" --extensions-dir \"C:\ProgramData\vscodium-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCodium\command" /ve /d "\"C:\Program Files\VSCodium\VSCodium.exe\" --extensions-dir \"C:\ProgramData\vscodium-extensions\" \"%V\"" /f

REM 拡張機能のインストール
REM Pylance は Open VSX に無いため、代替として Pyright の公式拡張(ms-pyright.pyright)を導入する
set "CODIUM=C:\Program Files\VSCodium\bin\codium.cmd"
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension ms-python.python
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension ms-python.debugpy
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension ms-pyright.pyright
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension saoudrizwan.claude-dev
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension rust-lang.rust-analyzer
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension tamasfe.even-better-toml
REM Anthropic 公式の Claude Code 拡張機能(Open VSX 上での安定性に注意)
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension anthropic.claude-code
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension almenon.arepl
"%CODIUM%" --extensions-dir "C:\ProgramData\vscodium-extensions" --list-extensions --show-versions

REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
REM python.languageServer の指定可能な値は Default / Jedi / Pylance / None であり、
REM Pyright 拡張を使う場合は None を指定する
if not exist "%APPDATA%\VSCodium\User" mkdir "%APPDATA%\VSCodium\User"
python -c "import json,os;data={'update.mode':'none','extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','python.languageServer':'None','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'qwen38-27b-code'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'VSCodium','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
winget uninstall -e --id Microsoft.VisualStudioCode --silent --disable-interactivity --accept-source-agreements
if exist "C:\ProgramData\vscode-extensions" rmdir /s /q "C:\ProgramData\vscode-extensions"
if exist "%APPDATA%\Code" rmdir /s /q "%APPDATA%\Code"
if exist "%USERPROFILE%\.vscode" rmdir /s /q "%USERPROFILE%\.vscode"
if exist "%LOCALAPPDATA%\Microsoft\vscode-update" rmdir /s /q "%LOCALAPPDATA%\Microsoft\vscode-update"

REM 自動更新の抑止ポリシーを削除(いったんデフォルトに戻す)
reg query "HKLM\SOFTWARE\Policies\Microsoft\VSCode" /v "UpdateMode" >nul 2>&1 && reg delete "HKLM\SOFTWARE\Policies\Microsoft\VSCode" /v "UpdateMode" /f

REM VS Code をシステム領域に新規インストール
winget install --scope machine --id Microsoft.VisualStudioCode -e --silent --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Visual Studio Code のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 全ユーザー共有の拡張機能フォルダ
if not exist "C:\ProgramData\vscode-extensions" mkdir "C:\ProgramData\vscode-extensions"
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T

REM スタートメニューのショートカットを --extensions-dir 付きで再作成
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code"
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk"
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"

REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f

REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"
type "C:\ProgramData\vscode-extensions\vscode.cmd"

REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions

REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
if not exist "%APPDATA%\Code\User" mkdir "%APPDATA%\Code\User"
python -c "import json,os;data={'update.mode':'none','update.enableWindowsBackgroundUpdates':False,'extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'qwen38-27b-code'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'Code','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM 自動更新の抑止ポリシー(settings.json に加えて、レジストリ側でも明示的にオフ)
reg add "HKLM\SOFTWARE\Policies\Microsoft\VSCode" /v "UpdateMode" /t REG_SZ /d "none" /f

echo === セットアップ完了 ===

インストール確認のために次のコマンドを実行する。PATHの変更を反映させるため,新しく開いたコマンドプロンプトで実行する。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM 新しく開いたコマンドプロンプトに貼り付けて実行する
REM ============================================================

echo [環境変数 TEMP/TMP]
powershell -NoProfile -Command "$t=[Environment]::GetEnvironmentVariable('TEMP','Machine'); $u=[Environment]::GetEnvironmentVariable('TMP','Machine'); Write-Host \"  TEMP=$t\"; Write-Host \"  TMP=$u\""

echo [CMake]
cmake --version || echo   *** 未検出 ***

echo [VC++ ランタイム]
reg query "HKLM\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" /v Version || echo   *** 未検出 ***

echo [Build Tools (VCTools)]
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products * -requires Microsoft.VisualStudio.Workload.VCTools -property installationVersion  || echo   *** 未検出 ***

echo [CUDA]
nvcc --version  || echo   *** 未検出 ***

echo [Rust]
rustc --version  || echo   *** 未検出 ***

echo [Python]
"C:\Program Files\Python312\python.exe" --version  || echo   *** 未検出 ***

echo [Git]
git --version  || echo   *** 未検出 ***

echo [numpy]
"C:\Program Files\Python312\python.exe" -c "import numpy; print('  numpy', numpy.__version__)"  || echo   *** 未検出 ***

echo [TensorFlow]
"C:\Program Files\Python312\python.exe" -c "import tensorflow; print('  TensorFlow', tensorflow.__version__)"  || echo   *** 未検出 ***

echo [PyTorch]
"C:\Program Files\Python312\python.exe" -c "import torch; print('  PyTorch', torch.__version__); print('  CUDA available:', torch.cuda.is_available())"  || echo   *** 未検出 ***

echo [Scratch 3]
if exist "C:\Program Files (x86)\Scratch 3\Scratch 3.exe" (echo [検出] Scratch 3) else echo [未検出] Scratch 3

echo [VS Code]
"C:\Program Files\Microsoft VS Code\bin\code.cmd" --version  || echo   *** 未検出 ***

echo [VSCodium]
"C:\Program Files\VSCodium\bin\codium.cmd" --version  || echo   *** 未検出 ***

echo [Google サービス ショートカット]
if exist "%APPDATA%\Microsoft\Windows\Start Menu\Programs\NotebookLM.lnk" (echo   [検出] NotebookLM) else echo   *** 未検出 *** NotebookLM
if exist "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Google Colaboratory.lnk" (echo   [検出] Google Colaboratory) else echo   *** 未検出 *** Google Colaboratory
if exist "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Google AI Studio.lnk" (echo   [検出] Google AI Studio) else echo   *** 未検出 *** Google AI Studio

REM VS Code, VSCodium の拡張機能の一覧表示

echo [VSCodium 拡張機能]
"C:\Program Files\VSCodium\bin\codium.cmd" --extensions-dir "C:\ProgramData\vscodium-extensions" --list-extensions --show-versions

echo [VS Code 拡張機能]
"C:\Program Files\Microsoft VS Code\bin\code.cmd" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions

REM Rust, Python, C++ の動作チェック
REM 一時ファイルを作成するため、書き込み可能な作業ディレクトリに移動する

echo ===== 動作チェック =====
if not exist C:\TEMP mkdir C:\TEMP
cd /d C:\TEMP

echo [Rust]
echo fn main(){println!("Rust OK");} > test.rs
rustc test.rs -o test.exe
if exist test.exe test.exe
if exist test.rs del test.rs
if exist test.exe del test.exe
if exist test.pdb del test.pdb

echo [Python]
"C:\Program Files\Python312\python.exe" -c "print('Python OK')"

echo [C++ (MS Build Tools)]
REM vcvarsall.bat は call で呼び出す(call を付けないと以降のコマンドが実行されない)
for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products * -requires Microsoft.VisualStudio.Workload.VCTools -property installationPath`) do call "%P\VC\Auxiliary\Build\vcvarsall.bat" x64
echo #include ^<iostream^> > test.cpp
echo int main(){std::cout^<^<"C++ OK";return 0;} >> test.cpp
cl test.cpp /Fe:test.exe /nologo
if exist test.exe test.exe
if exist test.cpp del test.cpp
if exist test.obj del test.obj
if exist test.exe del test.exe

echo ===== 確認完了 =====
ソフトウェア説明用途備考
CMake クロスプラットフォームのビルド自動化ツール。定義ファイル(CMakeLists.txt)から,OSやコンパイラに応じたビルド構成を生成する。 ビルド構成の自動生成 wingetでインストールする。システムのPATHに追加して使う。
Visual C++ 再頒布可能パッケージ MSVC(Microsoft Visual C++)でビルドしたアプリケーションの実行に必要なランタイムライブラリ。 C/C++アプリケーションの実行 wingetでインストールする(2015以降の統合版 x64)。
Build Tools for Visual Studio 2026 MSVC(Microsoft Visual C++コンパイラ),リンカ,Windows 11 SDK(26100)を含む。C/C++のビルドや,Python拡張ライブラリのコンパイルに使う。CMake連携コンポーネント,Clang/LLVMツールセット,MSBuildツール,v143ツールセット(x86/x64)も併せて導入する。 C/C++ビルド wingetでインストールする(パッケージID Microsoft.VisualStudio.BuildTools。バージョン18系がVisual Studio 2026に対応する)。すでにインストールされている場合は,setup.exe modifyで上記のコンポーネントを追加する。
CUDA Toolkit NVIDIA GPU用の並列計算基盤。GPUをGPGPU(汎用GPU計算:グラフィックス処理以外の計算にGPUを使う技術)として使い,行列演算などを処理する。NVIDIA製GPUと,対応するNVIDIAドライバが必要である。ここではCUDA 12.8を導入する。 GPU並列計算 wingetでインストールする(バージョン12.8を指定)。旧バージョンは置き換える。CUDA付属のMSBuild統合ファイル(extras\visual_studio_integration\MSBuildExtensions)を,Visual Studio 2026のCommunityとBuild ToolsのBuildCustomizationsフォルダへコピーする。旧バージョンのCUDA統合ファイルがBuild Tools側に残っていれば削除する。
cuDNN NVIDIA GPU向けの深層学習用ライブラリ。畳み込みなどの演算をGPUで実行する。 深層学習のGPU処理 PyTorchのwheelに同梱されているため,別途インストールしない。
Rust システムプログラミング言語。所有権システム(メモリ管理機構)により,メモリ安全性をコンパイル時に検査する。WindowsでのビルドにはBuild Tools for Visual Studioが必要である。 システム開発,高速化 rustup-initでインストールする。既存のrustupがある場合は削除してから導入する。ツールチェーンのファイルは,ユーザプロファイル下ではなくシステム領域(C:\Rust)に置くよう設定し,C:\Rust\cargo\binをシステムPATHの先頭に追加する。
Python 3.12 汎用プログラミング言語。3.12では,PEP 695による型パラメータの宣言構文,インタープリタの最適化,PEP 684によるサブインタープリタ(独立したPython実行環境)ごとの独立したGIL(グローバルインタープリタロック)が導入された。3.12のサブインタープリタはC APIレベルの対応であり,標準ライブラリからの利用は3.14のPEP 734(concurrent.interpretersモジュール)で提供された。 AI開発,データ解析,Web開発 wingetでインストールする。全ユーザー向けにC:\Program Files\Python312へ導入し,PATHの先頭に追加する。導入後にpipとwheelを最新版へ更新する。
Git 分散型バージョン管理システム(ソースコードの変更履歴を管理するツール)。変更履歴をDAG(有向非巡回グラフ:履歴の分岐と統合を表すデータ構造)として管理し,共同開発を支援する。 ソースコード管理 wingetでインストールする。C:\Program Files\Git\cmd\git.exeが無い場合だけ導入し,このフォルダをシステムPATHの先頭に追加する。デフォルトブランチ名はmain,改行はコミット時に変換しない設定で導入する。
TensorFlow Googleが開発した機械学習フレームワーク。WindowsネイティブではTensorFlow 2.10が最後のGPU対応リリースであり,2.11以降はCPUで動作する。@tf.function(グラフモード実行用デコレータ)による最適化や,LiteRT(旧TensorFlow Lite:軽量推論ランタイム)によるエッジデバイス展開に対応する。 機械学習,モデル展開 pipでインストールする。tf-keras,flatbuffers,flatgeobuf,protobufも併せて導入する。
PyTorch Metaが開発した機械学習フレームワーク。動的計算グラフ(実行時にグラフを構築する方式)で記述できる。CUDA 12.8対応・cuDNN同梱のwheelは pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 でインストールする。このwheelにはcuDNNを含むCUDAランタイムライブラリが同梱されているため,CUDAとcuDNNを別途インストールしなくても動作する。NVIDIAドライバは別途必要である。 機械学習モデル開発 pipでインストールする(cu128)。
NumPy / SciPy / Pillow / pandas / OpenCV Pythonの数値計算・データ処理・画像処理ライブラリ。NumPyは多次元配列,SciPyは科学技術計算,Pillowは画像入出力,pandasは表形式データ処理,OpenCVはコンピュータビジョン処理を担う。 数値計算,データ処理,画像処理 pipでインストールする。numpyはPyTorchと同じindex(cu128)から併せて導入する。OpenCVはheadless版などをアンインストールしてから,opencv-contrib-pythonを再インストールする。
Scratch MITメディアラボが開発したビジュアルプログラミング環境のデスクトップアプリ版。ブロックを組み合わせてプログラムを作り,計算機科学の基礎を学べる。 プログラミング入門 wingetでインストールする(全ユーザー向けの/allusersを指定する。32ビット版インストーラのためC:\Program Files (x86)\Scratch 3に入る)。app-update.ymlを書き換えて自動更新を止める。
NotebookLM Googleが提供するAIリサーチアシスタント。アップロードした文書をもとに,要約・質問応答・音声概要の生成を行う。 文書の整理・要約・調査 Webサービスのため,wingetでのインストールは不要。Googleアカウントが必要。Chromeの--appフラグを使い,コマンドを実行したユーザーのスタートメニューにショートカットを作成して使う。Google Chromeは事前にインストールしておく。
Google Colaboratory Googleが提供するクラウド上のJupyter Notebook環境。ブラウザでPythonコードを書いて実行でき,無料枠でGPU・TPUを使った機械学習の処理ができる。Google Driveと連携し,ノートブックの保存・共有ができる。 AI開発,機械学習,データ解析 Webサービスのため,wingetでのインストールは不要。Googleアカウントが必要。Chromeの--appフラグを使い,コマンドを実行したユーザーのスタートメニューにショートカットを作成して使う。Google Chromeは事前にインストールしておく。
Google AI Studio Googleが提供するGemini APIの開発者向けプラットフォーム。プロンプトの設計・テスト,APIキーの発行,AIアプリの試作をブラウザで行える。 AI開発,プロンプト設計 Webサービスのため,wingetでのインストールは不要。Googleアカウントが必要。Chromeの--appフラグを使い,コマンドを実行したユーザーのスタートメニューにショートカットを作成して使う。Google Chromeは事前にインストールしておく。
Visual Studio Code LSP(Language Server Protocol:エディタと言語サーバー間の通信を標準化するプロトコル)に対応したコードエディタ。拡張機能により,各種言語の開発環境として使える。 コード編集 wingetでインストールする。既存のVS Codeと拡張機能・ユーザー設定を削除してから,新規にインストールする。全ユーザー共有の拡張機能フォルダ(C:\ProgramData\vscode-extensions)に,Python(Pylance含む),日本語化,rust-analyzer,Claude Code,Cline等の拡張機能を導入し,GitHub Copilot拡張機能は削除する。自動更新はsettings.jsonとレジストリポリシーのUpdateModeの両方で無効にする。共有拡張機能フォルダを指定して起動するvscode.cmdを同じフォルダに作成し,--extensions-dir付きのスタートメニューのショートカットと,ファイル・フォルダの右クリックから起動する項目も登録する。
VSCodium Visual Studio Codeのオープンソースビルド。テレメトリ(利用状況の送信)が無効化されており,Microsoft独自の拡張機能マーケットプレイスの代わりにOpen VSXを使う。 コード編集 wingetでインストールする。既存のVSCodiumと拡張機能・ユーザー設定を削除してから,新規にインストールする。全ユーザー共有の拡張機能フォルダ(C:\ProgramData\vscodium-extensions)に,Claude Code,Cline等の拡張機能を導入し,settings.jsonで自動更新を無効にする。--extensions-dir付きのスタートメニューのショートカットと,ファイル・フォルダの右クリックから起動する項目も登録する。PylanceはOpen VSXに無いため,Pythonの言語サーバーには,Pylanceの基盤であるPyrightの公式拡張(ms-pyright.pyright)を使い,python.languageServerにはNoneを設定する(この設定の値はDefault,Jedi,Pylance,Noneのいずれかであり,Pyright拡張はNoneと組み合わせて使う)。

インストールコマンドの詳細説明と,ここでインストールされるコードエディタとAI支援拡張機能の概要説明は,別ページ(Windows Python 開発環境,ビルドツール,言語処理系,AI支援構築ガイド)に記載している。

4. ローカル生成AI(言語編)

Windows・VRAM16GBのパソコンでOllamaを使いLLMを動かす。AIモデルのファイルダウンロード後はオフラインで使え、データは外部に出ない。テキストと画像はgemma4:12b-it-qat、コード用途は27BのQwen3.8、数式・グラフはqwen3-vl:8b、帳票OCRはnanonets-ocr2:3b、音声は別途GGUFのgemma-4-12b-itを取り込む。ディスクは70GB以上必要。その他、関連ツール等をインストールする。

インストールコマンドの実行方法

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。 そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM  前提条件:
REM    - Visual Studio の C++ ビルドツールがインストール済みであること
REM    - CUDA Toolkit 12.8 と対応する NVIDIA ドライバがインストール済みであること
REM      (GPU 未搭載の場合、Ollama は CPU モードで動作し推論速度は低下する)
REM    - Git / Python 3.12 / CMake / Google Chrome は未導入時に本コマンドが導入する
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Git
REM ============================================================
REM Git存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_GIT=0"
if not exist "C:\Program Files\Git\cmd\git.exe" set "NEED_GIT=1"
if "%NEED_GIT%"=="1" echo Git が見つかりません。インストールします...
if "%NEED_GIT%"=="1" winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=""icons,ext\reg\shellhere,assoc,assoc_sh"" /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled"
if "%NEED_GIT%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo Git のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_GIT%"=="1" powershell -NoProfile -Command "$p='C:\Program Files\Git\cmd'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM Git のパスを現在のセッションに反映
set "PATH=C:\Program Files\Git\cmd;%PATH%"

REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM Python のパスを現在のセッションに反映
set "PATH=%PYTHON_PATH%;%PYTHON_PATH%\Scripts;%PATH%"

REM ============================================================
REM CMake(llama.cpp のビルドに使用)
REM ============================================================
set "NEED_CMAKE=0"
if not exist "C:\Program Files\CMake\bin\cmake.exe" set "NEED_CMAKE=1"
if "%NEED_CMAKE%"=="1" echo CMake が見つかりません。インストールします...
if "%NEED_CMAKE%"=="1" winget install --scope machine --id Kitware.CMake -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements
if "%NEED_CMAKE%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo CMake のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_CMAKE%"=="1" powershell -NoProfile -Command "$p='C:\Program Files\CMake\bin'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM CMake のパスを現在のセッションに反映
set "PATH=C:\Program Files\CMake\bin;%PATH%"

REM ============================================================
REM Google Chrome
REM ============================================================
REM Chrome存在チェック(未インストールの場合はシステム領域にインストール、自動更新無効化、パス設定)
set "NEED_CHROME=0"
if not exist "C:\Program Files\Google\Chrome\Application\chrome.exe" set "NEED_CHROME=1"
if "%NEED_CHROME%"=="1" echo Google Chrome が見つかりません。インストールします...
if "%NEED_CHROME%"=="1" winget install --scope machine --id Google.Chrome -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "NOGOOGLEUPDATEPING=1"
if "%NEED_CHROME%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo Google Chrome のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_CHROME%"=="1" powershell -NoProfile -Command "New-Item -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Name 'AutoUpdateCheckPeriodMinutes' -Value 0 -Type DWord; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Name 'UpdateDefault' -Value 0 -Type DWord"
if "%NEED_CHROME%"=="1" powershell -NoProfile -Command "$p='C:\Program Files\Google\Chrome\Application'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM  1. ツール類のインストール
REM ============================================================

REM ============================================================
REM llama.cpp のインストール
REM ============================================================
REM llamap.cpp
REM CUDA Toolkit の確認(llama.cpp の CUDA ビルドに必要)
where nvcc
if not "%ERRORLEVEL%"=="0" echo [警告] nvcc が見つかりません。CUDA Toolkit を導入してから llama.cpp のビルドを実行してください。

REM llama.cpp のビルドとインストール
cd /d "%TEMP%"
if exist llama.cpp rmdir /s /q llama.cpp
git clone https://github.com/ggml-org/llama.cpp
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のクローンに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd llama.cpp
cmake -B build -T v143 -DCMAKE_GENERATOR_INSTANCE="C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89;120" -DCMAKE_INSTALL_PREFIX="C:\llama.cpp"
REM cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89;120" -DCMAKE_CUDA_FLAGS="-allow-unsupported-compiler" -DCMAKE_INSTALL_PREFIX="C:\llama.cpp"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp の CMake 構成に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cmake --build build --config Release -j 8
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のビルドに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cmake --install build --config Release
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d "%TEMP%"
powershell -NoProfile -Command "$p='C:\llama.cpp\bin'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM Ollama のインストール
REM ============================================================
REM === Ollama 環境変数を Machine スコープで事前設定 ===
REM   インストール前に設定することで、Ollama起動時から設定が読み込まれる
REM   KVキャッシュ量子化の設定
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_FLASH_ATTENTION', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_KV_CACHE_TYPE', 'q8_0', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MAX_LOADED_MODELS', '2', 'Machine')"
REM コンテキスト長:Ollamaのデフォルトは4096。ここでは32768に設定。
REM 用途に応じて値を変更するか、この行を削除して auto に任せる
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_CONTEXT_LENGTH', '32768', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MODELS', 'C:\Ollama\models', 'Machine')"
set "OLLAMA_FLASH_ATTENTION=1"
set "OLLAMA_KV_CACHE_TYPE=q8_0"
set "OLLAMA_MAX_LOADED_MODELS=2"
set "OLLAMA_CONTEXT_LENGTH=32768"
set "OLLAMA_MODELS=C:\Ollama\models"

REM === 既存の Ollama プロセスを停止(ファイルロック解除のため) ===
REM   実行中の場合のみ taskkill を実行する(find の戻り値は 0 または 1)
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul && taskkill /F /IM ollama.exe
tasklist /FI "IMAGENAME eq ollama app.exe" | find /I "ollama app.exe" >nul && taskkill /F /IM "ollama app.exe"

REM === モデルフォルダの作成と権限設定 ===
if not exist "C:\Ollama\models" mkdir "C:\Ollama\models"
icacls "C:\Ollama\models" /grant "*S-1-5-32-545:(OI)(CI)(M)" /T

REM === 既存モデルの移動(ユーザープロファイルに残っている場合) ===
REM   Ollama 停止状態で実行するためファイルロックが起きない
if exist "%USERPROFILE%\.ollama\models" robocopy "%USERPROFILE%\.ollama\models" "C:\Ollama\models" /E /MOVE
if exist "%USERPROFILE%\.ollama\models" rd /s /q "%USERPROFILE%\.ollama\models"

REM robocopy は正常終了時も 0 以外を返すため ERRORLEVEL をクリア
ver >nul

REM === Ollama のアンインストール ===
REM   インストール先を C:\Ollama に変更するため、インストール済みの場合は先に削除する
set "OLLAMA_INSTALLED=1"
winget list --id Ollama.Ollama -e >nul 2>&1
if not "%ERRORLEVEL%"=="0" set "OLLAMA_INSTALLED=0"
REM   起動中はファイルが残り削除に失敗するため、先にプロセスを停止する
if "%OLLAMA_INSTALLED%"=="1" taskkill /F /T /IM "ollama app.exe" >nul 2>&1
if "%OLLAMA_INSTALLED%"=="1" taskkill /F /T /IM "ollama.exe" >nul 2>&1
if exist "C:\ollama\unins000.exe" (if "%OLLAMA_INSTALLED%"=="1" start /wait "" "C:\Ollama\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG="C:\TEMP\ollama_unins.log") else (if "%OLLAMA_INSTALLED%"=="1" start /wait "" "%LOCALAPPDATA%\Programs\Ollama\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG="C:\TEMP\ollama_unins.log")
if "%OLLAMA_INSTALLED%"=="1" if not "%ERRORLEVEL%"=="0" echo [警告] winget uninstall が異常終了しました
if "%OLLAMA_INSTALLED%"=="1" winget list --id Ollama.Ollama -e >nul 2>&1
if "%OLLAMA_INSTALLED%"=="1" if "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM uninstall後にプロセスが残ることがあるため、実行中であれば再度停止
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul && taskkill /F /IM ollama.exe
tasklist /FI "IMAGENAME eq ollama app.exe" | find /I "ollama app.exe" >nul && taskkill /F /IM "ollama app.exe"

REM === Ollama のインストール ===
winget install --id Ollama.Ollama -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/DIR=C:\Ollama"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM === Ollama のパス設定(システム PATH に未登録の場合のみ追加) ===
powershell -NoProfile -Command "$p='C:\Ollama'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM  OLLAMA スタートメニュー
REM ============================================================
REM   Windows 版の ollama run は、サーバー未起動時に ollama app.exe を自動起動する

REM gemma4-12b:latest
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut([Environment]::GetFolderPath('CommonPrograms')+'\Ollama gemma4.lnk'); $l.TargetPath=$env:ComSpec; $l.Arguments='/k ollama run gemma4-12b:latest'; $l.Save()"

REM qwen38-27b:latest
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Qwen3.8-27B.lnk'); $l.TargetPath=$env:ComSpec; $l.Arguments='/k ollama run qwen38-27b:latest'; $l.Save()"

REM Ollamaの実行ファイルを確認
where ollama
if not "%ERRORLEVEL%"=="0" echo [エラー] Ollamaのパスが見つかりません。再起動後に再実行してください。

REM Ollamaが起動していなければ起動
set "OLLAMA_RUNNING=1"
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul
if not "%ERRORLEVEL%"=="0" set "OLLAMA_RUNNING=0"
if "%OLLAMA_RUNNING%"=="0" start "" "C:\Ollama\ollama.exe" serve
if "%OLLAMA_RUNNING%"=="0" timeout /t 10 /nobreak

REM ============================================================
REM Super Agent Party  のインストール
REM ============================================================

rem === 1) 展開先を作成し、zip を取得する =========================
mkdir C:\SAP
curl -L -o C:\SAP\sap.zip https://github.com/heshengtao/super-agent-party/releases/download/v0.4.3/super-agent-party-win-v0.4.3.zip

rem === 2) 展開する(Windows 10 1803 以降の tar は zip に対応)=====
tar -xf C:\SAP\sap.zip -C C:\SAP
del C:\SAP\sap.zip

rem === 3) start_shared.bat を配置する ============================
rem 添付ファイルを C:\SAP\super-agent-party-win-v0.4.3\ に置く

rem === 4) 全ユーザに変更権限を付与する==
icacls "C:\SAP" /grant "Users:(OI)(CI)M" /T

rem === 5) 全ユーザのデスクトップにショートカットを作成する ========
powershell -NoProfile -Command "$s=(New-Object -ComObject WScript.Shell).CreateShortcut('C:\Users\Public\Desktop\Super Agent Party.lnk'); $s.TargetPath='C:\SAP\super-agent-party-win-v0.4.3\start_shared.bat'; $s.WorkingDirectory='C:\SAP\super-agent-party-win-v0.4.3'; $s.IconLocation='C:\SAP\super-agent-party-win-v0.4.3\static\source\icon.ico'; $s.Save()"

REM ============================================================
REM ClaudeCode のインストール
REM ============================================================

REM ClaudeCode
winget install --scope machine --id Anthropic.ClaudeCode -e --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Claude Code のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM  ollama-chat(チャットUI)
REM ============================================================
echo ollama-chatをインストール中...
"%PYTHON%" -m pip install -U --no-user ollama-chat
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ollama-chat のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM  2. Ollamaモデルのダウンロード
REM ============================================================
REM echo Ollamaモデルをダウンロード中...

REM ollama pull gemma4:12b-it-qat
REM if not "%ERRORLEVEL%"=="0" ( color 0c & echo gemma4:12b-it-qat の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ollama pull logicbeat/qwen3.8-27B_GSQ_RCO
REM if not "%ERRORLEVEL%"=="0" ( color 0c & echo smtek/Qwen3.8-27B:Q3_K_M の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ollama pull smtek/Qwen3.8-27B:Q2_K_XL-16gb
REM if not "%ERRORLEVEL%"=="0" ( color 0c & echo smtek/Qwen3.8-27B:Q2_K_XL-16gb の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ollama pull qwen3-vl:8b
REM if not "%ERRORLEVEL%"=="0" ( color 0c & echo qwen3-vl:8b の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ollama pull kahnwong/nanonets-ocr2:3b
REM if not "%ERRORLEVEL%"=="0" ( color 0c & echo kahnwong/nanonets-ocr2:3b の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

ollama pull bge-m3
ollama pull nomic-embed-text

REM echo モデルのダウンロード処理が終了しました。

REM =================================
REM モデルファイルの作成と登録
mkdir C:\ollama\modelfiles
cd /d C:\ollama\modelfiles

(echo FROM gemma4:12b-it-qat)>Modelfile.gemma4-12b
(echo PARAMETER num_ctx 65536)>>Modelfile.gemma4-12b

REM (echo FROM smtek/Qwen3.8-27B:Q3_K_M)>Modelfile.qwen38-27b
REM (echo PARAMETER num_ctx 32768)>>Modelfile.qwen38-27b
REM (echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b
(echo FROM logicbeat/qwen3.8-27B_GSQ_RCO)>Modelfile.qwen38-27b
(echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b
(echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b

REM (echo FROM smtek/Qwen3.8-27B:Q2_K_XL-16gb)>Modelfile.qwen38-27b-code
REM (echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b-code
REM (echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b-code
REM (echo PARAMETER num_predict 40000)>>Modelfile.qwen38-27b-code
REM (echo PARAMETER repeat_penalty 1.02)>>Modelfile.qwen38-27b-code
(echo FROM logicbeat/qwen3.8-27B_GSQ_RCO)>Modelfile.qwen38-27b-code
(echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b-code
(echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b-code
(echo PARAMETER num_predict 40000)>>Modelfile.qwen38-27b-code
(echo PARAMETER repeat_penalty 1.02)>>Modelfile.qwen38-27b-code

(echo FROM qwen3-vl:8b)>Modelfile.qwen3vl-8b
(echo PARAMETER num_ctx 65536)>>Modelfile.qwen3vl-8b

(echo FROM kahnwong/nanonets-ocr2:3b)>Modelfile.nanonets-ocr2-3b
(echo PARAMETER num_ctx 65536)>>Modelfile.nanonets-ocr2-3b

dir Modelfile.*

ollama stop gemma4-12b
ollama rm gemma4-12b
ollama create gemma4-12b -f Modelfile.gemma4-12b
ollama stop qwen38-27b
ollama rm qwen38-27b
ollama create qwen38-27b -f Modelfile.qwen38-27b
ollama stop qwen38-27b-code
ollama rm qwen38-27b-code
ollama create qwen38-27b-code -f Modelfile.qwen38-27b-code
ollama stop qwen3vl-8b
ollama rm qwen3vl-8b
ollama create qwen3vl-8b -f Modelfile.qwen3vl-8b
ollama stop nanonets-ocr2-3b
ollama rm nanonets-ocr2-3b
ollama create nanonets-ocr2-3b -f Modelfile.nanonets-ocr2-3b

ollama list

echo %OLLAMA_KV_CACHE_TYPE% %OLLAMA_FLASH_ATTENTION% %OLLAMA_NUM_PARALLEL% %OLLAMA_MAX_LOADED_MODELS%

REM ============================================================
REM パラメータ確認
ollama show gemma4-12b --parameters
ollama show qwen38-27b --parameters
ollama show qwen38-27b-code --parameters
ollama show qwen3vl-8b --parameters
ollama show nanonets-ocr2-3b --parameters

REM ============================================================
REM テスト実行
ollama run gemma4-12b "テスト" >nul
ollama ps

REM ============================================================
pip uninstall -y xformers
pip install -U --no-user huggingface_hub
pip install -U --no-user triton-windows
pip install -U --no-user sageattention
pip install -U --no-user comfy-cli

REM ============================================================
pip install -U --no-user label-studio


REM ============================================================
set "PI_ROOT=C:\pi"
set "PI_AGENT_DIR=C:\pi\pi-agent"
set "PI_BIN_DIR=C:\pi\pi-agent\bin"
set "PI_SKILLS_DIR=C:\pi\pi-agent\skills"
set "PI_PROVIDER_ID=ollama"
set "PI_MODEL_ID=qwen38-27b-code:latest"
set "OLLAMA_BASE=http://localhost:11434"

REM ===== Node.js のインストール(インストール済みならスキップ) =====
set "NODE_FOUND=0"

REM 方式1: PATHが通っていれば where で検出
where node >nul 2>nul
if "%ERRORLEVEL%"=="0" set "NODE_FOUND=1"

REM 方式2: 公式インストーラ/winget の既定配置場所
if exist "C:\Program Files\nodejs\node.exe" set "NODE_FOUND=1"
if exist "C:\Program Files (x86)\nodejs\node.exe" set "NODE_FOUND=1"

if "%NODE_FOUND%"=="1" echo Node.js は既にインストール済みのため、インストールをスキップしました

REM winget経由での導入if not exist "C:\Program Files\nodejs\node.exe" (
    if not exist "C:\Program Files (x86)\nodejs\node.exe" (
        winget install --scope machine --id OpenJS.NodeJS.LTS -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements
    )
)

if not exist "C:\Program Files\nodejs\node.exe" (
    if not exist "C:\Program Files (x86)\nodejs\node.exe" (
        color 0c & echo Node.js のインストールに失敗した可能性があります & ping 127.0.0.1 -n 6 >nul & color
    )
)

REM Node.js のパス設定(末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\Program Files\nodejs'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM 現在のコマンドプロンプトセッションにも即時反映(このウィンドウ内で続けて npm install を行うため)
set "PATH=%PATH%;C:\Program Files\nodejs"

REM ===== 共有ディレクトリの作成 =====
if not exist "%PI_ROOT%" mkdir "%PI_ROOT%"
if not exist "%PI_AGENT_DIR%" mkdir "%PI_AGENT_DIR%"
if not exist "%PI_BIN_DIR%" mkdir "%PI_BIN_DIR%"
if not exist "%PI_SKILLS_DIR%" mkdir "%PI_SKILLS_DIR%"



REM ===== Pi のインストール(C:\pi に配置。npm の既定グローバル領域は変更しない) =====
if exist "%PI_ROOT%\pi.cmd" echo Pi は既にインストール済みのため、インストールをスキップしました
if not exist "%PI_ROOT%\pi.cmd" npm install -g --ignore-scripts --prefix "%PI_ROOT%" @earendil-works/pi-coding-agent

REM 成功判定はERRORLEVELではなく、実際にファイルが作成されたかで行う(npm noticeの出力等でERRORLEVELが不安定なため)
if not exist "%PI_ROOT%\pi.cmd" ( color 0c & echo Pi のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Pi のパス設定(C:\pi を末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\pi'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
set "PATH=%PATH%;%PI_ROOT%"

REM ===== アクセス権(実行は全ユーザ,設定/セッションは書き込み可) =====
icacls "%PI_ROOT%" /grant "Users:(OI)(CI)RX" /T >nul
icacls "%PI_AGENT_DIR%" /grant "Users:(OI)(CI)M" /T >nul

>"%PI_AGENT_DIR%\models.json" echo {
>>"%PI_AGENT_DIR%\models.json" echo   "providers": {
>>"%PI_AGENT_DIR%\models.json" echo     "%PI_PROVIDER_ID%": {
>>"%PI_AGENT_DIR%\models.json" echo       "baseUrl": "%OLLAMA_BASE%/v1",
>>"%PI_AGENT_DIR%\models.json" echo       "api": "openai-completions",
>>"%PI_AGENT_DIR%\models.json" echo       "apiKey": "ollama",
>>"%PI_AGENT_DIR%\models.json" echo       "models": [{
>>"%PI_AGENT_DIR%\models.json" echo         "id": "%PI_MODEL_ID%",
>>"%PI_AGENT_DIR%\models.json" echo         "name": "Local Coder",
>>"%PI_AGENT_DIR%\models.json" echo         "reasoning": true,
>>"%PI_AGENT_DIR%\models.json" echo         "input": ["text"],
>>"%PI_AGENT_DIR%\models.json" echo         "contextWindow": 128000,
>>"%PI_AGENT_DIR%\models.json" echo         "maxTokens": 40000,
>>"%PI_AGENT_DIR%\models.json" echo         "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
>>"%PI_AGENT_DIR%\models.json" echo         "compat": { "supportsDeveloperRole": false, "supportsReasoningEffort": true }
>>"%PI_AGENT_DIR%\models.json" echo       }]
>>"%PI_AGENT_DIR%\models.json" echo     }
>>"%PI_AGENT_DIR%\models.json" echo   }
>>"%PI_AGENT_DIR%\models.json" echo }

REM ===== settings.json(起動ヘッダを抑止) =====
>"%PI_AGENT_DIR%\settings.json" echo {
>>"%PI_AGENT_DIR%\settings.json" echo   "defaultProvider": "%PI_PROVIDER_ID%",
>>"%PI_AGENT_DIR%\settings.json" echo   "defaultModel": "%PI_MODEL_ID%",
>>"%PI_AGENT_DIR%\settings.json" echo   "quietStartup": true
>>"%PI_AGENT_DIR%\settings.json" echo }

REM ===== 設定ディレクトリを全ユーザで共有 =====
powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $k.SetValue('PI_CODING_AGENT_DIR','C:\pi\pi-agent',[Microsoft.Win32.RegistryValueKind]::String); $k.Close()"
set "PI_CODING_AGENT_DIR=%PI_AGENT_DIR%"

REM ===== スキルの集約と名称正規化(~\.agents\skills の重複・不正名を解消) =====
powershell -NoProfile -Command "$src=Join-Path $env:USERPROFILE '.agents\skills'; $dst='C:\pi\pi-agent\skills'; if(Test-Path $src){ Get-ChildItem $src -Directory | ForEach-Object { $n=((($_.Name -replace '[^A-Za-z0-9-]','-') -replace '-+','-').ToLower()).Trim('-'); $t=Join-Path $dst $n; if(-not (Test-Path $t)){ Copy-Item $_.FullName $t -Recurse -Force }; $s=Join-Path $t 'SKILL.md'; if(Test-Path $s){ $L=Get-Content $s; for($i=0;$i -lt [Math]::Min(20,$L.Count);$i++){ if($L[$i] -match '^name:'){ $L[$i]='name: '+$n; break } }; Set-Content $s $L -Encoding UTF8 } }; Rename-Item $src ('skills.migrated-'+(Get-Date -Format yyyyMMddHHmmss)) -ErrorAction SilentlyContinue }"

REM ===== ripgrep / fd の事前配置(起動時の自動ダウンロードを回避) =====
powershell -NoProfile -Command "$ErrorActionPreference='Stop'; $bin='C:\pi\pi-agent\bin'; if(-not (Test-Path (Join-Path $bin 'rg.exe'))){ [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $r=Invoke-RestMethod 'https://api.github.com/repos/BurntSushi/ripgrep/releases/latest' -Headers @{'User-Agent'='pi-setup'}; $a=$r.assets | Where-Object { $_.name -like '*x86_64-pc-windows-msvc.zip' } | Select-Object -First 1; $z=Join-Path $env:TEMP $a.name; Invoke-WebRequest $a.browser_download_url -OutFile $z -UseBasicParsing; $d=Join-Path $env:TEMP ('rg_'+[guid]::NewGuid()); Expand-Archive $z $d -Force; Copy-Item (Get-ChildItem $d -Recurse -Filter 'rg.exe' | Select-Object -First 1).FullName $bin -Force; Remove-Item $z,$d -Recurse -Force }"
if not exist "%PI_BIN_DIR%\rg.exe" ( color 0c & echo ripgrep の事前配置に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

powershell -NoProfile -Command "$ErrorActionPreference='Stop'; $bin='C:\pi\pi-agent\bin'; if(-not (Test-Path (Join-Path $bin 'fd.exe'))){ [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $r=Invoke-RestMethod 'https://api.github.com/repos/sharkdp/fd/releases/latest' -Headers @{'User-Agent'='pi-setup'}; $a=$r.assets | Where-Object { $_.name -like '*x86_64-pc-windows-msvc.zip' } | Select-Object -First 1; $z=Join-Path $env:TEMP $a.name; Invoke-WebRequest $a.browser_download_url -OutFile $z -UseBasicParsing; $d=Join-Path $env:TEMP ('fd_'+[guid]::NewGuid()); Expand-Archive $z $d -Force; Copy-Item (Get-ChildItem $d -Recurse -Filter 'fd.exe' | Select-Object -First 1).FullName $bin -Force; Remove-Item $z,$d -Recurse -Force }"
if not exist "%PI_BIN_DIR%\fd.exe" ( color 0c & echo fd の事前配置に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

icacls "%PI_AGENT_DIR%" /grant "Users:(OI)(CI)M" /T >nul

REM ===== 検証1: 設定ファイルの存在 =====
if exist "%PI_AGENT_DIR%\models.json" (echo [OK] models.json) else (echo [NG] models.json が作成されていません)
if exist "%PI_AGENT_DIR%\settings.json" (echo [OK] settings.json) else (echo [NG] settings.json が作成されていません)

REM ===== 検証2: Ollama 側に該当モデルが存在するか =====
powershell -NoProfile -Command "try{ $t=Invoke-RestMethod 'http://localhost:11434/api/tags' -TimeoutSec 5 }catch{ Write-Host '[NG] Ollama に接続できません (http://localhost:11434)'; exit 1 }; $ids=@($t.models.name); Write-Host ('[INFO] Ollama 上のモデル: '+($ids -join ', ')); if($ids -contains 'qwen38-27b-code:latest'){ Write-Host '[OK] models.json のモデル ID は Ollama 上に存在します' } else { Write-Host '[NG] models.json のモデル ID は Ollama 上に存在しません' }"

REM ===== 検証3: Pi がモデル定義を認識しているか =====
pi --list-models "%PI_MODEL_ID%" 2>nul | findstr /i /c:"%PI_MODEL_ID%" >nul
if "%ERRORLEVEL%"=="0" (echo [OK] Pi がモデル定義を認識しています) else (echo [NG] Pi がモデル定義を認識していません)

REM ===== 検証4: 既定モデルでの応答(settings.json の指定が有効か) =====
pi -p "Reply with OK only."
if "%ERRORLEVEL%"=="0" (echo [OK] 既定モデルでの応答を確認しました) else (echo [NG] 既定モデルでの応答に失敗しました)

REM ===== 検証5: モデルを明示指定した応答 =====
pi -p --model %PI_PROVIDER_ID%/%PI_MODEL_ID% "Reply with OK only."
if "%ERRORLEVEL%"=="0" (echo [OK] 明示指定モデルでの応答を確認しました) else (echo [NG] 明示指定モデルでの応答に失敗しました)

REM =================================
set "INSTALL_DIR=C:\UnslothDesktop"
set "INSTALLER_URL=https://github.com/unslothai/unsloth/releases/latest/download/Unsloth-Desktop-Windows.exe"
set "INSTALLER_PATH=%TEMP%\Unsloth-Desktop-Windows.exe"
set "MAIN_EXE=unsloth_studio.exe"
set "ALLUSERS_STARTMENU=%ProgramData%\Microsoft\Windows\Start Menu\Programs"
echo [1/5] インストーラーをダウンロード中...
curl -L --fail -o "%INSTALLER_PATH%" "%INSTALLER_URL%"
if exist "%INSTALLER_PATH%" (echo   -^> ダウンロード完了: %INSTALLER_PATH%) else (echo [エラー] ダウンロードに失敗しました)
echo [2/5] サイレントインストールを実行中(%INSTALL_DIR% へ)...
start /wait "" "%INSTALLER_PATH%" /S /D=%INSTALL_DIR%
echo   -^> インストーラーの処理が完了しました
echo [3/5] インストール結果を確認中...
if exist "%INSTALL_DIR%\%MAIN_EXE%" (echo   -^> 確認OK: %INSTALL_DIR%\%MAIN_EXE%) else (echo [失敗] 実行ファイルが見つかりません: %INSTALL_DIR%\%MAIN_EXE%)
echo [4/5] 全ユーザー向けのアクセス権限を追加中...
icacls "%INSTALL_DIR%" /grant *S-1-5-32-545:(OI)(CI)RX /T
echo [5/5] 全ユーザー向けスタートメニューショートカットを作成中...
powershell -NoProfile -Command "$s = (New-Object -ComObject WScript.Shell).CreateShortcut('%ALLUSERS_STARTMENU%\Unsloth Desktop.lnk'); $s.TargetPath = '%INSTALL_DIR%\%MAIN_EXE%'; $s.WorkingDirectory = '%INSTALL_DIR%'; $s.Save()"
if exist "%ALLUSERS_STARTMENU%\Unsloth Desktop.lnk" (echo   -^> ショートカット作成OK) else (echo [警告] ショートカット作成に失敗しました)
if exist "%INSTALLER_PATH%" del /q "%INSTALLER_PATH%"
echo 完了: %INSTALL_DIR% にインストールされ、全ユーザーが利用可能です

REM =================================
REM numpy と PyTorch(CUDA 12.8 対応 wheel)等のインストール、pip キャッシュの削除
set "CUDA_TAG=cu128"
"%PYTHON%" -m pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo numpy / PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
"%PYTHON%" -m pip install -U --no-user scipy pillow pandas
if not "%ERRORLEVEL%"=="0" ( color 0c & echo scipy / pillow / pandas のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
"%PYTHON%" -m pip cache purge

echo インストール完了。

インストール確認のために次のコマンドを実行する。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM ============================================================

ECHO ------------------------------------------------------------
ECHO 1. ツール類の存在確認
ECHO ------------------------------------------------------------

where ollama && (echo [OK] Ollama) || (echo [NG] Ollama が見つかりません)
where git && (echo [OK] Git) || (echo [NG] Git が見つかりません)
where claude && (echo [OK] Claude Code) || (echo [NG] Claude Code が見つかりません)
where ollama-chat && (echo [OK] ollama-chat) || (echo [NG] ollama-chat が見つかりません)

REM Python パッケージ
set "PYTHON=C:\Program Files\Python312\python.exe"
python -c "import torch; print('[OK] PyTorch', torch.__version__, '/ CUDA', torch.cuda.is_available())" || echo [NG] PyTorch がインストールされていません

ECHO ------------------------------------------------------------
ECHO 2. スタートメニューのショートカット確認
ECHO ------------------------------------------------------------

set "CM=%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs"
set "CP=%ProgramData%\Microsoft\Windows\Start Menu\Programs"

REM CommonPrograms(winget install 等で配置されるもの)
for %F in (
    "%CM%\Ollama gemma4.lnk"
    "%CM%\Ollama Qwen3.8-27B.lnk"
) do (
    if exist %F (echo [OK] %~nxF) else (echo [NG] %~nxF が見つかりません)
)

ECHO ------------------------------------------------------------
ECHO 3. Ollama モデル一覧
ECHO ------------------------------------------------------------
ollama list

REM ============================================================
ECHO LLM 動作テスト(Ollama CLI)
REM ============================================================

REM サンプル画像
cd %TEMP%
curl -L -o bus.jpg https://ultralytics.com/images/bus.jpg

REM Gemma 4 26B-A4B (Google DeepMind)
ollama run gemma4:26b "日本国憲法を400文字で説明して"
ollama run gemma4:26b "この画像には何が写っていますか?" "%TEMP%\bus.jpg"
ollama run gemma4:26b "「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください"

REM qwen3.6 35B
ollama run qwen3.6:35b-a3b "日本国憲法を400文字で説明して"

REM qwen3-vl:8b
ollama run qwen3-vl:8b "この画像には何が写っていますか?" "%TEMP%\bus.jpg"

REM Qwen3-Coder 30B-A3B (Alibaba / Qwen Team)
ollama run qwen3-coder:30b "「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください"

REM CyberAgent DeepSeek-R1-Distill-Qwen-14B-Japanese (yuma, Q4_K_M)
ollama run yuma/DeepSeek-R1-Distill-Qwen-Japanese:14b "「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください"

REM qwen38-27b-code
ollama run qwen38-27b-code "「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください"

REM ============================================================
ECHO LLM 動作テスト(OpenAI互換API経由)
REM ============================================================

cd %TEMP%
curl -L -o bus.jpg https://ultralytics.com/images/bus.jpg

REM Gemma 4 26B-A4B (Google DeepMind)
python -c "from openai import OpenAI; c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='gemma4:26b',messages=[{'role':'user','content':'日本国憲法を400文字で説明して'}]); print(r.choices[0].message.content)"
python -c "from openai import OpenAI; import base64,os; img=base64.b64encode(open(os.path.join(os.environ['TEMP'],'bus.jpg'),'rb').read()).decode(); c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='gemma4:26b',messages=[{'role':'user','content':[{'type':'image_url','image_url':{'url':f'data:image/jpeg;base64,{img}'}},{'type':'text','text':'この画像には何が写っていますか?'}]}]); print(r.choices[0].message.content)"
python -c "from openai import OpenAI; c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='gemma4:26b',messages=[{'role':'user','content':'「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください'}]); print(r.choices[0].message.content)"

REM qwen3.6 35B
python -c "from openai import OpenAI; c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='qwen3.6:35b-a3b',messages=[{'role':'user','content':'日本国憲法を400文字で説明して'}]); print(r.choices[0].message.content)"

REM qwen3-vl:8b
python -c "from openai import OpenAI; import base64,os; img=base64.b64encode(open(os.path.join(os.environ['TEMP'],'bus.jpg'),'rb').read()).decode(); c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='qwen3-vl:8b',messages=[{'role':'user','content':[{'type':'image_url','image_url':{'url':f'data:image/jpeg;base64,{img}'}},{'type':'text','text':'この画像には何が写っていますか?'}]}]); print(r.choices[0].message.content)"

REM Qwen3-Coder 30B-A3B (Alibaba / Qwen Team)
python -c "from openai import OpenAI; c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='qwen3-coder:30b',messages=[{'role':'user','content':'「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください'}]); print(r.choices[0].message.content)"

REM CyberAgent DeepSeek-R1-Distill-Qwen-14B-Japanese (yuma)
python -c "from openai import OpenAI; c=OpenAI(base_url='http://localhost:11434/v1',api_key='ollama'); r=c.chat.completions.create(model='yuma/DeepSeek-R1-Distill-Qwen-Japanese:14b',messages=[{'role':'user','content':'「125」のように、各桁の数字が左から右に向かってすべて大きくなっているかを判定するコードをください'}]); print(r.choices[0].message.content)"

【AI モデルとモデルファイル(Modelfile)の決め方】

ここでの設定では、モデルファイル(Modelfile)は、AI モデルごとに 1 つ作成する。同じ AI モデルを複数の用途で使う場合も、同じモデルファイルを使い、用途ごとに別の名前では登録しない。これは、運用を簡略化するためである。

モデルファイルの設定は、モデル提供元の推奨値(top_k は gemma4 系が 64、Qwen 系が 20 など)と、VRAM 16GB という前提(num_ctx の設定に関係する)に基づいて決める。

AI モデル名 登録名 Modelfile のファイル名 thinking への対応
gemma4:12b-it-qat gemma4-12b Modelfile.gemma4-12b 対応している
smtek/Qwen3.8-27B:Q3_K_M qwen38-27b Modelfile.qwen38-27b 対応している
smtek/Qwen3.8-27B:Q2_K_XL-16gb qwen38-27b-code Modelfile.qwen38-27b-code 対応している
qwen3-vl:8b qwen3vl-8b Modelfile.qwen3vl-8b 非thinkingモデルを使用
kahnwong/nanonets-ocr2:3b nanonets-ocr2-3b Modelfile.nanonets-ocr2-3b 対応していない
gemma-4-12b-it(GGUF) gemma4-12b-audio Modelfile.gemma4-12b-audio 対応していない

パラメータの説明

書き方の決まり:値=公式または実測の値。記載無し=公式の資料に値が書かれていない。未設定=モデル側に値が入っておらず、Ollama 全体の既定値が使われる。未確認=まだ実測していない。実測値は ollama show --parameters の出力。
AI モデル名(登録名) パラメータ 公式推奨(thinking) 公式推奨(非 thinking) Ollama の既定値(実測)
共通の出典 「Ollama の既定値」列に出てくる Ollama 全体の既定値(num_ctx 2048、temperature 0.8、top_k 40、top_p 0.9、min_p 0.0、repeat_penalty 1.0、num_predict −1)と、presence_penalty・num_batch が有効値の一覧に載っていないこと:https://docs.ollama.com/modelfile
コンテキストウィンドウの既定値を 4096 とする記述:https://docs.ollama.com/faq
gemma4:12b-it-qat
(gemma4-12b)
num_ctx 記載無し(上限 256K) 記載無し(上限 256K) 未設定(Ollama 既定 2048。ただし FAQ は 4096 と書き、公式内で数値が違う)
temperature1.01.01
top_p0.950.950.95
top_k646464
min_p記載無し記載無し未設定(Ollama 既定 0.0)
repeat_penalty記載無し記載無し未設定(Ollama 既定 1.0)
presence_penalty記載無し記載無し未設定(Ollama の既定値も記載無し)
num_predict記載無し記載無し未設定(Ollama 既定 −1)
num_batch記載無し記載無し未設定(Ollama の既定値も記載無し)
公式カードは thinking と非 thinking を分けず、上の 3 つを「どの用途でも同じ設定」として示す。thinking の切り替えは system プロンプト先頭の <|think|> トークンで行い、値の違いは示されていない。
出典 Google「Gemma 4 12B it」モデルカード(Best Practices「1. Sampling Parameters」「2. Thinking Mode Configuration」、Dense Models 表のコンテキスト長):https://huggingface.co/google/gemma-4-12B-it
既定値の列は実測(ollama show --parameters)
Modelfile
FROM gemma4:12b-it-qat
PARAMETER num_ctx 65536
smtek/Qwen3.8-27B:Q3_K_M
(qwen38-27b)
num_ctx 262,144(YaRN で最大 1,000,000) 262,144(YaRN で最大 1,000,000) 147456
temperature1.00.70.6
top_p0.950.800.95
top_k202020
min_p0.00.00
repeat_penalty1.0(repetition_penalty)1.0(repetition_penalty)1
presence_penalty0.01.50
num_predict推論部 262,144 / 最終出力 131,072推論部 262,144 / 最終出力 131,072−1
num_batch記載無し記載無し512
stop は実測で <|im_start|> と <|im_end|> の 2 つ。draft_num_predict は実測 4(MTP 用の設定と合う)。配布側の temperature 0.6 は Qwen 公式の thinking 推奨 1.0 と違う。num_ctx の 1,000,000 は YaRN を使った場合の値で、公式カードは「静的 YaRN のため短い文章では性能が落ちることがあり、長文が必要なときだけ設定を変えるべき」と注意している。presence_penalty は 0 から 2 の間で調整してよいが、高くすると言語が混ざることがある、とも書かれている。
出典 Qwen「Qwen3.8-27B」モデルカード(Best Practices の 1〜3、Model Overview のコンテキスト長):https://huggingface.co/Qwen/Qwen3.8-27B
smtek「Qwen3.8-27B」配布ページ(PARAMETER 一覧、タグ別のコンテキスト、MTP の draft_num_predict):https://ollama.com/smtek/Qwen3.8-27B
既定値の列は実測(ollama show --parameters)
Modelfile
FROM smtek/Qwen3.8-27B:Q3_K_M
PARAMETER num_ctx 32768
smtek/Qwen3.8-27B:Q2_K_XL-16gb
(qwen38-27b-code)
num_ctx 262,144(YaRN で最大 1,000,000) 262,144(YaRN で最大 1,000,000) 224840
temperature1.00.70.6
top_p0.950.800.95
top_k202020
min_p0.00.00
repeat_penalty1.0(repetition_penalty)1.0(repetition_penalty)1
presence_penalty0.01.50
num_predict推論部 262,144 / 最終出力 131,072推論部 262,144 / 最終出力 131,072−1
num_batch記載無し記載無し512
stop は実測で <|im_start|> と <|im_end|> の 2 つ、draft_num_predict は実測 4。公式推奨は量子化で変わらないため、上流の公式カードの値をそのまま書いた。num_ctx の 1,000,000 についての注意は上の行と同じ。
出典 Qwen「Qwen3.8-27B」モデルカード(Best Practices の 1〜3、Model Overview のコンテキスト長):https://huggingface.co/Qwen/Qwen3.8-27B
smtek「Qwen3.8-27B」配布ページ(PARAMETER 一覧、タグ別のコンテキスト):https://ollama.com/smtek/Qwen3.8-27B
既定値の列は実測(ollama show --parameters)
Modelfile
FROM smtek/Qwen3.8-27B:Q2_K_XL-16gb
PARAMETER num_ctx 128000
PARAMETER num_predict 40000
PARAMETER repeat_penalty 1.02
Claude Code
"env": {
    "ANTHROPIC_BASE_URL": "http://localhost:11434",
    "ANTHROPIC_AUTH_TOKEN": "ollama",
    "ANTHROPIC_MODEL": "MODEL_NAME",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "MODEL_NAME",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "MODEL_NAME",
    "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "40000",
    "CLAUDE_CODE_AUTO_COMPACT_WINDOW": "128000"
  }
pi model.json
"ollama": {
      "baseUrl": "http://localhost:11434/v1",
      "api": "openai-completions",
      "apiKey": "ollama",
      "models": [{
        "id": "MODEL_NAME",
        "name": "Local Coder",
        "reasoning": true,
        "input": ["text"],
        "contextWindow": 128000,
        "maxTokens": 40000,
        "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
        "compat": { "supportsDeveloperRole": false, "supportsReasoningEffort": true }
      }]
    }
qwen3-vl:8b
(qwen3vl-8b)
num_ctx 記載無し 記載無し 未設定(Ollama 既定 2048。ただし FAQ は 4096 と書き、公式内で数値が違う)
temperature1.00.71
top_p0.950.80.95
top_k202020
min_p記載無し記載無し未設定(Ollama 既定 0.0)
repeat_penalty1.0(repetition_penalty)1.0(repetition_penalty)未設定(Ollama 既定 1.0)
presence_penalty0.01.5未設定(Ollama の既定値も記載無し)
num_predict40,960(VL 用 out_seq_length)16,384(VL 用 out_seq_length)未設定(Ollama 既定 −1)
num_batch記載無し記載無し未設定(Ollama の既定値も記載無し)
非 thinking の列は Instruct 版の値。公式カードの Generation Hyperparameters には VL 用と Text 用の 2 種類があり、この表は VL 用。Text 用は thinking が top_p 0.95 / top_k 20 / presence_penalty 1.5 / out_seq_length 32,768、Instruct が temperature 1.0 / top_p 1.0 / top_k 40 / presence_penalty 2.0 / out_seq_length 32,768。qwen3-vl:8b はレジストリ上でモデル層が 8b-thinking と同じもの(8b-instruct は別)なので、実測値が thinking 側の推奨と一致する。
出典 Qwen「Qwen3-VL-8B-Thinking」モデルカード(Generation Hyperparameters):https://huggingface.co/Qwen/Qwen3-VL-8B-Thinking
Qwen「Qwen3-VL-8B-Instruct」モデルカード(Generation Hyperparameters):https://huggingface.co/Qwen/Qwen3-VL-8B-Instruct
モデル層が 8b-thinking と同じで 8b-instruct とは違うこと(レジストリのマニフェスト):https://registry.ollama.ai/v2/library/qwen3-vl/manifests/8b …/8b-thinking …/8b-instruct
既定値の列は実測(ollama show --parameters)
Modelfile
FROM qwen3-vl:8b
PARAMETER num_ctx 65536
kahnwong/nanonets-ocr2:3b
(nanonets-ocr2-3b)
num_ctx 記載無し 4096
temperature記載無し(公式のコード例の値は、transformers が do_sample=False、vLLM が 0.0)未設定(Ollama 既定 0.8)
top_p記載無し未設定(Ollama 既定 0.9)
top_k記載無し未設定(Ollama 既定 40)
min_p記載無し未設定(Ollama 既定 0.0)
repeat_penalty1(repetition_penalty=1。複雑な表で精度が上がるという条件付きの推奨)未設定(Ollama 既定 1.0)
presence_penalty記載無し未設定(Ollama の既定値も記載無し)
num_predict記載無し(公式のコード例の値は max_new_tokens 4,096 と 15,000、vLLM が max_tokens 15,000)未設定(Ollama 既定 −1)
num_batch記載無し未設定(Ollama の既定値も記載無し)
OCR 用のモデルで、thinking と非 thinking の区別が無いため、公式推奨は 1 つの欄にまとめた。stop は実測で <|im_end|> の 1 つ。temperature 0.0 は公式のサンプルコードの値で、独立した推奨として書かれてはいない。
出典 Nanonets「Nanonets-OCR2-3B」モデルカード(Usage の transformers・vLLM のコード例、Tips to improve accuracy の 2 番):https://huggingface.co/nanonets/Nanonets-OCR2-3B
既定値の列は実測(ollama show --parameters)
Modelfile
FROM kahnwong/nanonets-ocr2:3b
PARAMETER num_ctx 65536
gemma-4-12b-it(GGUF)
(gemma4-12b-audio)
num_ctx 記載無し(上限 256K) 記載無し(上限 256K) 未確認
temperature1.01.0未確認
top_p0.950.95未確認
top_k6464未確認
min_p記載無し記載無し未確認
repeat_penalty記載無し記載無し未確認
presence_penalty記載無し記載無し未確認
num_predict記載無し記載無し未確認
num_batch記載無し記載無し未確認
この行は GGUF からローカルで作る想定である。音声に対応するのは 12B・E2B・E4B のみで、音声は最長 30 秒、動画は 1 秒あたり 1 コマで処理する場合に最長 60 秒。公式カードの Best Practices は、画像はテキストの前、音声はテキストの後に置くよう指示している。
出典 Google「Gemma 4 12B it」モデルカード(Best Practices「1. Sampling Parameters」「4. Modality order」「7. Audio and Video Length」、Dense Models 表のコンテキスト長と対応モダリティ):https://huggingface.co/google/gemma-4-12B-it
Modelfile
FROM gemma-4-12b-it
PARAMETER num_ctx 65536

【概要】

LLM(大規模言語モデル)を手元のPCで動かす。対象はWindows、前提とするGPUのVRAMは16GBである。モデルをダウンロードしたあとは、インターネットにつながっていなくても対話・文書処理・画像理解を実行でき、入力したデータが外部に出ることはない。

使い方は2通りある。PythonなどからHTTP APIを呼び出す方法と、OllamaのCLIやGUIで対話する方法である。前者は、AIアシスタントの開発、RAG、Web拡張検索などで使う。Web拡張検索のときだけ、検索のために外部と通信する。

用途ごとのモデルは次のとおりである。日本語の対話・文書推敲(HTMLを含む)・翻訳・推論過程を伴う思考には、gemma4:12b-it-qat(登録名 gemma4-12b)を既定とする。品質を優先して生成速度の低下を許容できるときだけ、smtek/Qwen3.8-27B:Q3_K_M(qwen38-27b)に替える。プログラミング、および日本語の指示からPythonコードの設計・実装・テストまで進めるエージェント型コーディングCLI(Claude Code、OpenClaw など)の接続先には、smtek/Qwen3.8-27B:Q2_K_XL-16gb(qwen38-27b-code)を使う。画像理解には gemma4:12b-it-qat を使う。画像から数式・グラフ・日本語を読み取るには qwen3-vl:8b(qwen3vl-8b)、帳票のOCRには kahnwong/nanonets-ocr2:3b(nanonets-ocr2-3b)を使う。日本語音声の書き起こしと翻訳には、gemma-4-12b-it のGGUFとプロジェクタ(mmproj)を自分でOllamaに取り込み、gemma4-12b-audio として登録する。音声は1回30秒までである。

gemma4系は2つ登録する。gemma4:12b-it-qat(登録名 gemma4-12b)は対話・文書推敲・翻訳・思考・画像理解に使い、gemma-4-12b-it のGGUF(登録名 gemma4-12b-audio)は音声の書き起こしと翻訳に使う。もとは同じモデルだが、Ollama公式タグには音声用のプロジェクタ(mmproj)が含まれないため、音声用は別に取り込んで登録する必要があり、両方を登録する。

モデルはいずれも量子化版を使うが、形式はモデルごとに違う。gemma4:12b-it-qat は量子化を前提に学習したQAT版、smtek/Qwen3.8-27B の latest と Q3_K_XL、および音声用の gemma-4-12b-it は unsloth の動的量子化(UD)版、kahnwong/nanonets-ocr2:3b は Q8_0 である。いずれもDense型であり、推論のたびに全パラメータが働く。パラメータ数は、gemma4:12b-it-qat と gemma-4-12b-it が11.95B、smtek/Qwen3.8-27B が27B、qwen3-vl:8b が8.77B、kahnwong/nanonets-ocr2:3b が3.75B である。

VRAM 16GBへの収まり方は3通りに分かれる。gemma4:12b-it-qat(7.2GB)、gemma-4-12b-it(約7GB)、qwen3-vl:8b(6.1GB)、kahnwong/nanonets-ocr2:3b(4.6GB)は、いずれも余裕をもって収まる。smtek/Qwen3.8-27B:Q2_K_XL-16gb(13.4GB)は、ほかのアプリがVRAMを使っていなければ収まる。起動しない場合は、smtek/Qwen3.8-27B:Q3_K_M(13.8GB、コンテキスト長24K、Textのみ入力)に切り替える。Q3_K_M はファイルサイズこそ Q3_K_XL より大きいが、プロジェクタ(mmproj)を持たず、コンテキスト長も24Kに抑えられているため、必要なVRAMは小さい。smtek/Qwen3.8-27B:Q3_K_M(重み17.9GB)は収まらず、一部がメインメモリに置かれるため生成速度が大きく落ちる。

ディスクは70GB以上空けておく。内訳は、gemma4:12b-it-qat、smtek/Qwen3.8-27B:Q3_K_M、smtek/Qwen3.8-27B:Q2_K_XL-16gb、qwen3-vl:8b、kahnwong/nanonets-ocr2:3b の5モデルで約49GB、音声用に取り込む gemma-4-12b-it のGGUFで約7GB、Ollama本体で約4GBである。このほかに、予備のタグやダウンロード中の一時ファイルの分も見込んでおく。

実行環境にはOllamaを使う。HTTPサーバーとして localhost:11434 で動く。qwen3-vl 系は Ollama 0.12.7 以降でなければ動かない。コンテキスト長は、gemma4-12b、gemma4-12b-audio、qwen3vl-8b を65536、qwen38-27b、qwen38-27b-code、nanonets-ocr2-3b を32768にする。KVキャッシュは q8_0 に量子化する。そのために、ユーザー環境変数 OLLAMA_FLASH_ATTENTION=1 と OLLAMA_KV_CACHE_TYPE=q8_0 を設定する。あわせて OLLAMA_MAX_LOADED_MODELS=2 を設定する。Ollamaは一度使ったモデルをしばらくVRAMに保持するため、この設定だけでは足りない場合がある。たとえば音声を使った直後に文書推敲を始めると、約7GBのモデルが2つ同時にVRAMへ載り、KVキャッシュを加えて16GBを超える。そこでこの環境変数により同時に載せるモデルを1つに制限し、切り替え時に前のモデルを解放する。環境変数はすでに動いているプロセスには届かないため、タスクトレイのOllamaをいったん終了し、起動し直す。

設定するユーザー環境変数は次の3つである。

setx OLLAMA_FLASH_ATTENTION 1
setx OLLAMA_KV_CACHE_TYPE q8_0
setx OLLAMA_MAX_LOADED_MODELS 2

【複数のモデルを使うとき】

OLLAMA_MAX_LOADED_MODELS が数えるのは登録したモデルの数で、ファイル数ではない。本体GGUFとプロジェクタ(mmproj)は合わせて1つと数える。値を2にするのはRAGのためであり、2つ目の枠は埋め込みモデル(1GB程度)専用とする。表の大きいモデルどうしは2つ同時に載らず、片方がメインメモリに置かれて生成速度が大きく落ちる。ollama ps の PROCESSOR が 100% GPU でなければ、この状態が起きている。

GGUF形式のモデル本体は、%USERPROFILE%\.ollama\models\blobs の下に、sha256- で始まるハッシュ名(拡張子なし)で保存される。保存先は環境変数 OLLAMA_MODELS で変えられる。llama.cpp はファイル先頭の数バイト(マジックナンバー)でGGUFかどうかを判断するため、拡張子がなくてもこのパスをそのまま指定でき、同じファイルを二重にダウンロードせずに済む。ただし画像や音声を扱うときは、プロジェクタ(mmproj)が別のファイルとして保存されている点に注意する。

【この文書の読み方】

各モデルのパラメータ値とその根拠(公式推奨値、実測値、出典)、およびVRAM 16GBへの収まり方は、別紙の一覧表にモデルごとに1組だけまとめてある。同じモデルを複数の用途で使う場合も、Modelfile・登録名・パラメータ値は共通であり、用途による違いはModelfileではなく実行時の指定(思考モードの切り替え、プロンプトの組み立て)で吸収する。この文書では、その一覧表の内容を前提として、「用途別の使い分けと操作手順」「ソフトウェア」「AIモデルの概要」の3つの表で、用途ごとの選び方と操作手順、関連ソフトウェアの導入方法、各モデルの位置づけを示す。

用途別の使い分けと操作手順

用途 モデル(登録名) 選び方・切り替えの目安 操作手順 出典
日本語の対話・文書推敲・翻訳
推論過程を伴う思考
既定:gemma4-12b
代替:qwen38-27b
既定はgemma4-12bとする。品質を優先して生成速度の低下を許容できる場合のみqwen38-27bに切り替える。qwen38-27bで画像も扱いたい場合は、プロジェクタ(mmproj)を同梱したsmtek/Qwen3.8-27B:Q4_K_XLを使う。Ollamaにはllama.cppの--mmprojに相当する個別指定がなく、プロジェクタの有無はタグの選択で決まる 思考モードの切り替え(gemma4-12b)
有効化はollama run gemma4-12b --think、対話中は/set think、APIでは"think": true。無効化は--think=falseまたは/set nothink。Ollamaがチャットテンプレートを組み立てるため、Googleのモデルカードにある<|think|>トークンを直接書く必要はない

思考の深度調整(qwen38-27b)
Qwen系の公式reasoning_effortは既定がxhighで、medium/lowの指定もできる。Ollamaのthinkフィールドはlow/medium/high/maxを受け付ける。思考が長引きコンテキストを使い切る場合はollama run qwen38-27b --think=lowで深度を下げる
https://docs.ollama.com/capabilities/thinking
プログラミング
エージェント型コーディングCLIの接続先
(Claude Code、OpenClaw など)
qwen38-27b-code qwen38-27b-codeは、ほかのアプリがVRAMを使っていない状態が前提となる。起動しない場合や、より長いコンテキスト長が必要な場合の代替タグは後掲のAIモデル概要を参照する 対話で使う場合
思考が長引きコンテキストを使い切る場合はollama run qwen38-27b-code --think=mediumで深度を下げる

コーディングCLIの接続先として使う場合
OpenAI互換APIではhttp://localhost:11434/v1、Claude CodeのAnthropic互換APIではANTHROPIC_BASE_URL=http://localhost:11434を指定する。CLIに渡すモデル名はqwen38-27b-code。思考が長引く場合はAPI呼び出しで"think": "medium"を指定する。コンテキスト長を超える作業はCLI側の自動要約に任せる
https://docs.ollama.com/capabilities/thinking
https://docs.openclaw.ai/gateway/local-models
画像理解(一般) gemma4-12b 「日本語の対話・文書推敲・翻訳」と共通のモデルをそのまま使う。小さい文字の読み取りで精度が足りない場合は、qwen3vl-8bまたはnanonets-ocr2-3bに切り替える プロンプトでは画像をテキストより前に置く https://ai.google.dev/gemma/docs/core/model_card_4
画像から数式・グラフ・日本語を読み取る qwen3vl-8b OCRは32言語に対応し、低照度・ぼけ・傾きのある画像に強い 画像入力時はpresence_penaltyを0.0として扱う(一覧表のText用推奨1.5とは異なる) https://huggingface.co/Qwen/Qwen3-VL-8B-Thinking
帳票のOCR nanonets-ocr2-3b 表をHTML、数式をLaTeXに変換し、チェックボックスや署名も検出できる。同一の数値・単位・記号やHTMLタグが正当に反復するため、repeat_penaltyを1.0より大きくすると値の脱落や書き換えが起きる システムプロンプトはYou are a helpful assistant.とし、出力形式(HTML化する表、LaTeX化する数式など)を明示するプロンプトを与える https://ollama.com/kahnwong/nanonets-ocr2
日本語音声の書き起こしと翻訳 gemma4-12b-audio Ollama公式タグのgemma4-12bには音声用プロジェクタ(mmproj)が含まれないため、Hugging Faceから重みとプロジェクタを取得して別途登録する(ollama pullは使わない) 手順1:重みとプロジェクタを同じディレクトリに取得する
pip install -U huggingface_hub
hf download unsloth/gemma-4-12b-it-GGUF --include "*UD-Q4_K_XL*" --local-dir gemma4-audio
hf download unsloth/gemma-4-12b-it-GGUF --include "mmproj-BF16.gguf" --local-dir gemma4-audio
実際にダウンロードされたファイル名はdir gemma4-audioで確認する

手順2:Modelfile.gemma4-12b-audioを作成する
重みとプロジェクタはFROMを2行書いて結合する(ディレクトリ指定はsafetensorsを取り込む書式であり、GGUFではファイルを直接指定する)
FROM ./gemma4-audio/gemma-4-12b-it-UD-Q4_K_XL.gguf
FROM ./gemma4-audio/mmproj-BF16.gguf
PARAMETER num_ctx 65536
手順3:モデルを登録する
ollama create gemma4-12b-audio -f Modelfile.gemma4-12b-audio

手順4:音声を16kHzモノラルのWAVに変換する
ffmpeg -i input.mp3 -ar 16000 -ac 1 audio.wav

手順5:WAVをbase64に符号化し、/api/chatのimages配列で渡す
モデル名にはgemma4-12b-audioを指定し、あわせて"think": falseを指定する。思考モードを有効にしたまま音声を渡すと、出力がthinkingフィールドに入りcontentが空になる。プロンプトではGoogleのASRテンプレートを使い、音声をテキストより前に置く

この2行FROM方式はモデルによってプロジェクタが読み込まれない報告があるため、実際に音声を1本渡して書き起こしが返ることを確認してから運用する。llama.cppで動かす場合はllama-server -hf unsloth/gemma-4-12b-it-GGUF:UD-Q4_K_XL --jinjaでプロジェクタが自動取得され、OpenAI互換APIのinput_audioで音声を渡せる
https://huggingface.co/unsloth/gemma-4-12b-it-GGUF
https://github.com/ollama/ollama/issues/16584

Modelfileはメモ帳などで編集して保存する。基盤タグに焼き込み済みのパラメータはollama show <タグ名> --parametersで確認できる。登録済みのモデルはollama listで確認できる。

ソフトウェア(アプリケーション・ライブラリ)

ソフトウェア種別説明用途備考
llama.cpp推論エンジン C/C++で実装されたローカルLLM推論エンジン。GGUF形式の量子化モデルを実行する。Ollamaも内部でこれを使っている。 ローカルLLM推論の基盤 ソースからビルドしてC:\llama.cppに配置し、C:\llama.cpp\binをPathに追加する。ビルドにはVisual Studio Build Tools 2026(C:\Program Files\Microsoft Visual Studio\18\BuildTools、v145ツールセット、MSVC 14.51)、CUDA Toolkit、CMakeを使う。CUDA版をビルドする場合は-DGGML_CUDA=ONと-DCMAKE_CUDA_ARCHITECTURES="86;89;120"を指定する(値は使用するGPUの世代に合わせる)。Ollamaが取得済みのGGUFはパスを直接指定でき、同じファイルを再度ダウンロードする必要はない
Ollamaランタイム LLMを実行するランタイム。localhost:11434でHTTPサーバーとして動作し、外部のアプリからAPI経由で呼び出せる。 ローカルLLMの運用 wingetでインストールする(winget install Ollama.Ollama)。インストーラは管理者権限を必要とせず、既定ではユーザーのホームディレクトリにインストールされる。--custom "/DIR=C:\Ollama"で場所を変更できる。モデルの保存先はOLLAMA_MODELSで指定する。KVキャッシュの量子化(OLLAMA_FLASH_ATTENTION、OLLAMA_KV_CACHE_TYPE)と同時読み込み数の上限(OLLAMA_MAX_LOADED_MODELS)の設定手順は一覧表を参照する。OLLAMA_MAX_LOADED_MODELSの2つ目の枠はRAG用の埋め込みモデル(1GB程度)を想定しており、表の大きいモデルどうしは2つ同時に載らず、片方がメインメモリに置かれて生成速度が大きく落ちる。ollama psのPROCESSORが100% GPUでなければこの状態が起きている。OLLAMA_CONTEXT_LENGTHはコンテキスト長の既定値を指定する変数であり、Modelfileでnum_ctxを指定したモデルではModelfileの値が優先される。モデルは最後に使ってから既定で5分間VRAMに残る(OLLAMA_KEEP_ALIVEの既定値)。すぐに解放したい場合は、API呼び出しで"keep_alive": 0を指定する
ollama-chatUI pip install ollama-chatでインストールし、ollama-chatコマンドで起動するWebチャットUI。 チャットUI 起動すると既定のブラウザが開き、Ollamaに登録済みのモデルを選んで使う
Claude CodeCLIツール Anthropicのコーディング用CLIツール。コマンドラインからコードの生成・編集・実行を指示する。接続先としてローカルLLMを指定できる。 エージェント型コーディング wingetでインストールする(winget install Anthropic.ClaudeCode)。システム全体にインストールする場合は--scope machineを付け、管理者権限で実行する。ローカルLLMに接続する場合は、OllamaのAnthropic互換API(ANTHROPIC_BASE_URL=http://localhost:11434)を指定し、モデルにはqwen38-27b-codeを使う
PiAIハーネス
Unsloth Desktop

AIモデルの概要

モデルアーキテクチャ説明対応する用途(前掲の用途別ガイド)備考
gemma4:12b-it-qat
登録名 gemma4-12b
dense
11.95B
Google DeepMind開発のマルチモーダルモデル。テキストと画像を入力できる。コンテキスト長256K。思考モードとツール呼び出しに対応する。エンコーダを持たない統合アーキテクチャであり、画像パッチを線形層でLLMの埋め込み空間へ直接射影する。Apache 2.0ライセンス。 日本語の対話・文書推敲・翻訳、推論過程を伴う思考、画像理解 音声には対応しないため、音声用のgemma4-12b-audioも別に登録する
smtek/Qwen3.8-27B:Q3_K_M
登録名 qwen38-27b
dense
27B
Alibaba(Qwen Team)開発のモデル。Q3_K_XLと同じモデルを、より多いビット数で量子化した版で、量子化による精度の劣化が小さい。latestとQ4_K_XLは同一の4bit量子化で、テキスト性能は同一。latestはTextのみ入力、Q4_K_XLのみプロジェクタ(mmproj-F16)を同梱しText+Image入力に対応する。Apache 2.0ライセンス。 日本語の対話・文書推敲(品質を優先する場合) 重みはlatest・Q4_K_XLとも共通で、差は同梱プロジェクタの分のみである
smtek/Qwen3.8-27B:Q2_K_XL-16gb
登録名 qwen38-27b-code
dense
27B
Alibaba(Qwen Team)開発のsmtek/Qwen3.8-27Bシリーズのタグの1つ。unslothの動的量子化(UD)版を、コミュニティが登録したタグ。テキストと画像を入力できる。Apache 2.0ライセンス。 プログラミング、エージェント型コーディングCLI(Claude Code、OpenClaw など)の接続先 同シリーズには、プロジェクタを持たずコンテキスト長を抑えたQ3_K_M(Textのみ入力)や、2bit量子化でコンテキスト長を伸ばしたQ2_K_XL-16gbなど、VRAM 16GB向けの代替タグがある
qwen3-vl:8b
登録名 qwen3vl-8b
dense
8.77B
Alibaba(Qwen Team)開発のマルチモーダルモデル。画像を入力して内容を読み取る。OCRは32言語に対応する。このタグはThinking版である。 画像から数式・グラフ・日本語を読み取る Ollama 0.12.7以降が必要である
kahnwong/nanonets-ocr2:3b
登録名 nanonets-ocr2-3b
dense
3.75B
NanonetsのNanonets-OCR2-3BをOllama用に公開したもの。文書画像を構造化テキストに変換する。表をHTML、数式をLaTeXに変換し、チェックボックスと署名も検出する。 帳票のOCR、文書画像の構造化 量子化はQ8_0、アーキテクチャはqwen25vl。ollama pull kahnwong/nanonets-ocr2:3bで取得する(コミュニティが登録したタグ)
gemma-4-12b-it(GGUF)
登録名 gemma4-12b-audio
dense
11.95B
gemma4-12bと同じ基盤モデルの、音声入力にも対応する版。Ollama公式タグは音声用のプロジェクタ(mmproj)を含まないため、GGUFとプロジェクタを手動で取り込む。 日本語音声の書き起こしと翻訳 unslothの動的量子化(UD)版(UD-Q4_K_XL)。1回に渡せる音声は30秒までである。16kHzモノラルのWAVに変換して渡す

【前提条件】

以下は事前にインストールしておく。

以下は未インストールの場合にインストールコマンドが導入する。

5. ローカル生成AI(画像編)

【概要】

ローカルPC上で画像生成、画像編集、動画生成、音声合成、音声認識のAIモデルを動作させる。モデルの取得後は、生成と認識をインターネット接続なしで実行でき、入力データを外部に送信しない。ローカル実行のほかに、FLUX 1.1 Pro Ultra 等を https://api.bfl.ai/v1 のAPI経由で使うこともできる。この場合はインターネット接続と bfl.ai のアカウントが必要であり、画像1枚ごとの従量課金となることに注意。

テキストからの画像生成、指示文による画像編集、テキストや画像からの短い動画の生成、10言語の音声合成と短い音声サンプルからの声の複製、会議や講義の録音および動画の文字起こし、字幕データの作成を小ナウ。画像生成と動画生成は ComfyUI のGUIから操作する。、音声合成と音声認識は qwen-tts、faster-whisper をPythonライブラリとして呼び出すか、Buzz の画面から操作する。

前提はVRAM 16GB のNVIDIA製GPUである。GPUがない場合もCPUで動作するが、速度は大きく下がる。動作しなくなる場合がある。モデルの保存に C:\ComfyUI\models 配下で約67GB以上の空き容量を使う。

モデルは量子化版と軽量版を積極的に使う。z_image_turbo_bf16.safetensors、flux-2-klein-4b.safetensors、wan2.2_ti2v_5B_fp16.safetensors はVRAM内で動作する。qwen_image_edit_2511_fp8mixed.safetensors は約20.5GBを要するため、VRAMに収まらない層はメインメモリに置いて処理する。

画像生成には Z-Image TurboやFLUX.2 Klein 4Bを用いる。指示文による画像編集には Qwen-Image-Edit-2511を用いる。その他、動画生成には Wan2.2-TI2V-5B、音声合成には Qwen3-TTS、文字起こしをPythonから行う場合は faster-whisper、GUIで行う場合は Buzz を用いる。

ComfyUI は、C:\ComfyUI にインストールし、localhost:8188 でHTTPサーバーとして動作する。起動は次のコマンドで行う。

cd /d C:\ComfyUI
python main.py --use-sage-attention

--use-sage-attention を付けると、SageAttention がAttention演算を量子化して推論を速くする。この機能には triton-windows が必要であり、xformers はアンインストールする。GGUF 形式に量子化したモデルは ComfyUI-GGUF から読み込見込むことができる。カスタムノードの追加は ComfyUI-Manager から行うことができる。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。 wingetの--scope machineオプションでシステム全体にインストールするには、管理者権限が必要である。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM  前提条件:
REM    - Python 3.12 が C:\Program Files\Python312 にインストール済みであること
REM    - Google Chrome がインストール済みであること
REM    - NVIDIA GPU および CUDA 12.8 対応ドライバの利用を推奨
REM      (未搭載の場合は CPU モードで動作するが、
REM       画像生成・音声処理等は大幅に低速となる)
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Git
REM ============================================================
REM Git存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
if not exist "C:\Program Files\Git\cmd\git.exe" echo Git が見つかりません。インストールします... & winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=""icons,ext\reg\shellhere,assoc,assoc_sh"" /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled" & powershell -NoProfile -Command "$g='C:\Program Files\Git\cmd'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $g) -and (';'+$c+';' -notlike \"*;$g;*\")){[Environment]::SetEnvironmentVariable('Path',\"$g;$c\",'Machine')}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Git のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Git のパスを現在のセッションに反映
set "PATH=C:\Program Files\Git\cmd;%PATH%"

REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" echo [エラー] Python 3.12 のインストールに失敗しました
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s='C:\Program Files\Python312\Scripts'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $parts=$c -split ';'; $new=$c.TrimEnd(';'); if($parts -notcontains $p){$new=$new+';'+$p}; if($parts -notcontains $s){$new=$new+';'+$s}; $k.SetValue('Path',$new,$t); $k.Close()}"

REM Google Chrome存在チェック(未インストールの場合はシステム領域にインストール、自動更新無効化、パス設定)
set "NEED_CHROME=0"
if not exist "C:\Program Files\Google\Chrome\Application\chrome.exe" set "NEED_CHROME=1"
if "%NEED_CHROME%"=="1" winget install --scope machine --id Google.Chrome -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "NOGOOGLEUPDATEPING=1"
if "%NEED_CHROME%"=="1" if not "%ERRORLEVEL%"=="0" echo [エラー] Google Chrome のインストールに失敗しました
if "%NEED_CHROME%"=="1" powershell -NoProfile -Command "New-Item -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Name 'AutoUpdateCheckPeriodMinutes' -Value 0 -Type DWord; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Google\Update' -Name 'UpdateDefault' -Value 0 -Type DWord"
if "%NEED_CHROME%"=="1" powershell -NoProfile -Command "$p='C:\Program Files\Google\Chrome\Application'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM numpy, PyTorch をインストール
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo numpy / PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM  ComfyUI インストール
REM ============================================================
echo ComfyUIをインストール中...
pip uninstall -y xformers
pip install -U --no-user huggingface_hub
pip install -U --no-user triton-windows
pip install -U --no-user sageattention
pip install -U --no-user comfy-cli

REM ============================================================
pip install -U --no-user label-studio

if not "%ERRORLEVEL%"=="0" ( color 0c & echo huggingface_hub のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM xformers をインストールしているとComfyUIが動作しないという現象があった
pip uninstall -y xformers
if exist "C:\ComfyUI\.git" (cd /d C:\ComfyUI && git pull) else (git clone https://github.com/comfyanonymous/ComfyUI.git C:\ComfyUI)
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ComfyUI の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d C:\ComfyUI
pip install -U --no-user -r requirements.txtif not "%ERRORLEVEL%"=="0" ( color 0c & echo ComfyUI の依存パッケージのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM ComfyUI Manager, ComfyUI GGUF
if not exist "C:\ComfyUI\custom_nodes\ComfyUI-Manager\.git" git clone https://github.com/ltdrdata/ComfyUI-Manager C:\ComfyUI\custom_nodes\ComfyUI-Manager
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ComfyUI-Manager の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user -r C:\ComfyUI\custom_nodes\ComfyUI-Manager\requirements.txt
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ComfyUI-Manager の依存パッケージのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "C:\ComfyUI\custom_nodes\ComfyUI-GGUF\.git" git clone https://github.com/city96/ComfyUI-GGUF C:\ComfyUI\custom_nodes\ComfyUI-GGUF
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ComfyUI-GGUF の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user -r C:\ComfyUI\custom_nodes\ComfyUI-GGUF\requirements.txt
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ComfyUI-GGUF の依存パッケージのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist C:\ComfyUI\output mkdir C:\ComfyUI\output
icacls "C:\ComfyUI\output" /grant "Everyone:(OI)(CI)M" /T
REM 1. バッチファイルを作成
echo @echo off > "C:\ComfyUI\start.bat"
echo cd /d C:\ComfyUI >> "C:\ComfyUI\start.bat"
echo start python main.py --use-sage-attention >> "C:\ComfyUI\start.bat"
echo timeout /t 5 >> "C:\ComfyUI\start.bat"
echo start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" http://127.0.0.1:8188 >> "C:\ComfyUI\start.bat"
REM 2. ショートカットを作成
powershell -Command "$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ComfyUI.lnk'); $s.TargetPath = 'C:\ComfyUI\start.bat'; $s.WorkingDirectory = 'C:\ComfyUI'; $s.Description = 'ComfyUI'; $s.Save()"

REM ============================================================
REM  sox のインストール
REM ============================================================
if not exist "C:\Program Files (x86)\SoX" mkdir "C:\Program Files (x86)\SoX"
curl -L --fail -o "%TEMP%\SoX.zip" "https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SoX のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
tar -xf "%TEMP%\SoX.zip" -C "C:\Program Files (x86)\SoX" --strip-components=1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SoX の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
del "%TEMP%\SoX.zip"
powershell -NoProfile -Command "$p='C:\Program Files (x86)\SoX'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SoX の PATH 登録に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM  Qwen3-TTS インストール(音声合成)
REM ============================================================
echo Qwen3-TTSをインストール中...
pip install -U --no-user numba
pip install -U --no-user qwen-tts
if not "%ERRORLEVEL%"=="0" ( color 0c & echo qwen-tts のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM  faster-whisper インストール(音声認識)
REM ============================================================
echo faster-whisperをインストール中...
pip install -U --no-user faster-whisper
if not "%ERRORLEVEL%"=="0" ( color 0c & echo faster-whisper のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM  Buzz のインストール
REM ============================================================
if not exist "C:\Program Files (x86)\Buzz" mkdir "C:\Program Files (x86)\Buzz"
curl -L --fail -o "%TEMP%\Buzz.zip" "https://sourceforge.net/projects/buzz-captions/files/Buzz-1.4.4-Windows-X64.zip/download"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Buzz のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
tar -xf "%TEMP%\Buzz.zip" -C "C:\Program Files (x86)\Buzz"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Buzz の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
"C:\Program Files (x86)\Buzz\Buzz-1.4.4-windows.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Buzz のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
del "%TEMP%\Buzz.zip"
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut(\"$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Buzz.lnk\"); $l.TargetPath='C:\Program Files (x86)\Buzz\Buzz.exe'; $l.WorkingDirectory='C:\Program Files (x86)\Buzz'; $l.Save()"

REM ============================================================
REM  ComfyUI用モデルのダウンロード
REM ============================================================

REM ============================================================
REM ComfyUI モデル一括ダウンロードスクリプト(2026年5月10日修正版)
REM 合計:8ファイル 約46.93 GB
REM 対応:コマンドプロンプト直接貼付 / バッチファイル実行 両対応
REM 繰り返し実行可:存在ファイルはスキップ
REM 失敗時:部分ファイル自動削除(次回実行で完全再取得)
REM VRAM 16GB / RAM 32GB 制約に適合
REM ============================================================
REM [1] z_image_turbo_bf16.safetensors              12.31 GB  Z-Image Turbo 拡散モデル本体(高速画像生成)
REM [2] wan2.2_ti2v_5B_fp16.safetensors             10.00 GB  Wan2.2 TI2V-5B 拡散モデル本体(T2V/I2V 両対応)
REM [3] flux-2-klein-4b.safetensors                  7.75 GB  FLUX.2 Klein 拡散モデル本体(高品質画像生成)
REM [4] qwen_3_4b.safetensors                        8.04 GB  Qwen-3 4B テキストエンコーダ(Z-Image Turbo & FLUX.2 Klein 共用)
REM [5] umt5_xxl_fp8_e4m3fn_scaled.safetensors       6.74 GB  UMT5-XXL fp8 テキストエンコーダ(Wan2.2 用)
REM [6] ae.safetensors                               0.34 GB  Z-Image Turbo 用 VAE
REM [7] wan2.2_vae.safetensors                       1.41 GB  Wan2.2 用 VAE
REM [8] flux2-vae.safetensors                        0.34 GB  FLUX.2 Klein 用 VAE
REM ============================================================

REM === 1. モデル格納ディレクトリ作成 ===
if not exist "C:\ComfyUI\models\diffusion_models" mkdir "C:\ComfyUI\models\diffusion_models"
if not exist "C:\ComfyUI\models\text_encoders"    mkdir "C:\ComfyUI\models\text_encoders"
if not exist "C:\ComfyUI\models\vae"              mkdir "C:\ComfyUI\models\vae"
if not exist "C:\ComfyUI\models\loras"            mkdir "C:\ComfyUI\models\loras"

REM === 2-1. Z-Image Turbo 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" (
    echo [DL] z_image_turbo_bf16.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/diffusion_models/z_image_turbo_bf16.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] z_image_turbo_bf16.safetensors のダウンロードに失敗しました
) else (echo [SKIP] z_image_turbo_bf16.safetensors)

REM === 2-2. Z-Image Turbo DeJPEG LoRA(高解像度時のスペックルノイズ対策) ===
if not exist "C:\ComfyUI\models\loras\dejpeg_v3.safetensors" (
    echo [DL] dejpeg_v3.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\loras\dejpeg_v3.safetensors" "https://huggingface.co/wcde/Z-Image-Turbo-DeJPEG-Lora/resolve/main/dejpeg_v3.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] dejpeg_v3.safetensors のダウンロードに失敗しました
) else (echo [SKIP] dejpeg_v3.safetensors)

REM === 3. Qwen-Image-Edit-2511 拡散モデル(FP8 mixed / 20.5GB) ===
if not exist "C:\ComfyUI\models\diffusion_models\qwen_image_edit_2511_fp8mixed.safetensors" (
    echo [DL] qwen_image_edit_2511_fp8mixed.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\qwen_image_edit_2511_fp8mixed.safetensors" "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_2511_fp8mixed.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] qwen_image_edit_2511_fp8mixed.safetensors のダウンロードに失敗しました
) else (echo [SKIP] qwen_image_edit_2511_fp8mixed.safetensors)

REM === 4. Wan2.2 TI2V-5B 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\wan2.2_ti2v_5B_fp16.safetensors" (
    echo [DL] wan2.2_ti2v_5B_fp16.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\wan2.2_ti2v_5B_fp16.safetensors" "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] wan2.2_ti2v_5B_fp16.safetensors のダウンロードに失敗しました
) else (echo [SKIP] wan2.2_ti2v_5B_fp16.safetensors)

REM === 5. FLUX.2 Klein 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\flux-2-klein-4b.safetensors" (
    echo [DL] flux-2-klein-4b.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\flux-2-klein-4b.safetensors" "https://huggingface.co/Comfy-Org/flux2-klein/resolve/main/split_files/diffusion_models/flux-2-klein-4b.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] flux-2-klein-4b.safetensors のダウンロードに失敗しました
) else (echo [SKIP] flux-2-klein-4b.safetensors)

REM === 6. Qwen-3 4B テキストエンコーダ(Z-Image Turbo & FLUX.2 Klein 共用) ===
if not exist "C:\ComfyUI\models\text_encoders\qwen_3_4b.safetensors" (
    echo [DL] qwen_3_4b.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\text_encoders\qwen_3_4b.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/text_encoders/qwen_3_4b.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] qwen_3_4b.safetensors のダウンロードに失敗しました
) else (echo [SKIP] qwen_3_4b.safetensors)

REM === 7. UMT5-XXL fp8 テキストエンコーダ(Wan2.2 用) ===
if not exist "C:\ComfyUI\models\text_encoders\umt5_xxl_fp8_e4m3fn_scaled.safetensors" (
    echo [DL] umt5_xxl_fp8_e4m3fn_scaled.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\text_encoders\umt5_xxl_fp8_e4m3fn_scaled.safetensors" "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] umt5_xxl_fp8_e4m3fn_scaled.safetensors のダウンロードに失敗しました
) else (echo [SKIP] umt5_xxl_fp8_e4m3fn_scaled.safetensors)

REM === 8. Z-Image Turbo 用 VAE ===
if not exist "C:\ComfyUI\models\vae\ae.safetensors" (
    echo [DL] ae.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\vae\ae.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/vae/ae.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] ae.safetensors のダウンロードに失敗しました
) else (echo [SKIP] ae.safetensors)

REM === 9. Wan2.2 用 VAE ===
if not exist "C:\ComfyUI\models\vae\wan2.2_vae.safetensors" (
    echo [DL] wan2.2_vae.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\vae\wan2.2_vae.safetensors" "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/vae/wan2.2_vae.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] wan2.2_vae.safetensors のダウンロードに失敗しました
) else (echo [SKIP] wan2.2_vae.safetensors)

REM === 10. FLUX.2 Klein 用 VAE ===
if not exist "C:\ComfyUI\models\vae\flux2-vae.safetensors" (
    echo [DL] flux2-vae.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\vae\flux2-vae.safetensors" "https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/vae/flux2-vae.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] flux2-vae.safetensors のダウンロードに失敗しました
) else (echo [SKIP] flux2-vae.safetensors)

REM === 10. 最終存在確認 ===

REM ============================================================
echo 最終存在確認
REM ============================================================
if exist "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" (echo [OK] z_image_turbo_bf16.safetensors) else (echo [NG] z_image_turbo_bf16.safetensors)
if exist "C:\ComfyUI\models\diffusion_models\wan2.2_ti2v_5B_fp16.safetensors" (echo [OK] wan2.2_ti2v_5B_fp16.safetensors) else (echo [NG] wan2.2_ti2v_5B_fp16.safetensors)
if exist "C:\ComfyUI\models\diffusion_models\flux-2-klein-4b.safetensors" (echo [OK] flux-2-klein-4b.safetensors) else (echo [NG] flux-2-klein-4b.safetensors)
if exist "C:\ComfyUI\models\text_encoders\qwen_3_4b.safetensors" (echo [OK] qwen_3_4b.safetensors) else (echo [NG] qwen_3_4b.safetensors)
if exist "C:\ComfyUI\models\text_encoders\umt5_xxl_fp8_e4m3fn_scaled.safetensors" (echo [OK] umt5_xxl_fp8_e4m3fn_scaled.safetensors) else (echo [NG] umt5_xxl_fp8_e4m3fn_scaled.safetensors)
if exist "C:\ComfyUI\models\vae\ae.safetensors" (echo [OK] ae.safetensors) else (echo [NG] ae.safetensors)
if exist "C:\ComfyUI\models\vae\wan2.2_vae.safetensors" (echo [OK] wan2.2_vae.safetensors) else (echo [NG] wan2.2_vae.safetensors)
if exist "C:\ComfyUI\models\vae\flux2-vae.safetensors" (echo [OK] flux2-vae.safetensors) else (echo [NG] flux2-vae.safetensors)

REM ============================================================
REM  API利用モデルの案内
REM ============================================================
REM ============================================================
echo FLUX 1.1 Pro Ultra(API経由で利用)
echo 1. https://bfl.ai/ でアカウントを作成
echo 2. ダッシュボードからAPIキーを取得
echo 3. APIエンドポイント: https://api.bfl.ai/v1
echo 4. 従量課金(画像1枚あたり課金)
REM ============================================================

REM ============================================================
REM  5. 起動方法の案内
REM ============================================================
REM ============================================================
echo ■ ComfyUI の起動:
echo   cd C:\ComfyUI
echo   python main.py --use-sage-attention
echo   ブラウザで http://localhost:8188 にアクセス
REM ============================================================

REM numpy と PyTorch(CUDA 12.8 対応 wheel)を再インストールし、
REM 依存関係の解決によりバージョンが意図せず変わっていないか最終調整する
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo numpy / PyTorch の最終調整に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user scipy pillow pandas
if not "%ERRORLEVEL%"=="0" ( color 0c & echo scipy / pillow / pandas のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge

echo インストール完了

インストール確認のために次のコマンドを実行する。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM ============================================================

ECHO ------------------------------------------------------------
ECHO 1. ツール類の存在確認
ECHO ------------------------------------------------------------

where git >nul 2>&1 && (echo [OK] Git) || (echo [NG] Git が見つかりません)

REM ComfyUI
if exist "C:\ComfyUI\main.py" (echo [OK] ComfyUI) else (echo [NG] ComfyUI が見つかりません)

REM Python パッケージ
set "PYTHON=C:\Program Files\Python312\python.exe"
python -c "import qwen_tts; print('[OK] qwen-tts')"  || echo [NG] qwen-tts がインストールされていません
python -c "import faster_whisper; print('[OK] faster-whisper')"  || echo [NG] faster-whisper がインストールされていません
python -c "import torch; print('[OK] PyTorch', torch.__version__, '/ CUDA', torch.cuda.is_available())"  || echo [NG] PyTorch がインストールされていません

REM BUZZ
if exist "C:\Program Files (x86)\Buzz\Buzz.exe" (echo   [検出] Buzz) else echo   *** 未検出 *** Buzz

ECHO ------------------------------------------------------------
ECHO 2. スタートメニューのショートカット確認
ECHO ------------------------------------------------------------

set "CM=%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs"
set "CP=%ProgramData%\Microsoft\Windows\Start Menu\Programs"

REM CommonPrograms(winget install 等で配置されるもの)
for %F in (
    "%CP%\ComfyUI.lnk"
    "%CP%\Ollama Chat.lnk"
) do (
    if exist %F (echo [OK] %~nxF) else (echo [NG] %~nxF が見つかりません)
)

REM ============================================================
REM ComfyUI 4ワークフロー動作確認スクリプト(2026年5月10日検証済)
REM 前提:ComfyUI が http://127.0.0.1:8188 で起動中(起動: cd /d C:\ComfyUI && python main.py --use-sage-attention)
REM 前提:モデルダウンロードスクリプト実行済(8ファイル全て配置済)
REM ============================================================
REM workflow_api_zimage.json       Z-Image Turbo 画像生成(T2I)
REM workflow_api_qwen_edit_2511.json Qwen 2511 Image to Image
REM workflow_api_flux2_klein.json  FLUX.2 Klein 画像生成(T2I)
REM workflow_api_wan_t2v.json      Wan2.2 TI2V-5B 動画生成(T2V)
REM workflow_api_wan_i2v.json      Wan2.2 TI2V-5B 動画生成(I2V)
REM ============================================================

REM === 1. 入力画像フォルダ作成 ===
if not exist "C:\ComfyUI\input" mkdir "C:\ComfyUI\input"

REM === 2. サンプル画像ダウンロード(I2V 用) ===
if not exist "C:\ComfyUI\input\input.png" (
    echo [DL] input.png
    curl -L --fail --remove-on-error -o "C:\ComfyUI\input\input.png" "https://comfyanonymous.github.io/ComfyUI_examples/chroma/fennec_girl_hug.png"
) else (echo [SKIP] input.png)

REM === [1] Z-Image Turbo text-to-image ワークフロー JSON 生成 ===
REM   ComfyUI公式テンプレート image_z_image_turbo.json と同一構成に、
REM   DeJPEG LoRA (ノード40) を UNETLoader と ModelSamplingAuraFlow の間へ挿入。
REM   事前準備: dejpeg_v3.safetensors を ComfyUI\models\loras\ に配置。
python -c "import json; w={'28':{'inputs':{'unet_name':'z_image_turbo_bf16.safetensors','weight_dtype':'default'},'class_type':'UNETLoader'},'30':{'inputs':{'clip_name':'qwen_3_4b.safetensors','type':'lumina2','device':'default'},'class_type':'CLIPLoader'},'29':{'inputs':{'vae_name':'ae.safetensors'},'class_type':'VAELoader'},'40':{'inputs':{'lora_name':'dejpeg_v3.safetensors','strength_model':1.0,'model':['28',0]},'class_type':'LoraLoaderModelOnly'},'11':{'inputs':{'shift':3.0,'model':['40',0]},'class_type':'ModelSamplingAuraFlow'},'13':{'inputs':{'width':1024,'height':1024,'batch_size':1},'class_type':'EmptySD3LatentImage'},'27':{'inputs':{'text':'a serene mountain landscape at sunset','clip':['30',0]},'class_type':'CLIPTextEncode'},'33':{'inputs':{'conditioning':['27',0]},'class_type':'ConditioningZeroOut'},'3':{'inputs':{'seed':0,'steps':8,'cfg':1.0,'sampler_name':'res_multistep','scheduler':'simple','denoise':1.0,'model':['11',0],'positive':['27',0],'negative':['33',0],'latent_image':['13',0]},'class_type':'KSampler'},'8':{'inputs':{'samples':['3',0],'vae':['29',0]},'class_type':'VAEDecode'},'9':{'inputs':{'filename_prefix':'ZImageTurbo','images':['8',0]},'class_type':'SaveImage'}}; json.dump(w,open(r'C:\ComfyUI\workflow_api_zimage.json','w'),indent=2)"


REM === [2] Qwen-Image-Edit-2511 ワークフロー JSON 生成 ===
REM 本ワークフローは ComfyUI公式テンプレート image_qwen_image_edit_2511.json を
REM API形式へ変換したもの(サブグラフ展開済み)。
REM 【注意】
REM   - FluxKontextImageScale(5) が Kontext推奨解像度にスナップするため、
REM     出力サイズは入力と一致しない(アスペクト比は最も近いものが選ばれる)。
REM   - ModelSamplingAuraFlow の shift は 3.1。
REM   - FluxKontextMultiReferenceLatentMethod は positive/negative の両方に必要。
REM   - 高速化する場合: models\loras\ に Lightning LoRA を置き、
REM     ノード7と13の間に LoraLoaderModelOnly を挟んだうえで steps=4, cfg=1.0 にする。
python -c "import json; P='Make every person in the image look about ten years younger, with smoother skin, fewer wrinkles and a firmer jawline. Keep their identity, facial structure, hairstyle, beard, glasses, clothing, pose, framing, background and lighting exactly the same.'; w={'1':{'inputs':{'unet_name':'qwen_image_edit_2511_fp8mixed.safetensors','weight_dtype':'default'},'class_type':'UNETLoader'},'2':{'inputs':{'clip_name':'qwen_2.5_vl_7b_fp8_scaled.safetensors','type':'qwen_image','device':'default'},'class_type':'CLIPLoader'},'3':{'inputs':{'vae_name':'qwen_image_vae.safetensors'},'class_type':'VAELoader'},'4':{'inputs':{'image':'input.png'},'class_type':'LoadImage'},'5':{'inputs':{'image':['4',0]},'class_type':'FluxKontextImageScale'},'6':{'inputs':{'shift':3.1,'model':['1',0]},'class_type':'ModelSamplingAuraFlow'},'7':{'inputs':{'strength':1.0,'pre_cfg':False,'model':['6',0]},'class_type':'CFGNorm'},'8':{'inputs':{'prompt':P,'clip':['2',0],'vae':['3',0],'image1':['5',0]},'class_type':'TextEncodeQwenImageEditPlus'},'9':{'inputs':{'prompt':'','clip':['2',0],'vae':['3',0],'image1':['5',0]},'class_type':'TextEncodeQwenImageEditPlus'},'10':{'inputs':{'reference_latents_method':'index_timestep_zero','conditioning':['8',0]},'class_type':'FluxKontextMultiReferenceLatentMethod'},'11':{'inputs':{'reference_latents_method':'index_timestep_zero','conditioning':['9',0]},'class_type':'FluxKontextMultiReferenceLatentMethod'},'12':{'inputs':{'pixels':['5',0],'vae':['3',0]},'class_type':'VAEEncode'},'13':{'inputs':{'seed':0,'steps':40,'cfg':4.0,'sampler_name':'euler','scheduler':'simple','denoise':1.0,'model':['7',0],'positive':['10',0],'negative':['11',0],'latent_image':['12',0]},'class_type':'KSampler'},'14':{'inputs':{'samples':['13',0],'vae':['3',0]},'class_type':'VAEDecode'},'15':{'inputs':{'filename_prefix':'QwenEdit2511','images':['14',0]},'class_type':'SaveImage'}}; json.dump(w,open(r'C:\ComfyUI\workflow_api_qwen_edit_2511.json','w'),indent=2)"

REM ===  [3] FLUX.2 Klein ワークフロー JSON 生成 ===
python -c "import json; w={'10':{'inputs':{'unet_name':'flux-2-klein-4b.safetensors','weight_dtype':'default'},'class_type':'UNETLoader'},'20':{'inputs':{'clip_name':'qwen_3_4b.safetensors','type':'flux2','device':'default'},'class_type':'CLIPLoader'},'30':{'inputs':{'vae_name':'flux2-vae.safetensors'},'class_type':'VAELoader'},'40':{'inputs':{'text':'a serene mountain landscape at sunset','clip':['20',0]},'class_type':'CLIPTextEncode'},'45':{'inputs':{'conditioning':['40',0],'guidance':1.0},'class_type':'FluxGuidance'},'50':{'inputs':{'width':1024,'height':1024,'batch_size':1},'class_type':'EmptyFlux2LatentImage'},'60':{'inputs':{'steps':4,'width':1024,'height':1024},'class_type':'Flux2Scheduler'},'70':{'inputs':{'sampler_name':'euler'},'class_type':'KSamplerSelect'},'80':{'inputs':{'noise_seed':42},'class_type':'RandomNoise'},'90':{'inputs':{'model':['10',0],'conditioning':['45',0]},'class_type':'BasicGuider'},'100':{'inputs':{'noise':['80',0],'guider':['90',0],'sampler':['70',0],'sigmas':['60',0],'latent_image':['50',0]},'class_type':'SamplerCustomAdvanced'},'110':{'inputs':{'samples':['100',0],'vae':['30',0]},'class_type':'VAEDecode'},'120':{'inputs':{'filename_prefix':'Flux2Klein','images':['110',0]},'class_type':'SaveImage'}}; json.dump(w,open(r'C:\ComfyUI\workflow_api_flux2_klein.json','w'),indent=2)"

REM === [4] Wan2.2 TI2V-5B T2V ワークフロー JSON 生成 ===
python -c "import json; POS='a detective in a trench coat walking down a neon-lit alley in Tokyo at night, heavy rain, reflections on wet asphalt, cinematic lighting, shallow depth of field, slow camera dolly forward, highly detailed'; NEG='\u8272\u8c03\u8273\u4e3d\uff0c\u8fc7\u66dd\uff0c\u9759\u6001\uff0c\u7ec6\u8282\u6a21\u7cca\u4e0d\u6e05\uff0c\u5b57\u5e55\uff0c\u98ce\u683c\uff0c\u4f5c\u54c1\uff0c\u753b\u4f5c\uff0c\u753b\u9762\uff0c\u9759\u6b62\uff0c\u6574\u4f53\u53d1\u7070\uff0c\u6700\u5dee\u8d28\u91cf\uff0c\u4f4e\u8d28\u91cf\uff0cJPEG\u538b\u7f29\u6b8b\u7559\uff0c\u4e11\u964b\u7684\uff0c\u6b8b\u7f3a\u7684\uff0c\u591a\u4f59\u7684\u624b\u6307\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u624b\u90e8\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u8138\u90e8\uff0c\u7578\u5f62\u7684\uff0c\u6bc1\u5bb9\u7684\uff0c\u5f62\u6001\u7578\u5f62\u7684\u80a2\u4f53\uff0c\u624b\u6307\u878d\u5408\uff0c\u9759\u6b62\u4e0d\u52a8\u7684\u753b\u9762\uff0c\u6742\u4e71\u7684\u80cc\u666f\uff0c\u4e09\u6761\u817f\uff0c\u80cc\u666f\u4eba\u5f88\u591a\uff0c\u5012\u7740\u8d70'; w={'1':{'class_type':'UNETLoader','inputs':{'unet_name':'wan2.2_ti2v_5B_fp16.safetensors','weight_dtype':'fp8_e4m3fn_fast'}},'2':{'class_type':'CLIPLoader','inputs':{'clip_name':'umt5_xxl_fp8_e4m3fn_scaled.safetensors','type':'wan','device':'default'}},'3':{'class_type':'VAELoader','inputs':{'vae_name':'wan2.2_vae.safetensors'}},'4':{'class_type':'ModelSamplingSD3','inputs':{'shift':8.0,'model':['1',0]}},'5':{'class_type':'Wan22ImageToVideoLatent','inputs':{'width':1280,'height':704,'length':121,'batch_size':1,'vae':['3',0]}},'6':{'class_type':'CLIPTextEncode','inputs':{'text':POS,'clip':['2',0]}},'7':{'class_type':'CLIPTextEncode','inputs':{'text':NEG,'clip':['2',0]}},'8':{'class_type':'KSampler','inputs':{'seed':42,'steps':20,'cfg':5.0,'sampler_name':'uni_pc','scheduler':'simple','denoise':1.0,'model':['4',0],'positive':['6',0],'negative':['7',0],'latent_image':['5',0]}},'9':{'class_type':'VAEDecode','inputs':{'samples':['8',0],'vae':['3',0]}},'10':{'class_type':'CreateVideo','inputs':{'images':['9',0],'fps':24.0}},'11':{'class_type':'SaveVideo','inputs':{'video':['10',0],'filename_prefix':'WanT2V','format':'auto','codec':'auto'}}}; f=open(r'C:\ComfyUI\workflow_api_wan_t2v.json','w',encoding='utf-8'); json.dump(w,f,indent=2,ensure_ascii=False); f.close()"

REM === [5] Wan2.2 TI2V-5B I2V ワークフロー JSON 生成 ===
python -c "import json; IMG='input.png'; W=1280; H=704; POS='the man slowly turns his head toward the camera, gentle wind moves his hair, subtle facial expression, cinematic lighting, smooth natural motion'; NEG='\u8272\u8c03\u8273\u4e3d\uff0c\u8fc7\u66dd\uff0c\u9759\u6001\uff0c\u7ec6\u8282\u6a21\u7cca\u4e0d\u6e05\uff0c\u5b57\u5e55\uff0c\u98ce\u683c\uff0c\u4f5c\u54c1\uff0c\u753b\u4f5c\uff0c\u753b\u9762\uff0c\u9759\u6b62\uff0c\u6574\u4f53\u53d1\u7070\uff0c\u6700\u5dee\u8d28\u91cf\uff0c\u4f4e\u8d28\u91cf\uff0cJPEG\u538b\u7f29\u6b8b\u7559\uff0c\u4e11\u964b\u7684\uff0c\u6b8b\u7f3a\u7684\uff0c\u591a\u4f59\u7684\u624b\u6307\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u624b\u90e8\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u8138\u90e8\uff0c\u7578\u5f62\u7684\uff0c\u6bc1\u5bb9\u7684\uff0c\u5f62\u6001\u7578\u5f62\u7684\u80a2\u4f53\uff0c\u624b\u6307\u878d\u5408\uff0c\u9759\u6b62\u4e0d\u52a8\u7684\u753b\u9762\uff0c\u6742\u4e71\u7684\u80cc\u666f\uff0c\u4e09\u6761\u817f\uff0c\u80cc\u666f\u4eba\u5f88\u591a\uff0c\u5012\u7740\u8d70'; w={'1':{'class_type':'UNETLoader','inputs':{'unet_name':'wan2.2_ti2v_5B_fp16.safetensors','weight_dtype':'fp8_e4m3fn_fast'}},'2':{'class_type':'CLIPLoader','inputs':{'clip_name':'umt5_xxl_fp8_e4m3fn_scaled.safetensors','type':'wan','device':'default'}},'3':{'class_type':'VAELoader','inputs':{'vae_name':'wan2.2_vae.safetensors'}},'4':{'class_type':'ModelSamplingSD3','inputs':{'shift':8.0,'model':['1',0]}},'5':{'class_type':'Wan22ImageToVideoLatent','inputs':{'width':W,'height':H,'length':121,'batch_size':1,'vae':['3',0],'start_image':['13',0]}},'6':{'class_type':'CLIPTextEncode','inputs':{'text':POS,'clip':['2',0]}},'7':{'class_type':'CLIPTextEncode','inputs':{'text':NEG,'clip':['2',0]}},'8':{'class_type':'KSampler','inputs':{'seed':42,'steps':20,'cfg':5.0,'sampler_name':'uni_pc','scheduler':'simple','denoise':1.0,'model':['4',0],'positive':['6',0],'negative':['7',0],'latent_image':['5',0]}},'9':{'class_type':'VAEDecode','inputs':{'samples':['8',0],'vae':['3',0]}},'10':{'class_type':'CreateVideo','inputs':{'images':['9',0],'fps':24.0}},'11':{'class_type':'SaveVideo','inputs':{'video':['10',0],'filename_prefix':'WanI2V','format':'auto','codec':'auto'}},'12':{'class_type':'LoadImage','inputs':{'image':IMG}},'13':{'class_type':'ImageScale','inputs':{'image':['12',0],'upscale_method':'lanczos','width':W,'height':H,'crop':'center'}}}; f=open(r'C:\ComfyUI\workflow_api_wan_i2v.json','w',encoding='utf-8'); json.dump(w,f,indent=2,ensure_ascii=False); f.close()"

REM === JSON ファイル生成確認 ===

REM ============================================================
echo ワークフロー JSON 生成確認
REM ============================================================
if exist "C:\ComfyUI\workflow_api_zimage.json"      (echo [OK] workflow_api_zimage.json)      else (echo [NG] workflow_api_zimage.json)
if exist "C:\ComfyUI\workflow_api_qwen_edit_2511.json"      (echo [OK] workflow_api_qwen_edit_2511.json)      else (echo [NG] workflow_api_qwen_edit_2511.json)
if exist "C:\ComfyUI\workflow_api_flux2_klein.json" (echo [OK] workflow_api_flux2_klein.json) else (echo [NG] workflow_api_flux2_klein.json)
if exist "C:\ComfyUI\workflow_api_wan_t2v.json"     (echo [OK] workflow_api_wan_t2v.json)     else (echo [NG] workflow_api_wan_t2v.json)
if exist "C:\ComfyUI\workflow_api_wan_i2v.json"     (echo [OK] workflow_api_wan_i2v.json)     else (echo [NG] workflow_api_wan_i2v.json)

REM === 8. ComfyUI サーバ起動確認 ===

REM ============================================================
echo ComfyUI サーバ接続確認(http://127.0.0.1:8188)
REM ============================================================
python -c "import urllib.request,sys; r=urllib.request.urlopen('http://127.0.0.1:8188/system_stats',timeout=5); print('[OK] ComfyUI is running:', r.status)"  || echo [NG] ComfyUI に接続できません。ComfyUI を起動してください。

REM === [1] Z-Image Turbo text-to-image ワークフロー投入 ===
echo [RUN] Z-Image Turbo (text-to-image) 投入中...
python -c "import json,random,urllib.request; w=json.load(open(r'C:\ComfyUI\workflow_api_zimage.json')); w['3']['inputs']['seed']=random.randint(1,9999999999); r=urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8188/prompt',json.dumps({'prompt':w}).encode(),{'Content-Type':'application/json'})); print('[OK] Z-Image Turbo response:', r.status)" 2>&1

REM === [2] Qwen-Image-Edit-2511 ワークフロー投入 ===
echo [RUN] Qwen-Image-Edit-2511 投入中...
python -c "import json,random,urllib.request; w=json.load(open(r'C:\ComfyUI\workflow_api_qwen_edit_2511.json')); w['13']['inputs']['seed']=random.randint(1,9999999999); r=urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8188/prompt',json.dumps({'prompt':w}).encode(),{'Content-Type':'application/json'})); print('[OK] response:', r.status)" 2>&1

REM === [3] FLUX.2 Klein ワークフロー投入 ===
echo [RUN] FLUX.2 Klein (T2I) 投入中...
python -c "import json,random,urllib.request; w=json.load(open(r'C:\ComfyUI\workflow_api_flux2_klein.json')); w['80']['inputs']['noise_seed']=random.randint(1,9999999999); r=urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8188/prompt',json.dumps({'prompt':w}).encode(),{'Content-Type':'application/json'})); print('[OK] FLUX.2 Klein response:', r.status)" 2>&1

REM === [4] Wan2.2 TI2V-5B T2V ワークフロー投入 ===
echo [RUN] Wan2.2 TI2V-5B (T2V) 投入中...
python -c "import json,random,urllib.request; w=json.load(open(r'C:\ComfyUI\workflow_api_wan_t2v.json',encoding='utf-8')); w['8']['inputs']['seed']=random.randint(1,9999999999); r=urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8188/prompt',json.dumps({'prompt':w}).encode(),{'Content-Type':'application/json'})); print('[OK] Wan2.2 T2V response:', r.status)" 2>&1

REM === [5] Wan2.2 TI2V-5B I2V ワークフロー投入 ===
echo [RUN] Wan2.2 TI2V-5B (I2V) 投入中...
python -c "import json,random,urllib.request; w=json.load(open(r'C:\ComfyUI\workflow_api_wan_i2v.json',encoding='utf-8')); w['8']['inputs']['seed']=random.randint(1,9999999999); r=urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8188/prompt',json.dumps({'prompt':w}).encode(),{'Content-Type':'application/json'})); print('[OK] Wan2.2 I2V response:', r.status)" 2>&1

REM ============================================================
echo 全ワークフロー投入完了。ComfyUI UI または出力フォルダで結果を確認してください。
echo 出力場所:C:\ComfyUI\output\
echo   - ZImageTurbo_*.png
echo   - Flux2Klein_*.png
echo   - WanT2V_*.webp
echo   - WanI2V_*.webp
REM ============================================================

REM remove hugging face cache
REM rmdir /s /q "%USERPROFILE%\.cache\huggingface"
ソフトウェア説明用途備考
Git分散型バージョン管理システム。GitHub上のリポジトリを取得・更新する。リポジトリの取得・更新未インストールの場合は winget で C:\Program Files\Git にインストールし、C:\Program Files\Git\cmd を PATH に登録する
PyTorch(torch / torchvision / torchaudio)+ numpy深層学習フレームワークと数値計算ライブラリ。画像生成と音声処理の実行基盤になる。CUDA 12.8 対応の wheel(cu128 インデックス)を使う。深層学習の実行基盤インストールの最初と最後の2回導入し、他パッケージの依存解決で変わったバージョンを戻す。GPU がない場合は CPU で動作する
triton-windows / SageAttentionWindows 版 Triton コンパイラと、Attention 演算を量子化して高速化する SageAttention。推論の高速化ComfyUI は --use-sage-attention を付けて起動する。動作しない原因になる xformers はアンインストールする
huggingface_hub ほかの補助ライブラリ(numba, scipy, pillow, pandas, opencv-contrib-python)Hugging Face からのモデル取得、数値計算、画像処理に使う Python ライブラリ。補助ライブラリOpenCV は headless 版を含めて一度アンインストールしてから opencv-contrib-python を再インストールし、版の重複を防ぐ
ComfyUI画像生成 AI 用のノードベース GUI。ノードをつないで生成パイプラインを組み、拡散モデルを操作する。AI 画像生成GitHub から C:\ComfyUI に取得する(既にある場合は git pull)。start.bat とスタートメニューのショートカットを作り、起動後に Chrome で http://127.0.0.1:8188 を開く。output フォルダには Everyone の変更権限を付ける
ComfyUI-Managerカスタムノードやモデルの検索、導入、更新を GUI から行う ComfyUI 拡張。拡張機能の管理C:\ComfyUI\custom_nodes\ComfyUI-Manager に取得し、requirements.txt の依存パッケージを入れる
ComfyUI-GGUFGGUF 形式に量子化したモデルを ComfyUI で読み込む拡張。VRAM が少ない環境で大きなモデルを扱える。量子化モデルの読み込みC:\ComfyUI\custom_nodes\ComfyUI-GGUF に取得し、requirements.txt の依存パッケージを入れる
Z-Image TurboAlibaba Tongyi Lab の 6B パラメータ画像生成モデル。8 ステップの推論で画像を生成する。中国語と英語のテキスト描画に対応する。Apache 2.0 ライセンス。ComfyUI から使う。画像生成VRAM 16GB 以内で動作する。bf16 版(12.31GB)を使い、テキストエンコーダ qwen_3_4b.safetensors(8.04GB)と VAE ae.safetensors(0.34GB)を組み合わせる
Z-Image Turbo DeJPEG LoRAZ-Image Turbo 用の LoRA。高解像度の生成で出る JPEG 由来の斑点ノイズを抑え、輪郭とディテールを整える。生成画像の画質補正dejpeg_v3.safetensors を C:\ComfyUI\models\loras に置く
FLUX.2 Klein 4BBlack Forest Labs の 4B パラメータ画像生成モデル。テキストからの画像生成に加え、画像編集と複数の参照画像を使った生成に対応する。Apache 2.0 ライセンス。ComfyUI から使う。画像生成拡散モデル本体は 7.75GB。テキストエンコーダは Z-Image Turbo と共用の qwen_3_4b.safetensors、VAE は flux2-vae.safetensors(0.34GB)を使う
Qwen-Image-Edit-2511Alibaba の画像編集モデル。指示文で画像を編集する。人物の同一性の保持、複数人物の編集、構図の整合性が改善されている。画像編集FP8 mixed 版(約 20.5GB)。VRAM 16GB では GPU に載り切らないため、メモリオフロードを有効にして使う。対応するテキストエンコーダ(Qwen2.5-VL)と VAE はこのスクリプトでは取得しないので、ComfyUI-Manager で別途入れる
SoXコマンドライン方式の音声処理ツール。形式変換、リサンプリング、エフェクト処理を行う。音声ファイルの変換・処理14.4.2 win32 版の zip を C:\Program Files (x86)\SoX に展開し、PATH に登録する
Qwen3-TTSAlibaba の音声合成モデル(0.6B / 1.7B)。中国語、英語、日本語、韓国語、ドイツ語、フランス語、ロシア語、ポルトガル語、スペイン語、イタリア語の 10 言語に対応し、短い音声サンプルから声を複製できる。Apache 2.0 ライセンス。音声合成1.7B モデルで VRAM 約 4GB。pip で qwen-tts と numba を入れる
faster-whisperOpenAI Whisper の高速実装(CTranslate2 ベース)。99 言語の音声認識に対応し、元の実装より高速に動作する。会議や講義の文字起こし、動画の字幕生成に使う。オフラインで動作する。MIT ライセンス。音声認識(文字起こし)large-v3 モデルで VRAM 約 3GB。CPU でも動作する
BuzzWhisper を使うオフラインの音声文字起こし・翻訳ツール。音声ファイルと動画ファイルの読み込み、およびリアルタイム文字起こしに対応し、CSV、SRT、TXT、VTT 形式で書き出せる。音声文字起こしSourceForge から Buzz-1.4.4-Windows-X64.zip を取得して C:\Program Files (x86)\Buzz に展開し、同梱の Inno Setup 製インストーラをサイレント実行する。スタートメニューにショートカットを作る
Wan2.2-TI2V-5B(ComfyUI から使用)Alibaba の動画生成モデル。テキストからの動画生成と画像からの動画生成の両方に対応する。高圧縮の VAE により 720p / 24fps の動画を生成する。Apache 2.0 ライセンス。動画生成FP16 版(10.00GB)を使い、テキストエンコーダ umt5_xxl_fp8_e4m3fn_scaled.safetensors(6.74GB)と VAE wan2.2_vae.safetensors(1.41GB)を組み合わせる
FLUX 1.1 Pro UltraBlack Forest Labs の画像生成モデル。ローカルでは実行できず、API 経由で使う。bfl.ai でアカウントを作り、ダッシュボードで API キーを取得する。画像 1 枚ごとの従量課金制。画像生成(API)API エンドポイントは https://api.bfl.ai/v1

【前提条件】

次の条件を満たす環境で、管理者権限で起動したコマンドプロンプトから実行する。

6. Python用ライブラリとツール

データ処理,機械学習,画像・音声処理,3次元データ処理,LLMアプリケーション構築など,各分野で使用するPythonライブラリおよびツールである。導入にはPython 3.12と,ソースからビルドするパッケージのためにBuild Tools for Visual StudioおよびCUDA Toolkit 12.8が前提となる。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。 wingetの--scope machineオプションでシステム全体にインストールするには、管理者権限が必要である。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM  前提条件:
REM    - Python 3.12 が C:\Program Files\Python312 にインストール済みであること
REM    - Git がインストール済みであること
REM    - CMake がインストール済みであること
REM    - Visual Studio 2026 Build Tools がインストール済みであること
REM    - NVIDIA GPU および CUDA 12.8 対応ドライバの利用を推奨
REM      (未搭載の場合は CPU モードで動作するが、
REM       画像生成・音声処理等は大幅に低速となる)
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM ============================================================
REM Git
REM ============================================================
REM Git存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
if not exist "C:\Program Files\Git\cmd\git.exe" echo Git が見つかりません。インストールします... & winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=""icons,ext\reg\shellhere,assoc,assoc_sh"" /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled" & powershell -NoProfile -Command "$g='C:\Program Files\Git\cmd'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $g) -and (';'+$c+';' -notlike \"*;$g;*\")){[Environment]::SetEnvironmentVariable('Path',\"$g;$c\",'Machine')}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Git のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM CMake存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
if not exist "C:\Program Files\CMake\bin\cmake.exe" (
echo CMake が見つかりません。インストールします...
winget install --scope machine --id Kitware.CMake -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/qn /norestart ADD_CMAKE_TO_PATH=System"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo CMake のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
powershell -NoProfile -Command "$m='C:\Program Files\CMake\bin'; if(Test-Path $m){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if((';'+$c+';') -notlike \"*;$m;*\"){$k.SetValue('Path',($c.TrimEnd(';')+';'+$m),$t)}; $k.Close()}"
)

REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)

REM
REM BuildTools のインストールパスを vswhere.exe で取得(メジャーバージョンに依存しない)
set "VSWHERE=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
set "BT_PATH="
for /f "usebackq delims=" %P in (`"%VSWHERE%" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do set "BT_PATH=%P"
if not defined BT_PATH ( color 0c & echo Build Tools のインストールパスを取得できませんでした & ping 127.0.0.1 -n 6 >nul & color )

REM 破損時の修復(任意、動作がおかしくなった場合)
REM if defined BT_PATH "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" repair --installPath "%BT_PATH%" --quiet --norestart
REM 導入確認(インストールパスが表示されれば正常)
"%VSWHERE%" -products * -requires Microsoft.VisualStudio.Workload.VCTools -property installationPath

REM ============================================================
REM 数値計算・データ処理
REM ============================================================
pip install -U --no-user numpy numba scipy pandas matplotlib scikit-learn
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 数値計算・データ処理ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM 画像・音声処理
REM ============================================================
pip install --no-deps basic-pitch==0.4.0
pip install --no-deps librosa "mir_eval>=0.6" "pretty_midi>=0.2.9" "resampy<0.4.3" scikit-learn scipy typing_extensions onnxruntime
pip install -U --no-user lapx
pip install -U --no-user sounddevice numpy faster-whisper transformers sentencepiece
pip install -U --no-user mediapipe onnxruntime-gpu protobuf==6.33.6
if not "%ERRORLEVEL%"=="0" ( color 0c & echo mediapipe等のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user pillow albumentations ultralytics boxmot supervision easyocr yomitoku face-alignment deepface retina-face "rembg[cpu]" sixdrepnet librosa
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 画像・音声処理ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge

REM ============================================================
REM ファイル処理・変換ツール
REM ============================================================
pip install -U --no-user static-ffmpeg py7zr pypandoc_binary
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ファイル処理・変換ツールのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM HTTP通信・Webフレームワーク
REM ============================================================
pip install -U --no-user requests beautifulsoup4 flask selenium fastapi pydantic SQLAlchemy uvicorn
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Webフレームワーク関連のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM 自然言語処理
REM ============================================================
pip install -U --no-user spacy ginza ja-ginza
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 自然言語処理ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM OpenWEB UI
REM ============================================================
pip install -U --no-user open-webui

REM ============================================================
REM ollama-chat
REM ============================================================
pip install -U --no-user ollama-chat

REM ============================================================
REM Hugging Face関連
REM ============================================================
pip install -U --no-user transformers datasets sentence-transformers accelerate diffusers timm einops huggingface_hub hf_xet
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Hugging Face関連ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM LLMアプリケーション開発
REM ============================================================
pip install -U --no-user langchain langchain-community langchain-ollama langchain-huggingface langchain-openai langchain-google-genai langchain-anthropic langgraph chromadb
if not "%ERRORLEVEL%"=="0" ( color 0c & echo LLMアプリケーション開発ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM CUDA 12.8のMSBuild統合ファイルをコピー
REM ============================================================
REM 統合用ファイルのコピー
if exist "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\" (
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "c:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v170\BuildCustomizations\" /Y /I
) else (
    echo CUDA v12.8 のディレクトリが存在しません。
    ping 127.0.0.1 -n 6 >nul
)

REM ============================================================
REM LLM APIクライアント
REM ============================================================
pip install -U --no-user openai openvino google-genai anthropic litellm
if not "%ERRORLEVEL%"=="0" ( color 0c & echo LLM APIクライアントのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM LLMファインチューニング
REM ============================================================
pip install -U --no-user trl peft
if not "%ERRORLEVEL%"=="0" ( color 0c & echo LLMファインチューニングライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM 実験管理・MLOps
REM ============================================================
pip install -U --no-user mlflow
if not "%ERRORLEVEL%"=="0" ( color 0c & echo MLflow のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM UIフレームワーク
REM ============================================================
pip install -U --no-user gradio streamlit
if not "%ERRORLEVEL%"=="0" ( color 0c & echo UIフレームワークのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM JupyterLab
REM ============================================================
pip install -U --no-user jupyterlab
if not "%ERRORLEVEL%"=="0" ( color 0c & echo JupyterLab のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM TensorFlow
REM ============================================================
pip install -U --no-user tensorflow tf-keras flatbuffers flatgeobuf protobuf
if not "%ERRORLEVEL%"=="0" ( color 0c & echo TensorFlow関連のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM その他
REM ============================================================
pip install -U --no-user "imageio[ffmpeg]" "imageio[pyav]"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo imageio のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user pymeshlab sophuspy fast_simplification plotly torchdiffeq iece protobuf pyrender
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 3次元データ処理ライブラリ等のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user pygame pymunk
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pygame pymunkのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM SAM2 のインストール
REM ============================================================
if exist "%TEMP%\sam2\.git" (
cd /d "%TEMP%\sam2" && git pull
) else (
git clone https://github.com/facebookresearch/sam2.git "%TEMP%\sam2"
)
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SAM2 ソースの取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d "%TEMP%\sam2"
pip install -U --no-user -e .
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SAM2 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Insight Face
REM onnxruntime(CPU版)とonnxruntime-gpuが同一環境に共存すると
REM GPU推論が無効化される場合があるため、両方を明示的に削除したうえで
REM insightfaceとonnxruntime-gpuを再インストールする
REM ============================================================
"%PYTHON%" -m pip uninstall onnxruntime onnxruntime-gpu -y
if not "%ERRORLEVEL%"=="0" ( color 0c & echo onnxruntime系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user insightface onnxruntime-gpu
if not "%ERRORLEVEL%"=="0" ( color 0c & echo insightface のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM numpy, PyTorch をインストール(CUDA 12.8 対応 wheel)
REM ============================================================
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM torch-cluster をインストール
REM ============================================================
for /f "delims=" %V in ('"%PYTHON%" -c "import torch; print(torch.__version__.split('+')[0])"') do set "TORCH_VER=%V"
pip install -U --no-user torch-cluster -f https://data.pyg.org/whl/torch-%TORCH_VER%+%CUDA_TAG%.html
if not "%ERRORLEVEL%"=="0" ( color 0c & echo torch-cluster のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM numpy と PyTorch(CUDA 12.8 対応 wheel)の再インストール、
REM 依存関係の再確認、opencvの再クレンジング、pipキャッシュの削除
REM ============================================================
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PyTorch の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user scipy pillow pandas
if not "%ERRORLEVEL%"=="0" ( color 0c & echo scipy等の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge

echo インストール完了

インストール確認のために次のコマンドを実行する。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM ============================================================

REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM ===== インストール確認 =====

echo [数値計算・データ処理]
python -c "import numpy; print('  numpy', numpy.__version__)"  || echo   *** 未検出 *** numpy
python -c "import numba; print('  numba', numba.__version__)"  || echo   *** 未検出 *** numba
python -c "import scipy; print('  scipy', scipy.__version__)"  || echo   *** 未検出 *** scipy
python -c "import pandas; print('  pandas', pandas.__version__)"  || echo   *** 未検出 *** pandas
python -c "import matplotlib; print('  matplotlib', matplotlib.__version__)"  || echo   *** 未検出 *** matplotlib
python -c "import sklearn; print('  scikit-learn', sklearn.__version__)"  || echo   *** 未検出 *** scikit-learn

echo [画像・音声処理]
python -c "import PIL; print('  pillow', PIL.__version__)"  || echo   *** 未検出 *** pillow
python -c "import albumentations; print('  albumentations', albumentations.__version__)"  || echo   *** 未検出 *** albumentations
python -c "import cv2; print('  opencv-python', cv2.__version__)"  || echo   *** 未検出 *** opencv-python
python -c "import cv2, numpy as np, matplotlib.pyplot as plt; img=np.full((480,640,3),128,dtype=np.uint8); cv2.putText(img,'OpenCV Window Test',(80,240),cv2.FONT_HERSHEY_SIMPLEX,1.0,(255,255,255),2); plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)); plt.show()"
python -c "import ultralytics; print('  ultralytics', ultralytics.__version__)"  || echo   *** 未検出 *** ultralytics
python -c "import boxmot; print('  boxmot', boxmot.__version__)"  || echo   *** 未検出 *** boxmot
python -c "import supervision; print('  supervision', supervision.__version__)"  || echo   *** 未検出 *** supervision
python -c "import easyocr; print('  easyocr', easyocr.__version__)"  || echo   *** 未検出 *** easyocr
python -c "import yomitoku; print('  yomitoku OK')"  || echo   *** 未検出 *** yomitoku
python -c "import face_alignment; print('  face-alignment OK')"  || echo   *** 未検出 *** face-alignment
python -c "import deepface; print('  deepface', deepface.__version__)"  || echo   *** 未検出 *** deepface
python -c "from retinaface import RetinaFace; print('  retina-face OK')"  || echo   *** 未検出 *** retina-face
python -c "import mediapipe; print('  mediapipe', mediapipe.__version__)"  || echo   *** 未検出 *** mediapipe
python -c "import mediapipe as mp; print('mediapipe:', mp.__version__)"
python -c "import onnxruntime as ort; print('providers:', ort.get_available_providers())"
python -c "import cv2; print('opencv:', cv2.__version__)"
REM MediaPipe Tasks API 動作確認
python -c "from mediapipe.tasks import python as mp_py; from mediapipe.tasks.python import vision; print('tasks API OK')"
python -c "import rembg; print('  rembg OK')"  || echo   *** 未検出 *** rembg
python -c "import sixdrepnet; print('  sixdrepnet OK')"  || echo   *** 未検出 *** sixdrepnet
python -c "import librosa; print('  librosa', librosa.__version__)"  || echo   *** 未検出 *** librosa

echo [ファイル処理・変換ツール]
python -c "import static_ffmpeg; print('  static-ffmpeg OK')"  || echo   *** 未検出 *** static-ffmpeg
python -c "import py7zr; print('  py7zr', py7zr.__version__)"  || echo   *** 未検出 *** py7zr
python -c "import pypandoc; print('  pypandoc_binary', pypandoc.__version__)"  || echo   *** 未検出 *** pypandoc_binary

echo [HTTP通信・Webフレームワーク]
python -c "import requests; print('  requests', requests.__version__)"  || echo   *** 未検出 *** requests
python -c "import bs4; print('  beautifulsoup4', bs4.__version__)"  || echo   *** 未検出 *** beautifulsoup4
python -c "import flask; print('  flask', flask.__version__)"  || echo   *** 未検出 *** flask
python -c "import selenium; print('  selenium', selenium.__version__)"  || echo   *** 未検出 *** selenium
python -c "import fastapi; print('  fastapi', fastapi.__version__)"  || echo   *** 未検出 *** fastapi
python -c "import pydantic; print('  pydantic', pydantic.__version__)"  || echo   *** 未検出 *** pydantic
python -c "import sqlalchemy; print('  SQLAlchemy', sqlalchemy.__version__)"  || echo   *** 未検出 *** SQLAlchemy
python -c "import uvicorn; print('  uvicorn', uvicorn.__version__)"  || echo   *** 未検出 *** uvicorn

echo [自然言語処理]
python -c "import spacy; print('  spacy', spacy.__version__)"  || echo   *** 未検出 *** spacy
python -c "import ginza; print('  ginza', ginza.__version__)"  || echo   *** 未検出 *** ginza
python -c "import ja_ginza; print('  ja-ginza OK')"  || echo   *** 未検出 *** ja-ginza

echo [Hugging Face関連]
python -c "import transformers; print('  transformers', transformers.__version__)"  || echo   *** 未検出 *** transformers
python -c "import datasets; print('  datasets', datasets.__version__)"  || echo   *** 未検出 *** datasets
python -c "import sentence_transformers; print('  sentence-transformers', sentence_transformers.__version__)"  || echo   *** 未検出 *** sentence-transformers
python -c "import accelerate; print('  accelerate', accelerate.__version__)"  || echo   *** 未検出 *** accelerate
python -c "import diffusers; print('  diffusers', diffusers.__version__)"  || echo   *** 未検出 *** diffusers
python -c "import timm; print('  timm', timm.__version__)"  || echo   *** 未検出 *** timm
python -c "import einops; print('  einops', einops.__version__)"  || echo   *** 未検出 *** einops
python -c "import huggingface_hub; print('  huggingface_hub', huggingface_hub.__version__)"  || echo   *** 未検出 *** huggingface_hub
python -c "import hf_xet; print('  hf_xet OK')"  || echo   *** 未検出 *** hf_xet

echo [LLMアプリケーション開発]
python -c "import langchain; print('  langchain', langchain)"  || echo   *** 未検出 *** langchain
python -c "import langchain_community; print('  langchain-community', langchain_community.__version__)"  || echo   *** 未検出 *** langchain-community
python -c "import langchain_ollama; print('  langchain-ollama', langchain_ollama.__version__)"  || echo   *** 未検出 *** langchain-ollama
python -c "import langchain_huggingface; print('  langchain-huggingface', langchain_huggingface)"  || echo   *** 未検出 *** langchain-huggingface
python -c "import langchain_openai; print('  langchain-openai', langchain_openai.__version__)"  || echo   *** 未検出 *** langchain-openai
python -c "import langchain_google_genai; print('  langchain-google-genai', langchain_google_genai)"  || echo   *** 未検出 *** langchain-google-genai
python -c "import langchain_anthropic; print('  langchain-anthropic', langchain_anthropic.__version__)"  || echo   *** 未検出 *** langchain-anthropic
python -c "import langgraph; print('  langgraph', langgraph)"  || echo   *** 未検出 *** langgraph
python -c "import chromadb; print('  chromadb', chromadb.__version__)"  || echo   *** 未検出 *** chromadb

echo [LLM APIクライアント]
python -c "import openai; print('  openai', openai.__version__)"  || echo   *** 未検出 *** openai
python -c "import openvino; print('  openvino', openvino.__version__)"  || echo   *** 未検出 *** openvino
python -c "import google.genai; print('  google-genai OK')"  || echo   *** 未検出 *** google-genai
python -c "import anthropic; print('  anthropic', anthropic.__version__)"  || echo   *** 未検出 *** anthropic
python -c "import litellm; print('  litellm', litellm)"  || echo   *** 未検出 *** litellm

echo [LLMファインチューニング]
python -c "import trl; print('  trl', trl.__version__)"  || echo   *** 未検出 *** trl
python -c "import peft; print('  peft', peft.__version__)"  || echo   *** 未検出 *** peft

echo [実験管理・MLOps]
python -c "import mlflow; print('  mlflow', mlflow.__version__)"  || echo   *** 未検出 *** mlflow

echo [UIフレームワーク]
python -c "import gradio; print('  gradio', gradio.__version__)"  || echo   *** 未検出 *** gradio
python -c "import streamlit; print('  streamlit', streamlit.__version__)"  || echo   *** 未検出 *** streamlit

echo [JupyterLab]
python -c "import jupyterlab; print('  jupyterlab', jupyterlab.__version__)"  || echo   *** 未検出 *** jupyterlab

echo [TensorFlow]
python -c "import tensorflow; print('  tensorflow', tensorflow.__version__)"  || echo   *** 未検出 *** tensorflow
python -c "import tf_keras; print('  tf-keras OK')"  || echo   *** 未検出 *** tf-keras
python -c "import flatbuffers; print('  flatbuffers OK')"  || echo   *** 未検出 *** flatbuffers
python -c "import flatgeobuf; print('  flatgeobuf OK')"  || echo   *** 未検出 *** flatgeobuf

echo [PyTorch関連]
python -c "import torch; print('  torch', torch.__version__); print('  CUDA available:', torch.cuda.is_available())"  || echo   *** 未検出 *** torch
python -c "import torchvision; print('  torchvision', torchvision.__version__)"  || echo   *** 未検出 *** torchvision
python -c "import torchaudio; print('  torchaudio', torchaudio.__version__)"  || echo   *** 未検出 *** torchaudio
python -c "import torch_cluster; print('  torch-cluster OK')"  || echo   *** 未検出 *** torch-cluster

echo [その他]
python -c "import imageio; print('  imageio', imageio.__version__)"  || echo   *** 未検出 *** imageio
python -c "import pymeshlab; print('  pymeshlab', pymeshlab)"  || echo   *** 未検出 *** pymeshlab
python -c "import sophuspy; print('  sophuspy OK')"  || echo   *** 未検出 *** sophuspy
python -c "import fast_simplification; print('  fast_simplification OK')"  || echo   *** 未検出 *** fast_simplification
python -c "import plotly; print('  plotly', plotly.__version__)"  || echo   *** 未検出 *** plotly
python -c "import torchdiffeq; print('  torchdiffeq OK')"  || echo   *** 未検出 *** torchdiffeq
python -c "import sentencepiece; print('  sentencepiece', sentencepiece.__version__)"  || echo   *** 未検出 *** sentencepiece
python -c "import google.protobuf; print('  protobuf', google.protobuf.__version__)"  || echo   *** 未検出 *** protobuf
python -c "import pyrender; print('  pyrender', pyrender.__version__)"  || echo   *** 未検出 *** pyrender

echo [SAM2]
python -c "import sam2; print('  sam2 OK')"  || echo   *** 未検出 *** sam2

echo [InsightFace]
python -c "import insightface; print('  insightface', insightface.__version__)"  || echo   *** 未検出 *** insightface
python -c "import onnxruntime; print('  onnxruntime', onnxruntime.__version__)"  || echo   *** 未検出 *** onnxruntime

REM ===== 動作確認 =====

REM SAM2 動作確認
python -c "import urllib.request, torch; from sam2.build_sam import build_sam2; from sam2.sam2_image_predictor import SAM2ImagePredictor; urllib.request.urlretrieve('https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_tiny.pt', 'sam2.1_hiera_tiny.pt'); urllib.request.urlretrieve('https://ultralytics.com/images/bus.jpg', 'sample.jpg'); import numpy as np; from PIL import Image; predictor = SAM2ImagePredictor(build_sam2('configs/sam2.1/sam2.1_hiera_t.yaml', 'sam2.1_hiera_tiny.pt')); predictor.set_image(np.array(Image.open('sample.jpg').convert('RGB'))); masks, scores, _ = predictor.predict(point_coords=[[320,240]], point_labels=[1]); print('マスク数:', len(masks), '最高スコア:', scores.max())"

REM YOLO11によるultralytics動作確認
python -c "import urllib.request; from ultralytics import YOLO; urllib.request.urlretrieve('https://ultralytics.com/images/bus.jpg', 'sample.jpg'); model = YOLO('yolo11n.pt'); results = model('sample.jpg'); results[0].show()"

REM FastSAM動作確認
python -c "import urllib.request; from ultralytics import FastSAM; urllib.request.urlretrieve('https://ultralytics.com/images/bus.jpg', 'sample.jpg'); model = FastSAM('FastSAM-s.pt'); results = model('sample.jpg'); results[0].show()"

REM RTDETR 動作確認
python -c "import urllib.request; from ultralytics import RTDETR; urllib.request.urlretrieve('https://ultralytics.com/images/bus.jpg', 'sample.jpg'); model = RTDETR('rtdetr-l.pt'); results = model('sample.jpg'); results[0].show()"

REM InsightFace 動作確認
python -c "import numpy as np; np.int = int; import urllib.request, cv2; from insightface.app import FaceAnalysis; urllib.request.urlretrieve('https://raw.githubusercontent.com/deepinsight/insightface/master/python-package/insightface/data/images/t1.jpg', 'sample.jpg'); app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider']); app.prepare(ctx_id=0, det_size=(640, 640)); img = cv2.imread('sample.jpg'); faces = app.get(img); result = app.draw_on(img, faces); cv2.imshow('InsightFace', result); cv2.waitKey(0)"

REM ===== 確認完了 =====
ソフトウェア説明用途備考
NumPy高速な多次元配列(ndarray)演算を提供するライブラリ。主にC言語で実装されている。数値計算pipでインストール
NumbaJIT(Just-In-Time:実行時コンパイル)コンパイラ。LLVMコンパイラ基盤を利用し,PythonおよびNumPyのコードを実行時にマシンコードへ変換して高速化する。関数にデコレータ(関数の動作を修飾する構文)を付与して使用する。数値計算の高速化pipでインストール
SciPyNumPyを基盤とした科学技術計算ライブラリ。最適化,積分,補間(Interpolation:既知のデータ点から未知の点の値を推定する手法),線形代数,統計,信号処理などのアルゴリズムを提供する。科学技術計算pipでインストール
PandasDataFrame(行と列で構成される表形式データ構造)で表形式データの操作,集計,前処理ができる。データ前処理,集計pipでインストール
Matplotlibデータ可視化ライブラリ。2次元・3次元のグラフを作成できる。グラフ作成pipでインストール
Plotlyインタラクティブなグラフ作成ライブラリ。Webブラウザ上で操作可能な2次元・3次元のグラフを生成できる。インタラクティブ可視化pipでインストール
scikit-learn汎用的な機械学習ライブラリ。回帰,分類,クラスタリング等のアルゴリズムを提供する。機械学習pipでインストール
Pillow画像処理ライブラリ。リサイズ,回転,フィルタ適用,形式変換などができる。画像加工pipでインストール
imageio,static-ffmpegimageioは画像・動画の読み書きライブラリで,ffmpegやpyavプラグインにより動画の読み込み・書き出しにも対応する。static-ffmpegはFFmpeg(動画・音声のエンコード・デコードを行うマルチメディアフレームワーク)のスタティックバイナリをPythonから利用できるようにするラッパーツールで,別途FFmpegをインストールせずに動画処理ができる。画像・動画I/O,エンコード・デコードpipでインストール
albumentations画像データ拡張(Data Augmentation:学習データの多様性を高めるために画像に変換を加える手法)ライブラリ。回転,反転,色調変更,クロップなど多数の変換を提供する。画像データ拡張pipでインストール
opencv-pythonコンピュータビジョン用ライブラリ。フィルタリング,幾何変換,色空間変換(RGB,HSV等の異なる色表現間の変換)などの画像処理に加え,顔検出や物体検出などの映像解析ができる。画像処理,画像認識,動画解析pipでインストール
ultralyticsYOLOシリーズの統合パッケージ。物体検出,インスタンスセグメンテーション(個々の物体単位で領域を分割する手法),姿勢推定,画像分類,物体追跡に対応する。関連パッケージとしてboxmot(マルチオブジェクトトラッキング)がある。物体検出,セグメンテーションpipでインストール
supervisionRoboflowが提供するコンピュータビジョンのユーティリティライブラリ。物体検出・セグメンテーション・追跡の結果に対してアノテーション(検出結果の描画・注釈付け)描画,物体カウント,ゾーン検出などの後処理を実行できる。モデル非依存で複数のフレームワークの出力を共通処理できる。CV後処理,アノテーションpipでインストール
easyocr80以上の言語に対応したOCR(光学文字認識)ライブラリ。深層学習ベースで画像中のテキストを検出・認識する。日本語にも対応している。関連パッケージとしてyomitoku(日本語特化のAI文書画像解析エンジン)がある。文字認識(OCR)pipでインストール
face-alignment深層学習ベースの顔ランドマーク(顔の特徴的な位置を示す点)検出ライブラリ。2Dおよび3Dの顔特徴点を検出できる。顔ランドマーク検出pipでインストール
deepface深層学習ベースの顔認識・顔属性分析ライブラリ。VGG-Face,FaceNet,ArcFace等の複数モデルを統合し,顔照合,年齢・性別・表情の推定ができる。関連パッケージとしてretina-face(深層学習ベースの顔検出ライブラリ)がある。顔認識,顔属性分析pipでインストール
onnxruntime(onnxruntime-gpu)Microsoftが提供するクロスプラットフォームのML推論エンジン。ONNX(Open Neural Network Exchange)形式の学習済みモデルを実行する。onnxruntime-gpuはGPU(CUDA)対応版である。insightface等が推論バックエンドとして使用する。ONNXモデル推論pipでインストール
insightface深層学習ベースの2D・3D顔分析ライブラリ。顔検出,顔認識,顔アライメント,顔属性推定の学習済みモデルを提供する。推論にONNX Runtimeを使用する。顔検出,顔認識,顔分析pipでインストール
mediapipeGoogleが提供するマルチモーダルML推論ライブラリ。手,顔,姿勢のランドマーク検出,ジェスチャー認識,物体検出などに対応する。GPUなしでも動作する。手・顔・姿勢検出pipでインストール
rembg深層学習ベースの画像背景除去ライブラリ。U2-Net(顕著性物体検出のためのセグメンテーションモデル)等を使用し,人物や物体の背景を自動で除去できる。コマンドライン,Pythonライブラリ,HTTPサーバの3形態で利用できる。画像背景除去pipでインストール
sixdrepnet6D回転表現に基づく頭部姿勢推定ライブラリ。画像から頭部のピッチ,ヨー,ロール(上下,左右,傾きの3軸回転角度)を推定する。頭部姿勢推定pipでインストール
SAM 2Metaが提供するSegment Anything Model 2(プロンプト指定による汎用セグメンテーション基盤モデル)。画像および動画中の任意の物体をセグメンテーションできる。画像・動画セグメンテーションソースからインストール
librosa音声・音楽解析ライブラリ。DSP(デジタル信号処理)による特徴抽出やスペクトル解析ができる。音声信号処理pipでインストール
py7zr7zアーカイブの読み書きができるライブラリ。Python実装のため外部ツールなしで7z形式の圧縮・展開ができる。圧縮・展開pipでインストール
pypandoc_binary文書変換ツールPandoc(マークアップ形式間の汎用文書変換ツール)のPythonラッパー。Pandocバイナリを同梱しており,Markdown,HTML,LaTeX,DOCX,PDF等の相互変換をPythonから実行できる。文書形式変換pipでインストール
requests,beautifulsoup4requestsはHTTP通信ライブラリで,GET,POST等のHTTPリクエストを簡潔なコードで送信できる。beautifulsoup4はHTML・XML解析ライブラリで,Webページからのデータ抽出(Webスクレイピング)に使用する。requestsでWebページを取得し,beautifulsoup4で解析する組み合わせで利用することが多い。Web API通信,Webスクレイピングpipでインストール
Flask軽量なWebアプリケーションフレームワーク。WebアプリケーションやREST APIを構築できる。Webアプリケーション開発pipでインストール
seleniumWebブラウザ自動操作ライブラリ。Pythonからブラウザを制御し,動的なWebページの操作やWebスクレイピング,テスト自動化ができる。ブラウザ自動操作,テスト自動化pipでインストール
FastAPI,uvicornFastAPIは非同期対応のWebフレームワークで,Pythonの型ヒントを活用し,APIドキュメントの自動生成ができる。uvicornはASGI(Asynchronous Server Gateway Interface:Pythonの非同期Webサーバとアプリケーション間の標準インターフェース)対応のWebサーバで,FastAPIの実行に使用する。Web API開発,ASGIサーバpipでインストール
PydanticPythonの型ヒントを利用したデータバリデーション(入力データが定義された型や制約に適合するかを検証する処理)ライブラリ。APIの入出力定義,設定管理,データモデル定義に使用する。FastAPIやLangChain等が内部で依存している。データバリデーションpipでインストール
SQLAlchemyPython用のデータベースツールキット。ORM(Object-Relational Mapping:Pythonオブジェクトとリレーショナルデータベースのテーブルを対応付ける仕組み)とSQLの直接記述の両方に対応する。SQLite,PostgreSQL,MySQL等の複数のデータベースを扱える。データベース操作pipでインストール
PyTorch(torch,torchvision,torchaudio)Metaが開発する深層学習フレームワーク。テンソル演算,自動微分,GPU加速をサポートする。torchvisionはコンピュータビジョン用のデータセット・モデル・画像変換,torchaudioは音声処理用のデータセット・モデル・信号処理機能を提供する。深層学習pipでインストール。CUDA 12.8対応版は pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 を使用する(cu128)。
accelerateHugging Faceが提供する分散学習・推論ライブラリ。マルチGPU・マルチノード環境での学習と推論を実行できる。混合精度学習(Mixed Precision Training:単精度と半精度を組み合わせて学習を高速化する手法)にも対応する。分散学習,推論高速化pipでインストール
transformersHugging Faceが提供するライブラリ。Transformer(注意機構に基づくモデル構造)アーキテクチャの学習済みモデルを利用できる。自然言語処理に加え,画像分類,物体検出,音声認識などマルチモーダルなタスクにも対応する。自然言語処理,画像認識,音声処理pipでインストール
datasetsHugging Faceが提供するデータセット管理ライブラリ。学習用データのダウンロードとストリーミング読み込みに対応する。データセット取得pipでインストール
diffusersHugging Faceが提供する拡散モデル(Diffusion Model:データにノイズを加える過程を逆転させて生成する深層生成モデル)ライブラリ。画像生成,動画生成,音声生成などの学習済み拡散モデルを利用できる。画像生成,動画生成pipでインストール
peft,trlHugging Faceが提供するLLMファインチューニング用ライブラリ群。PEFT(Parameter-Efficient Fine-Tuning:モデル全体ではなく少数のパラメータのみを追加学習する手法)はLoRA等の効率的なファインチューニングを提供する。TRL(Transformer Reinforcement Learning)はSFT(教師あり微調整),RLHF(人間のフィードバックによる強化学習),DPO(直接選好最適化)等のポストトレーニング手法を提供する。LLMファインチューニングpipでインストール
einops,timm深層学習モデルの構築・学習を補助するライブラリ群。einopsはアインシュタイン記法によるテンソル操作ライブラリ,timmはPyTorch用の画像モデルコレクションの実装である。テンソル操作,画像モデルpipでインストール
huggingface_hubHugging Face Hubとの連携ライブラリ。モデル・データセットのダウンロード・アップロード,CLIツール,リポジトリ管理機能を提供する。高速転送にはhf_xet(Rustベースの高速ファイル転送ツール)を使用する。Hugging Face Hub連携pipでインストール
sentence-transformers文埋め込みライブラリ。文章を多次元ベクトルに変換し,RAG(検索拡張生成)での類似度計算に使用する。文埋め込み,類似検索pipでインストール
sentencepieceGoogleが開発した言語非依存のサブワードトークナイザ(テキストをサブワード単位に分割するツール)。BPE(Byte Pair Encoding:頻出する文字列の組を繰り返し統合してサブワードを構成するアルゴリズム)やUnigram言語モデルに基づくトークン化を提供する。多くのLLMや多言語モデルの前処理に使用される。テキストトークン化pipでインストール
spaCy自然言語処理ライブラリ。トークン化(テキストを単語や記号の単位に分割する処理),品詞タグ付け,係り受け解析,固有表現認識(NER:テキスト中の人名・地名・組織名等を識別する処理)などの構文解析機能を提供する。関連パッケージとしてGiNZA(Universal Dependencies準拠の日本語NLPライブラリ。ginzaおよびja-ginzaパッケージ)がある。構文解析,固有表現認識pipでインストール
LangChainLLMアプリケーション構築用フレームワーク。LLMと外部データソースを連携し,複数の処理を連結できる。関連パッケージとしてlangchain-community,langchain-openai,langchain-google-genai,langchain-anthropic,langchain-ollama,langchain-huggingface,LangGraph(エージェントのワークフロー構築ライブラリ)がある。RAG,エージェント開発pipでインストール
langchain-ollama,langchain-huggingfaceLangChainの拡張パッケージ。langchain-ollamaはローカルLLM実行環境Ollamaとの連携,langchain-huggingfaceはHugging Faceのモデル・埋め込み・データセットとの連携を提供する。LangChain拡張(Ollama連携,Hugging Face連携)pipでインストール
chromadbベクトルデータベース(高次元ベクトル専用のデータベース)。ANN(近似最近傍探索)で類似データを取得する。ベクトル検索pipでインストール
openaiOpenAI APIのクライアントライブラリ。GPT-5系等のモデルをプログラムから呼び出せる。OpenAI API連携pipでインストール
OpenVINOIntelが提供するAIモデル推論最適化ツールキット。学習済みモデルをIntel製CPU・GPU・NPU向けに最適化して推論を実行できる。AI推論最適化pipでインストール
google-genaiGoogle Gemini APIの公式クライアントライブラリ。旧google-generativeaiの後継パッケージである。Geminiの推論機能や画像・動画分析をプログラムから呼び出せる。Gemini API連携pipでインストール
anthropicAnthropic APIの公式クライアントライブラリ。Claudeモデルをプログラムから呼び出せる。Claude API連携pipでインストール
litellm複数のLLM APIを統合するクライアントライブラリ。OpenAI形式の統一インターフェースで各社APIを扱える。マルチLLM連携pipでインストール
protobufGoogleが開発したProtocol Buffers(言語・プラットフォーム非依存の構造化データシリアライゼーション形式)のPythonライブラリ。モデルの保存形式や各種フレームワーク間のデータ交換に使用される。データシリアライゼーションpipでインストール
TensorFlow,tf-kerasGoogleが開発する機械学習フレームワーク。テンソル演算,自動微分,GPU加速をサポートする。WindowsネイティブではTensorFlow 2.10が最後のGPU対応リリースであり,2.11以降はCPUで動作する。tf-kerasはTensorFlow向けの高レベルAPIで,ニューラルネットワークの構築・学習を簡潔に記述できる。深層学習pipでインストール
flatbuffers,flatgeobufflatbuffersはGoogleが開発したFlatBuffers(パース不要で直接アクセス可能な高効率シリアライゼーション形式)のPythonランタイムライブラリで,TensorFlow等が内部で使用する。flatgeobufはFlatBuffersベースの地理空間データ形式FlatGeobuf(バイナリ形式の地理空間ベクタデータフォーマット)の読み込みライブラリである。データシリアライゼーション,地理空間データpipでインストール
torch-clusterPyTorch向けのクラスタリング・グラフサンプリングアルゴリズムパッケージ。最近傍探索,Voxelグリッドクラスタリング(3次元空間をボクセル単位で分割しクラスタ化する手法)等を提供し,PyTorch Geometricの基盤として使用される。グラフ処理,点群処理pipでインストール。PyTorchのバージョンとCUDA 12.8に対応したwheelを指定する。
torchdiffeqPyTorchベースの常微分方程式(ODE)ソルバー。Neural ODE(ニューラルネットワークの層を連続的な微分方程式として定式化する手法)の実装に使用する。微分方程式,Neural ODEpipでインストール
pymeshlab,fast_simplification,pyrender3次元データ処理・可視化ライブラリ群。pymeshlabはMeshLab(3Dメッシュ処理ソフトウェア)の機能をPythonから利用できるライブラリ,fast_simplificationはメッシュ簡略化ライブラリ,pyrenderはOpenGLベースの3Dシーンレンダリングライブラリである。3Dメッシュ処理,レンダリングpipでインストール
sophuspyリー群(SO(3),SE(3)等の回転・変換を表す数学的構造)の演算ライブラリ。3次元の回転や剛体変換の計算に使用する。3D幾何演算pipでインストール
MLflow機械学習ライフサイクル管理プラットフォーム。実験のトラッキング(パラメータ,メトリクス,成果物の記録・追跡),モデルレジストリ(学習済みモデルのバージョン管理),デプロイメントを管理できる。実験管理,MLOpspipでインストール
GradioAIデモ用のUI構築ライブラリ。PythonコードからWebインターフェースを生成できる。AIデモ作成pipでインストール
JupyterLab対話的プログラミング環境。コードと実行結果を一つのノートブックに記録しながら分析できる。対話的データ分析pipでインストール
streamlitデータアプリケーション構築用フレームワーク。Pythonスクリプトから対話的なWebアプリケーションを生成できる。対話的アプリ開発pipでインストール

【前提条件】

以下のソフトウェアが事前にインストールされていること(未インストールの場合は本スクリプトが自動でインストールを試みる)。

7. 3次元

Python 3.12、Git、Visual Studio Build Tools、Blender、VGGT、plateaukit、Panda3D、Open3D、Nerfstudio、MeshLabなど、3次元モデリング、レンダリング、アニメーション、3次元ガウシアンスプラッティング、3次元ゲームエンジンと、それらのインストールのための前提となるソフトのインストールを行う。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM (バッチファイルではなくコマンドプロンプトで実行する)
REM  前提条件:
REM    - Python 3.12 が C:\Program Files\Python312 にインストール済みであること
REM      (未インストールの場合は本コマンドが自動でインストールを試みる)
REM    - Git がインストール済みであること
REM      (未インストールの場合は本コマンドが自動でインストールを試みる)
REM    - Visual Studio 2026 Build Tools がインストール済みであること
REM      (未インストールの場合は本コマンドが自動でインストールを試みる)
REM    - NVIDIA GPU ドライバーおよび CUDA 12.8 対応環境
REM      (未搭載の場合は CPU モードで動作するが、
REM       3次元再構成等の処理は低速となる)
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip.exe"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM Git存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
if exist "C:\Program Files\Git\cmd\git.exe" ( ver >nul ) else ( echo Git が見つかりません。インストールします... & winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=\"icons,ext\reg\shellhere,assoc,assoc_sh\" /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled" )
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Git のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
powershell -NoProfile -Command "$g='C:\Program Files\Git\cmd'; if(Test-Path $g){ $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if((';'+$c+';') -notlike \"*;$g;*\"){ $k.SetValue('Path',($g+';'+$c.TrimEnd(';')),$t) }; $k.Close() }"

REM システム環境変数の変更は実行中のコマンドプロンプトに反映されないため、
REM このセッションのPATHにもGitを追加する(後続のgitコマンド用)
set "PATH=%PATH%;C:\Program Files\Git\cmd"

REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)


REM ============================================================
REM Blender インストール
REM ============================================================
winget install --id BlenderFoundation.Blender -e --scope machine --silent --accept-package-agreements --accept-source-agreements --location "C:\Program Files\Blender" --force
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Blender のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Blender実行ファイルのパスを動的に検出
set "BLENDER_EXE="
powershell -NoProfile -Command "Get-ChildItem -Path 'C:\Program Files','C:\Program Files (x86)' -Recurse -Filter 'blender.exe' -ErrorAction SilentlyContinue | Sort-Object -Property @{Expression={[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).FileVersion}} -Descending | Select-Object -First 1 -ExpandProperty FullName" > "%TEMP%\blender_path.txt"
set /p BLENDER_EXE=<"%TEMP%\blender_path.txt"
del "%TEMP%\blender_path.txt"
if not defined BLENDER_EXE ( color 0c & echo Blenderの実行ファイルが見つかりません & ping 127.0.0.1 -n 6 >nul & color )
echo Blender: %BLENDER_EXE%

REM BlenderディレクトリをPATHに追加
for %i in ("%BLENDER_EXE%") do set "BLENDER_DIR=%~dpi"
set "BLENDER_DIR=%BLENDER_DIR:~0,-1%"
powershell -NoProfile -Command "$p='%BLENDER_DIR%'; if(Test-Path $p){ $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if((';'+$c+';') -notlike \"*;$p;*\"){ $k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t) }; $k.Close() }"

REM ============================================================
REM Blendkit インストール
REM ============================================================
REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

REM 設定の退避
if exist "%APPDATA%\Blender Foundation\Blender\5.2\config\userpref.blend" copy /y "%APPDATA%\Blender Foundation\Blender\5.2\config\userpref.blend" "%APPDATA%\Blender Foundation\Blender\5.2\config\userpref.blend.bak"
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils, bpy; addon_utils.disable('blenderkit', default_set=True); a=bpy.context.preferences.addons; [a.remove(a[k]) for k in ('skysplat_blender','blenderkit') if k in a]; bpy.ops.wm.save_userpref(); print('KEYS:', list(bpy.context.preferences.addons.keys()))"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 旧アドオン登録の除去に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 旧形式のフォルダを削除
rmdir /s /q "%APPDATA%\Blender Foundation\Blender\5.2\scripts\addons\blenderkit"

ECHO BlendKit
set "BLENDKIT_ZIP=%TEMP%\blenderkit.zip"

REM Blender内蔵Pythonを使用して最新版のZIP URLを動的に取得しダウンロード (PowerShell不使用)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import urllib.request, json; url=next(a['browser_download_url'] for a in json.loads(urllib.request.urlopen('https://api.github.com/repos/BlenderKit/blenderkit/releases/latest').read())['assets'] if a['name'].endswith('.zip')); print('Downloading:', url); urllib.request.urlretrieve(url, r'%BLENDKIT_ZIP%')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendKit のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 拡張機能としてインストール(公式CLI・再実行時は上書き)
"%BLENDER_EXE%" --command extension install-file -r user_default --enable "%BLENDKIT_ZIP%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendKit のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 有効化の確定と実体での検証(オペレータの戻り値だけを信用しない)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; m='bl_ext.user_default.blenderkit'; bpy.ops.preferences.addon_enable(module=m); bpy.ops.wm.save_userpref(); assert m in bpy.context.preferences.addons, 'NOT ENABLED'; print('OK ENABLED:', m)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendKit の有効化に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "%APPDATA%\Blender Foundation\Blender\5.2\extensions\user_default\blenderkit" ( color 0c & echo BlendKit の展開先が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

color 0a & echo 完了: Blender を一度再起動してから BlenderKit を使用してください & color

REM ============================================================
REM BlendLuxCore and sample インストール
REM ============================================================

REM ============================================================
REM ユーザーリソースのパスを Blender 自身から取得(バージョン非固定)
REM   対話 cmd / バッチの双方で同一に動くよう、Python 側は % 書式と " を使わず
REM   set "K=V" 形式の一時 cmd を生成して call する(for /f も %% も使わない)
set "BLC_INFO=%TEMP%\blc_paths.cmd"
if exist "%BLC_INFO%" del /f /q "%BLC_INFO%"
"%BLENDER_EXE%" --background --factory-startup --python-exit-code 1 --python-expr "import bpy, os, sys, pathlib; ext = pathlib.Path(bpy.utils.user_resource('EXTENSIONS')); q = chr(34); vals = {'BL_VER': f'{bpy.app.version[0]}.{bpy.app.version[1]}', 'BL_CFG': bpy.utils.user_resource('CONFIG'), 'BL_SCRIPTS': bpy.utils.user_resource('SCRIPTS'), 'BL_EXT': str(ext), 'BL_SP': str(ext / '.local' / 'lib' / f'python{sys.version_info[0]}.{sys.version_info[1]}' / 'site-packages')}; open(os.environ['BLC_INFO'], 'w', encoding='mbcs').write(''.join(f'set {q}{k}={v}{q}\n' for k, v in vals.items()))" >nul
if not exist "%BLC_INFO%" ( color 0c & echo Blenderのユーザーパス取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
call "%BLC_INFO%"
if exist "%BLC_INFO%" del /f /q "%BLC_INFO%"
if not defined BL_EXT ( color 0c & echo 拡張機能フォルダを特定できません & ping 127.0.0.1 -n 6 >nul & color )
echo Blender version : %BL_VER%
echo Extensions      : %BL_EXT%
echo site-packages   : %BL_SP%

REM ============================================================
ECHO BlendLuxCore and sample set
set "BLC_VER=2.11.0"
set "BLC_ZIP=%TEMP%\BlendLuxCore-%BLC_VER%.zip"
set "BLC_ID=blendluxcore"
set "BLC_MOD=bl_ext.user_default.%BLC_ID%"

REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

REM 設定の退避
if exist "%BL_CFG%\userpref.blend" copy /y "%BL_CFG%\userpref.blend" "%BL_CFG%\userpref.blend.bak"

REM 旧形式(scripts\addons)と旧IDの登録を除去(大文字ID・小文字IDの両方)
REM   ここで壊れたアドオンの読み込みが起きて ImportError のトレースバックが出るのは想定内。
REM   userpref を書き戻すため --factory-startup は付けない(他アドオン設定が初期化される)。
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils, bpy; K=('BlendLuxCore','bl_ext.user_default.BlendLuxCore','bl_ext.user_default.blendluxcore'); [addon_utils.disable(k, default_set=True) for k in K]; a=bpy.context.preferences.addons; [a.remove(a[k]) for k in K if k in a]; bpy.ops.wm.save_userpref(); print('KEYS:', list(a.keys()))"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 旧アドオン登録の除去に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if exist "%BL_SCRIPTS%\addons\BlendLuxCore" rmdir /s /q "%BL_SCRIPTS%\addons\BlendLuxCore"

REM アドオンフォルダの削除(wheels / wheels_backup / pyluxcore_installation_info.txt を含む)
if exist "%BL_EXT%\user_default\%BLC_ID%" rmdir /s /q "%BL_EXT%\user_default\%BLC_ID%"

REM site-packages は pyluxcore 配布物だけを削除(RECORD のトップレベル+pyluxcore プレフィックス限定)
REM   上の手順で userpref から外れた時点で Blender 側が既に除去していることが多く、
REM   その場合 [DEL ] は出力されない(残骸がある場合のみ削除される)
"%BLENDER_EXE%" --background --factory-startup --python-exit-code 1 --python-expr "import bpy, csv, pathlib, shutil; root = pathlib.Path(bpy.utils.user_resource('EXTENSIONS')) / '.local' / 'lib'; mine = lambda n: n.lower().startswith('pyluxcore'); tops = lambda sp: sorted({p.name for p in sp.glob('pyluxcore*')} | {row[0].replace('\\', '/').split('/')[0] for di in sp.glob('pyluxcore-*.dist-info') if (di / 'RECORD').is_file() for row in csv.reader((di / 'RECORD').open(newline='', encoding='utf-8')) if row and row[0]}); [[print('[PURGE]', sp)] + [(print('[DEL ]', n), shutil.rmtree(sp / n) if (sp / n).is_dir() else (sp / n).unlink()) if mine(n) else print('[KEEP]', n) for n in tops(sp) if (sp / n).exists()] for sp in sorted(root.glob('python3.*/site-packages'))]"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pyluxcore のパージに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM pyluxcore.pyd が要求する非同梱ランタイムの確認(VC++ 2015-2022 x64)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import ctypes; [ctypes.WinDLL(n) for n in ('vcruntime140.dll','vcruntime140_1.dll')]; print('OK VCRUNTIME')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VC++ 2015-2022 x64 再配布パッケージを導入してください: winget install --id Microsoft.VCRedist.2015+.x64 -e & ping 127.0.0.1 -n 6 >nul & color )

REM サンプルシーンの取得
if not exist "c:\image" mkdir "c:\image"
cd /d c:\image
set GIT_LFS_SKIP_SMUDGE=1
if not exist "LuxCoreTestScenes" git clone https://github.com/LuxCoreRender/LuxCoreTestScenes.git
if not exist "c:\image\LuxCoreTestScenes\.git" ( color 0c & echo サンプルシーンのクローンに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d c:\image\LuxCoreTestScenes

REM アドオン本体のダウンロード
curl -f -L -o "%BLC_ZIP%" "https://github.com/LuxCoreRender/BlendLuxCore/releases/download/v%BLC_VER%/BlendLuxCore-%BLC_VER%.zip"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendLuxCore のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 拡張機能としてインストール(--enable によりこの時点で pyluxcore が PyPI から取得・導入される)
"%BLENDER_EXE%" --command extension install-file -r user_default --enable "%BLC_ZIP%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendLuxCore のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 正しいモジュールIDで有効化を確定し、pyluxcore の実ロードまで検証
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy, importlib.metadata as md; m='%BLC_MOD%'; bpy.ops.preferences.addon_enable(module=m); bpy.ops.wm.save_userpref(); assert m in bpy.context.preferences.addons, 'NOT ENABLED'; import pyluxcore; print('OK ENABLED:', m, '/ pyluxcore', md.version('pyluxcore'))"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendLuxCore の有効化に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "%BL_EXT%\user_default\%BLC_ID%" ( color 0c & echo BlendLuxCore の展開先が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM 完了案内
color 0a & echo 完了: Blender を一度再起動してから Render Engine に LuxCore を選択してください & color

REM ============================================================
REM SkySplat(Blenderアドオン)インストール
REM ============================================================
REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

ECHO SkySplat
set "SKYSPLAT_ZIP=%TEMP%\skysplat_blender.zip"
set "SKYSPLAT_ADDONS=%APPDATA%\Blender Foundation\Blender\5.2\scripts\addons"
cd /d "%TEMP%"

REM ダウンロード
curl -f -L -o "%SKYSPLAT_ZIP%" "https://github.com/kyjohnso/skysplat_blender/releases/download/v0.4.2/skysplat_blender_win_0.4.2.zip"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開(前回の残骸を除去してから実行)
if exist "%SKYSPLAT_ADDONS%\skysplat_blender" rmdir /s /q "%SKYSPLAT_ADDONS%\skysplat_blender"
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; bpy.ops.preferences.addon_install(filepath=r'%SKYSPLAT_ZIP%', overwrite=True)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開結果を確認してから旧版を置換
if not exist "%SKYSPLAT_ADDONS%\skysplat_blender\__init__.py" ( color 0c & echo SkySplat の展開結果が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM 不要な登録の除去と有効化
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; a=bpy.context.preferences.addons; [a.remove(a[k]) for k in ('skysplat_blender',) if k in a]; bpy.ops.preferences.addon_enable(module='skysplat_blender'); bpy.ops.wm.save_userpref()"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM アドオンの有効化状況確認
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils; r=[(m.__name__, addon_utils.check(m.__name__)) for m in addon_utils.modules() if 'skysplat' in m.__name__.lower()]; print('SKYSPLAT:', r); assert r and r[0][1][1], 'NOT ENABLED'"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat が有効化されていません & ping 127.0.0.1 -n 6 >nul & color )

color 0a & echo 完了: Blender を一度再起動してから SkySplat を使用してください & color

REM ============================================================
REM KIRI Engine 3DGS Render Blenderアドオン インストール
REM   KIRI Engine製。学習済みの3次元ガウシアンスプラットを
REM   インポート、レンダリング、編集する。
REM   https://github.com/Kiri-Innovation/3dgs-render-blender-addon
REM ============================================================
REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

ECHO KIRI Engine 3DGS Render
set "KIRI_ZIP=%TEMP%\3dgs_render_by_kiri_engine.zip"
cd /d "%TEMP%"

REM Blender内蔵Pythonを使用して最新リリースのZIPアセットを取得 (PowerShell不使用)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import urllib.request, json; url=next(a['browser_download_url'] for a in json.loads(urllib.request.urlopen('https://api.github.com/repos/Kiri-Innovation/3dgs-render-blender-addon/releases/latest').read())['assets'] if a['name'].endswith('.zip')); print('Downloading:', url); urllib.request.urlretrieve(url, r'%KIRI_ZIP%')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo KIRI Engine 3DGS Render のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 拡張機能としてインストール(公式CLI・wheel も同時に導入/再実行時は上書き)
"%BLENDER_EXE%" --command extension install-file -r user_default --enable "%KIRI_ZIP%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo KIRI Engine 3DGS Render のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 有効化の確定と実体での検証(オペレータの戻り値だけを信用しない)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; m='bl_ext.user_default.dgs_render_by_kiri_engine'; bpy.ops.preferences.addon_enable(module=m); bpy.ops.wm.save_userpref(); assert m in bpy.context.preferences.addons, 'NOT ENABLED'; print('OK ENABLED:', m)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo KIRI Engine 3DGS Render の有効化に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "%APPDATA%\Blender Foundation\Blender\5.2\extensions\user_default\dgs_render_by_kiri_engine" ( color 0c & echo KIRI Engine 3DGS Render の展開先が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM 有効化状況の確認
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils; print('KIRI:', [(m.__name__, addon_utils.check(m.__name__)) for m in addon_utils.modules() if 'kiri' in m.__name__.lower() or '3dgs' in m.__name__.lower()])"

color 0a & echo 完了: Blender を一度再起動してから 3DGS Render を使用してください & color

REM ============================================================
REM Plateau-Blender-Importer インストール
REM   PLATEAU(国土交通省)の3D都市モデルをBlenderへ取り込む。
REM   https://github.com/nneri-hin/Plateau-Blender-Importer
REM ============================================================

REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

ECHO Plateau-Blender-Importer
set "PLATEAU_ZIP=%TEMP%\Plateau-Blender-Importer-main.zip"
cd /d "%TEMP%"

REM 1. プラグインのダウンロード
curl -f -L -o "%PLATEAU_ZIP%" "https://github.com/nneri-hin/Plateau-Blender-Importer/archive/refs/heads/main.zip"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Plateau-Blender-Importer のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 2. 一時領域へ展開し、内容を検証してから置換・有効化
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy, os, zipfile, shutil, importlib, addon_utils; ad=bpy.utils.user_resource('SCRIPTS', path='addons', create=True); dest=os.path.join(ad, 'plateau_blender_importer'); tmp=dest+'_tmp'; shutil.rmtree(tmp, ignore_errors=True); z=zipfile.ZipFile(r'%PLATEAU_ZIP%', 'r'); z.extractall(tmp); z.close(); it=os.listdir(tmp); src=os.path.join(tmp, it[0]) if len(it)==1 and os.path.isdir(os.path.join(tmp, it[0])) else tmp; assert os.path.isfile(os.path.join(src, '__init__.py')), 'init file not found'; shutil.rmtree(dest, ignore_errors=True); shutil.move(src, dest); shutil.rmtree(tmp, ignore_errors=True); a=bpy.context.preferences.addons; [a.remove(a[k]) for k in ('Plateau-Blender-Importer-main',) if k in a]; importlib.invalidate_caches(); bpy.ops.preferences.addon_refresh(); bpy.ops.preferences.addon_enable(module='plateau_blender_importer'); assert addon_utils.check('plateau_blender_importer')[1], 'addon not enabled'; bpy.ops.wm.save_userpref(); print('PLATEAU_INSTALL_OK')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Plateau-Blender-Importer のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 3. 有効化状況の確認
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils; print('PLATEAU:', [(m.__name__, addon_utils.check(m.__name__)) for m in addon_utils.modules() if 'plateau' in m.__name__.lower()])"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Plateau-Blender-Importer の有効化状況を取得できませんでした & ping 127.0.0.1 -n 6 >nul & color )

color 0a & echo 完了: Blender を一度再起動し、[ファイル]→[インポート] に Plateau CityGML があるか確認してください & color

REM ============================================================
REM Plateau-Blender-Importer テストデータ
REM ============================================================

REM PLATEAU データ
if not exist "C:\image\plateau" mkdir "C:\image\plateau"
cd /d "C:\image\plateau"
if not exist "40203_kurume-shi_city_2020_citygml_6_op.zip" curl -L -O https://assets.cms.plateau.reearth.io/assets/c9/9ff21b-d141-4f5a-9808-320a31f04c4a/40203_kurume-shi_city_2020_citygml_6_op.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PLATEAU データのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "34207_fukuyama-shi_city_2020_citygml_7_op.zip" curl -L -O https://assets.cms.plateau.reearth.io/assets/e5/2263cf-3caf-4627-82db-f92d305970b7/34207_fukuyama-shi_city_2020_citygml_7_op.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PLATEAU データのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 2-1. zip の展開(V4 対応版の zip はルートフォルダを持たないため展開先を指定する)
if not exist "40203_kurume-shi_city_2020_citygml_6_op\udx\bldg" mkdir "40203_kurume-shi_city_2020_citygml_6_op" 2>nul
if not exist "40203_kurume-shi_city_2020_citygml_6_op\udx\bldg" tar -xf "40203_kurume-shi_city_2020_citygml_6_op.zip" -C "40203_kurume-shi_city_2020_citygml_6_op"
if not exist "34207_fukuyama-shi_city_2020_citygml_7_op\udx\bldg" mkdir "34207_fukuyama-shi_city_2020_citygml_7_op" 2>nul
if not exist "34207_fukuyama-shi_city_2020_citygml_7_op\udx\bldg" tar -xf "34207_fukuyama-shi_city_2020_citygml_7_op.zip" -C "34207_fukuyama-shi_city_2020_citygml_7_op"
REM 2-2. 久留米市の gml の選択(最大サイズ)
set "GMLSRC1="
set "JMC1="
for /f "delims=" %I in ('dir /b /s /o-s "C:\image\plateau\40203_kurume-shi_city_2020_citygml_6_op\*_bldg_*.gml" 2^>nul') do @if not defined GMLSRC1 set "GMLSRC1=%I"
if not defined GMLSRC1 ( color 0c & echo 久留米市の bldg の gml が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
if defined GMLSRC1 for %I in ("%GMLSRC1%") do @set "JMC1=%~nI"
if defined JMC1 set "JMC1=%JMC1:~0,8%"
if defined JMC1 echo 久留米市 gml: "%GMLSRC1%"   メッシュコード: %JMC1%
REM 2-3. 福山市の gml の選択(最大サイズ)
set "GMLSRC2="
set "JMC2="
for /f "delims=" %I in ('dir /b /s /o-s "C:\image\plateau\34207_fukuyama-shi_city_2020_citygml_7_op\*_bldg_*.gml" 2^>nul') do @if not defined GMLSRC2 set "GMLSRC2=%I"
if not defined GMLSRC2 ( color 0c & echo 福山市の bldg の gml が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
if defined GMLSRC2 for %I in ("%GMLSRC2%") do @set "JMC2=%~nI"
if defined JMC2 set "JMC2=%JMC2:~0,8%"
if defined JMC2 echo 福山市 gml: "%GMLSRC2%"   メッシュコード: %JMC2%

REM ============================================================
REM Plateau-Blender-Importer テスト実行
REM ============================================================


REM レンダリングの実行(久留米市)
ECHO 久留米市のレンダリングを実行しています...
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy, os, numpy, mathutils; numpy.asfarray = lambda a, dtype=numpy.float64: numpy.asarray(' '.join(a).split(), dtype=dtype) if isinstance(a, list) and all(isinstance(x, str) for x in a) else numpy.asarray(a, dtype=dtype); gml_path = r'%GMLSRC1%'; assert os.path.exists(gml_path), 'gml not found'; bpy.ops.object.select_all(action='SELECT'); bpy.ops.object.delete(); bpy.ops.hin.plateau_importer(filepath=gml_path, files=[{'name': os.path.basename(gml_path)}], origin_setting_jmc='%JMC1%', import_texture=False); objs = [o for o in bpy.data.objects if o.type == 'MESH']; print('IMPORTED_MESH_COUNT', len(objs)); assert len(objs) > 0, 'no mesh imported'; pts = [o.matrix_world @ mathutils.Vector(c[:]) for o in objs for c in o.bound_box]; lo = mathutils.Vector((min(p.x for p in pts), min(p.y for p in pts), min(p.z for p in pts))); hi = mathutils.Vector((max(p.x for p in pts), max(p.y for p in pts), max(p.z for p in pts))); ctr = (lo + hi) / 2; span = max((hi - lo).x, (hi - lo).y, 20.0); print('BBOX_MIN', tuple(lo), 'BBOX_MAX', tuple(hi), 'SPAN', span); cam_data = bpy.data.cameras.new('Camera'); cam_data.clip_end = max(10000.0, span * 10); cam = bpy.data.objects.new('Camera', cam_data); bpy.context.collection.objects.link(cam); bpy.context.scene.camera = cam; cam.location = (ctr.x, ctr.y - span * 1.4, ctr.z + span * 1.4); cam.rotation_euler = (0.785, 0, 0); light_data = bpy.data.lights.new(name='Sun', type='SUN'); light = bpy.data.objects.new(name='Sun', object_data=light_data); bpy.context.collection.objects.link(light); bpy.context.scene.render.filepath = r'C:\image\plateau_render_result1.png'; bpy.ops.render.render(write_still=True)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 久留米市のレンダリング処理に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM レンダリングの実行(福山市)
ECHO 福山市のレンダリングを実行しています...
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy, os, numpy, mathutils; numpy.asfarray = lambda a, dtype=numpy.float64: numpy.asarray(' '.join(a).split(), dtype=dtype) if isinstance(a, list) and all(isinstance(x, str) for x in a) else numpy.asarray(a, dtype=dtype); gml_path = r'%GMLSRC2%'; assert os.path.exists(gml_path), 'gml not found'; bpy.ops.object.select_all(action='SELECT'); bpy.ops.object.delete(); bpy.ops.hin.plateau_importer(filepath=gml_path, files=[{'name': os.path.basename(gml_path)}], origin_setting_jmc='%JMC2%', import_texture=False); objs = [o for o in bpy.data.objects if o.type == 'MESH']; print('IMPORTED_MESH_COUNT', len(objs)); assert len(objs) > 0, 'no mesh imported'; pts = [o.matrix_world @ mathutils.Vector(c[:]) for o in objs for c in o.bound_box]; lo = mathutils.Vector((min(p.x for p in pts), min(p.y for p in pts), min(p.z for p in pts))); hi = mathutils.Vector((max(p.x for p in pts), max(p.y for p in pts), max(p.z for p in pts))); ctr = (lo + hi) / 2; span = max((hi - lo).x, (hi - lo).y, 20.0); print('BBOX_MIN', tuple(lo), 'BBOX_MAX', tuple(hi), 'SPAN', span); cam_data = bpy.data.cameras.new('Camera'); cam_data.clip_end = max(10000.0, span * 10); cam = bpy.data.objects.new('Camera', cam_data); bpy.context.collection.objects.link(cam); bpy.context.scene.camera = cam; cam.location = (ctr.x, ctr.y - span * 1.4, ctr.z + span * 1.4); cam.rotation_euler = (0.785, 0, 0); light_data = bpy.data.lights.new(name='Sun', type='SUN'); light = bpy.data.objects.new(name='Sun', object_data=light_data); bpy.context.collection.objects.link(light); bpy.context.scene.render.filepath = r'C:\image\plateau_render_result2.png'; bpy.ops.render.render(write_still=True)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 福山市のレンダリング処理に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Tanks and Temples データセットのダウンロード
REM ============================================================
REM ├── tandt_db.zip
REM ├── db/                                # Deep Blending データセット
REM │   ├── drjohnson/                     # 屋内:Dr. Johnson生家・展示室
REM │   │   ├── images/                    # 撮影画像群
REM │   │   └── sparse/
REM │   │       └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM │   └── playroom/                      # 屋内:子供部屋・プレイルーム
REM │       ├── images/                    # 撮影画像群
REM │       └── sparse/
REM │           └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM └── tandt/                             # Tanks and Temples データセット
REM     ├── train/                         # 屋外:蒸気機関車・線路
REM     │   ├── images/                    # 撮影画像群
REM     │   └── sparse/
REM     │       └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM     └── truck/                         # 屋外:ピックアップトラック全周
REM         ├── images/                    # 撮影画像群
REM         └── sparse/
REM             └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM パースペクティブ画像,T&T+DB COLMAPデータセット(約650MB)
rmdir /s /q c:\image\tandt_db
if not exist "C:\image\tandt" mkdir "C:\image\tandt"
if not exist "C:\image\tandt\tandt_db.zip" curl -k -L -o "C:\image\tandt\tandt_db.zip" https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開
powershell -NoProfile -Command "Expand-Archive -Path 'C:\image\tandt\tandt_db.zip' -DestinationPath 'C:\image\tandt' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BrushTest サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Mip-NeRF 360 (garden) データセットのダウンロード
REM ============================================================
REM └── garden/
REM     ├── images/                            # 元解像度撮影画像群
REM     ├── images_2/                          # 1/2 縮小画像群
REM     ├── images_4/                          # 1/4 縮小画像群(VGGT・軽量検証向け)
REM     ├── images_8/                          # 1/8 縮小画像群
REM     └── sparse/
REM         └── 0/                             # COLMAP推定データ (カメラパラメータ・点群)
REM サンプルデータ(Mip-NeRF 360 garden)をダウンロード
set "GARDEN_DIR=C:\image\garden"
set "GARDEN_ZIP=%TEMP%\garden.zip"
set "GARDEN_URL=https://storage.googleapis.com/gresearch/refraw360/garden.zip"

if not exist "%GARDEN_DIR%" mkdir "%GARDEN_DIR%"

curl -k -L -o "%GARDEN_ZIP%" "%GARDEN_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開
powershell -NoProfile -Command "Expand-Archive -Path '%GARDEN_ZIP%' -DestinationPath '%GARDEN_DIR%' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo garden サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

del "%GARDEN_ZIP%"

REM ============================================================
REM ETH3D Benchmark (courtyard) データセットのダウンロード
REM 屋内・屋外マルチビュー・GT点群あり
REM ============================================================
REM ├── courtyard_dslr_undistorted.7z
REM └── courtyard/
REM     └── courtyard/
REM         ├── dslr_calibration_undistorted/  # カメラ内部・外部パラメータ (GT)
REM         └── images/
REM             └── dslr_images_undistorted/   # 歪み補正済み高解像度撮影画像群
REM サンプルデータ(ETH3D courtyard)をダウンロード
set "ETH3D_DIR=C:\image\ETH3D"
set "ETH3D_ARCHIVE=%TEMP%\courtyard.7z"
set "ETH3D_URL=https://www.eth3d.net/data/courtyard_dslr_undistorted.7z"
if not exist "%ETH3D_DIR%\courtyard" mkdir "%ETH3D_DIR%\courtyard"
curl -k -L -o "%ETH3D_ARCHIVE%" "%ETH3D_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 展開
tar -xf "%ETH3D_ARCHIVE%" -C "%ETH3D_DIR%\courtyard"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo courtyard サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
del "%ETH3D_ARCHIVE%"

REM ============================================================
REM COLMAP 公式標準 (South Building / Gerrard Hall) データセットのダウンロード
REM データ内容: 歴史的建造物の屋外マルチビューRGB画像(JPG形式 / 128枚・100枚)
REM 用途: COLMAPの全パイプライン(特徴量抽出・SfM・MVS・メッシュ生成)検証用
REM ============================================================
REM ├── south-building/
REM │   └── images/                            # 撮影画像群 (JPG / 128枚)
REM └── gerrard-hall/
REM     └── images/                            # 撮影画像群 (JPG / 100枚)
REM サンプルデータ(COLMAP South Building / Gerrard Hall)をダウンロード
set "DATA_ROOT_SOUTH=C:\image\COLMAP_data\south-building"
set "SOUTH_BUILDING_ZIP=%TEMP%\south-building.zip"
set "SOUTH_BUILDING_URL=https://github.com/colmap/colmap/releases/download/3.11.1/south-building.zip"

set "DATA_ROOT_GERRARD=C:\image\COLMAP_data\gerrard-hall"
set "GERRARD_HALL_ZIP=%TEMP%\gerrard-hall.zip"
set "GERRARD_HALL_URL=https://github.com/colmap/colmap/releases/download/3.11.1/gerrard-hall.zip"

if not exist "%DATA_ROOT_SOUTH%" mkdir "%DATA_ROOT_SOUTH%"
if not exist "%DATA_ROOT_GERRARD%" mkdir "%DATA_ROOT_GERRARD%"

REM --- South Building のダウンロードと展開 ---
curl -k -L -o "%SOUTH_BUILDING_ZIP%" "%SOUTH_BUILDING_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo south-building サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

powershell -NoProfile -Command "Expand-Archive -Path '%SOUTH_BUILDING_ZIP%' -DestinationPath '%DATA_ROOT_SOUTH%' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo south-building サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

del "%SOUTH_BUILDING_ZIP%"

REM --- Gerrard Hall のダウンロードと展開 ---
curl -k -L -o "%GERRARD_HALL_ZIP%" "%GERRARD_HALL_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo gerrard-hall サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

powershell -NoProfile -Command "Expand-Archive -Path '%GERRARD_HALL_ZIP%' -DestinationPath '%DATA_ROOT_GERRARD%' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo gerrard-hall サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

del "%GERRARD_HALL_ZIP%"

REM ============================================================
REM VGGT インストール
REM 入力: RGB画像群(複数視点画像/動画フレーム)、2Dクエリ点(トラッキング時のみ)
REM 出力: カメラ内部・外部パラメータ、深度マップ、3D点群(ポイントマップ)、ポイントトラック
REM   numpy の上限指定(pyproject.toml の numpy<2、
REM   requirements.txt の numpy<2)を numpy 2 系に変更する
REM ============================================================
if exist "C:\VGGT\.git" ( cd /d "C:\VGGT" & git pull ) else ( git clone https://github.com/facebookresearch/vggt.git "C:\VGGT" )
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VGGT リポジトリの取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d "C:\VGGT"
powershell -Command "(Get-Content pyproject.toml) -replace 'numpy<2', 'numpy>=2.0.0' | Set-Content pyproject.toml"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pyproject.toml の書き換えに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
powershell -Command "(Get-Content requirements.txt) -replace 'numpy(<2|==1\.26\.1)', 'numpy>=2.0.0' | Set-Content requirements.txt"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo requirements.txt の書き換えに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user .
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VGGT のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user -r requirements_demo.txt
REM VGGT の vggt/dependency/np_to_pycolmap.py は旧 API を前提に書かれている(2026/08)
pip uninstall -y pycolmap
pip install -U pycolmap
cd /d C:\VGGT
python -c "import io,re;p='vggt/dependency/np_to_pycolmap.py';s=io.open(p,encoding='utf-8').read();io.open(p+'.bak','w',encoding='utf-8',newline='').write(s);r=re.compile(r'[ ]*try:\n[ ]*image\.points2D = pycolmap\.ListPoint2D\(points2D_list\)\n[ ]*image\.registered = True\n[ ]*except:\n([ ]*print\([^\n]*\)\n)[ ]*image\.registered = False\n\n[ ]*# add image\n[ ]*reconstruction\.add_image\(image\)\n');f=lambda m:'        is_registered = True\n        try:\n            image.points2D = pycolmap.ListPoint2D(points2D_list)\n        except Exception:\n'+m.group(1)+'            is_registered = False\n\n        reconstruction.add_image(image)\n        if is_registered:\n            reconstruction.register_image(image.image_id)\n        else:\n            image.reset_pose()\n';s2,n=r.subn(f,s);io.open(p,'w',encoding='utf-8',newline='').write(s2) if n==2 else None;print('replaced',n)"
cd /d C:\VGGT
python -c "import io;p='vggt/dependency/np_to_pycolmap.py';s=io.open(p,encoding='utf-8').read();o='            id=fidx + 1, name=';n=s.count(o);s=s.replace(o,'            image_id=fidx + 1, name=');io.open(p,'w',encoding='utf-8',newline='').write(s);print('replaced',n)"
cd /d C:\VGGT
if exist mk.py del mk.py
>>mk.py echo import io
>>mk.py echo p='vggt/dependency/np_to_pycolmap.py'
>>mk.py echo s=io.open(p+'.bak',encoding='utf-8').read()
>>mk.py echo a='            # add camera\n            reconstruction.add_camera(camera)\n'
>>mk.py echo b='            # add camera\n            reconstruction.add_camera(camera)\n\n            rig = pycolmap.Rig()\n            rig.rig_id = camera.camera_id\n            rig.add_ref_sensor(camera.sensor_id)\n            reconstruction.add_rig(rig)\n'
>>mk.py echo s=s.replace(a,b)
>>mk.py echo c='        image = pycolmap.Image(\n            id=fidx + 1, name=f"image_{fidx + 1}", camera_id=camera.camera_id, cam_from_world=cam_from_world\n        )\n'
>>mk.py echo d='        image = pycolmap.Image(image_id=fidx + 1, name=f"image_{fidx + 1}", camera_id=camera.camera_id)\n'
>>mk.py echo s=s.replace(c,d)
>>mk.py echo e='        try:\n            image.points2D = pycolmap.ListPoint2D(points2D_list)\n            image.registered = True\n        except:\n            print(f"frame {fidx + 1} is out of BA")\n            image.registered = False\n\n        # add image\n        reconstruction.add_image(image)\n'
>>mk.py echo f='        if points2D_list:\n            image.points2D = pycolmap.Point2DList(points2D_list)\n            has_pose = True\n        else:\n            print(f"frame {fidx + 1} is out of BA")\n            has_pose = False\n\n        frame = pycolmap.Frame()\n        frame.frame_id = fidx + 1\n        frame.rig_id = rig.rig_id\n        frame.add_data_id(image.data_id)\n        if has_pose:\n            frame.rig_from_world = cam_from_world\n        reconstruction.add_frame(frame)\n\n        image.frame_id = frame.frame_id\n        reconstruction.add_image(image)\n'
>>mk.py echo s=s.replace(e,f)
>>mk.py echo e2=e.replace('is out of BA','does not have any points')
>>mk.py echo f2=f.replace('is out of BA','does not have any points')
>>mk.py echo s=s.replace(e2,f2)
>>mk.py echo s=s.replace('pyimg.cam_from_world.matrix()','pyimg.cam_from_world().matrix()')
>>mk.py echo io.open(p,'w',encoding='utf-8',newline='').write(s)
>>mk.py echo print('patched')
python mk.py
del mk.py
python demo_colmap.py --scene_dir "c:\image\tandt\tandt\truck"

REM ============================================================
REM COLMAP インストール
REM 特徴量抽出・マッチング(Feature Extraction & Matching)
REM   入力: RGB画像群(単一視点・複数視点写真)
REM   出力: データベースファイル(database.db:2D特徴点座標、記述子、画像間マッチング情報)
REM Structure-from-Motion / SfM(疎な3D再構成・カメラ姿勢推定)
REM   入力: データベースファイル(database.db)、RGB画像群
REM   出力: 疎なモデル(sparse/:カメラ内部パラメータ cameras.bin、カメラ外部パラメータ images.bin、疎な3D点群 points3D.bin)
REM Multi-View Stereo / MVS(密な3D再構成・点群フュージョン)
REM   入力: RGB画像群、SfMで推定された疎なモデル(sparse/)
REM   出力: 深度マップ・法線マップ(*.geometric.bin, *.photometric.bin)、密な3D点群(fused.ply)
REM サーフェス再構成(Meshing / 3Dメッシュ生成)
REM   入力: 密な3D点群(fused.ply)
REM   出力: 3Dテクスチャメッシュモデル(meshed-poisson.ply または meshed-delaunay.ply)
REM ============================================================
set "COLMAP_DIR=C:\COLMAP"
set "COLMAP_ZIP=%TEMP%\colmap.zip"
if exist "C:\Program Files\COLMAP" rmdir /s /q "C:\Program Files\COLMAP"
if exist "%COLMAP_DIR%" rmdir /s /q "%COLMAP_DIR%"
curl -L -o "%COLMAP_ZIP%" https://github.com/colmap/colmap/releases/download/4.1.1/colmap-x64-windows-cuda.zip
powershell -NoProfile -Command "Expand-Archive -Path '%COLMAP_ZIP%' -DestinationPath '%TEMP%\colmap_extracted' -Force; $src=(Get-ChildItem -Directory '%TEMP%\colmap_extracted' | Select-Object -First 1).FullName; Move-Item -LiteralPath $src -Destination '%COLMAP_DIR%'; Remove-Item -Recurse -Force '%TEMP%\colmap_extracted'"
del "%COLMAP_ZIP%"

icacls C:\COLMAP /grant Everyone:F /t

REM COLMAP.exeをPATHに追加
powershell -NoProfile -Command "$p='C:\colmap'; if(Test-Path $p){ $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if((';'+$c+';') -notlike \"*;$p;*\"){ $k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t) }; $k.Close() }"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo COLMAP のパス設定に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Postshot インストール
REM   -s(サイレント)と -accept-eula(EULA同意)で非対話実行する
REM ============================================================
if not exist "C:\Temp\Postshot" mkdir "C:\Temp\Postshot"
powershell -NoProfile -Command "Invoke-WebRequest -Uri 'https://www.jawset.com/public_download/jawset.postshot/win/' -OutFile 'C:\Temp\Postshot\PostshotSetup.exe'"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Postshot のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
"C:\Temp\Postshot\PostshotSetup.exe" -s -accept-eula
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Postshot のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
rmdir /s /q "C:\Temp\Postshot"

REM ============================================================
REM Brush インストール
REM   version 0.3.0 2025/9 リリース
REM 3DGS トレーニング(学習)機能
REM   入力: COLMAP形式データ(RGB画像群、カメラ内部・外部パラメータ、初期点群)
REM   出力: 3DGS モデル(.ply ファイル)
REM 3DGS リアルタイムビューア(描画・可視化)機能
REM   入力: 3DGS モデル(.ply ファイル)
REM   出力: リアルタイム 3D レンダリング画面、指定視点の静止画/動画
REM 3DGS 編集(スプラット操作・ブラシ)機能
REM   入力: 既存の 3DGS モデル(.ply ファイル)、ユーザーのブラシ操作・マスク指定
REM   出力: 編集・トリミング後の 3DGS モデル(.ply ファイル)
REM エクスポート(フォーマット変換・圧縮)機能
REM   入力: 標準 3DGS モデル(.ply ファイル)
REM   出力: 圧縮・軽量化された 3DGS ファイル(Web 配信・他形式向け)
REM ============================================================
if not exist "C:\Temp\Brush" mkdir "C:\Temp\Brush"
powershell -NoProfile -Command "Invoke-WebRequest -Uri 'https://github.com/ArthurBrussee/brush/releases/download/v0.3.0/brush-app-x86_64-pc-windows-msvc.zip' -OutFile 'C:\Temp\Brush\brush.zip'"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Brush のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM システム領域に展開
if not exist "C:\Program Files\Brush" mkdir "C:\Program Files\Brush"
powershell -NoProfile -Command "Expand-Archive -Path 'C:\Temp\Brush\brush.zip' -DestinationPath 'C:\Program Files\Brush' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Brush の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM PATHに追加(全ユーザ向け、永続、REG_EXPAND_SZ型を維持)
powershell -NoProfile -Command "$p='C:\Program Files\Brush'; if(Test-Path $p){ $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if((';'+$c+';') -notlike \"*;$p;*\"){ $k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t) }; $k.Close() }"

REM 後片付け
rmdir /s /q "C:\Temp\Brush"

REM 動作確認
"C:\Program Files\Brush\brush_app.exe" --help

REM ============================================================
REM Panda3D インストール
REM ============================================================
"%PIP%" install --no-user -U panda3d
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Panda3D のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Open3D インストール
REM ============================================================
"%PIP%" install --no-user -U open3d
"%PIP%" install --no-user -U pygltflib
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Open3D のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM MeshLab インストール
REM ============================================================
winget install --id CNRISTI.MeshLab -e --source winget --scope machine --silent --accept-package-agreements --accept-source-agreements --force
if not "%ERRORLEVEL%"=="0" ( color 0c & echo MeshLab のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Nerfstudio インストール
REM ============================================================
"%PIP%" install --no-user nerfstudio
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Nerfstudio のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM numpy と PyTorch(CUDA 12.8 対応 wheel)を最新化
set "CUDA_TAG=cu128"
"%PIP%" install --no-user -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
"%PIP%" install --no-user -U scipy pillow pandas
if not "%ERRORLEVEL%"=="0" ( color 0c & echo scipy/pillow/pandas のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
"%PIP%" cache purge

REM ============================================================
REM Epic Games Launcher インストール(Unreal Engine 用)
REM ============================================================
taskkill /F /IM EpicGamesLauncher.exe >nul 2>&1
taskkill /F /IM EpicWebHelper.exe >nul 2>&1
echo Epic Games Launcher をインストールします
winget install --id EpicGames.EpicGamesLauncher -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Epic Games Launcher のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Unreal Engine 案内表示
REM ============================================================
echo ============================================================
echo Unreal Engineは手動インストールが必要です
echo 1. Epic Games Launcherを起動
echo 2. Unreal Engineタブを選択
echo 3. 「エンジンをインストール」をクリック
echo 4. バージョンを選択してインストール
echo ============================================================

echo インストール完了
echo システム環境変数 Path の変更を反映するには、新しいコマンドプロンプトを起動する

インストール確認のために次のコマンドを実行する(システム環境変数 Path の変更を反映させるため、新しいコマンドプロンプトで実行する)。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM ============================================================

REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM ============================================================
REM Blener テスト
REM ============================================================

echo [Blender]
where blender 2>nul && blender --version || echo   *** 未検出 *** blender

REM Blender実行ファイルのパスを動的に検出
set "BLENDER_EXE="
powershell -NoProfile -Command "Get-ChildItem -Path 'C:\Program Files','C:\Program Files (x86)' -Recurse -Filter 'blender.exe' -ErrorAction SilentlyContinue | Sort-Object -Property @{Expression={[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).FileVersion}} -Descending | Select-Object -First 1 -ExpandProperty FullName" > "%TEMP%\blender_path.txt"
set /p BLENDER_EXE=<"%TEMP%\blender_path.txt"
del "%TEMP%\blender_path.txt"
if not defined BLENDER_EXE ( color 0c & echo Blenderの実行ファイルが見つかりません & ping 127.0.0.1 -n 6 >nul & color )
echo Blender: %BLENDER_EXE%

REM ============================================================
REM SkySplat テスト
REM ============================================================

echo [SkySplat (Blenderアドオン)]
for /f "delims=" %i in ('where blender 2^>nul') do "%i" --background --python-expr "import addon_utils; enabled=[m.__name__ for m in addon_utils.modules() if addon_utils.check(m.__name__)[0]]; print('  [検出]' if any('skysplat' in n.lower() for n in enabled) else '  *** 未検出 ***', 'skysplat')"

REM ステップ1: ffmpeg / ffprobe の存在確認
where ffmpeg >nul 2>nul
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ffmpeg が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
where ffprobe >nul 2>nul
if not "%ERRORLEVEL%"=="0" ( color 0c & echo ffprobe が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM ステップ2: サンプル動画(windsor_silo)のダウンロード
set "SKYSPLAT_TEST_VIDEO=%TEMP%\windsor_silo.mp4"
curl -f -L -o "%SKYSPLAT_TEST_VIDEO%" "https://skysplat.net/DJI_20250731122012_0009_D_windsor_silo_new_small.mp4"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo テスト用サンプル動画のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ステップ3: 動画長(秒)の取得
if exist "%SKYSPLAT_TEST_VIDEO%" (echo OK: %SKYSPLAT_TEST_VIDEO%) else (echo [ERROR] ファイルなし: %SKYSPLAT_TEST_VIDEO%)
set "SKYSPLAT_TEST_DURATION="
for /f "usebackq delims=" %D in (`ffprobe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%SKYSPLAT_TEST_VIDEO%"`) do @set "SKYSPLAT_TEST_DURATION=%D"
echo 動画長: %SKYSPLAT_TEST_DURATION% 秒
for /f "delims=." %A in ("%SKYSPLAT_TEST_DURATION%") do @set "SKYSPLAT_TEST_DURATION_INT=%A"
echo 動画長(整数): %SKYSPLAT_TEST_DURATION_INT% 秒

REM ステップ4: 目標フレーム数170枚となるfpsの算出
set "SKYSPLAT_TEST_TARGET_FRAMES=170"
for /f "usebackq delims=" %F in (`powershell -NoProfile -Command "[math]::Round(%SKYSPLAT_TEST_TARGET_FRAMES% / %SKYSPLAT_TEST_DURATION%, 4)"`) do set "SKYSPLAT_TEST_FPS=%F"
echo 算出fps: %SKYSPLAT_TEST_FPS%

REM ステップ5: フレーム抽出フォルダの準備
set "SKYSPLAT_TEST_FRAMES_DIR=%TEMP%\skysplat_test_frames"
if exist "%SKYSPLAT_TEST_FRAMES_DIR%" rmdir /s /q "%SKYSPLAT_TEST_FRAMES_DIR%"
mkdir "%SKYSPLAT_TEST_FRAMES_DIR%"

REM ステップ6: ffmpeg によるフレーム抽出
ffmpeg -nostdin -y -i "%SKYSPLAT_TEST_VIDEO%" -vf "fps=%SKYSPLAT_TEST_FPS%" "%SKYSPLAT_TEST_FRAMES_DIR%\frame_%04d.png"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo フレーム抽出に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ステップ7: 抽出フレーム数の表示
for /f %C in ('dir /b "%SKYSPLAT_TEST_FRAMES_DIR%\*.png" 2^>nul ^| find /c /v ""') do set "SKYSPLAT_TEST_FRAME_COUNT=%C"
echo 抽出フレーム数: %SKYSPLAT_TEST_FRAME_COUNT% 枚

REM ステップ8: COLMAP の検出
where colmap >nul 2>nul
if not "%ERRORLEVEL%"=="0" ( color 0c & echo COLMAP が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
for /f "usebackq delims=" %P in (`where colmap`) do set "SKYSPLAT_TEST_COLMAP_EXE=%P"
echo COLMAP: %SKYSPLAT_TEST_COLMAP_EXE%

REM ステップ9: skysplat.run_colmap の実行
set "SKYSPLAT_TEST_COLMAP_OUTPUT=%TEMP%\skysplat_test_colmap_output"
"%BLENDER_EXE%" --background --python-expr "import bpy, addon_utils; addon_utils.enable('skysplat_blender'); props = bpy.context.scene.skysplat_colmap_props; props.colmap_path = r'%SKYSPLAT_TEST_COLMAP_EXE%'; bpy.ops.skysplat.add_colmap_instance(); inst = props.colmap_instances[props.active_colmap_index]; inst.input_folder = r'%SKYSPLAT_TEST_FRAMES_DIR%'; inst.output_folder = r'%SKYSPLAT_TEST_COLMAP_OUTPUT%'; result = bpy.ops.skysplat.run_colmap(); print('SKYSPLAT_RUN_COLMAP_RESULT:', result)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo skysplat.run_colmap の実行に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ステップ10: 結果確認(COLMAP再構成モデルの生成有無)
if exist "%SKYSPLAT_TEST_COLMAP_OUTPUT%\sparse\0\cameras.bin" ( echo SkySplat Gaussian Splatting テスト: COLMAP再構成に成功しました & echo 出力先: %SKYSPLAT_TEST_COLMAP_OUTPUT%\sparse\0 ) else ( color 0c & echo SkySplat Gaussian Splatting テスト: COLMAP再構成の出力が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM KIRI Engine 3DGS Render テスト実行
REM ============================================================

"%BLENDER_EXE%" --background --python-expr "import bpy; bpy.ops.preferences.addon_enable(module='3dgs_render_by_kiri_engine'); print('\n[TEST RESULT] KIRI Engine 3DGS Render is successfully loaded.'); ops = [op for m in dir(bpy.ops) for op in dir(getattr(bpy.ops, m)) if 'kiri' in op.lower() or '3dgs' in op.lower()]; print('Available Operators:', ops); print('Test completed successfully.\n')"

if not "%ERRORLEVEL%"=="0" ( color 0c & echo テスト実行に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM KIRI Engine 3DGS Render テスト実行(画像出力版)
REM ============================================================
set "TEST_PY=%TEMP%\kiri_test_render.py"
set "TEST_IMG=%TEMP%\kiri_test_result.png"

REM テスト用のBlender Pythonスクリプトを生成
echo import bpy > "%TEST_PY%"
echo bpy.ops.preferences.addon_enable(module='3dgs_render_by_kiri_engine') >> "%TEST_PY%"
echo bpy.ops.object.select_all(action='SELECT') >> "%TEST_PY%"
echo bpy.ops.object.delete() >> "%TEST_PY%"
echo ops = [op for m in dir(bpy.ops) for op in dir(getattr(bpy.ops, m)) if 'kiri' in op.lower() or '3dgs' in op.lower()] >> "%TEST_PY%"
echo bpy.ops.object.text_add(location=(0, 0, 0), rotation=(1.5708, 0, 0)) >> "%TEST_PY%"
echo txt = bpy.context.object >> "%TEST_PY%"
echo txt.data.body = "KIRI Engine 3DGS Addon: OK\n\nFound Operators:\n" + "\n".join(ops[:10]) >> "%TEST_PY%"
echo txt.data.extrude = 0.02 >> "%TEST_PY%"
echo txt.data.align_x = 'CENTER' >> "%TEST_PY%"
echo bpy.ops.object.camera_add(location=(0, -8, 0), rotation=(1.5708, 0, 0)) >> "%TEST_PY%"
echo bpy.context.scene.camera = bpy.context.object >> "%TEST_PY%"
echo bpy.ops.object.light_add(type='SUN') >> "%TEST_PY%"
echo bpy.context.object.data.energy = 5.0 >> "%TEST_PY%"
echo bpy.context.scene.render.filepath = r"%TEST_IMG%" >> "%TEST_PY%"
echo bpy.context.scene.render.resolution_x = 1280 >> "%TEST_PY%"
echo bpy.context.scene.render.resolution_y = 720 >> "%TEST_PY%"
echo bpy.ops.render.render(write_still=True) >> "%TEST_PY%"

REM Blenderをバックグラウンドで実行し、画像をレンダリング
"%BLENDER_EXE%" --background --python "%TEST_PY%"

REM 実行結果の判定と画像の表示
if not "%ERRORLEVEL%"=="0" (
    color 0c & echo テスト画像の生成に失敗しました & ping 127.0.0.1 -n 6 >nul & color
) else (
    start "" "%TEST_IMG%"
)

REM ============================================================
REM COLMAP テスト
REM ============================================================

echo [COLMAP]
powershell -NoProfile -Command "$exe=Get-ChildItem 'C:\COLMAP' -Recurse -Filter 'colmap.exe' -ErrorAction SilentlyContinue | Select-Object -First 1; if($exe){Write-Host ('  [検出] ' + $exe.FullName)} else {Write-Host '  *** 未検出 *** COLMAP'}"
powershell -NoProfile -Command "$bat=Get-ChildItem 'C:\COLMAP' -Recurse -Filter 'COLMAP.bat' -ErrorAction SilentlyContinue | Select-Object -First 1; if($bat){Write-Host ('  COLMAP.bat: ' + $bat.FullName)} else {Write-Host '  *** 未検出 *** COLMAP.bat'}"
echo colmap test
colmap.bat automatic_reconstructor --workspace_path C:\temp --image_path c:\image\im --mesher POISSON

REM COLMAP テスト、COLMAPデータを使用
REM --- パスおよび設定定義 ---
set "COLMAP_EXE=C:\COLMAP\colmap.exe"
set "DATA_ROOT=C:\image\COLMAP_data\south-building\south-building"
set "IMAGE_DIR=%DATA_ROOT%\images"
set "DB_PATH=%DATA_ROOT%\database.db"
set "SPARSE_DIR=%DATA_ROOT%\sparse"
set "DENSE_DIR=%DATA_ROOT%\dense"

REM --- GPU利用設定 (1: GPUを使用 / 0: CPUのみを使用) ---
REM set "USE_GPU=0"
set "USE_GPU=1"

REM --- 画像データは残し、壊れた中間生成物のみ削除・再作成 ---
if exist "%SPARSE_DIR%" rmdir /s /q "%SPARSE_DIR%"
if exist "%DENSE_DIR%" rmdir /s /q "%DENSE_DIR%"
if exist "%DB_PATH%" del /q "%DB_PATH%"
mkdir "%SPARSE_DIR%"
mkdir "%DENSE_DIR%"

REM 1. 特徴量抽出 (Feature Extraction)
"%COLMAP_EXE%" feature_extractor --database_path "%DB_PATH%" --image_path "%IMAGE_DIR%" --FeatureExtraction.use_gpu %USE_GPU%

REM 2. 特徴量マッチング (Exhaustive Matching)
"%COLMAP_EXE%" exhaustive_matcher --database_path "%DB_PATH%" --FeatureMatching.use_gpu %USE_GPU%

REM 3. 疎な3D再構成・カメラ姿勢推定 (SfM: Mapper)
"%COLMAP_EXE%" mapper --database_path "%DB_PATH%" --image_path "%IMAGE_DIR%" --output_path "%SPARSE_DIR%"

REM 4. 画像の歪み補正・MVSワークスペース生成 (Image Undistortion)
"%COLMAP_EXE%" image_undistorter --image_path "%IMAGE_DIR%" --input_path "%SPARSE_DIR%\0" --output_path "%DENSE_DIR%" --output_type COLMAP

REM 5. MVS / 深度・法線マップ推定 (Patch Match Stereo)
"%COLMAP_EXE%" patch_match_stereo --workspace_path "%DENSE_DIR%" --workspace_format COLMAP --PatchMatchStereo.geom_consistency true

REM 6. 密な点群フュージョン (Stereo Fusion)
"%COLMAP_EXE%" stereo_fusion --workspace_path "%DENSE_DIR%" --workspace_format COLMAP --input_type geometric --output_path "%DENSE_DIR%\fused.ply"

REM 7. メッシュ生成 (Poisson Meshing)
"%COLMAP_EXE%" poisson_mesher --input_path "%DENSE_DIR%\fused.ply" --output_path "%DENSE_DIR%\meshed-poisson.ply"

REM 8. GUIで再構成結果を確認
"%COLMAP_EXE%" gui --database_path "%DB_PATH%" --image_path "%IMAGE_DIR%" --import_path "%SPARSE_DIR%\0"

REM ============================================================
REM VGGT テスト
REM ============================================================

echo [VGGT]
"%PYTHON%" -c "import vggt; print('  vggt OK')" 2>nul || echo   *** 未検出 *** vggt

REM VGGT テスト実行, ETH3D Benchmark データセットを使用
cd /d "C:\VGGT"

REM デモを実行
python demo_colmap.py --scene_dir "c:\image\tandt\tandt\truck"
colmap model_converter --input_path c:\image\tandt\tandt\train\sparse\0 --output_path c:\image\tandt\tandt\train\sparse\0\points.ply --output_type PLY

REM 3D可視化デモ (Viser) の実行
python demo_viser.py --image_folder "C:\image\ETH3D\courtyard\courtyard\images\dslr_images_undistorted"
REM COLMAP 形式エクスポートの実行
python demo_colmap.py --scene_dir "C:\image\ETH3D\courtyard\courtyard"
REM ブラウザUIから画像をドラッグ&ドロップして推論・確認を行う
python demo_gradio.py


REM ============================================================
REM Postshot テスト
REM ============================================================

echo [Postshot]
powershell -NoProfile -Command "$exe=Get-ChildItem 'C:\Program Files','C:\Program Files (x86)' -Recurse -Filter 'Postshot*.exe' -ErrorAction SilentlyContinue | Select-Object -First 1; if($exe){Write-Host ('  [検出] ' + $exe.FullName)} else {Write-Host '  *** 未検出 *** Postshot'}"


REM ============================================================
REM Brush テスト
REM ============================================================

echo [Brush]
if exist "C:\Program Files\Brush\brush_app.exe" (echo   [検出] Brush) else echo   *** 未検出 *** Brush

REM Brush テスト実行, Tanks and Temples データセットを使用
"C:\Program Files\Brush\brush_app.exe" --with-viewer "C:\image\tandt\tandt\truck"

REM ============================================================
REM plateau kit テスト
REM ============================================================

echo [plateau kit]
"%PYTHON%" -c "import plateaukit; print('  plateaukit OK')" 2>nul || echo   *** 未検出 *** plateaukit

echo [Nerfstudio]
"%PYTHON%" -c "import nerfstudio; print('  nerfstudio OK')" 2>nul || echo   *** 未検出 *** nerfstudio

echo [Panda3D]
"%PYTHON%" -c "import panda3d; print('  panda3d OK')" 2>nul || echo   *** 未検出 *** panda3d

echo [Open3D]
"%PYTHON%" -c "import open3d; print('  open3d', open3d.__version__)" 2>nul || echo   *** 未検出 *** open3d

echo [MeshLab]
where /R "C:\Program Files" MeshLab*.exe 2>nul || echo   *** 未検出 *** MeshLab

echo [Epic Games Launcher]
if exist "C:\Program Files (x86)\Epic Games\Launcher\Portal\Binaries\Win64\EpicGamesLauncher.exe" (echo   [検出] Epic Games Launcher) else echo   *** 未検出 *** Epic Games Launcher

REM ===== 確認完了 =====
ソフトウェア説明用途備考
Blender統合型3次元CG制作ソフト。ジオメトリノード(ノードベースの手続き型モデリング機能)やCycles(物理ベースレンダラー)を持つ。3次元モデリング、アニメーションwingetで C:\Program Files\Blender にインストール。アドオンはBlender 5.2系のユーザ設定領域に置く
Blendkit(旧BlenderKit)Blenderアドオン。オンラインのアセットライブラリからモデル、マテリアル、HDRI、シーンを検索し、Blenderに直接読み込む。3次元アセット取得GitHubの最新リリースのZIPをBlender内蔵Pythonでダウンロードし、Blenderにインストール(モジュール名 blenderkit)
BlendLuxCoreBlenderアドオン。物理ベースのアンバイアスドレンダラーであるLuxCoreRenderをBlenderから使う。レンダリングGitHubのリリース(v2.11.0の BlendLuxCore-2.11.0.zip)をダウンロードし、Blenderにインストール。テストシーン(LuxCoreTestScenes)は GIT_LFS_SKIP_SMUDGE=1 を設定し、Git LFSの実体を除いてクローンする
SkySplatBlenderアドオン。ドローン映像のフレーム抽出、COLMAPによる再構成、Brushによるトレーニングまでを一連のワークフローで実行し、3次元ガウシアンスプラッティングによる3次元シーンを作る。3次元再構成GitHubのmainブランチのZIPをダウンロードし、Blenderにインストール。展開後のフォルダ名を skysplat_blender に変更してから有効化する
3DGS Render(KIRI Engine)KIRI Engine製のBlenderアドオン。学習済みの3次元ガウシアンスプラットを読み込み、レンダリングと編集を行う。3次元再構成GitHubの最新リリースからダウンロードし、Blenderにインストール
Plateau-Blender-ImporterBlenderアドオン。国土交通省PLATEAU(日本全国の3D都市モデルを整備、オープンデータ化するプロジェクト)のCityGML形式の3D都市モデルをBlenderに読み込む。3D都市モデルGitHubのmainブランチのZIPをダウンロードし、Blenderにインストール。動作確認として久留米市・福山市のCityGMLを読み込み、バックグラウンドでレンダリングする
VGGTOxford大学VGGおよびMeta AI開発。フィードフォワード型ニューラルネットワークにより、1枚から数百枚の画像からカメラパラメータ、深度マップ、点群マップ(point map)、3次元ポイントトラッキングを推論する。3次元再構成GitHubからクローンし、pipでインストール。pyproject.toml と requirements.txt のnumpy上限指定をnumpy 2系に書き換えてからインストールする
ShapeRMeta Reality Labs Research開発。画像シーケンスから物体単位でメトリックスケールの3次元メッシュを作る。3次元再構成本コマンドではインストールしない(Windows向けの手順が未確立)
Skyfall-GS衛星画像から3次元都市シーンを作る。3次元ガウシアンスプラッティングと拡散モデルを組み合わせる。3次元再構成本コマンドではインストールしない(Windows向けの手順が未確立)
ml-sharpApple開発。1枚の画像から3次元ガウシアン表現を作る。3次元再構成本コマンドではインストールしない(Windows向けの手順が未確立)
COLMAP汎用のStructure-from-Motion(SfM)およびMulti-View Stereo(MVS)パイプライン。GUIとコマンドラインインターフェースを持ち、複数画像からカメラパラメータ、疎な点群、密な点群、メッシュを復元する。バージョン4系ではGLOMAPによる大域SfM(global_mapper)と全天球(エクイレクタングラー)カメラモデルを使える。3次元再構成GitHubからバイナリ(v4.1.1のCUDA対応Windows版 colmap-x64-windows-cuda.zip)をダウンロードし、C:\COLMAP に展開してPATHに追加
Postshot画像群から3次元ガウシアンスプラッティングによるシーンを作るデスクトップアプリ。GUIとコマンドラインインターフェースを持つ。3次元再構成公式サイトからダウンロードし、-s(サイレント)と -accept-eula を付けて非対話でインストール。Windows 10以降と、NVIDIA GPU(Compute Capability 7.5以上、GeForce RTX 2060以上)が必要
Brush3次元ガウシアンスプラッティングによる3次元再構成エンジン。トレーニング、リアルタイム表示、編集、書き出しを行う。3次元再構成GitHubからダウンロード(v0.3.0のWindows版 brush-app-x86_64-pc-windows-msvc.zip)し、C:\Program Files\Brush に展開してPATHに追加
NerfstudioNeRF(Neural Radiance Fields)および3次元ガウシアンスプラッティングの作成、トレーニング、テストのためのモジュラーフレームワーク。3次元再構成pipでインストール。あわせてCUDA 12.8対応のPyTorch(torch、torchvision、torchaudio)とnumpy、scipy、pillow、pandas、opencv-contrib-pythonを入れる
Panda3DDisney/CMUが開発した3次元ゲームエンジン。Pythonでシーングラフ(3次元オブジェクトの階層構造)に基づいて3次元開発ができる。Python 3次元ゲーム開発pipでインストール
Open3D3次元データ処理ライブラリ。点群、メッシュ、RGBDデータの読み込み、可視化、処理アルゴリズムを提供する。3次元データ処理pipでインストール
MeshLab3次元メッシュ処理ソフト。メッシュ、点群の編集、クリーニング、修復、検査、レンダリング、形式変換を行う。3次元データ処理wingetでインストール
Unreal Engineゲームエンジン。Nanite(仮想化ジオメトリシステム)やLumen(動的グローバルイルミネーション)を持つ。3次元ゲーム開発wingetでEpic Games Launcherを入れ、Epic Games Launcherを起動し、Unreal Engineタブでバージョンを選んでインストールする(手動操作が必要)

【検証用データセット】

本コマンドは以下のサンプルデータを C:\image 以下に取得する。

【前提条件】

以下のソフトウェアが事前にインストールされていること(未インストールの場合は本コマンドが自動でインストールを試みる)。

8. マルチメディア・設計・作図

作図・設計,動画編集,音声編集,音声合成,画面録画に使用するツール群である.

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 「管理者として実行」を選択). wingetの--scope machineオプションでのシステム全体へのインストール,およびシステム環境変数Pathの変更には管理者権限が必要である.実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする. VOICEVOXとAivisSpeechのインストーラは対話型で行う(画面の指示に従う).

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM draw.io
REM ============================================================
REM draw.io をシステム領域にインストール
winget install --scope machine --id JGraph.Draw -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/allusers"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo draw.io のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM draw.io の自動更新を無効化
powershell -NoProfile -Command "$f='C:\Program Files\draw.io\resources\app-update.yml'; if(Test-Path $f){Remove-Item $f -Force}"
REM draw.io のパス設定(REG_EXPAND_SZ 型を維持するためレジストリを直接更新)
powershell -NoProfile -Command "$p='C:\Program Files\draw.io'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM Canva
REM ============================================================
REM Canva 公式 64-bit MSIX をダウンロードして全ユーザーにプロビジョニング
REM 注意: プロビジョニングはユーザーがサインインした時点でインストールされるため,
REM       自動更新の無効化はサインイン後に別途実行が必要な場合がある
powershell -NoProfile -ExecutionPolicy Bypass -Command "$u='https://desktop-release.canva.com/windows-enterprise/Canva Setup Latest x64.msix'; $o=Join-Path $env:TEMP 'CanvaSetup_x64.msix'; Invoke-WebRequest -Uri $u -OutFile $o -UseBasicParsing; Add-AppxProvisionedPackage -Online -SkipLicense -PackagePath $o; Remove-Item $o -Force"
REM Canva の自動更新を無効化 (Win11 21H2+ 必要, UInt32 最大値で実質永久停止)
REM 注意: プロビジョニング直後はパッケージが見つからない場合がある.その場合はユーザーサインイン後に再実行する
powershell -NoProfile -Command "$pfn=(Get-AppxPackage -Name '*Canva*'|Select-Object -First 1).PackageFamilyName; if($pfn){Set-AppxPackageAutoUpdateSettings -PackageFamilyName $pfn -PauseUpdates -HoursToPause 4294967295}else{Write-Warning 'Canva package not found. Run after user sign-in.'}"

REM ============================================================
REM VLC media player
REM ============================================================
REM VLC media player をシステム領域にインストール
winget install --scope machine --id VideoLAN.VLC -e --silent --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VLC media player のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM FFmpeg
REM ============================================================
REM FFmpeg 既存インストールのアンインストール(未インストールの場合はパッケージ未検出のメッセージが表示される)
winget uninstall --id Gyan.FFmpeg -e --all-versions --force --silent --disable-interactivity --accept-source-agreements
REM 1. FFmpeg をインストール
winget install --id Gyan.FFmpeg -e --scope machine --location "C:\Program Files\FFmpeg" --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo FFmpeg のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 2. インストールされた実体フォルダ名(ffmpeg-*)を自動取得して変数に格納
for /f "delims=" %i in ('dir /b /ad "C:\Program Files\FFmpeg\ffmpeg*"') do set "FFMPEG_DIR=%i"
REM 3. 既存のリンクがある場合は削除(エラー防止)し、新しいリンクを作成
if exist "C:\FFmpeg" rd "C:\FFmpeg"
mklink /D "C:\FFmpeg" "C:\Program Files\FFmpeg\%FFMPEG_DIR%"
REM 4. PowerShellを使用してPath設定(C:\FFmpeg\bin を先頭に追加,REG_EXPAND_SZ 型を維持するためレジストリを直接更新)
powershell -NoProfile -Command "$p='C:\FFmpeg\bin'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($p+';'+$c),$t)}; $k.Close()}"

REM ============================================================
REM Shotcut
REM ============================================================
REM Shotcut をシステム領域にインストール
winget install --scope machine --id Meltytech.Shotcut -e --silent --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Shotcut のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Vrew
REM ============================================================
REM Vrew 既存インストールのアンインストール(未インストールの場合はパッケージ未検出のメッセージが表示される)
winget uninstall Vrew --silent --disable-interactivity --accept-source-agreements
REM Vrew をシステム領域にインストール(--override 使用時はインストーラに /S を直接指定)
winget install --id VoyagerX.Vrew -e --accept-package-agreements --accept-source-agreements --override "/S /D=C:\Vrew"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Vrew のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Audacity
REM ============================================================
REM Audacity をシステム領域にインストール
winget install --scope machine --id Audacity.Audacity -e --silent --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Audacity のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM OBS Studio
REM ============================================================
REM OBS Studio をシステム領域にインストール
winget install --scope machine --id OBSProject.OBSStudio -e --silent --accept-source-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo OBS Studio のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Moonshine Vioce
REM ============================================================
pip install -U --no-user moonshine-voice
python -m moonshine_voice.download --stt --language ja
python -m moonshine_voice.download --stt --language en

REM ============================================================
REM YuE2
REM ============================================================
set "ROOT=C:\ProgramData\YuE2"
mkdir "%ROOT%"
setx YUE2_KIT "C:\ProgramData\YuE2" /M
setx HF_HOME "C:\ProgramData\YuE2\hf" /M
set "YUE2_KIT=C:\ProgramData\YuE2"
set "HF_HOME=C:\ProgramData\YuE2\hf"
cd /d %TEMP%
git clone https://github.com/multimodal-art-projection/YuE.git "%ROOT%\repo"
pip install -U --no-user "%ROOT%\repo"
mkdir "%ROOT%\models"
hf download m-a-p/YuE2-3B --local-dir "%ROOT%\models\YuE2-3B"
hf download m-a-p/YuE2-Vae --local-dir "%ROOT%\models\YuE2-Vae"
python -c "import torch;print(torch.__version__, torch.version.cuda, torch.cuda.is_available(), torch.cuda.is_bf16_supported())"
cd /d %TEMP%
chcp 65001
>lyrics.txt echo [Verse]
>>lyrics.txt echo 夜風がビルの間を抜けて
>>lyrics.txt echo まだ帰らない街の灯り
>>lyrics.txt echo [Chorus]
>>lyrics.txt echo この歌が届くまで
>>lyrics.txt echo もう少しだけ歩いていく
rmdir /s /q result_yue2
yue2.exe generate --offline --id my_song --style "Japanese city pop, warm electric piano, female vocal, 95 BPM" --lyrics-file lyrics.txt --backend torch-eager --output result_yue2

REM ============================================================
REM VOICEVOX
REM ============================================================

REM VOICEVOX 既存インストールのアンインストール(3箇所を確認)

REM 1. C:\VOICEVOX
if exist "C:\VOICEVOX\Uninstall VOICEVOX.exe" (
    start /wait "" "C:\VOICEVOX\Uninstall VOICEVOX.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX(C:\VOICEVOX)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\VOICEVOX" rmdir /s /q "C:\VOICEVOX"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\VOICEVOX フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 2. C:\Program Files\VOICEVOX
if exist "C:\Program Files\VOICEVOX\Uninstall VOICEVOX.exe" (
    start /wait "" "C:\Program Files\VOICEVOX\Uninstall VOICEVOX.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX(C:\Program Files\VOICEVOX)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\Program Files\VOICEVOX" rmdir /s /q "C:\Program Files\VOICEVOX"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\Program Files\VOICEVOX フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 3. %LOCALAPPDATA%\Programs\VOICEVOX(per-user)
if exist "%LOCALAPPDATA%\Programs\VOICEVOX\Uninstall VOICEVOX.exe" (
    start /wait "" "%LOCALAPPDATA%\Programs\VOICEVOX\Uninstall VOICEVOX.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX(%LOCALAPPDATA%\Programs\VOICEVOX)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "%LOCALAPPDATA%\Programs\VOICEVOX" rmdir /s /q "%LOCALAPPDATA%\Programs\VOICEVOX"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo %LOCALAPPDATA%\Programs\VOICEVOX フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM VOICEVOX 0.25.2(GPU/CUDA版)Web Setupインストーラをダウンロードし対話型インストールを実行
curl -L -o "%TEMP%\VOICEVOX-CUDA.Web.Setup.0.25.2.exe" https://github.com/VOICEVOX/voicevox/releases/download/0.25.2/VOICEVOX-CUDA.Web.Setup.0.25.2.exe
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX インストーラのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

start /wait "" "%TEMP%\VOICEVOX-CUDA.Web.Setup.0.25.2.exe" /D=C:\VOICEVOX
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM インストーラの一時ファイルを削除
del "%TEMP%\VOICEVOX-CUDA.Web.Setup.0.25.2.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストーラの一時ファイルの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 機能チェック:VOICEVOXエンジンを起動しAPIでバージョン情報を取得
echo VOICEVOX エンジンを起動中...
start "" "C:\VOICEVOX\vv-engine\run.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX エンジンの起動に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM エンジンの起動完了をポーリングで待機(最大5分、10秒間隔)
powershell -NoProfile -Command "for($i=0;$i -lt 30;$i++){Start-Sleep -Seconds 10;try{$r=Invoke-WebRequest -Uri 'http://127.0.0.1:50021/version' -UseBasicParsing -ErrorAction Stop;if($r.StatusCode -eq 200){Write-Host 'エンジンの起動を確認しました';exit 0}}catch{};Write-Host ('待機中... '+($i+1)*10+'秒経過')};Write-Host 'エンジンの起動がタイムアウトしました(5分経過)';exit 1"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX エンジンの起動確認がタイムアウトしました & ping 127.0.0.1 -n 6 >nul & color )

echo エンジンのバージョン情報を取得中...
curl -sS http://127.0.0.1:50021/version
if not "%ERRORLEVEL%"=="0" ( color 0c & echo エンジンのバージョン情報の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

echo 話者一覧を取得中...
curl -sS http://127.0.0.1:50021/speakers > "%TEMP%\voicevox_speakers.json"
if exist "%TEMP%\voicevox_speakers.json" echo 話者一覧を %TEMP%\voicevox_speakers.json に保存しました
REM 音声合成テスト:日本語テキストから音声を生成し再生する
echo 音声合成テストを実行中...
chcp 65001 >nul
echo ボイスボックスのインストールが完了しました>"%TEMP%\voicevox_test.txt"
curl -sS -X POST "http://127.0.0.1:50021/audio_query?speaker=1" --get --data-urlencode text@"%TEMP%\voicevox_test.txt" -o "%TEMP%\voicevox_query.json"
curl -sS -H "Content-Type: application/json" -X POST -d @"%TEMP%\voicevox_query.json" "http://127.0.0.1:50021/synthesis?speaker=1" -o "%TEMP%\voicevox_test.wav"
echo 合成した音声を再生中...
powershell -c "(New-Object Media.SoundPlayer '%TEMP%\voicevox_test.wav').PlaySync()"
REM 機能チェック用の一時ファイルを削除
del "%TEMP%\voicevox_test.txt" "%TEMP%\voicevox_query.json" "%TEMP%\voicevox_test.wav" "%TEMP%\voicevox_speakers.json" >nul
REM エンジンを停止
taskkill /im run.exe /f >nul
echo 機能チェックが完了しました

REM ============================================================
REM AivisSpeech
REM ============================================================

REM AivisSpeech 既存インストールのアンインストール(3箇所を確認)

REM 1. C:\AivisSpeech
if exist "C:\AivisSpeech\Uninstall AivisSpeech.exe" (
    start /wait "" "C:\AivisSpeech\Uninstall AivisSpeech.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech(C:\AivisSpeech)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\AivisSpeech" rmdir /s /q "C:\AivisSpeech"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\AivisSpeech フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 2. C:\Program Files\AivisSpeech
if exist "C:\Program Files\AivisSpeech\Uninstall AivisSpeech.exe" (
    start /wait "" "C:\Program Files\AivisSpeech\Uninstall AivisSpeech.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech(C:\Program Files\AivisSpeech)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\Program Files\AivisSpeech" rmdir /s /q "C:\Program Files\AivisSpeech"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\Program Files\AivisSpeech フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 3. %LOCALAPPDATA%\Programs\AivisSpeech(per-user)
if exist "%LOCALAPPDATA%\Programs\AivisSpeech\Uninstall AivisSpeech.exe" (
    start /wait "" "%LOCALAPPDATA%\Programs\AivisSpeech\Uninstall AivisSpeech.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech(%LOCALAPPDATA%\Programs\AivisSpeech)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "%LOCALAPPDATA%\Programs\AivisSpeech" rmdir /s /q "%LOCALAPPDATA%\Programs\AivisSpeech"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo %LOCALAPPDATA%\Programs\AivisSpeech フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM AivisSpeech 1.1.0-dev Web Setupインストーラをダウンロードし対話型インストールを実行
curl -L -o "%TEMP%\AivisSpeech-Windows-x64-1.1.0-dev.exe" https://github.com/Aivis-Project/AivisSpeech/releases/download/1.1.0-dev/AivisSpeech-Windows-x64-1.1.0-dev.exe
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech インストーラのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

start /wait "" "%TEMP%\AivisSpeech-Windows-x64-1.1.0-dev.exe" /D=C:\AivisSpeech
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM インストーラの一時ファイルを削除
del "%TEMP%\AivisSpeech-Windows-x64-1.1.0-dev.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストーラの一時ファイルの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 機能チェック:AivisSpeech Engineを起動(初回はモデル自動ダウンロードのため数分かかる)
echo AivisSpeech Engine を起動中(初回はモデルDLのため数分かかります)...
start "" "C:\AivisSpeech\AivisSpeech-Engine\run.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech Engine の起動に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM エンジンの起動完了をポーリングで待機(最大5分、10秒間隔)
powershell -NoProfile -Command "for($i=0;$i -lt 30;$i++){Start-Sleep -Seconds 10;try{$r=Invoke-WebRequest -Uri 'http://127.0.0.1:10101/version' -UseBasicParsing -ErrorAction Stop;if($r.StatusCode -eq 200){Write-Host 'エンジンの起動を確認しました';exit 0}}catch{};Write-Host ('待機中... '+($i+1)*10+'秒経過')};Write-Host 'エンジンの起動がタイムアウトしました(5分経過)';exit 1"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech Engine の起動確認がタイムアウトしました & ping 127.0.0.1 -n 6 >nul & color )

echo エンジンのバージョン情報を取得中...
curl -sS http://127.0.0.1:10101/version
if not "%ERRORLEVEL%"=="0" ( color 0c & echo エンジンのバージョン情報の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

echo 話者一覧を取得中...
curl -sS http://127.0.0.1:10101/speakers > "%TEMP%\aivisspeech_speakers.json"
if exist "%TEMP%\aivisspeech_speakers.json" echo 話者一覧を %TEMP%\aivisspeech_speakers.json に保存しました
REM 音声合成テスト:話者IDを動的に取得し日本語テキストから音声を生成し再生する
echo 音声合成テストを実行中...
chcp 65001 >nul
powershell -NoProfile -Command "$j=ConvertFrom-Json([System.IO.File]::ReadAllText('%TEMP%\aivisspeech_speakers.json',[System.Text.Encoding]::UTF8)); $j[0].styles[0].id" > "%TEMP%\aivisspeech_styleid.txt"
set /p STYLE_ID=<"%TEMP%\aivisspeech_styleid.txt"
echo 使用する話者スタイルID: %STYLE_ID%
echo アイビススピーチのインストールが完了しました>"%TEMP%\aivisspeech_test.txt"
curl -sS -X POST "http://127.0.0.1:10101/audio_query?speaker=%STYLE_ID%" --get --data-urlencode text@"%TEMP%\aivisspeech_test.txt" -o "%TEMP%\aivisspeech_query.json"
curl -sS -H "Content-Type: application/json" -X POST -d @"%TEMP%\aivisspeech_query.json" "http://127.0.0.1:10101/synthesis?speaker=%STYLE_ID%" -o "%TEMP%\aivisspeech_test.wav"
echo 合成した音声を再生中...
powershell -c "(New-Object Media.SoundPlayer '%TEMP%\aivisspeech_test.wav').PlaySync()"
REM 機能チェック用の一時ファイルを削除
del "%TEMP%\aivisspeech_test.txt" "%TEMP%\aivisspeech_query.json" "%TEMP%\aivisspeech_test.wav" "%TEMP%\aivisspeech_speakers.json" "%TEMP%\aivisspeech_styleid.txt" >nul
REM エンジンを停止
taskkill /im run.exe /f >nul
echo 機能チェックが完了しました

REM ============================================================
REM インストール完了
REM ============================================================
echo インストール完了

インストール確認のために次のコマンドを実行する。Path の追加を反映させるため,新しく起動したコマンドプロンプトで実行する。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM ============================================================

REM ===== draw.io =====
if exist "C:\Program Files\draw.io\draw.io.exe" (echo [検出] draw.io) else echo [未検出] draw.io

REM ===== Canva(サインイン前はプロビジョニング状態で検出される) =====
powershell -NoProfile -Command "if((Get-AppxPackage -Name '*Canva*') -or (Get-AppxProvisionedPackage -Online | Where-Object {$_.DisplayName -like '*Canva*'})){Write-Host '[検出] Canva'}else{Write-Host '[未検出] Canva'}"

REM ===== VLC media player =====
if exist "C:\Program Files\VideoLAN\VLC\vlc.exe" (echo [検出] VLC media player) else echo [未検出] VLC media player

REM ===== FFmpeg =====
where ffmpeg >nul 2>&1 && (echo [検出] FFmpeg) || echo [未検出] FFmpeg

REM ===== Shotcut =====
if exist "C:\Program Files\Shotcut\shotcut.exe" (echo [検出] Shotcut) else echo [未検出] Shotcut

REM ===== Vrew =====
if exist "C:\Vrew\Vrew.exe" (echo [検出] Vrew) else if exist "C:\Program Files (x86)\Vrew\Vrew.exe" (echo [検出] Vrew ^(x86^)) else echo [未検出] Vrew

REM ===== Audacity =====
if exist "C:\Program Files\Audacity\audacity.exe" (echo [検出] Audacity) else echo [未検出] Audacity

REM ===== OBS Studio =====
if exist "C:\Program Files\obs-studio\bin\64bit\obs64.exe" (echo [検出] OBS Studio) else if exist "C:\Program Files\obs-studio\bin\obs64.exe" (echo [検出] OBS Studio) else echo [未検出] OBS Studio

REM ===== VOICEVOX =====
if exist "C:\VOICEVOX\VOICEVOX.exe" (echo [検出] VOICEVOX) else echo [未検出] VOICEVOX

REM ===== AivisSpeech =====
if exist "C:\AivisSpeech\AivisSpeech.exe" (echo [検出] AivisSpeech) else echo [未検出] AivisSpeech

REM ===== 確認完了 =====
ソフトウェア説明用途備考
Draw.ioER図,UML図,システム構成図などを作成する作図ツールのデスクトップ版.データは.drawio形式(XML)で保存される.設計図の作成wingetを用いてインストール可能
Canvaプレゼン資料,ポスター,SNS画像などを作成するデザインツール.テンプレートを使用してビジュアルを作成できる.資料デザイン,ポスター作成MSIX形式で配布(全ユーザーにプロビジョニング)
VLC media player各種コーデックを内蔵するメディアプレイヤー.追加インストールなしで各種形式を再生できる.メディア再生wingetを用いてインストール可能
FFmpegコマンドライン型のメディア処理ツール.動画・音声の形式変換,フィルタ適用,ストリーミング配信に使用する.動画・音声の形式変換wingetを用いてインストール可能
Shotcutオープンソースの動画編集ソフト.タイムラインベースの編集,映像・音声フィルタ,4K解像度の入出力に対応する.動画編集wingetを用いてインストール可能
VrewAIを活用した動画編集ソフト.音声認識による自動字幕生成,テキストベースの動画編集,AI音声合成に対応する.無料プランでは音声認識時間とAI音声の文字数に上限があり,書き出した動画にウォーターマークが付与される.AI字幕生成,動画編集wingetを用いてインストール可能(--overrideオプション使用)
Audacity音声編集ソフト.マルチトラック編集,ノイズ除去,エフェクトを備える.音声編集wingetを用いてインストール可能
VOICEVOXテキスト音声合成ソフト.深層学習でキャラクター性のある日本語音声を生成できる.イントネーションの手動調整ができる.キャラクター音声合成インストーラ(v0.25.2のCUDA版)でインストール
AivisSpeechStyle-Bert-VITS2エンジンを採用したテキスト音声合成ソフト.感情表現のスタイル指定ができ,調整なしでも日本語音声を生成できる.音声合成インストーラ(v1.1.0-preview.4)でインストール
OBS Studio録画・配信ソフト.NVENC(NVIDIA製ハードウェアエンコーダ)により,CPU負荷を抑えて画面を記録できる.画面録画,ライブ配信wingetを用いてインストール可能
項目内容
VOICEVOX展開先C:\VOICEVOX(インストール先)
VOICEVOXサイズ約2GB(CUDA版)
AivisSpeech展開先C:\AivisSpeech(インストール先)
FFmpegパスC:\FFmpeg\bin

9. データベース

データベースシステムと関連ツールである。SQL学習やアプリケーション開発のデータ管理に使用する。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

以下のコマンドは、Python 3.12・SQLite3・DBeaverをwingetでシステム領域にインストールし、sqlitebiterをpipでインストールする。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM ============================================================
REM インストール用コマンド
REM 管理者権限で起動したコマンドプロンプトに貼り付けて実行する
REM ============================================================

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM ============================================================
REM Python 3.12
REM ============================================================

REM Python のパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM ============================================================
REM SQLite3
REM ============================================================

REM SQLite3 をシステム領域にインストール
winget install --scope machine --id SQLite.SQLite -e --silent --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SQLite3 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM sqlitebiter
REM ============================================================

REM sqlitebiter をインストール(Python 3.12 の pip を使用)
"%PIP%" install --no-user -U sqlitebiter
if not "%ERRORLEVEL%"=="0" ( color 0c & echo sqlitebiter のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM DBeaver
REM ============================================================

REM DBeaver をシステム領域にインストール
winget install --scope machine --id DBeaver.DBeaver.Community -e --silent --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo DBeaver のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

echo インストール完了

インストール確認のために、新しくコマンドプロンプトを起動して次のコマンドを実行する(環境変数 Path の変更は、変更後に起動したコマンドプロンプトに反映される)。

[インストール確認コマンドを表示(ここをクリック)]
REM ============================================================
REM インストール確認チェック
REM 新しく起動したコマンドプロンプトに貼り付けて実行する
REM ============================================================

REM ===== SQLite3 =====
where sqlite3 2>nul && (sqlite3 --version) || echo [未検出] sqlite3

REM ===== sqlitebiter =====
where sqlitebiter 2>nul && (sqlitebiter version) || echo [未検出] sqlitebiter

REM ===== DBeaver =====
if exist "C:\Program Files\DBeaver\dbeaver.exe" (echo [検出] DBeaver) else echo [未検出] DBeaver

REM ===== 確認完了 =====
ソフトウェア説明用途備考
SQLite3サーバー不要のリレーショナルデータベース。単一ファイルでデータを管理し、組み込み用途やSQL学習に適する。SQL学習,小規模データ管理wingetを用いてインストール可能
sqlitebiterCSV,Excel,HTML,JSON,Markdown等の形式のデータをSQLiteデータベースファイルに変換するCLIツール。データ変換,SQLite3データベース作成pipでインストール
DBeaver Community Edition汎用データベース管理ツール。GUIで多様なデータベースに接続し、データ編集やER図の確認ができる。データベース操作wingetを用いてインストール可能

10. Linux環境(WSL2)

Windows上でLinuxコマンドやLinux用ソフトウェアを使用するための環境である。Docker、各種コンパイラなどの開発ツールはLinux向けに提供されているものが多く、Windows上でこれらを利用できる。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)

インストールは2つのフェーズに分かれる。フェーズ1では、Hyper-V、Linux用Windowsサブシステム、仮想マシンプラットフォームの各機能を有効化し、WSL2をデフォルトに設定したうえでPCを再起動する。再起動後、フェーズ2でUbuntuをインストールし、ユーザー作成(デフォルトユーザーguest)・日本語環境・開発ツールのセットアップを行い、セットアップ済みのUbuntuをプロファイル外(C:\WSL\Ubuntu)にインポートする。続いてスタートメニューのショートカットとWindows Terminalのアイコンを設定する。いずれのフェーズも管理者権限のコマンドプロンプトで実行する。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]

フェーズ1:再起動前(管理者権限で実行)

REM Linux環境 インストール フェーズ1(管理者権限で実行)

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update
if not "%ERRORLEVEL%"=="0" ( color 0c & echo winget source update に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 直前のコマンドの ERRORLEVEL をクリア
ver >nul

REM Hyper-V,Linux用Windowsサブシステム,仮想マシンプラットフォームを有効化
powershell -command "Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -n"
powershell -command "Enable-WindowsOptionalFeature -Online -FeatureName HypervisorPlatform -n"
powershell -command "Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -n"
powershell -command "Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -n"

REM WSL2をデフォルトに設定
wsl --set-default-version 2

REM 再起動
REM ============================================================
echo フェーズ1完了
echo PC を再起動します
echo 再起動後、フェーズ2のコマンドを実行してください
echo 確認したら何かキーを押してください
pause
shutdown /r /t 0

フェーズ2:フェーズ1が終了したら OS を再起動し,次のコマンドを実行(管理者権限で実行)

REM Linux環境 インストール フェーズ2(管理者権限で実行)

REM 管理者権限チェック
net session >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM 仮想化基盤の状態確認
dism /online /get-featureinfo /featurename:Microsoft-Windows-Subsystem-Linux
dism /online /get-featureinfo /featurename:VirtualMachinePlatform
dism /online /get-featureinfo /featurename:Microsoft-Hyper-V

REM ============================================================
echo インストール可能なLinuxディストリビューション
wsl -l --online
REM ============================================================

REM wsl コマンドの出力をUTF-8にする(次の findstr による判定に必要)
set WSL_UTF8=1

REM 既存の Ubuntu が登録されている場合は登録解除
wsl -l -q | findstr /x /c:"Ubuntu" >nul
if not errorlevel 1 wsl --unregister Ubuntu

REM 既存のディレクトリが残っている場合は削除
if exist C:\WSL\Ubuntu rmdir /s /q C:\WSL\Ubuntu

REM 一旦インストール(起動せずに)
wsl --install --no-launch -d Ubuntu

REM ユーザー作成・設定
REM 「myguestpassword」には、任意のパスワードを設定してください
wsl -d Ubuntu -u root bash -c "useradd -m -s /bin/bash guest"
wsl -d Ubuntu -u root bash -c "echo 'guest:myguestpassword' | chpasswd"
wsl -d Ubuntu -u root bash -c "usermod -aG sudo guest"
wsl -d Ubuntu -u root bash -c "echo 'guest ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/guest"
wsl -d Ubuntu -u root bash -c "chmod 440 /etc/sudoers.d/guest"

REM デフォルトユーザーを guest に変更
wsl -d Ubuntu -u root bash -c "echo -e '[user]\ndefault=guest' > /etc/wsl.conf"

REM ダウンロード元が海外になっている場合は日本に設定(Ubuntu 24.04+のDEB822形式にも対応)
wsl -d Ubuntu -u root bash -c "if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then sed -i 's/archive.ubuntu.com/jp.archive.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources; sed -i 's/us.archive.ubuntu.com/jp.archive.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources; sed -i 's/fr.archive.ubuntu.com/jp.archive.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources; else sed -i 's/\/\/archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list; sed -i 's/\/\/us.archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list; sed -i 's/\/\/fr.archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list; fi"

REM OSのシステム更新,日本語環境の設定
wsl -d Ubuntu -u root bash -c "apt update && apt install -y language-pack-ja && update-locale LANG=ja_JP.UTF-8"

REM 開発ツール・学習用パッケージのインストール
wsl -d Ubuntu -u root bash -c "apt install -y build-essential gdb cmake valgrind manpages-dev python3-pip python3-venv python3-dev git tree curl wget x11-apps emacs nautilus mousepad eog notepadqq"

REM セットアップ完了状態をエクスポート
wsl --shutdown
wsl --export Ubuntu "%TEMP%\ubuntu.tar"

REM プロファイル内の仮インストールを削除
wsl --unregister Ubuntu

REM プロファイル外にインポート
mkdir C:\WSL\Ubuntu
wsl --import Ubuntu C:\WSL\Ubuntu "%TEMP%\ubuntu.tar" --version 2

REM デフォルトディストリビューションに設定
wsl --set-default Ubuntu

REM 一時ファイル削除
del "%TEMP%\ubuntu.tar"

REM 全ユーザーにアクセス権を付与(他ユーザーが C:\WSL 配下にインポートできるようにする)
icacls C:\WSL /grant Everyone:(OI)(CI)F /T

REM Ubuntuアイコンをダウンロードし、ショートカットを作成
powershell -Command "New-Item -ItemType Directory -Path 'C:\ProgramData\Icons' -Force | Out-Null; Invoke-WebRequest -Uri 'https://assets.ubuntu.com/v1/49a1a858-favicon-32x32.png' -OutFile 'C:\ProgramData\Icons\ubuntu.png'; Add-Type -AssemblyName System.Drawing; $bmp = [System.Drawing.Bitmap]::FromFile('C:\ProgramData\Icons\ubuntu.png'); $icon = [System.Drawing.Icon]::FromHandle($bmp.GetHicon()); $fs = [System.IO.File]::Create('C:\ProgramData\Icons\ubuntu.ico'); $icon.Save($fs); $fs.Close(); $icon.Dispose(); $bmp.Dispose(); $ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Ubuntu.lnk'); $s.TargetPath = '%SystemRoot%\System32\wsl.exe'; $s.Arguments = '-d Ubuntu'; $s.IconLocation = 'C:\ProgramData\Icons\ubuntu.ico,0'; $s.Description = 'Ubuntu on WSL2'; $s.Save()"
REM アイコン設定
powershell -Command "New-Item -ItemType Directory -Path 'C:\ProgramData\Icons' -Force | Out-Null; Invoke-WebRequest -Uri 'https://assets.ubuntu.com/v1/29985a98-ubuntu-logo32.png' -OutFile 'C:\ProgramData\Icons\ubuntu.png'; $path = \"$env:LocalAppData\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json\"; $json = Get-Content $path -Raw | ConvertFrom-Json; foreach ($p in $json.profiles.list) { if ($p.source -eq 'Windows.Terminal.Wsl') { $p | Add-Member -NotePropertyName 'icon' -NotePropertyValue 'C:\ProgramData\Icons\ubuntu.png' -Force } }; $json | ConvertTo-Json -Depth 10 | Set-Content $path -Encoding UTF8"

REM =====================================================
REM 他のWindowsユーザーは以下を各自のコマンドプロンプトで実行
REM wsl --import Ubuntu C:\WSL\Ubuntu-ユーザー名 C:\WSL\Ubuntu\ext4.vhdx --version 2 --vhd
REM wsl --set-default Ubuntu
REM =====================================================

REM ============================================================
echo WSL2とUbuntuのセットアップが完了しました
echo 使い方:
echo   スタートメニューの「Ubuntu」または
echo   コマンドプロンプトで wsl を実行
echo   デフォルトユーザー: guest
REM ============================================================
ソフトウェア説明用途備考
WSL2Windows上でLinux環境を動作させる仕組み。WindowsからLinuxの開発ツールを利用できる。Linux環境構築Windowsの機能(Linux用Windowsサブシステム、仮想マシンプラットフォーム等)を有効化して利用する
UbuntuLinuxディストリビューション。本手順ではユーザー作成、日本語環境、開発ツール一式(build-essential、gdb、cmake、git等)をセットアップする。Linux実習,開発wsl --installで導入。プロファイル外(C:\WSL\Ubuntu)にインポートする。デフォルトユーザーはguest

【関連する外部ページ】

11. Microsoft Sysinternalsツール

Microsoft Sysinternalsは、Windows(およびLinux)システムの管理、診断、トラブルシューティング、監視を行うためのMicrosoftユーティリティである。

インストール

Process Explorer、Process Monitor、Autoruns、Disk Usage(いずれも64ビット版)をダウンロードしてC:\toolsに配置し、C:\toolsを環境変数Pathに追加するコマンドの例を示す。コマンドプロンプトを管理者として開いて実行する。Pathの変更が反映されるのは、サインアウトまたは再起動の後である。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
if not exist C:\tools mkdir C:\tools

powershell -NoProfile -Command "Invoke-WebRequest 'https://download.sysinternals.com/files/ProcessExplorer.zip' -OutFile $env:TEMP\ProcessExplorer.zip -UseBasicParsing"
powershell -NoProfile -Command "if(Test-Path $env:TEMP\ProcessExplorer){Remove-Item $env:TEMP\ProcessExplorer -Recurse -Force}; Expand-Archive -LiteralPath $env:TEMP\ProcessExplorer.zip -DestinationPath $env:TEMP\ProcessExplorer -Force"
copy /Y "%TEMP%\ProcessExplorer\procexp64.exe" C:\tools\procexp64.exe

powershell -NoProfile -Command "Invoke-WebRequest 'https://download.sysinternals.com/files/ProcessMonitor.zip' -OutFile $env:TEMP\ProcessMonitor.zip -UseBasicParsing"
powershell -NoProfile -Command "if(Test-Path $env:TEMP\ProcessMonitor){Remove-Item $env:TEMP\ProcessMonitor -Recurse -Force}; Expand-Archive -LiteralPath $env:TEMP\ProcessMonitor.zip -DestinationPath $env:TEMP\ProcessMonitor -Force"
copy /Y "%TEMP%\ProcessMonitor\Procmon64.exe" C:\tools\Procmon64.exe

powershell -NoProfile -Command "Invoke-WebRequest 'https://download.sysinternals.com/files/Autoruns.zip' -OutFile $env:TEMP\Autoruns.zip -UseBasicParsing"
powershell -NoProfile -Command "if(Test-Path $env:TEMP\Autoruns){Remove-Item $env:TEMP\Autoruns -Recurse -Force}; Expand-Archive -LiteralPath $env:TEMP\Autoruns.zip -DestinationPath $env:TEMP\Autoruns -Force"
copy /Y "%TEMP%\Autoruns\Autoruns64.exe" C:\tools\Autoruns64.exe

powershell -NoProfile -Command "Invoke-WebRequest 'https://download.sysinternals.com/files/DU.zip' -OutFile $env:TEMP\DU.zip -UseBasicParsing"
powershell -NoProfile -Command "if(Test-Path $env:TEMP\DU){Remove-Item $env:TEMP\DU -Recurse -Force}; Expand-Archive -LiteralPath $env:TEMP\DU.zip -DestinationPath $env:TEMP\DU -Force"
copy /Y "%TEMP%\DU\du64.exe" C:\tools\du64.exe

REM C:\toolsのパス設定
powershell -NoProfile -Command "$p='C:\tools'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

主なツール

12. 画像データ、3次元データ

画像処理・コンピュータビジョン・3次元再構成・動画解析の学習や検証に使用するサンプルデータをダウンロードし、C:\image以下に配置するコマンドである。取得するデータの一覧を示す。StreetView360Xのダウンロードにhuggingface_hubを使用する。Blenderを使用する(Blenderデモデータの取得後にレンダリングを実行するため、BlenderのインストールとPATH設定が必要。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド

[インストールコマンドを表示(ここをクリック)]
REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM images
REM ダウンロード先フォルダの作成
if not exist c:\image mkdir c:\image
if not exist c:\temp mkdir c:\temp

echo -----------------------------------------------
REM Potato images
curl -L -f -o C:\temp\potato_image.zip https://www.kkaneko.jp/sample/potato/potato_image.zip
powershell -NoProfile -Command "Expand-Archive -Path 'C:\temp\potato_image.zip' -DestinationPath 'C:\image' -Force"
if exist C:\temp\potato_image.zip del /q C:\temp\potato_image.zip

echo -----------------------------------------------
REM OpenCV images
if not exist C:\image\opencv mkdir C:\image\opencv
curl -L -f -o C:\image\opencv\aero1.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/aero1.jpg
curl -L -f -o C:\image\opencv\aero3.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/aero3.jpg
curl -L -f -o C:\image\opencv\aloeL.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/aloeL.jpg
curl -L -f -o C:\image\opencv\aloeR.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/aloeR.jpg
curl -L -f -o C:\image\opencv\baboon.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/baboon.jpg
curl -L -f -o C:\image\opencv\building.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/building.jpg
curl -L -f -o C:\image\opencv\board.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/board.jpg
curl -L -f -o C:\image\opencv\butterfly.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/butterfly.jpg
curl -L -f -o C:\image\opencv\chicky_512.png https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/chicky_512.png
curl -L -f -o C:\image\opencv\fruits.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/fruits.jpg
curl -L -f -o C:\image\opencv\home.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/home.jpg
curl -L -f -o C:\image\opencv\squirrel_cls.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/squirrel_cls.jpg
curl -L -f -o C:\image\opencv\starry_night.jpg https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/starry_night.jpg
curl -L -f -o C:\image\opencv\vtest.avi https://raw.githubusercontent.com/opencv/opencv/4.x/samples/data/vtest.avi
if not exist C:\image\ultralytics mkdir C:\image\ultralytics
curl -L -f -o C:\image\ultralytics\bus.jpg https://ultralytics.com/images/bus.jpg
curl -L -f -o C:\image\ultralytics\zidane.jpg https://ultralytics.com/images/zidane.jpg
curl -L -f -o C:\image\ultralytics\boats.jpg https://ultralytics.com/images/boats.jpg
curl -L -f -o C:\image\ultralytics\vehicles.jpg https://ultralytics.com/images/vehicles.jpg

echo -----------------------------------------------
REM MediaPipe sample images : mediapipe-tasks bucket
REM Hand / Gesture / Object Detection / Image Classification
if not exist C:\image\mediapipe mkdir C:\image\mediapipe

REM 21点ハンドランドマーク評価用 両手映り
curl -L -f -o C:\image\mediapipe\woman_hands.jpg https://storage.googleapis.com/mediapipe-tasks/hand_landmarker/woman_hands.jpg
REM ジェスチャー認識 Thumb_Up クラス検証
curl -L -f -o C:\image\mediapipe\thumbs_up.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/thumbs_up.jpg
REM ジェスチャー認識 Thumb_Down クラス検証
curl -L -f -o C:\image\mediapipe\thumbs_down.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/thumbs_down.jpg
REM ジェスチャー認識 Victory クラス検証
curl -L -f -o C:\image\mediapipe\victory.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/victory.jpg
REM ジェスチャー認識 Pointing_Up クラス検証
curl -L -f -o C:\image\mediapipe\pointing_up.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/pointing_up.jpg
REM 物体検出 COCO 多クラス同時検出 cat dog
curl -L -f -o C:\image\mediapipe\cat_and_dog.jpg https://storage.googleapis.com/mediapipe-tasks/object_detector/cat_and_dog.jpg
REM 画像分類 ImageNet 食品カテゴリ
curl -L -f -o C:\image\mediapipe\burger.jpg https://storage.googleapis.com/mediapipe-tasks/image_classifier/burger.jpg
REM 画像分類 ImageNet 動物カテゴリ
curl -L -f -o C:\image\mediapipe\cat.jpg https://storage.googleapis.com/mediapipe-tasks/image_classifier/cat.jpg
REM 画像セグメンテーション DeepLab V3 Pascal VOC 21クラス検証用
curl -L -f -o C:\image\mediapipe\segmentation_input_rotation0.jpg https://storage.googleapis.com/mediapipe-assets/segmentation_input_rotation0.jpg
REM 姿勢推定 BlazePose 単一人物全身 33点ランドマーク検証
curl -L -f -o C:\image\mediapipe\girl-4051811.jpg https://cdn.pixabay.com/photo/2019/03/12/20/39/girl-4051811_960_720.jpg
REM 顔ランドマーク検出 478点および52種ブレンドシェイプ検証
curl -L -f -o C:\image\mediapipe\business-person.png https://storage.googleapis.com/mediapipe-assets/business-person.png
REM 顔検出 BlazeFace 複数顔 6点キーポイント検証
curl -L -f -o C:\image\mediapipe\face_detector_sample.jpg https://i.imgur.com/Vu2Nqwb.jpeg
REM 画像埋め込み コサイン類似度検証 元画像
curl -L -f -o C:\image\mediapipe\burger_embed.jpg https://storage.googleapis.com/mediapipe-assets/burger.jpg
REM 画像埋め込み コサイン類似度検証 切り抜き画像
curl -L -f -o C:\image\mediapipe\burger_crop.jpg https://storage.googleapis.com/mediapipe-assets/burger_crop.jpg

echo -----------------------------------------------
REM AudioSet sample audio : 16 kHz WAV
REM YAMNet / AST audio classification benchmark
if not exist C:\image\audioset mkdir C:\image\audioset

REM 動物クラス検証 猫鳴き声 約6.7秒
curl -L -f -o C:\image\audioset\miaow_16k.wav https://storage.googleapis.com/audioset/miaow_16k.wav

REM 人間音声クラス検証 口笛
curl -L -f -o C:\image\audioset\speech_whistling2.wav https://storage.googleapis.com/audioset/speech_whistling2.wav

echo -----------------------------------------------
REM StreetView360AtoZ のダウンロード,StreetView 360Xは6342枚の360度エクイレクタングラー画像を含むデータセットで,Hugging Faceで公開されている
"%PIP%" install --no-user huggingface_hub
"%PYTHON%" -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='everettshen/StreetView360AtoZ', repo_type='dataset', local_dir='c:\\image\\StreetView360X', allow_patterns='*.jpg')"
if exist c:\image\StreetView360X\.cache rmdir /s /q c:\image\StreetView360X\.cache

echo -----------------------------------------------
REM Video Data
if not exist c:\image\video mkdir c:\image\video
curl -fL --retry 3 --retry-delay 2 --retry-all-errors -o c:\image\video\sample_640x360.mp4 https://filesamples.com/samples/video/mp4/sample_640x360.mp4
curl -fL --retry 3 --retry-delay 2 --retry-all-errors -o c:\image\video\sample_30s.mp4 https://samplelib.com/lib/preview/mp4/sample-30s.mp4
curl -fL --retry 3 --retry-delay 2 --retry-all-errors -o c:\image\video\big_buck_bunny_720_1mb.mp4 https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_1MB.mp4
curl -fL --retry 3 --retry-delay 2 --retry-all-errors -o c:\image\video\sintel_720_1mb.mp4 https://test-videos.co.uk/vids/sintel/mp4/h264/720/Sintel_720_10s_1MB.mp4
curl -fL --retry 3 --retry-delay 2 -o c:\image\video\dashcam_city_4k.mp4 https://videos.pexels.com/video-files/4644521/4644521-uhd_2562_1440_30fps.mp4
curl -fL --retry 3 --retry-delay 2 -o c:\image\video\dashcam_city_sd.mp4 https://videos.pexels.com/video-files/4644481/4644481-sd_640_360_30fps.mp4
curl -fL --retry 3 --retry-delay 2 -o c:\image\video\dashcam_highway_4k.mp4 https://videos.pexels.com/video-files/4608285/4608285-uhd_2560_1440_24fps.mp4
curl -fL --retry 3 --retry-delay 2 -o c:\image\video\dashcam_highway_sd.mp4 https://videos.pexels.com/video-files/4608273/4608273-sd_640_360_24fps.mp4

echo -----------------------------------------------
REM Blender Data
if not exist C:\image\blender mkdir C:\image\blender
cd /d C:\image\blender
if exist *.zip del /q *.zip
if exist *.blend del /q *.blend
curl -L -f -O https://download.blender.org/demo/test/classroom.zip
curl -L -f -O https://download.blender.org/demo/test/pabellon_barcelona_v1.scene_.zip
curl -L -f -O https://download.blender.org/demo/test/BMW27_2.blend.zip
curl -L -f -O https://download.blender.org/demo/cycles/monster_under_the_bed_sss_demo_by_metin_seven.blend
curl -L -f -O https://download.blender.org/demo/vse/cowboi_storytools.blend
curl -L -f -O https://download.blender.org/demo/test/SJ_bowie_gpencil_final.blend
curl -L -f -O https://download.blender.org/demo/geometry-nodes/hair_nodes-female_hair_styles.blend
curl -L -f -O https://download.blender.org/demo/test/ForYou.blend
curl -L -f -O https://download.blender.org/demo/bundles/bundles-3.0/asset-demo-bundle-3.0-cube-diorama.zip
powershell -NoProfile -Command "Get-ChildItem *.zip | ForEach-Object { Expand-Archive -Path $_.FullName -DestinationPath $_.BaseName -Force }"
if exist *.zip del /q *.zip
for /r %f in (*.blend) do blender -b "%f" --python-expr "import bpy; s=bpy.context.scene; s.render.engine=='CYCLES' and setattr(s.cycles,'samples',16)" -o "%~dpnf_render_#" -f 1

echo ------------------------------------------
chcp 65001
mkdir c:\image
cd c:\image
mkdir face_recognition
mkdir medical

REM 画像名: Official portrait of Donald Trump (47th), 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 実写顔写真の識別・照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_01_trump_47.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/11600/11614v.jpg"

REM 画像名: Official portrait of Joe Biden (46th), 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 実写顔写真の識別・照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_02_biden_46.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/01200/01261v.jpg"

REM 画像名: Official portrait of Donald Trump (45th), 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 同一人物の別条件照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_03_trump_45.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/00600/00608v.jpg"

REM 画像名: Official portrait of Barack Obama, 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 正面顔の識別・照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_04_obama.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/00300/00358v.jpg"

REM 画像名: Official portrait of George W. Bush, 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: スタジオ撮影顔写真の識別用
curl.exe -L --fail --retry 3 -o "face_recognition\face_05_george_w_bush.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/00300/00371v.jpg"

REM 画像名: Official portrait of Gerald Ford, 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 解像度差を含む顔照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_06_gerald_ford.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppmsc/02800/02800r.jpg"

REM 画像名: CDC PHIL 20474 fundoscopic retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底所見の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_01_phil_20474_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20474/20474_lores.jpg"

REM 画像名: CDC PHIL 20470 retinal image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底病変の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_02_phil_20470_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20470/20470_lores.jpg"

REM 画像名: CDC PHIL 28399 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底所見の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_03_phil_28399_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/28399/28399_lores.jpg"

REM 画像名: CDC PHIL 20469 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底画像の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_04_phil_20469_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20469/20469_lores.jpg"

REM 画像名: CDC PHIL 28398 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底異常所見の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_05_phil_28398_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/28398/28398_lores.jpg"

REM 画像名: CDC PHIL 18398 skin lesion image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 皮膚病変の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_06_phil_18398_skin_lesion.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/18398/18398_lores.jpg"

REM 画像名: CDC PHIL 18403 skin lesion image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 皮膚病変の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_07_phil_18403_skin_lesion.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/18403/18403_lores.jpg"

REM 画像名: CDC PHIL 22243 histopathology image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 病理組織像の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_08_phil_22243_histopathology.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/22243/22243_lores.jpg"

REM 画像名: CDC PHIL 16716 histopathology image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 顕微鏡病理画像の分類用
curl.exe -L --fail --retry 3 -o "medical\med_09_phil_16716_histopathology.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/16716/16716_lores.jpg"

REM 画像名: CDC PHIL 20479 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底画像の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_10_phil_20479_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20479/20479_lores.jpg"

echo Download commands finished.
データ説明用途備考
Potato imagesジャガイモのサンプル画像セット。画像処理の学習・検証kkaneko.jpからzipをダウンロードし、C:\imageに展開(作業用にC:\tempを使用)
OpenCV サンプル画像OpenCVリポジトリのサンプル画像・動画(aero1、baboon、fruits、starry_night、vtest.avi等)。画像処理、ステレオ視、動画解析の検証GitHubのopencv/opencv(4.x)からC:\image\opencvにダウンロード
Ultralytics サンプル画像物体検出用のサンプル画像(bus、zidane、boats、vehicles)。物体検出(YOLO)の検証ultralytics.comからC:\image\ultralyticsにダウンロード
MediaPipe サンプル画像手・ジェスチャー・物体検出・画像分類・セグメンテーション・姿勢推定・顔ランドマーク・顔検出・画像埋め込みの各検証用画像。MediaPipe各タスクの検証Google Cloud Storage(mediapipe-tasks/mediapipe-assets)等からC:\image\mediapipeにダウンロード
AudioSet サンプル音声16kHz WAVのサンプル音声(猫の鳴き声、口笛)。音声分類(YAMNet/AST)の検証Google Cloud Storage(audioset)からC:\image\audiosetにダウンロード
StreetView360XGoogle Street Viewから収集された6342枚の360度エクイレクタングラー画像のデータセット。360度画像処理、3次元再構成Hugging Face(everettshen/StreetView360AtoZ)からhuggingface_hubでC:\image\StreetView360Xにダウンロード(jpgのみ)
T&T+DB(tandt_db)Tanks and Temples および Deep Blending のCOLMAPデータセット(パースペクティブ画像、約650MB)。3次元ガウシアンスプラッティング、3次元再構成InriaのリポジトリからzipをダウンロードしC:\image\tandt_dbに展開
サンプル動画各種解像度のサンプル動画(640x360、Big Buck Bunny、Sintel、ドライブレコーダー風の市街地・高速道路映像等)。動画処理、動画解析の検証filesamples/samplelib/test-videos.co.uk/PexelsからC:\image\videoにダウンロード
Blender デモデータBlender公式のデモシーン・.blendファイル(classroom、BMW27、geometry-nodes等)。3次元CG、レンダリングの学習・検証download.blender.orgからC:\image\blenderにダウンロード・展開。取得後、各.blendのフレーム1をレンダリング(レンダーエンジンがCyclesのシーンはサンプル数を16に設定。Blenderが必要)

13. 補足説明

Build Tools for Visual StudioとVisual Studioの違い

Build Tools for Visual Studioの公式ダウンロードページ:https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/

次のコマンドは、Visual Studio Community 2026本体と、C++デスクトップ開発に必要な基本コンポーネントをインストールする。

winget install Microsoft.VisualStudio.Community --scope machine --override "--add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --includeRecommended" -e
if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
winget install Microsoft.VCRedist.2015+.x64 --scope machine -e
if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

Visual Studio Communityの公式ページ:https://visualstudio.microsoft.com/ja/vs/community/

14. ツール選択ガイド

主なツール一覧である。

用途推奨ツール
ローカルLLM(コマンドライン)Ollama
指示からコードを自律生成Cline
コード補完調査中
自律的コーディング調査中
拡張機能を自由に組み合わせVisual Studio Code
画像分類・物体検出opencv-python、PyTorch
音声分析librosa
自然言語処理transformers
RAG(検索拡張生成)LangChain、chromadb、sentence-transformers
クラウドAI API連携openai、google-generativeai、litellm
デモ作成Gradio, Streamlit
AI画像生成ComfyUI
Python 3Dゲーム開発Panda3D
ネットワーク解析Wireshark
資料デザインCanva

終了処理(不要ファイルクリア)


REM
REM 終了処理
REM

プロファイル内	%USERPROFILE% 以下	REM 一時ファイル
del /f /s /q "%TEMP%\*"
for /d %D in ("%TEMP%\*") do rmdir /s /q "%D"

REM サムネイルキャッシュ
del /f /s /q "%LOCALAPPDATA%\Microsoft\Windows\Explorer\thumbcache_*.db"

REM アイコンキャッシュ
del /f /s /q "%LOCALAPPDATA%\Microsoft\Windows\Explorer\iconcache_*.db"

REM 最近使ったファイル
del /f /q "%APPDATA%\Microsoft\Windows\Recent\*"
del /f /q "%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\*"
del /f /q "%APPDATA%\Microsoft\Windows\Recent\CustomDestinations\*"

REM Internet Explorer / レガシー Edge のキャッシュ
del /f /s /q "%LOCALAPPDATA%\Microsoft\Windows\INetCache\*"

REM Windows エラー報告のレポートファイル
del /f /s /q "%LOCALAPPDATA%\Microsoft\Windows\WER\*"
del /f /s /q "%APPDATA%\Microsoft\Windows\WER\*"

REM Windows キャッシュ
del /f /s /q "%LOCALAPPDATA%\Microsoft\Windows\Caches\*"

REM クラッシュダンプ
del /f /s /q "%LOCALAPPDATA%\CrashDumps\*"

REM DirectX シェーダーキャッシュ
rmdir /s /q "%LOCALAPPDATA%\D3DSCache"

REM MobaXterm Cache(セッション定義・保存済みパスワード・設定ファイルは保持)
rmdir /s /q "%APPDATA%\MobaXterm\slash\tmp"
rmdir /s /q "%APPDATA%\MobaXterm\slash\var\cache"

REM 開発ツール系キャッシュ
rmdir /s /q "%LOCALAPPDATA%\pip\cache"
rmdir /s /q "%APPDATA%\npm-cache"
rmdir /s /q "%LOCALAPPDATA%\NuGet\v3-cache"

REM Winget Cache(プロファイル内)
rmdir /s /q "%TEMP%\WinGet"
del /f /q "%LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir\*.log"
for /d %D in ("%LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir\*") do rmdir /s /q "%D"

REM Winget Cache、ログファイル(プロファイル外)
rmdir /s /q "C:\Windows\Temp\WinGet"
del /f /q "C:\Windows\Temp\*.log"

REM ============================================================
REM winget キャッシュクリア
REM ============================================================

chcp 65001
powershell -NoProfile -Command "$p=Join-Path $env:TEMP 'WinGet'; if(Test-Path $p){'{0:N1} MB' -f ((Get-ChildItem $p -Recurse -File -Force -EA 0 | Measure-Object Length -Sum).Sum/1MB)}else{'none'}"
del /f /s /q "%TEMP%\WinGet\*"
for /d %i in ("%TEMP%\WinGet\*") do @rd /s /q "%i"
forfiles /p "%LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir" /m *.log /d -7 /c "cmd /c del /f /q @path" 2>nul
dir /s "%TEMP%\WinGet"

9/3 までの更新部分反映用スクリプト

[2026/08/25-09/03 の差分を反映させるスクリプト]

REM ============================================================
REM パス長制限の解除 (LongPathsEnabled)
REM ============================================================
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
reg query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled

REM ============================================================
pip install -U --no-user pygame pymunk
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pygame pymunkのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM CUDA 12.8のMSBuild統合ファイルをコピー
REM ============================================================
REM 統合用ファイルのコピー
if exist "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\" (
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "c:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v170\BuildCustomizations\" /Y /I
) else (
    echo CUDA v12.8 のディレクトリが存在しません。
    ping 127.0.0.1 -n 6 >nul
)

REM =====================================================================
REM CUDA Toolkit の確認(llama.cpp の CUDA ビルドに必要)
where nvcc
if not "%ERRORLEVEL%"=="0" echo [警告] nvcc が見つかりません。CUDA Toolkit を導入してから llama.cpp のビルドを実行してください。

REM llama.cpp のビルドとインストール
cd /d "%TEMP%"
if exist llama.cpp rmdir /s /q llama.cpp
git clone https://github.com/ggml-org/llama.cpp
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のクローンに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd llama.cpp
cmake -B build -T v143 -DCMAKE_GENERATOR_INSTANCE="C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89;120" -DCMAKE_INSTALL_PREFIX="C:\llama.cpp"
REM cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89;120" -DCMAKE_CUDA_FLAGS="-allow-unsupported-compiler" -DCMAKE_INSTALL_PREFIX="C:\llama.cpp"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp の CMake 構成に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cmake --build build --config Release -j 8
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のビルドに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cmake --install build --config Release
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d "%TEMP%"
powershell -NoProfile -Command "$p='C:\llama.cpp\bin'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM ============================================================
REM VSCodium
REM ============================================================
REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
REM python.languageServer の指定可能な値は Default / Jedi / Pylance / None であり、
REM Pyright 拡張を使う場合は None を指定する
if not exist "%APPDATA%\VSCodium\User" mkdir "%APPDATA%\VSCodium\User"
python -c "import json,os;data={'update.mode':'none','extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','python.languageServer':'None','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'qwen38-27b-code'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'VSCodium','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
if not exist "%APPDATA%\Code\User" mkdir "%APPDATA%\Code\User"
python -c "import json,os;data={'update.mode':'none','update.enableWindowsBackgroundUpdates':False,'extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'qwen38-27b-code'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'Code','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM ============================================================
REM Ollama のインストール
REM ============================================================
REM === Ollama 環境変数を Machine スコープで事前設定 ===
REM   インストール前に設定することで、Ollama起動時から設定が読み込まれる
REM   KVキャッシュ量子化の設定
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_FLASH_ATTENTION', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_KV_CACHE_TYPE', 'q8_0', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MAX_LOADED_MODELS', '2', 'Machine')"
REM コンテキスト長:Ollamaのデフォルトは4096。ここでは32768に設定。
REM 用途に応じて値を変更するか、この行を削除して auto に任せる
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_CONTEXT_LENGTH', '32768', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MODELS', 'C:\Ollama\models', 'Machine')"
set "OLLAMA_FLASH_ATTENTION=1"
set "OLLAMA_KV_CACHE_TYPE=q8_0"
set "OLLAMA_MAX_LOADED_MODELS=2"
set "OLLAMA_CONTEXT_LENGTH=32768"
set "OLLAMA_MODELS=C:\Ollama\models"

REM === 既存の Ollama プロセスを停止(ファイルロック解除のため) ===
REM   実行中の場合のみ taskkill を実行する(find の戻り値は 0 または 1)
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul && taskkill /F /IM ollama.exe
tasklist /FI "IMAGENAME eq ollama app.exe" | find /I "ollama app.exe" >nul && taskkill /F /IM "ollama app.exe"

REM === モデルフォルダの作成と権限設定 ===
if not exist "C:\Ollama\models" mkdir "C:\Ollama\models"
icacls "C:\Ollama\models" /grant "*S-1-5-32-545:(OI)(CI)(M)" /T

REM === 既存モデルの移動(ユーザープロファイルに残っている場合) ===
REM   Ollama 停止状態で実行するためファイルロックが起きない
if exist "%USERPROFILE%\.ollama\models" robocopy "%USERPROFILE%\.ollama\models" "C:\Ollama\models" /E /MOVE
if exist "%USERPROFILE%\.ollama\models" rd /s /q "%USERPROFILE%\.ollama\models"

REM robocopy は正常終了時も 0 以外を返すため ERRORLEVEL をクリア
ver >nul

REM === Ollama のアンインストール ===
REM   インストール先を C:\Ollama に変更するため、インストール済みの場合は先に削除する
set "OLLAMA_INSTALLED=1"
winget list --id Ollama.Ollama -e >nul 2>&1
if not "%ERRORLEVEL%"=="0" set "OLLAMA_INSTALLED=0"
REM   起動中はファイルが残り削除に失敗するため、先にプロセスを停止する
if "%OLLAMA_INSTALLED%"=="1" taskkill /F /T /IM "ollama app.exe" >nul 2>&1
if "%OLLAMA_INSTALLED%"=="1" taskkill /F /T /IM "ollama.exe" >nul 2>&1
if exist "C:\ollama\unins000.exe" (if "%OLLAMA_INSTALLED%"=="1" start /wait "" "C:\Ollama\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG="C:\TEMP\ollama_unins.log") else (if "%OLLAMA_INSTALLED%"=="1" start /wait "" "%LOCALAPPDATA%\Programs\Ollama\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG="C:\TEMP\ollama_unins.log")
if "%OLLAMA_INSTALLED%"=="1" if not "%ERRORLEVEL%"=="0" echo [警告] winget uninstall が異常終了しました
if "%OLLAMA_INSTALLED%"=="1" winget list --id Ollama.Ollama -e >nul 2>&1
if "%OLLAMA_INSTALLED%"=="1" if "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM uninstall後にプロセスが残ることがあるため、実行中であれば再度停止
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul && taskkill /F /IM ollama.exe
tasklist /FI "IMAGENAME eq ollama app.exe" | find /I "ollama app.exe" >nul && taskkill /F /IM "ollama app.exe"

REM === Ollama のインストール ===
winget install --id Ollama.Ollama -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/DIR=C:\Ollama"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM === Ollama のパス設定(システム PATH に未登録の場合のみ追加) ===
powershell -NoProfile -Command "$p='C:\Ollama'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM ============================================================
REM  OLLAMA スタートメニュー
REM ============================================================
REM   Windows 版の ollama run は、サーバー未起動時に ollama app.exe を自動起動する

REM remove glm-4.7-flash
powershell -NoProfile -Command "Remove-Item -LiteralPath ([Environment]::GetFolderPath('CommonPrograms')+'\Ollama GLM4.lnk') -Force -ErrorAction SilentlyContinue"

REM remove Gemma 4
powershell -NoProfile -Command "Remove-Item -LiteralPath ([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Gemma4.lnk') -Force -ErrorAction SilentlyContinue"

REM remove Gemma 4 e4b
powershell -NoProfile -Command "Remove-Item -LiteralPath ([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Gemma4 e4b.lnk') -Force -ErrorAction SilentlyContinue"

REM remove Gemma4e4b
powershell -NoProfile -Command "Remove-Item -LiteralPath ([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Gemma4e4b.lnk') -Force -ErrorAction SilentlyContinue"

REM remove gemma4
powershell -NoProfile -Command "Remove-Item -LiteralPath ([Environment]::GetFolderPath('CommonPrograms')+'\Ollama gemma4.lnk') -Force -ErrorAction SilentlyContinue"

REM remove Gemma4e4b
powershell -NoProfile -Command "Remove-Item -LiteralPath ([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Qwen3.8-27B.lnk') -Force -ErrorAction SilentlyContinue"

REM gemma4-12b:latest
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut([Environment]::GetFolderPath('CommonPrograms')+'\Ollama gemma4.lnk'); $l.TargetPath=$env:ComSpec; $l.Arguments='/k ollama run gemma4-12b:latest'; $l.Save()"

REM qwen38-27b:latest
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Qwen3.8-27B.lnk'); $l.TargetPath=$env:ComSpec; $l.Arguments='/k ollama run qwen38-27b:latest'; $l.Save()"

REM Ollamaのパスを現在のセッションに反映
set "PATH=C:\Ollama;%PATH%"

REM Ollamaの実行ファイルを確認
where ollama
if not "%ERRORLEVEL%"=="0" echo [エラー] Ollamaのパスが見つかりません。再起動後に再実行してください。

REM Ollamaが起動していなければ起動
set "OLLAMA_RUNNING=1"
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul
if not "%ERRORLEVEL%"=="0" set "OLLAMA_RUNNING=0"
if "%OLLAMA_RUNNING%"=="0" start "" "C:\Ollama\ollama.exe" serve
if "%OLLAMA_RUNNING%"=="0" timeout /t 10 /nobreak


REM ============================================================
REM モデル削除
ollama stop qwen3.6:27b
ollama rm qwen3.6:27b
ollama stop gemma4:26b
ollama rm gemma4:26b
ollama stop qwen3.6:35b-a3b
ollama rm qwen3.6:35b-a3b
ollama stop yuma/DeepSeek-R1-Distill-Qwen-Japanese:14b
ollama rm yuma/DeepSeek-R1-Distill-Qwen-Japanese:14b
ollama stop qwen3-coder:30b
ollama rm qwen3-coder:30b
ollama stop glm-4.7-flash
ollama rm glm-4.7-flash
REM ============================================================
REM llama3.2-vision:11b 削除
ollama stop llama3.2-vision:11b
ollama rm llama3.2-vision:11b
REM ============================================================
ollama list

ollama pull bge-m3
ollama pull nomic-embed-text

REM =================================
REM モデルファイルの作成と登録
mkdir C:\ollama\modelfiles
cd /d C:\ollama\modelfiles

(echo FROM gemma4:12b-it-qat)>Modelfile.gemma4-12b
(echo PARAMETER num_ctx 65536)>>Modelfile.gemma4-12b

(echo FROM logicbeat/qwen3.8-27B_GSQ_RCO)>Modelfile.qwen38-27b
(echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b
(echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b

(echo FROM logicbeat/qwen3.8-27B_GSQ_RCO)>Modelfile.qwen38-27b-code
(echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b-code
(echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b-code
(echo PARAMETER num_predict 40000)>>Modelfile.qwen38-27b-code
(echo PARAMETER repeat_penalty 1.02)>>Modelfile.qwen38-27b-code

(echo FROM qwen3-vl:8b)>Modelfile.qwen3vl-8b
(echo PARAMETER num_ctx 65536)>>Modelfile.qwen3vl-8b

(echo FROM kahnwong/nanonets-ocr2:3b)>Modelfile.nanonets-ocr2-3b
(echo PARAMETER num_ctx 65536)>>Modelfile.nanonets-ocr2-3b

dir Modelfile.*

ollama stop gemma4-12b
ollama rm gemma4-12b
ollama create gemma4-12b -f Modelfile.gemma4-12b
ollama stop qwen38-27b
ollama rm qwen38-27b
ollama create qwen38-27b -f Modelfile.qwen38-27b
ollama stop qwen38-27b-code
ollama rm qwen38-27b-code
ollama create qwen38-27b-code -f Modelfile.qwen38-27b-code
ollama stop qwen3vl-8b
ollama rm qwen3vl-8b
ollama create qwen3vl-8b -f Modelfile.qwen3vl-8b
ollama stop nanonets-ocr2-3b
ollama rm nanonets-ocr2-3b
ollama create nanonets-ocr2-3b -f Modelfile.nanonets-ocr2-3b

ollama list

echo %OLLAMA_KV_CACHE_TYPE% %OLLAMA_FLASH_ATTENTION% %OLLAMA_NUM_PARALLEL% %OLLAMA_MAX_LOADED_MODELS%

REM ============================================================
REM パラメータ確認
ollama show gemma4-12b --parameters
ollama show qwen38-27b --parameters
ollama show qwen38-27b-code --parameters
ollama show qwen3vl-8b --parameters
ollama show nanonets-ocr2-3b --parameters

REM ============================================================
REM OpenWEB UI
REM ============================================================
pip install -U --no-user open-webui

REM ============================================================
REM ollama-chat
REM ============================================================
pip install -U --no-user ollama-chat

REM ============================================================
REM Moonshine Vioce
REM ============================================================
pip install -U --no-user moonshine-voice
python -m moonshine_voice.download --stt --language ja
python -m moonshine_voice.download --stt --language en

REM ============================================================
REM YuE2
REM ============================================================
set "ROOT=C:\ProgramData\YuE2"
mkdir "%ROOT%"
setx YUE2_KIT "C:\ProgramData\YuE2" /M
setx HF_HOME "C:\ProgramData\YuE2\hf" /M
set "YUE2_KIT=C:\ProgramData\YuE2"
set "HF_HOME=C:\ProgramData\YuE2\hf"
cd /d %TEMP%
git clone https://github.com/multimodal-art-projection/YuE.git "%ROOT%\repo"
pip install -U --no-user "%ROOT%\repo"
mkdir "%ROOT%\models"
hf download m-a-p/YuE2-3B --local-dir "%ROOT%\models\YuE2-3B"
hf download m-a-p/YuE2-Vae --local-dir "%ROOT%\models\YuE2-Vae"
python -c "import torch;print(torch.__version__, torch.version.cuda, torch.cuda.is_available(), torch.cuda.is_bf16_supported())"
cd /d %TEMP%
chcp 65001
>lyrics.txt echo [Verse]
>>lyrics.txt echo 夜風がビルの間を抜けて
>>lyrics.txt echo まだ帰らない街の灯り
>>lyrics.txt echo [Chorus]
>>lyrics.txt echo この歌が届くまで
>>lyrics.txt echo もう少しだけ歩いていく
rmdir /s /q result_yue2
yue2.exe generate --offline --id my_song --style "Japanese city pop, warm electric piano, female vocal, 95 BPM" --lyrics-file lyrics.txt --backend torch-eager --output result_yue2

REM ============================================================
REM ============================================================
REM Hugging Face関連
REM ============================================================
pip install -U --no-user transformers datasets sentence-transformers accelerate diffusers timm einops huggingface_hub hf_xet
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Hugging Face関連ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM LLMアプリケーション開発
REM ============================================================
pip install -U --no-user langchain langchain-community langchain-ollama langchain-huggingface langchain-openai langchain-google-genai langchain-anthropic langgraph chromadb
if not "%ERRORLEVEL%"=="0" ( color 0c & echo LLMアプリケーション開発ライブラリのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
set "PI_ROOT=C:\pi"
set "PI_AGENT_DIR=C:\pi\pi-agent"
set "PI_BIN_DIR=C:\pi\pi-agent\bin"
set "PI_SKILLS_DIR=C:\pi\pi-agent\skills"
set "PI_PROVIDER_ID=ollama"
set "PI_MODEL_ID=qwen38-27b-code:latest"
set "OLLAMA_BASE=http://localhost:11434"

REM ===== Node.js のインストール(インストール済みならスキップ) =====
set "NODE_FOUND=0"

REM 方式1: PATHが通っていれば where で検出
where node >nul 2>nul
if "%ERRORLEVEL%"=="0" set "NODE_FOUND=1"

REM 方式2: 公式インストーラ/winget の既定配置場所
if exist "C:\Program Files\nodejs\node.exe" set "NODE_FOUND=1"
if exist "C:\Program Files (x86)\nodejs\node.exe" set "NODE_FOUND=1"

if "%NODE_FOUND%"=="1" echo Node.js は既にインストール済みのため、インストールをスキップしました

REM winget経由での導入if not exist "C:\Program Files\nodejs\node.exe" (
    if not exist "C:\Program Files (x86)\nodejs\node.exe" (
        winget install --scope machine --id OpenJS.NodeJS.LTS -e --silent --source winget --disable-interactivity --force --accept-source-agreements --accept-package-agreements
    )
)

if not exist "C:\Program Files\nodejs\node.exe" (
    if not exist "C:\Program Files (x86)\nodejs\node.exe" (
        color 0c & echo Node.js のインストールに失敗した可能性があります & ping 127.0.0.1 -n 6 >nul & color
    )
)

REM Node.js のパス設定(末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\Program Files\nodejs'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM 現在のコマンドプロンプトセッションにも即時反映(このウィンドウ内で続けて npm install を行うため)
set "PATH=%PATH%;C:\Program Files\nodejs"

REM ===== 共有ディレクトリの作成 =====
if not exist "%PI_ROOT%" mkdir "%PI_ROOT%"
if not exist "%PI_AGENT_DIR%" mkdir "%PI_AGENT_DIR%"
if not exist "%PI_BIN_DIR%" mkdir "%PI_BIN_DIR%"
if not exist "%PI_SKILLS_DIR%" mkdir "%PI_SKILLS_DIR%"

REM ===== Pi のインストール(C:\pi に配置。npm の既定グローバル領域は変更しない) =====
if exist "%PI_ROOT%\pi.cmd" echo Pi は既にインストール済みのため、インストールをスキップしました
if not exist "%PI_ROOT%\pi.cmd" npm install -g --ignore-scripts --prefix "%PI_ROOT%" @earendil-works/pi-coding-agent

REM 成功判定はERRORLEVELではなく、実際にファイルが作成されたかで行う(npm noticeの出力等でERRORLEVELが不安定なため)
if not exist "%PI_ROOT%\pi.cmd" ( color 0c & echo Pi のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Pi のパス設定(C:\pi を末尾に追加,レジストリ値の型を保持)
powershell -NoProfile -Command "$p='C:\pi'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
set "PATH=%PATH%;%PI_ROOT%"

REM ===== アクセス権(実行は全ユーザ,設定/セッションは書き込み可) =====
icacls "%PI_ROOT%" /grant "Users:(OI)(CI)RX" /T >nul
icacls "%PI_AGENT_DIR%" /grant "Users:(OI)(CI)M" /T >nul

>"%PI_AGENT_DIR%\models.json" echo {
>>"%PI_AGENT_DIR%\models.json" echo   "providers": {
>>"%PI_AGENT_DIR%\models.json" echo     "%PI_PROVIDER_ID%": {
>>"%PI_AGENT_DIR%\models.json" echo       "baseUrl": "%OLLAMA_BASE%/v1",
>>"%PI_AGENT_DIR%\models.json" echo       "api": "openai-completions",
>>"%PI_AGENT_DIR%\models.json" echo       "apiKey": "ollama",
>>"%PI_AGENT_DIR%\models.json" echo       "models": [{
>>"%PI_AGENT_DIR%\models.json" echo         "id": "%PI_MODEL_ID%",
>>"%PI_AGENT_DIR%\models.json" echo         "name": "Local Coder",
>>"%PI_AGENT_DIR%\models.json" echo         "reasoning": true,
>>"%PI_AGENT_DIR%\models.json" echo         "input": ["text"],
>>"%PI_AGENT_DIR%\models.json" echo         "contextWindow": 128000,
>>"%PI_AGENT_DIR%\models.json" echo         "maxTokens": 40000,
>>"%PI_AGENT_DIR%\models.json" echo         "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
>>"%PI_AGENT_DIR%\models.json" echo         "compat": { "supportsDeveloperRole": false, "supportsReasoningEffort": true }
>>"%PI_AGENT_DIR%\models.json" echo       }]
>>"%PI_AGENT_DIR%\models.json" echo     }
>>"%PI_AGENT_DIR%\models.json" echo   }
>>"%PI_AGENT_DIR%\models.json" echo }

REM ===== settings.json(起動ヘッダを抑止) =====
>"%PI_AGENT_DIR%\settings.json" echo {
>>"%PI_AGENT_DIR%\settings.json" echo   "defaultProvider": "%PI_PROVIDER_ID%",
>>"%PI_AGENT_DIR%\settings.json" echo   "defaultModel": "%PI_MODEL_ID%",
>>"%PI_AGENT_DIR%\settings.json" echo   "quietStartup": true
>>"%PI_AGENT_DIR%\settings.json" echo }

REM ===== 設定ディレクトリを全ユーザで共有 =====
powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $k.SetValue('PI_CODING_AGENT_DIR','C:\pi\pi-agent',[Microsoft.Win32.RegistryValueKind]::String); $k.Close()"
set "PI_CODING_AGENT_DIR=%PI_AGENT_DIR%"

REM ===== スキルの集約と名称正規化(~\.agents\skills の重複・不正名を解消) =====
powershell -NoProfile -Command "$src=Join-Path $env:USERPROFILE '.agents\skills'; $dst='C:\pi\pi-agent\skills'; if(Test-Path $src){ Get-ChildItem $src -Directory | ForEach-Object { $n=((($_.Name -replace '[^A-Za-z0-9-]','-') -replace '-+','-').ToLower()).Trim('-'); $t=Join-Path $dst $n; if(-not (Test-Path $t)){ Copy-Item $_.FullName $t -Recurse -Force }; $s=Join-Path $t 'SKILL.md'; if(Test-Path $s){ $L=Get-Content $s; for($i=0;$i -lt [Math]::Min(20,$L.Count);$i++){ if($L[$i] -match '^name:'){ $L[$i]='name: '+$n; break } }; Set-Content $s $L -Encoding UTF8 } }; Rename-Item $src ('skills.migrated-'+(Get-Date -Format yyyyMMddHHmmss)) -ErrorAction SilentlyContinue }"

REM ===== ripgrep / fd の事前配置(起動時の自動ダウンロードを回避) =====
powershell -NoProfile -Command "$ErrorActionPreference='Stop'; $bin='C:\pi\pi-agent\bin'; if(-not (Test-Path (Join-Path $bin 'rg.exe'))){ [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $r=Invoke-RestMethod 'https://api.github.com/repos/BurntSushi/ripgrep/releases/latest' -Headers @{'User-Agent'='pi-setup'}; $a=$r.assets | Where-Object { $_.name -like '*x86_64-pc-windows-msvc.zip' } | Select-Object -First 1; $z=Join-Path $env:TEMP $a.name; Invoke-WebRequest $a.browser_download_url -OutFile $z -UseBasicParsing; $d=Join-Path $env:TEMP ('rg_'+[guid]::NewGuid()); Expand-Archive $z $d -Force; Copy-Item (Get-ChildItem $d -Recurse -Filter 'rg.exe' | Select-Object -First 1).FullName $bin -Force; Remove-Item $z,$d -Recurse -Force }"
if not exist "%PI_BIN_DIR%\rg.exe" ( color 0c & echo ripgrep の事前配置に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

powershell -NoProfile -Command "$ErrorActionPreference='Stop'; $bin='C:\pi\pi-agent\bin'; if(-not (Test-Path (Join-Path $bin 'fd.exe'))){ [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; $r=Invoke-RestMethod 'https://api.github.com/repos/sharkdp/fd/releases/latest' -Headers @{'User-Agent'='pi-setup'}; $a=$r.assets | Where-Object { $_.name -like '*x86_64-pc-windows-msvc.zip' } | Select-Object -First 1; $z=Join-Path $env:TEMP $a.name; Invoke-WebRequest $a.browser_download_url -OutFile $z -UseBasicParsing; $d=Join-Path $env:TEMP ('fd_'+[guid]::NewGuid()); Expand-Archive $z $d -Force; Copy-Item (Get-ChildItem $d -Recurse -Filter 'fd.exe' | Select-Object -First 1).FullName $bin -Force; Remove-Item $z,$d -Recurse -Force }"
if not exist "%PI_BIN_DIR%\fd.exe" ( color 0c & echo fd の事前配置に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

icacls "%PI_AGENT_DIR%" /grant "Users:(OI)(CI)M" /T >nul

REM ===== 検証1: 設定ファイルの存在 =====
if exist "%PI_AGENT_DIR%\models.json" (echo [OK] models.json) else (echo [NG] models.json が作成されていません)
if exist "%PI_AGENT_DIR%\settings.json" (echo [OK] settings.json) else (echo [NG] settings.json が作成されていません)

REM ===== 検証2: Ollama 側に該当モデルが存在するか =====
powershell -NoProfile -Command "try{ $t=Invoke-RestMethod 'http://localhost:11434/api/tags' -TimeoutSec 5 }catch{ Write-Host '[NG] Ollama に接続できません (http://localhost:11434)'; exit 1 }; $ids=@($t.models.name); Write-Host ('[INFO] Ollama 上のモデル: '+($ids -join ', ')); if($ids -contains 'qwen38-27b-code:latest'){ Write-Host '[OK] models.json のモデル ID は Ollama 上に存在します' } else { Write-Host '[NG] models.json のモデル ID は Ollama 上に存在しません' }"

REM ===== 検証3: Pi がモデル定義を認識しているか =====
pi --list-models "%PI_MODEL_ID%" 2>nul | findstr /i /c:"%PI_MODEL_ID%" >nul
if "%ERRORLEVEL%"=="0" (echo [OK] Pi がモデル定義を認識しています) else (echo [NG] Pi がモデル定義を認識していません)

REM ===== 検証4: 既定モデルでの応答(settings.json の指定が有効か) =====
pi -p "Reply with OK only."
if "%ERRORLEVEL%"=="0" (echo [OK] 既定モデルでの応答を確認しました) else (echo [NG] 既定モデルでの応答に失敗しました)

REM ===== 検証5: モデルを明示指定した応答 =====
pi -p --model %PI_PROVIDER_ID%/%PI_MODEL_ID% "Reply with OK only."
if "%ERRORLEVEL%"=="0" (echo [OK] 明示指定モデルでの応答を確認しました) else (echo [NG] 明示指定モデルでの応答に失敗しました)

REM ============================================================
REM Super Agent Party  のインストール
REM ============================================================

rem === 1) 展開先を作成し、zip を取得する =========================
mkdir C:\SAP
curl -L -o C:\SAP\sap.zip https://github.com/heshengtao/super-agent-party/releases/download/v0.4.3/super-agent-party-win-v0.4.3.zip

rem === 2) 展開する(Windows 10 1803 以降の tar は zip に対応)=====
tar -xf C:\SAP\sap.zip -C C:\SAP
del C:\SAP\sap.zip

rem === 3) start_shared.bat を配置する ============================
rem 添付ファイルを C:\SAP\super-agent-party-win-v0.4.3\ に置く

rem === 4) 全ユーザに変更権限を付与する==
icacls "C:\SAP" /grant "Users:(OI)(CI)M" /T

rem === 5) 全ユーザのデスクトップにショートカットを作成する ========
powershell -NoProfile -Command "$s=(New-Object -ComObject WScript.Shell).CreateShortcut('C:\Users\Public\Desktop\Super Agent Party.lnk'); $s.TargetPath='C:\SAP\super-agent-party-win-v0.4.3\start_shared.bat'; $s.WorkingDirectory='C:\SAP\super-agent-party-win-v0.4.3'; $s.IconLocation='C:\SAP\super-agent-party-win-v0.4.3\static\source\icon.ico'; $s.Save()"

REM ============================================================
REM VOICEVOX
REM ============================================================

REM VOICEVOX 既存インストールのアンインストール(3箇所を確認)

REM 1. C:\VOICEVOX
if exist "C:\VOICEVOX\Uninstall VOICEVOX.exe" (
    start /wait "" "C:\VOICEVOX\Uninstall VOICEVOX.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX(C:\VOICEVOX)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\VOICEVOX" rmdir /s /q "C:\VOICEVOX"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\VOICEVOX フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 2. C:\Program Files\VOICEVOX
if exist "C:\Program Files\VOICEVOX\Uninstall VOICEVOX.exe" (
    start /wait "" "C:\Program Files\VOICEVOX\Uninstall VOICEVOX.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX(C:\Program Files\VOICEVOX)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\Program Files\VOICEVOX" rmdir /s /q "C:\Program Files\VOICEVOX"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\Program Files\VOICEVOX フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 3. %LOCALAPPDATA%\Programs\VOICEVOX(per-user)
if exist "%LOCALAPPDATA%\Programs\VOICEVOX\Uninstall VOICEVOX.exe" (
    start /wait "" "%LOCALAPPDATA%\Programs\VOICEVOX\Uninstall VOICEVOX.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX(%LOCALAPPDATA%\Programs\VOICEVOX)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "%LOCALAPPDATA%\Programs\VOICEVOX" rmdir /s /q "%LOCALAPPDATA%\Programs\VOICEVOX"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo %LOCALAPPDATA%\Programs\VOICEVOX フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM VOICEVOX 0.25.2(GPU/CUDA版)Web Setupインストーラをダウンロードし対話型インストールを実行
curl -L -o "%TEMP%\VOICEVOX-CUDA.Web.Setup.0.25.2.exe" https://github.com/VOICEVOX/voicevox/releases/download/0.25.2/VOICEVOX-CUDA.Web.Setup.0.25.2.exe
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX インストーラのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

start /wait "" "%TEMP%\VOICEVOX-CUDA.Web.Setup.0.25.2.exe" /D=C:\VOICEVOX
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM インストーラの一時ファイルを削除
del "%TEMP%\VOICEVOX-CUDA.Web.Setup.0.25.2.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストーラの一時ファイルの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 機能チェック:VOICEVOXエンジンを起動しAPIでバージョン情報を取得
echo VOICEVOX エンジンを起動中...
start "" "C:\VOICEVOX\vv-engine\run.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX エンジンの起動に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM エンジンの起動完了をポーリングで待機(最大5分、10秒間隔)
powershell -NoProfile -Command "for($i=0;$i -lt 30;$i++){Start-Sleep -Seconds 10;try{$r=Invoke-WebRequest -Uri 'http://127.0.0.1:50021/version' -UseBasicParsing -ErrorAction Stop;if($r.StatusCode -eq 200){Write-Host 'エンジンの起動を確認しました';exit 0}}catch{};Write-Host ('待機中... '+($i+1)*10+'秒経過')};Write-Host 'エンジンの起動がタイムアウトしました(5分経過)';exit 1"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VOICEVOX エンジンの起動確認がタイムアウトしました & ping 127.0.0.1 -n 6 >nul & color )

echo エンジンのバージョン情報を取得中...
curl -sS http://127.0.0.1:50021/version
if not "%ERRORLEVEL%"=="0" ( color 0c & echo エンジンのバージョン情報の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

echo 話者一覧を取得中...
curl -sS http://127.0.0.1:50021/speakers > "%TEMP%\voicevox_speakers.json"
if exist "%TEMP%\voicevox_speakers.json" echo 話者一覧を %TEMP%\voicevox_speakers.json に保存しました
REM 音声合成テスト:日本語テキストから音声を生成し再生する
echo 音声合成テストを実行中...
chcp 65001 >nul
echo ボイスボックスのインストールが完了しました>"%TEMP%\voicevox_test.txt"
curl -sS -X POST "http://127.0.0.1:50021/audio_query?speaker=1" --get --data-urlencode text@"%TEMP%\voicevox_test.txt" -o "%TEMP%\voicevox_query.json"
curl -sS -H "Content-Type: application/json" -X POST -d @"%TEMP%\voicevox_query.json" "http://127.0.0.1:50021/synthesis?speaker=1" -o "%TEMP%\voicevox_test.wav"
echo 合成した音声を再生中...
powershell -c "(New-Object Media.SoundPlayer '%TEMP%\voicevox_test.wav').PlaySync()"
REM 機能チェック用の一時ファイルを削除
del "%TEMP%\voicevox_test.txt" "%TEMP%\voicevox_query.json" "%TEMP%\voicevox_test.wav" "%TEMP%\voicevox_speakers.json" >nul
REM エンジンを停止
taskkill /im run.exe /f >nul
echo 機能チェックが完了しました

REM ============================================================
REM AivisSpeech
REM ============================================================

REM AivisSpeech 既存インストールのアンインストール(3箇所を確認)

REM 1. C:\AivisSpeech
if exist "C:\AivisSpeech\Uninstall AivisSpeech.exe" (
    start /wait "" "C:\AivisSpeech\Uninstall AivisSpeech.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech(C:\AivisSpeech)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\AivisSpeech" rmdir /s /q "C:\AivisSpeech"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\AivisSpeech フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 2. C:\Program Files\AivisSpeech
if exist "C:\Program Files\AivisSpeech\Uninstall AivisSpeech.exe" (
    start /wait "" "C:\Program Files\AivisSpeech\Uninstall AivisSpeech.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech(C:\Program Files\AivisSpeech)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "C:\Program Files\AivisSpeech" rmdir /s /q "C:\Program Files\AivisSpeech"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo C:\Program Files\AivisSpeech フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 3. %LOCALAPPDATA%\Programs\AivisSpeech(per-user)
if exist "%LOCALAPPDATA%\Programs\AivisSpeech\Uninstall AivisSpeech.exe" (
    start /wait "" "%LOCALAPPDATA%\Programs\AivisSpeech\Uninstall AivisSpeech.exe" /S
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech(%LOCALAPPDATA%\Programs\AivisSpeech)のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
    ping 127.0.0.1 -n 6 >nul >nul
)
if exist "%LOCALAPPDATA%\Programs\AivisSpeech" rmdir /s /q "%LOCALAPPDATA%\Programs\AivisSpeech"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo %LOCALAPPDATA%\Programs\AivisSpeech フォルダの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM AivisSpeech 1.1.0-dev Web Setupインストーラをダウンロードし対話型インストールを実行
curl -L -o "%TEMP%\AivisSpeech-Windows-x64-1.1.0-dev.exe" https://github.com/Aivis-Project/AivisSpeech/releases/download/1.1.0-dev/AivisSpeech-Windows-x64-1.1.0-dev.exe
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech インストーラのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

start /wait "" "%TEMP%\AivisSpeech-Windows-x64-1.1.0-dev.exe" /D=C:\AivisSpeech
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM インストーラの一時ファイルを削除
del "%TEMP%\AivisSpeech-Windows-x64-1.1.0-dev.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストーラの一時ファイルの削除に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 機能チェック:AivisSpeech Engineを起動(初回はモデル自動ダウンロードのため数分かかる)
echo AivisSpeech Engine を起動中(初回はモデルDLのため数分かかります)...
start "" "C:\AivisSpeech\AivisSpeech-Engine\run.exe"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech Engine の起動に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM エンジンの起動完了をポーリングで待機(最大5分、10秒間隔)
powershell -NoProfile -Command "for($i=0;$i -lt 30;$i++){Start-Sleep -Seconds 10;try{$r=Invoke-WebRequest -Uri 'http://127.0.0.1:10101/version' -UseBasicParsing -ErrorAction Stop;if($r.StatusCode -eq 200){Write-Host 'エンジンの起動を確認しました';exit 0}}catch{};Write-Host ('待機中... '+($i+1)*10+'秒経過')};Write-Host 'エンジンの起動がタイムアウトしました(5分経過)';exit 1"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo AivisSpeech Engine の起動確認がタイムアウトしました & ping 127.0.0.1 -n 6 >nul & color )

echo エンジンのバージョン情報を取得中...
curl -sS http://127.0.0.1:10101/version
if not "%ERRORLEVEL%"=="0" ( color 0c & echo エンジンのバージョン情報の取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

echo 話者一覧を取得中...
curl -sS http://127.0.0.1:10101/speakers > "%TEMP%\aivisspeech_speakers.json"
if exist "%TEMP%\aivisspeech_speakers.json" echo 話者一覧を %TEMP%\aivisspeech_speakers.json に保存しました
REM 音声合成テスト:話者IDを動的に取得し日本語テキストから音声を生成し再生する
echo 音声合成テストを実行中...
chcp 65001 >nul
powershell -NoProfile -Command "$j=ConvertFrom-Json([System.IO.File]::ReadAllText('%TEMP%\aivisspeech_speakers.json',[System.Text.Encoding]::UTF8)); $j[0].styles[0].id" > "%TEMP%\aivisspeech_styleid.txt"
set /p STYLE_ID=<"%TEMP%\aivisspeech_styleid.txt"
echo 使用する話者スタイルID: %STYLE_ID%
echo アイビススピーチのインストールが完了しました>"%TEMP%\aivisspeech_test.txt"
curl -sS -X POST "http://127.0.0.1:10101/audio_query?speaker=%STYLE_ID%" --get --data-urlencode text@"%TEMP%\aivisspeech_test.txt" -o "%TEMP%\aivisspeech_query.json"
curl -sS -H "Content-Type: application/json" -X POST -d @"%TEMP%\aivisspeech_query.json" "http://127.0.0.1:10101/synthesis?speaker=%STYLE_ID%" -o "%TEMP%\aivisspeech_test.wav"
echo 合成した音声を再生中...
powershell -c "(New-Object Media.SoundPlayer '%TEMP%\aivisspeech_test.wav').PlaySync()"
REM 機能チェック用の一時ファイルを削除
del "%TEMP%\aivisspeech_test.txt" "%TEMP%\aivisspeech_query.json" "%TEMP%\aivisspeech_test.wav" "%TEMP%\aivisspeech_speakers.json" "%TEMP%\aivisspeech_styleid.txt" >nul
REM エンジンを停止
taskkill /im run.exe /f >nul
echo 機能チェックが完了しました


REM ============================================================
REM ComfyUI 依存パッケージの更新
REM ============================================================
cd /d C:\ComfyUI
pip install -U --no-user -r requirements.txt

REM ============================================================
REM 画像生成JSON差し替え
REM ============================================================

REM === 4. [2] FLUX.2 Klein ワークフロー JSON 生成 ===
python -c "import json; w={'10':{'inputs':{'unet_name':'flux-2-klein-4b.safetensors','weight_dtype':'default'},'class_type':'UNETLoader'},'20':{'inputs':{'clip_name':'qwen_3_4b.safetensors','type':'flux2','device':'default'},'class_type':'CLIPLoader'},'30':{'inputs':{'vae_name':'flux2-vae.safetensors'},'class_type':'VAELoader'},'40':{'inputs':{'text':'a serene mountain landscape at sunset','clip':['20',0]},'class_type':'CLIPTextEncode'},'45':{'inputs':{'conditioning':['40',0],'guidance':1.0},'class_type':'FluxGuidance'},'50':{'inputs':{'width':1024,'height':1024,'batch_size':1},'class_type':'EmptyFlux2LatentImage'},'60':{'inputs':{'steps':4,'width':1024,'height':1024},'class_type':'Flux2Scheduler'},'70':{'inputs':{'sampler_name':'euler'},'class_type':'KSamplerSelect'},'80':{'inputs':{'noise_seed':42},'class_type':'RandomNoise'},'90':{'inputs':{'model':['10',0],'conditioning':['45',0]},'class_type':'BasicGuider'},'100':{'inputs':{'noise':['80',0],'guider':['90',0],'sampler':['70',0],'sigmas':['60',0],'latent_image':['50',0]},'class_type':'SamplerCustomAdvanced'},'110':{'inputs':{'samples':['100',0],'vae':['30',0]},'class_type':'VAEDecode'},'120':{'inputs':{'filename_prefix':'Flux2Klein','images':['110',0]},'class_type':'SaveImage'}}; json.dump(w,open(r'C:\ComfyUI\workflow_api_flux2_klein.json','w'),indent=2)"

REM === [1] Z-Image Turbo text-to-image ワークフロー JSON 生成 ===
REM   ComfyUI公式テンプレート image_z_image_turbo.json と同一構成に、
REM   DeJPEG LoRA (ノード40) を UNETLoader と ModelSamplingAuraFlow の間へ挿入。
REM   事前準備: dejpeg_v3.safetensors を ComfyUI\models\loras\ に配置。
python -c "import json; w={'28':{'inputs':{'unet_name':'z_image_turbo_bf16.safetensors','weight_dtype':'default'},'class_type':'UNETLoader'},'30':{'inputs':{'clip_name':'qwen_3_4b.safetensors','type':'lumina2','device':'default'},'class_type':'CLIPLoader'},'29':{'inputs':{'vae_name':'ae.safetensors'},'class_type':'VAELoader'},'40':{'inputs':{'lora_name':'dejpeg_v3.safetensors','strength_model':1.0,'model':['28',0]},'class_type':'LoraLoaderModelOnly'},'11':{'inputs':{'shift':3.0,'model':['40',0]},'class_type':'ModelSamplingAuraFlow'},'13':{'inputs':{'width':1024,'height':1024,'batch_size':1},'class_type':'EmptySD3LatentImage'},'27':{'inputs':{'text':'a serene mountain landscape at sunset','clip':['30',0]},'class_type':'CLIPTextEncode'},'33':{'inputs':{'conditioning':['27',0]},'class_type':'ConditioningZeroOut'},'3':{'inputs':{'seed':0,'steps':8,'cfg':1.0,'sampler_name':'res_multistep','scheduler':'simple','denoise':1.0,'model':['11',0],'positive':['27',0],'negative':['33',0],'latent_image':['13',0]},'class_type':'KSampler'},'8':{'inputs':{'samples':['3',0],'vae':['29',0]},'class_type':'VAEDecode'},'9':{'inputs':{'filename_prefix':'ZImageTurbo','images':['8',0]},'class_type':'SaveImage'}}; json.dump(w,open(r'C:\ComfyUI\workflow_api_zimage.json','w'),indent=2)"

REM === [2] Qwen-Image-Edit-2511 ワークフロー JSON 生成 ===
REM 本ワークフローは ComfyUI公式テンプレート image_qwen_image_edit_2511.json を
REM API形式へ変換したもの(サブグラフ展開済み)。
REM 【注意】
REM   - FluxKontextImageScale(5) が Kontext推奨解像度にスナップするため、
REM     出力サイズは入力と一致しない(アスペクト比は最も近いものが選ばれる)。
REM   - ModelSamplingAuraFlow の shift は 3.1。
REM   - FluxKontextMultiReferenceLatentMethod は positive/negative の両方に必要。
REM   - 高速化する場合: models\loras\ に Lightning LoRA を置き、
REM     ノード7と13の間に LoraLoaderModelOnly を挟んだうえで steps=4, cfg=1.0 にする。
python -c "import json; P='Make every person in the image look about ten years younger, with smoother skin, fewer wrinkles and a firmer jawline. Keep their identity, facial structure, hairstyle, beard, glasses, clothing, pose, framing, background and lighting exactly the same.'; w={'1':{'inputs':{'unet_name':'qwen_image_edit_2511_fp8mixed.safetensors','weight_dtype':'default'},'class_type':'UNETLoader'},'2':{'inputs':{'clip_name':'qwen_2.5_vl_7b_fp8_scaled.safetensors','type':'qwen_image','device':'default'},'class_type':'CLIPLoader'},'3':{'inputs':{'vae_name':'qwen_image_vae.safetensors'},'class_type':'VAELoader'},'4':{'inputs':{'image':'input.png'},'class_type':'LoadImage'},'5':{'inputs':{'image':['4',0]},'class_type':'FluxKontextImageScale'},'6':{'inputs':{'shift':3.1,'model':['1',0]},'class_type':'ModelSamplingAuraFlow'},'7':{'inputs':{'strength':1.0,'pre_cfg':False,'model':['6',0]},'class_type':'CFGNorm'},'8':{'inputs':{'prompt':P,'clip':['2',0],'vae':['3',0],'image1':['5',0]},'class_type':'TextEncodeQwenImageEditPlus'},'9':{'inputs':{'prompt':'','clip':['2',0],'vae':['3',0],'image1':['5',0]},'class_type':'TextEncodeQwenImageEditPlus'},'10':{'inputs':{'reference_latents_method':'index_timestep_zero','conditioning':['8',0]},'class_type':'FluxKontextMultiReferenceLatentMethod'},'11':{'inputs':{'reference_latents_method':'index_timestep_zero','conditioning':['9',0]},'class_type':'FluxKontextMultiReferenceLatentMethod'},'12':{'inputs':{'pixels':['5',0],'vae':['3',0]},'class_type':'VAEEncode'},'13':{'inputs':{'seed':0,'steps':40,'cfg':4.0,'sampler_name':'euler','scheduler':'simple','denoise':1.0,'model':['7',0],'positive':['10',0],'negative':['11',0],'latent_image':['12',0]},'class_type':'KSampler'},'14':{'inputs':{'samples':['13',0],'vae':['3',0]},'class_type':'VAEDecode'},'15':{'inputs':{'filename_prefix':'QwenEdit2511','images':['14',0]},'class_type':'SaveImage'}}; json.dump(w,open(r'C:\ComfyUI\workflow_api_qwen_edit_2511.json','w'),indent=2)"

if exist "C:\ComfyUI\workflow_api_qwen_edit_2511.json"      (echo [OK] workflow_api_qwen_edit_2511.json)      else (echo [NG] workflow_api_qwen_edit_2511.json)

REM === [4] Wan2.2 TI2V-5B T2V ワークフロー JSON 生成 ===
python -c "import json; POS='a detective in a trench coat walking down a neon-lit alley in Tokyo at night, heavy rain, reflections on wet asphalt, cinematic lighting, shallow depth of field, slow camera dolly forward, highly detailed'; NEG='\u8272\u8c03\u8273\u4e3d\uff0c\u8fc7\u66dd\uff0c\u9759\u6001\uff0c\u7ec6\u8282\u6a21\u7cca\u4e0d\u6e05\uff0c\u5b57\u5e55\uff0c\u98ce\u683c\uff0c\u4f5c\u54c1\uff0c\u753b\u4f5c\uff0c\u753b\u9762\uff0c\u9759\u6b62\uff0c\u6574\u4f53\u53d1\u7070\uff0c\u6700\u5dee\u8d28\u91cf\uff0c\u4f4e\u8d28\u91cf\uff0cJPEG\u538b\u7f29\u6b8b\u7559\uff0c\u4e11\u964b\u7684\uff0c\u6b8b\u7f3a\u7684\uff0c\u591a\u4f59\u7684\u624b\u6307\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u624b\u90e8\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u8138\u90e8\uff0c\u7578\u5f62\u7684\uff0c\u6bc1\u5bb9\u7684\uff0c\u5f62\u6001\u7578\u5f62\u7684\u80a2\u4f53\uff0c\u624b\u6307\u878d\u5408\uff0c\u9759\u6b62\u4e0d\u52a8\u7684\u753b\u9762\uff0c\u6742\u4e71\u7684\u80cc\u666f\uff0c\u4e09\u6761\u817f\uff0c\u80cc\u666f\u4eba\u5f88\u591a\uff0c\u5012\u7740\u8d70'; w={'1':{'class_type':'UNETLoader','inputs':{'unet_name':'wan2.2_ti2v_5B_fp16.safetensors','weight_dtype':'fp8_e4m3fn_fast'}},'2':{'class_type':'CLIPLoader','inputs':{'clip_name':'umt5_xxl_fp8_e4m3fn_scaled.safetensors','type':'wan','device':'default'}},'3':{'class_type':'VAELoader','inputs':{'vae_name':'wan2.2_vae.safetensors'}},'4':{'class_type':'ModelSamplingSD3','inputs':{'shift':8.0,'model':['1',0]}},'5':{'class_type':'Wan22ImageToVideoLatent','inputs':{'width':1280,'height':704,'length':121,'batch_size':1,'vae':['3',0]}},'6':{'class_type':'CLIPTextEncode','inputs':{'text':POS,'clip':['2',0]}},'7':{'class_type':'CLIPTextEncode','inputs':{'text':NEG,'clip':['2',0]}},'8':{'class_type':'KSampler','inputs':{'seed':42,'steps':20,'cfg':5.0,'sampler_name':'uni_pc','scheduler':'simple','denoise':1.0,'model':['4',0],'positive':['6',0],'negative':['7',0],'latent_image':['5',0]}},'9':{'class_type':'VAEDecode','inputs':{'samples':['8',0],'vae':['3',0]}},'10':{'class_type':'CreateVideo','inputs':{'images':['9',0],'fps':24.0}},'11':{'class_type':'SaveVideo','inputs':{'video':['10',0],'filename_prefix':'WanT2V','format':'auto','codec':'auto'}}}; f=open(r'C:\ComfyUI\workflow_api_wan_t2v.json','w',encoding='utf-8'); json.dump(w,f,indent=2,ensure_ascii=False); f.close()"

REM === [5] Wan2.2 TI2V-5B I2V ワークフロー JSON 生成 ===
python -c "import json; IMG='input.png'; W=1280; H=704; POS='the man slowly turns his head toward the camera, gentle wind moves his hair, subtle facial expression, cinematic lighting, smooth natural motion'; NEG='\u8272\u8c03\u8273\u4e3d\uff0c\u8fc7\u66dd\uff0c\u9759\u6001\uff0c\u7ec6\u8282\u6a21\u7cca\u4e0d\u6e05\uff0c\u5b57\u5e55\uff0c\u98ce\u683c\uff0c\u4f5c\u54c1\uff0c\u753b\u4f5c\uff0c\u753b\u9762\uff0c\u9759\u6b62\uff0c\u6574\u4f53\u53d1\u7070\uff0c\u6700\u5dee\u8d28\u91cf\uff0c\u4f4e\u8d28\u91cf\uff0cJPEG\u538b\u7f29\u6b8b\u7559\uff0c\u4e11\u964b\u7684\uff0c\u6b8b\u7f3a\u7684\uff0c\u591a\u4f59\u7684\u624b\u6307\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u624b\u90e8\uff0c\u753b\u5f97\u4e0d\u597d\u7684\u8138\u90e8\uff0c\u7578\u5f62\u7684\uff0c\u6bc1\u5bb9\u7684\uff0c\u5f62\u6001\u7578\u5f62\u7684\u80a2\u4f53\uff0c\u624b\u6307\u878d\u5408\uff0c\u9759\u6b62\u4e0d\u52a8\u7684\u753b\u9762\uff0c\u6742\u4e71\u7684\u80cc\u666f\uff0c\u4e09\u6761\u817f\uff0c\u80cc\u666f\u4eba\u5f88\u591a\uff0c\u5012\u7740\u8d70'; w={'1':{'class_type':'UNETLoader','inputs':{'unet_name':'wan2.2_ti2v_5B_fp16.safetensors','weight_dtype':'fp8_e4m3fn_fast'}},'2':{'class_type':'CLIPLoader','inputs':{'clip_name':'umt5_xxl_fp8_e4m3fn_scaled.safetensors','type':'wan','device':'default'}},'3':{'class_type':'VAELoader','inputs':{'vae_name':'wan2.2_vae.safetensors'}},'4':{'class_type':'ModelSamplingSD3','inputs':{'shift':8.0,'model':['1',0]}},'5':{'class_type':'Wan22ImageToVideoLatent','inputs':{'width':W,'height':H,'length':121,'batch_size':1,'vae':['3',0],'start_image':['13',0]}},'6':{'class_type':'CLIPTextEncode','inputs':{'text':POS,'clip':['2',0]}},'7':{'class_type':'CLIPTextEncode','inputs':{'text':NEG,'clip':['2',0]}},'8':{'class_type':'KSampler','inputs':{'seed':42,'steps':20,'cfg':5.0,'sampler_name':'uni_pc','scheduler':'simple','denoise':1.0,'model':['4',0],'positive':['6',0],'negative':['7',0],'latent_image':['5',0]}},'9':{'class_type':'VAEDecode','inputs':{'samples':['8',0],'vae':['3',0]}},'10':{'class_type':'CreateVideo','inputs':{'images':['9',0],'fps':24.0}},'11':{'class_type':'SaveVideo','inputs':{'video':['10',0],'filename_prefix':'WanI2V','format':'auto','codec':'auto'}},'12':{'class_type':'LoadImage','inputs':{'image':IMG}},'13':{'class_type':'ImageScale','inputs':{'image':['12',0],'upscale_method':'lanczos','width':W,'height':H,'crop':'center'}}}; f=open(r'C:\ComfyUI\workflow_api_wan_i2v.json','w',encoding='utf-8'); json.dump(w,f,indent=2,ensure_ascii=False); f.close()"

REM ============================================================
REM 画像生成モデル差し替え、追加
REM ============================================================

REM Z-Image にLoRA を追加

REM === 1. モデル格納ディレクトリ作成 ===
if not exist "C:\ComfyUI\models\diffusion_models" mkdir "C:\ComfyUI\models\diffusion_models"
if not exist "C:\ComfyUI\models\text_encoders"    mkdir "C:\ComfyUI\models\text_encoders"
if not exist "C:\ComfyUI\models\vae"              mkdir "C:\ComfyUI\models\vae"
if not exist "C:\ComfyUI\models\loras"            mkdir "C:\ComfyUI\models\loras"

REM === 2-1. Z-Image Turbo 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" (
    echo [DL] z_image_turbo_bf16.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/diffusion_models/z_image_turbo_bf16.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] z_image_turbo_bf16.safetensors のダウンロードに失敗しました
) else (echo [SKIP] z_image_turbo_bf16.safetensors)

REM === 2-2. Z-Image Turbo DeJPEG LoRA(高解像度時のスペックルノイズ対策) ===
if not exist "C:\ComfyUI\models\loras\dejpeg_v3.safetensors" (
    echo [DL] dejpeg_v3.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\loras\dejpeg_v3.safetensors" "https://huggingface.co/wcde/Z-Image-Turbo-DeJPEG-Lora/resolve/main/dejpeg_v3.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] dejpeg_v3.safetensors のダウンロードに失敗しました
) else (echo [SKIP] dejpeg_v3.safetensors)

REM === 3. Qwen-Image-Edit-2511 拡散モデル(FP8 mixed / 20.5GB) ===
if not exist "C:\ComfyUI\models\diffusion_models\qwen_image_edit_2511_fp8mixed.safetensors" (
    echo [DL] qwen_image_edit_2511_fp8mixed.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\qwen_image_edit_2511_fp8mixed.safetensors" "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_2511_fp8mixed.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] qwen_image_edit_2511_fp8mixed.safetensors のダウンロードに失敗しました
) else (echo [SKIP] qwen_image_edit_2511_fp8mixed.safetensors)


REM ============================================================
REM numba の更新
pip install -U --no-user numba

REM ============================================================
REM  sox のインストール
REM ============================================================
if not exist "C:\Program Files (x86)\SoX" mkdir "C:\Program Files (x86)\SoX"
curl -L --fail -o "%TEMP%\SoX.zip" "https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SoX のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
tar -xf "%TEMP%\SoX.zip" -C "C:\Program Files (x86)\SoX" --strip-components=1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SoX の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
del "%TEMP%\SoX.zip"
powershell -NoProfile -Command "$p='C:\Program Files (x86)\SoX'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SoX の PATH 登録に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Tanks and Temples データセットのダウンロード
REM ============================================================
REM ├── tandt_db.zip
REM ├── db/                                # Deep Blending データセット
REM │   ├── drjohnson/                     # 屋内:Dr. Johnson生家・展示室
REM │   │   ├── images/                    # 撮影画像群
REM │   │   └── sparse/
REM │   │       └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM │   └── playroom/                      # 屋内:子供部屋・プレイルーム
REM │       ├── images/                    # 撮影画像群
REM │       └── sparse/
REM │           └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM └── tandt/                             # Tanks and Temples データセット
REM     ├── train/                         # 屋外:蒸気機関車・線路
REM     │   ├── images/                    # 撮影画像群
REM     │   └── sparse/
REM     │       └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM     └── truck/                         # 屋外:ピックアップトラック全周
REM         ├── images/                    # 撮影画像群
REM         └── sparse/
REM             └── 0/                     # COLMAP推定データ (カメラパラメータ・点群)
REM パースペクティブ画像,T&T+DB COLMAPデータセット(約650MB)
rmdir /s /q c:\image\tandt_db
if not exist "C:\image\tandt" mkdir "C:\image\tandt"
if not exist "C:\image\tandt\tandt_db.zip" curl -k -L -o "C:\image\tandt\tandt_db.zip" https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開
powershell -NoProfile -Command "Expand-Archive -Path 'C:\image\tandt\tandt_db.zip' -DestinationPath 'C:\image\tandt' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BrushTest サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Mip-NeRF 360 (garden) データセットのダウンロード
REM ============================================================
REM └── garden/
REM     ├── images/                            # 元解像度撮影画像群
REM     ├── images_2/                          # 1/2 縮小画像群
REM     ├── images_4/                          # 1/4 縮小画像群(VGGT・軽量検証向け)
REM     ├── images_8/                          # 1/8 縮小画像群
REM     └── sparse/
REM         └── 0/                             # COLMAP推定データ (カメラパラメータ・点群)
REM サンプルデータ(Mip-NeRF 360 garden)をダウンロード
set "GARDEN_DIR=C:\image\garden"
set "GARDEN_ZIP=%TEMP%\garden.zip"
set "GARDEN_URL=https://storage.googleapis.com/gresearch/refraw360/garden.zip"

if not exist "%GARDEN_DIR%" mkdir "%GARDEN_DIR%"

curl -k -L -o "%GARDEN_ZIP%" "%GARDEN_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開
powershell -NoProfile -Command "Expand-Archive -Path '%GARDEN_ZIP%' -DestinationPath '%GARDEN_DIR%' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo garden サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

del "%GARDEN_ZIP%"

REM ============================================================
REM ETH3D Benchmark (courtyard) データセットのダウンロード
REM 屋内・屋外マルチビュー・GT点群あり
REM ============================================================
REM ├── courtyard_dslr_undistorted.7z
REM └── courtyard/
REM     └── courtyard/
REM         ├── dslr_calibration_undistorted/  # カメラ内部・外部パラメータ (GT)
REM         └── images/
REM             └── dslr_images_undistorted/   # 歪み補正済み高解像度撮影画像群
REM サンプルデータ(ETH3D courtyard)をダウンロード
set "ETH3D_DIR=C:\image\ETH3D"
set "ETH3D_ARCHIVE=%TEMP%\courtyard.7z"
set "ETH3D_URL=https://www.eth3d.net/data/courtyard_dslr_undistorted.7z"
if not exist "%ETH3D_DIR%\courtyard" mkdir "%ETH3D_DIR%\courtyard"
curl -k -L -o "%ETH3D_ARCHIVE%" "%ETH3D_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 展開
tar -xf "%ETH3D_ARCHIVE%" -C "%ETH3D_DIR%\courtyard"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo courtyard サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
del "%ETH3D_ARCHIVE%"

REM ============================================================
REM COLMAP 公式標準 (South Building / Gerrard Hall) データセットのダウンロード
REM データ内容: 歴史的建造物の屋外マルチビューRGB画像(JPG形式 / 128枚・100枚)
REM 用途: COLMAPの全パイプライン(特徴量抽出・SfM・MVS・メッシュ生成)検証用
REM ============================================================
REM ├── south-building/
REM │   └── images/                            # 撮影画像群 (JPG / 128枚)
REM └── gerrard-hall/
REM     └── images/                            # 撮影画像群 (JPG / 100枚)
REM サンプルデータ(COLMAP South Building / Gerrard Hall)をダウンロード
set "DATA_ROOT_SOUTH=C:\image\COLMAP_data\south-building"
set "SOUTH_BUILDING_ZIP=%TEMP%\south-building.zip"
set "SOUTH_BUILDING_URL=https://github.com/colmap/colmap/releases/download/3.11.1/south-building.zip"

set "DATA_ROOT_GERRARD=C:\image\COLMAP_data\gerrard-hall"
set "GERRARD_HALL_ZIP=%TEMP%\gerrard-hall.zip"
set "GERRARD_HALL_URL=https://github.com/colmap/colmap/releases/download/3.11.1/gerrard-hall.zip"

if not exist "%DATA_ROOT_SOUTH%" mkdir "%DATA_ROOT_SOUTH%"
if not exist "%DATA_ROOT_GERRARD%" mkdir "%DATA_ROOT_GERRARD%"

REM --- South Building のダウンロードと展開 ---
curl -k -L -o "%SOUTH_BUILDING_ZIP%" "%SOUTH_BUILDING_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo south-building サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

powershell -NoProfile -Command "Expand-Archive -Path '%SOUTH_BUILDING_ZIP%' -DestinationPath '%DATA_ROOT_SOUTH%' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo south-building サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

del "%SOUTH_BUILDING_ZIP%"

REM --- Gerrard Hall のダウンロードと展開 ---
curl -k -L -o "%GERRARD_HALL_ZIP%" "%GERRARD_HALL_URL%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo gerrard-hall サンプルデータのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

powershell -NoProfile -Command "Expand-Archive -Path '%GERRARD_HALL_ZIP%' -DestinationPath '%DATA_ROOT_GERRARD%' -Force"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo gerrard-hall サンプルデータの展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

del "%GERRARD_HALL_ZIP%"

REM ============================================================
REM VGGT インストール
REM 入力: RGB画像群(複数視点画像/動画フレーム)、2Dクエリ点(トラッキング時のみ)
REM 出力: カメラ内部・外部パラメータ、深度マップ、3D点群(ポイントマップ)、ポイントトラック
REM   numpy の上限指定(pyproject.toml の numpy<2、
REM   requirements.txt の numpy<2)を numpy 2 系に変更する
REM ============================================================
if exist "C:\VGGT\.git" ( cd /d "C:\VGGT" & git pull ) else ( git clone https://github.com/facebookresearch/vggt.git "C:\VGGT" )
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VGGT リポジトリの取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d "C:\VGGT"
powershell -Command "(Get-Content pyproject.toml) -replace 'numpy<2', 'numpy>=2.0.0' | Set-Content pyproject.toml"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pyproject.toml の書き換えに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
powershell -Command "(Get-Content requirements.txt) -replace 'numpy(<2|==1\.26\.1)', 'numpy>=2.0.0' | Set-Content requirements.txt"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo requirements.txt の書き換えに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user .
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VGGT のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user -r requirements_demo.txt
REM VGGT の vggt/dependency/np_to_pycolmap.py は旧 API を前提に書かれている(2026/08)
pip uninstall -y pycolmap
pip install -U pycolmap
cd /d C:\VGGT
python -c "import io,re;p='vggt/dependency/np_to_pycolmap.py';s=io.open(p,encoding='utf-8').read();io.open(p+'.bak','w',encoding='utf-8',newline='').write(s);r=re.compile(r'[ ]*try:\n[ ]*image\.points2D = pycolmap\.ListPoint2D\(points2D_list\)\n[ ]*image\.registered = True\n[ ]*except:\n([ ]*print\([^\n]*\)\n)[ ]*image\.registered = False\n\n[ ]*# add image\n[ ]*reconstruction\.add_image\(image\)\n');f=lambda m:'        is_registered = True\n        try:\n            image.points2D = pycolmap.ListPoint2D(points2D_list)\n        except Exception:\n'+m.group(1)+'            is_registered = False\n\n        reconstruction.add_image(image)\n        if is_registered:\n            reconstruction.register_image(image.image_id)\n        else:\n            image.reset_pose()\n';s2,n=r.subn(f,s);io.open(p,'w',encoding='utf-8',newline='').write(s2) if n==2 else None;print('replaced',n)"
cd /d C:\VGGT
python -c "import io;p='vggt/dependency/np_to_pycolmap.py';s=io.open(p,encoding='utf-8').read();o='            id=fidx + 1, name=';n=s.count(o);s=s.replace(o,'            image_id=fidx + 1, name=');io.open(p,'w',encoding='utf-8',newline='').write(s);print('replaced',n)"
cd /d C:\VGGT
if exist mk.py del mk.py
>>mk.py echo import io
>>mk.py echo p='vggt/dependency/np_to_pycolmap.py'
>>mk.py echo s=io.open(p+'.bak',encoding='utf-8').read()
>>mk.py echo a='            # add camera\n            reconstruction.add_camera(camera)\n'
>>mk.py echo b='            # add camera\n            reconstruction.add_camera(camera)\n\n            rig = pycolmap.Rig()\n            rig.rig_id = camera.camera_id\n            rig.add_ref_sensor(camera.sensor_id)\n            reconstruction.add_rig(rig)\n'
>>mk.py echo s=s.replace(a,b)
>>mk.py echo c='        image = pycolmap.Image(\n            id=fidx + 1, name=f"image_{fidx + 1}", camera_id=camera.camera_id, cam_from_world=cam_from_world\n        )\n'
>>mk.py echo d='        image = pycolmap.Image(image_id=fidx + 1, name=f"image_{fidx + 1}", camera_id=camera.camera_id)\n'
>>mk.py echo s=s.replace(c,d)
>>mk.py echo e='        try:\n            image.points2D = pycolmap.ListPoint2D(points2D_list)\n            image.registered = True\n        except:\n            print(f"frame {fidx + 1} is out of BA")\n            image.registered = False\n\n        # add image\n        reconstruction.add_image(image)\n'
>>mk.py echo f='        if points2D_list:\n            image.points2D = pycolmap.Point2DList(points2D_list)\n            has_pose = True\n        else:\n            print(f"frame {fidx + 1} is out of BA")\n            has_pose = False\n\n        frame = pycolmap.Frame()\n        frame.frame_id = fidx + 1\n        frame.rig_id = rig.rig_id\n        frame.add_data_id(image.data_id)\n        if has_pose:\n            frame.rig_from_world = cam_from_world\n        reconstruction.add_frame(frame)\n\n        image.frame_id = frame.frame_id\n        reconstruction.add_image(image)\n'
>>mk.py echo s=s.replace(e,f)
>>mk.py echo e2=e.replace('is out of BA','does not have any points')
>>mk.py echo f2=f.replace('is out of BA','does not have any points')
>>mk.py echo s=s.replace(e2,f2)
>>mk.py echo s=s.replace('pyimg.cam_from_world.matrix()','pyimg.cam_from_world().matrix()')
>>mk.py echo io.open(p,'w',encoding='utf-8',newline='').write(s)
>>mk.py echo print('patched')
python mk.py
del mk.py
python demo_colmap.py --scene_dir "c:\image\tandt\tandt\truck"

REM ============================================================
REM COLMAP インストール
REM 特徴量抽出・マッチング(Feature Extraction & Matching)
REM   入力: RGB画像群(単一視点・複数視点写真)
REM   出力: データベースファイル(database.db:2D特徴点座標、記述子、画像間マッチング情報)
REM Structure-from-Motion / SfM(疎な3D再構成・カメラ姿勢推定)
REM   入力: データベースファイル(database.db)、RGB画像群
REM   出力: 疎なモデル(sparse/:カメラ内部パラメータ cameras.bin、カメラ外部パラメータ images.bin、疎な3D点群 points3D.bin)
REM Multi-View Stereo / MVS(密な3D再構成・点群フュージョン)
REM   入力: RGB画像群、SfMで推定された疎なモデル(sparse/)
REM   出力: 深度マップ・法線マップ(*.geometric.bin, *.photometric.bin)、密な3D点群(fused.ply)
REM サーフェス再構成(Meshing / 3Dメッシュ生成)
REM   入力: 密な3D点群(fused.ply)
REM   出力: 3Dテクスチャメッシュモデル(meshed-poisson.ply または meshed-delaunay.ply)
REM ============================================================
set "COLMAP_DIR=C:\COLMAP"
set "COLMAP_ZIP=%TEMP%\colmap.zip"
if exist "C:\Program Files\COLMAP" rmdir /s /q "C:\Program Files\COLMAP"
if exist "%COLMAP_DIR%" rmdir /s /q "%COLMAP_DIR%"
curl -L -o "%COLMAP_ZIP%" https://github.com/colmap/colmap/releases/download/4.1.1/colmap-x64-windows-cuda.zip
powershell -NoProfile -Command "Expand-Archive -Path '%COLMAP_ZIP%' -DestinationPath '%TEMP%\colmap_extracted' -Force; $src=(Get-ChildItem -Directory '%TEMP%\colmap_extracted' | Select-Object -First 1).FullName; Move-Item -LiteralPath $src -Destination '%COLMAP_DIR%'; Remove-Item -Recurse -Force '%TEMP%\colmap_extracted'"
del "%COLMAP_ZIP%"

icacls C:\COLMAP /grant Everyone:F /t

REM ============================================================
REM Blender実行ファイルのパスを動的に検出
set "BLENDER_EXE="
powershell -NoProfile -Command "Get-ChildItem -Path 'C:\Program Files','C:\Program Files (x86)' -Recurse -Filter 'blender.exe' -ErrorAction SilentlyContinue | Sort-Object -Property @{Expression={[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).FileVersion}} -Descending | Select-Object -First 1 -ExpandProperty FullName" > "%TEMP%\blender_path.txt"
set /p BLENDER_EXE=<"%TEMP%\blender_path.txt"
del "%TEMP%\blender_path.txt"
if not defined BLENDER_EXE ( color 0c & echo Blenderの実行ファイルが見つかりません & ping 127.0.0.1 -n 6 >nul & color )
echo Blender: %BLENDER_EXE%

REM ============================================================
REM BlendLuxCore and sample インストール
REM ============================================================

REM ============================================================
REM ユーザーリソースのパスを Blender 自身から取得(バージョン非固定)
REM   対話 cmd / バッチの双方で同一に動くよう、Python 側は % 書式と " を使わず
REM   set "K=V" 形式の一時 cmd を生成して call する(for /f も %% も使わない)
set "BLC_INFO=%TEMP%\blc_paths.cmd"
if exist "%BLC_INFO%" del /f /q "%BLC_INFO%"
"%BLENDER_EXE%" --background --factory-startup --python-exit-code 1 --python-expr "import bpy, os, sys, pathlib; ext = pathlib.Path(bpy.utils.user_resource('EXTENSIONS')); q = chr(34); vals = {'BL_VER': f'{bpy.app.version[0]}.{bpy.app.version[1]}', 'BL_CFG': bpy.utils.user_resource('CONFIG'), 'BL_SCRIPTS': bpy.utils.user_resource('SCRIPTS'), 'BL_EXT': str(ext), 'BL_SP': str(ext / '.local' / 'lib' / f'python{sys.version_info[0]}.{sys.version_info[1]}' / 'site-packages')}; open(os.environ['BLC_INFO'], 'w', encoding='mbcs').write(''.join(f'set {q}{k}={v}{q}\n' for k, v in vals.items()))" >nul
if not exist "%BLC_INFO%" ( color 0c & echo Blenderのユーザーパス取得に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
call "%BLC_INFO%"
if exist "%BLC_INFO%" del /f /q "%BLC_INFO%"
if not defined BL_EXT ( color 0c & echo 拡張機能フォルダを特定できません & ping 127.0.0.1 -n 6 >nul & color )
echo Blender version : %BL_VER%
echo Extensions      : %BL_EXT%
echo site-packages   : %BL_SP%

REM ============================================================
ECHO BlendLuxCore and sample set
set "BLC_VER=2.11.0"
set "BLC_ZIP=%TEMP%\BlendLuxCore-%BLC_VER%.zip"
set "BLC_ID=blendluxcore"
set "BLC_MOD=bl_ext.user_default.%BLC_ID%"

REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

REM 設定の退避
if exist "%BL_CFG%\userpref.blend" copy /y "%BL_CFG%\userpref.blend" "%BL_CFG%\userpref.blend.bak"

REM 旧形式(scripts\addons)と旧IDの登録を除去(大文字ID・小文字IDの両方)
REM   ここで壊れたアドオンの読み込みが起きて ImportError のトレースバックが出るのは想定内。
REM   userpref を書き戻すため --factory-startup は付けない(他アドオン設定が初期化される)。
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils, bpy; K=('BlendLuxCore','bl_ext.user_default.BlendLuxCore','bl_ext.user_default.blendluxcore'); [addon_utils.disable(k, default_set=True) for k in K]; a=bpy.context.preferences.addons; [a.remove(a[k]) for k in K if k in a]; bpy.ops.wm.save_userpref(); print('KEYS:', list(a.keys()))"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 旧アドオン登録の除去に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if exist "%BL_SCRIPTS%\addons\BlendLuxCore" rmdir /s /q "%BL_SCRIPTS%\addons\BlendLuxCore"

REM アドオンフォルダの削除(wheels / wheels_backup / pyluxcore_installation_info.txt を含む)
if exist "%BL_EXT%\user_default\%BLC_ID%" rmdir /s /q "%BL_EXT%\user_default\%BLC_ID%"

REM site-packages は pyluxcore 配布物だけを削除(RECORD のトップレベル+pyluxcore プレフィックス限定)
REM   上の手順で userpref から外れた時点で Blender 側が既に除去していることが多く、
REM   その場合 [DEL ] は出力されない(残骸がある場合のみ削除される)
"%BLENDER_EXE%" --background --factory-startup --python-exit-code 1 --python-expr "import bpy, csv, pathlib, shutil; root = pathlib.Path(bpy.utils.user_resource('EXTENSIONS')) / '.local' / 'lib'; mine = lambda n: n.lower().startswith('pyluxcore'); tops = lambda sp: sorted({p.name for p in sp.glob('pyluxcore*')} | {row[0].replace('\\', '/').split('/')[0] for di in sp.glob('pyluxcore-*.dist-info') if (di / 'RECORD').is_file() for row in csv.reader((di / 'RECORD').open(newline='', encoding='utf-8')) if row and row[0]}); [[print('[PURGE]', sp)] + [(print('[DEL ]', n), shutil.rmtree(sp / n) if (sp / n).is_dir() else (sp / n).unlink()) if mine(n) else print('[KEEP]', n) for n in tops(sp) if (sp / n).exists()] for sp in sorted(root.glob('python3.*/site-packages'))]"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pyluxcore のパージに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM pyluxcore.pyd が要求する非同梱ランタイムの確認(VC++ 2015-2022 x64)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import ctypes; [ctypes.WinDLL(n) for n in ('vcruntime140.dll','vcruntime140_1.dll')]; print('OK VCRUNTIME')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VC++ 2015-2022 x64 再配布パッケージを導入してください: winget install --id Microsoft.VCRedist.2015+.x64 -e & ping 127.0.0.1 -n 6 >nul & color )

REM サンプルシーンの取得
if not exist "c:\image" mkdir "c:\image"
cd /d c:\image
set GIT_LFS_SKIP_SMUDGE=1
if not exist "LuxCoreTestScenes" git clone https://github.com/LuxCoreRender/LuxCoreTestScenes.git
if not exist "c:\image\LuxCoreTestScenes\.git" ( color 0c & echo サンプルシーンのクローンに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d c:\image\LuxCoreTestScenes

REM アドオン本体のダウンロード
curl -f -L -o "%BLC_ZIP%" "https://github.com/LuxCoreRender/BlendLuxCore/releases/download/v%BLC_VER%/BlendLuxCore-%BLC_VER%.zip"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendLuxCore のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 拡張機能としてインストール(--enable によりこの時点で pyluxcore が PyPI から取得・導入される)
"%BLENDER_EXE%" --command extension install-file -r user_default --enable "%BLC_ZIP%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendLuxCore のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 正しいモジュールIDで有効化を確定し、pyluxcore の実ロードまで検証
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy, importlib.metadata as md; m='%BLC_MOD%'; bpy.ops.preferences.addon_enable(module=m); bpy.ops.wm.save_userpref(); assert m in bpy.context.preferences.addons, 'NOT ENABLED'; import pyluxcore; print('OK ENABLED:', m, '/ pyluxcore', md.version('pyluxcore'))"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo BlendLuxCore の有効化に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "%BL_EXT%\user_default\%BLC_ID%" ( color 0c & echo BlendLuxCore の展開先が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM 完了案内
color 0a & echo 完了: Blender を一度再起動してから Render Engine に LuxCore を選択してください & color

REM ============================================================
REM SkySplat(Blenderアドオン)インストール
REM ============================================================
ECHO SkySplat

REM ============================================================
REM Blender実行ファイルのパスを動的に検出
set "BLENDER_EXE="
powershell -NoProfile -Command "Get-ChildItem -Path 'C:\Program Files','C:\Program Files (x86)' -Recurse -Filter 'blender.exe' -ErrorAction SilentlyContinue | Sort-Object -Property @{Expression={[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).FileVersion}} -Descending | Select-Object -First 1 -ExpandProperty FullName" > "%TEMP%\blender_path.txt"
set /p BLENDER_EXE=<"%TEMP%\blender_path.txt"
del "%TEMP%\blender_path.txt"
if not defined BLENDER_EXE ( color 0c & echo Blenderの実行ファイルが見つかりません & ping 127.0.0.1 -n 6 >nul & color )
echo Blender: %BLENDER_EXE%

REM ============================================================
REM SkySplat(Blenderアドオン)インストール
REM ============================================================
REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

ECHO SkySplat
set "SKYSPLAT_ZIP=%TEMP%\skysplat_blender.zip"
set "SKYSPLAT_ADDONS=%APPDATA%\Blender Foundation\Blender\5.2\scripts\addons"
cd /d "%TEMP%"

REM ダウンロード
curl -f -L -o "%SKYSPLAT_ZIP%" "https://github.com/kyjohnso/skysplat_blender/releases/download/v0.4.2/skysplat_blender_win_0.4.2.zip"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開(前回の残骸を除去してから実行)
if exist "%SKYSPLAT_ADDONS%\skysplat_blender" rmdir /s /q "%SKYSPLAT_ADDONS%\skysplat_blender"
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; bpy.ops.preferences.addon_install(filepath=r'%SKYSPLAT_ZIP%', overwrite=True)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat の展開に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 展開結果を確認してから旧版を置換
if not exist "%SKYSPLAT_ADDONS%\skysplat_blender\__init__.py" ( color 0c & echo SkySplat の展開結果が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM 不要な登録の除去と有効化
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; a=bpy.context.preferences.addons; [a.remove(a[k]) for k in ('skysplat_blender',) if k in a]; bpy.ops.preferences.addon_enable(module='skysplat_blender'); bpy.ops.wm.save_userpref()"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM アドオンの有効化状況確認
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils; r=[(m.__name__, addon_utils.check(m.__name__)) for m in addon_utils.modules() if 'skysplat' in m.__name__.lower()]; print('SKYSPLAT:', r); assert r and r[0][1][1], 'NOT ENABLED'"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo SkySplat が有効化されていません & ping 127.0.0.1 -n 6 >nul & color )

color 0a & echo 完了: Blender を一度再起動してから SkySplat を使用してください & color

REM ============================================================
REM KIRI Engine 3DGS Render Blenderアドオン インストール
REM   KIRI Engine製。学習済みの3次元ガウシアンスプラットを
REM   インポート、レンダリング、編集する。
REM   https://github.com/Kiri-Innovation/3dgs-render-blender-addon
REM ============================================================
REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

ECHO KIRI Engine 3DGS Render
set "KIRI_ZIP=%TEMP%\3dgs_render_by_kiri_engine.zip"
cd /d "%TEMP%"

REM Blender内蔵Pythonを使用して最新リリースのZIPアセットを取得 (PowerShell不使用)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import urllib.request, json; url=next(a['browser_download_url'] for a in json.loads(urllib.request.urlopen('https://api.github.com/repos/Kiri-Innovation/3dgs-render-blender-addon/releases/latest').read())['assets'] if a['name'].endswith('.zip')); print('Downloading:', url); urllib.request.urlretrieve(url, r'%KIRI_ZIP%')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo KIRI Engine 3DGS Render のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 拡張機能としてインストール(公式CLI・wheel も同時に導入/再実行時は上書き)
"%BLENDER_EXE%" --command extension install-file -r user_default --enable "%KIRI_ZIP%"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo KIRI Engine 3DGS Render のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 有効化の確定と実体での検証(オペレータの戻り値だけを信用しない)
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy; m='bl_ext.user_default.dgs_render_by_kiri_engine'; bpy.ops.preferences.addon_enable(module=m); bpy.ops.wm.save_userpref(); assert m in bpy.context.preferences.addons, 'NOT ENABLED'; print('OK ENABLED:', m)"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo KIRI Engine 3DGS Render の有効化に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "%APPDATA%\Blender Foundation\Blender\5.2\extensions\user_default\dgs_render_by_kiri_engine" ( color 0c & echo KIRI Engine 3DGS Render の展開先が見つかりません & ping 127.0.0.1 -n 6 >nul & color )

REM 有効化状況の確認
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils; print('KIRI:', [(m.__name__, addon_utils.check(m.__name__)) for m in addon_utils.modules() if 'kiri' in m.__name__.lower() or '3dgs' in m.__name__.lower()])"

color 0a & echo 完了: Blender を一度再起動してから 3DGS Render を使用してください & color

REM ============================================================
REM Plateau-Blender-Importer インストール
REM   PLATEAU(国土交通省)の3D都市モデルをBlenderへ取り込む。
REM   https://github.com/nneri-hin/Plateau-Blender-Importer
REM ============================================================

REM 起動中の Blender があると userpref が巻き戻るため確認
tasklist /fi "imagename eq blender.exe" | find /i "blender.exe" >nul && ( color 0c & echo 起動中の Blender を終了してから続行してください & pause & color )

ECHO Plateau-Blender-Importer
set "PLATEAU_ZIP=%TEMP%\Plateau-Blender-Importer-main.zip"
cd /d "%TEMP%"

REM 1. プラグインのダウンロード
curl -f -L -o "%PLATEAU_ZIP%" "https://github.com/nneri-hin/Plateau-Blender-Importer/archive/refs/heads/main.zip"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Plateau-Blender-Importer のダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 2. 一時領域へ展開し、内容を検証してから置換・有効化
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import bpy, os, zipfile, shutil, importlib, addon_utils; ad=bpy.utils.user_resource('SCRIPTS', path='addons', create=True); dest=os.path.join(ad, 'plateau_blender_importer'); tmp=dest+'_tmp'; shutil.rmtree(tmp, ignore_errors=True); z=zipfile.ZipFile(r'%PLATEAU_ZIP%', 'r'); z.extractall(tmp); z.close(); it=os.listdir(tmp); src=os.path.join(tmp, it[0]) if len(it)==1 and os.path.isdir(os.path.join(tmp, it[0])) else tmp; assert os.path.isfile(os.path.join(src, '__init__.py')), 'init file not found'; shutil.rmtree(dest, ignore_errors=True); shutil.move(src, dest); shutil.rmtree(tmp, ignore_errors=True); a=bpy.context.preferences.addons; [a.remove(a[k]) for k in ('Plateau-Blender-Importer-main',) if k in a]; importlib.invalidate_caches(); bpy.ops.preferences.addon_refresh(); bpy.ops.preferences.addon_enable(module='plateau_blender_importer'); assert addon_utils.check('plateau_blender_importer')[1], 'addon not enabled'; bpy.ops.wm.save_userpref(); print('PLATEAU_INSTALL_OK')"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Plateau-Blender-Importer のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 3. 有効化状況の確認
"%BLENDER_EXE%" --background --python-exit-code 1 --python-expr "import addon_utils; print('PLATEAU:', [(m.__name__, addon_utils.check(m.__name__)) for m in addon_utils.modules() if 'plateau' in m.__name__.lower()])"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Plateau-Blender-Importer の有効化状況を取得できませんでした & ping 127.0.0.1 -n 6 >nul & color )

color 0a & echo 完了: Blender を一度再起動し、[ファイル]→[インポート] に Plateau CityGML があるか確認してください & color

REM ============================================================
REM Plateau-Blender-Importer テストデータ
REM ============================================================

REM PLATEAU データ
if not exist "C:\image\plateau" mkdir "C:\image\plateau"
cd /d "C:\image\plateau"
if not exist "40203_kurume-shi_city_2020_citygml_6_op.zip" curl -L -O https://assets.cms.plateau.reearth.io/assets/c9/9ff21b-d141-4f5a-9808-320a31f04c4a/40203_kurume-shi_city_2020_citygml_6_op.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PLATEAU データのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if not exist "34207_fukuyama-shi_city_2020_citygml_7_op.zip" curl -L -O https://assets.cms.plateau.reearth.io/assets/e5/2263cf-3caf-4627-82db-f92d305970b7/34207_fukuyama-shi_city_2020_citygml_7_op.zip
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PLATEAU データのダウンロードに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM 2-1. zip の展開(V4 対応版の zip はルートフォルダを持たないため展開先を指定する)
if not exist "40203_kurume-shi_city_2020_citygml_6_op\udx\bldg" mkdir "40203_kurume-shi_city_2020_citygml_6_op" 2>nul
if not exist "40203_kurume-shi_city_2020_citygml_6_op\udx\bldg" tar -xf "40203_kurume-shi_city_2020_citygml_6_op.zip" -C "40203_kurume-shi_city_2020_citygml_6_op"
if not exist "34207_fukuyama-shi_city_2020_citygml_7_op\udx\bldg" mkdir "34207_fukuyama-shi_city_2020_citygml_7_op" 2>nul
if not exist "34207_fukuyama-shi_city_2020_citygml_7_op\udx\bldg" tar -xf "34207_fukuyama-shi_city_2020_citygml_7_op.zip" -C "34207_fukuyama-shi_city_2020_citygml_7_op"
REM 2-2. 久留米市の gml の選択(最大サイズ)
set "GMLSRC1="
set "JMC1="
for /f "delims=" %I in ('dir /b /s /o-s "C:\image\plateau\40203_kurume-shi_city_2020_citygml_6_op\*_bldg_*.gml" 2^>nul') do @if not defined GMLSRC1 set "GMLSRC1=%I"
if not defined GMLSRC1 ( color 0c & echo 久留米市の bldg の gml が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
if defined GMLSRC1 for %I in ("%GMLSRC1%") do @set "JMC1=%~nI"
if defined JMC1 set "JMC1=%JMC1:~0,8%"
if defined JMC1 echo 久留米市 gml: "%GMLSRC1%"   メッシュコード: %JMC1%
REM 2-3. 福山市の gml の選択(最大サイズ)
set "GMLSRC2="
set "JMC2="
for /f "delims=" %I in ('dir /b /s /o-s "C:\image\plateau\34207_fukuyama-shi_city_2020_citygml_7_op\*_bldg_*.gml" 2^>nul') do @if not defined GMLSRC2 set "GMLSRC2=%I"
if not defined GMLSRC2 ( color 0c & echo 福山市の bldg の gml が見つかりません & ping 127.0.0.1 -n 6 >nul & color )
if defined GMLSRC2 for %I in ("%GMLSRC2%") do @set "JMC2=%~nI"
if defined JMC2 set "JMC2=%JMC2:~0,8%"
if defined JMC2 echo 福山市 gml: "%GMLSRC2%"   メッシュコード: %JMC2%

echo ------------------------------------------
chcp 65001
mkdir c:\image
cd c:\image
mkdir face_recognition
mkdir medical

REM 画像名: Official portrait of Donald Trump (47th), 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 実写顔写真の識別・照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_01_trump_47.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/11600/11614v.jpg"

REM 画像名: Official portrait of Joe Biden (46th), 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 実写顔写真の識別・照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_02_biden_46.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/01200/01261v.jpg"

REM 画像名: Official portrait of Donald Trump (45th), 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 同一人物の別条件照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_03_trump_45.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/00600/00608v.jpg"

REM 画像名: Official portrait of Barack Obama, 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 正面顔の識別・照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_04_obama.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/00300/00358v.jpg"

REM 画像名: Official portrait of George W. Bush, 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: スタジオ撮影顔写真の識別用
curl.exe -L --fail --retry 3 -o "face_recognition\face_05_george_w_bush.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppbd/00300/00371v.jpg"

REM 画像名: Official portrait of Gerald Ford, 出典: Library of Congress, ライセンス・再配布可否: No known restrictions on publication / 再配布可, 注釈有無: なし, 用途メモ: 解像度差を含む顔照合用
curl.exe -L --fail --retry 3 -o "face_recognition\face_06_gerald_ford.jpg" "https://tile.loc.gov/storage-services/service/pnp/ppmsc/02800/02800r.jpg"

REM 画像名: CDC PHIL 20474 fundoscopic retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底所見の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_01_phil_20474_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20474/20474_lores.jpg"

REM 画像名: CDC PHIL 20470 retinal image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底病変の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_02_phil_20470_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20470/20470_lores.jpg"

REM 画像名: CDC PHIL 28399 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底所見の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_03_phil_28399_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/28399/28399_lores.jpg"

REM 画像名: CDC PHIL 20469 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底画像の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_04_phil_20469_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20469/20469_lores.jpg"

REM 画像名: CDC PHIL 28398 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底異常所見の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_05_phil_28398_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/28398/28398_lores.jpg"

REM 画像名: CDC PHIL 18398 skin lesion image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 皮膚病変の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_06_phil_18398_skin_lesion.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/18398/18398_lores.jpg"

REM 画像名: CDC PHIL 18403 skin lesion image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 皮膚病変の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_07_phil_18403_skin_lesion.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/18403/18403_lores.jpg"

REM 画像名: CDC PHIL 22243 histopathology image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 病理組織像の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_08_phil_22243_histopathology.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/22243/22243_lores.jpg"

REM 画像名: CDC PHIL 16716 histopathology image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 顕微鏡病理画像の分類用
curl.exe -L --fail --retry 3 -o "medical\med_09_phil_16716_histopathology.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/16716/16716_lores.jpg"

REM 画像名: CDC PHIL 20479 retina image, 出典: CDC PHIL, ライセンス・再配布可否: Public Domain / 再配布可, 注釈有無: なし, 用途メモ: 眼底画像の医用画像分類用
curl.exe -L --fail --retry 3 -o "medical\med_10_phil_20479_retina.jpg" "https://wwwn.cdc.gov/phil///PHIL_Images/20479/20479_lores.jpg"

echo Download commands finished.

pip install --no-deps basic-pitch==0.4.0
pip install --no-deps librosa "mir_eval>=0.6" "pretty_midi>=0.2.9" "resampy<0.4.3" scikit-learn scipy typing_extensions onnxruntime
pip install -U --no-user ultralytics
pip install -U --no-user lapx
pip install -U --no-user sounddevice numpy faster-whisper transformers sentencepiece

REM ============================================================
pip install -U --no-user pygltflib

REM ============================================================
REM Python パッケージ (TensorFlow / PyTorch 他)
REM ============================================================
REM TensorFlow と関連パッケージ
pip install -U --no-user tensorflow tf-keras flatbuffers flatgeobuf protobuf
if not "%ERRORLEVEL%"=="0" ( color 0c & echo TensorFlow 関連パッケージのインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM 定番の終了処理の1つ
REM numpy と PyTorch(CUDA 12.8 対応 wheel)、pip キャッシュを全削除
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user scipy pillow pandas
if not "%ERRORLEVEL%"=="0" ( color 0c & echo scipy / pillow / pandas のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge

9/19 以降


REM ============================================================
REM ollama 旧モデル

ollama stop smtek/Qwen3.8-27B:Q2_K_XL-16gb
ollama rm smtek/Qwen3.8-27B:Q2_K_XL-16gb
ollama stop smtek/Qwen3.8-27B:Q3_K_M
ollama rm smtek/Qwen3.8-27B:Q3_K_M

REM ============================================================
REM ollama モデル
cd /d C:\ollama\modelfiles
(echo FROM logicbeat/qwen3.8-27B_GSQ_RCO)>Modelfile.qwen38-27b
(echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b
(echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b

(echo FROM logicbeat/qwen3.8-27B_GSQ_RCO)>Modelfile.qwen38-27b-code
(echo PARAMETER num_ctx 128000)>>Modelfile.qwen38-27b-code
(echo PARAMETER draft_num_predict 0)>>Modelfile.qwen38-27b-code
(echo PARAMETER num_predict 40000)>>Modelfile.qwen38-27b-code
(echo PARAMETER repeat_penalty 1.02)>>Modelfile.qwen38-27b-code

ollama stop qwen38-27b
ollama rm qwen38-27b
ollama create qwen38-27b -f Modelfile.qwen38-27b
ollama stop qwen38-27b-code
ollama rm qwen38-27b-code
ollama create qwen38-27b-code -f Modelfile.qwen38-27b-code
[2026/4/22以降の差分を反映させるスクリプト(実行済み)]
REM 手作業
echo cmake のPATHを確認してください

REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

echo ----------------------------------------------------------------------

REM ollama モデル更新
ollama stop qwen3.5:35b-a3b
ollama rm qwen3.5:35b-a3b
ollama stop qwen3.5:27b
ollama rm qwen3.5:27b
ollama pull gemma4:e4b
ollama pull qwen3.6:35b-a3b

REM ComfyUI Manager, ComfyUI GGUF
git clone https://github.com/ltdrdata/ComfyUI-Manager C:\ComfyUI\custom_nodes\ComfyUI-Manager
pip install -U --no-user -r C:\ComfyUI\custom_nodes\ComfyUI-Manager\requirements.txt
git clone https://github.com/city96/ComfyUI-GGUF C:\ComfyUI\custom_nodes\ComfyUI-GGUF
pip install -U --no-user -r C:\ComfyUI\custom_nodes\ComfyUI-GGUF\requirements.txt

REM ============================================================
REM VSCodium
REM ============================================================
REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
REM python.languageServer の指定可能な値は Default / Jedi / Pylance / None であり、
REM Pyright 拡張を使う場合は None を指定する
if not exist "%APPDATA%\VSCodium\User" mkdir "%APPDATA%\VSCodium\User"
python -c "import json,os;data={'update.mode':'none','extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','python.languageServer':'None','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'qwen38-27b-code'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'VSCodium','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
if not exist "%APPDATA%\Code\User" mkdir "%APPDATA%\Code\User"
python -c "import json,os;data={'update.mode':'none','update.enableWindowsBackgroundUpdates':False,'extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'qwen38-27b-code'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'Code','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"


REM ============================================================
REM ComfyUI モデル一括ダウンロードスクリプト(2026年5月10日修正版)
REM 合計:8ファイル 約46.93 GB
REM 対応:コマンドプロンプト直接貼付 / バッチファイル実行 両対応
REM 繰り返し実行可:存在ファイルはスキップ
REM 失敗時:部分ファイル自動削除(次回実行で完全再取得)
REM VRAM 16GB / RAM 32GB 制約に適合
REM ============================================================
REM [1] z_image_turbo_bf16.safetensors              12.31 GB  Z-Image Turbo 拡散モデル本体(高速画像生成)
REM [2] wan2.2_ti2v_5B_fp16.safetensors             10.00 GB  Wan2.2 TI2V-5B 拡散モデル本体(T2V/I2V 両対応)
REM [3] flux-2-klein-4b.safetensors                  7.75 GB  FLUX.2 Klein 拡散モデル本体(高品質画像生成)
REM [4] qwen_3_4b.safetensors                        8.04 GB  Qwen-3 4B テキストエンコーダ(Z-Image Turbo & FLUX.2 Klein 共用)
REM [5] umt5_xxl_fp8_e4m3fn_scaled.safetensors       6.74 GB  UMT5-XXL fp8 テキストエンコーダ(Wan2.2 用)
REM [6] ae.safetensors                               0.34 GB  Z-Image Turbo 用 VAE
REM [7] wan2.2_vae.safetensors                       1.41 GB  Wan2.2 用 VAE
REM [8] flux2-vae.safetensors                        0.34 GB  FLUX.2 Klein 用 VAE
REM ============================================================

REM === 1. モデル格納ディレクトリ作成 ===
if not exist "C:\ComfyUI\models\diffusion_models" mkdir "C:\ComfyUI\models\diffusion_models"
if not exist "C:\ComfyUI\models\text_encoders"    mkdir "C:\ComfyUI\models\text_encoders"
if not exist "C:\ComfyUI\models\vae"              mkdir "C:\ComfyUI\models\vae"
if not exist "C:\ComfyUI\models\loras"            mkdir "C:\ComfyUI\models\loras"

REM === 2-1. Z-Image Turbo 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" (
    echo [DL] z_image_turbo_bf16.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/diffusion_models/z_image_turbo_bf16.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] z_image_turbo_bf16.safetensors のダウンロードに失敗しました
) else (echo [SKIP] z_image_turbo_bf16.safetensors)

REM === 2-2. Z-Image Turbo DeJPEG LoRA(高解像度時のスペックルノイズ対策) ===
if not exist "C:\ComfyUI\models\loras\dejpeg_v3.safetensors" (
    echo [DL] dejpeg_v3.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\loras\dejpeg_v3.safetensors" "https://huggingface.co/wcde/Z-Image-Turbo-DeJPEG-Lora/resolve/main/dejpeg_v3.safetensors"
    if not "%ERRORLEVEL%"=="0" echo [エラー] dejpeg_v3.safetensors のダウンロードに失敗しました
) else (echo [SKIP] dejpeg_v3.safetensors)

REM === 3. Wan2.2 TI2V-5B 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\wan2.2_ti2v_5B_fp16.safetensors" (
    echo [DL] wan2.2_ti2v_5B_fp16.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\wan2.2_ti2v_5B_fp16.safetensors" "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors"
) else (echo [SKIP] wan2.2_ti2v_5B_fp16.safetensors)

REM === 4. FLUX.2 Klein 拡散モデル本体 ===
if not exist "C:\ComfyUI\models\diffusion_models\flux-2-klein-4b.safetensors" (
    echo [DL] flux-2-klein-4b.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\diffusion_models\flux-2-klein-4b.safetensors" "https://huggingface.co/Comfy-Org/flux2-klein/resolve/main/split_files/diffusion_models/flux-2-klein-4b.safetensors"
) else (echo [SKIP] flux-2-klein-4b.safetensors)

REM === 5. Qwen-3 4B テキストエンコーダ(Z-Image Turbo & FLUX.2 Klein 共用) ===
if not exist "C:\ComfyUI\models\text_encoders\qwen_3_4b.safetensors" (
    echo [DL] qwen_3_4b.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\text_encoders\qwen_3_4b.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/text_encoders/qwen_3_4b.safetensors"
) else (echo [SKIP] qwen_3_4b.safetensors)

REM === 6. UMT5-XXL fp8 テキストエンコーダ(Wan2.2 用) ===
if not exist "C:\ComfyUI\models\text_encoders\umt5_xxl_fp8_e4m3fn_scaled.safetensors" (
    echo [DL] umt5_xxl_fp8_e4m3fn_scaled.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\text_encoders\umt5_xxl_fp8_e4m3fn_scaled.safetensors" "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors"
) else (echo [SKIP] umt5_xxl_fp8_e4m3fn_scaled.safetensors)

REM === 7. Z-Image Turbo 用 VAE ===
if not exist "C:\ComfyUI\models\vae\ae.safetensors" (
    echo [DL] ae.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\vae\ae.safetensors" "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/vae/ae.safetensors"
) else (echo [SKIP] ae.safetensors)

REM === 8. Wan2.2 用 VAE ===
if not exist "C:\ComfyUI\models\vae\wan2.2_vae.safetensors" (
    echo [DL] wan2.2_vae.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\vae\wan2.2_vae.safetensors" "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/vae/wan2.2_vae.safetensors"
) else (echo [SKIP] wan2.2_vae.safetensors)

REM === 9. FLUX.2 Klein 用 VAE ===
if not exist "C:\ComfyUI\models\vae\flux2-vae.safetensors" (
    echo [DL] flux2-vae.safetensors
    curl -L --fail --remove-on-error -o "C:\ComfyUI\models\vae\flux2-vae.safetensors" "https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/vae/flux2-vae.safetensors"
) else (echo [SKIP] flux2-vae.safetensors)

REM === 10. 最終存在確認(for ループ不使用・両環境対応) ===

REM ============================================================
echo 最終存在確認
REM ============================================================
if exist "C:\ComfyUI\models\diffusion_models\z_image_turbo_bf16.safetensors" (echo [OK] z_image_turbo_bf16.safetensors) else (echo [NG] z_image_turbo_bf16.safetensors)
if exist "C:\ComfyUI\models\diffusion_models\wan2.2_ti2v_5B_fp16.safetensors" (echo [OK] wan2.2_ti2v_5B_fp16.safetensors) else (echo [NG] wan2.2_ti2v_5B_fp16.safetensors)
if exist "C:\ComfyUI\models\diffusion_models\flux-2-klein-4b.safetensors" (echo [OK] flux-2-klein-4b.safetensors) else (echo [NG] flux-2-klein-4b.safetensors)
if exist "C:\ComfyUI\models\text_encoders\qwen_3_4b.safetensors" (echo [OK] qwen_3_4b.safetensors) else (echo [NG] qwen_3_4b.safetensors)
if exist "C:\ComfyUI\models\text_encoders\umt5_xxl_fp8_e4m3fn_scaled.safetensors" (echo [OK] umt5_xxl_fp8_e4m3fn_scaled.safetensors) else (echo [NG] umt5_xxl_fp8_e4m3fn_scaled.safetensors)
if exist "C:\ComfyUI\models\vae\ae.safetensors" (echo [OK] ae.safetensors) else (echo [NG] ae.safetensors)
if exist "C:\ComfyUI\models\vae\wan2.2_vae.safetensors" (echo [OK] wan2.2_vae.safetensors) else (echo [NG] wan2.2_vae.safetensors)
if exist "C:\ComfyUI\models\vae\flux2-vae.safetensors" (echo [OK] flux2-vae.safetensors) else (echo [NG] flux2-vae.safetensors)



echo -----------------------------------------------
REM 追加データ
echo -----------------------------------------------
REM MediaPipe sample images : mediapipe-tasks bucket
REM Hand / Gesture / Object Detection / Image Classification
mkdir C:\image\mediapipe

REM 21点ハンドランドマーク評価用 両手映り
curl -L -o C:\image\mediapipe\woman_hands.jpg https://storage.googleapis.com/mediapipe-tasks/hand_landmarker/woman_hands.jpg
REM ジェスチャー認識 Thumb_Up クラス検証
curl -L -o C:\image\mediapipe\thumbs_up.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/thumbs_up.jpg
REM ジェスチャー認識 Thumb_Down クラス検証
curl -L -o C:\image\mediapipe\thumbs_down.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/thumbs_down.jpg
REM ジェスチャー認識 Victory クラス検証
curl -L -o C:\image\mediapipe\victory.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/victory.jpg
REM ジェスチャー認識 Pointing_Up クラス検証
curl -L -o C:\image\mediapipe\pointing_up.jpg https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/pointing_up.jpg
REM 物体検出 COCO 多クラス同時検出 cat dog
curl -L -o C:\image\mediapipe\cat_and_dog.jpg https://storage.googleapis.com/mediapipe-tasks/object_detector/cat_and_dog.jpg
REM 画像分類 ImageNet 食品カテゴリ
curl -L -o C:\image\mediapipe\burger.jpg https://storage.googleapis.com/mediapipe-tasks/image_classifier/burger.jpg
REM 画像分類 ImageNet 動物カテゴリ
curl -L -o C:\image\mediapipe\cat.jpg https://storage.googleapis.com/mediapipe-tasks/image_classifier/cat.jpg
REM 画像セグメンテーション DeepLab V3 Pascal VOC 21クラス検証用
curl -L -o C:\image\mediapipe\segmentation_input_rotation0.jpg https://storage.googleapis.com/mediapipe-assets/segmentation_input_rotation0.jpg
REM 姿勢推定 BlazePose 単一人物全身 33点ランドマーク検証
curl -L -o C:\image\mediapipe\girl-4051811.jpg https://cdn.pixabay.com/photo/2019/03/12/20/39/girl-4051811_960_720.jpg
REM 顔ランドマーク検出 478点および52種ブレンドシェイプ検証
curl -L -o C:\image\mediapipe\business-person.png https://storage.googleapis.com/mediapipe-assets/business-person.png
REM 顔検出 BlazeFace 複数顔 6点キーポイント検証
curl -L -o C:\image\mediapipe\face_detector_sample.jpg https://i.imgur.com/Vu2Nqwb.jpeg
REM 画像埋め込み コサイン類似度検証 元画像
curl -L -o C:\image\mediapipe\burger_embed.jpg https://storage.googleapis.com/mediapipe-assets/burger.jpg
REM 画像埋め込み コサイン類似度検証 切り抜き画像
curl -L -o C:\image\mediapipe\burger_crop.jpg https://storage.googleapis.com/mediapipe-assets/burger_crop.jpg

echo -----------------------------------------------
REM AudioSet sample audio : 16 kHz WAV
REM YAMNet / AST audio classification benchmark
mkdir C:\image\audioset

REM 動物クラス検証 猫鳴き声 約6.7秒
curl -L -o C:\image\audioset\miaow_16k.wav https://storage.googleapis.com/audioset/miaow_16k.wav

REM 人間音声クラス検証 口笛
curl -L -o C:\image\audioset\speech_whistling2.wav https://storage.googleapis.com/audioset/speech_whistling2.wav

REM
REM マルチメディア
REM

REM FFmpeg をシステム領域にインストール
winget uninstall --id Gyan.FFmpeg --all-versions --force --silent --disable-interactivity --accept-source-agreements --silent --disable-interactivity --accept-source-agreements
REM 1. FFmpeg をインストール
winget install --id Gyan.FFmpeg -e --scope machine --location "C:\Program Files\FFmpeg" --silent --accept-source-agreements --accept-package-agreements
REM 2. インストールされた実体フォルダ名(ffmpeg-*)を自動取得して変数に格納
for /f "delims=" %i in ('dir /b /ad "C:\Program Files\FFmpeg\ffmpeg*"') do set "FFMPEG_DIR=%i"
REM 3. 既存のリンクがある場合は削除(エラー防止)し、新しいリンクを作成
if exist "C:\FFmpeg" rd "C:\FFmpeg"
mklink /D "C:\FFmpeg" "C:\Program Files\FFmpeg\%FFMPEG_DIR%"
REM 4. PowerShellを使用してPath設定(C:\FFmpeg\bin を先頭に追加)
powershell -NoProfile -Command "$p='C:\FFmpeg\bin'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\")){[Environment]::SetEnvironmentVariable('Path',\"$c;$p\",'Machine')}"

REM
REM プログラミング環境
REM

REM codium, vscode 拡張機能 python preview 削除、almenon.arepl 追加
"C:\Program Files\VSCodium\bin\codium.cmd" --extensions-dir "C:\ProgramData\vscodium-extensions" --uninstall-extension dongli.python-preview
"C:\Program Files\VSCodium\bin\codium.cmd" --extensions-dir "C:\ProgramData\vscodium-extensions" --install-extension almenon.arepl
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension dongli.python-preview
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl

REM
REM チャットAI
REM

REM === 1. Ollama 環境変数を Machine スコープで事前設定 ===
REM   インストール前に設定することで、Ollama起動時から設定が読み込まれる
REM   KVキャッシュ量子化の設定
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_FLASH_ATTENTION', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_KV_CACHE_TYPE', 'q8_0', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MAX_LOADED_MODELS', '2', 'Machine')"
REM コンテキスト長:Ollamaのデフォルトは4096。ここでは32768に設定。
REM 用途に応じて値を変更するか、この行を削除して auto に任せる
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_CONTEXT_LENGTH', '32768', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MODELS', 'C:\Ollama\models', 'Machine')"
set "OLLAMA_FLASH_ATTENTION=1"
set "OLLAMA_KV_CACHE_TYPE=q8_0"
set "OLLAMA_MAX_LOADED_MODELS=2"
set "OLLAMA_CONTEXT_LENGTH=32768"
set "OLLAMA_MODELS=C:\Ollama\models"

REM === 2. 既存の Ollama プロセスを停止(ファイルロック解除のため) ===
taskkill /IM ollama.exe /F >nul 2>&1
taskkill /IM "ollama app.exe" /F >nul 2>&1

REM === 3. モデルフォルダの作成と権限設定 ===
if not exist "C:\Ollama\models" mkdir "C:\Ollama\models"
icacls "C:\Ollama\models" /grant *S-1-5-32-545:(OI)(CI)(M) /T /C

REM === 4. 既存モデルの移動(ユーザープロファイルに残っている場合) ===
REM   Ollama 停止状態で実行するためファイルロックが起きない
if exist "%USERPROFILE%\.ollama\models" robocopy "%USERPROFILE%\.ollama\models" "C:\Ollama\models" /E /MOVE
if exist "%USERPROFILE%\.ollama\models" rd /s /q "%USERPROFILE%\.ollama\models"

REM === 5. Ollama のインストール(Inno Setup) ===
REM === Ollama のアンインストール ===
REM   インストール先を C:\Ollama に変更するため、インストール済みの場合は先に削除する
set "OLLAMA_INSTALLED=1"
winget list --id Ollama.Ollama -e >nul 2>&1
if not "%ERRORLEVEL%"=="0" set "OLLAMA_INSTALLED=0"
REM   起動中はファイルが残り削除に失敗するため、先にプロセスを停止する
if "%OLLAMA_INSTALLED%"=="1" taskkill /F /T /IM "ollama app.exe" >nul 2>&1
if "%OLLAMA_INSTALLED%"=="1" taskkill /F /T /IM "ollama.exe" >nul 2>&1
if exist "C:\ollama\unins000.exe" (if "%OLLAMA_INSTALLED%"=="1" start /wait "" "C:\Ollama\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG="C:\TEMP\ollama_unins.log") else (if "%OLLAMA_INSTALLED%"=="1" start /wait "" "%LOCALAPPDATA%\Programs\Ollama\unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG="C:\TEMP\ollama_unins.log")
if "%OLLAMA_INSTALLED%"=="1" if not "%ERRORLEVEL%"=="0" echo [警告] winget uninstall が異常終了しました
if "%OLLAMA_INSTALLED%"=="1" winget list --id Ollama.Ollama -e >nul 2>&1
if "%OLLAMA_INSTALLED%"=="1" if "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM uninstall後にプロセスが残ることがあるため、実行中であれば再度停止
tasklist /FI "IMAGENAME eq ollama.exe" | find /I "ollama.exe" >nul && taskkill /F /IM ollama.exe
tasklist /FI "IMAGENAME eq ollama app.exe" | find /I "ollama app.exe" >nul && taskkill /F /IM "ollama app.exe"

REM === Ollama のインストール ===
winget install --id Ollama.Ollama -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/DIR=C:\Ollama"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM === Ollama のパス設定(システム PATH に未登録の場合のみ追加) ===
powershell -NoProfile -Command "$p='C:\Ollama'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM =====================================================================
REM CUDA Toolkit の確認(llama.cpp の CUDA ビルドに必要)
where nvcc
if not "%ERRORLEVEL%"=="0" echo [警告] nvcc が見つかりません。CUDA Toolkit を導入してから llama.cpp のビルドを実行してください。

REM llama.cpp のビルドとインストール
cd /d "%TEMP%"
if exist llama.cpp rmdir /s /q llama.cpp
git clone https://github.com/ggml-org/llama.cpp
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のクローンに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd llama.cpp
cmake -B build -T v143 -DCMAKE_GENERATOR_INSTANCE="C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89;120" -DCMAKE_INSTALL_PREFIX="C:\llama.cpp"
REM cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89;120" -DCMAKE_CUDA_FLAGS="-allow-unsupported-compiler" -DCMAKE_INSTALL_PREFIX="C:\llama.cpp"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp の CMake 構成に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cmake --build build --config Release -j 8
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のビルドに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cmake --install build --config Release
if not "%ERRORLEVEL%"=="0" ( color 0c & echo llama.cpp のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
cd /d "%TEMP%"
powershell -NoProfile -Command "$p='C:\llama.cpp\bin'; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()}"

REM =====================================================================
REM MediaPipe
pip install -U --no-user mediapipe onnxruntime-gpu protobuf==6.33.6
"%PYTHON%" -c "import mediapipe as mp; print('mediapipe:', mp.__version__)"
"%PYTHON%" -c "import onnxruntime as ort; print('providers:', ort.get_available_providers())"
"%PYTHON%" -c "import cv2; print('opencv:', cv2.__version__)"
REM MediaPipe Tasks API 動作確認
"%PYTHON%" -c "from mediapipe.tasks import python as mp_py; from mediapipe.tasks.python import vision; print('tasks API OK')"

REM numpy と PyTorch(CUDA 12.8 対応 wheel)、pip キャッシュを全削除
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo numpy / PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user scipy pillow pandas
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge


3次元関係(検討中)

追加コード(ここから先は作業中の未完成のものを掲載しています。現在、修正中。このままでは動きません)

CUDA 13.2 への更新を行ったほうが円滑に済みそうなので、CUDA 13.2 への更新を検討します


echo ----------------------
cd c:\temp
curl -L -o Plateau-Blender-Importer-main.zip https://github.com/nneri-hin/Plateau-Blender-Importer/archive/master.zip

echo -----------------------------------------------
echo vsinstaller で追加「vs143」

echo -----------------------------------------------

REM Pythonパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON=%PYTHON_PATH%\python.exe"
set "PIP=%PYTHON_PATH%\Scripts\pip"

REM Python存在チェック(未インストールの場合はシステム領域にインストール、パス設定)
set "NEED_PYTHON=0"
if not exist "%PYTHON%" set "NEED_PYTHON=1"
if "%NEED_PYTHON%"=="1" echo Python 3.12 が見つかりません。インストールします...
if "%NEED_PYTHON%"=="1" winget install --id Python.Python.3.12 -e --scope machine --silent --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if "%NEED_PYTHON%"=="1" if not "%ERRORLEVEL%"=="0" ( color 0c & echo インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
if "%NEED_PYTHON%"=="1" powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $o=$c; foreach($p in @('C:\Program Files\Python312','C:\Program Files\Python312\Scripts')){ if((Test-Path $p) -and (($c -split ';') -notcontains $p)){ $c=$c.TrimEnd(';')+';'+$p } }; if($c -ne $o){ $k.SetValue('Path',$c,$t) }; $k.Close()"

REM Torch などのバージョン最終調整、キャッシュクリア

echo -------------------------------------------------
REM UE と reality capture のためにepicgames を起動チェック
start "" "com.epicgames.launcher://store"

echo -------------------------------------------------

REM DA3-blenderDepth Anything 3による画像群からの3D再構成。点群をGeometry Nodesで表示github.com/xy-gao/DA3-blender
手動

追加ソフトウエアの検討中


REM 現時点では CUDA 12.8 を使用している。CUDA 12.8 は VS2022(MSVC v143)までを公式サポートしており,VS2026 は対応範囲外である。そのため,VS2026 内に VS2022 相当のツールセット(VC 14.43/v143)を追加し,-vcvars_ver=14.43.34808 でホストコンパイラを切り替えている。CMake では,VS2026 内の v143 ツールセットの cl.exe を CUDA の nvcc ホストコンパイラとして指定するオプション(-DCMAKE_CUDA_HOST_COMPILER)が必要である。なお,CUDA 13.2 では VS2026 が公式サポートされるため,移行すればこのワークアラウンドは不要になる。

REM ============================================================
REM  ind-bermuda-opensfm ビルドスクリプト(完全版)
REM  対象: Windows + Python 3.12 + Visual Studio 2026
REM  実行: コマンドプロンプト (cmd.exe)
REM ============================================================

REM VS2022同等の環境をVS2026内に追加
cd /d %TEMP%
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" --add Microsoft.VisualStudio.Component.VC.14.43.17.13.x86.x64 --passive --norestart
python -m pip install -U --no-user pip setuptools wheel
for /f "usebackq delims=" %i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -products * -latest -property installationPath`) do "%i\VC\Auxiliary\Build\vcvarsall.bat" amd64 -vcvars_ver=14.43.34808

REM vcpkg のセットアップと依存ライブラリのインストール ---
set "VCPKG_ROOT=C:\vcpkg"
setx VCPKG_ROOT "C:\vcpkg" /M
if exist "C:\vcpkg\.git" (cd /d C:\vcpkg && git pull --recurse-submodules) else (git clone https://github.com/microsoft/vcpkg.git C:\vcpkg)
if exist "C:\vcpkg\vcpkg.exe" (echo vcpkg already bootstrapped. Skipping.) else (C:\vcpkg\bootstrap-vcpkg.bat)
REM x64-windows-cuda-vs2022 に関する vcpkg の設定
copy /y C:\vcpkg\triplets\x64-windows.cmake C:\vcpkg\triplets\community\x64-windows-cuda-vs2022.cmake
echo set(VCPKG_CMAKE_CONFIGURE_OPTIONS "-DCMAKE_CUDA_HOST_COMPILER=C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe") >> C:\vcpkg\triplets\community\x64-windows-cuda-vs2022.cmake
REM
%VCPKG_ROOT%\vcpkg install opencv4:x64-windows-cuda-vs2022 eigen3:x64-windows-cuda-vs2022 ceres:x64-windows-cuda-vs2022 glog:x64-windows-cuda-vs2022 gflags:x64-windows-cuda-vs2022
REM %VCPKG_ROOT%\vcpkg install opencv4:x64-windows eigen3:x64-windows ceres:x64-windows glog:x64-windows gflags:x64-windows

REM --- 0. 基本設定 ---
set INSTALL_DIR=c:\ind-bermuda-opensfm
set "PYTHON_EXE=C:\Program Files\Python312\python.exe"

REM --- 1. ソースコードの取得 ---
cd /d c:\
if exist "%INSTALL_DIR%" rmdir /s /q "%INSTALL_DIR%"
git clone --recursive https://github.com/inuex35/ind-bermuda-opensfm "%INSTALL_DIR%"
cd /d "%INSTALL_DIR%"

REM --- 3. requirements.txt の修正 ---
cd /d "%INSTALL_DIR%
"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path('requirements.txt'); lines=p.read_text(encoding='utf-8').splitlines(); out=[]; [out.append('opencv-python ; sys_platform == \"win32\"') if 'opencv-python==' in l and 'win32' in l else out.append(l.replace('==','>=')) for l in lines]; p.write_text('\n'.join(out)+'\n',encoding='utf-8')"

REM --- 4. Python 依存パッケージのインストール、関連パッケージ (lightglue) のインストール ---
pip install -U --no-user -r requirements.txt
pip install -U --no-user git+https://github.com/cvg/LightGlue.git

REM --- 5. setup.py の修正(Sphinx BuildDoc 廃止対応)---
"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path('setup.py'); t=p.read_text(encoding='utf-8'); t=t.replace('from sphinx.setup_command import BuildDoc','try:\n    from sphinx.setup_command import BuildDoc\nexcept ImportError:\n    BuildDoc = None'); t=t.replace('\"build_doc\": BuildDoc,','**({\"build_doc\": BuildDoc} if BuildDoc else {}),'); p.write_text(t,encoding='utf-8')"

REM --- 6. pybind11 を Python 3.12 対応版 v2.13.6 に差し替え ---
rmdir /s /q opensfm\src\third_party\pybind11
git clone --branch v2.13.6 --depth 1 https://github.com/pybind/pybind11.git opensfm\src\third_party\pybind11

REM --- 6a. 各サブディレクトリ CMakeLists.txt の pybind11 ターゲット名修正 ---
REM      target_link_libraries 内の "pybind11" を "pybind11::pybind11" に置換
REM      add_subdirectory(third_party/pybind11) や pybind11_add_module は変更しない
"%PYTHON_EXE%" -c "import pathlib; dirs=['foundation','bundle','dense','features','geo','geometry','robust','sfm','map']; [p.write_text(p.read_text(encoding='utf-8').replace('    pybind11\n','    pybind11::pybind11\n').replace(' pybind11)','  pybind11::pybind11)'),encoding='utf-8') for d in dirs for p in [pathlib.Path(f'opensfm/src/{d}/CMakeLists.txt')] if p.exists()]"

REM --- 6b. トップレベル CMakeLists.txt: Ceres ターゲット判定とインクルードパス修正 ---
REM      Ceres 2.x では CERES_INCLUDE_DIRS が未設定のため
REM      Ceres::ceres ターゲットから INTERFACE_INCLUDE_DIRECTORIES を取得しグローバル設定
"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path('opensfm/src/CMakeLists.txt'); t=p.read_text(encoding='utf-8'); old_block='if(Ceres_ceres_FOUND)\n    set(CERES_LIBRARIES Ceres::ceres)\nelse()\n    set(CERES_LIBRARIES ceres)\nendif()'; new_block='if(TARGET Ceres::ceres)\n  set(CERES_LIBRARIES Ceres::ceres)\n  get_target_property(_ceres_inc Ceres::ceres INTERFACE_INCLUDE_DIRECTORIES)\n  if(_ceres_inc)\n    include_directories(${_ceres_inc})\n  endif()\nelse()\n  set(CERES_LIBRARIES ceres)\nendif()'; t=t.replace(old_block,new_block); p.write_text(t,encoding='utf-8')"

REM --- 6c. トップレベル CMakeLists.txt: glog ターゲット判定とレガシー変数復元 ---
REM      vcpkg の glog 0.7.x は glog::glog ターゲットのみを提供し
REM      GLOG_LIBRARY / GLOG_INCLUDE_DIR 変数を設定しない
REM      また GLOG_USE_GLOG_EXPORT の定義が必要(glog 0.7.x の要件)
REM      サブディレクトリの多くは glog::glog を直接リンクせず
REM      GLOG_INCLUDE_DIR でヘッダのみ参照するため定義が伝播しない
REM      グローバルに add_compile_definitions で対処する
"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path('opensfm/src/CMakeLists.txt'); t=p.read_text(encoding='utf-8'); old='find_package(Glog REQUIRED)'; new='find_package(glog QUIET CONFIG)\nif(TARGET glog::glog)\n  set(GLOG_LIBRARIES glog::glog)\n  set(GLOG_LIBRARY glog::glog)\n  get_target_property(GLOG_INCLUDE_DIR glog::glog INTERFACE_INCLUDE_DIRECTORIES)\n  if(NOT GLOG_INCLUDE_DIR)\n    set(GLOG_INCLUDE_DIR \"\")\n  endif()\n  set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR})\n  add_compile_definitions(GLOG_USE_GLOG_EXPORT)\nelse()\n  find_package(Glog REQUIRED)\nendif()'; t=t.replace(old,new); p.write_text(t,encoding='utf-8')"

REM --- 7. CMakeLists.txt: cmake_minimum_required を 3.15 に更新(CMake 4.x 対応)---
"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path('opensfm/src/CMakeLists.txt'); t=p.read_text(encoding='utf-8'); t=t.replace('cmake_minimum_required(VERSION 3.0)','cmake_minimum_required(VERSION 3.15)'); p.write_text(t,encoding='utf-8')"

REM --- 8. C++ 標準を C++17 に更新 ---
"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path('opensfm/src/CMakeLists.txt'); t=p.read_text(encoding='utf-8'); t=t.replace('set(CMAKE_CXX_STANDARD 14)','set(CMAKE_CXX_STANDARD 17)'); p.write_text(t,encoding='utf-8')"

REM --- 9. CMake 構成 ---
REM      OPENSFM_BUILD_TESTS=OFF: 同梱の gtest が古く std::tr1 を使用しており
REM      C++17 + Visual Studio 2026 ではコンパイルできないため無効化する
REM      テストは Python 拡張モジュールのビルドに不要である
if exist mybuild rmdir /s /q mybuild
mkdir mybuild
cd mybuild
cmake ..\opensfm\src -G "Visual Studio 18 2026" -A x64 -T v143 -DPYTHON_EXECUTABLE="%PYTHON_EXE%" -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-cuda-vs2022 -DCMAKE_CUDA_HOST_COMPILER="C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe" -DOPENSFM_BUILD_TESTS=OFF
REM cmake ..\opensfm\src -G "Visual Studio 18 2026" -A x64 -DPYTHON_EXECUTABLE="%PYTHON_EXE%" -DVCPKG_TARGET_TRIPLET=x64-windows -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -DOPENSFM_BUILD_TESTS=OFF



REM --- 10. ビルド ---
cmake --build . --config Release
cd /d "%INSTALL_DIR%"

"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path(r'opensfm\exif.py'); t=p.read_text(encoding='utf-8'); t=t.replace('            if np.all(ypr) is not None:\n','            if all(v is not None for v in ypr):\n'); p.write_text(t,encoding='utf-8')"

"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path(r'opensfm\dataset.py'); t=p.read_text(encoding='utf-8'); t=t.replace('                \"numpy.core.multiarray.scalar\": np.core.multiarray,\n','                \"numpy.core.multiarray.scalar\": np.core.multiarray,\n                \"numpy._core.multiarray._reconstruct\": np.core.multiarray,\n                \"numpy._core.multiarray.scalar\": np.core.multiarray,\n'); p.write_text(t,encoding='utf-8')"

"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path(r'opensfm\stats.py'); t=p.read_text(encoding='utf-8'); t=t.replace('            aspect=40,\n        )','            aspect=40,\n            ax=plt.gca(),\n        )'); p.write_text(t,encoding='utf-8')"

"%PYTHON_EXE%" -c "import pathlib; p=pathlib.Path(r'opensfm\stats.py'); t=p.read_text(encoding='utf-8'); t=t.replace('    plt.colorbar(\n        sm,\n        orientation=\"horizontal\",\n        label=\"Number of matches between images\",\n        pad=0.0,\n    )','    plt.colorbar(\n        sm,\n        orientation=\"horizontal\",\n        label=\"Number of matches between images\",\n        pad=0.0,\n        ax=plt.gca(),\n    )'); p.write_text(t,encoding='utf-8')"

REM --- 11. .pyd ファイルの配置確認 ---
dir opensfm\*.pyd >nul 2>&1
if not "%ERRORLEVEL%"=="0" (for /r build %f in (*.pyd) do copy "%f" opensfm\)

REM --- 12. 動作確認 ---
"%PYTHON_EXE%" -c "import opensfm; print('OpenSfM import OK')"

REM ============================================================
echo  ビルド完了
REM ============================================================

echo -----------------------------------------
echo テストコード
set INSTALL_DIR=c:\ind-bermuda-opensfm
set "PYTHON_EXE=C:\Program Files\Python312\python.exe"

REM ============================================================
REM テスト A: 付属 berlin データによるビルド検証
REM ============================================================
cd /d "%INSTALL_DIR%"

"C:\Program Files\Python312\python.exe" bin\opensfm_main.py extract_metadata data\berlin
"C:\Program Files\Python312\python.exe" bin\opensfm_main.py detect_features data\berlin
"C:\Program Files\Python312\python.exe" bin\opensfm_main.py match_features data\berlin
"C:\Program Files\Python312\python.exe" bin\opensfm_main.py create_tracks data\berlin
"C:\Program Files\Python312\python.exe" bin\opensfm_main.py reconstruct data\berlin
"C:\Program Files\Python312\python.exe" bin\opensfm_main.py mesh data\berlin


REM --- A-結果1: サマリ表示 ---
"%PYTHON_EXE%" -c "import json; d=json.load(open('data/berlin/reconstruction.json', encoding='utf-8')); r=d[0]; print('cameras:', len(r.get('cameras', {})), 'shots:', len(r.get('shots', {})), 'points:', len(r.get('points', {})))"

REM --- A-結果2: PLY エクスポート ---
"%PYTHON_EXE%" bin\opensfm_main.py export_ply data\berlin

REM --- A-結果3: 統計画像とPDFレポートの生成 ---
"%PYTHON_EXE%" bin\opensfm_main.py compute_statistics data\berlin
"%PYTHON_EXE%" bin\opensfm_main.py export_report data\berlin

REM --- A-結果4: 画像とPDFを表示 ---
for %f in ("%INSTALL_DIR%\data\berlin\stats\*.png") do start "" "%f"
start "" "%INSTALL_DIR%\data\berlin\stats\report.pdf"

set "INSTALL_DIR=C:\ind-bermuda-opensfm"
set "PYTHON_EXE=C:\Program Files\Python312\python.exe"
set "PLY_IN=%INSTALL_DIR%\data\berlin\reconstruction.ply"
set "PLY_OUT=%INSTALL_DIR%\data\berlin\reconstruction_mesh.ply"

"%PYTHON_EXE%" -m pip install open3d
"%PYTHON_EXE%" -c "import open3d as o3d; pcd=o3d.io.read_point_cloud(r'%PLY_IN%'); pcd.estimate_normals(); mesh,d=o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9); o3d.io.write_triangle_mesh(r'%PLY_OUT%', mesh); print(r'%PLY_OUT%')"


REM ============================================================
REM テスト B: 360度画像(equirectangular)テスト
REM ============================================================
cd /d "%INSTALL_DIR%"
set DATASET_360=data\lg360
set DROPBOX_URL=https://www.dropbox.com/sh/3vabbmrhqqbagp5/AABi14O2tWMbxAX91jaaQY77a?dl=1

REM --- B1. Dropbox から360度サンプルデータをダウンロード ---
powershell -Command "Invoke-WebRequest -Uri '%DROPBOX_URL%' -OutFile '%INSTALL_DIR%\lg360.zip'"
powershell -Command "Expand-Archive -Path '%INSTALL_DIR%\lg360.zip' -DestinationPath '%INSTALL_DIR%\lg360_tmp' -Force"
if not exist "%DATASET_360%" mkdir "%DATASET_360%"
if not exist "%DATASET_360%\images" mkdir "%DATASET_360%\images"
copy /y "%INSTALL_DIR%\lg360_tmp\*.jpg" "%DATASET_360%\images\"
for /d %d in ("%INSTALL_DIR%\lg360_tmp\*") do copy "%d\*.jpg" "%DATASET_360%\images\"
del "%INSTALL_DIR%\lg360.zip"
rmdir /s /q "%INSTALL_DIR%\lg360_tmp"

REM --- B2. camera_models_overrides.json を配置 ---
copy sample\camera_models_overrides.json "%DATASET_360%\"

REM --- B3. config.yaml を配置 ---
copy sample\config.yaml "%DATASET_360%\"

REM --- B4. SfM パイプライン実行 ---
"%PYTHON_EXE%" bin\opensfm_main.py extract_metadata %DATASET_360%
"%PYTHON_EXE%" bin\opensfm_main.py detect_features %DATASET_360%
"%PYTHON_EXE%" bin\opensfm_main.py match_features %DATASET_360%
"%PYTHON_EXE%" bin\opensfm_main.py create_tracks %DATASET_360%
"%PYTHON_EXE%" bin\opensfm_main.py reconstruct %DATASET_360%

REM --- B-結果1: サマリ表示 ---
"%PYTHON_EXE%" -c "import json; d=json.load(open('data/lg360/reconstruction.json', encoding='utf-8')); r=d[0]; print('cameras:', len(r.get('cameras', {})), 'shots:', len(r.get('shots', {})), 'points:', len(r.get('points', {})))"

REM --- B-結果2: PLY エクスポート ---
"%PYTHON_EXE%" bin\opensfm_main.py export_ply %DATASET_360%

REM --- B-結果3: 統計画像とPDFレポートの生成 ---
"%PYTHON_EXE%" bin\opensfm_main.py compute_statistics %DATASET_360%
"%PYTHON_EXE%" bin\opensfm_main.py export_report %DATASET_360%

REM --- B-結果4: 画像とPDFを表示 ---
for %f in ("%INSTALL_DIR%\%DATASET_360%\stats\*.png") do start "" "%f"
start "" "%INSTALL_DIR%\%DATASET_360%\stats\report.pdf"

REM --- 補足: 3Dポイントクラウドの詳細表示 ---
REM reconstruction.ply を MeshLab 等で開くと3D表示が可能
REM berlin: %INSTALL_DIR%\data\berlin\reconstruction.ply
REM lg360:  %INSTALL_DIR%\data\lg360\reconstruction.ply

echo -------------------------
REM OpenMVS, 「カメラ位置」と「疎な点群」から「密な点群」→「メッシュ」→「テクスチャ」を生成

REM VS2022同等の環境をVS2026内に追加
cd /d %TEMP%
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" --add Microsoft.VisualStudio.Component.VC.14.43.17.13.x86.x64 --passive --norestart
python -m pip install -U --no-user pip setuptools wheel ninja pybind11
for /f "usebackq delims=" %i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -products * -latest -property installationPath`) do "%i\VC\Auxiliary\Build\vcvarsall.bat" amd64 -vcvars_ver=14.43.34808

REM vcpkg のセットアップ
set "VCPKG_ROOT=C:\vcpkg"
setx VCPKG_ROOT "C:\vcpkg" /M
if exist "C:\vcpkg\.git" (cd /d C:\vcpkg && git pull --recurse-submodules) else (git clone https://github.com/microsoft/vcpkg.git C:\vcpkg)
if exist "C:\vcpkg\vcpkg.exe" (echo vcpkg already bootstrapped. Skipping.) else (C:\vcpkg\bootstrap-vcpkg.bat)
REM x64-windows-cuda-vs2022 に関する vcpkg の設定
copy C:\vcpkg\triplets\x64-windows.cmake C:\vcpkg\triplets\community\x64-windows-cuda-vs2022.cmake
echo set(VCPKG_CMAKE_CONFIGURE_OPTIONS "-DCMAKE_CUDA_HOST_COMPILER=C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe") >> C:\vcpkg\triplets\community\x64-windows-cuda-vs2022.cmake

REM openMVS
cd C:\
if exist "C:\openMVS\.git" (cd /d C:\openMVS && git pull --recurse-submodules) else (git clone --recurse-submodules https://github.com/cdcseacave/openMVS.git C:\openMVS)
REM CUDA を使用しているかチェック
findstr /s /i CUDA C:\openMVS\CMakeLists.txt C:\openMVS\cmake\*.cmake
cd openMVS
if exist mybuild rmdir /s /q mybuild
mkdir mybuild
cd mybuild
cmake .. -T v143 -DCMAKE_GENERATOR_INSTANCE="C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" v143 -DPYTHON_EXECUTABLE="%PYTHON_EXE%" -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-cuda-vs2022 -DCMAKE_CUDA_HOST_COMPILER="C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe"

REM
cd C:\openMVS\mybuild
REM 全ソースファイルをBOM付きUTF-8に一括変換(エンコーディング問題の防止のため)
powershell -NoProfile -Command "Get-ChildItem -Recurse C:\openMVS\libs,C:\openMVS\apps -Include *.cpp,*.h,*.hpp,*.inl | ForEach-Object { $c=[System.IO.File]::ReadAllText($_.FullName,[System.Text.Encoding]::UTF8); [System.IO.File]::WriteAllText($_.FullName,$c,[System.Text.UTF8Encoding]::new($true)) }"
cmake --build . --config Release -j4
cmake --install . --prefix C:/openMVS
REM
powershell -NoProfile -Command "$p='C:\openMVS\bin'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\")){[Environment]::SetEnvironmentVariable('Path',\"$c;$p\",'Machine')}"

echo ----------------------
REM OpenMVG, OpenMVG(Open Multiple View Geometry)は、画像群から3D構造を復元するためのオープンソースライブラリです。主にSfM(Structure from Motion)パイプラインを提供し、特徴点検出・マッチング、カメラ姿勢推定、疎な3D点群の生成を行います。出力をOpenMVSやMeshroomなどに渡すことで、密な点群やメッシュの生成に繋げられます。C++製で、研究・産業の両方で利用されています。
REM 依存: CMake, Git, Visual Studio (C++ワークロード)

REM openMVG
REM openMVG
cd C:\
if exist "C:\openMVG\.git" (cd /d C:\openMVG && git pull --recurse-submodules) else (git clone --recursive https://github.com/openMVG/openMVG.git C:\openMVG)
cd openMVG
if exist mybuild rmdir /s /q mybuild
mkdir mybuild
cd mybuild
cmake -G "Visual Studio 18 2026" -A x64 ^
  -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ^
  -DEIGEN_INCLUDE_DIR_HINTS=C:/openMVG/src/third_party/eigen ^
  -DOSI_INCLUDE_DIR_HINTS=C:/openMVG/src/third_party/osi_clp/osi ^
  -DCLP_INCLUDE_DIR_HINTS=C:/openMVG/src/third_party/osi_clp/clp ^
  -DCOINUTILS_INCLUDE_DIR_HINTS=C:/openMVG/src/third_party/osi_clp/CoinUtils ^
  ..\src
cmake --build . --config Release

echo -------------------------------

REM === AliceVision ビルドスクリプト ===
REM C:\vcpkg                              — 共有 vcpkg(他プロジェクトと共用)
REM C:\AliceVision_source                 — ソースコード
REM C:\AliceVision_source\vcpkg_installed — 依存関係(cmake が自動作成,プロジェクトローカル)
REM C:\AliceVision_source\mybuild         — ビルド成果物
REM C:\AliceVision                        — インストール先
set "VCPKG_ROOT=C:\vcpkg"
REM 【非標準】setx /M はシステム環境変数を永続的に変更する(標準では set による一時設定のみで十分な場合が多い)
REM 管理者権限が必要であり,反映は新しいプロセスからとなるため,直前の set と併用している

REM VS2022同等の環境をVS2026内に追加
cd /d %TEMP%
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" --add Microsoft.VisualStudio.Component.VC.14.43.17.13.x86.x64 --passive --norestart
python -m pip install -U --no-user pip setuptools wheel ninja pybind11
for /f "usebackq delims=" %i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -products * -latest -property installationPath`) do "%i\VC\Auxiliary\Build\vcvarsall.bat" amd64 -vcvars_ver=14.43.34808

REM vcpkg のセットアップ
set "VCPKG_ROOT=C:\vcpkg"
setx VCPKG_ROOT "C:\vcpkg" /M
if exist "C:\vcpkg\.git" (cd /d C:\vcpkg && git pull --recurse-submodules) else (git clone https://github.com/microsoft/vcpkg.git C:\vcpkg)
if exist "C:\vcpkg\vcpkg.exe" (echo vcpkg already bootstrapped. Skipping.) else (C:\vcpkg\bootstrap-vcpkg.bat)
REM x64-windows-cuda-vs2022 に関する vcpkg の設定
copy C:\vcpkg\triplets\x64-windows.cmake C:\vcpkg\triplets\community\x64-windows-cuda-vs2022.cmake
echo set(VCPKG_CMAKE_CONFIGURE_OPTIONS "-DCMAKE_CUDA_HOST_COMPILER=C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe") >> C:\vcpkg\triplets\community\x64-windows-cuda-vs2022.cmake

cd C:\
REM 【非標準】git checkout vcpkg.json は,後続の powershell コマンドで vcpkg.json を書き換えるため,
REM git pull 前にローカル変更を破棄してコンフリクトを防止する目的である
if exist "C:\AliceVision_source\.git" (cd /d C:\AliceVision_source && git checkout vcpkg.json && git pull --recurse-submodules) else (git clone --recursive https://github.com/alicevision/AliceVision.git C:\AliceVision_source)
REM OpenCV の CUDA フィーチャーを除外する(OpenCV CUDA ビルドが vcpkg の構成検証で失敗するため)
REM AliceVision 本体の CUDA 機能(PopSift,デプスマップ計算等)には影響しない
REM 【非標準】上流の vcpkg.json を powershell で直接書き換えている(標準では vcpkg.json の編集は手動で行うか,
REM オーバーレイやカスタムトリプレットで対応する)
REM OpenCV の CUDA フィーチャーが vcpkg のビルド検証で失敗する問題への回避策である
powershell -Command "(Get-Content C:\AliceVision_source\vcpkg.json -Raw) -replace '\"eigen\", \"contrib\", \"nonfree\", \"cuda\", \"dnn\"', '\"eigen\", \"contrib\", \"nonfree\", \"dnn\"' | Set-Content C:\AliceVision_source\vcpkg.json"
REM liblemon の portfile を git clone + CMake直接修正方式に書き換える(lemon.cs.elte.hu がダウン中のため)
REM 【非標準】オーバーレイポートの portfile.cmake を python ワンライナーで丸ごと上書きしている
REM 標準では portfile.cmake をファイルとして直接編集するが,本スクリプトでは単一バッチファイルで
REM 完結させるためにインラインで生成している
REM liblemon 公式サイト(lemon.cs.elte.hu)のダウンロードサーバが停止しているため,
REM 取得先を GitHub(alicevision/lemon)に差し替え,さらに CMP0048 ポリシーエラーを回避する
REM CMakeLists.txt パッチを portfile 内で適用している
python -c "open(r'C:\AliceVision_source\vcpkg\overlay_ports\liblemon\portfile.cmake','w',newline='\n').write('vcpkg_check_linkage(ONLY_STATIC_LIBRARY)\n\nset(SOURCE_PATH \"${CURRENT_BUILDTREES_DIR}/src/lemon-github\")\nfile(REMOVE_RECURSE \"${SOURCE_PATH}\")\nfind_program(GIT git REQUIRED)\nexecute_process(\n    COMMAND \"${GIT}\" clone --depth 1 https://github.com/alicevision/lemon.git \"${SOURCE_PATH}\"\n    RESULT_VARIABLE GIT_RESULT\n)\nif(NOT GIT_RESULT EQUAL 0)\n    message(FATAL_ERROR \"Failed to clone alicevision/lemon from GitHub\")\nendif()\n\n# Fix CMP0048 policy error for modern CMake\nfile(READ \"${SOURCE_PATH}/CMakeLists.txt\" _contents)\nstring(REPLACE \"CMAKE_POLICY(SET CMP0048 OLD)\\n\" \"\" _contents \"${_contents}\")\nstring(REPLACE \"CMAKE_POLICY(SET CMP0048 OLD)\" \"\" _contents \"${_contents}\")\nstring(REGEX REPLACE \"cmake_minimum_required\\\\(VERSION [0-9.]+\" \"cmake_minimum_required(VERSION 3.10\" _contents \"${_contents}\")\nstring(REPLACE \"PROJECT(${PROJECT_NAME})\" \"project(${PROJECT_NAME} VERSION 1.3.1)\" _contents \"${_contents}\")\nfile(WRITE \"${SOURCE_PATH}/CMakeLists.txt\" \"${_contents}\")\n\nvcpkg_cmake_configure(\n    SOURCE_PATH \"${SOURCE_PATH}\"\n    OPTIONS\n        -DLEMON_ENABLE_GLPK=OFF\n        -DLEMON_ENABLE_ILOG=OFF\n        -DLEMON_ENABLE_COIN=OFF\n        -DLEMON_ENABLE_SOPLEX=OFF\n)\nvcpkg_cmake_install()\nvcpkg_cmake_config_fixup(CONFIG_PATH share/lemon/cmake PACKAGE_NAME lemon)\nvcpkg_fixup_pkgconfig()\nfile(GLOB EXE \"${CURRENT_PACKAGES_DIR}/bin/*.exe\")\nif(EXE)\n    file(COPY ${EXE} DESTINATION \"${CURRENT_PACKAGES_DIR}/tools/liblemon/\")\n    vcpkg_copy_tool_dependencies(\"${CURRENT_PACKAGES_DIR}/tools/liblemon\")\nendif()\nfile(REMOVE_RECURSE \"${CURRENT_PACKAGES_DIR}/debug/include\")\nfile(REMOVE_RECURSE \"${CURRENT_PACKAGES_DIR}/debug/share\")\nfile(REMOVE_RECURSE \"${CURRENT_PACKAGES_DIR}/bin\" \"${CURRENT_PACKAGES_DIR}/debug/bin\")\nfile(REMOVE_RECURSE \"${CURRENT_PACKAGES_DIR}/share/doc\")\nvcpkg_install_copyright(FILE_LIST \"${SOURCE_PATH}/LICENSE\")\n')"
REM liblemon のビルドキャッシュを削除(前回の失敗キャッシュが残っている場合のため)
REM 【非標準】vcpkg のビルドキャッシュを手動で削除している(標準では vcpkg remove またはクリーンビルドで対処する)
REM portfile を差し替えているため,前回の失敗キャッシュや古いパッケージが残っているとビルドが失敗する
if exist "C:\vcpkg\buildtrees\liblemon" rmdir /s /q "C:\vcpkg\buildtrees\liblemon"
if exist "C:\vcpkg\packages\liblemon_x64-windows-release" rmdir /s /q "C:\vcpkg\packages\liblemon_x64-windows-release"
REM 【非標準】--x-manifest-root で明示的にマニフェストルートを指定している(標準ではマニフェストディレクトリ内で
REM vcpkg install を実行すれば自動検出される)
REM 本スクリプトではカレントディレクトリがソースルートと一致しない場合があるため明示的に指定している
%VCPKG_ROOT%\vcpkg.exe install --triplet=x64-windows-cuda-vs2022 --host-triplet=x64-windows-cuda-vs2022 --x-manifest-root=C:\AliceVision_source
cd /d C:\AliceVision_source
REM 【非標準】ビルドディレクトリを毎回削除して再作成している(標準ではインクリメンタルビルドを活用し,
REM 必要な場合のみクリーンビルドを行う)
REM 依存関係やオプション変更時のキャッシュ不整合を防止する目的である
if exist mybuild rmdir /s /q mybuild
mkdir mybuild
cd mybuild
REM 【非標準】-DCMAKE_BUILD_TYPE=Release は Visual Studio ジェネレータ使用時には効果がない
REM (マルチコンフィギュレーションジェネレータではビルド時に --config で指定する)
REM 実害はないが,冗長な指定である
REM 【非標準】-DTARGET_ARCHITECTURE=core は AliceVision 固有のオプションで,SSE/AVX 等の
REM CPU 固有命令を使わず汎用的なバイナリを生成する設定である(標準では auto や native を使用する場合が多い)
cmake -G "Visual Studio 18 2026" -A x64 -T v143 ^
  -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-cuda-vs2022 -DCMAKE_CUDA_HOST_COMPILER="C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe" ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DBUILD_SHARED_LIBS=ON ^
  -DTARGET_ARCHITECTURE=core ^
  -DCMAKE_INSTALL_PREFIX=C:/AliceVision ^
  -DALICEVISION_USE_CUDA=ON ^
  ..
cmake --build . --config Release --target INSTALL -- /m
REM 【非標準】BUNDLE ターゲットは AliceVision 固有のカスタムターゲットで,
REM 実行に必要な DLL 等をインストール先にまとめてコピーする(CMake 標準には存在しないターゲットである)
cmake --build . --config Release --target BUNDLE

echo -------------------------
REM torchmcubes と TripoSR のインストール

REM VS2022同等の環境をVS2026内に追加
cd /d %TEMP%
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" --add Microsoft.VisualStudio.Component.VC.14.43.17.13.x86.x64 --passive --norestart
python -m pip install -U --no-user pip setuptools wheel
for /f "usebackq delims=" %i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -products * -latest -property installationPath`) do "%i\VC\Auxiliary\Build\vcvarsall.bat" amd64 -vcvars_ver=14.43.34808

REM numpy と PyTorch(CUDA 12.8 対応 wheel)、pip キャッシュを全削除
set "CUDA_TAG=cu128"
pip install -U --no-user numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo numpy / PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user scipy pillow pandas
pip uninstall -y opencv-python-headless opencv-contrib-python-headless opencv-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv系パッケージのアンインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip install -U --no-user --force-reinstall opencv-contrib-python
if not "%ERRORLEVEL%"=="0" ( color 0c & echo opencv-contrib-python の再インストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
pip cache purge


REM torchmcubes のインストール(tripoSR の前提)
where cl
cl /Bv
where nvcc
set "CC=cl"
set "CXX=cl"
set "CMAKE_GENERATOR=Ninja"
set "TORCH_CUDA_ARCH_LIST=7.5 8.0 8.6 8.9 9.0"
set "CUDAFLAGS=-Xcompiler=/permissive-"
python -c "import torch; print(torch.__version__); print(torch.version.cuda)"
python -m pip install --no-build-isolation --no-cache-dir git+https://github.com/tatsy/torchmcubes.git

REM インストール開始
REM ===== リポジトリをクローン =====
cd /d c:\
rmdir /s /q TripoSR
git clone https://github.com/VAST-AI-Research/TripoSR.git
cd TripoSR

REM ===== 2. requirements.txt の修正 =====
powershell -Command "(Get-Content requirements.txt) -replace 'transformers==4.35.0', 'transformers' | Set-Content requirements.txt"

REM ===== 3. コンパイラを指定してインストール =====
REM 依存関係のインストール
pip install -U --no-user -r requirements.txt

echo material.mtl
(echo newmtl material0
echo Ka 1.0 1.0 1.0
echo Kd 1.0 1.0 1.0
echo map_Kd texture.png) > C:\image\material.mtl

echo -----------------------------------------------
REM TripoSR のテスト
---

## 単一カラー画像から色付きポリゴンメッシュを再構成する手順
**Windows コマンドプロンプト完全ガイド(2026年版)**

### 1. 推奨ツール: TripoSR
TripoSR は Stability AI と Tripo AI が共同開発した、単一画像から色付き3Dメッシュを直接生成するモデルです。LRMアーキテクチャをベースに、約0.5秒での高速生成を実現しています。

| 項目 | TripoSR | 従来パイプライン (Open3D等) |
| :--- | :--- | :--- |
| **工程** | 画像 → メッシュ (1ステップ) | 画像 → 点群 → 法線推定 → Poisson再構成 |
| **実行** | `python run.py image.jpg` | 多段スクリプト |
| **出力** | OBJ / GLB (テクスチャ対応) | PLY / OBJ (頂点カラーのみ) |
| **速度** | 約0.5秒 (A100) / 数秒 (民生GPU) | 数十秒〜数分 |
| **ライセンス** | MIT (商用利用可) | ツールにより異なる |

### 3. 実行コマンド

#### 3-1. 基本実行(頂点カラー付きメッシュ)
python run.py examples/chair.png --output-dir output/


#### 3-2. テクスチャベイク付き(推奨)
UV展開され、テクスチャ画像が生成されます。
python run.py examples/chair.png --output-dir output/ --bake-texture --texture-resolution 2048
```
* **出力**: `output\0\mesh.obj` (UV付き), `output\0\texture.png`

#### 3-3. 高解像度メッシュ設定
```cmd
python run.py C:\photos\input.jpg --output-dir output\ --bake-texture --mc-resolution 256
```
* `--mc-resolution`: Marching Cubesの解像度。デフォルトは256。

#### 3-4. 背景除去の制御
* `--no-remove-bg`: 背景が既に単色(グレー等)の場合に使用。
* `--foreground-ratio`: 前景の占める割合(デフォルト 0.85)。

---

### 4. Blender による自動フォーマット変換(OBJ → GLB/FBX)
Blender 4.4 の Python API を使用した一括変換コマンドです。

**OBJ → GLB (Web/AR用)**
```cmd
"C:\Program Files\Blender Foundation\Blender 4.4\blender.exe" ^
    --background --python-expr ^
    "import bpy; bpy.ops.wm.read_factory_settings(use_empty=True); bpy.ops.wm.obj_import(filepath=r'output\0\mesh.obj'); bpy.ops.export_scene.gltf(filepath=r'output\0\mesh.glb', export_format='GLB')"
```

**OBJ → FBX (ゲームエンジン用)**
```cmd
"C:\Program Files\Blender Foundation\Blender 4.4\blender.exe" ^
    --background --python-expr ^
    "import bpy; bpy.ops.wm.read_factory_settings(use_empty=True); bpy.ops.wm.obj_import(filepath=r'output\0\mesh.obj'); bpy.ops.export_scene.fbx(filepath=r'output\0\mesh.fbx')"
```

---

### 5. トラブルシューティング

* **「Repository not found」エラーが出る**
    * **原因**: `git clone` のURLと `cd` コマンドが繋がっています。
    * **解決**: コマンドを2回に分けて実行するか、`git clone  && cd TripoSR` のように `&&` で繋いでください。
* **「torchmcubes was not compiled with CUDA support」**
    * **原因**: `torchmcubes` がCPU版としてインストールされています。
    * **解決**: 上記「手順2」の通り、`pip install git+...` を実行してソースからビルドし直してください(要:Visual Studio Build Tools)。
* **VRAM不足 (OOM)**
    * **解決**: `--tsr-chunk-size 4096` または `2048` を引数に追加してメモリ消費を抑えてください。

5-4. 背景除去を無効化(背景が既にグレーの場合)
cmdpython run.py C:\photos\my_photo.jpg --output-dir output\ --no-remove-bg
デフォルトでは背景が自動除去される(rembg使用)。入力画像が既に前景のみの場合はこのオプションを使用。
5-5. 複数画像を一括処理
cmdpython run.py C:\photos\img1.jpg C:\photos\img2.jpg C:\photos\img3.jpg --output-dir output\ --bake-texture
各画像に対して output\0\, output\1\, output\2\ にそれぞれメッシュが出力される。

6. 出力ファイル
ファイル説明mesh.objポリゴンメッシュ(--bake-textureなし: 頂点カラー / あり: UV+テクスチャ参照)texture.pngテクスチャ画像(--bake-texture 使用時のみ)input.png前処理済みの入力画像

7. MeshLab での確認・後処理(任意)
cmdREM MeshLab のインストール
winget install -e --id CNRS.MeshLab

REM メッシュを開いて確認
"C:\Program Files\VCG\MeshLab\meshlab.exe" output\0\mesh.obj

8. Blender でのフォーマット変換(任意)
cmdREM Blender のインストール
winget install -e --id BlenderFoundation.Blender

REM OBJ → GLB (glTF) 変換
"C:\Program Files\Blender Foundation\Blender 4.4\blender.exe" ^
    --background --python-expr ^
    "import bpy; bpy.ops.wm.read_factory_settings(use_empty=True); bpy.ops.wm.obj_import(filepath=r'output\0\mesh.obj'); bpy.ops.export_scene.gltf(filepath=r'output\0\mesh.glb', export_format='GLB')"

REM OBJ → FBX 変換
"C:\Program Files\Blender Foundation\Blender 4.4\blender.exe" ^
    --background --python-expr ^
    "import bpy; bpy.ops.wm.read_factory_settings(use_empty=True); bpy.ops.wm.obj_import(filepath=r'output\0\mesh.obj'); bpy.ops.export_scene.fbx(filepath=r'output\0\mesh.fbx')"

9. パラメータ一覧
パラメータデフォルト説明--output-diroutput/出力ディレクトリ--bake-textureoffテクスチャベイクを有効化(UV展開 + texture.png 出力)--texture-resolution1024テクスチャ解像度(ピクセル)。2048推奨--mc-resolution256Marching Cubes 解像度。高いほど詳細--no-remove-bgoff背景自動除去を無効化--foreground-ratio0.85前景のサイズ比率(背景除去時)--chunk-size8192メッシュ抽出のチャンクサイズ。VRAM不足時は小さくする--modelstabilityai/TripoSRモデルID(HuggingFace)またはローカルパス

10. 使用ツール一覧
ツール役割インストールTripoSR単一画像→色付きメッシュ直接生成git clone + pip install -r requirements.txtMeshLabメッシュ確認・後処理(任意)winget install -e --id CNRS.MeshLabBlenderフォーマット変換(任意)winget install -e --id BlenderFoundation.Blender

11. トラブルシューティング
torchmcubes was not compiled with CUDA support
→ ローカルのCUDAバージョンとPyTorchのCUDAバージョンが一致していない。以下を実行:
cmdpip uninstall torchmcubes -y
pip install git+https://github.com/tatsy/torchmcubes.git
VRAM不足
→ --chunk-size を小さくする(例: 4096, 2048)。--mc-resolution を下げる(例: 128)。
背景が除去されない / 不正に除去される
→ 入力画像の背景をあらかじめ除去し、グレー背景にした上で --no-remove-bg を使用する。
モデルのダウンロードが遅い
→ HuggingFace からモデルを手動ダウンロードし、--model でローカルパスを指定する。

12. 補足: さらに高品質を求める場合
TripoSRより高品質な3Dメッシュが必要な場合、以下のツールも選択肢に入る。ただしWindowsへのインストールは複雑になる。
ツール品質特徴Windows対応VRAMTRELLIS.2 (Microsoft)最高PBRテクスチャ、4Bパラメータ、MITコミュニティfork/ComfyUI経由16GB+SAM 3D Objects (Meta)高シーン内の複数物体を個別に再構成要調査16GB+InstantMesh (Tencent)高マルチビュー拡散+LRM、10秒要調査16GB+