ইওলো বা অন্যান্য চিত্র স্বীকৃতি কৌশলগুলি ব্যবহার করে চিত্রগুলিতে উপস্থিত সমস্ত বর্ণমালা পাঠ্য সনাক্ত করতে পারেন


12

আমার একাধিক চিত্রের ডায়াগ্রাম রয়েছে, যার মধ্যে কেবলমাত্র লেবেল লেবেলের পরিবর্তে বর্ণচিহ্ন হিসাবে লেবেল রয়েছে। আমি চাই আমার YOLO মডেলটি এতে উপস্থিত সমস্ত নম্বর এবং বর্ণচিহ্নগুলি সনাক্ত করতে পারে।

আমি কীভাবে আমার ইওলো মডেলটিকে প্রশিক্ষণ দিতে পারি। ডেটাসেটটি এখানে পাওয়া যাবে। https://drive.google.com/open?id=1iEkGcreFaBIJqUdAADDXJbUrSj99bvoi

উদাহরণস্বরূপ: সীমাবদ্ধ বাক্সগুলি দেখুন। আমি চাই যে পাঠ্য উপস্থিত রয়েছে সেখানে যোলো সনাক্ত করতে পারে। তবে বর্তমানে এটির ভিতরে লেখাটি সনাক্ত করার প্রয়োজন নেই।

এখানে চিত্র বর্ণনা লিখুন

এছাড়াও এই ধরণের চিত্রগুলির জন্য একই কাজ করা দরকার এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

ছবিগুলি এখানে ডাউনলোড করা যায়

এটি আমি ওপেনসিভি ব্যবহার করার চেষ্টা করেছি কিন্তু এটি ডেটাসেটের সমস্ত চিত্রের জন্য কাজ করে না।

import cv2
import numpy as np
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Users\HPO2KOR\AppData\Local\Tesseract-OCR\tesseract.exe"

image = cv2.imread(r'C:\Users\HPO2KOR\Desktop\Work\venv\Patent\PARTICULATE DETECTOR\PD4.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
clean = thresh.copy()

horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))
detect_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(clean, [c], -1, 0, 3)

vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,30))
detect_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(clean, [c], -1, 0, 3)

cnts = cv2.findContours(clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 100:
        cv2.drawContours(clean, [c], -1, 0, 3)
    elif area > 1000:
        cv2.drawContours(clean, [c], -1, 0, -1)
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    x,y,w,h = cv2.boundingRect(c)
    if len(approx) == 4:
        cv2.rectangle(clean, (x, y), (x + w, y + h), 0, -1)

open_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
opening = cv2.morphologyEx(clean, cv2.MORPH_OPEN, open_kernel, iterations=2)
close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,2))
close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, close_kernel, iterations=4)
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    area = cv2.contourArea(c)
    if area > 500:
        ROI = image[y:y+h, x:x+w]
        ROI = cv2.GaussianBlur(ROI, (3,3), 0)
        data = pytesseract.image_to_string(ROI, lang='eng',config='--psm 6')
        if data.isalnum():
            cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
            print(data)

cv2.imwrite('image.png', image)
cv2.imwrite('clean.png', clean)
cv2.imwrite('close.png', close)
cv2.imwrite('opening.png', opening)
cv2.waitKey()

এমন কোনও মডেল বা কোনও ওপেনসিভি কৌশল বা কিছু প্রাক প্রশিক্ষিত মডেল আমার জন্য একই কাজ করতে পারে? আমাকে কেবল চিত্রগুলিতে উপস্থিত সমস্ত বর্ণানুক্রমিক অক্ষরের চারদিকে বাউন্ডিং বাক্সগুলি দরকার। তারপরে আমার এতে উপস্থিত থাকাগুলি সনাক্ত করতে হবে। তবে দ্বিতীয় অংশটি বর্তমানে গুরুত্বপূর্ণ নয়।




যা সমস্ত চিত্রের জন্য কাজ করে না
পুলকিত ভাটনগর

উত্তর:


7

ঝাউ এট আল এর 2017 এর গবেষণাপত্রের ভিত্তিতে EAST (দক্ষ এবং নির্ভুল দৃশ্যের পাঠ্য) গভীর শিক্ষণ পাঠ্য ডিটেক্টর ব্যবহার করা একটি সম্ভাব্য পদ্ধতির মধ্যে রয়েছে : EAST: একটি দক্ষ এবং নির্ভুল দৃশ্যের পাঠক সনাক্তকারী । মডেলটি মূলত প্রাকৃতিক দৃশ্যের চিত্রগুলিতে পাঠ্য সনাক্ত করার জন্য প্রশিক্ষিত হয়েছিল তবে চিত্র চিত্রগুলিতে এটি প্রয়োগ করা সম্ভব হতে পারে। ইস্ট বেশ মজবুত এবং অস্পষ্ট বা প্রতিফলিত পাঠ্য সনাক্ত করতে সক্ষম। এখানে অ্যাড্রিয়ান রোজব্রকের EAST প্রয়োগের একটি পরিবর্তিত সংস্করণ রয়েছে version। সরাসরি চিত্রটিতে টেক্সট ডিটেক্টর প্রয়োগ করার পরিবর্তে, আমরা পাঠ্য শনাক্তকরণের আগে চিত্রটিতে যতটা অ-পাঠ্য অবজেক্টগুলি সরিয়ে ফেলার চেষ্টা করতে পারি। ধারণাটি প্রয়োগের আগে অনুভূমিক রেখা, উল্লম্ব লাইন এবং অ-পাঠ্য রূপগুলি (বক্ররেখা, ত্রিভুজগুলি, বিজ্ঞপ্তি আকার) সরিয়ে ফেলা হবে। আপনার কয়েকটি চিত্র সহ ফলাফল এখানে:

->সবুজতে মুছে ফেলার জন্য নন-পাঠ্য রূপটি ইনপুট করুন

ফলাফল

অন্যান্য চিত্র

frozen_east_text_detection.pbপাঠ্য সনাক্তকরণ সম্পাদনের জন্য প্রয়োজনীয় প্রাক-প্রশিক্ষিত মডেলটি এখানে পাওয়া যাবে । যদিও মডেল বেশিরভাগ পাঠ্যকে ধারণ করে, তবে ফলাফলগুলি 100% সঠিক নয় এবং প্রাকৃতিক দৃশ্যের চিত্রগুলিতে কীভাবে এটি প্রশিক্ষিত হয়েছিল সে কারণে সম্ভবত মাঝে মাঝে মিথ্যা ইতিবাচকতা রয়েছে। আরও সঠিক ফলাফল পেতে আপনাকে সম্ভবত নিজস্ব কাস্টম মডেলটি প্রশিক্ষণ দিতে হবে। তবে আপনি যদি বাক্সের বাইরে একটি শালীন সমাধান চান তবে এটি আপনার কাজ করা উচিত। EAST পাঠ্য সনাক্তকারীটির আরও বিস্তৃত ব্যাখ্যার জন্য অ্যাড্রিয়ানের ওপেনসিভি পাঠ্য সনাক্তকরণ (EAST পাঠ্য সনাক্তকারী) ব্লগ পোস্টটি দেখুন।

কোড

from imutils.object_detection import non_max_suppression
import numpy as np
import cv2

def EAST_text_detector(original, image, confidence=0.25):
    # Set the new width and height and determine the changed ratio
    (h, W) = image.shape[:2]
    (newW, newH) = (640, 640)
    rW = W / float(newW)
    rH = h / float(newH)

    # Resize the image and grab the new image dimensions
    image = cv2.resize(image, (newW, newH))
    (h, W) = image.shape[:2]

    # Define the two output layer names for the EAST detector model that
    # we are interested -- the first is the output probabilities and the
    # second can be used to derive the bounding box coordinates of text
    layerNames = [
        "feature_fusion/Conv_7/Sigmoid",
        "feature_fusion/concat_3"]

    net = cv2.dnn.readNet('frozen_east_text_detection.pb')

    # Construct a blob from the image and then perform a forward pass of
    # the model to obtain the two output layer sets
    blob = cv2.dnn.blobFromImage(image, 1.0, (W, h), (123.68, 116.78, 103.94), swapRB=True, crop=False)
    net.setInput(blob)
    (scores, geometry) = net.forward(layerNames)

    # Grab the number of rows and columns from the scores volume, then
    # initialize our set of bounding box rectangles and corresponding
    # confidence scores
    (numRows, numCols) = scores.shape[2:4]
    rects = []
    confidences = []

    # Loop over the number of rows
    for y in range(0, numRows):
        # Extract the scores (probabilities), followed by the geometrical
        # data used to derive potential bounding box coordinates that
        # surround text
        scoresData = scores[0, 0, y]
        xData0 = geometry[0, 0, y]
        xData1 = geometry[0, 1, y]
        xData2 = geometry[0, 2, y]
        xData3 = geometry[0, 3, y]
        anglesData = geometry[0, 4, y]

        # Loop over the number of columns
        for x in range(0, numCols):
            # If our score does not have sufficient probability, ignore it
            if scoresData[x] < confidence:
                continue

            # Compute the offset factor as our resulting feature maps will
            # be 4x smaller than the input image
            (offsetX, offsetY) = (x * 4.0, y * 4.0)

            # Extract the rotation angle for the prediction and then
            # compute the sin and cosine
            angle = anglesData[x]
            cos = np.cos(angle)
            sin = np.sin(angle)

            # Use the geometry volume to derive the width and height of
            # the bounding box
            h = xData0[x] + xData2[x]
            w = xData1[x] + xData3[x]

            # Compute both the starting and ending (x, y)-coordinates for
            # the text prediction bounding box
            endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
            endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
            startX = int(endX - w)
            startY = int(endY - h)

            # Add the bounding box coordinates and probability score to
            # our respective lists
            rects.append((startX, startY, endX, endY))
            confidences.append(scoresData[x])

    # Apply non-maxima suppression to suppress weak, overlapping bounding
    # boxes
    boxes = non_max_suppression(np.array(rects), probs=confidences)

    # Loop over the bounding boxes
    for (startX, startY, endX, endY) in boxes:
        # Scale the bounding box coordinates based on the respective
        # ratios
        startX = int(startX * rW)
        startY = int(startY * rH)
        endX = int(endX * rW)
        endY = int(endY * rH)

        # Draw the bounding box on the image
        cv2.rectangle(original, (startX, startY), (endX, endY), (36, 255, 12), 2)
    return original

# Convert to grayscale and Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
clean = thresh.copy()

# Remove horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))
detect_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(clean, [c], -1, 0, 3)

# Remove vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,30))
detect_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(clean, [c], -1, 0, 3)

# Remove non-text contours (curves, diagonals, circlar shapes)
cnts = cv2.findContours(clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 1500:
        cv2.drawContours(clean, [c], -1, 0, -1)
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    x,y,w,h = cv2.boundingRect(c)
    if len(approx) == 4:
        cv2.rectangle(clean, (x, y), (x + w, y + h), 0, -1)

# Bitwise-and with original image to remove contours
filtered = cv2.bitwise_and(image, image, mask=clean)
filtered[clean==0] = (255,255,255)

# Perform EAST text detection
result = EAST_text_detector(image, filtered)

cv2.imshow('filtered', filtered)
cv2.imshow('result', result)
cv2.waitKey()

খুব সম্পূর্ণ উত্তর। কত ঘন্টা চেষ্টা?
করালফিলিপ

এটি লিখতে প্রায় এক ঘন্টা এবং আরও 30 মিনিট
নাট্যাঞ্জি

আজ অবধি আমি এখনও কয়েক জন লোকের সাথে অত্যন্ত মিলের সিভি প্রশ্নের সাথে দেখা লোকের সংখ্যা অবাক করে দিয়েছি। এটি প্রায় দেখতে দেখতে একই চিত্র প্রক্রিয়াকরণ শ্রেণীর ছেলেরা তাদের গৃহকর্ম শেষ করতে সাহায্যের সন্ধান করছে বা তাদের জন্য হোমওয়ার্ক করার জন্য কাউকে খুঁজছে। এটি সত্যিই উদ্ভট একটি "কাকতালীয় ঘটনা"।
করলফিলিপ

2
@ কারলফিলিপ সম্ভবত এই প্রশ্নটি পরিচিত বলে মনে হচ্ছে কারণ ওপি প্রায় এক সপ্তাহ আগে পোস্ট করেছে। তিনি বেশিরভাগই সিটিআরএল + সি, সিটিআরএল + ভি উত্তর চান যা তার সমস্ত মামলা বাক্সের বাইরেই কভার করে, তাই, আমার ধারণা আপনি কয়েক সপ্তাহের মধ্যে আবার এই একই প্রশ্নটি দেখতে পাবেন!
ওল্ডগ্র্যাসিডো

3
@eldesgraciado আমি ঠিক বুঝতে পেরেছি যে কয়েক সপ্তাহ আগে ওপি একটি অনুরূপ প্রশ্ন পোস্ট করেছে । বুঝতে পারিনি যে এখন পর্যন্ত একই ব্যক্তি! আমি প্রশ্নটি কেন খুব পরিচিত বলে ভাবছিলাম
নাট্যত্ব

6

সুবিধার জন্য আমি প্যাকেজটি কেরাস_সোকর যুক্ত করতে চাই । এটি সহজেই পাইপের সাথে ইনস্টল করা যায় এবং এটি সিআরএফটি পাঠ্য সনাক্তকারীটির উপর ভিত্তি করে তৈরি হয়, যা আমি ভুল না হলে EAST সনাক্তকারীর চেয়ে কিছুটা নতুন।

সনাক্তকরণের পাশে এটি ইতিমধ্যে কিছু ওসিআরও করে! ফলাফলগুলি নীচে দেখানো হয়েছে, গ্রহণযোগ্য উত্তরের চেয়ে এটিকে বিকল্প হিসাবে সম্ভবত প্রয়োগ করা সহজ seeএখানে চিত্র বর্ণনা লিখুন


হাই বিজয়ী, এটি কি আমার চিত্রের কমপক্ষে 70% কাজ করে?
পুলকিত ভাটনগর

আপনি আপনার ডেটাসেটে লেবেল অন্তর্ভুক্ত করেননি। সুতরাং আমি সত্যিই আপনাকে বলতে পারি না যে এটিতে কী পরিমাণ চিত্র কাজ করে, যদি এটির কোনও লেবেলের সাথে তুলনা করে কাজ করে কিনা তা যাচাই করার যদি আমার কাছে উপায় না থাকে। তবে এটি একটি পাইপ প্যাকেজ, সুতরাং এটি আপনার ডেটাसेट

4

আপনি যা বর্ণনা করছেন তা ওসিআর ( অপটিক্যাল চরিত্রের স্বীকৃতি ) বলে মনে হচ্ছে । আমার জানা একটি ওসিআর ইঞ্জিন হ'ল টেসারেক্ট , যদিও আইবিএম এবং অন্যদের থেকে এটিও রয়েছে।

যেহেতু YOLO মূলত একটি খুব আলাদা কাজের জন্য প্রশিক্ষণপ্রাপ্ত ছিল, স্থানীয় পাঠ্যের জন্য এটি ব্যবহারের জন্য সম্ভবত এটি স্ক্র্যাচ থেকে পুনরায় প্রশিক্ষণ করতে হবে। কেউ স্থল সত্যের জন্য বিদ্যমান প্যাকেজগুলি (আপনার নির্দিষ্ট সেটিংসের সাথে অভিযোজিত) ব্যবহার করার চেষ্টা করতে পারে (যদিও এটি মনে রাখা মূল্যবান যে মডেলটি কেবলমাত্র স্থল সত্যের মতোই হতে পারে)। অথবা, সম্ভবত আরও সহজেই প্রশিক্ষণের জন্য সিনথেটিক ডেটা তৈরি করুন (যেমন আপনি বিদ্যমান অঙ্কনগুলিতে পছন্দ করেন এমন অবস্থানগুলিতে পাঠ্য যোগ করুন তারপরে এটি স্থানীয়করণের প্রশিক্ষণ দিন)।

বিকল্পভাবে, যদি আপনার সমস্ত টার্গেটের চিত্রগুলি উপরের মতো কাঠামোগত হয় তবে আপনি ক্লাসিক সিভি হিউরিস্টিক্স ব্যবহার করে গ্রাউন্ড ট্রুথ তৈরির চেষ্টা করতে পারেন যেমন আপনি উপরে চিহ্নগুলি পৃথক / বিভাগে আলাদা করেছিলেন, তারপরে এমএনআইএসটিতে প্রশিক্ষিত সিএনএন ব্যবহার করে শ্রেণিবিন্যাস বা নির্ধারণের অনুরূপ যদি প্রদত্ত ব্লবটিতে একটি চিহ্ন থাকে।

কেস জন্য আপনি Yolo করার জন্য আমাদের নির্বাচন কি - আছে পাইথন বিদ্যমান বাস্তবায়নের হয়, যেমন আমি সঙ্গে কিছু অভিজ্ঞতা ছিল এই এক - মোটামুটি আপনার নিজের মাটিতে সত্য নিয়ে প্রশিক্ষণ সেট আপ করার সোজাসাপটা হওয়া উচিত।

অবশেষে, যদি YOLO বা CNN ব্যবহার করা নিজের মধ্যে লক্ষ্য না হয়ে কেবল সমাধান হয় তবে উপরের কোনও "গ্রাউন্ড সত্য" সরাসরি সমাধান হিসাবে ব্যবহার করা যেতে পারে, কোনও মডেল প্রশিক্ষণের জন্য নয়।

আশা করি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পেরেছি


আপনি যদি
এইটির

টাস্কটি শেষ পর্যন্ত পাঠ্যটি পাওয়া কিন্তু আমি প্রথমে এর মধ্যে সমস্ত বর্ণানুক্রমিক অক্ষরগুলি চিহ্নিত করার চেষ্টা করছি এবং তারপরে একবার সনাক্ত করা একইর জন্য ওসিআর ব্যবহার করব
পুলকিত ভাটনগর

আমি প্রস্তাবিত কোনও কিছুই সত্যই একটি বাইরের সমাধান নয়, এবং অ্যালগোরিদমিক কোডটি আমার মনে হয় সংক্ষিপ্ত বা সহজ হবে না, তাই আমি এটিকে ধারণার স্তরে রেখে দেব :-)। ধন্যবাদ ধন্যবাদ জন্য ধন্যবাদ!
ইউরি ফিল্ডম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.