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,我可没拿广告费)
文件的具体操作流程根据软件提示即可,我就不多阐述了
数据文件夹建立
标定好的数据集导出为VOC的xml格式即可,之后在Pycharm工程中建立以下五个文件夹
.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 文档是否为空,如果内有数据
呢么!
至此我们的数据集建立差不多已经大功告成啦!