一個22萬張NSFW圖片的鑑黃資料集?我有個大膽的想法……

機器之心發表於2019-01-14

機器之心報導,機器之心編輯部。

如果你想訓練一個內容稽核系統過濾不合適的資訊,或用 GAN 做一些大膽的新想法,那麼資料集是必不可少的。例如影像鑑黃,我們需要使用卷積神經網路訓練一個分類器,以區分正常影像與限制級影像。但限制級的影像很難收集,也很少會開源。因此最近有開發者在 GitHub 上開源了一份 NSFW 影像資料集,這是不是你們想要的?

內容稽核在很多領域都有非常重要的作用,它不僅需要通過分類器識別影像或其它資料不適合展示,同時還能結合語義分割模型對這些限制級影像進行處理(Mask 掉敏感部分)。這樣在不過多影響內容的情況下去除掉不合適的資訊。開發者 alexkimxyz 構建的這個專案大概收集了 20 多萬張敏感影像,且通過 URL 的形式展示了 GitHub 中。

專案地址:github.com/alexkimxyz/…

這 20 萬多張影像大概分為以下 5 個類別,它們可以用 CNN 訓練不同的分類器。這裡我們就保留 GitHub 中的原描述了:

一個22萬張NSFW圖片的鑑黃資料集?我有個大膽的想法……

其中每一個類別都是一個 Text 文字,文字中的每一行都對應一個 URL,所以讀取並下載都非常方便,自己寫也就幾行程式碼。如下簡單展示了 sexy 類別下文字與影像:

一個22萬張NSFW圖片的鑑黃資料集?我有個大膽的想法……

此外值得注意的是,有少量影像 URL 是失效的,因此在處理的過程中需要把這些情況考慮進去。一般如果 URL 是失效的,它會返回一張 161×81 的宣告影像。

當然,作者同樣提供了獲取 URL 和下載影像的指令碼,我們只需要執行就行了。目前,這些指令碼僅在 Ubuntu 16.04 Linux 發行版本中進行了測試。

以下是重要指令碼(位於 scripts 目錄下)及它們的作用:

  • 1_get_urls.sh:遍歷 scripts / source_urls 下的文字檔案,下載上述 5 個類別中每個類別的影像 URL。Ripme 應用程式執行所有關鍵部分。源 URL 主要是連結到各種 subreddits,但可以是 Ripme 支援的任何網站。注意:作者已經執行了此指令碼,其輸出位於 raw_data 目錄中。除非在 scripts / source_urls 下編輯檔案,否則無需重新執行。

  • 2_download_from_urls.sh:下載 raw_data 目錄中的文字檔案中找到的 URL 的實際影像。

  • 5_create_train.sh:建立 data/train 目錄並從 raw_data 將所有* .jpg 和* .jpeg 檔案複製到其中。並刪除損壞的影像。

  • 6_create_test.sh:建立 data/test 目錄,並從 data / trainto 為每個類隨機移動 N = 2000 個檔案(如果需要不同的訓練/測試分割,則在指令碼內更改此數字)到 data / test。或者,可以多次執行它,每次它將從 data/train 到 data/test 將每個類別移動 N 個影像。

注意執行 get_urls.sh 後,生成的 URL 文字檔案會覆蓋 raw_data 下已有的文字檔案。所以在複製 GitHub 專案後,我們也可以直接執行 2_download_from_urls.sh 從已有 raw_data 檔案下載影像。

環境配置

  • Python3 環境:conda env create -f environment.yml

  • Java 執行時環境(Ubuntu linux):sudo apt-get install default-jre

  • Linux 命令列工具:wget, convert (imagemagick 工具套件), rsync, shuf

怎麼執行

將工作目錄轉到 scripts,並按檔名中的數字指示的順序執行每個指令碼,例如:

$ bash 1_get_urls.sh # has already been run
$ find ../raw_data -name "urls_*.txt" -exec sh -c "echo Number of urls in {}: ; cat {} | wc -l" \;
Number of urls in ../raw_data/drawings/urls_drawings.txt:
   25732
Number of urls in ../raw_data/hentai/urls_hentai.txt:
   45228
Number of urls in ../raw_data/neutral/urls_neutral.txt:
   20960
Number of urls in ../raw_data/sexy/urls_sexy.txt:
   19554
Number of urls in ../raw_data/porn/urls_porn.txt:
  116521
$ bash 2_download_from_urls.sh
$ bash 3_optional_download_drawings.sh # optional
$ bash 4_optional_download_neutral.sh # optional
$ bash 5_create_train.sh
$ bash 6_create_test.sh
$ cd ../data
$ ls train
drawings hentai neutral porn sexy
$ ls test
drawings hentai neutral porn sexy複製程式碼

如上所示為指令碼的執行方法,五類一共 227995 張敏感影像。這個指令碼同樣會把它們分割為訓練集與測試集,因此直接利用它們實現 5 類別的分類任務會很簡單。當然如果我們需要用於其它的任務,就沒有必要直接分割了。

使用簡單的卷積神經網路直接實現分類任務可以達到 91% 的準確率,這已經非常高了,因為敏感資料手動分為 5 類本來就有一些模糊性存在。以下展示了在測試集上,5 分類任務的混淆矩陣:

一個22萬張NSFW圖片的鑑黃資料集?我有個大膽的想法……

其中對角線表示正確預測的樣本數,其它為誤分類樣本數。這個分類任務至少說明了 5 類別是有區分度的,不論我們用於正常內容與敏感內容的二分類,還是使用 GAN 做一些新奇的模型,類別都是很有區分度的特徵。

最後,各位請懷著敬畏之心嚴肅使用,且僅供研究使用(不要舉報)……



相關文章