视频拼接得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,一经查实,立即删除!

相关文章

linux shell比较命令

1 比较运算 num1-eq num2 等于 [ 3 -eq $mynum ] num1-ne num2 不等于 [ 3 -ne $mynum ] num1-lt num2 小于 [ 3 -lt $mynum ] num1-le num2 小于或等于 [ 3 -le $mynum ] num1-gt num2 大于 [ 3 -gt $mynum ] num1-ge num2 大于或等于 [ 3 -ge $mynum ]。 filename1-nt filen…

linux上面修改u盘的名称

首先df-h显示文件系统磁盘空间使用情况 df -hFilesystem Size Used Avail Use% Mounted on /dev/sda1 39G 24G 13G 66% / tmpfs 990M 4.5M 986M 1% /dev/shm /dev/sda2 77G 62G 12G 85% /broncho /dev/s…

C++ PCL点云圆柱结构提取/立杆结构提取

目录 一、算法实现二、结果展示适用于圆柱体提取、立杆提取。 一、算法实现 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #in

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

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

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

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

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

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

MySQL-多表查询-小结1

目录 内连接 外连接 子查询&#xff08;嵌套查询&#xff09; 内连接 内连接查询的是表之间交集的部分隐式内连接 select 字段列表 from 表1&#xff0c;表2 where 条件....&#xff1b;显示内连接 select 字段列表 from 表1 [inner] join 表2 on 条件....&#xff1b; 外连…

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

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

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

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

Debezium系列之:Debezium实现对中文版SQLServer数据库数据采集的支持

Debezium系列之:Debezium实现对中文版SQLServer数据库数据采集的支持 一、背景二、Debezium实现采集SQLSever数据库数据三、验证SQL Server Agent的状态四、中文版SQLServer数据库的支持五、完整配置一、背景 Debezium2.X版本对中文版SQLServer数据库数据库的支持存在一定问题…

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…

Hive 中 sort by 和 order by 的区别

order by会对输入做全局排序&#xff0c;因此只有1个reducer&#xff08;多个reducer无法保证全局有序&#xff09;&#xff0c;会导致当输入规模较大时&#xff0c;需要较长的计算时间。 sort by不是全局排序&#xff0c;其在数据进入 reducer 前完成排序。 因此&#xff0c;…

Java反射的使用

反射是Java框架的核心&#xff0c;无论是Tomcat&#xff0c;SpringMVC&#xff0c;SpringIOC&#xff0c;SpringAOP&#xff0c;动态代理&#xff0c;都使用了反射 那么什么是反射&#xff1f;-------------反射就是获取类信息的能力 Java有两种创建对象的方式&#xff1a;①…

Linux内核的块设备抽象层

Linux内核的块设备抽象层是指块设备框架的核心组件&#xff0c;它负责处理块设备I/O请求&#xff0c;向上层提交完成请求的通知&#xff0c;并提供一些与块设备相关的函数&#xff0c;包括对块设备进行初始化、打开、关闭等操作。 在块设备抽象层中&#xff0c;最基本的结构体…

ffmpeg剪切视频的一些优化(或者说是一些坑)

问题描述 最近我们在做一个项目&#xff0c;这个项目需要使用到ffmpeg这个工具来对视频进行剪切&#xff0c;也就是剪出一个视频中的某一段&#xff0c;在实际测试中&#xff0c;我们发现&#xff0c;ffmpeg剪切速度很慢&#xff0c;而且这个速度还与剪切点开始时间&#xff0…

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

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

数据结构--栈和队列

part 1. 栈 栈是一种后进先出的结构。 常用操作&#xff1a; &#xff08;1&#xff09;清空&#xff08;clear&#xff09; &#xff08;2&#xff09;获取栈内元素个数&#xff08;size&#xff09; &#xff08;3&#xff09;判空&#xff08;empty&#xff09; &…

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

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《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来承接&#xff0c;HBase是一个开源的、面向列&#xff08;Column-Oriented&#xff09;、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。更多关于HBase的信息&#…