吃雞決賽圈直播卻卡屏的我心好痛,立馬找來開發剛了一波

騰訊雲+社群發表於2018-10-11

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文由騰訊雲視訊發表於雲+社群專欄

img

關注公眾號“騰訊雲視訊”,一鍵獲取 技術乾貨 | 優惠活動 | 視訊方案

本是一名佛性型吃雞選手,自從被三個妹子帶著躺屍吃雞之後,便立志要成為一名吃雞高手,一大早便沉迷於各大網站的吃雞直播中,正看到決賽圈激動人心的時刻,直播花屏了?然後遊戲結束了?我的天,我是誰?我在哪?我錯過了什麼?

作為一名有強迫症的IT小哥哥,怎能讓直播花屏現象存在呢?一方面,為了自己能成為一名吃雞高手。另一方面,不能錯過每一個升職加薪的機會。就這樣開始了一段漫長的長征之路……

對於直播業務,”秒開、卡頓、時延、進房成功率”是我們經常關注的幾個指標,這些指標可以說是從”一個使用者能夠優雅地進入直播間”的角度來考量的,然而進入直播間後”使用者究竟看到的什麼內容”也是很關鍵的一環,內容上除了涉及安全的一些指標外,還可能會有內容是否有花屏、綠屏等其他異常內容,這時我們便會考慮如何衡量和發現外網的花屏情況。

本文主要針對花屏提出了一種基於CNN網路的檢測方案。

01

花屏檢測能力構建

無論是視訊還是直播,都是由一幀幀影像組成的,之所以會以一種動態的形式展現到我們眼前,是因為了人類的視覺暫留現象。

物體在快速運動時, 當人眼所看到的影像消失後,人眼仍能繼續保留其影像0.1-0.4秒左右的影像,這種現象被稱為視覺暫留現象

既然如此,檢測直播中是否存在花屏,其實可以轉換為檢測直播中的幀畫面是否是花屏的畫面,即一個影像識別問題。那麼如何識別一個影像是否是花屏呢?

通常影像識別總是以特徵為基礎的,我們會先根據所設定的目標來提取相應的特徵,用於我們後面來制定策略。不過好在現在的深度學習卷積神經網路CNN將提取特徵和制定決策策略都幫我們完成了。

而使用深度學習CNN網路則繞不開資料集模型訓練兩大塊

1.1資料集準備

困難

要使用深度學習網路,一個門檻是需要足夠的帶有標籤的資料集,否則學習出的網路很容易過擬合,從而泛化能力不強。說其是門檻是因為實際業務中更多情況是缺少資料集,就以現在的花屏為例,目前直播發生花屏的案例非常少,想要通過實際案例來收集足夠的花屏圖片作為訓練集顯得異常困難。因此必須探尋其他的路子來收集訓練集。

人類之所以能夠分辨出花屏,是因為人類眼睛能夠找到花屏影像的特徵,雖然這些特徵我們可能用語言都描述不出來,事實上,如果我們能用語言描述出特徵,我們也很容易將其翻譯成程式碼來找到花屏影像的特徵。

製作訓練集

機器學習其實也是通過特徵來工作的,既然如此,我們可以製作一些花屏影像出來,讓CNN網路找到它們區別於正常圖片的特徵,從而學習到花屏圖片的檢測能力。

在使用YUVviewer工具時,發現當設定錯誤的解析度來播放視訊檔案時會出現花屏情況。靈感來源於此,我們完全可以通過使用錯誤的解析度從YUV檔案中抽取幀,從而拿到花屏圖片。整體流程如下:

img

這裡需要了解YUV檔案的儲存格式,從而根據格式來進行抽取對應的幀:

YUV,分為三個分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色。

YUV取樣樣式有一下幾種,以黑點表示取樣該畫素點的Y分量,以空心圓圈表示採用該畫素點的UV分量,一般情況下我們都使用的是YUV420格式

img

YUV420格式儲存方式如下所示:

img

按照上面儲存方式編寫程式碼來提取幀,程式碼如下:

def get_frames_from_YUV(filename, dims, numfrm, startfrm, frmstep):
    """
    從給定的YUV檔案中抽取對應的幀資料,幀資料格式仍然為YUV

    :param filename: YUV檔案路徑
    :param dims: YUV檔案的解析度
    :param numfrm: 要提取幀的數量
    :param startfrm: 從哪一幀開始提取
    :param frmstep: 抽取幀的幀間隔,即每隔幾幀抽一幀
    :return: 返回抽取幀的Y列表,U列表,V列表
    """
    filesize = os.path.getsize(filename)
    fp = open(filename, `rb`)
    blk_size = prod(dims) * 3 / 2     # 計算每幀大小
    if (startfrm+1+(numfrm-1)*frmstep)*blk_size > filesize:
        numfrm = (filesize/blk_size - 1 - startfrm)/frmstep +1
        util.log(`檔案讀取越界--修改為%d`%numfrm)
    fp.seek(blk_size * startfrm, 0)   # 跳轉到指定開始幀
    Y, U, V= [],[],[]
    d00 = dims[0] / 2
    d01 = dims[1] / 2
    for i in range(numfrm):
        util.log(`檔案讀取第%d幀` % i)
        Yt = zeros((dims[1], dims[0]), uint8, `C`)
        Ut = zeros((d01, d00), uint8, `C`)
        Vt = zeros((d01, d00), uint8, `C`)
        for m in range(dims[1]):
            for n in range(dims[0]):
                # print m,n
                Yt[m, n] = ord(fp.read(1))
        for m in range(d01):
            for n in range(d00):
                Ut[m, n] = ord(fp.read(1))
        for m in range(d01):
            for n in range(d00):
                Vt[m, n] = ord(fp.read(1))
        Y = Y + [Yt]
        U = U + [Ut]
        V = V + [Vt]
        fp.seek(blk_size * (frmstep - 1), 1)   # 跳出間隔幀
    fp.close()
    return (Y, U, V)

這裡對解析度錯誤的多種情況也做了下研究,發現如下規律:

1)解析度正確

img

2)解析度width+1情況

img

3)解析度width+n情況

img

4)解析度width-1情況

img

5)解析度width-n情況

img

上面只是針對圖片寬來進行錯誤干擾,可以看出寬變小花屏條紋方向是左下的,寬變大花屏條紋方向時右下的。

所以我們隊寬和高分別設定不同的錯誤值,會造成不同型別的花屏,於是可以用這種策略構造大量的花屏。

我們用800多個視訊,每個視訊以一定的間隔來抽10幀,獲得了8000多張花屏圖片。

img

img

這些圖片標籤為花屏,也就是我們的正樣本,負樣本可選取實際直播中的正常截圖。

至此,資料集準備差不多了。

1.2 模型和訓練

模型上使用網上一些知名模型即可,這裡我們使用了輕量的mobilenet模型,模型結構如下圖所示:

img

訓練採用基於用imagenet已經訓練好的模型來進行finetune訓練,最後一層使用隨機超引數來訓練(這一層也無法讀取pretrained模型的超引數,因為分類數不一致)。訓練可以快速收斂,因為特徵太明顯了,而且測試集準確率很高。

其實這裡訓練是一個不斷迭代的過程,因為機器學習模型是一張白紙,它要具有怎樣的能力完全是你教它的,而教的方式就是通過訓練集(資料和標籤),而想要讓它能夠應對更多的情況,你的訓練集就要儘可能涵蓋各種情況。

而我們的訓練集總是不足的,你總會有care不到的地方。訓練集不足的情況會怎樣?舉個例子

你訓練個識別飛機的模型,而大部分關於飛機的圖片都有天空,這樣你給張天空的圖片到模型,它也可能會認為是飛機,因為其實模型很可能學到的是天空的特徵。而怎麼讓模型學到飛機的特徵呢,當然需要調整訓練集,讓訓練集裡不僅包含背景為天空的飛機,還有陸地上的飛機等等。

通過不斷低迭代調優,我們在空間場景下檢測準確率已經可以達到94%,NOW直播場景檢測準確率也已達到90%。

02

直播檢測方案

檢測能力具備後想要真正地接入直播業務,還需要將直播流進行分幀,然後把對應的幀圖片進行花屏檢測。

後臺整體框架

採用分幀截圖的手段,如果每天需要檢測2000萬張截圖,即10s會有一張截圖需要檢測,而考慮花屏總是出現在很長的一段時間內,因此這裡希望能夠以更長的時間來抽樣從而避免浪費算力。

img

附一張目前業務檢測花屏結果的截圖:

img

作為一名熱愛工作的IT小哥哥,花了一個星期的時間,總算把基於CNN網路的直播花屏檢測的工作告一段落了。

工作使我開心,遊戲使我快樂,終於可以再次流暢的遊走在各大網址的吃雞直播中啦~

問答
遊戲體系結構
相關閱讀
團戰開黑必備“良藥”瞭解一下!
再也不用擔心網咖開黑隊友聽不清了!
3行程式碼,為QQ輕遊戲加上語音互動能力
【每日課程推薦】機器學習實戰!快速入門線上廣告業務及CTR相應知識

此文已由作者授權騰訊雲+社群釋出,更多原文請點選

搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社群

相關文章