1. 程式人生 > >基於Inception v3進行多標籤訓練

基於Inception v3進行多標籤訓練

一.下載github開原始碼

       從github上下載開原始碼,我們可以發現它需要對訓練資料集的圖片以及圖片標籤做一些改變:

1.將所有訓練影象放在一個資料夾中,並在專案根目錄中建立一個包含所有可能標籤的檔案labels.txt。例如:



2.需要為每個影象準備正確標籤的檔案。命名檔案<image_file_name.jpg> .txt =如果您有一個影象car.jpg附帶的檔案將是car.jpg.txt。例如上圖的1.jpg檔案就需要給定標籤,並且txt名字為1.jpg.txt

3.最終你需要將圖片資料夾,標籤資料夾,以及標籤txt存放在同一個目錄中,如下:其中images為裝滿圖片的資料夾,labels.txt為所有的標籤,model_dir資料夾裡面為所有圖片的標籤,retrain.py為訓練的指令碼。

二 獲取資料庫

本實驗採用的是南京大學開源的資料庫,資料庫連結為:點選這裡檢視,下載後解壓會出現兩個壓縮包,一個壓縮包中含有上圖所示的圖片,共有2000張自然風景圖,這些圖片總攻有5個標籤(desert,mountains,sea,sunset,trees),而每張圖片都含有至少一個標籤,這就是我們的訓練樣本,但是我們可以發現另一個名為processed壓縮包裡含有的是一個minl data的mat檔案,這個需要使用matlab開啟,開啟之後可以看出其中具有三個矩陣,名字分別為bags.mat,targets.mat,class_name.mat,第一個可以直接忽略,而第二個就是每張影象所給的定義,如下,第三個class_name.mat中含有總的標籤數。

 可以看出來每一列為一張圖片的標籤定義,1表示有,-1表示沒有,例如第一張圖片為[1 -1 -1 -1 -1],就表示改圖片只包含第一個標籤”desert“,我們現在需要將這個tagets.mat矩陣轉換成txt檔案。

2.1將mat檔案轉換成txt檔案指令碼

本文先通過網上所述的方法修改:

結果發現輸出來的txt是亂碼,後來對網上另一個mat2txt指令碼進行修改最終得出了結果:下圖為修改後的指令碼以及最後的txt檔案。

2.2txt轉換成標籤

我們可以看出得到的target.txt檔案顯示的是一系列的字元,我們需要通過這個txt檔案將每一行對應與一個影象的標籤,這時我們需要使用python編寫的指令碼:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 16 22:56:24 2017

@author: hongjun
"""

from __future__ import division

#寫入檔案,將msg列表中的每一個元素換行寫入檔案,並修改檔案的名字
def text_create(name, msg):   
    desktop_path = '/Users/hongjun/Desktop/test/'    
    full_path = desktop_path + name + '.jpg.txt' 
    file = open(full_path,'w')
    for i in range(len(msg)):
        label=msg[i]             
        file.write(label+'\n') 
    file.close() 
    print('Done')


f=open("/Users/hongjun/Desktop/targets.txt",'r')
while 1:
     lines=f.readlines()#逐行讀取整個檔案
     n=1#n表示讀入的第幾行
     for line in lines:
         if line:
             #字元字典,數字表示負號前面有多少個1,例如0就對應沒有1即字元desert
             total_labels={0:"desert",1:"mountains",2:"sea",3:"sunset",4:"trees"}
             output_labels=[]#最終輸出的列表
             numbers=line.split('1')#將每行按照1進行分開
             label_count=[]#每個負號前面有多少個1的列表
             for i in range(len(line)):
                 if line[i]=="-":
                     count=0#表示某個特定的負號前面的1的個數
                     for j in range(0,i):
                         if line[j]=='1':
                             count=count+1
                 label_count.append(count)#與if line[i]=='-'為同一縮排
             for i in range(0,5):
                if i not in label_count:#如果輸出的列表中不存在字典裡的數字,那麼就代表存在某個字元
                    output_labels.append(total_labels[i])  
             text_create(str(n),output_labels)
             n=n+1
            
            
     else:
         break
f.close()
經過了這個指令碼之後,我麼就可以得到我們所需要的輸出標籤檔案了。 三.使用docker容器執行retrain.py Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。 使用docker執行步驟,首先我們需要在本機上上傳需要的retrain.py,images,labels.txt,images_labels檔案,然後將他們掛載在docker你建立的目錄下,例如我在docker上建立的目錄位置為/image_labels_dir,將上述檔案掛載在這個資料夾下。 你可以使用如下方法新建一個docker:
docker run -it \
  --publish 6006:6006 \
  --volume ${HOME}/image_labels_dir:/image_labels_dir \
  --workdir /image_labels_dir \
  tensorflow/tensorflow:1.1.0 bash
同時,你可以用tensorboard來監測訓練過程:
tensorboard --logdir training_summaries &
如果當你執行上一條命令時出現: ERROR:tensorflow:TensorBoard attempted to bind to port 6006, but it was already in use 此時,你可以使用如下命令列進行修改: pkill -f "tensorboard"

這條命令列是在關閉所有正在執行的tensorboard,然後你可以再執行tensorboard --logdir training_summaries &來啟動tensorboard。現在有了容器,有人訓練模型,有了資料,我們可以開始訓練了,下面給出訓練時候要用到的引數:

python retrain.py \
--bottleneck_dir=bottlenecks \
--model_dir=model_dir \
--output_graph=retrained_graph.pb \
--output_labels=retrained_labels.txt \
--summaries_dir=retrain_logs \
--image_dir=images

至此,訓練就可以開始了。注意,一定要保證images路徑是對的,否則無法進行訓練,以我為例可以看到根目錄下有image_labels_dir資料夾,其中含有4個主要的檔案images(圖片),retrain.py()(為重訓練指令碼),labels.txt(所有的標籤),image_labels_dir(所有影象的標籤),而在images資料夾下有個image資料夾,這資料夾中含有所有的圖片。

[email protected]:/image_labels_dir# ls
bottlenecks  image_labels_dir  images  labels.txt  model_dir  retrain.py  retrain_logs  retrained_graph.pb  retrained_labels.txt
[email protected]:/image_labels_dir# ls        
bottlenecks  image_labels_dir  images  labels.txt  model_dir  retrain.py  retrain_logs  retrained_graph.pb  retrained_labels.txt
[email protected]:/image_labels_dir# cd images
[email protected]:/image_labels_dir/images# ls
image
[email protected]:/image_labels_dir/images# cd image
[email protected]:/image_labels_dir/images/image# ls
1.jpg     1085.jpg  1171.jpg  1258.jpg  1344.jpg  1430.jpg  15

四.訓練時候存在的問題

本人使用的python2.7進行執行,由於tensorflow版本問題,會出現一些問題:

  

 解決的方法是對retrain.py檔案進行一些修改:

1報錯位置:.tf.scalar_summary('batch_loss', loss)AttributeError: 'module' object has no attribute 'scalar_summary'修改為:tf.summary.scalar('batch_loss', loss)原因:新版本做了調整

2.AttributeError: 'module' object has no attribute 'histogram_summary'修改為:tf.summary.histogram

3.tf.merge_all_summaries()改為:summary_op = tf.summaries.merge_all()

4.AttributeError: 'module' object has no attribute 'SummaryWriter':tf.train.SummaryWriter改為tf.summary.FileWriter

以及另一處報錯位置的修改:
tf.nn.sigmoid_cross_entropy_with_logits(logits,ground_truth_input)
修改為

tf.nn.sigmoid_cross_entropy_with_logits(labels=ground_truth_input,logits=logits)
這樣的話我們就可以成功的進行訓練了。

五訓練結果

按照上述方法,我們可以得到最終的訓練結果,迭代次數為預設的4000次,我們可以得知最終的訓練準確率為94.6%,測試準確率為93.8%,以及交叉熵為0.144610.

2017-06-23 03:16:08.463792: Step 3980: Train accuracy = 93.4%
2017-06-23 03:16:08.463873: Step 3980: Cross entropy = 0.152843
2017-06-23 03:16:08.514183: Step 3980: Validation accuracy = 94.6%
2017-06-23 03:16:09.090858: Step 3990: Train accuracy = 93.4%
2017-06-23 03:16:09.090932: Step 3990: Cross entropy = 0.164133
2017-06-23 03:16:09.140161: Step 3990: Validation accuracy = 95.8%
2017-06-23 03:16:09.600402: Step 3999: Train accuracy = 94.0%
2017-06-23 03:16:09.600477: Step 3999: Cross entropy = 0.144610
2017-06-23 03:16:09.650267: Step 3999: Validation accuracy = 93.8%
Final test accuracy = 94.6%


接下來我們用這個訓練結果測試一下單個照片:

我們需要用到label_image.py指令碼,輸入的命令列為

python label_image.py images/image/400.jpg
其中最後一個引數為圖片的路徑,例如我們輸入的圖片為(該圖片當時我們給的標籤只有一個desert):


我們可以觀測到最終的輸出為:

desert (score = 0.97425)
sunset (score = 0.10365)
mountains (score = 0.01996)
sea (score = 0.01231)
trees (score = 0.00555)
從結果可以看出,圖片很大概率只屬於一個標籤desert,下面我們來測試一張多標籤的圖片,(該標籤我們當時給的標籤為moutain,desert)。


mountains (score = 0.82342)
desert (score = 0.60081)
sea (score = 0.05774)
trees (score = 0.01539)
sunset (score = 0.01115)
可以看出通過訓練可以檢測出該圖片屬於多個標籤。你也可以測試一些自己的照片,只要路徑正確。

相關推薦

基於Inception v3進行標籤訓練 修正了錯誤並進一步完善了程式碼

多標籤訓練只適合未修改inception v3網路的情形,不同於遷移學習。本文參考了基於Inception v3進行多標籤訓練  修正了錯誤並進一步完善了程式碼 資料集的準備,假設有3個類,每個類別差不多有50張圖,注意圖片的規模不能太少(一般一個類不小於25張圖),不然在驗證的時候會

基於Inception v3進行標籤訓練

一.下載github開原始碼        從github上下載開原始碼,我們可以發現它需要對訓練資料集的圖片以及圖片標籤做一些改變: 1.將所有訓練影象放在一個資料夾中,並在專案根目錄中建立一個包含所有可能標籤的檔案labels.txt。例如: 2.需要為

基於Inception v3進行標籤訓練

bottleneck Inception v3模型由堆疊在一起的許多層組成,TensorBoard的簡化影象如上所示。 這些層是預先訓練的,並且在查詢和總結有助於對大多數影象進行分類的資訊方面已經非常有價值。 對於這個codelab,你只訓練最後一層(下圖中的final_training_ops)。

TensorFlow 之基於Inception V3標籤分類 retrain

一、準備訓練資料 1.下載資料集 本文采用南京大學開源的資料集(點選下載:http://lamda.nju.edu.cn/files/miml-image-data.rar) 資料集中含有2000張影象,5個類,分別為 desert, mounta

使用Keras進行GPU訓練 multi_gpu_model

使用Keras訓練具有多個GPU的深度神經網路(照片來源:Nor-Tech.com)。 摘要 在今天的部落格文章中,我們學習瞭如何使用多個GPU來訓練基於Keras的深度神經網路。 使用多個GPU使我們能夠獲得準線性加速。 為了驗證這一點,我們在CIFAR-10資料集上訓練了MiniGoog

使用估算器、tf.keras 和 tf.data 進行 GPU 訓練

文 / Zalando Research 研究科學家 Kashif Rasul 來源 | TensorFlow 公眾號 與大多數 AI 研究部門一樣,Zalando Research 也意識到了對創意進行嘗試和快速原型設計的重要性。隨著資料集變得越來越龐大,

深度學習框架Tensorflow學習與應用(八 儲存和載入模型,使用Google的影象識別網路inception-v3進行影象識別)

一 模型的儲存 [email protected]:~/tensorflow$ cat 8-1saver_save.py # coding: utf-8 # In[1]: import tensorflow as tf from tensorflow.examples.tutorials

Caffe實現標籤影象分類(1)——基於Python介面實現標籤影象分類(VOC2012)

1.前言         Caffe可以通過LMDB或LevelDB資料格式實現影象資料及標籤的輸入,不過這隻限於單標籤影象資料的輸入。由於研究生期間所從事的研究是影象標註領域,在進行影象標註時,每幅影象都是多標籤的,因此在使用Caffe進行遷移學習時需要實現多標籤影象資料

基於ML-KNN的標籤分類演算法

     最近有一個專案需要用多標籤分類思想來建模,之前對這塊不是太瞭解,查了一些論文,發現目前主流的演算法包括ML-KNN、ML-DT、Rank-SVM、CML等,其中ML-KNN演算法思想最簡單,結合原始論文,本文大概介紹下演算法思想和程式碼實現。      ML-KNN

caffe標籤訓練

最近剛接觸caffe弄了一個caffe多標籤遇到各種蛋疼的問題跟大家分享分享。 一  準備資料這裡用的驗證碼0-9+26個字母字母生成4位數的驗證碼 二  修改caffe原始碼涉及到修改的檔案有        caffe.proto ,       c

【Caffe】標籤訓練、人臉屬性訓練

前言 細節有一些問題,我這裡過一遍整個流程,涉及到的問題都會做講解。包括部署問題,最後我也會講講。 正文 將convert_multilabel.cpp放到caffe/tools/目錄下。 修改81行: ‘>>’ should be ‘&g

[html5技術]基於bootstrap製作的標籤頁(tabs)#1024程式設計師福音來了

下載地址 點選下載 效果圖 default/預設 (帶有向左、向右移動以及選項選單) 參考Demo: nav-tabs and nav-pills  classic/摺疊 (摺疊隱藏tab) 作用與優勢 通過簡單的配置,生成可智慧適配ajax和ifr

基於深度學習的病毒檢測技術無需沙箱環境,直接將樣本文件轉換為二維圖片,進而應用改造後的卷積神經網絡 Inception V4 進行訓練和檢測

進制 思科 開發 主題 需求 做的 病毒 無法 大於 話題 3: 基於深度學習的二進制惡意樣本檢測 分享主題:全球正在經歷一場由科技驅動的數字化轉型,傳統技術已經不能適應病毒數量飛速增長的發展態勢。而基於沙箱的檢測方案無法滿足 APT 攻擊的檢測需求,也受到多種反沙箱技術的

TensorFlow遷移學習-使用谷歌訓練好的Inception-v3網路進行分類

遷移學習是將一個數據集上訓練好的網路模型快速轉移到另外一個數據集上,可以保留訓練好的模型中倒數第一層之前的所有引數,替換最後一層即可,在最後層之前的網路層稱之為瓶頸層。 下面程式碼是使用TensorFlow將ImageNet上訓練好的Inception-v

基於keras實現標籤分類(multi-label classification)

首先討論多標籤分類資料集(以及如何快速構建自己的資料集)。 之後簡要討論SmallerVGGNet,我們將實現的Keras神經網路架構,並用於多標籤分類。 然後我們將實施SmallerVGGNet並使用我們的多標籤分類資料集對其進行訓練。 最後,我們將通過在示例影象上測試我

2.CNN圖片標籤分類(基於TensorFlow實現驗證碼識別OCR)

上一篇實現了圖片CNN單標籤分類(貓狗圖片分類任務) 地址:juejin.im/post/5c0739… 預告:下一篇用LSTM+CTC實現不定長文字的OCR,本質上是一種不固定標籤個數的多標籤分類問題 本文所用到的10w驗證碼資料集百度網盤下載地址(也可使用下文程式碼自行生成): pan.baidu

tensorflow-Inception-v3模型訓練自己的資料程式碼示例

一、宣告   本程式碼非原創,源網址不詳,僅做學習參考。 二、程式碼   1 # -*- coding: utf-8 -*- 2 3 import glob # 返回一個包含有匹配檔案/目錄的陣列 4 import os.path 5 import rand

基於OpenCV使用OpenPose進行個人體姿態估計

目錄 7. 結果 之前我們使用OpenPose模型對單個人體進行姿態估計。本文討論瞭如何同時對多人體進行姿態估計。 假如圖片中具有多個人體,姿態估計會生成多個獨立的關鍵點。我們需要對關鍵點分類,找出屬於同一個人的關鍵點。 我

利用Inception-v3現成權重進行特徵提取(影象識別)

在tensorflow官網的影象識別的中文介紹中,介紹瞭如何用Tensorflow的模型程式碼庫中的classify_image.py進行影象識別。裡面有介紹如何測試,而且還提供了最後一層的1*1*2048維的特徵提取方式,所以在這裡介紹一下。 ...... with tf.Session

Caffe中LMDB介面實現標籤資料準備及訓練

有不少部落格講Caffe多標籤輸入的問題,但總覺得講的不夠透徹,在實踐角度上沒有給出詳細的指導,所以本文力求能給出詳細的實踐過程和說明。 Caffe多標籤輸入常用的的方法有以下幾種: 1. 修改Caffe原始碼使其支援多標籤輸入,參考CSDN部落格《