動画配信 ; 2020-08-13. 「物体検出 」というと ... pip install opencv-python ※もしCMake must be installed to build the following extensions: dlibというエラーが出た場合cmakeをインストールしてから実行してください。 機械学習する. OpenCVを使ったPythonでの画像処理について、物体の追跡(Object Tracking)について扱っていきます。, ここではオプティカルフロー(Optical Flow)の概念とWebカメラを使ってのLucas-Kanade法による物体の追跡を行ってみようと思います。, ここではテキストエディタを使ってコードを書き、ターミナルの対話型シェルから実行して行こうと思います。, オプティカルフローとは、視覚表現(物体やカメラの移動によって生じる隣接フレーム)の中で物体の動きをベクトルで表したものです。, 各ベクトルの1フレーム目から2フレーム目への移る変位ベクトルを、2次元ベクトル場で表現します。, 数学的な説明には触れませんが、オプティカルフローは次のような仮定に基づいて計算されます。, 画像中の画素を考え、わずかな時間t後に撮影された次の画像の画素がそれだけ距離を移動したとして、この二つの画素は同じものとし、明るさは変わらないと仮定して計算したものがオプティカルフローです。この計算には未知のものが残るのですが、この一つの解決法がLucas-Kanade法となります。, Lucas-Kanade法は、ある点に対してその点を含む周囲の3×3に含まれる9画素が同じ動きをしていると仮定し、この9画素の情報を基に注目点の位置の移動を計算します。, ただし、小さい運動を扱うのと、大きな動きがあった場合は観測に違いがあるので、画像のピラミッドの概念を使います。, 画像のピラミッドとは、オリジナルの画像からレベルをピラミッド頂点へズラすようにスケールをアップすると、小さな動きが消され大きな動きが小さな動きとして観測することができます。Lukas-Kanade法をこの解像度で適用することで、そのスケールでのオプティカルフローを得ることができます。, というイメージですが、細かい数学的な素養が無いと深い理解はできないので、そのあたりは関心があるかたは別で勉強してください。検索すると色々な解説が出てきます。, 物体のコーナーを検出して動きを追跡する為にShi-Tomasiコーナー検出を使う為のパラメータの設定です。, あとで出てきますが、goodFeaturesToTrack()でコーナを検出しますが、これに画像を渡し、ここでは辞書型のデータとして、検出したいコーナーの数、0から1の間の値の検出するコーナーの最低限の質、検出される2つのコーナー間の最低限のユークリッド距離を設定します。, 次に、Lucas-Kanade法を使ったオプティカルフローのパラメータを設定していきます。あとで出てきますが、OpenCVはLucas-Kanade法の全ての処理を行うcalcOpticalFlowPyrLK()関数が用意されています。このパラメータを設定しておきます。, winSize引数を変更して、特定の点の動きや集約された領域の動きを検出します。小さくするとノイズに敏感になり、大きな動きを見逃す可能性があります。, maxLevelは画像のピラミッドのことで、ここが0の場合、ピラミッドを使用しないことを意味します。ピラミッドを使用すると、画像のさまざまな解像度でオプティカルフローを見つけることができます。, criteriaで繰り返し処理の終了条件を与えています。この条件が満たされた時にアルゴリズムの繰り返し計算が終了します。cv2.TERM_CRITERIA_EPSは指定された精度(epsilon)に到達したら繰り返し計算を終了します。 cv2.TERM_CRITERIA_COUNTは指定された繰り返しの最大回数(count)に到達したら繰り返し計算を終了します。ここではこれらのどちらかの条件が満たされた時に繰り返し計算の終了を指定しています。ここでは回数を10、精度を0.03にしています。多くの反復はより徹底的な検索を意味し、小さな精度は処理を早く終わらせることを意味します。, cv2.VideoCapture(0)でwebカメラに接続します。ここではMac内臓のデフォルトのカメラに接続しているので0を指定します。, cap.read()で映像を読み込んで、cv2.cvtColor()を使ってグレースケールの変換しています。これを直前のイメージとして理解することにします。, cv2.goodFeaturesToTrack()で物体のコーナーを検出(Shi-Tomasiコーナー検出)しています。ここで先ほどの設定したパラメータを使っています。, あとで検出を描画するために、直前のイメージのフレームにマッチするmaskをnp.zeros_like()を使って作成します。このnp.zeros_like()は、np.zeros()のように第一引数にshapeで型を渡すのではなく、shapeを真似たい配列を指定することで、np.zerosと同じように0の配列を作ってくれます。, while文を使って、キャプチャーを実行し、read()で読み込みます。retはデータの読み込みの可否のture/false、frameで映像のパラメータを取得しています。, cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)で映像をグレースケールに変換します。ここではframe_grayとしておきます。, ここでcv2.calcOpticalFlowPyrLK()を使ってグレースケールのフレーム上のオプティカルフローを計算します。この関数の引数に、直前のイメージ、直後のイメージ、直前に検出したポイント、直後のポイント(ここではNone)、最初の方で準備した辞書型のパラメータを順に渡して計算します。, 返された新しいポイントと直前のポイントの配列を使います。対応する特徴のオプティカルフローが見つかった場合はベクトルの各要素は1に設定され、それ以外の場合は0に設定されます。これをそれぞれgood_new、good_prevにします。, zip関数を使うと複数のシーケンスを並列に反復処理することができるので、good_new、good_prevを同時に処理します。これをfor-inループを使ってenumrate()でインデックスと新旧の検出ポイントを取り出します。, これをravel()で1次元化してx、yの座標に代入する処理を、新しいポイントと直前のポイントで行っています。, 最初のフレームから作成したマスクを使用してcv2.line()で移動の線を描画していきます。新しい点から直前の点に向けて線を描くことで軌跡のように描けるので、そういう渡し方をしています。色は緑色、太さを3にしました。こちらはmask側に描いていることに注意です。, cv2.circle()で新規のポイントに円を描きますが、こちらはframe側に描きます。半径8、色は赤、塗りつぶしなので-1を指定しています。, cv2.add()を使って画像の足し算します。frameをmask与えて点と線の描画を合成しています。これをimshow()で表示します。, if cv2.waitKey(30) & 0xff == 27: で[esc]キーを押された時にbreak処理をします。, 直前のフレームと直前のポイントを更新します。frame_gray.copy()でフレームの更新、reshape()でポイントの更新をしています。good_new.reshape(-1,1,2)は、-1で元の形に戻し1行2列の型にしています。, cap.release()でデバイスを解放し、cv2.destroyAllWindows()で全て終了させます。, このPythonスクリプトをターミナルから実行するとwebカメラが起動して、ビューワーに赤色のポイントが入った映像が映るはずです。自分が写っていたら顔を移動したり、カメラを移動したりすると、検出されたポイントが移動して緑色の線で物体追跡の軌跡が描かれるはずです。, OpenCVを使ったPythonでの画像処理について、物体の追跡(Object Tracking)について扱いました。, ここではオプティカルフロー(Optical Flow)の概念とWebカメラを使ってのLucas-Kanade法による物体の追跡をやってみました。, オプティカルフローとは、物体やカメラの移動によって生じる隣接フレームの中で物体の動きをベクトルで表したものです。, Lucas-Kanade法は、ある点に対してその点を含む周囲の3×3に含まれる9画素が同じ動きをしていると仮定し、この9画素の情報を基に注目点の位置の移動を計算する方法です。, ここではwebカメラで映した画像の注目点の移動を線で描くコードを扱いましたが、次では画像画像中の全画素に対してオプティカルフローを計算する方法を扱います。, 【Python】OpenCVのHarrisコーナー検出とShi-Tomasiコーナー検出, OpenCVを使ったPythonでの画像処理について、ここではコーナー検出を学びます。Harrisコーナー検出でcornerHarris()を、Shi-Tomasiコーナー検出でgoodFeaturesToTrack()を扱います。, 【Python】OpenCVの密なオプティカルフロー calcOpticalFlowFarneback(), OpenCVを使ったPythonでの画像処理について、Lucas-Kanade法は「疎」の物体追跡の検出でしたが、ここでは逆に密なオプティカルフローの検出アルゴリズムであるcalcOpticalFlowFarneback()を扱います。, Pythonを使って電子メールを送信する方法について扱います。ここで利用する電子メールはGoogleのGmailを使ってメールを送信するという方法を見て行きます。メール送信だけでなく、添付ファイルの送信、ログの記録の送信までやってみます。, OpenCVを使ってPythonで画像を処理する方法について、ぼかしや平滑化について扱います。filter2D()、blur()、GaussianBlur()、medianBlur()、bilateralFilter()の処理を見て行きます。, Webスクレイピングは、インターネットからデータ情報を収集する作業です。PythonでWebスクレイピングするためには、便利なサードパーティライブラリのBeautifulSoupがあります。このBS4のインストールをして行きましょう。, Pythonの標準ウェブライブラリであるurllibのurllib.requestをつかってHTTPメソッドを操作したのと同様に、サードパーティのrequestsを使ってHTTP通信のテストを行います。こちらの方がコードが簡単になります。, Pythonの標準ウェブライブラリであるurllib.requestを使って、HTTP通信を行います。HTTPメソッドのGET、POST、PUT、DELETEの操作を https://httpbin.org を使ってテストしてみます。, OpenCVを使ったPythonでの画像処理についてヒストグラムを扱います。ヒストグラムを求めるにはcalcHist()を使います。画像のコントラストを調整するのにヒストグラム平坦化があり、equalizeHist()を使います。. Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出, Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみよう, Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう, RaspberryPi4にYOLOv3-Tinyを実装してリアルタイム画像認識をしながら物体を自動追尾するカメラを作ってみた, Raspberry Pi TensorFlow 2 installation and Yolo V3 object detection, Installing DarkNet Yolo on a Raspberry Pi 4, ホームディレクトリにTensorFlow 用の YOLO バージョン 3 (YOLOv3) のダウンロードする。, 学習済のパラメーター(結合係数)ファイルをダウンロードして TensorFlow 用のファイルに変換する, Tiny ではない通常の YOLOもインストールする。(Raspberry Pi4 以降), エラーで続行できないので書籍の指摘に準じてtensorflow 1.13.1 にバージョンを落とす。, ホームディレクトリ直下の Tensorflow-YOLOv3 ディレクトリで実行する。. 物体検出の手順 画像を読み込む 入力画像1の物体を入力画像2から探します。 sample1.jpg 入力画像1 sample2.jpg 入力画像2 物体ごと [Python]OpenCVで入力された2枚の画像の特徴点マッチングを . 以下のコマンドを実行してください。, 今回はビールジョッキの学習データなので、正解の写真を2枚だけ用意して/images/detectionに設置します。, 内容としては、「写真の中にビールジョッキがあるか?」をチェックし、もし存在していたらその座標部分を切り出して保存しています。, そして、検出したビールジョッキが切り出されてこのようにファイルが作成されています。, 今回実際に開発したソースコード一式を以下からダウンロードすることができます。(画像も全て入っています), ということで、今回は機械学習でビールジョッキを検出するプログラムをご紹介しました。, 冒頭でも書きましたが、ビールジョッキに限らずあなたが好きな物体で試すことができます。, 過去には、ある会社の商品画像にロゴが入っているものと入っていないものが共存しているので、機械学習で入っていないものだけ探し出すという記事を読んだことがあります。, と関心したのですが、AIや機械学習といっても結局は人間の工夫が大事だということだと思います。, 開発状況によりましては開発をお待ちいただく可能性もございますが、ご相談はいつでもお受けしております。お気軽にご連絡ください♪, 【Laravel Jetstream】複数モデルでログインできるようにする(Multi Auth). OpenCVを使った物体検出こんにちは。AI coordinatorの清水秀樹です。映像からただ単に物体検出を試してみたいだけなら、すぐにでも試せる方法を紹介します。 こんにちは。のっくんです。 今日はOpenCVのDNN(Deep Neural Network)を使って、物体検出をしてみようと思います。 なんか難しそうに聞こえますが、コードのコピペで動きますし、やっていることは単純です。 ニューラルネットワークというと、GPUが必要なんじゃない? ステップ2.物体検出をする. さてさて、このブログではこれまで私が経験してきた内容を多く公開しているのですが、スキルアップのためにあまり経験がない分野も取り扱うようにしています。, ということで、今回は私が好きな「ビール」を例にして機械学習を実装する方法をご紹介します。, ぜひ皆さんのお役に立てると嬉しいです✨(最後に今回に開発したソースコードと機械学習に必要な画像をダウンロードできます), そして、もし発見したらビールジョッキの部分を切り抜いて「lets-drink-*.jpg」というファイル名で保存します。, 物体検出をするには、機械学習を使います。 OpenCVを使ったPythonでの画像処理について、物体の追跡(Object Tracking)を扱います。オプティカルフロー(Optical Flow)の概念とWebカメラを使ってのLucas-Kanade法による物体の追跡を行い … そのため、今回の手順は次のようになります。, そして、この「学習データ」を使って(全く別の)写真の中にビールジョッキが写っているかをチェックします。, ※もしCMake must be installed to build the following extensions: dlibというエラーが出た場合cmakeをインストールしてから実行してください。, はじめに、学習させる写真を用意して、/images/trainフォルダに設置します。, さすがに1枚だけでは機械学習させるには少なすぎますので、最低でも5〜10枚程度は用意した方がいいでしょう。, ただし、ここは機械学習の難しいところですが、数が多ければいいというものではなく、似てる写真ばかりだと学習が偏ってしまい「これしかダメ!」というように「頑固なデータ」になってしまうことがあります。, もし学習するデータが揃っていない場合はダウンロードするからビールジョッキの画像もダウンロードできますので、そちらを使ってください。, いろいろと方法があるのですが、今回はインストール不要で機械学習に必要なxmlをつくることができるImgLabというサイトを使わせていただきます。(感謝✨), まずこのサイトにアクセスすると、ポップアップ表示されるので、「UUM! Python覚書; OpenCV; 2020-08-26. PukiWiki 1.5.2 © 2001-2019 PukiWiki Development Team. 認識したい画像を明確にしたら、そこから物体を検出します。 OpenCVではとても簡単に物体を検出できるのですが、検出には画像処理をしながら自力で行う方法と「学習済みモデル」を使って行う方法の2通りあります。 OpenJtalk; 2020-07-25. OpenCVを使ったPythonでの画像処理について、Watershedアルゴリズムを扱います。Watershedアルゴリズムは、地形の分水嶺のイメージの概念を使ったアルゴリズムで、画像の中の接触している物体の境界を分離して認識できます。 MAY BE NEXT TIME.」ボタンをクリックします。(募金してくれ、というのを断っています), ファイルを選択するダイアログが表示されるので、/images/trainに用意した全ての写真を選択。, すると、以下のように選択した画像がページ下部に表示されます。(サムネイルをクリックすると画像を拡大表示できます), 次に、選択した写真の「どこにビールジョッキが映っているか?」を指定していきましょう。, まずページ左にある「Rectangle」をクリックしてドラッグ・アンド・ドロップで範囲指定します。(なお、画像が大きすぎる場合はズームで小さくしてください), 全ての画像の範囲指定が完了したら、ページ左上にあるハンバーガーボタンから「Save」を選択。, 次にファイル名を「beer.xml」にして「SAVE」をクリックします。(もちろん、ファイル名は何でもOKです), すると、「beer.xml」がダウンロードされるので、/images/trainファルダに設置しておいてください。, 続いて、実際に機械学習をするためのPythonコードをつくります。 Copyright © 2018 code-graffiti.com All Rights Reserved. AIbot Proj.1; 私的AI研究会 > 物体検出. といっても、コード自体はとても簡単ですので以下をコピペしてください。, では、train.pyを実行して機械学習をしましょう! HTML convert time: 0.019 sec. 物体検出 (続OpenCV) † 物体検出 (続OpenCV) Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出 . 【Python】OpenCVで画像を合成する – addWeighted, bitwise演算, ROI, macOS CatelinaにAnacondaをインストールする(zshでの不具合対応), MacのAnacondaをアンインストールする – Python3.7でTkinter等に不具合?, 【Python】色々なprintフォーマットの出力方法 – %s, .format(), f-strings, 【Python】OpenCVで特徴量マッチング – ORB, SIFT, FLANN. Powered by PHP 7.2.24-0ubuntu0.18.04.7.