添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
2020-04-23 C先生:さて、OpenCVもちょっとずつやっていきましょう。

ラッキー:何となくですが、JupyterNotebookでやった方がいいですかね。

がぶ:もう一度前回の記事を読み直しましょう。
第202回「OpenCV 将棋駒・カスケード分類器」
https://reiwa55.blog.fc2.com/blog-entry-258.html

キラキラ:正解ファイルと不正解ファイルが必要な様です。

がぶ:結局OpenCV単体で動かしてからPython?それとも最初からPythonでimportでやるのでしょうか。どちらでも出来そうですが・・・

C先生:色々見たけど、カスケード分類器はOpenCVをWindowsにインストールして作って、Pythonからその分類器を使う方法が多そうだ。

ラッキー:調べましたが、どうやらopencv-python 4.2.0.32しかインストールしてないようです。

がぶ:いやいや、やっぱりPythonから使った方が良さそうです。下記サイトを参考にやってみることにいたしましょう。
OpenCVの勉強③(分類器を作成してみる)
https://qiita.com/takanorimutoh/items/5bd88f3d17239a147581

キラキラ:まずは、作業フォルダを作成。「C:\MyPython\OpenCV」
上記フォルダの中に「cascade」「vec」「neg」「pos」と言うフォルダを作成します。

ラッキー:ファイルの準備。
OpenCV
https://opencv.org

がぶ:
OpenCV – 4.3.0の「Windows」
https://sourceforge.net/projects/opencvlibrary/files/4.3.0/opencv-4.3.0-vc14_vc15.exe/download

C先生:うーん。間違えたか?
>>>
※OpenCV – 4.1.0以降は、「opencv_createsamples.exe」と「opencv_traincascade.exe」が入っていないため、OpenCV3以前のものをダウンロードします。
>>>

ラッキー:こちらに変更「OpenCV – 3.4.10」の「Windows」

ラッキー:ダウンロードしたファイル「opencv-3.4.10-vc14_vc15.exe」は、「C:\MyPython\OpenCV」にあります。こちらをダブルクリックして出来たフォルダの中の「C:\MyPython\OpenCV\opencv\build\x64\vc15\bin」にあるファイルを全て「C:\MyPython\OpenCV」にコピー。

がぶ:コマンドプロンプトから
C:\MyPython\OpenCV>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は BE56-D581 です

C:\MyPython\OpenCV のディレクトリ

2020/04/22 21:45 DIR .
2020/04/22 21:45 DIR ..
2020/03/14 22:06 DIR .vscode
2020/04/22 20:50 DIR cascade
2020/04/21 22:22 DIR neg
2020/04/22 21:45 DIR old
2020/04/22 21:40 DIR opencv
2020/04/22 21:36 191,543,712 opencv-3.4.10-vc14_vc15.exe
2020/04/22 21:39 116,703,232 opencv-4.3.0-vc14_vc15.exe.opdownload
2020/04/03 07:43 48,128 opencv_annotation.exe
2020/04/03 07:43 54,784 opencv_createsamples.exe
2020/04/03 07:25 18,301,440 opencv_ffmpeg3410_64.dll
2020/04/03 07:43 133,632 opencv_interactive-calibration.exe
2020/04/03 07:43 321,024 opencv_traincascade.exe
2020/04/03 07:43 35,840 opencv_version.exe
2020/04/03 07:43 34,304 opencv_version_win32.exe
2020/04/03 07:43 60,416 opencv_visualisation.exe
2020/04/03 07:43 55,907,328 opencv_world3410.dll
2020/04/03 07:43 28,340,224 opencv_world3410.pdb
2020/04/03 07:32 98,994,688 opencv_world3410d.dll
2020/04/03 07:32 142,045,184 opencv_world3410d.pdb
2020/04/21 22:18 DIR pos
2020/04/22 20:50 DIR vec
14 個のファイル 652,523,936 バイト
9 個のディレクトリ 33,111,396,352 バイトの空き領域

C:\MyPython\OpenCV>

キラキラ:合計12ファイルです。
opencv_annotation.exe
opencv_createsamples.exe
opencv_ffmpeg3410_64.dll
opencv_interactive-calibration.exe
opencv_traincascade.exe
opencv_version.exe
opencv_version_win32.exe
opencv_visualisation.exe
opencv_world3410.dll
opencv_world3410.pdb
opencv_world3410d.dll
opencv_world3410d.pdb

C先生:よしよし。

ラッキー:正解画像は、「C:\MyPython\OpenCV\pos」に入れます

Kyosha_1.jpg

Kyosha_1.jpg
KyoshaRight_1.jpg

KyoshaRight_1.jpg

がぶ:まずは香車で行きましょう。

キラキラ:不正解画像は、「C:\MyPython\OpenCV\neg」に
Ou_1.jpg

Ou_1.jpg
KinRight_1.jpg

KinRight_1.jpg
Kin_1.jpg

Kin_1.jpg
KeimaRight_1.jpg

KeimaRight_1.jpg

Keima_1.jpg

Keima_1.jpg
Kaku_1.jpg


Kaku_1.jpg
Hisha_1.jpg


Hisha_1.jpg


GinRight_1.jpg

GinRight_1.jpg
Gin_1.jpg

Gin_1.jpg
Fu9_1.jpg


Fu9_1.jpg

Fu8_1.jpg

Fu8_1.jpg
Fu7_1.jpg


Fu7_1.jpg

Fu6_1.jpg

Fu6_1.jpg
Fu5_1.jpg


Fu5_1.jpg
Fu4_1.jpg


Fu4_1.jpg

Fu3_1.jpg

Fu3_1.jpg
Fu2_1.jpg


Fu2_1.jpg

Fu1_1.jpg

Fu1_1.jpg

C先生:「C:\MyPython\OpenCV\neg」にて。
C:\MyPython\OpenCV\neg>dir *.jpg /b > neglist.txt

C:\MyPython\OpenCV\neg>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は BE56-D581 です

C:\MyPython\OpenCV\neg のディレクトリ

2020/04/22 21:56 DIR .
2020/04/22 21:56 DIR ..
2020/04/21 22:19 45,994 Fu1_1.jpg
2020/04/21 22:20 43,142 Fu2_1.jpg
2020/04/21 22:20 47,264 Fu3_1.jpg
2020/04/21 22:20 45,070 Fu4_1.jpg
2020/04/21 22:21 47,877 Fu5_1.jpg
2020/04/21 22:21 46,878 Fu6_1.jpg
2020/04/21 22:22 48,808 Fu7_1.jpg
2020/04/21 22:22 48,599 Fu8_1.jpg
2020/04/21 22:22 45,736 Fu9_1.jpg
2020/04/21 22:17 49,267 GinRight_1.jpg
2020/04/21 22:14 44,304 Gin_1.jpg
2020/04/21 22:19 52,393 Hisha_1.jpg
2020/04/21 22:18 45,288 Kaku_1.jpg
2020/04/21 22:17 48,739 KeimaRight_1.jpg
2020/04/21 22:13 43,039 Keima_1.jpg
2020/04/21 22:16 49,544 KinRight_1.jpg
2020/04/21 22:15 47,666 Kin_1.jpg
2020/04/22 21:56 219 neglist.txt
2020/04/21 22:15 52,159 Ou_1.jpg
19 個のファイル 851,986 バイト
2 個のディレクトリ 33,066,754,048 バイトの空き領域

C:\MyPython\OpenCV\neg>

ラッキー:「neglist.txt」にフルパスを追記
C:\MyPython\OpenCV\neg\Fu1_1.jpg
C:\MyPython\OpenCV\neg\Fu2_1.jpg
C:\MyPython\OpenCV\neg\Fu3_1.jpg
C:\MyPython\OpenCV\neg\Fu4_1.jpg
C:\MyPython\OpenCV\neg\Fu5_1.jpg
C:\MyPython\OpenCV\neg\Fu6_1.jpg
C:\MyPython\OpenCV\neg\Fu7_1.jpg
C:\MyPython\OpenCV\neg\Fu8_1.jpg
C:\MyPython\OpenCV\neg\Fu9_1.jpg
C:\MyPython\OpenCV\neg\GinRight_1.jpg
C:\MyPython\OpenCV\neg\Gin_1.jpg
C:\MyPython\OpenCV\neg\Hisha_1.jpg
C:\MyPython\OpenCV\neg\Kaku_1.jpg
C:\MyPython\OpenCV\neg\KeimaRight_1.jpg
C:\MyPython\OpenCV\neg\Keima_1.jpg
C:\MyPython\OpenCV\neg\KinRight_1.jpg
C:\MyPython\OpenCV\neg\Kin_1.jpg
C:\MyPython\OpenCV\neg\Ou_1.jpg

がぶ:「C:\MyPython\OpenCV\pos」にて。
C:\MyPython\OpenCV\neg>cd ..

C:\MyPython\OpenCV>cd pos

C:\MyPython\OpenCV\pos>dir *.jpg /b > poslist.txt

C:\MyPython\OpenCV\pos>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は BE56-D581 です

C:\MyPython\OpenCV\pos のディレクトリ

2020/04/22 21:58 DIR .
2020/04/22 21:58 DIR ..
2020/04/21 22:18 46,029 KyoshaRight_1.jpg
2020/04/21 22:12 43,992 Kyosha_1.jpg
2020/04/22 21:58 33 poslist.txt
3 個のファイル 90,054 バイト
2 個のディレクトリ 33,055,059,968 バイトの空き領域

C:\MyPython\OpenCV\pos>

キラキラ:「poslistはファイル名と正解の対象物の数と位置(x軸、Y軸の範囲)を記入する必要があります。」とのこと。

ラッキー:ペイントで大体ですが、範囲を確認して、追記。
KyoshaRight_1.jpg 1 13 6 234 365
Kyosha_1.jpg 1 45 76 280 372

がぶ:「createsamplesコマンドを使用することで、1枚の画像から角度やサイズを変更した大量のサンプルを自動生成することが出来ます。」

C先生:22:03スタート。
C:\MyPython\OpenCV\pos>cd ..

C:\MyPython\OpenCV>opencv_createsamples.exe -info pos/poslist.txt -vec vec/posit
ive.vec -num 1000 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5
Info file name: pos/poslist.txt
Img file name: (NULL)
Vec file name: vec/positive.vec
BG file name: (NULL)
Num: 1000
BG color: 0
BG threshold: 80
Invert: FALSE
Max intensity deviation: 40
Max x angle: 0.8
Max y angle: 0.8
Max z angle: 0.5
Show samples: FALSE
Width: 24
Height: 24
Max Scale: -1
RNG Seed: 12345
Create training samples from images collection...

C先生:うーん。遅い。「-show」を足したら画像が見られるのだが、応答なし。

ラッキー:すみません。「poslist.txt」を上書き保存し忘れていました。大変申し訳ありませんでした。

C先生:まぁ、気を取り直して。22:23スタート
C:\MyPython\OpenCV>opencv_createsamples.exe -info pos/poslist.txt -vec vec/posit
ive.vec -num 100 -maxidev 1000 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5 -sho
w
Info file name: pos/poslist.txt
Img file name: (NULL)
Vec file name: vec/positive.vec
BG file name: (NULL)
Num: 100
BG color: 0
BG threshold: 80
Invert: FALSE
Max intensity deviation: 1000
Max x angle: 0.8
Max y angle: 0.8
Max z angle: 0.5
Show samples: TRUE
Scale: 4
Width: 24
Height: 24
Max Scale: -1
RNG Seed: 12345
Create training samples from images collection...

ラッキー:ちっちゃ!
20200421a.png

20200421a.png

がぶ:遅いですね、
OpenCVで物体検出器を作成する⑤ ~createsamples~
https://www.pro-s.co.jp/blog/system/opencv/6397
>>>
-showを指定した場合、enterキーで次の画像を見ることができます。
見るのを終了する場合はescキーで表示を終了できます。
>>>

キラキラ:Enter
Create training samples from images collection...
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(3.4.10) Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x +
roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.
rows) in cv::Mat::Mat, file C:\build\3_4_winpack-build-win64-vc15\opencv\modules
\core\src\matrix.cpp, line 466

がぶ:ぬおー。
OpenCVで物体検出器を作成する⑧ ~エラー対処~
https://www.pro-s.co.jp/blog/system/opencv/664 6

キラキラ:Assertion failed・・・?の場合、
>>>
vecのサイズは正しいですか?
「-w」と「-h」は、ベクトルファイルを作成した時と同じパラメータを指定してください。
>>>

C先生:いや、上記はtraincascadeのエラーだ。忘れよう。

ラッキー:「ディレクトリに必要な.dllファイルはありますか?」

がぶ:ファイル名の数字が少し異なるようですが、足りてそうです。

ラッキー:「パラメータを指定する際の半角スペースは正しく打たれていますか?」

がぶ:ハイフンやスペースは大丈夫そうです。そもそもコピペですし。

キラキラ:あ、分かりました。お馬鹿。「poslist.txt」の正解座標の記述がファイル同士で入れ替わっていました。たぶん。
KyoshaRight_1.jpg 1 13 6 234 365
Kyosha_1.jpg 1 45 76 280 372

KyoshaRight_1.jpg 1 45 76 280 372
Kyosha_1.jpg 1 13 6 234 365

C先生:ダメだったのでさらに確認。こちらが正しいです。上は「13 6」がおかしい感じ。
KyoshaRight_1.jpg 1 45 76 280 372
Kyosha_1.jpg 1 14 71 234 365

ラッキー:どうも矩形のはみ出しが原因の模様。
【OpenCV】画像認識で、対象物の位置を指定する短形のはみだしを自動で直してくれるツールを探しています【Createsamples】
https://teratail.com/questions/140639
>>>
こちらのサイト(「ゴリラになる知識」様へのリンク)などを見てみると、
おそらくROI(短形)のはみだしが原因だと考えられます。
>>>

ゴリラになる知識「ROIのはみだし」
http://gori-naru.blogspot.com/2012/11/blog-post_2819.html

がぶ:「Kyosha_1.jpg」ですが、301 x 369pxで、矩形は「Kyosha_1.jpg 1 14 71 234 365」で指定しているのではみ出しはなさそう。

キラキラ:「KyoshaRight_1.jpg」305 x 385pxで、矩形は「KyoshaRight_1.jpg 1 45 76 280 372」ではみ出しはなさそう。

C先生:分からないので、ファイルを直接指定しましょう。

ラッキー:
OpenCVで物体検出器を作成する⑤ ~createsamples~
https://www.pro-s.co.jp/blog/system/opencv/6397

C先生:お、今回は順調。
C:\MyPython\OpenCV>opencv_createsamples.exe -img ./pos/Kyosha_1.jpg -vec ./vec/o
oo.vec -num 50 -bgcolor 255 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle
0.5 -show
Info file name: (NULL)
Img file name: ./pos/Kyosha_1.jpg
Vec file name: ./vec/ooo.vec
BG file name: (NULL)
Num: 50
BG color: 255
BG threshold: 80
Invert: FALSE
Max intensity deviation: 40
Max x angle: 0.8
Max y angle: 0.8
Max z angle: 0.5
Show samples: TRUE
Scale: 4
Width: 24
Height: 24
Max Scale: -1
RNG Seed: 12345
Create training samples from single image applying distortions...
0%

ラッキー:Enterキーを押すごとに画像が変わっていきます。良い感じ!

がぶ:Done

キラキラ:「C:\MyPython\OpenCV\vec」に「ooo.vec」ファイルがあります。リネームしましょう。「positive.vec」

C先生:正解画像は50で少々少なかったか。。。

ラッキー:次!
C:\MyPython\OpenCV>opencv_traincascade.exe -data cascade -vec vec/positive.vec -
bg neg/neglist.txt -numPos 70 -numNeg 60
PARAMETERS:
cascadeDirName: cascade
vecFileName: vec/positive.vec
bgFileName: neg/neglist.txt
numPos: 70
numNeg: 60
numStages: 20
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
Number of unique features given windowSize [24,24] : 162336

===== TRAINING 0-stage =====
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(3.4.10) Error: Bad argument (> Can not get new positive sample. The most
possible reason is insufficient count of samples in given vec-file.
> ) in CvCascadeImageReader::PosReader::get, file C:\build\3_4_winpack-build-win
64-vc15\opencv\apps\traincascade\imagestorage.cpp, line 158

C:\MyPython\OpenCV>

がぶ:またエラーですか。今度は何でしょうか。
OpenCVで物体検出器を作成する⑧ ~エラー対処~
https://www.pro-s.co.jp/blog/system/opencv/6646
>>>
traincascadeでのエラー
Bad argument Can not get new positive sample・・・?
正解画像の枚数が足りていない!
>>>

キラキラ:確かに。-numPos 70では足りませんね。
>>>
ぴったりの数を指定しても、エラーが出る場合があります。
作った数よりも少なめ(9割程度の数)に設定しましょう。
>>>

がぶ:ネガ画像は18ですのでそちらも訂正。
C:\MyPython\OpenCV>opencv_traincascade.exe -data cascade -vec vec/positive.vec -
bg neg/neglist.txt -numPos 45 -numNeg 18
PARAMETERS:
cascadeDirName: cascade
vecFileName: vec/positive.vec
bgFileName: neg/neglist.txt
numPos: 45
numNeg: 18
numStages: 20
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
Number of unique features given windowSize [24,24] : 162336

===== TRAINING 0-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 1
Precalculation time: 0.267
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 0 seconds.

===== TRAINING 1-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 0.117647
Precalculation time: 0.234
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 1 seconds.

===== TRAINING 2-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 0.0168539
Precalculation time: 0.232
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 1 seconds.

===== TRAINING 3-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 0.00362027
Precalculation time: 0.225
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 1 seconds.

===== TRAINING 4-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 0.00101787
Precalculation time: 0.242
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 2 seconds.

===== TRAINING 5-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 0.000251946
Precalculation time: 0.234
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 1|
+----+---------+---------+
| 2| 1|0.0555556|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 3 seconds.

===== TRAINING 6-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 8.0175e-05
Precalculation time: 0.235
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1|0.0555556|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 4 seconds.

===== TRAINING 7-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 18 : 1.67937e-05
Precalculation time: 0.244
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 9 seconds.

===== TRAINING 8-stage =====
POS count : consumed 45 : 45
NEG current samples: 4

===== TRAINING 9-stage =====
POS count : consumed 45 : 45
NEG count : acceptanceRatio 0 : 0
Required leaf false alarm rate achieved. Branch training terminated.

C:\MyPython\OpenCV>

C先生:もうこの辺でいったん終了。

ラッキー:あとちょっとです。
OpenCVの勉強③(分類器を作成してみる
https://qiita.com/takanorimutoh/items/5bd88f3d17239a147581

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import cv2

# 入力画像の読み込み(テスト用画像ファイル)
img = cv2.imread("20200422a.JPG")

# カスケード型識別器(自作した分類器)
cascade = cv2.CascadeClassifier("cascade20200422.xml")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# face→ballに変更(そのままでもいいですけど)
shogi = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

# 顔領域を赤色の矩形で囲む
for (x, y, w, h) in shogi:
cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3)

# 結果画像を保存
cv2.imwrite("result_shogi_20200422.jpg",img)

#結果画像を表示
cv2.imshow('image', img)
cv2.waitKey(0)


がぶ:下記の3つのファイルを同じディレクトリに入れてVSCodeから実行。
「20200422a.py」(上記のプログラムファイル)
「cascade20200422.xml」(今回作ったカスケード分類器)
「20200422a.JPG」(判別したい画像)

キラキラ:結果は、
result_shogi_20200422.jpg

result_shogi_20200422.jpg

がぶ:元のファイルなんですけどね。

C先生:やり方は分かりましたね。お疲れ様です。