IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 酒瓶检测流程 -> 正文阅读

[人工智能]酒瓶检测流程

数据清洗https://tianchi.aliyun.com/forum/postDetail?spm=5176.12586969.1002.21.125b13e2xpCMec&postId=87373

处理后图片为3370张

训练集和验证集划分

在这里插入图片描述
在这里插入图片描述

一个形象的比喻:

训练集-----------学生的课本;学生 根据课本里的内容来掌握知识。

验证集------------作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。

测试集-----------考试,考的题是平常都没有见过,考察学生举一反三的能力。

传统上,一般三者切分的比例是:6:2:2,验证集并不是必须的。

json2txt.py文件:将清洗后的coco格式数据集转化为txt格式数据集

9/28

删除6 7 8类进行训练。map提高7.53%

在这里插入图片描述
在这里插入图片描述

加入FPN

代码地址:https://github.com/guoruoqian/FPN_Pytorch

制作voc数据集:将原始coco数据集转化为voc数据集格式;#数据集中删除不需要的类#;使用现成的xml:https://tianchi.aliyun.com/forum/postDetail?spm=5176.12586969.1002.36.125b13e2pXM9Nl&postId=86731;https://blog.csdn.net/qq_35153620/article/details/101902502

;根据xml制作voc数据集:https://www.cnblogs.com/tianxxl/p/10893285.html

[0 Background, 1 CapPoSun, 2 CapBianXing, 3 CapHuaiBian, 4 CapDaXuan, 5 CapDuanDian, 6 LabelWaiXie, 7 LabelQiZhou, 8 LabelQiPao, 9 CodeZhengChang, 10 CodeYiChang, ]

voc数据集拆分为训练集和测试集:https://blog.csdn.net/qq_41627642/article/details/104954331?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163512422416780366515873%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163512422416780366515873&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-104954331.pc_search_result_control_group&utm_term=FPN_Tensorflow&spm=1018.2226.3001.4187#t5

# -*- coding: utf-8 -*-
from __future__ import division, print_function, absolute_import
import sys

sys.path.append('../../')
import shutil
import os
import random
import math


def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)

divide_rate = 0.8

#root_path = '/mnt/ExtraDisk/yangxue/data_ship_clean'
root_path="D:/Python base/Test2/FPN_Tensorflow-master"  ##注释 修改成我们自己的主路径

#image_path = root_path + '/VOCdevkit/JPEGImages'
image_path = root_path + "/data/VOC/VOC_test/VOC2007/JPEGImages/"  ##注释 修改成图像存放的主路径
xml_path = root_path + "/data/VOC/VOC_test/VOC2007/Annotations/"  ##注释 修改成图像标注的存放的主路径

image_list = os.listdir(image_path)

image_name = [n.split('.')[0] for n in image_list]

random.shuffle(image_name)

train_image = image_name[:int(math.ceil(len(image_name)) * divide_rate)]
test_image = image_name[int(math.ceil(len(image_name)) * divide_rate):]

image_output_train = os.path.join(root_path, 'VOCdevkit_train/JPEGImages') ##注释 输出的train影像的路径
mkdir(image_output_train)
image_output_test = os.path.join(root_path, 'VOCdevkit_test/JPEGImages')#注释 输出的test影像的路径
mkdir(image_output_test)

xml_train = os.path.join(root_path, 'VOCdevkit_train/Annotations')##注释 输出的train影像的标注路径
mkdir(xml_train)
xml_test = os.path.join(root_path, 'VOCdevkit_test/Annotations')##注释 输出的test影像的标注路径
mkdir(xml_test)


count = 0
for i in train_image:
    shutil.copy(os.path.join(image_path, i + '.jpg'), image_output_train) ##影像数据格式.jpg
    shutil.copy(os.path.join(xml_path, i + '.xml'), xml_train)
    if count % 1000 == 0:
        print("process step {}".format(count))
    count += 1

for i in test_image:
    shutil.copy(os.path.join(image_path, i + '.jpg'), image_output_test)
    shutil.copy(os.path.join(xml_path, i + '.xml'), xml_test)
    if count % 1000 == 0:
        print("process step {}".format(count))
    count += 1

10/28 瓶盖断点ap为0.55,较之前0.22有较大提高

4-0.99 10-0.82 9-0.94 2-0.57 3-0.318 1-0.32 5-0.55

在这里插入图片描述
在这里插入图片描述

10/29

Background
CapPoSun
CapBianXing
CapHuaiBian
CapDaXuan
CapDuanDian
LabelWaiXie
LabelQiZhou
LabelQiPao
CodeZhengChang
CodeYiChang

删除标签:Background、LabelWaiXie、LabelQiZhou、LabelQiPao
删除前各类数目:
请添加图片描述
删除后各类数目:
请添加图片描述

将新的数据集放入训练

处理voc数据集

删除指定类别标签(https://blog.csdn.net/qq_35153620/article/details/101902502)
github项目地址(附有使用说明书):
https://github.com/A-mockingbird/VOCtype-datasetOperation

统计每个类别实际目标的个数(https://blog.csdn.net/DD_PP_JJ/article/details/102772793#comments_12179946)

import os
import os.path
from xml.etree.ElementTree import parse, Element

def changeName(xml_fold, origin_name, new_name):
    '''
    xml_fold: xml存放文件夹
    origin_name: 原始名字,比如弄错的名字,原先要cow,不小心打成cwo
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0 
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            if tmp_name == origin_name: # 修改
                obj.find('name').text = new_name
                print("change %s to %s." % (origin_name, new_name))
                cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

def changeAll(xml_fold,new_name):
    '''
    xml_fold: xml存放文件夹
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0 
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            obj.find('name').text = new_name
            print("change %s to %s." % (tmp_name, new_name))
            cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

def countAll(xml_fold):
    '''
    xml_fold: xml存放文件夹
    '''
    files = os.listdir(xml_fold)
    dict={}
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            if tmp_name not in dict:
                dict[tmp_name] = 0
            else:
                dict[tmp_name] += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("统计结果如下:")
    print("-"*10)
    for key,value in dict.items():
        print("类别为%s的目标个数为%d." % (key, value+1))
    print("-"*10)


if __name__ == '__main__':
    path = r"I:\dongpeijiePickup\assignment\part2_xml" #xml文件所在的目录
    # changeName(path, "cattle", "cow")
    # changeAll(path, "cattle")
    countAll(path)


删除无object项的xml文件及对应的图片 链接: link.

# coding=utf-8
import xml.dom.minidom
import os

# 未连接前xml,images路径
file_path = '/home/boni/Downloads/coco_extract/Annotations/'
img_path = '/home/boni/Downloads/coco_extract/images/'
# 获取路径下所有的xml文档,并保存在列表xml_file中(xml_file是list类型)
xml_file = os.listdir(file_path)
# 获取list长度
# print(len(xml_file))

"""
获取每个元素并与之前的路径连接,对每个xml进行object标签遍历,
xml中有object标签就直接跳过,没有就直接删除对应的xml文档,
并删除JEPGImages下对应的图片
"""
for i in range(len(xml_file)):
    # 连接并保存为新的路径
    new_file_path = os.path.join(file_path, xml_file[i])
    new_img_path = os.path.join(img_path, xml_file[i][:-3]+'jpg')
    # print(new_file_path)
    # print(new_img_path)
    # 打开xml文档
    dom = xml.dom.minidom.parse(new_file_path)
    # 得到文档元素对象
    root = dom.documentElement
    bb = root.getElementsByTagName('object')
    if bb.length == 0:
        # print("no object")
        # 删除无object的xml
        os.remove(new_file_path)
        # print("has remove this xml")
        # 删除无object的xml对应的照片
        os.remove(new_img_path)
        # print("has remove this image")
    else:
        # print("have object")
        print(bb.length)


导入tensorflow代码修改:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

训练删除Background、LabelWaiXie、LabelQiZhou、LabelQiPao后的数据集。
图片大小(492*658)

11/1
label_dict.py下的7个类
7个类
cfgs.py下MAX_ITERATION=10000;CLASS_NUM=7

batch size 训练时间_训练神经网络 | 三个基本概念:Epoch, Batch, Iteration链接: link.

名词定义
Epoch使用训练集的全部数据对模型进行一次完整训练,“一代训练”
Batch使用数据集中的一小部分样本对模型权重进行一次反向传播的参数更新,“一批数据”
Iteration使用一个Batch数据对模型进行一次参数更新的过程,“一次训练”

step与epoch,batch_size之间的关系:

在训练模型的过程中,一个step其实指的就是一次梯度更新的过程。例如在每个epoch中有2000个用于训练的图片,我们选取了batch_size=100,那么我们就需要2000 images / 100 (images/step) = 20 steps来完成这个epoch。链接: link.

假设训练集中有2000个样本,把训练集的2000个样本一个不漏地输入到模型中,让模型进行学习,即为1个epoch;训练的时候2000个样本太多了,分小一点,若分成10份,则batch=10;batch_size=2000/10=200;此时,每次输入到模型的样本数为batch_size大小,即每一次输入200个样本;每输入一个batch_size大小的样本,模型则学习一次,更新一次参数,即一个iteration/step。链接: link.

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-01 11:35:03  更:2021-11-01 11:35:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:18:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码