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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

3233閲覧

静止画内のシール数を色別にその場でカウントしたい+静止画をその場で解析して対象の太さを大体知りたい

n-kk

総合スコア12

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/10/02 07:46

編集2018/10/03 02:11

お世話になっております。

今回は、python3 + opencv + tensorflow にて以下のようなことをやりたいと考えているのですが
どのようにすれば実現できるのか分からない為、ご質問させて下さい。

(やりたいこと)
1.USBカメラで撮影した静止画の中にある色の付いたシールの個数を色別にカウントしたい。
⇒赤:4、青:3、黄:3、緑:3、白:3 など
イメージ説明

2.1.の静止画でシールを貼ってある対象の太さを知りたい(画像はシールを貼ってあるものと仮定する)
イメージ説明

イメージとしては
撮影⇒設備配管の径とその本数、太さ、シールの色が知りたいです。
シールの色は配管の太さによって変えます
赤:100mm
青:80mm
などです。

OpenCVとtensorflowを使えば出来そうだと思っておりますが
OpenCVを殆ど使ったことがない為、どういった具合で処理をかけばいいのかさっぱり分かりません。
こんな関数あるよとか、こんなライブラリ使えば直ぐできるよとか、こんな参考HPあるよといった
ありましたら、ご教授頂ければと思います。
また、tensorflowもこう言ったニューラルネットワーク構築すると精度上がるよなどアドバイス頂けますと
大変助かります。

どうぞよろしくお願い致します。

10/03(水)追記致しました。

用途イメージとしては、こちらの画像の赤の数をカウントしたいと考えております。
↓これならば赤4つ、赤マーキングが付いているので太さは100㎜など
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

課題1について

シールの色は決まっているので、単純が画像処理でいいと思います。

2値化する。

python

1import cv2 2import matplotlib.pyplot as plt 3from matplotlib.patches import Polygon 4 5img = cv2.imread('image1.jpg') # 画像を読み込む。 6 7# 色基準で2値化する。 8hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV 色空間に変換 9 10red = cv2.inRange(hsv, np.array([145, 70, 0]), np.array([180, 255, 255])) 11yellow = cv2.inRange(hsv, np.array([10, 80, 0]), np.array([50, 255, 255])) 12green = cv2.inRange(hsv, np.array([30, 190, 0]), np.array([90, 255, 255])) 13blue = cv2.inRange(hsv, np.array([108, 121, 0]), np.array([120, 255, 255])) 14white = cv2.inRange(hsv, np.array([108, 21, 0]), np.array([255, 70, 255])) 15 16# 白だけゴミがあるので、収縮演算 17kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 18white = cv2.erode(white, kernel) 19 20 21bin_imgs = {'red': red, 'yellow': yellow, 'green': green, 22 'blue': blue, 'white': white} 23 24# 2値化結果を可視化する。 25#################################################### 26fig, axes_list = plt.subplots(2, 3, figsize=(10, 6)) 27axes_list[1, 2].remove() 28for ax, (label, bin_img) in zip(axes_list.ravel(), bin_imgs.items()): 29 ax.axis('off') 30 ax.set_title(label) 31 ax.imshow(bin_img, cmap=plt.cm.gray) 32plt.show()

イメージ説明

輪郭抽出して、輪郭の数を数える。

python

1fig, ax = plt.subplots(figsize=(8, 5)) 2ax.axis('off') 3ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 4 5# 輪郭検出し、数を求める。 6############################################## 7for label, bin_img in bin_imgs.items(): 8 _, contours, _ = cv2.findContours( 9 bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 10 # 輪郭を構成する頂点数で誤検出を除く。 11 contours = list(filter(lambda cnt: len(cnt) > 30, contours)) 12 count = len(contours) 13 14 print('color: {}, conunt: {}'.format(label, count)) 15 16 # 描画する。 17 for cnt in contours: 18 cnt = np.squeeze(cnt, axis=1) # (N, 1, 2) -> (N, 2) 19 ax.add_patch(Polygon(cnt, fill=None, lw=2., color=label)) 20plt.show()

イメージ説明

OUTPUT

1color: green, conunt: 3 2color: blue, conunt: 3 3color: red, conunt: 4 4color: white, conunt: 3 5color: yellow, conunt: 3

課題2について

2.1.の静止画でシールを貼ってある対象の太さを知りたい(画像はシールを貼ってあるものと仮定する)

配管に貼ってあるシールで大きさを決めるということでしょうか?
それとも、配管の太さは別途検出するということでしょうか。

後者の場合、撮影する距離が固定とか限定された条件がない限り、画像からは実際のスケールはわからないので無理です。

追記

CNN で物体の検出、分類を行う場合、以下のアプローチがあります。

  • クラス分類: 与えた画像からクラスを分類する。
  • 物体検出: 与えた画像から物体の位置及びクラスを矩形で検出する。
  • Semantic Segmentation: 与えた画像から物体の位置及びクラスをピクセル単位で分類する。
  • Instance Segmentation: 与えた画像から物体の位置及びインスタンスをピクセル単位で分類する。(同じクラスの物体が複数写っている場合、それぞれ区別する。)

難易度としては後者ほど難しくなります。
また物体検出や Segmentation は、大量の画像に対して人手でアノテーションを行わないといけないので、データセット作成にかなり労力がかかります。

イメージ説明
引用元 Semantic segmentation2

投稿2018/10/02 10:34

編集2018/10/05 04:56
tiitoi

総合スコア21956

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

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

n-kk

2018/10/03 00:45

御回答いただき誠にありがとうございます。 また、分かり辛い説明で失礼しました。 2.の配管ですが、前者のシールで大きさを決める訳ではありませんが、大きさを見分ける用途で使用出来たらと考えております。 配管は予めテンソルフローを用いて太さを学習させておこうと考えております(配管の太さ=径、はJISなどの規格で全て決まっている為) その学習データを用いて「この配管は径100㎜の配管だ」と言った事が出来ないかと考えておりました。 シールは同じ太さの配管が数種類・複数本ある場合「この配管は径100㎜の配管だ。赤のシールが貼ってある奴は全部100㎜だ。もう一つの配管はΦ80㎜だ。こちらは青のシールが貼ってある奴は全部80㎜だ」と言った事がカメラで撮影した時に調べられたらなと考えておりました。 恐れ入りますがよろしくお願い致します。
tiitoi

2018/10/03 04:52 編集

`配管は予めテンソルフローを用いて太さを学習させておこうと考えております` Deep Learning の仕組み等については勉強していますでしょうか? 学習するには、input (画像) に対して、モデルにどういう output をさせるのかを考え、タスクを明確にする必要があります。 そこで考えてみたのですが、画像のように複数の配管が写っているので「1枚の画像がどのクラスに属するかを判断する」分類問題ではないですよね? また配管がつながっており、インスタンス (検出対象物) の区切りが曖昧なので、YOLO のような物体検出でもなさそうです。 他に画像から対象物があるピクセルの領域及びクラスを推定するセグメンテーションもありますが、今回のケースは全部パイプで素人目には太さ以外の見た目がほぼ同じに見えますし、所感としてはかなり困難であると思います。 質問者さんのほうでは、どのようなタスクとして学習させるかなにかアイデアがあったりしますでしょうか?
n-kk

2018/10/05 02:39

回答者様 御返信が遅れてしまい大変申し訳御座いません。 教師データはかなりあり8000万枚程あるので、こちらである程度覚えこみをさせる特徴点は決めており、配管の節の層やΦ、それ以外にも撮影距離にもよって静止画上の太さは変わるので0.5m~2mの撮影距離を10cmピッチで画像を精査し、それを更に静止画を縦横のグリッドで分割して、特徴点の抽出をしようかと考えておりました。 こちらに掲載した画像はあくまでも一例でした。 ですが私自身考えた結果 回答者様が2.の前者で仰っていた方法の方がなんだか良い気がしてきました。 不躾で大変申し訳御座いませんが、マーカーを付けたパイプと太さをシールの色で紐付けすると言った解釈で相違ないでしょうか。 恐れ入りますがよろしくお願い致します。
fana

2018/10/05 03:12

シール(=マーカー?)の意味(用途)がよくわからないのは私だけ……? 実際に配管の検出を行うべき環境において「配管には須らくシールが貼ってあることが常に期待できる(!)」という話なのか, それともシールを張るというのは単に開発中のテスト環境の話なのか
tiitoi

2018/10/05 05:03

> 教師データはかなりあり8000万枚程あるので 8000万枚はすごいですね。データ量として十分だと思います。 ただ Deep Learning の場合、画像に対して人手でアノテーション (正解データ作成) する必要があり、画像分類ならまだしも、物体検出、Segmentation の場合はかなり労力がかかります。 > こちらである程度覚えこみをさせる特徴点は決めており、配管の節の層やΦ、それ以外にも撮影距離にもよって静止画上の太さは変わるので0.5m~2mの撮影距離を10cmピッチで画像を精査し、それを更に静止画を縦横のグリッドで分割して、特徴点の抽出をしようかと考えておりました。 Deep Learning の場合、特徴点は自動で抽出するものなので、上記のように特徴が定義できるのではあれば、画像処理で行うのもありだと思います。 > 回答者様が2.の前者で仰っていた方法の方がなんだか良い気がしてきました。 > 不躾で大変申し訳御座いませんが、マーカーを付けたパイプと太さをシールの色で紐付けすると言った解釈で相違ないでしょうか。 はい、マーカーを検出して、そのマーカーに紐付いた「パイプと太さ」の情報を得るのが一番手軽ではないかと思います。 マーカーは大きさや色など変えて検出しやすいようなものを選ぶとよいでしょう。 あと、もしかしたら類似事例で先行研究がないか論文調査もしてみるといいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問