質問するログイン新規登録
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

OpenCV

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

Python

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

Q&A

解決済

2回答

1763閲覧

重なった画像をカウントする方法

python01

総合スコア21

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

OpenCV

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

Python

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

0グッド

1クリップ

投稿2023/12/10 14:16

編集2023/12/13 12:12

0

1

実現したいこと

・部品の数をカウントしたいです。検査ラインにおいて、部品が重なって出てくる為、
重なった状態の部品数をカウントしたいです。

前提

Pythonを使用し、ラズベリーパイでカメラを取り付けて
検査ラインに実装できたらと考えています。

発生している問題・エラーメッセージ

過去質問を色々参考にしているところですが、
下図のように部品が重なっている場合、次のどちらの方法で
実現したらいいのか不明です。

<部品のイメージ>
下図は部品検査時の例で、8本のボルトを検査している画像になります。

イメージ説明
※部品同士は、基本的に重なった状態で検査します。

1)opencvなどで画像処理を用いる
2)深層学習を用いる

共に方法を勉強する段階なので、
方向性をはっきりさせた上で学習に着手したいと考えております。

追記:調査したこと

①Pythonでコーヒー豆カウント
→2値化、ぼかし処理、検証方法はここでわかりましたが、
重なった時のカウント方法はここでは不明。

②tensorflow 自動着色 + OpenCV 輪郭抽出で花の数をカウント
→深層学習が有効そうであれば、ここを参考にして進めようと思っております。

追記:試したこと

下記のフェーズ1で評価中です。

フェーズ1:重なっていない画像でカウント
フェーズ2:重なった画像でカウント
フェーズ3:機械学習を用いる
フェーズ4:実画像で検証
フェーズ5:カメラの動画で検証

<フェーズ1>
細かい部分はまだ理解できていませんが、
2値化して輪郭を探してカウント。の部分まではできそうな感じです。

参考URL:①Pythonでコーヒー豆カウントを参考に作成

python

1import numpy as np 2import cv2 3import matplotlib.pyplot as plt 4 5def display(img,cmap=None): 6 fig = plt.figure(figsize=(10,8)) 7 ax = fig.add_subplot(111) 8 ax.imshow(img,cmap=cmap) 9 10test_img = cv2.imread("phase1_test.jpeg") 11 12# 中央値フィルターを使ったぼかしの適用 13test_blur = cv2.medianBlur(test_img ,5) 14#display(test_blur) 15 16# グレースケールに変換 17gray_test = cv2.cvtColor(test_blur,cv2.COLOR_BGR2GRAY) 18display(gray_test,cmap='gray') 19 20# 2値化処理 21# 画像の特徴的な部分、関心のある部分を抽出するように変換する処理 22ret, test_thresh = cv2.threshold(gray_test,248,255,cv2.THRESH_BINARY_INV) 23display(test_thresh,cmap='gray') 24 25#カウント 26contours, hierarchy = cv2.findContours(test_thresh.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) 27 28for i in range(len(contours)): 29 if hierarchy[0][i][3] == -1: 30 cv2.drawContours(test_img, contours, i, (255, 0, 0), 5) 31 32display(test_img) 33print(len(contours))

結果:
イメージ説明

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

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

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

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

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

meg_

2023/12/10 23:08 編集

2番の方法が良さそうですが、部品同士の重なりが多い・大きいと難しい(精度が落ちる)かと思います。 イメージ画像によるとかなり重なっていますがこれは改善できないのでしょうか?
fana

2023/12/11 01:37 編集

【とにかく全く何の制限もない任意の画像からボルトを(写っている場合には)見つけないとならない】という問題に取り組むわけではないのだろうと思うので, 問題固有の 考えなきゃいけないこと/考えなくて済むこと/利用可能な前提 等を鑑みてやることを決める(やれることを考える)必要があると思う. まぁ私は 2) の側の経験が無いから,そこにそういう話をどれだけ 持ち込める/利用できる ものなのか知らないけども… 例えば,極端な話,「実施環境においてはその部品だと誤認しそうな他物体が入り込んでくることはない(ものと想定してよい)!」なんていうめちゃくちゃ強い前提条件があったりすれば,それを積極的に活用することを考えるよね. ほかに > 方向性 を考える際の材料としては,「許容される処理時間」みたいな面での話もあるかもしれない. あとは「カメラをN台用いてこんな感じに撮影すれば…!」みたいな方向性も状況によっては有りなのかもしれない.
python01

2023/12/11 12:52

コメントありがとうございます。 meg_様 ボルトの例でイメージ図を作成していますが、 基本的に部品同士の約50%が常に重なって出てきます。 ※イメージ画像を変更しました fana様 他物体が入り込んでくる環境ではない為、 部品の重なった状態で個数カウントができればいいです。
meg_

2023/12/11 15:00

市販の検査ソフロウェアを調べてみても「できるだけ部品同士が重ならないように」とあるので”基本的に部品同士の約50%が常に重なって出てきます。”は厳しいかもしれません。ただ実際にやってみないとどこまで識別できるか分かりませんのでトライして良いとは思います。あと光を一定に当てるなどの環境の設定にも注意する必要があるかと思います。
python01

2023/12/11 15:16

meg_様 ハードルは高そうですが、色々勉強してチャレンジしてみます。
fana

2023/12/12 01:32 編集

他物体の存在が無いと仮定できるのであれば,Hough Forest みたいな方法が考えられるかもしれません. 「物体の部分像に着目して見つけるから,オクルージョンがあっても見つけられるぜ!」とかいう触れ込みの話だが,実際,オクルージョンがあるとその分だけスコアが下がるわけで→そしたらそれを検出しようとしたら誤検出がすごいことになるのでは……みたいな感じだった気がしますが,他物体を誤検出する危険性が少ない環境であれば「検出」とするスコア閾値を強気で下げていけるかも?っていう.
python01

2023/12/12 11:55 編集

決定木ってやつですね。 色々やり方はあるんですね! ひとまず、下記のように細かいフェーズに分けて色々試してみます。 長い道のりになりそうですが、頑張ってみます! フェーズ1:  ・画像処理の基礎を学習。  ・ネット上の画像を用いて、個数カウントができるようにする  ・重なっていない画像を用いる フェーズ2:  ・重なった画像を用いる フェーズ3:  ・画像処理で重なり画像をカウントできない場合、   機械学習で対応できるか評価する  ・機械学習の勉強 フェーズ4:  ・ネット上の画像を用いて、重なり画像をカウントできる場合、   実画像を用いて検証 フェーズ5:  カメラで動画を撮影しながら検証
yominet

2023/12/13 00:21 編集

>約50%が常に重なって これが本当に保障されるのであれば、見えている部分だけを「正解」として扱うのもありではないでしょうか 検査ラインとなれば、カメラ位置・移動速度・対象物の形状や画面に映る面積などもかなり絞れるのではないかと考えますが
fana

2023/12/15 02:31

> 長い道のり が,どれだけ長くても許されるのか? というのはこちらにはわかりませんが, 「本件の問題の解決を急がない(=今はこの問題に取り組まない)」という方針なのであれば,ここでの話を一旦閉じてしまって良いと思います. (本件の問題に着手できるようになるまでの道のりの部分を発表し続ける必要はないです) 挙げられているフェーズに従ってまずはいろいろやってみる,という場合でも, 本番に近い画像群を用意しておけるのならば,どこかで拾ってきた画像だけではなくてそれら本番に近い画像も用いて検討してみた方が良いのかもしれません. (各フェーズでやってみている話では,本番想定画像にどれだけ通用するのか/どのように残念なことになるのか,みたいなのを見ておくことにも何かしらの意義があるのではないか,と.具体的に課題点が見えた方が,次のフェーズを決めやすいかもですし.)
python01

2023/12/17 01:10

fanaさん コメントありがとうございます。 実際の製品画像に対して、カウントしてみたところ 意外と高い精度でカウントできました。 特に画像処理の基本的な部分(①Pythonでコーヒー豆カウントのサイト)を しっかり学習する事が大事だと感じました。 今後、基本をしっかり学んだうえで、検出精度を上げていきたいと思います。 ご教授頂き、ありがとうございました。
guest

回答2

0

自己解決

画像処理の基本操作で解決しそうです。

参考URL:①Pythonでコーヒー豆カウント

特に下記のチューニングで、重なった部品もカウントできそうでした。

・2値化閾値
・ノイズ除去(縦横の収縮・膨張回数及びその度合い)
・抽出した輪郭の面積

投稿2023/12/17 01:19

python01

総合スコア21

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

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

0

事例についての情報提供のみの回答です。虫が苦手な方は閲覧注意ください。
Overlapping Objects issue in Counting Insects with OpenCV

あと、いろいろ検索してみるとOverlapping Objects, Counting. Mask R-CNN, Instance Segmentation, Non-Maximum Suppression (NMS)といったキーワードが出てくるので、まずはそれらについて調べてみるのがよいかと思います。

投稿2023/12/11 06:20

can110

総合スコア38350

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

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

python01

2023/12/11 12:54

ご教授ありがとうございます! これらを調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問