OpenCV学習メモ 画像認識でPDF図面から特定の部品を含むものを判定する

## やりたいこと
古い図面群(PDF)から過去の特注仕様を調べることが多いので、この目視作業をやめたい。減らしたい。

画像認識的なやつでこんなことができたらと思って始めてからの学習メモを育てていく。

- 特注仕様(姿図や記号、文字列)を図番ごとに分類
- 指定の特注仕様(姿図や記号、文字列)を持つ図面を発掘

## やること・やったこと

取り消し線引いてないやつは未完

1. ~~何のこっちゃからネットコピペで体験(GoogleColab)~~
1. ~~カスケード分類器を自作する(VSCode createsamples.exe)~~
1. PDFの読み込みと評価
    1. ~~PDF→JPEGに変換~~
    1. 変換後のJPEGを探索
1. 判定結果を返す
1. 複数ファイルを巡回
1. 複数条件で巡回

## 各項目
### 何のこっちゃからネットコピペで体験
この記事のとおりにやったらまあできた（顔認証のところまで）

GoogleColabの導入から懇切丁寧なのでマジで助かる

https://www.codexa.net/opencv_python_introduction/

GitHubからxmlファイルをDLする時、一覧からだと後々xml読み込みエラーになった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/6d8ffa8c-a6e1-5ed8-e147-af07a7ed67fb.png)

一覧から開いてRowのボタンを右クリック>保存
とすると上手くいった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/2acc030c-a909-4ed7-6ab2-c3faccb785fd.png)


ここまでやってきたのはどうやら**既存のカスケード分類器**なるものを使って画像を評価しにいってるっぽい

やりたいことは顔や目などの分類器から顔認証的なことではなく、図面の特定の部位の姿図や記号を分類器として図面内を探索、判定していくことなので、次に手を付けるべきは**分類器の作成**かな

### カスケード分類器を自作する
https://www.pc-koubou.jp/magazine/21280

#### createsamples.exe欲しさにGoogleColabではなくローカル版OpenCVをDL

##### 最新版(ver.4.6.0)だとそれが無い・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/c2682b16-c98b-55b1-cbdd-b6e6de4ff588.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/b2bdc445-ee59-cee5-9cab-916571d5c562.png)

#### ver.3.4.16にはあった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/3b2051f7-d2e9-603a-cac4-e8dd11ea60a6.png)

#### NGリストのファイル名はng.listではなくnglist.txt
cmdで読み込むこの部分に合わせる（or作成したNGリストのファイル名と保存先をcmd側で変える）

> opencv_traincascade.exe -data ./cascade/ -vec ./test.vec -bg ./ng/**nglist.txt** -numPos 800 -numNeg 40

#### cascade.pyに食わせるxmlファイルのパスはフルパス？
これを
``` python:cascade.py
custom_cascade = cv.CascadeClassifier('cascade.xml')
```

こうしたら
``` python:cascade.py
custom_cascade = cv.CascadeClassifier(r"C:\Users\hoge\OpenCV\cv\cascade\cascade.xml")
```

できて・・・ない・・・（矩形の色を水色にした）

右の方誤検出ばっかりすごいけど・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/c80fa3dc-df64-6cd8-c8e7-51c61c0f488e.png)

分類器の作り方が悪いのかな・・・
このあたりの作り込みは素材集めと根気の作業になるっぽいのでいったんパス。
相手はモノクロの2D図面だしね。

### PDFの読み込みと評価

ここまではjpgやpngといった画像ファイルを扱ってきたが、本番の相手はpdf。
どうやってOpenCVに食わせるか

1. pdfを画像に変換して食わせる
1. pdfのまま食わせる

できれば変換なしそのまま食わせたい気もするがとりあえずググった。

#### pdfを画像に変換して食わせるパターン 
https://x1freeblog.com/%E3%80%90python%E3%80%91pdf%E3%82%92opencv%E3%81%A7%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81/965/

https://qiita.com/Kazuhito/items/8a626c12278a21e75a20

https://dev.classmethod.jp/articles/export-text-data-from-image-using-python/

##### 前処理としてPDFを画像として大量に保存しとく用

検索したい部品ごとに毎回変換するの面倒そうだなーと思ったので前処理はまとめてやっといた方が良いかも。

https://x1freeblog.com/%e3%80%90python%e3%80%91pdf%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e7%94%bb%e5%83%8f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/541/

フォルダを2つ作成しておく
- in_pdf
- out_image

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/deaab0d0-1be9-b805-38dc-2be1c4d0ffa8.png)



#### pdfのまま食わせるパターン

ない・・・？

ヒットしない・・・というか変換パターンが上位に来まくってる時点でこのパターンは少なくともメジャーではない？
今日のところは変換パターンでやろう・・・