Merge branch 'main' into pages
This commit is contained in:
@@ -220,6 +220,105 @@
|
||||
" time.sleep(2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d9b72506",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import tensorflow as tf\n",
|
||||
"from tensorflow import keras\n",
|
||||
"from tensorflow.keras import layers\n",
|
||||
"from PIL import Image\n",
|
||||
"import numpy as np\n",
|
||||
"import io\n",
|
||||
"\n",
|
||||
"# copied from value of characters variable in captcha_ocr.ipynb or captcha_ocr_trainAndSaveModel.ipynb\n",
|
||||
"characters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f']\n",
|
||||
"\n",
|
||||
"batch_size = 1\n",
|
||||
"\n",
|
||||
"img_width = 241\n",
|
||||
"img_height = 62\n",
|
||||
"\n",
|
||||
"downsample_factor = 4\n",
|
||||
"\n",
|
||||
"# copied from value of max_length variable in captcha_ocr.ipynb or captcha_ocr_trainAndSaveModel.ipynb\n",
|
||||
"max_length = 6\n",
|
||||
"\n",
|
||||
"char_to_num = layers.StringLookup(\n",
|
||||
" vocabulary=list(characters),\n",
|
||||
" mask_token=None)\n",
|
||||
"\n",
|
||||
"num_to_char = layers.StringLookup(\n",
|
||||
" vocabulary=char_to_num.get_vocabulary(),\n",
|
||||
" mask_token=None, invert=True)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def encode_single_sample(img_path):\n",
|
||||
" # 1. Read image\n",
|
||||
" img = tf.io.read_file(img_path)\n",
|
||||
" # 2. Decode and convert to grayscale\n",
|
||||
" img = tf.io.decode_png(img, channels=1)\n",
|
||||
" # 3. Convert to float32 in [0, 1] range\n",
|
||||
" img = tf.image.convert_image_dtype(img, tf.float32)\n",
|
||||
" # 4. Resize to the desired size\n",
|
||||
" img = tf.image.resize(img, [img_height, img_width])\n",
|
||||
" # 5. Transpose the image because we want the time\n",
|
||||
" # dimension to correspond to the width of the image.\n",
|
||||
" img = tf.transpose(img, perm=[1, 0, 2])\n",
|
||||
" # 7. Return a dict as our model is expecting two inputs\n",
|
||||
" return img\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def decode_batch_predictions(pred):\n",
|
||||
" input_len = np.ones(pred.shape[0]) * pred.shape[1]\n",
|
||||
" # Use greedy search. For complex tasks, you can use beam search\n",
|
||||
" results = keras.backend.ctc_decode(pred, input_length=input_len, greedy=True)[0][0][:, :max_length]\n",
|
||||
" # Iterate over the results and get back the text\n",
|
||||
" output_text = []\n",
|
||||
" for res in results:\n",
|
||||
" res = tf.strings.reduce_join(num_to_char(res)).numpy().decode(\"utf-8\")\n",
|
||||
" output_text.append(res)\n",
|
||||
" return output_text\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def load_model():\n",
|
||||
" _model = keras.models.load_model('model')\n",
|
||||
" model = keras.models.Model(\n",
|
||||
" _model.get_layer(name=\"image\").input,\n",
|
||||
" _model.get_layer(name=\"dense2\").output)\n",
|
||||
" return model\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def getTextInCaptchaImage(captchaImageFile):\n",
|
||||
" batchImages = getBatchImagesFromFile(captchaImageFile)\n",
|
||||
" preds = model.predict(batchImages)\n",
|
||||
" return decode_batch_predictions(preds)[0]\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def getBatchImagesFromFile(imageFile):\n",
|
||||
" return list(asDataset(imageFile).as_numpy_iterator())[0]\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def asDataset(imageFile):\n",
|
||||
" dataset = tf.data.Dataset.from_tensor_slices([imageFile])\n",
|
||||
" dataset = (\n",
|
||||
" dataset\n",
|
||||
" .map(encode_single_sample, num_parallel_calls=tf.data.AUTOTUNE)\n",
|
||||
" .batch(batch_size)\n",
|
||||
" .prefetch(buffer_size=tf.data.AUTOTUNE)\n",
|
||||
" )\n",
|
||||
" return dataset\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"print(\"loading model...\")\n",
|
||||
"model = load_model()\n",
|
||||
"model.summary()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
@@ -229,16 +328,16 @@
|
||||
"source": [
|
||||
"import os\n",
|
||||
"\n",
|
||||
"def getTextInCaptchaImage(captchaImageFile):\n",
|
||||
" baseDir = \"~/AndroidStudioProjects/TextRecognizer\"\n",
|
||||
" ! cp $captchaImageFile $baseDir/app/src/main/assets/captchas/captcha_image.jpeg\n",
|
||||
" ! cd $baseDir;./gradlew connectedAndroidTest\n",
|
||||
" textInCaptchaImage = ! adb shell \"run-as org.textrecognizer cat /data/data/org.textrecognizer/files/captcha_image.txt\"\n",
|
||||
" return textInCaptchaImage[0]\n",
|
||||
"#def getTextInCaptchaImage(captchaImageFile):\n",
|
||||
"# baseDir = \"~/AndroidStudioProjects/TextRecognizer\"\n",
|
||||
"# ! cp $captchaImageFile $baseDir/app/src/main/assets/captchas/captcha_image.jpeg\n",
|
||||
"# ! cd $baseDir;./gradlew connectedAndroidTest\n",
|
||||
"# textInCaptchaImage = ! adb shell \"run-as org.textrecognizer cat /data/data/org.textrecognizer/files/captcha_image.txt\"\n",
|
||||
"# return textInCaptchaImage[0]\n",
|
||||
" \n",
|
||||
"def solveCaptchaAndStartFileDownload(driver, captchaImageFile):\n",
|
||||
" saveCaptchaImageAs(driver, captchaImageFile)\n",
|
||||
" textInCaptchaImage = AndroidEmulator.run(lambda: getTextInCaptchaImage(captchaImageFile))\n",
|
||||
" textInCaptchaImage = getTextInCaptchaImage(captchaImageFile)\n",
|
||||
" display('textInCaptchaImage: ', textInCaptchaImage)\n",
|
||||
" driver.find_element(By.ID, \"verificationCode\").send_keys(textInCaptchaImage)\n",
|
||||
" driver.find_element(By.CSS_SELECTOR, '[name=\"downloadbut\"]').click()\n",
|
||||
|
||||
Reference in New Issue
Block a user