ComputerVision:图片分类01

目标: 实现图片分类

input: 一组图片数据 (x,y)
output:预测一组新图片(给定x)的y值

工具

要实现这个目标,需要工具(概念+思路)。

思路

1.数据读取,
2.建立模型,
3.预测
所以我们需要3个.py文件:

model.py:用来编写我们设计的模型。【这样我们可以根据预测效果来调整模型/更换模型】

train.py:用来读取图片数据/训练模型/验证模型(定超参数)/输出训练后的模型参数以及相关参数(图片标签编码数据)。

predict.py:用来读取待预测的图片数据/数据预处理/加载训练后的模型/预测图片标签值。

建议使用命令行操作,具体优点参见该国外大牛的网站:https://www.pyimagesearch.com/。

概念

0.参数解析

由于你需要在将本地图片数据加载到程序中,所以在通过命令行运行.py脚本的时候,你得传入相关参数,告知你要去哪里调用你的图片文件。
例如:我下载了kaggle比赛数据(植物幼苗图片分类:Plant Seedlings Classification)

编写train.py文件

#配置参数
import argparse
import os
from imutils import paths
ap = argparse.ArgumentParser()
ap.add_argument('-d','--dataset',required=True,help='path to input dataset of images')
args = vars(ap.parse_args())
imagePaths = sorted(list(paths.list_images(args['dataset'])))   

运行如下命令,即可完成图片文件路径加载:

python train.py --dataset /data_plantseed/train 

1.图片

读取:image = cv2.imread(imagePath)    #opencv
格式:image.shape    #eg:(1365, 2048, 3),(高度,宽度,通道数)
尺寸转化:image = cv2.resize(image,(28,28))   #压缩图片高度和宽度
标签编码:
lb = LabelBinarizer()
trainlabels = lb.fit_transform(trainlabels)
testlabels = lb.transform(testlabels)

由于实际处理数据中,不像MNIST数据集可以直接通过tensorflow.keras.datasets导入,需要自己完成数据导入。所有在处理图片数据的时候,需要借助两个工具:from imutils import paths 和 import os 。

imagePaths = sorted(list(paths.list_images(args['dataset'])))
random.seed(42)
random.shuffle(imagePaths)
data = []
labels = []
for imagePath in imagePaths:
    image = cv2.imread(imagePath)
    image = cv2.resize(image,(28,28))
    data.append(image)
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)
data = np.array(data,dtype='float')/255.0
labels = np.array(labels)

将所有图片加载到tensor中,可以再进行scale,从而得到符合入模型的预处理数据。紧接着可以进行数据集划分(train,validation)
2.

参考来源:

https://www.pyimagesearch.com/

posted @ 2021-01-02 15:26  hardland  阅读(62)  评论(0)    收藏  举报