人像抠图 + OpenGL ES
OpenGL ES 利用摳圖算法實現人像留色
人像留色的原理
現在人像分割技術就像當初的人臉檢測算法一樣,稱為廣泛使用的基礎算法。
今天本文介紹的人像留色其實就是三年前某 AI 巨頭利用 video 分割技術展示的應用場景:人體區域保留彩色,人體區域之外灰度化。所以人像留色的關鍵技術在于高精度高性能的分割算法。
首先利用分割算法獲取到人像的 mask 圖(灰度圖),其中人像區域的灰度值大于 0 ,非人像區域的灰度值等于 0 。在 shader 中,首先對 mask 圖采樣判斷采樣點是否位于人像區域,然后分別進行不同的處理。
獲取人像 mask 圖
那么如何獲取人像 mask 圖?Github 上已經有很多大神開源了相關的分割或者摳圖算法。
這里推薦 3 個比較受歡迎的開源項目
Multi-Human-Parsing
Multi-Human-Parsing 的優勢在于支持多人不同部位的分割,同時支持目標檢測和人體部位分割。
Multi-Human-Parsing 將人群場景圖像劃分為語義一致的屬于身體部位或衣服物品的區域,從而為圖像中的每個像素分配一個語義部位標簽,以及它所屬的身份。
有很多應用場景,如虛擬現實、視頻監控、群體行為分析等。 Multi-Human-Parsing 的分割精度對于人體關鍵點檢測其實夠用了。
項目地址:?https://github.com/ZhaoJ9014/Multi-Human-Parsing
BackgroundMattingV2
大名鼎鼎的 BackgroundMattingV2 算法,這也是本文所使用的摳圖算法,主要特點就是實時、高分辨率、高精度的分割(Background Matting),項目免費可商用。
但是要在移動端落地的話,性能將會是很大的瓶頸,需要進行大量的算法優化,這也是目前大部分 AI 算法面臨的問題:如何將 AI 算法落地到低算力平臺。
項目地址:?https://github.com/PeterL1n/BackgroundMattingV2
TensorFlow Lite
TensorFlow Lite 是針對移動端的開源機器學習框架,支持 Android 和 iOS,提供了豐富的算法模型,包括圖像分割、目標檢測、圖像分類、超分等模型。
其中分割模型支持的場景比較豐富,包括人體、寵物和物體等。
val labelsArrays = arrayOf("background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus","car", "cat", "chair", "cow", "dining table", "dog", "horse", "motorbike","person", "potted plant", "sheep", "sofa", "train", "tv" )TensorFlow Lite 所提供的分割模型,使用 GPU 的話,單張 2K 的圖處理時間在幾百毫秒,基本上做不了 video 處理,另外分割精度也是 demo 級別的。
項目地址:?https://github.com/tensorflow/examples/tree/master/lite/examples/image_segmentation
人像留色的實現
用于實現人像留色的簡單 shader :
#version 300 es precision mediump float; in vec2 v_texCoord; layout(location = 0) out vec4 outColor; uniform sampler2D u_texture0;//rgba uniform sampler2D u_texture1;//人像灰度圖 uniform int u_renderType; uniform float u_offset; void main() {float gray = texture(u_texture1, v_texCoord).r;//對 mask 進行采樣vec4 rgba = texture(u_texture0, v_texCoord);if(gray > 0.01) {outColor = rgba;}else{float Y = 0.299 * rgba.r + 0.587 * rgba.g + 0.114 * rgba.b;//RGB 灰度化vec4 grayColor = vec4(vec3(Y), 1.0);outColor = mix(grayColor, rgba, u_offset);//混合漸變} }shader 中首先對 mask 采樣,然后判斷采樣點是否位于人像區域(灰度值是否大于 0 ),若采樣點位于人像區域外,對顏色進行灰度化。
另外需要注意 OpenGL 訪問的圖像內存默認是 4 字節對齊,這樣灰度 Mask 圖的寬度不是 4 的整數倍的話,會有花屏現象,這里需要取消對齊設置:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_GrayTexId); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_GrayImage.width, m_GrayImage.height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_GrayImage.ppPlane[0]); glBindTexture(GL_TEXTURE_2D, GL_NONE);完整實現代碼見項目:?https://github.com/githubhaohao
總結
以上是生活随笔為你收集整理的人像抠图 + OpenGL ES的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Yamale Python 包受高危的代
- 下一篇: python标识符_python – 如