赞
踩
因为开源数据库中没有非健康猫狗相关的,所以需要自己下载非健康猫狗数据,并制作数据集。
下面是用于爬取非健康猫狗数据的爬虫代码:
# 爬取代码1,可以输入关键词进行爬取百度图库图片,但是运行报错了
import requests
import os
import re
#设置请求头,防止被百度禁止访问
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("请输入关键词:")
#j用来标记图片数量
j=1
class PaChong:
def __init__(self,word,i):
#path是图片存放的地方
self.path="C://Users/tanhui/Desktop/比赛项目文档/3_数据集制作和标注//"+word+"/"
# 第几页
self.page=i/20+1
#如果文件夹不存在,则创建文件夹
if not os.path.exists(self.path):
os.mkdir(self.path)
#发出requests请求
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("第{}页下载结束!".format(self.page))
#通过pn参数实现翻页,第一页为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()
'''
爬取指定关键字图片,这个反爬取效果好
'''
import re# 正则表达式,解析网页
import requests# 请求网页
import traceback
import os
def dowmloadPic(html,keyword,startNum):
headers = {'user-agent':'Mozilla/5.0'}# 浏览器伪装,因为有的网站会反爬虫,通过该headers可以伪装成浏览器访问,否则user-agent中的代理信息为python
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)# 找到符合正则规则的目标网站
num = len(pic_url)
i = startNum
subroot = root + '/' + word
txtpath = subroot + '/download_detail.txt'
print('找到关键词:'+keyword+'的图片,现在开始下载图片...')
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 ('【错误】当前图片无法下载')
continue
i += 1
return i
if __name__ == '__main__':
headers = {'user-agent':'Mozilla/5.0'}
words = ['病猫','病狗']
#words为一个列表,可以自动保存多个关键字的图片
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
#此处的参数为需爬取的页数,设置为20页
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#好像没啥影响
html = requests.get(url,headers = headers)
# print(html.text) #打印网页源码,相当于在网页中右键查看源码内容
lastNum = dowmloadPic(html.text, word, lastNum,)#本条语句执行一次获取60张图
使用图片去重/相似图片清理利器 软件清除重复的图片数据。
使用ffmpeg将救助视频文件按照一秒截取一张PNG图片,ffmpeg相关链接可以参考5.3.2.3节
ffmpeg -i xxx.mp4 -r 1 -y C:\Users\tanhui\Desktop\比赛项目文档\3_数据集制作和标注\4_unhealthy_dogs\xxx_%6d.png
按照如下命名:
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
#对所有文件以数字递增的方式重命名
def file_rename():
i = 0
#需要重命名的文件绝对路径
path = r"C:\Users\tanhui\Desktop\比赛项目文档\3_数据集制作和标注\4_unhealthy_dogs"
#读取该文件夹下所有的文件
filelist = os.listdir(path)
#遍历所有文件
for files in filelist:
i = i + 1
Olddir = os.path.join(path, files) #原来的文件路径
if os.path.isdir(Olddir): #如果是文件夹则跳过
continue
#os.path.splitext(path) #分割路径,返回路径名和文件扩展名的元组
#文件名,此处没用到
filename = os.path.splitext(files)[0]
#文件扩展名
filetype = os.path.splitext(files)[1] #如果你不想改变文件类型的话,使用原始扩展名
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\比赛项目文档\3_数据集制作和标注\4_unhealthy_dogs"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
for files in filelist: #遍历所有文件
i = i + 1
Olddir = os.path.join(path, files) #原来的文件路径
if os.path.isdir(Olddir): #如果是文件夹则跳过
continue
filename = '4_unhealthy_dog_' #文件名
filetype = '.jpg' #文件扩展名
Newdir = os.path.join(path, filename + str(i) + filetype) #新的文件路径
os.rename(Olddir, Newdir) #重命名
return True
if __name__ == '__main__':
rename()
使用ffmpeg截取视频帧获得的图像大小为1080P的,虽然使用Yolov2网络训练时,输入的图像是任意大小的(参考5、6),但过高码率的图像会在训练时出现显存不足或者训练速度较慢的情况。因此将进行图像进行下采样处理。在单独使用cv2.resize函数进行调整图片会出现图片文件还是几百kb的情况,所以我们需要用cv的jpeg进行压缩,这里的压缩比设置为50,能够得到10-40kb的图像。
import cv2
import os
import time
# 图像处理函数
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:
#图像缩放到原来的1/4
img_sr = cv2.resize(img_lr,(1920//4,1080//4),interpolation=cv2.INTER_CUBIC)
#保存图像
#对于jpg文件的压缩,第三个参数是压缩质量
#1M 100K 10K 图片质量的范围是0-100 有损压缩
#jpg图片的额压缩压缩质量参数数值越小,压缩比越高
cv2.imwrite(sr_path,img_sr,[cv2.IMWRITE_JPEG_QUALITY,50]) # 保存图片的质量,值为0到100,越高质量越好,默认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()
# 遍历原始目录,对每个低分辨率图片进行处理,并保存到对应文件夹中
for root, dirs, files in os.walk("2_unhealthy_cats"):
for file in files:
# 构造低分辨率图片路径
lr_path = os.path.join(root, file)
# 构造处理后图片保存路径
sr_path = lr_path.replace("2_unhealthy_cats", "2_unhealthy_cats_resize")
# 创建保存目录
os.makedirs(os.path.dirname(sr_path), exist_ok=True)
# 进行图片处理并保存
resize_image(lr_path, sr_path)
end = time.time()
print("处理完成,耗时:{:.2f}s".format(end - start))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。