質問編集履歴

4

コードがおかしい部分を修正しました

2020/04/13 04:59

投稿

TakayukiMoriya
TakayukiMoriya

スコア26

test CHANGED
File without changes
test CHANGED
@@ -1,42 +1,88 @@
1
- Open CVのeye_cascadeを使用した目の認識の誤検知を減らして制度をげたいと考えていますいるのすが、表題のような課題に突き当たりました。
1
+ Open CVのeye_cascadeを使用した目の認識を行なっているですが、誤検知を減ら上で、表題のような課題に突き当たりました。
2
2
 
3
- ### 本題
3
+ ![イメージ説明](98a7dc4730ed3829f74ec937c6481ff1.jpeg)
4
4
 
5
- Open CVで目を認識させると[x,y,w,h]のリスト形式で結果が出力されるのですが、
5
+ ### 実際に書いたコード
6
6
 
7
- 例えばこのように誤検知が発生した場合
7
+ 下記コードのように、写真を読み込ませて顔認識した範囲目認識をしようとします
8
8
 
9
- ```list
9
+ ```pyton
10
10
 
11
- eyes = [[2264 1453 194 194]
11
+ import os
12
12
 
13
- [2582 1589 166 166]
13
+ import cv2
14
14
 
15
+
16
+
17
+ face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#学習データ
18
+
19
+ eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')#学習データ
20
+
21
+
22
+
23
+ img = cv2.imread('DSC_0064.JPG')
24
+
25
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
26
+
27
+ faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.1, minSize = (400,400), maxSize = (int(width*0.8),int(width*0.8)))
28
+
29
+ face_max = faces[faces[:, 2].argmax()]
30
+
31
+
32
+
33
+ img1 = img[int(face_max[1]) : int(face_max[1]+face_max[2]), int(face_max[0]): int(face_max[0]+face_max[3])]#元画像を顔部分のみクロップ→その範囲のみ目顔認証をかける
34
+
35
+ gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
36
+
37
+ eyes = eye_cascade.detectMultiScale(gray1, scaleFactor = 1.1,minNeighbors=10, minSize = (50,50), maxSize = (350,350))
38
+
39
+
40
+
41
+ print(type(eyes))
42
+
15
- [3388 2100 89 89]]
43
+ print(eyes)#[x,y,w,h]の形で書き出される
16
44
 
17
45
  ```
18
46
 
19
- ![イメージ説明](98a7dc4730ed3829f74ec937c6481ff1.jpeg)
47
+ ### 結果
20
48
 
21
49
 
22
50
 
23
- **目というものは、左右2つはほぼ水平(顔傾けても高さの値が近似に)写真に収められるもの**なので、リストの要素の2番目のy座標に注目し、上から1453と1589と2100だと、2100の値が他の2つに比べて逸脱しているのでこれが誤検知なのだと判断できます。
51
+ ```ここ言語入力
24
52
 
53
+ <class 'numpy.ndarray'>
25
54
 
55
+ [[ 99 143 112 112]
26
56
 
27
- このように、**y座標の値が近似な2つの要素のみをリストに残す**
57
+ [298 154 102 102]
28
58
 
29
- ```output
30
-
31
- eyes = [[2264 1453 194 194]
59
+ [141 37 80 80]]
32
-
33
- [2582 1589 166 166]#yが近似の2つの要素のみ残る
34
60
 
35
61
  ```
36
62
 
37
63
 
38
64
 
65
+ ndarray形式でこのような結果が書き出され、左右2つの目を認識したいにも関わらず3箇所認識されている結果となりました。(前髪や口が誤認識されているようです。)
66
+
67
+
68
+
69
+ そこで考えたのですが、**目というものは、左右2つはほぼ水平に写真に収められるもの**なので、各要素の2番目のy座標の値に注目し、上から143と154と37だと、37の値が他の2つに比べて逸脱しているのでこれが誤検知なのだと判断できます。
70
+
71
+
72
+
73
+ このように、**y座標の値が近似な2つの要素のみ抽出する**
74
+
75
+ ```
76
+
77
+ [[ 99 143 112 112]
78
+
79
+ [298 154 102 102]]
80
+
81
+ ```
82
+
83
+
84
+
39
- といった処理をリストeyesに施したいと考えているのですが、なかなかうまい方法が思いつきません。
85
+ といった処理を行い誤検知の値を排除したいと考えているのですが、なかなかうまい方法が思いつきません。
40
86
 
41
87
 
42
88
 

3

画像を変更しました

2020/04/13 04:59

投稿

TakayukiMoriya
TakayukiMoriya

スコア26

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ```
18
18
 
19
- ![イメージ説明](38e5341a01496038e1a715b5e2fd271e.jpeg)
19
+ ![イメージ説明](98a7dc4730ed3829f74ec937c6481ff1.jpeg)
20
20
 
21
21
 
22
22
 

2

画像を変更しました

2020/04/13 03:11

投稿

TakayukiMoriya
TakayukiMoriya

スコア26

test CHANGED
File without changes
test CHANGED
@@ -6,25 +6,21 @@
6
6
 
7
7
  例えばこのように誤検知が発生した場合でも
8
8
 
9
- ![イメージ説明](a0222e28f615ce1f07723e2bb8ecf68d.jpeg)
10
-
11
-
12
-
13
-
14
-
15
9
  ```list
16
10
 
17
11
  eyes = [[2264 1453 194 194]
18
12
 
19
13
  [2582 1589 166 166]
20
14
 
21
- [3388 3846 89 89]]
15
+ [3388 2100 89 89]]
22
16
 
23
17
  ```
24
18
 
19
+ ![イメージ説明](38e5341a01496038e1a715b5e2fd271e.jpeg)
25
20
 
26
21
 
22
+
27
- **目というものは、左右2つはほぼ水平に(顔を傾けても高さの値が近似に)写真に収められるもの**なので、リストの要素の2番目のy座標に注目し、上から1453と1589と3846だと、3846の値が他の2つに比べて逸脱しているのでこれが誤検知なのだと判断できます。
23
+ **目というものは、左右2つはほぼ水平に(顔を傾けても高さの値が近似に)写真に収められるもの**なので、リストの要素の2番目のy座標に注目し、上から1453と1589と2100だと、2100の値が他の2つに比べて逸脱しているのでこれが誤検知なのだと判断できます。
28
24
 
29
25
 
30
26
 

1

要点がより伝わるように加筆修正しました

2020/04/13 03:08

投稿

TakayukiMoriya
TakayukiMoriya

スコア26

test CHANGED
@@ -1 +1 @@
1
- Open CV目認証誤検知を減らしたい
1
+ Pythonのリスト近似値2要素のみ取り出したい
test CHANGED
@@ -1,10 +1,8 @@
1
- Open CVのeye_cascadeを使用した目の認識の誤検知を減らして制度を上げたいと考えています。
1
+ Open CVのeye_cascadeを使用した目の認識の誤検知を減らして制度を上げたいと考えていますいるのですが、表題のような課題に突き当たりました
2
-
3
- 内容としては、リストのソート法に関する質問になります。
4
2
 
5
3
  ### 本題
6
4
 
7
- 目を認識させると[x,y,w,h]のリスト形式で結果が出力されるのですが、
5
+ Open CVで目を認識させると[x,y,w,h]のリスト形式で結果が出力されるのですが、
8
6
 
9
7
  例えばこのように誤検知が発生した場合でも
10
8
 
@@ -30,7 +28,19 @@
30
28
 
31
29
 
32
30
 
31
+ このように、**y座標の値が近似な2つの要素のみをリストに残す**
32
+
33
+ ```output
34
+
35
+ eyes = [[2264 1453 194 194]
36
+
37
+ [2582 1589 166 166]#yが近似の2つの要素のみ残る
38
+
39
+ ```
40
+
41
+
42
+
33
- このように、**y座標の値が近似な2つの要素のみをリストに残す**といった処理をリストeyesに施したいと考えているのですが、なかなかうまい方法が思いつきません。
43
+ といった処理をリストeyesに施したいと考えているのですが、なかなかうまい方法が思いつきません。
34
44
 
35
45
 
36
46