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

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 文档是否为空,如果内有数据
呢么!
至此我们的数据集建立差不多已经大功告成啦!

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对于海康工业相机的标定目标识别和定位,需要使用OpenCV和海康相机SDK来实现。 首先,安装海康相机SDK并连接相机。然后,进行相机标定,使用以下代码: ``` import cv2 import numpy as np # 读标定图片 img = cv2.imread('calibration.jpg') # 设置标定板的行列数 board_size = (9, 6) # 获角点,ret为是否获成功,corners为角点坐标数组 ret, corners = cv2.findChessboardCorners(img, board_size) # 设置标定板上每个角点的实际物理坐标 objp = np.zeros((board_size[0]*board_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:board_size[0], 0:board_size[1]].T.reshape(-1, 2) # 标定相机,获内参矩阵和畸变系数 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera([objp], [corners], img.shape[:-1], None, None) # 保存内参矩阵和畸变系数 np.save('mtx.npy', mtx) np.save('dist.npy', dist) ``` 然后,使用以下代码实现目标识别和定位: ``` import cv2 import numpy as np # 读内参矩阵和畸变系数 mtx = np.load('mtx.npy') dist = np.load('dist.npy') # 读目标图片 img = cv2.imread('target.jpg') # 将图片进行校正 img = cv2.undistort(img, mtx, dist) # 定义目标的颜色范围 lower = np.array([0, 0, 0]) upper = np.array([255, 255, 255]) # 进行颜色过滤,获目标区域 mask = cv2.inRange(img, lower, upper) # 对目标区域进行膨胀和腐蚀操作 mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) # 获目标区域的轮廓 contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 如果有轮廓,则进行目标定位 if len(contours) > 0: # 获目标区域的最大轮廓 c = max(contours, key=cv2.contourArea) # 获目标区域的外接矩形 rect = cv2.minAreaRect(c) # 绘制目标区域的外接矩形 box = np.int0(cv2.boxPoints(rect)) cv2.drawContours(img, [box], -1, (0, 255, 0), 2) # 显示结果 cv2.imshow('img', img) cv2.waitKey(0) ``` 以上代码可以实现海康工业相机的标定目标识别和定位,但需要根据实际情况进行修改和调试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早安不安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值