LoginSignup
4
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-24

概要

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

この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

魚写真のスクレイピング

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

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

% 魚名リストの読み込み
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件を占めるからです。

%% 検索、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に更新しておきます。

%% 魚名リストの更新

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

結果

フォルダができて保存されました。
image.png

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

参考文献

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

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4