【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)
文章目錄
- 1.安裝雙系統(tǒng)
- 2.ubuntu安裝常用軟件
- 2.1 anaconda3
- 2.2 flameshot(截圖)
- 2.3 SimpleScreenRecorder(錄屏)
- 2.4 teamview
- 2.5 win_VMware_Ubuntu
- 3.Win10系統(tǒng)有nvidia顯卡后配深度學(xué)習(xí)環(huán)境:CUDA9.0、cudnn7.3、tensorflow_gpu1.12
- 3.1 需要下載的安裝包
- 3.2 Net FrameWork4.6
- 3.3 CUDA9.0(toolkit)
- 3.4 cudnn7.3
- 3.5 tensorflow_gpu1.12
- 3.6 測試
- 4.Ubuntu + CUDA9.0 + tensorflow-gpu安裝過程:
- 4.1 安裝NVIDIA驅(qū)動
- 4.2 CUDA
- 4.3 CUDANN
- 4.4 tensorflow-gpu
- 4.5 調(diào)用gpu
- 5.目標(biāo)檢測實(shí)戰(zhàn)(Tensorflow_API_SSD)
- 5.1 運(yùn)行tensorflow官方示例
- 5.2 proto文件轉(zhuǎn)py文件
- 5.3 下載模型并運(yùn)行ipynb文件
- 5.4 tf_SSD
- 5.5 挑選圖片
- 5.6 縮小圖片
- 5.7 圖片打標(biāo)簽
- 5.8 xml轉(zhuǎn)csv,csv轉(zhuǎn)tfrecord
- 5.9 編寫pbtxt文件
- 5.10 編寫配置文件
- 5.11 訓(xùn)練模型
- 5.11.1 解決第一個報錯
- 5.11.2 解決第二個報錯
- 下載并安裝Microsoft C++ build 14.0
- 下載并安裝pycocotools
- 5.11.3 解決第三個報錯
- 5.11.4 解決第四個報錯
- 5.11.5 解決第五個報錯
- 5.12 模型測試
- 5.12.1 導(dǎo)出訓(xùn)練好的模型
- 5.12.2 下載并運(yùn)行測試代碼
1.安裝雙系統(tǒng)
Ubuntu鏡像網(wǎng)站:http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/。
以下就只需要按兩個按鈕,其他默認(rèn)。
如下圖先刪除所有,再在驅(qū)動1即固態(tài)上新建滿存再應(yīng)用,默認(rèn)被分成4個區(qū),選中分區(qū)4安裝win10
此電腦右擊管理到磁盤管理(或搜索磁盤管理選擇創(chuàng)建并格式化分區(qū)),右擊刪除卷(或壓縮卷)到未分配,右擊新建簡單卷再命名。壓縮卷C盤分出50G裝ubuntu,ubuntu自動識別未分配空間。
軟碟通Ultraiso將從itellyou下載的win10鏡像(用戶customer版64位,復(fù)制鏈接迅雷下載)或ubuntu鏡像寫入U盤,Boot設(shè)置為UEFI啟動U盤,legacy為老版本不用。下面兩圖都為f2。注意f12選擇UEFI OPTIONS:USB1…啟動,進(jìn)入安裝界面會提示與其他系統(tǒng)共存…
2.ubuntu安裝常用軟件
2.1 anaconda3
anaconda3鏡像: https://mirrors.tuna.tsinghua.edu.cn
在.sh目錄下打開命令行終端輸入
不斷按回車和yes,遇“Do you wish to proceed with the installation of Microsoft VSCode? [yes|no]”,輸入no
若是conda --version或anaconda-navigator未找到命令則解決如下:
echo 'export PATH="/home/yuta/anaconda3/bin:$PATH"' >> ~/.bashrc source ~/.bashrc同理安裝pycharm社區(qū)版不要激活: http://www.jetbrains.com/pycharm/download/#section=linux,選擇linux版本
解壓pycharm進(jìn)入bin目錄執(zhí)行終端命令sh ./pycharm.sh(也是打開命令),跳出命令下一步。
2.2 flameshot(截圖)
sudo apt-get install flameshot (sudo apt-get remove --purge 軟件名稱)
apt命令來安裝軟件,可能報“E:無法定位軟件包”,解決:
使用apt新裝軟件的時候,會使用官方網(wǎng)站去下載軟件,但是會因?yàn)閲鴥?nèi)的轉(zhuǎn)接點(diǎn)太多,導(dǎo)致下載速度慢 ,可以通過換成一些中間的節(jié)點(diǎn)來進(jìn)行下載,比如阿里源,中科大源,清華源等,這樣的網(wǎng)站會定時和官方的源進(jìn)行同步和更新,我們直接同步他們,速度就會比直接同步官方的源快
2.3 SimpleScreenRecorder(錄屏)
添加源:sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
更新源:sudo apt-get update
安裝:sudo apt-get install simplescreenrecorder
2.4 teamview
https://www.teamviewer.com/zhcn/download/linux/
安裝依賴包,終端進(jìn)入到下載路徑中,執(zhí)行命令:(64位系統(tǒng)沒有執(zhí)行這個命令也成功,32位的系統(tǒng)則需要執(zhí)行)
sudo apt-get install libjpeg62:i386 libxinerama1:i386 libxrandr2:i386 libxtst6:i386 ca-certificates
安裝deb軟件包:sudo dpkg -i teamviewer_12.0.76279_i386.deb
再重新執(zhí)行:sudo dpkg -i teamviewer_12.0.76279_i386.deb
2.5 win_VMware_Ubuntu
下載Ubuntu鏡像文件:http://www.ubuntu.com,配置VMware,下載地址:www.linuxprobe.com/tools。創(chuàng)建新虛擬機(jī)—自定義(高級)
3.Win10系統(tǒng)有nvidia顯卡后配深度學(xué)習(xí)環(huán)境:CUDA9.0、cudnn7.3、tensorflow_gpu1.12
查看CUDA版本號可以安裝CUDA Toolkit(可分離cpu和gpu代碼)。本文作者CUDA版本號為9.1可裝CUDA Toolkit 9.0、CUDA Toolkit 9.1、CUDA Toolkit 8.0
幫助-系統(tǒng)信息
3.1 需要下載的安裝包
1: 為4的解壓
2:安裝英偉達(dá)驅(qū)動程序,設(shè)備管理器中查看顯卡型號,到官網(wǎng)選擇對應(yīng)驅(qū)動下載,可以先卸載所有驅(qū)動再進(jìn)行安裝
3:用于做并行計算的平臺CUDA toolkit,版本為9.0,前提是電腦擁有Nvidia獨(dú)立顯卡,看顯卡對應(yīng)使用cuda版本號
4:用于做深度學(xué)習(xí)加速計算的cuDNN庫,版本為7.3
5:Microsoft出品,在Windows操作系統(tǒng)運(yùn)行所有軟件都依賴的Net Framework庫,版本為4.6
6:Google出品,提供給開發(fā)人員的深度學(xué)習(xí)開發(fā)框架TensorFlow。其有2個版本,cpu版和gpu版,本文要安裝的是gpu版本,因?yàn)間pu版本是cpu版本運(yùn)行速度的50倍
3.2 Net FrameWork4.6
在Windows操作系統(tǒng)運(yùn)行所有軟件都依賴的.Net Framework庫。一般來說,安裝Win10操作系統(tǒng)的時,會自動更新.Net Framework到較新版本,但是為了避免個別讀者的軟件版本較久,建議下載并安裝.Net Framework4.6。進(jìn)入Windows官網(wǎng),鏈接:https://www.microsoft.com,進(jìn)入后頁面如下圖所示:在搜索框搜索:Net Framework 4.6,Offline中文叫離線,需要下載Offline Installer版本,雙擊直接安裝:
3.3 CUDA9.0(toolkit)
進(jìn)入Nvidia官網(wǎng),鏈接:https://www.nvidia.com,安裝時不要修改默認(rèn)安裝位置,一般CUDA安裝失敗都是由于Visual Studio(VS) Intergration無法安裝導(dǎo)致的,可以通過自定義方式取消Visual Studio(VS) Intergration進(jìn)行安裝。
Legacy Releases中文叫做遺留版本,即舊版本CUDA的下載頁面需要從此處進(jìn)入。
3.4 cudnn7.3
開發(fā)者-CUDA-Downloads。
cudnn中的cu是CUDA的簡寫,dnn是deep neural network的簡寫。
注冊登陸下載,安裝:使用解壓軟件將壓縮文件cudnn-9.0-windows10-x64-v7.3.1.20.zip解壓到當(dāng)然文件夾。
打開壓縮后的cuda文件夾,將這四個文件全部復(fù)制到:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0,即安裝CUDA9.0默認(rèn)路徑。
3.5 tensorflow_gpu1.12
進(jìn)入阿里云pypi鏡像,鏈接:http://mirrors.aliyun.com/pypi/simple/
下載后對應(yīng)文件夾打開命令行pip install+名稱,考慮到部分讀者可能沒有安裝運(yùn)行tensorflow必需的msgpack庫,在cmd中輸入命令:pip install msgpack
3.6 測試
在文件夾中新建.txt文件,將代碼寫入.txt文件中,寫入后改為test.py文件。
運(yùn)行py文件成功。
建議先將Nvidia相關(guān)驅(qū)動卸載干凈后,重新安裝Nvidia驅(qū)動,再實(shí)現(xiàn)本文當(dāng)中的操作。如果一直出現(xiàn)找不到tensorflow庫的錯誤,本文讀者提示可以使用conda install tensorflow_gpu的方法先解決環(huán)境問題,然后再conda uninstall tensorflow_gpu再實(shí)現(xiàn)本文當(dāng)中的操作。
4.Ubuntu + CUDA9.0 + tensorflow-gpu安裝過程:
4.1 安裝NVIDIA驅(qū)動
1.卸載NVIDIA驅(qū)動:sudo apt-get remove --purge nvidia*
下面這步禁用我沒用到,但記錄下:
2.添加Graphic Drivers PPA:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
3.查看推薦驅(qū)動版本:ubuntu-drivers devices
4.安裝驅(qū)動:sudo apt-get install nvidia-driver-430
5.安裝完成后重啟:sudo reboot
6.查看:watch nvidia-smi或者系統(tǒng)設(shè)置詳細(xì)信息
4.2 CUDA
1..GCC降低版本:CUDA9.0要求GCC版本是5.x或者6.x,通過以下命令才對GCC版本進(jìn)行修改:
版本安裝,并通過命令替換掉之前的版本
g++ --version
sudo apt-get install gcc-5
sudo apt-get install g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50
附:gcc降級
2.CUDA9.0下載地址:https://developer.nvidia.com/cuda-toolkit-archive
選擇版本:linux–x86-64,Ubuntu–16.04,runfile(local),下載Base Installer并同級目錄終端安裝回車到底,accept后第一步輸入n (不裝nvidia驅(qū)動driver,因?yàn)橐呀?jīng)裝過)后面全y:
sudo sh cuda_9.0.176_384.81_linux.run
如果run文件出現(xiàn)問題,需要安裝下面依賴,我沒遇到過僅記錄下:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
3.添加環(huán)境變量(.bashrc就是環(huán)境配置文件):sudo vim ~/.bashrc ,按i進(jìn)入插入模式,在末尾添加以下內(nèi)容:
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
按下ESC鍵后輸入:wq 保存退出,然后刷新:source ~/.bashrc
4.重啟后,測試CUDA是否成功:
若會輸出相應(yīng)的顯卡性能信息,Result = PASS,表明CUDA安裝成功。
5.卸載CUDA:在計算機(jī)磁盤可以找到usr文件夾:sudo rm -rf /usr/local/cuda-9.0/或
4.3 CUDANN
https://developer.nvidia.com/cudnn
注冊登陸選擇cudann7.0
解壓下載的文件,可以看到cuda文件夾,在同級目錄打開終端,拷貝文件并賦予權(quán)限,沒有報錯就是全部安裝完成:
查看cudann版本:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2或nvcc -V
4.4 tensorflow-gpu
1.創(chuàng)建一個python3X名為tf12的虛擬環(huán)境:conda create -n tf12 python=3.6或=3(最新)
2.激活虛擬環(huán)境:source/conda activate tf12 或source tf12/bin/activate
3.在虛擬環(huán)境里用conda安裝:conda install tensorflow-gpu==1.12,pip show tensorflow,conda info --envs
在tf12環(huán)境中conda install jupyter notebook打開,不然默認(rèn)打開base環(huán)境的jupyter
ubuntu16.04啟動Anaconda Navigator 圖形化界面,可以刪除虛擬環(huán)境:
source ~/anaconda3/bin/activate root #進(jìn)入base環(huán)境
anaconda-navigator
4.5 調(diào)用gpu
# 讓Keras只使用GPU來進(jìn)行訓(xùn)練 import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "" #"0,1" # 讓顯存不一次性占滿 import tensorflow as tf gpu_options = tf.GPUOptions(allow_growth=True) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) tf.test.is_gpu_available()True
tf.test.gpu_device_name()‘/gpu:0’
from tensorflow.python.client import device_lib print (device_lib.list_local_devices())5.目標(biāo)檢測實(shí)戰(zhàn)(Tensorflow_API_SSD)
5.1 運(yùn)行tensorflow官方示例
本文基于window10,python3.6 ,tensorflow1.12。在官網(wǎng)model里的research文件夾 :https://github.com/tensorflow/models/tree/master/research
1.window下載子目錄: object_detection文件夾右擊復(fù)制鏈接地址將/branches/branchname/替換成/trunk/,下載TortoiseSVN軟件,桌面新建文件夾選中右擊svn checkout。
2.ubuntu下載子目錄: 安裝svn:sudo apt-get install subversion,同上改為trunk,新文件夾里命令$svn checkout +改后地址。
3.ubuntu下載單文件: wget+含raw的新地址
5.2 proto文件轉(zhuǎn)py文件
Protobuf是google開發(fā)的的一套用于數(shù)據(jù)存儲,網(wǎng)絡(luò)通信時用于協(xié)議編解碼的工具庫。它和XML和Json數(shù)據(jù)差不多,把數(shù)據(jù)以某種形式保存起來。不同之處,它是一種二進(jìn)制的數(shù)據(jù)格式,具有更高的傳輸,打包和解包效率。下載Protobuf網(wǎng)址:https://github.com/google/protobuf/releases 下載壓縮文件protoc-3.7.0-win64.zip,解壓后將bin文件夾中protoc.exe復(fù)制到c/window,在工程object_detection文件夾中,進(jìn)入文件夾protos,文件夾中有很多以proto為后綴的文件,把這些proto文件轉(zhuǎn)換為py文件。與工程object_detection文件夾同級目錄中,打開cmd,不進(jìn)入object_detection文件夾,運(yùn)行jupyter notebook,新建一個ipynb文件,即點(diǎn)擊選擇New->Python3,復(fù)制下面一段代碼運(yùn)行:
import os file_list = os.listdir('object_detection/protos/') proto_list = [file for file in file_list if '.proto' in file] print('object_detection/proto文件夾中共有%d個proto文件' %len(proto_list)) for proto in proto_list:execute_command = 'protoc object_detection/protos/%s --python_out=.' %protoos.popen(execute_command) # 相當(dāng)于cmd直接打開路徑 file_list = os.listdir('object_detection/protos/') py_list = [file for file in file_list if '.py' in file] print('通過protoc命令產(chǎn)生的py文件共有%d個' %(len(py_list) - 1))重進(jìn)入文件夾object_detection/protos,文件夾中每個proto文件后都有一個py文件,即將proto文件轉(zhuǎn)py文件成功。
5.3 下載模型并運(yùn)行ipynb文件
object_detection_tutorial.ipynb中有下載預(yù)訓(xùn)練好的模型的代碼語句。代碼可以運(yùn)行,但是無法得到結(jié)果,因?yàn)榇a中的下載鏈接是國外的網(wǎng)址,所以下文刪除代碼中Download Model塊,本人提供百度云盤:鏈接:https://pan.baidu.com/s/1a4u-Xeu8KDKABlE6DfmM3Q 提取碼:ek3n 。將下載好的壓縮文件放到工程object_detection文件夾中并解壓:文件夾ssd_mobilenet_v1_coco_2017_11_17中有文件夾saved_model文件夾和6個文件
在工程object_detection文件夾中運(yùn)行cmd,打開jupter notebook,運(yùn)行下面文件:
刪除代碼塊,再run all 模塊:
本人在運(yùn)行時出現(xiàn)兩個報錯:1.刪除紅色框中內(nèi)容,運(yùn)行成功。
2.pillow庫版本之前-U升級過,版本過高,按提示安裝舊版:先pip uninstall,再用阿里云鏡像安裝:
5.4 tf_SSD
桌面新建目標(biāo)檢測2文件夾,以下為本次項(xiàng)目會用到的文件:
本文作者給讀者演示的圖片數(shù)據(jù)是來自ImageNet中的鯉魚分類
鏈接:https://pan.baidu.com/s/17iI62gt9HyRbQ-Wr8h28jw 提取碼:4swb
5.5 挑選圖片
此數(shù)據(jù)集中大部分圖片都較為清晰,但極少數(shù)圖片像素點(diǎn)少不清晰。像素點(diǎn)少的圖片不利于模型訓(xùn)練或模型測試,在目標(biāo)檢測2文件夾中cmd,打開jupyter notebook,新建重命名為:get_some_qualified_images,運(yùn)行下一段代碼后會在目標(biāo)檢測2文件夾下多出selected_images文件夾
import os import random from PIL import Image import shutil#獲取1000張圖片中隨機(jī)選出數(shù)量為sample_number*2的一部分圖片的路徑 def get_some_imagePath(dirPath, sample_number):fileName_list = os.listdir(dirPath)all_filePath_list = [os.path.join(dirPath, fileName) for fileName in fileName_list]#絕對路徑all_imagePath_list = [filePath for filePath in all_filePath_list if '.jpg' in filePath] #獲得.jpg后綴的絕對路徑some_filePath_list = random.sample(all_filePath_list, k=sample_number*2)#隨機(jī)獲取k個元素還是返回列表return some_filePath_list#獲取一部分像素足夠,即長,寬都大于300的圖片放入new_dirPath文件夾中 def get_some_qualified_images(dirPath, sample_number, new_dirPath):some_imagePath_list = get_some_imagePath(dirPath, sample_number)if not os.path.isdir(new_dirPath):os.mkdir(new_dirPath)i = 0for imagePath in some_imagePath_list:image = Image.open(imagePath)width, height = image.sizeif width > 300 and height > 300:i += 1new_imagePath = 'selected_images/%03d.jpg' %ishutil.copy(imagePath, new_imagePath)if i == sample_number:break#獲取數(shù)量為100的合格樣本存放到selected_images文件夾中 get_some_qualified_images('n01440764', 100, 'selected_images')5.6 縮小圖片
選出了100張像素足夠的圖片存放在selected_images文件夾中,本章中用代碼實(shí)現(xiàn)將像素過大的圖片做縮小:新建文件get_small_images.ipynb,運(yùn)行下段代碼:
import os from PIL import Imagedef get_smaller_images(dirPath, new_dirPath): #參數(shù)自己傳入與上文無關(guān)fileName_list = os.listdir(dirPath)filePath_list = [os.path.join(dirPath, fileName) for fileName in fileName_list]imagePath_list = [filePath for filePath in filePath_list if '.jpg' in filePath]if not os.path.isdir(new_dirPath):os.mkdir(new_dirPath)for imagePath in imagePath_list:image = Image.open(imagePath)width, height = image.sizeimageName = imagePath.split('\\')[-1]save_path = os.path.join(new_dirPath, imageName)if width >= 600 and height >= 600:minification = min(width, height) // 300 #此變量表示縮小倍數(shù)new_width = width // minificationnew_height = height // minificationresized_image = image.resize((new_width, new_height), Image.ANTIALIAS)print('圖片%s原來的寬%d,高%d, 圖片縮小后寬%d,高%d' %(imageName, width, height, new_width, new_height))resized_image.save(save_path)else:image.save(save_path)get_smaller_images('selected_images', 'smaller_images')圖片經(jīng)過PIL庫打開再保存,保持圖片質(zhì)量的情況下,能夠縮小圖片文件大小3倍左右。
5.7 圖片打標(biāo)簽
LabelImg鏈接:https://pan.baidu.com/s/1YT_s0Ef95fOJAsiG69Bmkw 提取碼:6epi
把壓縮文件windows_v1.8.0.zip放到D盤根目錄中,選擇解壓到當(dāng)前文件夾。解壓后D盤根目錄下會有windows_v1.8.0文件夾,LabelImg軟件在文件夾中。選擇D盤根目錄的原因:如果windows_v1.8.0文件夾路徑中帶有中文,打開LabelImg軟件會閃退
按W畫框,voc格式為xml,ctrl+s保存,A和D上下張 ,ctrl+d復(fù)制
已經(jīng)打標(biāo)簽好的文件夾smaller_images做成壓縮文件smaller_images.zip,鏈接:https://pan.baidu.com/s/13-fRksSjUeEii54gClA3Pw 提取碼:57lz
5.8 xml轉(zhuǎn)csv,csv轉(zhuǎn)tfrecord
目標(biāo)檢測2文件夾中新建代碼文件xml_to_csv.ipynb,cmd——>運(yùn)行jupyter notebook——>新建代碼文件——>代碼文件重命名,復(fù)制下面一段代碼到代碼文件xml_to_csv.ipynb并運(yùn)行:
import os import pandas as pd import xml.etree.ElementTree as ET from sklearn.model_selection import train_test_splitdef xmlPath_list_to_df(xmlPath_list):xmlContent_list = []for xmlPath in xmlPath_list:tree = ET.parse(xmlPath)root = tree.getroot()for member in root.findall('object'):value = (root.find('filename').text,int(root.find('size')[0].text),int(root.find('size')[1].text),member[0].text,int(member[4][0].text),int(member[4][1].text),int(member[4][2].text),int(member[4][3].text))xmlContent_list.append(value)column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']xmlContent_df = pd.DataFrame(xmlContent_list, columns=column_name) return xmlContent_dfdef dirPath_to_csv(dirPath):fileName_list = os.listdir(dirPath)all_xmlPath_list = [os.path.join(dirPath, fileName) for fileName in fileName_list if '.xml' in fileName]train_xmlPath_list, test_xmlPath_list = train_test_split(all_xmlPath_list, test_size=0.1, random_state=1)train_df = xmlPath_list_to_df(train_xmlPath_list)train_df.to_csv('train.csv')print('成功產(chǎn)生文件train.csv,訓(xùn)練集共有%d張圖片' %len(train_xmlPath_list))test_df = xmlPath_list_to_df(test_xmlPath_list)test_df.to_csv('test.csv')print('成功產(chǎn)生文件test.csv,測試集共有%d張圖片' %len(test_xmlPath_list))dirPath_to_csv('smaller_images')為了使讀者與本文作者的復(fù)現(xiàn)結(jié)果一致,本文作者將函數(shù)train_test_split的參數(shù)random_state的值設(shè)為1,這樣每次劃分的訓(xùn)練集和測試集總是相同。如果不設(shè)置此參數(shù),則每次劃分的訓(xùn)練集和測試集不同。上面一段代碼的運(yùn)行結(jié)果如下:
成功產(chǎn)生文件train.csv,訓(xùn)練集共有89張圖片
成功產(chǎn)生文件test.csv,測試集共有10張圖片
object_detection官網(wǎng)文件分享:鏈接:https://pan.baidu.com/s/19T5KCZxEKjzYJLQoWIc2qA 提取碼:2zk3 ,桌面的目標(biāo)檢測2文件夾中新建代碼文件csv_to_tfrecord.ipynb,打開cmd——>運(yùn)行jupyter notebook——>新建代碼文件——>代碼文件重命名csv_to_tfrecord.ipynb,復(fù)制下代碼運(yùn)行:
import os import pandas as pd import tensorflow as tf from object_detection.utils import dataset_util import shutildef csv2tfrecord(csv_path, imageDir_path, tfrecord_path):objectInfo_df = pd.read_csv(csv_path)tfrecord_writer = tf.python_io.TFRecordWriter(tfrecord_path)for filename, group in objectInfo_df.groupby('filename'):height = group.iloc[0]['height']width = group.iloc[0]['width']filename_bytes = filename.encode('utf-8')image_path = os.path.join(imageDir_path, filename)with open(image_path, 'rb') as file:encoded_jpg = file.read()image_format = b'jpg'xmin_list = list(group['xmin'] / width)xmax_list = list(group['xmax'] / width)ymin_list = list(group['ymin'] / height)ymax_list = list(group['ymax'] / height)classText_list = [classText.encode('utf-8') for classText in group['class']]classLabel_list = [classText_to_classLabel(classText) for classText in group['class']]tf_example = tf.train.Example(features = tf.train.Features(feature = {'image/height': dataset_util.int64_feature(height),'image/width': dataset_util.int64_feature(width),'image/filename': dataset_util.bytes_feature(filename_bytes),'image/source_id': dataset_util.bytes_feature(filename_bytes),'image/encoded': dataset_util.bytes_feature(encoded_jpg),'image/format': dataset_util.bytes_feature(image_format),'image/object/bbox/xmin': dataset_util.float_list_feature(xmin_list),'image/object/bbox/xmax': dataset_util.float_list_feature(xmax_list),'image/object/bbox/ymin': dataset_util.float_list_feature(ymin_list),'image/object/bbox/ymax': dataset_util.float_list_feature(ymax_list),'image/object/class/text': dataset_util.bytes_list_feature(classText_list),'image/object/class/label': dataset_util.int64_list_feature(classLabel_list),}))tfrecord_writer.write(tf_example.SerializeToString())tfrecord_writer.close()print('成功產(chǎn)生tfrecord文件,保存在路徑:%s' %tfrecord_path)#如果訓(xùn)練自己的模型,目標(biāo)檢測的類別不同,需要修改此處 def classText_to_classLabel(row_label):if row_label == 'fish':return 1elif row_label == 'human_face':return 2else:return Nonedir_name = 'training' if not os.path.isdir(dir_name):os.mkdir(dir_name) csv2tfrecord('train.csv', 'smaller_images', 'training/train.tfrecord') csv2tfrecord('test.csv', 'smaller_images', 'training/test.tfrecord')運(yùn)行結(jié)果:
成功產(chǎn)生tfrecord文件,保存在路徑:training/train.tfrecord
成功產(chǎn)生tfrecord文件,保存在路徑:training/test.tfrecord
成功運(yùn)行后產(chǎn)生training文件夾:
5.9 編寫pbtxt文件
在桌面文件夾目標(biāo)檢測2的文件夾training中,創(chuàng)建文本文件my_label_map.pbtxt。復(fù)制下面一段內(nèi)容到文本文件my_label_map.pbtxt中。
item {name : "fish"id : 1 } item {name : "human_face"id : 2 }
一個細(xì)節(jié)需注意,文本fish_label.pbtxt在Windows系統(tǒng)下默認(rèn)編碼格式是ANSI格式,工程中需要的就是此格式。但是本人認(rèn)為python3對utf-8編碼支持較好,所以把fish_label.pbtxt的編碼改成了utf-8格式,導(dǎo)致報錯。
5.10 編寫配置文件
ssdlite_mobilenet_v2_coco.config復(fù)制1份到目標(biāo)檢測2的文件夾training中,修改的部分為:
第9行的num_classes,對于本文來說,此數(shù)設(shè)置為2。
第143行的batch_size,對于本文來說,此數(shù)設(shè)置為5,讀者根據(jù)自己的電腦配置,可以調(diào)高或者調(diào)低。
第177行input_path設(shè)置成"training/train.tfrecord"。
第179行l(wèi)abel_map_path設(shè)置成"training/my_label_map.pbtxt"。
第191行input_path設(shè)置成"training/test.tfrecord"。
第193行l(wèi)abel_map_path設(shè)置成"training/my_label_map.pbtxt"。
第158、159這2行需要刪除。
修改保存后在training文件夾下有以下4個文件:
5.11 訓(xùn)練模型
5.11.1 解決第一個報錯
在桌面文件夾目標(biāo)檢測2中cmd,運(yùn)行程序:python object_detection/model_main.py --pipeline_config_path=training/ssdlite_mobilenet_v2_coco.config --model_dir=training --alsologtostderr
結(jié)果如下報錯:
解決:新建環(huán)境變量。
新建變量名為:PYTHONPATH,全部點(diǎn)確定按鈕。
5.11.2 解決第二個報錯
成功添加環(huán)境變量后,需要在桌面的目標(biāo)檢測文件夾中重新打開cmd。在cmd中運(yùn)行命令:python object_detection/model_main.py --pipeline_config_path=training/ssdlite_mobilenet_v2_coco.config --model_dir=training --alsologtostderr,運(yùn)行結(jié)果如下圖所示:
缺少pycocotools庫,在linux系統(tǒng)中安裝pycocotools庫只需要運(yùn)行命令:pip install pycocotools,但是在Windows上安裝則復(fù)雜得多
下載并安裝Microsoft C++ build 14.0
首先下載Microsoft C++ build 14.0,鏈接:https://go.microsoft.com/fwlink/?LinkId=691126
下載并安裝pycocotools
打開git頁面,鏈接:https://github.com/philferriere/cocoapi
對壓縮文件cocoapi-master.zip選擇解壓到當(dāng)前文件夾。進(jìn)入文件夾cocoapi-master中的文件夾PythonAPI,在此文件夾下打開cmd運(yùn)行指令:python setup.py build_ext install
5.11.3 解決第三個報錯
進(jìn)行完上面后,需要在桌面的目標(biāo)檢測文件夾中重新打開cmd。在cmd中運(yùn)行命令:python object_detection/model_main.py --pipeline_config_path=training/ssdlite_mobilenet_v2_coco.config --model_dir=training --alsologtostderr,運(yùn)行結(jié)果如下圖所示:
解決此報錯,需要閱讀上文《proto文件轉(zhuǎn)py文件》就是把object_detection/protos文件夾中將proto文件轉(zhuǎn)py文件。
5.11.4 解決第四個報錯
進(jìn)行完第3章后,使用第3章中的cmd即可。在cmd中運(yùn)行命令:python object_detection/model_main.py --pipeline_config_path=training/ssdlite_mobilenet_v2_coco.config --model_dir=training --alsologtostderr,運(yùn)行結(jié)果如下圖所示:
將models-master/research/slim文件夾中的nets文件夾移動到桌面的目標(biāo)檢測2文件夾中,即文件夾object_detection同級目錄。因?yàn)閙odels-master.zip大小為439M,但我們其實(shí)只要nets文件夾。
本文作者提供nets文件夾壓縮后的壓縮文件nets.zip: 鏈接:https://pan.baidu.com/s/18c4Ec6wfLRs-1RitxFQMzg 提取碼:658j
5.11.5 解決第五個報錯
在cmd中運(yùn)行命令:python object_detection/model_main.py --pipeline_config_path=training/ssdlite_mobilenet_v2_coco.config --model_dir=training --alsologtostderr,運(yùn)行結(jié)果如下圖所示:
修改工程文件夾object_detection中的代碼文件model_lib.py,如下圖所示,找到第418行,將category_index.values()修改為list(category_index.values())
5.12 模型測試
模型訓(xùn)練穩(wěn)定地進(jìn)行后,在桌面的目標(biāo)檢測文件夾中重新打開cmd。在cmd中運(yùn)行命令:tensorboard --logdir=training,出現(xiàn)下圖,復(fù)制到瀏覽器中打開。
將如下三個文件合并做了壓縮 鏈接:https://pan.baidu.com/s/18c4Ec6wfLRs-1RitxFQMzg 提取碼:658j,解壓后含以下三個文件夾,training文件夾里含已經(jīng)訓(xùn)練好的20萬次模型,將自己的目標(biāo)檢測2文件夾里object-detection和training替換成下載好的。
5.12.1 導(dǎo)出訓(xùn)練好的模型
在目標(biāo)檢測2文件夾中打開cmd,運(yùn)行python object_detection/export_inference_graph.py --input_type=image_tensor --pipeline_config_path=training/ssdlite_mobilenet_v2_coco.config --trained_checkpoint_prefix=training/model.ckpt-200000 --output_directory=fish_inference_graph
運(yùn)行正常需要安裝PYQT5這個庫,pip install pyqt5即可安裝好,此時目標(biāo)檢測2文件夾里多出了紅色框出的文件夾。
如下圖紅色框出是測試圖片數(shù)據(jù)集。
5.12.2 下載并運(yùn)行測試代碼
檢測代碼文件:鏈接:https://pan.baidu.com/s/1wKrqnQCGfnHTS5n9nqZ_gw 提取碼:vdj7
代碼文件fish_detection.ipynb下載完成后,復(fù)制到桌面的文件夾目標(biāo)檢測2中,在目標(biāo)檢測2中打開cmd
輸入jupyter notebook 并打開fish_detection.ipynb,如下圖所示:
n01440764文件夾中共有1300張圖片,測試圖片是隨機(jī)選的10張圖片:
總結(jié)
以上是生活随笔為你收集整理的【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS自定义地图(CAD、手绘等)
- 下一篇: 【Java7】练习:选角色,挑苹果,员工