背景目的
针对海洋鱼类识别难的问题,本实践使用卷积神经网络构建深度学习模型,自动提取高质量的特征,从而解决海洋鱼类识别的问题。接下来,我将分享如何使用百度深度学习框架飞桨来搭建卷积神经网络,实现海洋鱼类资源的识别。(本次实践所使用的是台湾电力公司、台湾海洋研究所和垦丁国家公园在2010年10月1日至2013年9月30日期间,在台湾南湾海峡、兰屿岛和胡比湖的水下观
景台收集的鱼类图像数据集。)
本实践选取5种鱼类数据作为数据集进行训练,被划分为两个子集,训练集和测试集比例为9:1
数据集的大小、数据条数、数据格式。
444.34M、 该数据集包括23类鱼种 ,共27370张鱼的图像、 图像数据集JPEG
网络结构
这个网络结构采用了一个比较经典的卷积神经网络(Convolutional Neural Network,CNN)架构。以下是该网络结构的描述:MyCNN (Custom Conwolutional Neural Network);-第1层卷积层(Conv2D):输入通道数为3(RGB图像),输出通道数为20,卷积核大小为5x5,ReLU激活函数,无填充。
-第1层池化层(Pool2D):最大池化,池化窗口大小为2x2,池化步长为2x2。-第1层批归一化层(BatchNorm): 20通道。
-第⒉层卷积层(Conv2D):输入通道数为20,输出通道数为50,卷积核大小为5x5,ReLu 激活函数,无填充。
–第⒉层池化层(Pool2D):最大池化,池化窗口大小为2x2,池化步长为2x2。-第⒉层批归一化层(BatchNorm): 50通道。
-第3层卷积层(Conv2D):输入通道数为50,输出通道数为50,卷积核大小为5x5,ReLU激活函数,无填充。
-第3层池化层(Pool2D):最大池化,池化窗口大小为2x2,池化步长为2x2。
-全连接层(Linear):输入维度为200,输出维度为23(23个类别,对应不同的海洋生物类别),采用Softmax激活函数。
这个网络结构包含了三个卷积层,两个池化层和一个全连接层,是一个典型的卷积神经网络架构。
导入包
import zipfile
import os
import random
import paddle
import matplotlib.pyplot as plt
from paddle.fluid.dygraph import Pool2D,Conv2D,BatchNorm
from paddle.fluid.dygraph import Linear
import sys
import numpy as np
from PIL import Image
from PIL import ImageEnhance
import paddle.fluid as fluid
from multiprocessing import cpu_count
import matplotlib.pyplot as plt
import json
#解压原始数据集,将fish_image.zip解压至data目录下
src_path="/home/aistudio/data/data14492/fish_image23.zip"
target_path="/home/aistudio/data/fish_image"
if(not os.path.isdir(target_path)):
z = zipfile.ZipFile(src_path, 'r')
z.extractall(path=target_path)
z.close()
#存放所有类别的信息
class_detail = []
#获取所有类别保存的文件夹名称
class_dirs = os.listdir(target_path+"/fish_image")
data_list_path="/home/aistudio/data/"
TRAIN_LIST_PATH=data_list_path + "train.txt"
EVAL_LIST_PATH=data_list_path + "eval.txt"
#每次执行代码,首先清空train.txt和eval.txt
with open(TRAIN_LIST_PATH, 'w') as f:
pass
with open(EVAL_LIST_PATH, 'w') as f:
pass
首先,代码会解压名为`fish_image23.zip`文件到指定路径`/home/aistudio/data/fish_image`下。如果目标路径不存在,则会创