用Python獲取可能是全網最全的傑尼龜表情包(第二彈)

上回說到我們已經通過爬蟲以及將視頻切割成多幅圖片,今天就來談談如何通過機器學習的方法來減少篩選傑尼龜的工作量。這些圖片可以粗暴地分爲兩類,是傑尼龜或者不是傑尼龜,這個分類任務不同於貓狗識別的二分類,而是單分類任務

分類算法

分類算法若是按照類別個數劃分,可以分爲單分類、二分類以及多分類這三種。一般我們見的比較多是二分類或是多分類。

通過樸素貝葉斯算法來識別垃圾郵件、用神經網絡來識別貓狗都是典型的二分類,垃圾郵件和正常郵件都有其對應特徵及標籤,貓和狗也都有其對應特徵及標籤,屬於監督學習的範疇。

手寫數字識別0-9則是一種典型的多分類,而今天我們的任務是判斷某張圖片是不是傑尼龜,即單分類任務。因爲我們僅有現成的少量傑尼龜的圖片作爲正樣本訓練集並且很難找到合適的負樣本,我們需要訓練出一個單分類模型,該模型只關注與正樣本相似或是匹配程度高的樣本,將不屬於該類的所有其他樣本統一判爲“不是”,而非由於屬於另外一類而返回“不是”。

file

單分類支持向量機正是這樣一種單分類算法,它實際上是確定正樣本的邊界,邊界之外的數據會被分爲另一類。恰好適用於當前這樣負樣本的特徵不容易確定的場景。實際上,這是一種異常檢測的算法。

特徵提取

整體的思想是使用深度神經網絡做特徵提取,把提取出來的特徵用於現有的單類別分類方法進行分類。

特徵提取部分採用了inception v3的網絡結構,把每一張圖片轉成的像素矩陣作爲數據傳入到張量中做前向計算,從而得到高維特徵。把我們手頭少量的傑尼龜圖片的特徵一次全部提取,把切割得到的圖片分批次提取特徵。

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        tensor=sess.graph.get_tensor_by_name('pool_3/_reshape:0')
        for i in range(num_batches):
            batch_img_data=img_datas[i*batch_size:(i+1)*batch_size]
            batch_img_labels=img_labels[i*batch_size:(i+1)*batch_size]
            feature_v=[]
            for j in batch_img_data:
                j_vector=sess.run(tensor,feed_dict={'DecodeJpeg/contents:0':j})
                feature_v.append(j_vector)
            feature_v=np.vstack(feature_v)
            save_path=os.path.join(folder,'data_%d.pickle'%i)
            with tf.gfile.FastGFile(save_path,'w') as f:
                pickle.dump((feature_v,batch_img_labels),f)
            print(save_path,'is_ok!')

OneClass SVM

把這些傑尼龜圖片的特徵當作訓練集來訓練這個OneClass SVM模型,勾勒出一個包含傑尼龜特徵的超平面,接着對切割得到的圖片特徵進行檢測,如果包含在超平面內,則得到結果1,反之得結果-1。得到結果之後,將正例的所有圖片複製移動到新的文件夾,而該文件夾裏面的圖片便是我們的目標圖片。

def one_class_svm():
    model=svm.OneClassSVM()
    feature_matrix,_=get_matrix('data_jieni',50)
    model.fit(feature_matrix)
    vedieo_feature_matrix,origin_labels=get_matrix('data_vedio',500)
    result=model.predict(vedieo_feature_matrix)
    for i in range(len(origin_labels)):
        if result[i]==1:
            move(src='vedio',dst='result',i=origin_labels[i])

篩選完成後,我們會得到這個新的result文件夾包含機器學習所篩選出來的傑尼龜圖片,但實際上效果不是特別理想,仍有不少並不是傑尼龜的圖片成爲漏網之魚,也被放入到這個文件夾之中,我們可以考慮對正樣本集進行一些處理,進行隨機切割,圖片反轉,旋轉等方式來擴充訓練集。

file

至此,我們已經通過機器學習的方法對切割得到的圖片集進行了一個篩選並獲得了大量傑尼龜的圖片,最後一彈我們就來聊聊如何操作這些圖片。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章