NeRF は独自のデータセットを作成します

目次

準備

Colmap は写真のカメラポーズを取得します

 取得したポーズなどのデータをllff形式に変換します

 自分自身のナーフを訓練する


COLMAP ソフトウェアに基づいて、LLFF 形式のデータセットの作成からモデルのトレーニングの開始までの完全なプロセスをデモンストレーションします。

準備

写真のカメラポーズを取得するには、最初にcolmapをインストールします

コルマップのインストールパッケージ:

CUDAバージョンとCUDAレスバージョン

リンク: https://pan.baidu.com/s/1GUJBgmYcr7CM​​DWvJLKo3iA 
抽出コード: lxwj

ダウンロード後、colmap.bat をクリックして開きます。

NeRF は主に、合成データセット (synthetic) と、llff 形式で作成された実データセットである実データセット (実画像) の 2 種類のデータセットを使用します。

写真を準備して、連続撮影することも、ビデオを撮影してから、次のフレーム抽出スクリプトを通じて写真を生成することもできます。

import os
import cv2
def extract_images(video_path, output_folder):
    # 获取视频文件名
    video_name = os.path.splitext(os.path.basename(video_path))[0]
    # 新建文件夹
    output_path = os.path.join(output_folder, video_name)
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    # 打开视频
    cap = cv2.VideoCapture(video_path)
    # 设置帧间隔
    frame_interval = int(2)
    # 逐帧提取并保存满足间隔要求的帧
    count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            print(frame_interval)
            if count % frame_interval == 0:
                image_name = os.path.join(output_path, f"{video_name}_{count//frame_interval}.jpg")
                cv2.imwrite(image_name, frame)
            count += 1
        else:
            break
    cap.release()

if __name__ == '__main__':
    video_path = 'C:/Users/ruler9702/Desktop/test_video/test.mp4'  # 视频文件路径
    output_folder = 'C:/Users/ruler9702/Desktop/test_frame'  # 输出文件夹路径
    extract_images(video_path, output_folder)

プロジェクトの作成: [ファイル] -> [新しいプロジェクト] をクリックして新しいプロジェクトを作成します。

写真をフォルダーにまとめる 写真を plant フォルダーに入れ、プロジェクト フォルダーの下に新しい sparse フォルダーを作成し、sparse の下に 0 フォルダーを作成します。

Colmap は写真のカメラポーズを取得します

コルマップを開く

「ファイル」をクリックし、「新規プロジェクト」を選択し、「新規」をクリックし続け、以前に作成したフォルダーにファイル名「plant2」を手動で入力し、「保存」をクリックします。

 次に、「選択」をクリックして独自の画像フォルダーを選択します

「保存」をクリックします 

次に、[ファイル] の右側にある [処理] をクリックし、[特徴抽出] を選択すると、次のインターフェイスが表示されます。最初のオプションのみを設定し、[下の抽出] をクリックするだけです。

特徴抽出が完了したらウィンドウを閉じます。

画像の特徴を照合するには、[処理] -> [特徴の照合] をクリックし、デフォルト設定を使用し、[直接実行] をクリックして特徴の照合を実行します。

特徴マッチングが完了したらウィンドウを閉じます

[再構築] -> [再構築の開始] をクリックして再構築します。ウィンドウに再構築プロセスが表示されます。このプロセスはしばらく続く場合があります。

再構成が完了すると、以下のような画面が表示されますので、右下の画像とポイントで再構成が成功したかどうかを大まかに判断できます。

 

 ポーズとスパースポイントを保存する

[ファイル] -> [モデルのエクスポート] をクリックしてモデルをエクスポートし、画像が保存されているフォルダーが存在するディレクトリに新しい /sparse/0/ フォルダーを作成し、フォルダーを選択してモデルをそのディレクトリにインポートし、4 つのファイルを取得します。 。

 取得したポーズなどのデータをllff形式に変換します

 次に、取得したポーズとその他のデータを llff 形式に変換します。llff スクリプトをダウンロードする必要があります (アドレス: GitHub - Fyusion/LLFF: Code release for Local Light Field) SIGGRAPH 2019 でのフュージョン)

 スクリプトのterminaに「python imgs2poses」と入力し、プロジェクトのアドレスを追加します。

例えば:

次に、posses_bounds.npy ファイルを取得します。

 自分自身のナーフを訓練する

以前のフォルダーを nerf コードの /nerf-pytorch/data/nerf_llff_data/ ディレクトリに完全に移行します。また、以前の画像フォルダーを画像に変更します

 

/nerf-pytorch/configs ディレクトリにある fern.txt ファイルをコピーし (fern も LLFF 形式のデータ セットであるため)、その名前を独自のテスト データの名前に変更し、次の内容を変更します。

 すべての準備が完了し、トレーニングの準備が整いました

トレーニング中に遭遇したら

画像 0 とポーズ 55 が一致しません!!!!
トレースバック (最新の呼び出しは最後):
ファイル「run_nerf.py」、 878 行目、<module>
train()
ファイル「run_nerf.py」内、544 行目、train
spherify=args.spherify)
ファイル「C:\Users\HP\Desktop\nerf-pytorch-master\load_llff.py」、load_llff_data の 246 行目
posses,bds,imgs = _load_data(basedir,factor=factor) #factor=8 は元の画像を 8 倍ダウンサンプリングします
TypeError: 非反復可能な NoneType オブジェクトを解凍できません

関数に互換性がない可能性がありますので、その下にimages_8という新しいフォルダを作成し、そこに8倍ダウンサンプリングした画像を置くことで解決します。
 

import os
from PIL import Image

# 输入文件夹路径和输出文件夹路径
input_folder = "C:\\Users\\86130\\Desktop\\COLMAP-3.8-windows-cuda\\COLMAP-3.8-windows-cuda\\project1\\rice"
output_folder = "C:\\Users\\86130\\Desktop\\COLMAP-3.8-windows-cuda\\COLMAP-3.8-windows-cuda\\project1\\images_8"

# 创建输出文件夹
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 获取输入文件夹中所有图片文件的列表
image_files = [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f))]

# 循环处理每个图片文件
for image_file in image_files:
    # 打开图像文件
    image_path = os.path.join(input_folder, image_file)
    image = Image.open(image_path)

    # 获取原始图像的宽度和高度
    width, height = image.size

    # 计算新图像的宽度和高度(原始图像的1/8)
    new_width = width // 8
    new_height = height // 8

    # 使用resize()函数对图像进行下采样
    downscaled_image = image.resize((new_width, new_height), Image.ANTIALIAS)

    # 构造输出文件路径
    output_path = os.path.join(output_folder, image_file)

    # 保存下采样后的图像
    downscaled_image.save(output_path)

    print(f"Downsampling complete: {image_file}")

print("All images downscaled successfully.")

おすすめ

転載: blog.csdn.net/qq_46684028/article/details/131973656