日々精進

新しく学んだことを書き留めていきます

precisionやrecallの値を計算できない場合、どう処理するべきか

precisionやrecallの値をクラス毎に出し、その平均を取りたいという場合、 precisionやrecallの計算式の分母が0になり計算できなかったらどうするか。

precisionやrecallの分母が0ということはPositiveと予測したものの数が0か、LabelがPositiveであるサンプルが0のどちらか。 その場合precisionやrecallを出しても意味が無いのでNoneにすべき。

参考:

stats.stackexchange.com

Pythonのテストコードでglobalな状態を変更しても他のテストの実行結果に影響を与えないようにしたい

Config.PARAM = "1"

のようにstaticな変数にパラメータを保持しているような場合、これを変更するテストコードがあると、そのテストコード以降に実行される別のテストコードがコケることがある。

他のテストに影響を与えないようにしたいので、fixtureを使ってテスト開始時にデフォルトの値に戻すようにした。

例えば、conftest.pyに以下のようにGlobal変数を初期化するglobal fixtureを定義する。

@pytest.fixture(scope="function", autouse=True)
def global_vars_setup():
    GlobalVars.init()

これでもテストを並列実行すると失敗することあるよなぁ。。もっと良い方法ないかな。

参考:

qiita.com

C#(.NET)のBitmapDataクラスを使うと画像データのチャネルがBGRになる

C#からPythonに画像ファイルを渡すとチャネルの並びがBGRになるという現象がおきた。 BitmapDataのデータをByte配列に変換し、先頭の要素の値を確認すると、RGB画像の先頭のピクセルの色の並びと違っていた。つまり、BGRになっていた。

以下のような記事もあるし、.NETの仕様なんだろう。

参考: stackoverflow.com

stackoverflow.com

str([elem])はelemの__repr__を呼び出す

str()でlistをシリアライズしようと思ったときのこと。 各クラスの文字列表現を変更したかったので strを各クラスで実装し、listに詰めてstr(lst)のようにstr()に渡したがstrが呼ばれない。。 調べてみると、str(lst)はlstの各要素のreprを呼ぶらしい。lstはstr()でシリアライズしているのに。。

あと、f-stringで文字列化するときも文字列に埋め込んだ変数のreprが呼ばれるらしい。

しょうが無いのでreprに自前のシリアライズロジックを実装した。

OpenCVでwmvファイルを読み込むと総フレーム数やFPSの値がバグる

get(cv2.CAP_PROP_FPS) や get(cv2.CAP_PROP_FRAME_COUNT) を実行すると1000とかデタラメな数字になる。 総フレーム数/FPSで動画の秒数になるかと思ったが、ならない。

これじゃあwmvをInputにして推論できないじゃん。。 3g2ファイルは大丈夫だった。

参考:

answers.opencv.org