質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2332閲覧

tiny-yolov3の学習済みモデルをcoremlモデルに変換

marakasu

総合スコア2

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/22 18:26

編集2020/07/31 12:12

前提・実現したいこと

tiny-yolov3の学習済みモデルをkerasモデルに変換しそのモデルをcoremlモデル(mlmodel)に変換をしようとしています。
iosアプリでtiny-yolov3の学習モデルを用いて物体の座標を検出させるアプリを作っています。ですがiosでtiny-yolov3の学習済みモデルを直接使用することはできないのでcoremlモデルに変換する必要があります。そこでtiny-yolov3のモデルをkerasモデル(.h5)までは変換することができるのですがcoremlモデルに変換するところでエラーがでてcoremlモデルを作成することができません。
またkerasモデルへの変換はこのサイトを参考にしました。
(不足している情報がありましたらお知らせください。修正させていただきます)

kerasモデルからcoremlモデルに変換する際のエラーメッセージ

tensorflowバージョン1.1.4の場合

ValueError: ('Unrecognized keyword arguments:', dict_keys(['ragged']))

tensorflowバージョン1.1.5の場合

ValueError: Keras layer '<class 'tensorflow.python.keras.engine.input_layer.InputLayer'>' not supported.

該当のソースコード

tensorflowバージョン1.1.4の場合

python

1import coremltools 2from tensorflow.keras import models, layers 3 4model = models.load_model('yolo-tiny.h5') 5coreml_model = coremltools.converters.keras.convert(model) 6coreml_model.save('my_model.mlmodel')

試したこと

coremlモデルに変換する手法の一つでtiny-yolov3学習モデルをtensorflow(pb)に変換しcoremlモデルに変換する方法を試しましたがtensorflow(pb)に変換するdarkflowがtiny-yolov3に対応していないため断念しました。
参考サイトではtiny-yolov3のモデルをdarkflowを用いて変換するという記述がありますがどうやって対応させたかが不明です。
参考サイト

モジュールのバージョン

python 3.7.4
coremltool 3.4
tensorflow 1.14.0
keras 2.2.4
環境構築に参考にしたサイト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

patapi

2020/08/01 10:34 編集

手持ちの環境をtensorflowのバージョン2.3かつcoremltools最新版にした場合、ソースに一部修正を施したうえでh5ファイルからcore_mlファイルへコンバートできたのですが、環境は記載のバージョンでなければいけないのでしょうか。
marakasu

2020/08/01 15:44

回答ありがとうございます! 環境はモジュールのバージョンの欄に記載した通りの環境で行いましたのでバージョン変更することは可能ですが以前最新バージョンで試した際にtensorflowとkerasのバージョンエラーが出たのでtensorflow 1.14.0 keras 2.2.4を入れました。ソースの一部修正はどのような形で行ったのでしょうか。 ご教授の方お願いします。
patapi

2020/08/01 22:35

私が試したときの環境・バージョンと、ソースコード修正の件を回答欄に追記しました。
marakasu

2020/08/02 16:13

返信が遅れてしまいもうしわけありません... 詳しい返信本当にありがとうございます。同じ環境で試させていただきますので結果が出次第報告させていただきます。
guest

回答1

0

ベストアンサー

引き続き下記環境で試しました:
macOS 10.15.5
python 3.7.7 (virtualenv)
coreremltools 4.0b2
tensorflow 2.3.0
keras 2.4.3

下記darknet公式から入手できるyolov3-tinyのweightファイルを
.h5ファイルに変換し、その.h5ファイルをcoremltoolsにすることを目標にしました。

サンプルデータ:https://pjreddie.com/media/files/yolov3-tiny.weight

いろいろ試したり調べたりした結果、この.weightデータを、最終的にmlmodelファイルに変換できた事例を一応載せておきます。

注)
・今回変換?できたのはあくまで上記tiny-yolov3のサンプルデータです。
・「tinyでない」yolov3サンプルデータ(上の公式から別で落とせます)は変換に失敗しました。(shortcut_0 header error が出る)
・darknetではなくcocoで学習したデータは試していません。
・自力でdarknetを用いてtiny-yolov3として学習させたオリジナルデータを作成して試したりしていません。
・変換後のデータが、本当にきちんと学習済のものとして使用に耐えうるものかも検証できていません.
・tinyでないyolov3とtiny-yolov3は別物なので引数に指定するファイル名等は気をつけてください(自分も何回か間違えて変換に失敗した)

手順:tiny-yolov3のweightsファイルから.h5ファイルへの変換に、keras-yolo3ではなく、YAD2Kを使用します。
ただし、本家YAD2kは、現状tiny-yolov3に完全対応していないようなので、(yolo_0 header errorが出る)
フォークされたhttps://github.com/prakharcode/YAD2Kを使用します。

lang

1git clone https://github.com/prakharcode/YAD2K.git 2cd YAD2K

yolov3-tinyのサンプルデータ:https://pjreddie.com/media/files/yolov3-tiny.weight
をダウンロードし、上記YAD2Kディレクトリにコピーします。

また同じYAD2Kディレクトリに、yolov3-tiny.cfgもコピーします。(実際はトレーニング時に使った物と同じcfgがいいかもしれませんが、私はkeras-yolo3リポジトリ内にあるyolov3-tiny.cfgを利用しました)

YAD2Kディレクトリ内で下記を実行します。

lang

1python3 yad2k.py yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.h5

エラーなければ、yolov3-tiny.h5が作成されているはずです。

あとはこのyolov3-tiny.h5 をcoremltools 4.0bで変換します。
(以前言及した、convert()関数を使用)

import coremltools from tensorflow.keras import models, layers model = models.load_model('yolov3-tiny.h5') coreml_model = coremltools.convert(model) coreml_model.save('my_model-yolov3-tiny.mlmodel')

蛇足:
https://github.com/xiaochus/YOLOv3
を使っても、一応変換できるようです。
(上記私家版YAD2Kで変換してできるh5ファイルとはファイルサイズが異なっていました。
処理の最後で、pydotとgraphizがビルドされていないというエラーが出ますが.h5ファイルは作られていました)

参考:
coremlのドキュメント内のサンプルコード
https://github.com/qqwweee/keras-yolo3/issues/507

投稿2020/08/01 22:34

編集2020/08/05 11:37
patapi

総合スコア820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marakasu

2020/08/02 16:49

記載していただいた環境で実行したのですが エラーコード全文 (coremltools) marakasu@marakasuMacBook-Pro tiny-yolov3_coreml % python load.py WARNING:root:TensorFlow version 2.3.0 detected. Last version known to be fully compatible is 2.2.0 . WARNING:root:Keras version 2.4.3 detected. Last version known to be fully compatible of Keras is 2.2.4 . Running TensorFlow Graph Passes: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 5.14 passes/s] Converting Frontend ==> MIL Ops: 57%|████████████████████████████████████████████████████▌ | 65/115 [00:00<00:00, 1141.11 ops/s] Traceback (most recent call last): File "load.py", line 5, in <module> coreml_model = coremltools.convert(model) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/_converters_entry.py", line 258, in convert **kwargs File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/converter.py", line 120, in _convert prog = frontend_converter(model, **kwargs) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/converter.py", line 52, in __call__ return tf2_loader.load() File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/frontend/tensorflow/load.py", line 80, in load program = self._program_from_tf_ssa() File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/frontend/tensorflow2/load.py", line 181, in _program_from_tf_ssa return converter.convert() File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/frontend/tensorflow/converter.py", line 394, in convert self.convert_main_graph(prog, graph) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/frontend/tensorflow/converter.py", line 339, in convert_main_graph outputs = convert_graph(self.context, graph, self.outputs) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/frontend/tensorflow/convert_utils.py", line 181, in convert_graph _add_op(context, node) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/frontend/tensorflow/ops.py", line 776, in Conv2D name=conv_name, File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/ops/registry.py", line 62, in add_op return cls._add_op(op_cls, **kwargs) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/builder.py", line 191, in _add_op new_op.type_value_inference() File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/operation.py", line 178, in type_value_inference output_types = self.type_inference() File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/ops/defs/conv.py", line 133, in type_inference custom_pad=custom_pad, File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/ops/defs/_utils.py", line 231, in spatial_dimensions_out_shape custom_pad=custom_pad, File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/ops/defs/_utils.py", line 161, in aggregated_pad for i, k, s in zip(input_shape, effective_ks, strides) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/coremltools/converters/mil/mil/ops/defs/_utils.py", line 161, in <listcomp> for i, k, s in zip(input_shape, effective_ks, strides) File "/Users/marakasu/Desktop/tiny-yolov3_coreml/coremltools/lib/python3.7/site-packages/sympy/core/expr.py", line 327, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float ソースコード import coremltools from tensorflow.keras import models, layers model = models.load_model('yolo-tiny.h5') coreml_model = coremltools.convert(model) coreml_model.save('my_model.mlmodel')
marakasu

2020/08/02 16:56

追記 tensorflow == 2.2.0 keras == 2.2.4 に変更してもバージョンエラーが消えるだけで他のエラー内容は変わりませんでした。
patapi

2020/08/02 17:06

申し訳ないです。明日以降調べてみますが、元の.h5ファイルのデータ内容によって変換できない場合があるのかもしれません。 参考として、こちらで変換に成功した手持ちのデータは https://www.kaggle.com/datamunge/sign-language-mnist? のsign_mnist_train.csv と sign_mnist_test.csv を https://teratail.com/questions/277170 に記載の「学習済みモデル」のpythonコードで訓練させたものです。
marakasu

2020/08/03 05:25

darknetで学習したyolov3-tinyモデルから.h5形式に変換していますのでうまく変換できないのかもしれません。 お手数おかけしますがよろしくお願いします。 こちらでももう一度.h5形式に変換し直してみます。
patapi

2020/08/05 11:29

いろいろ試して、yolov3-tinyのサンプルデータを最終的にmlmodelファイルに変換することに一応成功したので、手順を記載しました。
marakasu

2020/08/15 12:01

連絡が遅れてしまい申し訳ありません。 こちらの環境でも変換することができました。 ありがとうございました!
patapi

2020/08/15 16:28

よかったです。こちらも勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問