シンプルなデータインジェクションツール

# data source
機械学習モデルにデータを与えるパイプラインを一般化するために作りました。
srcは[こちら](https://github.com/uyuutosa/data_source)です。

* 様々なフォーマット(csv, 画像, webcam, 動画)からのデータの吐き出し
* 訓練データとテストデータの分割
* 複数データ・セットを包括して一つのデータ・セットとして保持する

ということができます。

## Installing
```
pip install -r requirements.txt
```

## 使い方
モジュールをインポートします。

```python
import cv2
import data_source_factory as dsf
from numpy import *
```
### 画像セットの読み込み

現状は以下の様なディレクトリ構成をサポートしています。



```
sample/directory_type1
├── cat00.jpg
├── cat01.jpg
├── cat02.jpg
├── cat03.jpg
├── cat04.jpg
├── cat05.jpg
├── cat06.jpg
├── cat07.jpg
├── cat08.jpg
├── cat09.jpg
└── cat10.jpg
```

```sh
sample/directory_type2
├── a
│   ├── cat00.jpg
│   ├── cat01.jpg
│   └── cat02.jpg
├── b
│   ├── cat00.jpg
│   ├── cat01.jpg
│   └── cat02.jpg
├── c
│   ├── cat00.jpg
│   ├── cat01.jpg
│   └── cat02.jpg
└── d
    ├── cat00.jpg
    ├── cat01.jpg
    └── cat02.jpg
```

下記のようにディレクトリパスを定義します。

```python
images_1 = dsf.DataSourceFactory().create('sample/directory_type1')
images_2 = dsf.DataSourceFactory().create('sample/directory_type2')         
```

このクラスはイテレータ属性がついており、for分で回すことができます。

```python
print('images 1:')
for i in images_1:
    print(i)
    
print('images 2:')
for i in images_2:
    print(i)
```

結果はPIL.Image形式で返ります。

```python
images 1:
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x374 at 0x10DEC2AC8>
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=300x280 at 0x10DF5E630>
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=312x396 at 0x10DF54518>
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x414 at 0x10DF5E630>
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=499x375 at 0x10DF5E2E8>

images 2:
[<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x374 at 0x10DF5E668>, <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=300x280 at 0x10DF5E748>, <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=312x396 at 0x10DF5E7B8>]
[<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x374 at 0x10DF5E6A0>, <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=300x280 at 0x10DF5E828>, <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=312x396 at 0x10DF5E898>]
```

### 動画の読み込み
現在はavi, mov mp4形式に対応しています。ただし内部でOpenCVを使っているため、そちらで使えるよう設定されていることが必要です。

以下のようにして動画を読み込みます。

```python
dog_movie = dsf.DataSourceFactory().create('sample/dog.mov')
```

データの長さはlen()で確認できます。

```python
len(dog_movie)
```


画像セットと同様for文で回せます。下記のようにすることで動画再生ができます(ただし、動画再生が目的ではないので遅いです)。

```python
for i in dog_movie:
    cv2.imshow("dog", array(i)[...,::-1])
    cv2.waitKey(1)
```

DataSouceはWeb cameraに対応しています。カメラ番号をpathとして入力すると、カメラが起動します。

こちらも下記のようにして動画にできます(遅いです)。

```python
for i in web_cam:
    cv2.imshow("web cam", array(i)[...,::-1])
    cv2.waitKey(1)
```

### CSVファイルの読み込み

例えば、以下のようなiris.csvを読み込みます。

```csv
sepal_length,sepal_width,petal_length,petal_width,species
5.1,3.5,1.4,0.2,setosa
4.9,3,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
4.6,3.1,1.5,0.2,setosa
5,3.6,1.4,0.2,setosa
5.4,3.9,1.7,0.4,setosa
4.6,3.4,1.4,0.3,setosa
5,3.4,1.5,0.2,setosa
4.4,2.9,1.4,0.2,setosa
:
:
```

必要なカラム名を`column_lst`に入力します。

```python
#select what columns extract from csv file as to input 'column_lst'
csv  = dsf.DataSourceFactory().create('sample/iris.csv', column_lst=['sepal_length', 'species'])
```

下記のように指定したカラムのデータが吐き出されます。

```python
for i, line in enumerate(csv):
    print(line)
    if i == 10: break
```

```
[5.1 'setosa']
[4.9 'setosa']
[4.7 'setosa']
[4.6 'setosa']
[5.0 'setosa']
[5.4 'setosa']
[4.6 'setosa']
[5.0 'setosa']
[4.4 'setosa']
[4.9 'setosa']
[5.4 'setosa']
```