🐷

coremltoolsでonnxをcoreMLに変換するときの前処理が正常に動作しないときの対処法

2021/11/20に公開

結論

onnx変換前の学習モデルに前処理を組み込む

coremltoolsのonnx.converterが正常に動作しない

coremltoolsにはonnxのモデルをcoreMLに変換する関数がある。
https://coremltools.readme.io/docs/onnx-conversion

この関数には前処理を記述できる引数である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