在谷歌 colab 上,使用 yolov7 进行车牌检测试验
1. 环境准备
首先,确保您在Google Colab中选择了合适的运行时。建议使用GPU加速,以提高模型推理速度。
- 打开Google Colab。
- 点击菜单栏的 Runtime(运行时) > Change runtime type(更改运行时类型)。
- 在弹出的窗口中,将 Hardware accelerator(硬件加速器) 设置为 GPU。
- 点击 Save(保存)。
2. 克隆YOLOv7仓库
在Colab中,我们需要克隆YOLOv7的GitHub仓库。执行以下代码块:
# 克隆YOLOv7仓库
!git clone https://github.com/WongKinYiu/yolov7.git
%cd yolov7
3. 安装依赖项
安装YOLOv7所需的Python依赖项,包括PyTorch(如果尚未安装),以及其他必要的库。
# 安装PyTorch和其他依赖项
!pip install -U pip
!pip install -r requirements.txt
注意:Colab通常已经预装了PyTorch。如果需要特定版本的PyTorch,可以参考PyTorch官网的安装指南。
4. 下载预训练权重
YOLOv7提供了多种预训练模型。对于车牌检测,您可能需要一个专门训练的模型。如果没有现成的车牌检测模型,您可以使用通用的YOLOv7权重并进行后续处理,或者从开源社区获取专门的车牌检测权重。
假设我们使用通用的YOLOv7预训练权重yolov7.pt
:
# 下载YOLOv7预训练权重
!wget -P weights https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt
如果您找到专门用于车牌检测的YOLOv7权重文件(例如
lp_best.pt
),请使用相应的URL下载,或者将其上传到Colab并放置在weights/
目录下。
5. 上传测试图片
您需要上传要进行车牌检测的测试图片。可以使用Colab的文件上传功能。
from google.colab import files
uploaded = files.upload()
执行以上代码后,点击 Choose Files(选择文件) 按钮,上传您的测试图片(例如test.jpg
)。上传后,图片将保存在当前工作目录下。
6. 运行YOLOv7进行车牌检测
使用YOLOv7的detect.py
脚本进行车牌检测。这里假设您使用的是通用的yolov7.pt
权重。
# 运行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
目录下。您可以使用以下代码查看结果:
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
。我们将读取该文件,提取车牌的边界框,并裁剪车牌区域。
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模型会有特定的类别索引对应不同的物体。确保您了解车牌对应的类别索引。
- 如果您使用的是专门的车牌检测模型,可能只有车牌这一类别,简化了筛选过程。
显示裁剪的车牌图像
# 显示裁剪的车牌图像
for i in range(len(detections)):
plate_path = f'plate_{i}.jpg'
try:
display(Image(filename=plate_path))
except:
pass
8. 使用OCR模型进行车牌字符识别
提取车牌区域后,我们需要对其进行字符识别。这里推荐使用PaddleOCR或EasyOCR等开源OCR工具。为了简化流程,我们将使用EasyOCR,因为它易于安装和使用。
安装EasyOCR
!pip install easyocr
进行字符识别
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
!pip install paddlepaddle -f https://www.paddlepaddle.org.cn/whl/mkl/avx/stable.html
!pip install paddleocr
进行字符识别
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笔记本示例,整合了上述所有步骤:
# 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)
附加建议
使用专用的车牌检测模型:
- 如果您发现通用的YOLOv7模型在车牌检测上的效果不佳,建议寻找或训练一个专门用于车牌检测的YOLOv7模型。
- 可以在Hugging Face或其他开源社区搜索车牌检测相关的模型。
模型优化:
- 根据您的数据集,调整YOLOv7的
--conf
和--img-size
参数,以优化检测效果。 - 进行模型微调(fine-tuning),使用您自己的车牌数据集提升模型的检测精度。
- 根据您的数据集,调整YOLOv7的
字符识别优化:
- 尝试不同的OCR工具(如EasyOCR、PaddleOCR、Tesseract)以找到最适合您需求的工具。
- 对车牌图像进行预处理(如灰度化、二值化、去噪)以提高OCR的识别率。
自动化流程:
- 将检测和识别步骤整合到一个函数或脚本中,实现自动化处理多个图像。
- 可以批量处理文件夹中的所有图片,提高效率。
错误处理:
- 添加错误处理机制,处理未检测到车牌或OCR识别失败的情况,确保流程的稳健性。
使用Hugging Face模型:
- Hugging Face提供了多种模型,您可以在Hugging Face Model Hub搜索适合的车牌检测和识别模型。
- 使用Hugging Face的
transformers
库,可以方便地加载和使用这些模型。
示例:使用Hugging Face的YOLOv7模型
如果您在Hugging Face找到适合的YOLOv7车牌检测模型,可以按照以下步骤加载和使用:
!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仓库路径,并确保模型权重文件名正确。