OpenCVの物体追跡

  目次 1. OpenCVの物体追跡の概要 1.1 物体追跡とは 1.2 OpenCV 2. 実験 2.1 環境の準備 2.2 コード 2.3 結果の動画   1. OpenCVの物体追跡の概要 1.1 物体追跡とは 物体追跡とは,与えられた動画から,指定した対象が各画像間でどのように移動したかを推定することです。動画の中を移動する物体の動きをトラッキング(追跡)することが出来れば、その物体の変位や速度、加速度といった物理量を計算することが出来ます。   1.2 OpenCVの物体追跡 OpenCVには物体追跡アルゴリズムがopencv-contrib-pythonとして提供されています。画像処理の方法がOpenCVに6つ実装されています。   MIL(Multiple Instance Learning) 考え方としてはBoostingにとても近いけど、分類対象の場所の近傍のサンプルについてもいくつか正の場所として扱うことが特徴です。 cv2.TrackerMIL_create()   KCF(Kernelized Correlation Filters) MILの近傍サンプルにはそれぞれ同士でオーバーラップする部分があって、その領域を加味することで性能を上げたらしいです。 cv2.TrackerKCF_create()   TLD(Tracking, learning and detection) 性質上、似たような他のものとの入れ替わりには引っ張られたりすることがあります。ただ、長い間遮られたりするものやスケールが大幅に変わるものには適しているらしいです。 cv2.TrackerTLD_create()   MedianFlow オブジェクトを時間的に順方向および逆方向の両方で追跡して、これらの軌跡間の差異を測定します。 cv2.TrackerMedianFlow_create()   GOTURN 深層学習を使ったトラッキング手法なため、向いているハードウェアに搭載すればとても早いらしいです。 cv2.TrackerGOTURN_create()   MOSSE …

OpenCVの物体追跡 Read More »

TanhExpの活性化関数

  目次 1. TanhExp活性化関数の概要 1.1 TanhExp活性化関数とは 1.2 TanhExp関数 2. 実験 2.1 ライブラリインポート 2.2 データ読み込み 2.3 データ加工 2.4 TanhExpの活性化関数を作成 2.5 Reluの活性化関数を作成 2.6 まとめ   記事:活性化関数のまとめ   1. TanhExp活性化関数の概要 1.1 TanhExp活性化関数とは TanhExpはTanh Exponential Activation Functionの略称です。名前からわかるようにtanhとexpを使います。TanhExpの定義はf(x) = x tanh(e^x)である。様々なデータセットやネットワークモデルに対してTanhExpのシンプルさ、効率性、ロバスト性を実証し、TanhExpは収束速度と精度の両方で同等のものを凌駕することを示した。また、ノイズを追加したり、データセットを変更したりしても、TanhExpの挙動は安定している。ネットワークのサイズを大きくしなくても、少数の学習エポックと余分なパラメータを追加することなく、TanhExpによって軽量ニューラルネットワークの能力を向上させることができることを示す。 論文:TanhExp: A Smooth Activation Function with High Convergence Speed for Lightweight Neural Networks https://arxiv.org/abs/2003.09855   1.2 TanhExp関数 def tanhexp(x): return x * tf.math.tanh(tf.math.exp(x)) …

TanhExpの活性化関数 Read More »

Networkxのグラフのクラスタリング(コミュニティ)

  目次 1. Networkxのクラスタリング(コミュニティ) 1.1 コミュニティとは 1.2 ガーバンニューマンのアルゴリズム 1.3 クラスタリング係数 2. 実験 2.1 環境準備 2.2 データ準備 2.3 ガーバンニューマンのアルゴリズム 2.4 クラスタリング係数 1. Networkxのクラスタリング(コミュニティ) 1.1 コミュニティとは コミュニティは、接続されたノードの集まりです。 コミュニティ内のノードは密に接続されていますが、中でのクラスタリング結果されたものを指します。 1.2 ガーバンニューマンのアルゴリズム コミュニティを見つけるアルゴリズムの中に、ガーバンニューマン(GirvanNewma) アルゴリズムというものがあります。 ネットワーク内のエッジを段階的に削除することにより、コミュニティを識別します。 中間性を「エッジ中間性」と呼びます。 これは、このエッジを通過するノードのペア間の最短パスの数に比例するスコアです。 このアルゴリズムの手順は次のとおりです。 ネットワーク内の既存のすべてのエッジの中間性を計算します。 中間が最も高いエッジを削除します。 このエッジを削除した後、すべてのエッジの間隔を再計算します。 エッジがなくなるまで、手順2と3を繰り返します。   1.3 クラスタリング係数 ローカルクラスタリング係数は、ノードiを中心とする三角形の数とノードiを中心とする三角形の数の比率です。 ある意味で、ノードiとその隣接ノードが完全グラフにどれだけ近いかを測定します。 実際の例としては、ノードαがノードβとノードγのどちらにも繋がっており、さらにノードβとノードγに繋がっている時だと三角形αβγが形成されています。このような三角形を多く含むネットワークは「クラスターの密度が高い」と考えていくのがこのローカルクラスタリングの考え方です。 これを全体として求めるのがグローバル係数であり、グラフ内の三角形(ローカルクラスター)の密度を測定します。   2. 実験 環境:Google Colab (networkxのパッケージがインストールしている) データセット:networkxのFlorentine Families:結婚の絆によって、ルネッサンスのフィレンツェの家族間の同盟を描いたフィレンツェの家族のグラフです。 モデル:ガーバンニューマンのアルゴリズム   …

Networkxのグラフのクラスタリング(コミュニティ) Read More »

半教師あり学習

  目次 1. 半教師あり学習の概要 1.1 半教師あり学習とは 1.2 ラベル拡散法 (label spreading) 2. 実験 2.1 環境準備 2.2 データ準備 2.3 ラベル拡散法モデル学習 2.4 分類モデル学習 2.5 まとめ   1. 半教師あり学習の概要 1.1 半教師あり学習とは 半教師あり学習(Semi-Supervised Learning)とは教師あり学習と教師なし学習を組み合わせて学習する方法です。教師あり学習はラベル付きデータでモデルを作成します。例えば、ネゴの画像と犬の画像の分類問題です。教師なし学習はラベルなしデータでモデルを作成します。例えば、複数画像の特徴から、クラスターを作成します。 1.2 ラベル拡散法 (label spreading) 正確なモデルを予測するための十分なラベル付きデータがなく、より多くのデータを取得するための能力またはリソースがない場合は、半教師あり手法を使用してトレーニングデータの規模を大きくすることができます。半教師あり学習アルゴリズムを使用してデータにラベルを付け、新しくラベルが付けられたデータセットでモデルを再トレーニングします。   scikit-learnにはラベル拡散法 (label spreading) が実装されており,あるデータのラベルを予測する事によってラベルのないデータにコピーする (伝播させる) ことで,少量のラベル付きデータからモデルを学習します。   sklearn.semi_supervised.LabelSpreading(kernel=’rbf’, *, gamma=20, n_neighbors=7, alpha=0.2, max_iter=30, tol=0.001, n_jobs=None) 2. 実験 データセット:iris (アヤメの種類と特徴量に関する分類データセット) モデル:ラベル拡散法 (label spreading) ⇒ランダムフォレスト モデル評価;Accuracy   2.1 環境準備 …

半教師あり学習 Read More »

Rangerの最適化アルゴリズムの解説

  目次 1 Ranger最適化アルゴリズムの概要 1.1 Ranger最適化アルゴリズムとは 2. 実験 2.1 データロード 2.2 データ前処理 2.3 Ranger最適化アルゴリズムのモデル作成 2.4 Adam最適化アルゴリズムのモデル作成 2.5 まとめ   記事:最適化アルゴリズムのまとめ   1 Ranger最適化アルゴリズムの概要 1.1 Ranger最適化アルゴリズムとは Ranger最適化アルゴリズムとは、LookaheadとRADamの統合です。 Lookaheadという名前のとおり,過去の勾配を使うのではなく,先を見据えた更新則を導入しています。具体的には,通常のoptimizer (SGDやAdamなど) によって重みパラメータを更新します。これらのパラメータを “fast weights” を呼びます。これらの “fast weights” を参考に、”slow weights”と呼ばれる,実際に評価に用いる重みパラメータを更新します。 つまり、これまでのoptimizerは”fast weights”の更新で終わっていましたが、Lookahead optimizerはこの更新を参考にした上で本当のパラメータ (slow weights) を更新するというわけです。 Rectified Adam、またはRAdamは、適応学習率の分散を修正するための項を導入するAdam確率オプティマイザーの変形です。 それは、Adam最適化で悪かった収束問題を高速化しています。 論文:Lookahead Optimizer: k steps forward, 1 step back https://arxiv.org/abs/1907.08610v1 論文:RAdam …

Rangerの最適化アルゴリズムの解説 Read More »

Networkxのネットワーク類似度

  目次 1. NetworkXの概要 2. NetworkXの類似性の測定 3. 実験 ・NetworkX環境設定 ・共通部分のノードとエッジの可視化 ・Jaccard係数の集合の類似度 ・graph_edit_distance ・optimal_edit_paths ・optimize_graph_edit_distance ・simrank_similarity 1. NetworkXの概要 NetworkXは、グラフ/ネットワークの作成、加工、構造分析をのPythonのパッケージです。そもそも、数学者、物理学者、生物学者、コンピューター科学者、社会科学者などの分野で活用されています。ソーシャル ネットワーク、分子グラフ、通信ネットワーク、物流ネットワーク、エネルギーネットワークなどの分析を対応します。 このライブラリは多くの機能があり、今回はネットワーク類似度を解説します。   2. NetworkXの類似性の測定(編集距離) グラフ編集距離は、2つのグラフを同形にするために必要なエッジ/ノードの変更の数です。 デフォルトのアルゴリズムは、正確な値ではなく近似値を用いています。 理由は、正確なグラフ編集距離(Graph Edit Distance – GED)における計算の問題は、多くの場合時間がかかります。 グラフ編集距離の例 四角のグラフは三角のグラフに編集は以下の図のような4つステップです。この時は、距離4です。 NetworkXのsimilarityのモジュール: graph_edit_distance(G1, G2[, node_match, …]) グラフG1とG2の間のGED(グラフ編集距離)を返します。 optimal_edit_paths(G1, G2[, node_match, …]) G1をG2に変換するすべての最小コストの編集パスを返します。 optimize_graph_edit_distance(G1, G2[, …]) グラフG1とG2の間のGED(グラフ編集距離)の連続近似を返します。 optimize_edit_paths(G1, G2[, node_match, …]) GED (graph edit distance) …

Networkxのネットワーク類似度 Read More »

pandas tips データフレームのループを倍高速化する

  目次 Pandasのデータ処理の概要 Pandasのループ処理改善 一般的なループ(Loop) iterrows() apply() Pandas ベクトル化(Pandas Vectorization) Numpy ベクトル化(Numpy Vectorization) Pandasのループ処理改善の比較   Pandasのデータ処理の概要 pandasで大量データを扱う場合、処理速度が遅く困る事があります。公式ドキュメントではパフォーマンス向上のために Cython や Numba を使う方法を記載しています。今回の記事はデータフレームのループを倍高速化する方法を解説と実験したいと思います。 最初はベンチマークとして一般的ループを実行します。   Pandasのループ処理改善 実験の環境: 環境:Colab(Webブラウザからプログラミング言語Python) データセット:2019年シーズンのサッカープレミアリーグの試合データ データ処理:特定のチームの試合が引き分けかどうか新しい列作成 評価:データ処理の速さ   data.worldからデータを読み込みます。 サッカーの結果かなら、特定のチームの試合で引き分けかどうか計算します。 import pandas as pd df = pd.read_csv(‘https://query.data.world/s/dz7yh6j26rhswrdlbx23eyebqpisvn’) team = ‘Tottenham’ df   1. Ilocを用いた一般的なループ(Loop) ループを使用する場合は、オブジェクト全体を反復処理します。 Pythonはメリットをいかせず非常に遅いです。 def soc_loop(df, TEAM): df[‘Draws’] = 99999 for row in range(0, len(df)): if ((df[‘HomeTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] == ‘D’)) | \ ((df[‘AwayTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] == ‘D’)): df[‘Draws’].iloc[row] = ‘Draw’ elif ((df[‘HomeTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] != ‘D’)) | \ ((df[‘AwayTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] != ‘D’)): df[‘Draws’].iloc[row] = ‘No_Draw’ else: df[‘Draws’].iloc[row] = ‘No_Game’   DataFrameでプレミアリーグからすべての試合を確認する必要があり、if文の分岐で彼らがホームチームかアウェイチームかを確認する必要があります。Loopは86.5 ミリ秒かかりました。 …

pandas tips データフレームのループを倍高速化する Read More »

ハミングとMLIPNSの文字列の距離

目次 1. ハミング(Hamming) 1.1 ハミングとは 1.2 ハミングのコード例 2. MLIPNS距離 2.1 MLIPNSとは 2.2 MLIPNSのコード例   関連記事: Pythonでの文字列の距離や類似性 距離と類似度の解説   前回はPythonでの文字列の距離や類似性について解説しました。今回の記事はHammingとMLIPNSを解説したいと思います。   1. ハミング(Hamming) 1.1 ハミング距離とは ハミング距離はHamming distanceの英語略称で、等しい文字数を持つ二つの文字列の中で、対応する位置にある異なった文字の個数です。例えば、 「101」と「100」の距離は、1です。 「make」と「made」の距離は、1です。 「job」と「jab」の距離は、1です。 あくまでも異なるかどうかでしか見ないため意味合い等は見る事は当然できません。ただしデータの誤り検知のような確実に同じと思われるような所で使われます。   1.2 ハミングのコード例 TextDistanceのライブラリでハミング距離を計算します。 すべてのアルゴリズムには、いくつかの一般的な方法があります。 .distance(* sequences)-シーケンス間の距離を計算します。 .similarity(* sequences)-シーケンスの類似性を計算します。 .maximum(* sequences)-距離と類似性の可能な最大値。 distance + similarity == maximum .normalized_distance(* sequences)-シーケンス間の正規化された距離。 戻り値は0と1の間の浮動小数点数です。ここで、0は等しいことを意味し、1は完全に異なることを意味します。 .normalized_similarity(* sequences)-シーケンスの正規化された類似性。 戻り値は0と1の間の浮動小数点数です。ここで、0は完全に異なることを意味し、1は等しいことを意味します。   init引数: qval–シーケンスをqグラムに分割するためのq値。 …

ハミングとMLIPNSの文字列の距離 Read More »

AdaDeltaの最適化アルゴリズム

  目次 1. AdaDelta最適化アルゴリズムの概要 1.1 AdaDelta最適化アルゴリズムとは 1.2 AdaDelta関数 2. 実験 2.1 ライブラリインポート 2.2 データ読み込み 2.3 データ加工 2.4 AdaDeltaの最適化アルゴリズムを作成 2.3 Adamの最適化アルゴリズムを作成 2.5 まとめ   記事:最適化アルゴリズムのまとめ   1. AdaDelta最適化アルゴリズムの概要 1.1 AdaDelta最適化アルゴリズムとは   AdadeltaはAdagradの拡張版の最適化アルゴリズムです。 過去のすべての勾配を累積するのではなく、勾配更新の固定移動ウィンドウに基づいて、単調に減少する学習率を下げていくような最適化アルゴリズムです。複数の値を保持するのではないのでAdagradに比べるとメモリー効率も良いと言われています。   ADAGRADメソッドでは、分母はトレーニングの開始から始まる各反復からの二乗勾配を累積します。 各項が正であるため、この累積合計はトレーニング全体を通じて増加し続け、各次元の学習率を効果的に縮小します。 何度もイテレーションの繰り返した後、学習率は非常に小さくなります。   下記の計算式になります。注意点としてはステップ5で差分を取っています。これは、無次元かと呼ばれる操作で学習していきます。この無次元かと呼ばれる特徴を用いているため、他のステップでも学習率を設定しないアルゴリズムです。 論文:ADADELTA: An Adaptive Learning Rate Method https://arxiv.org/abs/1212.5701   1.2 AdaDelta関数   Tensorflow tf.keras.optimizers.Adadelta( learning_rate=0.001, rho=0.95, epsilon=1e-07, name=’Adadelta’, …

AdaDeltaの最適化アルゴリズム Read More »

SELUの活性化関数

  目次 1. SELU活性化関数の概要 1.1 SELU活性化関数とは 1.2 SELU定義 1.3 SELUの特徴 2. 実験 2.1 データロード 2.2 データ前処理 2.3 SELU活性化関数のモデル作成 2.4 RELU活性化関数のモデル作成 2.5 まとめ 記事:活性化関数のまとめ   1. SELU活性化関数の概要 1.1 SELU活性化関数とは SELUはScaled Exponential Linear Unitsの英略称で、活性化関数の一つです。 SELUは勾配消失問題(Vanishing Gradient)を対応できます。何故ならばSELUは「0」を基点として、入力値が0以下なら「0」~「-λα」の間の値を、0より上なら「入力値をλ倍した値」を返します。ReLUおよびELUの拡張版です。 論文:https://arxiv.org/pdf/1706.02515.pdf Tensorflow: https://www.tensorflow.org/api_docs/python/tf/nn/selu PyTorch: https://pytorch.org/docs/stable/generated/torch.nn.SELU.html   1.2 SELU定義 xが入力データで、f(x)が出力結果である。 x ≦ 0の場合は、f(x)=λ × α × (ex-1)となる x > 0の場合は、f(x)=λ × xとなる。 …

SELUの活性化関数 Read More »