I am Charmie

メモとログ

poetryでバージョンの低いインタプリタを指定できない

Anacondaとpoetryを一度アンインストールしてから再インストールで解決

  1. Anacondaでインストールしたインタプリタを先に参照してしまっていた
    • anaconda-clean でAnacondaをアンインストール
    • ~/.bashrc に書かれているanaconda関係の命令を削除
  2. poetryが自身の動作のために保有している ~/.local/share/pypoetry/venv という専用の仮想環境は、poetryインストール時のインタプリタを参照
    • poetryをアンインストール
    • poetryをインストール

umap-learn on M1 Mac

poetryでインストールに失敗したのでメモ

エラー

以下のようにllvmliteのビルドに失敗する

Note: This error originates from the build backend, and is likely not a problem with poetry but one of the following issues with llvmlite (0.34.0)



  - not supporting PEP 517 builds

  - not specifying PEP 517 build requirements correctly

  - the build requirements are incompatible with your operating system or Python version

  - the build requirements are missing system dependencies (eg: compilers, libraries, headers).



You can verify this by running pip wheel --no-cache-dir --use-pep517 "llvmlite (==0.34.0)".

原因

  • このエラーは、 umap-learn の依存関係である llvmlite のビルドに失敗が原因
  • M1 MacApple Silicon)と古いバージョンのllvmliteの組み合わせで発生しやすい問題

解決策

llvmlitenumba を事前にインストールしてから umap-learn をインストール

poetry add "llvmlite>=0.41.0" "numba>=0.58.0"
poetry add umap-learn

デジタル写真の色補正

目的

  • デジタルカメラで撮影した写真から輝度を復元したい
  • カラーチャートを撮影したRAW画像と被写体を撮影したRAW画像から被写体の輝度を得る
  • デジタル画像作成の過程の変換について調べる
  • カラーチャートの種類・使い方を調べる
  • 色補正のソフトウェアについて調べる

一般的な流れ

  1. カラープロファイルの作成
    • カラーチャートを対象光源下で撮影(RAW画像を取得)
    • 撮影した写真を解析して、実際の色と写真上の色の対応関係を求める
  2. 色補正
    • 被写体を対象光源下で撮影
    • 作成したカラープロファイルを使って色を補正

色補正

  • RAW画像の画素値は輝度を線形変換した値
  • 現実の色とRAW画像の色の関係は3x3のColor Correction Matrix (CCM)で表せる
  • カラーチェッカーを撮影した画像とカラーチェッカーのパターン色からCCMを推定すれば、色を補正できる

カラーチェッカー

カラーチャート+色補正ソフトウェア

会社

  1. X-Rite
  2. Calibrite:
    • X-Riteの後継
    • Amazonで悪評(色が公表値と違う、パッチが不規則に並んでいる、他の紙などが貼り付く)が目立つので避ける
  3. Datacolor
  4. DSC Labs
    • プロ向け
    • ChromaDuMondeは色も豊富なので今後購入する

Datacolor

  1. Datacolor社 SpyderCHECKR 24
    • 7,812円
    • 24色
    • 21 x 15 x 0.4 cm; 160 g
    • ケース付き
  2. Datacolor社 Spyder Checkr
    • 25,300円
    • 48色
    • 32.3 x 18.5 x 4 cm; 500 g
    • ケース付き(三脚装着可能)
  3. Datacolor社 Spyder CHECKR PHOTO
    • 16,940円
    • 24色(カラー)、24色(白黒)
    • 12.21 x 9.75 x 1.34 cm; 100 g

色補正(ソフトウェア)

色補正(自作)

  • 変換の原理がわかれば自作できそう
  • カラーチャートから輝度・画素値の対応関係を求めて、変換パラメータ求めるのかな

参考になりそうなコード

  • rawpy
  • PlantCV色補正機能
    • ちゃんと実装されてそうだし、これが一番かな
  • ColorCorrectionML
    • OpenCVで色補正
      • ML regressionと書いてあるが、単に回帰の方法が数種類)
      • カラーチェッカーのみ?を撮影した学習用画像で回帰
      • 回帰で推定したパラメータを使って色補正
    • カラーチェッカーの検出などは自分でやらないと駄目なのかな

WSL2 (Ubuntu) on Windows 11

WSL2 with USB port enabled

公式

  1. WSL(最新版)をインストール
  2. Linuxをインストール
  3. インストールしたLinuxをWSL2に設定

♯♯ 手順1: WSLのインストール

こっち の方がわかりやすい

  1. PowerShell(管理者): wsl--install
    • WSLを実行し,Ubuntuインストールに必要な機能を有効化
  2. OS再起動

♯♯ 手順2: Linuxのインストール

  1. PowerShell(管理者)なのかコマンドプロンプトなのか謎
    • ユーザ名・パスワードを設定

♯♯ 手順3: WSL2に設定

$ wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
MSRDC バージョン: 1.2.5326
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26091.1-240325-1447.ge-release
Windows バージョン: 10.0.22631.3958

手順3.1 usbipdのインストール

https://github.com/dorssel/usbipd-win/releases

結果

  • RealSenseセンサを認識しないのでSDKをインストール
PS C:\WINDOWS\system32> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-8    5986:9102  BisonCam,NB Pro                                               Not shared
2-14   8087:0aaa  インテル(R) ワイヤレス Bluetooth(R)                           Not shared
3-4    0b95:1790  ASIX USB to Gigabit Ethernet Family Adapter                   Not shared
6-5    2109:8817  USB Billboard Device                                          Not shared
7-1    04d9:a09e  USB 入力デバイス                                              Not shared
7-2    258a:0016  USB 入力デバイス                                              Not shared

Persisted:
GUID                                  DEVICE

手順3.2 Intel® RealSense™ SDK 2.0のインストール

https://github.com/IntelRealSense/librealsense/releases

  1. Intel.RealSense.SDK-WIN10-2.56.1.7154-beta.exe 1. Intel.RealSense.FW.Update.2.56.1-beta.exe

結果

  • Intel RealSense Viewer
    • No frame receivedと表示される
    • 向きは認識している
  • usbipdの実行で以下のようにRealSenseセンサを認識
PS C:\WINDOWS\system32> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-3    8086:0b5c  Intel(R) RealSense(TM) Depth Camera 455  Depth, Intel(R) ...  Not shared
2-8    5986:9102  BisonCam,NB Pro                                               Not shared
2-14   8087:0aaa  インテル(R) ワイヤレス Bluetooth(R)                           Not shared

Persisted:
GUID                                  DEVICE

pytorch-lightning LightningDataModule

ここを読む

  • とりあえず以下のような使い方をする
  • データのダウンロード,Dataset, Dataloaderの扱いをクラス化することで,mainプログラムの可読性を上げるのが目的
    • prepare_data(): データの取得
    • setup(): データ全体をtrain,val,testに分割,Datasetの定義
    • train_dataloader(): Dataloader(train用)を返す
    • val_dataloader(): Dataloader(val用)を返す
    • test_dataloader(): Dataloader(test用)を返す
    • predict_dataloaderc: Dataloader(perdict用)を返す
  • データセットのindexを保存・読み込む機能
import lightning as L
from torch.utils.data import random_split, DataLoader

# Note - you must have torchvision installed for this example
from torchvision.datasets import MNIST
from torchvision import transforms


class MNISTDataModule(L.LightningDataModule):
    def __init__(self, data_dir: str = "./"):
        super().__init__()
        self.data_dir = data_dir
        self.transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])

    def prepare_data(self):
        # download
        MNIST(self.data_dir, train=True, download=True)
        MNIST(self.data_dir, train=False, download=True)

    def setup(self, stage: str):
        # Assign train/val datasets for use in dataloaders
        if stage == "fit":
            mnist_full = MNIST(self.data_dir, train=True, transform=self.transform)
            self.mnist_train, self.mnist_val = random_split(
                mnist_full, [55000, 5000], generator=torch.Generator().manual_seed(42)
            )

        # Assign test dataset for use in dataloader(s)
        if stage == "test":
            self.mnist_test = MNIST(self.data_dir, train=False, transform=self.transform)

        if stage == "predict":
            self.mnist_predict = MNIST(self.data_dir, train=False, transform=self.transform)

    def train_dataloader(self):
        return DataLoader(self.mnist_train, batch_size=32)

    def val_dataloader(self):
        return DataLoader(self.mnist_val, batch_size=32)

    def test_dataloader(self):
        return DataLoader(self.mnist_test, batch_size=32)

    def predict_dataloader(self):
        return DataLoader(self.mnist_predict, batch_size=32)