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)を使用して大規模なテキスト分類問題を解決する - 概要と実践

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

ブログ    
ブログ    

推薦する

機械学習と従来のプログラミングの違いについて話す

[[264779]] AI と ML は誇張されすぎていて、if 文を書いたりプログラミングに関係す...

IoTとAIはパンデミック中に企業が事業を再開するのにどのように役立つか

数か月に及ぶ極度の不確実性、経済活動の停止、強制的な自宅隔離を経て、ようやく経済活動と取引がゆっくり...

NVIDIA はフーリエ モデルを使用して前例のない天気予報精度を実現

現代の数値天気予報 (NWP) は 1920 年代にまで遡ります。今日では、数値天気予報はいたるとこ...

女性の死因第1位である乳がんをディープラーニングで検出するにはどうすればいいのでしょうか?

[51CTO.com からのオリジナル記事] 乳がんは女性に最も多く見られる浸潤がんであり、女性の...

機械翻訳: Google 翻訳がほぼすべての言語を翻訳できる仕組み

[[345484]]誰もが Google 翻訳をよく知っているはずですが、ほぼすべての既知の言語を私...

AIダイナミックセキュリティガードデータセンター

最近の世界的な調査によると、企業の事業がハッキングされると莫大な損失が発生し、サイバー攻撃1回あたり...

...

自分で作成したデータセット、TensorFlow を使用した株価予測チュートリアル

[[211061]] STATWORX チームは最近、Google Finance API から S...

...

顔認識と指紋認識のどちらがより定量化しやすいでしょうか?

顔認証と指紋認証は、携帯電話のロックを解除する主な 2 つの方法です。私たちは、日常の仕事でも公共の...

人工知能の新たなブレークスルー:ニューラルネットワークが画像内の物体を自律的に識別できる

海外メディアの報道によると、フィンランドのコンピューター科学者は神経生物学的手法を用いて人工知能研究...

企業は今後の組織開発においてハイパーオートメーションを採用するでしょうか?

[[386200]] [51CTO.com クイック翻訳] 事実によれば、ロボティックプロセスオー...

携帯電話の顔認識は、単に顔を見せることだけだと思っていませんか?あまりにもナイーブだ!女の子は注意しなければならない

今日は古い知識を学んだのですが、普段私たちが使っている携帯電話の顔認識は顔の部分だけを認識するもので...

科学者らがドローンを使って南極のペンギンの「国勢調査」を実施

最近、南極で初めて金色のペンギンが発見されました。このペンギンは「黄色いダイヤモンドを帯びている」と...