Hi Tairen, the error is quite clear: Must provide a --traineddata see training wiki
You say that it works if you run it as a single line so I suppose there is something wrong in the make file, probably a typo. Maybe there is a space or a tab after a "\" ? Maybe there are some extra characters from copy and paste from an email. The traineddata option is on the third line it is likely something on line 2 or 3. If you cannot find the problem checkout the project again and start over. Run it after any single change you do to see if/when it breaks. Lorenzo Il giorno gio 2 mag 2019 alle ore 23:48 Tairen Chen <chentai...@gmail.com> ha scritto: > Hi, Lorenzo and Shree > > Thanks for your sharing. > I am trying to repeat what you have done here. > I followed your posts and change the Makefile, but when I run $ make > training, > I got the following errors: > mkdir -p data/checkpoints > lstmtraining \ > > --continue_from extracted/eng.lstm \ > --old_traineddata extracted/eng.traineddata \ > --traineddata data/eng/eng.traineddata \ > --model_output data/checkpoints/eng \ > --debug_interval -1 \ > --train_listfile data/list.train \ > --eval_listfile data/list.eval \ > --sequential_training \ > --max_iterations 3000 > > Must provide a --traineddata see training wiki > Makefile:111: recipe for target 'data/checkpoints/eng_checkpoint' failed > make: *** [data/checkpoints/eng_checkpoint] Error 1 > > > However, I can manually run $lstmtraining --traineddata > data/eng/eng.traineddata --continue_from extracted/eng.lstm > --old_traineddata extracted/eng.traineddata --model_output > data/checkpoints/eng --debug_interval -1 --train_listfile > data/list.train --eval_listfile data/list.eval --sequential_training > --max_iterations 3000 > > I don't know where to change and I am new to Tesseract and same > with Makefile. Please share your wisdom. > Thank you! > All the best, > Tairen > > On Friday, June 29, 2018 at 11:17:35 AM UTC-7, Lorenzo Blz wrote: >> >> >> I think I found the problem. Running directly the new Makefile I had this >> error: >> >> make: *** No rule to make target >> 'data/train/alexis_ruhe01_1852_0018_022.box', needed by 'data/all-boxes'. >> Stop. >> >> The problem was a "-gt.txt" rather than a ".gt.txt" as in my train files. >> Now I can run your script directly. >> >> I also replaced the eng.traineddata with the one from here: >> >> https://github.com/tesseract-ocr/tessdata_best >> >> and it's training correctly. (it works correctly even with the previous >> model, from https://github.com/tesseract-ocr/tessdata). >> >> >> >> One more question: I wanted to check if the output character set of the >> new and old model differ. I used: >> >> combine_tessdata -u eng.traineddata orig >> >> on both models and compared the unicharset files. I see that some >> characters are missing and some others are added. It looks good. Is this >> the correct way to check this? >> >> In this way can I train a model that, for example, only recognize >> uppercase characters, or numbers, simply by providing only uppercase >> training data? Or is there something else to configure? >> >> >> Thanks, bye >> >> Lorenzo >> >> >> 2018-06-29 18:27 GMT+02:00 Shree Devi Kumar <shree...@gmail.com>: >> >>> You should be able to use the new makefile after you make changes for >>> all the directory locations to match your setup. >>> >>> Change the language from frk to eng, though the sample training text >>> seems to be non-english. In which case it is better for you to use the >>> appropriate language traineddata eg. tessdata_best/deu.traineddata for >>> German. >>> >>> On Fri, Jun 29, 2018 at 9:03 PM Lorenzo Bolzani <l.bo...@gmail.com> >>> wrote: >>> >>>> Hi Shree, thanks for your answer. >>>> >>>> I tried the script setting: >>>> >>>> TESSDATA=extracted # here I have the eng.lstm and >>>> eng.trainedata >>>> LANGDATA=langdata-master # all langdata downladed by OCR-D >>>> >>>> MODEL_NAME = eng >>>> CONTINUE_FROM = eng >>>> >>>> >>>> First I run the old Makefile to create the boxes. >>>> >>>> $ make training MODEL_NAME=eng >>>> >>>> >>>> I stop it as soon as the training starts: >>>> >>>> At iteration 400/400/400, Mean rms=6.657%, delta=40.765%, char >>>> train=100.827%, word train=100%, skip ratio=0%, New worst char error = >>>> 100.827 wrote checkpoint. >>>> >>>> >>>> At iteration 500/500/500, Mean rms=6.644%, delta=40.423%, char >>>> train=100.662%, word train=100%, skip ratio=0%, New worst char error = >>>> 100.662 wrote checkpoint. >>>> >>>> ^Cmake: *** Deleting file 'data/checkpoints/eng_checkpoint' >>>> Makefile:110: recipe for target 'data/checkpoints/eng_checkpoint' failed >>>> make: *** [data/checkpoints/eng_checkpoint] Interrupt >>>> >>>> Notice that the data/checkpoints/eng_checkpoint file is deleted, I do >>>> not know if it is relevant or not. >>>> >>>> >>>> then I switch to the new one and I get this: >>>> >>>> $ make training >>>> >>>> mkdir -p data/checkpoints >>>> lstmtraining \ >>>> --continue_from extracted/eng.lstm \ >>>> --old_traineddata extracted/eng.traineddata \ >>>> --traineddata data/eng/eng.traineddata \ >>>> --model_output data/checkpoints/eng \ >>>> --debug_interval -1 \ >>>> --train_listfile data/list.train \ >>>> --eval_listfile data/list.eval \ >>>> --sequential_training \ >>>> --max_iterations 3000 >>>> Loaded file extracted/eng.lstm, unpacking... >>>> Warning: LSTMTrainer deserialized an LSTMRecognizer! >>>> Code range changed from 111 to 76! >>>> Num (Extended) outputs,weights in Series: >>>> 1,36,0,1:1, 0 >>>> Num (Extended) outputs,weights in Series: >>>> C3,3:9, 0 >>>> Ft16:16, 160 >>>> Total weights = 160 >>>> [C3,3Ft16]:16, 160 >>>> Mp3,3:16, 0 >>>> Lfys64:64, 20736 >>>> Lfx96:96, 61824 >>>> Lrx96:96, 74112 >>>> Lfx512:512, 1247232 >>>> Fc76:76, 0 >>>> Total weights = 1404064 >>>> Previous null char=110 mapped to 75 >>>> Continuing from extracted/eng.lstm >>>> Loaded 1/1 pages (1-1) of document >>>> data/train/mueller_waldhornist_1821_0130_010.lstmf >>>> Loaded 1/1 pages (1-1) of document >>>> data/train/bismarck_erinnerungen02_1898_0274_002.lstmf >>>> Loaded 1/1 pages (1-1) of document >>>> data/train/spyri_heidi_1880_0062_005.lstmf >>>> Loaded 1/1 pages (1-1) of document >>>> data/train/novalis_ofterdingen_1802_0210_001.lstmf >>>> Iteration 0: ALIGNED TRUTH : Sparoͤfen kauft' ich auch und >>>> Sorgenstuͤhle, >>>> Iteration 0: BEST OCR TEXT : l bd o D V fc ds ft hs D t' dsu PM )k >>>> ,„cGs D t' D„Gs 'A AKG„9„t d tft ü!Vt Eb ht Ac )k uF ' K,cGPFVts >>>> File data/train/mueller_waldhornist_1821_0130_010.lstmf page 0 : >>>> !int_mode_:Error:Assert failed:in file weightmatrix.cpp, line 244 >>>> !int_mode_:Error:Assert failed:in file weightmatrix.cpp, line 244 >>>> Makefile:113: recipe for target 'data/checkpoints/eng_checkpoint' failed >>>> make: *** [data/checkpoints/eng_checkpoint] Segmentation fault >>>> >>>> >>>> What am I doing wrong? >>>> >>>> >>>> >>>> Lorenzo >>>> >>>> 2018-06-29 14:08 GMT+02:00 Shree Devi Kumar <shree...@gmail.com>: >>>> >>>>> I modified the makefile for ocrd-train to do fine-tuning. It is >>>>> pasted below: >>>>> >>>>> export >>>>> >>>>> SHELL := /bin/bash >>>>> LOCAL := $(PWD)/usr >>>>> PATH := $(LOCAL)/bin:$(PATH) >>>>> HOME := /home/ubuntu >>>>> TESSDATA = $(HOME)/tessdata_best >>>>> LANGDATA = $(HOME)/langdata >>>>> >>>>> # Name of the model to be built >>>>> MODEL_NAME = frk >>>>> >>>>> # Name of the model to continue from >>>>> CONTINUE_FROM = frk >>>>> >>>>> # Normalization Mode - see src/training/language_specific.sh for >>>>> details >>>>> NORM_MODE = 2 >>>>> >>>>> # Tesseract model repo to use. Default: $(TESSDATA_REPO) >>>>> TESSDATA_REPO = _best >>>>> >>>>> # Train directory >>>>> TRAIN := data/train >>>>> >>>>> # BEGIN-EVAL makefile-parser --make-help Makefile >>>>> >>>>> help: >>>>> @echo "" >>>>> @echo " Targets" >>>>> @echo "" >>>>> @echo " unicharset Create unicharset" >>>>> @echo " lists Create lists of lstmf filenames for >>>>> training and eval" >>>>> @echo " training Start training" >>>>> @echo " proto-model Build the proto model" >>>>> @echo " leptonica Build leptonica" >>>>> @echo " tesseract Build tesseract" >>>>> @echo " tesseract-langs Download tesseract-langs" >>>>> @echo " langdata Download langdata" >>>>> @echo " clean Clean all generated files" >>>>> @echo "" >>>>> @echo " Variables" >>>>> @echo "" >>>>> @echo " MODEL_NAME Name of the model to be built" >>>>> @echo " CORES No of cores to use for compiling >>>>> leptonica/tesseract" >>>>> @echo " LEPTONICA_VERSION Leptonica version. Default: >>>>> $(LEPTONICA_VERSION)" >>>>> @echo " TESSERACT_VERSION Tesseract commit. Default: >>>>> $(TESSERACT_VERSION)" >>>>> @echo " LANGDATA_VERSION Tesseract langdata version. Default: >>>>> $(LANGDATA_VERSION)" >>>>> @echo " TESSDATA_REPO Tesseract model repo to use. Default: >>>>> $(TESSDATA_REPO)" >>>>> @echo " TRAIN Train directory" >>>>> @echo " RATIO_TRAIN Ratio of train / eval training data" >>>>> >>>>> # END-EVAL >>>>> >>>>> # Ratio of train / eval training data >>>>> RATIO_TRAIN := 0.90 >>>>> >>>>> ALL_BOXES = data/all-boxes >>>>> ALL_LSTMF = data/all-lstmf >>>>> >>>>> # Create unicharset >>>>> unicharset: data/unicharset >>>>> >>>>> # Create lists of lstmf filenames for training and eval >>>>> lists: $(ALL_LSTMF) data/list.train data/list.eval >>>>> >>>>> data/list.train: $(ALL_LSTMF) >>>>> total=`cat $(ALL_LSTMF) | wc -l` \ >>>>> no=`echo "$$total * $(RATIO_TRAIN) / 1" | bc`; \ >>>>> head -n "$$no" $(ALL_LSTMF) > "$@" >>>>> >>>>> data/list.eval: $(ALL_LSTMF) >>>>> total=`cat $(ALL_LSTMF) | wc -l` \ >>>>> no=`echo "($$total - $$total * $(RATIO_TRAIN)) / 1" | bc`; \ >>>>> tail -n "+$$no" $(ALL_LSTMF) > "$@" >>>>> >>>>> # Start training >>>>> training: data/$(MODEL_NAME).traineddata >>>>> >>>>> data/unicharset: $(ALL_BOXES) >>>>> combine_tessdata -u $(TESSDATA)/$(CONTINUE_FROM).traineddata >>>>> $(TESSDATA)/$(CONTINUE_FROM). >>>>> unicharset_extractor --output_unicharset "$(TRAIN)/my.unicharset" >>>>> --norm_mode $(NORM_MODE) "$(ALL_BOXES)" >>>>> merge_unicharsets $(TESSDATA)/$(CONTINUE_FROM).lstm-unicharset >>>>> $(TRAIN)/my.unicharset "$@" >>>>> $(ALL_BOXES): $(sort $(patsubst %.tif,%.box,$(wildcard >>>>> $(TRAIN)/*.tif))) >>>>> find $(TRAIN) -name '*.box' -exec cat {} \; > "$@" >>>>> $(TRAIN)/%.box: $(TRAIN)/%.tif $(TRAIN)/%-gt.txt >>>>> python generate_line_box.py -i "$(TRAIN)/$*.tif" -t >>>>> "$(TRAIN)/$*-gt.txt" > "$@" >>>>> >>>>> $(ALL_LSTMF): $(sort $(patsubst %.tif,%.lstmf,$(wildcard >>>>> $(TRAIN)/*.tif))) >>>>> find $(TRAIN) -name '*.lstmf' -exec echo {} \; | sort -R -o "$@" >>>>> >>>>> $(TRAIN)/%.lstmf: $(TRAIN)/%.box >>>>> tesseract $(TRAIN)/$*.tif $(TRAIN)/$* --psm 6 lstm.train >>>>> >>>>> # Build the proto model >>>>> proto-model: data/$(MODEL_NAME)/$(MODEL_NAME).traineddata >>>>> >>>>> data/$(MODEL_NAME)/$(MODEL_NAME).traineddata: $(LANGDATA) >>>>> data/unicharset >>>>> combine_lang_model \ >>>>> --input_unicharset data/unicharset \ >>>>> --script_dir $(LANGDATA) \ >>>>> --words $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).wordlist \ >>>>> --numbers $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).numbers \ >>>>> --puncs $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).punc \ >>>>> --output_dir data/ \ >>>>> --lang $(MODEL_NAME) >>>>> >>>>> data/checkpoints/$(MODEL_NAME)_checkpoint: unicharset lists proto-model >>>>> mkdir -p data/checkpoints >>>>> lstmtraining \ >>>>> --continue_from $(TESSDATA)/$(CONTINUE_FROM).lstm \ >>>>> --old_traineddata $(TESSDATA)/$(CONTINUE_FROM).traineddata \ >>>>> --traineddata data/$(MODEL_NAME)/$(MODEL_NAME).traineddata \ >>>>> --model_output data/checkpoints/$(MODEL_NAME) \ >>>>> --debug_interval -1 \ >>>>> --train_listfile data/list.train \ >>>>> --eval_listfile data/list.eval \ >>>>> --sequential_training \ >>>>> --max_iterations 3000 >>>>> >>>>> data/$(MODEL_NAME).traineddata: >>>>> data/checkpoints/$(MODEL_NAME)_checkpoint >>>>> lstmtraining \ >>>>> --stop_training \ >>>>> --continue_from $^ \ >>>>> --old_traineddata $(TESSDATA)/$(CONTINUE_FROM).traineddata \ >>>>> --traineddata data/$(MODEL_NAME)/$(MODEL_NAME).traineddata \ >>>>> --model_output $@ >>>>> >>>>> # Clean all generated files >>>>> clean: >>>>> find data/train -name '*.box' -delete >>>>> find data/train -name '*.lstmf' -delete >>>>> rm -rf data/all-* >>>>> rm -rf data/list.* >>>>> rm -rf data/$(MODEL_NAME) >>>>> rm -rf data/unicharset >>>>> rm -rf data/checkpoints >>>>> >>>>> On Fri, Jun 29, 2018 at 5:31 PM Lorenzo Bolzani <l.bo...@gmail.com> >>>>> wrote: >>>>> >>>>>> >>>>>> >>>>>> Hi, >>>>>> I'm trying to do fine tuning of an existing model using line images >>>>>> and text labels. I'm running this version: >>>>>> >>>>>> tesseract 4.0.0-beta.3-56-g5fda >>>>>> leptonica-1.76.0 >>>>>> libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.4.2) : libpng 1.2.54 : >>>>>> libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.4 : libopenjp2 2.3.0 >>>>>> Found AVX2 >>>>>> Found AVX >>>>>> Found SSE >>>>>> >>>>>> >>>>>> >>>>>> I used OCR-D to generate lstmf files for the demo data. >>>>>> >>>>>> If I run the make command it works fine. >>>>>> >>>>>> make training MODEL_NAME=prova >>>>>> >>>>>> Now I isolated this command from the build: >>>>>> >>>>>> lstmtraining \ >>>>>> --traineddata data/prova/prova.traineddata \ >>>>>> --net_spec "[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256 >>>>>> O1c`head -n1 data/unicharset`]" \ >>>>>> --model_output data/checkpoints/prova \ >>>>>> --learning_rate 20e-4 \ >>>>>> --train_listfile data/list.train \ >>>>>> --eval_listfile data/list.eval \ >>>>>> --max_iterations 10000 >>>>>> >>>>>> and it works fine. >>>>>> >>>>>> Now I'm trying to modify it to fine tune the existing eng model. I >>>>>> made a few attempts, all ending into different errors (see the attached >>>>>> file for full output). >>>>>> >>>>>> I used: >>>>>> >>>>>> combine_tessdata -e /usr/local/share/tessdata/eng.traineddata >>>>>> extracted/eng.lstm >>>>>> >>>>>> to extract the eng.lstm model. >>>>>> >>>>>> This seems to works but I'm not sure it is the correct. >>>>>> >>>>>> lstmtraining \ >>>>>> --continue_from extracted/eng.lstm \ >>>>>> --traineddata data/prova/prova.traineddata \ >>>>>> --old_traineddata extracted/eng.traineddata \ >>>>>> --model_output data/checkpoints/prova \ >>>>>> --learning_rate 20e-4 \ >>>>>> --train_listfile data/list.train \ >>>>>> --eval_listfile data/list.eval \ >>>>>> --max_iterations 10000 >>>>>> >>>>>> (extracted/eng.traineddata is just a copy of eng.traineddata) >>>>>> >>>>>> >>>>>> The training resume exactly with the RMS of prova_checkpoint (6%) so >>>>>> it looks like it is training from that checkpoint, not the eng.lstm. >>>>>> >>>>>> Is this correct? What should I change? >>>>>> >>>>>> I'm following this guide: >>>>>> >>>>>> >>>>>> https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00#fine-tuning-for--a-few-characters >>>>>> >>>>>> >>>>>> I think continue_from and traineddata should refer to the eng model >>>>>> and old_traineddata should point to prova.traineddata, but if I do that I >>>>>> get a segmentation fault: >>>>>> >>>>>> [...] >>>>>> !int_mode_:Error:Assert failed:in file weightmatrix.cpp, line 244 >>>>>> !int_mode_:Error:Assert failed:in file weightmatrix.cpp, line 244 >>>>>> Segmentation fault >>>>>> >>>>>> What am I missing? >>>>>> >>>>>> >>>>>> Thanks, bye >>>>>> >>>>>> Lorenzo >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "tesseract-ocr" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to tesser...@googlegroups.com. >>>>>> To post to this group, send email to tesser...@googlegroups.com. >>>>>> Visit this group at https://groups.google.com/group/tesseract-ocr. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLyOJN31PdWQumXPO3JjuAc1Yz2BZYpMd4ftzBHgZkEaxA%40mail.gmail.com >>>>>> <https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLyOJN31PdWQumXPO3JjuAc1Yz2BZYpMd4ftzBHgZkEaxA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> >>>>> -- >>>>> >>>>> ____________________________________________________________ >>>>> भजन - कीर्तन - आरती @ http://bhajans.ramparivar.com >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "tesseract-ocr" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to tesser...@googlegroups.com. >>>>> To post to this group, send email to tesser...@googlegroups.com. >>>>> Visit this group at https://groups.google.com/group/tesseract-ocr. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/tesseract-ocr/CAG2NduWe%3Dv9YvYAMTAzm9yNEFFtqjnxBVGDe9x4tQd1Pnjiwqw%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/tesseract-ocr/CAG2NduWe%3Dv9YvYAMTAzm9yNEFFtqjnxBVGDe9x4tQd1Pnjiwqw%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "tesseract-ocr" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to tesser...@googlegroups.com. >>>> To post to this group, send email to tesser...@googlegroups.com. >>>> Visit this group at https://groups.google.com/group/tesseract-ocr. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLwUVJOePiO98piAgbSoqyA1GOrs%2BDwEz%2BxY9LS8YQyi%3DQ%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLwUVJOePiO98piAgbSoqyA1GOrs%2BDwEz%2BxY9LS8YQyi%3DQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >>> -- >>> >>> ____________________________________________________________ >>> भजन - कीर्तन - आरती @ http://bhajans.ramparivar.com >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "tesseract-ocr" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to tesser...@googlegroups.com. >>> To post to this group, send email to tesser...@googlegroups.com. >>> Visit this group at https://groups.google.com/group/tesseract-ocr. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/tesseract-ocr/CAG2NduU0aF%3DKmDPf9V3925bYouhTF%3Dq_XM-Xo5R%3Dv-yC%3DBRrRA%40mail.gmail.com >>> <https://groups.google.com/d/msgid/tesseract-ocr/CAG2NduU0aF%3DKmDPf9V3925bYouhTF%3Dq_XM-Xo5R%3Dv-yC%3DBRrRA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to the Google Groups > "tesseract-ocr" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to tesseract-ocr+unsubscr...@googlegroups.com. > To post to this group, send email to tesseract-ocr@googlegroups.com. > Visit this group at https://groups.google.com/group/tesseract-ocr. > To view this discussion on the web visit > https://groups.google.com/d/msgid/tesseract-ocr/4242cfd0-d808-492d-967c-06731cc39d00%40googlegroups.com > <https://groups.google.com/d/msgid/tesseract-ocr/4242cfd0-d808-492d-967c-06731cc39d00%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "tesseract-ocr" group. To unsubscribe from this group and stop receiving emails from it, send an email to tesseract-ocr+unsubscr...@googlegroups.com. To post to this group, send email to tesseract-ocr@googlegroups.com. Visit this group at https://groups.google.com/group/tesseract-ocr. To view this discussion on the web visit https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLx1jw8DneuAUSk8uESyJi-AZh7SAGi%2BioA4shWgWkqfPQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.