質問するログイン新規登録

Q&A

解決済

1回答

512閲覧

開曲線・閉曲線分類のベースラインについて(機械学習)

flancflt

総合スコア1

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2026/08/06 07:12

0

0

Few-shot条件における開曲線(Open Curves)・閉曲線(Closed Curves)分類のベースラインについて

背景

私は、機械学習によって開曲線(Open Curves)閉曲線(Closed Curves) という幾何学的概念を、極めて少数の学習例から獲得できるかを検証しています。

本タスクの目的は、単なる画像分類ではなく、未知の図形に対して 「曲線が閉じている」という概念を一般化できるか を評価することです。

設定としては、少数例から概念を学習する Bongard問題 に近い Few-shot Learning の問題として考えています。


実験条件

学習データ

  • 学習サンプル数:12枚以下
  • 各クラス6枚程度
  • クラス
    • Open Curves
    • Closed Curves

テストデータ

  • テストサンプル数:100枚
  • 学習時とは異なる図形ファミリーを使用

例えば、

学習

  • 三角形
  • 単純な折れ線

テスト

  • 星形
  • スプライン曲線
  • 複雑な多角形

のように、図形そのものではなく 「閉じている」という概念を一般化できるかを評価します。


使用しないもの

モデルが生の入力から概念を獲得する能力を評価したいため、以下は使用しません。

  • 事前学習(ImageNet等)
  • 転移学習
  • 自己教師あり学習
  • 外部データセット
  • データ拡張

また、人手で設計した特徴量や問題固有の幾何学的前処理も比較対象に含めません。

具体例として、

  • 輪郭追跡
  • 細線化(Skeletonization)
  • Euler数
  • Hu Moments
  • Fourier Descriptor
  • HOG
  • SIFT

などは使用しないものとします。


入力形式

入力は以下のいずれかを想定しています。

  • ラスタ画像
  • 曲線を表す座標列(ベクタ表現)

座標列が入力として与えられる場合は、その表現をそのまま利用することは許容します。

ただし、本研究では曲線を構成する点の並び順(描画順)は利用できないものとします。

  • 入力は座標列ではありますが、学習時・推論時ともに点の順序はランダムにシャッフルされており、入力は順序を持たない点集合(unordered point set)として扱います。

具体的には、ベクタ画像や座標列を入力とする場合であっても、入力点列はランダムにシャッフルされ、曲線の始点・終点や隣接関係などの順序情報は保持されません。

したがって、モデルは点の並び順に依存せず、点集合そのものから「開曲線・閉曲線」という概念を獲得することが求められます。


質問

1. ベースラインとして妥当な手法

このような条件で比較対象とする場合、どのような機械学習手法が妥当でしょうか。

現在は以下を候補として考えています。

古典的機械学習

  • SVM(RBFカーネル)
  • k近傍法(k-NN)
  • Random Forest
  • 小規模MLP

深層学習

  • 小規模CNN(画像入力の場合)
  • PointNet系(座標列入力の場合)
  • Deep Sets系(点集合入力の場合)

この他にも、Few-shotかつ未知図形への一般化性能を評価する上で適切なベースラインがあれば教えていただきたいです。


2. Accuracy 80%以上は現実的でしょうか

実験目標として Accuracy 80%以上(または同程度のF1 Score) を一つの目安としています。

以下の条件

  • 学習データ12枚
  • 未知図形への一般化
  • 事前学習なし
  • 外部データなし
  • 手工特徴量なし

において、80%以上を達成した報告例や、達成可能と思われる手法があれば教えていただきたいです。


評価条件について

本実験は実運用モデルの評価ではなく、ベースライン探索を目的としています。

そのため、

  • 学習データは恣意的に選択してよい
  • テストスコアを用いたハイパーパラメータ調整は許容

としています。

ただし、

  • 利用できるデータは学習データ12枚とテストデータ100枚のみ
  • 外部データを用いた学習は一切行わない

という条件です。


最終的に知りたいこと

知りたいのは、

  • この問題設定に対する妥当なベースライン
  • Few-shot条件で一般的に期待できる性能
  • Accuracy 80%以上は現実的か
  • 類似研究や参考文献

です。

最高精度を競うことよりも、このような極端なFew-shot条件において比較対象として妥当なベースラインを知りたいと考えています。

ご意見や参考になる研究・文献がありましたら、ご教示いただけると幸いです。

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
自分は普通の画像分類しかやったことはありませんが、学習データが極端に少なく特徴量の加工もないため、精度は50%に張り付く可能性が高いと思います。

また機械学習モデルは(局所的な線やテクスチャなど)幾何学的パターンには適していますが、位相概念は非常に苦手なようです。

文献としては以下が近そうでした。ここでも、事前知識を持たない機械学習モデルが数千〜数万件の学習データを使用した場合でも苦戦することが報告されています。
Comparing machines and humans on a visual categorization test 

あと、テストデータが100だと、ランダム2択予測の95%信頼区間が約50±10%なので、モデル同士をこれ以上の精度で比較するためにはテストデータを増やす必要がありそうです。

投稿2026/08/07 03:38

yuyafujiwara

総合スコア148

flancflt

2026/08/08 02:47 編集

こんにちは。コメントありがとうございます。 論文を少し読ませていただきました。私の理解が正しいか分からないのですが、論文で使われている Gaussian Kernel SVM の実験では、画像をそのままSVMに入力するのではなく、画像からいくつかの特徴を取り出して、それをSVMに入力しているように理解しました。 一方、私が試したRBF-SVMでは、少し違う方法で入力しています。 下のURLにそれが(入力の方法)わかる画像を載せてみました。 https://github.com/ogawanaoki771/Few-shot-Learning/blob/main/input.png 具体的には、元画像に描かれている線を、画像の中の「点の集まり」として取り出します。 そのために np.where(img > 0) を使って、線が描かれている部分の座標(x, y)を取り出します。 そして、その座標の並びを使って線を表現し、点の数を揃えるためにリサンプリングしてからSVMに入力しています。 画像 → 線の部分の座標を取り出す → 点の数を揃える → SVMに入力 という流れです。 ただし、ここに現在の実験の問題があることに気づきました。 `np.where(img > 0)` で取り出した点の順番は、曲線を実際に辿った順番ではありません。画像を上から下、左から右に調べたときの順番です。 それにもかかわらず、その点列をそのまま曲線の順番だとみなして `LineString` に渡していました。 そのため、現在の実験では、本来の「曲線の形」だけではなく、画像から点を取り出したときの順番による影響も入っている可能性があります。 その結果 ================== 評価結果 ================== Accuracy : 0.8836 Precision : 0.9339 Recall : 0.8506 F1-score : 0.8903 ============================================== なので、今回の 12例の学習データ、10,000例のテストデータ、PCA + RBF-SVMでAccuracy 88.36% という結果についても、少し注意が必要だと考えています。 この結果だけを見て、 「12例だけから開曲線と閉曲線という位相的な概念を学習できた」 と結論づけるのは、まだ早いと思っています。 現在はむしろ、 SVMが曲線の形そのものを見ているのか、それとも入力した点の順番など、別の情報を利用しているのか を確認している段階です。 また、テストデータについては、ご指摘の通り100例では95%信頼区間がかなり広くなります。現在はテストデータを10,000例まで増やしたので、ランダムな二値分類であれば、50%付近の95%信頼区間はおおよそ±1%程度まで狭くなります。 そのため、今後は、 曲線の点の順番に依存していないか 開始点に依存していないか 十分な数のテストデータで評価する といった点を確認した上で、ベースラインを作り直したいと考えています。 その上で、単純なSVMでも高い精度が出るのか、それとも50%前後に留まるのかを比較することで、「少数の例から開曲線・閉曲線という概念を学習できるのか」という本来の問題を、より公平に検証できると思っています。 実験に使用したコードはこちらです。 https://github.com/ogawanaoki771/Few-shot-Learning/blob/main/SVM.py 実行環境は Python Playground を使用しています。 https://python-playground.com/
flancflt

2026/08/07 11:44

上のコメントで分かりにくい箇所があったので補足させていただきます。 画像の入力形式についてです。 元画像から np.where(img > 0) によって線上の画素座標を取得し、その取得順をそのまま点列として LineString に渡して再サンプリングしています。 しかし、np.where() で得られる座標の順序は、元の曲線を辿る順序ではなく、画像上の画素走査順(基本的には行方向・列方向の順序)によって決まります。そのため、ここで LineString に入力されているのは、本来の曲線に沿って並んだ「順序付き座標列」ではありません。 この問題を可視化したものが 、 https://github.com/ogawanaoki771/Few-shot-Learning/blob/main/input.png です。画像では、np.where(img > 0) によって取得された画素がどの順序で入力されているかを描画しています。 この可視化からも分かるように、入力点列は必ずしも曲線に沿って連続的に並んでおらず、画像の画素走査順に従って点が並んでいます。したがって、この点列を LineString として扱うと、元画像に存在する曲線とは異なる経路が構成される可能性があります。 つまり、現在の実装では「曲線そのもの」を入力しているのではなく、画像から画素を抽出した際の走査順によって構成された点列を、曲線の点列として扱っているという問題があります。
yuyafujiwara

2026/08/10 08:13

詳細にご説明いただきありがとうございます。 とても興味深い結果ですね! すみません、画像のことしか考えておらず点集合を入力とする場合について考慮していませんでした。 画像を点集合として入力する場合は、複数タイプの3Dデータでも80%以上を達成している研究が多くありました。 たとえば座標データの場合、各点の近傍点(k-NN)を調べて隣接点が一つのみか複数あるか判断するだけで端点かどうかが分かるなど、幾何学的情報が高精度で表現されていることが理由と思われます。 個人的には、モデルが座標の近傍点と閉曲線・開曲線の相関を読み取れていれば、サンプリングの順番による差はあまりないと思っています。 以下文献の一部です。 PI3DETR: Parametric Instance Detection of 3D Point Cloud Edges (2025): https://arxiv.org/abs/2509.03262 PIE-NET: Parametric Inference of Point Cloud Edges (NeurIPS 2020): https://proceedings.neurips.cc/paper/2020/hash/e94550c93cd70fe748e6982b3439ad3b-Abstract.html
flancflt

2026/08/18 00:04

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
yuyafujiwara

2026/08/19 01:29

よかったです!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問