首页 文章 精选 留言 我的

精选列表

搜索[图数据库],共10000篇文章
优秀的个人博客,低调大师

抠图党福音:教你一键分割图像

摘要:输入一个图像,通过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 速来体验! 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

ThingsPanel 发布物联网手机客户端(多图)

ThingsPanel 是一款物联网底层开源软件,主要功能是采集设备数据、可视化、自动化控制,为众多集成商、设备商、方案商提供快速的产品和交付方案。 ThingsPanel的手机端 APP 用于对ThingsPanel提供移动管理和控制支持。主要实现的功能包括监测、控制、策略、以及设备添加管理等功能。是ThingsPanel的轻型使用客户端,支持SAAS场景。 手机端的功能特点包括: 使用Uniapp开发,可以方便的编译成iOS,安卓,微信小程序以及其他小程序,H5。 可以扫码添加设备(设备需要在后台先导入)。 查看监测值。 切换智能化业务和设备分组。 手动控制。 设置控制策略,分为设备触发和时间条件触发两种。 查看操作日志。 个人账号管理功能。 手机验证码登录。 小程序截图 代码库位置 https://gitee.com/ThingsPanel/app

优秀的个人博客,低调大师

为什么很多APP总要升级,他们在图什么?

我们大家在使用手机的过程中,难免会碰到这种情况,一些APP时不时地就提醒你有新版本,需要更新。像淘宝、微信这些应用更新的时间间隔还长一些,而很多应用,隔三五天就要更新一次,搞得人不胜其烦。那么,为什么这些APP时不时地就要更新一次呢? 其实应用软件不断更新是有一定原因的,其中最主要的原因就是修复Bug。任何程序都是有Bug的,手机APP也不例外,这些Bug包括了上线前测试到的问题以及用户反馈过来的问题。还有很多企业领导人技术概念比较弱,所以只想到了APP的功能没有想到可能带来的问题,程序员想好好设计一下但时间不允许,于是只能匆匆采取一个折中的方式,这就很容易造成内部隐含的问题,而修改这个问题可能还会引发更多的问题,所以APP会不断地修复Bug,,持续升级。 第二,增加新功能也是APP不断更新的原因之一。一个APP,要想不断维持自己的受众群体,扩大市场占有率,就必需不断更新改进自身。一款APP的背后,除了有一只强大的开发团队,还有一只不怎么招程序员喜欢的队伍——APP经理。APP经理会根据用户体验和市场调查,针对经常产品的功能以及客户的需求将需要增加的功能提交给程序员,让程序员进行改进,在测试完成之后,实行线上更新。微信的公众号、小程序这些功能就是这么一步步实现的。一般来说,这种模仿功能要求的时间是按周计算的,一周是一个迭代周期,所以有的APP升级频率会很快。 第三,刷存在感。一些不常用的APP,手机用户下载之后就很少再看了。而APP的成功与否不仅要看装机量的多少,更要看用户的活跃度。所以APP的每次升级就相当于APP的开发商提醒用户,你的手机上还有这么一款APP,要记得使用。有了升级提醒,用户就会注意到这个APP,或许升级过后更新的功能正好符合这个用户的需求,之后用户就有了使用这款APP的兴趣。根据数据显示,每次APP的升级都会造成一个用户活跃的小高潮。同时,不断升级APP也说明企业一直在进步,不断完善服务体系,这也就提高了企业的形象,更能吸引资本的目光。这对企业来说也是非常有利的。 综上所述,之所以很多APP每隔一段时间就升级,一是为了修复bug;二是为了增加新功能,占领更大的市场;三是为了提醒用户,刷一波存在感,提升用户活跃度。对于必须的应用来说,用户只能继续忍受不断的更新提醒了。对于不常用但有时候需要的应用产品,用户可以短暂卸载,等使用的时候再去安装或者干脆就直接无视也可以,因为很多升级都是无关痛痒的,升不升级没有太大的改变。 【责任编辑: 未丽燕 TEL:(010)68476606】

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册