首先从百度PandlePandle平台上获得了虫子的数据,原先已经在google colab上跑通了faster rcnn的源码,跑通的部分记录放在CSDN上面的。那部分的过程主要还是根据别人的教程一步一步来实现的,训练测试的数据是VOC2007
所以这里想自己将数据集格式改成VOC2007格式的,然后进行数据集的替换。然后训练测试来一发,看看自定义数据集的效果。
# 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('已写入')
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()
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)
今天将数据集搞好后,开始调试训练代码报的错误。还好有大佬们的博客博客帮忙
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
处理完这个错误之后继续训练,报错如下:
也不知道调试了多久,主要网上没找到相似的情况,所以把我都搞醉了,大概是去原作者的github中的说明中去找步骤,发现以前版本的代码有一个脚本文件,而新版本代码中倒是没有,上面报错的情况大概是配置的问题,有关GPU问题的,而且还是ROIAlign部分出的问题,本来这是Mask RCNN中才有的模块,原作者也说了他们提供了几种pooling技术而且都实现了,所以代码应该是默认用了Mask RCNN中更好的模块替代了 ROI Pooling吧。好了,说这么多其实对于后面解决该问题也没什么逻辑可言。
我直觉觉得可能是模块编译出了问题,所以我就又编译了一下,还是不对。
继续研究目录结构,在将作者的代码clone下来时,lib文件夹下并没有build文件夹,那就很好理解,肯定是编译的时候产生的啦,之前重新编译不行,那就大概率是因为编译文件已经产生了,就没有重新来一遍。我就果断的删除了build文件,重新编译,再次运行训练命令,果真开始训练了。那感觉,确实不错!
后续train_net、 test_net、 demo都试了一下,不知道demo放入的数据是已经训练的数据还是啥原因,看起来也太准了吧。后面再仔细分类一下 百度的AI试虫数据集,把未训练的数据集放入项目中demo一下,看看准确率如何
情况如下:
第二张和第六张中各有一个小目标都有重复框,第八张的预测不是很理想。后续就要改进这些不足了。还有的是,随机看了一张图 2571.jpg 也就是上面的第三张图 2571.xml中竟然给了七个框,我人都晕了。这是什么情况啊。