当前位置:   article > 正文

yolov2检测网数据集获取与预处理_采集健康和非健康猫狗数据_yolov2数据集的采集有什么技巧

yolov2数据集的采集有什么技巧

一、网上公开数据集

阿里云天池数据集-cat-dog

二、获取并预处理数据集

2.1 获取非健康的猫狗数据

因为开源数据库中没有非健康猫狗相关的,所以需要自己下载非健康猫狗数据,并制作数据集。
下面是用于爬取非健康猫狗数据的爬虫代码:

# 爬取代码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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
'''
爬取指定关键字图片,这个反爬取效果好
'''
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张图
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

2.2 剔除重复的猫狗数据

使用图片去重/相似图片清理利器 软件清除重复的图片数据。

2.3 淘宝购买猫狗救助视频

使用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

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
  • 2
  • 3
  • 4

批量重命名程序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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

批量重命名程序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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.5 图像数据下采样

使用ffmpeg截取视频帧获得的图像大小为1080P的,虽然使用Yolov2网络训练时,输入的图像是任意大小的(参考56),但过高码率的图像会在训练时出现显存不足或者训练速度较慢的情况。因此将进行图像进行下采样处理。在单独使用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))
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

相关链接

  1. 关键词爬取图片(Python)-CSDN博客

  2. Python根据关键字进行图片爬取-CSDN博客]

  3. 一款公认的图片去重/相似图片清理利器 - 知乎 (zhihu.com)

  4. ffmpeg制作数据集使用教程

  5. yolov2对输入图片有啥要求吗?输入图片不是正方形的咋办?对手工定义?

  6. 史上最通俗易懂的YOLOv2讲解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/718379
推荐阅读
相关标签
  

闽ICP备14008679号