0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【飞腾派4G版免费试用】 第三章:抓取图像,手动标注并完成自定义目标检测模型训练和测试

杨永胜 来源:iysheng 作者:iysheng 2023-12-16 09:55 次阅读

抓取图像,手动标注并完成自定义目标检测模型训练和测试

在第二章中,我介绍了模型训练的一般过程,其中关键的过程是带有标注信息的数据集获取。训练过程中可以已有的数据集合不能满足自己的要求,这时候就需要自己获取素材并进行标注然后完成模型的训练,本章就介绍下,如何从网络抓取素材并完成佩奇的目标检测。整个过程由如下几个部分:

  1. 抓取素材,这里我使用下面的python脚本完成
#!/bin/python3
# 支持根据关键词抓取百度图片搜索的图片

import requests
import os
import re

def get_images_from_baidu(keyword, page_num, save_dir):
    # UA 伪装:当前爬取信息伪装成浏览器
    # 将 User-Agent 封装到一个字典中
    # 【(网页右键 → 审查元素)或者 F12】 → 【Network】 → 【Ctrl+R】 → 左边选一项,右边在 【Response Hearders】 里查找
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
    # 请求的 url
    url = 'https://image.baidu.com/search/acjson?'
    n = 0
    for pn in range(0, 30 * page_num, 30):
        # 请求参数
        param = {'tn': 'resultjson_com',
                 # 'logid': '7603311155072595725',
                 'ipn': 'rj',
                 'ct': 201326592,
                 'is': '',
                 'fp': 'result',
                 'queryWord': keyword,
                 'cl': 2,
                 'lm': -1,
                 'ie': 'utf-8',
                 'oe': 'utf-8',
                 'adpicid': '',
                 'st': -1,
                 'z': '',
                 'ic': '',
                 'hd': '',
                 'latest': '',
                 'copyright': '',
                 'word': keyword,
                 's': '',
                 'se': '',
                 'tab': '',
                 'width': '',
                 'height': '',
                 'face': 0,
                 'istype': 2,
                 'qc': '',
                 'nc': '1',
                 'fr': '',
                 'expermode': '',
                 'force': '',
                 'cg': '',    # 这个参数没公开,但是不可少
                 'pn': pn,    # 显示:30-60-90
                 'rn': '30',  # 每页显示 30 条
                 'gsm': '1e',
                 '1618827096642': ''
                 }
        request = requests.get(url=url, headers=header, params=param)
        if request.status_code == 200:
            print('Request success.')
        request.encoding = 'utf-8'
        # 正则方式提取图片链接
        html = request.text
        image_url_list = re.findall('"thumbURL":"(.*?)",', html, re.S)
        print(image_url_list)
        # # 换一种方式
        # request_dict = request.json()
        # info_list = request_dict['data']
        # # 看它的值最后多了一个,删除掉
        # info_list.pop()
        # image_url_list = []
        # for info in info_list:
        #     image_url_list.append(info['thumbURL'])

        if not os.path.exists(save_dir):
            os.makedirs(save_dir)

        for image_url in image_url_list:
            image_data = requests.get(url=image_url, headers=header).content
            with open(os.path.join(save_dir, f'{n:06d}.jpg'), 'wb') as fp:
                fp.write(image_data)
            n = n + 1


if __name__ == '__main__':
    keyword = '佩奇'
    save_dir = keyword
    page_num = 3
    get_images_from_baidu(keyword, page_num, save_dir)
    print('Get images finished.')

将抓取的图片,筛选以后(剔除没有佩奇的图片)分为两组数据,训练集和检验集。结构是类似这样的:

tree peppa_jpg/  | head -n 10
peppa_jpg/
├── 000000.jpg
├── 000001.jpg
├── 000002.jpg
├── 000003.jpg
├── 000004.jpg
├── 000005.jpg
├── 000006.jpg
├── 000007.jpg
├── 000008.jpg
┏─╼[red]╾─╼[22:07:44]╾─╼[0]
┗─╼[~/Projects/ai_track_feiteng/demo3]tree peppa_valid_jpg/  | head -n 10
peppa_valid_jpg/
├── 000067.jpg
├── 000072.jpg
├── 000077.jpg
├── 000078.jpg
├── 000079.jpg
├── 000083.jpg
├── 000088.jpg
├── 000089.jpg
├── 000090.jpg
  1. 手工标注素材,这里我使用的是 labelImg ,标注的过程类似这样:wKgaomV5F8GAVCvhAALyhvKOdzw049.png

然后存储为 PascalVOC 的 xml 文件。这里转存之后是这样的:

▸ tree peppa_xml/ | head -n 10
peppa_xml/
├── 000000.xml
├── 000001.xml
├── 000002.xml
├── 000004.xml
├── 000006.xml
├── 000007.xml
├── 000008.xml
├── 000010.xml
├── 000011.xml
┏─╼[red]╾─╼[09:27:00]╾─╼[0]
┗─╼[~/Projects/ai_track_feiteng/demo3]
▸ tree peppa_valid_xml/ | head -n 10
peppa_valid_xml/
├── 000067.xml
├── 000072.xml
├── 000077.xml
├── 000078.xml
├── 000079.xml
├── 000083.xml
├── 000088.xml
├── 000089.xml
├── 000090.xml
  1. 格式转换为TFRecord 格式,这里我参考raccoon_dataset使用了两个步骤,首先转换为csv文件,然后再转换为TFRecord 格式文件。这里我对其中涉及到的脚本进行了微调,其中 xml_to_csv.py 文件我改成下下面的内容:
#!/bin/python3.8

import os
import sys
import glob
import pandas as pd
import xml.etree.ElementTree as ET

def xml_to_csv(path):
    xml_list = []
    for xml_file in glob.glob(path + '/*.xml'):
        tree = ET.parse(xml_file)
        root = tree.getroot()
        for member in root.findall('object'):
            value = (root.find('filename').text,
                     int(root.find('size')[0].text),
                     int(root.find('size')[1].text),
                     member[0].text,
                     int(member[4][0].text),
                     int(member[4][1].text),
                     int(member[4][2].text),
                     int(member[4][3].text)
                     )
            xml_list.append(value)
    column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
    xml_df = pd.DataFrame(xml_list, columns=column_name)
    return xml_df

def main(xml_path, csv_file):
    image_path = os.path.join(os.getcwd(), xml_path)
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv(csv_file, index=None)
    print('Successfully converted xml to csv.')

if len(sys.argv) < 2:
    print("please input xml_path and out csv file")
else:
    main(sys.argv[1], sys.argv[2])

这里通过命令:

▸ ./red_xml2csv.py peppa_xml/ peppa_jpg/pegga_train_labels.csv
Successfully converted xml to csv.
▸ ./red_xml2csv.py peppa_valid_xml/ peppa_valid_jpg/peppa_valid_labels.csv
Successfully converted xml to csv.

就可以分别将训练集和校验集转换为相应的 csv 文件并存储到图像数据集的目录中,因为后续会分别在对应的目录中执行转换为TFRecord格式的操作进行。

执行的命令分别是:

▸python3.8 ../generate_tfrecord.py --csv_input=pegga_train_labels.csv --output_path=pegga_train.record
▸python3.8 ../generate_tfrecord.py --csv_input=pegga_valid_labels.csv --output_path=pegga_valid.record

至此,就完成了从原始的图像数据,到含有标注信息的TFRecord格式数据集的转换。接下来就是训练和校验了。

  1. 训练和校验的过程和第二章一样,只是数据集变了,这里只是展示下训练过程和模型导出过程的截图。

模型训练:
Screenshot from 2023-12-15 12-49-23.png
模型导出:
Screenshot from 2023-12-15 12-47-55.png

模型到处完成后,我们会看到模型在如下目录,以及其中的文件和从网上下载的TensorFlow2的模型压缩包里面的结构一样。
Screenshot from 2023-12-16 09-40-21.png
我们可以对比看看,我从网上下载的efficientdet_d0_coco17_tpu-32模型中的内容结构:
Screenshot from 2023-12-16 09-47-45.png

  1. 模型导出之后就是测试过程了,测试方法和第二章的方法一样,我就直接附上我从网上下载的测试图片和标注以后的图片:

希望本章可以为想上手通过机器学习进行目标检测的伙伴提供一点帮助,下一章,我就准备将模型部署到飞腾派进行测试了,敬请期待。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    2707

    浏览量

    47707
  • 目标检测
    +关注

    关注

    0

    文章

    186

    浏览量

    15456
  • 飞腾派
    +关注

    关注

    2

    文章

    9

    浏览量

    109
收藏 人收藏

    评论

    相关推荐

    基于YOLOv8实现自定义姿态评估模型训练

    Hello大家好,今天给大家分享一下如何基于YOLOv8姿态评估模型,实现在自定义数据集上,完成自定义姿态评估模型
    的头像 发表于 12-25 11:29 1278次阅读
    基于YOLOv8实现<b class='flag-5'>自定义</b>姿态评估<b class='flag-5'>模型</b><b class='flag-5'>训练</b>

    飞腾4G免费试用飞腾SeetafaceEngine人脸对齐(PART2)

    继续玩飞腾。。。 接着上一篇【飞腾4G免费试用
    发表于 12-19 09:57

    飞腾4G免费试用】第四:部署模型飞腾的尝试

    部署模型飞腾 本章作为一个这几天,我尝试将训练的佩奇检测模型部署到
    发表于 12-20 21:10

    飞腾4G免费试用】第五:使用C++部署tflite模型飞腾

    免费试用第三章抓取图像手动标注
    发表于 12-27 21:17

    飞腾4G免费试用】2飞腾openwrt固件烧录

    接上文【飞腾4G免费试用】环境搭建 9-工具包 Win32DiskImager2.0.1.8写镜像文件。 选择:
    发表于 12-27 21:37

    飞腾4G免费试用】初步认识飞腾4G版开发板

    这几天收到飞腾 4G 基础套件,给大家做个介绍,让大家可以了解一下这块开发板, 飞腾 4G
    发表于 01-02 22:23

    飞腾4G免费试用】大家来了解飞腾4G版开发板

    今天把收到的飞腾4G版开发板做各视频,让大家直观的了解一下做工精细,布线合理,做工扎实的飞腾4G
    发表于 01-02 22:43

    飞腾4G免费试用飞腾开发板运行Ubuntu系统

    飞腾4G版开发板是一款做工精细,布线合理的开发板,今天给大家介绍一下如何运行Ubuntu系统,下面是网上的资料,帮助大家快速认识飞腾
    发表于 01-08 22:40

    飞腾4G免费试用】来更多的了解飞腾4G版开发板!

    飞腾4G版开发板是由中电港萤火工场与飞腾合作推出的飞腾,搭载
    发表于 01-22 00:34

    飞腾4G免费试用飞腾4G版开发板套装测试及环境搭建

    先简单介绍一下这款飞腾4G版开发板套装; 飞腾是由中电港萤火工场研发的一款面向行业工程师、学生和爱好者的开源硬件。主板处理器采用
    发表于 01-22 00:47

    飞腾4G免费试用4.手把手玩转QT界面设计

    完成了使用Qt Designer进行界面设计的全部流程!是不是觉得像魔法一样神奇呢?赶紧试试吧! 接上篇: 【飞腾4G
    发表于 01-27 12:49

    飞腾4g试用

    4G飞腾
    梦の旅驿站
    发布于 :2024年01月07日 14:13:20

    慕课matlab学习 第三章-012 matlab基本结构 精选资料分享

    慕课matlab学习 第三章-01201-顺序结构顺序% 第三节 程序流程控制% 01-顺序结构顺序%程序设计的基本步骤:%1、分析问题,确定求解问题的数学模型或方法%2、设计算法,
    发表于 08-18 07:31

    【新品体验】飞腾4G版基础套装免费试用

    飞腾是由飞腾携手中电港萤火工场研发的一款面向行业工程师、学生和爱好者的开源硬件,采用飞腾嵌入式四核处理器,兼容ARM V8架构,板载64位 DDR
    发表于 10-25 11:44

    飞腾4G免费试用第三章抓取图像手动标注完成自定义目标检测模型训练测试

    抓取图像手动标注完成自定义
    发表于 12-16 10:05