1 介绍
使用yolov8模型进行车牌区域识别,然后使用paddlecor模型将字体提取出来,由于数据量很大,支持复杂环境下的识别。数据集共29642张,其中27642张用了做训练,2000张用来做验证。
2 训练yolov8模型
yolov8详细介绍可以在网上找资料看,训练很简单,安装完包就一行train训练就行。
from ultralytics import YOLO
# 29642 # 27642 训练 2000 测试
if __name__ == '__main__':
model = YOLO("yolov8m.yaml") # build a new model from scratch
results = model.train(data="data.yaml", epochs=20, batch = 8) # train the model
3 OCR识别
3.1 导入paddleocr模型
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' # 设置允许重复加载动态链接库,若不允许,使用jupyter运行时内核会挂掉
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(rec_model_dir = "models/ocr",use_angle_cls=False,
use_gpu=False,lang="ch", show_log=False) # need to run only once to download and load model into memory
3.2 导入yolov8模型,进行推理
#导入yolov8模型
model = YOLO("models/yolov8n/best.pt") # load a pretrained model (recommended for training)
3.3 进行推理
对于每张图片,先识别出车牌的位置,然后再提取字符。
if img is not None:
car_num, xyxy, xywhn = get_yolov8_result(model, img)
roi_out_path = os.path.join(roi_path, file)
if car_num == 1:
# 表示只有一个位置是车牌
xyxy_tr = torch.tensor(xyxy) # 转换为tensor类型
ROI = save_one_box(xyxy_tr, img, file=Path(roi_out_path), BGR=True) # 提取车牌区域
ocr_text = ocr.ocr(ROI, cls=False) # 输入到百度模型进行ocr识别
if len(ocr_text[0]) != 0:
# 表示这个位置是车牌
number_plate = process_car_text(ocr_text) # 处理车牌
xywhn_str = process_xywhn(xywhn)
line_str = file + "," + xywhn_str + "," + number_plate + "\n"
write_append_content(output_file_path, line_str)
4 结果展示
提取到的ROI车牌区域
提取到的车牌结果,只展示部分结果
完整代码可以咨询:https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ