【基于Ubuntu下Yolov5的目标识别】保姆级教程 | 虚拟机安装 - Ubuntu安装 - 环境配置(Anaconda/Pytorch/Vscode/Yolov5) |全过程图文by.Akaxi

目录

一.【YOLOV5算法原理】

1.输入端

2.Backbone

3.Neck

4.输出端

二.【系统环境】

1.虚拟机的安装与创建

2.安装Ubuntu操作系统

3.环境的配置

3.1.Ubuntu下Anacoda安装以及虚拟环境配置

3.2.Pytorch安装

3.3.Vscode安装

3.4.Yolov5源码及环境获取安装

三. 【测试Yolov5】

四. 【实现自己输入图片/笔记本摄像头的目标检测】

1.输入自己的图片

2.使用笔记本摄像头目标检测

更多细节:

【使用外接USB摄像头进行目标检测】

【Ros下搭载yolov5实现目标检测】


最终效果:

------------------------全文8963字102图一步一步完成大约耗时2h------------------------

所需软件以及环境: 

Vmware Workstation 17pro
内存                             8GB
处理器                               6
硬盘                           20GB
Python                           3.8
Yolo                                V5
Pytorch                          2.1
系统             Ubuntu20.04.6

一.【YOLOV5算法原理】

此步是对算法原理进行介绍,如需实战,直接跳过这一节(没有任何影响)到下一节【二、系统环境】

参考链接:

【YOLOV5】https://github.com/ultralytics/yolov5

【知乎江大白】https://zhuanlan.zhihu.com/p/172121380

【YOLO-YOLOV5】https://blog.csdn.net/guanjing_dream/article/details/123705221

结构:

1.输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放

2.Backbone:Focus结构,CSP结构

3.Neck:FPN+PAN结构

4.Prediction:GIOU_Loss

1.输入端

(1)Mosaic数据增强

Yolov5的输入端采用了和Yolov4一样的Mosaic数据增强的方式,Mosaic数据增强提出的作者也是来自Yolov5团队的成员,不过,随机缩放、随机裁剪、随机排布的方式进行拼接。

(2)自适应锚框计算

在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。

(3)自适应图片缩放

在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。

2.Backbone

(1)Focus结构

Focus结构,在Yolov3&Yolov4中并没有这个结构,其中比较关键是切片操作。以Yolov5s的结构为例,原始608*608*3的图像输入Focus结构,采用切片操作,先变成304*304*12的特征图,再经过一次32个卷积核的卷积操作,最终变成304*304*32的特征图。

(2)CSP结构

Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。

3.Neck

Yolov5现在的Neck和Yolov4中一样,都采用FPN+PAN的结构,但在Yolov5刚出来时,只使用了FPN结构,后面才增加了PAN结构,此外网络中其他部分也进行了调整。Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。

4.输出端

(1)Bounding box损失函数

Yolov5中采用其中的CIOU_Loss做Bounding box的损失函数。

(2)nms非极大值抑制

在目标检测的后处理过程中,针对很多目标框的筛选,通常需要nms操作。因为CIOU_Loss中包含影响因子v,涉及groudtruth的信息,而测试推理时,是没有groundtruth的。所以Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中采用加权nms的方式。可以看出,采用DIOU_nms,下方中间箭头的黄色部分,原本被遮挡的摩托车也可以检出。

二.【系统环境】

1.虚拟机的安装与创建

首先需要安装虚拟机软件Vmware Workstation 17pro(这里我选择的是这个版本,不一定需要这个版本)百度即可下载

虚拟机软件打开后就是这样的界面:

点击新建虚拟机:

点击自定义,下一步:

下一步

稍后安装操作系统,下一步

选择Linux(我们稍后要安装的Ubuntu就是基于Linux的)下一步:

给虚拟机起一个名字(自己喜欢就行)

位置更改到自定义文件夹下(需要新建一个自己喜欢的文件夹)

选择处理器数量2,每个处理器的内核3(根据自己的笔记本性能来),我的笔记本是16核,最好不超过一半(设备管理器 – 处理器 - 查看)

分配虚拟机内存,建议4GB-8GB(我是8GB)

选择网络,桥接网络(之后可以更改)

下一步

下一步

选择新建虚拟机,下一步

分配磁盘大小,默认20GB有点小,下面需要安装配置各种环境和包,最好30GB,之后不够了可以很轻松的扩容,选择将虚拟磁盘拆分成多个空间。

需要新建一个目录文件夹(自己喜欢就行),这个文件夹就是你的虚拟磁盘

浏览一下你刚才的设置,确认无误后点击完成~

恭喜你完成了虚拟机的创建(进度1/9加油加油!!)

---------------------------------------------------------------------------------------------------------------------------------

2.安装Ubuntu操作系统

打开刚刚创建的虚拟机

第2步就是你这一步创建的目录文件夹(去找找啦)

我的虚拟机名字我起的ubuntu_Akaxi_20.04(虚拟机名字随便起)

打开后你就可以看到,这样的界面:

左边的红色框框就是你为虚拟机配置的信息(第一步骤干的事情)

现在我们需要正式的给他安装一个操作系统——Ubuntu

【Ubuntu镜像】http://mirrors.aliyun.com/ubuntu-releases/20.04/

这里选择Ubuntu版本20.04.6的桌面desktop-amd64位的iso镜像,如图,点击下载:

下载完成后,打开虚拟机的CD/DVD

点击浏览,找到刚刚下载的Ubuntu20.04.6的镜像文件,使用ISO镜像文件打开,这样就在虚拟机插入了Ubuntu噜

点击开启虚拟机(准备在虚拟机里面安装Ubuntu20.04.6操作系统)

进入安装界面,选择语言,中文,然后安装Ubuntu

选择安装Ubuntu时下载更新,显示不全,用win键 + 鼠标拖拽

选择清除整个磁盘并安装Ubuntu

磁盘分区,点击继续

选择系统时间,我们是东八区,默认上海,继续

设置Ubuntu系统信息与密码,姓名,计算机名字,密码,登录时需要密码,这个密码要记住噜,之后很多地方使用超级管理员权限需要输入密码。

等待安装(大概5-10分钟)

安装完毕,点击现在重启,看到此界面,就完成Ubuntu系统的安装噜。

进度(2/9)快啦快啦,加油加油

---------------------------------------------------------------------------------------------------------------------------------

3.环境的配置

****************************************************************************

3.1.Ubuntu下Anacoda安装以及虚拟环境配置

参考链接:http://Ubuntu系统下安装Anaconda3及配置 - 知乎 (zhihu.com)

在Ubuntu打开火狐浏览器:(没有网络,把虚拟机网络模式改成NAT模式)如图:

在清华源网址下载Anaconda3-2021-11-Linux-x86_64.sh

【清华源】https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

速度嘎嘎快

下载完成后,可以在文件夹,下载中找到下好的软件包

将其复制到主目录下面

在空白处鼠标右键,选择在终端打开

输入

bash Anaconda3-2021.11-Linux-x86_64.sh

准备安装啦

输入后,终端输出串串英文,让你阅读一些事项,一路回车即可,遇到让你输入‘yes’ or ‘no’,全输入yes回车即可

之后他会让你确认Anaconda安装目录,默认在你主文件夹下,生成一个anaconda3的文件夹,回车开始嘎嘎安装

安装完成,输入yes,可以看到真的在主目录下生成了anaconda的文件夹。

看到此界面,就代表你已经在Ubuntu系统下装上了anaconda噜,如图:

装好后我们还需要进行一些环境配置

输入

sudo gedit ~/.bashrc 

进入bashrc文件设置环境变量(gedit是一个文本编辑器)

输入你的密码后在bashrc文件的末尾添加路径:

      export PATH="/home/你的用户名/anaconda3/bin:$PATH"

我就是export PATH="/home/Akaxi/anaconda3/bin:$PATH"

添加后保存退出

输入

source ~/.bashrc 

更新下环境

输入

conda list

可看到一系列的包名输出,代表完成啦,撒花~~

由于annaconda自带的下载工具pip默认使用的是外网的网址,接下来需要对其网址进行更新,用我们国的自带的网址,这样使用conda pip就嘎嘎快

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

由于annaconda也自带的conda工具默认使用的是外网的网址,我们也需要对其进行配置,方便接下来的环境管理与使用,输入:

conda clean -i

sudo gedit ~/.condarc

进入condarc文件,将配置信息粘贴写入,保存退出

配置信息:

channels:
 - defaults
show_channel_urls: true
default_channels:
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
 conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

输入conda安装第三方包测试:

Conda install scrapy

测试时间比较长,大概3min

然后使用annaconda的conda命令创建虚拟环境,我的环境My_torch

     conda create -n <环境名称自定义> python=<python的版本号>

例如:conda create -n My_torch python=3.8   输入后回车

完成后显示done,这样我们就创建好啦:

接下来

source activate <你的虚拟环境>

成功后可以看到你的环境从base变成了My_torch

至此,在Ubuntu上anaconda安装并且配置完成啦,还配置了自己的虚拟环境My_torch,这个环境就是接下来yolov5需要的环境噜,恭喜恭喜,已经完成了(3/9)加油!

****************************************************************************

3.2.Pytorch安装

在虚拟机打开火狐浏览器里输入pytorch官网用来获取下载指令

【Pytorch官网】https://pytorch.org/

选择conda版本,选择cpu版本,下面得到安装指令

conda install pytorch torchvision torchaudio cpuonly -c pytorch

在终端粘贴就可以进行pytorch的下载

输入y(yes)开始下载

看到以下界面就代表下载好啦~~~~撒花

我们测试一下:

输入    python3

再输入  import torch

再输入  torch.__version__

出现你的pytorch版本号就代表下载成功噜~~~~

进度(4/9)加油!

****************************************************************************

3.3.Vscode安装

打开火狐浏览器,输入vscode官网(此步是为了方便后续浏览代码以及展示效果)

【Vscode官网】https://code.visualstudio.com/Download

选择linux版本的.deb_x64版本,点击下载

等待下载

下载完成后,在文件的下载中找到安装包,点击用软件安装打开

点击安装,输入密码(如果提示进程被琐,重启解决)

安装完成后,belike:

右上角关闭,左下角点击打开应用列表,顶上输入vscode查找应用

双击打开,可以鼠标右键-添加到收藏夹栏

进入后我们点击拓展,下载拓展中文包

输入chinese找到中文包,点击install下载

下载完成后,右下角更改系统语言并且重启vscode

接下来配置Python拓展,同样在vscode拓展里输入python下载拓展并安装

这样我们就在ubuntu系统下安装了最好用的代码编辑器vscode噜

撒花~~~~~

进度(5/9)

****************************************************************************

3.4.Yolov5源码及环境获取安装

在火狐浏览器输入gitee(一个国内的代码仓库),输入yolov5查找相关开源仓库,找到其中一个就行,当然用我的仓库也行

这是链接:https://search.gitee.com/?skin=rec&type=repository&q=yolov5

点击进入,点击克隆/下载 – 下载zip(可能需要账号登录)

下载完成后,在文件夹下载中找到yolo-master压缩包,将其解压(提取)

将解压后的文件夹复制到桌面,方便操作

右键打开终端,进入文件夹目录

cd yolo-master

注意指令前面一定要是你之前配置pytorch的环境,我的是My_torch

输入指令进入环境:conda activate <你的环境>

例如我的:conda activate My_torch

使用指令用清华源安装需要的环境:

pip install -U -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

注意 -U 是大写噜

输入指令后开始嘎嘎安装(大约2分钟)

安装完成后,所有的环境以及包都安装好啦!!!!!!!恭喜

进度(6/9)

三. 【测试Yolov5】

接下来就是最激动人心的时刻!测试Yolov5!

打开vscode,点击打开文件夹(也就是我们的工作目录),点击我们之前下载的yolov5-mater文件夹

打开后,信任文件夹

接下来点击我们用来测试yolov5的detect.py文件,点击右下角的环境解释器,在上面选框中找到我们的之前配置的My_torch解释器。

选择解释器后可以发现解释器变成了My-torch,然后点击右上角的三角运行。

然后就可以在vscode终端看到一些列输出

运行成功!!yolov5实现目标检测结果保存在目录runs/detect/exp中,我们找到目录看看效果~~

可以看到yolov5检测效果十分的不错,测试成功!!!!!!!

进度(7/9)

四. 【实现自己输入图片/笔记本摄像头的目标检测】

---------------------------------------------------------------------------------------------------------------------------------

1.输入自己的图片

在文件夹找到yolov5-master文件夹,点击进入,找到data文件夹,继续找到images文件夹,这就是yolov5获取源图片的位置,将我们需要自定义检测的图片放入即可。

这里我用QQ将一张车人图片放在images里面,图片名字是xiantao_Car_person.jpg(注意图片是jpg格式)

(当然也可以在火狐浏览器上面下载你喜欢的图片放在images里面)

xiantao_Car_person.jpg

再次打开vscode,重复前面一节的【三、测试yolov5】过程,运行程序,看看yolov5这次能不能对我们给定的图片进行目标检测呢。

运行detect.py程序,终端输出成功运行信息,结果保存在runs/detect/exp2目录下,我们找到xiantao_Car_person.jpg

可以看到,yolov5对我们自定义输入的图片目标检测成功!!!!!

进度(8/9)

接下来我们自己插入一个Usb摄像头,进行实时的目标检测~~

---------------------------------------------------------------------------------------------------------------------------------

2.使用笔记本摄像头目标检测

还是用vscode打开detect.py文件,找到第245行的参数行

将   default = ROOT / ‘data/images’

改为 default = ‘0’  【0表示使用笔记本默认摄像头】

然后将摄像头连接到虚拟机上,不然运行detect,py就会报错

虚拟机 – 可移动设备 – 找到笔记本摄像头 – 连接

之后点击运行detect.py就可以看yolov5跑出来的效果啦

(这里很可能会遇到报错:什么什么no shape读不到摄像头)

打开茄子相机应用看看有没有图像输出,如果没有很大可能是虚拟机的Usb设置不对,先关机,在USB适配器将兼容性改为USB3.1

再次打开虚拟机(记得将摄像头连接到虚拟机!)打开茄子相机,就可以看到摄像头啦~

点击运行,可以看到出现一个界面,动态的显示摄像头的图像,就是yolov5进行的目标检测噜,成功检测到摄像头的输出并目标检测啦。

点击终端,按下q结束程序,可以在

yolov5-mater/runs/detect/最新的exp文件下看到刚刚运行的视频

至此,在Ubuntu下使用yolov5进行目标检测已经完全成功!完结撒花!!!!!!!!!!!进度(9/9)

更多细节:

【使用外接USB摄像头进行目标检测】

将这里的default = ‘0’改为default = ‘1’或者‘2’等,这个看你的usb摄像头搭载在哪里,输入指令ls -l /dev/video* 查看。

【Ros下搭载yolov5实现目标检测】

作为一名Ros机器人学习者,当然想到能将yolov5搭载在Ros环境中,那对于很多机器人都可以实现目标检测,检测到车辆或者行人还是其他事物时,在不同的应用场景进行设计。我比较感兴趣的是在车辆上搭载yolov5,实现自动驾驶场景,目标检测,信息判断,消息通信,话题发布通信,路径规划导航等,在Ros的环境下自己实现车辆的自动避险,自动驾驶等,想必也是帅的嘞。

可能需要一时半会,码一下这篇博主的文章

https://blog.csdn.net/svfsvadfv/article/details/129825613

----------------------------------------------------------------------------------------------------

相信读到这里的朋友,一定是坚持且优秀的

给博主一个免费的赞

原文地址:https://blog.csdn.net/Akaxi1/article/details/134222652

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读2.3k次,点赞4次,收藏22次。最近安装了CARLA预编译版,总体过程感觉还是挺简单的,但是由于在网上找的参考资料并没有和自己遇到的情况完全一样的,所以把自己的安装过程记录下来,方便和自己一样的后来人进行安装,同时也自己作个记录留作备忘。其实预编译版的CARLA本身几乎不用什么命令行进行安装,主要步骤只有解压缩和拷贝文件,和极少的命令行安装操作。但是相关依赖以及其它的CARLA所使用的一些工具需要一起安装好,下面一起来看看安装步骤吧。_ubuntu22.04安装carla
文章浏览阅读6.3k次,点赞5次,收藏15次。在清华镜像中下载Ubuntu 20 安装包_ubuntu20下载
文章浏览阅读5k次。linux环境, python3.7.问题描述: 安装rally, pip3 install -r requirements.txt 时提示如下: 说明openssl 已安装。解决:1. pip3 install --upgrade pip , 结果输出如下 ..._error: command '/usr/bin/gcc' failed with exit code 1
文章浏览阅读1.1k次。自己刚踩坑装好的W11 WSL2 miniconda_wsl2 cuda
文章浏览阅读4.2k次,点赞4次,收藏17次。要安装这个 standalone的,会有一点区别(不识别 下面的 -localhost no)上面的命令会在~/.vnc/目录下生成一个 passwd文件。具体端口号,可以查看vncserver -list返回结果中的RFB PROT。作用是vncserver启动的时候运行这些命令,把桌面程序启动起来。如果希望用某个用户比如 demo登录,就用su切换到这个用户。桌面版默认就已安装,服务器版需要手动安装,并启动。关闭某个会话可以用下面的命令。远程地址输入ip:port。查看全部的vnc会话。_ubuntu vncserver
文章浏览阅读894次,点赞51次,收藏31次。在安卓使用vscode主要是连接一个远程的code-server服务,code-server服务安装在什么系统,调用的就是什么系统的环境,如这里使用ubuntu进行安装code-server,那使用的就是ubuntu环境,如需要go,python,java开发,需要在Ubuntu安装相关环境,创建的文件夹和项目也是在Ubuntu里面.这种方式其实在访问vscode的时候利于可以随时随地进行连接使用,且不受设备影响。
安装Ubuntu上超好用的终端Terminator。通过添加软件源、更新源、安装Terminator等步骤完成。
文章浏览阅读1.1k次,点赞83次,收藏74次。不要嫌弃Ubuntu的单调的终端界面啦,快来试试这些有意思的命令_ubuntu系统有趣的玩法
文章浏览阅读2.5k次。在ubuntu系统中,swap空间就是虚拟内存,所以考虑在磁盘空间富余的目录下设置虚拟内存swap文件,用来缓解内存不足的问题。通过上面的信息可以看到,/dev/vda2 目录下还剩余45G,那么就可以把swap文件生成在/dev/vda2目录下。在系统监控中发现,当数据库服务程序启动后,占用了大量内存空间,导致系统的剩余的内存往往只有几十MB。# bs 为块的大小,count 创建多少个块。# 执行命令后,删除创建的swap目录即可。#把生成的文件转换成 Swap 文件。2、创建一个swap文件。_ubuntu20修改swap大小
文章浏览阅读2.9k次,点赞2次,收藏10次。记录RV1126的SDK编译错误,以及解决处理_command exited with non-zero status 1
文章浏览阅读1.1w次,点赞22次,收藏101次。【记录】ubuntu20.04安装nvidia显卡驱动_ubuntu20.04安装nvidia显卡驱动
文章浏览阅读727次,点赞6次,收藏27次。在嵌入式Linux开发过程中,可能遇到uboot无法通过nfs服务从Ubuntu下载系统镜像(TTTTTT)的问题。如果你使用的是较新版本的Ubuntu,那么其**默认内核将不支持nfs2**!而**uboot仅支持到nfs2**,因此我们需要修改系统内核以及nfs配置文件,开启nfs2服务。**此问题非常棘手**,因为问题出现的时间太近,并且使用的人少。由于是2023年后才出现的问题,**chatgpt也无法解答**!本文参考网络上多篇博客资料,是解决此问题的最新办法。
ubuntu系统下安装软件的方法有多种,包括使用apt工具、deb软件包安装、源码编译安装以及通过软件中心安装。还有一种以 .run 后缀的软件包也可以在ubuntu系统下安装。具体的安装方法可以通过百度搜索来获取。
文章浏览阅读814次。本篇目的:Xubuntu如何安装pkg-configpkg-config是一个计算机软件包,用于帮助开发人员查找、定位和使用依赖库。它通常用于构建软件时,开发人员需要指定程序所依赖的外部库的位置和版本信息。使用pkg-config,开发人员可以很容易地查找、检索和导出这些依赖库的信息,从而简化了软件的构建过程。_ubuntu中怎么下载pkg-config
文章浏览阅读2k次。ubuntu创建共享文件夹_ubuntu20.04共享文件夹
文章浏览阅读2.9k次,点赞74次,收藏73次。对于有长期远程桌面需求的用户,建议将cpolar套餐升级到专业套餐,支持配置固定的公网TCP端口,且带宽也会相应的增大,支持更高效便捷的远程桌面连接Ubuntu系统。【cpolar内网穿透支持http/https/tcp协议,支持永久免费使用,不限制流量,无需公网IP,也不用进入路由器设置,操作简单。隧道创建成功后,点击左侧仪表盘的状态——在线隧道列表,查看xrdp隧道的所生成的公网TCP端口地址,复制下来。,使用cpolar内网穿透映射3389端口,生成公网TCP端口地址,实现在公网环境下,_ubuntu 局域网桌面
文章浏览阅读3.2k次。而在linux的ubuntu版本中,又多出两类用户:安装ubuntu系统的源用户xxx,其与root具有相同权限,仅在执行命令时,前面加sudo。在ubuntu中,用命令deluser username可以直接删除用户账号及家目录,而用centos7中的命令userdel -r username才能达到同样目的。在ubuntu中,没有moduser命令,centos7中的usermod修改用户信息的命令,同样可以用在ubuntu中。在系统中,创建新的用户或称为账号,一般需要多步操作。_ubuntu创建一个新用户
文章浏览阅读1.6w次,点赞4次,收藏23次。系统的许多日志文件都存储在 /var/log 目录中。你可以使用 ls /var/log 命令来列出可用的日志文件。/var/log/Xorg.0.log:包含 X 服务器的日志信息(图形界面)。打开DASH,搜索日志或者log,打开app,这个是/var/log的界面版。这将显示系统日志的末尾,并提供有关系统崩溃和错误的信息。/var/log/kern.log:包含内核日志信息。/var/log/dmesg:包含开机时的日志信息。/var/log/syslog:包含系统日志信息。_ubuntu查看系统日志
文章浏览阅读857次。首先将source.list复制为source.list.bak备份,然后将source.list内容改为需要的镜像源列表即可。Ubuntu采用apt作为软件安装工具,其镜像源列表记录在/etc/apt/source.list文件中。本节均为 Ubuntu 20.04 的镜像源列表。若为其他版本,将所有focal更改为其他版本代号即可。_apt 国内源