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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1489閲覧

自作の画像分類・キーポイント検出のモデルを作成する流れについて

dora41

総合スコア1

Keras

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

1グッド

0クリップ

投稿2022/11/12 14:22

知りたいこと

自作のディープラーニングのモデルを作成する、一般に行うべき流れが知りたいです。

前提・経緯

魚のキーポイント検出を行いたいため、自作のデータセット及び自作のモデルをtensorflow・kerasで作成しました。

「魚のキーポイント検出」とは、カサゴのような魚が横向きに置かれている画像があり、その魚の目の中心、エラの上端、エラの下端、尾びれの上端、尾びれの下端、etc. といったキーポイントを検出するもの、と捉えてください。
(本当は魚ではないのですが、検出する題材が込み入っているので、わかりやすく魚とさせていただきます。)

しかし、精度が低いです。
というのも、現状の自作のモデルは、本やtensorflow公式のチュートリアルにあるコードを参考にして、多少いじった程度のものだからです。

これの精度を上げたいと思っています。

疑問

一般的に、自作のデータセットでキーポイント検出のような課題を解くには、どういった流れで行うのでしょうか?

というのも、現状の自作のモデルにおいて、ハイパーパラメータをチューニングしていく、という方法が間違っているような気がするからです。

自分が知らないだけで、ディープラーニングの定石となる流れがあるのでは…?と考えています。

回答としては以下のような、課題解決の進め方となるものを期待しています。

  • 普通こういう課題は、人体のキーポイント検出のようなホットな課題の、公開されているモデルから転移学習するものだ。例えばXXXモデルやYYYモデルは転移学習可能で、ZZZで公開されているしtensorflowで使えるし試せ。
  • レイヤー構造作成の定石を抑えれば、精度はあまり変わらない。あとはデータセットの量を多くするのを優先するべき。レイヤー構造についてはは〇〇という本を読め。
  • 最新の類似のカテゴリの公開されているコードを参考にしろ。具敵的にはXXXで公開されているコードを読み解け。
  • とりあえず〇〇という本を読め。お前の質問の答が全部書いてある。

そもそも、非人体のキーポイント検出でなくとも、画像の二項分類のようなもっと一般的なカテゴリですら、高い精度を求めるための流れがわかっていません。

既にわかっていること

  • データの量を多くすれば精度は向上するということ
  • データ拡張(Data Augmentation)や、過学習の防止、などといった一般的な精度向上のテクニック

もっとメタ的な部分での精度向上の流れについて知りたいです。

その他

ウェブ・スマホアプリのエンジニアとしては10年の経験があります。

退会済みユーザーを押しています

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

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

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

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

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

jbpb0

2022/11/13 01:47

私なら、まず > 最新の類似のカテゴリの公開されているコードを参考にしろ。 をやってみて、結果がイマイチなら > 人体のキーポイント検出のようなホットな課題の、公開されているモデルから転移学習するものだ。 をやります
dora41

2022/11/13 03:55

回答ありがとうございます。 自分の探した範囲だと、キーポイント検出だと、ネット上にも本にも参考になるコードがあまりなく、難しいな・・・と思っていたのですが、さらに探してみます。
jbpb0

2022/11/13 04:45

> 人体のキーポイント検出 人体ではなくて顔のパーツですが、 Facial landmark detection でググったらいろいろ出てきますが、それとは違うものでしょうか?
dora41

2022/11/13 10:05

> jbpb0 さん 一つ質問なのですが、例えば Facial landmark detection などの検索ワードで検索すると、出てくる情報の主なものに、GitHubなどのページ(で公開されているコード)や、論文があると思います。 (https://paperswithcode.com/ など) 機械学習の分野だと、独自のデータセットで精度を高めたい、というような少し込み入ったことをする場合、上記のような他人のコードや論文を読み解いて行く必要があるのでしょうか? ウェブ系の私としては、「わからないことがあったら、ググれば Stack Overflow 等で同じ問題にぶち当たっている人がまずいるから、それを見ればOK」のような感覚で生きてきたのですが、機械学習はひょっとして知識をかなり要求される分野なのでしょうか? 本を数冊読んで基礎は学んだつもりだったのですが、、、こういう付け焼き刃でなんとかなるという姿勢が間違っているような気もしてきました。 > fourteenlengthさん わかりづらく申し訳ないのですが、前提・経緯の段落に書いたとおり、本当の題材は魚ではないのです…
jbpb0

2022/11/13 11:37

目的によると思います 世の中に既に存在するもの全てを凌駕する性能のものを作りたいのか、あるいは、(世の中で実現できてるレベルの)要求仕様(性能)を満たすものが(独自データセット用に)あればいいのか、でやり方が変わります 目的が後者の場合は、私なら、性能が高そうなコードを選び(複数の場合もある)、独自のデータセットの形式をそのコードのオリジナルデータに合わせて、とりあえず動かしてみます コードは細部を見ず、コードを変更するとしても動かすための最小限の変更だけにして、独自データセットで学習させて推論させてみて、性能(精度とか速度とか)を確認します 性能が要求を満たしてれば、そのまま使います (もちろん、コードがライセンス的にOKな場合) ライブラリとして、割り切って使うわけです 性能が要求を満たさない場合は、もっと性能が高いと思われる他のコードを探してみて、良さそうなのが見つからなければ、実行してみたコードの詳細を解読して修正するなり、それらのコードを分析して参考にして自分で書くなりします どうするのかはケースバイケースです 性能がどれくらい要求と乖離してるかとか、実行してみたコードがどれくらい複雑かとか、いろんな条件で変わります 目的が前者の場合は、要求をそのまま満たすコードは(おそらく)無いでしょうから、既存のコードで性能が高そうなのを選んでとりあえず動かしてみるところまでは同じですが、それだけで済むわけないので、実行してみたコードの詳細を解読して修正するなり、それらのコードを分析して参考にして自分で書くなりしないといけませんよね その場合も、どうするのかはケースバイケースです 上記はあくまでも、私ならそうするということです 人によってやり方はいろいろ違うと思いますよ
dora41

2022/11/13 13:32

長文での回答ありがとうございます。 非常に納得できました。 私の場合、目的は世の中で実現できてるレベルのものを独自データセットで実現することなので、まずは公開されているコードで良さそうなものを全部試してみて、性能を色々と比べてみたいと思います。 その後、各々のコードを解読する必要があると思いますが、まだその力がまだ足りないと思うので、勉強しつつ、試していこうと思います。 おそらく、私の認識で間違っていたのは、ただ一つの正解のやり方があるんだという考えでした。 機械学習のような性能を求めるタスクには、こういう姿勢が間違っていたような気がします。 本当に助かりました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2022/11/13 22:36 編集

> 前提・経緯の段落に書いたとおり、本当の題材は魚ではないのです… 存じ上げております。ソースコードを見ればわかると思いますが、顔や骨格のキーポイント検出の関節の定義は難解で、図面が公開されていますがそんなに簡単に転用できません。"原理上は"OpenPose系のアルゴリズムを使えば、設定を組み替えれば"からかさ小僧"の骨格検知だろうが"車"の骨格検知だろうが"やかん"の骨格検知だろうができるはずです。 ただ、実際にやろうとすると、そう簡単にいかない(難解で読みにくい、同じような原理を他の用途にうまく使えるような解説がある例が公開されていない)ので、であればもっとわかりやすい関節の少ない魚であれば実装しやすいだろうと思いリンクを紹介しました。 言い換えれば、dora41さんがやろうとしているものの対象物が「脊椎動物」であれば(クジラだろうがシカだろうがカエルだろうが、データを挿げ替えるだけで済みますので)、アルゴリズム上の難解さはほぼなくなるはずです。
jbpb0

2022/11/14 01:21

例として > 魚の目の中心、エラの上端、エラの下端、尾びれの上端、尾びれの下端、etc. といったキーポイントを検出 と書かれてたので、実際に検出したいものも何かの「配置されてるパーツの位置」かと思い、顔のパーツ(目とか口とか顎の輪郭とか)のキーポイントを検出する「Facial landmark detection」が近いと思って、それで検索することを勧めました でも、実際に検出したいのが「OpenPose」的な関節を検出するのに近いのなら、技術内容がかなり違うと思うので、「Facial landmark detection」はあまり参考にならないかもしれません
dora41

2022/11/14 01:24

なるほど、私が勘違いしていました。申し訳ないです。 リンクのデータセットの中身を見てみましたが、魚の頭・中央部分・尾の付け根の3点の座標とその可視or不可視or不明がアノテーションされているのですね。 もし可能であればお聞きしたいのですが、以下の理解で正しいでしょうか? OpenPoseなどの骨格推定のアルゴリズムは単純ではなく、難解であり、転用がしづらい。 リンクのようなシンプルなデータセットなら、シンプルなアルゴリズムでも十分な精度で実装できる確率が高いので、まずはこういったシンプルなデータセットで様々なアルゴリズムを試し、十分な精度が確認できたら、そのアルゴリズムでもって自作データセットに転用するといった流れが現実的だ。
dora41

2022/11/14 01:38

順番が前後していますが、2022/11/14 10:24の私のコメントは fourteenlength さんに向けたものです。 > jbpb0さん ご指摘はその通りで、私のタスクは配置されてるパーツの位置を推定するものです。 それなのに、keypoint detection等の検索ワードで主に調べていたので、欲しい情報があまり出てこなかったようです。(骨格推定のアルゴリズムは基本的にはもう少し複雑であるようなので) Facial landmark detection 等の検索ワードで、私にもわかるコードが多少見つかったので、試していこうと思います。
退会済みユーザー

退会済みユーザー

2022/11/14 22:48 編集

> OpenPoseなどの骨格推定のアルゴリズムは単純ではなく、難解であり、転用がしづらい。 少なくとも私はそう思います。 OpenPose系のアルゴリズムは、「間接位置(ひざ、ひじ等)の検出」×「関節同士の繋がり(ひざは腰につながっているが、ひざは首に繋がっていない的な自然さ)」で成り立っています。この考え方のおかげでOpenPoseはほかの手法では追従できない滑らかで自然な骨格推定を実現しました。 さらに、この考え方を昆虫のような多関節の動物に転用したような例を見たことがあります。(これを転用するのは難しいと知っていますので)恐らくその人は相当な頭のキレ者だと思います。もしかしたら、そういう"人より多関節な生き物”や”そもそも関節はないにしてもアルゴリズム的な目線で見れば車の骨格”に対応させるような、「汎用化アルゴリズム」がどこかにあるかもしれません。こういう汎用化したものがdora41さんの欲しいものだろうと察しています。(あったら私も知りたいです💦) ――という感じですので、たぶんですが、顔の特徴点検出(表情認識)も同じようなことを顔の骨格(ほほ、眉、口等)でやっているのだと思います。根幹は近そうな技術で成り立っていると思います。実際、GoogleのMediaPipeだと「椅子の骨格(?)検知」なんかもあったと思います。参考まで。
jbpb0

2022/11/15 01:24 編集

質問者さん 「Facial landmark detection」(顔のパーツ検出)は、これが分かりやすいと思います https://qiita.com/RanWensheng/items/d8768395166d041a753a 書かれたのがちょっと前なので、最新のは載ってませんけど、どんなことやってるのかフワッと知るくらいなら (既に読んでると思いますが、念の為)
dora41

2022/11/15 02:30

>fourteenlength さん たしかにOpenPose系のアルゴリズムは(現在の私の理解できる範囲でも)難しいですね。 おっしゃるとおりの「汎用化アルゴリズム」のコードがあれば、いいのですが・・・。 (もちろん私も見つけていません。) > jbpb0 さん 情報提供助かります。 その記事は目を通してはいました。 本当にふわっとは理解しましたが、正直なところ、今の自分には難しすぎるというということが理解できた点です。 > お二人へ 現実的に、私が試せる範囲とすれば ・キーポイントのラベルを(X,Y)にする or ヒートマップにする ・画像分野の汎用的なモデルの学習済みモデルを使って転移学習する or しない ・モデルの構造を色々と変える(これも指針があまりないので難しいですが…) ・(学習するデータの量をなるべく多くする) の辺りかと思ってきました。 これ以上を追求しようとすると、骨格推定や顔のパーツ検出で実際に使われているアルゴリズムの理解が必要になってきて、それには論文やその実装を読み解く、という作業が必要になり、難易度が跳ね上がるように思えます。 でもとりあえずこれらの試せる範囲でしっかりと試していこうかと思っています。
退会済みユーザー

退会済みユーザー

2022/11/16 10:00 編集

「ソースコードも目を通さず画像だけ見て張り付けるな」と詳しい方から怒られそうですが… https://github.com/talmo/leap https://github.com/jgraving/deepposekit https://www.nature.com/articles/s41592-018-0234-5 特にLEAPのは「ツールキット」があるそうで、何か設定しやすいGUIのようなものがあるのかもしれません。 さらに、LEAPのはSLEAPという名前で公式WEBページがあり、ガッツリチュートリアルもあるようです。ネズミも昆虫も同じ土俵で扱えるらしく、取っつきやすい工夫があるのではと期待してしまいます。 https://sleap.ai/index.html つ SLEAPの論文@天下のNature様 https://www.nature.com/articles/s41592-022-01426-1.pdf
dora41

2022/11/16 10:23

> fourteenlength さん おお、まだぱっと見だけですが、まさしく求めていたものかもしれません。 特に2つ目はKerasで使えるようなので、比較的簡単にできそうな気がします。 それなりに調べたと思っていたのですが、3つともURLにたどり着いていなかったので、おそらく機械学習の分野で経験が浅く、ググる力も足りてなかったようです。 何にせよありがとうございます。 チャレンジしてみます。
jbpb0

2022/11/28 02:34

解決したなら、質問者さんが回答を書いて「自己解決」にしてください
guest

回答1

0

自己解決

コメント欄ででヒント、というか回答を教えていただいたので、解決しました。
ありがとうございました。

投稿2022/11/28 05:16

dora41

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問