日々精進

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

画像分類・物体検出において、背景を物体と認識してしまう問題

画像分類・物体検出のアノテーションは矩形の枠とラベル(人・犬など)で付ける。 なので、人のアノテーションにはどうしても人の後ろの壁など人以外の部分も含まれてしまう。 そうすると、その壁などもモデルは人の一部であると見なして学習してしまう。 その結果、壁だけで人がいない場合でも人と判定してしまう間違いが発生する。

以下の記事では、この対策の一例として「物体の背景を"uninformative"な背景にして学習させる」をあげている。 背景を真っ黒とかにして学習させるということかな?画像から物体のみ切り抜くためには物体の境界を多角形で囲んだアノテーションが必要なのでハードルが高い・・ 背景のみの画像を学習データに追加して、背景は人でないということを学習させる、の方がやりやすそうだが。。

news.mit.edu

Deep Learningでは基本乱数は完全には固定できない(なので全く同じモデルは作ることが難しい)

乱数のseedを固定すれば同じInputに対して、同じ推論結果を返す重みファイルが生成できるはず・・と思っていたが、そうではないらしい。

乱数の固定の仕方は以下参照。

qiita.com

これを設定しても、cuDNNの中の乱数は固定できないらしい。TensorFlowではこの問題の解決策は探した範囲では見付からず。。どうしてもやるならCPUで学習すればよい。でもメッチャ時間かかるからイヤダ・・

stackoverflow.com

qiita.com

PyTorchでは以下の方法でcuDNNの中も固定できるらしい。TensorFlowユーザなので試してないが・・

qiita.com

conda create, removeを繰り返すと.conda_trashファイルが増えていく問題

現象は以下。

  • conda create, conda removeでconda環境の作成・削除を繰り返すとpip3.exe.conda_trash, pip3.exe.conda_trash.conda_trash, ...のように.conda_trashがconda createを実行した回数だけ繰り返すファイルができる
  • これによって超長いファイル名のファイルができ、それが原因でビルドが失敗する

これはwindows環境でのみ発生する。dockerとか使えばこんなことないんだけど、Jenkinsでコンテナを使わずconda環境をビルドしてたら発生してしまった。。

このファイルはconda removeの時に削除できないファイルがあったらできるらしい。削除して問題無いのでrmdirコマンドでフォルダごと削除するようにした。

参考:

stackoverflow.com

Log4jの任意のコードが実行出来る脆弱性の影響範囲

今日知ったLog4jの脆弱性について調べたことを書きます。

脆弱性を修正したPR

github.com

影響範囲

log4j2の影響を受けるバージョンは以下の記事によると、2.0 <= Apache log4j2 <= 2.14.1

www.cyberkendra.com

log4jバージョン1も影響を受けるというコメントあり↓

github.com

脆弱性を修正したPRの修正内容を見ると、ソースコードの修正はlog4j-coreフォルダの下のファイルにのみ入っているので log4j-coreに依存せず、log4j-apiにのみ依存している場合は脆弱性の影響を受けないと思われる。(以下のコメントも同様の見解)

Restrict LDAP access via JNDI by rgoers · Pull Request #608 · apache/logging-log4j2 · GitHub

Spring BootのデフォルトLoggerはlogbackで、これを使っている場合はlog4j-apiへの依存はあるがlog4j-coreへの依存はないので影響なし ※Spring Boot2.1.4で確認したが、他のバージョンでは違うかも知れない。

PyCharmでSSH Interpreterを使っている時に、リモートホスト上でターミナルからinstallしたpackageをPyCharmにダウンロードさせる方法

sshでリモートホストにログインし、pip installでpackageをinstallした後、ライブラリの更新操作をPyCharm上でやるとダウンロードしてくれる。今までInvalidate Cache&Restartを実行して全部のライブラリをダウンロードし直してた。。

やり方は以下参照。

tkkm.tokyo

Pythonで複数の環境で共有したい、けどpipなどのpackageにするほどでもないコードの共有

「複数の環境」と言っているのは、例えば機械学習で言うと前処理、学習、精度検証のようなイメージ。

そういう環境で、ある程度実装も実行環境も分かれているけど一部の実装を共有したい場合どうするか。

pip packageにすると修正したらアップロードとインストールが必要になってめんどくさい。もっと気軽に変更したい。

なので以下のようにcommonフォルダを作って各環境と並列に置くようにした。

mypj/
  common
  preprocess
  train
  eval

前処理を動かしたい場合は以下のようにPYTHONPATHを設定すればよい。

export PYTHONPATH=mpj/preprocess:mpj/common

PyCharmで開発する場合はコンテンツルートにcommonを追加すればコード補完などもやってくれるし実行時には自動的にcommonをPYTHONPATHに追加してくれる。

参考:

pleiades.io