ChainerCV: 一個用於深度學習的計算機視覺庫
ChainerCV是一個基於Chainer用於訓練和執行計算機視覺任務的神經網路工具。它涵蓋了計算機視覺模型的高質量實現,以及開展計算機視覺研究的必備工具集。
這些是由ChainerCV支援的檢測模型的輸出。
安裝
$ pip install -U numpy
$ pip install chainercv
使用Anaconda的安裝指令在這裡(推薦)。
要求
- Chainer和它的依賴項
- Pillow
- Cython (建立需求)
附加特徵
- Matplotlib
- OpenCV
在Python 2.7.12和3.6.0的環境下獲得了測試。
- 主分支將在穩定版本(v2)和開發版本(v3)上工作。
- 對於使用Chainer v1的使用者,請使用0.4.11版本,它可以由命令列
pip install chainercv==0.4.11
安裝。這個分支是不受維護的。
特性
資料慣例
ChainerCV遵循以下慣例
- 彩色影象的通道被命令為RGB。影象陣列的形狀是CHW形式(channel(通道)、height(高度)、width(寬度))。
- 軸依賴的值遵循行列的順序。
1.影象的形狀總是被表示為(height,width)。
2.邊界框的座標被排序為(y_min, x_min, y_max, x_max)。(y_min, x_min)和(y_max, x_max)分別是左上的座標和右下頂點的邊界框。
3.關鍵點的座標被排序為(y,x)。
模型
目前, ChainerCV支援物件檢測和語義分割的網路。我們計劃在未來支援不同任務的網路。影象檢測是在影象中查詢物件並對物件進行分類的任務。語義分割是將影象分割成塊並將物件標籤分配給它們的任務。我們的實現包括:
檢測模型
- Faster R-CNN
- Single Shot Multibox Detector (SSD)
語義分割
- SegNet
某些任務的模型被設計成具有公共介面。例如,檢測模型支援方法,它獲取影象和輸出座標、類標籤和在估計的物件區域中預測的邊界框的置信度。通用介面允許使用者在程式碼中輕鬆地交換不同的模型。最重要的是,使用的程式碼在這個介面之上構建。
例如,有一個chainer.training.Trainer
ChainerCV在一個檔案系統內下載和儲存檔案,使用Chainer的下載機制,方便地從網際網路上下載預先訓練的模型。便捷介面加上這個功能允許使用者用兩行程式碼來執行演算法:
from chainercv.links import FasterRCNNVGG16, SSD300# You can use Faster R-CNN instead of SSD.# model = FasterRCNNVGG16(pretrained_model='voc07')model = SSD300(pretrained_model='voc0712')# `bboxes` is a list of numpy arrays containing coordinates of boundnig boxes# around objects. `labels` and `scores` are class ids and confidence scores for# the boxes.bboxes, labels, scores = model.predict(imgs) # imgs is a list of image
使用下面的命令,你可以執行一個視覺化演示。
$ cd examples/ssd # or cd examples/faster_rcnn $ wget https://cloud.githubusercontent.com/assets/2062128/26187667/9cb236da-3bd5-11e7-8bcf-7dbd4302e2dc.jpg -O sample.jpg $ python demo.py sample.jpg
使用下面的命令,可以生成頁面頂部的視覺化。
$ cd examples/detection
$ python visualize_models.py
轉換
ChainerCV提供了通用函式以在饋送到神經網路之前執行資料預處理。我們希望使用者使用這些函式和物件一起支援資料介面(例如chainer.dataset.DatasetMixin)。使用者可以通過定義一個函式來建立一個定製的預處理管道,該函式描述一個過程來轉換傳入的資料。通過將預處理步驟與資料集物件分離,資料集物件可以在各種預處理管道中重用。這裡有一個例子,使用者可以對影象進行隨機旋轉(random_rotate),並將其作為預處理步驟應用到影象上。
from chainer.datasets import get_mnistfrom chainer.datasets import TransformDatasetfrom chainercv.transforms import random_rotate
dataset, _ = get_mnist(ndim=3)def transform(in_data): # in_data is values returned by __getitem__ method of MNIST dataset.
img, label = in_data
img -= 0.5 # rescale to [-0.5, 0.5]
img = random_rotate(img) return img, label
dataset = TransformDataset(dataset, transform)
img, label = dataset[0]
如在本例中所發現的,random_rotate是由ChainerCV提供的轉換之一。與其他轉換一樣,這只是一個將陣列作為輸入的函式。