10.YOLO系列及如何訓練自己的資料。
SSD失敗之後就挺失望的,而且莫名其妙,於是轉向YOLO了,其實object detection領域可選的模型並不多,RCNN系列我是大概看過的,還寫過:RCNN系列,但是這種location和classification分開的思路,要達到實時的話我的硬體條件肯定是不可能的。YOLOV3我是在TX2上跑過的:YOLOV3-TX2跑起來,而且YOLO是有簡化版本的模型的,對於簡單應用應該是夠了。
因為以前跑過,整體的流程走下來還算比較順利,比起SSD來說,訓練時要修改的程式碼也比較少,可能留給犯錯的概率就少一些。
我分以下幾個部分:
- 1. YOLO系列簡介。
- 2. 編譯環境準備。
- 3. 訓練配置。
1. YOLOV3系列簡介。
1.1:簡介。
- 作者:Joseph Redmon
- YOLO主頁:ofollow,noindex">YOLO
- 作者github: https://github.com/pjreddie
- 模型簡介:You only look once (YOLO) is a state-of-the-art, real-time object detection system. On a Pascal Titan X it processes images at 30 FPS and has a mAP of 57.9% on COCO test-dev.
和其他模型的對比:(總結起來一句話:比它快的準確率沒有它高,準確率比它高的沒有他快)
Model | Train | Test | mAP | FLOPS | FPS | Cfg | Weights |
---|---|---|---|---|---|---|---|
SSD300 | COCO trainval | test-dev | 41.2 | - | 46 | link | |
SSD500 | COCO trainval | test-dev | 46.5 | - | 19 | link | |
YOLOv2 608x608 | COCO trainval | test-dev | 48.1 | 62.94 Bn | 40 | cfg | weights |
Tiny YOLO | COCO trainval | test-dev | 23.7 | 5.41 Bn | 244 | cfg | weights |
SSD321 | COCO trainval | test-dev | 45.4 | - | 16 | link | |
DSSD321 | COCO trainval | test-dev | 46.1 | - | 12 | link | |
R-FCN | COCO trainval | test-dev | 51.9 | - | 12 | link | |
SSD513 | COCO trainval | test-dev | 50.4 | - | 8 | link | |
DSSD513 | COCO trainval | test-dev | 53.3 | - | 6 | link | |
FPN FRCN | COCO trainval | test-dev | 59.1 | - | 6 | link | |
Retinanet-50-500 | COCO trainval | test-dev | 50.9 | - | 14 | link | |
Retinanet-101-500 | COCO trainval | test-dev | 53.1 | - | 11 | link | |
Retinanet-101-800 | COCO trainval | test-dev | 57.5 | - | 5 | link | |
YOLOv3-320 | COCO trainval | test-dev | 51.5 | 38.97 Bn | 45 | cfg | weights |
YOLOv3-416 | COCO trainval | test-dev | 55.3 | 65.86 Bn | 35 | cfg | weights |
YOLOv3-608 | COCO trainval | test-dev | 57.9 | 140.69 Bn | 20 | cfg | weights |
YOLOv3-tiny | COCO trainval | test-dev | 33.1 | 5.56 Bn | 220 | cfg | weights |
YOLOv3-spp | COCO trainval | test-dev | 60.6 | 141.45 Bn | 20 | cfg | weights |
1.2.YOLO原理。
論文我正在看,等我看完了再寫這一部分,但是因為這個模型的訓練和檢測框架都是端到端的,所以即使 不瞭解中間的細節也是可以訓練和檢測的。
2. 編譯環境準備。
相較於其他模型來說,darknet的編譯環境是最簡單的。因為他並沒有用時下比較流行的深度學習框架來寫,而是作者自己用C擼了一個框架:darknet 。這個框架是用C和CUDA-C來寫的(這程式碼能力就只有仰望的份了),所以裝了ubuntu系統裝好以後就可以用了,非常簡單。
如果需要(一般肯定是需要的)GPU加速的話,那麼需要安裝NVIIDA的那一套東西(驅動,CUDA,CUDNN),如果需要測試視訊和顯示視訊或者照片的話,那麼需要安裝opencv。
所以是不是很簡單?
我自己的電腦是win10+ubuntu的雙系統。win10下darknet也是可以配置的,但是為了簡單和適應linux系統我這次還是選擇了ubuntu系統,中間安裝opencv的時候空間不夠了,我手賤想從win10下面分出來一點空間來給ubuntu的時候,出了岔子,ubunut系統崩掉了,一氣之下我把C盤清空了,兩個系統都重灌了。
裝系統的話就不多說了,win10下裝ubuntu的話大概以下幾個步驟:
- ①從win的系統盤右鍵壓縮出來50G(有的話可以再多點)的未分配的空間。(可能是綠色或者黑色的,不是很影響)
- ②製作ubuntu的u盤啟動盤,用軟碟通就可以,這個很簡單。
-
③重啟,進bios,從u盤啟動,順便把電腦的網斷了(拔掉網線或者關閉wifi),然後安裝,不要選擇安裝更新,並且自己分配空間,就從剛才從win10上壓縮的未分配空間來分配。
然後基本就可以了,如果遇到什麼問題,勤百度,這寫坑基本上都有。
至於安裝NVIDIA的那一套,網上也是有很多教程,我也是踩了很多坑,現在也無法截圖寫教程了,就不說了,這一套更新挺快的,並不是越新越好(越適合自己的專案),注意各個版本需要匹配。
opencv的編譯寫一下,因為我正在弄。
- ①安裝一些依賴環境:
sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev sudo apt-get install –assume-yes libopencv-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev
選擇的地方全部選擇yes,然後等待安裝完成就可以了。
- ② 下載opencv原始碼,這個自己想辦法吧,網路好的話還是比較快的。然後解壓。
- ③ 配置cmake編譯。
cd opencv-3.4.1#解壓的檔案 mkdir build#建立build資料夾 cd build#進入build資料夾 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_GTK=ON -D WITH_GTK_2_X=ON -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" .. #配置cmake sudo make#編譯
編譯還是挺慢的,我跑了步回來還沒好,耐心等著就可以了。
然後
sudo make install#這個sudo是必須的,要不會因為許可權問題產生錯誤
這樣就可以了,有的教程寫這裡需要新增動態連線什麼的,我倒沒有這麼做,就直接可以用了。
- ④測試。
mkdir opencv_cpp#建立一個資料夾: gedit lena.cpp#建立測試檔案 gedit CMakelist.txt #建立CMakeLists檔案 cmake .#編譯標頭檔案和原始檔 make #生成可執行檔案
CMakelist.txt 裡面寫的是:
cmake_minimum_required(VERSION 2.8) project( DisplayImage ) find_package( OpenCV REQUIRED ) add_executable( LENA lena.cpp ) target_link_libraries( LENA ${OpenCV_LIBS} )
cpp檔案裡寫的是:
#include <stdio.h> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv ) { if ( argc != 2 ) { printf("usage: DisplayImage.out <Image_Path>\n"); return -1; } Mat image; image = imread( argv[1], 1 ); if ( !image.data ) { printf("No image data \n"); return -1; } namedWindow("Display Image", WINDOW_AUTOSIZE ); imshow("Display Image", image); waitKey(0); return 0; }
然後找一張照片命名lena.jpg
,放到lena.cpp
的同級目錄下。
最後執行:
./LENA lena.jpg
看到顯示照片的話就說明沒有問題了。
c++版本的opencv這裡就可以用了,但是沒有好用的編輯器,還是不如win下面VS寫起來好用。
未完待續……