人臉識(shí)別演示界面:python GUI--tkinter實(shí)戰(zhàn)(1)

寫在前面

???? 2018年走到尾聲,2019年寒假實(shí)習(xí)和春招的壓力撲面而來(lái),在大學(xué)象牙塔里待了5年多,雖然計(jì)算機(jī)專業(yè),但是編程能力弱的可憐。借抱大佬大腿馬上要參加的一個(gè)比賽,隊(duì)友已經(jīng)寫好了核心功能,將界面演示的部分交給了我,順便練習(xí)(ru men)一下python的界面編程。由于所選模型底層庫(kù)的調(diào)用和模型框架必須使用python2,所以界面GUI庫(kù)的選擇有很大局限性,這里選擇了python自帶的tkinter庫(kù),無(wú)需安裝,簡(jiǎn)單快速,python2/3兼容,只需要更改一下一些名稱就可以移植使用。但是最大的缺點(diǎn)就是丑!除了丑還是丑。這里簡(jiǎn)單記錄一下tkinter庫(kù)的使用,如果寫的不夠準(zhǔn)確還請(qǐng)多多指正。

一、tkinter基礎(chǔ)知識(shí)

Tkinter:Tkinter 模塊(Tk 接口)是 Python 的標(biāo)準(zhǔn) Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多數(shù)的 Unix 平臺(tái)下使用,同樣可以應(yīng)用在 Windows 和 Macintosh 系統(tǒng)里。Tk8.0 的后續(xù)版本可以實(shí)現(xiàn)本地窗口風(fēng)格,并良好地運(yùn)行在絕大多數(shù)平臺(tái)中。在本文中盡量列出在python2/3中的不同之處。

1、調(diào)用

導(dǎo)入tkinter模塊:

import tkinter #python 3

import Tkinter #python 2

導(dǎo)入tkinter庫(kù):

from Tkinter import * #python 2

from tkinter import * #python 3

在其他模塊的調(diào)用中也有不同,后續(xù)會(huì)詳細(xì)介紹。

2、基本結(jié)構(gòu)

·導(dǎo)入 Tkinter 模塊

·創(chuàng)建控件

·指定這個(gè)控件的 master, 即這個(gè)控件屬于哪一個(gè)

·告訴 GM(geometry manager) 有一個(gè)控件產(chǎn)生了。

import Tkinter

top = Tkinter.Tk()

#創(chuàng)建控件、指定master、告訴master控件產(chǎn)生

# 進(jìn)入消息循環(huán)

top.mainloop()

3、Tkinter 組件

?Tkinter的提供各種控件,如按鈕,標(biāo)簽和文本框,一個(gè)GUI應(yīng)用程序中使用。這些控件通常被稱為控件或者部件。目前有15種Tkinter的部件,具體可以參見鏈接查看詳細(xì)參數(shù)。

組件有部分共同屬性,也有各自的特有屬性,在規(guī)定一個(gè)控件的屬性時(shí)要注意不能混用。

4、幾何管理

幾何管理簡(jiǎn)單來(lái)說(shuō)就是一個(gè)畫布的版面,規(guī)定了各個(gè)控件所在區(qū)域的位置,幾何管理方式有三種:包(pack)、網(wǎng)格(grid)、位置(place)。針對(duì)同一個(gè)GM不能混用幾何管理,而且tkinter會(huì)自動(dòng)進(jìn)行大小縮放等操作,所以必須不斷調(diào)整參數(shù)得到滿意的布局。(無(wú)法實(shí)時(shí)地進(jìn)行可視化編程真是逼死強(qiáng)迫癥,你以為的布局和呈現(xiàn)的布局總是不同的)

·包:作為最基本簡(jiǎn)單的管理方法,只需要給出方位的大體位置和控件是否延伸等參數(shù)即可完成自動(dòng)的對(duì)齊,如果創(chuàng)建的控件比較簡(jiǎn)單就可以使用此方法。

·網(wǎng)格:如果控件比較復(fù)雜,最終呈現(xiàn)的效果是整齊的,可以使用網(wǎng)格管理,只需要告訴控件需要放在第幾行第幾列即可。

·位置:如果前兩者的布局仍然無(wú)法滿足花式控件的擺放需求,那么就計(jì)算一下當(dāng)下GM大小,給出準(zhǔn)確的位置吧。規(guī)定好控件大小和具體擺放坐標(biāo)(先在紙上畫好,算好...)再不斷運(yùn)行看看輸出效果再調(diào)整。

二、解決思路

在本部分將介紹如何使用tkinter完成一個(gè)基本的人臉識(shí)別界面呈現(xiàn)的思路。

1、設(shè)計(jì)目標(biāo)

我們的基本需求如下:

用戶選擇想得到分類的人臉圖片,顯示在界面中,通過點(diǎn)擊原始模型和修改后模型的按鈕得到分類結(jié)果和置信度;將人臉圖片添加一些擾動(dòng),顯示擾動(dòng)后的效果圖,再次放入兩個(gè)模型中得到預(yù)測(cè)結(jié)果。得到四組分類結(jié)果和置信度,可以進(jìn)行對(duì)比,看出模型的性能以及擾動(dòng)的效果。

具體需求拆分如下:

1、用戶可以直接選擇本地圖片和攝像頭現(xiàn)場(chǎng)拍照進(jìn)行人臉識(shí)別的數(shù)據(jù)源。

2、對(duì)于選擇后的圖片進(jìn)行顯示,如果是本地照片將給出圖片標(biāo)簽,截圖照片顯示截圖日期作為圖片標(biāo)簽。

3、顯示在原始模型和修改模型中運(yùn)行后的分類結(jié)果和置信度。

4、在所選圖片上選擇要添加的擾動(dòng)(圖片標(biāo)記)。

5、顯示觸發(fā)器和所選照片合成后的效果圖。

6、將合成圖片在原始模型和修改模型中進(jìn)行預(yù)測(cè),并給出分類結(jié)果和置信度。

2、布局效果圖

根據(jù)上述需求,繪制出理想的界面效果圖:

圖一:界面理想效果圖

3、控件布局

如圖一所示:

7個(gè)按鈕控件(Button),供用戶選擇,其中3按鈕需要出現(xiàn)彈窗(filedialog):選擇文件(get_file)、拍照截圖(shot_pic)、選擇擾動(dòng)(get_trg);

5個(gè)標(biāo)簽控件(Label),其中2個(gè)用于顯示圖片,三個(gè)分別顯示圖片標(biāo)簽、分類結(jié)果、置信度;

8個(gè)輸入控件(Entry),用于輸出從后臺(tái)模型中獲取的分類結(jié)果和置信度的值。

由于控件較多,而且希望盡量整齊,這里選用grid()幾何布局來(lái)規(guī)劃控件的位置,可以在Excel里標(biāo)記各個(gè)控件的大體位置,方便標(biāo)注行列值:

圖二:grid()布局行列值

由于tkinter的布局會(huì)自行進(jìn)行調(diào)整,所以這個(gè)demo的運(yùn)行結(jié)果并不理想,比如按鈕之間的間距,整個(gè)面板在窗口的位置,還有,最想要的背景圖片!在修改了無(wú)數(shù)版的布局以后,最終呈現(xiàn)的效果如下:

圖三:最終運(yùn)行效果圖

看到這里是不是已經(jīng)覺得可以右上角小叉叉退出了?絞盡腦汁搜索配色方案,依然拯救不了tkinter呈現(xiàn)的效果,理想和現(xiàn)實(shí)的差距隔了十萬(wàn)八千里。會(huì)在后面的細(xì)節(jié)中詳細(xì)介紹可以優(yōu)化的細(xì)節(jié)參數(shù)。

先暫時(shí)總結(jié)強(qiáng)調(diào)一下tkinter不能做到的:

(1)tkinter的幾何布局不能混用:所以當(dāng)我們使用了grid()進(jìn)行控件布局以后,無(wú)法采用pack()進(jìn)行填充背景圖片,因此多彩炫酷的背景圖沒有了,只能填充一下基本的純色;而且為了使主體功能區(qū)域處于整個(gè)窗口的中央,留下來(lái)的grid布局空白處,其實(shí)會(huì)被tkinter自行調(diào)節(jié)吞掉,不會(huì)有合適的留白,只能通過慢慢調(diào)整空間邊距獲得一些空白;

(2)控件不能選擇透明度:在tkinter中,想要調(diào)整透明度就得針對(duì)整個(gè)生成窗口進(jìn)行操作,無(wú)法改變部分控件的透明度,也就沒有了扁平化的按鈕和好看的文本顯示框。(題外話:當(dāng)生成一個(gè)完全透明的,隱藏標(biāo)題欄的窗口時(shí),會(huì)發(fā)生什么?)

(3)對(duì)于插入圖片的格式有嚴(yán)格要求:tkinter自己只認(rèn)gif,而且將jpg和png強(qiáng)制轉(zhuǎn)換成gif也是無(wú)法識(shí)別的,想擴(kuò)展這個(gè),裝pillow庫(kù)實(shí)現(xiàn),調(diào)用語(yǔ)句:

from PIL import Image, ImageTk

看到此處,一定破滅了夢(mèng)想,如果不是因?yàn)橹荒苡胮ython2,還是去嘗試pyqt寫界面吧。下一篇文章將每個(gè)模塊的具體實(shí)現(xiàn)進(jìn)行代碼描述,而且會(huì)針對(duì)如何調(diào)用攝像頭實(shí)現(xiàn)截圖進(jìn)行詳細(xì)介紹!

see you again~


參考鏈接:

Python GUI 編程(Tkinter) | 菜鳥教程

Python Tkinter GUI(三)顯示圖片 - 小飛飛的博客 - CSDN博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容