MobileNet实战:tensorflow2

3、 加载图片


处理图像的步骤:

  1. 读取图像

  2. 用指定的大小去resize图像。

  3. 将图像转为数组

  4. 图像归一化

  5. 标签onehot

具体做法详见代码:

def loadImageData():

imageList = []

listClasses = os.listdir(datapath)# 类别文件夹

print(listClasses)

for class_name in listClasses:

label_id = dicClass[class_name]

class_path=os.path.join(datapath,class_name)

image_names=os.listdir(class_path)

for image_name in image_names:

image_full_path = os.path.join(class_path, image_name)

labelList.append(label_id)

image = cv2.imdecode(np.fromfile(image_full_path, dtype=np.uint8), -1)

image = cv2.resize(image, (norm_size, norm_size), interpolation=cv2.INTER_LANCZOS4)

if image.shape[2] >3:

image=image[:,:,:3]

print(image.shape)

image = img_to_array(image)

imageList.append(image)

imageList = np.array(imageList) / 255.0

return imageList

print(“开始加载数据”)

imageArr = loadImageData()

print(type(imageArr))

labelList = np.array(labelList)

print(“加载数据完成”)

print(labelList)

labelList = np_utils.to_categorical(labelList, classnum)

print(labelList)

做好数据之后,我们需要切分训练集和测试集,一般按照4:1或者7:3的比例来切分。切分数据集使用train_test_split()方法,需要导入from sklearn.model_selection import train_test_split 包。例:

trainX, valX, trainY, valY = train_test_split(imageArr, labelList, test_size=0.2, random_state=42)

4、图像增强


ImageDataGenerator()是keras.preprocessing.image模块中的图片生成器,同时也可以在batch中对数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等。

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,samplewise_center

=False, featurewise_std_normalization=False, samplewise_std_normalization=False,zca_whitening=False,

zca_epsilon=1e-06, rotation_range=0.0, width_shift_range=0.0, height_shift_range=0.0,brightness_range=None, shear_range=0.0, zoom_range=0.0,channel_shift_range=0.0, fill_mode=‘nearest’, cval=0.0, horizontal_flip=False, vertical_flip=False, rescale=None, preprocessing_function=None,data_format=None,validation_split=0.0)

参数:

  • featurewise_center: Boolean. 对输入的图片每个通道减去每个通道对应均值。
  • samplewise_center: Boolan. 每张图片减去样本均值, 使得每个样本均值为0。
  • featurewise_std_normalization(): Boolean()
  • samplewise_std_normalization(): Boolean()
  • zca_epsilon(): Default 12-6
  • zca_whitening: Boolean. 去除样本之间的相关性
  • rotation_range(): 旋转范围
  • width_shift_range(): 水平平移范围
  • height_shift_range(): 垂直平移范围
  • shear_range(): float, 透视变换的范围
  • zoom_range(): 缩放范围
  • fill_mode: 填充模式, constant, nearest, reflect
  • cval: fill_mode == 'constant’的时候填充值
  • horizontal_flip(): 水平反转
  • vertical_flip(): 垂直翻转
  • preprocessing_function(): user提供的处理函数
  • data_format(): channels_first或者channels_last
  • validation_split(): 多少数据用于验证集

本例使用的图像增强代码如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(

rotation_range=20,

width_shift_range=0.2,

height_shift_range=0.2,

horizontal_flip=True)

val_datagen = ImageDataGenerator() # 验证集不做图片增强

training_generator_mix = MixupGenerator(trainX, trainY, batch_size=batch_size, alpha=0.2, datagen=train_datagen)()

val_generator = val_datagen.flow(valX, valY, batch_size=batch_size, shuffle=True)

5、 保留最好的模型和动态设置学习率


ModelCheckpoint:用来保存成绩最好的模型。

语法如下:

keras.callbacks.ModelCheckpoint(filepath, monitor=‘val_loss’, verbose=0, save_best_only=False, save_weights_only=False, mode=‘auto’, period=1)

该回调函数将在每个epoch后保存模型到filepath

filepath可以是格式化的字符串,里面的占位符将会被epoch值和传入on_epoch_end的logs关键字所填入

例如,filepath若为weights.{epoch:02d-{val_loss:.2f}}.hdf5,则会生成对应epoch和验证集loss的多个文件。

参数

  • filename:字符串,保存模型的路径
  • monitor:需要监视的值
  • verbose:信息展示模式,0或1
  • save_best_only:当设置为True时,将只保存在验证集上性能最好的模型
  • mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。
  • save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
  • period:CheckPoint之间的间隔的epoch数

ReduceLROnPlateau:当评价指标不在提升时,减少学习率,语法如下:

keras.callbacks.ReduceLROnPlateau(monitor=‘val_loss’, factor=0.1, patience=10, verbose=0, mode=‘auto’, epsilon=0.0001, cooldown=0, min_lr=0)

当学习停滞时,减少2倍或10倍的学习率常常能获得较好的效果。该回调函数检测指标的情况,如果在patience个epoch中看不到模型性能提升,则减少学习率

参数

  • monitor:被监测的量
  • factor:每次减少学习率的因子,学习率将以lr = lr*factor的形式被减少
  • patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发
  • mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值触发学习率减少。在max模式下,当检测值不再上升则触发学习率减少。
  • epsilon:阈值,用来确定是否进入检测值的“平原区”
  • cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作
  • min_lr:学习率的下限

本例代码如下:

checkpointer = ModelCheckpoint(filepath=‘best_model.hdf5’,

monitor=‘val_accuracy’, verbose=1, save_best_only=True, mode=‘max’)

reduce = ReduceLROnPlateau(monitor=‘val_accuracy’, patience=10,

verbose=1,

factor=0.5,

min_lr=1e-6)

6、建立模型并训练


model = Sequential()

model.add(MobileNet(include_top=False, pooling=‘avg’, weights=‘imagenet’))

model.add(Dense(classnum, activation=‘softmax’))

model.summary()

optimizer = Adam(learning_rate=INIT_LR)

model.compile(optimizer=optimizer, loss=‘categorical_crossentropy’, metrics=[‘accuracy’])

history = model.fit(training_generator_mix,

steps_per_epoch=trainX.shape[0] / batch_size,

validation_data=val_generator,

epochs=EPOCHS,

validation_steps=valX.shape[0] / batch_size,

callbacks=[checkpointer, reduce])

model.save(‘my_model.h5’)

print(history)

运行结果:

随着训练次数的增加,准确率已经过达到了0.97。

image-20220126142929491

7、保留训练结果,并将其生成图片


loss_trend_graph_path = r"WW_loss.jpg"

acc_trend_graph_path = r"WW_acc.jpg"

import matplotlib.pyplot as plt

print(“Now,we start drawing the loss and acc trends graph…”)

summarize history for accuracy

fig = plt.figure(1)

plt.plot(history.history[“accuracy”])

plt.plot(history.history[“val_accuracy”])

plt.title(“Model accuracy”)

plt.ylabel(“accuracy”)

plt.xlabel(“epoch”)

plt.legend([“train”, “test”], loc=“upper left”)

plt.savefig(acc_trend_graph_path)

plt.close(1)

summarize history for loss

fig = plt.figure(2)

plt.plot(history.history[“loss”])

plt.plot(history.history[“val_loss”])

plt.title(“Model loss”)

plt.ylabel(“loss”)

plt.xlabel(“epoch”)

plt.legend([“train”, “test”], loc=“upper left”)

plt.savefig(loss_trend_graph_path)

plt.close(2)

print(“We are done, everything seems OK…”)

#windows系统设置10关机

#os.system(“shutdown -s -t 10”)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试部分

===============================================================

单张图片预测


1、导入依赖

import cv2

import numpy as np

from tensorflow.keras.preprocessing.image import img_to_array

from tensorflow.keras.models import load_model

import time

2、设置全局参数

这里注意,字典的顺序和训练时的顺序保持一致

norm_size=224

imagelist=[]

emotion_labels = {

0: ‘Black-grass’,

1: ‘Charlock’,

2: ‘Cleavers’,

3: ‘Common Chickweed’,

4: ‘Common wheat’,

5: ‘Fat Hen’,

6: ‘Loose Silky-bent’,

7: ‘Maize’,

8: ‘Scentless Mayweed’,

9: ‘Shepherds Purse’,

10: ‘Small-flowered Cranesbill’,

11: ‘Sugar beet’,

}

3、加载模型

emotion_classifier=load_model(“best_model.hdf5”)

t1=time.time()

4、处理图片

处理图片的逻辑和训练集也类似,步骤:

  • 读取图片

  • 将图片resize为norm_size×norm_size大小。

  • 将图片转为数组。

  • 放到imagelist中。

  • imagelist整体除以255,把数值缩放到0到1之间。

image = cv2.imdecode(np.fromfile(‘data/test/0a64e3e6c.png’, dtype=np.uint8), -1)

load the image, pre-process it, and store it in the data list

image = cv2.resize(image, (norm_size, norm_size), interpolation=cv2.INTER_LANCZOS4)

image = img_to_array(image)

imagelist.append(image)

imageList = np.array(imagelist, dtype=“float”) / 255.0

5、预测类别

预测类别,并获取最高类别的index。

out=emotion_classifier.predict(imageList)

print(out)

pre=np.argmax(out)

emotion = emotion_labels[pre]

t2=time.time()

print(emotion)

t3=t2-t1

print(t3)

运行结果:

[[1.7556800e-03 8.5450716e-07 1.9150861e-05 1.9705877e-07 9.9732012e-01

8.0649025e-04 2.5912817e-07 2.2540871e-06 8.6973196e-05 6.1359890e-07

4.1976641e-08 7.3218480e-06]]

Common wheat

3.50178861618042

批量预测


批量预测和单张预测的差别主要在读取数据上,以及预测完成后,对预测类别的处理。其他的没有变化。

步骤:

  • 加载模型。

  • 定义测试集的目录

  • 获取目录下的图片

  • 循环循环图片

  • 读取图片

  • resize图片

  • 转数组

  • 放到imageList中
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-e0otnou0-1713599005714)]

[外链图片转存中…(img-vnzNdU5O-1713599005714)]

[外链图片转存中…(img-BQs3nttu-1713599005715)]

[外链图片转存中…(img-lNdCYa27-1713599005716)]

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mobilenet-V3 is a convolutional neural network architecture that is designed for efficient mobile and embedded vision applications. It is an extension of the Mobilenet-V2 architecture, with improvements in terms of accuracy, efficiency, and flexibility. To use Mobilenet-V3 in TensorFlow, you can either build the network from scratch or utilize pre-trained models provided by TensorFlow. The pre-trained models are available in different sizes and variations, such as small, large, and search-space options. To get started with Mobilenet-V3 in TensorFlow, you can follow these steps: 1. Install TensorFlow: Make sure you have TensorFlow installed on your system. You can use pip to install it: `pip install tensorflow`. 2. Load the Mobilenet-V3 model: If you want to use a pre-trained model, you can use the `tf.keras.applications` module to load it. For example, to load the small variant of Mobilenet-V3, you can use: ```python import tensorflow as tf model = tf.keras.applications.MobileNetV3Small() ``` 3. Preprocess your input data: Before feeding your data into the network, you may need to preprocess it according to the requirements of Mobilenet-V3. This typically involves resizing the images and normalizing the pixel values. 4. Run inference: Once you have loaded the model and preprocessed your data, you can run inference to obtain predictions. Pass your input data through the model and interpret the output based on your task (e.g., classification, object detection, etc.). Note that this is just a brief overview of how to use Mobilenet-V3 in TensorFlow. Depending on your specific requirements and use case, you may need to customize the architecture or fine-tune the pre-trained models. It's recommended to consult the TensorFlow documentation and resources for more detailed instructions and examples.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值