用Python拯救鑑黃師

七月線上實驗室發表於2018-04-27

作者:Kaiser

來源:https://jizhi.im/blog/post/asciiart


曾經被無數人嚮往的神祕職業“專業鑑黃師”,要被人工智慧替代了!


人工智慧是怎麼鑑黃的?


對於一張影象,我們可以廣義地定義為3類:“正常”、“性感”、“色情”。因此,可以利用機器學習的方法來對訓練集影象進行訓練,將訓練後的模型用於預測。


鑑黃師們每天面對著海量的資料進行判斷分類,根據膚色裸露程度、姿勢、肢體輪廓判斷是否涉及色情元素。海量資料標註之後便是對機器的訓練。其通常邏輯是:鑑黃師輸入海量資料,將各類資料進行標籤化訓練,告訴機器,ABC是色情,DEF非色情,機器通過監督學習,提取ABCDEF的特徵來判斷G是不是色情。


在提高鑑黃的準確度上,目前還有采用的路徑是深度卷積神經網路CNNs的多GPU並行框架,通過小樣本目標的學習,快速準確地理解影象內容,並從影象中自動識別指定目標。網路直播平臺可以進行內容自定義,對視訊中靜態和動態的物體、人物資訊進行實時分析識別,最終綜合處理視訊中採集到的敏感資訊,對視訊中的場景進行事件分析,鑑定其涉黃與否。


今天帶來的是一篇趣味專案——Python繪製畫素圖。


一、ASCII藝術

ASCII 的全稱是 American Standard Code for Information Interchange,即美國資訊交換標準碼。是由軍用電報編碼發展而來,併成為最通用的現代計算機編碼系統。


在顯示卡還不能摧毀航母戰鬥群的年代,計算機還主要用來計算導彈彈道和衛星軌道,其圖形處理能力是非常弱的,甚至還不如今天高階一點的示波器。但這並不能阻止人類對美的追求,正如四萬年前的莽荒也沒有耽誤拉斯科洞窟壁畫的誕生。

640?wx_fmt=jpeg

拉斯科洞窟壁畫


在我剛上網那陣(暴露年齡?),有個流傳很廣的帖子,是教你觀看命令列裡的《星球大戰》,而這部星戰正是由ASCII編碼中的字元構成的,這被稱作ASCII art。

640?wx_fmt=png

這不大番薯和老夫子嗎?


在鬥圖代替打字、點播變成直播甚至VR/AR的今天,圖形的處理已經不再是瓶頸,反而成為了新的增長點。道高一尺魔高一丈,技術的進步也帶來了有害資訊,比如廣大家長朋友們特別關注的色情資訊。剛開始色情的鑑定是由人工完成的,李迪同志就是在《暴走大事件》中扮演鑑黃師唐馬儒而一炮走紅。

640?wx_fmt=png


但是,基於人工智慧的影象識別也在飛速進步,自動鑑黃已經投入實用,鑑黃師的職業前景就面臨著嚴重的威脅!你想想,你在家裡吃著火鍋鑑著黃,突然間,工作都要丟了,這誰受得了。救救鑑黃師!


二、字元畫


把一張照片轉換為字元畫,大致需要三步:

  • 將圖片尺寸壓縮到字元畫所能接受的量級;

  • 彩色圖轉換為灰度圖,灰度是一個0-255的數值;

  • 建立灰度值與字符集之間的對映關係。


早年間以上步驟還需要專門做一個小軟體來完成,而現在只需要簡單的程式碼就可以直接在瀏覽器中實現。

640?wx_fmt=png

熟悉這個視窗邊框的同學應該也不年輕了


因為字元畫的本質是“字元”,可以用文字編輯器開啟,對於計算機來說,他們和其他的字元沒有任何區別,“畫”的性質只是由人類的想象力後天賦予的。所以,如果你用字元畫的形式傳播春宮圖,還是需要唐馬儒。

640?wx_fmt=jpeg

小馬聽了美滋滋

三、Python擴充套件庫


針對字元畫生成的基礎功能,Python已經內建了很多優秀的擴充套件庫,可以在此基礎上直接呼叫,而無需重複製造輪子。


  • 相簿PIL(Python Imaging Library)基本的影象處理功能。

  • 網庫urllib 獲取網路資源,如下載網上的圖片。

640?wx_fmt=png

沒有必要把0-255的灰度值一一對應為不同的字元,一般十幾個也就足夠了。這裡做如下定義:

640?wx_fmt=png

這裡將最低的灰度段對映為' '(空格),也就是原圖中空白或接近空白的部分,在字元畫中也會會變成空白;而原圖的黑點則變成@。


四、圖片預處理


4K屏已經逐漸普及,現在差不多的電腦顯示器也能支援2K解析度,如果把每個畫素點都變成一個字元,那出來的圖片實在是太大了。


所以首先要對源圖片進行壓縮,再轉換為灰度模式,即丟擲色彩資訊。

640?wx_fmt=png640?wx_fmt=png

五、圖片到字元

然後是建立圖片(壓縮後)畫素點到字符集的對映關係。

640?wx_fmt=png

最後綜合前面幾個函式,以文字形式輸出字元畫。

640?wx_fmt=png640?wx_fmt=png

六、圖源採集

接下來我們可以為所欲為將任意圖片轉換為字元畫看看效果,為了充分發揚網際網路精神,目前僅支援具有網路地址的圖片(其實是圖片上傳系統還沒做好)。


下面來看一個例項,將一張QQ企鵝的圖示轉換為字元畫。

640?wx_fmt=png

七、開放空間

上節的例子仍然保留了預設的字符集和預設影象寬度60,接下來的部分留給讀者自由發揮,可以通過修改如下引數獲得自己的字元畫:

  • new_width:字元畫的尺寸(寬的字元數)

  • ASCII_CHARS:字符集

  • image_url:網路圖片地址,就是你想要轉換的圖片


操作示例:

當你在網上看到一張圖片,右鍵-複製圖片地址。


640?wx_fmt=jpeg


將圖片地址賦值予變數image_url,點選執行即可。

640?wx_fmt=png

替換相應變數

640?wx_fmt=png

摘掉眼鏡看效果更佳。

640?wx_fmt=png

Sublime編輯器裡的成像效果


【今日思考題】

請簡要介紹下SVM

(點選下方空白處獲取答案)

SVM,全稱是support vector machine,中文名叫支援向量機。SVM是一個面向資料的分類演算法,它的目標是為確定一個分類超平面,從而將不同的資料分隔開。
擴充套件:這裡有篇文章詳盡介紹了SVM的原理、推導,《支援向量機通俗導論(理解SVM的三層境界)》(連結:http://blog.csdn.net/v_july_v/article/details/7624837)。此外,這裡有個視訊也是關於SVM的推導:《純白板手推SVM》(連結:http://www.julyedu.com/video/play/18/429)。
後臺回覆“SVM”,獲取以上地址

機器學習九期開始報名,BAT + Google的一線技術大咖親自授課

點選閱讀原文,抓住轉入人工智慧行業的契機~

640?wx_fmt=png

相關文章