玩機器學習時, 需要有大量的訓練資料。 以圖片辨識來說, google 圖片搜尋是最佳幫手。 但是要手動把搜尋結果一張一張存檔, 很累呀! 這時可以用 github 上 (有五、六千顆星) 的 google-images-download 來批次下載。
本來想要做狗狗分類器。 研究了一下 狗狗品種族譜圖, 覺得太複雜了, 而且 ImageNet 的 1000 個標籤 裡面, 本來就已包含很多種類的狗。 於是決定換一個題目, 改做 「狗狗動作分類器」: 相片當中的狗到底正在 (1) 跳躍 (2) 睡覺 (3) 游泳 (4) 甩水 (5) 伸展 (6) 尿尿 還是 (0) 其他?
先安裝主要套件就好: pip3 install google_images_download
。
以下是幾個使用範例:
googleimagesdownload -k 'sleeping dog' -l 3
搜尋 「sleeping dog」, 取最前面三張圖, 存放在 目前工作目錄 (pwd 所顯示的目錄; 未必是家目錄!) 底下的 'downloads/sleeping dog' 子目錄裡。 若想指定放在家目錄的 downloads 底下, 可以加-o ~/downloads
選項。 搜尋關鍵詞可以是中文哦!googleimagesdownload -k 'drinking dog' -s '>400*300' -of 16 -l 20
限定圖片大小至少 400*300, 取第 16 張到第 20 張圖, 如本文插圖所示。 實際測試時, 用程式抓到的跟瀏覽看到的順序略有出入。 圖片大小並非任意數字, 而是只有幾個固定的值可選, 詳見 手冊 當中的 「relative size」。googleimagesdownload -pk 'jumping,sleeping,swimming,peeing,stretching,water shaking' -k 'dog' -s '>400*300' -l 100
搜尋 (大小至少為400*300的) 「jumping dog」, 取前 100 張, 同樣地對 「sleeping dog」、 ... 「water shaking dog」 也都各取前 100 張。 注意: 逗號前後如果加了空格, 則目錄名稱裡也會出現多餘的空格。 跟 -pk 相反的是 -sk 。 上例若把 -pk 改成 -sk, 則會變成搜尋 (還有取目錄名稱也是) 「dog jumping」、 「dog sleeping」、 ...。- 當然, -k 本身也可以接受逗號分開的關鍵詞。
例如我在執行上一句時, 不知為什麼有兩個目錄是空的,
所以再執行一次:
googleimagesdownload -k 'sleeping dog,stretching dog' -s '>400*300' -l 100
。 - 平時在 google 搜尋時用的減號一樣可以用哦, 例如可以用:
googleimagesdownload -k 'dog -jumping -sleeping -swimming -peeing -stretching -shaking' -s '>400*300' -l 30 -i other
下載一些 「以上皆非」 的圖片。
如果需要看第 101 筆之後的搜尋結果, 那就要額外下載 ChromeDriver,
因為此時 google images download 需要把搜尋結果頁面 「向下拉」,
需要呼叫 selenium, 而 selenium 則需要呼叫 ChromeDriver。
注意! 平常上網使用的 chromium 瀏覽器跟 selenium 需要用到的 chrome drive,
兩者的版本必須匹配。 先把 chromium 瀏覽器升級到較新的版本:
apt update ; apt install chromium-browser
再從 chromium 瀏覽器的主選單 => 「關於 chromium」 查出版本號碼,
最後到
ChromeDriver 官網 下載對應版本。
解壓縮之後, 就只有一個執行檔。
放哪裡都可以, 例如我放在 /usr/bin/chromedriver
那麼下 googleimagesdownload 指令時,
加上 --chromedriver=/usr/bin/chromedriver
選項,
-l 的參數就可以大於 100。
有一篇 簡中教學文 也請參考。
抓回來的圖片當然還是需要人工過濾/搬移, 然後才 餵給 Keras 版的 MobileNet 做遷移學習。 但總之採用 google images download 的整個流程比當初 按照類別下載 ImageNet 訓練圖片 要簡單很多啊!
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。