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

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

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

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

OpenCV

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

Python

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

Q&A

解決済

2回答

6770閲覧

画像処理を使い、画像上の建造物を物体として認識させたい

Teagle333

総合スコア15

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

OpenCV

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

Python

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

1グッド

1クリップ

投稿2018/10/09 07:41

前提・実現したいこと

画像上の特定の部分をオブジェクトとして認識させたい

具体的には、画像の空(そら)の部分との差分として、建造物を物体として認識できるようにし対と思っています。(空の領域に重なっていない物体は認識しない)
物体として認識することによって、例えばグラフなどを上に重ねたときにグラフと物体の交点が得られるような処理をおこないたいと思っています。
イメージ説明

試したこと

カスケードを用いた顔認識の方法は調べて出てくるのですが、建物の場合、カスケードファイルが存在しないので同じような方法ができません。

補足情報(FW/ツールのバージョンなど)

プログラミング言語:python3.6
開発環境:Winpython - Spyder
OS:Windows7

yohhoy👍を押しています

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

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

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

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

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

tiitoi

2018/10/09 08:13 編集

空の領域及び建物の検出が必要なので、結構難しい問題ですね。建物の検出を学習ベースで行う場合、データセット等は用意できるのでしょうか? 建物の種類は様々なのか、あるいは一軒家もしくはビルなどある程度絞られてるのでしょうか? ネット上のものでもいいので、検出するシチュエーションに近い画像があれば、貼っていただけると他の方もわかりやすいと思います。
Teagle333

2018/10/09 08:37

ご回答ありがとうございます。 検出する物体は、建物の種類によらず全ての建造物を想定しています。もっと言えば、建物だけではなく樹木など、空に重なるあらゆる障害物に対して認識を行いたいと考えています。ですので、データセットの学習による認識方法だと難しいと思います。説明が言葉足らずになってしまって申し訳ありませんでした。何か他の方法があれば、それについて教えて欲しい所存です。
guest

回答2

0

ベストアンサー

まず空は検出する必要がありますよね。例えば、このようなものを見つけました。

画像の各ピクセルを空とそれ以外に分けられたとして、空と判定されたピクセルの Bounding Box をとり、その中に含まれる物体は「空に重なっている物体」と判定したらどうでしょうか?

イメージ説明

グラフなどを上に重ねたときにグラフと物体の交点が得られるような処理

ここがいま一つイメージできないです。
なんらかの目的があってこの処理を行いたいのだと思いますが、どのような背景があるのでしょうか?

追記

なるほど、背景がわかりました。
方針としては、空の領域を検出し、矩形内の物体を空に重なっていると判定するのが良さそうですね。

この「sky-detector」について適用方法もしくはそれが載っているサイト等を知っていましたら、ご返答の方をお願いしてよろしいでしょうか。

「sky detection」で調べたら、たまたま出てきたのを貼っただけなので、有名なライブラリ等ではないです。
一応試しにビルドして試してみました。

サンプルにあった画像ではうまくいくのですが、

イメージ説明

他の画像で試したら、このようになってしまいました。

イメージ説明

パラメータを調整して改善するものなのかはまだわかりません。
この GitHub のコードにこだわらず、空の領域をセグメンテーションする手法をひろく調べてみるのがよいかもしれません。

追記

OpenCV で手軽にできたらいいなと思ったのですが、やはり様々な環境でうまく空領域を抽出するなら Deep Learning がいいかもしれませんね。
SegNet というモデルを試したところ、だいたいの画像でうまく抽出できました。
灰色が空と判定された領域です。

イメージ説明

イメージ説明

イメージ説明

イメージ説明

投稿2018/10/09 08:48

編集2018/10/09 10:01
tiitoi

総合スコア21956

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

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

Teagle333

2018/10/09 09:07

情報のご提供ありがとうございます。確かにこの方法なら目的の処理ができそうです。 「グラフと物体との交点を得る処理」については、天体や飛行物体の通過軌道を合わせることで、それが遮られる時刻や座標を導出しようと考えたためです。いずれにせよ、提供してくださった方法でまずは頑張ってみようと思います。 さらに要求してしまい申し訳無いのですが、この「sky-detector」について適用方法もしくはそれが載っているサイト等を知っていましたら、ご返答の方をお願いしてよろしいでしょうか。
tiitoi

2018/10/09 09:44

ビルドして試してみましたが、ネットから引っ張ってきた適当な画像だといい結果がでませんでした。 まずは空をセグメンテーションする手法を幅広く調べてみたほうがいいかもしれません。
Teagle333

2018/10/09 09:46

わざわざ実践までして評価していただいて、本当にありがたい限りです。回答者様からいただいた方法を中心に、今後試行錯誤しながら頑張っていこうと思います。 この度は本当にありがとうございました。
tiitoi

2018/10/09 10:02

OpenCV 以外のアプローチとして、Deep Learning の Segmentation 系のモデルがいいかもしれないです。ちょっと試してみたところ、割ときれいに抽出できました。 以下でデモを試せます。 http://mi.eng.cam.ac.uk/projects/segnet/demo.php#demo
guest

0

#「空領域を検出する」という処理は難易度が高いと思うので,それを行わない別の方向の話として……

処理対象の画像は自身で撮影するものに限定できるのでしょうか?
(それとも,てきとーに拾ってきた全ての絵に通用する方法が必要?)

もし,自前で撮影する想定であって,且つ,カメラの姿勢を推定できる方法を用意することが可能なのであれば,
画像内の地平線の位置が既知となるので役に立つ可能性があるかな,と.

検出対象を「地面から生えていて,撮影カメラ位置よりも高い場所まで伸びている物」と考えれば,画像内での対象の像は地平線を横切ることになりますから,
「領域分割した結果やエッジ等が地平線の上下に渡って存在していること」を1つの足がかりにできるかもしれません.
(人工的な"建造物"に限るなら,上下方向に延びるエッジが有用かも)

投稿2018/10/10 01:50

fana

総合スコア11654

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

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

Teagle333

2018/10/12 05:45

一応当初の目的としては、あらゆる場所で撮影した画像に対して適用できるようにする予定ですので、基本的に自身で撮影したものを使っていきます。 回答者様が提案された手法は、画像の内部データ(Exif等)を解析していくことで可能になるのでしょうか?具体的なプロセスがまだ把握しきれていないので、よろしければその方法について詳しく教えていただければと思います。
fana

2018/10/12 06:09 編集

極端な話,カメラに何かカメラ姿勢を知るためのセンサ(慣性センサ? 加速度センサ? 正しい名称はわからないけど…)を張り付けておけばいいんじゃないかな,とか… 画像処理だけで済ませるなら,処理対象の風景画像を撮影する際にカメラ姿勢を推定するのに必要なパターン画像みたいなのを別途撮影するという方法も考えられます.(風景画像の一部にそれ用のものが写り込むことを許容できるなら同時に撮影しちゃってもいい) 撮影時にカメラをわざわざロールさせないものと仮定すれば,ピッチ角さえ推定できれば画像内の地平線の位置(Y座標)がわかりますよね. そんな話でいけそうならば,例えば【水平な平行線が描かれている,地面に対して鉛直に立つ平面】を撮影して平行線像の消失点を使うとか.
Teagle333

2018/10/17 02:10

返信が遅れてすみません。 目標としている処理については、撮影画像のみで済ませるような方法を検討しています。ですので、採用するなら、画像内の地平線の位置からの推定になるかと思います。しかし、理解力不足で申し訳ないのですが、この ”【水平な平行線が描かれている,地面に対して鉛直に立つ平面】を撮影して平行線像の消失点を使う” というのがいまいちよくわかりません。ピッチ角等は、画像の内部データを解析することで取得できそうなのですが、そこからどう具体的に処理すれば地平線上の像を認識できるのかがまだわかりません。 加えて、また別の話になるのですが、この処理を全方向画像(表示形式は正距円筒図法)でおこなう場合、同じような方法でできるのでしょうか。
fana

2018/10/17 05:02

3次元な絵を描く方法として「パース法」とかいう方法がありますよね. 2次元の画像平面上で一点(消失点)から引っ張った直線群を利用して,"3次元空間上で平行な"線群の像を描くやつ. これのちょうど逆方向の事です. 要するに,「3次元空間上で平行な線群」を実際に用意して撮影してやり,画像上での消失点位置を求める. 撮影した線群が地面と平行であれば画像上でその消失点は地平線上にあるハズ. 画像の図法によらず上記のことを考えることはできると思いますが,撮影した線の像が曲線として写る世界だと単純に「消失点を求む処理がなんか面倒」な気がしますので,その場合には適当に必要な視野範囲をふつーのPinholeカメラモデルな絵に変換した絵の上で処理してやれば良いのではないでしょうか.
Teagle333

2018/10/23 01:10

ご説明ありがとうございます。大まかな手法については理解できました。 つまり、通常の風景画像でおこなう場合、 ・画像を撮影する際に、立方体状の物体と一緒に撮影し、その物体から線を延ばして消失点を求める ・求めた消失点のy座標値を”地平線の位置”として、それより上の像を認識させる ということでしょうか。 ただ、この ”線を延ばして消失点を求める” という行為を自分の手でおこなうことはできても、プログラムの処理でおこなわせることができません。 また、”消失点位置より上の像の認識” を具体的におこなう方法がまだわからないので、現在も調査中です。 自分はPythonでこのプログラムを組みたいと思っているのですが、画像処理プログラミングについてはまだ不慣れなもので、ベストアンサーとして選ばせていただいた方の方法も含め、いまだ試行錯誤している状況です。こういった処理のコーディング方法についてももし知っていましたら、ぜひ教えていただきたいです。
fana

2018/10/23 01:53

まず,元々「パターンを撮影すること」を推しているわけではありませんので,ご自身の想定する撮影環境や必要精度を鑑みて「実施可能な話か否か」の判断は行ってくださいね。線群の「水平」の精度が悪いと「三脚の目盛を見た方がマシ」ということになるでしょうし. まぁ今回の話では,地平線の推定位置が多少上下しても影響はないように思うので,そこまで神経質になる必要はないのかもしれませんが. > 線を延ばして消失点を求める 本当にやりたいこと のための準備作業なので全自動じゃなくてもよいのではないでしょうか. 直線(線分)を適当に検出した結果を人が見て「消失点見つけるのに使う用の線はこれらだよー」というのは人が入力するとか. > 像の認識 結局のところ,ここが一番難しいと思います.「こうすればできる」というのは言えないので,ここらへんのことは ベストアンサーの方が示しているような領域分割手法等を含めて色々と検討するしかないと思います.
fana

2018/10/23 02:04

(実用性の無い遊びの範疇の話ですが,実世界の水平垂直に対するカメラの姿勢を推定する手段として,{水槽にいれた色水,糸と重り}を使った経験があります^^)
Teagle333

2018/10/23 03:05

ご回答ありがとうございます。 今回は、とにかく様々な方法を模索して可能性を見出そうと思い、質問させていただきました。 御二方の貴重な情報提供により、少しでも目的達成の足がかりになったかと思います。 まだまだ、わからないことやできないこともありますが、引き続き検討を進めていこうかと思います。 ここまで、ご丁寧に解説してくださり、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問