はじめに。低コストの開発をコアコンセプトとして使用するコンピュータービジョンのスタートアップ。チームは精神と完全に一致しています。曜日と時間帯(0.25から1.25のレート)に応じて、さまざまなレベルと方向の開発者の3〜5
製品について簡単に説明します(pc +ソフトウェア)-ローカルネットワークに接続され、独自にビデオ処理を生成するインテリジェントなビデオ監視システム。 2つの前提条件:異なる権限を持つユーザーインターフェイスの存在とアルゴリズムの最大の自律性。
技術面では、ハードウェアに制限はありませんでした。主なことは、ハードウェアがうまく機能することでした。しかし、財政的にはそうでした。すべてについてのすべてのために〜500ドル。もちろん、新しいコンポーネントと最新のコンポーネントのみです。彼らの選択は素晴らしいものではありませんが、あります!
ハードウェア、次にソフトウェアを決定しました。何らかの理由で、dockerを使用したマイクロサービスアーキテクチャが選択されました。
機能の開発は、定期的なレビューを伴う、単純で必要なもの(ストリームとビデオファイルでの作業)から複雑なものになりました。私たちはMVPを組み立てました。いくつかの最適化スプリントにより、私たちの大切な目標に著しく近づきました。4つのポイントすべてを同時に完了し、個別に完了することはできませんでした。
- 16以上のIPカメラ(FHD / 25fps)ライブ、イベント、または時間の再生と記録
- 利用可能なすべてのCVアルゴリズムの並列操作
- ユーザーは遅延なくインターフェースを集中的に使用します-ストリームを監視します
- CPU負荷は90%未満で、すべてが機能します(!)
スタックについて少し説明すると、C / C +、Python + TensorFlow、PHP、NodeJS、TypeScript、VueJS、PostgreSQL + Socket.ioなどの小さなものが選択されました。
実装された機能は、おそらくCVの分野から、そしてある程度はMLで最も興味深く、楽しい機能について詳しく説明するために、意図的に隠されていました。
「ユニークユーザー」
使用例は、特定の訪問者ごとの訪問履歴を収集することです。これが従業員であることがわからない場合でも、従業員を個別に考慮する必要があります(例-ショッピングセンター)。
そして、この問題は100,500回以上解決されたようで、電話やその他のものはすでに顔を認識して記憶し、どこかに送信して保存することができます。しかし、ソリューションの95%はACSで使用されており、ユーザー自身が認識されようとして、データベースの1つ以上の顔を確認するまで、30〜50cmの距離で5MPカメラの前に数秒間立っています。
私たちの場合、そのような条件は贅沢でした。ユーザーは、天井に取り付けられたカメラから十分な距離を置いてスマートフォンを見ながら、不規則に動きました。さらに、カメラ自体に問題が発生しました。ほとんどの場合、これらは1.3〜2 MPの低価格のカメラであり、理解できないカラーレンダリングが常に異なります。
この問題の一部は、カメラの設置条件に関する技術仕様の作成によって解決されましたが、一般的には、システムはそのような条件で認識できたはずです(もちろん、もっと悪いことです)。
ソリューションへのアプローチ:タスクは2つのタスク+データベース構造に分解されました。
短期記憶
リアルタイムプロセスが主に行われる別のサービスは、入力でカメラからのフレーム(実際には別のサービス)、出力で-正規化された512次元のXベクトル(face-id)といくつかのメタデータを含むhttpリクエストです。たとえば、タイムスタンプ。
ロジックとその内部の最適化の分野には多くの興味深いソリューションがありますが、それだけです。今のところすべて...
長期記憶
リアルタイムの要件は重要ではありませんが、場合によっては重要な別のサービス(たとえば、ストップリストの人)。一般的に、処理時間は3秒に制限しました。
サービスの入り口で-内部に512次元のベクトルを持つ短期メモリからのhttp;出口で-訪問者のID。
最初の考えは明白で、問題の解決策は非常に簡単です。httpを取得→データベースに移動し、何を取得したか→httpの入力と比較して、そのようなものがある場合はそうです。そうでない場合は、新しい。
このようなソリューションの利点は無数にあり、マイナス1つだけです-それは機能しません。
武士の道をたどり、定期的にインターネットを見ながら色々なアプローチを試みたが、問題は解決した。一般的に、決定は適度に簡潔であることが判明しました。概念は非常に単純で、クラスタリングに基づいています。
- 各ベクトル(a-vector)は、あるユーザーに属します。各クラスター(Mベクトル以下、箱から出してM = 30)は、あるユーザーに属しています。a-vectorがクラスターAに属しているかどうかは事実ではありません。クラスター内のベクトルはクラスターの相互作用を定義し、ユーザー内のベクトルはユーザーの履歴のみを定義します。
- 各クラスターには、セントロイド(実際にはAベクトル)と、他のベクトルまたはクラスターとの相互作用の独自の半径(以下、範囲と呼びます)があります。
- セントロイドと範囲は、静的ではなくクラスター関数になります。
- ベクトルの近接度は、ユークリッド距離の2乗によって決定されます(特別な場合、それ以外の場合)。ここには他にもいくつかのまともな方法がありますが、そこでやめました。
注:以降 正規化されたベクトルを使用し、それらの間の距離は0から2まで保証されました。次に、概念を実装するためのアルゴリズムについて。
#1容疑者の輪。ハッシュ関数としてのセントロイド
短期記憶から得られたXベクトルは、データベースで利用可能なクラスターセントロイド(Aベクトル)と比較され、範囲[X、A]> 1-が破棄された近接および遠隔のものが検出されます。誰も残っていない場合は、新しいクラスターが作成されます。
次に、Xベクトルと残りのすべてのaベクトルの間で最小値が求められます(min_range [X、a])
#2クラスターの固有のプロパティ。自己調整エンティティ
クラスター自体のrange_Aが計算され、そのベクトルはXベクトルに最も近くなります。ここでは、すでにこのクラスターにあるベクトルの数(N)の逆線形関数を使用します(const *(1-N / 2M)); 箱から出してconst = 0.67)。
#3検証と誤解。誰かでなければ-それなら誰!?
range_A> min_range [X、a]の場合、XベクトルはAクラスターに属するものとしてマークされます。そうでない場合は...ああ...これは誤解の数学的モデルの説明にいくぶん似ています。
この場合、新しいクラスターを作成することを決定しました。これにより、意図的に第1種の「ミッシングターゲット」を間違えました。
#4追加のトレーニング。数字がどのように記号を形成するか
主観的な経験とは、データがツールになるときです。以前に認識しましたが、エラーが発生した可能性があります。Xベクトルを信頼して次の試合で使用する必要があります!?確認中!Xベクトルは次の条件を満たしている必要があります。
- セントロイドAに十分に近い(range_A>範囲[X、A])
- 一方ではエラーのリスクを最小限に抑え、他方ではコピーも必要ないため(Config_Max [0.35]> range [X、a]> Config_Max [0.125])、便利で多様性があります。したがって、構成は「学習」の速度と正確さを決定します。
これらの条件を満たして、XベクトルはクラスターAに含まれます(それ以前は、単にユーザーに属していました)。クラスター内にさらに多くのベクトルがある場合は、最も中心的なベクトル(min_range [A、a])を削除します。これは、導入される多様性が最も少なく、他のベクトルの関数にすぎません。さらに、セントロイドはすでにマッチングに関与しています。
#5バグに取り組む。不利な点を利点に変える
それぞれの難しい選択で、「ターゲットがありません」エラーに向けて一歩を踏み出しました。新しいクラスターとユーザーを作成しました。それらを再訪する時が来ました...すべて。 #4の後、変更されたクラスターAがあります。次に、そのセントロイド(Aベクトル)を再計算し、512次元空間で使用可能なすべてのセントロイドまでの最小距離を探します。この場合、距離はより難しいと見なされますが、これは現在それほど重要ではありません。 min_range [A、B]の距離が特定の値よりも小さい場合(すぐに使用できるrange_unity = 0.25)、2つのセットを組み合わせて新しいセントロイドを計算し、ベクトルが多すぎる場合は「有用でない」ベクトルを取り除きます。
言い換えると、実際には1人のユーザーに属するクラスターが2つ以上ある場合、一連の検出の後、クラスターは近くになり、ストーリーと一緒に1つにマージされます。
#6組み合わせ機能。車が...考えるとき!?
この記事で新しい用語を定義することは価値があります。ファントムベクトルは、短期間の記憶活動の結果としてではなく、クラスターのN個のベクトル(a1、a2、a3、a4 ...)に対する関数の結果として取得されたベクトルです。もちろん、この方法で取得されたベクトルは個別に保存および説明され、マッチングの結果、最も近いものとして決定されるまで、値を表しません(#3を参照)。ファントムベクトルの主な利点は、クラスターの早期学習を高速化することです。
システムはすでに生産されています。結果は、5000人以上のユーザーのテスト環境外の実際のデータで取得されました。そこにはたくさんの「弱点」も見られましたが、それは強化され、このテキストで考慮されています。
興味深いことに、このアプローチにはユーザー設定がなく、すべての作業が制御されるわけではなく、すべてが完全に自律的です。さらに、時系列分析を使用すると、同様の方法でユーザーをさまざまなカテゴリに分類できるため、関連付けを構築できます。これが問題が解決された方法です-誰が従業員で誰が訪問者ですか。
システムユーザーの役割は単純です。メールまたはシステムインターフェイスで新しいアクティビティレポートを定期的に確認する必要があります。
結果
長期メモリに基づく認識の近接値は、適度にトレーニングされたクラスター(6〜15個のaベクトルを含む)の場合、約0.12〜0.25です。さらに、「ベクトルコピー」の可能性が高くなるため、学習は遅くなりますが、クラスターにすでに20以上のa-ベクトルが含まれている場合、長期的には、近接度は約0.04〜0.12の値になる傾向があります。フレーム間での短期メモリ内では、同じパラメータの値が約0.5〜1.2であることに注意してください。これは、「100ミリ秒前よりも2年前の方が眼鏡をかけている自分のように見えます」のように聞こえます。このような機会は、長期的なメモリでのクラスタリングの使用によって開かれます。
謎
テストの1つは、興味深い観察結果をもたらしました。
初期状態:
- 完全に同一の設定を持つ完全に同一のビデオ監視システムが、2つの完全に同一のPCに配備されています。TORによると、これらは正しく配置された1つのipカメラに接続されています。
行為:
- システムは同時に起動され、すべてのアルゴリズムが機能する状態で1週間放置されます。トラフィックは、変更なしで通常のトラフィックと一致します。
結果:
ここで多くのことを書くことができないのは残念ですが、おそらく別の記事で同じように詳細に説明することができます。おそらく、これらすべてはすでにいくつかの素晴らしいマニュアルに記載されていますが、残念ながら、私はそれを見つけられませんでした。
結論として、自律型AIシステムが周囲の空間を分類し、その過程で固有のさまざまな機能を実装する方法を内部から観察することは非常に興味深いと言えます。知覚の蓄積された経験のために、人々は多くのことに気づきません(ステップ#4)。
この記事が彼のプロジェクトの誰にとっても役立つことを心から願っています。