🐷
coremltoolsでonnxをcoreMLに変換するときの前処理が正常に動作しないときの対処法
結論
onnx変換前の学習モデルに前処理を組み込む
coremltoolsのonnx.converterが正常に動作しない
coremltoolsにはonnxのモデルをcoreMLに変換する関数がある。
この関数には前処理を記述できる引数であるpreprocessing_args
があるが、正常に動作しない場合がある (こちらの環境ではscale
を使ったが全く変化なし)。この関数は次のバージョン(v6.x)で削除されるらしいので、公式からの改善はないだろう。
対処法としては、swift上で前処理を行ってもいいが、swiftは画像のチャネルごとに演算を行うといった細かい数値演算は得意としていない印象がある (ライブラリも少ない)。
そこでモデルに前処理に該当する部分を埋め込み、CIImageなどを直接学習モデルにInputできるようにする。
対処法: 学習モデル(モジュール)に前処理を組み込む
学習モデルはライブラリ化されてるものもあるのでClass継承を使って実装する。下の例はpytorchでの実装。
class WrappedModule(nn.Module):
def __init__(self, model):
super().__init__()
self._model = model
def forward(self, x):
x = <前処理>
return self._model(x)
onnxへの変換時の注意点として、途中でnumpy.ndarray型に変換するとWarningが起こるのでできればtorch.Tensor型で前処理を行うのがいい。
Discussion