年輕人不講武德,竟用Python讓馬老師表演閃電五連鞭!

2021-03-02 機器學習算法與Python學習

點擊 機器學習算法與Python學習選擇加星標

精彩內容不迷路


11月份的頭條,是屬於馬保國的。一位69歲的老同志,慘遭年輕人偷襲,不講武德。

看看把老同志欺負的...要不是馬老師講仁義講道德,甩手就是一個五連鞭。

哈哈哈,所以本期我們就用Python給馬保國老師做一個閃電五連鞭動態詞雲圖

詞雲數據來自B站,使用stylecloud詞雲庫繪製。

主要參考百度AI Studio上的一個開源項目,使用PaddleSeg對人像進行分割。

年輕小F不講武德這樣好嗎耗子尾汁

/ 01 / 彈幕數據獲取

沒從B站上直接爬取,使用第三方庫bilibili_api

這是一個用Python寫的調用Bilibili各種API的庫,範圍涵蓋視頻、音頻、直播、動態、專欄、用戶、番劇等。

地址:https://passkou.com/bilibili_api/docs/

使用video模塊下面的兩個方法,可以獲取11月每天的視頻彈幕。

首先需要獲取SESSDATACSRF(bili_jct)的值。

谷歌瀏覽器可以通過下圖查看,域名選擇bilibili.com。

以點擊量為排序,選取排行第一的視頻獲取彈幕。沒想到馬老師老早就火了,耗子尾汁。

點擊排名第一的視頻,然後在瀏覽器的訪問欄獲取BV號,BV1HJ411L7DP。

獲取彈幕代碼如下。

from bilibili_api import video, Verify
import datetime

# 參數
verify = Verify("你的SESSDATA值", "你的bili_jct值")

# 獲取存在歷史彈幕的日期列表
days = video.get_history_danmaku_index(bvid="BV1HJ411L7DP", verify=verify)
print(days)

# 獲取彈幕信息,並保存
for day in days:
    danmus = video.get_danmaku(bvid="BV1HJ411L7DP", verify=verify, date=datetime.date(*map(int, day.split('-'))))
    print(danmus)

    f = open(r'danmu.txt', 'a')
    for danmu in danmus:
        print(danmu)
        f.write(danmu.text + '\n')
    f.close()

得到結果。

我大E了啊,沒有閃。

使用jieba對彈幕數據進行分詞處理

import jieba
def get_text_content(text_file_path):
    '''
    獲取填充文本內容
    '''
    text_content = ''
    with open(text_file_path, encoding='utf-8') as file:
        text_content = file.read()
    # 數據清洗,只保存字符串中的中文,字母,數字
    text_content_find = re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+', text_content, re.S)
    text_content = ' '.join(jieba.cut(str(text_content_find).replace(" ", ""), cut_all=False))
    print(text_content)
    return text_content


text_content = get_text_content('danmu.txt')

選取馬保國原版素材視頻,B站上有高清的。

地址:https://www.bilibili.com/video/BV1JV41117hq

參考網上的資料,運行如下代碼即可下載B站視頻

from bilibili_api import video, Verify
import requests
import urllib3

# 參數
verify = Verify("你的SESSDATA值", "你的bili_jct值")

# 獲取下載地址
download_url = video.get_download_url(bvid="BV1JV41117hq", verify=verify)
print(download_url["dash"]["video"][0]['baseUrl'])

baseurl = 'https://www.bilibili.com/video/BV1JV41117hq'
title = '馬保國'


def get_video():
    urllib3.disable_warnings()

    headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
    }
    headers.update({'Referer': baseurl})
    res = requests.Session()
    begin = 0
    end = 1024 * 1024 - 1
    flag = 0

    temp = download_url

    filename = "./" + title + ".flv"
    url = temp["dash"]["video"][0]['baseUrl']
    while True:
        headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
        res = requests.get(url=url, headers=headers, verify=False)
        if res.status_code != 416:
            begin = end + 1
            end = end + 1024 * 1024
        else:
            headers.update({'Range': str(end + 1) + '-'})
            res = requests.get(url=url, headers=headers, verify=False)
            flag = 1
        with open(filename, 'ab') as fp:
            fp.write(res.content)
            fp.flush()
        if flag == 1:
            fp.close()
            break

    print('----')
    print('視頻下載完成')
    filename = "./" + title + ".mp3"
    url = temp["dash"]["audio"][0]['baseUrl']
    while True:
        headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
        res = requests.get(url=url, headers=headers, verify=False)
        if res.status_code != 416:
            begin = end + 1
            end = end + 1024 * 1024
        else:
            headers.update({'Range': str(end + 1) + '-'})
            res = requests.get(url=url, headers=headers, verify=False)
            flag = 1
        with open(filename, 'ab') as fp:
            fp.write(res.content)
            fp.flush()
        if flag == 1:
            fp.close()
            break

    print('音頻下載完成')

記得添加SESSDATA和CSRF(bili_jct)的值

/ 02 / PaddleSeg人像分割

基於百度AI Studio的項目,項目地址:

https://aistudio.baidu.com/aistudio/projectdetail/1176398

首先下載解壓安裝PaddleSeg相關依賴包。

# 下載PaddleSeg
git clone https://hub.fastgit.org/PaddlePaddle/PaddleSeg.git

cd PaddleSeg/

# 安裝所需依賴項
pip install -r requirements.txt

通常去「GitHub」上下載東西,速度都比較慢,可以使用加速連結。

這裡的fastgit.org一加,下載速度就能從幾十K飆升到幾兆每秒。

# 新建文件夾
mkdir work/videos
mkdir work/texts
mkdir work/mp4_img
mkdir work/mp4_img_mask
mkdir work/mp4_img_analysis

新建一些文件夾,主要用來存放相關文件的。

這裡可以將之前爬取到的視頻和音頻放置在videos中。

先對素材視頻進行抽幀,就是獲取視頻每幀的圖片。

def transform_video_to_image(video_file_path, img_path):
    '''
    將視頻中每一幀保存成圖片
    '''
    video_capture = cv2.VideoCapture(video_file_path)
    fps = video_capture.get(cv2.CAP_PROP_FPS)
    count = 0
    while (True):
        ret, frame = video_capture.read()
        if ret:
            cv2.imwrite(img_path + '%d.jpg' % count, frame)
            count += 1
        else:
            break
    video_capture.release()

    filename_list = os.listdir(img_path)
    with open(os.path.join(img_path, 'img_list.txt'), 'w', encoding='utf-8') as file:
        file.writelines('\n'.join(filename_list))

    print('視頻圖片保存成功, 共有 %d 張' % count)
    return fps


input_video = 'work/videos/Master_Ma.mp4'
fps = transform_video_to_image(input_video, 'work/mp4_img/')

一共是獲取到了564張圖片。

然後使用PaddleSeg將所有的視頻圖片,進行人像分割,生成mask圖片。

# 生成mask結果圖片
python 你的路徑/PaddleSeg/pdseg/vis.py \
           --cfg 你的路徑/work/humanseg.yaml \
           --vis_dir 你的路徑/work/mp4_img_mask

使用模型進行預測,其中humanseg.yaml文件是作者提供的,可以進行圖像分割。

預訓練模型deeplabv3p_xception65_humanseg,需下載解壓安裝放在PaddleSeg/pretrained_model下。

由於預訓練模型較大,就不放網盤上了,直接訪問下面這個連結即可下載。

# 下載預訓練模型deeplabv3p_xception65_humanseg
https://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_humanseg.tgz

記得需要將humanseg.yaml文件中的路徑信息,修改成你自己的路徑。

運行上面那三行命令,最後就會生成564張mask文件。

/ 03 / 詞雲生成

使用stylecloud詞雲庫生成詞雲,使用字體方正蘭亭刊黑。

def create_wordcloud():
    for i in range(564):
        file_name = os.path.join("mp4_img_mask/", str(i) + '.png')
        # print(file_name)
        result = os.path.join("work/mp4_img_analysis/", 'result' + str(i) + '.png')
        # print(result)
        stylecloud.gen_stylecloud(text=text_content,
                                  font_path='方正蘭亭刊黑.TTF',
                                  output_name=result,
                                  background_color="black",
                                  mask_img=file_name)

因為stylecloud庫無法自定義詞雲圖片,所以小F修改了它的代碼。

給gen_stylecloud添加了mask_img這個參數,最終作用在gen_mask_array這個函數上。

如此就能將mask圖片轉化成詞雲圖!

將這些詞雲圖片合併成視頻。

def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False):
    '''
        合併圖像到視頻
    '''
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

    file_items = [item for item in os.listdir(comb_path) if item.endswith('.png')]
    file_len = len(file_items)
    # print(comb_path, file_items)
    if file_len > 0:
        print(file_len)
        temp_img = cv2.imread(os.path.join(comb_path, file_items[0]))
        img_height, img_width, _ = temp_img.shape

        out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height))

        for i in range(file_len):
            pic_name = os.path.join(comb_path, 'result' + str(i) + ".png")
            print(pic_name)
            if is_print:
                print(i + 1, '/', file_len, ' ', pic_name)
            img = cv2.imread(pic_name)
            out.write(img)
        out.release()


combine_image_to_video('work/mp4_img_analysis/', 'work/mp4_analysis.mp4', 30)

使用ffmpeg對視頻進一步的處理,裁剪+重疊。

# 視頻裁剪
ffmpeg  -i  mp4_analysis_result.mp4  -vf  crop=iw:ih/2:0:ih/5  output.mp4

# 視頻重疊
ffmpeg -i output.mp4 -i viedeos/Master_Ma.mp4 -filter_complex "[1:v]scale=500:270[v1];[0:v][v1]overlay=1490:10" -s 1920x1080  -c:v libx264 merge.mp4

# 添加音頻
ffmpeg -i merge.mp4 -i  videos/Master_Ma.mp4 -c:v copy -c:a copy work/mp4_analysis_result2.mp4 -y

# 生成gif圖
ffmpeg -ss 00:00:22 -t 3 -i merge.mp4 -r 15 a.gif

ffmpeg的安裝及使用就得靠大夥自己百度啦~

視頻結果如下。

到這裡了,不給小F來個贊嗎,來,炫,來偷吸,我這...

好了,到此本期的實踐就結束了。

相關代碼及文件已上傳,公眾號回復「馬老師」即可獲取。

感興趣的小夥伴也可以動手試一試。

這裡需要注意,在使用PaddleSeg進行人像分割和生成詞雲圖,這期間耗費的時間比較多,慢慢等就好了。

還有就是可以自己修改一下stylecloud庫的代碼,自定義一下mask_img圖片的大小以及顏色

這兩項小F是沒有修改的,所以生成的圖片是512×512尺寸,導致最後視頻需要裁剪。

顏色主要是將mask圖片變成白底的圖片,小F這裡是黑底的。

可以通過圖片灰度二值化的方法。

import cv2

# 灰度圖
img = cv2.imread('work/mp4_img_mask/240.png', 0)

# 二值化
ret, thresh = cv2.threshold(img, 30, 255, cv2.THRESH_BINARY_INV)

# 顯示
cv2.imshow("img", thresh)
# 保存圖片
cv2.imwrite('0.png', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

就能得到白底的png圖,符合stylecloud詞雲圖的要求

如此便可以繪製出白底彩色文字的詞雲圖。

相關焦點

  • 用Python表演馬老師的閃電五連鞭!
    一位69歲的老同志,慘遭年輕人偷襲,不講武德。看看把老同志欺負的...要不是馬老師講仁義講道德,甩手就是一個五連鞭。哈哈哈,所以本期我們就用Python給馬保國老師做一個閃電五連鞭動態詞雲圖。詞雲數據來自B站,使用stylecloud詞雲庫繪製。
  • 「閃電五連鞭」和「耗子尾汁」是什麼?
    作為混元形意太極的掌門人,馬保國和他的「閃電五連鞭」成了近一個月來最熱門的網絡梗之一。何謂「閃電五連鞭」?按照馬老師本人的說法,這是混元形意太極的高階招術之一,全名為「松果彈抖閃電鞭」,施術者要從丹田發力,同時輔以「三維立體混元勁兒」(另一種還沒出教學的高階功法)方才能打出絞勁兒,打出閃電鞭。
  • 馬保國大師的影帝之路一場精心的策劃「不講武德」?
    正當人們在熱議「渾元形意太極拳馬保國」微博官宣:「馬老已經回歸平靜生活,遠離武林是非圈子」的時候,馬保國大師又上路了。17日,馬保國大師發視頻宣告拍電影《少年功夫王》,聲音慷慨激昂,言外之意,為弘揚中國傳統武術功夫,大有弘揚中華武術捨我其誰的意思,還不忘打一遍「閃電五連鞭」,「接、化、發」一氣呵成。原來我們都上當了,馬保國大師虛晃一槍,沒有過上平靜生活,而是走上了「影帝」之路!事情遠沒有我們看到的那麼簡單。
  • 馬保國退隱一天就復出拍電影,網友:電影叫年輕人不講武德
    一鞭兩鞭三四鞭,五鞭一出倒一片,混元太極馬大師,從出江湖要變天,不講武德年輕人,一拳打眼大師疼。大師只是年紀大,神功一出誰都怕。最近很多人一定聽過這樣一句話,年輕人不講武德,這話就出自渾元形意太極拳掌門人馬保國大師之口。說到馬大師,最近可了不得了。我說現在的年輕人不但不講武德,還沒有口德,馬大師用他畢生所學五鞭神功為傳統武術證明,卻被網友狂噴,直接把馬大師噴成網絡最火的人,各種鬼畜的視頻出現在各大網絡平臺。
  • 鬼畜大師馬保國是哪裡人 馬保國的年輕人不講武德是什麼意思
    馬保國的年輕人不講武德是什麼意思他之前籍籍無名,但是不久前僅憑一場比賽就火遍全網。#馬保國回應惡搞#他的格鬥視頻被上傳到100多個視頻網站上,不僅佔據了B站鬼畜視頻的主流,還將渾元形意太極武術發揚光大,他就是「國際功夫巨星」馬保國。說起馬保國,或許沒多少人知道他的武術有多厲害,但很多人都知道由他創造的兩個網絡熱詞。
  • 馬保國為什麼能主宰B站鬼畜區,就憑「接化發」「閃電三鞭」嗎?
    要說現在最洗腦的梗無非就是「接化發」、「年輕人不講武德」、「松果痰抖閃電鞭」等等,這些都和一個叫馬保國的人有關。他在五月份就被人打了,為何現在他還能主宰B站鬼畜區,成為鬼畜全明星?既然被稱為掌門人,看過武俠劇的小夥伴應該了解,這種人肯定是身懷多種絕技的高手,馬保國也不例外。馬保國第一招絕技名為接化發,用他自己的話來解釋就是接勁、化勁、發勁,通俗點講就是先接住對手的進攻,再化解進攻,最後發動進攻,這套武術理念感覺完全就是在說廢話。
  • 馬保國復出拍電影,隱退一天後宣布拍電影,現場展示閃電五連鞭
    最近肯定聽說過「耗子尾汁(好自為之)」和「年輕人不用武德」等詞語,馬保國最近一直在熱搜,所以很多人推測背後有推手,對於這些事件馬保國也對此做出了回應。 最近網上出來很多關於馬老的各類剪輯視頻,網絡信息很亂,大家要能清晰明辨。這裡是我們對外唯一的窗口平臺,一切信息以此發布為準,謝謝大家。馬老已回歸平靜生活,遠離武林是非圈子,望大家能了解為盼[作揖]!
  • 王者榮耀:瀾-閃電五連鞭,不是,這真沒有偷學我「馬老師」
    王者榮耀:瀾-閃電五連鞭,不是,這真沒有偷學我「馬老師」
  • 耗子尾汁來源出處介紹 不講武德什麼梗
    馬保國的耗子尾汁,好好反獅,年輕人不講武德等表情包在網絡上瘋傳,這個梗聽上去像飲料,其實是「好自為之」發音不準造成的,從而被網友紛紛模仿調侃,耗子尾汁不講武德什麼梗?下面帶來介紹。耗子尾汁是什麼梗?
  • 大師之死:年輕人不講武德,我已心生厭倦,你們好自為之!
    然而,真的站到了擂臺上後,看著眼前的年輕人姿勢不對,打法很蠢,他又覺得索然無味了。因為他深知,閃電五連鞭是絕對不能使出來的,否則此子性命難留。馬大師行走江湖這麼多年,深諳消費者的心理,想要騙國人的錢,那麼就要有響亮的名聲與背書。所以,他就把自己包裝成為了海歸功夫大師。技能絕學中也融入了一些西方元素,比如閃電五連鞭,頗有西方霹靂舞之風。
  • 怎麼科學解讀閃電鞭?年輕人我勸你耗子尾汁,好好反思
    今天小編就出一期教程給你講講馬老師「傳統功夫」背後的奧秘。騎自行車、跑步、遊泳、打排球、踢足球和擲標槍等運動,無一例外地是人的肢體和各個關節地配合完成的,這其中也包括馬老師秘技——閃電五連鞭/song guo tan dou閃電鞭。人體的各個關節可以看作是轉軸——點,肢節則可以簡化成剛體——線。
  • 王者榮耀新英雄:馬老師技能搶先看!
    朋友們好,我是子攸,剛才有個朋友問我馬老師是甚麼技能。那麼今天,子攸就來帶大家看看新英雄馬老師的技能吧。馬老師一共擁有四個技能,馬老師的被動叫做:松果糖豆勁兒。松果糖豆勁兒馬老師天生擁有松果糖豆勁兒,當其打出五鞭時便可激發出松果糖豆勁兒,將技能「五連鞭」強化為「松果糖豆閃電鞭」,同時召喚出夥伴婷婷加入戰鬥,婷婷繼承馬老師所有屬性和裝備效果,持續10秒。
  • 對不起了馬老師
    相信近一段時間以來馬保國老師的「渾元形意太極拳」「閃電五連鞭」「年輕人不講武德」「耗子尾汁」「我大意了,沒有閃」一定已經深入人心了吧。今天就給大家康康在明日之后里被玩壞的馬保國。剛才有個朋友問我,馬老師發生腎麼事了 我說怎麼回事 給我發了幾張截圖 我一看,哦!
  • 我的世界:全網最火模組上線,史蒂夫馬老師附體,打怪物掉落武德
    本期內容最近在尋找遊戲玩法的過程,無意間發現了一個很有趣的模組,裡面有混元掌門馬老師的身影。想必大家都知道,自從那次的比武之後,相關的話題便火得一塌糊塗。全網最火的模組上線後,史蒂夫便被馬老師附體,打怪物的時候會掉落武德。
  • 年輕人不講武德?「大師」馬保國:已遠離武林是非
    年輕人不講武德?視頻中他金句頻出,部分經典句式甚至被網友們總結歸納成了「保國體」,變成了口頭禪,比如「年輕人不講武德,欺侮我六十九歲的老同志」、「耗子尾汁」(好自為之)等。
  • 不是年輕人不講武德,而是這世界變化太快,父母應該學會理解孩子
    不是年輕人不講武德,而是這世界變化太快。正如69歲的馬保國老師和年僅50歲的小夥子王慶民的對決,據王慶民說這是一場「中國傳統武術的較量」,而馬老師就覺得「年輕人不講武德」,偷襲他這個「69歲的老同志」,導致自己的「松活彈鬥閃電鞭」沒有發揮出來,在4秒內被3拳直接KO在地。
  • 馬保國告訴你啥叫功夫,五連鞭送你上天
    是的,馬老師的主要目的是想做桃李滿天下的大師,發展他自創的渾元形意太極門掌門人,使他的武學技藝讓千萬人受益,想來這樣馬老師也能有更多收益。但行走江湖,能做到「二百多斤的英國大力士都撾不動我的一個手指」的馬老師顯然也沒有什麼好怕的,秉承著「只要你不覺得丟人,丟人的就是別人」的大無畏精神,馬老師還曾錄了一段視頻為自己的實力正名。
  • 馬保國經典語錄:年輕人不講武德,是真的不講武德?
    馬保國可能也沒想到自己是以「語錄」方式火的;人們可能也沒料到馬老師會趁著這股風表示要參演電影了。今年貢獻了這麼多部「傳世佳作」的馬老師,作為主演這回真的要演電影了,演的還是個神秘的武術老師傅。可能連馬老師都沒有想到,自己在家裡坐著坐著,就突然爆紅了。面對這上億的流量,馬老師倒也是看得開,直接表示自己已經退出武林。一句火爆全網的,「年輕人不講武德」,幽默風趣,讓我們生活又添加了不少樂趣。他表示只接正能量題材,並且只演正面角色,因為其形象是「推廣傳統功夫」。
  • 以「馬保國」的方式打開MC動畫,HIM不講武德,傳統功夫點到為止
    馬老師最近在網絡上面很火啊,走到哪裡都能看見關於馬老師的各種梗。等一下,我說的不是那個金牌廚師大司馬,而是渾元形意太極掌門人「馬保國」老師,一手閃電十三鞭的功夫,可以說是讓人聞風喪膽,想當年在江湖上就曾聽過這一絕學。
  • 還表演了閃電五連鞭
    還表演了閃電五連鞭世界之大,錢能推磨!近日,馬保國這個名字讓一部分人有了一點印象,馬保國對外自稱是「渾元形意太極門掌門人」,2020年5月17日,馬保國和王慶民在切磋的過程中被三次擊倒,最後被KO,2020年11月15日,馬保國發文回應其視頻被惡搞剪輯一事:望大家明辨是非,馬老已回歸平靜生活,遠離武林是非圈子!