Skip to content

在谷歌 colab 上,使用 yolov7 进行车牌检测试验

1. 环境准备

首先,确保您在Google Colab中选择了合适的运行时。建议使用GPU加速,以提高模型推理速度。

  1. 打开Google Colab。
  2. 点击菜单栏的 Runtime(运行时) > Change runtime type(更改运行时类型)
  3. 在弹出的窗口中,将 Hardware accelerator(硬件加速器) 设置为 GPU
  4. 点击 Save(保存)

2. 克隆YOLOv7仓库

在Colab中,我们需要克隆YOLOv7的GitHub仓库。执行以下代码块:

python
# 克隆YOLOv7仓库
!git clone https://github.com/WongKinYiu/yolov7.git
%cd yolov7

3. 安装依赖项

安装YOLOv7所需的Python依赖项,包括PyTorch(如果尚未安装),以及其他必要的库。

python
# 安装PyTorch和其他依赖项
!pip install -U pip
!pip install -r requirements.txt

注意:Colab通常已经预装了PyTorch。如果需要特定版本的PyTorch,可以参考PyTorch官网的安装指南。

4. 下载预训练权重

YOLOv7提供了多种预训练模型。对于车牌检测,您可能需要一个专门训练的模型。如果没有现成的车牌检测模型,您可以使用通用的YOLOv7权重并进行后续处理,或者从开源社区获取专门的车牌检测权重。

假设我们使用通用的YOLOv7预训练权重yolov7.pt

python
# 下载YOLOv7预训练权重
!wget -P weights https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt

如果您找到专门用于车牌检测的YOLOv7权重文件(例如lp_best.pt),请使用相应的URL下载,或者将其上传到Colab并放置在weights/目录下。

5. 上传测试图片

您需要上传要进行车牌检测的测试图片。可以使用Colab的文件上传功能。

python
from google.colab import files
uploaded = files.upload()

执行以上代码后,点击 Choose Files(选择文件) 按钮,上传您的测试图片(例如test.jpg)。上传后,图片将保存在当前工作目录下。

6. 运行YOLOv7进行车牌检测

使用YOLOv7的detect.py脚本进行车牌检测。这里假设您使用的是通用的yolov7.pt权重。

python
# 运行YOLOv7进行检测
!python detect.py --weights weights/yolov7.pt --source test.jpg --conf 0.25 --img-size 640 --save-txt --save-conf

参数说明

  • --weights:指定模型权重路径。
  • --source:输入图片路径,可以是文件名、文件夹或视频文件。
  • --conf:置信度阈值,默认0.25。
  • --img-size:输入图像大小,默认640。
  • --save-txt:保存检测结果的文本文件(包含边界框坐标和置信度)。
  • --save-conf:在文本文件中保存置信度。

注意:如果您使用的是专门的车牌检测权重(例如lp_best.pt),请将--weights参数修改为相应路径。

查看检测结果

检测完成后,结果图片会保存在runs/detect/exp目录下。您可以使用以下代码查看结果:

python
from IPython.display import Image, display

# 显示检测结果图片
display(Image(filename='runs/detect/exp/test.jpg'))

7. 提取车牌区域

检测完成后,我们需要从检测结果中提取车牌区域,以便进行字符识别。YOLOv7的detect.py会生成一个包含检测结果的.txt文件,其中包括边界框坐标和置信度。

读取检测结果

假设您的图片名为test.jpg,对应的检测结果文本文件为runs/detect/exp/test.txt。我们将读取该文件,提取车牌的边界框,并裁剪车牌区域。

python
import cv2

# 读取检测结果
with open('runs/detect/exp/test.txt', 'r') as f:
    detections = f.readlines()

# 读取原始图像
image = cv2.imread('test.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGB格式

# 假设车牌属于特定类别(例如类别索引为0)
# 如果使用的是通用模型,您需要知道车牌的类别索引
# 这里假设所有检测框都是车牌
for i, detection in enumerate(detections):
    det = detection.strip().split()
    if len(det) < 6:
        continue
    class_id = int(det[0])
    confidence = float(det[5])
    # 获取边界框坐标(x1, y1, x2, y2)
    x1, y1, x2, y2 = map(int, det[1:5])
    # 裁剪车牌区域
    plate_roi = image[y1:y2, x1:x2]
    # 保存裁剪的车牌图像
    plate_filename = f'plate_{i}.jpg'
    cv2.imwrite(plate_filename, cv2.cvtColor(plate_roi, cv2.COLOR_RGB2BGR))
    print(f'车牌 {i} 已保存为 {plate_filename}')

注意

  • 如果您使用的是通用的YOLOv7模型,可能需要进一步筛选出车牌类别。通常,YOLO模型会有特定的类别索引对应不同的物体。确保您了解车牌对应的类别索引。
  • 如果您使用的是专门的车牌检测模型,可能只有车牌这一类别,简化了筛选过程。

显示裁剪的车牌图像

python
# 显示裁剪的车牌图像
for i in range(len(detections)):
    plate_path = f'plate_{i}.jpg'
    try:
        display(Image(filename=plate_path))
    except:
        pass

8. 使用OCR模型进行车牌字符识别

提取车牌区域后,我们需要对其进行字符识别。这里推荐使用PaddleOCREasyOCR等开源OCR工具。为了简化流程,我们将使用EasyOCR,因为它易于安装和使用。

安装EasyOCR

python
!pip install easyocr

进行字符识别

python
import easyocr

# 初始化OCR读取器
# 选择适当的语言,例如英文'english'或中文'ch_sim'等
reader = easyocr.Reader(['en'])  # 根据车牌字符选择语言

# 识别每个车牌图像
for i in range(len(detections)):
    plate_path = f'plate_{i}.jpg'
    result = reader.readtext(plate_path)
    print(f'车牌 {i} 的识别结果:')
    plate_text = ''
    for res in result:
        plate_text += res[1]
    print(plate_text)

注意

  • 根据车牌的语言和字符集选择合适的语言包。例如,中国车牌可以使用['ch_sim', 'en']
  • 识别效果受车牌图像质量、清晰度、光照等因素影响。如有需要,可对车牌图像进行预处理(如灰度化、二值化、去噪等)以提高识别准确性。

示例:使用PaddleOCR

如果您更倾向于使用PaddleOCR,以下是相应的步骤:

安装PaddleOCR

python
!pip install paddlepaddle -f https://www.paddlepaddle.org.cn/whl/mkl/avx/stable.html
!pip install paddleocr

进行字符识别

python
from paddleocr import PaddleOCR, draw_ocr
import matplotlib.pyplot as plt

# 初始化OCR模型
ocr = PaddleOCR(lang='en')  # 根据需要选择语言

# 识别每个车牌图像
for i in range(len(detections)):
    plate_path = f'plate_{i}.jpg'
    result = ocr.ocr(plate_path, rec=True, cls=True)
    print(f'车牌 {i} 的识别结果:')
    plate_text = ''
    for line in result:
        plate_text += line[1][0]
    print(plate_text)
    
    # 可选:显示识别结果
    image = Image.open(plate_path).convert('RGB')
    boxes = [line[0] for line in result]
    txts = [line[1][0] for line in result]
    scores = [line[1][1] for line in result]
    im_show = draw_ocr(image, boxes, txts, scores, font_path='path_to_font')  # 可选:指定字体路径
    im_show = Image.fromarray(im_show)
    plt.imshow(im_show)
    plt.axis('off')
    plt.show()

注意

  • 确保指定正确的语言选项。
  • draw_ocr函数需要指定字体路径,如果不需要绘制结果图片,可以省略相关代码。

9. 完整流程总结

以下是一个完整的Google Colab笔记本示例,整合了上述所有步骤:

python
# 1. 克隆YOLOv7仓库
!git clone https://github.com/WongKinYiu/yolov7.git
%cd yolov7

# 2. 安装依赖项
!pip install -U pip
!pip install -r requirements.txt

# 3. 下载预训练权重
!wget -P weights https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt

# 4. 上传测试图片
from google.colab import files
uploaded = files.upload()

# 假设上传的图片名为 'test.jpg'

# 5. 运行YOLOv7进行检测
!python detect.py --weights weights/yolov7.pt --source test.jpg --conf 0.25 --img-size 640 --save-txt --save-conf

# 6. 显示检测结果
from IPython.display import Image, display
display(Image(filename='runs/detect/exp/test.jpg'))

# 7. 提取车牌区域
import cv2

with open('runs/detect/exp/test.txt', 'r') as f:
    detections = f.readlines()

image = cv2.imread('test.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

for i, detection in enumerate(detections):
    det = detection.strip().split()
    if len(det) < 6:
        continue
    class_id = int(det[0])
    confidence = float(det[5])
    x1, y1, x2, y2 = map(int, det[1:5])
    plate_roi = image[y1:y2, x1:x2]
    plate_filename = f'plate_{i}.jpg'
    cv2.imwrite(plate_filename, cv2.cvtColor(plate_roi, cv2.COLOR_RGB2BGR))
    print(f'车牌 {i} 已保存为 {plate_filename}')

# 8. 显示裁剪的车牌图像
for i in range(len(detections)):
    plate_path = f'plate_{i}.jpg'
    try:
        display(Image(filename=plate_path))
    except:
        pass

# 9. 安装EasyOCR
!pip install easyocr

# 10. 进行字符识别
import easyocr

reader = easyocr.Reader(['en'])  # 根据车牌字符选择语言

for i in range(len(detections)):
    plate_path = f'plate_{i}.jpg'
    result = reader.readtext(plate_path)
    print(f'车牌 {i} 的识别结果:')
    plate_text = ''
    for res in result:
        plate_text += res[1]
    print(plate_text)

附加建议

  1. 使用专用的车牌检测模型

    • 如果您发现通用的YOLOv7模型在车牌检测上的效果不佳,建议寻找或训练一个专门用于车牌检测的YOLOv7模型。
    • 可以在Hugging Face或其他开源社区搜索车牌检测相关的模型。
  2. 模型优化

    • 根据您的数据集,调整YOLOv7的--conf--img-size参数,以优化检测效果。
    • 进行模型微调(fine-tuning),使用您自己的车牌数据集提升模型的检测精度。
  3. 字符识别优化

    • 尝试不同的OCR工具(如EasyOCR、PaddleOCR、Tesseract)以找到最适合您需求的工具。
    • 对车牌图像进行预处理(如灰度化、二值化、去噪)以提高OCR的识别率。
  4. 自动化流程

    • 将检测和识别步骤整合到一个函数或脚本中,实现自动化处理多个图像。
    • 可以批量处理文件夹中的所有图片,提高效率。
  5. 错误处理

    • 添加错误处理机制,处理未检测到车牌或OCR识别失败的情况,确保流程的稳健性。
  6. 使用Hugging Face模型

    • Hugging Face提供了多种模型,您可以在Hugging Face Model Hub搜索适合的车牌检测和识别模型。
    • 使用Hugging Face的transformers库,可以方便地加载和使用这些模型。

示例:使用Hugging Face的YOLOv7模型

如果您在Hugging Face找到适合的YOLOv7车牌检测模型,可以按照以下步骤加载和使用:

python
!pip install transformers
!pip install huggingface_hub

from huggingface_hub import hf_hub_download

# 下载模型权重
model_path = hf_hub_download(repo_id='your-username/yolov7-license-plate', filename='best.pt')

# 使用下载的模型权重进行检测
!python detect.py --weights {model_path} --source test.jpg --conf 0.25 --img-size 640 --save-txt --save-conf

注意:请将your-username/yolov7-license-plate替换为实际的Hugging Face仓库路径,并确保模型权重文件名正确。