Saya memiliki beberapa diagram gambar, yang semuanya berisi label sebagai karakter alfanumerik, bukan hanya label teks itu sendiri. Saya ingin model YOLO saya mengidentifikasi semua angka & karakter alfanumerik yang ada di dalamnya.
Bagaimana saya bisa melatih model YOLO saya untuk melakukan hal yang sama. Dataset dapat ditemukan di sini. https://drive.google.com/open?id=1iEkGcreFaBIJqUdAADDXJbUrSj99bvoi
Misalnya: lihat kotak pembatas. Saya ingin YOLO mendeteksi di mana pun teks berada. Namun saat ini tidak perlu mengidentifikasi teks di dalamnya.
Juga hal yang sama perlu dilakukan untuk jenis gambar ini
Gambar dapat diunduh di sini
Ini adalah apa yang saya coba gunakan opencv tetapi tidak bekerja untuk semua gambar dalam dataset.
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()
Apakah ada model atau teknik operasi apa pun atau model pra-terlatih yang dapat melakukan hal yang sama untuk saya? Saya hanya perlu kotak pembatas di sekitar semua karakter alfanumerik yang ada dalam gambar. Setelah itu saya perlu mengidentifikasi apa yang ada di dalamnya. Namun bagian kedua tidak penting saat ini.
sumber
Jawaban:
Sebuah pendekatan yang mungkin adalah dengan menggunakan pendeteksi teks pembelajaran yang dalam EAST (Efficient and Accurate Scene Text) berdasarkan makalah Zhou et al. 2017, EAST: Sebuah Detektor Teks Adegan yang Efisien dan Akurat . Model ini awalnya dilatih untuk mendeteksi teks dalam gambar pemandangan alam tetapi dimungkinkan untuk menerapkannya pada gambar diagram. EAST cukup kuat dan mampu mendeteksi teks yang kabur atau reflektif. Ini adalah versi modifikasi dari implementasi EAST dari Adrian Rosebrock. Alih-alih menerapkan detektor teks langsung pada gambar, kita dapat mencoba untuk menghapus objek non-teks pada gambar sebelum melakukan deteksi teks. Idenya adalah untuk menghapus garis horizontal, garis vertikal, dan kontur non-teks (kurva, diagonal, bentuk lingkaran) sebelum menerapkan deteksi. Inilah hasil dengan beberapa gambar Anda:
Masukkan
->
kontur non-teks untuk dihapus berwarna hijauHasil
Gambar lainnya
Yang pra-pelatihan
frozen_east_text_detection.pb
yang diperlukan untuk melakukan deteksi teks dapat ditemukan di sini . Meskipun model menangkap sebagian besar teks, hasilnya tidak 100% akurat dan kadang-kadang positif palsu mungkin karena bagaimana ia dilatih pada gambar pemandangan alam. Untuk mendapatkan hasil yang lebih akurat, Anda mungkin harus melatih model khusus Anda sendiri. Tetapi jika Anda ingin solusi out-of-the-box yang layak maka ini akan bekerja untuk Anda. Lihat posting blog Deteksi Teks OpenCV Adrian (detektor teks EAST) untuk penjelasan yang lebih komprehensif tentang detektor teks EAST.Kode
sumber
Demi kenyamanan saya ingin menambahkan paket keras_ocr . Ini dapat dengan mudah diinstal dengan pip, dan didasarkan pada detektor teks CRAFT, yang sedikit lebih baru daripada detektor EAST jika saya tidak salah.
Di samping deteksi itu sudah melakukan beberapa OCR juga! Hasilnya seperti yang terlihat di bawah, lihat ini sebagai alternatif, mungkin lebih mudah diterapkan, daripada jawaban yang diterima.
sumber
Apa yang Anda gambarkan tampaknya OCR ( Pengenalan karakter optis ). Salah satu mesin OCR yang saya tahu adalah tesseract , meskipun ada juga yang ini dari IBM dan lainnya.
Karena YOLO pada awalnya dilatih untuk tugas yang sangat berbeda, untuk menggunakannya untuk melokalisasi teks kemungkinan akan perlu melatihnya dari awal. Seseorang dapat mencoba menggunakan paket yang ada (disesuaikan dengan pengaturan spesifik Anda) untuk kebenaran dasar (walaupun perlu diingat bahwa model tersebut umumnya hanya paling baik dan sesuai dengan kebenaran dasar). Atau, mungkin lebih mudah, menghasilkan data sintetis untuk pelatihan (yaitu menambahkan teks di posisi yang Anda pilih ke gambar yang ada kemudian melatih untuk melokalisasikannya).
Atau, jika semua gambar target Anda terstruktur mirip dengan yang di atas, orang dapat mencoba untuk membuat kebenaran tanah menggunakan heuristik CV klasik seperti yang Anda lakukan di atas untuk memisahkan / membagi simbol, diikuti dengan klasifikasi menggunakan CNN yang dilatih tentang MNIST atau serupa untuk menentukan jika gumpalan yang diberikan berisi simbol.
Untuk kasus Anda memilih YOLO - ada implementasi yang ada dalam python, misalnya saya punya pengalaman dengan ini - harus cukup mudah untuk mengatur pelatihan dengan kebenaran dasar Anda sendiri.
Akhirnya, jika menggunakan YOLO atau CNN bukan tujuan itu sendiri melainkan hanya solusinya, salah satu dari "kebenaran dasar" di atas dapat digunakan secara langsung sebagai solusi, dan bukan untuk melatih model.
Semoga saya mengerti pertanyaan Anda dengan benar
sumber