形状記述子を組み込むことで検出精度を向上させる方法 -- python フィールド と numpy フィールド と opencv フィールド と image-processing フィールド と object-detection フィールド 関連 問題

How to improve detection accuracy by incorporating shape descriptors?












1
vote

問題

日本語

下記の同じオブジェクトに属するバイナリ形状のセットは、マイン機能表現としての色に基づくビデオで検出されている2進数を見ることができます。
Shapes

検出時のオブジェクトの色によっては、関心のあるターゲットオブジェクトと同様の色分布を持つため、バイナリマスクイメージに表示されている他の無関係なオブジェクトがあるかもしれません(検出されるオブジェクトは赤い車です。 Green Car(例)

地域とアスペクト比に基づいてオブジェクトを区別しようとしました。しかし、下の画像に示すように、それらの面積およびアスペクト比が検出されるべき対象の境界にある他の検出された無関係なオブジェクトがあるので効率的には効率的には機能しませんでした。

href="https://i.stack.imgur.com/lfcgs.png" refollow noreferrer"> オブジェクト非オブジェクト

ターゲットオブジェクトの上の画像にはトップホワイトスポットです。

あなたが見ることができるように、ビデオの異なるフレームからキャプチャされたマスクのセット(最初のイメージを参照)は互いにわずかに異なり、特定の範囲での直線性のような類似の特性を形作る したがって、私は、HUの瞬間は、所定の形状のスケール、位置および回転不変であるため、RecreDengulityや HUモーメントなどの追加の機能を使用しようとしました。ターゲットオブジェクトのみを検出する際には、エリアなどの別のプロパティ、比率を使用してください。

ご存知のとおり、最初の2つの値は、オブジェクトのわずかな変化とともにわずかに変わります。最初の2つのHU値の最小/最大値を計算し、それらをしきい値として使用しました。

私は直腸性、面積および比率、そしてしきい値は以下の通りであった:

<事前> <コード> Min-Hu0=0.20888468 Max-Hu0=0.25578612 Min-Hu1=0.01675855 Max-Hu1=0.03461491 #----------------- Min-rect=0.5267567567567567 #min_rectengularity Max-rect=0.9272727272727272 #----------------- Min-area=705.5 Max-area=1048.0 #----------------- Min-ratio=1.2777777777777777 Max-ratio=3.0588235294117645

四角形を計算するために、次のことを行いました:

<事前> <コード> for cr1 in cnts_red: area=cv2.contourArea(cr1) x,y,w,h=cv2.boundingRect(cr1) rectengularity=area/(w*h)

ステートメントのような単純なIFステートメントを使用してこれらのしきい値を適用しました。

<事前> <コード> if area>=min_area and area<=max_area and aspect=min_aspect and aspect<=max_aspect: if rectengularity>= min_rec and rectengularity<= max_rec: if HuM[0]>=min_Hu0 and HuM[0]<=max_Hu0 and HuM[1]>=min_Hu1 and HuM[1] <=max_Hu1: target_contor =contour

実際には非常にわずかな改善を示していますが、まだこれらすべてのしきい値の間にある形状がある形状を検出します(下記の画像を参照)。

myth

1-soは、プログラミングの観点から、これらのプロパティに基づいてしきい値をどのようにしていきますか。

2 - ターゲットオブジェクトのための直腸性を絞り込むという事実にもかかわらず、検出された無関係な物体は、直腸形の境界の間にあるかどうか? 3 - 検出結果を改善する他の特性はありますか?

注:車が曲線上に駆動されるという事実のため、最小の直腸性閾値は低い(カラー画像を参照)

以下のテストでは、無関係なオブジェクトとオリジナルのイメージの1つとでも、異なるタイムスタンプでのオブジェクトマスクの画像です。

original_1

https://i.stack.imgur .com / ohxi8.jpg

イメージの説明を入力します。ここで

イメージの説明を入力します。

3

英語

Below you can see a set of binary shapes that belong to the same object being detected in a video based on color as main feature representation.
shapes

Since i'm depending on object color in the detection, there might be other irrelevant object presented in the binary mask image because they simply have similar color distribution as the target object of interest (the object to be detected is red car or green car for example)

I tried to distinguish the object based the area and aspect ratio. However, it didn't work efficiently as there were other detected irrelevant objects which their area and aspect ratio fall with in the boundaries of the object to be detected as shown in the below image.

object with non-object

In the image above the target object is the top white spot.

As you can see, the set of masks (see first image) captured from different frames of the video slightly differ from each other and shape some similar properties like rectengularity with in certain range

Therefore, I tried to use additional features such as Rectengularity and Hu Moments, since Hu Moment are Scale, position and rotation invariant for a given shape. I also used another properties like area, ratio in order to make the detection more confined in detecting only the target object

As you know, the first two value change slightly with the slight change of the object. i have calculated the min/max value of the first two Hu-values and used them as a threshold.

I did the same for rectengularity, area and ratio and the thresholds were:

Min-Hu0=0.20888468 Max-Hu0=0.25578612 Min-Hu1=0.01675855 Max-Hu1=0.03461491 #----------------- Min-rect=0.5267567567567567 #min_rectengularity Max-rect=0.9272727272727272 #----------------- Min-area=705.5 Max-area=1048.0 #----------------- Min-ratio=1.2777777777777777  Max-ratio=3.0588235294117645 

For calculating the rectengularity i did the following:

for cr1 in cnts_red:  area=cv2.contourArea(cr1)  x,y,w,h=cv2.boundingRect(cr1)  rectengularity=area/(w*h)   

I applied these threshold using simply if statements like:

if area>=min_area and area<=max_area and             aspect=min_aspect and aspect<=max_aspect:   if rectengularity>= min_rec and rectengularity<= max_rec:      if HuM[0]>=min_Hu0 and HuM[0]<=max_Hu0 and HuM[1]>=min_Hu1 and HuM[1]        <=max_Hu1:                       target_contor =contour  

It actually shows a very slight improvement, however still detects shapes that are somehow fall in between all these thresholds (see below image)

slight

1-So from programming perspective, is this how to threshold based on these properties????

2-Despite the fact that i filtered on the rectengularity for the target object, how could the detected irrelevant object which far a way from rectengular shape fall in between the rectengularity boundaries??

3-is there some other properties which do improve the detection results?

Note: the minimum rectengularity threshold is low due to the fact that the car drives on the curve (see colored image)

For tests below are images of the object masks at different timestamp with and without irrelevant objects and one of the original images

original_1

original_2

enter image description here

enter image description here

3

</div
              
 
 

回答リスト

2
 
vote
vote
ベストアンサー
 

a軸整列境界矩形を見つける cv2.boundingRect() の代わりに > <コード> 。最小の境界長方形(つまり、形状の周囲に厳密にフィットする回転の長方形があります)。

軸整列の境界矩形を使用することによって、あなたはあなたのトレーニングデータの長方形性のための非常に小さい値を見つけました。最小限の境界長方形では、指向に関係なく、長方形のオブジェクトに大きな長方形の値を表示するだけです。

 

Instead of cv2.boundingRect(), which finds the axis-aligned bounding rectangle, use cv2.minAreaRect(), which finds the smallest bounding rectangle (i.e. it finds a rotated rectangle that fits tightest around your shape).

By using the axis-aligned bounding rectangle, you found very small values for rectangularity in your training data. With the smallest bounding rectangle you should only see large rectangularity values for your rectangular objects, no matter how they are oriented.

</div
 
 
         
         
1
 
vote

次の方法論を試すことができます。

  • 本当のポジティブと誤検知を持つ画像の数を集め、すべてのBLOBをTRUE / FALSEとしてラベルを付けます。

  • あなたが計算することができる形状の特徴を考える(等尺性比、形状の周囲の割合、その凸めまいの比、慣性楕円の偏心、予想されるサイズからの偏差...) 。

  • 単一の機能で分類してみてください(いくつかの機能の値が2つの別々のサブセットを定義するかどうかを確認してください。それがうまくいったら、その間にしきい値を選択してください。

  • 単一の機能が足りない場合は、最ごとされた隣人などの単純な分類子を使用することができます。 TrueのSamplesとThresholdを最も近い距離で入力するだけで、TrueとFalseサンプルの両方を入力し、最も近いタイプを割り当てることができます。

必要なテストをするために、タスクを自動化して分類スコアを出力するアプリケーションを書き込むことを強くお勧めします。いずれにせよ、100%の正確さを期待しないでください。

 

You can try the following methodology:

  • collect a number of images with true positives and false positives, and label every blob as true/false.

  • think of the shape features that you are able to compute (isoperimetric ratio, ratio of perimeter/area of the shape and its convex hull, eccentricity of the ellipse of inertia, deviation from the expected size...).

  • try classification with a single feature (check if the value of some feature defines two separate subsets; if it works, choose a threshold in between).

  • if a single feature does not suffice, you can use a simple classifier such as nearest-neighbor with a small number of features. You can enter just the true samples and threshold on the distance to the nearest, of enter both true and false samples and assign the type of the nearest.

To make the necessary tests, it is highly recommended to automate the task and write an application that outputs the classification score. In any case, do not expect 100% accuracy.

</div
 
 
         
         

関連する質問

1  単純な物体検出(Python)  ( Simple object detection python ) 
実線の背景と3種類のオブジェクトを持つ画像があります。 3つのオブジェクトは異なる(ただし異なるサイズ)、異なる色のものが異なります。 例えば、グループAにグループ化されている場合、グループAにグループ化されている場合、グループ化がグループBに入れるとグループ...

0  Canny Edgesを使用したOpenCVオブジェクト検出  ( Opencv object detection using canny edges ) 
Androidスマートフォンを介して障害物を検出するプロジェクトに取り組んでいます。このアプリケーションは盲人のためのナビゲーションガイドになることを目的としています。 openCVを使用してビデオフレーム内のキャニーエッジを検出しますが、オブジェクトの...

1  Tensorflowオブジェクト検出訓練されたモデルが働いていません  ( Tensorflow object detection trained model not working ) 
私はSSDとより速いR-CNNモデルの両方を使用してTensorFlowオブジェクト検出のためにデータセットを訓練しました。私のデータセット内の220の電車と30のテストイメージがありました。 私はビデオで私の訓練を受けたモデルをテストしたときに私がビデオ内の...

2  時にはエラーが発生しました」「err == cudasuccess || ERR == CUDAERRORINVALIDVALUE予期しないCUDAエラー:メモリ不足  ( Sometimes get the error err cudasuccess err cudaerrorinvalidvalue unex ) 
私は私の特定の問題を解決する方法について非常に失われています、なぜ私がオブジェクト検出API とここでスタックオーバーフローを行いました。 起動すると、私の目標はAzure上の分散トレーニングジョブを実行することでした。私は gcloud ai-platfor...

0  認識のためにSourceのようなMarzipanoを使用してください  ( Use marzipano like source for recognition ) 
マルジパノでの私のビューの「ソース」を手に入れる方法を誰もが知っていますか? 説明しましょう、 オブジェクト検出のためのソースとして、私の家の表現、Marzipanoでプロジェクトを使いたいです。 私はオブジェクトを認識するためのモデルを持っています、そして、...

1  Yolo Darknet:画像のラベル付け方法  ( Yolo darknet how to label images ) 
私はYoloを使ったオブジェクト検出に新しく、ラベリングに関する質問があります(カスタムオブジェクトの場合)。 最後に高い精度を持つように画像をラベル付けする方法についてのガイドラインやヒントはありますか?私が世話をする必要があるものは何でも? 次の図のように...

0  OpenCVリアルタイムカラー/フォーム検出  ( Opencv real time color form detection ) 
円の信号(緑、黄、赤)の「リアルタイムビデオ検出」をやりたい(左ターン/右列標識など) 私はしたい: 私のビデオ記録装置(Android携帯電話)を修正し、信号機のビデオを撮っている間、緑色、黄色、赤い時間を計算し、繰り返し後に停止します。主なことは、この...

1  TensorFlowliteテンソル(IDENTITY_1)からSHAPHE [1,3087,2]を形作るJavaオブジェクトの形状[1,3087]からコピーできません。  ( Cannot copy from a tensorflowlite tensor identity 1 with shape 1 3087 2 to ) 
.tfliteに変換されたAndroid上のyolov4モデルを実行しようとしています。私の入力形状は大丈夫です[1,224,224,4]が私の出力形状にクラッシュしています。私はTFRITEのUDACTYコースからコードを使用しています。 次のコードを実行...

0  複数の顔検出  ( Multiple face detection ) 
私は、「haarcascade_mcs_upper.xml」を使用して上半身を検出するOpenCV(C ++で)にコードを持っています。 それは単体を検出します。どのようにして複数の上半身を検出できますか。 CV_HAAR_FIND_BIGGEST_OBJEC...

1  2進画像におけるオブジェクト検出  ( Object detection in binary image ) 
このタスクは、安定したバックグラウンドで追跡オブジェクトから来ています。これまでのところ私は背景を取り除き、このようなバイナリマスクを入手することができました: 私はそれに取り付けられていない玩具の四角形の境界線を束ねる必要があります(いくつかのフ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有