はじめに
主に画像認識屋に向けて
pythonでのデータファイルの扱い方を
標準的なデータ形式について知ってしまうためのものです。
json
Python のdict型と対応の付けやすい、キーと値の組合せで読み書きできるデータフォーマットです。
json --- JSON エンコーダーとデコーダー
json フォーマットはCVATでのアノテーション結果の標準的なデータ形式に使われています。
アノテーション結果をの場合には、アノテーションファイルに対応したライブラリを使うのがおすすめです。
yaml
PyYAML
CircleCIのconfig.yaml はyaml形式です。
toml
pypi toml
github toml
python のパッケージ管理用のファイルpyproject.toml はtoml形式です。
python 3.11 以降だとlibtomlが標準ライブラリに追加されています。
tomllib --- TOML ファイルの解析
npy
numpy がデータを保存するデータ形式です。
numpyではIEEEのデータフォーマットで数値データを保存できます。
NaN, PosInf, NegInfなどの値を持つことができます。
pickle
pythonオブジェクトをserialize, deserializeできるモジュールです。
学習済みのclassierのインスタンスをserialize, deserializeすることもできます。
そのため、とても危険です。
また、pythonや使用したモジュールのバージョンの影響を受ける点も厄介です。
scikit-learn それ自体には、学習結果を保存する手段が用意されていません。
そのため学習後のclassifierのインスタンスをpickleしてしまうことがありました。
でも今は、onnxファイルで保存することができます。
scikit-learnで学習した結果をonnxに変換する方法が以下の記事に書かれています。
scikit-learnの学習結果をpickleしない
MATLAB mファイル
MATLABでデータを保存する形式です。
scipyのライブラリで開くことができます。
scipy.io.loadmat
matlabで配列を書き出してPythonで読み込む
CSV ファイル
numpy.loadtxt()
delimiter="," とする。
pandas でcsvファイル
pandas.read_csv
pandas.DataFrame.to_csv
EXR
高ダイナミックレンジの画像のフォーマット
OpenEXR画像ファイルをpythonで読みこむ
ply
付記
データ形式の標準化が進んでいるので、以前よりも扱いが楽になってきている。
- CPUのエンディアンによって影響を受けやすいフォーマットは使われなくなってきている。
- そのため、X86でもARMでも同じバイナリデータで扱える。
データの永続化の手段
sql のデータベースを読み書きする。
REDIS
REDISでは、SQLのような構造化されたデータではないデータを扱うことができます。
- pypi redis
-
開発者のためのRedisチュートリアル(1)
複数のサービス間で同一のredisサーバーにアクセスすることで、変数の受け渡しをすることができます。
dataclass
Python のdataclassはjson形式でserialize できます。
pypi dataclasses-json
from dataclasses import dataclass
from dataclasses_json import dataclass_json
@dataclass_json
@dataclass
class Person:
name: str
person = Person(name='lidatong')
person.to_json() # '{"name": "lidatong"}' <- this is a string
person.to_dict() # {'name': 'lidatong'} <- this is a dict
Person.from_json('{"name": "lidatong"}') # Person(1)
Person.from_dict({'name': 'lidatong'}) # Person(1)
# You can also apply _schema validation_ using an alternative API
# This can be useful for "typed" Python code
Person.from_json('{"name": 42}') # This is ok. 42 is not a `str`, but
# dataclass creation does not validate types
Person.schema().loads('{"name": 42}') # Error! Raises `ValidationError
上記のpypi にある例題を転載。
データのserialize, desierializeはネットワークインタフェースで、データを転送する際に利用することがあります。
テキストファイルにしてしまえば、OSの違いやCPUのエンディアンの違いを受けません。
Protocol Buffers
Protocol Buffers(プロトコルバッファー)は構造データのシリアライズを目的とした技術スタックである。
github protobuf
pypi protobuf
Protobufの良い点は、複数のコンピュータ言語をサポートしていることです。
送信元と受信先で使用言語を変えることができます。