本文围绕20种国家一级保护动物展开,先介绍相关背景、保护意义及刑法规定,再详述数据处理(解压、读取存储、划分、预处理)、数据集类构建、基于MobileNetV2的网络搭建与训练过程,最后展示模型加载及预测结果,旨在通过分类模型相关操作助力保护工作。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜
国家一级保护动物是根据《野生动物保护法》划分的。《野生动物保护法》第九条将国家重点保护野生动物划分为国家一级保护动物和国家二级保护动物两种,并对其保护措施作出相关规定,但它们的法律地位是相同的。
1989年,经国务院批准并颁布的《国家重点保护野生动物名录》中,收录包括了大熊猫、金丝猴、长臂猿、雪豹、东北虎、梅花鹿、亚洲象等在内的97种国家一级保护动物。
2025年6月,为进一步加大对穿山甲的保护力度,我国将穿山甲属所有种由国家二级保护野生动物提升至一级。
2025年2月,调整后的国家重点保护野生动物名录正式公布。豺、长江江豚等65种野生动物由国家二级保护野生动物升为国家一级。
(图源网络,请勿商用)
不要让我们的孩子只能在博物馆里才见到今天的动物。
保护动物就是在保护生物的多样性,就等于保护了人类生存和社会发展的基石。就等于保护了人类文化多样性的基础,就是保护了人类自身。
刑法规定
《中华人民共和国刑法》第三百四十一条 【非法猎捕、*珍贵、濒危野生动物罪;非法收购、运输、出售珍贵濒危野生动物、珍贵、濒危野生动物制品罪】非法猎捕、*国家重点保护的珍贵、濒危野生动物的,或者非法收购、运输、出售国家重点保护的珍贵、濒危野生动物及其制品的,处五年以下有期徒刑或者拘役,并处罚金;情节严重的,处五年以上十年
以下有期徒刑,并处罚金;情节特别严重的,处十年以上有期徒刑,并处罚金或者没收财产。
【非法狩猎罪】违反狩猎法规,在禁猎区、禁猎期或者使用禁用的工具、方法进行狩猎,破坏野生动物资源,情节严重的,处三年以下有期徒刑、拘役、管制或者罚金。
本项目包含了20种国家一级保护动物,文件夹内容如下:
每个文件夹当中的图片数量都在50-70左右。
这一步没什么好说的,就是将数据解压,然后再讲数据进行打标签。
这里我将数据解压到work目录下,如下:
In [ ]work/动物1-20/XX
!unzip -oq /home/aistudio/data/data63087/动物1-20.zip -d work/
这一步是将数据进行读取,当然我还是习惯性的将数据做一个记录,存入txt,同时我这个txt是符合paddleclas的使用的
有兴趣的可以直接使用我这个all_list.txt去进行paddleclas的分类实现。
In [2]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]]In [3]
# 图片总数量查看print(all_lenth)print(len(data))print(len(label))
1099 1099 1099
划分训练集和验证集数据,这里采用8:2
这里采用sklearn.model_selection下的划分功能,我们就不需要去打乱这个标签了,会自动将数据进行合理的划分。
这玩意真的是方便又好用!
In [4]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)In [5]
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!
继续,进行数据预处理
就采用官方提供的方法完成数据的预处理即可。
In [6]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来编写此类
In [7]## 构建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
In [8]
# 训练的数据提供器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) break
train大小: 879 eval大小: 220 (3, 500, 500) 18
考虑到后续可能会去部署到硬件上,所以我们这里不再自己手动搭建网络,采用官方提供的shuffleNet系列的网络模型即可。
因为现在的移动端或者硬件部署追求效率多一些,就需要相对而言轻量级的模型,和比较主流的模型,这样方便去适配硬件。
推荐使用Mobilenet_V1、V2和shuffleNetV1、V2和Resnet50
我这里就使用MobileNetV2吧
In [9]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.In [10]
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.")
相关文章:
文心一言鼠标总线,开启未来办公体验新,ai7美yw
AI撰写率:让创作变得更高效,助力内容产业腾飞,人力ai
AI矢量生成模型入门宝典,创意无限,轻松掌握,ai摄影成都
国内AI大模型上线,开启产业创新与发展新,AI度晓晓二级
探秘文心一言,解码其母公司与行业影响,搭建ai写作平台的软件
文心一言邀请码大放送,独家攻略助你轻松抢码!,广州ai培训
个性化AI虚拟女友,智能伴侣定制化时代的来临,ai淘宝卖货
免费写作软件推荐:提升创作效率,轻松写作不再是难题!
AI大模型,开启个人智能助手新时代,用ai制作狗
AI原创文章生成系统:助力内容创作的新革命
AI营销,正负样本智慧应用与深度解析,ai仔怎么做
科技巨头AI竞赛,大模型参数排行榜揭秘,ai内环绕文字
AI绘画神器大揭秘,软件盘点与实操攻略,ai手写字书法
在线AI文章生成:智能写作的无限可能
AI语音合成技术革新,开启语音交互新时代,讲堂人物ai
轻松写出高质量论文,选择论文写作网站的正确方式
SEO与SEM的完美结合:提升企业网站流量和转化的双重利器
vivoAI蓝心大模型赋能地铁智慧出行,引领未来出行变革,ai科幻场景
AI大模型引领GTA未来体验革新,ai畅想未来
AI加速株生成引发争议,6小时产出四万种,是科技进步还是安全隐忧?,ai绘画老头
微光彩色AI模型构建全解析,走进人工智能色彩新领域,ai车轮印
AI赋能语文教学,文心一言揭秘高效出题之道,hr行业ai开放平台
AI翻译工具的革命-ChatGPT等技术让语言互通无碍,淘宝ai写作检测准吗
AI语音模型解析,技术革新与未来趋势洞察,凉薇AI
小度研发之路,摒弃文心一言,自主研发的智慧选择,ai公司标语
AI赋能3D样机建模,重塑设计流程,加速产品开发,AI则善
SEM优化与SEO优化:数字营销的双剑合璧
AI的两个主要发展阶段:从起步到突破,如何重塑未来,wps ai写作去哪里
AI大数据模型重塑量化交易未来,揭秘其魅力与,海信AI换台
释放网站潜力,外链发布工具助力SEO优化
构筑未来智能,AI大模型技术架构解析,ai四摄和ai双摄
文心一言,开启国内开源代码全球影响力新篇章,ai智能写作辅助
特斯拉AI大模型,引领电动汽车智能,ai计划云顶
文心一言模板制作攻略,轻松定制个性化文本模板,可爱布偶ai
AI赋能音乐创作,探索智能豆包的音艺之旅,苍穹ai服务云
文心独运,巧呈一言,打造沉浸式阅读盛宴,ai坠龙
AI绘画大模型,揭秘制作流程、技术内核与实际应用,ai人们
AI训练大模型失败案例分析及优化策略研究,ai 打散
让你的文案更具吸引力如何进行高效的文案写作修改
揭秘文心一言,虚拟中的谎言真相,宿迁ai
探索AI大模型,引领未来智能的强大动力,奇想ai
如何通过AI写文章,轻松提高写作效率与质量
文心一言赋能股票网格交易,开启智能财富增长新篇章,Ai54326...
求一个AI软件,彻底改变你的工作与生活!
AI音乐演绎,深度解析模型训练的艺术之旅,ai画空军
怎么用AI缩写文章,轻松提高效率的全新方法
AI绘画,探索模型应用、法律边界与安全防护,ai怎样制作沙雕动画
轻松掌握AI模型下载全攻略,电脑使用ai写作功能
AI小模型在多元场景下的创新应用探索,ai文章图
SEM优化与SEO优化:提升网站流量与转化率的双剑合璧