基于faster-rcnn的图片标注和数据集生成自动化工具(数据集格式同pascal voc)

2023-05-16

未完待续。。。

faster-rcnn的模型训练需要大量数据集,目前使用labelImg工具,需要人工一张一张标注,效率低。本文使用python编写了自动化图片标注和数据集生成工具(本文标注目标是人脸,大家可以根据需要训练其他目标判别模型,比如汽车、自行车等标注需要的图片数据集)。

使用该工具可以自动完成整个数据集的生成(图片标注和数据集文件),生成的数据集符合pascal voc格式,可以直接在faster-rcnn中训练模型。

 

效果展示

000182.jpg

本文只说明原理,提供参考,实际应用需考虑其他因素。

环境配置

win7

python3.6.3

tensorflow-gpu1.5(cuda_9.0.176_windows.exe,cudnn-7.0.5(其他版本报错,运行占用内存较多会异常终止))

keras2.1.4

注意:各软件之间版本之间存在适配问题。

 

实现步骤

一、准备

       1.1 素材准备

             标注的素材准备(1.视频(人脸较多)、2.文件夹(人物网站爬取或自己收集))

       1.2.环境搭建

       1.3.人脸检测模型选择

           一般有以下可选

           1.3.1 使用opencv  参考(点击跳转)

           1.3.2 使用dlib 参考(点击跳转)

            1.3.3 使用腾讯、百度或阿里(旷世科技Face++)等开发平台的的人脸检测API接口  参考(点击名称跳转)

            1.3.4 自己训练人脸检测的模型(神经网络(SelectiveSearch + CNN)) 参考(点击跳转)

二、实现步骤(视频,本文选择《欢乐颂》电视剧视频)

2.1.打开视频,截取一帧视频(图片)

2.2 判断2.1中图片有是否有人脸(使用1.3.2 dlib人脸检测模型)

2.3 如果2.2中有人脸(没有人脸则跳转到2.1继续截取,直到视频结束),则获取人脸的区域保存该区域图片和人脸区域图片在2.1图片中的位置(左上角x(xmin),左上角y(ymin),右下角x(xmax),右下角y(ymax))保存到data\VOC2007\JPEGImages 中。

图片命名000001.jpg、000002.jpg以此递增。

同时data\VOC2007\Annotations中存放同名(后缀不同)文件0000001.xml。xml文件存放图片中人脸的类别和位置。图片和人脸数据的关系是1对多(一张图片中存在一个或多个人脸,无人脸图片已过滤)。

0000182.jpg(3个人脸)

0000182.xml(3个人脸对应3个object)

<annotation>
  <folder>VOC2007</folder>
  <filename>000182.jpg</filename>
  <source>
    <database>The VOC2007 Database</database>
    <annotation>PASCAL VOC2007</annotation>
    <image>flickr</image>
    <flickrid>340039936</flickrid>
  </source>
  <owner>
    <flickrid>uma_tyan</flickrid>
    <name>?</name>
  </owner>
  <size>
    <width>960</width>
    <height>540</height>
    <depth>3</depth>
  </size>
  <segmented>0</segmented>
  <object_num>3</object_num>
  <object>
    <name>face</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>677</xmin>
      <ymin>104</ymin>
      <xmax>784</xmax>
      <ymax>211</ymax>
    </bndbox>
  </object>
  <object>
    <name>face</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>414</xmin>
      <ymin>86</ymin>
      <xmax>504</xmax>
      <ymax>176</ymax>
    </bndbox>
  </object>
  <object>
    <name>face</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>196</xmin>
      <ymin>96</ymin>
      <xmax>325</xmax>
      <ymax>225</ymax>
    </bndbox>
  </object>
</annotation>

代码

set_face_dataset.py

建立Pascal VOC数据集文件结构、xml文件生成、数据集分割(训练集、测试集)。

count.txt 用于计数,初始化第一行写数字1

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import cv2
import random
from lxml import etree, objectify
from lxml.etree import Element, SubElement, tostring

base_dir = os.path.join(os.getcwd(), 'training_data\VOC2007')
jpg_dir = os.path.join(base_dir, 'JPEGImages')
ano_dir = os.path.join(base_dir, 'Annotations')
img_dir = os.path.join(base_dir, r'ImageSets\Main')
count_dir = os.path.join(base_dir, r'count.txt')

def setdir():
    if not os.path.isdir(base_dir):
        os.makedirs(base_dir)

    if not os.path.isdir(jpg_dir):
        os.makedirs(jpg_dir)

    if not os.path.isdir(ano_dir):
        os.makedirs(ano_dir)

    if not os.path.isdir(img_dir):
        os.makedirs(img_dir)

    if not os.path.isdir(count_dir):
        os.makedirs(count_dir)

    # 计数文件初始化
    with open(count_dir, 'w') as f:
        f.writelines('1')

def make_xml(facelist, image_name, w, h):
    (filepath, tempfilename) = os.path.split(image_name)
    (filename, extension) = os.path.splitext(image_name)

    annotation = etree.Element("annotation")
    etree.SubElement(annotation, "folder").text = "VOC2007"
    etree.SubElement(annotation, "filename").text = tempfilename
    source = etree.SubElement(annotation, "source")
    etree.SubElement(source, "database").text = "The VOC2007 Database"
    etree.SubElement(source, "annotation").text = "PASCAL VOC2007"
    etree.SubElement(source, "image").text = "flickr"
    etree.SubElement(source, "flickrid").text = "340039936"

    size = etree.SubElement(annotation, "owner")
    etree.SubElement(size, "flickrid").text = 'uma_tyan'  # 必须用string
    etree.SubElement(size, "name").text = '?'

    size = etree.SubElement(annotation, "size")
    etree.SubElement(size, "width").text = str(w)
    etree.SubElement(size, "height").text = str(h)
    etree.SubElement(size, "depth").text = '3'
    etree.SubElement(annotation, "segmented").text = '0'
    list_len = len(facelist)
    etree.SubElement(annotation, "object_num").text = str(list_len)

    for i in range(list_len):

        key_object = etree.SubElement(annotation, "object")
        etree.SubElement(key_object, "name").text = "face"
        etree.SubElement(key_object, "pose").text = "Unspecified"
        etree.SubElement(key_object, "truncated").text = '0'
        etree.SubElement(key_object, "difficult").text = '0'
        bndbox = etree.SubElement(key_object, "bndbox")
        etree.SubElement(bndbox, "xmin").text = str(facelist[i][0].left())
        etree.SubElement(bndbox, "ymin").text = str(facelist[i][0].top())
        etree.SubElement(bndbox, "xmax").text = str(facelist[i][0].right())
        etree.SubElement(bndbox, "ymax").text = str(facelist[i][0].bottom())

    doc = etree.ElementTree(annotation)

    xml_name = os.path.join(filepath, filename + '.xml')
    xml_name = xml_name.replace("JPEGImages","Annotations")
    doc.write(open(xml_name, "wb"), encoding='utf-8',pretty_print=True)

    return

# 文件后缀自动修改为".jpg"
def file_name(file_dir):
    L=[]
    for root, dirs, files in os.walk(file_dir):
        for file in files:
            if os.path.splitext(file)[1] == '.xml':
                L.append(file[:-4])
    return L

# 文件后缀自动修改为".jpg"
def file_name():
    L=[]
    for root, dirs, files in os.walk(ano_dir):
        for file in files:
            if os.path.splitext(file)[1] == '.xml':
                L.append(file[:-4])
    return L


# 记录分割
def file_seg(list):
    list_len = len(list)
    list_len_2 = int(list_len/2)
    list_len_4 = int(list_len/4)

    random.shuffle(list)
    with open(os.path.join(img_dir,'trainval.txt'),'w') as f:
        f.write('\n'.join(list[0:list_len_2]))
    with open(os.path.join(img_dir,'test.txt'),'w') as f:
        f.write('\n'.join(list[list_len_2:]))
    with open(os.path.join(img_dir,'train.txt'),'w') as f:
        f.write('\n'.join(list[0:list_len_4]))
    with open(os.path.join(img_dir,'val.txt'),'w') as f:
        f.write('\n'.join(list[list_len_4:list_len_2]))

    return


def setfacedb(img, list):
    with open(count_dir,'r') as f:
        count = f.readline()
    filetype = '.jpg'
    Newdir = os.path.join(jpg_dir, str(count).zfill(6) + filetype)
    print(Newdir)
    cv2.imwrite(Newdir,img)

    image= cv2.imread(Newdir)
    h, w = image.shape[:2]

    # 新建xml文件
    try:
        make_xml(list, Newdir, w, h)
    except Exception as e:
        print(e)
    with open(count_dir,'w') as f:
        f.write(str(int(count) + 1))

if __name__ == "__main__":
    setdir()

video_face_sign_dir.py

自动化标记图片并整理到对应文件夹中

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import numpy as np
import sys
import time
import cv2
import dlib
from setfacedb import*

from keras.preprocessing import image as imagekeras
from keras.models import load_model
from PIL import Image, ImageDraw, ImageFont
from glob import glob

size = 150
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_face_trained_model.h5'

# 类别编码转换为中文名称返回
def return_name(codelist):
    names = ['樊胜美', '关雎尔', '邱莹莹']
    for it in range(0, len(codelist), 1):
        if int(codelist[it]) == 1.0:
            return names[it]

# 类别编码转换为英文名称返回
def return_name_en(codelist):
    names = ['fsm', 'gje', 'qyy']
    for it in range(0, len(codelist), 1):
        if int(codelist[it]) == 1.0:
            return names[it]

# 返回目录下全部.jpg文件的列表
def get_image(image_path):
    name = glob(image_path+"/*jpg")
    return name

# 区分和标记视频中截图的人脸
def face_rec():
    global  image_ouput
    model = load_model(os.path.join(save_dir, model_name))
    # camera = cv2.VideoCapture("2.mp4") # 视频
    # camera = cv2.VideoCapture(0) # 摄像头

    # img_list = get_image(os.path.join(os.getcwd(), 'img'))
    img_list = get_image(os.path.join(os.getcwd(), 'test1'))

    for imgitem in img_list:
        # read, img = camera.read()
        img = cv2.imread(imgitem)
        img1 = img
        try:
            # 未截取视频图片结束本次循环
            if not (type(img1) is np.ndarray):
                continue
            gray_img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 图片转为灰度图
        except:
            print("Unexpected error:", sys.exc_info()[0])
            break

        # 使用detector进行人脸检测
        # 使用dlib自带的frontal_face_detector作为我们的特征提取器
        detector = dlib.get_frontal_face_detector()
        dets = detector(gray_img, 1) # 提取截图中所有人脸

        if len(dets) < 1: # 没有人脸,结束本次循环
            continue

        facelist = []
        for i, d in enumerate(dets): # 依次区分截图中的人脸
            x1 = d.top() if d.top() > 0 else 0
            y1 = d.bottom() if d.bottom() > 0 else 0
            x2 = d.left() if d.left() > 0 else 0
            y2 = d.right() if d.right() > 0 else 0

            face = img[x1:y1, x2:y2]
            face = cv2.resize(face, (size, size))

            x_input = np.expand_dims(face, axis=0)
            prey = model.predict(x_input)
            print(prey, 'prey')

            facelist.append([d,  return_name(prey[0])]) # 存储一张图中多张人脸坐标

        setfacedb(img1,facelist)

        cv2_im = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # cv2和PIL中颜色的hex码的储存顺序不同
        pil_im = Image.fromarray(cv2_im)

        draw = ImageDraw.Draw(pil_im)  # 括号中为需要打印的cqanvas,这里就是在图片上直接打印
        font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8")  # 第一个参数为字体文件路径,第二个为字体大小


        cv2_char_img = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)
        # 显示图片
        cv2.imshow("camera", cv2_char_img)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    face_rec() # 人脸目标自动化生成
    file_seg(file_name()) # 生成txt文件

 

详细讲解

1、运行set_face_dataset.py 生成Pascal voc 文件结构(setdir())

2、运行video_face_sign_dir.py (先选择视频)生成数据(图片、标注、训练和验证数据(txt))

 

推荐阅读

https://saicoco.github.io/object-detection-4/

https://blog.csdn.net/hongxingabc/article/details/79039537

https://blog.csdn.net/yaoqi_isee/article/details/79254574

https://blog.csdn.net/sinat_30071459/article/details/50723212

https://www.cnblogs.com/zjutzz/p/5983160.html

https://github.com/endernewton/tf-faster-rcnn

https://github.com/yhenon/keras-frcnn

https://github.com/fizyr/keras-retinanet

https://blog.csdn.net/wyx100/article/details/81235208

https://blog.csdn.net/qq_32799915/article/details/79081659

https://tzutalin.github.io/labelImg/

 

完整项目下载

为方便没积分童鞋,请加企鹅,共享文件夹。

包括:代码、数据集合(图片)、已生成model、安装库文件等。

https://github.com/gbusr/ML/tree/master/facecnn

set_face_dataset.py和video_face_sign_dir.py存放到facecnn目录下,即可运行。

 

QQ(群:452205574)

                                        

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于faster-rcnn的图片标注和数据集生成自动化工具(数据集格式同pascal voc) 的相关文章

  • 词袋模型(Bag of Features,BOF)

    Bag of Features xff08 BOF xff09 对于程序而言这个人就是一堆像素嘛 xff0c 让它直接找的话它只能一个个像素的去比较然后返回最接近的了 xff08 近邻算法 xff09 但是现实中物体的形状颜色会发生变化 x
  • SNMPv3基于用户的安全模型USM及消息格式

    一 USM相关网址 SNMPv3使用了基于用户的安全模型USM RFC 3411 Architecture for SNMP Frameworks http www ietf org rfc rfc3411 txtRFC 3414 User
  • 超详细的python搭建区块链(下)

    在前面 超详细的python搭建区块链 xff08 中 xff09 我们搭建了一个简单的区块链 在这个简单的区块链能够实现交易 挖矿等基本功能 不过 xff0c 区块链上的节点应该是分散的 如果它们是分散的 xff0c 我们究竟如何确保它们
  • RuntimeError: Expected 4-dimensional input for 4-dimensional weight [32, 1, 5, 5]

    文章目录 1 问题引入2 运行报错3 代码4 分析原因5 解决办法6 完整代码7 参考文献 1 问题引入 今天在使用pytorch训练一个模型的 xff0c 数据集的读取是使用pytorch自带的函数来进行读取和预处理的 xff0c 网络使
  • 如何在Linux服务器上安装Anaconda(超详细)

    目录 1 安装Anaconda1 1 下载anaconda的安装包1 2 解决安装出现的bug1 3 安装anaconda1 4 点击Enter xff08 回车键 xff09 1 5 输入 yes1 6 继续点击 Enter1 7 输入
  • Pytorch实现FGSM(Fast Gradient Sign Attack)

    目录 1 相关说明2 相关简述3 代码实现3 1 引入相关包3 2 输入3 3 定义被攻击的模型3 4 定义FGSM攻击函数3 5 测试函数 4 可视化结果5 可视化对抗样本6 预训练模型下载7 训练模型8 完整代码 1 相关说明 最近在整
  • RuntimeError: element 0 of tensors does not require grad and does not have a grad_

    文章目录 1 问题描述2 解决方案2 1 方案12 2 方案2 3 参考文献 1 问题描述 今天在跑代码的过程中 xff0c 因为要训练一个模型然后在测试阶段使用PGD来生成相应的adv image来测试这个模型 xff0c 结果运行到测试
  • Pycharm 搭建 Django 项目 (非常详细)

    目录 1 安装需求2 准备工作2 1 新建项目2 2 输入相关配置2 3 项目创建完成2 4 查看安装 Django 版本2 5 启动项目2 6 解决一点小问题 3 一点小补充4 参考文献 1 安装需求 在使用 python 框架 Djan
  • Docker

    官方网站 xff1a https www docker com Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c
  • SpringBoot + Thymeleaf 实现发送验证码计时器功能

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 功能需求2 效果图展示3 代码4 参考文献5 联系我 1 功能需求 实现找回密码然后点击获取验证码之后出现XX秒候重新获取
  • 解决 SpringBoot 图片加载失败

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 问题描述2 解决方案2 1 打开 IDEA 3 参考文献 1 问题描述 在使用 SpringBoot 开发项目的时候发现了
  • 仿牛客论坛项目部署总结

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 前言2 部署项目需求3 环境配置3 1 阿里云服务器3 2 本地文件上传到服务器3 3 MySQL配置与安装3 4 Mav
  • 时间片轮转调度算法的计算

    在分时系统中 xff0c 最简单最常用的就是基于时间片轮转调度算法 xff0c 时间片轮转调度算法是非常公平的处理机分配方式 xff0c 让就绪队列的每个进程每次仅运行一个时间片 1 时间片轮转调度算法的基本原理 在时间片轮转调度算法中 x
  • IntelliJ IDEA添加注释常用的快捷键

    IDEA可以使用快捷键添加行注释Ctrl 43 块注释Ctrl 43 Shift 43 xff0c 还可以快速生成类注释 方法注释等 下面就介绍这几种快捷键的用法 1 行注释Ctrl 43 首先你的光标要处于这一行 xff0c 处于这行的哪
  • Android Studio 设置代码提示和代码自动补全快捷键

    想必使用过Eclipse的小伙伴们都习惯Eclipse快捷键带来的方便 但是当我们使用Android studio来进行开发的时候也想要这种方便该怎么办呢 当然使用过Android studio的小伙伴可能已经知道了它的方便以及强大之处 接
  • 编写一个算法,实现一维数组a输入任意n个整数,假设n=7,输入7个数字为3,7,6,8,9,4,1

    问题描述 编写一个算法 xff0c 实现一维数组a输入任意n个整数 xff0c 假设n 61 7 xff0c 输入7个数字为3 7 6 8 9 4 1 xff0c 然后建立一个具有如图所示的方阵 xff0c 并输出打印 1 3 7 6 8
  • 1.0 DS1302-外部RTC

    一 综述 DS1302是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 xff0c 因为应用非常广泛 xff0c 结果就导致了大量的国产仿制品 xff0c GC1302是一款国产DS1302仿制芯片 xff0c 使用方法
  • 现代C++语言

    include lt iostream gt include lt limits gt include lt future gt include lt string gt include lt map gt using namespace
  • ubuntu 解压 打包 命令全集

    tar 解包 xff1a tar xvf FileName tar 打包 xff1a tar cvf FileName tar DirName xff08 注 xff1a tar是打包 xff0c 不是压缩 xff01 xff09 gz 解
  • 在IDEA中解决进行有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    springboot默认的打包是如下 xff1a lt build gt lt plugins gt lt plugin gt lt groupId gt org springframework boot lt groupId gt lt

随机推荐

  • Jetson Nano更换软件源

    Nano的镜像默认是国外的源 xff0c 速度很慢 xff0c 国内的源有的上不去 xff0c 有的包无法安装 xff0c 经过测试清华大学的源完美可用 xff0c 现放上教程 首先备份原本的source list文件 sudo cp et
  • prometheus在k8s中的部署

    1 k8s的监控指标 监控指标具体实现举例Pod性能cAdvisor容器CPU xff0c 内存利用率Node性能node exporter节点CPU xff0c 内存利用率K8S资源对象kube state metricsPod Depl
  • vue前端

    span class token operator lt span span class token operator span DOCTYPE html span class token operator gt span span cla
  • VueCli 脚手架的安装

    配置淘宝npm仓库 xff1a span class token function npm span config span class token builtin class name set span registry https re
  • vue进阶知识

    Vue单文件组件 xff08 又名 vue文件 xff0c 缩写为SFC xff09 是一种特殊 的文件格式 xff0c 它允许讲Vue组件的模板 逻辑与样式封装在 单个文件中 正如所见 xff0c Vue SFC 是经典的 HTML CS
  • ssh@host:""ssh切换到其他机器上执行多条命令;Pseudo-terminal will not be allocated because stdin is not a terminal.

    1 背景 xff1a shell脚本在主机器上执行kafka的启动命令 其他机器也会起这个进程 之前的脚本每次执行的时候出现卡住的现象 xff0c 不能回到命令行 解决方法 xff1a 第一种 span class hljs comment
  • centos升级glibc(升级到 2.17版)

    1 原先的系统glibc库的版本是2 12 xff0c 需要升级到2 17版本 下载地址 xff1a http ftp gnu org gnu glibc glibc 2 17 tar gz 这里可以选择你所需要的版本 2 安装部署 roo
  • u盘启动盘安装centos7.4操作系统

    1 使用UltraISO软件将ISO镜像刻录到U盘 xff0c 然后用u盘安装操作系统 制作好的u盘如下所示 xff1a 2 启动华为h3c服务器 xff0c 出现下面的界面 按照提示按住Ctrl 43 A制作raid 继续点击下一步 xf
  • redis一主一从两台机器高可用

    目录 1 机器规划 2 redis的部署安装 2 1配置文件内容 2 2 启动2台机器上的redis服务 2 3 查看2台机器上redis数据信息 3 redis主从之间手动切换 3 1 停掉22上的redis进程 xff0c 到23从re
  • cumulusclips的部署

    描述 xff1a CumulusClips是一个开源的视频分享 xff08 内容管理 xff09 平台 xff0c 能够提供最佳的视频分享功能之一类似YouTube 在CumulusClips的帮助下 xff0c 您可以开始自己的视频分享网
  • Linux安装nodejs和npm

    最近window系统转向linux系统开发 xff0c linux系统的确适合程序员的开发 作为前端安装了nodejs和npm xff0c 遇到了一些坑 xff0c 赶紧记录下来 第一种安装方法 xff1a 安装nodejs xff1a s
  • python 编写的DHT Crawler 网络爬虫

    1 安装boost依赖和编译环境 yum install y boost boost devel yum install y make gcc gcc c 43 43 kernel devel python devel 2 装 libtor
  • nginx location proxy_pass详解

    在nginx中配置proxy pass时 xff0c 如果在proxy pass后面的url加 xff0c 相当于是绝对根路径 xff0c 则nginx不会把location中匹配的路径部分代理走 如果没有 xff0c 则会把匹配的路径部分
  • hbase代码说明(通话记录查询)

    Hbase的项目 xff08 通话记录查询 xff09 写java的包 导入jar包 Hbase的包 xff0c hadoop的包 xff0c 驱动包 配置文件 xff08 hbase hdfs regionserver backup xf
  • SysTick 定时器详细学习笔记并兼容FreeRTOS

    文章目录 一 xff1a 基础知识二 xff1a SysTick 的时钟频率三 xff1a SysTick 的配置四 xff1a SysTick 实现精准延时并兼容 FreeRTOS五 xff1a 参考 一 xff1a 基础知识 SysTi
  • 无人机项目跟踪记录四十八---角度pid控制模块详解(2)

    角度pid控制模块中函数 xff1a static void PID Postion Cal PID Typedef PID float target float measure int32 t dertT 为PID自整定函数 xff1a
  • 无人机项目跟踪记录四十九----角速度环的pid控制详解

    角速度环的pid控制的函数是void CtrlAttiRate void xff0c 具体解释如下 xff1a 首先初始化变量 xff0c 获取陀螺仪读取的角速度 float yawRateTarget 61 0 期望的偏航角速度 stat
  • 无人机项目跟踪记录五十一----高度融合模块详解

    这个模块的函数是 xff1a void AltitudeCombineThread void 函数有点乱 xff0c 部分没有看懂 xff0c 加上了注释 以后再详细搞清楚吧 xff01 timeStamp in us Thread sho
  • 无人机项目跟踪记录五十八--原理图控制部分分析

    下图为控制部分的电路图 xff1a 左上角电路是3 3v的供电电源 xff0c 附近的两个电容起到滤波作用 其下的J1是接仿真器的接口 xff0c 这里用的是SW模式 右边的U1为核心控制芯片arm xff0c 是整个电路的控制核心 Y1是
  • 基于faster-rcnn的图片标注和数据集生成自动化工具(数据集格式同pascal voc)

    未完待续 faster rcnn的模型训练需要大量数据集 xff0c 目前使用labelImg工具 xff0c 需要人工一张一张标注 xff0c 效率低 本文使用python编写了自动化图片标注和数据集生成工具 xff08 本文标注目标是人