Keras+CNN+Opencv 深度學(xué)習(xí)初探:狗的品種識別

1.jpg

一 介紹:

通過卷積神經(jīng)網(wǎng)絡(luò)對哈士奇狞谱、拉布拉多、金毛禁漓、柯基犬的數(shù)據(jù)集進(jìn)行學(xué)習(xí) 跟衅,訓(xùn)練出一個可以識別出這四種狗的品種的模型 。本文適合有mnist手寫數(shù)字識別基礎(chǔ)的讀者觀看 播歼,如果你對深度學(xué)習(xí)只有一些模糊概念的話伶跷,建議你在閱讀本文之嘗試此篇文章:Keras入門數(shù)字手寫識別

二 :數(shù)據(jù)集

數(shù)據(jù)集 提取碼: 1ik1
通過爬蟲自行構(gòu)建的,共2700余張狗的品種圖片 秘狞,分別放置在分好類別HSQ叭莫、LBLD、JM谒撼、KJQ (文件夾之所以設(shè)置為英文是因為opencv在open圖片時候不支持路徑存在中文) 的四個文件夾內(nèi) 食寡。如果你需要爬蟲源碼請訪問:Github

準(zhǔn)備數(shù)據(jù)集:

圖片預(yù)處理

class Datasets:
    
    def __init__(self,filepath,fields,image_size):
        
        self.images = []
        self.labels = []
        self.classs = []
        self.rename = []
        self.fields = fields
        self.filepath = filepath
        self.image_size=image_size
    def Rename(self):

        for field in self.fields:
            label = self.fields.index(field)
            count = 0
            for file in os.listdir(self.filepath+field):
                #print(self.filepath+field+'/'+str(label)+'_'+str(count)+field+'.jpg')
                count += 1 
                os.rename(self.filepath+field+'/'+file,self.filepath+field+'/'+str(label+1)+'_'+str(count)+'.jpg')

     
    def Load_img(self):
            
        for field in self.fields:
            index = self.fields.index(field)
            for file in os.listdir(self.filepath+field):
                try:
                    image = cv2.imread(self.filepath+field+'/'+file)

                    image = cv2.resize(image, (self.image_size, self.image_size), cv2.INTER_LINEAR)
                    image = image.astype(np.float32)
                    image = np.multiply(image, 1.0 / 255.0)
                    self.images.append(image)
                    label = np.zeros(len(self.fields))
                    label[index] = 1.0
                    self.labels.append(label)
                    self.classs.append(field)
                    self.rename.append(file)
                except:
                    continue
        
        images = np.array(self.images)
        labels = np.array(self.labels)
        fields = np.array(self.classs)
        filenm = np.array(self.rename)
        return images,labels,fields,filenm

構(gòu)造一個圖片預(yù)處理的類Datasets,主要功能就是把圖片改名字、并且轉(zhuǎn)為cnn需要的數(shù)據(jù)類型 廓潜。接受三個參數(shù)數(shù)據(jù)集文件夾(總文件夾)抵皱、類別(即為分類文件夾名字)以及調(diào)整的圖像像素大小。

返回的參數(shù)為辩蛋,包含所有圖像像素信息的列表的array 呻畸、圖像分類信息的列表的array ,這里的label的形式為[0,0,1,0]表示屬于第三類即:JM(金毛)悼院。fields為labels對應(yīng)的說明 伤为。

數(shù)據(jù)讀取

def Read_datas(self,validation_size):
        class Temp(object):
            pass
        data_sets = Temp()
        images,labels,fields,filenm=self.Load_img()
        images,labels,fields,filenm=shuffle(images,labels,fields,filenm)#隨機(jī)打亂序列
        if isinstance(validation_size, float):
            validation_size = int(validation_size * images.shape[0])


        train_images = images[validation_size:]
        train_labels = labels[validation_size:]
        train_fields = fields[validation_size:]
        train_filenm = filenm[validation_size:]

        validation_images = images[:validation_size]
        validation_labels = labels[:validation_size]
        validation_fields = fields[:validation_size]
        validation_filenm = filenm[:validation_size]


        data_sets.train = DataSet(train_images, train_labels, train_fields,train_filenm)
        data_sets.valid = DataSet(validation_images, validation_labels, validation_fields,validation_filenm)

        return data_sets

class DataSet(object):

    def __init__(self, images, labels, fields, filenm):

        self._num_examples = images.shape[0]
        self._images = images
        self._labels = labels
        self._fields = fields
        self._filenm = filenm
        self._epochs_done = 0
        self._index_in_epoch = 0

    @property
    def images(self):
        return self._images

    @property
    def labels(self):
        return self._labels

    @property
    def fields(self):
        return self._fields

    @property
    def filenm(self):
        return self._filenm
    

    @property
    def num_examples(self):
        return self._num_examples

    @property
    def epochs_done(self):
        return self._epochs_done

訓(xùn)練數(shù)據(jù)集

from Load_data import *
import numpy as np
from keras.optimizers import Adadelta
from keras.losses import categorical_crossentropy
from keras.datasets import mnist
from keras.utils import np_utils
from keras.layers import Activation,Conv2D,MaxPool2D,Flatten,Dense,Dropout
from keras.models import Sequential



class Train(object):
    """docstring for Train"""
    def __init__(self,epoch,classes,batch_size):
        
        self.epoch = epoch
        self.classes = classes
        self.batch_size = batch_size


    def read_datas(self,filepath,fields,image_size,validation_size):
        datasets = Datasets(filepath,fields,image_size).Read_datas(validation_size)
        self.train = datasets.train
        self.valid = datasets.valid
    def train_datas(self):
        X_train = self.train.images
        Y_train = self.train.labels
        X_valid = self.valid.images
        Y_valie = self.valid.labels
        
        model = Sequential([
                            Conv2D(filters=16,kernel_size=(5,5),padding='same',activation='relu',input_shape=(64,64,3)),

                            MaxPool2D(pool_size=(2,2),strides=(2,2),padding='same'),
                            Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu'),
                            MaxPool2D(pool_size=(2,2),strides=(2,2),padding='same'),
                            Dropout(0.5),
                            Flatten(),
                            Dense(64,activation='relu'),
                            Dropout(0.25),
                            Dense(4,activation='softmax'),






            ])
        model.compile(loss=categorical_crossentropy,
                      optimizer=Adadelta(),
                      metrics=['accuracy']
                      )
        model.fit(X_train,Y_train,batch_size=self.batch_size,epochs=self.epoch,validation_data=(X_valid,Y_valie))#validation_data=(X_valid,Y_valie)
        model.save("my_model.h6")

        

if __name__ == '__main__':
    a=Train(30,4,64)
    a.read_datas(filepath="H:/DogRaw/",fields=["HSQ","JM","LBLD","KJQ"],image_size=64,validation_size=0.1)
    a.train_datas()




構(gòu)造的數(shù)據(jù)訓(xùn)練類,傳入三個參數(shù):訓(xùn)練次數(shù)据途、輸出層的分類數(shù)绞愚、以及batch_size 。
read_datas 函數(shù)功能是講前一部分準(zhǔn)備好的數(shù)據(jù)加載進(jìn)來 颖医。訓(xùn)練集(X_train,Y_train)驗證集(X_valid,Y_valid)位衩。
訓(xùn)練部分采用卷積神經(jīng)網(wǎng)絡(luò)隱藏層個數(shù)為64層,輸出層4層 熔萧。

預(yù)測圖片

import cv2
import numpy as np
from keras.models import load_model



class Pred(object):
    """docstring for Pred"""
    def __init__(self,filepath,fileds,image_size,modelfile):
        
        self.fileds = fileds
        self.filepath = filepath
        self.modelfile = modelfile
        self.image_size = image_size

    def read_data(self):

        image = cv2.imread(self.filepath)
        image = cv2.resize(image,(self.image_size,self.image_size))
        self.image = np.array(image).reshape(-1,self.image_size,self.image_size,3).astype("float32")/255


    def pred_data(self):
        
        model = load_model(self.modelfile)

        prediction = model.predict(self.image)
        
        count = 0
        for i in prediction[0]:
            percent = '%.5f%%'%(i*100)
            print(f"{self.fileds[count]}的概率:{percent}")
            count += 1





if __name__ == '__main__':
    pred = Pred(filepath="HSQ.jpg",fileds=["哈士奇","金毛","拉布拉多","柯基犬"],image_size=64,modelfile="my_model.h5")
    pred.read_data()
    pred.pred_data()

將上一個部分訓(xùn)練好的模型導(dǎo)入 糖驴,再講測試的數(shù)據(jù)圖片導(dǎo)入并做好數(shù)據(jù)處理 ,進(jìn)行預(yù)測


偷來的金毛鎮(zhèn)樓

預(yù)測結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佛致,一起剝皮案震驚了整個濱河市贮缕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俺榆,老刑警劉巖感昼,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肋演,居然都是意外死亡抑诸,警方通過查閱死者的電腦和手機(jī)烂琴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜕乡,“玉大人奸绷,你說我怎么就攤上這事〔懔幔” “怎么了号醉?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辛块。 經(jīng)常有香客問我畔派,道長,這世上最難降的妖魔是什么润绵? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任线椰,我火速辦了婚禮,結(jié)果婚禮上尘盼,老公的妹妹穿的比我還像新娘憨愉。我一直安慰自己,他們只是感情好卿捎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布配紫。 她就那樣靜靜地躺著,像睡著了一般午阵。 火紅的嫁衣襯著肌膚如雪躺孝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天底桂,我揣著相機(jī)與錄音植袍,去河邊找鬼。 笑死籽懦,一個胖子當(dāng)著我的面吹牛奋单,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猫十,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呆盖!你這毒婦竟也來了拖云?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤应又,失蹤者是張志新(化名)和其女友劉穎宙项,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體株扛,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尤筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年汇荐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆繁。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡掀淘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出油昂,到底是詐尸還是另有隱情革娄,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布冕碟,位于F島的核電站拦惋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏安寺。R本人自食惡果不足惜厕妖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挑庶。 院中可真熱鬧言秸,春花似錦、人聲如沸挠羔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽破加。三九已至俱恶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間范舀,已是汗流浹背合是。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锭环,地道東北人聪全。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像辅辩,于是被迫代替她去往敵國和親难礼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容