利用的是opencv中的dnn模块进行调用的,之所以标题是对jpg的图片进行分类,主要的原因是我对bmp格式的图片分类还没有成功,成功之后再更新,
使用比较常用的花卉分类图片进行分类,因为只是为了实验,并没有对图片分类精度进行追求,代码中有许多问题,比如有很多没用的,也没有删掉,也只是对花进行了二分类
对这两种花进行二分类,daisy标签为0 dandelion为1
首先进行分类,分类使用python3.5+tensorflow-gpu1.4.0+ubuntu16.04
整个过程有3个py文件,input_data.py是对图片的读取处理
train_model.py是进行训练 t_model.py是在python中测试图片
input_data.py文件
import input_data
#from tensorflow.python.framework import graph_util
from skimage import io, transform
import glob
import os
import tensorflow as tf
import numpy as np
import time
NG_path='/home/dyf/PycharmProjects/classifer_flower/flower_photos/daisy/'
OK_path='/home/dyf/PycharmProjects/classifer_flower/flower_photos/dandelion/'
#读取图片
def _dense_to_one_hot(labels_dense, num_classes):
"""Convert class labels from scalars to one-hot vectors."""
num_labels = labels_dense.shape[0]
index_offset = np.arange(num_labels) * num_classes
labels_one_hot = np.zeros((num_labels, num_classes))
labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
return labels_one_hot
#读取图片
def read_img():
imgs = []
label = []
#for k in range(1,10):
#path1= os.path.join(os.path.abspath(NG_path), '1'+format(str(k)))
#path2=os.path.join(os.path.abspath(labels_path), 'NG'+format(str(k)+'.txt'))
piclist = os.listdir(NG_path)
for pic in piclist:
if pic.endswith(".jpg"):
old_path = os.path.join(os.path.abspath(NG_path), pic)
img=io.imread(old_path)
img=transform.resize(img,(500,500))
#print(img)
# img=img.reshape(100,100,3)
imgs.append(img)
label.append(0);
piclist = os.listdir(OK_path)
for pic in piclist:
if pic.endswith(".jpg"):
old_path = os.path.join(os.path.abspath(OK_path), pic)
img = io.imread(old_path)
img = transform.resize(img, (500, 500))
# img=img.reshape(100,100,3)
imgs.append(img)
label.append(1);
# for i in range(2180):
# new_path = os.path.join(os.path.abspath(OK_path), '1(' + format(str(i + 1)) + ').bmp')
#
# img = io.imread(new_path)
# img = transform.resize(img, (100, 100))
# #img=img.reshape(100, 100, 3)
# imgs.append(img)
# label.append(1);
# #labels.append(idx)
return np.asarray(imgs, np.float32), np.asarray(label, np.int32)
def train_test_split(ratio):
data, label = read_img()
#print(data.shape)
print(data.shape)
# data = np.array(data).reshape(-1, 200, 200,3);
# print(data.shape)
#打乱顺序
num_example=data.shape[0]
arr=np.arange(num_example)
np.random.shuffle(arr)
data=data[arr]
label=label[arr]
label=_dense_to_one_hot(label,2)
#将所有数据分为训练集和验证集
ratio=0.8
s=np.int(num_example*ratio)
x_train=data[:s]
y_train=label[:s]
x_test=data[s:]
y_test=label[s:]
return x_train,x_test,y_train,y_test
#定义一个函数,按批次取数据
def minibatches(inputs=None, targets=None, batch_size=None, shuffle=False):
assert len(inputs) == len(targets)
if shuffle:
indices = np.arange(len(inputs))
np.random.shuffle(indices)
for start_idx in range(0, len(inputs) - batch_size + 1, batch_size):
if shuffle:
excerpt = indices[start_idx:start_idx + batch_size]
else:
excerpt = slice(start_idx, start_idx + batch_size)
yield inputs[excerpt], targets[excerpt]
def _test():
x_train,x_test,y_train,y_test = train_test_split(0.8)
print("dataset.train.images.shape:", x_train.shape)
print("dataset.train.labels.shape:", y_train.shape)
print("dataset.test.images.shape:", x_test.