最近看論文發現有使用植物病害程度來做實驗的,查了一下,這個數據集是AI challenger在2018年的一個比賽,是將plant village的數據集,根據不同的病害程度來劃分種類。
AI challenger病害程度數據集,開始我沒有找到每個標籤的信息,就自己分文件夾,對照plant village數據集來自己打的標籤(因爲有些圖片的命名和原plant village數據集的命名是一樣的,所以能夠直接搜文件名看再哪個文件夾裏),自己總結了一圈下來,又再網上找到了一個標籤信息表,但是發現其中有些信息是錯誤的!也就是比賽數據的種類就分錯了,雖然這個對分類是沒什麼影響的,但是如果用這個數據集做葉片分類的話就有影響了呀~下面說一下哪裏錯誤
首先說一下知乎上的信息:
2018ai_challenger之農作物病害檢測比賽總結 - 燕小花的文章 - 知乎 https://zhuanlan.zhihu.com/p/50178745
先來說下數據集的大概情況,官方前後總共發佈了兩次比賽數據集.第一次數據集有很多圖像存在標籤交叉的情況(即相同的圖像存在不同的標籤,特別是病害程度一般和嚴重存在交叉情況),訓練圖像總數爲32768張,驗證圖像總數爲4992張,測試集A圖像總數爲4959張;因爲比賽社區很多人反饋數據交叉的現象,官方在比賽的又發佈了第二次比賽數據,第二次發佈的數據是對存在標籤交叉部分的進行更新,訓練圖像總數爲31718張,驗證圖像總數爲4540張,測試集A圖像總數爲4514張,測試集B圖像總數爲4513張.
作者:燕小花
鏈接:https://zhuanlan.zhihu.com/p/50178745
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
我下載的數據集是第一次和第二次的數據集都有。整理第一次數據集的時候我還納悶呢,爲啥有幾個類是重複的數據。後來第二個數據集把重複的去掉了。也就是標籤44,45的訓練集測試集都變成了一張圖(44,45和標籤52,53重複!)
但是第二次數據集依然沒有解決三個問題:1、就是標籤33,詳細信息上說它是馬鈴薯健康葉,但其實是大豆的健康葉。而原數據集其實是有馬鈴薯健康葉的(不知道爲什麼會犯這種錯誤)2、標籤42,43是南瓜的白粉病,卻被歸類到番茄的白粉病!3、標籤16說是玉米花葉病,但是圖片是玉米的健康葉片,不同的是16裏的圖片屬於plant village數據集,是實驗室採集圖,而9是在田裏採集的圖,而且有的還虛焦了很模糊。
以上就是我對AI challenger這個病害數據集的質疑了~有沒有同樣有疑惑的小夥伴呢?
下面對數據集的下載地址,和對數據集的整理代碼進行說明。
數據集在https://blog.csdn.net/a940902940902/article/details/83993234這個博主的文末給出了百度雲網盤,有訓練集驗證集和測試集,測試集沒有標籤,所以自己實驗用的話只能使用訓練集和驗證集了。
根據python操作json文件、創建文件夾、複製文件的相關博客,寫了本文的代碼來處理數據,參考博客分別是:
python數據分析之json文件:https://blog.csdn.net/qq_40123329/article/details/82024564
python創建文件和文件夾:https://blog.csdn.net/vip_lvkang/article/details/76906718
Python文件名匹配,文件複製:https://blog.csdn.net/LOVE1055259415/article/details/79168190
以訓練集文件夾爲例,先說一下目錄結構
——ai_challenger_pdr2018_trainingset_20181023
————AgriculturalDisease_trainingset
——————images
——————AgriculturalDisease_train_annotations
在AgriculturalDisease_trainingset文件夾下創建一個新的class文件夾和一個demo.py文件
——ai_challenger_pdr2018_trainingset_20181023
————AgriculturalDisease_trainingset
——————images
——————AgriculturalDisease_train_annotations
——————class
——————demo.py
下面在demo.py文件中寫入一下代碼運行:
import json
import os
import shutil
def mkdir(path):
folder = os.path.exists(path)
if not folder: #判斷是否存在文件夾如果不存在則創建爲文件夾
os.makedirs(path) #makedirs 創建文件時如果路徑不存在會創建這個路徑
#print("--- new folder... ---")
# print("--- OK ---")
#else:
#print("--- There is this folder! ---")
source_dir='./images/'
img=os.listdir(source_dir) #得到文件夾下所有文件名稱
with open("AgriculturalDisease_train_annotations.json",'r') as load_f:
load_dict = json.load(load_f)
#print(load_dict)
for pop_dict in load_dict:
path="./class/"+str(pop_dict['disease_class'])
mkdir("./class/"+str(pop_dict['disease_class'])) #根據類別創建文件夾
#print(path)
for fileNum in img:
if not os.path.isdir(fileNum): #判斷是否是文件夾,不是文件夾纔打開
if fileNum == pop_dict['image_id']:
print(fileNum) #打印出文件名
imgname= os.path.join(source_dir,fileNum)
shutil.copy(source_dir+fileNum,path) #複製蹄片到class文件夾