Watson Visual RecognitionのCollectionに１度に複数画像を学習するコードをJavaで実装してみた

## はじめに
Watson Visual RecognitionのCollectionにデータを投入する際、コードを書く以外では、1つ1つコードを実装しなくてはならず、手間がかかります。 
今回Javaのコードで複数の画像を一気にトレーニングできるコードを実装しました。


## Javaの実行環境構築
1. JDKのインストール  
JDKのインストールは下記URLから行います。  
http://www.oracle.com/technetwork/java/javase/downloads/index.html  

　インストール方法は、下記URLを参考にしてください。
http://qiita.com/hiesiea/items/54e49dabfb5606edb54d#2-jdk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
　　
2. eclipseのインストール
eclipseのインストールは下記URLから行います。 
http://www.eclipse.org/downloads/  

　インストール方法は、下記URLを参考にしてください。
http://qiita.com/hiesiea/items/54e49dabfb5606edb54d#3-eclipse%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
　　
3. Maven projectの作成
eclipseの「New」→「Project」→「Maven Project」を作成します。
![maven1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/604984fb-4bb5-00b6-2918-45461ae66789.png)

## コードの入手、設定
1. コードのダウンロード
下記のURLから、コードをダウンロードします。  
https://github.com/takana-at/VisualRecognition-training  
ダウンロードしたら、コードを展開します。  
　　
2. コードの配置  
sample.appプロジェクトに下記クラスをコピーします。  
　・AddToCollection.java  
　・AddToCollectionThread.java  
　・TrainingDefinition.java  

## Visual RecognitionのCollectionにトレーニングデータをアップロード
### Visual Recognitionサービスの作成
1. Bluemix上でVisual Recognitionのサービスを作成します。  
下記URLからBluemixにログインし、「カタログ」→「Watson」→「Visual Recognition」サービスを作成します。  
https://console.bluemix.net/  

2.　Visual Recognitionのサービスを作成したら、「サービス資格情報」→「Credentials-1」から、{api_key}を確認し、メモしておきます。  
![visual_recognition1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/9d230951-9c49-e420-b093-89cdf285de9f.png)

### Visual RecognitionにCollection作成
1. Visual Recognitionサービスにcollectionを作成します。  
下記URLにアクセスし、「Parameters」→「api_key」に先ほどメモしたapi_key、「name」に任意の名前を入れて、「try it out!」をクリックします。  
https://watson-api-explorer.mybluemix.net/apis/visual-recognition-v3#!/visual45recognition/post_v3_collections

![visual_recognition2.png](https://qiita-image-store.s3.amazonaws.com/0/185050/67f6a23f-76ac-3093-1f8e-81cfcc20c8b6.png)
　　
2. collectionが作成できたら、下記の画面になりますので、「collection_id」をメモしておきます。
また、「status」が「Available」になっていることを確認します。
![visual_recognition3.png](https://qiita-image-store.s3.amazonaws.com/0/185050/6dd7056f-e2cf-c017-dfbe-a0669caaf806.png)

### Javaのコードを実行する  
AddToCollection.javaを実行します。  
1. AddToCollectionThread.javaのコードを変更します。
このクラスのコードの{api_key}を先ほどメモしたapi_keyに変更します。

2.　アップロードする画像を配置します。
画像は、project直下に「trainImage」フォルダを作成し、「trainImage」フォルダ内に「画像ID名」のフォルダを作成し、「画像ID名」のフォルダに画像を配置してください。
この画像IDは、人物ごとに振り分けるために使用していますので、同一人物は同じ画像ID名のフォルダ内に配置してください。

```
PROJECTNAME
|-trainImage
   |-IMGID_NAME
      |-IMG  
      |-IMG
```

たとえば、下記のように「female」という画像ID名のフォルダに、「m010469.jpg」、「m010462.jpg」の画像を格納します。  
![readd1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/f0fa09c6-2b36-84fe-bf8a-bbc8f5ef62c7.png)

※今回使用した画像
・https://model.foto.ne.jp/free/product_info.php/cPath/24_252_256/products_id/300378
・https://model.foto.ne.jp/free/product_info.php/cPath/24_252_256/products_id/302141


3.　アップロードするメタファイルの配置します。
画像は、project直下に「trainMetafile」フォルダを作成し、「trainMetafile」フォルダ内にtrainImageフォルダ内と同じ「画像ID名」のフォルダを作成し、「画像ID名」のフォルダにその画像IDに関する人物の情報をjsonファイルで配置してください。
このときjsonファイルのファイル名は「画像ID名.json」にしてください。
「trainMetafile」フォルダに格納したjsonファイルによって、trainImageに格納した画像の追加情報を登録することができます。

```
PROJECTNAME
|-trainMetafile
   |-IMGID_NAME
      |-IMGID_NAME.json
```

たとえば、下記のように「female」という画像ID名のフォルダに、「female.json」という名前のjsonファイルを格納します。  
![readd2.png](https://qiita-image-store.s3.amazonaws.com/0/185050/8c83883a-691e-fee6-b103-61645b23bdfc.png)

Metafileを作成する際は、下記コードを参考にしてください。

```ruby:Metafileの記入例(femaleA.json)
{"name":"女性A","img_name":"femaleA","img_url":"https://model.foto.ne.jp/free/product_info.php/cPath/24_252_256/products_id/300378"}
```



4.　引数には、下記を入れて実装します。
  「./trainImage」
![AddToCollection2.png](https://qiita-image-store.s3.amazonaws.com/0/185050/d3fe2ac1-06d7-a6f9-3f72-777d26c5c346.png)

5.　実行結果は以下のようになります。
![add4.png](https://qiita-image-store.s3.amazonaws.com/0/185050/bbc58807-6fe7-5bd1-c574-7a5b9619dea0.png)


### Collectionを確認する
Collectionにトレーニングデータが追加されたか確認します。  
1. 下記URLにアクセスし、「Parameters」→「api_key」、「collection_id」にAddToCollection.javaを実装した際に入力したapi_key、collection_idを入れて、「try it out!」をクリックします。
https://watson-api-explorer.mybluemix.net/apis/visual-recognition-v3#!/visual45recognition/get_v3_collections_collection_id_images!
![List100image1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/3a4a4fb0-a6a5-0ddc-c23e-cc2ede1a9793.png)

2.　collectionに登録した画像の一覧を表示し、collectionの「images」に登録した画像が登録されていたら、トレーニングまで完了です。
![add6.png](https://qiita-image-store.s3.amazonaws.com/0/185050/f7e048ca-905d-7106-2530-224c0cff10cc.png)