本文围绕20种国家一级保护动物展开,先介绍相关背景、保护意义及刑法规定,再详述数据处理(解压、读取存储、划分、预处理)、数据集类构建、基于MobileNetV2的网络搭建与训练过程,最后展示模型加载及预测结果,旨在通过分类模型相关操作助力保护工作。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

国家一级保护动物是根据《野生动物保护法》划分的。《野生动物保护法》第九条将国家重点保护野生动物划分为国家一级保护动物和国家二级保护动物两种,并对其保护措施作出相关规定,但它们的法律地位是相同的。
1989年,经国务院批准并颁布的《国家重点保护野生动物名录》中,收录包括了大熊猫、金丝猴、长臂猿、雪豹、东北虎、梅花鹿、亚洲象等在内的97种国家一级保护动物。
2020年6月,为进一步加大对穿山甲的保护力度,我国将穿山甲属所有种由国家二级保护野生动物提升至一级。
2021年2月,调整后的国家重点保护野生动物名录正式公布。豺、长江江豚等65种野生动物由国家二级保护野生动物升为国家一级。
(图源网络,请勿商用)
不要让我们的孩子只能在博物馆里才见到今天的动物。
保护动物就是在保护生物的多样性,就等于保护了人类生存和社会发展的基石。就等于保护了人类文化多样性的基础,就是保护了人类自身。
刑法规定
《中华人民共和国刑法》第三百四十一条 【非法猎捕、杀害珍贵、濒危野生动物罪;非法收购、运输、出售珍贵濒危野生动物、珍贵、濒危野生动物制品罪】非法猎捕、杀害国家重点保护的珍贵、濒危野生动物的,或者非法收购、运输、出售国家重点保护的珍贵、濒危野生动物及其制品的,处五年以下有期徒刑或者拘役,并处罚金;情节严重的,处五年以上十年以下有期徒刑,并处罚金;情节特别严重的,处十年以上有期徒刑,并处罚金或者没收财产。
【非法狩猎罪】违反狩猎法规,在禁猎区、禁猎期或者使用禁用的工具、方法进行狩猎,破坏野生动物资源,情节严重的,处三年以下有期徒刑、拘役、管制或者罚金。
本项目包含了20种国家一级保护动物,文件夹内容如下:
每个文件夹当中的图片数量都在50-70左右。
!unzip -oq /home/aistudio/data/data63087/动物1-20.zip -d work/
这一步是将数据进行读取,当然我还是习惯性的将数据做一个记录,存入txt,同时我这个txt是符合paddleclas的使用的
有兴趣的可以直接使用我这个all_list.txt去进行paddleclas的分类实现。
import os
dirpath = "work/动物1-20"# 先得到总的txt后续再进行划分,因为要划分出验证集,所以要先打乱,因为原本是有序的def get_all_txt():
all_list = [] # 存储数据---图片路径
data = [] # 存储标签---数字0-20
label = [] # 记录编号对应的物种
label_list = []
i = 0
j = -1
for root,dirs,files in os.walk(dirpath): # 分别代表根目录、文件夹、文件
category_name = ''
for file in files:
i = i + 1
# 文件中每行格式: 图像相对路径 图像的label_id(注意:中间有空格)。
# work/动物1-20/蜂猴/b3c393be266ba8182ee2abead6c4bdf6.jpg 0
imgpath = os.path.join(root,file)
category_name = imgpath.split("/")[-2]
all_list.append(imgpath+" "+str(j)+"\n")
data.append(imgpath)
label.append(j)
label_list.append([category_name,j])
j = j + 1
allstr = ''.join(all_list)
f = open('all_list.txt','w',encoding='utf-8')
f.write(allstr) return all_list , i , data , label, label_list
all_list,all_lenth,data,label,label_list = get_all_txt()print(data[0])print(label[0])print(label_list)work/动物1-20/蜂猴/ff35702dd8171f9f5ef7577f757293f5.jpg 0 [['', -1], ['蜂猴', 0], ['紫貂', 1], ['金丝猴', 2], ['豚尾猴', 3], ['儒艮', 4], ['熊猴', 5], ['云豹', 6], ['中华白海豚', 7], ['大熊猫', 8], ['熊狸', 9], ['马来熊', 10], ['长臂猿', 11], ['亚洲象', 12], ['白鱀豚', 13], ['台湾猴', 14], ['豹', 15], ['雪豹', 16], ['叶猴', 17], ['虎', 18], ['貂熊', 19]]
# 图片总数量查看print(all_lenth)print(len(data))print(len(label))
1099 1099 1099
划分训练集和验证集数据,这里采用8:2
这里采用sklearn.model_selection下的划分功能,我们就不需要去打乱这个标签了,会自动将数据进行合理的划分。
这玩意真的是方便又好用!
from sklearn.model_selection import train_test_split train_img, val_img, train_label, val_label = train_test_split(data, label, test_size=0.2)
print(train_img[0])print(train_label[0])print(val_img[0])print(val_label[0])
work/动物1-20/虎/虎3.jpg 18 work/动物1-20/虎/虎_48.jpg 18
到这里为止,我们就拿到我们后续训练所需要的训练集和验证集的data和label!
继续,进行数据预处理
就采用官方提供的方法完成数据的预处理即可。
import paddle.vision.transforms as T
train_transforms = T.Compose([
T.Resize((512,512)),#随机选取目标尺寸调整图像大小
T.RandomCrop((500,500)),#随机裁剪图像
T.RandomHorizontalFlip(prob=0.7),
T.RandomVerticalFlip(prob=0.7),
T.RandomRotation(90),
T.Transpose(), # HWC -> CHW
T.Normalize(
to_rgb=True)])#对图像进行标准化eval_transforms = T.Compose([
T.Resize((500,500)),#以一定的概率对图像进行随机像素内容变换,可包括亮度、对比度、饱和度、色相角度、通道顺序的调整
T.Transpose(), # HWC -> CHW
T.Normalize(
to_rgb=True)#对图像进行标准化])使用paddle.io下的Dataset来编写此类
## 构建dataset类import paddlefrom paddle.io import Datasetfrom PIL import Imageimport numpy as npclass MyDataset(Dataset):
def __init__(self, mode = 'train'):
# 训练样本数量
self.training_data, self.training_label, self.test_data, self.test_label = train_img, train_label, val_img, val_label if mode == 'train':
self.num_samples = len(train_img) else:
self.num_samples = len(val_img)
self.mode = mode def __getitem__(self, idx):
if self.mode == 'train':
image = self.training_data[idx]
label = self.training_label[idx]
img = Image.open(image).convert('RGB')
img = train_transforms(img).astype("float32") else:
image = self.test_data[idx]
label = self.test_label[idx]
img = Image.open(image).convert('RGB')
img = eval_transforms(img).astype("float32")
return img, np.array(label, dtype='int64') def __len__(self):
# 返回样本总数量
return self.num_samples# 训练的数据提供器train_dataset = MyDataset(mode='train')# 测试的数据提供器eval_dataset = MyDataset(mode='val')# 查看训练和测试数据的大小print('train大小:', len(train_dataset))print('eval大小:', len(eval_dataset))# 查看图片数据、大小及标签for data, label in train_dataset: print(np.array(data).shape) print(label) breaktrain大小: 879 eval大小: 220 (3, 500, 500) 18
考虑到后续可能会去部署到硬件上,所以我们这里不再自己手动搭建网络,采用官方提供的shuffleNet系列的网络模型即可。
因为现在的移动端或者硬件部署追求效率多一些,就需要相对而言轻量级的模型,和比较主流的模型,这样方便去适配硬件。
推荐使用Mobilenet_V1、V2和shuffleNetV1、V2和Resnet50
我这里就使用MobileNetV2吧
import paddlefrom paddle.vision.models import MobileNetV2 model = MobileNetV2(num_classes=20)
W0808 17:27:01.903826 3656 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1 W0808 17:27:01.908238 3656 gpu_resources.cc:91] device: 0, cuDNN Version: 7.6.
paddle.summary(model, (1,3,500,500)) # 模型结构查看
import paddlefrom paddle.vision.models import MobileNetV2
model = MobileNetV2(num_classes=20)
model = paddle.Model(model)
EPOCH_NUM = 250BATCH_SIZE = 32learning_rate = 2e-3scheduler = paddle.optimizer.SGD(learning_rate=learning_rate, parameters=model.parameters())# 配置优化器、损失函数、评估指标model.prepare(scheduler,
paddle.nn.CrossEntropyLoss(),
paddle.metric.Accuracy())# 训练可视化VisualDL工具的回调函数visualdl = paddle.callbacks.VisualDL(log_dir='visualdl_log')# 启动模型全流程训练model.fit(train_dataset,
eval_dataset,
epochs=EPOCH_NUM,
batch_size=BATCH_SIZE,
callbacks=[visualdl],
save_dir='output',
shuffle=False,
save_freq=10)Epoch 250/250step 10/28 - loss: 0.2091 - acc: 0.9812 - 767ms/stepstep 20/28 - loss: 0.2418 - acc: 0.9812 - 768ms/stepstep 28/28 - loss: 0.1428 - acc: 0.9784 - 754ms/step
# 加载模型model = MobileNetV2(num_classes=20)
para_dict = paddle.load('output/final.pdparams') # 这里我根据上面的图中我选择使用220轮的模型进行验证model.load_dict(para_dict)
image ='work/动物1-20/貂熊/貂熊13.jpg'img = Image.open(image).convert('RGB')
img = paddle.to_tensor(train_transforms(img),dtype='float32')
img = paddle.reshape(img,(1,3,500,500))
pre = model(img)
result = pre.numpy().argmax()print(result)print(label_list[result+1]) # 加1 是因为前面生成的label_list第一个是 ['', -1]19 ['貂熊', 19]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/nn/layer/norm.py:654: UserWarning: When training, we now always track global mean and variance. "When training, we now always track global mean and variance.")
以上就是中国一级保护动物识别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号