2017年8月27日 星期日

ImageNet 所有圖檔類別的 wordnet 定義

在上一篇 「下載 ImageNet 訓練圖片的一小部分」 裡面, 我們看到 ImageNet 的圖檔, 絕大部分都不屬於那 1000 類拿來訓練圖像辨識的圖片。 今天我們要幫所有類別的圖片都產生文字說明, 得到 imnet-wnid-full.csv 這個檔案。 它各個欄位的意義分別是: wordnet 代號、 在 ImageNet 當中出現的次數、 是否屬於 1000 類訓練辨識的圖片、 簡要文字說明、 詳細文字說明。 有了這個檔案, 我們就快要可以玩 transfer learning 了!

先進入 python 下載 wordnet 資料集:

import nltk
nltk.data.path
nltk.download('wordnet')

在你的家目錄下會出現一個 nltk_data 子目錄, 裡面包含 wordnet 資料集。 沒有耐性的讀者, 做到這裡就可以收工了, 因為後面我們會用到 nltk 的 wordnet 資料集, 還有上述的 imnet-wnid-full.csv 。 以下是產生 imnet-wnid-full.csv 的辛苦過程, 可省略。

上一篇所產生的 wnid_freq_text.csv 裡面, n12453018 出現兩次。 用 vim 打開, 看到第二次有亂碼, 手動刪掉。 (因為原始資料檔 fall11_urls.txt 裡面有一個看起來像空格但其實並非 ASCII 0x20 的字元。) 還有 n04399382 (teddy_bear) 它其實是來自 synset_words.txt 但卻完全沒有在 fall11_urls.txt 當中出現, 所以在 wnid_freq_text.csv 裡面, 這一列的格式不正確 => 補上 "0" (出現次數)。

下載 wnidlookup.py, 用它來幫 wnid_freq_text.csv 查詢每個 wnid 的文字說明:./wnidlookup.py < wnid_freq_text.csv > wnid_dfn.csv 這個程式最關鍵的那句 wn._synset_from_pos_and_offset(...) 是從 這裡 學來的。 另一句也很重要的 [str(lemma.name()) for lemma in ...] 是從 nltk 官網的 howto 抄來的。

再把 wnid_freq_text.csv 跟剛剛產生的 wnid_dfn.csv 兩個檔案 join 起來。 要 join 之前當然要先按照 wnid 排序; join 完之後再按照出現頻率排序。 另外, join 之前, 先把 wnid_freq_text.csv 的最後一個欄位改成 Y (屬於 1000 類圖案之一) 或 N (不屬於 1000 類圖案之一)。

perl -F, -nale 'print("$F[0],$F[1],",$F[2]?"Y":"N")' wnid_freq_text.csv | sort > a.csv
sort wnid_dfn.csv > b.csv
join -t , -a 1 -a 2 a.csv b.csv | sort -nr -t , -k 2 > imnet-wnid-full.csv

最後用 libreoffice 打開 imnet-wnid-full.csv 再重新存檔一次, 以便正確處理雙引號字元, 終於完成!

沒有留言:

張貼留言