前段时间收到反馈说我们摄像头识别算法误判率有些高(就人形火焰识别等),所以就想有没有什么办法来降低这种误判,网上搜了一下相关资料就找到了这个方案,就是接入 YOLO11 大模型用来进一步进行图片识别,然后直接过滤掉误判的就可以了(以下教程是我在新服务器上二次安装整理的,已经把一些坑都排除了,确保可用!)

首先是 YOLO官网,里面有很多版本和详细的使用说明,我之所以选这个就是因为这个看起来比较好部署,对服务器/电脑要求没那么高,功能上也能满足我的需要(可以进行图片识别和自定义训练)

在这里插入图片描述
好了下面我们来进行安装
首先因为我手上只有 CentOS7 的服务器,而且没有带显卡,这个对大模型训练其实是很不友好的
如果不太确定是否有显卡可以先用下面命令确认一下是否有显卡

lspci | grep -i nvidia

可能会提示下面这个,就是没有 pciutils 工具

[root@ecm-74de data]# lspci | grep -i nvidia -bash: lspci: command not found

我们安装一下就可以

yum install -y pciutils

再次执行可以看到没有输出,因为我这个服务器就是不带显卡的

(base) [root@ecm-74de ~]# lspci | grep -i nvidia
(base) [root@ecm-74de ~]#

接下来我们需要安装基本环境,这个是基于 Python 的,然后要注意 CentOS7 实在太老了,只能用下面这个版本的,我已经试过了几个版本

# 安装 Python 管理工具
yum install -y wget git

# 安装 Miniconda(轻量版 Conda)
# 下载旧版本(兼容 CentOS 7)
wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh -O ~/miniconda.sh
# 静默安装到 ~/miniconda
bash ~/miniconda.sh -b -p ~/miniconda
# 把 conda 命令加入 PATH
echo 'export PATH=~/miniconda/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 测试
conda --version

which python

python --version

正常的能看到下面信息

[root@ecm-957e ~]# conda --version
conda 23.3.1
[root@ecm-957e ~]# which python
/root/miniconda/bin/python
[root@ecm-957e ~]# python --version
Python 3.8.16

创建 YOLO11 专用环境

conda create -n yolo11 python=3.8 -y
# 初始化
conda init bash
# 刷新一下
source ~/.bashrc
# 上面的执行完成后激活环境
conda activate yolo11

看到下面的就是成功了,主要看最后一行 (yolo11) [root@ecm-957e ~]#
下面命令都需要在 (yolo11) 环境下执行的,后面如果退出去了需要重新进入直接执行 conda activate yolo11 就可以了

[root@ecm-957e ~]# conda init bash
no change     /root/miniconda/condabin/conda
no change     /root/miniconda/bin/conda
no change     /root/miniconda/bin/conda-env
no change     /root/miniconda/bin/activate
no change     /root/miniconda/bin/deactivate
no change     /root/miniconda/etc/profile.d/conda.sh
no change     /root/miniconda/etc/fish/conf.d/conda.fish
no change     /root/miniconda/shell/condabin/Conda.psm1
no change     /root/miniconda/shell/condabin/conda-hook.ps1
no change     /root/miniconda/lib/python3.8/site-packages/xontrib/conda.xsh
no change     /root/miniconda/etc/profile.d/conda.csh
modified      /root/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

[root@ecm-957e ~]# source ~/.bashrc
(base) [root@ecm-957e ~]# conda activate yolo11
(yolo11) [root@ecm-957e ~]# 

安装 YOLO11 依赖(CPU 版本)

pip install --upgrade pip

有个警告不管它

(yolo11) [root@ecm-957e ~]# pip install --upgrade pip
Requirement already satisfied: pip in ./miniconda/envs/yolo11/lib/python3.8/site-packages (24.2)
Collecting pip
  Downloading pip-25.0.1-py3-none-any.whl.metadata (3.7 kB)
Downloading pip-25.0.1-py3-none-any.whl (1.8 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 9.7 MB/s eta 0:00:00
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 24.2
    Uninstalling pip-24.2:
      Successfully uninstalled pip-24.2
Successfully installed pip-25.0.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.

继续安装下一个依赖,这个有些久要等等

pip install ultralytics opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

安装 libGL ,CentOS 7 最小化系统默认不带 OpenGL 运行库,而 OpenCV 在 import 时必须加载 libGL

yum install -y mesa-libGL

安装完验证一下是否成功

yolo version

下面这样的就是成功了,可以看到第一次有个警告,我也不知道为啥,但是再执行就没有了,所以不管它

(yolo11) [root@ecm-957e ~]# yolo version
WARNING ⚠️ user config directory '/root/.config/Ultralytics' is not writable, using '/tmp/Ultralytics'. Set YOLO_CONFIG_DIR to override.
Creating new Ultralytics Settings v0.0.6 file ✅ 
View Ultralytics Settings with 'yolo settings' or at '/tmp/Ultralytics/settings.json'
Update Settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings.
8.3.243
(yolo11) [root@ecm-957e ~]# yolo version
8.3.243

接着我们再去下载一个官方已经训练好的权重文件,国内可能下载不成功,我这边有下载好的 yolo11n.pt(不知道为啥上传后选不了发布形式,默认就是VIP的)


# 也可以直接浏览器访问 https://huggingface.co/Ultralytics/YOLO11/resolve/main/yolo11n.pt
wget https://huggingface.co/Ultralytics/YOLO11/resolve/main/yolo11n.pt

我们创建一个文件目录,里面放一些图片,这个官方的权重文件好像主要是识别人、车、箱子之类的东西,需要检测其它的东西可能需要我们自己再训练,怎么训练这个后面再讲,你也可以先去官方文档看看,就是下载一个工具然后标记图片画框,然后让大模型跑一下

# 创建目录,在里面放一些图片
mkdir images

再创建一个脚本用来处理执行

 touch yolo_test.py

注意里面的路径换成自己的文件路径

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from ultralytics import YOLO
import os

# --------------------------
# 配置参数
# --------------------------
model_path = "/data/yolo11n.pt"  # 模型文件路径
input_dir = "/data/images/"      # 测试图片目录

# --------------------------
# 加载模型
# --------------------------
model = YOLO(model_path)

# --------------------------
# 扫描图片并检测
# --------------------------
for img_name in os.listdir(input_dir):
    img_path = os.path.join(input_dir, img_name)
    if not os.path.isfile(img_path):
        continue

    # 模型预测
    results = model.predict(source=img_path, device="cpu", save=False)

    # 获取检测类别
    detected_classes = []
    for box in results[0].boxes:
        cls_idx = int(box.cls)
        cls_name = results[0].names[cls_idx]
        detected_classes.append(cls_name)

    # 判定结果输出
    if detected_classes:
        print(f"[✅] 图片: {img_name}, 检测到: {detected_classes}")
    else:
        print(f"[❌] 图片: {img_name}, 未检测到目标")

执行一下

python ./yolo_test.py

可以看到下面的内容

(yolo11) [root@ecm-957e data]# python ./yolo_test.py

image 1/1 /data/images/941dd00883cef10d4478d2fb8d2f8cd2.jpeg: 640x480 (no detections), 265.0ms
Speed: 4.4ms preprocess, 265.0ms inference, 0.9ms postprocess per image at shape (1, 3, 640, 480)
[] 图片: 941dd00883cef10d4478d2fb8d2f8cd2.jpeg, 未检测到目标

image 1/1 /data/images/9dbdf4cda1514043a97699a5e06827d3_2.jpg: 384x640 1 car, 1 suitcase, 130.6ms
Speed: 18.0ms preprocess, 130.6ms inference, 1.0ms postprocess per image at shape (1, 3, 384, 640)
[] 图片: 9dbdf4cda1514043a97699a5e06827d3_2.jpg, 检测到: ['suitcase', 'car']

image 1/1 /data/images/ed89d655f272fca92edad7480c9ae40f.jpeg: 640x448 (no detections), 71.5ms
Speed: 1.6ms preprocess, 71.5ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 448)
[] 图片: ed89d655f272fca92edad7480c9ae40f.jpeg, 未检测到目标

image 1/1 /data/images/ef3d14bdfd9247be9e2bd1ff14239c7b_0.jpg: 384x640 1 person, 39.4ms
Speed: 3.7ms preprocess, 39.4ms inference, 0.7ms postprocess per image at shape (1, 3, 384, 640)
[] 图片: ef3d14bdfd9247be9e2bd1ff14239c7b_0.jpg, 检测到: ['person']

image 1/1 /data/images/e118ca3c999b4f0a8463f5889332e98b_1.jpg: 384x640 2 persons, 2 suitcases, 2 bottles, 142.1ms
Speed: 1.7ms preprocess, 142.1ms inference, 0.8ms postprocess per image at shape (1, 3, 384, 640)
[] 图片: e118ca3c999b4f0a8463f5889332e98b_1.jpg, 检测到: ['bottle', 'person', 'bottle', 'suitcase', 'suitcase', 'person']

image 1/1 /data/images/8b10bb52bb434c40b6d72a9ec799af86_1.jpg: 384x640 7 suitcases, 33.9ms
Speed: 1.5ms preprocess, 33.9ms inference, 0.7ms postprocess per image at shape (1, 3, 384, 640)
[] 图片: 8b10bb52bb434c40b6d72a9ec799af86_1.jpg, 检测到: ['suitcase', 'suitcase', 'suitcase', 'suitcase', 'suitcase', 'suitcase', 'suitcase']

image 1/1 /data/images/9dbdf4cda1514043a97699a5e06827d3_1.jpg: 384x640 (no detections), 33.4ms
Speed: 1.5ms preprocess, 33.4ms inference, 0.5ms postprocess per image at shape (1, 3, 384, 640)
[] 图片: 9dbdf4cda1514043a97699a5e06827d3_1.jpg, 未检测到目标

image 1/1 /data/images/76f1752b8593431caeed9f4f74521f44_0.jpg: 384x640 1 person, 33.4ms
Speed: 1.5ms preprocess, 33.4ms inference, 0.7ms postprocess per image at shape (1, 3, 384, 640)
[] 图片: 76f1752b8593431caeed9f4f74521f44_0.jpg, 检测到: ['person']

image 1/1 /data/images/0d842ec6242060a8cbfa30ce5e2a34aa.jpeg: 640x448 2 persons, 1 car, 1 truck, 44.4ms
Speed: 1.9ms preprocess, 44.4ms inference, 0.8ms postprocess per image at shape (1, 3, 640, 448)
[] 图片: 0d842ec6242060a8cbfa30ce5e2a34aa.jpeg, 检测到: ['person', 'person', 'car', 'truck']

根据这个识别结果大家也看出来了,有的图片显示未检测到目标,这是因为有些图片真的啥都没有,还有一些就是这个模型没有训练到的物体就识别不了,我们可以去官网找下我们需要的训练好的模型也可以自己训练

最后就是怎么用这个的问题,这里只说思路,因为也不是很难
1.使用 Python 服务:用 Python 写一个小服务(REST API 或 gRPC),负责接收图片 → 调用 YOLO 模型 → 返回检测结果
2.PyTorch → ONNX → Java:把 YOLO 模型导出成 ONNX,在 Java 使用 ONNX Runtime
3.使用 Deep Java Library (DJL)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐