14

में छवि वर्गीकरण मैं स्कैन किए गए पृष्ठों को वर्गीकृत करने की एक विधि की तलाश में हूं जिसमें बड़े पैमाने पर पाठ शामिल है।पायथन

यहां मेरी समस्या का विवरण दिया गया है। मेरे पास स्कैन किए गए दस्तावेज़ों का एक बड़ा संग्रह है और इन दस्तावेज़ों के भीतर कुछ प्रकार के पृष्ठों की उपस्थिति का पता लगाने की आवश्यकता है। मैं दस्तावेज़ों को उनके घटक पृष्ठों में "फट" करने की योजना बना रहा हूं (जिनमें से प्रत्येक एक व्यक्तिगत छवि है) और इन छवियों में से प्रत्येक को "ए" या "बी" के रूप में वर्गीकृत करें। लेकिन मैं ऐसा करने का सबसे अच्छा तरीका नहीं समझ सकता।

अधिक विवरण:

  • मैं 'ए' और 'बी' छवियों (पृष्ठों) के कई उदाहरण हैं, इसलिए मैं देखरेख सीखने कर सकते हैं।
  • यह मुझे अस्पष्ट है कि प्रशिक्षण के लिए इन छवियों से सुविधाओं को सर्वोत्तम तरीके से निकालने के लिए कैसे करें। जैसे वो विशेषताएं क्या हैं?
  • पृष्ठों को कभी-कभी थोड़ा घुमाया जाता है, इसलिए वर्गीकरण कुछ घूर्णन और (कुछ हद तक) स्केलिंग के लिए असंवेदनशील था।
  • मुझे एक शुद्ध-प्लेटफ़ॉर्म समाधान चाहिए, आदर्श रूप से शुद्ध पायथन में या सामान्य पुस्तकालयों का उपयोग करना।
  • मैंने ओपनसीवी का उपयोग करने के बारे में सोचा है, लेकिन यह एक "भारी वजन" समाधान की तरह लगता है।

संपादित करें:

  • 'ए' और 'बी' के पन्नों में मतभेद है कि 'बी' पेज एक ही सामान्य संरचना के साथ उन पर रूपों, एक बार कोड की उपस्थिति सहित है। "ए" पृष्ठ मुफ्त टेक्स्ट हैं।
+0

वे अलग-अलग कैसे होते हैं? फ़ॉन्ट? आकार? क्या आप केवल ओसीआर के कुछ हिस्से (शीर्षक में एक शीर्षक या लेखक?) –

+0

निक, मैंने उस पर स्पष्टीकरण देने के लिए एक संपादन जोड़ा। दरअसल, मेरा लक्ष्य बी * पृष्ठों के बाद * सब कुछ फेंकना है क्योंकि मुझे उन्हें ओसीआर नहीं करना है। तो, मुझे किसी ओसीआर करने से पहले उन्हें वास्तव में पहचानने की ज़रूरत है। – Kyle

+3

यह एक कठिन समस्या है - जब तक कि आपका संग्रह वास्तव में जबरदस्त न हो, क्या पृष्ठों को मैन्युअल रूप से 'ए' या' बी 'के रूप में वर्गीकृत करना आसान नहीं होगा? आप बदले में उन्हें प्रदर्शित करने के लिए थोड़ा जीयूआई ऐप लिख सकते हैं ताकि आप प्रति पृष्ठ एक कुंजी दबा सकें। – katrielalex

उत्तर

4

सबसे पहले, मैं यह कहना चाहूंगा कि मेरे दिमाग ओपनसीवी इन प्रकार के हेरफेर के लिए एक बहुत अच्छा टूल है। इसके अलावा, इसमें एक पाइथन इंटरफ़ेस अच्छी तरह से वर्णित here है।

ओपनसीवी अत्यधिक अनुकूलित है और आपकी समस्या एक आसान नहीं है।

[ग्लोबल संपादित करें: मेरे विचारों के पुनर्गठन]

यहाँ कि इस्तेमाल किया जा सकता विशेषताओं में से कुछ विचार है:

  • बारकोड का पता लगाने आप शायद एक दूरी को बदलने करने के लिए प्रयास करना चाहिए के लिए (DistTransform ओपनसीवी में) यदि बारकोड अलग हैं। शायद आप मैच या मैचशैप्स के साथ ब्याज को खोजने में सक्षम होंगे। मुझे लगता है कि यह व्यवहार्य है क्योंकि बारकोड शौडल का आकार (आकार, आदि) होता है। ब्याज बिंदुओं का स्कोर एक सुविधा के रूप में इस्तेमाल किया जा सकता है।

  • छवि के क्षण यहां उपयोगी हो सकते हैं क्योंकि आपके पास विभिन्न प्रकार के वैश्विक संरचनाएं हैं। यह हो सकता है (openCV समारोह के लिए there देखें) (आप जिस तरह से अपरिवर्तनीय वर्णनकर्ता मिल जाएगा :))

  • आप शायद गणना करने के लिए vertical gradient और horizontal gradient की कोशिश करनी चाहिए एक & बी पृष्ठों के बीच अंतर करने के लिए पर्याप्त होगा। एक बारकोड एक विशिष्ट स्थान है जहां vertical gradient == 0 और horizontal gradient! = 0। यह मुख्य लाभ इन परिचालनों की कम लागत है क्योंकि आपका लक्ष्य केवल यह जांचना है कि आपके पृष्ठ पर ऐसा क्षेत्र है या नहीं।आप ब्याज क्षेत्र खोजने के लिए और एक सुविधा

के रूप में अपनी स्कोर का उपयोग बार जब आप अपने सुविधाओं हो सकता है, आप supervised learning और परीक्षण सामान्यीकरण करने की कोशिश कर सकते हैं। आपकी समस्या के लिए बहुत कम false negative (क्योंकि आप कुछ पृष्ठों को फेंकने जा रहे हैं) की आवश्यकता है ताकि आपको आरओसी घटता के साथ अपने प्रदर्शन का मूल्यांकन करना चाहिए और संवेदनशीलता (जो उच्च होना चाहिए) पर ध्यान से देखना चाहिए। वर्गीकरण के लिए, आप सबसे अच्छी सुविधाओं को खोजने के लिए लासो दंड के साथ प्रतिगमन का उपयोग कर सकते हैं। व्हाटिक के पोस्ट में सामान विचार और अन्य वर्णनकर्ता भी शामिल हैं (शायद अधिक सामान्य)।

2

तो आप विशिष्ट तत्वों का उपयोग करके दो प्रकार के पृष्ठों के बीच अंतर करने में सक्षम होना चाहते हैं - मूल रूप से, बारकोड की उपस्थिति।

  1. सुविधा निष्कर्षण (कंप्यूटर दृष्टि): ब्याज पाइंट या लाइनों जो बारकोड के विशिष्ट सुविधाओं होगा और पाठ नहीं मिल वहाँ दो चरण हैं।

  2. बाइनरी वर्गीकरण (सांख्यिकीय सीखना): निर्धारित करें कि निकाले गए सुविधाओं के आधार पर बारकोड है या नहीं।


पहला कदम के साथ काम, आप निश्चित रूप से Hough transform पर एक नजर है चाहिए। छवि में रेखाओं की पहचान करना आदर्श है, और बारकोड पहचान के लिए उपयोगी हो सकता है। उदाहरण के लिए इन two pages पढ़ें। OpenCV के साथ examples यहां दिए गए हैं।


दूसरे चरण के बारे में, सबसे अधिक उपयोगी वर्गीकरण के आधार पर किया जाएगा:

  • कश्मीर निकटतम पड़ोसियों
  • रसद प्रतिगमन
  • यादृच्छिक वन (वास्तव में अच्छी तरह आर में लागू है, लेकिन मुझे क्या करना पायथन के बारे में नहीं पता)
+0

ऑरेंज लर्निंग किट में एक अच्छा यादृच्छिक वन कार्यान्वयन है जिसका उपयोग मैंने आर – whatnick

9

मैं 3 भागों में जवाब दूंगा क्योंकि आपकी समस्या स्पष्ट रूप से एक बड़ी है और मैं अत्यधिक सस्ते श्रम के साथ मैनुअल विधि की सिफारिश करेंगे अगर पृष्ठों के संकलन एक 1000

भाग 1 से अधिक नहीं है: फ़ीचर निष्कर्षण - आप सुविधाओं की एक बहुत बड़ी सरणी वस्तु का पता लगाने के क्षेत्र में से चुनने के लिए है। चूंकि आपकी आवश्यकताओं में से एक रोटेशन इनविरिएंस है, इसलिए मैं SIFT/सुविधाओं की एसयूआरएफ कक्षा की अनुशंसा करता हूं। आप हैरिस कोनों आदि को भी उपयुक्त पा सकते हैं। यह तय करने के लिए कि कौन सी विशेषताओं का उपयोग करना है, विशेषज्ञ ज्ञान की आवश्यकता हो सकती है और यदि आपके पास कंप्यूटिंग पावर है तो मैं सुविधाओं का एक अच्छा पिघलने वाला बर्तन बनाने और क्लासिफायर प्रशिक्षण आधारित महत्व अनुमानक के माध्यम से इसे पारित करने की अनुशंसा करता हूं।

भाग 2: वर्गीकरणकर्ता चयन - मैं Random Forest वर्गीकारक का एक बड़ा प्रशंसक हूँ। अवधारणा को समझना बहुत आसान है और यह अत्यधिक लचीला और गैर-पैरामीट्रिक है। ट्यूनिंग के लिए बहुत कम पैरामीटर की आवश्यकता होती है और आप इसे पर्यवेक्षित प्रशिक्षण के दौरान पैरामीटर चयन मोड में भी चला सकते हैं।

भाग 3: कार्यान्वयन - अजगर सार में एक गोंद भाषा है। छवि प्रसंस्करण के लिए शुद्ध पायथन कार्यान्वयन कभी भी तेज नहीं होने जा रहे हैं। मैं विशेषता काम और वर्गीकरण के लिए फीचर डिटेक्शन और आर के लिए ओपनसीवी के संयोजन का उपयोग करने की सलाह देता हूं।

समाधान अधिक इंजीनियर लग सकता है लेकिन मशीन सीखना कभी भी एक आसान काम नहीं रहा है, भले ही पृष्ठों के बीच अंतर यह है कि वे एक पुस्तक के बाएं हाथ और दाएं हाथ वाले पृष्ठ हैं।

+0

में पाया है इससे पहले कि मैं निश्चित रूप से एक अच्छा विचार कर रहा हूं लेकिन इस मामले में, हम शायद हमारे पूर्व ज्ञान (उपस्थिति) के कारण सीधे अधिक अनुकूलित सुविधाओं को परिभाषित कर सकते हैं बारकोड या सादे टेक्स्ट, आदि ...) (सीएफ। मेरी पोस्ट)। उत्तर देने के लिए हमारी सुविधाओं को गठबंधन करने के तरीके को खोजने के लिए एक वर्गीकृत प्रशिक्षण का उपयोग करना एक अच्छा विकल्प है। (पोस्ट के लिए सामान्य रूप से +1) – ThR37

+0

@wok: मुझे लगता है कि व्हाट्निक "मुझे किस सुविधा का उपयोग करना चाहिए?" के सवाल में सीधे गहराई से जाने के बजाय समस्या का अधिक सामान्य (और साफ) दृष्टिकोण प्रस्तावित करना चाहता था। हमें यह ध्यान में रखना चाहिए कि इस समस्या के लिए बारकोड एकमात्र समाधान नहीं है और विभिन्न तरीकों को गठबंधन करने का प्रयास करें। आपका लिंक सभी मामलों में बहुत दिलचस्प है। – ThR37

+0

उत्कृष्ट उत्तर। मैंने सिफ्ट और एसयूआरएफ देखा लेकिन, हां, मेरा आवेदन वाणिज्यिक है और एसआईएफटी पेटेंट है। – Kyle

0

आप (उपयोग करने के लिए नि: शुल्क)

1) यहाँ अपने प्रशिक्षण डेटा अपलोड करें demo.nanonets.ai करने के लिए एक के और बी के अपने प्रशिक्षण डेटा अपलोड करके एक मॉडल के निर्माण की कोशिश कर सकते हैं:

demo.nanonets.ai

2) तो फिर

import requests 
import json 
import urllib 
model_name = "Enter-Your-Model-Name-Here" 
url = "https://cdn.pixabay.com/photo/2012/04/24/12/13/letter-39694_960_720.png" 
files = {'uploadfile': urllib.urlopen(url).read()} 
url = "http://demo.nanonets.ai/classify/?appId="+model_name 
r = requests.post(url, files=files) 
print json.loads(r.content) 

3) प्रतिक्रिया की तरह दिखता है:

निम्नलिखित (अजगर कोड) का उपयोग कर एपीआई क्वेरी
{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "A", 
     "probability": 0.97 
    }, 
    { 
     "label": "B", 
     "probability": 0.03 
    } 
    ] 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^