React-Native制作一个通过照片和视频识别鸟类的安卓app

前言

首先简单介绍一下这个app是干啥的,实际上我的标题已经差不多说完了.....就是用户可以上传带有鸟类的图片或者视频,然后就可以得到相应的识别效果,这个app的需求是来自于我的一位朋友,所以我就做出来了

正文

讲一下基本用到的技术栈吧,前端用的react-native,后端用的是flask,识别算法部分用的是yolov5,接下来我会从三个大方面讲一下学到的东西,也就是前端后端和识别算法这三个大方面.

前端

前端实际上是我第二次使用rn,算是有点经验了其实,这次我就直接用原生的rn框架创建了,而不是使用上次坑了我一次的expo框架.....,然后这次我又新学了一些东西

图标的使用

原先我想用图标总是傻傻的去用npm下载下来的库里的icon,然而这样非常的麻烦,经常出现失败的情况,而且搞不好要不去Android那个文件夹改一堆链接,于是我直接去例如iconfont-阿里巴巴矢量图标库这样的网站去下载png图标资源,然后用img标签展示就行,这样简单多了,唯一需要注意的大概就是记得把图片的名称改成英文的就成,不然打包的时候似乎会出问题....

redux的使用

有一说一,这是我第一次用redux,这里简单说一下redux的用法:

Redux是JavaScript的一个状态管理库,通常与React一起使用

它通过 centerX 全局单一的状态树[state tree]来存储整个应用的状态。改变状态的唯一方式就是触发动作[action],动作是一个描述发生了什么的纯对象。

Redux 的主要组成部分包括:

1. Store:存储应用的完整状态。想象它就像你应用的“数据库”。

2. Actions:表示一种对状态做出改变的方式。在Redux中,所有的改变都被明确化为动作。它们是一个带有 `type`属性和额外数据的简单JavaScript对象。

3. Reducers: 是改变状态的唯一方式,其是纯函数,接收旧的 state 和一个 action,然后返回新的 state。 关于Redux的基本使用步骤如下:

Step 1:创建 Actions
 

export const SOME_ACTION = 'SOME_ACTION';export function doSomething(){ return { type: SOME_ACTION, payload: "Action data" } }

Step 2:创建 Reducers
 

import { SOME_ACTION } from '../actions/sampleActions';export default function sampleReducer(state = initialState, action){ switch (action.type) { case SOME_ACTION: return Object.assign({}, state, action.payload); default: return state; } }

Step 3:创建 Store
 

 import { createStore } from 'redux';import rootReducer from './reducers';let store = createStore(rootReducer);

Step 4:使用 Store
 

import { Provider } from 'react-redux';import { createStore } from 'redux';import rootReducer from './reducers';import App from './components/App';let store = createStore(rootReducer);render(<Provider store={store}><App /></Provider>,document.getElementById('root') );

Step 5:在你的组件中使用 Redux Actions
 

import { connect } from 'react-redux';import { doSomething } from './actions/sampleActions';function mapStateToProps(state){ return { stateProp: state.stateProp }; }function mapDispatchToProps(dispatch){return { doSomething: () => dispatch(doSomething())}; }class MyComponent extends React.Component{ componentDidMount(){ this.props.doSomething(); } render(){ // Render using this.props.stateProp and this.props.doSomething } }export default connect(mapStateToProps, mapDispatchToProps)(MyComponent); 

一些小吐槽

rn在很多方面挺方便的,但是我用下来总有些隔靴搔痒之感....或许之后我会转向原生的安卓开发()

后端

后端我是第一次用flask,所以先学了一下,大概了解了一下基本接口怎么写和怎么连接数据库就开写了,毕竟我本质上是crud,感觉基本需要说的就大概是怎么调用脚本

脚本调用

这里因为我用了python的虚拟环境,所以不能直接用python驱动脚本,而是要用特定的虚拟环境下的python文件来驱动,这里是一点需要注意的.然后 

@app.route('/video', methods=['POST'])
def video():print("Video route started.")if 'video' not in request.files:return 'No video file part', 400file = request.files['video']if file.filename == '':return 'No video file selected', 400temp_dir = tempfile.TemporaryDirectory() input_video_path = os.path.join(temp_dir.name, 'input.mp4')file.save(input_video_path) print(f"Saved video file to {input_video_path}")result = run_yolo_video(input_video_path) temp_dir.cleanup()return jsonify({"data": result}), 200def run_yolo_video(input_video_path): print("YOLO video function started.")model_path = "/etc/nginx/code/birdsearch/yolov5/weights/best.pt"command = f"python ../yolov5/detect.py --weights {model_path} --source {input_video_path}"print(f"Running command {command}")process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)stdout, stderr = process.communicate()output = stderr.decode("utf-8")print(f"Received output: {output}")return output

然后需要讲一下大概就是我这边读取控制台输出的操作:

这个函数 `run_yolo_video(input_video_path)` 是用来通过 YOLO (You Only Look Once) 模型对输入路径下的视频进行对象检测的。

解读这个函数:

1. `print("YOLO video function started.")`: 输出提示信息,表示 YOLO 视频函数已经开始运行。

2. `model_path = "/etc/nginx/code/birdsearch/yolov5/weights/best.pt"`: 这一行定义了模型路径。也就是说,YOLO 模型权重文件被存储在 "/etc/nginx/code/birdsearch/yolov5/weights/best.pt" 路径下。

3. `command = f"python ../yolov5/detect.py --weights {model_path} --source {input_video_path}"`: 通过 Python 运行 YOLO 定位脚本 `detect.py`。`--weights {model_path}`选项指定了模型权重文件的路径。`--source {input_video_path}`选项则定义了要处理的输入视频的路径。

4. `print(f"Running command {command}")`: 打印将要运行的命令。

5. `process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)`: 使用 `subprocess` 模块运行上面定义的命令。`Popen` 函数创建一个新的进程来运行这个命令,`shell=True` 参数表示通过 shell 运行该命令,`stdout=subprocess.PIPE` 和 `stderr=subprocess.PIPE` 则表示我们想要捕获命令的标准输出和错误输出。

6. `stdout, stderr = process.communicate()`: `communicate` 方法等待进程结束,然后返回一个元组,包含进程的标准输出和错误输出。

7. `output = stderr.decode("utf-8")`: `decode` 函数将错误输出(该输出以字节形式存在)转换为字符串。

8. `print(f"Received output: {output}")`: 打印从 `detect.py` 脚本收到的输出。

yolov5算法

这个其实没啥好说的,就是找开源数据集然后设置好参数,用yolov5train就完事了,很简单,我还租了一个4090服务器进行训练,这样快一点()

结语

总之这个项目顺利完结了,最终打包的apk也给我的那位朋友了,总之差不多就是这样!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用栈实现队列——leetcode刷题

题目要求我们只用栈的基本操作 push to top 入栈&#xff0c;peek from top 返回栈顶元素&#xff0c;pop from top 移除并返回栈顶元素&#xff0c;size 栈的大小&#xff0c;is_empty 判断栈是否为空&#xff0c;这几个函数来实现队列&#xff0c;也就是说&#xff0c;我们在…

salesforce 如何访问lwc组件

访问lwc有哪些途径呢? Action ButtonTabAura use lwc(拓展)如何区分是新建页面还是编辑页面 Action Button xml文件中要配置tab<?xml version"1.0" encoding"UTF-8"?> <LightningComponentBundle xmlns"http://soap.sforce.com/2006/04/…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

作者&#xff1a;余凯 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的IaaS化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度&#xff0c;也一直在高速的发展和演…

Java实现线程的三种方式

Java线程实现的三种方式 Java多线程实现方式主要有三种,继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程,需要的朋友可以参考下 前言 Java多线程实现方式主要有三种&#xff1a;继承Thread类、实现Runnable接口、使用Executo…

Docker 简单使用及安装常用软件

一、Docker 安装、配置与卸载 1.1、Docker 安装 # 1.安装gcc环境 yum -y install gcc gcc-c && \# 2. 卸载docker旧版本&#xff08;可能之前有安装&#xff09; yum -y remove docker docker-common docker-selinux docker-engine && \# 3. 安装依赖的软件包…

PHP源码_最新在线工具箱网站系统源码

项目运行截图 源码贡献 https://githubs.xyz/boot?app41 部分数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for toolbox_category -- ---------------------------- DROP TABLE IF EXISTS toolbox_category…

Golang | Leetcode Golang题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; func minPathSum(grid [][]int) int {if len(grid) 0 || len(grid[0]) 0 {return 0}rows, columns : len(grid), len(grid[0])dp : make([][]int, rows)for i : 0; i < len(dp); i {dp[i] make([]int, columns)}dp[0][0] grid[0][0]…

最全!2024腾讯Spring OAuth2面试题大全,详解每个要点,收藏必备!

在2024年腾讯春季招聘中&#xff0c;掌握Spring和OAuth2的深刻理解将成为技术岗位面试中的关键优势。OAuth2作为现代身份验证和授权协议的标准&#xff0c;在分布式应用、单点登录&#xff08;SSO&#xff09;和API访问控制中扮演了重要角色。与Spring Security集成&#xff0c…

ubuntu sudo apt-get install neo4j 配置安装与设置远程访问

文章目录 下载Adding the Debian repositoryInstalling Neo4j安装流程设置远程访问 下载 neo4j 官方的下载地址&#xff0c;进入页面之后&#xff0c;往下滑&#xff1a; https://neo4j.com/deployment-center/#community 点击 Visit https://debian.neo4j.com/ Adding the …

Apache Seata基于改良版雪花算法的分布式UUID生成器分析1

title: Seata基于改良版雪花算法的分布式UUID生成器分析 author: selfishlover keywords: [Seata, snowflake, UUID] date: 2021/05/08 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata基于改良版雪花算法的分布式UUID生成器分析…

第十五届蓝桥杯总结

因为本人不是计院的&#xff0c;以后可能也不会打算法类的竞赛了&#xff0c;故作此总结&#xff0c;纪念我四个月的算法学习经历&#xff0c;还算是对算法有了一定的基础&#xff0c;碰运气拿下了湖北b组省二&#xff0c;个人感觉比赛题目没有第十四届难&#xff0c;感觉就是纯…

电子式汽车机油压力传感器的接线方法及特点

电子式机油压力传感器由厚膜压力传感器芯片、信号处理电路、外壳、固定电路板装置和两根引线&#xff08;信号线和报警线&#xff09;组成。信号处理电路由电源电路、传感器补偿电路、调零电路、电压放大电路、电流放大电路、滤波电路和报警电路组成。 厚膜压力传感器是20世纪…

Android 12系统源码_窗口动画(一) ActivityOptions实现窗口打开动画的流程

一、通过ActivityOptions获取Activity对应的打开动画 1、我们可以通过ActivityOptions类&#xff0c;实现打开Activity的时候有对应的缩放动画。 private void startActivity(View view) {int width view.getMeasuredWidth();int height view.getMeasuredHeight();Log.d(TAG…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

tuxera ntfs for mac是什么 tuxera ntfs for mac怎么用 tuxera激活码

Tuxera NTFS for Mac是一款完全的mac读写软件&#xff0c;可辅助mac电脑读写ntfs格式&#xff0c;进行磁盘的管理。本文会详细讲解tuxera ntfs for mac的操作方法。 Tuxera NTFS for Mac 2023安装包免费下载&#xff1a;https://souurl.cn/IE35lO 一、Tuxera NTFS for Mac是什…

goget配置多个golang 运行环境

一台主机安装多个golang 运行环境 本环境 windows10 为 基础 mac linux也可以按照此方法操作 背景 开发不同的运维工具会用到不同版本的golang&#xff0c;但是开发者不能一直进行重装来处理 &#xff0c;因此 需要一个工具进行golang版本的管理 go管理工具介绍 gvm (Go V…

微服务保护和分布式事务(Sentinel、Seata)笔记

一、雪崩问题的解决的服务保护技术了解 二、Sentinel 2.1Sentinel入门 1.Sentinel的安装 &#xff08;1&#xff09;下载Sentinel的tar安装包先 &#xff08;2&#xff09;将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;重命名为 sentinel-dashboard.jar &…

【C++报错】error C2143:语法错误:缺少“ : ”(在“<” 的前面)[ 相互引用问题 ]

这里写自定义目录标题 情景再现问题分析是经典的互相引用问题 解决方案 情景再现 问题分析 template<class K,class T,class KeyofT,class Hash>class __HTIterator{typedef HashNode<T> Node;typedef HashTable<K, T, KeyofT, Hash> HT; 【★】typedef …

Halcon如何制作标定板的关键点

前面用下面算子生成文件和PS文件&#xff0c;我就不说了&#xff0c;太多人说了 gen_caltab(7,7,0.0125,0.5,caltab_120mm.descr,120_120.ps) 生成之后&#xff0c;大部分人.ps文件是用PhotoShop打开&#xff0c;然后去打印&#xff0c;再做后续的标定等工序&#xff0c;但是打…

基于springboot+vue+Mysql的网上商城购物系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…