YOLOV5目标识别数据集采集、标定和准备_Python爬虫爬取目标图片_xml转txt(消防栓为例)

Python爬虫和识别数据集建立(消防栓为例)

  • 前言
  • Python爬虫从必应图库爬取训练图片
  • 数据集标定
  • 数据文件夹建立

前言

emm,这一次之所以选择消防栓进行YOLO识别训练,是因为前段时间在Google进行人机验证,识别认证消防栓,斑马线……艰辛的三分钟后,被认定为机器,拒绝登入(泪奔泪奔)
所以这一次找了些Google的验证照片进行验证,用科技打败科技!

废话就不多说了,这一次项目包括:
Python爬虫爬取图片 -> 图片标定 -> 标准 YOLO数据集建立 -> YOLOV5训练配置文件 -> 训练 -> 得出结果

本文主要包括前四模块,也就是说本文为第一部分
第二部分,即后三个模块在 ——>——>传送门

Python爬虫从必应图库爬取训练图片

首先讲讲自己的血泪史吧,一开始用的百度图库进行爬取,一把单双排后,打开一看,图片内容……一言难尽不是广告就还是广告,百度真的有必要调整了,之后被迫转到必应图库爬取

这里我对个别模块进行讲解

if img_name != ".jpg":
    return -1

里面有些部分我根据个人喜好进行了鲁棒性的调整,只支持.jpg格式的图片,如果需要修改的话将这行中的.jpg该为你需要的格式即可

url = 'https://cn.bing.com/images/async?q=%E6%B6%88%E9%98%B2%E6%A0%93&first=' + str(i) + '&count=35&relp=35&scenario=ImageBasicHover&datsrc=N_I&layout=RowBased&mmasync=1'

这里的url格式为: https://cn.bing.com/images/async?q= + “搜索内容” + &first= + 页数 + &count=35&relp=35&scenario=ImageBasicHover&datsrc=N_I&layout=RowBased&mmasync=1

其中搜索内容为URL格式,需要进行一次转码,转码网址:https://www.matools.com/code-convert
譬如 消防栓 转码后为:%E6%B6%88%E9%98%B2%E6%A0%93

import requests
from lxml import etree
import re
import time
import socket

# python爬虫,从必应图库中爬取指定图片
# 这里我以消防栓作为示例
socket.setdefaulttimeout(10)
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}


# 保存图片
# 为了保证图片的格式都为.jpg格式,所以当识别不是.jpg时直接返回-1进行新的图片读取
# 同时,为了防止图片读取超时,建立timeout,当读取超过8s直接跳过
def save_img(url, num):
    img_name = url[-4:]
    if img_name != ".jpg":
        return -1
    img_name = num + img_name
    name = re.sub('/', '', img_name)  # img_name中出现/,将其置换成空
    # 打开图片
    try:
        res = requests.get(url, headers=headers, timeout=8)
    except OSError:
        print('出现错误,错误的url是:', url)
        return -1
    else:
        # 保存图片
        # 存放路径为 img/  该处可自行修改
        with open('img/' + name, 'wb')as f:
            try:
                f.write(res.content)
                return 0
            except OSError:
                print('无法保存,url是:', url)
                return -1


def parse_img(url):
    response = requests.get(url, headers=headers)
    response.encoding = response.apparent_encoding
    data = response.content.decode('utf-8', 'ignore')
    html = etree.HTML(data)
    conda_list = html.xpath('//a[@class="iusc"]/@m')
    all_url = []  # 用来保存全部的url
    for i in conda_list:
        img_url = re.search('"murl":"(.*?)"', i).group(1)
        all_url.append(img_url)
    return all_url


# 主函数
def main():
    a = 0
    for i in range(0, 2000, 35):
        # 这里的url格式为: https://cn.bing.com/images/async?q= + "搜索内容" + &first= + 页数 + &count=35&relp=35&scenario=ImageBasicHover&datsrc=N_I&layout=RowBased&mmasync=1
        # 其中搜索内容为URL格式,需要进行一次转码,转码网址:https://www.matools.com/code-convert
        # 譬如 消防栓 转码后为:%E6%B6%88%E9%98%B2%E6%A0%93
        url = 'https://cn.bing.com/images/async?q=%E6%B6%88%E9%98%B2%E6%A0%93&first=' + str(
            i) + '&count=35&relp=35&scenario=ImageBasicHover&datsrc=N_I&layout=RowBased&mmasync=1'
        img_data = parse_img(url)
        for img_url in img_data:
            b = save_img(img_url, str(a))
            a = a + 1 + b
            print(img_url)

        time.sleep(10)


if __name__ == '__main__':
    main()

数据集标定

爬取完成后,建议先进行一次筛选,将不需要的或者很离谱的图片进行删除,不然到时候YOLO训练后,就该建立新的世界观了……
标注的话,我发现了一个宝藏级的工具,精灵标注助手
将爬虫爬取的文件夹直接导入标注就行,非常方便,非常使用(emm,我可没拿广告费)
文件的具体操作流程根据软件提示即可,我就不多阐述了
YOLOV5目标识别数据集采集、标定和准备_Python爬虫爬取目标图片_xml转txt(消防栓为例)_第1张图片

数据文件夹建立

标定好的数据集导出为VOC的xml格式即可,之后在Pycharm工程中建立以下五个文件夹
YOLOV5目标识别数据集采集、标定和准备_Python爬虫爬取目标图片_xml转txt(消防栓为例)_第2张图片
.xml文件放入Annotations,图片放入images和JPEGImages
然后在根目录建立testRun1.py和testRun2.py
注意,注意将文件中的路径进行修改
该处代码参考作者JulyLi2019yolov5训练自己的数据集,详细教程!
由于涉及版权问题,建议大家到上方链接自行copy以下两端代码,分别对应make_txt.py和voc_label.py
或在我的github链接中下载本文的所有代码
https://github.com/BilboJunzhou/GetPhotoMessage

调整后分别运行两个.py文件,其中,会将.xml文件转换为.txt文件储存在labels中,同时会生成
在这里插入图片描述
以下四个文档,注意检测.txt 文档是否为空,如果内有数据
呢么!
至此我们的数据集建立差不多已经大功告成啦!

你可能感兴趣的:(python,爬虫,数据库,opencv,计算机视觉)