日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Tensorflow yolov3 Intel Realsense D435 双摄像头下测试python多线程(假的多线程)self.predict()函数运行时间(191204)

發布時間:2025/3/19 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tensorflow yolov3 Intel Realsense D435 双摄像头下测试python多线程(假的多线程)self.predict()函数运行时间(191204) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

測試代碼:

# -*- coding: utf-8 -*- """ @File : test-191204-兩個攝像頭調用多線程識別.py @Time : 2019/12/3 14:12 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import threadingimport cv2 import numpy as np import tensorflow as tf import core.utils as utils from core.config import cfg from core.yolov3 import YOLOV3 import pyrealsense2 as rs import time import dontla_package.dontla_ThreadClass as dtclass YoloTest(object):def __init__(self):# D·C 191111:__C.TEST.INPUT_SIZE = 544self.input_size = cfg.TEST.INPUT_SIZEself.anchor_per_scale = cfg.YOLO.ANCHOR_PER_SCALE# Dontla 191106注釋:初始化class.names文件的字典信息屬性self.classes = utils.read_class_names(cfg.YOLO.CLASSES)# D·C 191115:類數量屬性self.num_classes = len(self.classes)self.anchors = np.array(utils.get_anchors(cfg.YOLO.ANCHORS))# D·C 191111:__C.TEST.SCORE_THRESHOLD = 0.3self.score_threshold = cfg.TEST.SCORE_THRESHOLD# D·C 191120:__C.TEST.IOU_THRESHOLD = 0.45self.iou_threshold = cfg.TEST.IOU_THRESHOLDself.moving_ave_decay = cfg.YOLO.MOVING_AVE_DECAY# D·C 191120:__C.TEST.ANNOT_PATH = "./data/dataset/Dontla/20191023_Artificial_Flower/test.txt"self.annotation_path = cfg.TEST.ANNOT_PATH# D·C 191120:__C.TEST.WEIGHT_FILE = "./checkpoint/f_g_c_weights_files/yolov3_test_loss=15.8845.ckpt-47"self.weight_file = cfg.TEST.WEIGHT_FILE# D·C 191115:可寫標記(bool類型值)self.write_image = cfg.TEST.WRITE_IMAGE# D·C 191115:__C.TEST.WRITE_IMAGE_PATH = "./data/detection/"(識別圖片畫框并標注文本后寫入的圖片路徑)self.write_image_path = cfg.TEST.WRITE_IMAGE_PATH# D·C 191116:TEST.SHOW_LABEL設置為Trueself.show_label = cfg.TEST.SHOW_LABEL# D·C 191120:創建命名空間“input”with tf.name_scope('input'):# D·C 191120:建立變量(創建占位符開辟內存空間)self.input_data = tf.placeholder(dtype=tf.float32, name='input_data')self.trainable = tf.placeholder(dtype=tf.bool, name='trainable')model = YOLOV3(self.input_data, self.trainable)self.pred_sbbox, self.pred_mbbox, self.pred_lbbox = model.pred_sbbox, model.pred_mbbox, model.pred_lbbox# D·C 191120:創建命名空間“指數滑動平均”with tf.name_scope('ema'):ema_obj = tf.train.ExponentialMovingAverage(self.moving_ave_decay)# D·C 191120:在允許軟設備放置的會話中啟動圖形并記錄放置決策。(不懂啥意思。。。)allow_soft_placement=True表示允許tf自動選擇可用的GPU和CPUself.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))# D·C 191120:variables_to_restore()用于加載模型計算滑動平均值時將影子變量直接映射到變量本身self.saver = tf.train.Saver(ema_obj.variables_to_restore())# D·C 191120:用于下次訓練時恢復模型self.saver.restore(self.sess, self.weight_file)def predict(self, image):# D·C 191107:復制一份圖片的鏡像,避免對圖片直接操作改變圖片的內在屬性org_image = np.copy(image)# D·C 191107:獲取圖片尺寸org_h, org_w, _ = org_image.shape# D·C 191108:該函數將源圖結合input_size,將其轉換成預投喂的方形圖像(作者默認544×544,中間為縮小尺寸的源圖,上下空區域為灰圖):image_data = utils.image_preprocess(image, [self.input_size, self.input_size])# D·C 191108:打印維度看看:# print(image_data.shape)# (544, 544, 3)# D·C 191108:創建新軸,不懂要創建新軸干嘛?image_data = image_data[np.newaxis, ...]# D·C 191108:打印維度看看:# print(image_data.shape)# (1, 544, 544, 3)# D·C 191110:三個box可能存放了預測框圖(可能是N多的框,有用的沒用的重疊的都在里面)的信息(但是打印出來的值完全看不懂啊喂?)pred_sbbox, pred_mbbox, pred_lbbox = self.sess.run([self.pred_sbbox, self.pred_mbbox, self.pred_lbbox],feed_dict={self.input_data: image_data,self.trainable: False})# D·C 191110:打印三個box的類型、形狀和值看看:# print(type(pred_sbbox))# print(type(pred_mbbox))# print(type(pred_lbbox))# 都是<class 'numpy.ndarray'># print(pred_sbbox.shape)# print(pred_mbbox.shape)# print(pred_lbbox.shape)# (1, 68, 68, 3, 6)# (1, 34, 34, 3, 6)# (1, 17, 17, 3, 6)# print(pred_sbbox)# print(pred_mbbox)# print(pred_lbbox)# D·C 191110:(-1,6)表示不知道有多少行,反正你給我整成6列,然后concatenate又把它們仨給疊起來,最終得到無數個6列數組(后面self.num_classes)個數存放的貌似是這個框屬于類的概率)pred_bbox = np.concatenate([np.reshape(pred_sbbox, (-1, 5 + self.num_classes)),np.reshape(pred_mbbox, (-1, 5 + self.num_classes)),np.reshape(pred_lbbox, (-1, 5 + self.num_classes))], axis=0)# D·C 191111:打印pred_bbox和它的維度看看:# print(pred_bbox)# print(pred_bbox.shape)# (18207, 6)# D·C 191111:猜測是第一道過濾,過濾掉score_threshold以下的圖片,過濾完之后少了好多:# D·C 191115:bboxes維度為[n,6],前四列是坐標,第五列是得分,第六列是對應類下標bboxes = utils.postprocess_boxes(pred_bbox, (org_h, org_w), self.input_size, self.score_threshold)# D·C 191111:猜測是第二道過濾,過濾掉iou_threshold以下的圖片:bboxes = utils.nms(bboxes, self.iou_threshold)return bboxesdef dontla_evaluate_detect(self):pipeline1 = rs.pipeline()pipeline2 = rs.pipeline()config1 = rs.config()config2 = rs.config()ctx = rs.context()# 通過程序去獲取已連接攝像頭序列號serial1 = ctx.devices[0].get_info(rs.camera_info.serial_number)serial2 = ctx.devices[1].get_info(rs.camera_info.serial_number)config1.enable_device(serial1)config2.enable_device(serial2)config1.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)config2.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)config1.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)config2.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)pipeline1.start(config1)pipeline2.start(config2)# 創建對齊對象(深度對齊顏色)align1 = rs.align(rs.stream.color)align2 = rs.align(rs.stream.color)try:while True:frames1 = pipeline1.wait_for_frames()frames2 = pipeline2.wait_for_frames()# 獲取對齊幀集aligned_frames1 = align1.process(frames1)aligned_frames2 = align2.process(frames2)# 獲取對齊后的深度幀和彩色幀aligned_depth_frame1 = aligned_frames1.get_depth_frame()aligned_depth_frame2 = aligned_frames2.get_depth_frame()color_frame1 = aligned_frames1.get_color_frame()color_frame2 = aligned_frames2.get_color_frame()# 獲取顏色幀內參color_profile1 = color_frame1.get_profile()color_profile2 = color_frame2.get_profile()cvsprofile1 = rs.video_stream_profile(color_profile1)cvsprofile2 = rs.video_stream_profile(color_profile2)color_intrin1 = cvsprofile1.get_intrinsics()color_intrin2 = cvsprofile2.get_intrinsics()color_intrin_part1 = [color_intrin1.ppx, color_intrin1.ppy, color_intrin1.fx, color_intrin1.fy]color_intrin_part2 = [color_intrin2.ppx, color_intrin2.ppy, color_intrin2.fx, color_intrin2.fy]# if not aligned_depth_frame1 or not color_frame1:# continue# if not aligned_depth_frame2 or not color_frame2:# continuecolor_image1 = np.asanyarray(color_frame1.get_data())color_image2 = np.asanyarray(color_frame2.get_data())# D·C 191121:顯示幀看看# cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)# cv2.imshow('RealSense', color_frame)# cv2.waitKey(1)# bboxes_pr1 = self.predict(color_image1)# bboxes_pr2 = self.predict(color_image2)# thread1 = threading.Thread(target=self.predict, name='thread1', args=(color_image1))# 使用自定義線程類begin_time = time.time()thread1 = dt.MyThread(self.predict, (color_image1,))thread2 = dt.MyThread(self.predict, (color_image2,))thread1.start()thread2.start()bboxes_pr1 = thread1.get_result()bboxes_pr2 = thread2.get_result()end_time = time.time()t = end_time - begin_timeprint('耗時:{}秒'.format(t))image1 = utils.draw_bbox(color_image1, bboxes_pr1, aligned_depth_frame1, color_intrin_part1,show_label=self.show_label)image2 = utils.draw_bbox(color_image2, bboxes_pr2, aligned_depth_frame2, color_intrin_part2,show_label=self.show_label)# cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)cv2.imshow('window1', image1)cv2.imshow('window2', image2)cv2.waitKey(1)finally:pipeline1.stop()pipeline2.stop()if __name__ == '__main__':YoloTest().dontla_evaluate_detect()

測試結果:

耗時:2.625560998916626秒 耗時:0.10670757293701172秒 耗時:0.12816929817199707秒 耗時:0.11958622932434082秒 耗時:0.1131751537322998秒 耗時:0.10475015640258789秒 耗時:0.09842038154602051秒 耗時:0.09618926048278809秒 耗時:0.11507296562194824秒 耗時:0.10706448554992676秒 耗時:0.10106921195983887秒 耗時:0.12429261207580566秒 耗時:0.1336684226989746秒 耗時:0.11305642127990723秒 耗時:0.10306835174560547秒 耗時:0.12074589729309082秒 耗時:0.12209677696228027秒 耗時:0.1438748836517334秒 耗時:0.14608263969421387秒 耗時:0.14514660835266113秒 耗時:0.11954283714294434秒 耗時:0.11972570419311523秒 耗時:0.12410092353820801秒 耗時:0.11159968376159668秒 耗時:0.10907173156738281秒 耗時:0.10128068923950195秒 耗時:0.13075494766235352秒 耗時:0.09833645820617676秒 耗時:0.12359118461608887秒 耗時:0.11204814910888672秒 耗時:0.1212153434753418秒 耗時:0.13196659088134766秒 耗時:0.10281825065612793秒 耗時:0.12308430671691895秒 耗時:0.11007881164550781秒 耗時:0.10399675369262695

參考文章:python 多線程 線程如何獲得返回值 (重寫threading.Thread類)

總結

以上是生活随笔為你收集整理的Tensorflow yolov3 Intel Realsense D435 双摄像头下测试python多线程(假的多线程)self.predict()函数运行时间(191204)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。