酒瓶检测流程

数据清洗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
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.

label_dict.py下的7个类
7个类
cfgs.py下MAX_ITERATION=10000;CLASS_NUM=7
训练集1187张,测试集297张,原数据集2969张图。
请添加图片描述
使用2375张训练集 594张测试集图片进行
设置SAVE_WEIGHTS_INTE =4000 MAX_ITERATION = 4000,效果很差
在这里插入图片描述
11/2
使用2375张训练集 594张测试集图片进行
设置SAVE_WEIGHTS_INTE =10000 MAX_ITERATION = 10000,map和使用一半图片训练差不多。
请添加图片描述
使用resnet101
使用2375张训练集 594张测试集图片进行
设置SAVE_WEIGHTS_INTE =10000 MAX_ITERATION = 10000,map提高0.02。
请添加图片描述
11/3
先下载whl后安装
需要注意的是,直接这样安装似乎特别慢,因此我们可以进入如下网址:
https://download.pytorch.org/whl/torch_stable.html
找到自己需要的轮子下载。下载的时候使用迅雷下载就行了,速度还是比较快的!
在这里插入图片描述
下载完成后找到安装路径:
在这里插入图片描述

在cmd定位过来后利用文件全名进行安装就行了!
在这里插入图片描述

我们在下载pytorch安装包时,会发现CUDA9.0有py27_gpu版有两个whl下载文件,分别是:

cu90/torch-0.3.0.post4-cp27-cp27mu-linux_x86_64.whl
cu90/torch-0.3.0.post4-cp27-cp27m-linux_x86_64.whl

cp27m是ucs2,cp27mu是ucs4。
UCS2规定每个字符占用2个字节,UCS4规定每个字节占用4个字符,都是UNICODE的编码形式。
一般选UCS2的版本即可

安装qq命令
sudo apt install -y /home/wang/下载/linuxqq_2.0.0-b2-1089_amd64.deb

11/4
ubuntu 操作没有权限的文件

对于没有权限进行操作的文件,暂时遇到两种解决方案
1.ctrl+alt+t,打开终端--------》输入gnome-terminal-----》回车,进入新的操作界面------》新终端输入sudo nautilus----->打开超级用户权限的资源管理器,进行文件操作。

11/5
先不配置环境了,用其他网络(SSD YOLO)测试一下看看效果。
删除CapPoSun CapHuaiBian 用加入FPN的faster rcnn运行测试。
请添加图片描述
11/6
yolov3
请添加图片描述
11/7
ssd
请添加图片描述

faster rcnn
请添加图片描述
faster rcnn最差??

resnet101 设置SAVE_WEIGHTS_INTE =10000 MAX_ITERATION = 20000
请添加图片描述
resnet101 设置SAVE_WEIGHTS_INTE =10000 MAX_ITERATION = 50000,到40000步停了
11/11
resnet50 设置SAVE_WEIGHTS_INTE =10000 MAX_ITERATION = 50000
请添加图片描述
ssd 使用epoch55
请添加图片描述

yolo使用epoch15
请添加图片描述

版权声明:本文为CSDN博主「止不住的青春」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_49916202/article/details/121028894

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

开学送给她的礼物(Python实现)

目录 1 卿为朝朝暮暮 2 情感起伏 3 礼物赠送  4 Python之实现turtle 1 卿为朝朝暮暮 先手抄一遍,然后再键盘敲出来: 飞鸟集中的一句话,改编的一首诗是过样的: 浮世万千&

CV-目标检测总结

目标检测 论文:A Survey of Modern Deep Learning based Object Detection Models 目标检测:在图像或视频中,找到目标位置并进行分类。其需要识