pyqt5 與 tensorflow結(jié)合

我的問(wèn)題是想看到模型迭代中看到圖像的渲染,這個(gè)過(guò)程需要花費(fèi)一些時(shí)間胁镐,所以要分為渲染主線程和數(shù)據(jù)計(jì)算子線程只估。然而又希望加載模型一次,下面是我嘗試成功的一個(gè)例子框架掺喻。但是想要子線程加載模型以及計(jì)算芭届,主線程只管渲染這個(gè)方法沒(méi)有嘗試成功,如果有哪位仁兄成功了感耙,可以@我一下嗎褂乍,非常感謝!

在利用qt designer 設(shè)計(jì)了界面之后即硼,會(huì)生成一個(gè)界面類(lèi)逃片;

主要包括setupUi(self, MainWindow): 和 retranslateUi(self, MainWindow): 兩個(gè)函數(shù);按照下面方式修改類(lèi)谦絮,就可以像普通類(lèi)一樣用Ui__MainWindow了题诵。

from PyQt5.QtWidgets import QApplication , QMainWindow

class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def setupUi(self,MainWindow):
          ...
    def retranslateUi(self, MainWindow):
          ...

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = Ui_MainWindow()
    myWin.show()
    sys.exit(app.exec_())

在Ui_MainWindow 類(lèi)中增加 tensorflow模型函數(shù)洁仗,因人而異的,下面僅做借鑒性锭;另外在init(self) 函數(shù)中增加loadModel 初始化赠潦;

class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.loadModel(parse_arguments(sys.argv[1:]))

 def loadModel(self,args):
        self.phase_train_placeholder = tf.placeholder(tf.bool, name='phase_train')
        self.blendshape = tf.Variable(tf.zeros([1, self.hidden_dim]), dtype=tf.float32, name="bs")

        # the input for the discrimiator
        self.input_Img_placeholder = tf.placeholder(tf.float32, [1, self.discri_ImgWei, self.discri_ImgWei, 3],
                                                    name="real_image")

        generator = DCGAN()
        self.pred = generator.g(self.blendshape, training=self.phase_train_placeholder)
   
        pred_netfeature[args.discriminate_featuremap])
        all_vars = tf.trainable_variables()
        ftune_vlist = [v for v in all_vars if v.name.startswith('bs')]
        self.train_op = NetUtil.train(self.loss, global_step=self.global_step, optimizer=args.optimizer,
                                      learning_rate=self.lr, moving_average_decay=args.moving_average_decay,
                                      update_gradient_vars=ftune_vlist)

        # fixed the restore model parameters
        var_to_restore = [v for v in all_vars if (v.name.startswith('g') or v.name.startswith('d'))]
        gen_saver = tf.train.Saver(var_to_restore)
 

        self.summary_op = tf.summary.merge_all()
        self.sess_gen = tf.Session()
        self.writer = tf.summary.FileWriter('log/train', self.sess_gen.graph)
        # TODO initial the bs by different methods
        self.sess_gen.run(tf.global_variables_initializer())
        self.sess_gen.run(tf.local_variables_initializer())
        self.gen_model = generator_model
        gen_saver.restore(self.sess_gen, self.gen_model)
        graph = tf.get_default_graph()
        print("load the generator model success")

觸發(fā)某個(gè)事件,調(diào)用子線程草冈,傳遞所有模型的參數(shù)到子線程中;下面涉及到從子線程傳遞參數(shù)到主線程和從主線程傳遞參數(shù)到子線程她奥。其中,主線程傳遞參數(shù)到子線程怎棱,只需要在子線程init函數(shù)中傳參就可以了哩俭。從子線程傳遞到主線程就需要信號(hào)和槽機(jī)制,

  1. 首先 聲明 InfoSignal = QtCore.pyqtSignal(list,list,float,int)
  2. 在run函數(shù)中self.InfoSignal.emit(img,bsret,loss_var,i+1)
  3. 子線程傳回信號(hào)處理事件拳恋,在下面代碼中函數(shù) OptimEnd函數(shù)

觸發(fā)事件和收到信號(hào)代碼:

 def on_click(self):
        print("into on click")
        self.pushButton.setDisabled(True)
        # 得到總共優(yōu)化步數(shù) 開(kāi)始優(yōu)化,
        optimSumStep = self.stepSumspinBox.value()
        optimStep = self.stepIdxspinBox.value()
        self.lr = self.lrDoubleSpinBox.value()

        # 一個(gè)循環(huán)每迭代一次凡资,可視化到面板上 ,input: realImg, 和上一次得到blendshape
        self.OptimThread = OptimizerThread(optimSumStep, self.sess_gen, self.RealImg,
                                           self.last_bs, self.blendshape, self.pred,
                                           self.train_op, self.loss, self.input_Img_placeholder,
                                           self.phase_train_placeholder)
        self.OptimThread.InfoSignal.connect(self.OptimEnd)
        self.OptimThread.start()

    def OptimEnd(self,gen_img,last_bs,loss,cnt):
        print("loss=",loss)
        self.last_bs = last_bs
        print(self.last_bs)
        self.gen_img = np.array(gen_img)
        pix = QtGui.QPixmap(qimage2ndarray.array2qimage(self.gen_img))
        self.OptimGraphicsView.setPixmap(QtGui.QPixmap(pix).scaled(580, 640))
        self.stepIdxspinBox.setProperty("value", cnt)
        self.pushButton.setDisabled(False)

子線程代碼:

class OptimizerThread(QThread):
    # 聲明一個(gè)信號(hào),接受返回值 generator_image,bs,loss
    InfoSignal = QtCore.pyqtSignal(list,list,float,int)
    basic_ImgWei = 256
    basic_ImgHei = 256

    discri_ImgWei = 224
    #構(gòu)造函數(shù)谬运,增加參數(shù)sess, realImage,bs_init
    def __init__(self,optimStep,sess,realImg,bs_init,blendshape,pred,train_op,loss,input_Img_placeholder,phase_train_placeholder,parent=None):
        super(OptimizerThread,self).__init__(parent)
        print("into the optimizer thread ")
        self.optimStep = optimStep
        self.sess_gen = sess
        self.realImg = realImg
        self.bs_init = bs_init
        self.blendshape = blendshape

        self.pred = pred
        self.train_op = train_op
        self.loss = loss
        self.input_Img_placeholder = input_Img_placeholder
        self.phase_train_placeholder = phase_train_placeholder

    #重寫(xiě)run函數(shù)
    def run(self):
        print("into thread run")
        self.sess_gen.run(tf.assign(self.blendshape, self.bs_init))
        print("after blendshape")
        for i in range(self.optimStep):
            bs_img = imresize(self.realImg, (self.discri_ImgWei, self.discri_ImgWei))
            bsimg_tensor = bs_img.reshape(-1, self.discri_ImgWei, self.discri_ImgWei, 3)

            gen_img, _, input_bs, loss_var = self.sess_gen.run(
                [self.pred, self.train_op, self.blendshape, self.loss],
                feed_dict={self.input_Img_placeholder: bsimg_tensor, self.phase_train_placeholder: True})

            self.last_bs = input_bs

            img = gen_img[0].tolist()
            bsret = self.last_bs[0].tolist()
            # self.optimStep = self.optimStep+1
            self.InfoSignal.emit(img,bsret,loss_var,i+1)
        print("thread end")

遺存的問(wèn)題隙赁,以上,我嘗試的方案就成功了梆暖,我的問(wèn)題是需要加載一張圖片伞访,然后做優(yōu)化。當(dāng)我點(diǎn)擊觸發(fā)優(yōu)化事件之后轰驳,再點(diǎn)擊觸發(fā)優(yōu)化事件ui就會(huì)退出厚掷,但是從新加載一張照片之后就不會(huì)產(chǎn)生這樣的情況,即使存在這樣的bug,也可以用级解。如果你發(fā)現(xiàn)如何改進(jìn)冒黑,非常感謝你能通知我,希望對(duì)初學(xué)者有用蠕趁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薛闪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俺陋,更是在濱河造成了極大的恐慌豁延,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腊状,死亡現(xiàn)場(chǎng)離奇詭異诱咏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缴挖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)袋狞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事苟鸯⊥撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵早处,是天一觀的道長(zhǎng)湾蔓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)砌梆,這世上最難降的妖魔是什么默责? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咸包,結(jié)果婚禮上桃序,老公的妹妹穿的比我還像新娘。我一直安慰自己烂瘫,他們只是感情好媒熊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著忱反,像睡著了一般泛释。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温算,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音间影,去河邊找鬼注竿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魂贬,可吹牛的內(nèi)容都是我干的巩割。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼付燥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宣谈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起键科,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闻丑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后勋颖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嗦嗡,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年饭玲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侥祭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矮冬,靈堂內(nèi)的尸體忽然破棺而出谈宛,到底是詐尸還是另有隱情,我是刑警寧澤胎署,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布入挣,位于F島的核電站,受9級(jí)特大地震影響硝拧,放射性物質(zhì)發(fā)生泄漏径筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一障陶、第九天 我趴在偏房一處隱蔽的房頂上張望滋恬。 院中可真熱鬧,春花似錦抱究、人聲如沸恢氯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勋拟。三九已至,卻和暖如春妈候,著一層夾襖步出監(jiān)牢的瞬間敢靡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工苦银, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啸胧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓幔虏,卻偏偏與公主長(zhǎng)得像纺念,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子想括,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,373評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,098評(píng)論 1 32
  • 最接近把一個(gè)人的生活重新過(guò)一遍的事情是回憶那種生活陷谱,并用文字記錄下來(lái),讓這種回憶盡可能地長(zhǎng)久瑟蜈⊙萄罚——本杰明·富蘭克林...
    麥穗時(shí)間閱讀 1,425評(píng)論 0 4
  • 擬念奴嬌·林秀貞 2006年9月15日 一諾卅年,心未變踪栋,好人秀貞流傳焙格。優(yōu)秀黨員,媒體宣夷都,知榮明恥實(shí)踐眷唉。憐貧...
    益德居士閱讀 293評(píng)論 0 6
  • 外地和尚會(huì)念經(jīng)予颤,您是怎么看待的? 看看我們的周?chē)簦?qǐng)理解我的意思蛤虐! 我們等了那么久,很多先進(jìn)思想需要我們?nèi)ベ澩?...
    像話讀書(shū)爻閱讀 251評(píng)論 1 2