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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

解決済

1回答

6353閲覧

カスケード分類の精度の向上

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/01/16 12:50

python

1import os 2import glob 3import cv2 4 5for f in glob.glob('*.png'): 6 img = cv2.imread(f) 7 img_bin = cv2.inRange(img, (120, 21, 145), (214, 152, 204)) 8 fname, fext = os.path.splitext(f) 9 cv2.imwrite(f, img_bin)

上記のフォルダ内画像全二値化プログラムを使用し、ok,ng,sample全て同一条件で二値化して
opencvでカスケード分類をしましたが、画像数が各50枚以下ということもあるのか、精度は全然だめで、
そもそも二値化前と比べて精度が上がったのかよく分かりません(多少上がったかも知れない)。

もっと精度を上げるために、sample画像を何等かの方法で増やそうと思い、
createsamplesを使ってどうにかできないかと思っているのですが、
これは1つの画像を元に類似画像を作るもので、複数画像をcreatesamplesする方法がわかりません。
createsampleした画像はvecファイルにまとめられていますが、このvecファイルをどうにかいじればよいのかも知れませんが、
どのようにするのが良いでしょうか。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/18 13:17

OpenCVの物体検出を選んだ理由を教えていただけますか?(RPiでサクサク動かしたい等) 物体検出は統計的な手法ではありますが、現在主流の深層学習に比べて検出力はだいぶ低いです。「ガチ」で当てにいくのであればYOLOなどを使うと良いと思います。 アドバイス:https://www.pro-s.co.jp/blog/system/opencv/6202 物体検出をするのであれば、こちらのサイトが非常にわかりやすく参考になると思います。
退会済みユーザー

退会済みユーザー

2021/01/21 20:07

YOLOってなんなんでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/21 21:53

深層学習による物体認識技術の一つです。YOLOもOpenCVのカスケードと同じように「どこに」を検出できますが、OpenCVのカスケードは「何が」が基本的に1つしかできませんが、YOLOであれば「何が」が原理上何種類でも対応できます。また、「どれ位あっていそう?」という確率もついてくるので、データさえ揃えられるのであればOpenCVより使い勝手は良いと思います。
退会済みユーザー

退会済みユーザー

2021/01/22 01:32

それは、OPENCVみたいに、python等のプラグインみたいなものですか? 何が、が複数種類、とは、okファイルが複数ということでしょうか、 他で教えて貰ったやり方で一応okファイル複数の場合もできたのですが、 今度は何でもかんでも正解にしてしまいました。 また、色を考慮に入れる事はできないんでしょうか、YOLOは。
退会済みユーザー

退会済みユーザー

2021/01/22 12:46 編集

> それは、OPENCVみたいに、python等のプラグインみたいなものですか? そうなります。YOLOもPythonからインポートして使います。 > 何が、が複数種類、とは、okファイルが複数ということでしょうか、 それもできますし、違う種類のものもできます。 もし、リンゴがあって、きれいなリンゴと虫食いリンゴがあったときに、 「きれいなリンゴと虫食いリンゴを分けたい」であれば、 きれいなリンゴ(カテゴリ0)、虫食いリンゴ(カテゴリ番号1)とすればOK/NGの判定ができます。 「とりあえず何でもいいからリンゴを見つけたい」であれば、 きれいなリンゴ(カテゴリ番号0)、虫食いリンゴ(カテゴリ番号0)とすれば、出来栄えはどうであれリンゴを根こそぎ探すようになります。この使い方はOpenCVの物体検出の働きとそっくりな挙動をしめす(上にYOLOの方が精度が上の)はずです。 > 他で教えて貰ったやり方で一応okファイル複数の場合もできたのですが、 > 今度は何でもかんでも正解にしてしまいました。 OpenCVの物体検出は識別をするものというより、候補を割り出す働き(なので、候補を出した先にある「OK」「ダメ」は別のアルゴリズムで判定というやり方)の方がでOpenCVの物体検出できることに近いと思います。 漏れがあると後続の処理にすら流せなくなってしまうため、「あっているかはともかく、なるべく根こそぎ拾う道具」と割り切って使う方が良いと思います。 > また、色を考慮に入れる事はできないんでしょうか、YOLOは。 YOLOはカラー画像のデータを使えます。頑張れば深度情報を使った4chでも使えるかもしれません。 OpenCVの物体検出はグレースケールだけのはずですので、もしOK、NGの特徴が色にも反映されやすいのであればYOLOの方がやりやすいと思います。
退会済みユーザー

退会済みユーザー

2021/01/23 02:02

ん、カラーも認識材料に用いれるのでしょうか? 1.具体的にopcvと比べ、yoloはどのようやな検出方法が違うのか。 2.yoloはいかにして色を検出材料に用いているのか。 を知りたいのですが。
退会済みユーザー

退会済みユーザー

2021/01/23 09:32

> カラーも認識材料に用いれるのでしょうか? 少なくとも3.xまでのOpenCVの物体検出では3chカラー情報を材料に使えません。 YOLOでは3chカラー情報も材料に使うことができます。 1. 検出方法 OpenCVの技術 簡単に言えばいわゆる「機械学習」で領域検出する方法です。 具体的にはHOGやHAAR-LIKEを特徴量として、従来の統計学を使って似ている部分を探す検出方法です。 https://docs.opencv.org/3.4/d2/d64/tutorial_table_of_content_objdetect.html YOLOの技術) 簡単に言えば「深層学習」で領域検出する方法です。 具体的には畳み込みやプーリングといったフィルタ(層毎に割り振られた処理)によって生成される特徴量(計算結果)を使い、その計算結果に非線形の活性化関数をかけて、教師データに似た特徴を示す部分を探す検出方法です。 https://arxiv.org/abs/1506.02640 2.yoloはいかにして色を検出材料に 一枚のカラー画像を「縦横とRGBという3方向に広がっている箱」ととらえてください。これをそのまま畳み込んでいくイメージです。リンク先の「ネットワーク構造」の項目のイメージです。 https://dev.classmethod.jp/articles/research_paper_yolo/
退会済みユーザー

退会済みユーザー

2021/01/23 23:25

なんとなくですがイメージはつかめました。 Darknetというものをインストールする必要があるのですが、これは安全なのでしょうか?名前がちょっと。
guest

回答1

0

ベストアンサー

コメント欄だとわかりにくいのでこちらにまとめます。

質問への回答

ok,ng,sample全て同一条件で二値化

  • OKとNGとの2つに分ける、であればこの回答は無視してください。
  • グレースケールを二値化して白黒にする、であれば情報が欠落するので普通精度は落ちます。

もっと精度を上げるために、sample画像を何等かの方法で増やそうと思い

  • 物体検出は「検出(判別はしない)」の道具ですので、もともと精度は見込めません。
  • システム全体としての精度を求めるのであれば、
  1. 過剰に「物体検出」させて、そのあとに「判別処理」でOKかNGかそもそも別のものかを判別する。過剰検出させる方法については、物体検出器を作るブログの記事を読んで対応してください。
  2. 後述の改善策を採る。

複数画像をcreatesamplesする方法がわかりません。
createsampleした画像はvecファイルにまとめられていますが、このvecファイルをどうにかいじればよいのかも知れませんが、どのようにするのが良いでしょうか。

これも先のブログにまとめられています。

もう少し情報が必要であれば、サンプル画像をアップロードしてください。

物体検出について

これを満たすには、(よほど形状やグレースケールで判別できるものでない限り)「物体検出で過剰検出」させてそのあとに「後続の判別処理」が必須です。

OpenCVの物体検出の何がダメなのか?

  • (少なくともv3.xまで)OpenCVの物体検出ではグレースケールしか対応していない。情報の入力段階でカラー画像と比べて情報が1/3まで欠落している(dlibか何かの物体検出はカラー画像に対応していたと思います。

  • 物体検出単体では人間が適当に決めたパラメータを元に検出しているため、本当にそれで充分とは限らない。

  • 物体検出では検出力と検出の精度がイマイチな部分で完結するトレードオフの関係にあり、よほどわかりやすいもの対象物でない限り、満足な結果が得られない。

物体検出は一言で言えば、とっつきやすい一方、精度は期待できない枯れた機械学習の技術です。物体検出単品では「らしい場所」は提示できても、よほどわかりやすい対象物でない限り人間の認識からすれば「本当にそうかい?」と思う結果しかまずもって得られません。

「2. 後述の改善策を採る。」について

対策は大体以下の通りです。

1. 物体検出→物体の判別(SVM)
※2012年頃までの技術水準です。
課題:検出率が低い、SVMでは判別精度が低い
※これに対し、2012年頃にトロント大のヒントン先生がCNNベースの判別法を発表して今の深層学習の流れを作りました。

2. 物体検出→物体の判別(CNN)
※大体2015年頃までの技術水準です。
課題:検出率が低い、物体毎にCNNで判別するのでやたら遅い

3. 物体検出・物体の判別を同時に実施(YOLOやSSD)
※2015年以降の技術水準です。
課題:検出から判別まで深層学習で一撃でこなせるようになったので、速度も精度も劇的に改善
以降、YOLOのバージョンが上がりながら今に至る。

どうしてこんなに深層学習のYOLOの精度が高くて速いかを説明します。

  • グレースケールではなくカラー画像を入力に使えることで、画像の表現力がもともと高い。
  • 人間の職人芸から導かれた検出処理(例えば物体検出やSVM)が含まれていない
  • (良くも悪くも人間の常識抜きに)機械が統計的に導いた膨大な数の検出処理で成り立っている
  • 物体検出と物体の判別を融合させることで、比較的高速に、無駄なく、一撃(You Only Look Once)で処理きる

yoloはいかにして色を検出材料に

一枚のカラー画像を「縦横とRGBという3方向に広がっている箱」ととらえてください。これをそのまま畳み込んでいくイメージです。
「RGBの三つの異なるデータがあるのに、どうして最後にいつのまにかこれらが”組み合わさった”数値のデータに!」とモヤモヤすることと思います。これは「全結合層」という部分で膨大なデータを一次元に変換する処理があり、ここで数値の羅列に並んだ形に変換されて1つのデータに変換され、そのあと適当なデータ(座標やカテゴリ等)に分離されるととらえてください。


Darknetというものをインストールする必要があるのですが、これは安全なのでしょうか?名前がちょっと。

「中二病をこじらせた」タイトルとよく表現されていますが、安全と思います。Githubですべて公開されていますし、ほかの人たちも改善を加えたりしてよく手入れされています。
※githubのような公開されて、**よく手入れされている場所のソースコードやデータを使ってください。**正体のよくわからないサイトから複雑で膨大なソースコードを手に入れると、何か仕込まれている例があります(ずいぶん前に、膨大なソースコードの中にこっそりJPEGデータに偽装してIP等を送信するコードを挟み込んでいた人がいて、身内から干された、というアメリカ人がいました)。

投稿2021/01/23 23:39

編集2021/01/23 23:44
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/01/24 06:01

なるほど https://qiita.com/tizonaColada_99/items/74069885bf6d8a56ad63 ここにインストールの仕方が書いてあるのですが、なんか色々必要みたいなのですが、 OpenCVみたいにコマンドプロンプトでコード打って簡単に、というわけにはなかなかいかないのでしょうか。 また、OpenCVも必要そうなのですが、やはりCV依存なのでしょうか? あと、ソースは全て見る事が可能なのでしょうか?(結構色々インストールしているため、見れないものもあるのかなと。
退会済みユーザー

退会済みユーザー

2021/01/24 09:40 編集

インストール手順は上記の方の説明がわかりやすいと思います。コメントにあるようにいろいろインストールすることになります。OpenCVのように"pip install ..."より手順は増えますが、説明に沿って進めればできることと思います。 CUDA:GPUに行列計算をさせるためのライブラリ Visual sudio:Darknetをコンパイル(ソースコードを機械語に翻訳)する環境 > やはりCV依存なのでしょうか? 恐らくDarknet自体にはOpenCVは不要です。 https://github.com/pjreddie/darknet/tree/master/python ただし、OpenCVなのかPILなのかでDarknetに読み込ませる画像(や動画)をPythonで扱える形にする必要はあると思いますので、間接的にOpenCVは必要と思います。 > ソースは全て見る事が可能なのでしょうか? CUDAはNVIDIA、Visual studioはmicrosoftのものですのでたぶん公開されていませんが、YOLOに関しては確認できます。 https://github.com/pjreddie/darknet
退会済みユーザー

退会済みユーザー

2021/01/24 10:30

Visual studioっているんでしょうか? ただの便利なエディタみたいなものと思ってたんですが
退会済みユーザー

退会済みユーザー

2021/01/24 13:21

(Linuxではコンパイラが標準装備されているのですが)Windowsではコンパイラが入っていないのでVisual Studioが必要になります。確かに便利なエディタの機能もありますが、そのほかにコンパイラの機能が入っているのでどうしても外せません。 (参考) 一方、CUDAに関してはGPUがない環境(or NVIDIAのGPUがない環境)であればCUDAなしでYOLOのインストールができるとと思います。GPU=0だとかCUDA=0みたいなオプションになると思います。
退会済みユーザー

退会済みユーザー

2021/01/24 21:37

よくコンパイルという言葉をきくのですが、いまだに必要性が良く分かっていないのですが、 なぜcvみたいに、dlしてプロンプトなりpythonなりでそのまま実行、ができないのでしょうか? 間にコンパイルという作業をはさむ必要がいまいち、完成形で配布はなぜできないのか
退会済みユーザー

退会済みユーザー

2021/01/24 21:55 編集

私も同じようなことを考えたことがあります。腑に落ちないですよね。 > 間にコンパイルという作業をはさむ必要が ”パソコン”にはCPUがあって、OSが乗っかっています。 CPUも単にCPUというものが1つあるわけではなく、x86(32bit)やx64(64bit)のものや、ARMという超小消費電力なCPUがあったりします。 また、同じx64のCPUであっても、出た年代によって対応している命令の種類が異なります。 具体的なことは私にはわかりかねますが、OSとCPUによって対応できるプログラムの書き方が異なるため、その組み合わせに沿った機械語としてのプログラムの用意方法がコンパイルと理解しています。
退会済みユーザー

退会済みユーザー

2021/01/27 02:15

なるほど 「コンパイル」に、VisualStudioが必要なのでしょうか、 これは「ビルド」と同じ意味でしょうか?
退会済みユーザー

退会済みユーザー

2021/01/27 22:11

そうなります、コンパイルできる環境がVisual studioに入っています。C++の云々、です。 コンパイル・ビルドに関しては、 コンパイルで「機械が理解できるプログラム」を作って、ビルドで「"機械が理解できるプログラム"をパソコンの中に組み込む(モジュール群と連結する)」イメージで捉えています。
退会済みユーザー

退会済みユーザー

2021/01/28 02:09

なるほど。 YOLOのシステムについて調べてみました、大きな違いは、単独のOpencvと違い、 「ニューラルネットワーク」というものを用いているようで、 https://nnadl-ja.github.io/nnadl_site_ja/chap1.html このサイトに、簡単なニューラルネットワークのプログラムが載っているらしい(実際にまだ、じっくりと読んでセットアップ、実行していない)のですが、 たった74行、で、数字を認識できる、という、少し驚きのものなのですが、 通常の画像認識とは異なるという事で、どのような仕組みなのでしょうか。 また、上記サイトのプログラムは、簡単にセットアップ、実行できるものなのでしょうか?oepncvみたいに。
退会済みユーザー

退会済みユーザー

2021/01/30 04:49

> 通常の画像認識とは異なる 少なくとも参照先の手法は、SGDと呼ばれる最適化手法と学習誤差を縮めていくバックプロパゲーションという手法のコードです。これ単体では畳み込みやプーリングがなさそうですので恐らく機能しませんが、ニューラルネットワークの一番基本となる部分の核心部分です。 上記サイトのプログラムはほかのプログラムから引用するモジュールの一部分です。どれが一番上にくるプログラムか調べないといけませんが、インストール不要で使えると思います。 ただ、「ゼロから学ぶ」であればこういったゼロから作った断片もよいと思いますが、「試す」のが目的であればTensorflowのリファレンスの方がとっつきやすいはずです。 https://www.tensorflow.org/tutorials/keras/classification?hl=ja SGD等について詳しく質問があるようでしたら、もしのコメント欄よりも新しく質問を立てた方が良いと思います。
退会済みユーザー

退会済みユーザー

2021/01/30 10:47

上記サイトの説明の通りにやっても、機能しないのでしょうか?結局数字読み取りができないのであれば、このサイトを参考にしても今のところは意味がないかなと。 Tensorflowの上記サイトは、説明の通りにやっていけば読み取りができるのでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/31 09:46 編集

いわゆる機械学習ベースのカスケードは性能があまり高くなく、いわゆるディープラーニングを使った物体認識の方が性能が高いのは自明な話です。こういったことを知らない人が困らないようにと、本題のカスケード分類に対して「精度は知れていますが、それでもカスケードでやるならこういうやり方ですよ。ちょっと凝っててもいいなら別の手法もありますよ」という旨の回答をしました。 ところが、現状は元の質問に対してあまりにも内容が乖離しています。 Teratailは知らない誰かが質問できる掲示板で、知っている/手がかりを持っている誰かが回答できる掲示板です。この裏には、「誰かが困った何かで、ほかの方も同じ失敗はしないでほしい」という運営元の希望が含まれています。このような運営元の理念に沿った質問の仕方を考えれば、このコメント欄のように数珠つなぎにあれもこれもと、コメントに無配慮な質問を垂れ流すのは、このサイトを計画して設計して運営している方々も不本意と思います。 私はこれまでこうした、このサイトからにじみ出る運営元の考えに賛同して、回答してきました。こういう場に匿名で時間を割いて回答をしたところで、詳しければ詳しい人ほど時間対効果は上がらないといってよいと思います。それでも、「自分に利益が生まれなくとも構わない、努力をしている誰かが助かるならそれでいい」と私は思いますし、回答をしているほかの回答者の方々もそう考えておられるものと、私は勝手に思っております。 それゆえに、今後困るであろう人がここを見て助かるために、もっと見やすく試行した結果を残す配慮がいるだろう、という話に至ります。これを実現するために、質問者の質問に対して、コメント欄では回答しきれない画像や式等が必要なこともあります。それができるのが、質問と回答の投稿であって、コメント欄ではありません。 以降、本題からそれた質問についてはコメントに続けるのではなく、新しく別々の質問に分解して投稿されるべきです。今ここでつらつらと質問と回答を繰り返して、それで片付けばいいという性質のものではありません。 もし、本題の質問が解決できたのであれば一度クローズしてください。 もし、本題の質問の回答に不足があるのであればコメントください。 もし、本題の質問から派生した質問があるのであれば、別質問として投稿してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問