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

本文主要是介绍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也给我的那位朋友了,总之差不多就是这样!!!!

这篇关于React-Native制作一个通过照片和视频识别鸟类的安卓app的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956290

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g