Google Colab调试faster R-CNN之AI识虫部分

一、本地数据集的制作

首先从百度PandlePandle平台上获得了虫子的数据,原先已经在google colab上跑通了faster rcnn的源码,跑通的部分记录放在CSDN上面的。那部分的过程主要还是根据别人的教程一步一步来实现的,训练测试的数据是VOC2007

所以这里想自己将数据集格式改成VOC2007格式的,然后进行数据集的替换。然后训练测试来一发,看看自定义数据集的效果。

数据集的更改:

  • xml文件的修改
    • xml文件中的几个标签内容要改
  • 虫子图片的格式为jpeg,后面替换数据集后发现程序报错,要把图片格式改成jpg格式的。这个比较简单,命令行界面下,到图片集的目录下, 然后 ren *.jpeg *.jpg
  • xml文件中标签内容批量修改时,用python批量修改后,这里想强调几点
    • 修改完成时,写入过程中保证编码方式还是原来的 UTF-8 编码
    • 用记事本打开xml文件时会发现下方的信息 Unix(LF) UTF-8。但是用python批量修改之后再打开,变成了windows(CR LF)。这里应该是换行的符号不同。还不知道对实验有没有影响。
  • 然后还想记下一些以后可能用得到的代码:

批量修改文件夹下所有xml文件中的标签信息


# coding=utf-8

import os

import os.path

import xml.dom.minidom

path = "C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/Annotations"

files = os.listdir(path)  # 得到文件夹下所有文件名称

for xmlFile in files:  # 遍历文件夹

    if not os.path.isdir(xmlFile):  # 判断是否是文件夹,不是文件夹才打开

        print(xmlFile)

        # 将获取的xml文件名送入到dom解析

        dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 输入xml文件具体路径

        root = dom.documentElement

        # 获取标签以及的值

        # name = root.getElementsByTagName('name')

        folder = root.getElementsByTagName('folder')

        filename = root.getElementsByTagName('filename')

        # 对每个xml文件的多个同样的属性值进行修改。此处将每一个属性修改为plane,每一个属性修改为VOC2007

        # for i in range(len(name)):

        #     print(name[i].firstChild.data)

        #     name[i].firstChild.data = 'plane'

        #     print(name[i].firstChild.data)

        folder[0].firstChild.data = "VOC2007"

        for i in range(len(filename)):

            # print(filename[i].firstChild.data)

            lista = filename[i].firstChild.data.split('.')

            ans = lista[0]+'.'+"jpg"

            filename[i].firstChild.data = ans

            # print(ans)

        # 将属性存储至xml文件中

        with open(os.path.join(path, xmlFile), 'w', encoding='UTF-8') as fh:   # 门道相当多啊

            dom.writexml(fh)

            print('已写入')

将文件夹下所有图片名读取出来,写入txt文件中


import os

import os.path

results = set()

path = "C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/JPEGImages/test"

files = os.listdir(path)  # 得到文件夹下所有文件名称

for filenames in files:

    filename = filenames.split(sep='.')[0]

    results.add(filename)


print(len(results))

txt_path = "C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/ImageSets/test.txt"

new_file = open(txt_path,'w+',encoding='UTF-8')

for str in results:

    new_file.write(str+'\n')

new_file.close()

数据集的训练、验证、测试数据集的分割


*"""*

*将数据集进行比例分割,分割成train,val,test,*

*生成  train.txt, val.txt,  test.txt,  trainval.txt*

*"""*

import os

import random

trainval_percent = 0.8

train_percent = 0.8

xmlfilepath = 'C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/Annotations'

txtsavepath = 'C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/ImageSets/Main'

total_xml = os.listdir(xmlfilepath)

num = len(total_xml)

list = range(num)

tv = int(num * trainval_percent)

tr = int(tv * train_percent)

trainval = random.sample(list, tv)

train = random.sample(trainval, tr)

ftrainval = open('C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/ImageSets/Main/trainval.txt', 'w')

ftest = open('C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/ImageSets/Main/test.txt', 'w')

ftrain = open('C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/ImageSets/Main/train.txt', 'w')

fval = open('C:/Users/Administrator/Desktop/AI_studio/PaddleDetection/dataset/insect/ImageSets/Main/val.txt', 'w')

for i in list:

    name = total_xml[i][:-4] + '\n'

    if i in trainval:

        ftrainval.write(name)

        if i in train:

            ftrain.write(name)

        else:

            fval.write(name)

    else:

        ftest.write(name)

ftrainval.close()

ftrain.close()

fval.close()

ftest.close()

文件格式转换 window 转换为unix

https://www.cnblogs.com/TurboWay/p/9687576.html

import sys
import os
import chardet

def turn(file):
    with open(file, 'rb') as f:
        data = f.read()
        encoding = chardet.detect(data)['encoding']
        data_str = data.decode(encoding)
        tp = 'LF'
        if '\r\n' in data_str:
            tp = 'CRLF'
            data_str = data_str.replace('\r\n', '\n')
        if encoding not in ['utf-8', 'ascii'] or tp == 'CRLF':
            with open(file, 'w', newline='\n', encoding='utf-8') as f:
                f.write(data_str)
            print(f"{file}: ({tp},{encoding}) trun to (LF,utf-8) success!")

if __name__ == "__main__":
    if sys.argv.__len__() != 2:
        print(f"param: python3 etl_file_check.py /home/getway/script/hql")
    else:
        dr = sys.argv[1]
        for path in os.listdir(dr):
            file = os.path.join(dr, path)
            if os.path.isfile(file):
                turn(file)

2.21日又开始调试了

今天将数据集搞好后,开始调试训练代码报的错误。还好有大佬们的博客博客帮忙

https://www.cnblogs.com/wind-chaser/p/11359521.html

博客上面一样的问题我就不记录了,下面是自己遇到的问题

  • 训练时报错内容是
cls = self._class_to_ind[obj.find('name').text.lower().strip()]

网上的说法不尽相同,尝试了几次都没有搞对,后面自己去看了下源代码。简单介绍下
源文件的处理过程是先从trainval.txt 中读取出要训练验证的数据是哪些图片和xml,然后程序从对应的xml文件中读取出object标签下的信息,也就是一张图中所有的目标信息,这些目标信息再以程序自己的格式存储下来(也就是定义多个列表,比如位置信息),最后还要存储目标的类别信息,问题就出在这,程序会把读到的类别信息转成小写,然后再去字典(这个字典是几个类别分别对应的索引)查找该类索引,最后记录类别信息也就是记录字典的索引。因为字典中的类别key值有几个是大写,所以没有匹配上就一直报错啦。OK

处理完这个错误之后继续训练,报错如下:

Google Colab调试faster R-CNN之AI识虫部分_第1张图片

也不知道调试了多久,主要网上没找到相似的情况,所以把我都搞醉了,大概是去原作者的github中的说明中去找步骤,发现以前版本的代码有一个脚本文件,而新版本代码中倒是没有,上面报错的情况大概是配置的问题,有关GPU问题的,而且还是ROIAlign部分出的问题,本来这是Mask RCNN中才有的模块,原作者也说了他们提供了几种pooling技术而且都实现了,所以代码应该是默认用了Mask RCNN中更好的模块替代了 ROI Pooling吧。好了,说这么多其实对于后面解决该问题也没什么逻辑可言。

我直觉觉得可能是模块编译出了问题,所以我就又编译了一下,还是不对。

继续研究目录结构,在将作者的代码clone下来时,lib文件夹下并没有build文件夹,那就很好理解,肯定是编译的时候产生的啦,之前重新编译不行,那就大概率是因为编译文件已经产生了,就没有重新来一遍。我就果断的删除了build文件,重新编译,再次运行训练命令,果真开始训练了。那感觉,确实不错!

后续train_net、 test_net、 demo都试了一下,不知道demo放入的数据是已经训练的数据还是啥原因,看起来也太准了吧。后面再仔细分类一下 百度的AI试虫数据集,把未训练的数据集放入项目中demo一下,看看准确率如何

情况如下:

Google Colab调试faster R-CNN之AI识虫部分_第2张图片Google Colab调试faster R-CNN之AI识虫部分_第3张图片Google Colab调试faster R-CNN之AI识虫部分_第4张图片Google Colab调试faster R-CNN之AI识虫部分_第5张图片Google Colab调试faster R-CNN之AI识虫部分_第6张图片Google Colab调试faster R-CNN之AI识虫部分_第7张图片Google Colab调试faster R-CNN之AI识虫部分_第8张图片Google Colab调试faster R-CNN之AI识虫部分_第9张图片Google Colab调试faster R-CNN之AI识虫部分_第10张图片Google Colab调试faster R-CNN之AI识虫部分_第11张图片

第二张和第六张中各有一个小目标都有重复框,第八张的预测不是很理想。后续就要改进这些不足了。还有的是,随机看了一张图 2571.jpg 也就是上面的第三张图 2571.xml中竟然给了七个框,我人都晕了。这是什么情况啊。

你可能感兴趣的:(目标检测,计算机视觉学习记录)