How do I tune the OpenALPR performance? - image-processing

I've tried OpenALPR on the demo website at http://www.openalpr.com/cloud-api.html using this image: https://drive.google.com/open?id=1e6SgMP1leghV9TZfrRZ1Ivb2VrgKwcR9 and it worked really well! I then downloaded and installed OpenALPR (2.2.4) on my Ubuntu system(16.04) and used the same image, but on my system the LPs are not recognized well at all, why this difference?
Thanks!
I have not changed the /etc/openalpr/openalpr.conf
Results
openalpr website (http://www.openalpr.com/cloud-api.html)
All three LPs visible are correctly recognized, interpreted & displayed:
15451BB
FRJ7248
DUS4092
openalpr on my local system(same image):
Only the DUS4092 LP is recognized correctly (when not with the best confidence score either), the other ones are not recognized correctly at all!:
plate0: 10 results
- F7Z3 confidence: 79.5944
- F7Z43 confidence: 78.4474
- F7Z4 confidence: 77.4031
- 7Z43 confidence: 75.1095
- F7ZS confidence: 74.0161
- F723 confidence: 73.8868
- FR7Z3 confidence: 73.124
- F7Z4S confidence: 72.8691
- F7243 confidence: 72.7398
- FR7Z confidence: 72.0797
plate1: 10 results
- DUS409Z confidence: 91.418
- DUS4092 confidence: 89.1234
- 0US409Z confidence: 88.8466
- 0US4092 confidence: 86.552
- OUS409Z confidence: 86.3993
- QUS409Z confidence: 86.1586
- BUS409Z confidence: 84.562
- OUS4092 confidence: 84.1047
- QUS4092 confidence: 83.864
- DUS4O9Z confidence: 83.5082
plate2: 6 results
- 4535 confidence: 84.1997
- 4585 confidence: 75.1175
- 45S5 confidence: 69.7395
- 4S35 confidence: 61.4974
- 4S85 confidence: 52.4152
- 4SS5 confidence: 47.0372
How can I tune up the system to match the performance on the demo site?

The opensource version is not so accurate. But you can use more training data to make the recognition much more precise.
Please refer this link for more details
Detector training
Tesseract training

Related

Handling Xarray/Dask Memory

I'm trying to use Xarray and Dask to open a multi-file dataset. However, I'm running into memory errors.
I have files that are typically this shape:
xr.open_dataset("/work/ba0989/a270077/coupled_ice_paper/model_data/coupled/LIG_coupled/outdata/fesom//LIG_coupled_fesom_thetao_19680101.nc")
<xarray.Dataset>
Dimensions: (depth: 46, nodes_2d: 126859, time: 366)
Coordinates:
* time (time) datetime64[ns] 1968-01-02 1968-01-03 ... 1969-01-01
* depth (depth) float64 -0.0 10.0 20.0 30.0 ... 5.4e+03 5.65e+03 5.9e+03
Dimensions without coordinates: nodes_2d
Data variables:
thetao (time, depth, nodes_3d) float32 ...
Attributes:
output_schedule: unit: d first: 1 rate: 1
30 files --> 41.5 GB
I also can set up a dask.distributed Client object:
Client()
<Client: 'tcp://127.0.0.1:43229' processes=8 threads=48, memory=68.72 GB>
So, if I suppose there is enough memory for the data to be loaded. However, when I then run xr.open_mfdataset, I very often get these sorts of warnings:
distributed.worker - WARNING - Memory use is high but worker has no data to store to disk. Perhaps some other process is leaking memory? Process memory: 8.25 GB -- Worker memory limit: 8.59 GB
I guess there is something I can do with the chunks argument?
Any help would be very appreciated; unfortunately I'm not sure where to begin trying. I could, in principle, open just the first file (they will always have the same shape) to figure out how to ideally rechunk the files.
Thanks!
Paul
Examples of the chunks and parallel keywords to the opening functions, which correspond to how you utilise dask, can be found in this doc section.
That should be all you need!

Numerical Stable way of implement norm2 loss function

I have a loss function mean{|| x^i - y^i ||^2} where x^i is i-th data point. || x^i - y^i ||^2 = sum_j (x^i_j - y^i_j)^2. (where x^i_j is the i-th data point's j-th variable)
I could easily have one of (x^i_j - y^i_j)^2 explodes up to inf
My alternative is to logsumexp(2 * log(abs(x^i_j - y^i_j))) to deal with norm2 but I could also have x^i_j - y^i_j to be zero. Is there numerical stable way of doing this ?
I tried logsumexp(2 * log(abs(x^i_j - y^i_j) + 1e-20)) but no very good as I need differentiate this loss function backwards so the gradient still gives Nan sometimes

Does machine learning framework caffe support different data type precisions?

I am currently playing with the CaffeNet C++ image classification example. By default, this example using float. And here were the results I got:
--cat--
Classification time: 0.8267 seconds
0.3134 - "n02123045 tabby, tabby cat"
0.2380 - "n02123159 tiger cat"
0.1235 - "n02124075 Egyptian cat"
0.1003 - "n02119022 red fox, Vulpes vulpes"
0.0715 - "n02127052 lynx, catamount"
--dog--
Classification time: 0.8259 seconds
0.4228 - "n02106662 German shepherd, German shepherd dog, German police dog, alsatian"
0.1344 - "n02109961 Eskimo dog, husky"
0.0914 - "n02091467 Norwegian elkhound, elkhound"
0.0642 - "n02110063 malamute, malemute, Alaskan malamute"
0.0532 - "n02110185 Siberian husky"
After I changed every float to double in classification.cpp. I was hoping I could get similar accuracy with longer computation time. However, I did get longer computation time, but it seems the network no longer works since the accuracy does not look right.
--cat--
Classification time: 1.0368 seconds
0.0015 - "n04435653 tile roof"
0.0015 - "n04209239 shower curtain"
0.0014 - "n03530642 honeycomb"
0.0014 - "n03729826 matchstick"
0.0014 - "n04033901 quill, quill pen"
--dog--
Classification time: 1.0506 seconds
0.0015 - "n04435653 tile roof"
0.0015 - "n04209239 shower curtain"
0.0014 - "n03530642 honeycomb"
0.0014 - "n03729826 matchstick"
0.0014 - "n04033901 quill, quill pen"
I am wondering does Caffe framework support different data type precisions at all? Is that because the network was trained by using float, so it won't work with other data type precisions?
Thanks.
The mean file and the trained parameter you are using in the tutorial are stored in single precision values. Changing float to double in the program does not change the stored values, thus trying to read stored single-precision values as double-precision results with you reading "garbage". You'll have to manually convert the files to double precision values

How to get the momentum term in a neural network in optim

|I have a neural network in torch7 and would like to check how the momentum of the neural network is developing, this because I want to modify/reduce it because I want to do some extra processing with the values and need the velocity term in order to do that.
So I have something like the following code:
for t = 1, params.num_iterations do
local x, losses = optim.adam(feval, img, optim_state)
img=postProccess(img,content_imageprep,params)
print(velocity) -- how?
end
And would like to see what the velocity is doing. Anybody know how to do this?
Printing the optim_state gives me the following output
v : CudaTensor - size: 1327104
m : CudaTensor - size: 1327104
learningRate : 10
denom : CudaTensor - size: 1327104
t : 4
but I'm now sure if and if so what term represents the velocity, anybody know?
You won't find the value of the momentum in the state argument but in the config argument (which is absent in your function call, then the momentum value will be equal to its default value, i.e 0.9 for beta1 and 0.999 for beta2.
Have a look at the source code https://github.com/torch/optim/blob/master/adam.lua#L24

Why does Mahout RMSRecommenderEvaluator evaluate method sometimes results NaN?

Im trying to evaluate my recommendation system using the following code
RecommenderEvaluator rmsEvaluator = new RMSRecommenderEvaluator();
double score = rmsEvaluator.evaluate(recommenderBuilder, null, model, 0.95, 0.05);
System.out.println("RMS Evaluator Score: " + score);
Some time the score is NaN.
Why does Mahout RMSRecommenderEvaluator evaluate method results NaN?
Maybe your dataset is to small to have meaningful results.

Resources