Samar-blog

导航

使用labelme给矿物岩石数据集贴标签

【此文中后段有尝试利用“岩石矿物VS背景” 的手动标注的数据集标签作为训练数据去跑模型,来预测其他未进行手动标注的数据集,但是效果特别特别差,所以只需要参考此文的labelme手动标注岩石矿物数据集的过程,后面如果有训练成功的模型且预测效果还不错会发表出来】

1.1整理原始矿物岩石数据集

1.打开各文件夹内的岩石矿物数据集
在pycharm:检查所有Images是不是RGB三通道(不能是RGBA通道)
(1)先处理为RGB三通道,不然后续labelme标注时会报错

D1203_标注001078时有error产生

D1203_标注001078时有error产生1

(2)处理为RGB三通道的代码如下
点击查看代码
from PIL import Image
import os

# **************** 您的文件夹路径 ****************
# 注意:在Python字符串中,反斜杠 \ 是转义字符。
# 最好使用原始字符串 r"..." 或将 \ 替换为 / 或 \\
input_folder = r"F:\Dataset\Labelme_images"
# **********************************************

# 确保文件夹存在
if not os.path.isdir(input_folder):
    print(f"错误:文件夹路径不存在或不是目录:{input_folder}")
else:
    print(f"开始处理文件夹:{input_folder}")

    for filename in os.listdir(input_folder):
        # 仅处理常见图像文件类型
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff')):
            input_path = os.path.join(input_folder, filename)

            # 跳过目录
            if os.path.isdir(input_path):
                continue

            try:
                img = Image.open(input_path)

                # 检查图像是否为 RGBA 模式
                if img.mode == 'RGBA':
                    print(f"正在转换 {filename}...")

                    # 1. 创建一个白色背景 (R:255, G:255, B:255) 的 RGB 图像
                    rgb_img = Image.new("RGB", img.size, (255, 255, 255))

                    # 2. 将原图粘贴到新的 RGB 图像上,使用 Alpha 通道作为蒙版
                    #    透明部分会与白色背景混合
                    #    img.split()[3] 获取 Alpha (A) 通道
                    rgb_img.paste(img, mask=img.split()[3])

                    # 3. 覆盖原始文件
                    rgb_img.save(input_path)
                    print(f" -> 转换完成,已保存为 RGB 模式。")

                # 检查是否是其他非 RGB/非 RGBA 模式 (如 L=灰度, P=调色板等)
                elif img.mode != 'RGB':
                    print(f"正在转换 {filename} (当前模式: {img.mode})...")
                    # 转换为 RGB 模式
                    rgb_img = img.convert('RGB')
                    rgb_img.save(input_path)
                    print(f" -> 转换完成,已保存为 RGB 模式。")
                else:
                    # 已经是 RGB 模式,跳过
                    print(f" {filename} 已是 RGB 模式,跳过。")


            except Exception as e:
                print(f" -> 处理 {filename} 时发生错误: {e}")

    print("--- 所有文件处理完毕 ---")
(3)输出结果如下:
点击查看代码
D:\anaconda3\envs\labelme\python.exe D:/DeepLearning/Procee_Dataset/ImageType_Convert.py
开始处理文件夹:F:\Label_Dataset\7d489_main\limestone\Images
 000001.jpg 已是 RGB 模式,跳过。
 000002.jpg 已是 RGB 模式,跳过。
......
正在转换 000273.jpg...
 -> 转换完成,已保存为 RGB 模式。
 000274.jpg 已是 RGB 模式,跳过。
......
 000282.jpg 已是 RGB 模式,跳过。
正在转换 000283.jpg...
 -> 转换完成,已保存为 RGB 模式。
 000284.jpg 已是 RGB 模式,跳过。
 000285.jpg 已是 RGB 模式,跳过。
正在转换 000286.jpg...
 -> 转换完成,已保存为 RGB 模式。
 000287.jpg 已是 RGB 模式,跳过。
 ......
 000898.jpg 已是 RGB 模式,跳过。
--- 所有文件处理完毕 ---

进程已结束,退出代码0

D1204_遍历整个数据集并将四通道RGBA统一转换为RGB三通道

(4)处理重复照片

计算图像的感知哈希(phash),对光照/背景变化鲁棒

①手动删除
点击查看代码
import os
import sys
from pathlib import Path
from PIL import Image
import imagehash
import argparse


def get_perceptual_hash(image_path, hash_size=8):
    try:
        with Image.open(image_path) as img:
            if img.mode != 'L':
                img = img.convert('L')
            h = imagehash.phash(img, hash_size=hash_size)
            return str(h)
    except Exception as e:
        print(f"⚠️ 无法处理 {image_path}: {e}")
        return None


def find_and_delete_similar_images(folder_path, hash_size=8, max_distance=5, delete=False):
    image_exts = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.webp', '.tiff', '.tif', '.jfif'}

    image_files = [
        os.path.join(folder_path, f)
        for f in os.listdir(folder_path)
        if os.path.isfile(os.path.join(folder_path, f)) and Path(f).suffix.lower() in image_exts
    ]

    if not image_files:
        print("未找到任何图片文件。")
        return

    print(f"🔍 扫描到 {len(image_files)} 张图片,正在计算感知哈希...")

    hash_list = []
    valid_files = []

    for f in image_files:
        h_str = get_perceptual_hash(f, hash_size=hash_size)
        if h_str:
            hash_list.append(h_str)
            valid_files.append(f)

    if not hash_list:
        print("❌ 无有效图像可处理。")
        return

    print(f"✅ 成功计算 {len(hash_list)} 张图像的感知哈希。")

    used = [False] * len(valid_files)
    files_to_delete = []

    for i in range(len(valid_files)):
        if used[i]:
            continue
        group = [valid_files[i]]
        used[i] = True
        h1 = imagehash.hex_to_hash(hash_list[i])

        for j in range(i + 1, len(valid_files)):
            if used[j]:
                continue
            h2 = imagehash.hex_to_hash(hash_list[j])
            if (h1 - h2) <= max_distance:
                group.append(valid_files[j])
                used[j] = True

        # 保留 group[0],其余标记为删除
        if len(group) > 1:
            files_to_delete.extend(group[1:])

    if not files_to_delete:
        print("✅ 未发现冗余图像,无需删除。")
        return

    print(f"🧹 发现 {len(files_to_delete)} 张冗余图像,准备删除...")

    if delete:
        for f in files_to_delete:
            try:
                os.remove(f)
                print(f"🗑️ 已删除: {f}")
            except Exception as e:
                print(f"❌ 删除失败 {f}: {e}")
        print(f"\n✅ 自动删除完成!共删除 {len(files_to_delete)} 张图像。")
    else:
        print("(模拟模式)以下是将被删除的文件:")
        for f in files_to_delete:
            print(f"    ❌ {f}")
        print("\n💡 如需真实删除,请添加 `--delete` 参数运行。")


# ===== 主程序 =====
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="自动检测并删除视觉相似图像(保留每组第一张)")
    parser.add_argument("folder", nargs="?", help="图像文件夹路径")
    parser.add_argument("--delete", action="store_true", help="启用真实删除(否则仅模拟)")
    parser.add_argument("--hash-size", type=int, default=8)
    parser.add_argument("--max-distance", type=int, default=5)

    args = parser.parse_args()

    try:
        import imagehash
    except ImportError:
        print("❌ 请先安装依赖:pip install imagehash")
        sys.exit(1)

    folder = args.folder or input("请输入图片文件夹的绝对路径: ").strip()
    if not os.path.isdir(folder):
        print("❌ 无效的文件夹路径")
        sys.exit(1)

    print(f"📁 处理文件夹: {folder}")
    print("-" * 50)
    find_and_delete_similar_images(
        folder,
        hash_size=args.hash_size,
        max_distance=args.max_distance,
        delete=args.delete
    )
②自动删除
点击查看代码
import os
import sys
from pathlib import Path
from PIL import Image
import imagehash


def get_perceptual_hash(image_path, hash_size=8):
    try:
        with Image.open(image_path) as img:
            if img.mode != 'L':
                img = img.convert('L')
            h = imagehash.phash(img, hash_size=hash_size)
            return str(h)
    except Exception as e:
        return None


def auto_delete_similar_images(folder_path, hash_size=8, max_distance=5):
    # 支持 .jfif(你提到的格式)
    image_exts = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.webp', '.tiff', '.tif', '.jfif'}

    image_files = [
        os.path.join(folder_path, f)
        for f in os.listdir(folder_path)
        if os.path.isfile(os.path.join(folder_path, f)) and Path(f).suffix.lower() in image_exts
    ]

    if not image_files:
        print("未找到任何支持的图像文件。")
        return

    print(f"🔍 扫描到 {len(image_files)} 张图像,正在计算感知哈希...")

    hash_list = []
    valid_files = []

    for f in image_files:
        h_str = get_perceptual_hash(f, hash_size=hash_size)
        if h_str is not None:
            hash_list.append(h_str)
            valid_files.append(f)

    print(f"✅ 成功处理 {len(valid_files)} 张有效图像。")

    used = [False] * len(valid_files)
    files_to_delete = []

    for i in range(len(valid_files)):
        if used[i]:
            continue
        h1 = imagehash.hex_to_hash(hash_list[i])
        group = [valid_files[i]]
        used[i] = True

        for j in range(i + 1, len(valid_files)):
            if used[j]:
                continue
            h2 = imagehash.hex_to_hash(hash_list[j])
            if (h1 - h2) <= max_distance:
                group.append(valid_files[j])
                used[j] = True

        if len(group) > 1:
            files_to_delete.extend(group[1:])  # 保留 group[0],删其余

    if not files_to_delete:
        print("✅ 未发现重复图像。")
        return

    print(f"🗑️ 发现 {len(files_to_delete)} 张重复图像,正在删除...")

    for f in files_to_delete:
        try:
            os.remove(f)
        except Exception as e:
            print(f"❌ 删除失败: {f} - {e}")

    print(f"✅ 自动去重完成!共删除 {len(files_to_delete)} 张图像。")


# ===== 主程序 =====
if __name__ == "__main__":
    try:
        import imagehash
    except ImportError:
        print("❌ 请先运行: pip install imagehash")
        sys.exit(1)

    if len(sys.argv) > 1:
        folder = sys.argv[1]
    else:
        folder = input("请输入图像文件夹路径: ").strip()

    if not os.path.isdir(folder):
        print("❌ 路径无效。")
        sys.exit(1)

    auto_delete_similar_images(folder, hash_size=8, max_distance=5)

1.2在labelme里面标注json文件

1.点击“打开目录”,这样就能同时标注一整个文件夹下的矿物岩石图像

应提前把所有图像放到同一个文件夹中,再点击“打开目录”,用labelme打开这个文件夹标注

2.点击'AI多边形',手动点击一两下矿物所在区域,labelme就能自动识别出矿物

(1)通过点选想要标注的物体,让AI自动标注,双击,取一个“标签”名,然后Ctrl+S,保存标注的label格式的json文件;如果要切换上一张图像,点击键盘的“D”
D1203_标注的第一张dolomite岩石的labelme文件

【注:在标注过程中,不要任意切换文件夹,否则imagepath会出现问题】

(2)遇到不是单独一个矿物岩石,需要多次点击此岩石并命名为同一个标签名

标注完同一种的多个矿物后,再Ctrl+S保存为json文件

D1203_标注的dolomite_000489岩石的json文件的imagepath名字正常

3.打开json文件的imagepath

Labelme标注的json文件最后imagePath图像路径,只能是图像名字本身,不能有其它的路径和符号(例如../、\之类的)

D1203_标注的第一张dolomite岩石的json文件的imagepath名字正常

1.3在pycharm里面批量将json文件转成mask文件(png格式)

1.先自动改名字,再转为mask文件【提前将json和要改名的jpg文件都放在Labelme_json文件夹里面】

(1)先把Labelme_json文件夹里面的jpg文件例如000459.jpg的所有文件自动转换为类似于dolomite_000459.json命令形式的dolomite_000459.jpg

(2)并在Labelme_mask文件夹里面生成类似于dolomite_000459.png的文件

2.代码如下
点击查看代码
import os
import json
import numpy as np
from PIL import Image
from labelme import utils
import glob

# ====== 路径配置 ======
json_dir = r"G:\Label_Dataset\Dataset\Granite\Labelme_jsons"
output_mask_dir = r"G:\Label_Dataset\Dataset\Granite\Labelme_mask"

# 创建掩膜输出目录(如果不存在)
os.makedirs(output_mask_dir, exist_ok=True)

# 遍历所有 JSON 文件
json_files = glob.glob(os.path.join(json_dir, "*.json"))

# ✅ 修正:添加点号,支持 .webp
img_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp','.gif']

for json_path in json_files:
    json_filename = os.path.basename(json_path)
    print(f"Processing: {json_filename}")

    try:
        # 使用 JSON 文件名(不含扩展名)作为输出基础名
        output_base = os.path.splitext(json_filename)[0]

        # 查找对应图像文件
        img_path = None
        for ext in img_extensions:
            temp_path = os.path.join(json_dir, output_base + ext)
            if os.path.exists(temp_path):
                img_path = temp_path
                break

        if not img_path:
            raise FileNotFoundError(f"未找到对应图像文件(支持格式:{img_extensions})")

        # 读取 JSON
        with open(json_path, 'r', encoding='utf-8') as f:
            data = json.load(f)

        # 打开图像以获取尺寸(不保存)
        with Image.open(img_path) as img:
            img_width, img_height = img.size

        # 构建标签映射
        label_name_to_value = {"__background__": 0}
        for shape in data["shapes"]:
            label = shape["label"]
            if label not in label_name_to_value:
                label_name_to_value[label] = len(label_name_to_value)

        # 生成掩膜
        lbl, _ = utils.shapes_to_label(
            img_shape=(img_height, img_width),
            shapes=data["shapes"],
            label_name_to_value=label_name_to_value,
        )

        # ✅ 仅保存掩膜(PNG)
        mask_output_path = os.path.join(output_mask_dir, output_base + ".png")
        # 转为 0-255(可选,便于可视化;若用于训练,也可保留 0/1)
        lbl = lbl * 255
        Image.fromarray(lbl.astype(np.uint8), mode='L').save(mask_output_path)

        print(f"✅ 生成掩膜: {output_base}.png")

    except Exception as e:
        print(f"❌ 错误: {json_filename} -> {e}")

print("\n🎉 掩膜生成完成!仅输出 PNG 掩膜文件,文件名与 JSON 一致。")

1.4将mask文件作为“掩码”,直接从原始JPG中提取矿物部分,生成新JPG

1.第一次”掩码“结果:图像全白

【原因:我在labelme标注的json文件转换生成的mask是0-1范围,而非0-255】
labelme的utils.shapes_to_label()默认生成0-1范围的mask(背景=0,矿物=1),不是标准的0-255二值图。

2.将mask范围设为0-255

代码如下:

点击查看代码
from PIL import Image
import numpy as np
import os

# 设置目录路径
original_dir = r"G:\Label_Dataset\Dataset\Granite\Labelme_images"
mask_dir = r"G:\Label_Dataset\Dataset\Granite\Labelme_mask"
output_dir = r"G:\Label_Dataset\Dataset\Granite\Images"

os.makedirs(output_dir, exist_ok=True)

# 支持的原始图像格式(包括 webp)
supported_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.webp','.gif')

for filename in os.listdir(original_dir):
    if filename.lower().endswith(supported_extensions):
        # 1. 获取基础名(不含扩展名),用于匹配 mask
        base_name, ext = os.path.splitext(filename)
        mask_path = os.path.join(mask_dir, base_name + '.png')

        # 2. 检查 mask 是否存在
        if not os.path.exists(mask_path):
            print(f"⚠️ 警告: 找不到对应的 mask 文件: {mask_path}")
            continue

        # 3. 读取原始图像和 mask
        img = Image.open(os.path.join(original_dir, filename)).convert('RGB')
        mask = Image.open(mask_path).convert('L')

        # 4. 生成二值掩码(>128 视为前景/矿物)
        mask_np = np.array(mask)
        mineral_mask = mask_np > 128  # shape: (H, W), bool

        # 5. 创建白底图像,保留矿物区域
        img_np = np.array(img)
        output_img = np.full_like(img_np, 255)  # 全白背景
        output_img[mineral_mask] = img_np[mineral_mask]

        # 6. 输出为 JPG(无论输入是 webp 还是 jpg)
        output_filename = base_name + '.jpg'
        output_path = os.path.join(output_dir, output_filename)
        Image.fromarray(output_img).save(output_path, "JPEG")

        print(f"✅ 已处理: {filename} → {output_filename}")

1.5划分训练集和测试集(20%测试集,80%训练集)

1.重命名文件:

img_dir:是原始图像
ann_dir:是json转换成的mask的png文件

2.删除文件:

原始json文件删掉

3.提前准备:

将Dolomite、Limestone、Shale三个文件夹下的labelme_images统一放到img_dir文件夹里,将labelme_mask的png文件统一放到ann_dir文件夹下,然后在jupyter notebook打开这个目录: "D:\DeepLearning\Learn_SAM\Label2Everything_labelme2mask\Dataset_DolomiteLimestoneShale"

4.划分训练

打开"D:\DeepLearning\Learn_SAM\Label2Everything_labelme2mask\【C】划分训练-测试集.ipynb"

通过在jupyter notebook里运行该代码,实现80%训练集和20%测试集的划分

D1206_在jupyter notebook打开这个目录

5.实现效果如下:

D1206_划分测试集和训练集代码

D1206_划分测试集和训练集实现效果

完全可以用这184张 dolomite 图像训练的模型,去为其他几千张不同岩性(limestone, mudstone, sandstone, shale 等)图像生成 mask!

1.6训练模型

1.准备数据:

我的实际数据准备如下:
Dataset_DolomiteLimestoneShale/
├── train/
│ ├── img_dir/ # Dolomite、Limestone和Shale训练图像
│ └ann_dir/ # 对应mask
├── val/
│ ├── img_dir/ # Dolomite、Limestone和Shale验证图像
│ └ann_dir/ # 对应mask
└── Images/ # Mudstone的202张待预测图像

2.训练 U-Net 模型(推荐使用 Keras + TensorFlow)

(1)在Google Colab训练模型,
代码如下:

点击查看代码
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from PIL import Image

from google.colab import files

# 上传 train/img_dir 和 train/ann_dir 文件夹(压缩为 .zip)
uploaded = files.upload()

# 解压(假设您上传的是 train.zip 和 val.zip)
!unzip -q train.zip -d /content/
!unzip -q val.zip -d /content/
!unzip -q Images.zip -d /content/

# 查看内容
!ls -R /content/

# 修改为Colab路径
train_img_dir = "/content/train/img_dir"
train_mask_dir = "/content/train/ann_dir"
val_img_dir = "/content/val/img_dir"
val_mask_dir = "/content/val/ann_dir"
new_img_dir = "/content/Images"
output_mask_dir = "/content/Labelme_mask"  # 输出目录

os.makedirs(output_mask_dir, exist_ok=True)

def load_image_and_mask(img_path, mask_path, target_size=(256, 256)):
    try:
        # 加载图像
        img = tf.io.read_file(img_path)
        img = tf.image.decode_image(img, channels=3, expand_animations=False)  # 关闭动画支持
        if img.shape[0] == 0 or img.shape[1] == 0:  # 检查是否为空图像
            raise ValueError(f"图像尺寸为0: {img_path}")

        img = tf.image.resize(img, target_size)
        img = tf.cast(img, tf.float32) / 255.0

        # 加载 mask
        mask = tf.io.read_file(mask_path)
        mask = tf.image.decode_png(mask, channels=1)
        if mask.shape[0] == 0 or mask.shape[1] == 0:
            raise ValueError(f"Mask 尺寸为0: {mask_path}")

        mask = tf.image.resize(mask, target_size)
        mask = tf.cast(mask, tf.float32) / 255.0

        return img, mask

    except Exception as e:
        print(f"❌ 加载失败: {img_path} 或 {mask_path}")
        print(f"   错误信息: {str(e)}")
        # 返回一个占位符(避免中断训练),实际中建议跳过或修复该文件
        dummy_img = tf.zeros((target_size[0], target_size[1], 3), dtype=tf.float32)
        dummy_mask = tf.zeros((target_size[0], target_size[1], 1), dtype=tf.float32)
        return dummy_img, dummy_mask

def create_dataset(image_dir, mask_dir, batch_size=8):
    image_files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    mask_files = [f for f in os.listdir(mask_dir) if f.lower().endswith('.png')]

    # 按文件名排序
    image_files.sort()
    mask_files.sort()

    # 打印前几个文件名,确认是否匹配
    print("📊 图像文件 (前5个):", image_files[:5])
    print("📊 Mask 文件 (前5个):", mask_files[:5])

    # 确保数量一致
    if len(image_files) != len(mask_files):
        raise ValueError(f"图像和 mask 数量不匹配:{len(image_files)} vs {len(mask_files)}")

    # 检查文件名是否能一一对应(忽略后缀)
    image_basenames = [os.path.splitext(f)[0] for f in image_files]
    mask_basenames = [os.path.splitext(f)[0] for f in mask_files]

    # 匹配相同 base name 的图像和 mask
    matched_pairs = []
    for img_name in image_basenames:
        if img_name in mask_basenames:
            img_idx = image_basenames.index(img_name)
            mask_idx = mask_basenames.index(img_name)
            matched_pairs.append((image_files[img_idx], mask_files[mask_idx]))

    if len(matched_pairs) == 0:
        raise ValueError("没有找到任何匹配的图像和 mask 对!请检查文件名是否一致。")

    image_paths = [os.path.join(image_dir, p[0]) for p in matched_pairs]
    mask_paths = [os.path.join(mask_dir, p[1]) for p in matched_pairs]

    dataset = tf.data.Dataset.from_tensor_slices((image_paths, mask_paths))
    dataset = dataset.map(lambda x, y: load_image_and_mask(x, y), num_parallel_calls=tf.data.AUTOTUNE)
    dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)
    return dataset

def unet_model(input_size=(256, 256, 3)):
    inputs = layers.Input(input_size)

    # Encoder
    c1 = layers.Conv2D(16, 3, activation='relu', padding='same')(inputs)
    c1 = layers.Conv2D(16, 3, activation='relu', padding='same')(c1)
    p1 = layers.MaxPooling2D()(c1)

    c2 = layers.Conv2D(32, 3, activation='relu', padding='same')(p1)
    c2 = layers.Conv2D(32, 3, activation='relu', padding='same')(c2)
    p2 = layers.MaxPooling2D()(c2)

    c3 = layers.Conv2D(64, 3, activation='relu', padding='same')(p2)
    c3 = layers.Conv2D(64, 3, activation='relu', padding='same')(c3)
    p3 = layers.MaxPooling2D()(c3)

    c4 = layers.Conv2D(128, 3, activation='relu', padding='same')(p3)
    c4 = layers.Conv2D(128, 3, activation='relu', padding='same')(c4)
    p4 = layers.MaxPooling2D()(c4)

    c5 = layers.Conv2D(256, 3, activation='relu', padding='same')(p4)
    c5 = layers.Conv2D(256, 3, activation='relu', padding='same')(c5)

    # Decoder
    u6 = layers.Conv2DTranspose(128, 2, strides=2, padding='same')(c5)
    u6 = layers.concatenate([u6, c4])
    c6 = layers.Conv2D(128, 3, activation='relu', padding='same')(u6)
    c6 = layers.Conv2D(128, 3, activation='relu', padding='same')(c6)

    u7 = layers.Conv2DTranspose(64, 2, strides=2, padding='same')(c6)
    u7 = layers.concatenate([u7, c3])
    c7 = layers.Conv2D(64, 3, activation='relu', padding='same')(u7)
    c7 = layers.Conv2D(64, 3, activation='relu', padding='same')(c7)

    u8 = layers.Conv2DTranspose(32, 2, strides=2, padding='same')(c7)
    u8 = layers.concatenate([u8, c2])
    c8 = layers.Conv2D(32, 3, activation='relu', padding='same')(u8)
    c8 = layers.Conv2D(32, 3, activation='relu', padding='same')(c8)

    u9 = layers.Conv2DTranspose(16, 2, strides=2, padding='same')(c8)
    u9 = layers.concatenate([u9, c1])
    c9 = layers.Conv2D(16, 3, activation='relu', padding='same')(u9)
    c9 = layers.Conv2D(16, 3, activation='relu', padding='same')(c9)

    outputs = layers.Conv2D(1, 1, activation='sigmoid')(c9)

    model = models.Model(inputs=[inputs], outputs=[outputs])
    return model

train_dataset = create_dataset(train_img_dir, train_mask_dir, batch_size=8)
val_dataset = create_dataset(val_img_dir, val_mask_dir, batch_size=8)

model = unet_model()
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

print("🚀 开始训练...")
history = model.fit(
    train_dataset,
    validation_data=val_dataset,
    epochs=50,
    verbose=1
)

print("✅ 训练完成!")

print("🔮 开始预测新图像(使用 mudstone_ 前缀 + 原始编号)...")

# 获取所有新图像路径(支持 jpg/jpeg/png)
new_image_paths = sorted([
    os.path.join(new_img_dir, f) 
    for f in os.listdir(new_img_dir) 
    if f.lower().endswith(('.jpg', '.jpeg', '.png'))
])

print(f"📦 共找到 {len(new_image_paths)} 张图像待预测")

for img_path in new_image_paths:
    try:
        # 加载图像
        if img_path.lower().endswith('.png'):
            img = tf.io.read_file(img_path)
            img = tf.image.decode_png(img, channels=3)
        else:
            img = tf.io.read_file(img_path)
            img = tf.image.decode_jpeg(img, channels=3)

        img = tf.image.resize(img, (256, 256))
        img = tf.expand_dims(img, axis=0)
        img = tf.cast(img, tf.float32) / 255.0

        # 预测
        pred_mask = model.predict(img, verbose=0)[0]
        pred_mask = (pred_mask > 0.5).astype(np.uint8) * 255

        # ✅ 提取原始文件名中的数字部分(如 limestone_000456.jpg → 000456)
        base_name = os.path.basename(img_path)  # 如 "limestone_000456.jpg"
        if '_' in base_name:
            # 按下划线分割,取最后一部分(数字+扩展名)
            number_with_ext = base_name.split('_')[-1]
            # 去掉扩展名
            number_part = os.path.splitext(number_with_ext)[0]
        else:
            # 如果没有下划线,用整个文件名去掉扩展名
            number_part = os.path.splitext(base_name)[0]

        # ✅ 生成新文件名:mudstone_000456.png
        new_mask_name = f"mudstone_{number_part}.png"
        output_path = os.path.join(output_mask_dir, new_mask_name)

        # 保存
        Image.fromarray(pred_mask.squeeze()).save(output_path)

        # 打印进度(可选)
        print(f"✅ 已生成: {new_mask_name}")

    except Exception as e:
        print(f"❌ 预测失败: {img_path} - {e}")

print(f"✅ 所有 mask 已生成,文件名格式:mudstone_XXXXXX.png")

!zip -r mudstone_masks.zip /content/Labelme_mask/
files.download('mudstone_masks.zip')

(2)报错了
报错的根本原因
【我在 Google Colab 上运行,而代码中的 D:\ 是 Windows 本地磁盘路径,在 Colab(Linux 环境)中完全无效。】

(3)在Colab上传我的文件:
即在运行代码之前输入以下代码:

点击查看代码
from google.colab import files

# 上传 train/img_dir 和 train/ann_dir 文件夹(压缩为 .zip)
uploaded = files.upload()

# 解压(假设您上传的是 train.zip 和 val.zip)
!unzip -q train.zip -d /content/
!unzip -q val.zip -d /content/
!unzip -q Images.zip -d /content/

# 查看内容
!ls -R /content/

【提示:请先在本地将 train/, val/, Images/ 分别压缩成 .zip 文件,然后上传。】

(4)Colab会自动弹窗,让我们加载这三个压缩为Zip的文件夹

D1206_在Colab上传我的文件

(5)修改路径为 Colab 路径:

点击查看代码
# 修改为 Colab 路径
train_img_dir = "/content/train/img_dir"
train_mask_dir = "/content/train/ann_dir"
val_img_dir = "/content/val/img_dir"
val_mask_dir = "/content/val/ann_dir"
new_img_dir = "/content/Images"
output_mask_dir = "/content/Labelme_mask"  # 输出目录

os.makedirs(output_mask_dir, exist_ok=True)

(6)它的运行结果如下:
✅ 所有 202 张图像的 mask 已生成,保存在 /content/Labelme_mask

(7)如何将这 202 张 mask 下载到本地电脑?

①我们看到的路径 /content/Labelme_mask 是 Google Colab 的临时存储空间(Linux 系统)。
Colab 无法直接访问我们本地的 D:\ 磁盘。
所有生成的文件都在云端,重启 Colab 后会被清除(除非我们下载或保存到 Google Drive)。

②如何将这 202 张 mask 下载到本地电脑?

打包成 ZIP 并下载:
在 Colab 中运行以下代码,将整个 Labelme_mask 文件夹压缩并下载:

点击查看代码
!zip -r mudstone_masks.zip /content/Labelme_mask/
files.download('mudstone_masks.zip')

(8)修改1.7_2_(1)中的代码:
【上述模型的训练效果非常差,它预测的202张岩石图的mask后的图像和手动标注的岩石图标签几乎每一张都两模两样】
①在Google Colab里面修改运行这段代码,仍然是对每张图像中的岩石主体进行分割,进行岩石 vs 背景(二值分割);
②我的训练数据包括184张dolomite、339张limestone和109张shale的JPG原始图像和分别在labelme里面手动标注的mask的png图像,现在想预测202张mudstone的岩石图,要求就是对每张图像中的岩石主体进行分割(即“把岩石从背景中抠出来”);
③时图像可以不resize 到 256x256,保持原始的图像尺寸就行;
④训练模型的图片一共632张,其中80%是训练集,20%是测试集(已经在1.6_4中划分玩训练集和测试集)

3.训练 改进型U-Net 模型

(1)在Colab改用纯 U-Net 模型 + 数据增强 + 原始尺寸支持

点击查看代码
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from PIL import Image
from google.colab import files

# =============================
# 第1步:上传并解压数据
# =============================
print("📂 请上传 train.zip, val.zip, Images.zip")
uploaded = files.upload()

!unzip -q train.zip -d /content/
!unzip -q val.zip -d /content/
!unzip -q Images.zip -d /content/

# =============================
# 第2步:设置路径(使用您已划分好的数据)
# =============================
train_img_dir = "/content/train/img_dir"
train_mask_dir = "/content/train/ann_dir"
val_img_dir = "/content/val/img_dir"
val_mask_dir = "/content/val/ann_dir"
new_img_dir = "/content/Images"
output_mask_dir = "/content/Labelme_mask"
os.makedirs(output_mask_dir, exist_ok=True)

# =============================
# 第3步:自定义 padding/unpad 函数(保持宽高比)
# =============================
def pad_to_square(image, target_size=512):
    h, w = tf.shape(image)[0], tf.shape(image)[1]
    max_dim = tf.maximum(h, w)
    scale = tf.cast(target_size / max_dim, tf.float32)
    new_h = tf.cast(tf.cast(h, tf.float32) * scale, tf.int32)
    new_w = tf.cast(tf.cast(w, tf.float32) * scale, tf.int32)
    resized = tf.image.resize(image, [new_h, new_w])
    padded = tf.image.resize_with_pad(resized, target_size, target_size, method='nearest')
    return padded, (h, w, new_h, new_w)

def unpad_from_square(padded_mask, orig_h, orig_w, resized_h, resized_w, target_size=512):
    cropped = tf.image.crop_to_bounding_box(
        tf.expand_dims(padded_mask, axis=-1),
        (target_size - resized_h) // 2,
        (target_size - resized_w) // 2,
        resized_h,
        resized_w
    )
    orig_mask = tf.image.resize(cropped, [orig_h, orig_w], method='nearest')
    return orig_mask

# =============================
# 第4步:带数据增强的加载函数
# =============================
def load_image_and_mask(img_path, mask_path, target_size=512, augment=False):
    # 加载图像
    img = tf.io.read_file(img_path)
    img = tf.image.decode_image(img, channels=3, expand_animations=False)
    mask = tf.io.read_file(mask_path)
    mask = tf.image.decode_png(mask, channels=1)

    # 数据增强(仅训练时使用)
    if augment:
        if tf.random.uniform(()) > 0.5:
            img = tf.image.flip_left_right(img)
            mask = tf.image.flip_left_right(mask)
        if tf.random.uniform(()) > 0.5:
            img = tf.image.flip_up_down(img)
            mask = tf.image.flip_up_down(mask)
        if tf.random.uniform(()) > 0.5:
            img = tf.image.random_brightness(img, 0.2)
            img = tf.image.random_contrast(img, 0.8, 1.2)

    # Pad to square
    img_padded, (h, w, new_h, new_w) = pad_to_square(img, target_size)
    mask_padded, _ = pad_to_square(mask, target_size)

    img_padded = tf.cast(img_padded, tf.float32) / 255.0
    mask_padded = tf.cast(mask_padded, tf.float32) / 255.0

    return img_padded, mask_padded

# =============================
# 第5步:创建数据集(训练集带增强,验证集不带)
# =============================
def create_dataset(image_dir, mask_dir, target_size=512, batch_size=4, augment=False):
    image_files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    mask_files = [f for f in os.listdir(mask_dir) if f.lower().endswith('.png')]
    
    image_files.sort()
    mask_files.sort()

    image_basenames = [os.path.splitext(f)[0] for f in image_files]
    mask_basenames = [os.path.splitext(f)[0] for f in mask_files]
    pairs = []
    for name in image_basenames:
        if name in mask_basenames:
            img_f = image_files[image_basenames.index(name)]
            mask_f = mask_files[mask_basenames.index(name)]
            pairs.append((os.path.join(image_dir, img_f), os.path.join(mask_dir, mask_f)))
    
    def generator():
        for img_path, mask_path in pairs:
            img, mask = load_image_and_mask(img_path, mask_path, target_size, augment)
            yield img, mask

    dataset = tf.data.Dataset.from_generator(
        generator,
        output_signature=(
            tf.TensorSpec(shape=(target_size, target_size, 3), dtype=tf.float32),
            tf.TensorSpec(shape=(target_size, target_size, 1), dtype=tf.float32)
        )
    )
    return dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)

# =============================
# 第6步:构建更深的 U-Net 模型(5层)
# =============================
def build_unet(input_size=(512, 512, 3)):
    inputs = layers.Input(input_size)
    
    # Encoder
    c1 = layers.Conv2D(64, 3, activation='relu', padding='same')(inputs)
    c1 = layers.Conv2D(64, 3, activation='relu', padding='same')(c1)
    p1 = layers.MaxPooling2D()(c1)
    
    c2 = layers.Conv2D(128, 3, activation='relu', padding='same')(p1)
    c2 = layers.Conv2D(128, 3, activation='relu', padding='same')(c2)
    p2 = layers.MaxPooling2D()(c2)
    
    c3 = layers.Conv2D(256, 3, activation='relu', padding='same')(p2)
    c3 = layers.Conv2D(256, 3, activation='relu', padding='same')(c3)
    p3 = layers.MaxPooling2D()(c3)
    
    c4 = layers.Conv2D(512, 3, activation='relu', padding='same')(p3)
    c4 = layers.Conv2D(512, 3, activation='relu', padding='same')(c4)
    p4 = layers.MaxPooling2D()(c4)
    
    c5 = layers.Conv2D(1024, 3, activation='relu', padding='same')(p4)
    c5 = layers.Conv2D(1024, 3, activation='relu', padding='same')(c5)
    
    # Decoder
    u6 = layers.Conv2DTranspose(512, 2, strides=2, padding='same')(c5)
    u6 = layers.concatenate([u6, c4])
    c6 = layers.Conv2D(512, 3, activation='relu', padding='same')(u6)
    c6 = layers.Conv2D(512, 3, activation='relu', padding='same')(c6)
    
    u7 = layers.Conv2DTranspose(256, 2, strides=2, padding='same')(c6)
    u7 = layers.concatenate([u7, c3])
    c7 = layers.Conv2D(256, 3, activation='relu', padding='same')(u7)
    c7 = layers.Conv2D(256, 3, activation='relu', padding='same')(c7)
    
    u8 = layers.Conv2DTranspose(128, 2, strides=2, padding='same')(c7)
    u8 = layers.concatenate([u8, c2])
    c8 = layers.Conv2D(128, 3, activation='relu', padding='same')(u8)
    c8 = layers.Conv2D(128, 3, activation='relu', padding='same')(c8)
    
    u9 = layers.Conv2DTranspose(64, 2, strides=2, padding='same')(c8)
    u9 = layers.concatenate([u9, c1])
    c9 = layers.Conv2D(64, 3, activation='relu', padding='same')(u9)
    c9 = layers.Conv2D(64, 3, activation='relu', padding='same')(c9)
    
    outputs = layers.Conv2D(1, 1, activation='sigmoid')(c9)
    return models.Model(inputs=[inputs], outputs=[outputs])

# =============================
# 第7步:训练
# =============================
print("🚀 开始训练...")

# 训练集带数据增强,验证集不带
train_dataset = create_dataset(train_img_dir, train_mask_dir, target_size=512, batch_size=4, augment=True)
val_dataset = create_dataset(val_img_dir, val_mask_dir, target_size=512, batch_size=4, augment=False)

model = build_unet(input_size=(512, 512, 3))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

history = model.fit(train_dataset, validation_data=val_dataset, epochs=100, verbose=1)
print("✅ 训练完成!")

# =============================
# 第8步:预测(保持原始尺寸)
# =============================
new_image_paths = sorted([
    os.path.join(new_img_dir, f) 
    for f in os.listdir(new_img_dir) 
    if f.lower().endswith(('.jpg', '.jpeg', '.png'))
])

for img_path in new_image_paths:
    try:
        # 加载原始图像
        if img_path.lower().endswith('.png'):
            img = tf.io.read_file(img_path)
            img = tf.image.decode_png(img, channels=3)
        else:
            img = tf.io.read_file(img_path)
            img = tf.image.decode_jpeg(img, channels=3)
        orig_h, orig_w = img.shape[0], img.shape[1]

        # Padding 到 512x512
        img_padded, (h, w, new_h, new_w) = pad_to_square(img, 512)
        img_input = tf.cast(img_padded, tf.float32) / 255.0
        img_input = tf.expand_dims(img_input, axis=0)

        # 预测
        pred_mask_padded = model.predict(img_input, verbose=0)[0]
        pred_mask_padded = (pred_mask_padded > 0.5).astype(tf.float32)

        # 恢复到原始尺寸
        pred_mask_orig = unpad_from_square(pred_mask_padded, h, w, new_h, new_w, 512)
        pred_mask_orig = tf.cast(pred_mask_orig * 255, tf.uint8)

        # 保存
        base_name = os.path.basename(img_path)
        number_part = os.path.splitext(base_name)[0]
        out_path = os.path.join(output_mask_dir, f"mudstone_{number_part}.png")
        Image.fromarray(pred_mask_orig.numpy().squeeze()).save(out_path)

    except Exception as e:
        print(f"❌ 预测失败: {img_path} - {e}")

print("✅ 预测完成!")

# 下载结果
!zip -r mudstone_masks.zip /content/Labelme_mask/
files.download('mudstone_masks.zip')

(2)我把以上代码分步在Colab里面使用GPU运行:

①运行到第7步
D1206_Colab正在训练

②第7步的运行过程中的“127”从何而来?

一共有184张dolomite、339张limestone和109张shale的JPG原始图像,

而我的训练集总图像数 ≈ 632 × 80% ≈ 505 张
每个 batch 包含 4 张图像(batch_size=4)
所以总 batch 数 ≈ 505 / 4 ≈ 126.25 → 向上取整为 127
即【127 是训练集的 batch 数量,与预测的 202 张 mudstone 图像无关!】

③运行到Epoch11的时候已经用时23分58秒

④GPU限额,CPU跑不动了

(3)改到pycharm里面运行

①代码

点击查看代码
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from PIL import Image
import shutil
import zipfile

# =============================
# 第1步:设置本地路径(请根据您的实际路径修改)
# =============================
base_dir = r"D:\DeepLearning\MineralDataset\Dataset_DolomiteLimestoneShale"

train_img_dir = os.path.join(base_dir, "train", "img_dir")
train_mask_dir = os.path.join(base_dir, "train", "ann_dir")
val_img_dir = os.path.join(base_dir, "val", "img_dir")
val_mask_dir = os.path.join(base_dir, "val", "ann_dir")
new_img_dir = os.path.join(base_dir, "Images")
output_mask_dir = os.path.join(base_dir, "Labelme_mask")
os.makedirs(output_mask_dir, exist_ok=True)

print("✅ 路径设置完成")


# =============================
# 第2步:padding/unpad 函数(无需修改)
# =============================
def pad_to_square(image, target_size=512):
    h, w = tf.shape(image)[0], tf.shape(image)[1]
    max_dim = tf.maximum(h, w)
    scale = tf.cast(target_size / max_dim, tf.float32)
    new_h = tf.cast(tf.cast(h, tf.float32) * scale, tf.int32)
    new_w = tf.cast(tf.cast(w, tf.float32) * scale, tf.int32)
    resized = tf.image.resize(image, [new_h, new_w])
    padded = tf.image.resize_with_pad(resized, target_size, target_size, method='nearest')
    return padded, (h, w, new_h, new_w)


def unpad_from_square(padded_mask, orig_h, orig_w, resized_h, resized_w, target_size=512):
    cropped = tf.image.crop_to_bounding_box(
        tf.expand_dims(padded_mask, axis=-1),
        (target_size - resized_h) // 2,
        (target_size - resized_w) // 2,
        resized_h,
        resized_w
    )
    orig_mask = tf.image.resize(cropped, [orig_h, orig_w], method='nearest')
    return orig_mask


# =============================
# 第3步:数据加载函数(无需修改)
# =============================
def load_image_and_mask(img_path, mask_path, target_size=512, augment=False):
    img = tf.io.read_file(img_path)
    img = tf.image.decode_image(img, channels=3, expand_animations=False)
    mask = tf.io.read_file(mask_path)
    mask = tf.image.decode_png(mask, channels=1)

    if augment:
        if tf.random.uniform(()) > 0.5:
            img = tf.image.flip_left_right(img)
            mask = tf.image.flip_left_right(mask)
        if tf.random.uniform(()) > 0.5:
            img = tf.image.flip_up_down(img)
            mask = tf.image.flip_up_down(mask)
        if tf.random.uniform(()) > 0.5:
            img = tf.image.random_brightness(img, 0.2)
            img = tf.image.random_contrast(img, 0.8, 1.2)

    img_padded, (h, w, new_h, new_w) = pad_to_square(img, target_size)
    mask_padded, _ = pad_to_square(mask, target_size)

    img_padded = tf.cast(img_padded, tf.float32) / 255.0
    mask_padded = tf.cast(mask_padded, tf.float32) / 255.0
    return img_padded, mask_padded


# =============================
# 第4步:创建数据集(无需修改)
# =============================
def create_dataset(image_dir, mask_dir, target_size=512, batch_size=4, augment=False):
    image_files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    mask_files = [f for f in os.listdir(mask_dir) if f.lower().endswith('.png')]

    image_files.sort()
    mask_files.sort()

    image_basenames = [os.path.splitext(f)[0] for f in image_files]
    mask_basenames = [os.path.splitext(f)[0] for f in mask_files]
    pairs = []
    for name in image_basenames:
        if name in mask_basenames:
            img_f = image_files[image_basenames.index(name)]
            mask_f = mask_files[mask_basenames.index(name)]
            pairs.append((os.path.join(image_dir, img_f), os.path.join(mask_dir, mask_f)))

    def generator():
        for img_path, mask_path in pairs:
            img, mask = load_image_and_mask(img_path, mask_path, target_size, augment)
            yield img, mask

    dataset = tf.data.Dataset.from_generator(
        generator,
        output_signature=(
            tf.TensorSpec(shape=(target_size, target_size, 3), dtype=tf.float32),
            tf.TensorSpec(shape=(target_size, target_size, 1), dtype=tf.float32)
        )
    )
    return dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)


# =============================
# 第5步:U-Net 模型(无需修改)
# =============================
def build_unet(input_size=(512, 512, 3)):
    inputs = layers.Input(input_size)
    c1 = layers.Conv2D(64, 3, activation='relu', padding='same')(inputs)
    c1 = layers.Conv2D(64, 3, activation='relu', padding='same')(c1)
    p1 = layers.MaxPooling2D()(c1)
    c2 = layers.Conv2D(128, 3, activation='relu', padding='same')(p1)
    c2 = layers.Conv2D(128, 3, activation='relu', padding='same')(c2)
    p2 = layers.MaxPooling2D()(c2)
    c3 = layers.Conv2D(256, 3, activation='relu', padding='same')(p2)
    c3 = layers.Conv2D(256, 3, activation='relu', padding='same')(c3)
    p3 = layers.MaxPooling2D()(c3)
    c4 = layers.Conv2D(512, 3, activation='relu', padding='same')(p3)
    c4 = layers.Conv2D(512, 3, activation='relu', padding='same')(c4)
    p4 = layers.MaxPooling2D()(c4)
    c5 = layers.Conv2D(1024, 3, activation='relu', padding='same')(p4)
    c5 = layers.Conv2D(1024, 3, activation='relu', padding='same')(c5)
    u6 = layers.Conv2DTranspose(512, 2, strides=2, padding='same')(c5)
    u6 = layers.concatenate([u6, c4])
    c6 = layers.Conv2D(512, 3, activation='relu', padding='same')(u6)
    c6 = layers.Conv2D(512, 3, activation='relu', padding='same')(c6)
    u7 = layers.Conv2DTranspose(256, 2, strides=2, padding='same')(c6)
    u7 = layers.concatenate([u7, c3])
    c7 = layers.Conv2D(256, 3, activation='relu', padding='same')(u7)
    c7 = layers.Conv2D(256, 3, activation='relu', padding='same')(c7)
    u8 = layers.Conv2DTranspose(128, 2, strides=2, padding='same')(c7)
    u8 = layers.concatenate([u8, c2])
    c8 = layers.Conv2D(128, 3, activation='relu', padding='same')(u8)
    c8 = layers.Conv2D(128, 3, activation='relu', padding='same')(c8)
    u9 = layers.Conv2DTranspose(64, 2, strides=2, padding='same')(c8)
    u9 = layers.concatenate([u9, c1])
    c9 = layers.Conv2D(64, 3, activation='relu', padding='same')(u9)
    c9 = layers.Conv2D(64, 3, activation='relu', padding='same')(c9)
    outputs = layers.Conv2D(1, 1, activation='sigmoid')(c9)
    return models.Model(inputs=[inputs], outputs=[outputs])


# =============================
# 第6步:训练(添加 ModelCheckpoint 避免丢失)
# =============================
print("🚀 开始训练...")

train_dataset = create_dataset(train_img_dir, train_mask_dir, target_size=512, batch_size=4, augment=True)
val_dataset = create_dataset(val_img_dir, val_mask_dir, target_size=512, batch_size=4, augment=False)

model = build_unet(input_size=(512, 512, 3))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# ✅ 保存模型(防止训练中断)
checkpoint = tf.keras.callbacks.ModelCheckpoint(
    os.path.join(base_dir, "best_model.h5"),
    save_best_only=True,
    monitor='val_loss'
)

history = model.fit(
    train_dataset,
    validation_data=val_dataset,
    epochs=80,
    verbose=1,
    callbacks=[checkpoint]
)
print("✅ 训练完成!")

# =============================
# 第7步:预测
# =============================
new_image_paths = sorted([
    os.path.join(new_img_dir, f)
    for f in os.listdir(new_img_dir)
    if f.lower().endswith(('.jpg', '.jpeg', '.png'))
])

for img_path in new_image_paths:
    try:
        if img_path.lower().endswith('.png'):
            img = tf.io.read_file(img_path)
            img = tf.image.decode_png(img, channels=3)
        else:
            img = tf.io.read_file(img_path)
            img = tf.image.decode_jpeg(img, channels=3)
        orig_h, orig_w = img.shape[0], img.shape[1]

        img_padded, (h, w, new_h, new_w) = pad_to_square(img, 512)
        img_input = tf.cast(img_padded, tf.float32) / 255.0
        img_input = tf.expand_dims(img_input, axis=0)

        pred_mask_padded = model.predict(img_input, verbose=0)[0]
        pred_mask_padded = (pred_mask_padded > 0.5).astype(tf.float32)

        pred_mask_orig = unpad_from_square(pred_mask_padded, h, w, new_h, new_w, 512)
        pred_mask_orig = tf.cast(pred_mask_orig * 255, tf.uint8)

        base_name = os.path.basename(img_path)
        number_part = os.path.splitext(base_name)[0]
        out_path = os.path.join(output_mask_dir, f"mudstone_{number_part}.png")
        Image.fromarray(pred_mask_orig.numpy().squeeze()).save(out_path)

    except Exception as e:
        print(f"❌ 预测失败: {img_path} - {e}")

print("✅ 预测完成!")

# =============================
# 第8步:打包结果(可选)
# =============================
shutil.make_archive(
    os.path.join(base_dir, "mudstone_masks"),
    'zip',
    output_mask_dir
)
print(f"📦 结果已打包: {os.path.join(base_dir, 'mudstone_masks.zip')}")

②80轮训练效果如下:
80轮训练结果如下

③运行结果

点击查看代码
C:\Users\Administrator\.conda\envs\hyspipeline\python.exe H:\MineralDataset\TrainDataset.py 
✅ 路径设置完成
🚀 开始训练...
2025-12-09 16:59:14.448986: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX AVX2 AVX512F AVX512_VNNI AVX512_BF16 AVX_VNNI AMX_TILE AMX_INT8 AMX_BF16 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
Epoch 1/80
    127/Unknown - 1809s 14s/step - loss: 0.5518 - accuracy: 0.6783C:\Users\Administrator\.conda\envs\hyspipeline\lib\site-packages\keras\src\engine\training.py:3000: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.
  saving_api.save_model(
127/127 [==============================] - 1887s 15s/step - loss: 0.5518 - accuracy: 0.6783 - val_loss: 0.5119 - val_accuracy: 0.7723
Epoch 2/80
127/127 [==============================] - 2452s 19s/step - loss: 0.4959 - accuracy: 0.6980 - val_loss: 0.5061 - val_accuracy: 0.6962
Epoch 3/80
127/127 [==============================] - 2500s 20s/step - loss: 0.4781 - accuracy: 0.7317 - val_loss: 0.4683 - val_accuracy: 0.7150
Epoch 4/80
127/127 [==============================] - 2821s 22s/step - loss: 0.4974 - accuracy: 0.7206 - val_loss: 0.4792 - val_accuracy: 0.6990
Epoch 5/80
127/127 [==============================] - 2913s 23s/step - loss: 0.4441 - accuracy: 0.7502 - val_loss: 0.5897 - val_accuracy: 0.6813
Epoch 6/80
127/127 [==============================] - 2686s 21s/step - loss: 0.4022 - accuracy: 0.7981 - val_loss: 0.5683 - val_accuracy: 0.7349
Epoch 7/80
127/127 [==============================] - 1842s 14s/step - loss: 0.3791 - accuracy: 0.8215 - val_loss: 0.5723 - val_accuracy: 0.7339
Epoch 8/80
127/127 [==============================] - 1863s 15s/step - loss: 0.4112 - accuracy: 0.8098 - val_loss: 0.4388 - val_accuracy: 0.7687
Epoch 9/80
127/127 [==============================] - 1826s 14s/step - loss: 0.3623 - accuracy: 0.8326 - val_loss: 0.4023 - val_accuracy: 0.8079
Epoch 10/80
127/127 [==============================] - 1775s 14s/step - loss: 0.3684 - accuracy: 0.8328 - val_loss: 0.4984 - val_accuracy: 0.7599
Epoch 11/80
127/127 [==============================] - 1732s 14s/step - loss: 0.3594 - accuracy: 0.8343 - val_loss: 0.3968 - val_accuracy: 0.8040
Epoch 12/80
127/127 [==============================] - 1885s 15s/step - loss: 0.3575 - accuracy: 0.8353 - val_loss: 0.3823 - val_accuracy: 0.8165
Epoch 13/80
127/127 [==============================] - 1778s 14s/step - loss: 0.3798 - accuracy: 0.8309 - val_loss: 0.4172 - val_accuracy: 0.7865
Epoch 14/80
127/127 [==============================] - 1787s 14s/step - loss: 0.3579 - accuracy: 0.8357 - val_loss: 0.4437 - val_accuracy: 0.7836
Epoch 15/80
127/127 [==============================] - 1783s 14s/step - loss: 0.3593 - accuracy: 0.8349 - val_loss: 0.4318 - val_accuracy: 0.7908
Epoch 16/80
127/127 [==============================] - 1820s 14s/step - loss: 0.3628 - accuracy: 0.8352 - val_loss: 0.4429 - val_accuracy: 0.7932
Epoch 17/80
127/127 [==============================] - 1851s 15s/step - loss: 0.3638 - accuracy: 0.8316 - val_loss: 0.5143 - val_accuracy: 0.7566
Epoch 18/80
127/127 [==============================] - 1739s 14s/step - loss: 0.3588 - accuracy: 0.8387 - val_loss: 0.4449 - val_accuracy: 0.7921
Epoch 19/80
127/127 [==============================] - 1731s 14s/step - loss: 0.3451 - accuracy: 0.8453 - val_loss: 0.3911 - val_accuracy: 0.8140
Epoch 20/80
127/127 [==============================] - 1713s 13s/step - loss: 0.3433 - accuracy: 0.8457 - val_loss: 0.3775 - val_accuracy: 0.8133
Epoch 21/80
127/127 [==============================] - 1711s 13s/step - loss: 0.3511 - accuracy: 0.8379 - val_loss: 0.3933 - val_accuracy: 0.8041
Epoch 22/80
127/127 [==============================] - 1752s 14s/step - loss: 0.3576 - accuracy: 0.8352 - val_loss: 0.4296 - val_accuracy: 0.7856
Epoch 23/80
127/127 [==============================] - 1784s 14s/step - loss: 0.3418 - accuracy: 0.8474 - val_loss: 0.3992 - val_accuracy: 0.8033
Epoch 24/80
127/127 [==============================] - 1785s 14s/step - loss: 0.3529 - accuracy: 0.8387 - val_loss: 0.4965 - val_accuracy: 0.7749
Epoch 25/80
127/127 [==============================] - 1777s 14s/step - loss: 0.3538 - accuracy: 0.8416 - val_loss: 0.3995 - val_accuracy: 0.8099
Epoch 26/80
127/127 [==============================] - 1730s 14s/step - loss: 0.3484 - accuracy: 0.8424 - val_loss: 0.4101 - val_accuracy: 0.7927
Epoch 27/80
127/127 [==============================] - 1717s 14s/step - loss: 0.3558 - accuracy: 0.8314 - val_loss: 0.3730 - val_accuracy: 0.8214
Epoch 28/80
127/127 [==============================] - 1747s 14s/step - loss: 0.3499 - accuracy: 0.8434 - val_loss: 0.3643 - val_accuracy: 0.8161
Epoch 29/80
127/127 [==============================] - 1877s 15s/step - loss: 0.3415 - accuracy: 0.8490 - val_loss: 0.3824 - val_accuracy: 0.8137
Epoch 30/80
127/127 [==============================] - 1821s 14s/step - loss: 0.3400 - accuracy: 0.8457 - val_loss: 0.3709 - val_accuracy: 0.8315
Epoch 31/80
127/127 [==============================] - 1737s 14s/step - loss: 0.3515 - accuracy: 0.8454 - val_loss: 0.4071 - val_accuracy: 0.8137
Epoch 32/80
127/127 [==============================] - 1820s 14s/step - loss: 0.3351 - accuracy: 0.8560 - val_loss: 0.4203 - val_accuracy: 0.7917
Epoch 33/80
127/127 [==============================] - 1858s 15s/step - loss: 0.3325 - accuracy: 0.8499 - val_loss: 0.4276 - val_accuracy: 0.8051
Epoch 34/80
127/127 [==============================] - 1910s 15s/step - loss: 0.3417 - accuracy: 0.8459 - val_loss: 0.3974 - val_accuracy: 0.8107
Epoch 35/80
127/127 [==============================] - 1868s 15s/step - loss: 0.3600 - accuracy: 0.8369 - val_loss: 0.4159 - val_accuracy: 0.7987
Epoch 36/80
127/127 [==============================] - 1776s 14s/step - loss: 0.3383 - accuracy: 0.8521 - val_loss: 0.4221 - val_accuracy: 0.7947
Epoch 37/80
127/127 [==============================] - 1860s 15s/step - loss: 0.3395 - accuracy: 0.8489 - val_loss: 0.4120 - val_accuracy: 0.8166
Epoch 38/80
127/127 [==============================] - 1771s 14s/step - loss: 0.3408 - accuracy: 0.8498 - val_loss: 0.5695 - val_accuracy: 0.7638
Epoch 39/80
127/127 [==============================] - 1949s 15s/step - loss: 0.3400 - accuracy: 0.8495 - val_loss: 0.4302 - val_accuracy: 0.8057
Epoch 40/80
127/127 [==============================] - 1864s 15s/step - loss: 0.3274 - accuracy: 0.8510 - val_loss: 0.3886 - val_accuracy: 0.8206
Epoch 41/80
127/127 [==============================] - 1714s 13s/step - loss: 0.3239 - accuracy: 0.8562 - val_loss: 0.6162 - val_accuracy: 0.7659
Epoch 42/80
127/127 [==============================] - 1725s 14s/step - loss: 0.3435 - accuracy: 0.8519 - val_loss: 0.4203 - val_accuracy: 0.8075
Epoch 43/80
127/127 [==============================] - 1788s 14s/step - loss: 0.3368 - accuracy: 0.8480 - val_loss: 0.5772 - val_accuracy: 0.7765
Epoch 44/80
127/127 [==============================] - 1765s 14s/step - loss: 0.3230 - accuracy: 0.8628 - val_loss: 0.4734 - val_accuracy: 0.7877
Epoch 45/80
127/127 [==============================] - 2543s 20s/step - loss: 0.3224 - accuracy: 0.8593 - val_loss: 0.4336 - val_accuracy: 0.8109
Epoch 46/80
 93/127 [====================>.........] - ETA: 8:09 - loss: 0.3479 - accuracy: 0.8394

127/127 [==============================] - 1852s 15s/step - loss: 0.3389 - accuracy: 0.8464 - val_loss: 0.4326 - val_accuracy: 0.7916
Epoch 47/80
127/127 [==============================] - 1814s 14s/step - loss: 0.3357 - accuracy: 0.8483 - val_loss: 0.4237 - val_accuracy: 0.8116
Epoch 48/80
127/127 [==============================] - 1813s 14s/step - loss: 0.3233 - accuracy: 0.8582 - val_loss: 0.4014 - val_accuracy: 0.8166
Epoch 49/80
127/127 [==============================] - 1931s 15s/step - loss: 0.3161 - accuracy: 0.8610 - val_loss: 0.4627 - val_accuracy: 0.8236
Epoch 50/80
127/127 [==============================] - 1778s 14s/step - loss: 0.3293 - accuracy: 0.8584 - val_loss: 0.4276 - val_accuracy: 0.8009
Epoch 51/80
115/127 [==========================>...] - ETA: 2:41 - loss: 0.3182 - accuracy: 0.8590 
127/127 [==============================] - 1761s 14s/step - loss: 0.3103 - accuracy: 0.8638 - val_loss: 0.4599 - val_accuracy: 0.8145
Epoch 52/80
127/127 [==============================] - 1722s 14s/step - loss: 0.3310 - accuracy: 0.8556 - val_loss: 0.3952 - val_accuracy: 0.8159
Epoch 53/80
127/127 [==============================] - 1742s 14s/step - loss: 0.3282 - accuracy: 0.8522 - val_loss: 0.5324 - val_accuracy: 0.7971
Epoch 54/80
127/127 [==============================] - 1945s 15s/step - loss: 0.3129 - accuracy: 0.8654 - val_loss: 0.4323 - val_accuracy: 0.8180
Epoch 55/80
127/127 [==============================] - 1813s 14s/step - loss: 0.3499 - accuracy: 0.8371 - val_loss: 0.6181 - val_accuracy: 0.8074
Epoch 56/80
127/127 [==============================] - 1802s 14s/step - loss: 0.3443 - accuracy: 0.8533 - val_loss: 0.4440 - val_accuracy: 0.8217
Epoch 57/80
127/127 [==============================] - 1773s 14s/step - loss: 0.3082 - accuracy: 0.8678 - val_loss: 0.7200 - val_accuracy: 0.7910
Epoch 58/80
127/127 [==============================] - 1738s 14s/step - loss: 0.3212 - accuracy: 0.8593 - val_loss: 0.3792 - val_accuracy: 0.8478
Epoch 59/80
127/127 [==============================] - 1834s 14s/step - loss: 0.3004 - accuracy: 0.8714 - val_loss: 0.4644 - val_accuracy: 0.8035
Epoch 60/80
127/127 [==============================] - 1866s 15s/step - loss: 0.3107 - accuracy: 0.8648 - val_loss: 0.4316 - val_accuracy: 0.8223
Epoch 61/80
127/127 [==============================] - 1699s 13s/step - loss: 0.3136 - accuracy: 0.8625 - val_loss: 0.4537 - val_accuracy: 0.8072
Epoch 62/80
127/127 [==============================] - 1687s 13s/step - loss: 0.3157 - accuracy: 0.8589 - val_loss: 0.3525 - val_accuracy: 0.8377
Epoch 63/80
127/127 [==============================] - 1735s 14s/step - loss: 0.3337 - accuracy: 0.8414 - val_loss: 0.4843 - val_accuracy: 0.8193
Epoch 64/80
127/127 [==============================] - 1710s 13s/step - loss: 0.3126 - accuracy: 0.8639 - val_loss: 0.3473 - val_accuracy: 0.8530
Epoch 65/80
127/127 [==============================] - 1762s 14s/step - loss: 0.3295 - accuracy: 0.8276 - val_loss: 0.4351 - val_accuracy: 0.8068
Epoch 66/80
127/127 [==============================] - 1752s 14s/step - loss: 0.2894 - accuracy: 0.8784 - val_loss: 0.3173 - val_accuracy: 0.8755
Epoch 67/80
127/127 [==============================] - 1710s 13s/step - loss: 0.2621 - accuracy: 0.8908 - val_loss: 0.3319 - val_accuracy: 0.8600
Epoch 68/80
127/127 [==============================] - 2041s 16s/step - loss: 0.2551 - accuracy: 0.8946 - val_loss: 0.3067 - val_accuracy: 0.8814
Epoch 69/80
127/127 [==============================] - 1863s 15s/step - loss: 0.2594 - accuracy: 0.8928 - val_loss: 0.4142 - val_accuracy: 0.8292
Epoch 70/80
127/127 [==============================] - 1818s 14s/step - loss: 0.2587 - accuracy: 0.8922 - val_loss: 0.2773 - val_accuracy: 0.8878
Epoch 71/80
127/127 [==============================] - 1911s 15s/step - loss: 0.2538 - accuracy: 0.8965 - val_loss: 0.2710 - val_accuracy: 0.8877
Epoch 72/80
127/127 [==============================] - 1785s 14s/step - loss: 0.2570 - accuracy: 0.8976 - val_loss: 0.2708 - val_accuracy: 0.8724
Epoch 73/80
127/127 [==============================] - 1856s 15s/step - loss: 0.2578 - accuracy: 0.8899 - val_loss: 0.5696 - val_accuracy: 0.8298
Epoch 74/80
127/127 [==============================] - 1810s 14s/step - loss: 0.2714 - accuracy: 0.8891 - val_loss: 0.3212 - val_accuracy: 0.8833
Epoch 75/80
127/127 [==============================] - 1798s 14s/step - loss: 0.2460 - accuracy: 0.8988 - val_loss: 0.2660 - val_accuracy: 0.8921
Epoch 76/80
127/127 [==============================] - 1727s 14s/step - loss: 0.2417 - accuracy: 0.8999 - val_loss: 0.2653 - val_accuracy: 0.8962
Epoch 77/80
127/127 [==============================] - 1826s 14s/step - loss: 0.2385 - accuracy: 0.9030 - val_loss: 0.2551 - val_accuracy: 0.8987
Epoch 78/80
127/127 [==============================] - 1877s 15s/step - loss: 0.2381 - accuracy: 0.9009 - val_loss: 0.2542 - val_accuracy: 0.8940
Epoch 79/80
127/127 [==============================] - 1976s 16s/step - loss: 0.2338 - accuracy: 0.9027 - val_loss: 0.2549 - val_accuracy: 0.8944
Epoch 80/80
127/127 [==============================] - 2040s 16s/step - loss: 0.2386 - accuracy: 0.9011 - val_loss: 0.2715 - val_accuracy: 0.8905
✅ 训练完成!
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_001.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_002.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_003.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_004.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_005.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_006.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_007.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_008.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_009.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_010.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_011.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_012.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_013.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_014.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_015.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_016.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_017.png - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_018.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_019.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_020.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_021.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_022.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_023.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_024.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_025.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_026.png - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_027.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_028.png - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_029.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_030.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_031.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_032.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_033.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_034.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_035.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_036.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_037.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_038.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_039.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_040.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_041.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_042.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_043.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_044.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_045.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_046.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_047.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_048.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_049.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_050.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_051.png - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_052.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_053.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_054.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_055.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_056.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_057.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_058.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_059.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_060.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_061.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_062.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_063.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_064.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_065.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_066.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_067.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_068.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_069.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_070.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_071.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_072.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_073.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_074.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_075.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_076.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_077.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_078.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_079.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_080.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_081.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_082.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_083.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_084.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_085.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_086.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_087.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_088.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_089.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_090.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_091.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_092.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_093.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_094.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_095.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_096.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_097.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_098.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_099.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_100.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_101.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_102.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_103.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_104.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_105.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_106.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_107.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_108.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_109.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_110.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_111.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_112.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_113.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_114.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_115.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_116.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_117.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_118.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_119.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_120.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_121.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_122.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_123.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_124.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_125.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_126.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_127.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_128.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_129.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_130.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_131.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_132.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_133.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_134.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_135.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_136.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_137.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_138.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_139.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_140.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_141.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_142.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_143.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_144.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_145.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_146.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_147.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_148.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_149.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_150.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_151.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_152.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_153.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_154.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_155.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_156.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_157.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_158.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_159.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_160.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_161.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_162.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_163.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_164.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_165.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_166.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_167.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_168.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_169.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_170.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_171.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_172.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_173.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_174.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_175.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_176.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_177.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_178.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_179.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_180.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_181.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_182.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_183.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_184.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_185.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_186.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_187.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_188.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_189.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_190.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_191.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_192.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_193.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_194.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_195.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_196.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_197.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_198.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_199.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_200.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_201.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_202.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_203.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_204.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_205.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_206.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_207.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_208.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_209.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_210.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_211.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_212.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_213.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_214.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_215.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_216.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_217.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_218.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_219.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_220.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_221.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_222.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_223.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_224.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_225.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_226.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_227.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_228.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_229.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_230.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_231.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_232.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_233.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_234.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_235.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_236.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_237.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_238.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_239.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_240.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_241.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_242.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_243.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_244.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_245.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_246.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_247.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_248.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_249.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_250.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_251.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_252.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_253.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_254.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_255.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_256.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_257.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_258.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_259.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_260.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_261.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_262.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_263.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_264.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_265.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_266.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_267.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_268.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_269.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_270.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_271.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_272.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_273.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_274.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_275.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_276.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_277.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_278.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_279.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_280.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_281.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_282.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_283.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_284.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_285.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_286.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_287.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_288.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_289.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_290.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_291.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_292.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_293.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_294.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_295.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_296.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_297.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_298.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_299.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_300.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_301.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_302.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_303.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_304.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_305.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_306.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_307.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_308.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_309.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_310.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_311.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_312.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_313.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_314.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_315.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_316.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_317.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_318.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_319.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_320.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_321.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_322.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_323.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_324.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_325.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_326.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_327.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_328.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_329.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_330.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_331.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_332.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_333.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_334.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_335.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_336.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_337.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_338.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_339.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_340.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_341.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_342.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_343.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_344.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_345.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_346.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_347.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_348.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_349.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_350.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_351.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_352.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_353.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_354.png - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_355.jpg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_356.jpeg - Cannot interpret 'tf.float32' as a data type
❌ 预测失败: H:\MineralDataset\Dataset_DolomiteLimestoneShale\Images\Basalt_357.jpg - Cannot interpret 'tf.float32' as a data type
✅ 预测完成!
📦 结果已打包: H:\MineralDataset\Dataset_DolomiteLimestoneShale\mudstone_masks.zip

进程已结束,退出代码为 0

【预测失败了,唉,我还是labelme手动标注数据集的标签吧】

posted on 2025-12-15 09:47  风居住的街道DYL  阅读(11)  评论(0)    收藏  举报