ETOOS、KAKAO Vision API(OCR)による作成時間


どうしたんですか。


ETOOS 247新学期が始まりました.
新しい番組がたくさんあって、その中の1つは
「毎日計画」で、時間がかかることを紹介したいと思います.
学生たちは1人1枚のTO-DOリストを持っています.
衆院提出翌日に噴火を受けたシステムだ.
スキャン(1分)-命名(20分)-分類(10分)-割当(10分)
約40分の仕事で日常の仕事をしなければなりません.
三日ぐらいやっていると、構造的に仕事の効率が悪いと思います.
ネーミングの過程でOCR技術を使用することにした.

結果


まず、学院業務システムの応用に失敗した.
理由は大きく二つに分けられる.
  • 説得
  • 技術不足
  • 説得する


    Before



    After



    既存の写真構造でテストする場合、名前インデックスの位置はファイルによって異なる場合があります.
    例えば「D-??」空欄の生徒もいれば空欄の生徒の間に落書きの生徒もいる.
    変数を最小化するために、名前を書いた格子を一番左に移動すべきだと思います.
    院長を説得する過程で、当然OKが出るだろうと思っていたが、失敗した.
    このテクノロジーを適用する理由、既存の名前バーの位置を移動する理由など
    これは,既存の固着システムを変更したくない場合である.
    この問題を解決するために.
    私たちは正確な結果に基づいて相手を説得しなければならない.
    これは満足していないと思います.

    技術応用不足


    2番目の写真構造を使って、3つのバージョンの「チョン・ジェヒョン」をテストした.
    「名前/低A材料」「DATE」「n」のように結果が出た.
    例外処理による
  • 空難はAの
  • とされている
  • 「名称:」は、ブロック
  • とともに識別される.
  • 英語で始まる
  • の数字で始まる
  • 単字
  • その結果、インデックスの位置値を変更してインデックスの位置を検索します.
    例外処理をより詳細に行い、「名前値」を見つけることができると思います.
    今のところ、やっているプロジェクトは意味がないので、やめましょう.

    学識


    「開発はツール」


    開発者には有名な例があります.
    「遅いエレベーターの民怨をどう処理しますか?」
  • 改良技術
  • を採用
  • ドア前に鏡を貼る
  • もっと詳しく名前を抽出したいなら、どうすればいいですか?
  • ビッグデータ処理により同名名を抽出する確率を高める
  • .
    定期通知
  • 等原名は楷書で記入
    今のところ、2番が答えだと思います.
    開発者は、開発というツールを使用して問題を解決できます.
    彼は開発だけで問題を解決する人だとは思わない.

    「説得の大切さ」


    私が当たり前だと思っているのと違って、相手は逆だと思っているかもしれません.
    相手を説得するために、何を根拠に会話をしますか?
    相手に反感を持たせるために.
    「プロトタイプを改善するためには、構造を改善しなければならない」と急いで言った.
    簡単な理由で相手を楽にさせるのはいかがですか?
    そして私も自分の正しい結果を証明することができませんでした.
    自分で証明していないので、相手を説得できないと思います.

    だから。


    全部で3日かかるのは私にとって価値のある時間です.
    私は新しいAPIを応用して、私は長い間Pythonを使っていません.
    そして、視線の広がりがとても良かったです.
    どのような開発者になるべきですか?開発者は何をしていますか.
    時間の悩みに感謝します!

    問題解決中


  • 一次固定操作
    既存のKAKAO Vision API(OCR)の例としては、以下のものが挙げられる.
    sysでimage path、API KEYを受信
    1つのコード:画像をテストできます.
    新しいパラメータを定義し、def main()セクションを文処理します.
    複数枚の写真は1回の入力処理で処理できます.

  • kakao oce resize()>画像品質の低下
    調整時間が大きい場合、LIMIT BYTE=1024 x 1024は値として宣言される.
    上記変数を2048 x 2048に調整する画質が悪い現象があり、
    画質の改善を誘導した.

  • 両面スキャンファイル
    前と後ろの部分はファイルとされています.
    計画ごとに2つのファイルが生成されます.
    文間隔処理では、名前値(Name Value)のみがインデックスの正面ビューとして定義されます.
    次の章は、新しい名前の前の章に(1)を追加することで解決します.
  • Code

    import json
    import cv2
    from dotenv import load_dotenv
    import requests
    
    import os
    
    from sklearn.feature_extraction import image
    
    LIMIT_PX = 2048
    LIMIT_BYTE = 2048*2048  # 1MB / 기존 LIMIT_BYTE 값은 1024*1024 였는데 픽셀이 너무 깨져서 2048로 수정했는데 크기가 1mb 를 넘지 않아 적용된듯 함
    LIMIT_BOX = 40
    
    
    def kakao_ocr_resize(image_path: str):
        """
        ocr detect/recognize api helper
        ocr api의 제약사항이 넘어서는 이미지는 요청 이전에 전처리가 필요.
    
        pixel 제약사항 초과: resize
        용량 제약사항 초과  : 다른 포맷으로 압축, 이미지 분할 등의 처리 필요. (예제에서 제공하지 않음)
    
        :param image_path: 이미지파일 경로
        :return:
        """
        
    
        image = cv2.imread(image_path)
        height, width, _ = image.shape
    
        if LIMIT_PX < height or LIMIT_PX < width:
            ratio = float(LIMIT_PX) / max(height, width)
            image = cv2.resize(image, None, fx=ratio, fy=ratio)
            height, width, _ = height, width, _ = image.shape
    
            cv2.imwrite(image_path, image)
    
            return image_path
        return image_path
    
    
    def kakao_ocr(image_path: str, appkey: str):
        """
        OCR api request example
        :param image_path: 이미지파일 경로
        :param appkey: 카카오 앱 REST API 키
        """
        API_URL = 'https://dapi.kakao.com/v2/vision/text/ocr'
    
    
        headers = {'Authorization': 'KakaoAK {}'.format(appkey)}
    
        image = cv2.imread(image_path)
        jpeg_image = cv2.imencode(".jpg", image)[1]
        data = jpeg_image.tobytes()
    
    
        return requests.post(API_URL, headers=headers, files={"image": data})
    
    
    def main():
    
        # 보안상 API_KEY 를 환경변수 처리해주었다.
        load_dotenv()
        API_KEY = os.environ.get("API_KEY")
        appkey = API_KEY
    
        # image folder
        image_folder_path = "/Users/heyon/Desktop/JAY/Jay-Thomas-code/Project/ETOOS_OCR/image"
        image_folder_list = os.listdir(image_folder_path)
        # 현재 image_folder 배열형태 - 순서대로 나열되어있는 형태
        image_folder_list.sort()    
        
        # 이름 변경된 사진이 저장될 폴더
        saved_image_folder_path = "/Users/heyon/Desktop/JAY/Jay-Thomas-code/Project/ETOOS_OCR/saved_image"  
    
        # 파일 네이밍 시 접두사 부분에 날짜를 적어야했으므로 date 를 input 받아 파일명에 추가
        date = input("이름 앞에 붙을 날짜를 입력해주세요(ex. 20220701) : " )
    
    	# .DS_Store 예외처리, index 간격처리
        for image in range(1, len(image_folder_list), 2) : 
            
            # image file 의 경로가 들어와야함
            image_path = f"{image_folder_path}/{image_folder_list[image]}"  
            print(os.listdir(image_folder_path))
            print(f"image_path : {image_path}")
            resize_impath = kakao_ocr_resize(image_path)
            
            if resize_impath is not None:
                image_path = resize_impath
    
            output = kakao_ocr(image_path, appkey).json()
    
            # 5번 째 property 가 이름 value을 갖고있음
            OCR_result = output['result'][5] 
    
            print("[OCR] output:\n{}\n".format(json.dumps(output, sort_keys=True, indent=2, ensure_ascii=False)))
            # OCR_result.json file 중 0번째 index 가 이름 value
            student_name = OCR_result['recognition_words'][0]   
            print(student_name)
    
            # 첫 번째 파일의 이름을 json 파일에서 추출한 student_name 으로 선언하고
            # 이어서 두 번째 파일 이름을 첫 번째 파일에서 (1)을 더한 이름으로 선언
            os.rename((f"{image_folder_path}/{image_folder_list[image]}"), f"{saved_image_folder_path}/{date} {student_name}.jpg")
            os.rename((f"{image_folder_path}/{image_folder_list[image+1]}"), f"{saved_image_folder_path}/{date} {student_name}(1).jpg")
    
    
    if __name__ == "__main__":
        main()