MobileNet实战:tensorflow2,花2万块买的教程

│ ├─test

│ └─train

│ ├─Black-grass

│ ├─Charlock

│ ├─Cleavers

│ ├─Common Chickweed

│ ├─Common wheat

│ ├─Fat Hen

│ ├─Loose Silky-bent

│ ├─Maize

│ ├─Scentless Mayweed

│ ├─Shepherds Purse

│ ├─Small-flowered Cranesbill

│ └─Sugar beet

├─train.py

├─test1.py

└─test.py

训练

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

新建train.py

第一步 导入需要的数据包,设置全局参数


import numpy as np

from sklearn.metrics import classification_report

from tensorflow.keras.optimizers import Adam

import cv2

from tensorflow.keras.preprocessing.image import img_to_array

from sklearn.model_selection import train_test_split

from tensorflow.python.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau

from tensorflow.keras.applications import MobileNetV3Large

import os

from tensorflow.python.keras.layers import Dense

from tensorflow.python.keras.models import Sequential

import albumentations

norm_size = 224

datapath = ‘data/train’

EPOCHS = 100

INIT_LR = 1e-3

labelList = []

dicClass = {‘Black-grass’: 0, ‘Charlock’: 1, ‘Cleavers’: 2, ‘Common Chickweed’: 3, ‘Common wheat’: 4, ‘Fat Hen’: 5, ‘Loose Silky-bent’: 6,

‘Maize’: 7, ‘Scentless Mayweed’: 8, ‘Shepherds Purse’: 9, ‘Small-flowered Cranesbill’: 10, ‘Sugar beet’: 11}

classnum = 12

batch_size = 16

np.random.seed(42)

这里可以看出tensorflow2.0以上的版本集成了Keras,我们在使用的时候就不必单独安装Keras了,以前的代码升级到tensorflow2.0以上的版本将keras前面加上tensorflow即可。

tensorflow说完了,再说明一下几个重要的全局参数:

  • norm_size = 224, 设置输入图像的大小,MobileNetV3默认的图片尺寸是224×224。

  • datapath = ‘data/train’, 设置图片存放的路径,在这里要说明一下如果图片很多,一定不要放在工程目录下,否则Pycharm加载工程的时候会浏览所有的图片,很慢很慢。

  • EPOCHS = 100, epochs的数量,关于epoch的设置多少合适,这个问题很纠结,一般情况设置300足够了,如果感觉没有训练好,再载入模型训练。

  • INIT_LR = 1e-3, 学习率,一般情况从0.001开始逐渐降低,也别太小了到1e-6就可以了。

  • classnum = 12, 类别数量,数据集有两个类别,所有就分为两类。

  • batch_size =16, batchsize,根据硬件的情况和数据集的大小设置,太小了loss浮动太大,太大了收敛不好,根据经验来,一般设置为2的次方。windows可以通过任务管理器查看显存的占用情况。

image-20220126135414054

Ubuntu可以使用nvidia-smi查看显存的占用。

image-20220120064407104

  • 定义numpy.random的随机因子。这样就可以固定随机的index

第二步 加载图片


和以前做法不同的是,这里不再处理图片,而是只返回图片路径的list列表。

具体做法详见代码:

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)

imageList.append(image_full_path)

return imageList

print(“开始加载数据”)

imageArr = loadImageData()

labelList = np.array(labelList)

print(“加载数据完成”)

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)

第三步 图像增强


train_transform = albumentations.Compose([

albumentations.OneOf([

albumentations.RandomGamma(gamma_limit=(60, 120), p=0.9),

albumentations.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.9),

albumentations.CLAHE(clip_limit=4.0, tile_grid_size=(4, 4), p=0.9),

]),

albumentations.HorizontalFlip(p=0.5),

albumentations.ShiftScaleRotate(shift_limit=0.2, scale_limit=0.2, rotate_limit=20,

interpolation=cv2.INTER_LINEAR, border_mode=cv2.BORDER_CONSTANT, p=1),

albumentations.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_pixel_value=255.0, p=1.0)

])

val_transform = albumentations.Compose([

albumentations.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_pixel_value=255.0, p=1.0)

])

这个随意写的,具体的设置可以参考我以前写的文章:

图像增强库Albumentations使用总结_AI浩-CSDN博客_albumentations

写了两个数据增强,一个是用于训练,一个用于验证。验证集只需要对图片做归一化处理。

第四步 定义图像处理的方法


generator的主要作用是处理图像,并迭代的方式返回一个batch的图像以及对应的label。

思路:

获取list的长度。

计算迭代次数。

生成indexs列表。

如果是训练,则打乱顺序。

在while循环:

  • 循环迭代次数

  • 初始化input_samples和input_labels,连个list分别用来存放image和image对应的标签。

  • 获取本轮迭代的indexs。

  • 如果超过最大list的最大长度,则按照最大长度获取。

  • 循环得到的indexs

  • 分别从file_pathList和labels,得到图片的路径和对应的label

  • 读取图片,如果图片的维度超过了3维,取前3维度。

  • 如果是训练就训练的transform,如果不是就执行验证的transform。

  • resize图片

  • 将image转数组

  • 将图像和label分别放到input_samples和input_labels

  • 将list转numpy数组。

  • 返回一次迭代

def generator(file_pathList,labels,batch_size,train_action=False):

L = len(file_pathList)

num_minibatches = int(L/ batch_size)

indexs= list(range(L))

if train_action==True:

np.random.shuffle(indexs)

while True:

for i in range(num_minibatches+1):

input_labels = []

input_samples = []

image_indexs = indexs[i * batch_size:(i + 1) * batch_size]

if (i + 1) * batch_size>L:

image_indexs = indexs[i * batch_size:L]

for index in image_indexs:

X = file_pathList[index]

Y = labels[index]

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

if image.shape[2] > 3:

image = image[:, :, :3]

if train_action:

image = train_transform(image=image)[‘image’]

else:

image = val_transform(image=image)[‘image’]

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

image = img_to_array(image)

input_samples.append(image)

input_labels.append(Y)

batch_x = np.asarray(input_samples)

batch_y = np.asarray(input_labels)

yield (batch_x, batch_y)

第五步 保留最好的模型和动态设置学习率


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)

第六步 建立模型并训练


model = Sequential()

model.add(MobileNetV3Large(input_shape=(224,224,3),include_top=False, pooling=‘avg’, weights=‘imagenet’))

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

optimizer = Adam(learning_rate=INIT_LR)

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

history = model.fit(generator(trainX,trainY,batch_size,train_action=True),

steps_per_epoch=len(trainX) / batch_size,

validation_data=generator(valX,valY,batch_size,train_action=False),

epochs=EPOCHS,

validation_steps=len(valX) / batch_size,

callbacks=[checkpointer, reduce])

model.save(‘my_model.h5’)

print(history)

如果想指定classes,有两个条件:include_top:True, weights:None。否则无法指定classes。

所以指定classes就不能用预训练了,所以采用另一种方式:

model = Sequential()

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

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

这样既能使用预训练,又能指定classnum。

另外,在2.X版本中fit支持generator方式,所以直接使用fit。

运行结果:

image-20220206142346625

第七步 评估模型


predictions = model.predict_generator(generator(valX,valY,batch_size,train_action=False),steps=len(valX) / batch_size)

print(classification_report(valY,predictions.argmax(axis=1), target_names=dicClass.keys()))

运行结果:

image-20220206142202018

第八步 保留训练结果,并将其生成图片

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-MGeq4viB-1712981077348)]
[外链图片转存中…(img-EcwRCVZx-1712981077349)]
[外链图片转存中…(img-Zey8tk1n-1712981077349)]
[外链图片转存中…(img-2ItKZzk8-1712981077349)]
[外链图片转存中…(img-QXHMczK0-1712981077350)]

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

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

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-Lmae18Of-1712981077350)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

<think>嗯,用户之前问过OpenCV DNN是什么,现在接着问模型有没有预训练的,是不是基于图像训练的。首先,我需要确定用户的问题重点在哪里。看起来他们可能是在考虑使用OpenCV DNN模块,但不确定是否有现成的预训练模型可用,尤其是针对图像处理的。 用户的问题有两个部分:是否有预训练模型,以及这些模型是否是针对图像训练的。回答时需要明确这两点。先回想一下OpenCV DNN模块的功能,它主要是用来加载和运行预训练模型,而不是自己训练模型。所以OpenCV本身可能不提供预训练模型,但支持从其他框架导入,比如TensorFlow、Caffe等。这些框架有大量的预训练模型,像ResNet、MobileNet、YOLO等,都是基于图像训练的。 接下来要确认用户是否了解预训练模型的来源。可能用户误以为OpenCV自带模型,需要澄清这一点。然后需要解释常见的预训练模型类型,包括分类、检测、分割等,这些大部分都是基于图像的数据集训练的,比如ImageNet、COCO。 另外,用户可能关心如何获取和使用这些模型。需要给出例子,比如从官方仓库下载,或者使用OpenCV提供的脚本转换模型格式。还要提到OpenCV的示例中可能包含一些预训练模型,比如人脸检测的Caffe模型。 最后,需要补充模型的应用场景,确保用户明白这些预训练模型能用来做什么,以及是否适合他们的项目。可能用户有具体的应用需求,比如目标检测或图像分类,需要确认这些模型是否适用。 总结下来,回答的结构应该是:肯定有预训练模型,来源是其他框架,大部分基于图像训练,列举常见模型和数据集,说明如何获取和使用,并给出应用示例。同时,可能需要提醒用户注意模型格式转换和OpenCV DNN的局限性,比如不支持训练等。</think>--- ### **一、预训练模型的来源与类型** OpenCV DNN **本身不提供预训练模型**,但它支持加载其他深度学习框架(如 TensorFlow、PyTorch、Caffe 等)训练的模型。这些预训练模型多数是基于图像任务训练的,涵盖以下方向: #### **1. 常见预训练模型类型** | **任务类型** | **典型模型** | **训练数据集** | **应用场景** | |--------------------|----------------------------|----------------------|----------------------| | 图像分类 | ResNet、MobileNet、Inception | ImageNet | 物体识别、场景分类 | | 目标检测 | YOLO系列、SSD、Faster R-CNN | COCO、PASCAL VOC | 物体定位与计数 | | 语义分割 | DeepLab、UNet | Cityscapes、ADE20K | 图像像素级分割 | | 人脸检测 | OpenCV 自带 Haar Cascade | FDDB、LFW | 人脸识别与跟踪 | | 风格迁移 | VGG-based 模型 | 艺术风格数据集 | 图像风格化处理 | #### **2. 模型获取途径** - **官方仓库**: 从框架官方渠道下载(如 TensorFlow Model Zoo、PyTorch Hub、Darknet 官网)。 示例: ```bash # 下载 YOLOv4 预训练模型(Darknet 格式) wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights ``` - **OpenCV 示例模型**: OpenCV 的 `samples/dnn` 目录提供部分模型配置文件(如人脸检测的 `res10_300x300_ssd_iter_140000_fp16.caffemodel`)。 - **转换工具**: 使用 `tf2onnx`、`torch.onnx.export` 等工具将 PyTorch/TensorFlow 模型转为 ONNX 格式,再用 OpenCV 加载。 --- ### **二、是否基于图像训练?** **是的!** 绝大多数 OpenCV DNN 支持的预训练模型是**专为图像任务设计的**,例如: - **图像分类模型**:基于 ImageNet(1400 万张标注图像)训练。 - **目标检测模型**:基于 COCO(包含 80 类物体、33 万张图像)训练。 - **人脸识别模型**:基于 LFW(13,000 张人脸图像)或 MegaFace 数据集训练。 --- ### **三、如何快速验证模型是否适用图像任务?** 1. **查看模型输入要求** 检查模型的输入尺寸(如 224x224)、通道顺序(RGB/BGR)、归一化方式(如 `(像素值/255 - 0.5)/0.5`)。 ```python # 示例:使用 blobFromImage 预处理输入 blob = cv2.dnn.blobFromImage(img, scalefactor=1/255.0, size=(224,224), mean=(104, 117, 123)) ``` 2. **任务类型匹配** 确认模型输出格式是否符合需求(如检测模型输出边界框,分类模型输出概率向量)。 --- ### **四、实战示例:用 OpenCV DNN 加载 MobileNet 分类模型** ```python import cv2 # 1. 加载模型与配置文件 model = "mobilenet_v2.onnx" net = cv2.dnn.readNetFromONNX(model) # 2. 预处理图像 img = cv2.imread("cat.jpg") blob = cv2.dnn.blobFromImage(img, scalefactor=1/255.0, size=(224,224), swapRB=True) # 3. 推理并解析结果 net.setInput(blob) output = net.forward() predicted_class_id = output.argmax() # 取概率最大的类别索引 # 4. 输出结果(需配合类别标签文件) with open("imagenet_classes.txt") as f: labels = f.read().splitlines() print("预测结果:", labels[predicted_class_id]) ``` --- ### **五、注意事项** 1. **模型格式转换** 部分框架模型需转换为 OpenCV 兼容格式(如将 PyTorch 模型导出为 ONNX)。 2. **硬件兼容性** GPU 加速需配置 CUDA 和 cuDNN(如 `net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)`)。 3. **性能优化** 对小尺寸模型(如 MobileNet)可启用 FP16 推理提升速度: ```python net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA_FP16) ``` --- **总结**:OpenCV DNN 通过加载外部预训练模型(主要为图像任务训练)实现深度学习功能。开发者需根据需求选择合适模型,并注意预处理与后处理的适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值