独自のピクチャデータセットの作成方法-tensorflowベース
5049 ワード
始まりに書く
自分がpythonに最初に触れたとき、最初に覚えたライブラリはtensorflowで、everyoneが経験するmnistデータセットの訓練を経験した後、自分で画像分類の深さを勉強したいと思っていました.期間も紆余曲折して、多くのcsdn上の博客を見て、自分のデータセットの制作習慣を模索して、簡単な分類で使いました.
データセットのダウンロード
データセットなら、一つは自分でダウンロードして収集することで、多くの試合問題の中で分類された資源をダウンロードすることもできます.アリの天池ビッグデータ試合のように、私が使っているデータセットは天池ビッグデータデータセットから来ています.
データセット作成
tensorflowはバイナリデータのみを読み出し、tfrecord形式でピクチャを保存するので、マトリクス型のピクチャデータを変換する必要があります.
次に、tfrecordファイルのファイルreaddataを読み込みます.
訓練を始める
これは紙面を簡略化するために,ここで訓練する際に採用した持参したresnetネットワークは,皆さんの理解を容易にするために,必ずしも本データセットに適応するとは限らない.その他は訓練の基本操作です.Labelはone-hot符号化を採用している.画像が2番目のクラスであれば、彼のラベルはベクトルです:[0 1 0.........]\begin{bmatrix}0&1&0&.&.&.&.&.\end{bmatrix} [010.....]
最後に書く
これはただ最も簡単なデータセットの処理方法で、私たちを助けて入門して、私もただ道で勉強して、みんなと一緒に勉強することを望んでいます.このようにコードを見るのが不便だと思っている人は、私のgithubにアクセスしてダウンロードしてみてください.よろしくご指摘ください.
自分がpythonに最初に触れたとき、最初に覚えたライブラリはtensorflowで、everyoneが経験するmnistデータセットの訓練を経験した後、自分で画像分類の深さを勉強したいと思っていました.期間も紆余曲折して、多くのcsdn上の博客を見て、自分のデータセットの制作習慣を模索して、簡単な分類で使いました.
データセットのダウンロード
データセットなら、一つは自分でダウンロードして収集することで、多くの試合問題の中で分類された資源をダウンロードすることもできます.アリの天池ビッグデータ試合のように、私が使っているデータセットは天池ビッグデータデータセットから来ています.
データセット作成
tensorflowはバイナリデータのみを読み出し、tfrecord形式でピクチャを保存するので、マトリクス型のピクチャデータを変換する必要があります.
import os
import tensorflow as tf
from PIL import Image
import numpy as np
data_path= 'data\\guangdong_round1_train2_20180916'# test
writer=tf.python_io.TFRecordWriter('data\\train_data.tfrecord')
classes=[' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '
]# ,
class_path=[]
for index,name in enumerate(classes):
if name==' ':
class_path.append(os.path.join(data_path,' '))
else:
if name==' ':
new_path=os.path.join(data_path,' ',' ')
for newpath in os.listdir(new_path):
class_path.append(os.path.join(data_path,' ',name,newpath))
else:
class_path.append(os.path.join(data_path,' ',name))
# , ,
# tfrecord
for path in class_path:
for image_path in os.listdir(path):
image_path=os.path.join(path,image_path)
image= Image.open(image_path)
image=image.resize((256,256)) # ,
image_raw=image.tobytes()
example=tf.train.Example(features=tf.train.Features(feature={
'lable':tf.train.Feature(int64_list=tf.train.Int64List(value=[index])) ,
'image_raw':tf.train.Feature(bytes_list=tf.train.BytesList(value=[image_raw]))
}))
writer.write(example.SerializeToString())
writer.close()
次に、tfrecordファイルのファイルreaddataを読み込みます.
import os
import tensorflow as tf
from PIL import Image
tf_record_train_path='data\\train_data.tfrecord'
def read_tfrecord(path):
filename_queue=tf.train.string_input_producer([path])
reader=tf.TFRecordReader()
_,serialized_example=reader.read(filename_queue)
features=tf.parse_single_example(serialized_example,features={
'lable':tf.FixedLenFeature([],tf.int64),
'image_raw':tf.FixedLenFeature([],tf.string)})
image=tf.decode_raw(features['image_raw'],tf.uint8)
image=tf.reshape(image,[256,256,3])
image=tf.image.per_image_standardization(image) #
lable=tf.cast(features['lable'],tf.int32)
return image,lable
def get_tfrecord(batch_size,isTrain=True):
if isTrain:
tf_record_path=tf_record_train_path
image,lable=read_tfrecord(tf_record_path)
image_batch,lable_batch=tf.train.shuffle_batch([image,lable],batch_size=batch_size,
num_threads=1,capacity=1000,min_after_dequeue=10) # , batch_size
return image_batch,lable_batch
訓練を始める
これは紙面を簡略化するために,ここで訓練する際に採用した持参したresnetネットワークは,皆さんの理解を容易にするために,必ずしも本データセットに適応するとは限らない.その他は訓練の基本操作です.Labelはone-hot符号化を採用している.画像が2番目のクラスであれば、彼のラベルはベクトルです:[0 1 0.........]\begin{bmatrix}0&1&0&.&.&.&.&.\end{bmatrix} [010.....]
import tensorflow as tf
import tensorflow.contrib.slim.nets as nets
import readdata
save_dir=r'./train_image_63.model'
batch_size=2#
lr=tf.Variable(0.0001,tf.float32)
x=tf.placeholder(tf.float32,[None,256,256,3])
y_=tf.placeholder(tf.float32,[None])
image_batch,lable_batch=readdata.get_tfrecord(batch_size,isTrain=True)
one_hot_lables=tf.one_hot(indices=tf.cast(y_,tf.int32),depth=12) # one_hot
pred,endpoint=nets.resnet_v2.resnet_v2_50(x,num_classes=12,is_training=True)
pred=tf.reshape(pred,shape=[-1,12])
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred,labels=one_hot_lables))
optimizer=tf.train.AdamOptimizer(learning_rate=lr).minimize(loss)
a=tf.argmax(pred,1)
b=tf.argmax(one_hot_lables,1)
correct_pred=tf.equal(a,b)
accuracy=tf.reduce_mean(tf.cast(correct_pred,tf.float32))
saver=tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
threads=tf.train.start_queue_runners(sess=sess)
i=0
while True:
i+=1
print(i)
b_image,b_lable=sess.run([image_batch,lable_batch])
_,loss_,y_t,y_p,a_,b_=sess.run([optimizer,loss,one_hot_lables,pred,a,b],
feed_dict={x:b_image,y_:b_lable})
print(loss_)
if i==1500:
saver.save(sess,save_dir,global_step=i)
break
最後に書く
これはただ最も簡単なデータセットの処理方法で、私たちを助けて入門して、私もただ道で勉強して、みんなと一緒に勉強することを望んでいます.このようにコードを見るのが不便だと思っている人は、私のgithubにアクセスしてダウンロードしてみてください.よろしくご指摘ください.