【MATLAB】魚写真データセットをgoogle画像検索のスクレイピングで作る

# 概要
ダイビングで撮りためた大量の魚写真。
何が写っているのか判定して，ラベル付け，自動整理するツールを作ろうと思い立ちました。

この3ステップでやっていきます。
1. google画像検索で魚写真を集め，データセットを作成
2. 1のデータセットを用いて，GoogLeNetの転移学習
3. 2のネットワークを用いて，手持ち写真の魚の名前を推定，ラベル付け


今回は1の備忘録です。


# 事前準備
- Google Custom Search APIを使用できるようにする

[[1]のサイト](#参考文献)を参考にさせていただき，設定しました。

- 魚名リストの準備

csvファイルで作成。
このリストを上から検索していきます。
tableデータとして読み込むため，1行目はtable変数の名前「jname」「flag」を記載。
flagはスクレイピング未のものを0，済のものを1としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634607/74fe1c99-114c-063c-a7fc-978f0ad765f1.png)


# 魚写真のスクレイピング

まずは事前準備で作成した，魚名リストを読み込みます。
flagが0のものをテーブルT3に格納します。

```matlab
%% 検索したい魚の名前をリストアップ

% 魚名リストの読み込み
path = 'C:\Diving';
folder = 'fish_dataset';
filename = fullfile(path,folder,'fishname.csv');
T1 = readtable(filename);

% T2はflag=1のリスト（flagが0のもの消す）
T2 = T1;
T2(T2.flag==0,:) = [];

% T3はflag=0のリスト（flagが1のもの消す）
T3 = T1;
T3(T3.flag==1,:) = [];
len = size(T3,1);
```

検索してダウンロードして保存します。
T3の1行目が「アオウミウシ」だったとすると，

- 「アオウミウシ」フォルダを作成
- 「アオウミウシ」で検索して，検索結果の上位10件の画像をダウンロード，1.jpg~10.jpgとして保存
- 「アオウミウシ ダイビング」で検索して，検索結果の上位10件の画像をダウンロード，11.jpg~20.jpgとして保存

という流れです。
「魚名〇〇」だけでなく「魚名〇〇　ダイビング」で検索しているのは
魚が「イシダイ」とか「シイラ」とかの大物だと，釣果写真が上位10件を占めるからです。

```matlab
%% 検索、DL、保存

% API規約の都合上50にする（2通りで検索する，50*2=100がAPIの制限）
if len > 50
    len = 50;
end
option = weboptions('Timeout',60) ;
imgurl = cell(1,10); % 1リクエストにつき10枚まで

for i=1:len
    % 「アオウミウシ」フォルダを作成
    mkdir(fullfile(path,folder,T3.jname{i}));
    
    % まず、「アオウミウシ」で検索してDL、保存
    word = T3.jname{i};
    api = ['https://www.googleapis.com/customsearch/v1'...
        '?key=[APIキー]'...
        '&cx=[検索エンジンID]'...
        '&searchType=image'...
        '&q=' word...
        '&lr=lang_ja'...
        '&num=10'...
        '&start=1'];
    data = webread(api);
    
    % 1.jpg~10.jpgとして保存
    for j=1:size(data.items,1)
        imgurl{j} = data.items(j).link;
        savename = fullfile(path,folder,T3.jname{i},[int2str(j) '.jpg']);
        try
            websave(savename,imgurl{j},option);
        catch
            delete([savename '*']);
        end
    end
    
    
    % 次に、「アオウミウシ ダイビング」で検索してDL、保存
    word = [T3.jname{i} ' ダイビング'];
    api = ['https://www.googleapis.com/customsearch/v1'...
        '?key=[APIキー]'...
        '&cx=[検索エンジンID]'...
        '&searchType=image'...
        '&q=' word...
        '&lr=lang_ja'...
        '&num=10'...
        '&start=1'];
    data = webread(api);
        
    % 11.jpg~20.jpgとして保存
    for j=1:size(data.items,1)
        imgurl{j} = data.items(j).link;
        savename = fullfile(path,folder,T3.jname{i},[int2str(10+j) '.jpg']);
        try
            websave(savename,imgurl{j},option);
        catch
            delete([savename '*']);
        end
    end
    
    % DL済みのものはフラグを「1」にする
    T3.flag(i)=1;
end
```
保存が済んだら魚名リストの「flag」を1に更新しておきます。

```matlab
%% 魚名リストの更新

Tnew = [T2;T3];
writetable(Tnew,filename);
```

# 結果

フォルダができて保存されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634607/53163b16-0aa1-ea8c-9dd0-f73f5432dd80.png)

なお，違う魚の写真が混ざり込んでしまったときは…手作業で削除です。
結局手作業からは免れられないのですね…。


# 参考文献

以下のサイトを参考にさせていただきました。

[1] Google Custom Search APIを使って自動画像収集ツールを作ったった
https://bbbbruno.qrunch.io/entries/QJAH6SmmbFt76WPJ