树莓派4:跑通Tensorflow的Sequential模型用于图片分类

news2024/12/28 18:59:31

重要提示:由于树莓派相对孱弱的性能,直接在其上训练模型可能花(lang4)费非常长的时间。本文仅作为示例性的可行性参考,请酌情考虑实验平台。

著名的Tensorflow框架也可以运行在树莓派上。理论还没吃透,但使用Sequential模型体验图片分类的代码已经可以跑通。以下就是一个不求甚解版的笔记:

首先安装Tensorflow:

sudo apt install libatlas-base-dev
python3 -m pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip install tensorflow-io -i https://pypi.tuna.tsinghua.edu.cn/simple

然后,预先准备好Demo中用到的花卉分类图片包(当然也可以在代码运行过程中现下,只是我个人不太推荐):
 

cd
wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz

然后就可以写python代码了。首先是制作训练并制作模型的代码(出于快速体验以及纯ssh可操作的目的已略去了所有训练过程的可视化评估的代码。具体可参见文末的参考资料):

# import all libs
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf
import pathlib

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential

# here is the pre-downloaded demo package
dataset_url = "file:///home/ki/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)

image_count = len(list(data_dir.glob('*/*.jpg')))
print("Total Files: " + str(image_count))


# Training split
train_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(180, 180),
    batch_size=32)

# Testing or Validation split
val_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(180,180),
    batch_size=32)

# Print class names
class_names = train_ds.class_names
print(class_names)


# Create model
num_classes = len(class_names)
model = Sequential([
    layers.Rescaling(1./255, input_shape=(180,180, 3)),
    layers.Conv2D(16, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(64, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(num_classes)
])

# Compiling the model
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(
                  from_logits=True),
              metrics=['accuracy'])
model.summary()

# learn patterns by providing training and test/validation dataset
epochs=9
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

# save the model
model.save(r'/home/ki/flowers.hd5')

因为我的树莓派账号是ki,所以凡是涉及/home/ki的路径都要改为你自己的home目录。另外model.fit过程我这边的代码迭代了9次,这将非常非常耗时,但后面使用自定义图片做预测时正确率可以非常高。

以下是使用自定义图片做分类预测的代码:

import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential

"""flower_photo/
  daisy/
  dandelion/
  roses/
  sunflowers/
  tulips/"""
import pathlib

batch_size = 32
img_height = 180
img_width = 180

"""
dataset_url = "file:///home/ki/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)
class_names = train_ds.class_names
print(class_names)
"""

class_names = ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']

# Load Saved Model
pre_model = tf.keras.models.load_model("/home/ki/flowers.hd5")

sunflower_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/592px-Red_sunflower.jpg"
sunflower_path = tf.keras.utils.get_file('Red_sunflower', origin=sunflower_url)

img = keras.preprocessing.image.load_img(
    sunflower_path, target_size=(img_height, img_width)
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0)  # Create a batch

predictions = pre_model.predict(img_array)
score = tf.nn.softmax(predictions[0])
print(score)

print(
    "This image most likely belongs to {} with a {:.2f} percent confidence."
        .format(class_names[np.argmax(score)], 100 * np.max(score))
)

同样要注意根据你的实际情况修改模型保存路径。class_names的内容及次序要严格按照之前训练时获得的。如果不确定,可以将上面那段注释的语句释放看看打印的内容。

我这边的识别结果:model.fit迭代数为3的时候识别出玫瑰(错误),而迭代数为9时,识别为向日葵/太阳花(正确)。

 参考资料:
Image Recognition using TensorFlow - GeeksforGeeks

Tensorflow---Tensorflow的五种保存模型的方式介绍_tensorflow保存模型_水哥很水的博客-CSDN博客


【Tensorflow】使用Tensorflow自定义模型和训练_tensorflow导入自定义模型_沐兮Krystal的博客-CSDN博客

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

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

相关文章

【量化交易笔记】5.SMA,EMA 和WMA区别

股票中的SMA,EMA和WMA是常用的技术分析指标。这些指标基于历史股价计算得出,可以帮助投资者了解股票的趋势,为决策提供依据。虽然它们都是平均值算法,但它们之间还是有一些区别的。 SMA 简单移动平均线(Simple Moving…

参与辅助服务的用户侧储能优化配置及经济分析(matlab代码)

目录 1 主要内容 目标函数 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序方法复现《参与辅助服务的用户侧储能优化配置及经济分析》,首先, 建立了用户侧储能的全生命周期成本和考虑辅助服务的收益模型;其次,在两部…

一文读懂UML用例图

一、概述 用例是描述系统需求的一种手段,即系统应该做什么。用例图由参与者、用例和主题组成。每个用例的主题都代表了一个用例所适用的系统。用户和任何其他可以与主体交互的系统都被表示为行动者。 用例是一种行为规范。用例的实例指的是紧急行为的发生符合相应…

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

🏜哈喽,大家好,我是小浪。前段时间羊了个羊火遍了大江南北,大家是否都通过第二关了呢?哈哈,没关系,既然通不过,那咋们不如自己来做一个这样的羊了个羊的仿写页面,学会了赶…

文本中的关键词提取方法

目录 1. TF-IDF(Term Frequency-Inverse Document Frequency)算法: 2. TextRank算法: 3. LDA(Latent Dirichlet Allocation)算法: 4. RAKE(Rapid Automatic Keyword Extraction&…

基于SLM调制器,MIT研发高效率全息显示方案

此前,青亭网曾报道过NVIDIA、三星、剑桥大学等对空间光调制器(SLM)全息方案的探索。空间光调制器可调节光波的空间分布,在电驱动信号控制下,可改变光在空间中传播的振幅、强度、相位、偏振态等特性,从而形成…

MySQL性能优化之(explain)工具

慢SQL的定位 在MySQL当中,我们有时候写的SQL执行效率太慢此时我们需要将其优化。但是SQL可能非常的多,难道我们一条一条的进行查看吗?在MySQL当当中我们可以查看慢查询日志,看看那些SQL这么慢。但是这个默认情况下这个慢查询日志…

sqoop使用

sqoop使用 1. 导入数据2. 从mysql向hive导入数据2.1 导入用户信息表 2.导入订单表2.2 导入订单表2.3 导入商品信息表2.4 导入国家信息表2.5 导入省份信息表2.6 导入城市信息表2.7 创建hive临时表文件 在使用sqoop之前,需要提前启动hadoop, yarn和对应的数据库mysql …

当音乐遇上Python:用Pydub自动分割音频

🎵 🎵 🎵 当音乐遇上Python:用Pydub自动分割音频 随着短视频应用的普及,越来越多人开始了解并尝试制作自己的短视频作品。而在制作短视频时,背景音乐的选择和使用也是非常重要的一步。很多人喜欢选择一首长…

倒立摆控制器的设计(分别用极点配置,LQR方法,Robust H-无穷方法)

G01倒立摆控制器设计 Author:DargonNote date:2020/12/13课程用书:LMIs in Control Systems Analysis,Design and Applications 1,倒立摆控制系统简介 倒立摆系统是一个复杂的控制系统,具有非线性、强耦合、多变量、不稳定等特…

干货 | 正念,寻求属于你的存在之道

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 你是否也曾感到内心无法平静?如果是,不妨了解一下正念,它或许能为你带来改变。 正念作为一种古老的修行方式,如今已经在世界范围内广为流传,…

《Netty》从零开始学netty源码(四十九)之PoolArena

目录 PoolArenaallocate()创建newByteBuf()分配具体的内存空间allocate() PoolArena Netty中分配内存是委托给PoolArena来管理的,它主要有两个实现类: 默认情况下使用的DirectArena,它的数据结构如下: 从属性中我们看到PoolA…

人生若只如初见,你不来看看Django吗

前言 本文介绍python三大主流web框架之一的Django框架的基本使用,如何创建django项目,如何运行django项目以及django项目的目录结构,另外django又是如何返回不同的数据和页面? python三大主流web框架 Python有三大主流的web框架…

JS手写实现Promise.all

Promise.all() 方法接收一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。该 Promise 对象在所有的 Promise 对象都成功时才会成功,其中一个 Promise 对象失败时,则该 Promise 对象立即失败。 本篇博客将手写实现 Promise.all() 方…

用于scATAC-seq有监督分类的Cellcano

细胞类型识别是单细胞数据分析的基本步骤。由于高质量参考数据集的可用性,有监督细胞分类方法在scRNA-seq数据中很受欢迎。染色质可及性分析(scATAC-seq)的最新技术进步为理解表观遗传异质性带来了新的见解。随着scATAC-seq数据集的不断积累&…

第二节课 Linux和shell命令之文件管理与常用命令

命令执行,没有图形页面 文件权限是重点 1.目录树 windous分盘 CDEF 在Linux系统中并不存在C/D/E/F等盘符,Linux系统中的一切文件都是 从“根(/)”目录开始的,并按照文件系统层次化标准(Filesystem Hie…

C++:计算机操作系统:多线程:高并发中的线程

高并发中的线程 一切要从CPU说起PC 程序计数器从CPU到操作系统从进程到线程 从这篇开始,我将会开启高性能,高并发系列,本篇是给系列的开篇,主要关注 多线程以及线程池。 一切要从CPU说起 你可能会有疑问,讲多线程为何…

西门子AmeSim车辆仿真软件在新能源汽车开发中的应用-软件AmeSim2021版分享

利用Simcenter Amesim提高系统仿真产品设计效率,Simcenter Amesim是一个全球领先的集成、可扩展的机、电、液系统仿真平台。它允许设计工程师虚拟评估和优化系统性能。 提高系统仿真效率 Simcenter Amesim是一个领先的集成、可扩展的系统仿真平台,允许…