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

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

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

Darknetは、C言語で記述されたオープンソースのニューラルネットフレームワークで簡単にインストールすることが可能です。学習済みモデルとアルゴリズムも配布しており、ダウンロードすれば容易に動かすこともできます。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

解決済

1回答

6979閲覧

darknetのYOLOv3による検出されたBboxの座標をpythonで扱いたい。

Coco_elec

総合スコア1

Darknet

Darknetは、C言語で記述されたオープンソースのニューラルネットフレームワークで簡単にインストールすることが可能です。学習済みモデルとアルゴリズムも配布しており、ダウンロードすれば容易に動かすこともできます。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2021/07/12 04:38

前提・実現したいこと

Google ColaboratoryでdarknetのYOLOv3を実装して独自データを用いて物体検出をしています。検出まではうまく行うことができたのですが、その先としてBboxの座標を抽出してpythonで扱いたいと考えているのですが、最近プログラミングを始めたばかりで何をすればいいのかわかりません。今のところ、YOLOv3で一括で画像から物体の検出を行うと同時にBboxの座標をpythonのリストに入れていきたいと考えています。
darknetがC言語で書かれたものである以上、Bboxの座標をpythonで扱うことはできないのでしょうか。
どなたかその方法をお教えしていただけると幸いです。

YOLOv3の実装は以下のリンクの方法を参考にさせていただきました。
https://lab.m-field.co.jp/2020/03/17/google-colaboratory-front-part/

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

学習済みのdarknetの重みはOpencv(Python,C++)のdnnモジュールでも直接読み込むことができ、次のプログラムで示す配列box[](最後から3行目あたり)で取得することができます。

ぜひお試しください。

以下のプログラムは、次の環境で動作確認をしています。

  • Python3.8
  • OpenCV4
  • CPU:Intel Core i5 10210u
  • OS:Ubuntu 20.04 LTS
  • 対象画像:./abc.png
  • クラス名:./darknet_cfg/coco.names
  • cfgファイル:./darknet_cfg/yolov4-tiny.cfg
  • weightsファイル:./darknet_cfg/yolov4-tiny.weights

この記事を参考にしました
https://opencv-tutorial.readthedocs.io/en/latest/yolo/yolo.html
https://gist.github.com/YashasSamaga/e2b19a6807a13046e399f4bc3cca3a49#file-yolov4-py

サンプルプログラムを示します。この場合、yolov4の実装ではありますが、v2でもv3でも動きます。パスは適宜変更してください。

Python

1# reference src : https://gist.github.com/YashasSamaga/e2b19a6807a13046e399f4bc3cca3a49#file-yolov4-py 2 3import cv2 4import time 5 6CONFIDENCE_THRESHOLD = 0.3 7NMS_THRESHOLD = 0.4 8COLORS = [(0, 255, 255), (255, 255, 0), (0, 255, 0), (255, 0, 0)] 9 10class_names = [] 11with open("./darknet_cfg/coco.names", "r") as f: 12 class_names = [cname.strip() for cname in f.readlines()] 13 14img = cv2.imread("./abc.png") 15 16net = cv2.dnn.readNet("./darknet_cfg/yolov4-tiny.weights", "./darknet_cfg/yolov4-tiny.cfg") 17 18net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) 19net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU) 20model = cv2.dnn_DetectionModel(net) 21model.setInputParams(size=(416, 416), scale=1/255, swapRB=True) 22 23classes, scores, boxes = model.detect( img , CONFIDENCE_THRESHOLD, NMS_THRESHOLD) 24start_drawing = time.time() 25 26for (classid, score, box) in zip(classes, scores, boxes): 27 color = COLORS[int(classid) % len(COLORS)] 28 label = "%s : %f" % (class_names[classid[0]], score) 29 cv2.rectangle(img, box, color, 2) 30 cv2.putText(img, label, (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) 31 # print box 32print("box[0]=" + str(box[0]) + " box[1]=" + str(box[1]) + " box[2]=" + str(box[2]) + " box[3]=" + str(box[3])) 33cv2.imshow("detections", img) 34cv2.waitKey(0)

投稿2021/07/12 06:36

編集2021/07/12 07:35
Ar-Ray

総合スコア16

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

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

Ar-Ray

2021/07/12 07:36 編集

この場合、 ``` print("box[0]=" + str(box[0]) + " box[1]=" + str(box[1]) + " box[2]=" + str(box[2]) + " box[3]=" + str(box[3])) ``` でboxの値をそれぞれ表示させているので、これらの座標をlist appendとかでリストに入れれば良さそうです。 実行の際は$ python3 <保存したpyファイル>`でok
Coco_elec

2021/07/13 07:22

opencvにそのようなモジュールがあるとは知りませんでした! こちらでも試したところ、無事検出および座標の取得をすることができました! お教えしていただきありがとうございます! 次いでご質問をしたいのですが、このboxの値はBboxの何の値を示しているのでしょうか。テスト画像では検出したいオブジェクトが "5つ" 無事検出されたのですが、Bboxの座標は以下のような値が出力されました。 box[0]=343 box[1]=300 box[2]=136 box[3]=146 走らせたコードは上記のコードのパスを変更したものになります。
Ar-Ray

2021/07/13 12:28 編集

プログラムに次を追記して円を表示させれば何の数値なのかは大体想像つくと思います。 # 左上 cv2.circle(img, (box[0], box[1]), 10, color, thickness=-1, lineType=cv2.LINE_8, shift=0) # 右下 cv2.circle(img, (box[0] + box[2],box[1] + box[3]), 10, color, thickness=-1, lineType=cv2.LINE_8, shift=0)
Coco_elec

2021/07/14 04:57

ご返信ありがとうございます! box[0]とbox[1]がX座標、Y座標でbox[2]とbox[3]が幅と高さということに気づけました! 検出数によらずboxの値が4つしかないのはfor文の処理ごとにboxリストの値が更新されているからなんですね。 無事全てのBboxの座標を取り出すことができました! 数日間丁寧に教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問