Yolov3 的 OneFlow 实现
Yolov3 的 OneFlow 實現
1.簡介
YOLO 系列的算法(經典的v1~v3),是單階段目標檢測網絡的開山鼻祖,YOLO—You only look once,表明其單階段的特征,正是由于網絡簡單,單階段的效率較快,使其區別于 Faster-RCNN 為代表的兩階段目標檢測器,從一開始推出至今,便以速度快和較高的準確率而風靡目標檢測領域,受到廣泛使用和好評。
而Yolov3是其中的經典和集大成者(當然官方最近也推出了 Yolov4 ),其以融合了殘差網絡的 Darknet-53 為骨干網絡,融合了多尺度,3路輸出的 feature map,上采樣等特點,使其模型精度和對小目標檢測能力都大為提升。
本文,提供了 Yolov3 的 OneFlow 版實現,和其他版本實現的區別在于,將輸出特征的 nms 過程寫進了 C++ 代碼中,通過自定義 user op 的方式來調用,當然,也同時支持直接使用 python 代碼處理 nms。
2.快速開始
開始前,確保已正確安裝了oneflow,并且在python3環境下可以成功import oneflow。
- git clone 此倉庫到本地
git clone --recursive https://github.com/Oneflow-Inc/oneflow_yolov3.git - 安裝 python 依賴庫
pip install -r requirements.txt - 在項目 root 目錄下,執行:
./scripts/build.sh
執行此腳本,將 cpp 代碼中自定義的 op 算子編譯成可調用執行的 .so 文件,將在項目路徑下看到:
? libdarknet.so
? liboneflow_yolov3.so
預訓練模型
使用了 Yolov3 原作者提供的預訓練模型—yolov3.weight ,經轉換后生成了 OneFlow 格式的模型。下載預訓練模型:of_model_yolov3.zip ,并將解壓后的 of_model 文件夾放置在項目 root 目錄下,即可使用。 - 預測/推理
運行:
sh yolo_predict.sh
或者:
sh yolo_predict_python_data_preprocess.sh
運行腳本后,將在 data/result 下生成檢測后帶 bbox 標記框的圖片:
參數說明 - --pretrained_model 預訓練模型路徑
? --label_path coco 類別標簽路徑(coco.name)
? --input_dir 待檢測圖片文件夾路徑
? --output_dir 檢測結構輸出路徑
? --image_paths 單個/多個待檢測圖片路徑,如:
–image_paths ‘data/images/000002.jpg’ ‘data/images/000004.jpg’
訓練同樣很簡單,準備好數據集后,只需要執行:sh yolo_train.sh即可,數據集制作過程見下文【數據集制作】部分。
4. 數據集制作
Yolov3 支持任意目標檢測數據集,下面以 COCO2014 制作過程為例,介紹訓練/驗證所需的數據集制作,其它數據集如 PASCAL VOC 或自定義數據集等,都可以采用相同格式。
資源文件
下載 COCO2014 訓練集和驗證集圖片,將解壓后的 train2014 和 val2014 放在 data/COCO/images 目錄下
(如果本地已下載過 COCO2014 數據集,可以 ln 軟鏈接 images 至本地 train2014 和 val2014 的父目錄)
準備資源文件:labels,5k.part,trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/5k.part
wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/labels.tgz
腳本
在 data/COCO 目錄下執行腳本:
get label file
tar xzf labels.tgz
set up image list
paste <(awk “{print “KaTeX parse error: Can't use function '\"' in math mode at position 4: PWD\?"?}" <5k.part) 5k…PWD”}” <trainvalno5k.part) trainvalno5k.part | tr -d ‘\t’ > trainvalno5k.txt
copy label txt to image dir
find labels/train2014/ -name “.txt" | xargs -i cp {} images/train2014/
find labels/val2014/ -name ".txt” | xargs -i cp {} images/val2014/
執行腳本將自動解壓縮 labels.tgz 文件,并在當前目錄下生成 5k.txt 和 trainvalno5k.txt,然后將 labels/train2014 和 labels/val2014 的所有 label.txt 文件復制到對應的訓練集和驗證集文件夾中( 保證圖片和 label 在同一目錄 )。
至此,完成整個數據集的準備過程。
5.訓練
修改 yolo_train.sh 腳本中的參數,令:–image_path_file=“data/COCO/trainvalno5k.txt” 并執行:
sh yolo_train.sh
即可開始訓練過程,更詳細的參數介紹如下:
? --gpu_num_per_node 每臺機器使用的gpu數量
? --batch_size 批大小
? --base_lr 初始學習率
? --classes 目標類別數量(COCO 80;VOC 20)
? --model_save_dir 模型存放文件夾路徑
? --dataset_dir 訓練/驗證集文件夾路徑
? --num_epoch 迭代總輪數
? --save_frequency 指定模型保存的epoch間隔
說明
目前如果調用 yolo_predict.sh 執行,數據預處理部分對 darknet 有依賴
其中:
predict decoder 中調用 load_image_color、letterbox_image 函數
train decoder 中調用 load_data_detection 函數
主要涉及以下操作,在后續的版本中會使用 OneFlow decoder ops 替換
? image read
? nhwc -> nchw
? image / 255
? bgr2rgb
? resize_image
? fill_image
? random_distort_image
? clip image
? random flip image and box
? randomize_boxes
? correct_boxes
總結
以上是生活随笔為你收集整理的Yolov3 的 OneFlow 实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ResNet网络的训练和预测
- 下一篇: BERT模型的OneFlow实现