OpenCV における KMeans アルゴリズムの紹介と応用

OpenCV における KMeans アルゴリズムの紹介と応用

私は 51CTO アカデミーの講師、Jia Zhigang です。51CTO アカデミーの「4.20 IT リチャージ フェスティバル」(4 月 19 日〜20 日) を機会に、「OpenCV での KMeans アルゴリズムの応用」に関する私の経験を皆さんと共有したいと思います。本文はここです〜〜〜

1. KMeansアルゴリズムの紹介

KMeans アルゴリズムは 1967 年に MacQueen によって提案され、最も単純で最も一般的なデータ分類方法の 1 つです。一般的なデータ分析技術として、機械学習、データマイニング、パターン認識、画像解析などの分野で使用されています。分類の観点から見ると、KMeans はハード分類に属します。つまり、分類の数を手動で指定する必要がありますが、MeanSift 分類方法では、収束条件に応じて分類の数を自動的に決定できます。学習方法の観点から見ると、KMeans は教師なし学習方法、つまり学習プロセス全体にわたって人間の介入を必要とせず、データセット全体の分類を自動的に完了する学習方法に属します。与えられたデータ セット DS (データ セット) と入力カテゴリの数 K の場合、KMeans の全体的な動作原理は次のように説明できます。

1. 入力カテゴリ数Kに基づいてKカテゴリを定義し、各カテゴリの中心点を選択する

2. DS 内の各データ ポイントに対して次の操作を実行します。

- Kの中心点との距離を計算する

- データポイントをK個の中心点のうち最も近い中心点のカテゴリに割り当てる

3. Kカテゴリの各データポイントの平均値を計算して、新しいK中心点を取得します。

4. 新しいK中心点と最初のステップで既に存在していたK中心点の違いを比較する

- 両者の差が変化しないか、指定されたしきい値未満の場合、分類は終了します。

- 両者の差または条件が満たされない場合は、新しく計算された中心点の値を K カテゴリの新しい中心点として使用し、手順 2 ~ 4 を引き続き実行します。条件が満たされるまで、終了します。

数学的な観点から見ると、KMeans は K 個のカテゴリを見つけ、その中心点と各カテゴリ内の各データとの差の二乗和を最小化することです。このプロセスを実現するには、上記の手順 2 から 4 を収束するまで継続的に繰り返す必要があります。式は次のとおりです。

上記はKMeansアルゴリズムの基本的な考え方です。アルゴリズムを実装または適用する場合、注目すべき点が3つあります。

1. 初期の K カテゴリの各カテゴリの中心点の選択については、ほとんどのアルゴリズム実装でランダム選択と手動指定の 2 つの方法がサポートされています。OpenCV の KMeans 実装でも、この 2 つの方法がサポートされています。

2. 多次元データのサポート。ほとんどの場合、分類したい特徴オブジェクトの記述データは、単なる 1 つのデータ特徴ではなく、特徴ベクトルです。OpenCV は、Mat オブジェクトの構築を通じて、多次元データの KMeans 分類サポートを実装します。

3. 収束条件 - 一般的に、指定された反復回数に達するか、2つのRSS値の差が指定されたしきい値未満になると、分類プロセスが終了し、最終的な分類結果が出力されます。

次の図は例です。黒い点はデータポイントを表し、十字は中心点を表します。初期入力分類番号 K=2 の場合、KMeans の各ステップの結果は次のようになります。

2. OpenCVにおけるKMeans関連関数の説明

KMeans は OpenCV コア モジュールの API 関数です。

各パラメータの詳細な説明は次のとおりです。

- データは入力データセットを表します。これは 1 次元または多次元データであり、型は Mat 型です。次に例を示します。

マットポイント(カウント、2、CV_32F)

データ セットが 2 次元の浮動小数点データ セットであることを示します。

- K はカテゴリの数を表します。バイナリ分類では K=2 が最も一般的です。

-bestLabels は、計算後の各データ ポイントの最終分類インデックスを表し、INT 型の Mat オブジェクトです。

-criteria はアルゴリズムの終了条件を示します。最大サイクル数または指定された精度しきい値に達すると、アルゴリズムは分類の反復計算を停止します。

- 試行回数は、最良の分類結果を得るためにアルゴリズムが異なる初期分類を試行する回数を示します。

- フラグは、初期の中心点を選択するために使用する方法を示します

KMEANS_RANDOM_CENTERSは中心点をランダムに選択することを意味します

KMEANS_PP_CENTERSは集中化アルゴリズムに基づいて選択される。

KMEANS_USE_INITIAL_LABELS 最初の分類中心点は入力中心点を使用する

- Centers は、各分類出力の中心点データを表します。

3. 応用例 - KMeans を使用した画像セグメンテーション

画像処理における KMeans の典型的な応用シナリオは、ユーザーが入力した分類の数に応じて、画像領域の自動セグメンテーションを実現することです。この例では、OpenCV KMeans 関数に基づいて自動画像セグメンテーションを実現します。カラー画像の場合、各ピクセルには RGB の 3 つのコンポーネントがあります。画像全体を 3D データ セットと見なすことができます。この 3D データ セットを KMeans 関数の入力パラメータとして渡すだけです。アルゴリズムの実行後、分類マークのインデックスに応じて異なる色を設定できます。デモ プログラムの実装手順は次のとおりです。

1. 入力画像をデータセットに変換する

2. KMeansアルゴリズムを使用してデータを分類する

3. 各データポイントの分類インデックスに従って画像を色で塗りつぶし、セグメント化された画像を表示します。

操作効果は以下のとおりです。

完全なコード実装は次のとおりです。

  1. #include<opencv2/opencv.hpp>
  2. #include<iostream>
  3.  
  4. 名前空間 cv を使用します。
  5. 名前空間stdを使用します。
  6.  
  7. int main(intargc, char ** argv) {
  8. Mat src = imread( "D:/vcprojects/images/toux.jpg" );
  9. imshow( "入力" 、src);
  10. int幅 = src.cols;
  11. int高さ = src.rows ;
  12. int dims = src.channels();
  13.  
  14. // 初期化定義
  15. intサンプル数 = 幅*高さ;
  16. クラスターカウント= 4;
  17. Mat ポイント(sampleCount、dims、CV_32F、スカラー(10));
  18. マットラベル;
  19. Mat センター(clusterCount, 1, points.type());
  20.  
  21. // 画像 RGB からデータセットへの変換
  22. 整数 インデックス= 0;
  23. ( int row = 0; row < height; row++) {
  24. ( int col = 0; col < width; col++) {
  25. インデックス= 行*幅 + 列;
  26. Vec3b rgb = src.at <Vec3b>(行、列);
  27. points.at < float >(インデックス, 0) = static_cast< int >(rgb[0]);
  28. points.at < float >(インデックス, 1) = static_cast< int >(rgb[1]);
  29. points.at < float >(インデックス, 2) = static_cast< int >(rgb[2]);
  30. }
  31. }
  32.  
  33. // K-Meansデータ分類を実行する
  34. TermCriteria 基準 = TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0);
  35. kmeans(ポイント、クラスター数、ラベル、基準、3、KMEANS_PP_CENTERS、センター);
  36.  
  37. // 画像分割結果を表示する
  38. Mat 結果 = Mat::zeros( src.size (), CV_8UC3);
  39. ( int row = 0; row < height; row++) {
  40. ( int col = 0; col < width; col++) {
  41. インデックス= 行*幅 + 列;
  42. intラベル = labels.at < int >(インデックス, 0 );
  43. ラベル == 1 の場合 {
  44. 結果: <Vec3b>(行、列)[0] = 255;
  45. 結果: <Vec3b>(行、列)[1] = 0;
  46. 結果.at <Vec3b>(行、列)[2] = 0;
  47. }
  48. そうでない場合 (ラベル == 2) {
  49. 結果: <Vec3b>(行、列)[0] = 0;
  50. 結果: <Vec3b>(行、列)[1] = 255;
  51. 結果.at <Vec3b>(行、列)[2] = 0;
  52. }
  53. そうでない場合 (ラベル == 3) {
  54. 結果: <Vec3b>(行、列)[0] = 0;
  55. 結果: <Vec3b>(行、列)[1] = 0;
  56. 結果: <Vec3b>(行、列)[2] = 255;
  57. }
  58. そうでない場合 (ラベル == 0) {
  59. 結果: <Vec3b>(行、列)[0] = 0;
  60. 結果: <Vec3b>(行、列)[1] = 255;
  61. 結果: <Vec3b>(行、列)[2] = 255;
  62. }
  63. }
  64. }
  65. imshow( "kmeans-demo" 、結果);
  66. //imwrite( "D:/vcprojects/images/cvtest.png" , 結果);
  67. 待機キー(0);
  68. 0を返します
  69. }

著者について

Jia Zhigang: 書籍の著者、51CTO Academy の契約講師。画像処理関連分野に特化し、OpenCV や ImageJ などの開発フレームワークに精通しています。

51CTOアカデミー4.20 ITチャージングフェスティバル

(19日と20日は、100本のビデオコースが無料で受講でき、会員はビデオコースを40%割引で受講でき、非会員は30%割引、パッケージはさらに20%割引、マイクロジョブは2,000元の大幅割引をお楽しみいただけます)

アクティビティリンク: http://edu..com/activity/lists/id-47.html?wenzhang

関連するビデオチュートリアル:

OpenCV ビデオ分析とオブジェクト追跡の実践チュートリアル

http://edu..com/course/course_id-8837.html

<<:  ディープラーニング(CNN RNN Attention)を使用して大規模なテキスト分類問題を解決する - 概要と実践

>>:  白熱した「人間対機械」の戦いの意味とは?

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

...

「地表」から「宇宙」まで、探査ロボットが未知の領域の秘密を解き明かす

ロボットは現代社会で生み出された新しい種です。科学技術の進歩により、ロボットの開発はもはや人間の能力...

AIエンジニアの年収はわずか50万元程度で、年間100万元を稼ぐには長年の経験が必要です。

[[259190]]近年、人工知能技術のあらゆる分野への応用がますます普及し、関連する専門的・技術...

ChatGPTのメタバージョンが登場: Llama 2がサポートされ、Bing検索に接続され、ザッカーバーグがライブでデモを実施

今朝早く、毎年恒例の Meta Connect カンファレンスで、AI に焦点を当てた一連の発表が行...

...

開発者の「第2の脳」が登場、GitHub Copilotがアップデートされ、人間の開発参加がさらに減少

Andrej Karpathy 氏が嘆くのは、ソフトウェア開発プロセスにおいてコードを直接記述するこ...

疫病流行中に物流の円滑化に全力を尽くし、無人配送市場が活況を呈している

最近、国務院は貨物物流の円滑な流れを確保するために関連業務を展開するよう通知し、各地域と関連部門に主...

匿名の論文が驚くべきアイデアを提案!大規模なモデルと長いテキストの能力を強化する

大規模モデルで長いテキストを処理する能力を向上させる場合、長さの外挿やコンテキスト ウィンドウの拡張...

AIに感情を与えることは本当に重要なのでしょうか?

「合成感情」は人工知能の発展を妨げるのか?私たちは他の人とコミュニケーションをとるとき、通常は直接...

ビットコインマイニング技術: 分散データストレージ、ピアツーピア伝送、コンセンサスメカニズム、暗号化アルゴリズム...

1. 説明ブロックチェーンは、オープンなデータ操作、改ざん不可能、追跡可能性、国境を越えた分散化な...

Pythonアルゴリズムの正しい実装の紹介

経験豊富な Python プログラマーにとって、Python アルゴリズムの実装は難しくありません。...

...

人工知能に関してどのような基礎教育が必要でしょうか?

人工知能の基礎教育を強化することは、将来の社会の発展に備えるための避けられない選択であり、要件です。...