从零开始构建自己CNN网络
前言:作为一个研一刚刚进入CV领域的萌新,经过将近一个学期的折腾,总算比较清楚的从零开始构建了属于自己的CNN网络。下面我将从图片注释开始讲述一下我自己的搭建网络过程。
1.下载labelImg进行图像注释
https://github.com/tzutalin/labelImg这是labelImg的GitHub网址,可以按照里面说的步骤下载,就是要注意我们安装的环境是什么,由于我安装了Anaconda和PythonIDLE两个环境,所以我第一次装在了PythonIDLE里面,结果由于其他要求的库是装在Anaconda里面,导致无法运行。这一点还是要小心的。
然后对于LabelImg的使用,个人觉得还是比较简单的,如下图所示就能启动labelImg了。
启动以后就是这么个界面:
具体的使用教程可以参考这个博主的(https://blog.csdn.net/python_pycharm/article/details/85338801)写的很详细了。
使用起来这个还是非常简单的,我的图像是关于猪的,总共504副图像,苦逼的一个人手工进行注释。因为只是进行一个学习的检验和测试,所以我就把这504副图像分为2类,将这个问题变成了简单的2分类问题。
2.对图像进行处理和扩增
由于得到的图像在质量上有很多问题,所以我采用了OpenCV这个库进行了一些图像处理。又由于样本数量太少,我也利用OpenCV对图像进行了复制扩增,最后得到了5688副训练用的图像和720副测试用的图像。当然标签也没有忘记跟着复制。
其实那个时候也看到了keras.preprocessing.image.ImageDataGenerator能做这件事,但是由于我对这个感觉不太放心所以还是选择了用OpenCV先做处理先。
3.对labelImg得到的xml文件进行解析
废话不多说,直接上代码就完了
path2='D://start//VOC2007//datasets//new_label//train'
path4='D://start//VOC2007//datasets//new_label//test'
train_xmllist=os.listdir(path2)
test_xmllist=os.listdir(path4)
y_train=[]
y_test=[]
for i in train_xmllist:
tree1=et.parse(path2+'//'+i)
root1=tree1.getroot()
for element in root1.iter(tag='name'):
y_train.append(element.text)
for i in test_xmllist:
tree2=et.parse(path4+'//'+i)
root2=tree2.getroot()
for element in root2.iter(tag='name'):
y_test.append(element.text)
#因为要尝试很多模型,所以将解析出的标签存为csv文件
import pandas as pd
df1=pd.DataFrame(y_train,columns=['train_label'])
df2=pd.DataFrame(y_test,columns=['test_label'])
df1=df1.replace('STD',0)
df1=df1.replace('NSTD',1)
df2=df2.replace('STD',0)
df2=df2.replace('NSTD',1)
df1.to_csv('pig_rec_train.csv')
df2.to_csv('pig_rec_test.csv')
今天先写到这里,苦逼的搬砖工要去搬砖了。。。。