<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Alicey's blog</title><link>https://blog.alicey.dev/tags/python/</link><description>Recent content in Python on Alicey's blog</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Fri, 17 Feb 2023 23:53:55 +0900</lastBuildDate><atom:link href="https://blog.alicey.dev/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>DockerでDjango(SQLite)な開発環境を用意する</title><link>https://blog.alicey.dev/2021/08/dockerdjangosqlite.html</link><pubDate>Thu, 19 Aug 2021 02:56:00 +0900</pubDate><guid>https://blog.alicey.dev/2021/08/dockerdjangosqlite.html</guid><description>&lt;h1> DockerでDjango(SQLite)な開発環境を用意する&lt;/h1>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/16ac204b04f823bb_hu12709945454257530165.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/16ac204b04f823bb_hu12709945454257530165.webp"
 alt=""
 width="1002"
 height="420"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;/div>&lt;div>今回は、Pythonで実装されたWebフレームワークの1つである、DjangoをDockerコンテナ上で動かす環境を作っていきます。環境は以下のようになっています。本来であれば&lt;b>コンテナはなるべく軽く&lt;/b>、&lt;b>1コンテナ1アプリケーション&lt;/b>構成で作るべきだとは思いますが、今回は開発しやすさを優先して構築しています。&lt;/div>&lt;div>DBにSQLiteを利用していることや、Shellにexecして作業しているのもこの為で、コンテナに馴染みのない人でもわかりやすいことや、開発時のDBを共有しやすくするためにこの構成にしています。&lt;/div>&lt;div>もっとコンテナの特徴を生かした構成にしたい場合や、本番環境で利用したい場合は他のサイト(&lt;a href="https://docs.docker.jp/compose/django.html" rel="nofollow" target="_blank">ドキュメン&lt;/a>ト等)をご覧ください。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>Dockerバージョン&lt;/div>&lt;div>&lt;ul>&lt;li>Docker version 20.10.7, build f0df350&lt;/li>&lt;/ul>&lt;div>入れるもの&lt;/div>&lt;/div>&lt;div>&lt;ul>&lt;li>Python3.9.6&lt;/li>&lt;li>Django3.2.5&lt;/li>&lt;li>SQLite3&lt;/li>&lt;li>その他使うもの(vim, lessなど)&lt;/li>&lt;/ul>&lt;div>&lt;br>&lt;/div>&lt;/div>&lt;div>今回作成したファイルは&lt;a href="https://github.com/Alicey0719/pythonDjangoDevelopEnv" target="_blank">GitHub&lt;/a>に掲載しています。&lt;/div>&lt;div>git cloneしていただければ、そのまま動くと思います。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;h2>使い方&lt;/h2>&lt;div>まず、git cloneでGitHubからファイルを落とします。(コードをコピペしても動きます)&lt;/div>&lt;div>&amp;gt; git clone https://github.com/Alicey0719/pythonDjangoDevelopEnv.git&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/6e9e7390875fbf04_hu6322068163805801501.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/6e9e7390875fbf04_hu6322068163805801501.webp"
 alt=""
 width="779"
 height="231"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>次に、落ちてきたディレクトリに移動し、start.shを起動します。&lt;/div>&lt;div>この際、Dockerが起動していないと動かないので注意しましょう。&lt;/div>&lt;div>&amp;gt; cd pythonDjangoDevelopEnv/&lt;/div>&lt;div>&amp;gt; sh start.sh &lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/b700e8778a764a71_hu7159808751559793198.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/b700e8778a764a71_hu7159808751559793198.webp"
 alt=""
 width="853"
 height="826"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>すると構築が始まり、しばらくすると...&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/9f4177a23a76194d_hu8311664410722720216.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/9f4177a23a76194d_hu8311664410722720216.webp"
 alt=""
 width="851"
 height="95"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>コンテナのシェルに接続されます。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/3f0c00070dc57806_hu17742677800450812187.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/3f0c00070dc57806_hu17742677800450812187.webp"
 alt=""
 width="390"
 height="450"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>意図された環境が構築されています。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;h2>記述されている内容の解説&lt;/h2>&lt;div>1つずつ順に見ていきます。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;h3>&lt;/h3>&lt;h3>&lt;ul>&lt;li>docker-compose.yml&lt;/li>&lt;/ul>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/8086075dc329e79c_hu13179720913116256235.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/8086075dc329e79c_hu13179720913116256235.webp"
 alt=""
 width="479"
 height="307"
 loading="lazy" decoding="async">
 &lt;/a>&lt;div>&lt;br>&lt;/div>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">ここでは、起動するコンテナの設定を記述することができます。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">4行目から見ていきましょう。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">4行目では、サービスの名称を"python-django"(任意の名前)と定義しています。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span>&lt;span style="font-weight: 400">5行目では、build(&lt;/span>&lt;/span>&lt;span style="font-weight: 400">ComposeFileを実行し、ビルドされるときのpath&lt;/span>&lt;span style="font-weight: 400">)するものに対して"."を指定しています。&lt;/span>&lt;span style="font-weight: 400">これはカレントディレクトリを示し、そこに置かれているDockerfileが対応します。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">6行目では、container_nameを指定しています。そのまんまですねｗ コンテナの名前(任意)です。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">7行目では、stdin_openを指定しています。これは、&lt;/span>&lt;span style="font-weight: 400">コンテナの標準入力をオープンしたままにします。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">8行目では、ttyをtrueにしています。これはコンテナに擬似TTYを割り当てています。これにより、コンテナが自動的に正常終了することを防ぎ、起動したままの状態を作ることができます。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">9,10行目では、Volumesの設定をしています。これは、コンテナ内の/codeとホストPCの./codeを同一のものとして扱うような設定となります。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">11,12行目では、Portの割り当てをしています。これにより、コンテナ内の8000ポートとホストPCの8000&lt;/span>&lt;span style="font-weight: 400">ポートを同一のものとして扱えます。よって、ホストPCからlocalhost:8000のように指定すると、コンテナ上のサーバにアクセスできるようになります。&lt;br>&lt;br>&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">※djangoを実行する際に&lt;u>python3 manage.py runserver &lt;span style="color: red">0:8000&lt;/span>&lt;/u>と指定しないとコンテナ外からアクセスできません。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">&lt;br>&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">より正確で詳しい説明はリファレンスを御覧ください。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">&lt;br>&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: medium; font-weight: 400">&lt;br>&lt;/span>&lt;/div>&lt;ul>&lt;li>Dockerfile&lt;/li>&lt;/ul>&lt;div>&lt;div class="separator">&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/9a896e9b8d5a27c3_hu15752551789585350237.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/9a896e9b8d5a27c3_hu15752551789585350237.webp"
 alt=""
 width="509"
 height="217"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;/div>&lt;span style="font-size: small; font-weight: 400">docker-composeのbuildで呼ばれているものになります。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">1行目のFROMでは利用するイメージを指定しています。今回はPython3.9.6を利用します。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span>&lt;span style="font-weight: 400">2行目では、Pythonの環境変数を指定しています。(&lt;/span>&lt;/span>&lt;span style="font-weight: 400">非空なら標準出力・標準エラーのストリームのバッファリングを行わない&lt;/span>&lt;span style="font-weight: 400">)&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">3,4行目ではcodeディレクトリを作成し、それをワーキングディレクトリに設定しています。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">5行目では、ホストPCにあるrequirements.txtをコンテナ内のcodeディレクトリにコピーしています。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small; font-weight: 400">6行目でaptのパッケージ一覧を更新し、&lt;/span>&lt;span style="font-size: medium; font-weight: 400">aptでインストールするものを記述しています。(sqlite3とかvimとか) コンテナのお作法的には、apt install 後にapt cleanなどでアーカイブファイルを削除しコンテナを軽量化することが多いです(&lt;a href="https://docs.docker.jp/engine/articles/dockerfile_best-practice.html" rel="nofollow" target="_blank">参考&lt;/a>)。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">7行目で、pipをアップグレードして、8行目で&lt;/span>&lt;span style="font-weight: 400">requirements.txtにかかれているものを、pipでインストールしています。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">&lt;br>&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">本来であれば、コンテナはアプリケーションが主役であり、1コンテナ1アプリケーション等、軽い構成で作るべきだと思いますので、上記のようにアレコレ入れないほうが良いとは思います。が、作業効率化の為導入しました...&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">また、継続して利用するものであれば、なるべく全てのものに関してバージョンの固定を行うべきだと思います。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;ul>&lt;li>requirements.txt&lt;/li>&lt;/ul>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/98cdaf4fa1a821eb_hu15256599815183760606.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/98cdaf4fa1a821eb_hu15256599815183760606.webp"
 alt=""
 width="255"
 height="139"
 loading="lazy" decoding="async">
 &lt;/a>&lt;span style="font-size: small; font-weight: 400">pipでインストールするものの一覧です。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">Djangoの3.2.5やその他使いそうなものを書いていきます。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: 400">各々使用するものを入れましょう。&lt;/span>&lt;/span>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;ul>&lt;li>start.sh&lt;/li>&lt;/ul>&lt;div>&lt;a href="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/a07f6661f2a2bcbf_hu9786989542199976294.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/08/dockerdjangosqlite/img/a07f6661f2a2bcbf_hu9786989542199976294.webp"
 alt=""
 width="501"
 height="112"
 loading="lazy" decoding="async">
 &lt;/a>&lt;span style="font-size: small; font-weight: normal">start.shではDockerコンテナを構築・起動し、シェルへ接続するまでの作業を1つで行うシェルスクリプトです。&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: normal">まず docker-compose up -d でdocker-compose.ymlファイルを元にコンテナを起動します。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: normal">この操作が成功した場合に&amp;amp;&amp;amp;の右側に書かれたコードが実行されます。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: normal">右側のコードでは、docker exec -it でpython-djangoという名前のコンテナのシェルに接続しています。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: normal">コンテナ起動時に実行するとそのままシェルに入ることができます。&lt;/span>&lt;/span>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;span style="font-size: small">&lt;span style="font-weight: normal">&lt;br>&lt;/span>&lt;/span>&lt;/div>&lt;div>参考文献&lt;/div>&lt;div>&lt;ul>&lt;li>&lt;a href="https://docs.docker.jp/compose/django.html" rel="nofollow" style="font-weight: normal" target="_blank">&lt;span style="font-size: small">クィックスタート: Compose と Django&lt;/span>&lt;/a>&lt;/li>&lt;li>&lt;a href="https://zenn.dev/hohner/articles/43a0da20181d34" rel="nofollow" style="font-weight: normal" target="_blank">&lt;span style="font-size: small">DockerのTTYって何?&lt;/span>&lt;/a>&lt;/li>&lt;li>&lt;a href="https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04" rel="nofollow" style="font-weight: normal" target="_blank">&lt;span style="font-size: small">docker-compose.ymlの書き方について解説してみた&lt;/span>&lt;/a>&lt;/li>&lt;/ul>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;/h3></description></item><item><title>PythonとOCRで数字を振り分け - 2</title><link>https://blog.alicey.dev/2021/06/pythonocr-2.html</link><pubDate>Sun, 27 Jun 2021 23:53:00 +0900</pubDate><guid>https://blog.alicey.dev/2021/06/pythonocr-2.html</guid><description>&lt;h1>  PythonとOCRで数字を振り分け - 2&lt;/h1>&lt;div>&lt;br>&lt;/div>&lt;h2>はじめに&lt;/h2>&lt;div>前回(&lt;a href="https://blog.alicey.dev/2021/06/pythonocr.html" target="_blank">こちら&lt;/a>)の続きです。結果を見ていると、どうも7のフォルダに7と空白(真っ白)の画像が多く分類されてしまうことがわかりました。これでは、学習データとして使用するにも不便です。&lt;/div>&lt;div>&lt;div class="separator">&lt;br>&lt;/div>&lt;div class="separator">&lt;a href="https://blog.alicey.dev/2021/06/pythonocr-2/img/05b531366182c543_hu9791591866846304080.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/06/pythonocr-2/img/05b531366182c543_hu9791591866846304080.webp"
 alt=""
 width="1323"
 height="789"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;br>&lt;/div>そこで今回は、これらの空白画像を別のフォルダに移動するアプローチを考えていきます。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;h2>どうするの？&lt;/h2>&lt;div>そもそも、画像データというのは、（pngやjpgなどは圧縮されバイナリ化されてますが、考え方としては、各場所、各色の明るさを示す）数値の集まりです。配列があり、座標に該当する場所に色コードが格納されている...といえば良いのでしょうか？&lt;/div>&lt;div>大きさが10*10の画像が在るとすれば、一番左上の画素はpic[0][0]、右下の画素は[9][9]のようになり、それぞれに値としてRGB(255,255,255)のように格納されています。今回はこれを活用します。&lt;/div>&lt;div>今回の画像は白黒ですので、グレースケールとして読み込み、それぞれの値をRGB(255,255,255)ではなく、明るさのみの(0)から(255)のデータにします。&lt;/div>そして、これらデータが格納されている配列の最小値が230(任意の値)より多きければその画像は真っ白である。と考えることにしましょう。&lt;/div>&lt;div>ここまでくれば簡単です。上記に一致する際にファイルを移動するだけ。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;h2>実際のコード&lt;/h2>&lt;div>これを実際にコーディングしてみました。&lt;/div>&lt;div>処理には主にopenCVとnumpyを利用しています。&lt;/div>&lt;div>コードは&lt;a href="https://github.com/Alicey0719/writeImageCheck" target="_blank">GitHub&lt;/a>に掲載します。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;h2>結果&lt;/h2>&lt;div>結果としては、まずまず良い出来でした。&lt;/div>&lt;div>2-3枚の取りこぼしはありましたが、ほぼほぼ移動することに成功しました。&lt;/div>&lt;div>その数なんと約2000枚。これを手動でやったら大変です。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;a href="https://blog.alicey.dev/2021/06/pythonocr-2/img/027f1a3177989c7f_hu14206946196782596018.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/06/pythonocr-2/img/027f1a3177989c7f_hu14206946196782596018.webp"
 alt=""
 width="366"
 height="263"
 loading="lazy" decoding="async">
 &lt;/a>&lt;div class="separator">&lt;br>&lt;/div>&lt;div class="separator">&lt;a href="https://blog.alicey.dev/2021/06/pythonocr-2/img/28532950a6f289fb_hu2800102970389553289.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/06/pythonocr-2/img/28532950a6f289fb_hu2800102970389553289.webp"
 alt=""
 width="1307"
 height="736"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;br>&lt;/div>&lt;br>&lt;/div>&lt;h2>まとめ&lt;/h2>&lt;div>今回の空白画像の振り分けはうまくいったと思います。&lt;/div>&lt;div>特に、同じようなデータが大量にある際は、プログラムを書いたほうが楽で速いということを改めて実感しました。&lt;/div>&lt;div>またこのような問題があれば記事にしたいと思います。&lt;/div>&lt;div>それでは&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>ばいち&lt;/div></description></item><item><title>PythonとOCRで数字を振り分け</title><link>https://blog.alicey.dev/2021/06/pythonocr.html</link><pubDate>Thu, 10 Jun 2021 23:41:00 +0900</pubDate><guid>https://blog.alicey.dev/2021/06/pythonocr.html</guid><description>&lt;h1> PythonとOCRで数字を振り分け&lt;/h1>&lt;div>とある作業で、数字が書かれた画像を数万ファイル振り分けなければいけなくなった。&lt;/div>&lt;div>手作業でやるのは.....流石にダルいため、PythonとOCRを利用し、どこまで仕分けできるかやってみることにした。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;h3>結論&lt;/h3>&lt;div>あまり精度が良くない。&lt;/div>&lt;div>私のやり方や、数字が書かれた画像データの解像度、背景色など、さまざまな要因は在ると思うが、あまり精度が良くない、という結果に終わった。&lt;/div>&lt;div>特に3,4,7あたりが怪しく、0や8はほぼほぼ正解しているというような結果であった。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>0のフォルダ&lt;/div>&lt;div>&lt;div class="separator">&lt;a href="https://blog.alicey.dev/2021/06/pythonocr/img/367676f97d99edf4_hu5795718334090095031.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/06/pythonocr/img/367676f97d99edf4_hu5795718334090095031.webp"
 alt=""
 width="1224"
 height="642"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;br>&lt;/div>&lt;div class="separator">&lt;br>&lt;/div>&lt;div class="separator">3のフォルダ&lt;/div>&lt;a href="https://blog.alicey.dev/2021/06/pythonocr/img/759013a7c9bc45ae_hu12725312635091612360.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/06/pythonocr/img/759013a7c9bc45ae_hu12725312635091612360.webp"
 alt=""
 width="1221"
 height="637"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;br>&lt;div class="separator">&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>しかし、数万件手作業で振り分けるよりは効率が良いようにも思える。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;h3>方法&lt;/h3>&lt;/div>&lt;div>今回は、Python, PyOCR, &lt;span face='-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"' style="color: #24292e; font-size: 16px">Tesseractを用いた方法で分類した。&lt;/span>&lt;/div>&lt;div>&lt;span face='-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"' style="color: #24292e; font-size: 16px">&lt;br>&lt;/span>&lt;/div>&lt;div>ソースコードはこちら: &lt;a href="https://github.com/Alicey0719/numOcr" target="_blank">GitHub&lt;/a>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>仕組みは簡単で、ソースフォルダ内にある画像を全て読み取り、OCRで読み取ったテキストが、フォルダが用意されているものであればそのフォルダに振り分ける、用意されていなければOtherフォルダに入れる。&lt;/div>&lt;div>それだけである。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>今回数字を抽出するに当たり、英語ベースでの識字をしている。これは日本語に比べ英語が文字数が少ないことから誤認識の確率を減らす効果があると思われる。&lt;/div>&lt;div>また、tesseract_layoutを8にすることで、画像を1つの単語として扱っている。&lt;/div>&lt;div>&amp;gt; tesseract --help-psm&lt;/div>&lt;div>&lt;a href="https://blog.alicey.dev/2021/06/pythonocr/img/1158d278d96a18aa_hu10133408608751680284.webp" class="lightbox-trigger">
 &lt;img src="https://blog.alicey.dev/2021/06/pythonocr/img/1158d278d96a18aa_hu10133408608751680284.webp"
 alt=""
 width="657"
 height="293"
 loading="lazy" decoding="async">
 &lt;/a>&lt;br>&lt;br>&lt;/div>&lt;h3>まとめ&lt;/h3>&lt;div>以上が実験の結果である。&lt;/div>&lt;div>使えなくはないが、常用するツールではない。そんな印象である。&lt;/div>&lt;div>自分の用途に合った文字データを学習させることで、より精度の高いOCRができる可能性があるため、またトライしてみたいと思う。&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>また、この技術は先日話題になっていた、ワクチン用冷蔵庫の監視をWebカメラで行うというものでも活用でき、冷蔵庫に監視するような機能がなくとも、カメラで取得した画像をOCRで値にし、サーバに送信することで、異常値が出たらアラートを出すといった対応もできる、非常に有用な技術だと思われる。OCRは印刷物をコピペできるようにするためだけのものじゃない！すごい！&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>続:  &lt;a href="https://blog.alicey.dev/2021/06/pythonocr-2.html" target="_blank">PythonとOCRで数字を振り分け-2&lt;/a>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>参考&lt;/div>&lt;div>&lt;ul>&lt;li>&lt;a href="https://qiita.com/nabechi6011/items/3a367ca94dbd208efcc7" target="_blank">Tesseract+PyOCRで簡易OCRを試してみる&lt;/a>&lt;/li>&lt;li>&lt;a href="https://qiita.com/d_m/items/4690aa9f03bb13bf1d21" target="_blank">[Python]グラフ画像内の数字をOCRで取得する&lt;br>&lt;/a>&lt;/li>&lt;/ul>&lt;div>&lt;span style="color: #0000ee">&lt;u>&lt;br>&lt;/u>&lt;/span>&lt;/div>&lt;div>&lt;span style="color: #0000ee">&lt;u>&lt;br>&lt;/u>&lt;/span>&lt;/div>&lt;div>&lt;span style="color: #0000ee">&lt;u>&lt;br>&lt;/u>&lt;/span>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>ばいち&lt;/div>&lt;br>&lt;/div></description></item></channel></rss>