谷歌開放的TensorFlow Object Detection API 效果如何?對業界有什麼影響?

谷歌開放了一個 Object Detection API: Supercharge your Computer Vision models with the TensorFlow Object Detection API


模型本身並沒有太多新意,因為大家基本上都有了,但是我覺得最重要的是提供了工程實踐的樣例,這個對於訓練新的模型,包括訓練工程師們用正確的方法設計模型,都是有幫助的。

比如說TF-Slim:雖然Keras那麼響亮,但是做computer vision的話就是Slim的抽象最合適也最容易重構。Sergio從Caffe的年代就開始在科研一線考慮模型設計和抽象的問題,經過那麼多框架的迭代,在CV上比拍腦袋的Keras還是好太多。

我在TF的一位朋友這麼說:框架特別是像TF這樣的框架就像C++,學習曲線陡,牛人可以用得爐火純青,不熟的人可以造成很強的反效果 - 這也是我對TF有保留意見的一個地方,設計是按照Google資深工程師的技術功底來搞的,然後平時就像是讓小朋友開車那樣恐怖。現在這些模型和代碼,就是教小朋友開車啦。這樣做可以對整個領域有很好的幫助,設計訓練自己的模型可以更加簡單高效,也不容易掉進前人掉進過無數次的坑。

具體的就不展開了。。。帶娃帶娃。


寫個簡單的科普帖吧。

熟悉TensorFlow的人都知道,tf在Github上的主頁是:tensorflow,然後這個主頁下又有兩個比較重要的repo(看star數就知道了),分別是TensorFlow的源代碼repo:tensorflow/tensorflow,還有一個tensorflow/models。後者tensorflow/models是Google官方用TensorFlow做的各種各樣的模型,相當於示例代碼,比如用於圖像分類的Slim,深度文字OCR,以及用於NLP任務的句法分析模型syntaxnet,Seq2Seq with Attention等等等等。這次公布的Object Detection API同樣是放在了tensorflow/models里。

再來說下這次公布的代碼的實現方式。首先,對於目標檢測這個任務來說,前面必須有一個像樣的ImageNet圖像分類模型來充當所謂的特徵提取(Feature Extraction)層,比如VGG16、ResNet等網路結構。TensorFlow官方實現這些網路結構的項目是TensorFlow Slim,而這次公布的Object Detection API正是基於Slim的。Slim這個庫公布的時間較早,不僅收錄了AlexNet、VGG16、VGG19、Inception、ResNet這些比較經典的耳熟能詳的卷積網路模型,還有Google自己搞的Inception-Resnet,MobileNet等。

我們在TensorFlow Object Detection API的官方安裝指南(地址:tensorflow/models)中,可以看到這樣一句代碼:

# From tensorflow/models/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

很顯然,這就是欽點用Slim作特徵抽取了。

另外,以Faster RCNN為例,之前在github上,可以找到各種各樣非官方的TensorFlow實現,但是這些實現使用的特徵抽取層都不是Slim,而是五花八門的什麼都有,另外一方面實現代碼大量copy自原始的caffe的實現:rbgirshick/py-faster-rcnn,這次公布的代碼里已經一點也找不到原始caffe實現的痕迹了。最後,原來非官方的Object Detection實現的質量參差不齊,去年我調過一個Faster RCNN,過程比較痛苦,在運行之前瘋狂debug了三天才勉強跑了起來。這次Google官方公布的Object Detection API別的不說,代碼質量肯定是過的去的,因此以後應該不會有人再造TensorFlow下Faster RCNN、R-FCN、SSD的輪子了。

說完了代碼,再簡單來說下公布的模型。主要公布了5個在COCO上訓練的網路。網路結構分別是SSD+MobileNet、SSD+Inception、R-FCN+ResNet101、Faster RCNN+ResNet101、Faster RCNN+Inception_ResNet。後期應該還會有更多的模型加入進來。

--------------------------------------分割線----------------------------------

最後,給新手朋友提供一個可以跑出官方Demo效果的小教程,非常簡單,用5分鐘的時間就可以跑一遍感受一下,只要安裝了TensorFlow就可以,有沒有GPU都無所謂。

1. 安裝或升級protoc

首先需要安裝或升級protoc,不然在後面會無法編譯。

安裝/升級的方法是去protobuf的Release界面:google/protobuf,下載對應的已經編譯好的protoc。

比如我是64位的ubuntu,那麼就下載protoc-3.3.0-linux-x86_64.zip。下載解壓後會有一個protoc二進位文件,覆蓋到對應目錄即可(如果不放心的可以用cp /usr/bin/protoc ~/protoc_bak先備份一下):

sudo cp bin/protoc /usr/bin/protoc

2. 下載代碼並編譯

下載tensorflow/models的代碼:

git clone https://github.com/tensorflow/models.git

進入到models文件夾,編譯Object Detection API的代碼:

# From tensorflow/models/
protoc object_detection/protos/*.proto --python_out=.

3. 運行notebook demo

在models文件夾下運行:

jupyter-notebook

訪問文件夾object_detection,運行object_detection_tutorial.ipynb:

依次shift+enter運行到底就行了。這個Demo會自動下載並執行最小最快的模型ssd+mobilenet。

最後的檢測效果,一張是汪星人圖片:

還有一張是海灘圖片:

4. 使用自己的圖片做檢測

如果要檢測自己的圖片,那麼更改TEST_IMAGE_PATHS為自己的圖片路徑就可以了。這裡我隨便選了一張COCO數據集中的圖片:

TEST_IMAGE_PATHS=["/home/dl/COCO_train2014_000000000009.jpg"]

檢測結果:

5. 使用其他模型做檢測

一共公布了5個模型,上面我們只是用最簡單的ssd + mobilenet模型做了檢測,如何使用其他模型呢?找到Tensorflow detection model zoo(地址:tensorflow/models),根據裡面模型的下載地址,我們只要分別把MODEL_NAME修改為以下的值,就可以下載並執行對應的模型了:

MODEL_NAME = "ssd_inception_v2_coco_11_06_2017"

MODEL_NAME = "rfcn_resnet101_coco_11_06_2017"

MODEL_NAME = "faster_rcnn_resnet101_coco_11_06_2017"

MODEL_NAME = "faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017"

完。


謝邀,沒任何影響。
還需要直接用這種公開數據集上model的公司直接可以忽略了。
話說回來世界上也就只有Google放個在公開數據集上train出來的model還會被當成個大新聞了吧


跟大多數人的觀點類似, 只是開放模型對大多數公司而言沒什麼用, 對於學生們而言就是多了一個可能穩定一點的可以一鍵run的example.. 對Google而言, 主要是推廣平台和框架。

對於大多數搞CV的公司而言, 檢測的技術存在的價值還是在差異化領域的特定數據場景下的調優(精確度和速度)。 如果說現在公開的不只是模型, 而是一整套完備可定製的訓練+deploy服務, 大多數用戶只需要把訓練數據上傳, 以及告知想要達到的檢測要求, 系統就會自動幫你調優, 這才是大新聞.. 只有這樣才能真正降低CV, 至少是物體檢測這一領域的門檻,讓普通開發者和產品人都能訓上自己的模型。


今天終於通過Tensorflow Object Detection API中的faster_rcnn_inception_resnet_v2來訓練自己的數據了,簡單記錄如下:(參考: https://github.com/tensorflow/models/blob/master/object_detection/g3doc/preparing_inputs.md

https://github.com/tensorflow/models/blob/master/object_detection/g3doc/running_pets.md)


這裡,安裝Tensorflow 和 Tensorflow Object Detection API就不說了,參考https://github.com/tensorflow/models/blob/master/object_detection/g3doc/installation.md與樓上何之源的科普帖.
為了保證訓練過程中不修改原API源碼目錄結構,在其他地方新建了一個文件夾TF-OD-Test:如/home/shz/TF-OD-Test
1、訓練數據集準備
在TF-OD-Test目錄下新建文件夾data
由於數據集是PASCAL VOC2007格式的,並不符合API所需的TFRecord格式,需要轉換,API已經為我們提供了代碼:

但是這裡我們需要做個簡單的修改:
create_pascal_tf_record.py第160行
examples_path = os.path.join(data_dir, year, "ImageSets", "Main",
"aeroplane_" + FLAGS.set + ".txt")
可改為
examples_path = os.path.join(data_dir, year, "ImageSets", "Main",
FLAGS.set + ".txt")

然後運行以下命令:
# From tensorflow/models/object_detection/

python create_pascal_tf_record.py --data_dir=`自己的數據集路徑`
--year=VOC2007 --set=train --output_path="TF-OD-Test/data/pascal_train.record"
python create_pascal_tf_record.py --data_dir=/home/user/VOCdevkit
--year=VOC2007 --set=val --output_path="TF-OD-Test/data/pascal_val.record"

注意,文件data/pascal_label_map.pbtxt中的labels需要改為自己的。

執行後會在TF-OD-Test/data文件夾下生成pascal_train.record和pascal_val.record兩個文件.

同時將修改後的pascal_label_map.pbtxt文件拷貝到TF-OD-Test/data目錄下

2、下載預訓練模型faster_rcnn_inception_resnet_v2
在TF-OD-Test目錄下新建文件夾models
cd TF-OD-Test/models
wget http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017.tar.gz
tar -xvf faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017.tar.gz
cp faster_rcnn_resnet101_coco_11_06_2017/model.ckpt.* TF-OD-Test/models

3、修改配置文件
將文件object_detection/samples/configs/faster_rcnn_inception_resnet_v2_atrous_pets.config複製到TF-OD-Test/models並打開做如下修改:
1)num_classes:修改為自己的classes num
2)將所有PATH_TO_BE_CONFIGURED的地方修改為自己之前設置的路徑(共5處)

4、訓練
終於可以訓練了,進入object_detection目錄,運行:
python train.py --train_dir="/home/shz/TF-OD-Test/train" --pipeline_config_path="/home/shz/TF-OD-Test/models/ssd_mobilenet/ssd_mobilenet_v1_pascal.config"

開始享受訓練吧

5、tensorboad:
tensorboard --logdir=/home/shz/TF-OD-Test/train

第一次寫這麼長,關於格式和表述,需要的同學將就著看吧:)


對於CV業內人士和企業來說可以說等於沒有太大意義,一方面這些模型業內人士幾乎都會用,另一方面,直接用對於技術性要求高的企業來說,肯定也沒那麼大作用。

但是開放我覺得更大的意義在於對於非CV圈的軟體開發行業有非常大的促進意義,把簡單應用的門檻降低,從軟體開發的角度可以促進更多產品化的思考,畢竟,一位業界大牛加師兄就說過一句我很認同的話,具體人士就不透露了,推動一個行業真正大規模發展產品化的應該是開發人員和產品人,現在CV和AI的推動者大多還是科學家們,所以未來門檻會陸續降低,讓開發者和產品人更低門檻的實現無窮的產品確實應該是個大趨勢。

所以說回來,開放這些API也是降低門檻的一種,當然,腹黑一點,不懂CV和AI的開發者以後也沒那麼容易被忽悠,行業真正做到術業有專攻。


效果還不錯


之前大部分目標檢測演算法都是用caffe實現的,他這是要擴大自己的地盤呀。


看著非常工程化的代碼,在這個代碼的基礎上調調參數還方便,但是大改不好改。一般做科研的也沒有把代碼寫得這麼抽象的。所以對做科研的也許沒什麼幫助。


當然用來給導師干私活可以節省時間,也是有助於科研了吧....


nms沒用GPU實現。。感覺這個卡太多時間了


今晚試了一下,感覺準確率不高啊,給的test_image中,都有人沒識別出來


相當於多了一個examples的目錄吧,方便直接跑一下看一下效果以及初學tensorflow


雖說github上輪子已經足夠多了,不過google出品的輪子質量還是有保證的。個人比較看好SSD+MobileNet移動端的輪子。用了一下效果也很好。不過只看到使用pb的預測文檔和GCP文檔。如果有這些模型的本地訓練自己樣本的文檔就更方便了。


推薦閱讀:

TAG:谷歌 (Google) | 計算機視覺 | 目標檢測 | 深度學習(Deep Learning) | TensorFlow |