可以用Python編程語言做哪些神奇好玩的事情?
Python作為一種應用極為廣泛的語言,幾乎在任何領域都能派上用場。想做Web有Flask/Django/Tornado;想做分布式有Celery;想做手機App有Kivy;想做數據分析有Pandas;想做可視化有Matplotlib/Seaborn/Plotly/Bokeh;想做機器學習有Tensorflow/PyTorch/MxNet……
夸張一點說,幾乎沒有什么做不了的東西(筆芯)。小慕今天分享兩個可以用Python做的非常好玩的事情,大家都可以試試看~一、面部識別得益于大量前人的工作,如今利用Python做一些簡單的計算機視覺工作已經變得非常非常簡單了。像人臉識別、面部特征提取之類的工作,就可以直接拿來用,極少需要自己實現繁瑣的算法。
DLib就是一個這樣的C++庫,而同時它也提供了Python接口。
想必大家都有過在辦公室遭遇boss探視的經歷,而此時此刻你卻在毫無自知地逛著淘寶/知乎/豆瓣,場面一度十分尷尬……
那我們就來嘗試一下,用Python通過攝像頭探測人臉。如果有人進入了攝像頭范圍,則讓Python提出一個通知,告訴你——趕緊把不相關的東西關掉!
整個代碼很短,無非幾十行,為了能夠使用,我們還需要安裝一些包和庫。這里需要用到的包括OpenCV和DLib。由于dlib需要boost-python,因此還需要安裝boost和boost-python。(注意:boost-python默認情況下只編譯python2依賴的庫,如果使用python3,需要加編譯開關;而dlib里是沒有探測python版本的,所以可能還需要做一些小hack或者是直接改boost-python庫里的文件名)
至于代碼,可以簡單地放出來:
import cv2import dlibfrom subprocess import callfrom time import timeFREQ = 5FACE_DETECTOR = dlib.get_frontal_face_detector()# macOS下可以使用AppleScript發送通知def notify(text, title):cmd = r'display notification "%s" with title "%s"'%(text, title)call(["osascript", "-e", cmd])if __name__ == '__main__':# 初始化攝像頭cap = cv2.VideoCapture(0)# 創建繪圖窗口# cv2.namedWindow('face')notify_time = 0while True:# 獲取一幀ret, frame = cap.read()# 不需要太精細的圖片frame = cv2.resize(frame, (320, 240))# 探測人臉,可能有多個faces = FACE_DETECTOR(frame, 1)for face in faces:# 提取人臉部分 畫個方框# fimg = frame[face.top():face.bottom(), face.left():face.right()] # cv2.rectangle(frame, (face.left(), face.top()), (face.right(), face.bottom()), (255, 0, 0), 3) # 不超過FREQ秒一次的發提醒if time() - notify_time > FREQ:notify(u'檢測到人臉', u'注意')notify_time = time()# 畫到窗口里# cv2.imshow('face', frame)# 按Q退出if cv2.waitKey(500) & 0xff == ord('q'): break# 清理窗口 釋放攝像頭# cv2.destroyAllWindows()cap.release()代碼的原理很簡單:通過opencv捕獲攝像頭獲取的圖像,然后交由dlib的face detector進行檢測。如果檢測到臉部,則通過AppleScript發出系統提醒(notify函數即通過process執行AppleScript發出提醒,如果你使用的是Windows,也可以替換成別的內容,例如Win下使用VBScript發出彈窗提醒)。
當然,既然檢測到人臉,那就不僅僅只是能做簡單提醒了。還可以做的事情包括多張照片的臉部變形合成——比如,找出你和你女朋友的照片來做個夫妻相合成什么的……
或者,提取所有的標志性點,給人臉合成出意外的表情或者哈哈鏡效果。
甚至可以借助其它的深度學習網絡進行人臉識別。這算是超級弱化版的臉部識別,比不上FaceID但也挺好玩,不過計算量就不容樂觀了。
順便說一句,什么人臉識別關掉不該看的東西,對小慕來說不存在的,人家上班刷知乎可是經過老板點頭的!(驕傲臉叉腰)
二、數據分析來分析下Marvel 今年的最后一部戲:「雷神3:諸神的黃昏」。前一段時間滿天飛的預告片,神秘博士的客串,綠巨人的出演,看得人十分興奮!來張大圖:
大家對于這部電影的評價是怎么樣的呢?小慕爬取了2w條豆瓣影評,做一個簡單分析。
先來看看豆瓣的短評:
這里只抓取了前2w條評論,說一個小技巧,喜歡寫爬蟲的小伙伴們注意了:爬取的網頁一定要緩存到本地!這可以減少解析網頁時出錯,避免需要重新再爬一遍的「尷尬」!另外這能給服務器減少負載,人家網站管理員看你的請求還算守規矩,也就不會封你賬號/ip啦!
代碼大概是這樣的:
下面是緩存下來的網頁文件:
既然有2w多條數據,怎么能直接寫sql,那會累死的……于是要來封裝一下操作數據庫的邏輯:
來看看效果,除去部分出錯的,還剩下19672條:
具體的數據是長這樣的:
另外,贊同數量排名第一 卷耳 君的影評實在是太有意思了:
第一部:《爸爸,再愛我一次》
第二部:《哥哥,再愛我一次》
第三部:《姐姐,再愛我一次》
ps:托爾終于從錘神變成了雷神
錘子之神這個梗小慕表示能玩一年(手動微笑臉)。
光有數據還不足以說明什么,深入分析一波:細心的小伙伴一定發現了,雷神明明是11月3號才上映,為啥10月份就有影評了?小慕猜測,這肯定是漫威鐵桿粉跑國外看了,一查發現,果然人家洛杉磯10月10號就上映了:
既然關心到日期,可以來統計一下周一到周日哪天去看電影的人比較多:
整體數據顯示:果然還是周末去看電影的人更多……周一數據高于二、三、四的原因,不知道是不是沒有周末的朋友調休去看的?
PS: 數據庫里的日期是2017-10-25格式的:怎么快速讓他顯示成周X呢? 這里只要寫個小函數就行:
從數據庫里讀數據和統計的方式在這:(后面的統計方式也都類似,就不每次都把代碼放出來啦)
說了這么多還是沒提到電影的受歡迎程度,直接放圖:
總體上看還是推薦的人比較多耶,這應該挺符合大家的預期,畢竟是漫威出品,光忠實粉絲就不計其數。更何況這個片子里出現了很多超級火爆的場面戲,還有各種超級英雄助陣,這樣的統計結果也就不足為奇了。
最后將排名前100的評論內容做了一下分詞,做成詞云:
至于補充提問中提到的這為什么適合用Python做,其實說到底就是用Python來抓取和處理各種數據都非常「順手」。
據小慕所知,目前的數據工作中,數據科學家使用最多的工具語言就是Python,排在第二的工具語言是R語言。但這里有一個有趣的現象,那就是同時使用Python或者R語言的人,推薦別人使用Python的卻遠高于R語言。Why?
答案是:1. Python簡單易學,極其容易上手,語法簡單,處理速度會比R語言要快,而且無需把數據庫切割。
2. 市場前景好,是目前的趨勢,就業也會更容易。
3. 標準庫非常龐大,特別的“功能齊全”,可以處理各種工作,其中就包含抓取和處理數據。
所以,有一種說法是:python語言在工程方便比較實用,R語言則更受學術界歡迎。具體是否贊同這種說法,還要看大家自己的理解咯~其實除了小慕舉例說的這兩種有趣的事情,Python能做的還有很多,在此不一一列舉,如果感覺get到了新姿勢,記得回來點贊啦~
程序員學習交流請添加慕課網官方客服微信:mukewang666回復暗號“前端面試”可進前端交流群回復暗號“Java”可進Java交流群回復暗號“專欄”可進程序員交流群