# 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"`
:::