视频拼接得AI三维生成方案-开端(一)

    想使用二维得图像生成三维得空间图像,英伟达有完整得方案,开源,但是三维拼接不一样,只需要二维,并且要实时,如何生成是我每天都在思考得东西。

cnn 提取特征器和自编码

    在训练细胞神经网络时,问题之一是我们需要大量的标记数据。在图像分类的情况下,我们需要将图像分为不同的类别,这是一项手动工作。

    我们可能想使用原始(未标记)数据来训练CNN特征提取器,这被称为自我监督学习。我们将使用训练图像作为网络输入和输出,而不是标签。自动编码器的主要思想是,我们将有一个编码器网络,将输入图像转换到一些潜在空间(通常它只是一个较小大小的向量),然后是解码器网络,其目标是重建原始图像。

    由于我们正在训练自动编码器从原始图像中捕获尽可能多的信息以进行准确的重建,因此网络试图找到输入图像的最佳嵌入来捕获含义。
就像下面这副图像,使用encoder 和 decoder 来 从生成图像中来产生输出图像,这个应用应该是很广得,比如我们最近得视频拼接,是否可以从一个侧面或者另外一面生成正面图像?
在这里插入图片描述

部分代码得实现

只是想法,没有具体实现三维生成

import torch
import torchvision
import matplotlib.pyplot as plt
from torchvision import transforms
from torch import nn
from torch import optim
from tqdm import tqdm
import numpy as np
import torch.nn.functional as F
torch.manual_seed(42)
np.random.seed(42)
device = 'cuda:0' if torch.cuda.is_available() else 'cpu'
train_size = 0.9
lr = 1e-3
eps = 1e-8
batch_size = 256
epochs = 30

我们使用最简单得Minst数据集好了

def mnist(train_part, transform=None):dataset = torchvision.datasets.MNIST('.', download=True, transform=transform)train_part = int(train_part * len(dataset))train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_part, len(dataset) - train_part])return train_dataset, test_datasettransform = transforms.Compose([transforms.ToTensor()])train_dataset, test_dataset = mnist(train_size, transform)train_dataloader = torch.utils.data.DataLoader(train_dataset, drop_last=True, batch_size=batch_size, shuffle=True)
test_dataloader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False)
dataloaders = (train_dataloader, test_dataloader)

定义一个显示

def plotn(n, data, noisy=False, super_res=None):fig, ax = plt.subplots(1, n)for i, z in enumerate(data):if i == n:breakpreprocess = z[0].reshape(1, 28, 28) if z[0].shape[1] == 28 else z[0].reshape(1, 14, 14) if z[0].shape[1] == 14 else z[0]if super_res is not None:_transform = transforms.Resize((int(preprocess.shape[1] / super_res), int(preprocess.shape[2] / super_res)))preprocess = _transform(preprocess)if noisy:shapes = list(preprocess.shape)preprocess += noisify(shapes)ax[i].imshow(preprocess[0])plt.show()

定义一个干扰器

def noisify(shapes):return np.random.normal(loc=0.5, scale=0.3, size=shapes)

定义编码器

class Encoder(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=(3, 3), padding='same')self.maxpool1 = nn.MaxPool2d(kernel_size=(2, 2))self.conv2 = nn.Conv2d(16, 8, kernel_size=(3, 3), padding='same')self.maxpool2 = nn.MaxPool2d(kernel_size=(2, 2))self.conv3 = nn.Conv2d(8, 8, kernel_size=(3, 3), padding='same')self.maxpool3 = nn.MaxPool2d(kernel_size=(2, 2), padding=(1, 1))self.relu = nn.ReLU()def forward(self, input):hidden1 = self.maxpool1(self.relu(self.conv1(input)))hidden2 = self.maxpool2(self.relu(self.conv2(hidden1)))encoded = self.maxpool3(self.relu(self.conv3(hidden2)))return encoded   

再定义解码器

class Decoder(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(8, 8, kernel_size=(3, 3), padding='same')self.upsample1 = nn.Upsample(scale_factor=(2, 2))self.conv2 = nn.Conv2d(8, 8, kernel_size=(3, 3), padding='same')self.upsample2 = nn.Upsample(scale_factor=(2, 2))self.conv3 = nn.Conv2d(8, 16, kernel_size=(3, 3))self.upsample3 = nn.Upsample(scale_factor=(2, 2))self.conv4 = nn.Conv2d(16, 1, kernel_size=(3, 3), padding='same')self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self, input):hidden1 = self.upsample1(self.relu(self.conv1(input)))hidden2 = self.upsample2(self.relu(self.conv2(hidden1)))hidden3 = self.upsample3(self.relu(self.conv3(hidden2)))decoded = self.sigmoid(self.conv4(hidden3))return decoded       

定义自动编码

class AutoEncoder(nn.Module):def __init__(self, super_resolution=False):super().__init__()if not super_resolution:self.encoder = Encoder()else:self.encoder = SuperResolutionEncoder()self.decoder = Decoder()def forward(self, input):encoded = self.encoder(input)decoded = self.decoder(encoded)return decoded       
model = AutoEncoder().to(device)
optimizer = optim.Adam(model.parameters(), lr=lr, eps=eps)
loss_fn = nn.BCELoss()       
def train(dataloaders, model, loss_fn, optimizer, epochs, device, noisy=None, super_res=None):tqdm_iter = tqdm(range(epochs))train_dataloader, test_dataloader = dataloaders[0], dataloaders[1]for epoch in tqdm_iter:model.train()train_loss = 0.0test_loss = 0.0for batch in train_dataloader:imgs, labels = batchshapes = list(imgs.shape)if super_res is not None:shapes[2], shapes[3] = int(shapes[2] / super_res), int(shapes[3] / super_res)_transform = transforms.Resize((shapes[2], shapes[3]))imgs_transformed = _transform(imgs)imgs_transformed = imgs_transformed.to(device)imgs = imgs.to(device)labels = labels.to(device)if noisy is not None:noisy_tensor = noisy[0]else:noisy_tensor = torch.zeros(tuple(shapes)).to(device)if super_res is None:imgs_noisy = imgs + noisy_tensorelse:imgs_noisy = imgs_transformed + noisy_tensorimgs_noisy = torch.clamp(imgs_noisy, 0., 1.)preds = model(imgs_noisy)loss = loss_fn(preds, imgs)optimizer.zero_grad()loss.backward()optimizer.step()train_loss += loss.item()model.eval()with torch.no_grad():for batch in test_dataloader:imgs, labels = batchshapes = list(imgs.shape)if super_res is not None:shapes[2], shapes[3] = int(shapes[2] / super_res), int(shapes[3] / super_res)_transform = transforms.Resize((shapes[2], shapes[3]))imgs_transformed = _transform(imgs)imgs_transformed = imgs_transformed.to(device)imgs = imgs.to(device)labels = labels.to(device)if noisy is not None:test_noisy_tensor = noisy[1]else:test_noisy_tensor = torch.zeros(tuple(shapes)).to(device)if super_res is None:imgs_noisy = imgs + test_noisy_tensorelse:imgs_noisy = imgs_transformed + test_noisy_tensorimgs_noisy = torch.clamp(imgs_noisy, 0., 1.)preds = model(imgs_noisy)loss = loss_fn(preds, imgs)test_loss += loss.item()train_loss /= len(train_dataloader)test_loss /= len(test_dataloader)tqdm_dct = {'train loss:': train_loss, 'test loss:': test_loss}tqdm_iter.set_postfix(tqdm_dct, refresh=True)tqdm_iter.refresh()

调用训练函数

train(dataloaders, model, loss_fn, optimizer, epochs, device)

使用模型去进行输入输出

model.eval()
predictions = []
plots = 5
for i, data in enumerate(test_dataset):if i == plots:breakpredictions.append(model(data[0].to(device).unsqueeze(0)).detach().cpu())
plotn(plots, test_dataset)
plotn(plots, predictions)      

在这里插入图片描述
在这里插入图片描述
可以看出输入和输出是一一对应得,

联想

    在做视频拼接得过程中,是想把二维得不同得侧面生成另外一面,也就是自动推测,这和生成三维有区别,只是部分
比如如下两幅图像请添加图片描述

请添加图片描述
要拼接起来实属不易,这是海康那边让我们拼接得两幅图像,问题就是由于距离太近,桌子显然呈现得角度不同,人得眼睛没有那么宽,不可能同时看到这张桌子得左右两面,那么,如果拼接呢,最终结果就变成了下面这幅图
请添加图片描述
    当然,上面两幅图像经过了不清楚,我经过了几次滤波变换,下面得图像可能清楚了一些,但是桌子变形了,问题就是,明明两个摄像头得宽度是足够看得见桌子得全貌得,如何展现就成了问题
    因此我就想到了应该由生成式AI来解决这个问题,抛砖引玉,希望大家得出创造得方案。后面有新得结果继续给大家汇报。

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

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

相关文章

大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

jmeter软件测试实验(附源码以及配置)

jmeter介绍 JMeter是一个开源的性能测试工具,由Apache软件基金会开发和维护。它主要用于对Web应用程序、Web服务、数据库和其他类型的服务进行性能测试。JMeter最初是为测试Web应用程序而设计的,但现在已经扩展到支持更广泛的应用场景。 JMeter 可对服务…

AcWing 244. 谜一样的牛—树状数组、二分

题目链接 AcWing 244. 谜一样的牛 题目描述 分析 这道题挺巧妙的,感觉树状数组方面的题就是比较难想,先分析一下样例,样例中每头牛前面比自己低的牛的数量分别为 0 1 2 1 0牛的高度是1~n的排列,如何分析出每头牛的高度呢&…

API Testing 一个基于 YAML 文件的开源接口测试工具

目录 前言: 如何使用? 本地模式 服务端模式 文件格式 后续计划 前言: API Testing 是一个基于 YAML 文件的开源接口测试工具,它可以帮助开发者快速地进行接口测试。 在选择工具时,可以从很多方面进行考量、对比…

【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 7 月 20 日,在 2005 年的今天,时任微软全球副总裁的李开复加盟谷歌担任谷歌全球副总裁及中国区总裁。谷歌公司在发布聘请李开复消息的同…

LiveNVR监控流媒体Onvif/RTSP功能-拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明

LiveNVR拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明 1、视频页面集成1.1、关闭接口鉴权1.2、视频广场页面集成1.2.1、隐藏菜单栏1.2.2、隐藏播放页面分享连接 1.3、其它页面集成 2、播放分享页面集成2.1、获取 iframe 代码2.2、html 集成ifr…

ThreadPoolExecutor自定义线程池|拒绝策略|线程工厂|统一捕获异常

线程池的7大参数含义介绍 corePoolSize:池中一直保持的线程的数量。 maximumPoolSize:池中允许的最大的线程数。 keepAliveTime:当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终…

Python 集合 union()函数使用详解,Python合并集合

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 union函数使用详解 1、合并多个集合2、合并其他类型2.1、合并字符串2.2、合并列表…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

Hbase基本原理剖析

一、基本原理 数据存储使用HBase来承接,HBase是一个开源的、面向列(Column-Oriented)、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。更多关于HBase的信息&#…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章&#xff1a;IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

windows系统安装异构虚拟机arm版的银河麒麟服务器

下载qemu UEFI&#xff08;BIOS的替代方案&#xff09;的下载地址&#xff1a;http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd QEMU 软件的下载地址&#xff1a;https://qemu.weilnetz.de/w64/2021/qemu-w64-setup-20210505.exe …

Sentinel规则持久化到nacos的实现(源码修改)

文章目录 1、Sentinel源码修改2、持久化效果测试 Sentinel规则管理有三种模式&#xff1a; 原始模式pull模式push模式 这是实现push方式&#xff1a; push模式即控制台将配置规则推送到远程配置中心&#xff0c;例如Nacos。Sentinel客户端去监听Nacos&#xff0c;获取配置变更…

低代码如何帮助企业数字化转型?

在数字化时代背景下&#xff0c;企业都面临着巨大的数字化转型挑战。为了迎接这一挑战&#xff0c;企业软件开发工具和平台都在不断地创新和进化。其中&#xff0c;低代码开发平台应运而生&#xff0c;并成为了众多企业转型的首选方案。企业为什么都选择低代码开发平台&#xf…

一键批量JSON标注转PNG图片工具V1.1,支持labelme快捷矩形、圆以及轮廓标注

上次发布了一个批量将labelme标注的json文件转换为png文件工具&#xff0c;但是当时只是想着自己用的&#xff0c;功能相当简单&#xff0c;一些网友使用之后跟我反馈这玩意真”垃圾“&#xff0c;很多情况都没有进行设想&#xff0c;所以在功能上很欠缺。由于小陶这几天在外地…

pytorch工具——使用pytorch构建一个神经网络

目录 构建模型模型中的可训练参数假设输入尺寸为32*32损失函数反向传播更新网络参数 构建模型 import torch import torch.nn as nn import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net,self).__init__()#定义第一层卷积层&#xff0c;输入维…

【C++杂货铺】运算符重载

目录 前言一、运算符重载二、赋值运算符重载三、完善日期类3.1 重载关系运算符3.2 重载、3.3 重载-、-3.4 重载、--3.5 重载<<、>> 四、const成员五、取地址及const取地址操作符重载 前言 本文将以日期类为基础&#xff0c;去探寻运算符重载的特性与使用方法&…

Burp Suite---渗透测试工具

文章目录 Burp SuiteBurp Suite入门设置代理HTTP的代理 Proxy&#xff08;代理&#xff09; Burp Suite 是一款集成化的渗透测试工具&#xff0c;包含了很多功能&#xff0c;可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。 Burp Suite由Java语言编写&#xff0c;基于…

【Docker】Docker的数据管理

目录 一、Docker 的数据管理1.1数据卷1.2 数据卷容器1.3端口映射1.4容器互联&#xff08;使用centos镜像&#xff09; 二、Docker镜像的创建2.1基于现有镜像创建2.2&#xff0e;基于本地模板创建2.3 基于Dockerfile 创建联合文件系统&#xff08;UnionFS&#xff09;镜像加载原…