一、網(wǎng)上公開(kāi)數(shù)據(jù)集
阿里云天池?cái)?shù)據(jù)集-cat-dog
二、獲取并預(yù)處理數(shù)據(jù)集
2.1 獲取非健康的貓狗數(shù)據(jù)
因?yàn)殚_(kāi)源數(shù)據(jù)庫(kù)中沒(méi)有非健康貓狗相關(guān)的,所以需要自己下載非健康貓狗數(shù)據(jù),并制作數(shù)據(jù)集。
下面是用于爬取非健康貓狗數(shù)據(jù)的爬蟲(chóng)代碼:
# 爬取代碼1,可以輸入關(guān)鍵詞進(jìn)行爬取百度圖庫(kù)圖片,但是運(yùn)行報(bào)錯(cuò)了
import requests
import os
import re
#設(shè)置請(qǐng)求頭,防止被百度禁止訪問(wèn)
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
#word是要爬的圖片名字
word=input("請(qǐng)輸入關(guān)鍵詞:")
#j用來(lái)標(biāo)記圖片數(shù)量
j=1
class PaChong:
def __init__(self,word,i):
#path是圖片存放的地方
self.path="C://Users/tanhui/Desktop/比賽項(xiàng)目文檔/3_數(shù)據(jù)集制作和標(biāo)注//"+word+"/"
# 第幾頁(yè)
self.page=i/20+1
#如果文件夾不存在,則創(chuàng)建文件夾
if not os.path.exists(self.path):
os.mkdir(self.path)
#發(fā)出requests請(qǐng)求
def requests_get(self,url):
requests.adapters.DEFAULT_RETRIES = 5
req=requests.get(url,timeout=30)
req.encoding="utf-8"
self.req=req.text
#正則找到圖片鏈接
def get_imgurl(self):
imgurls=re.findall('"objURL":"(.*?)"',self.req,re.S)
self.imgurls=imgurls
#下載圖片到本地
def download(self):
global j
for imgurl in self.imgurls:
path=self.path+word+str(j)
#寫入文件
with open(path+".jpg","wb") as f:
r=requests.get(imgurl)
f.write(r.content)
print("%s下載成功"%path)
j+=1
print("第{}頁(yè)下載結(jié)束!".format(self.page))
#通過(guò)pn參數(shù)實(shí)現(xiàn)翻頁(yè),第一頁(yè)為0,,間隔為20
for i in range(0,60,20):
url="https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word={0}&pn={1}&gsm=50&ct=&ic=0&lm=-1&width=0&height=0".format(word,i)
Run=PaChong(word,i)
Run.requests_get(url)
Run.get_imgurl()
Run.download()
'''
爬取指定關(guān)鍵字圖片,這個(gè)反爬取效果好
'''
import re# 正則表達(dá)式,解析網(wǎng)頁(yè)
import requests# 請(qǐng)求網(wǎng)頁(yè)
import traceback
import os
def dowmloadPic(html,keyword,startNum):
headers = {'user-agent':'Mozilla/5.0'}# 瀏覽器偽裝,因?yàn)橛械木W(wǎng)站會(huì)反爬蟲(chóng),通過(guò)該headers可以偽裝成瀏覽器訪問(wèn),否則user-agent中的代理信息為python
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)# 找到符合正則規(guī)則的目標(biāo)網(wǎng)站
num = len(pic_url)
i = startNum
subroot = root + '/' + word
txtpath = subroot + '/download_detail.txt'
print('找到關(guān)鍵詞:'+keyword+'的圖片,現(xiàn)在開(kāi)始下載圖片...')
for each in pic_url:
a = '第'+str(i+1)+'張圖片,圖片地址:'+str(each) + '\n'
b = '正在下載' + a
print(b)
path = subroot + '/' + str(i+1)
try:
if not os.path.exists(subroot):
os.mkdir(subroot)
if not os.path.exists(path):
pic = requests.get(each,headers = headers,timeout = 10)
with open(path+'.jpg','wb') as f:
f.write(pic.content)
f.close()
with open(txtpath,'a') as f:
f.write(a)
f.close()
except:
traceback.print_exc()
print ('【錯(cuò)誤】當(dāng)前圖片無(wú)法下載')
continue
i += 1
return i
if __name__ == '__main__':
headers = {'user-agent':'Mozilla/5.0'}
words = ['病貓','病狗']
#words為一個(gè)列表,可以自動(dòng)保存多個(gè)關(guān)鍵字的圖片
root = './download_images_of_'
for word in words:
root = root + word + '&'
if not os.path.exists(root):
os.mkdir(root)
for word in words:
lastNum = 0
# word = input("Input key word: ")
if word.strip() == "exit":
break
pageId = 0
#此處的參數(shù)為需爬取的頁(yè)數(shù),設(shè)置為20頁(yè)
for i in range(20):
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + "&pn="+str(pageId)+"&gsm=?&ct=&ic=0&lm=-1&width=0&height=0"
pageId += 20#好像沒(méi)啥影響
html = requests.get(url,headers = headers)
# print(html.text) #打印網(wǎng)頁(yè)源碼,相當(dāng)于在網(wǎng)頁(yè)中右鍵查看源碼內(nèi)容
lastNum = dowmloadPic(html.text, word, lastNum,)#本條語(yǔ)句執(zhí)行一次獲取60張圖
2.2 剔除重復(fù)的貓狗數(shù)據(jù)
使用圖片去重/相似圖片清理利器 軟件清除重復(fù)的圖片數(shù)據(jù)。
2.3 淘寶購(gòu)買貓狗救助視頻
使用ffmpeg將救助視頻文件按照一秒截取一張PNG圖片,ffmpeg相關(guān)鏈接可以參考5.3.2.3節(jié)
ffmpeg -i xxx.mp4 -r 1 -y C:\Users\tanhui\Desktop\比賽項(xiàng)目文檔\3_數(shù)據(jù)集制作和標(biāo)注\4_unhealthy_dogs\xxx_%6d.png
2.4 批量重命名貓狗
按照如下命名:
1_healthy_cats/healthy_cat_1.jpg
2_unhealthy_cats/unhealthy_cat_1.jpg
3_healthy_dogs/healthy_dog_1.jpg
4_unhealthy_dogs/unhealthy_dog_1.jpg
批量重命名程序1:
# -*- coding: utf-8 -*-
import os
#對(duì)所有文件以數(shù)字遞增的方式重命名
def file_rename():
i = 0
#需要重命名的文件絕對(duì)路徑
path = r"C:\Users\tanhui\Desktop\比賽項(xiàng)目文檔\3_數(shù)據(jù)集制作和標(biāo)注\4_unhealthy_dogs"
#讀取該文件夾下所有的文件
filelist = os.listdir(path)
#遍歷所有文件
for files in filelist:
i = i + 1
Olddir = os.path.join(path, files) #原來(lái)的文件路徑
if os.path.isdir(Olddir): #如果是文件夾則跳過(guò)
continue
#os.path.splitext(path) #分割路徑,返回路徑名和文件擴(kuò)展名的元組
#文件名,此處沒(méi)用到
filename = os.path.splitext(files)[0]
#文件擴(kuò)展名
filetype = os.path.splitext(files)[1] #如果你不想改變文件類型的話,使用原始擴(kuò)展名
Newdir = os.path.join(path, str(i)+filetype) #新的文件路徑
os.rename(Olddir, Newdir)
return True
if __name__ == '__main__':
file_rename()
批量重命名程序2:
import os
def rename():
i = 0
path = r"C:\Users\tanhui\Desktop\比賽項(xiàng)目文檔\3_數(shù)據(jù)集制作和標(biāo)注\4_unhealthy_dogs"
filelist = os.listdir(path) #該文件夾下所有的文件(包括文件夾)
for files in filelist: #遍歷所有文件
i = i + 1
Olddir = os.path.join(path, files) #原來(lái)的文件路徑
if os.path.isdir(Olddir): #如果是文件夾則跳過(guò)
continue
filename = '4_unhealthy_dog_' #文件名
filetype = '.jpg' #文件擴(kuò)展名
Newdir = os.path.join(path, filename + str(i) + filetype) #新的文件路徑
os.rename(Olddir, Newdir) #重命名
return True
if __name__ == '__main__':
rename()
2.5 圖像數(shù)據(jù)下采樣
使用ffmpeg截取視頻幀獲得的圖像大小為1080P的,雖然使用Yolov2網(wǎng)絡(luò)訓(xùn)練時(shí),輸入的圖像是任意大小的(參考5、6),但過(guò)高碼率的圖像會(huì)在訓(xùn)練時(shí)出現(xiàn)顯存不足或者訓(xùn)練速度較慢的情況。因此將進(jìn)行圖像進(jìn)行下采樣處理。在單獨(dú)使用cv2.resize函數(shù)進(jìn)行調(diào)整圖片會(huì)出現(xiàn)圖片文件還是幾百kb的情況,所以我們需要用cv的jpeg進(jìn)行壓縮,這里的壓縮比設(shè)置為50,能夠得到10-40kb的圖像。
import cv2
import os
import time
# 圖像處理函數(shù)
def resize_image(lr_path,sr_path):
#讀入圖片
img_lr = cv2.imread(lr_path,1)
#獲取圖像尺寸
height, width = img_lr.shape[:2]
#判斷圖像等于1080p
if height == 1080 and width == 1920:
#圖像縮放到原來(lái)的1/4
img_sr = cv2.resize(img_lr,(1920//4,1080//4),interpolation=cv2.INTER_CUBIC)
#保存圖像
#對(duì)于jpg文件的壓縮,第三個(gè)參數(shù)是壓縮質(zhì)量
#1M 100K 10K 圖片質(zhì)量的范圍是0-100 有損壓縮
#jpg圖片的額壓縮壓縮質(zhì)量參數(shù)數(shù)值越小,壓縮比越高
cv2.imwrite(sr_path,img_sr,[cv2.IMWRITE_JPEG_QUALITY,50]) # 保存圖片的質(zhì)量,值為0到100,越高質(zhì)量越好,默認(rèn)95
print(sr_path + ' resize success')
#圖像不等于1080p
else:
print(lr_path + ' is not 1080p')
cv2.imwrite(sr_path,img_lr)
if __name__ == "__main__":
print("處理圖片中...\n")
start = time.time()
# 遍歷原始目錄,對(duì)每個(gè)低分辨率圖片進(jìn)行處理,并保存到對(duì)應(yīng)文件夾中
for root, dirs, files in os.walk("2_unhealthy_cats"):
for file in files:
# 構(gòu)造低分辨率圖片路徑
lr_path = os.path.join(root, file)
# 構(gòu)造處理后圖片保存路徑
sr_path = lr_path.replace("2_unhealthy_cats", "2_unhealthy_cats_resize")
# 創(chuàng)建保存目錄
os.makedirs(os.path.dirname(sr_path), exist_ok=True)
# 進(jìn)行圖片處理并保存
resize_image(lr_path, sr_path)
end = time.time()
print("處理完成,耗時(shí):{:.2f}s".format(end - start))
相關(guān)鏈接
-
關(guān)鍵詞爬取圖片(Python)-CSDN博客
-
Python根據(jù)關(guān)鍵字進(jìn)行圖片爬取-CSDN博客]
-
一款公認(rèn)的圖片去重/相似圖片清理利器 - 知乎 (zhihu.com)
-
ffmpeg制作數(shù)據(jù)集使用教程
-
yolov2對(duì)輸入圖片有啥要求嗎?輸入圖片不是正方形的咋辦?對(duì)手工定義?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-633709.html
-
史上最通俗易懂的YOLOv2講解文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-633709.html
到了這里,關(guān)于yolov2檢測(cè)網(wǎng)數(shù)據(jù)集獲取與預(yù)處理_采集健康和非健康貓狗數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!