ria-com / nomeroff-net

Nomeroff Net. Automatic numberplate recognition system.
GNU General Public License v3.0
458 stars 158 forks source link

Использование OCR #58

Closed kekonaut closed 4 years ago

kekonaut commented 4 years ago

Добрый день! Хотелось бы проверить ocr на отдельной картинке с номером, однако, она не распознает номер, если вставлять картинку в демо пример. Не очень понимаю, как ее использовать отдельно от модели детектирования машин Не могли бы вы , пожалуйста, описать алгоритм использования отдельно ocr

ApelSYN commented 4 years ago

Не совсем понятен ваш вопрос.

kekonaut commented 4 years ago

Хочу проверить работу обученных ocr на фотографиях, которые содержат только номер( обрезанные) Понимаю,что это возможно сделать, но можно ли как-то вытащить из демо только работу ocr на фотографиях, без детектирования объектов на ней. Т.к. насколько я понимаю, сначала в демо детектируются объекты : машины, номера. А потом только применяется ocr спасибо!

ApelSYN commented 4 years ago

Возмите скрипт для тренировки и положите примеры с описанием в папку test. Вместо тренировки загрузите модель

model = ocrTextDetector.load("/var/www/nomeroff-net/NomeroffNet/mcm/models/TextDetector/ru/anpr_ocr_ru_3-cpu.h5")

Потом запустите

ocrTextDetector.test(verbose=True)

Там вам покажет что распознается неправильно.

kekonaut commented 4 years ago

Спасибо большое за ответ! Да, но тогда у меня выдается та же ошибка, что и при обучении через ipynb AttributeError: 'ru' object has no attribute 'tiger_test' Пыталась исправить это ошибку, скопировав tiger_test из функции prepare в функцию test. Но мне кажется, что этот костыль только провоцирует будущие ошибки( но эта ошибка исчезает) Вероятно, у меня что-то не так импортируется. Думала изначально, что это ошибка импортов, присущая формату ipynb изначально хочется именно проверять фотографию без описания: использовать уже обученную модель, чтобы облегчить разметку новых данных Вероятно, можно так сделать, просто не написав аннотации к этим файлам, тогда в графе True не будет выводиться ничего. Правильно ли понимаю это?

GalymzhanAbdimanap commented 4 years ago

Попробуйте так

from NomeroffNet import  TextDetector
import matplotlib.pyplot as plt

#Initialize text detector.
textDetector = TextDetector.get_static_module("ru")()
textDetector.load("latest")

zones=plt.imread('number_plate.jpg')

textArr = textDetector.predict([zones])
#textArr = textPostprocessing(textArr)
print(textArr)
kekonaut commented 4 years ago

Спасибо!

kekonaut commented 4 years ago

А возможно ли вырезать номера из картинок, где присутствует только номер на каком-либо фоне, а не машина целиком? Пыталась использовать такие фото для модели. Она не распознает на них номера

GalymzhanAbdimanap commented 4 years ago

Сделайте так

import os
import numpy as np
import sys
import matplotlib.image as mpimg
import cv2
import glob
from datetime import datetime
#change this property
NOMEROFF_NET_DIR = os.path.abspath('../../')

#specify the path to Mask_RCNN if you placed it outside Nomeroff-net project
MASK_RCNN_DIR = os.path.join(NOMEROFF_NET_DIR, 'Mask_RCNN')
MASK_RCNN_LOG_DIR = os.path.join(NOMEROFF_NET_DIR, 'logs')

#sys.path.append(NOMEROFF_NET_DIR)

#Import license plate recognition tools.
from NomeroffNet import  filters, RectDetector, TextDetector, OptionsDetector, Detector, textPostprocessing, textPostprocessingAsync
#from OptionsDetector import OptionsDetector

#Initialize npdetector with default configuration file.
nnet = Detector(MASK_RCNN_DIR, MASK_RCNN_LOG_DIR)
nnet.loadModel("latest")

rectDetector = RectDetector()

optionsDetector = OptionsDetector()
optionsDetector.load("latest")

#Initialize text detector.
textDetector = TextDetector.get_static_module("kz")()
textDetector.load("latest")

images = glob.glob('images500/*.jpg')

for img_path in images:
    img = cv2.imread(img_path)
    #img = [img]
    #Detect numberplate
    NP = nnet.detect([img])
    #Generate image mask.
    cv_img_masks = filters.cv_img_mask(NP)
    photo_time = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
    arrPoints = rectDetector.detect(cv_img_masks)
    zones = rectDetector.get_cv_zonesBGR(img, arrPoints)
    regionIds, stateIds, countLines = optionsDetector.predict(zones)
    regionNames = optionsDetector.getRegionLabels(regionIds)
    #print("CL: "+str(countLines))
    textArr = textDetector.predict(zones, countLines)
    textArr = textPostprocessing(textArr, regionNames)
    #print(textArr)
    print(img_path)
    if len(zones)>0:
        cv2.imwrite("number_plates/car"+str(photo_time)+'-'+str(textArr[0]+'.jpg'), zones[0]) 
    else:
        continue
GalymzhanAbdimanap commented 4 years ago

Если не ошибаюсь номер должен составлять не более 10% изображения, проверьте сколько процентов от изображения составляет номер.

ApelSYN commented 4 years ago

А возможно ли вырезать номера из картинок, где присутствует только номер на каком-либо фоне, а не машина целиком? Пыталась использовать такие фото для модели. Она не распознает на них номера

Мы натренировали Mask RCNN модель под нужды сайта AUTO.RIA.com, наши пользователи не фотографируют крупным планом номер, а, обычно, автомобиль на котором (в том числе) видно номер, поэтому наилучшый выход из ситуации, натренировать свою модель.

Вы можете внимательно изучить мои статьи на хабре и вот этот скрипт, с помощью которого можно создать свою модель, которая сможет искать по вашему датасету.

Для этого нужно разметить хотя бы 300 фото (а лучше около 1000) из вашего датасета, можете дотренировать нашу модель с этими данными или дотренировать coco-датасет (в конфиг в параметр "WEIGHTS" пишем значение "coco"), после этого подключите созданую вами модель и все будет находить.