概要
ダイビングで撮りためた大量の魚写真。
何が写っているのか判定して,ラベル付け,自動整理するツールを作ろうと思い立ちました。
この3ステップでやっていきます。
- google画像検索で魚写真を集め,データセットを作成
- 1のデータセットを用いて,GoogLeNetの転移学習
- 2のネットワークを用いて,手持ち写真の魚の名前を推定,ラベル付け
今回は1の備忘録です。
事前準備
- Google Custom Search APIを使用できるようにする
[1]のサイトを参考にさせていただき,設定しました。
- 魚名リストの準備
csvファイルで作成。
このリストを上から検索していきます。
tableデータとして読み込むため,1行目はtable変数の名前「jname」「flag」を記載。
flagはスクレイピング未のものを0,済のものを1としました。
魚写真のスクレイピング
まずは事前準備で作成した,魚名リストを読み込みます。
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);
結果
なお,違う魚の写真が混ざり込んでしまったときは…手作業で削除です。
結局手作業からは免れられないのですね…。
参考文献
以下のサイトを参考にさせていただきました。
[1] Google Custom Search APIを使って自動画像収集ツールを作ったった
https://bbbbruno.qrunch.io/entries/QJAH6SmmbFt76WPJ