【图像抠图】【深度学习】Ubuntu18.04下GFM官方代码Pytorch实现

news2024/11/15 13:46:27

【图像抠图】【深度学习】Ubuntu18.04下GFM官方代码Pytorch实现

提示:最近开始在【图像抠图】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。


文章目录

  • 【图像抠图】【深度学习】Ubuntu18.04下GFM官方代码Pytorch实现
  • 前言
  • 数据集说明
    • 1.AM-2k【自然动物】
    • 2.BG-20k【背景】
  • GFM模型运行
    • 下载源码并安装环境
    • 下载数据集
    • 训练AM-2k
    • 测试AM-2k
    • 测试个人数据集
  • 总结


前言

GFM是由悉尼大学的Li J, Zhang J等人在《Bridging Composite and Real: Towards End-to-end Deep Image Matting [IJCV-2022]》【论文地址】一文中提出的模型,研究了语义和细节对图像抠图的不同作用,并将任务分解为两个并行的子任务:高级语义分割和低级细节抠图。
在详细解析GFM网络之前,首要任务是搭建GFM【Pytorch-demo地址】所需的运行环境,并模型完成训练和测试工作,展开后续工作才有意义。


数据集说明

1.AM-2k【自然动物】

AM-2k包含来自 20 个类别的 2,000 张高分辨率自然动物图像以及手动标记的 alpha 遮罩。
百度云链接【提取码:29r1】:

2.BG-20k【背景】

BG-20k包含 20,000 张排除显着物体的高分辨率背景图像,可用于帮助生成高质量的合成数据。
百度云链接【提取码:dffp】:


GFM模型运行

用docker搭建Ubuntu18.04的朋友查看这里

下载源码并安装环境

在Ubuntu18.04环境下装anaconda环境,方便搭建专用于PointNet模型的虚拟环境。
【Pytorch-教程】

# 创建虚拟环境
conda create -n gfm python=3.7.7
# 查看新环境是否安装成功
conda env list
# 激活环境
conda activate gfm
# 下载githup源代码到合适文件夹,并cd到代码文件夹内
git clone https://github.com/JizhiziLi/GFM.git
cd GFM
# 通过清华源,下载所需的第三方包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 分别安装pytorch和torchvision
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
# 查看所有安装的包
pip list
conda list

最终的安装的所有包。

检查torch版,已经安装torch-gpu版本

# 查看pytorch版本
import torch
print(torch.__version__)
# 查看cuda版本
print(torch.version.cuda)
# 查看cuda是否可用
print(torch.cuda.is_available())
# 查看可用cuda数量
print(torch.cuda.device_count())

下载数据集

下载以下五个数据集(本人放置在Documents/目录下,方便学习其他模型共用数据集)
【AM-2k,提取码:29r1】
【BG-20k,提取码:dffp】
【MS COCO/train ,提取码:gi5l 】
【am2k_fg_denoise】
【bg20k_train_denoise】

# 看情况挨个或者全部一起移动到Documents/目录下
sudo mv am2k_fg_denoise.zip /root/Documents/
sudo mv *.zip /root/Documents/
cd /root/Documents/


解压五个数据集

# 看情况挨个或者全部一起解压文件
sudo unzip am2k_fg_denoise.zip
ls *.zip | xargs -n1 unzip

AM-2k数据集结构

BG-20k数据集结构

MS COCO/train数据集结构


这和分别是AM-2k和BG-20k的噪声训练图片,根据上图,是要对应加入到和train目录下的。
am2k_fg_denoise移动到AM-2k/train目录下并重命名为fg_denoise:


bg20k_train_denoise移动到BG-20k/目录下并重命名为train_denoise:
在这里插入图片描述
设置"GFM/core/config.py"

训练AM-2k

# 在GFM目录下执行命令,设置sh文件执行权限
chmod +x scripts/train/*
# 源码提供了五种不同训练
# Train on the ORI-Track
./scripts/train/train_ori.sh			# 1
./scripts/train/train_ori_easier.sh		# 2
# Train on the COMP-Track
./scripts/train/train_hd_rssn.sh		# 3
./scripts/train/train_hd_rssn_easier.sh	# 4
./scripts/train/train_coco.sh			# 5

关于几种训练方式区别和用途,博主会在学习研究了论文和代码之后再作出自己的讲解。
这里以train_ori.sh为例,train_ori.sh文件内容

batchsizePerGPU=32
GPUNum=1
batchsize=`expr $batchsizePerGPU \* $GPUNum`
backbone='r34'
rosta='TT'
bg_choice='original'
fg_generate='closed_form'
nEpochs=5
lr=0.00001
threads=8
nickname=gfm_ori_track
python core/train.py \
    --logname=$nickname \
    --backbone=$backbone \
    --rosta=$rosta \
    --batchSize=$batchsize \
    --nEpochs=$nEpochs \
    --lr=$lr \
    --threads=$threads \
    --bg_choice=$bg_choice \
    --fg_generate=$fg_generate \
    --model_save_dir=models/trained/$nickname/ \


使用docker可能出现的错误"ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm)"表示共享内存不够了。

# 查看磁盘
df -h


博主容器的shared memory默认只有64MB。但训练程序中,DataLoader设置的threads(线程,也经常写作workers)数目比较多,该程序中为8,这些workers通过共享内存进行协作,导致默认的共享内存不够用。
解决方法:

  1. 将threads数量降低,例如设置threads=0;
  2. 将容器的共享内存加大,可通过–ipc=host或–shm-size进行设置。【推荐

注:windows系统下的docker操作比较操蛋,不能更改容器的设置(有知道的朋友欢迎在评论区指导),只有创建容器时才能设置,为了保存容器的内容,因此建议曲线救国,先将容器制作成镜像,再用镜像重新新建容器。
【docker常用指令】

# 制作镜像
docker commit container_id image_name:tag
# eg: docker commit 2c60bf255adb deeplearn:1.0
# 创建容器(gpu版本)
docker run -it --shm-size 8g --gpus all --name container_name -p 5900:5900 -p 22:22 -d image_name:tag
# eg: docker run -it --shm-size 8g --gpus all --name Pytorch_for_ImageMatting_ubu18 -p 5900:5900 -p 22:22 -d deeplearn:1.0

重新新建容器后查看磁盘可以看到shared memory已经修改成了8g:

开始训练:

训练的详细数据保存在logs/train_logs/目录下的日志文件中:

源码作者只保存最后一次的模型权重(博主epoch仅设为5,方便讲解):

测试AM-2k

博主这里使用源码作者提供的预训练权重(Train on the ORI-Track )作为测试

# 在GFM目录下执行命令,设置sh文件执行权限
chmod +x scripts/test/*
# 测试
./scripts/test/test_dataset.sh

预训练模型的权重与test_dataset.sh的配置要对应
test_dataset.sh文件内容

backbone='r34'
rosta='TT'
model_path='models/pretrained/gfm_r34_tt.pth'
dataset_choice='AM_2K'
test_choice='HYBRID'
pred_choice=3
test_result_dir='results/am2k_gfm_r34_tt/'
nickname='am2k_gfm_r34_tt'
python core/test.py \
	 --cuda \
     --backbone=$backbone \
     --rosta=$rosta \
     --model_path=$model_path \
     --test_choice=$test_choice \
     --dataset_choice=$dataset_choice \
     --pred_choice=$pred_choice \
     --test_result_dir=$test_result_dir \
     --logname=$nickname \

开始测试:

测试的详细数据保存在logs/test_logs/目录下的日志文件中,这里还得自己创建test_logs目录:

测试结果:

测试个人数据集

博主这里还是使用源码作者提供的预训练权重(Train on the ORI-Track )作为测试。

# 测试
./scripts/test/test_samples.sh

预训练模型的权重与test_samples.sh的配置要对应
test_samples.sh文件内容

backbone='r34'
rosta='TT'
model_path='models/pretrained/gfm_r34_tt.pth'
dataset_choice='SAMPLES'
test_choice='HYBRID'
pred_choice=3
python core/test.py \
	 --cuda \
     --backbone=$backbone \
     --rosta=$rosta \
     --model_path=$model_path \
     --test_choice=$test_choice \
     --dataset_choice=$dataset_choice \
     --pred_choice=$pred_choice \

将自己的数据集保存在samples/original/目录下,执行命令生成目标的alpha和彩色图。


总结

尽可能简单、详细的介绍GFM的安装流程以及解决了安装过程中可能存在的问题。后续会根据自己学到的知识结合个人理解讲解GFM的原理和代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银行数字化转型导师坚鹏:学习贯彻二十大精神 解码乡村振兴之道

学习贯彻二十大精神 解码乡村振兴之道(保险客户) 课程背景: 很多保险公司从业人员存在以下问题: 不知道如何准确解读二十大精神? 不清楚乡村振兴相关政策要求? 不知道如何有效推动乡村振兴&#xf…

【JavaEE初阶】多线程(三)volatile wait notify关键字 单例模式

摄影分享~~ 文章目录 volatile关键字volatile能保证内存可见性 wait和notifywaitnotifynotifyAllwait和sleep的区别小练习 多线程案例单例模式饿汉模式懒汉模式 volatile关键字 volatile能保证内存可见性 import java.util.Scanner;class MyCounter {public int flag 0; }p…

2023新型智慧城市解决方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 智慧城市建设整体框架 智慧城市建设内容 智慧城市云基础架构的必要性 智慧城市建设效益 智慧城市建设效益17 智慧城市建设模式建议 智慧城市建设-整体解决法方案 智慧城市建设…

关于Nginx

一、常见的“服务器中间件”(即http server-web中间件)有哪些 Tomcat、Jboss、Apache、WeBlogic、Jetty、webSphere、Nginx、IIS 二、nginx的特点 1.性能高,能承受5万并发每秒; 2.内存、磁盘,读取消耗空间小。 三、…

「背包问题-步入」失衡天平

失衡天平 https://ac.nowcoder.com/acm/contest/24213/1021 题目描述 终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件&#xff…

2023-04-24 算法面试中常见的贪心算法问题

贪心算法 1 贪心选择例题 455.饼干分配 假设你想给小朋友们饼干。每个小朋友最多能够给一块儿饼干。每个小朋友都有一个“贪心指数”,称为g(i),g(i)表示的是这名小朋友需要的饼干大小的最小值。同时,每个饼干都有一个大小值s(i)。如果s(j)…

转换json格式的日期为Javascript对象的函数

项目中碰到了用jQuery从后台获取的json格式的日期的字符串,需要将此字符串转换成JavaScript的日期对象。 代码如下: //转换json格式的日期(如:{ServerDatetime:"\/Date(1278930470649)\/"})为Javascript的日期对象 fu…

【离散系统】传递函数和状态空间方程离散化

本文如有错误,恳请指正。 目录 离散系统 采样控制系统 数字控制系统 信号采样 采样定理(香农定理) 信号保持—零阶保持器 Z变换 Z 变换方法 级数求和法 部分分式法 基本定理 Z反变换 Z反变换方法 长除法 部分分式法&#xff0…

hook函数,toRef家族

自定义hook函数 什么是hook?——本质是一个函数,把setup函数中使用的组合式API 进行了封装。 类似于vue2.x中的mixin。 自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂。 定义钩子: 使用钩子 toRef,toRefs 作用:创建一个ref对象…

WinScope实现录制视频与是Timeline时间轴同步设置方法-千里马framework车载手机系统开发实战

hi,粉丝朋友们! 背景: 今天来分享一个粉丝朋友提出的问题,那就是他在学习wms课程时候有用到winscope工具,提出一个疑问,就是google官网说的有录屏可以结合起来一起看。具体如下: 其实这个以…

Vue 手搓轮播效果

tiptop: 为啥需要写这个功能,因为我遇到了每个轮播层内要放3个左右的商品块,如果使用element自带的轮播就需要将一维数组切成二维数组,导致处理一些情况下就会变得很麻烦,当然那种我也写了如果你们有需要,在下方留言我…

柳永8首绝美词句

他是白衣卿相,是才子词人。 他有傲人的才华,却仕途失意。 他眠花宿柳,写下流传千古的词章。 他是才子柳永。 今天,给大家介绍他的8首词,体会柳永的人生起伏。 1、《雨霖铃 寒蝉凄切》 寒蝉凄切,对长亭晚…

Kafka 安装部署-单节点

Kafka强依赖ZK,如果想要使用Kafka,就必须安装ZK,Kafka中的消费偏置信息、kafka集群、topic信息会被存储在ZK中。有人可能会说我在使用Kafka的时候就没有安装ZK,那是因为Kafka内置了一个ZK,一般我们不使用它。 部署说明…

Yuzuki Lizard 全志V851S开发板 –移植 QT5.12.9教程

本文转载自:https://forums.100ask.net/t/topic/3027 移植 QT5 教程 (此教程基于docker版V851S开发环境) docker pull registry.cn-hangzhou.aliyuncs.com/gloomyghost/yuzukilizard 编译依赖 apt-get install repo git gcc-arm-linux-gn…

用户订阅付费如何拆解分析?看这篇就够了

会员制的订阅付费在影音娱乐行业中已相当普及,近几年,不少游戏厂商也开始尝试订阅收费模式。在分析具体的用户订阅偏好以及订阅付费模式带来的增长效果时,我们常常会有这些疑问: 如何从用户的整体付费行为中具体拆解订阅付费事件…

Numpy从入门到精通——数组变形|合并数组

这个专栏名为《Numpy从入门到精通》,顾名思义,是记录自己学习numpy的学习过程,也方便自己之后复盘!为深度学习的进一步学习奠定基础!希望能给大家带来帮助,爱睡觉的咋祝您生活愉快! 这一篇介绍《…

SLAM论文速递:SLAM—— 流融合:基于光流的动态稠密RGB-D SLAM—4.25(2)

论文信息 题目: FlowFusion:Dynamic Dense RGB-D SLAM Based on Optical Flow 流融合:基于光流的动态稠密RGB-D SLAM论文地址: https://arxiv.org/pdf/2003.05102.pdf发表期刊: 2020 IEEE International Conference on Robotics and Automa…

【Spring Cloud】Spring Cloud 是什么?

文章目录 前言一、子项目二、常用组件三、把 Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格: 前言 Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。Spring Boot 以 Application(应用) 为中…

Python小姿势 - Python操作Excel表格数据

Python操作Excel表格数据 在日常工作中,我们经常会遇到一些需要对表格数据进行处理的情况,比如:数据清洗、数据分析、数据可视化等。对于这些任务,我们可以使用Python来进行操作。 在Python中操作Excel表格数据,我们可…

electron+vue3全家桶+vite项目搭建【13】封装加载进度显示,新建窗口 演示主进程与渲染进程通信

文章目录 引入实现效果演示:1.封装新建窗口工具2.测试新建窗口3.封装进度条加载4.测试进度条加载 引入 这里我们通过封装electron的工具类来演示electron中的主进程和渲染进程利用ipc进行通信 demo项目地址 electron官方文档ipc通信 实现效果演示: …