2018/04/18 開催の Kaggle Knight Matsue #4 でやった作業内容。

KaggleのiMaterialist Challengeの作業

画像取得スクリプトの改善

以前作った画像取得スクリプト だと、ラベルの情報が無かったり、先にフォルダを作っておかないとエラーになったりしたので、自動で取得できるように変更する。

スクリプトの仕様

  • ラベル情報を読み取り、ラベルのフォルダに画像を保存
  • フォルダが存在していなければ、新しく mkdir でフォルダ作成
  • 全ての画像を取得するのではなく、それぞれのラベルの画像をn枚毎ダウンロードしたかったので、ラベル毎の枚数を length(readdir(dirname) でファイル数を読み取って、条件に追加する(コードだと100枚にしてある)
  • label に missing が存在していたので、その場合は保存しないようにする
  • json ファイルのときは for in で処理出来ていたが、Dataframeの場合は eachrow を使って行毎に処理できるようにする
for row in eachrow(target_rows)
    try
        dirname = "./images/$(row[:label_id])"
        filename = "./images/$(row[:label_id])/$(row[:image_id]).jpg"
        if !isdir(dirname)
            mkdir(dirname)
        end
        if !(ismissing(row[:label_id]).|(isfile(filename)).|(length(readdir(dirname)) > 100))
            println(filename)
            t = tempname()
            download(row[:url], t)
            img = load(t)
            square = imresize(img, (80, 80))
            save(filename, square)
            rm(t)
        end
    catch err
        println("ERROR: ", err)
    end
end

これで、あとは放置しておけば勝手に指定した枚数毎にラベルの画像がダウンロードできるようになった。途中で止まっても、ちゃんと枚数を数えてから、ダウンロードが再開されるので安心。