yunyang tensorflow-yolov3 Intel Realsense D435 (并发)调用两个摄像头运行识别程序并画框
生活随笔
收集整理的這篇文章主要介紹了
yunyang tensorflow-yolov3 Intel Realsense D435 (并发)调用两个摄像头运行识别程序并画框
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
只是一個(gè)測(cè)試,測(cè)試在并發(fā)運(yùn)行下,同時(shí)開(kāi)啟兩個(gè)攝像頭獲取視頻流并調(diào)用識(shí)別函數(shù)的運(yùn)行結(jié)果,以后在攝像頭多的情況下,肯定不能這樣,需要批量創(chuàng)建各種對(duì)象。
并發(fā),指的是不在多線程的情況下,每個(gè)攝像頭的視頻流送給識(shí)別函數(shù)輪流進(jìn)行識(shí)別并返回結(jié)果,其中一個(gè)識(shí)別時(shí),另一個(gè)需等待。
這里配置Intel Realsense D435攝像頭各種對(duì)象時(shí),用的是最傻的一個(gè)一個(gè)創(chuàng)建的方法。
# -*- encoding: utf-8 -*- """ @File : test-同時(shí)調(diào)用兩個(gè)攝像頭運(yùn)行識(shí)別程序并畫(huà)框.py @Time : 2019/11/26 11:20 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """import 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 rsclass 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:類(lèi)數(shù)量屬性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:可寫(xiě)標(biāo)記(bool類(lèi)型值)self.write_image = cfg.TEST.WRITE_IMAGE# D·C 191115:__C.TEST.WRITE_IMAGE_PATH = "./data/detection/"(識(shí)別圖片畫(huà)框并標(biāo)注文本后寫(xiě)入的圖片路徑)self.write_image_path = cfg.TEST.WRITE_IMAGE_PATH# D·C 191116:TEST.SHOW_LABEL設(shè)置為T(mén)rueself.show_label = cfg.TEST.SHOW_LABEL# D·C 191120:創(chuàng)建命名空間“input”with tf.name_scope('input'):# D·C 191120:建立變量(創(chuàng)建占位符開(kāi)辟內(nèi)存空間)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:創(chuàng)建命名空間“指數(shù)滑動(dòng)平均”with tf.name_scope('ema'):ema_obj = tf.train.ExponentialMovingAverage(self.moving_ave_decay)# D·C 191120:在允許軟設(shè)備放置的會(huì)話中啟動(dòng)圖形并記錄放置決策。(不懂啥意思。。。)allow_soft_placement=True表示允許tf自動(dòng)選擇可用的GPU和CPUself.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))# D·C 191120:variables_to_restore()用于加載模型計(jì)算滑動(dòng)平均值時(shí)將影子變量直接映射到變量本身self.saver = tf.train.Saver(ema_obj.variables_to_restore())# D·C 191120:用于下次訓(xùn)練時(shí)恢復(fù)模型self.saver.restore(self.sess, self.weight_file)def predict(self, image):# D·C 191107:復(fù)制一份圖片的鏡像,避免對(duì)圖片直接操作改變圖片的內(nèi)在屬性org_image = np.copy(image)# D·C 191107:獲取圖片尺寸org_h, org_w, _ = org_image.shape# D·C 191108:該函數(shù)將源圖結(jié)合input_size,將其轉(zhuǎn)換成預(yù)投喂的方形圖像(作者默認(rèn)544×544,中間為縮小尺寸的源圖,上下空區(qū)域?yàn)榛覉D):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:創(chuàng)建新軸,不懂要?jiǎng)?chuàng)建新軸干嘛?image_data = image_data[np.newaxis, ...]# D·C 191108:打印維度看看:# print(image_data.shape)# (1, 544, 544, 3)# D·C 191110:三個(gè)box可能存放了預(yù)測(cè)框圖(可能是N多的框,有用的沒(méi)用的重疊的都在里面)的信息(但是打印出來(lái)的值完全看不懂啊喂?)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:打印三個(gè)box的類(lèi)型、形狀和值看看:# 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又把它們仨給疊起來(lái),最終得到無(wú)數(shù)個(gè)6列數(shù)組(后面self.num_classes)個(gè)數(shù)存放的貌似是這個(gè)框?qū)儆陬?lèi)的概率)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:猜測(cè)是第一道過(guò)濾,過(guò)濾掉score_threshold以下的圖片,過(guò)濾完之后少了好多:# D·C 191115:bboxes維度為[n,6],前四列是坐標(biāo),第五列是得分,第六列是對(duì)應(yīng)類(lèi)下標(biāo)bboxes = utils.postprocess_boxes(pred_bbox, (org_h, org_w), self.input_size, self.score_threshold)# D·C 191111:猜測(cè)是第二道過(guò)濾,過(guò)濾掉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()# 通過(guò)程序去獲取已連接攝像頭序列號(hào)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)# 創(chuàng)建對(duì)齊對(duì)象(深度對(duì)齊顏色)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()# 獲取對(duì)齊幀集aligned_frames1 = align1.process(frames1)aligned_frames2 = align2.process(frames2)# 獲取對(duì)齊后的深度幀和彩色幀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()# 獲取顏色幀內(nèi)參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)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()總結(jié)
以上是生活随笔為你收集整理的yunyang tensorflow-yolov3 Intel Realsense D435 (并发)调用两个摄像头运行识别程序并画框的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pycharm 运行程序时提示错误信息:
- 下一篇: Intel Realsense D435