《Keras 3 单眼深度估计》:此文为AI自动翻译

news/2025/2/26 21:51:36

《Keras 3 单眼深度估计》

作者:Victor Basu
创建日期:2021/08/30
最后修改时间:2024/08/13
描述:使用卷积网络实现深度估计模型。

(i) 此示例使用 Keras 3

 在 Colab 中查看 

 GitHub 源


介绍

深度估计是从 2D 图像推断场景几何结构的关键步骤。 单眼深度估计的目标是预测每个像素的深度值或 推断深度信息,仅给出一个 RGB 图像作为输入。 此示例将展示一种使用 convnet 构建深度估计模型的方法 和简单的损失函数。


设置

import os

os.environ["KERAS_BACKEND"] = "tensorflow"

import sys

import tensorflow as tf
import keras
from keras import layers
from keras import ops
import pandas as pd
import numpy as np
import cv2
import matplotlib.pyplot as plt

keras.utils.set_random_seed(123)

下载数据集

为此,我们将使用数据集 DIODE:密集的室内和室外深度数据集 教程。但是,我们使用验证集生成训练和评估子集 对于我们的模型。我们使用原始数据集的验证集而不是训练集的原因是 训练集包含 81GB 的数据,相比之下,下载起来很有挑战性 到只有 2.6GB 的验证集。 您可以使用的其他数据集包括 NYU-v2 和 KITTI。

annotation_folder = "/dataset/"
if not os.path.exists(os.path.abspath(".") + annotation_folder):
    annotation_zip = keras.utils.get_file(
        "val.tar.gz",
        cache_subdir=os.path.abspath("."),
        origin="http://diode-dataset.s3.amazonaws.com/val.tar.gz",
        extract=True,
    )
Downloading data from http://diode-dataset.s3.amazonaws.com/val.tar.gz 

2774625282/2774625282 ━━━━━━━━━━━━━━━━━━━━ 205s 0us/步


准备数据集

我们只使用室内图像来训练我们的深度估计模型。

path = "val/indoors"

filelist = []

for root, dirs, files in os.walk(path):
    for file in files:
        filelist.append(os.path.join(root, file))

filelist.sort()
data = {
       
    "image": [x for x in filelist if x.endswith(".png")],
    "depth": [x for x in filelist if x.endswith("_depth.npy")],
    "mask": [x for x in filelist if x.endswith("_depth_mask.npy")],
}
df = pd.DataFrame(data)

df = df.sample(frac=1, random_state=42)

准备超参数

HEIGHT = 256
WIDTH = 256
LR = 0.00001
EPOCHS = 30
BATCH_SIZE = 32

构建数据管道

  1. 管道采用包含 RGB 图像路径的 DataFrame, 以及深度和深度蒙版文件。
  2. 它读取 RGB 图像并调整其大小。
  3. 它读取深度和深度蒙版文件,对其进行处理以生成深度图图像,然后 调整其大小。
  4. 它返回批处理的 RGB 图像和深度图图像。
class DataGenerator(keras.utils.PyDataset):
    def __init__(self, data, batch_size=6, dim=(768, 1024), n_channels=3, shuffle=True):
        super().__init__()
        """
        Initialization
        """
        self.data = data
        self.indices = self.data.index.tolist()
        self.dim = dim
        self.n_channels = n_channels
        self.batch_size = batch_size
        self.shuffle = shuffle
        self.min_depth = 0.1
        self.on_epoch_end()

    def __len__(self):
        return int(np.ceil(len(self.data) / self.batch_size))

    def __getitem__(self, index):
        if (index + 1) * self.batch_size > len(self.indices):
            self.batch_size = len(self.indices) - index * self.batch_size
        # Generate one batch of data
        # Generate indices of the batch
        index = self.indices[index * self.batch_size : (index + 1) * self.batch_size]
        # Find list of IDs
        batch = [self.indices[k] for k in index]
        x, y = self.data_generation(batch)

        return x, y

    def on_epoch_end(self):
        """
        Updates indexes after each epoch
        """
        self.index = np.arange(len(self.indices))
        if self.shuffle == True:
            np.random.shuffle(

http://www.niftyadmin.cn/n/5869199.html

相关文章

【cuda学习日记】4.2 内存访问模式

4.2.1 缓存加载 如图,全局内存通过缓存来实现加载/存储。所有对全局内存的访问都会通过二级缓存,也有许多访问会通过一级缓存。如果这两级缓存都被用到,那么内存访问是由一个128字节的内存事务实现的。如果只使用了二级缓存,那么这…

九九乘法表 matlab

J的第一行的1分别乘以I的九列数,就是1的乘法表 1*11 1*22 。。。

滑动验证组件-微信小程序

微信小程序-滑动验证组件&#xff0c;直接引用就可以了&#xff0c;效果如下&#xff1a; 组件参数&#xff1a; 1.enable-close&#xff1a;是否允许关闭&#xff0c;默认true 2.bind:onsuccess&#xff1a;验证后回调方法 引用方式&#xff1a; <verification wx:if&qu…

Mybatis的一级、二级缓存

如图所示&#xff1a; Mybatis的缓存如图所示&#xff1a; 当数据没有改变&#xff0c;开启SQLsession使用SQL语句对数据进行一次查询时&#xff0c;会将数据进行缓存&#xff0c;当第二次查询同样的数据时&#xff0c;则命中缓存&#xff0c;不去查询数据库&#xff0c;加快…

【C++】面试常问八股

5、内存管理 野指针 野指针指的是未进行初始化或未清零的指针&#xff0c;不是NULL指针野指针产生原因及解决方案&#xff1a; 指针变量未初始化&#xff1a;指针变量定义时若未初始化&#xff0c;则其指向的地址是随机的&#xff0c;不为NULL&#xff1b;定义时初始化为NULL…

Nmap网络安全审计

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Nmap网络安全审计 什么是Nmap Nmap是由Gordon Lyon设计并实现的&#xff0c;于1997开始发布。最初设计Nmap的目的只是希望打造一款强大的端口扫描工具。但是随着…

go基础语法

go基础语法 先下载安装go&#xff0c;然后到vscode下载go插件 1. 基础 输入输出 package main import "fmt" func main(){a:1var b2 var c int //不给初始值得标出变量类型 c3var d stringfmt.Scanf("%s",&d) //接收用户输入fmt.Printf("Hell…

vLLM专题(十三)-结构化输出(Structured Outputs)

vLLM 支持使用 outlines、lm-format-enforcer 或 xgrammar 作为引导解码的后端来生成结构化输出。本文档展示了一些可用于生成结构化输出的不同选项示例。 一、在线服务(OpenAI API) 你可以使用 OpenAI 的 Completions 和 Chat API 生成结构化输出。 支持以下参数,这些参…