質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

4891閲覧

Windows10上でのカスケード分類器作成について

mirrage

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/10 09:53

編集2020/01/16 09:13

#実現したいこと
以下の環境で新たに「正解」「不正解」のカスケード分類器を作りたいです。
Jupyter NotebookでCNNを使って二値分類するために準備しています。
以下のエラーが出ているのでそれを克服するための解決法をどうかお願いします。
(追記1)今回使用する画像は自分で作ったLSIレイアウト画像から分割したもので、正解か不正解かという情報がありません。(例えば画像上にバグがあるかないかを判定)
(追記2)なので、分割したものすべてを自分で正解と不正解に選択したという前提になっています。 

#途中経過
以下のURL主に☆印を中心に参考にファイル・フォルダーを作成。

#発生した問題

Train dataset for temp stage can not be filled. Branch training terminated. Cascade classifier can't be trained. Check the used training parameters.
Image reader can not be created from -vec ./test.vec and -bg ./ng/nglist.txt.

サイトによって用意する正解画像・不正解画像の枚数が違うこと。(例:1000枚用意する場合:正:誤=700:300、1:たくさん)
#試したこと
「枚数が満たされていない」と出たので枚数を合わせてみましたが結果は同じでした。

#参考URL
☆ https://www.pc-koubou.jp/magazine/21280
・ https://www.pro-s.co.jp/blog/system/opencv/6397
・ http://tomooomin.hatenablog.com/entry/2016/11/17/122454
・ https://qiita.com/penstood/items/97421a91d3f4075d39a4

#OS環境
Windows10
Python3.7
OpenCV3.4.2

#主に使うツール
Jupyter(TensorFlow16)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/01/10 14:54

何が問題なのかがわかりませんが。
mirrage

2020/01/11 08:34

本文の編集と若葉マークを付加しました。
guest

回答1

0

「カスケードが学習できないせいでCNN用の画像も確保できないので困っている。せめて正解率が低くてもいいのでカスケードの学習ができる状態まで持っていきたい。」と理解しました。違ったらコメントください。

まずはこちら(恐らく同じエラーで困った人の解決策)を参照ください。

要旨)

  • インストール先がC直下であること

(恐らくOpenCVのフォルダに日本語やスペースが入るとコケる?)

  • 管理者権限下(コマンドプロンプトの管理者として~で行っている)こと

投稿2020/01/11 00:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mirrage

2020/01/12 08:13

読みました。 でも私の場合インストールするとき「C:\…」といった形でインストール先を選びました。 また、ここで質問ですが、正解画像と不正解画像の枚数はどれくらいの比率がいいでしょうか。 枚数によって学習精度が変わることはわかっています。 現在正解200枚不正解200枚計400枚です。 最初は正解50枚不正解350枚でやりましたが、できなかったので上記の比率でやりました。 それか枚数増やしたほうがいいでしょうか?
退会済みユーザー

退会済みユーザー

2020/01/12 08:27

> 正解画像と不正解画像の枚数はどれくらいの比率 枚数は確かに増やした方が良いと思います。 具体的なコツ等は以下のリンクに相当細かいてあるようですので参照ください。 https://teratail.com/questions/92672 あとは、カスケードでの選別は「ボチボチ」ですので、頑張ってチューニングしたり時間をかけても、ちょっとなぁ、というような結果しか得られなかった記憶があります。 ですので、CNNで細かく見るのを前提に、多少過検出ぎみにカスケードで検出させて、「そもそも評価対象か誤検出かのCNN」→「評価対象であれば正解・不正解のCNN」のようにした方が良さそうな気がします。
mirrage

2020/01/12 14:05

サイトによって、正解不正解の比率は違いますが、どっかのサイトかは忘れましたが、最初は正解1枚残り全部不正解にするほうがいいみたいなことが書いてありました。 やっぱり枚数を増やしたほうがいいという話ですが、とりあえずサイトの中で多かった正解7000枚不正解3000枚計10000枚でやってみます。 いや、それだと多いのでまずは計2500枚でやります。(ここは自由にします)
mirrage

2020/01/15 05:34

http://mirai-links.com/2018/06/11/opencv-%e7%89%a9%e4%bd%93%e6%a4%9c%e5%87%ba%e3%80%81%e5%88%86%e9%a1%9e%e5%99%a8%e4%bd%9c%e6%88%90%e3%81%a8%e6%a4%9c%e5%87%ba%e3%83%86%e3%82%b9%e3%83%88%e3%80%80%e3%81%9d%e3%81%ae%ef%bc%92/ こちらのサイトによると、エラーした場合不正解画像のリストを修正する、と書いてあります。 このサイトには詳しく書いていないので、方法を詳しく教えてください。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2020/01/15 12:14

@エラーがTrain dataset for temp stage can not be filled. (略)の場合 1 掲載のページの場合、ネガティブリストのファイルパスをフルパスで指定してください、とのことです。 abc.pngをd:\target_image\abc.pngにする感じでしょうか? @エラーがTrain dataset for temp stage can not be filled. (略)の場合 2 たしかPositiveのリストがあって、その中から「指定した数」だけ学習に使われる、という学習処理が中でされていたと思います。で、この時に、「なんかちょっとこれは良品のサンプルとしてどうよ?」判定を内部でされた場合には、Positiveリストから対象の画像が割愛されるようになっていたと思います。この時に、Positiveリストのプール(?)がどんどん学習するに従って減っていき、初期に指定した「指定した数」を下回る時が来ます。 これが原因でエラーが起きているのだとしたら、学習に使用するPositiveの画像の「指定した数」を減らしてください。推奨は80-90%くらいだったと思いますが、不具合が気になるようでしたら70%くらいまで減らした方が良いと思います。 @エラーがTrain dataset for temp stage can not be filled. (略)の場合 3 acceptanceRatio が異常に小さい(浮動小数点)の場合、過学習が起きていると思われるので、その場合にはもっと上のステージで学習を止めた方が良いと思います。
mirrage

2020/01/16 08:15

場合1について質問です。 ネガティブリストのファイルパスをフルパスで指定、 d:\target_image\abc.pngにする感じとありましたが、コマンドプロンプトでそのまま d:\~を入れるんですか?(違いますよね) 普通に ``` dir *.png /b > neglist.txt ``` って打ってもネガティブリストの中身は変わりませんでした。
退会済みユーザー

退会済みユーザー

2020/01/16 16:26

> ネガティブリストのファイルパスをフルパスで https://qiita.com/yshi12/items/ee2adc63378283e51458 の"negative.dat”のようなものと理解をしています。ここ数年触っていませんので怪しい記憶ではありますが、このURLの方が具体的に書いていらっしゃいますので、これであっていると思います。
mirrage

2020/01/18 09:10

これを枚数分書かなきゃいけないってことですよね? 大変ですね(汗)
mirrage

2020/01/18 09:16

「実現したいこと」に追記を追加しましたので、読んでくださると嬉しいです。
mirrage

2020/01/18 10:09

今の状況を説明しますと ・「https://www.pro-s.co.jp/blog/system/opencv/6397」を参考に分類器を作りたい ・vecファイルを生成したものの中身は1KB ・今回使う画像は不良情報がなく、仮に正解があると推定した画像2500枚(自分で決めた) ・不良情報のない画像をそれぞれposファイル内とnegファイル内に分類 ・「pos」には正解画像1000枚のみ ・「neg」には不正解画像1500枚とneglist.txとneglist(テキストドキュメント) ・test.vec生成済み ・質問文のエラーのとおりで行き詰っている ・「cascade」はまだ空 といった感じです。
退会済みユーザー

退会済みユーザー

2020/01/18 13:24

> 不良情報のない画像をそれぞれposファイル内とnegファイル内に分類 カスケードは良/不良を選別するための「判断したい領域をくり抜く」技術です。カスケード自体は良/不良を選別する目的で作られたわけではないため、この使い方ではうまく分離できないと思います。 良くある例でいう「男女をCNNで判定させたい」をしようとする際に、写真全体をCNNに突っ込まず「HAAR-LIKEで顔っぽい場所」のみをくり抜いてCNNに突っ込むという具合です。 LSIレイアウト画像の良/不良をCNNで裁くのであれば、前処理のカスケードは「目的以外のものが入っている画像(でたらめな背景等)から目的のLSIレイアウト部分を含む領域をくり抜く」処理で使われるべきです。そのあと、抜き出した領域をCNNで良否判定する流れになります。 > これを枚数分書かなきゃいけないってことですよね? リストの作成は上記にて提示されたURLのコマンドプロンプトで作成可能ですし、ファイル名をフルパスに変えたいのであれば、Excelか何かでテキストデータを読み込んでヘッダーを自前で(オートフィル等)で埋めるか、notepadの置換で一気にヘッダーを付与するか、等をすればそれほど手間はかからない(コミコミ数分くらいで済む)はずです。
mirrage

2020/01/20 17:23

夜遅くにごめんなさい。 ネガリストをフルパスした結果こうなりました。 C:\Users\■■■■■■■■■\Desktop\cv>opencv_traincascade.exe -data ./cascade/ooo/ -vec ./vec/ooo.vec -bg ./neg/neglist.txt -numPos 900 -numNeg 1500 PARAMETERS: cascadeDirName: ./cascade/ooo/ vecFileName: ./vec/ooo.vec bgFileName: ./neg/neglist.txt numPos: 900 numNeg: 1500 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 ===== <BEGIN OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(3.4.2) 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-win64-vc15\opencv\apps\traincascade\imagestorage.cpp, line 158 このサイトのいろんなURL(質問文)見てみると16ステージでおしまいみたいなんですがどうでしょうか。
退会済みユーザー

退会済みユーザー

2020/01/20 21:52 編集

> 「pos」には正解画像1000枚のみ > Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file. > numPos: 900 > numStages: 20 > minHitRate: 0.995 正解画像900枚、ステージ20、正解率99.5%、結果、(通常は)学習させるだけのデータを確保できなかった時に起きるエラーが発生。 恐らく、これはカスケード分級器に対して「求めすぎ」です。もっと緩いシステムなので、初めから2回目のコメント(2020/01/12 17:27)のように、もっと曖昧なものとして捉えるべきです。 https://takmin.hatenablog.com/entry/20140713/1405268192 に大変よく対策がまとめられています。 恐らく、 ・ 1000枚中最低でも900枚を評価に使いたい設定で運用開始。 ・ ステージ0で認識できなかった「良」画像は900/1000=90%を下回った。 ・ 結果ステージ0で学習に使うことのできるデータが900より少ない(例えば899)だったので、要求水準の「最低でも900枚」を満たせなかった。 ・ これはエラーだ! ・ Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file. (VECファイル1000枚分から既に101枚以上評価に使えない検出漏れ画像があったので、学習に使えるデータが確保できませんでした。大方これが原因です。の意) 解決するには、 0. numPosを下げる (ステージで使う学習に使う画像ファイル数を減らす、結果、プールの1000枚から減っていく「使えなかった画像」の減りも遅くなるので上記エラーが出にくくなる) 1. VECファイルさらに増やして、numPosを維持 (学習用データのプールを1000枚から増やす) 2. VECファイルはそのままで、minHitRateを下げる (学習のハードルを下げる) この場合、0が王道です。余裕があれば正解のVECファイルを増やせば良いですが、データ増強した画像は思うほど役に立たないのが常ですので、あまり当てにせず地道にデータを増やした方が信頼性の高いカスケード分離器ができると思います。
mirrage

2020/01/21 04:37

教えてくださりありがとうございます。 参考にさせていただきます。 また何かあったときは本当に申し訳ありませんが宜しくお願い致します。
mirrage

2020/01/21 05:44 編集

https://takmin.hatenablog.com/entry/20140713/1405268192 ただいま上記のサイトを参考に「numPos」の数を決めています。 質問ですが、NとSがどの数字に該当するのかわかりません。 Nはvecファイル内のサンプル数、Sは適当なバッファとありましたが、 (01/21/02:23)のコメントではNとSはどれになるんですか。 「minHitRate」と「numStages」は分かっています。
mirrage

2020/01/21 09:40

こちらがvecファイルを作成しようとしたときの結果です。 同じサイトを参考にしています。 C:\Users\■■■■■■■■\Desktop\cv>opencv_createsamples -info positive.txt -num 1000 -vec hoge.vec -w 30 -h 30 Info file name: positive.txt Img file name: (NULL) Vec file name: hoge.vec BG file name: (NULL) Num: 1000 BG color: 0 BG threshold: 80 Invert: FALSE Max intensity deviation: 40 Max x angle: 1.1 Max y angle: 1.1 Max z angle: 0.5 Show samples: FALSE Width: 30 Height: 30 Max Scale: -1 RNG Seed: 12345 Create training samples from images collection... Unable to open file: positive.txt Done. Created 0 samples 最後に「0サンプル生成しました(=サンプルを生成できなかった)」となったので、ファイル内のサンプルを生成できなければ実行もできないと考えられます。 今回使う画像は自分で作ったレイアウト画像なので、サンプルを作れないかもしれません。 これを先にいうべきでしたねすみません。 一応他の方法も調べてみました。 https://techblog.nhn-techorus.com/archives/8349 こちらは他の方に相談した時に紹介してくださったサイトです。
退会済みユーザー

退会済みユーザー

2020/01/21 21:25 編集

> Nはvecファイル内のサンプル数、Sは適当なバッファとありましたが、 > (01/21/02:23)のコメントではNとSはどれになるんですか。 そのサイトの概要は分かりましたが、英語のサイトと内容の相違があったため「参考」止まりと考えています。 私も何年も前にやって後は触っていないことですので、説明の大筋は合っていますが、具体的な数値や引数の説明までは出来かねます。後はコメントを元に適当に数値を変えて試された方が良いと思います。 何にせよ、コツは「学習に使う正解画像の数は用意した正解画像(プールされている画像)の7割くらいを指定する(ステージが進むごとにプールの大きさが小さくなっていくため)」です。ちょっと言葉が悪いですが、後はステージを経てもチューニングしても、カスケードは「所詮カスケードだわねぇ」と言われても仕方がないような分離性能しかありませんし、恐らく出来上がった時にそう思われることと思います。あまり深追いしない方が良いと思います。
mirrage

2020/01/22 03:06

返事遅れてごめんなさい。 やっぱりそうですよね。 いろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問