1 前言
?? 優(yōu)質(zhì)競賽項目系列,今天要分享的是
?? 深度學習人體語義分割在彈幕防遮擋上的應用
該項目較為新穎,適合作為競賽課題方向,學長非常推薦!
??學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點:3分
?? 更多資料, 項目分享:文章來源:http://www.zghlxwxcb.cn/news/detail-829316.html
https://gitee.com/dancheng-senior/postgraduate文章來源地址http://www.zghlxwxcb.cn/news/detail-829316.html
1 課題背景
彈幕是顯示在視頻上的評論,可以以滾動、停留甚至更多動作特效方式出現(xiàn)在視頻上,是觀看視頻的人發(fā)送的簡短評論。
各大視頻網(wǎng)站目前都有彈幕功能,之家也于2020年5月正式上線視頻彈幕功能,受到了廣大網(wǎng)友的喜愛,大家在觀看視頻的同時,也能通過彈幕進行互動。
但密集的彈幕,遮擋視頻畫面,嚴重影響用戶觀看體驗,如何解決?
查閱了相關視頻網(wǎng)站,發(fā)現(xiàn)B站推出了一種蒙版彈幕技術,可以讓彈幕自動躲避人形區(qū)域,達到彈幕不擋人的效果。
B站視頻彈幕不擋人的效果
2 技術原理和方法
2.1基本原理
通過AI計算機視覺的技術,對視頻內(nèi)容進行分析,并將之前已經(jīng)定義好的“視頻主體內(nèi)容”進行識別,生成蒙版并分發(fā)給客戶端后,讓客戶端利用 CSS3
的特性進行渲染從而達成最終的效果。這樣就形成了我們最終看到的,“不擋臉”彈幕效果。
實現(xiàn)方法就正如 PS
中的“蒙版“一樣,實心區(qū)域允許,空白區(qū)域拒絕,從而達到彈幕不擋人的效果。而技術的核心就在蒙版的生成上,所以將這個功能稱之為“蒙版彈幕”。
2.2 技術選型和方法
1、提取視頻幀畫面。對音視頻的處理,大家一般都會想到FFmpeg組件,我們也是使用FFmpeg組件提取每幀的視頻畫面,使用的是PyAV組件,PyAV是FFmpeg封裝,能夠靈活的編解碼視頻和音頻,并且支持Python常用的數(shù)據(jù)格式(如numpy)。
2、識別視頻幀畫面人像區(qū)域。解決方案:使用AI計算機視覺的實例分割技術,可以識別視頻幀畫面的人像區(qū)域。
3、AI框架:目前市面上的AI框架,主要以TensorFlow,PyTorch最流行。
- TensorFlow :出身豪門的工業(yè)界霸主,由Google Brain團隊研發(fā)。具有如下優(yōu)點:支持多種編程語言;靈活的架構支持多GPU、分布式訓練,跨平臺運行能力強;自帶 TensorBoard 組件,能可視化計算圖,便于讓用戶實時監(jiān)控觀察訓練過程;官方文檔非常詳盡,可查詢資料眾多;社區(qū)龐大,大量開發(fā)者活躍于此。
- PyTorch :以動態(tài)圖崛起的學術界寵兒,是基于 Torch 并由Facebook強力支持的python端的開源深度學習庫。具有如下優(yōu)點:簡潔: PyTorch 在設計上更直觀,追求盡量少的封裝,建模過程透明,代碼易于理解;易用:應用十分靈活,接口沿用 Torch ,契合用戶思維,盡可能地讓用戶實現(xiàn)“所思即所得”,不過多顧慮框架本 PyTorch 。原因: TensorFlow 入門難度較大,學習門檻高,系統(tǒng)設計過于復雜;而 PyTorch 入門難度低,上手快,而且提供的功能也非常易用,預訓練模型也非常多。
4、實例分割技術:實例分割(Instance Segmentation)是視覺經(jīng)典四個任務中相對最難的一個,它既具備語義分割(Semantic
Segmentation)的特點,需要做到像素層面上的分類,也具備目標檢測(Object
Detection)的一部分特點,即需要定位出不同實例,即使它們是同一種類。
3 實例分割
簡介
實例分割已成為機器視覺研究中比較重要、復雜和具有挑戰(zhàn)性的領域之一。為了預測對象類標簽和特定于像素的對象實例掩碼,它對各種圖像中出現(xiàn)的對象實例的不同類進行本地化。實例分割的目的主要是幫助機器人,自動駕駛,監(jiān)視等。
實例分割同時利用目標檢測和語義分割的結(jié)果,通過目標檢測提供的目標最高置信度類別的索引,將語義分割中目標對應的Mask抽取出來。實例分割顧名思義,就是把一個類別里具體的一個個對象(具體的一個個例子)分割出來。
Mask R-CNN算法
本項目使用Mask R-CNN算法來進行圖像實例分割。
網(wǎng)絡結(jié)構圖:
Mask R-CNN,一個相對簡單和靈活的實例分割模型。該模型通過目標檢測進行了實例分割,同時生成了高質(zhì)量的掩模。通常,F(xiàn)aster
R-CNN有一個用于識別物體邊界框的分支。Mask R-CNN并行添加了一個對象蒙版預測分支作為改進。使用FPN主干的head架構如圖所示。
關鍵代碼
?
##利用不同的顏色為每個instance標注出mask,根據(jù)box的坐標在instance的周圍畫上矩形
##根據(jù)class_ids來尋找到對于的class_names。三個步驟中的任何一個都可以去掉,比如把mask部分
##去掉,那就只剩下box和label。同時可以篩選出class_ids從而顯示制定類別的instance顯示,下面
##這段就是用來顯示人的,其實也就把人的id選出來,然后記錄它們在輸入ids中的相對位置,從而得到
##相對應的box與mask的準確順序
def display_instances_person(image, boxes, masks, class_ids, class_names,
scores=None, title="",
figsize=(16, 16), ax=None):
"""
the funtion perform a role for displaying the persons who locate in the image
boxes: [num_instance, (y1, x1, y2, x2, class_id)] in image coordinates.
masks: [height, width, num_instances]
class_ids: [num_instances]
class_names: list of class names of the dataset
scores: (optional) confidence scores for each box
figsize: (optional) the size of the image.
"""
#compute the number of person
temp = []
for i, person in enumerate(class_ids):
if person == 1:
temp.append(i)
else:
pass
person_number = len(temp)
person_site = {}
for i in range(person_number):
person_site[i] = temp[i]
NN = boxes.shape[0]
# Number of person'instances
#N = boxes.shape[0]
N = person_number
if not N:
print("\n*** No person to display *** \n")
else:
# assert boxes.shape[0] == masks.shape[-1] == class_ids.shape[0]
pass
if not ax:
_, ax = plt.subplots(1, figsize=figsize)
# Generate random colors
colors = random_colors(NN)
# Show area outside image boundaries.
height, width = image.shape[:2]
ax.set_ylim(height + 10, -10)
ax.set_xlim(-10, width + 10)
ax.axis('off')
ax.set_title(title)
masked_image = image.astype(np.uint32).copy()
for a in range(N):
color = colors[a]
i = person_site[a]
# Bounding box
if not np.any(boxes[i]):
# Skip this instance. Has no bbox. Likely lost in image cropping.
continue
y1, x1, y2, x2 = boxes[i]
p = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2,
alpha=0.7, linestyle="dashed",
edgecolor=color, facecolor='none')
ax.add_patch(p)
# Label
class_id = class_ids[i]
score = scores[i] if scores is not None else None
label = class_names[class_id]
x = random.randint(x1, (x1 + x2) // 2)
caption = "{} {:.3f}".format(label, score) if score else label
ax.text(x1, y1 + 8, caption,
color='w', size=11, backgroundcolor="none")
# Mask
mask = masks[:, :, i]
masked_image = apply_mask(masked_image, mask, color)
# Mask Polygon
# Pad to ensure proper polygons for masks that touch image edges.
padded_mask = np.zeros(
(mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)
padded_mask[1:-1, 1:-1] = mask
contours = find_contours(padded_mask, 0.5)
for verts in contours:
# Subtract the padding and flip (y, x) to (x, y)
verts = np.fliplr(verts) - 1
p = Polygon(verts, facecolor="none", edgecolor=color)
ax.add_patch(p)
ax.imshow(masked_image.astype(np.uint8))
plt.show()
4 實現(xiàn)效果
原視頻
生成幀蒙板
最終效果
5 最后
?? 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate
到了這里,關于計算機設計大賽 深度學習人體語義分割在彈幕防遮擋上的實現(xiàn) - python的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!