主頁 >  其他 > 摳圖黨福音:教你一鍵分割影像

摳圖黨福音:教你一鍵分割影像

2023-05-23 09:00:49 其他

摘要:輸入一個影像,通過Segment Anything模型即可獲得影像所有目標的分割點位置,再通過位置將影像進行分割保存,

本文分享自華為云社區《一鍵分割影像》,作者:雨落無痕 ,

Segment Anything

Segment Anything Model(SAM)通過點或框等輸入提示生成高質量的物件分割區域,并且可以用于為影像中的所有物件生成分割區域,它已經在1100萬張影像和11億個分割區域的資料集上進行了訓練,并且在各種分割任務上具有強大的零樣本性能,

SAM 的作業原理:可提示分割

在自然語言處理和最近的計算機視覺領域,最令人興奮的發展之一是基礎模型的發展,這些基礎模型可以使用提示技術(prompting)對新資料集和任務執行零樣本和小樣本學習,我們從這類作業中汲取了靈感,

我們訓練 SAM 為任何提示回傳有效的分割掩碼,其中提示可以是前景/背景點、粗框或掩碼、自由格式文本,或者一般來說,提示影像中要分割的內容的任何資訊,有效掩碼的要求僅僅意味著即使提示不明確并且可能指代多個物件(例如,襯衫上的一個點可能表示襯衫或穿著它的人),輸出也應該是一個合理的掩碼物件之一,此任務用于預訓練模型并通過提示解決一般的下游分割任務,

我們觀察到預訓練任務和互動式資料收集對模型設計施加了特定的限制,特別是,該模型需要在Web瀏覽器的CPU上實時運行,以允許我們的標注者實時互動地使用 SAM 以高效地進行標注,雖然運行時限制意味著質量和運行時之間的權衡,但我們發現簡單的設計在實踐中會產生良好的結果,具體地,影像編碼器為影像生成一次性嵌入向量,而輕量級編碼器將任何提示實時轉換為嵌入向量,然后將這兩個資訊源組合在一個預測分割掩碼的輕量級解碼器中,在計算影像嵌入后,SAM 可以在 50 毫秒內根據網路瀏覽器中的任何提示生成一個分割,

SAM模型總體上分為3部分:

綠色的影像編碼器,基于可擴展和強大的預訓練方法,我們使用MAE預訓練的ViT,最小限度地適用于處理高解析度輸入,影像編碼器對每張影像運行一次,在提示模型之前進行應用,

紫色的提示編碼器,考慮兩組prompt:稀疏(點、框、文本)和密集(掩碼),我們通過位置編碼來表示點和框,并將對每個提示型別的學習嵌入和自由形式的文本與CLIP中的現成文本編碼相加,密集的提示(即掩碼)使用卷積進行嵌入,并通過影像嵌入進行元素求和,

橙色的提示編碼器,掩碼解碼器有效地將影像嵌入、提示嵌入和輸出token映射到掩碼,該設計的靈感來自于DETR,采用了對(帶有動態掩模預測頭的)Transformer decoder模塊的修改,

Segment Anything適配ModelArts

使用方法:

輸入一個影像,通過Segment Anything模型即可獲得影像所有目標的分割點位置,再通過位置將影像進行分割保存,

本案例需使用 Pytorch-1.8 GPU-P100 及以上規格運行

點擊Run in ModelArts,將會進入到ModelArts CodeLab中,這時需要你登錄華為云賬號,如果沒有賬號,則需要注冊一個,且要進行實名認證,參考《ModelArts準備作業_簡易版》 即可完成賬號注冊和實名認證,登錄之后,等待片刻,即可進入到CodeLab的運行環境

出現 Out Of Memory ,請檢查是否為您的引數配置過高導致,修改引數配置,重啟kernel或更換更高規格資源進行規避???

1.環境準備

為了方便用戶下載使用及快速體驗,本案例已將代碼及segment-anything預訓練模型轉存至華為云OBS中,模型下載與加載需要幾分鐘時間,

import os
import torch
import os.path as osp
import moxing as mox
path = osp.join(os.getcwd(),'segment-anything')
if not os.path.exists(path):
 mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/segment-anything', path)
 if os.path.exists(path):
 print('Download success')
 else:
        raise Exception('Download Failed')
else:
 print("Model Package already exists!") 

check GPU & 安裝依賴

大約耗時1min

%cd segment-anything
!pip install --upgrade pip
!pip install torch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1
!pip install opencv-python matplotlib
!python setup.py install
import numpy as np
import matplotlib.pyplot as plt
import cv2
import copy
import torch
import torchvision
print("PyTorch version:", torch.__version__)
print("Torchvision version:", torchvision.__version__)
print("CUDA is available:", torch.cuda.is_available())

2.加載模型

from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor
sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"
device = "cuda"
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)
mask_generator = SamAutomaticMaskGenerator(
    model=sam,
    #points_per_side=32,
    #pred_iou_thresh=0.86,
    #stability_score_thresh=0.92,
    #crop_n_layers=1,
    #crop_n_points_downscale_factor=2,
    #min_mask_region_area=100,  # Requires open-cv to run post-processing
)

3.一鍵分割所有目標

def show_anns(anns,image):
 segment_image = copy.copy(image)
 segment_image.astype("uint8")
 if len(anns) == 0:
 return
 sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
 for ann in sorted_anns:
        mask_2d = ann['segmentation']
 h,w = mask_2d.shape
        mask_3d_color = np.zeros((h,w,3), dtype=np.uint8)
        mask = (mask_2d!=0).astype(bool)
 rgb = np.random.randint(0, 255, (1, 3), dtype=np.uint8)
        mask_3d_color[mask_2d[:, :] == 1] = rgb
 segment_image[mask] = segment_image[mask] * 0.5 + mask_3d_color[mask] * 0.5
 return segment_image
image = cv2.imread('images/dog.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
masks = mask_generator.generate(image)
segment_image = show_anns(masks,image)
fig = plt.figure(figsize=(25, 10))
ax1 = fig.add_subplot(1, 2, 1)
plt.title('Original image', fontsize=16)
ax1.axis('off')
ax1.imshow(image)
ax2 = fig.add_subplot(1, 2, 2)
plt.title('Segment image', fontsize=16)
ax2.axis('off')
ax2.imshow(segment_image)
plt.show()

4.保存所有分割的圖片

將所有識別出來的分割位置進行分割,并保存成圖片,

def apply_mask(image, mask, alpha_channel=True):#應用并且回應mask
 if alpha_channel:
        alpha = np.zeros_like(image[..., 0])#制作掩體
        alpha[mask == 1] = 255#興趣地方標記為1,且為白色
        image = cv2.merge((image[..., 0], image[..., 1], image[..., 2], alpha))#融合影像
 else:
        image = np.where(mask[..., None] == 1, image, 0)
 return image
def mask_image(image, mask, crop_mode_=True):#保存掩蓋部分的影像(感興趣的影像)
 if crop_mode_:
        y, x = np.where(mask)
 y_min, y_max, x_min, x_max = y.min(), y.max(), x.min(), x.max()
 cropped_mask = mask[y_min:y_max+1, x_min:x_max+1]
 cropped_image = image[y_min:y_max+1, x_min:x_max+1]
 masked_image = apply_mask(cropped_image, cropped_mask)
 else:
 masked_image = apply_mask(image, mask)
 return masked_image
def save_masked_image(image, filepath):
 if image.shape[-1] == 4:
        cv2.imwrite(filepath, image, [cv2.IMWRITE_PNG_COMPRESSION, 9])
 else:
        cv2.imwrite(filepath, image)
 print(f"Saved as {filepath}")
def save_anns(anns,image,path):
 if len(anns) == 0:
 return
 sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
    index = 1
 for ann in sorted_anns:
        mask_2d = ann['segmentation']
 segment_image = copy.copy(image)
 masked_image = mask_image(segment_image, mask_2d)
        filename = str(index) + '.png'
 filepath = os.path.join(path, filename)
 save_masked_image(masked_image, filepath)
        index = index + 1
save_path = 'result/'
if not os.path.exists(save_path):
 os.mkdir(save_path)
image = cv2.imread('images/dog.jpg')
masks = mask_generator.generate(image)
save_anns(masks,image,save_path)

5. Gradio可視化部署

為了方便大家使用一鍵分割案例,當前增加了Gradio可視化部署案例演示,

運行如下代碼,Gradio應用啟動后可在下方頁面進行一鍵分割影像,您也可以分享public url在手機端,PC端進行訪問生成影像,

示例效果如下:

!pip install gradio==3.24.1
def segment_image(image):
    masks = mask_generator.generate(image)
 return show_anns(masks,image)
def show_image(image):
    masks = mask_generator.generate(image)
 if len(masks) == 0:
 return
 sorted_anns = sorted(masks, key=(lambda x: x['area']), reverse=True)
    index = 1
 image_list = []
 for ann in sorted_anns:
        mask_2d = ann['segmentation']
 segment_image = copy.copy(image)
 masked_image = mask_image(segment_image, mask_2d)
 image_list.append(masked_image)
 return image_list
import gradio as gr
with gr.Blocks() as demo:
 with gr.Row():
 with gr.Column():
 img_in = gr.Image(source='upload')
 with gr.Row():
 segment_button = gr.Button("segment",variant="primary")
 save_button = gr.Button("segment_images",variant="primary")
 with gr.Row():
 with gr.Column():
 img_out = gr.Image()
 with gr.Row():
 result_gallery = gr.Gallery(label='Output', show_label=False, elem_id="gallery").style(grid=6, height='auto')
 segment_button.click(segment_image,
                 inputs= [img_in], 
                 outputs=[img_out])
 save_button.click(show_image,
                 inputs= [img_in], 
                 outputs=[result_gallery])
demo.launch(share=True)

相關鏈接:

Notebook案例地址:一鍵分割影像

AI Gallery:https://developer.huaweicloud.com/develop/aigallery/home.html

速來體驗!

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553092.html

標籤:其他

上一篇:[paper reading]|LinK: Linear Kernel for LiDAR-based 3D Perception

下一篇:返回列表

標籤雲
其他(159478) Python(38162) JavaScript(25441) Java(18096) C(15230) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7204) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4574) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1940) C++(1919) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 摳圖黨福音:教你一鍵分割影像

    摘要:輸入一個影像,通過Segment Anything模型即可獲得影像所有目標的分割點位置,再通過位置將影像進行分割保存。 本文分享自華為云社區《一鍵分割影像》,作者:雨落無痕 。 Segment Anything Segment Anything Model(SAM)通過點或框等輸入提示生成高質 ......

    uj5u.com 2023-05-23 09:00:49 more
  • [paper reading]|LinK: Linear Kernel for LiDAR-based 3D Perce

    摘要 將2D大核的成功推廣到3D感知具有挑戰性,因為: 1.處理3D資料的三次增加的開銷; 2. 資料的稀缺性和稀缺性給優化帶來了困難。 以前的作業通過引入塊共享權重,已經邁出了將內核大小從3 × 3 × 3尺度到7×7×7的第一步。但是,為了減少塊內的特征變化,它只使用了適度的塊大小,并沒有獲得像 ......

    uj5u.com 2023-05-23 08:55:20 more
  • 云原生周刊:2023 年可觀測性狀態報告發布 | 2023.5.22

    Splunk 與 Enterprise Strategy Group 合作發布了 State of Observability 2023,這是一份年度全球研究報告,探討了可觀測性在管理當今日益復雜的技識訓境中的作用。該報告將可觀測性領導者定義為具有至少 24 個月的可觀察性經驗的組織。 此外,領導者 ......

    uj5u.com 2023-05-23 08:48:44 more
  • 理論+實操,帶你了解多沙箱容器運行時Kuasar

    摘要:華為云DTSE技術布道師張天陽結合沙箱容器發展歷程,介紹華為云多沙箱容器運行時 Kuasar 專案優勢,開啟多沙箱容器運行時上手實踐體驗。 本文分享自華為云社區《理論+實操,帶你了解多沙箱容器運行時Kuasar》,作者:華為云社區精選。 本期《多沙箱容器運行時Kuasar開發上手實踐》主題直播 ......

    uj5u.com 2023-05-23 08:48:34 more
  • GPS北斗校時服務器(時間同步裝置)助力橋梁檢測系統建設

    GPS北斗校時服務器(時間同步裝置)助力橋梁檢測系統建設 GPS北斗校時服務器(時間同步裝置)助力橋梁檢測系統建設 京準電子科技官微——ahjzsz 一、系統概述 整個采集系統分散在橋梁的各個部位。橋梁按照區域劃分為若干區段,在主要幾個區段中安置著信號采集機站,每組采集機站均和GPS校時器相連,GP ......

    uj5u.com 2023-05-23 08:48:17 more
  • unity學習日志3(麥扣老師3DRPG專案學習)

    ##1.Shader Graphy基本使用 ![](https://img2023.cnblogs.com/blog/3163322/202305/3163322-20230522202712286-142074988.png) 1. 利用unity自帶的菲利涅效果通過Multiply用Color使 ......

    uj5u.com 2023-05-23 08:47:55 more
  • 2023 Xian Jiaotong University Programming Contest

    A.大水題 #include <bits/stdc++.h> #include <ext/rope> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_cxx; using name ......

    uj5u.com 2023-05-23 08:47:36 more
  • 紅黑樹是怎么來的

    本文從二叉搜索樹傾斜的原因(自上而下生長)出發,推出維持樹形資料結構平衡性的關鍵:自下而上裂變式生長,進而引出裂變式生長的理論模型:2-3 樹。由于 2-3 樹實作上的復雜性,引出其實作上的替代品:紅黑樹。最后,我們討論如何通過左旋、右旋以及顏色翻轉這“三板斧”來維護紅黑樹插入和洗掉元素后的動態平衡... ......

    uj5u.com 2023-05-23 08:41:40 more
  • ER圖和資料庫模型圖有啥區別呢?

    **1. 簡介** 對于從事資料庫結構設計相關人員而言,我們通常會在設計的不同階段用到ER圖和資料庫模型圖,用來描述資料之間的組成結構和資料間的關系,但是很多畫圖人員會把它們兩者給搞混了,下面就來聊聊它們之間的區別。 1、**ER圖**全稱為**物體聯系模型**、**物體關系模型**或**物體聯系模 ......

    uj5u.com 2023-05-23 08:35:55 more
  • 3D模型渲染引擎6大特點解讀:助力AR/VR呈現驚嘆的視覺效果!

    HOOPS Visualize不僅僅是一個圖形引擎,它還是一個以工程為中心的場景圖形技術構建工程應用程式的框架。圍繞這個圖形核心的是一個可定制和可擴展的類層,它封裝了工程應用程式中的許多高級功能,并提供與物體建模器等其他組件的集成。 ......

    uj5u.com 2023-05-23 08:35:35 more