# eBird資料處理筆記 ###### tags: `eBird` `data` `data_clearing` `data_alignment` `Log` --- ## 資料位置 - 資料夾路徑: - AI_projects/shared/eBird/download_ebird - 目前使用的資料 downloaded/jpg_top100 - ebird 資料的meta data - 完整資料按類群分別放在 downloaded/csv內 - '學名_編碼'為分類單位 - eg : Acanthisitta_chloris_0 - 約7G、1.82萬份 - 合併後存放於`meta/meta_all.cs` - 與jpg_top100的89萬筆資料關聯(join)後的存放路徑 - `AI_projects/shared/eBird/download_ebird/meta/jpg_top100_meta5.csv` ## 處理記錄 1. 各分類單位根據使用者排名抓取top100的影像 - 用者排名依據ebird csv檔裡面的meta資料 - 'Average Community Rating', 'Number of Ratings' - 見[`01_get_photos.py`](https://github.com/YunghuiHsu/ebird_project/blob/main/download_ebird/01_get_photos.py)檔 - 資料存放在downloaded/jpg_100 2. 檢視jpg_100目錄內資料時,發現許多檔案大小小於1kb的資料 - 在linux terminal 使用以下指令輸出目錄內檔案清單 - `find downloaded/jpg_top100 -name "*.jpg" -type f -exec ls -l {} \; > jpg_top100.txt` - size == 919 byte: - 被伺服器檔下未抓取到 - 其他size < 1kb: - 經檢視後可能因為連結失效而載不到 - 資料篩選檢視的相關檔案見 [`check_problemed.ipynb`](https://github.com/YunghuiHsu/ebird_project/blob/main/download_ebird/check_problemed.ipynb) 3. 整理出有問題的小檔清單重新抓取資料 - 篩選標準 size < 1kb - 建立清單後重新抓取,建立資料夾`jpg_reloaded` - 見`01_get_photos_reload.py` - 抓取時忘了設每個物種抓取排名100張的上限.... - 合併`jpg_reloaded`與`jpg_100`為`jpg100_1M` - 將檔案小於1kb的資料結尾加上`.err` 避免模型訓練時讀入 4. 根據分類單位讀取meta內的使用者排名重新抓取排名前100的照片 - 見copy_jpg_top100.py - 檢視`jpg100_1M`內的資料發現'ML Catalog Number'欄位有重疊 - 不同物種 - 可能物種類群有變更 - 同一物種但不同流水號編號 - 可能分屬不同族群與亞種 - '學名_編碼'為單位選取排名前100的種類 - 保留重複('ML Catalog Number'數字相同)的照片 - 建立`jpg_top100`檔案夾 5. 將所有csv格式的meta資料合併為一份,存放於meta/meta_all.csv - 單檔7.2G - 見[`concat_meta_csv.py` ](https://github.com/YunghuiHsu/ebird_project/blob/main/download_ebird/concat_meta_csv.py - 大檔案搬遷 linux指令 :::spoiler [[Linux] tar/gzip 檔案壓縮與解壓縮、split/cat檔案分割與合併的實務應用](https://www.jinnsblog.com/2018/03/linux-tar-and-split-cat-example.html) - 大檔壓縮並同時切割 - `tar zcvf - big_demo | split -b 100MB - "abc.part"` - 還原分割檔同時解壓縮 - `cat demo_part_* | tar -zxvf -` ::: 6. 依目前資料與ebird meta data合併,建立成一份meta data清單 - 見[`get_ebird_meta.ipynb`](https://github.com/YunghuiHsu/ebird_project/blob/main/download_ebird/get_ebird_meta.ipynb) 7. 參照iNaturalist 2021資料集格式,建立`iNaturalist_2021/val_ebird`資料夾 - 處理筆記:見[`prepare_val_ebird_as_iNat.ipynb`](https://github.com/YunghuiHsu/ebird_project/blob/main/download_ebird/prepare_val_ebird_as_iNat.ipynb) - 來源資料集:`/eBird/download_ebird/downloaded/jpg_top10` 的89萬筆資料 - 探索Embedding時,與iNaturalist 資料比對的eBird驗證資料集 - 處理流程 :::spoiler 1. 根據iNaturalist 2021 dayaset取得鳥類物種名錄與流水號 2. 產出`val_ebir/類別` 目錄 3. 據物種名,至ebird meta 資料取得對應得物種名 4. 依據該物種名索引,參照Average Community Rating與Number of Ratings取top10 5. 照檔案路徑取得資料後複製到所屬的資料夾 ::: - n_class = 1486 - data_size = 1486x10 =14,860 8. 使用eBird資料建立測試(finetune)資料集,作為下游分類任務使用`/eBird/download_ebird/downloaded/ebird_finetune` - 處理筆記:見[`establish_ebird_finetune.ipynb`](https://github.com/YunghuiHsu/ebird_project/blob/main/download_ebird/establish_ebird_finetune.ipynb) - 來源資料集:`/eBird/download_ebird/downloaded/jpg_top10` 的89萬筆資料 - Stratified Random Sampling 分層隨機抽樣 - 每個物種單元按 6 : 4 ~~2:2~~ 切分給train, validation, ~~test~~ - 如果n<10 - 直接分配給train - 資料目錄結構 ``` --- ebird__finetune |___ train/ |___ val/ ``` - n_class = 11,186 - data size in finetune dataset: | dir | data_size | n_class | | ----- |:---------:|:-------:| | train | 537,653 | 11,186 | | val | 358,542 | 11,186 | :::spoiler 資料比例 - jpg_top100 : 896,555 - ebird_finetune : 896,195 - Not included(Label = -1) : 360 - Parent_Species.notnull() : 326 - Genus data uncorfirmed - Parent_Species.isnull(): 34 - SCI_NAME_2021.isnull(): 34 - Genus.isnull(): 20 ::: :::spoiler 物種篩選原則 - 標籤建立與處理過程見 `get_ebird_meta.ipynb` 檔案中 "Load Meta data"章節 - 處理方案: - 保留不明確的分類單元 - 類別數量會增加、acc1表現相對可能會較差 - 若模型學習到辨識細微差異時,預期可以分配至不同的高維空間,以讓後續全連接層在分類預測時做出區別 - `"Dir_class"`欄位建立: - 使用meta資料中`"Parent_Species"`欄位,非null的資料 - 內含有 '/', ' x ', '()', 'sp.', '(Domestic type)'等 - 納入`Taxon Category`中'Spuh', 'Slash', 'Hybrid'等類群無法確認的類別 - 物種類別以`"Parent_Species"`為根據 (目、科、屬,其他欄位主要根據2021年資料關聯建立) - 包含~~排除~~有'/', ' x '的資料 - 把括號後的文字移除 - 'sp.' 取代為 'sp' - 屬名無法確認(NaN)的資料排除 - `"Parent_Species"`缺失的資料以"SCI_NAME_2021"取代 - `Label` 欄位建立 - 按 `"Order"` + `"Family"` + `"Genus"` + `"Dir_class"排序建立 - 建立 `"Dir_class_full"` - `"Dir_class_full"` = `"Label"` + `"Order"` + `"Family"` + `"Genus"` + `"Dir_class"` :::