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

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

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

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

YOLO

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

Python 3.x

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

Q&A

解決済

2回答

1570閲覧

pythonの並列処理での変数受け渡しがしたい

dendendenjirou

総合スコア40

Darknet

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

YOLO

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

Python 3.x

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

1グッド

0クリップ

投稿2022/04/21 21:42

現在、AlexABのDarknetを使ってシステム構築を行っています。

tkinterでGUIを表示し、目的とするターゲットをラジオボタンにて選択するようにして
そのターゲットを検出した時にビープ音が鳴るようにしたいのですが
ラジオボタンで選択した変数を、検出に渡すことができません。

下記コードにて
target_canvasで選択したラジオボタンからの変数を
さらに下のコード
print_detectionsに渡したいのです。

Multiprocessで変数に.valueを付けると受け渡しができるとのことでしたが、うまくいきません。
どなたかご教授願えませんでしょうか。

python

1import queue 2from ctypes import * 3import random 4import os 5import cv2 6import time 7import darknet 8import argparse 9from threading import Thread, enumerate 10from queue import Queue 11import tkinter as tk 12import time 13from multiprocessing import Value 14 15def inference(darknet_image_queue, detections_queue, fps_queue): 16 17 while cap.isOpened(): 18 darknet_image = darknet_image_queue.get() 19 prev_time = time.time() 20 detections = darknet.detect_image(network, class_names, darknet_image, thresh=args.thresh) 21 detections_queue.put(detections) 22 fps = int(1/(time.time() - prev_time)) 23 fps_queue.put(fps) 24 print("FPS: {}".format(fps)) 25 darknet.print_detections(detections, args.ext_output) 26 darknet.free_image(darknet_image) 27 cap.release() 28 29def target_canvas(): 30 global target 31 32 root = tk.Tk() 33 root.geometry("300x200") 34 root.title("Target") 35 var = tk.IntVar() 36 37 var.set(1) 38 39 # ラジオボタン作成 40 rdo0 = tk.Radiobutton(root, value=0, variable=var, text='taeget0') 41 rdo0.place(x=70, y=40) 42 43 rdo1 = tk.Radiobutton(root, value=1, variable=var, text='taeget1') 44 rdo1.place(x=70, y=70) 45 46 rdo2 = tk.Radiobutton(root, value=2, variable=var, text='taeget2') 47 rdo2.place(x=70, y=100) 48 49 rdo3 = tk.Radiobutton(root, value=3, variable=var, text='taeget3') 50 rdo3.place(x=70, y=130) 51 52 lst_target = ['taeget0', 'taeget1', 'taeget2', 'taeget3'] 53 target.value = lst_target[var.get()] 54 55 root.mainloop() 56 57 58 59if __name__ == '__main__': 60 61 frame_queue = Queue() 62 darknet_image_queue = Queue(maxsize=1) 63 detections_queue = Queue(maxsize=1) 64 fps_queue = Queue(maxsize=1) 65 66 args = parser() 67 check_arguments_errors(args) 68 network, class_names, class_colors = darknet.load_network( 69 args.config_file, 70 args.data_file, 71 args.weights, 72 batch_size=1 73 ) 74 darknet_width = darknet.network_width(network) 75 darknet_height = darknet.network_height(network) 76 input_path = str2int(args.input) 77 cap = cv2.VideoCapture(input_path) 78 video_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 79 video_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 80 drg = queue.Queue 81 Thread(target=video_capture, args=(frame_queue, darknet_image_queue)).start() 82 Thread(target=target_canvas).start() 83 Thread(target=inference, args=(darknet_image_queue, detections_queue, fps_queue)).start() 84 Thread(target=drawing, args=(frame_queue, detections_queue, fps_queue)).start()

python

1from ctypes import * 2import math 3import random 4import os 5import winsound 6 7 8def print_detections(detections, coordinates=False): 9 10 print("\nObjects:") 11 for label, confidence, bbox in detections: 12 x, y, w, h = bbox 13 if coordinates: 14 print("{}: {}% (left_x: {:.0f} top_y: {:.0f} width: {:.0f} height: {:.0f})".format(label, confidence, x, y, w, h)) 15 if label == target: 16 winsound.Beep(800,1000) 17 else: 18 print("{}: {}%".format(label, confidence)) 19 20 if label == target: 21 winsound.Beep(800,1000)
teamikl👍を押しています

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

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

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

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

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

teamikl

2022/04/22 23:21

変数 target を初期化してる部分のコードを掲載出来ますか? 質問のコードはマルチスレッドなので、同一プロセス内でメモリ空間を共有します。 共有メモリ(multiprocessing.Value) は不要です。
dendendenjirou

2022/04/22 23:49

teamikl 返信ありがとうございます。 先ほど、teamiklさんに回答していただいた方法で解決しております。 感謝しています。 また、機会がありましたらお力添えを頂ければ幸いです。
guest

回答2

0

「並列処理での変数受け渡し」について
補足しておくと、multiprocessing.Valueオブジェクトの使い方は

プロセス間での状態の共有
https://docs.python.org/ja/3/library/multiprocessing.html#sharing-state-between-processes

にある通りですが、質問のコードはマルチプロセスではないので、
プロセス間の値の共有は意味がありません。

マルチスレッドでは値の共有に関しては、
multiprocessing.Value を使わなくても共有は出来ていて、
スレッド間の値の共有で注意すべき点は、同期処理等になってきます。

マルチプロセス・マルチスレッド共に、
グローバル変数で値を渡すのはあまりお勧めしません。(logging等の一部例外はありますが)
スレッドもしくはプロセス生成時の引数に渡すようにします。


質問の本来の目的である「ラジオボタン選択時に音を鳴らす」

といった場合、tkinter では IntVar の trace メソッドで
値が変化した時に任意の関数を呼び出せます。

実装手順としては、Queue を用いて
trace メソッドで登録した関数内で queue.put
別スレッドで gueue を読み出して音を鳴らす、といった手順で実装可能です。

投稿2022/04/22 23:55

teamikl

総合スコア8664

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

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

0

自己解決

Queueを用いることで解決いたしました。

投稿2022/04/22 23:49

dendendenjirou

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問